@@ -166,15 +166,30 @@ pub fn load_checkpoint(path: &Path) -> Result<(Grid3, State3), Error> {
166166 . dataset ( PSI_DATASET )
167167 . map_err ( |_| Error :: MissingCheckpointField ( "state/psi" ) ) ?;
168168 let psi_shape = psi_dataset. shape ( ) ;
169- if psi_shape. as_slice ( ) != [ nx, ny, nz] {
170- return Err ( Error :: MalformedCheckpointField ( "state/psi" ) ) ;
171- }
172- let psi_raw: Vec < ComplexRepr > = psi_dataset
173- . read_raw ( )
174- . map_err ( |_| Error :: MalformedCheckpointField ( "state/psi" ) ) ?;
175- if psi_raw. len ( ) != grid. len ( ) {
176- return Err ( Error :: MalformedCheckpointField ( "state/psi" ) ) ;
177- }
169+ let psi: Vec < Complex64 > = match psi_shape. as_slice ( ) {
170+ [ sx, sy, sz] if [ * sx, * sy, * sz] == [ nx, ny, nz] => {
171+ let psi_raw: Vec < ComplexRepr > = psi_dataset
172+ . read_raw ( )
173+ . map_err ( |_| Error :: MalformedCheckpointField ( "state/psi" ) ) ?;
174+ if psi_raw. len ( ) != grid. len ( ) {
175+ return Err ( Error :: MalformedCheckpointField ( "state/psi" ) ) ;
176+ }
177+ psi_raw. into_iter ( ) . map ( from_repr) . collect ( )
178+ }
179+ [ sx, sy, sz, 2 ] if [ * sx, * sy, * sz] == [ nx, ny, nz] => {
180+ let psi_raw: Vec < f64 > = psi_dataset
181+ . read_raw ( )
182+ . map_err ( |_| Error :: MalformedCheckpointField ( "state/psi" ) ) ?;
183+ if psi_raw. len ( ) != grid. len ( ) * 2 {
184+ return Err ( Error :: MalformedCheckpointField ( "state/psi" ) ) ;
185+ }
186+ psi_raw
187+ . chunks_exact ( 2 )
188+ . map ( |pair| Complex64 :: new ( pair[ 0 ] , pair[ 1 ] ) )
189+ . collect ( )
190+ }
191+ _ => return Err ( Error :: MalformedCheckpointField ( "state/psi" ) ) ,
192+ } ;
178193
179194 if let Some ( config_group) = maybe_group ( & root, CONFIG_GROUP ) ? {
180195 validate_optional_group ( & config_group, & [ "dt" , "hbar_over_m" , "poisson_scale" ] ) ?;
@@ -193,10 +208,5 @@ pub fn load_checkpoint(path: &Path) -> Result<(Grid3, State3), Error> {
193208 ) ?;
194209 }
195210
196- Ok ( (
197- grid,
198- State3 {
199- psi : psi_raw. into_iter ( ) . map ( from_repr) . collect ( ) ,
200- } ,
201- ) )
211+ Ok ( ( grid, State3 { psi } ) )
202212}
0 commit comments