/*@@ @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" int IOBasic_OutputGH (cGH *GH) { DECLARE_CCTK_PARAMETERS int i; int grouptype; char *name=NULL; iobasicGH *myGH; /* Get the GH extensions for IOBasic */ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")]; /* Return if no output is required */ if (myGH->Scalarevery < 0) return 0; /* Loop over all variables */ for (i = 0; i < CCTK_NumVars (); i++) { grouptype = CCTK_GroupTypeFromVarI (i); /* Check this GF should be output */ if ((grouptype == GROUP_GF||grouptype == GROUP_SCALAR) && myGH->Scalarnum [i] != 0 && (GH->cctk_iteration % myGH->Scalarevery == 0)) { /* Check GF not already output this iteration */ if (myGH->Scalarlast [i] == GH->cctk_iteration) { char *msg, *varname; varname = CCTK_VarName (i); msg = (char *) malloc (200 * sizeof (char) + strlen (varname)); sprintf (msg, "Already done Scalar output for '%s' on this timestep", varname); CCTK_WARN (2, msg); free (msg); } /* Check GF has storage */ else if (grouptype == GROUP_GF && ! CCTK_QueryGroupStorageI (GH, CCTK_GroupIndexFromVarI (i))) { char *msg, *varname; varname = CCTK_VarName(i); msg = (char *) malloc (200 * sizeof (char) + strlen (varname)); sprintf (msg, "No 0D output in IOBasic_OutputGH for '%s' " "(no storage)", varname); CCTK_WARN (2, msg); free (msg); } else { /* Get the variable name for this index (for filename) */ name = CCTK_VarName(i); #ifdef IO_DEBUG printf("\nIn IOBasic_OutputGH\n----------------\n"); printf(" Index = %d\n",i); printf(" Variable = -%s-\n",name); printf(" Last output iteration was = %d\n",myGH->Scalarlast[i]); printf(" Output iteration number = %d\n",myGH->Scalarnum[i]); #endif /* Make the IO call */ if (grouptype == GROUP_SCALAR) { IOBasic_Write (GH, i, name); } else { IOBasic_WriteGF (GH, i, name); } /* Register another 0D output for this GF */ myGH->Scalarnum [i]++; /* Register GF as having 0D output this iteration */ myGH->Scalarlast [i] = GH->cctk_iteration; } } } return 0; } int IOBasic_OutputVarAs (cGH *GH, const char *fullname, const char *alias) { int index; int grouptype; 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 grouptype = CCTK_GroupTypeFromVarI (index); if (grouptype == 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 CCTK_QueryGroupStorage CCTK_GroupFromVar @calledby @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var var @vdesc index of variable @vtype int @vio in @vcomment @endvar @@*/ int IOBasic_TimeForOutput (cGH *GH, int var) { 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")]; grouptype = CCTK_GroupTypeFromVarI (var); /* Check this GF should be output */ if ((grouptype == GROUP_GF || grouptype == GROUP_SCALAR) && myGH->Scalarnum [var] != 0 && (GH->cctk_iteration % myGH->Scalarevery == 0)) { /* Check GF not already output this iteration */ if (myGH->Scalarlast [var] == 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 variable) { char *var; int grouptype; iobasicGH *myGH; /* Get the GH extension for IOBasic */ myGH = (iobasicGH *) GH->extensions [CCTK_GHExtensionHandle ("IOBasic")]; var = CCTK_VarName (variable); #ifdef IO_DEBUG printf("\nIn IOBasic_TriggerOutput\n---------------------\n"); printf(" Index = %d\n",variable); printf(" Variable = -%s-\n",var); #endif /* Do the Scalar output */ grouptype = CCTK_GroupTypeFromVarI (variable); if (grouptype == GROUP_SCALAR) { IOBasic_Write (GH, variable, var); } else { IOBasic_WriteGF (GH, variable, var); } /* Register another Scalar output for this GF */ myGH->Scalarnum [variable]++; /* Register variable as having Scalar output this iteration */ myGH->Scalarlast [variable] = GH->cctk_iteration; return 0; }