aboutsummaryrefslogtreecommitdiff
path: root/src/OutputScalar.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/OutputScalar.c')
-rw-r--r--src/OutputScalar.c331
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);
+ }
+}