/*@@ @file Output.c @date Mon 21 September @author Gabrielle Allen @desc Functions to deal with scalar output of grid variables @enddesc @@*/ /*#define IO_DEBUG*/ #include #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "CactusBase/IOUtil/src/ioGH.h" #include "iobasicGH.h" /* function prototypes */ int IOBasic_TimeForOutput (cGH *GH, int index); static void CheckSteerableParameters (iobasicGH *myGH); /*@@ @routine IOBasic_OutputGH @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_OutputGH (cGH *GH) { int index; const char *name; iobasicGH *myGH; /* Get the GH extensions for IOBasic */ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")]; CheckSteerableParameters (myGH); /* Return if no output is required */ if (myGH->outScalar_every <= 0) return (0); /* Loop over all variables */ for (index = 0; index < CCTK_NumVars (); index++) { /* Is it time for output ? */ if (! IOBasic_TimeForOutput (GH, index)) continue; /* Get the variable name for this index (for filename) */ name = CCTK_VarName (index); #ifdef IO_DEBUG printf("\nIn IOBasic_OutputGH\n----------------\n"); printf(" Index = %d\n",index); printf(" Variable = -%s-\n",name); printf(" Last output iteration was = %d\n",myGH->outScalar_last[index]); #endif /* Make the IO call */ if (CCTK_GroupTypeFromVarI (index) == GROUP_SCALAR) IOBasic_Write (GH, index, name); else IOBasic_WriteGF (GH, index, name); /* Register GF as having 0D output this iteration */ myGH->outScalar_last [index] = GH->cctk_iteration; } /* end of loop over all variables */ return (0); } /*@@ @routine IOBasic_OutputVarAs @date Sat March 6 1999 @author Gabrielle Allen @desc unconditional output of a variable using the IOBasic output method @enddesc @calledby IOBasic_OutputGH, 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_OutputVarAs (cGH *GH, const char *fullname, const char *alias) { int index; index = CCTK_VarIndex (fullname); #ifdef IO_DEBUG printf("\nIn IOBasic_OutputVarAs\n-------------------\n"); printf(" Fullname = -%s-\n",fullname); printf(" Alias = -%s-\n",alias); printf(" Index = %d\n",index); #endif if (CCTK_GroupTypeFromVarI (index) == GROUP_SCALAR) IOBasic_Write (GH, index, alias); else IOBasic_WriteGF (GH, index, alias); return (0); } /*@@ @routine IOBasic_TimeForOutput @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_GHExtensionHandle CCTK_GroupTypeFromVar CCTK_WARN @calledby @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 IOBasic_TimeForOutput (cGH *GH, int index) { int return_type; int grouptype; iobasicGH *myGH; /* Default is do not do output */ return_type = 0; /* Get the GH extension for IOBasic */ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")]; CheckSteerableParameters (myGH); grouptype = CCTK_GroupTypeFromVarI (index); /* Check this GF should be output */ if (myGH->do_outScalar [index] && (grouptype == GROUP_GF || grouptype == GROUP_SCALAR) && (GH->cctk_iteration % myGH->outScalar_every == 0)) { /* Check GF not already output this iteration */ if (myGH->outScalar_last [index] == GH->cctk_iteration) CCTK_WARN (2, "Already done Scalar output in IO"); else return_type = 1; } return (return_type); } int IOBasic_TriggerOutput (cGH *GH, int index) { const char *name; iobasicGH *myGH; /* Get the GH extension for IOBasic */ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")]; name = CCTK_VarName (index); #ifdef IO_DEBUG printf ("\nIn IOBasic_TriggerOutput\n---------------------\n"); printf (" Index = %d\n", index); printf (" Variable = -%s-\n", name); #endif /* Do the Scalar output */ if (CCTK_GroupTypeFromVarI (index) == GROUP_SCALAR) IOBasic_Write (GH, index, name); else IOBasic_WriteGF (GH, index, name); /* Register variable as having Scalar output this iteration */ myGH->outScalar_last [index] = GH->cctk_iteration; return (0); } /**************************** local functions ******************************/ static void CheckSteerableParameters (iobasicGH *myGH) { DECLARE_CCTK_PARAMETERS cParamData *paramdata; static int outScalar_vars_lastset = 0; /* How often to output */ myGH->outScalar_every = out_every > 0 ? out_every : -1; if (outScalar_every > 0) myGH->outScalar_every = outScalar_every; /* Check the 'outScalar_vars' parameter */ paramdata = CCTK_ParameterData ("outScalar_vars", CCTK_THORNSTRING); if (! paramdata) { CCTK_WARN (1, "Couldn't get info on parameter 'outScalar_vars'"); return; } /* re-parse the 'outScalar_vars' parameter if it was changed */ if (paramdata->n_set != outScalar_vars_lastset) { ParseVarsForOutput (outScalar_vars, myGH->do_outScalar); /* Save the last setting of 'outScalar_vars' parameter */ outScalar_vars_lastset = paramdata->n_set; } }