/*@@ @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 "iobasicGH.h" static const char *rcsid = "$Header$"; CCTK_FILEVERSION(CactusBase_IOBasic_Output_c) /* function prototypes */ int IOBasic_TimeForOutput (cGH *GH, int vindex); int IOBasic_OutputGH (cGH *GH); static void CheckSteerableParameters (iobasicGH *myGH); static void SetOutputFlag (int vindex, const char *optstring, void *arg); /*@@ @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 vindex; 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 (vindex = 0; vindex < CCTK_NumVars (); vindex++) { /* Is it time for output ? */ if (! IOBasic_TimeForOutput (GH, vindex)) { continue; } /* Get the variable name for this index (for filename) */ name = CCTK_VarName (vindex); #ifdef IO_DEBUG printf("\nIn IOBasic_OutputGH\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_Write (GH, vindex, name); } else { IOBasic_WriteGF (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_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 vindex; vindex = 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",vindex); #endif if (CCTK_GroupTypeFromVarI (vindex) == CCTK_SCALAR) { IOBasic_Write (GH, vindex, alias); } else { IOBasic_WriteGF (GH, vindex, 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 vindex @vdesc index of variable @vtype int @vio in @vcomment @endvar @@*/ int IOBasic_TimeForOutput (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 *) GH->extensions [CCTK_GHExtensionHandle ("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_TriggerOutput @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_TriggerOutput (cGH *GH, int vindex) { const char *name; iobasicGH *myGH; /* Get the GH extension for IOBasic */ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")]; name = CCTK_VarName (vindex); #ifdef IO_DEBUG printf ("\nIn IOBasic_TriggerOutput\n---------------------\n"); printf (" Index = %d\n", vindex); printf (" Variable = -%s-\n", name); #endif /* Do the Scalar output */ if (CCTK_GroupTypeFromVarI (vindex) == CCTK_SCALAR) { IOBasic_Write (GH, vindex, name); } else { IOBasic_WriteGF (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) { int times_set; int out_old; int i; static int outScalar_vars_lastset = -1; DECLARE_CCTK_PARAMETERS /* How often to output */ out_old = myGH->outScalar_every; myGH->outScalar_every = out_every > 0 ? out_every : -1; if (outScalar_every > 0) { myGH->outScalar_every = outScalar_every; } if (myGH->outScalar_every != out_old) { if (CCTK_Equals(newverbose,"standard") || CCTK_Equals(newverbose,"full")) { CCTK_VInfo("IOBasic","Scalar: Output every %d iterations", myGH->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); if (CCTK_Equals(newverbose,"full")) { for (i=0;ido_outScalar[i] > 0) { CCTK_VInfo("IOBasic","Scalar: Output requested for %s", CCTK_VarName(i)); } } } /* 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); } }