/*@@ @file OutputInfo.c @date June 31 1999 @author Gabrielle Allen @desc Functions to deal with Info output of Variables @enddesc @@*/ /*#define IO_DEBUG 1*/ #include #include #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "iobasicGH.h" /* the number at which to switch from decimal to exp notation */ #define DECIMAL_PRECISION 1.0e-8 #define DECIMAL_TOOBIG 1.0e+8 #define USE_DECIMAL_NOTATION(x) ((fabs (x) > DECIMAL_PRECISION) || \ ((x) == 0.0) || \ (fabs(x) < DECIMAL_TOOBIG)) /* function prototypes */ static void SetOutputFlag (int index, const char *optstring, void *arg); /* static variables */ static int print_header = 1; static int outInfo_vars_lastset = -1; /*@@ @routine IOBasic_OutputInfoGH @date June 31 1999 @author Gabrielle Allen @desc Loops over all variables and prints output if requested method @enddesc @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @@*/ int IOBasic_OutputInfoGH (cGH *GH) { DECLARE_CCTK_PARAMETERS int i; int ierr1; int ierr2; int times_set; const char *varname; iobasicGH *myGH; /* Get the GH extensions for IOBasic */ myGH = (iobasicGH *) GH->extensions[CCTK_GHExtensionHandle ("IOBasic")]; /* How often to output */ myGH->outInfo_every = out_every > 0 ? out_every : -1; if (outInfo_every > 0) { myGH->outInfo_every = outInfo_every; } /* Return if no output is required */ if (myGH->outInfo_every < 1 || GH->cctk_iteration % myGH->outInfo_every != 0) { return (0); } /* re-parse the 'outInfo_vars' parameter if it was changed and also print a header */ times_set = CCTK_ParameterQueryTimesSet ("outInfo_vars", CCTK_THORNSTRING); if (times_set != outInfo_vars_lastset) { int do_outInfo; memset (myGH->do_outInfo, 0, CCTK_NumVars ()); CCTK_TraverseString (outInfo_vars, SetOutputFlag, myGH->do_outInfo, CCTK_GROUP_OR_VAR); /* Save the last setting of 'outInfo_vars' parameter */ outInfo_vars_lastset = times_set; do_outInfo = 0; for (i = 0; i < CCTK_NumVars (); i++) { do_outInfo |= myGH->do_outInfo[i]; } /* suppress any output if there are no variables to output */ if (! do_outInfo) { return (0); } print_header = 1; } if (print_header) { char l1[1024],l2[1024],l3[1024]; print_header = 0; sprintf (l1," it | |"); sprintf (l2," | t |"); sprintf (l3,"----------------"); for (i = 0; i < CCTK_NumVars (); i++) { char ll[80]; if (myGH->do_outInfo[i]) { sprintf (ll," "); ll[25-strlen(CCTK_VarName(i))] = '\0'; sprintf (l1,"%s %s%s |",l1,CCTK_VarName(i),ll); sprintf (l2,"%s Min Max |",l2); sprintf (l3,"%s----------------------------",l3); } } printf ("%s\n%s\n%s\n%s\n",l3,l1,l2,l3); fflush(stdout); } /* Print the iteration/timestep information for all variables */ if (USE_DECIMAL_NOTATION (GH->cctk_time)) { printf("%4d |%9.3f|",GH->cctk_iteration,GH->cctk_time); } else { printf("%4d |%7.3e|",GH->cctk_iteration,GH->cctk_time); } /* Loop over all variables */ for (i = 0; i < CCTK_NumVars (); i++) { /* Check this Variable should be output */ if (! myGH->do_outInfo[i]) { continue; } ierr1 = ierr2 = 0; /* Check variable not already output this iteration */ if (myGH->outInfo_last[i] != GH->cctk_iteration) { /* Get the variable name for this index (for filename) */ varname = CCTK_VarName (i); #ifdef IO_DEBUG printf("\nIn IO OutputInfoGH\n----------------\n"); printf(" Index = %d\n", i); printf(" Variable = -%s-\n", varname); printf(" Last output iteration was = %d\n", myGH->outInfo_last[i]); #endif /* Make the IO call */ ierr1 = IOBasic_WriteInfo (GH, &myGH->infovals[i][0], i, "minimum", varname); ierr2 = IOBasic_WriteInfo (GH, &myGH->infovals[i][1], i, "maximum", varname); /* Register GF as having info output this iteration */ myGH->outInfo_last[i] = GH->cctk_iteration; } if (ierr1 == 0) { /* finally print out the stuff */ if (USE_DECIMAL_NOTATION (myGH->infovals[i][0])) { printf ("%12.8f |", myGH->infovals[i][0]); } else { printf ("%10.6e |", myGH->infovals[i][0]); } } else { printf(" ----------- |"); } if (ierr2 == 0) { if (USE_DECIMAL_NOTATION (myGH->infovals[i][1])) { printf ("%12.8f |", myGH->infovals[i][1]); } else { printf ("%10.6e |", myGH->infovals[i][1]); } } else { printf(" ----------- |"); } } /* end of loop over all variables */ /* Add the new line */ printf ("\n"); fflush(stdout); return (0); } /*@@ @routine IOBasic_TimeForInfo @date June 31 1999 @author Gabrielle Allen @desc Decides if it is time to output a variable using info output method @enddesc @calls CCTK_GHExtensionHandle CCTK_GroupTypeFromVarI CCTK_WARN CCTK_QueryGroupStorageI CCTK_GroupFromVar @calledby @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var index @vdesc index of variable to output @vtype int @vio in @vcomment @endvar @@*/ int IOBasic_TimeForInfo (cGH *GH, int index) { DECLARE_CCTK_PARAMETERS int retval; int times_set; iobasicGH *myGH; /* Default is do not do output */ retval = 0; /* Get the GH extensions for IOBasic */ myGH = (iobasicGH *) GH->extensions[CCTK_GHExtensionHandle ("IOBasic")]; /* How often to output */ myGH->outInfo_every = out_every > 0 ? out_every : -1; if (outInfo_every > 0) { myGH->outInfo_every = outInfo_every; } /* return if no output requested */ if (myGH->outInfo_every <= 0) { return (0); } /* re-parse the 'outInfo_vars' parameter if it was changed and also print a header */ times_set = CCTK_ParameterQueryTimesSet ("outInfo_vars", CCTK_THORNSTRING); if (times_set != outInfo_vars_lastset) { memset (myGH->do_outInfo, 0, CCTK_NumVars ()); CCTK_TraverseString (outInfo_vars, SetOutputFlag, myGH->do_outInfo, CCTK_GROUP_OR_VAR); /* Save the last setting of 'outInfo_vars' parameter */ outInfo_vars_lastset = times_set; print_header = 1; } /* Check if this variable should be output */ if (myGH->do_outInfo[index] && (GH->cctk_iteration % myGH->outInfo_every == 0)) { /* Check GF not already output this iteration */ if (myGH->outInfo_last[index] == GH->cctk_iteration) { char *fullname = CCTK_FullName (index); CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING, "Already done Info output for '%s' in current " "iteration (probably via triggers)", fullname); free (fullname); } else { retval = 1; } } return retval; } /*@@ @routine IOBasic_TriggerOutputInfo @date June 31 1999 @author Gabrielle Allen @desc Triggers the output of a variable using IOBasic's info output method @enddesc @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var index @vdesc index of variable to output @vtype int @vio in @vcomment @endvar @@*/ int IOBasic_TriggerOutputInfo (cGH *GH, int index) { iobasicGH *myGH; const char *varname; /* Get the GH extension for IOBasic */ myGH = (iobasicGH *) GH->extensions[CCTK_GHExtensionHandle ("IOBasic")]; varname = CCTK_VarName (index); /* Do the Info output */ #ifdef IO_DEBUG printf ("\nIn IO TriggerOutputInfo\n---------------------\n"); printf (" Index = %d\n", index); printf (" Variable = -%s-\n", varname); #endif IOBasic_WriteInfo (GH, &myGH->infovals[index][0], index, "minimum", varname); IOBasic_WriteInfo (GH, &myGH->infovals[index][1], index, "maximum", varname); /* Register variable as having Info output at this iteration */ myGH->outInfo_last[index] = GH->cctk_iteration; return 0; } /**************************** local functions ******************************/ /* callback for CCTK_TraverseString() to set the output flag for the given variable */ static void SetOutputFlag (int index, const char *optstring, void *arg) { char *flags = (char *) arg; flags[index] = 1; if (optstring) { CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING, "Optional string '%s' in variable name ignored", optstring); } }