aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetIOHDF5
diff options
context:
space:
mode:
authorThomas Radke <tradke@aei.mpg.de>2005-09-06 14:08:00 +0000
committerThomas Radke <tradke@aei.mpg.de>2005-09-06 14:08:00 +0000
commita2ca1433ce89441a93fd398835ab088502d310f0 (patch)
tree31520c29f64f9cb1c942ee7293214e9c938ea690 /Carpet/CarpetIOHDF5
parent6c4616e0d4e611cb74ea45ea83c694afc26450df (diff)
CarpetIOHDF5: fixed a problem with IOHDF5::use_reflevels_from_checkpoint = "yes" during recovery
When IOHDF5::use_reflevels_from_checkpoint is set, the parameter CarpetLib::refinement_levels is steered to take the number of levels found in the checkpoint. This steering used to happen during parameter recovery where it didn't have any effect if the parameter had been set in the parfile already. Now it's done in a separate routine scheduled at STARTUP. darcs-hash:20050906140808-776a0-bae608c103b161ac67690da2a8803bdff84cf2f4.gz
Diffstat (limited to 'Carpet/CarpetIOHDF5')
-rw-r--r--Carpet/CarpetIOHDF5/schedule.ccl9
-rw-r--r--Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh1
-rw-r--r--Carpet/CarpetIOHDF5/src/Input.cc55
3 files changed, 50 insertions, 15 deletions
diff --git a/Carpet/CarpetIOHDF5/schedule.ccl b/Carpet/CarpetIOHDF5/schedule.ccl
index 24963cf68..10bff3163 100644
--- a/Carpet/CarpetIOHDF5/schedule.ccl
+++ b/Carpet/CarpetIOHDF5/schedule.ccl
@@ -48,6 +48,15 @@ if (! CCTK_Equals (recover, "no") && *recover_file)
OPTIONS: meta
} "Parameter recovery routine"
+ if (use_reflevels_from_checkpoint)
+ {
+ schedule CarpetIOHDF5_SetNumRefinementLevels at STARTUP before CarpetIOHDF5_Startup
+ {
+ LANG:C
+ OPTIONS: meta
+ } "Overwrite 'CarpetRegird::refinement_levels' with the number of levels found in the checkpoint file"
+ }
+
schedule CarpetIOHDF5_CloseFiles at POST_RECOVER_VARIABLES
{
LANG: C
diff --git a/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh b/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh
index b258c8bf5..27b7306c1 100644
--- a/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh
+++ b/Carpet/CarpetIOHDF5/src/CarpetIOHDF5.hh
@@ -116,6 +116,7 @@ namespace CarpetIOHDF5
int CarpetIOHDF5_Startup (void);
int CarpetIOHDF5_Init (const cGH* const);
+ int CarpetIOHDF5_SetNumRefinementLevels (void);
int CarpetIOHDF5_CloseFiles (void);
int CarpetIOHDF5_InitialDataCheckpoint (const cGH* const);
int CarpetIOHDF5_EvolutionCheckpoint (const cGH* const);
diff --git a/Carpet/CarpetIOHDF5/src/Input.cc b/Carpet/CarpetIOHDF5/src/Input.cc
index 5da4f0dfc..1f4134a2b 100644
--- a/Carpet/CarpetIOHDF5/src/Input.cc
+++ b/Carpet/CarpetIOHDF5/src/Input.cc
@@ -53,8 +53,12 @@ typedef struct {
vector<CCTK_REAL> mgleveltimes; // [num_mglevels*num_reflevels]
} fileset_t;
+// list of checkpoint/filereader files
static list<fileset_t> filesets;
+// number of reflevels in the checkpoint
+static int num_reflevels = -1;
+
static list<fileset_t>::iterator OpenFileSet (const cGH* const cctkGH,
const string setname,
@@ -81,6 +85,39 @@ int CarpetIOHDF5_RecoverParameters (void)
//////////////////////////////////////////////////////////////////////////////
+// Overwrite the "CarpetRegrid::refinement_levels"
+// with the number of levels given in the checkpoint file
+//
+// Note that this has to be done after parameter recovery in order to have
+// any effect of steering "CarpetRegrid::refinement_levels".
+//////////////////////////////////////////////////////////////////////////////
+int CarpetIOHDF5_SetNumRefinementLevels (void)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ if (num_reflevels > 0) {
+ if (not CCTK_Equals (verbose, "none")) {
+ char *buffer = CCTK_ParameterValString ("refinement_levels",
+ "CarpetRegrid");
+ assert (buffer);
+ CCTK_VInfo (CCTK_THORNSTRING, "Using %i reflevels from checkpoint file. "
+ "Ignoring value '%s' in parameter file.",
+ num_reflevels, buffer);
+ free (buffer);
+ }
+
+ char buffer[32];
+ snprintf (buffer, sizeof (buffer), "%d", num_reflevels);
+ int const retval = CCTK_ParameterSet ("refinement_levels", "CarpetRegrid",
+ buffer);
+ assert (retval == 0);
+ }
+
+ return (0);
+}
+
+
+//////////////////////////////////////////////////////////////////////////////
// close all open checkpoint/filereader files after recovering grid variables
//////////////////////////////////////////////////////////////////////////////
int CarpetIOHDF5_CloseFiles (void)
@@ -162,8 +199,8 @@ int Recover (cGH* cctkGH, const char *basefilename, int called_from)
CCTK_SetMainLoopIndex (fileset->main_loop_index);
cctkGH->cctk_iteration = fileset->cctk_iteration;
- cctkGH->cctk_time =
- fileset->mgleveltimes.at(mglevel*fileset->num_reflevels + reflevel);
+ int const idx = mglevel*fileset->num_reflevels + reflevel;
+ cctkGH->cctk_time = fileset->mgleveltimes.at(idx);
}
if (not CCTK_Equals (verbose, "none")) {
@@ -419,19 +456,7 @@ static list<fileset_t>::iterator OpenFileSet (const cGH* const cctkGH,
IOUtil_SetAllParameters (parameters);
delete[] parameters;
- // use refinement levels parameter from checkpointing file ?
- if (use_reflevels_from_checkpoint) {
- char buffer[32];
-
- snprintf (buffer, sizeof (buffer), "%d", fileset.num_reflevels);
- CCTK_ParameterSet ("refinement_levels", "CarpetRegrid", buffer);
-
- if (not CCTK_Equals (verbose, "none")) {
- CCTK_VInfo (CCTK_THORNSTRING, "Using %i reflevels read from "
- "checkpoint file. Ignoring value in parameter file.",
- fileset.num_reflevels);
- }
- }
+ num_reflevels = fileset.num_reflevels;
}
// allocate and initialise the list of input files for this set