/*@@ @file Output.c @date Tue Jan 9 1999 @author Gabrielle Allen @desc Functions to deal with streaming output of variables in HDF5 format. @enddesc @version $Id$ @@*/ #include #include "cctk.h" #include "cctk_Parameters.h" #include "ioStreamedHDF5GH.h" /* the rcs ID and its dummy function to use it */ static const char *rcsid = "$Id$"; CCTK_FILEVERSION(BetaThorns_IOStreamedHDF5_Output_c) /******************************************************************** ******************** Internal Routines ************************ ********************************************************************/ static void CheckSteerableParameters (const cGH *GH); /*@@ @routine IOStreamedHDF5_OutputGH @date Sat March 6 1999 @author Gabrielle Allen @desc Loops over all variables and outputs them if necessary @enddesc @calls IOStreamedHDF5_TimeFor IOStreamedHDF5_OutputVarAs @var GH @vdesc Pointer to CCTK GH @vtype const cGH * @vio in @endvar @returntype int @returndesc the number of variables which were output at this iteration (or 0 if it wasn't time to output yet) @endreturndesc @@*/ int IOStreamedHDF5_OutputGH (const cGH *GH) { int vindex, retval; ioStreamedHDF5GH *myGH; const char *name; char *fullname; DECLARE_CCTK_PARAMETERS myGH = (ioStreamedHDF5GH *) CCTK_GHExtension (GH, "IOStreamedHDF5"); CheckSteerableParameters (GH); if (myGH->out_every <= 0) { return (0); } /* loop over all variables */ for (vindex = retval = 0; vindex < CCTK_NumVars (); vindex++) { if (IOStreamedHDF5_TimeFor (GH, vindex)) { name = CCTK_VarName (vindex); fullname = CCTK_FullName (vindex); if (verbose) { CCTK_VInfo (CCTK_THORNSTRING, "IOStreamedHDF5_OutputGH: " "output of variable (fullname, name) = " "('%s', '%s')", fullname, name); } if (IOStreamedHDF5_OutputVarAs (GH, fullname, name) == 0) { /* register variable as having output this iteration */ myGH->out_last[vindex] = GH->cctk_iteration; retval++; } free (fullname); } } return (retval); } /*@@ @routine IOStreamedHDF5_OutputVarAs @date Sat March 6 1999 @author Gabrielle Allen @desc Unconditional output of a variable using the IOStreamedHDF5 I/O method. @enddesc @calls IOStreamedHDF5_Write @var GH @vdesc Pointer to CCTK GH @vtype const cGH * @vio in @endvar @var fullname @vdesc complete name of variable to output @vtype const char * @vio in @endvar @var alias @vdesc alias name of variable to output (used to generate output filename) @vtype const char * @vio in @endvar @returntype int @returndesc return code of @seeroutine IOStreamedHDF5_Write @endreturndesc @@*/ int IOStreamedHDF5_OutputVarAs (const cGH *GH, const char *fullname, const char *alias) { int vindex, retval; DECLARE_CCTK_PARAMETERS vindex = CCTK_VarIndex (fullname); if (verbose) { CCTK_VInfo (CCTK_THORNSTRING, "IOStreamedHDF5_OutputVarAs: " "output of variable (fullname, alias) = " "('%s', '%s')", fullname, alias); } /* do the output */ retval = IOStreamedHDF5_Write (GH, vindex, alias); return (retval); } /*@@ @routine IOStreamedHDF5_TimeFor @date Sat March 6 1999 @author Gabrielle Allen @desc Decides if it is time to output a variable using the IOStreamedHDF5 I/O method. @enddesc @calls CheckSteerableParameters @var GH @vdesc Pointer to CCTK GH @vtype const cGH * @vio in @endvar @var vindex @vdesc index of variable @vtype int @vio in @endvar @returntype int @returndesc 1 if output should take place at this iteration, or
0 if not @endreturndesc @@*/ int IOStreamedHDF5_TimeFor (const cGH *GH, int vindex) { int retval; char *fullname; ioStreamedHDF5GH *myGH; CheckSteerableParameters (GH); /* check if this variable should be output */ myGH = (ioStreamedHDF5GH *) CCTK_GHExtension (GH, "IOStreamedHDF5"); retval = myGH->out_every > 0 && myGH->requests[vindex] && GH->cctk_iteration % myGH->out_every == 0; if (retval) { /* check if variable was not already output this iteration */ if (myGH->out_last[vindex] == GH->cctk_iteration) { fullname = CCTK_FullName (vindex); CCTK_VWarn (6, __LINE__, __FILE__, CCTK_THORNSTRING, "Already done IOStreamedHDF5 output for variable '%s' in " "current iteration (probably via triggers)", fullname); free (fullname); retval = 0; } } return (retval); } /*@@ @routine IOStreamedHDF5_TriggerOutput @date Sat March 6 1999 @author Gabrielle Allen @desc Triggers the output of a variable using the IOStreamedHDF5 I/O method. @enddesc @calls IOStreamedHDF5_Write @var GH @vdesc Pointer to CCTK GH @vtype const cGH * @vio in @endvar @var vindex @vdesc index of variable @vtype int @vio in @endvar @returntype int @returndesc return code of @seeroutine IOStreamedHDF5_Write @endreturndesc @@*/ int IOStreamedHDF5_TriggerOutput (const cGH *GH, int vindex) { int retval; ioStreamedHDF5GH *myGH; char *fullname; const char *varname; DECLARE_CCTK_PARAMETERS varname = CCTK_VarName (vindex); myGH = (ioStreamedHDF5GH *) CCTK_GHExtension (GH, "IOStreamedHDF5"); if (verbose) { fullname = CCTK_FullName (vindex); CCTK_VInfo (CCTK_THORNSTRING, "IOStreamedHDF5_TriggerOutput: " "output of (varname, fullname) = " "('%s', '%s')", varname, fullname); free (fullname); } /* do the output */ retval = IOStreamedHDF5_Write (GH, vindex, varname); if (retval == 0) { /* register variable as having output this iteration */ myGH->out_last[vindex] = GH->cctk_iteration; } return (retval); } /******************************************************************** ******************** Internal Routines ************************ ********************************************************************/ /*@@ @routine CheckSteerableParameters @date Mon Oct 10 2000 @author Thomas Radke @desc Checks if IOStreamedHDF5 steerable parameters were changed and does appropriate re-evaluation. @enddesc @calls IOHDF5Util_ParseVarsForOutput @var GH @vdesc Pointer to CCTK grid hierarchy @vtype const cGH * @vio in @endvar @@*/ static void CheckSteerableParameters (const cGH *GH) { int times_set; ioStreamedHDF5GH *myGH; static int out_vars_lastset = -1, user_was_warned = 0; DECLARE_CCTK_PARAMETERS myGH = (ioStreamedHDF5GH *) CCTK_GHExtension (GH, "IOStreamedHDF5"); /* how often to output */ if (out_every >= 0 || outHDF5_every >= 0) { if (out_every < 0) { if (! user_was_warned) { CCTK_WARN (1, "Parameter 'IOStreamedHDF5::outHDF5_every is depricated " "in BETA12, please use 'IOStreamedHDF5::out_every' " "instead"); user_was_warned = 1; } myGH->out_every = outHDF5_every; } else { myGH->out_every = out_every; } } else { myGH->out_every = *(const CCTK_INT *) CCTK_ParameterGet ("out_every", CCTK_ImplementationThorn ("IO"), NULL); } /* re-parse the 'IOStreamedHDF5::out_vars' parameter if it was changed */ times_set = CCTK_ParameterQueryTimesSet ("out_vars", CCTK_THORNSTRING); if (times_set != out_vars_lastset) { IOUtil_ParseVarsForOutput (GH, out_vars, myGH->requests); /* Save the last setting of 'out_vars' parameter */ out_vars_lastset = times_set; } }