aboutsummaryrefslogtreecommitdiff
path: root/src/Output.c
diff options
context:
space:
mode:
authortradke <tradke@eff87b29-5268-4891-90a3-a07138403961>2002-04-18 22:52:48 +0000
committertradke <tradke@eff87b29-5268-4891-90a3-a07138403961>2002-04-18 22:52:48 +0000
commit2d91d4f970e1f31365da061077384eee8a839b28 (patch)
tree3e6dc81312746a07cbe04de5e1a095d0747613f2 /src/Output.c
parent19a205fc66c0caa75d1acf50bacdd9c7d03dedbe (diff)
Completly reworked IOJpeg. All the old hyperslabbing crap and dependency on
IOASCII is gone now. IOJpeg uses the new Hyperslab API and does its own slice center setup. It also uses the new filenaming scheme. git-svn-id: http://svn.cactuscode.org/arrangements/CactusIO/IOJpeg/trunk@59 eff87b29-5268-4891-90a3-a07138403961
Diffstat (limited to 'src/Output.c')
-rw-r--r--src/Output.c377
1 files changed, 377 insertions, 0 deletions
diff --git a/src/Output.c b/src/Output.c
new file mode 100644
index 0000000..02464de
--- /dev/null
+++ b/src/Output.c
@@ -0,0 +1,377 @@
+ /*@@
+ @file Output.c
+ @date Thu May 11 2000
+ @author Thomas Radke
+ @desc
+ Functions to deal with Jpeg output of variables.
+ @enddesc
+ @version $Id$
+ @@*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "cctk.h"
+#include "cctk_Parameters.h"
+#include "util_String.h"
+#include "ioJpegGH.h"
+
+/* the rcs ID and its dummy function to use it */
+static const char *rcsid = "$Id$";
+CCTK_FILEVERSION(CactusIO_IOJpeg_Output_c)
+
+/* define this if you want debug output */
+/* #define IOJPEG_DEBUG 1 */
+
+
+/********************************************************************
+ ******************** Internal Routines ************************
+ ********************************************************************/
+static int CheckOutputVar (int vindex);
+static void CheckSteerableParameters (ioJpegGH *myGH);
+static void SetOutputFlag (int vindex, const char *optstring, void *arg);
+
+
+/*@@
+ @routine IOJpeg_OutputGH
+ @date Thu 18 April 2002
+ @author Thomas Radke
+ @desc
+ Loops over all variables and outputs them if necessary
+ @enddesc
+ @calls IOJpeg_TimeFor
+ IOJpeg_Write
+
+ @var GH
+ @vdesc Pointer to CCTK GH
+ @vtype const cGH *
+ @vio in
+ @endvar
+
+ @returntype int
+ @returndesc
+ the number of variables which were output at this iteration
+ (or 0 if it wasn't time to output yet)
+ @endreturndesc
+@@*/
+int IOJpeg_OutputGH (const cGH *GH)
+{
+ int vindex, retval;
+ ioJpegGH *myGH;
+
+
+ myGH = (ioJpegGH *) CCTK_GHExtension (GH, "IOJpeg");
+ CheckSteerableParameters (myGH);
+
+ /* loop over all variables */
+ for (vindex = retval = 0; vindex < CCTK_NumVars (); vindex++)
+ {
+ /* check if this variable should be output */
+ if (! IOJpeg_TimeFor (GH, vindex))
+ {
+ continue;
+ }
+
+ /* do the output */
+ if (IOJpeg_Write (GH, vindex, CCTK_VarName (vindex)) == 0)
+ {
+ /* register variable as having output this iteration */
+ myGH->out_last[vindex] = GH->cctk_iteration;
+ retval++;
+ }
+ }
+
+ return (retval);
+}
+
+
+/*@@
+ @routine IOJpeg_OutputVarAs
+ @date Thu 18 April 2002
+ @author Thomas Radke
+ @desc
+ Unconditional output of a variable using the IOJpeg I/O method.
+ @enddesc
+ @calls IOJpeg_Write
+
+ @var GH
+ @vdesc Pointer to CCTK GH
+ @vtype const cGH *
+ @vio in
+ @endvar
+ @var fullname
+ @vdesc complete name of variable to output
+ @vtype const char *
+ @vio in
+ @endvar
+ @var alias
+ @vdesc alias name of variable to output
+ (used to generate output filename)
+ @vtype const char *
+ @vio in
+ @endvar
+
+ @returntype int
+ @returndesc
+ return code of @seeroutine IOJpeg_Write, or<BR>
+ -1 if variable cannot be output by IOJpeg
+ @endreturndesc
+@@*/
+int IOJpeg_OutputVarAs (const cGH *GH, const char *fullname, const char *alias)
+{
+ int vindex, retval;
+
+
+ retval = -1;
+ vindex = CCTK_VarIndex (fullname);
+
+ if (CheckOutputVar (vindex) == 0)
+ {
+ retval = IOJpeg_Write (GH, vindex, alias);
+ }
+
+ return (retval);
+}
+
+
+ /*@@
+ @routine IOJpeg_TimeFor
+ @date Thu 18 April 2002
+ @author Thomas Radke
+ @desc
+ Decides if it is time to output a variable
+ using the IOJpeg I/O method.
+ @enddesc
+
+ @var GH
+ @vdesc Pointer to CCTK GH
+ @vtype const cGH *
+ @vio in
+ @endvar
+ @var vindex
+ @vdesc index of variable
+ @vtype int
+ @vio in
+ @endvar
+
+ @returntype int
+ @returndesc
+ 1 if output should take place at this iteration, or<BR>
+ 0 if not
+ @endreturndesc
+@@*/
+int IOJpeg_TimeFor (const cGH *GH, int vindex)
+{
+ int result;
+ ioJpegGH *myGH;
+ char *fullname;
+
+
+ /* default is not do any output */
+ result = 0;
+
+ myGH = (ioJpegGH *) CCTK_GHExtension (GH, "IOJpeg");
+ CheckSteerableParameters (myGH);
+
+ /* check if this variable should be output */
+ if (myGH->out_every[vindex] > 0 &&
+ GH->cctk_iteration % myGH->out_every[vindex] == 0)
+ {
+ /* check if variable wasn't already output this iteration */
+ if (myGH->out_last[vindex] == GH->cctk_iteration)
+ {
+ fullname = CCTK_FullName (vindex);
+ CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Already done IOJpeg output for '%s' in current "
+ "iteration (probably via triggers)", fullname);
+ free (fullname);
+ }
+ else
+ {
+ result = 1;
+ }
+ }
+
+ return (result);
+}
+
+
+/*@@
+ @routine IOJpeg_TriggerOutput
+ @date Thu 18 April 2002
+ @author Thomas Radke
+ @desc
+ Triggers the output of a variable using the IOJpeg I/O method.
+ @enddesc
+ @calls IOJpeg_Write
+
+ @var GH
+ @vdesc Pointer to CCTK GH
+ @vtype const cGH *
+ @vio in
+ @endvar
+ @var vindex
+ @vdesc index of variable to output
+ @vtype int
+ @vio in
+ @endvar
+
+ @returntype int
+ @returndesc
+ return code of @seeroutine IOJpeg_Write
+ @endreturndesc
+@@*/
+int IOJpeg_TriggerOutput (const cGH *GH, int vindex)
+{
+ int retval;
+ ioJpegGH *myGH;
+
+
+ /* do the output */
+ retval = IOJpeg_Write (GH, vindex, CCTK_VarName (vindex));
+ if (retval == 0)
+ {
+ /* register variables as having output this iteration */
+ myGH = (ioJpegGH *) CCTK_GHExtension (GH, "IOJpeg");
+ myGH->out_last[vindex] = GH->cctk_iteration;
+ }
+
+ return (retval);
+}
+
+
+/**************************** local functions ******************************/
+/* check if steerable parameters have changed */
+static void CheckSteerableParameters (ioJpegGH *myGH)
+{
+ int i, num_vars;
+ char *fullname, *msg;
+ DECLARE_CCTK_PARAMETERS
+
+
+ /* how often to output */
+ i = myGH->out_every_default;
+ myGH->out_every_default = out2D_every > 0 ? out2D_every : out_every;
+
+ /* report if frequency changed */
+ if (myGH->out_every_default != i && ! CCTK_Equals (newverbose, "none"))
+ {
+ if (myGH->out_every_default > 0)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING, "IOJpeg: Periodic output every %d "
+ "iterations", myGH->out_every_default);
+ }
+ else
+ {
+ CCTK_INFO ("IOJpeg: Periodic output turned off");
+ }
+ }
+
+ /* re-parse the 'out2D_vars' parameter if it was changed */
+ if (strcmp (out2D_vars, myGH->out_vars) || myGH->out_every_default != i)
+ {
+ num_vars = CCTK_NumVars ();
+ memset (myGH->out_every, 0, num_vars * sizeof (int));
+ CCTK_TraverseString (out2D_vars, SetOutputFlag, myGH, CCTK_GROUP_OR_VAR);
+
+ if (myGH->out_every_default == i || ! CCTK_Equals (newverbose, "none"))
+ {
+ msg = NULL;
+ for (i = 0; i < num_vars; i++)
+ {
+ if (myGH->out_every[i])
+ {
+ fullname = CCTK_FullName (i);
+ if (! msg)
+ {
+ Util_asprintf (&msg, "IOJpeg: Periodic output requested for '%s'",
+ fullname);
+ }
+ else
+ {
+ Util_asprintf (&msg, "%s, '%s'", msg, fullname);
+ }
+ free (fullname);
+ }
+ }
+ if (msg)
+ {
+ CCTK_INFO (msg);
+ free (msg);
+ }
+ }
+
+ /* save the last setting of 'out2D_vars' parameter */
+ free (myGH->out_vars);
+ myGH->out_vars = strdup (out2D_vars);
+ }
+}
+
+
+/* check if this variable can be output (static conditions) */
+static int CheckOutputVar (int vindex)
+{
+ int groupindex;
+ cGroup groupinfo;
+ char *fullname;
+ const char *errormsg;
+
+
+ /* get the variable group information */
+ groupindex = CCTK_GroupIndexFromVarI (vindex);
+ CCTK_GroupData (groupindex, &groupinfo);
+
+ errormsg = NULL;
+ if (groupinfo.dim < 2 || groupinfo.dim > 3)
+ {
+ errormsg = "dim != [2,3]";
+ }
+ else if (groupinfo.grouptype != CCTK_GF && groupinfo.grouptype != CCTK_ARRAY)
+ {
+ errormsg = "not a grid function or array";
+ }
+ else if (! strncmp (CCTK_VarTypeName (groupinfo.vartype), "CCTK_COMPLEX", 12))
+ {
+ errormsg = "CCTK_COMPLEX variables cannot be dealt with";
+ }
+
+ if (errormsg)
+ {
+ fullname = CCTK_FullName (vindex);
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "No IOJpeg output for '%s': %s", fullname, errormsg);
+ free (fullname);
+ }
+
+ return (errormsg != NULL);
+}
+
+
+/* callback for CCTK_TraverseString() to set the output flag
+ for the given variable */
+static void SetOutputFlag (int vindex, const char *optstring, void *arg)
+{
+ char *endptr;
+ ioJpegGH *myGH = (ioJpegGH *) arg;
+
+
+ if (CheckOutputVar (vindex) == 0)
+ {
+ myGH->out_every[vindex] = myGH->out_every_default;
+ if (optstring)
+ {
+ endptr = "error";
+ if (strncmp ("out_every=", optstring, 10) == 0)
+ {
+ myGH->out_every[vindex] = strtol (optstring + 10, &endptr, 10);
+ }
+ if (endptr && *endptr)
+ {
+ CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "SetOutputFlag: Optional string '%s' could not be parsed",
+ optstring);
+ myGH->out_every[vindex] = 0;
+ }
+ }
+ }
+}