/*@@ @file Output3D.c @date Tue Jan 9 1999 @author Gabrielle Allen @desc Functions to deal 3D HDF5 output of variables @enddesc @history @hauthor Thomas Radke @hdate 16 Mar 1999 @hdesc Converted to Cactus 4.0 @hendhistory @@*/ #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "ioHDF5GH.h" /* function prototypes */ int IOHDF5_TimeFor3D (cGH *GH, int index); int IOHDF5_Output3DVarAs (cGH *GH, const char *var, const char *alias); static void CheckSteerableParameters (ioHDF5GH *myGH); static void SetOutputFlag (int index, const char *optstring, void *arg); /*@@ @routine IOHDF5_Output3DGH @date Sat March 6 1999 @author Gabrielle Allen @desc Loops over all variables and outputs them if necessary @enddesc @calledby CCTK_OutputGH ("IOHDF5_3D") @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @endvar @@*/ int IOHDF5_Output3DGH (cGH *GH) { DECLARE_CCTK_PARAMETERS int i; ioHDF5GH *myGH; const char *name; char *fullname; /* Get the GH extension for IOHDF5 */ myGH = (ioHDF5GH *) GH->extensions [CCTK_GHExtensionHandle ("IOHDF5")]; CheckSteerableParameters (myGH); if (myGH->out3D_every <= 0) return (0); /* Loop over all variables */ for (i = 0; i < CCTK_NumVars (); i++) { if (IOHDF5_TimeFor3D (GH, i)) { name = CCTK_VarName (i); fullname = CCTK_FullName (i); if (verbose) CCTK_VInfo (CCTK_THORNSTRING, "IOHDF5_Output3DGH: fullname / name = " "%s / %s", fullname, name); IOHDF5_Output3DVarAs (GH, fullname, name); free (fullname); /* Register variable as having 3D output this iteration */ myGH->out3D_last [i] = GH->cctk_iteration; } } if (verbose) CCTK_INFO("IOHDF5_Output3DGH Done \n\n"); return (0); } /*@@ @routine IOHDF5_Output3DVarAs @date Sat March 6 1999 @author Gabrielle Allen @desc unconditional output of a variable using the IOHDF5 3D output method @enddesc @calledby IOHDF5_Output3DGH, CCTK_OutputVarAsByMethod ("IOHDF5_3D") @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var fullname @vdesc complete name of variable to output @vtype const char * @vio in @vcomment @endvar @var alias @vdesc alias name of variable to output (used to generate output filename) @vtype const char * @vio in @vcomment @endvar @@*/ int IOHDF5_Output3DVarAs (cGH *GH, const char *fullname, const char *alias) { DECLARE_CCTK_PARAMETERS int index; index = CCTK_VarIndex (fullname); if (verbose) CCTK_VInfo (CCTK_THORNSTRING, "IOHDF5_Output3DVarAs: fullname, alias, " "index = (%s, %s, %d)", fullname, alias, index); /* Do the 3D output */ IOHDF5_Write3D (GH, index, alias); return (0); } /*@@ @routine IOHDF5_TimeFor3D @date Sat March 6 1999 @author Gabrielle Allen @desc Decides if it is time to output a variable using the IOHDF5 3D output method @enddesc @calledby IOHDF5_Output3DGH @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var index @vdesc index of variable @vtype int @vio in @vcomment @endvar @@*/ int IOHDF5_TimeFor3D (cGH *GH, int index) { ioHDF5GH *myGH; /* Get the GH extension for IOHDF5 */ myGH = (ioHDF5GH *) GH->extensions [CCTK_GHExtensionHandle ("IOHDF5")]; CheckSteerableParameters (myGH); /* Check if any output was requested */ if(myGH->out3D_every <= 0) return (0); /* Check this variable should be output */ if (! (myGH->do_out3D [index] && GH->cctk_iteration % myGH->out3D_every == 0)) return (0); /* Check variable not already output this iteration */ if (myGH->out3D_last [index] == GH->cctk_iteration) { CCTK_WARN (2, "Already done 3D output in IOHDF5"); return (0); } return (1); } /*@@ @routine IOHDF5_TriggerOutput3D @date Sat March 6 1999 @author Gabrielle Allen @desc Triggers the output a variable using the IOHDF5 3D output method @enddesc @calledby CCTK scheduler @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var index @vdesc index of variable to output @vtype int @vio in @vcomment @endvar @@*/ int IOHDF5_TriggerOutput3D (cGH *GH, int index) { DECLARE_CCTK_PARAMETERS ioHDF5GH *myGH; const char *varname; varname = CCTK_VarName (index); myGH = (ioHDF5GH *) GH->extensions [CCTK_GHExtensionHandle ("IOHDF5")]; if (verbose) CCTK_VInfo (CCTK_THORNSTRING, "IOHDF5_TriggerOutput3D: varname, index = " "(%s, %d)", varname, index); /* Do the 3D output */ IOHDF5_Write3D (GH, index, varname); /* Register variable as having 3D output this iteration */ myGH->out3D_last [index] = GH->cctk_iteration; return (0); } /**************************** local functions ******************************/ static void CheckSteerableParameters (ioHDF5GH *myGH) { DECLARE_CCTK_PARAMETERS int out3D_vars_current_nset; static int out3D_vars_lastset = 0; /* How often to output */ myGH->out3D_every = out_every > 0 ? out_every : -1; if (out3D_every > 0) myGH->out3D_every = out3D_every; /* re-parse the 'IOHDF5::out3D_vars' parameter if it was changed */ out3D_vars_current_nset = CCTK_ParameterQueryTimesSet ("out3D_vars", CCTK_THORNSTRING); if (out3D_vars_current_nset != out3D_vars_lastset) { memset (myGH->do_out3D, 0, CCTK_NumVars ()); CCTK_TraverseString (out3D_vars, SetOutputFlag, myGH->do_out3D, CCTK_GROUP_OR_VAR); /* Save the last setting of 'out3D_vars' parameter */ out3D_vars_lastset = out3D_vars_current_nset; } } /* callback for CCTK_TraverseString() to set the output flag for the given variable */ static void SetOutputFlag (int index, const char *optstring, void *arg) { char *flags = (char *) arg; flags[index] = 1; if (optstring) { CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING, "Optional string '%s' in variable name ignored", optstring); } }