diff options
Diffstat (limited to 'Carpet/CarpetIOHDF5/src/Recover.cc')
-rw-r--r-- | Carpet/CarpetIOHDF5/src/Recover.cc | 214 |
1 files changed, 98 insertions, 116 deletions
diff --git a/Carpet/CarpetIOHDF5/src/Recover.cc b/Carpet/CarpetIOHDF5/src/Recover.cc index 0f5349bb8..14d9f097e 100644 --- a/Carpet/CarpetIOHDF5/src/Recover.cc +++ b/Carpet/CarpetIOHDF5/src/Recover.cc @@ -19,7 +19,7 @@ #include "cctk_Version.h" extern "C" { -static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOHDF5/src/Recover.cc,v 1.2 2004/07/09 15:38:18 tradke Exp $"; +static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOHDF5/src/Recover.cc,v 1.1 2004/07/07 11:01:05 tradke Exp $"; CCTK_FILEVERSION(Carpet_CarpetIOHDF5_iohdf5chckpt_recover_cc); } @@ -86,7 +86,7 @@ static file_t infile = {0, 0, 0, 0, 0, 0, 0, NULL, NULL, -1, -1, list<dataset_t> (), 0}; -static int OpenFile (const char *basefilename, file_t *file, int called_from); +static int RecoverParameters (const char *basefilename, file_t *file); static int RecoverVariables (cGH* cctkGH, file_t *file); static herr_t ReadMetadata (hid_t group, const char *objectname, void *arg); @@ -114,7 +114,7 @@ int CarpetIOHDF5_CloseFile (void) if (verbose) { - CCTK_VInfo (CCTK_THORNSTRING, "closing file '%s' after recovery", + CCTK_VInfo (CCTK_THORNSTRING, "Closing file '%s' after recovery", infile.filename); } @@ -138,7 +138,7 @@ int CarpetIOHDF5_CloseFile (void) return (0); } -static int OpenFile (const char *basefilename, file_t *file, int called_from) +static int RecoverParameters (const char *basefilename, file_t *file) { hid_t dset = -1; const int myproc = CCTK_MyProc (NULL); @@ -147,11 +147,10 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) // generate filename for an unchunked checkpoint file */ file->filename = IOUtil_AssembleFilename (NULL, basefilename, "", ".h5", - called_from, 0, 1); + CP_RECOVER_PARAMETERS, 0, 1); if (verbose) { - CCTK_VInfo (CCTK_THORNSTRING, "opening %s file '%s'", - called_from == CP_RECOVER_PARAMETERS ? "checkpoint" : "input", + CCTK_VInfo (CCTK_THORNSTRING, "Opening file '%s' for recovery", file->filename); } @@ -165,19 +164,15 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) if (file->file >= 0) { - if (called_from == CP_RECOVER_PARAMETERS) - { - HDF5_ERROR (dset = H5Dopen (file->file, - METADATA_GROUP"/"ALL_PARAMETERS)); - ReadAttribute (dset, "carpet_reflevels", file->num_reflevels); - ReadAttribute (dset, "numberofmgtimes", file->num_mglevels); - ReadAttribute (dset, "GH$iteration", file->cctk_iteration); - ReadAttribute (dset, "main loop index", file->main_loop_index); - ReadAttribute (dset, "carpet_global_time", file->global_time); - ReadAttribute (dset, "carpet_delta_time", file->delta_time); - file->parameter_len = H5Dget_storage_size (dset) + 1; - assert (file->parameter_len > 1); - } + HDF5_ERROR (dset = H5Dopen (file->file, METADATA_GROUP"/"ALL_PARAMETERS)); + ReadAttribute (dset, "carpet_reflevels", file->num_reflevels); + ReadAttribute (dset, "numberofmgtimes", file->num_mglevels); + ReadAttribute (dset, "GH$iteration", file->cctk_iteration); + ReadAttribute (dset, "main loop index", file->main_loop_index); + ReadAttribute (dset, "carpet_global_time", file->global_time); + ReadAttribute (dset, "carpet_delta_time", file->delta_time); + file->parameter_len = H5Dget_storage_size (dset) + 1; + assert (file->parameter_len > 1); file->num_ints = 0; HDF5_ERROR (H5Giterate (file->file, "/", NULL, ReadMetadata, file)); @@ -192,7 +187,7 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) } // broadcast integer variables - int *intbuffer = new int[7]; + int intbuffer[7]; intbuffer[0] = file->num_datasets; intbuffer[1] = file->num_mglevels; intbuffer[2] = file->num_reflevels; @@ -200,7 +195,8 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) intbuffer[4] = file->main_loop_index; intbuffer[5] = file->parameter_len; intbuffer[6] = file->num_ints; - MPI_Bcast (intbuffer, 7, MPI_INT, 0, MPI_COMM_WORLD); + MPI_Bcast (intbuffer, sizeof (intbuffer) / sizeof (*intbuffer), MPI_INT, 0, + MPI_COMM_WORLD); file->num_datasets = intbuffer[0]; file->num_mglevels = intbuffer[1]; file->num_reflevels = intbuffer[2]; @@ -208,7 +204,6 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) file->main_loop_index = intbuffer[4]; file->parameter_len = intbuffer[5]; file->num_ints = intbuffer[6]; - delete[] intbuffer; // return if no valid checkpoint could be found if (file->num_datasets <= 0) @@ -216,65 +211,6 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) return (-1); } - // serialize the dataset list metadata into a single MPI_INT buffer - intbuffer = new int[file->num_ints]; - if (myproc == 0) - { - for (list<dataset_t>::iterator dataset = file->datasets.begin (); - dataset != file->datasets.end (); - dataset++) - { - *intbuffer++ = dataset->vindex; - *intbuffer++ = dataset->timelevel; - *intbuffer++ = dataset->mglevel; - *intbuffer++ = dataset->reflevel; - *intbuffer++ = dataset->rank; - - for (int i = 0; i < dataset->rank; i++) - { - *intbuffer++ = dataset->shape[i]; - *intbuffer++ = dataset->iorigin[i]; - } - } - intbuffer -= file->num_ints; - } - - // broadcast the serialized dataset list metadata - MPI_Bcast (intbuffer, file->num_ints, MPI_INT, 0, MPI_COMM_WORLD); - - // build the dataset list on non-I/O processors - if (myproc != 0) - { - for (int i = 0; i < file->num_datasets; i++) - { - dataset_t dataset; - - - dataset.vindex = *intbuffer++; - dataset.timelevel = *intbuffer++; - dataset.mglevel = *intbuffer++; - dataset.reflevel = *intbuffer++; - dataset.rank = *intbuffer++; - - dataset.shape = new int[dataset.rank]; - dataset.iorigin = new int[dataset.rank]; - for (int j = 0; j < dataset.rank; j++) - { - dataset.shape[j] = *intbuffer++; - dataset.iorigin[j] = *intbuffer++; - } - - file->datasets.push_back (dataset); - } - intbuffer -= file->num_ints; - } - delete[] intbuffer; - - if (called_from == FILEREADER_DATA) - { - return (0); - } - // Use refinement levels parameter from checkpointing file ? if (use_reflevels_from_checkpoint) { @@ -332,6 +268,61 @@ static int OpenFile (const char *basefilename, file_t *file, int called_from) IOUtil_SetAllParameters (parameters); delete[] parameters; + + // serialize the dataset list metadata into a single MPI_INT buffer + int *metadatabuffer = new int[file->num_ints]; + if (myproc == 0) + { + for (list<dataset_t>::iterator dataset = file->datasets.begin (); + dataset != file->datasets.end (); + dataset++) + { + *metadatabuffer++ = dataset->vindex; + *metadatabuffer++ = dataset->timelevel; + *metadatabuffer++ = dataset->mglevel; + *metadatabuffer++ = dataset->reflevel; + *metadatabuffer++ = dataset->rank; + + for (int i = 0; i < dataset->rank; i++) + { + *metadatabuffer++ = dataset->shape[i]; + *metadatabuffer++ = dataset->iorigin[i]; + } + } + metadatabuffer -= file->num_ints; + } + + // broadcast the serialized dataset list metadata + MPI_Bcast (metadatabuffer, file->num_ints, MPI_INT, 0, MPI_COMM_WORLD); + + // build the dataset list on non-I/O processors + if (myproc != 0) + { + for (int i = 0; i < file->num_datasets; i++) + { + dataset_t dataset; + + + dataset.vindex = *metadatabuffer++; + dataset.timelevel = *metadatabuffer++; + dataset.mglevel = *metadatabuffer++; + dataset.reflevel = *metadatabuffer++; + dataset.rank = *metadatabuffer++; + + dataset.shape = new int[dataset.rank]; + dataset.iorigin = new int[dataset.rank]; + for (int j = 0; j < dataset.rank; j++) + { + dataset.shape[j] = *metadatabuffer++; + dataset.iorigin[j] = *metadatabuffer++; + } + + file->datasets.push_back (dataset); + } + metadatabuffer -= file->num_ints; + } + delete[] metadatabuffer; + return (0); } @@ -346,52 +337,39 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from) called_from == CP_RECOVER_DATA || called_from == FILEREADER_DATA); - if (called_from == CP_RECOVER_PARAMETERS || - called_from == FILEREADER_DATA) + if (called_from == CP_RECOVER_PARAMETERS) { - // open the file, read and broadcast its metadata information - // for CP_RECOVER_PARAMETERS: also recover all parameters - retval = OpenFile (basefilename, &infile, called_from); + // open the file, read its metadata contents into the file structure, + // and recover all parameters + retval = RecoverParameters (basefilename, &infile); - if (called_from == CP_RECOVER_PARAMETERS || retval) - { - return (retval == 0 ? 1 : -1); - } + return (retval == 0 ? 1 : -1); } // can only proceed with a valid checkpoint file from here on assert (infile.num_datasets > 0); // set global Cactus/Carpet variables + global_time = infile.global_time; + delta_time = infile.delta_time; + CCTK_SetMainLoopIndex (infile.main_loop_index); + + // now recover all grid variables on current mglevel and reflevel if (called_from == CP_RECOVER_DATA) { - global_time = infile.global_time; - delta_time = infile.delta_time; - CCTK_SetMainLoopIndex (infile.main_loop_index); + CCTK_VInfo (CCTK_THORNSTRING, + "Recovering grid variables on mglevel %d reflevel %d", + mglevel, reflevel); cctkGH->cctk_iteration = infile.cctk_iteration; cctkGH->cctk_time = infile.mgleveltimes[mglevel*infile.num_reflevels + reflevel]; - } + retval = RecoverVariables (cctkGH, &infile); - // now recover all grid variables on current mglevel and reflevel - retval = RecoverVariables (cctkGH, &infile); - - if (called_from == CP_RECOVER_DATA) - { CCTK_VInfo (CCTK_THORNSTRING, - "restarting simulation at iteration %d (physical time %g)", + "Restarting simulation at iteration %d (physical time %g)", cctkGH->cctk_iteration, (double) cctkGH->cctk_time); } - else - { - // FIXME: keep filereader input file open for all mglevels, reflevels - // this doesn't work now because we don't know the number of - // mglevels and reflevels - // also: there may be multiple files to be read in, and they - // must not share the same data structures - CarpetIOHDF5_CloseFile (); - } return (retval); } @@ -464,10 +442,6 @@ static int RecoverVariables (cGH* cctkGH, file_t *file) // cout << "I have for this reflevel " << refleveldatasetnamelist.size() << endl; #endif - CCTK_VInfo (CCTK_THORNSTRING, - "reading grid variables on mglevel %d reflevel %d", - mglevel, reflevel); - int num_vars = CCTK_NumVars (); for (list<dataset_t>::iterator dataset = file->datasets.begin (); dataset != file->datasets.end (); @@ -496,11 +470,19 @@ static int RecoverVariables (cGH* cctkGH, file_t *file) assert (dset >= 0); } + char *name = CCTK_FullName (dataset->vindex); + + if (verbose) + { + cout << name << " rl: " << reflevel << endl; + } + vector<ibset> regions_read (Carpet::maps); - int did_read_something = ReadVar (cctkGH, dataset->vindex, dset, - regions_read, 1); + int did_read_something = ReadVar (cctkGH, name, dset, regions_read, 1); MPI_Bcast (&did_read_something, 1, MPI_INT, 0, dist::comm); + free (name); + if (dset >= 0) { HDF5_ERROR (H5Dclose (dset)); |