diff options
Diffstat (limited to 'src/OutputScalar.c')
-rw-r--r-- | src/OutputScalar.c | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/src/OutputScalar.c b/src/OutputScalar.c new file mode 100644 index 0000000..155b1dc --- /dev/null +++ b/src/OutputScalar.c @@ -0,0 +1,331 @@ + /*@@ + @file Output.c + @date Mon 21 September + @author Gabrielle Allen + @desc + Functions to deal with scalar output of grid variables + @enddesc + @@*/ + +/* #define IOBASIC_DEBUG 1 */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +#include "cctk.h" +#include "cctk_Parameters.h" +#include "iobasicGH.h" + +static const char *rcsid = "$Header$"; + +CCTK_FILEVERSION(CactusBase_IOBasic_Output_c) + +/* function prototypes */ +static void CheckSteerableParameters (iobasicGH *myGH); +static void SetOutputFlag (int vindex, const char *optstring, void *arg); + + +/*@@ + @routine IOBasic_ScalarOutputGH + @date Sat March 6 1999 + @author Gabrielle Allen + @desc + Loops over all variables and outputs them if necessary + @enddesc + @calledby CCTK_OutputGH ("IOBasic") + @history + + @endhistory + @var GH + @vdesc Pointer to CCTK GH + @vtype cGH + @vio in + @endvar +@@*/ +int IOBasic_ScalarOutputGH (cGH *GH) +{ + int vindex; + const char *name; + iobasicGH *myGH; + + + /* Get the GH extensions for IOBasic */ + myGH = (iobasicGH *) CCTK_GHExtension (GH, "IOBasic"); + + CheckSteerableParameters (myGH); + + /* Return if no output is required */ + if (myGH->outScalar_every <= 0) + { + return (0); + } + + /* Loop over all variables */ + for (vindex = 0; vindex < CCTK_NumVars (); vindex++) + { + + /* Is it time for output ? */ + if (! IOBasic_TimeForScalarOutput (GH, vindex)) + { + continue; + } + + /* Get the variable name for this index (for filename) */ + name = CCTK_VarName (vindex); + +#ifdef IOBASIC_DEBUG + printf("\nIn IOBasic_ScalarOutputGH\n----------------\n"); + printf(" Index = %d\n",vindex); + printf(" Variable = -%s-\n",name); + printf(" Last output iteration was = %d\n",myGH->outScalar_last[vindex]); +#endif + + /* Make the IO call */ + if (CCTK_GroupTypeFromVarI (vindex) == CCTK_SCALAR) + { + IOBasic_WriteScalarGS (GH, vindex, name); + } + else + { + IOBasic_WriteScalarGA (GH, vindex, name); + } + + /* Register GF as having 0D output this iteration */ + myGH->outScalar_last [vindex] = GH->cctk_iteration; + + } /* end of loop over all variables */ + + return (0); +} + + +/*@@ + @routine IOBasic_ScalarOutputVarAs + @date Sat March 6 1999 + @author Gabrielle Allen + @desc + unconditional output of a variable using the IOBasic output method + @enddesc + @calledby IOBasic_ScalarOutputGH, CCTK_OutputVarAsByMethod ("IOBasic") + @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 IOBasic_ScalarOutputVarAs (cGH *GH, const char *fullname, const char *alias) +{ + int vindex; + + + vindex = CCTK_VarIndex (fullname); + +#ifdef IOBASIC_DEBUG + printf("\nIn IOBasic_ScalarOutputVarAs\n-------------------\n"); + printf(" Fullname = -%s-\n",fullname); + printf(" Alias = -%s-\n",alias); + printf(" Index = %d\n",vindex); +#endif + + if (CCTK_GroupTypeFromVarI (vindex) == CCTK_SCALAR) + { + IOBasic_WriteScalarGS (GH, vindex, alias); + } + else + { + IOBasic_WriteScalarGA (GH, vindex, alias); + } + + return (0); +} + + + /*@@ + @routine IOBasic_TimeForScalarOutput + @date Sat March 6 1999 + @author Gabrielle Allen + @desc + Decides if it is time to output a variable using Scalar output + method + @enddesc + @calls CCTK_GHExtension + CCTK_GroupTypeFromVar + CCTK_WARN + @calledby + @history + + @endhistory + @var GH + @vdesc Pointer to CCTK GH + @vtype cGH + @vio in + @vcomment + @endvar + @var vindex + @vdesc index of variable + @vtype int + @vio in + @vcomment + @endvar +@@*/ +int IOBasic_TimeForScalarOutput (cGH *GH, int vindex) +{ + int return_type; + iobasicGH *myGH; + char *fullname; + + + /* Default is do not do output */ + return_type = 0; + + /* Get the GH extension for IOBasic */ + myGH = (iobasicGH *) CCTK_GHExtension (GH, "IOBasic"); + + CheckSteerableParameters (myGH); + + /* check if any output was requested */ + if (myGH->outScalar_every <= 0) + { + return (0); + } + + /* Check if this variable should be output */ + if (myGH->do_outScalar [vindex] && + (GH->cctk_iteration % myGH->outScalar_every) == 0) + { + /* Check if variable wasn't already output this iteration */ + if (myGH->outScalar_last [vindex] == GH->cctk_iteration) + { + fullname = CCTK_FullName (vindex); + CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING, + "Already done IOBasic scalar output for '%s' in " + "current iteration (probably via triggers)", fullname); + free (fullname); + } + else + { + return_type = 1; + } + } + + return (return_type); +} + + +/*@@ + @routine IOBasic_TriggerScalarOutput + @date Sat March 6 1999 + @author Gabrielle Allen + @desc + Triggers the output a variable using IOBasic's Scalar + output method + method + @enddesc + @calledby CCTK scheduler + @var GH + @vdesc Pointer to CCTK GH + @vtype cGH + @vio in + @vcomment + @endvar + @var vindex + @vdesc index of variable to output + @vtype int + @vio in + @vcomment + @endvar +@@*/ +int IOBasic_TriggerScalarOutput (cGH *GH, int vindex) +{ + const char *name; + iobasicGH *myGH; + + + /* Get the GH extension for IOBasic */ + myGH = (iobasicGH *) CCTK_GHExtension (GH, "IOBasic"); + + name = CCTK_VarName (vindex); + +#ifdef IOBASIC_DEBUG + printf ("\nIn IOBasic_TriggerScalarOutput\n---------------------\n"); + printf (" Index = %d\n", vindex); + printf (" Variable = -%s-\n", name); +#endif + + /* Do the Scalar output */ + if (CCTK_GroupTypeFromVarI (vindex) == CCTK_SCALAR) + { + IOBasic_WriteScalarGS (GH, vindex, name); + } + else + { + IOBasic_WriteScalarGA (GH, vindex, name); + } + + /* Register variable as having Scalar output this iteration */ + myGH->outScalar_last [vindex] = GH->cctk_iteration; + + return (0); +} + + +/**************************** local functions ******************************/ +/* check if steerable parameters have changed */ +static void CheckSteerableParameters (iobasicGH *myGH) +{ + DECLARE_CCTK_PARAMETERS + int times_set; + static int outScalar_vars_lastset = -1; + + + /* How often to output */ + myGH->outScalar_every = out_every > 0 ? out_every : -1; + if (outScalar_every > 0) + { + myGH->outScalar_every = outScalar_every; + } + + /* re-parse the 'outScalar_vars' parameter if it was changed */ + times_set = CCTK_ParameterQueryTimesSet ("outScalar_vars", CCTK_THORNSTRING); + if (times_set != outScalar_vars_lastset) + { + memset (myGH->do_outScalar, 0, CCTK_NumVars ()); + CCTK_TraverseString (outScalar_vars, SetOutputFlag, myGH->do_outScalar, + CCTK_GROUP_OR_VAR); + + /* Save the last setting of 'outScalar_vars' parameter */ + outScalar_vars_lastset = times_set; + } + +} + + +/* callback for CCTK_TraverseString() to set the output flag + for the given variable */ +static void SetOutputFlag (int vindex, const char *optstring, void *arg) +{ + char *flags = (char *) arg; + + + flags[vindex] = 1; + + if (optstring) + { + CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING, + "Optional string '%s' in variable name ignored", optstring); + } +} |