/*@@ @file Output3D.c @date Tue Jan 9 1999 @author Gabrielle Allen @desc Functions to deal 3D output of GFs @enddesc @history @hauthor Thomas Radke @hdate 16 Mar 1999 @hdesc Converted to Cactus 4.0 @hendhistory @@*/ #include #include #include #include #include "cctk.h" #include "cctk_parameters.h" #include "ioFlexGH.h" int IOFlexIO_Output3DVarAs (cGH *GH, const char *var, const char *alias); int IOFlexIO_TimeFor3D (cGH *GH, int index); /*@@ @routine IOFlexIO_Output3DGH @date Sat March 6 1999 @author Gabrielle Allen @desc Loops over all variables and outputs them if necessary @enddesc @calls CCTK_GHExtensionHandle CCTK_NumVars CCTK_ImplementationFromVar CCTK_VarName IOFlexIO_TimeFor3D IOFlexIO_Output3DVarAs @calledby @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @@*/ int IOFlexIO_Output3DGH (cGH *GH) { int i; flexioGH *myGH; char *implementation; char *name; char *fullname; DECLARE_CCTK_PARAMETERS /* Get the GH extension for IOFlexIO */ myGH = (flexioGH *) GH->extensions [CCTK_GHExtensionHandle ("IOFlexIO")]; if (myGH->IO_3Devery <= 0) return; /* Loop over all variables */ for (i = 0; i < CCTK_NumVars (); i++) { if (IOFlexIO_TimeFor3D (GH, i)) { implementation = CCTK_ImpFromVarI (i); name = CCTK_VarName (i); fullname = (char *) malloc (strlen (implementation) + strlen (name) + 3); assert (fullname); sprintf (fullname, "%s::%s", implementation, name); if (verbose) { printf ("IOFlexIO Output3DGH : \n"); printf (" fullname/name = %s/%s\n", fullname, name); } IOFlexIO_Output3DVarAs (GH, fullname, name); free (fullname); /* Register another 3D output for this GF */ myGH->IO_3Dnum [i]++; /* Register GF as having 3D output this iteration */ myGH->IO_3Dlast [i] = GH->cctk_iteration; } } return (0); } /*@@ @routine IOFlexIO_Output3DVarAs @date Sat March 6 1999 @author Gabrielle Allen @desc unconditional output of a variable using the IOFlexIO 3D output method @enddesc @calls CCTK_DecomposeName CCTK_VarIndex CCTK_GHExtensionHandle IOFlexIO_Write3D @calledby IOFlexIO_Output3DGH @history @endhistory @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 IOFlexIO_Output3DVarAs (cGH *GH, const char *fullname, const char *alias) { DECLARE_CCTK_PARAMETERS int index; flexioGH *myGH; index = CCTK_VarIndex(fullname); /* Get the GH extension for IOFlexIO */ myGH = (flexioGH *) GH->extensions [CCTK_GHExtensionHandle ("IOFlexIO")]; if (verbose) { printf ("\nIn IOFlexIO Output3DVarAs\n-------------------\n"); printf (" Fullname = -%s-\n", fullname); printf (" Alias = -%s-\n", alias); printf (" Index = %d\n", index); } /* Do the 3D output */ IOFlexIO_Write3D (GH, index, alias); return (0); } /*@@ @routine IOFlexIO_TimeFor3D @date Sat March 6 1999 @author Gabrielle Allen @desc Decides if it is time to output a variable using the IOFlexIO 3D output method @enddesc @calls CCTK_GHExtensionHandle CCTK_GroupTypeFromVarI CCTK_WARN CCTK_QueryGroupStorageI CCTK_GroupNameFromVarI @calledby IOFlexIO_Output3DGH @history @endhistory @var GH @vdesc Pointer to CCTK GH @vtype cGH @vio in @vcomment @endvar @var index @vdesc index of variable @vtype int @vio in @vcomment @endvar @@*/ int IOFlexIO_TimeFor3D (cGH *GH, int index) { flexioGH *myGH; /* Get the GH extension for IOFlexIO */ myGH = (flexioGH *) GH->extensions [CCTK_GHExtensionHandle ("IOFlexIO")]; /* Check this GF should be output */ if (! (myGH->IO_3Dnum [index] != 0 && GH->cctk_iteration % myGH->IO_3Devery == 0)) return (0); /* Check GF not already output this iteration */ if (myGH->IO_3Dlast [index] == GH->cctk_iteration) { CCTK_WARN (2, "Already done 3D output in IOFlexIO"); return (0); } /* Check GF has storage */ if (! CCTK_QueryGroupStorageI (GH, CCTK_GroupIndexFromVarI(index))) { char *fullname = CCTK_FullName (index); char *msg = (char *) malloc (80 + strlen (fullname)); sprintf (msg, "No IOFlexIO 3D output for '%s' (no storage)", fullname); CCTK_WARN (2, msg); free (fullname); free (msg); return (0); } return (1); } /*@@ @routine IOFlexIO_TriggerOutput3D @date Sat March 6 1999 @author Gabrielle Allen @desc Triggers the output a variable using the IOFlexIO 3D output method @enddesc @calls CCTK_GHExtensionHandle CCTK_VarName IOFlexIO_Write3D @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 IOFlexIO_TriggerOutput3D (cGH *GH, int index) { DECLARE_CCTK_PARAMETERS flexioGH *myGH; char *varname; varname = CCTK_VarName (index); /* Get the GH extension for IOFlexIO */ myGH = (flexioGH *) GH->extensions [CCTK_GHExtensionHandle ("IOFlexIO")]; if (verbose) { printf("\nIn IOFlexIO TriggerOutput3D\n---------------------\n"); printf(" Index = %d\n", index); printf(" Variable = -%s-\n", varname); } /* Do the 3D output */ IOFlexIO_Write3D (GH, index, varname); /* Register another 3D output for this GF */ myGH->IO_3Dnum [index]++; /* Register GF as having 3D output this iteration */ myGH->IO_3Dlast [index] = GH->cctk_iteration; return (0); }