/*@@ @routine IOJpeg_Output2DGH @date Thu Sep 14 10:47:58 2000 @author Gerd Lanfermann @desc Preparing 2D data for output @enddesc @calls @calledby @history @endhistory @@*/ #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "CactusBase/IOUtil/src/ioutil_Utils.h" #include "IOJpeg.h" /* function prototypes */ int IOJpeg_TimeFor2D (cGH *GH, int index); int IOJpeg_Output2DVarAs (cGH *GH, const char *var, const char *alias); static void CheckSteerableParameters (IOJpegGH *myGH); static void SetOutputFlag (int index, const char *optstring, void *arg); int IOJpeg_Output2DGH (cGH *GH) { DECLARE_CCTK_PARAMETERS int i; IOJpegGH *myGH; const char *name; char *fullname; int ierr=0; /* Get the GH extension for IOJpeg */ myGH = (IOJpegGH *) GH->extensions [CCTK_GHExtensionHandle ("IOJpeg")]; CheckSteerableParameters (myGH); if (myGH->out2D_every <= 0) { return (0); } /* Loop over all variables */ for (i = 0; i < CCTK_NumVars (); i++) { if (IOJpeg_TimeFor2D (GH, i)) { name = CCTK_VarName (i); fullname = CCTK_FullName (i); if (!CCTK_Equals(verbose,"no")) { CCTK_VInfo (CCTK_THORNSTRING, "IOJpeg_Output2DGH: fullname / name = " "%s / %s", fullname, name); } ierr=IOJpeg_Output2DVarAs (GH, fullname, name); free (fullname); /* Register variable as having 2D output this iteration */ myGH->out2D_last [i] = GH->cctk_iteration; } } if (!CCTK_Equals(verbose,"no")) { CCTK_INFO("IOJpeg_Output2DGH Done"); } return (ierr); } int IOJpeg_Output2DVarAs (cGH *GH, const char *fullname, const char *alias) { DECLARE_CCTK_PARAMETERS int index,ierr=0; index = CCTK_VarIndex (fullname); /* first, check if variable has storage assigned */ if (! CCTK_QueryGroupStorageI (GH, CCTK_GroupIndexFromVarI (index))) { CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING, "No IOJpeg 2D output for '%s' (no storage)", fullname); return(-1); } if (!CCTK_Equals(verbose,"no")) { CCTK_VInfo (CCTK_THORNSTRING, "IOJpeg_Output2DVarAs: fullname, alias, " "index = (%s, %s, %d)", fullname, alias, index); } /* Do the 2D output */ ierr=IOJpeg_Write2D (GH, index, alias); return (ierr); } int IOJpeg_TimeFor2D (cGH *GH, int index) { IOJpegGH *myGH; /* Get the GH extension for IOJpeg */ myGH = (IOJpegGH *) GH->extensions [CCTK_GHExtensionHandle ("IOJpeg")]; CheckSteerableParameters (myGH); /* Check if any output was requested */ if(myGH->out2D_every <= 0) { return (0); } /* Check this variable should be output */ if (! (myGH->do_out2D [index] && GH->cctk_iteration % myGH->out2D_every == 0)) { return (0); } /* Check variable not already output this iteration */ if (myGH->out2D_last [index] == GH->cctk_iteration) { CCTK_WARN (2, "Already done 2D output in IOJpeg"); return (0); } return (1); } int IOJpeg_TriggerOutput2D (cGH *GH, int index) { DECLARE_CCTK_PARAMETERS IOJpegGH *myGH; const char *varname; int ierr=0; varname = CCTK_VarName (index); myGH = (IOJpegGH *) GH->extensions [CCTK_GHExtensionHandle ("IOJpeg")]; if (!CCTK_Equals(verbose,"no")) { CCTK_VInfo (CCTK_THORNSTRING, "IOJpeg_TriggerOutput2D: varname, index = " "(%s, %d)", varname, index); } /* Do the 2D output */ ierr=IOJpeg_Write2D (GH, index, varname); /* Register variable as having 2D output this iteration */ myGH->out2D_last [index] = GH->cctk_iteration; return (ierr); } /**************************** local functions ******************************/ static void CheckSteerableParameters (IOJpegGH *myGH) { DECLARE_CCTK_PARAMETERS int out2D_vars_current_nset; static int out2D_vars_lastset = 0; /* How often to output */ myGH->out2D_every = out_every > 0 ? out_every : -1; if (out2D_every > 0) { myGH->out2D_every = out2D_every; } /* re-parse the 'out2D_vars' parameter if it was changed */ out2D_vars_current_nset = CCTK_ParameterQueryTimesSet ("out2D_vars", CCTK_THORNSTRING); if (out2D_vars_current_nset != out2D_vars_lastset) { memset (myGH->do_out2D, 0, CCTK_NumVars ()); CCTK_TraverseString (out2D_vars, SetOutputFlag, myGH->do_out2D, CCTK_GROUP_OR_VAR); /* Save the last setting of 'out2D_vars' parameter */ out2D_vars_lastset = out2D_vars_current_nset; } } /* 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); } }