aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetIOHDF5/src/Recover.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Carpet/CarpetIOHDF5/src/Recover.cc')
-rw-r--r--Carpet/CarpetIOHDF5/src/Recover.cc214
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));