aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetIOASCII/src
diff options
context:
space:
mode:
authoreschnett <>2001-03-01 12:40:00 +0000
committereschnett <>2001-03-01 12:40:00 +0000
commitece47455bad491c45b3136362e9239f505de23b9 (patch)
tree0e121ebd44c2fbb7711943fcd8804e85626daca3 /Carpet/CarpetIOASCII/src
parent310f0ea48d18866b773136aed11200b6eda6378b (diff)
Initial revision
darcs-hash:20010301124010-f6438-fca5ed1e25f84efd816aa0d13fc23b58add7195d.gz
Diffstat (limited to 'Carpet/CarpetIOASCII/src')
-rw-r--r--Carpet/CarpetIOASCII/src/ioascii.cc1321
-rw-r--r--Carpet/CarpetIOASCII/src/ioascii.hh53
2 files changed, 227 insertions, 1147 deletions
diff --git a/Carpet/CarpetIOASCII/src/ioascii.cc b/Carpet/CarpetIOASCII/src/ioascii.cc
index eb28e27d0..f5c270ccb 100644
--- a/Carpet/CarpetIOASCII/src/ioascii.cc
+++ b/Carpet/CarpetIOASCII/src/ioascii.cc
@@ -1,231 +1,131 @@
-#include <assert.h>
-#include <limits.h>
-#include <math.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/types.h>
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.cc,v 1.1 2001/03/01 13:40:10 eschnett Exp $
+#include <cassert>
+#include <cstdio>
+#include <cstdlib>
+#include <cstring>
#include <fstream>
-#include <iomanip>
-#include <ostream>
-#include <sstream>
-#include <string>
#include <vector>
#include "cctk.h"
#include "cctk_Parameters.h"
-#include "CactusBase/IOUtil/src/ioGH.h"
+#include "CactusBase/IOUtil/src/ioutil_CheckpointRecovery.h"
-#include "data.hh"
-#include "dist.hh"
-#include "gdata.hh"
-#include "gf.hh"
-#include "ggf.hh"
-#include "vect.hh"
-
-#include "carpet.hh"
+#include "Carpet/CarpetLib/src/data.hh"
+#include "Carpet/CarpetLib/src/gdata.hh"
+#include "Carpet/CarpetLib/src/gf.hh"
+#include "Carpet/CarpetLib/src/ggf.hh"
+#include "Carpet/Carpet/src/carpet.hh"
#include "ioascii.hh"
-extern "C" {
- static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.cc,v 1.77 2004/06/23 17:36:41 tradke Exp $";
- CCTK_FILEVERSION(Carpet_CarpetIOASCII_ioascii_cc);
-}
-
-// That's a hack
namespace Carpet {
- void UnsupportedVarType (const int vindex);
+
+int CarpetIOASCIIStartup()
+{
+ IOASCII<1>::Startup();
+ IOASCII<2>::Startup();
+ IOASCII<3>::Startup();
+
+ return 0;
}
-namespace CarpetIOASCII {
-
- using namespace std;
- using namespace Carpet;
-
- void SetFlag (int index, const char* optstring, void* arg);
-
-
-
- // Special output routines for complex numbers
-
-#ifdef CCTK_REAL4
- ostream& operator<< (ostream& os, const CCTK_COMPLEX8& val)
- {
- return os << CCTK_Cmplx8Real(val) << " " << CCTK_Cmplx8Imag(val);
- }
-#endif
-
-#ifdef CCTK_REAL8
- ostream& operator<< (ostream& os, const CCTK_COMPLEX16& val)
- {
- return os << CCTK_Cmplx16Real(val) << " " << CCTK_Cmplx16Imag(val);
- }
-#endif
-
-#ifdef CCTK_REAL16
- ostream& operator<< (ostream& os, const CCTK_COMPLEX32& val)
- {
- return os << CCTK_Cmplx32Real(val) << " " << CCTK_Cmplx32Imag(val);
- }
-#endif
-
-
-
- template<int D,int DD>
- void WriteASCII (ostream& os,
- const gdata<D>* const gfdata,
- const bbox<int,D>& gfext,
- const int vi,
- const int time,
- const vect<int,D>& org,
- const vect<int,DD>& dirs,
- const int rl,
- const int ml,
- const int m,
- const int c,
- const int tl,
- const CCTK_REAL coord_time,
- const vect<CCTK_REAL,D>& coord_lower,
- const vect<CCTK_REAL,D>& coord_upper);
-
-
-
- int CarpetIOASCIIStartup()
- {
- IOASCII<0>::Startup();
- IOASCII<1>::Startup();
- IOASCII<2>::Startup();
- IOASCII<3>::Startup();
- return 0;
- }
-
-
-
- void CarpetIOASCIIInit (CCTK_ARGUMENTS)
- {
- DECLARE_CCTK_ARGUMENTS;
-
- for (int d=0; d<4; ++d) {
- this_iteration[d] = 0;
- last_output_iteration[d] = 0;
- last_output_time[d] = cctk_time;
- }
- }
-
-
-
- // Definition of static members
- template<int outdim> int IOASCII<outdim>::GHExtension;
- template<int outdim> int IOASCII<outdim>::IOMethod;
- template<int outdim> vector<bool> IOASCII<outdim>::do_truncate;
- template<int outdim>
- vector<vector<vector<int> > > IOASCII<outdim>::last_output;
-
-
-
- template<int outdim>
- int IOASCII<outdim>::Startup()
- {
- ostringstream msg;
- msg << "AMR " << outdim << "D ASCII I/O provided by CarpetIOASCII";
- CCTK_RegisterBanner (msg.str().c_str());
-
- ostringstream extension_name;
- extension_name << "CarpetIOASCII_" << outdim << "D";
- GHExtension = CCTK_RegisterGHExtension(extension_name.str().c_str());
- CCTK_RegisterGHExtensionSetupGH (GHExtension, SetupGH);
-
- ostringstream method_name;
- method_name << "IOASCII_" << outdim << "D";
- IOMethod = CCTK_RegisterIOMethod (method_name.str().c_str());
- CCTK_RegisterIOMethodOutputGH (IOMethod, OutputGH);
- CCTK_RegisterIOMethodOutputVarAs (IOMethod, OutputVarAs);
- CCTK_RegisterIOMethodTimeToOutput (IOMethod, TimeToOutput);
- CCTK_RegisterIOMethodTriggerOutput (IOMethod, TriggerOutput);
-
- return 0;
- }
+// Definition of static members
+template<int outdim> int IOASCII<outdim>::GHExtension;
+template<int outdim> int IOASCII<outdim>::IOMethod;
+template<int outdim> vector<bool> IOASCII<outdim>::do_truncate;
+template<int outdim> vector<int> IOASCII<outdim>::last_output;
+
+
+
+template<int outdim>
+int IOASCII<outdim>::Startup()
+{
+ char msg[1000];
+ sprintf (msg, "AMR %dD ASCII I/O provided by CarpetIOASCII", outdim);
+ CCTK_RegisterBanner (msg);
+
+ char extension_name[1000];
+ sprintf (extension_name, "CarpetIOASCII_%dD", outdim);
+ GHExtension = CCTK_RegisterGHExtension(extension_name);
+ CCTK_RegisterGHExtensionSetupGH (GHExtension, SetupGH);
+
+ char method_name[1000];
+ sprintf (method_name, "IOASCII_%dD", outdim);
+ IOMethod = CCTK_RegisterIOMethod (method_name);
+ CCTK_RegisterIOMethodOutputGH (IOMethod, OutputGH);
+ CCTK_RegisterIOMethodOutputVarAs (IOMethod, OutputVarAs);
+ CCTK_RegisterIOMethodTimeToOutput (IOMethod, TimeToOutput);
+ CCTK_RegisterIOMethodTriggerOutput (IOMethod, TriggerOutput);
+
+ return 0;
+}
- template<int outdim>
- void* IOASCII<outdim>
- ::SetupGH (tFleshConfig* const fc, const int convLevel, cGH* const cgh)
- {
- DECLARE_CCTK_PARAMETERS;
- const void *dummy;
+template<int outdim>
+void* IOASCII<outdim>::SetupGH (tFleshConfig *fc, int convLevel, cGH *cgh)
+{
+ DECLARE_CCTK_PARAMETERS;
+
+ CCTK_CreateDirectory (0755, outdir);
+
+ // Truncate all files if this is not a restart
+ do_truncate.resize(CCTK_NumVars(), ! IOUtil_RestartFromRecovery(cgh));
+
+ // No iterations have yet been output
+ last_output.resize(CCTK_NumVars(), -1);
+
+ // We register only once, ergo we get only one handle. We store
+ // that statically, so there is no need to pass it to Cactus.
+ return 0;
+}
- dummy = &fc;
- dummy = &convLevel;
- dummy = &cgh;
- dummy = &dummy;
- // Truncate all files if this is not a restart
- do_truncate.resize(CCTK_NumVars(), true);
- // No iterations have yet been output
- last_output.resize(mglevels);
- for (int ml=0; ml<mglevels; ++ml) {
- last_output.at(ml).resize(maxreflevels);
- for (int rl=0; rl<maxreflevels; ++rl) {
- last_output.at(ml).at(rl).resize(CCTK_NumVars(), -1);
- }
+template<int outdim>
+int IOASCII<outdim>::OutputGH (cGH* cgh) {
+ for (int vindex=0; vindex<CCTK_NumVars(); ++vindex) {
+ if (TimeToOutput(cgh, vindex)) {
+ TriggerOutput(cgh, vindex);
}
-
- // We register only once, ergo we get only one handle. We store
- // that statically, so there is no need to pass anything to
- // Cactus.
- return 0;
}
+ return 0;
+}
-
-
- template<int outdim>
- int IOASCII<outdim>
- ::OutputGH (const cGH* const cgh)
- {
- for (int vindex=0; vindex<CCTK_NumVars(); ++vindex) {
- if (TimeToOutput(cgh, vindex)) {
- TriggerOutput(cgh, vindex);
- }
- }
+template<int outdim>
+int IOASCII<outdim>::OutputVarAs (cGH* cgh, const char* varname,
+ const char* alias) {
+ DECLARE_CCTK_PARAMETERS;
+
+ const int n = CCTK_VarIndex(varname);
+ assert (n>=0 && n<CCTK_NumVars());
+ const int group = CCTK_GroupIndexFromVarI (n);
+ assert (group>=0 && group<(int)Carpet::gfdata.size());
+ const int n0 = CCTK_FirstVarIndexI(group);
+ assert (n0>=0 && n0<CCTK_NumVars());
+ const int var = n - n0;
+ assert (var>=0 && var<CCTK_NumVars());
+ const int tl = max(0, CCTK_NumTimeLevelsFromVarI(n) - 1);
+
+ switch (CCTK_GroupTypeI(group)) {
+
+ case CCTK_SCALAR: {
+ // Don't output scalars
+ CCTK_VWarn (2, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Cannout output variable \"%s\" because it is a scalar",
+ varname);
return 0;
}
-
-
-
- template<int outdim>
- int IOASCII<outdim>
- ::OutputVarAs (const cGH* const cgh,
- const char* const varname, const char* const alias)
- {
- DECLARE_CCTK_PARAMETERS;
-
- assert (is_level_mode());
-
- const int n = CCTK_VarIndex(varname);
- if (n<0) {
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Variable \"%s\" does not exist", varname);
- return -1;
- }
- assert (n>=0 && n<CCTK_NumVars());
- const int group = CCTK_GroupIndexFromVarI (n);
- assert (group>=0 && group<(int)Carpet::arrdata.size());
- const int n0 = CCTK_FirstVarIndexI(group);
- assert (n0>=0 && n0<CCTK_NumVars());
- const int var = n - n0;
- assert (var>=0 && var<CCTK_NumVarsInGroupI(group));
- const int num_tl = CCTK_NumTimeLevelsFromVarI(n);
- assert (num_tl>=1);
-
+
+ case CCTK_ARRAY:
+ case CCTK_GF: {
+
// Check for storage
if (! CCTK_QueryGroupStorageI(cgh, group)) {
CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
@@ -233,48 +133,13 @@ namespace CarpetIOASCII {
varname);
return 0;
}
-
- const int grouptype = CCTK_GroupTypeI(group);
- switch (grouptype) {
- case CCTK_SCALAR:
- case CCTK_ARRAY:
- assert (do_global_mode);
- break;
- case CCTK_GF:
- /* do nothing */
- break;
- default:
- assert (0);
- }
- const int rl = grouptype == CCTK_GF ? reflevel : 0;
-
- const int groupdim = CCTK_GroupDimI(group);
- if (outdim > groupdim) {
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Cannot produce %dD ASCII output file \"%s\" for variable \"%s\" because it has only %d dimensions", outdim, alias, varname, groupdim);
- return -1;
- }
- assert (outdim <= groupdim);
-
- // Get grid hierarchy extentsion from IOUtil
- const ioGH * const iogh = (const ioGH *)CCTK_GHExtension (cgh, "IO");
- assert (iogh);
-
- // Create the output directory
- const char* myoutdir = GetStringParameter("out%dD_dir");
- if (CCTK_EQUALS(myoutdir, "")) {
- myoutdir = out_dir;
- }
- if (CCTK_MyProc(cgh)==0) {
- CCTK_CreateDirectory (0755, myoutdir);
- }
-
+
// Loop over all direction combinations
- vect<int,outdim> dirs (0);
-
- bool done;
- do {
-
+ vect<int,outdim> dirs;
+ for (int d=0; d<outdim; ++d) dirs[d] = 0;
+
+ for (;;) {
+
// Output each combination only once
bool ascending = true;
for (int d1=0; d1<outdim; ++d1) {
@@ -282,900 +147,132 @@ namespace CarpetIOASCII {
ascending = ascending && dirs[d1] < dirs[d2];
}
}
-
- // Skip output if the dimensions are not ascending
+
if (ascending) {
-
- // If this output is desired at all
- bool desired;
- switch (outdim) {
- case 0:
- // Output is always desired (if switched on)
- desired = true;
- break;
- case 1:
- switch (dirs[0]) {
- case 0:
- desired = out1D_x;
- break;
- case 1:
- desired = out1D_y;
- break;
- case 2:
- desired = out1D_z;
- break;
- default:
- assert (0);
+
+ // Invent a file name
+ char filename[strlen(outdir)+strlen(alias)+100];
+ sprintf (filename, "%s/%s.", outdir, alias);
+ for (int d=0; d<outdim; ++d) {
+ assert (dirs[d]>=0 && dirs[d]<3);
+ sprintf (filename, "%s%c", filename, "xyz"[dirs[d]]);
+ }
+ sprintf (filename, "%s%c", filename, "lpv"[outdim-1]);
+
+ // If this is the first time, then write a nice header
+ if (do_truncate[n]) {
+ ofstream file(filename, ios::trunc);
+ assert (file.good());
+ file << "# " << varname;
+ for (int d=0; d<outdim; ++d) {
+ file << " " << "xyz"[dirs[d]];
}
- break;
- case 2:
- if (dirs[0]==0 && dirs[1]==1) {
- desired = out2D_xy;
- } else if (dirs[0]==0 && dirs[1]==2) {
- desired = out2D_xz;
- } else if (dirs[0]==1 && dirs[1]==2) {
- desired = out2D_yz;
- } else {
- assert (0);
+ file << " (" << alias << ")" << endl;
+ file << "#" << endl;
+ file.close();
+ assert (file.good());
+ }
+
+ // Traverse all components on all refinement levels
+ assert (mglevel>=0);
+ assert (reflevel==0);
+ for (reflevel=0; reflevel<hh->reflevels(); ++reflevel) {
+ assert (component==-1);
+ for (component=0; component<hh->components(reflevel); ++component) {
+
+ switch (CCTK_GroupTypeI(group)) {
+
+ case CCTK_ARRAY:
+ assert (var < (int)Carpet::arrdata[group].data.size());
+ (*arrdata[group].data[var]) (tl, reflevel, component, mglevel)
+ ->write_ascii (filename, cgh->cctk_time, dirs,
+ tl, reflevel, component, mglevel);
+ break;
+
+ case CCTK_GF:
+ assert (var < (int)Carpet::gfdata[group].data.size());
+ (*gfdata[group].data[var]) (tl, reflevel, component, mglevel)
+ ->write_ascii (filename, cgh->cctk_time, dirs,
+ tl, reflevel, component, mglevel);
+ break;
+
+ default:
+ abort();
+ }
+
}
- break;
- case 3:
- // Output is always desired (if switched on)
- desired = true;
- break;
- default:
- assert (0);
+ component = -1;
}
-
- // Skip output if not desired
- if (desired) {
-
- // Traverse all maps on this refinement and multigrid level
- BEGIN_MAP_LOOP(cgh, grouptype) {
-
- // Find the output offset
- ivect offset(0);
- if (grouptype == CCTK_GF) {
- switch (outdim) {
- case 0:
- offset[0] = GetGridOffset
- (cgh, 1,
- "out%dD_point_xi", /*"out_point_xi"*/ NULL,
- "out%dD_point_x", /*"out_point_x"*/ NULL,
- /*out_point_x*/ 0.0);
- offset[1] = GetGridOffset
- (cgh, 2,
- "out%dD_point_yi", /*"out_point_yi"*/ NULL,
- "out%dD_point_y", /*"out_point_y"*/ NULL,
- /*out_point_y*/ 0.0);
- offset[2] = GetGridOffset
- (cgh, 3,
- "out%dD_point_zi", /*"out_point_zi"*/ NULL,
- "out%dD_point_z", /*"out_point_z"*/ NULL,
- /*out_point_z*/ 0.0);
- break;
- case 1:
- switch (dirs[0]) {
- case 0:
- offset[1] = GetGridOffset (cgh, 2,
- "out%dD_xline_yi", "out_xline_yi",
- "out%dD_xline_y", "out_xline_y",
- out_xline_y);
- offset[2] = GetGridOffset (cgh, 3,
- "out%dD_xline_zi", "out_xline_zi",
- "out%dD_xline_z", "out_xline_z",
- out_xline_z);
- break;
- case 1:
- offset[0] = GetGridOffset (cgh, 1,
- "out%dD_yline_xi", "out_yline_xi",
- "out%dD_yline_x", "out_yline_x",
- out_yline_x);
- offset[2] = GetGridOffset (cgh, 3,
- "out%dD_yline_zi", "out_yline_zi",
- "out%dD_yline_z", "out_yline_z",
- out_yline_z);
- break;
- case 2:
- offset[0] = GetGridOffset (cgh, 1,
- "out%dD_zline_xi", "out_zline_xi",
- "out%dD_zline_x", "out_zline_x",
- out_zline_x);
- offset[1] = GetGridOffset (cgh, 2,
- "out%dD_zline_yi", "out_zline_yi",
- "out%dD_zline_y", "out_zline_y",
- out_zline_y);
- break;
- default:
- assert (0);
- }
- break;
- case 2:
- if (dirs[0]==0 && dirs[1]==1) {
- offset[2] = GetGridOffset
- (cgh, 3,
- "out%dD_xyplane_zi", "out_xyplane_zi",
- "out%dD_xyplane_z", "out_xyplane_z",
- out_xyplane_z);
- } else if (dirs[0]==0 && dirs[1]==2) {
- offset[1] = GetGridOffset
- (cgh, 2,
- "out%dD_xzplane_yi", "out_xzplane_yi",
- "out%dD_xzplane_y", "out_xzplane_y",
- out_xzplane_y);
- } else if (dirs[0]==1 && dirs[1]==2) {
- offset[0] = GetGridOffset
- (cgh, 1,
- "out%dD_yzplane_xi", "out_yzplane_xi",
- "out%dD_yzplane_x", "out_yzplane_x",
- out_yzplane_x);
- } else {
- assert (0);
- }
- break;
- case 3:
- // The offset doesn't matter in this case
- break;
- default:
- assert (0);
- }
- } // if grouptype is GF
-
- ofstream file;
- if (CCTK_MyProc(cgh)==0) {
-
- // Invent a file name
- ostringstream filenamebuf;
- if (new_filename_scheme) {
- filenamebuf << myoutdir << "/" << alias << ".";
- if (maps > 1) {
- filenamebuf << Carpet::map << ".";
- }
- for (int d=0; d<outdim; ++d) {
- const char* const coords = "xyz";
- filenamebuf << coords[dirs[d]];
- }
-// The offsets differ per level
-// for (int dd=0; dd<groupdim; ++dd) {
-// bool print_dir = true;
-// for (int d=0; d<outdim; ++d) {
-// print_dir = print_dir && dirs[d] != dd;
-// }
-// if (print_dir) {
-// filenamebuf << "." << offset[dd];
-// }
-// }
- filenamebuf << ".asc";
- } else {
- filenamebuf << myoutdir << "/" << alias << ".";
- if (maps > 1) {
- filenamebuf << Carpet::map << ".";
- }
- for (int d=0; d<outdim; ++d) {
- assert (dirs[d]>=0 && dirs[d]<3);
- const char* const coords = "xyz";
- filenamebuf << coords[dirs[d]];
- }
- const char* const suffixes = "plpv";
- filenamebuf << suffixes[outdim];
- }
- // we need a persistent temporary here
- string filenamestr = filenamebuf.str();
- const char* const filename = filenamestr.c_str();
-
- // If this is the first time, then write a nice header
- if (do_truncate.at(n)) {
- struct stat fileinfo;
- if (! iogh->recovered
- || stat(filename, &fileinfo)!=0) {
- file.open (filename, ios::out | ios::trunc);
- if (! file.good()) {
- CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Could not open output file \"%s\" for variable \"%s\"",
- filename, varname);
- }
- assert (file.good());
- file << "# " << varname;
- for (int d=0; d<outdim; ++d) {
- file << " " << "xyz"[dirs[d]];
- }
- file << " (" << alias << ")" << endl;
- file << "#" << endl;
- assert (file.good());
- }
- }
-
- // Open the file
- if (! file.is_open()) {
- file.open (filename, ios::out | ios::app);
- assert (file.good());
- }
-
- file << setprecision(out_precision);
- assert (file.good());
-
- } // if on the root processor
-
- // Traverse and components on this multigrid and
- // refinement level and map
- BEGIN_COMPONENT_LOOP(cgh, grouptype) {
-
- const ggf<dim>* ff = 0;
-
- assert (var < (int)arrdata.at(group).at(Carpet::map).data.size());
- ff = (ggf<dim>*)arrdata.at(group).at(Carpet::map).data.at(var);
-
- const int mintl = output_all_timelevels ? 1-num_tl : 0;
- const int maxtl = 0;
- for (int tl=mintl; tl<=maxtl; ++tl) {
-
- const gdata<dim>* const data
- = (*ff) (tl, rl, component, mglevel);
- ibbox ext = data->extent();
-
- ivect lo = ext.lower();
- ivect hi = ext.upper();
- ivect str = ext.stride();
-
- // Ignore ghost zones if desired
- for (int d=0; d<dim; ++d) {
- bool output_lower_ghosts
- = cgh->cctk_bbox[2*d] ? out3D_outer_ghosts : out3D_ghosts;
- bool output_upper_ghosts
- = cgh->cctk_bbox[2*d+1] ? out3D_outer_ghosts : out3D_ghosts;
-
- if (! output_lower_ghosts) {
- lo[d] += cgh->cctk_nghostzones[d] * str[d];
- }
- if (! output_upper_ghosts) {
- hi[d] -= cgh->cctk_nghostzones[d] * str[d];
- }
- }
- ext = ibbox(lo,hi,str);
-
- // coordinates
- const CCTK_REAL coord_time = cgh->cctk_time;
- rvect global_lower;
- rvect coord_delta;
- if (grouptype == CCTK_GF) {
- for (int d=0; d<dim; ++d) {
- global_lower[d] = cgh->cctk_origin_space[d];
- coord_delta[d] = cgh->cctk_delta_space[d] / maxreflevelfact;
- }
- } else {
- for (int d=0; d<dim; ++d) {
- global_lower[d] = 0.0;
- coord_delta[d] = 1.0;
- }
- }
- const rvect coord_lower
- = global_lower + coord_delta * rvect(lo);
- const rvect coord_upper
- = global_lower + coord_delta * rvect(hi);
-
- ivect offset1;
- if (grouptype == CCTK_GF) {
- const ibbox& baseext = vdd.at(Carpet::map)->bases.at(0).at(mglevel).exterior;
- offset1 = baseext.lower() + offset * ext.stride();
- } else {
- offset1 = offset * ext.stride();
- }
- for (int d=0; d<outdim; ++d) {
- offset1[dirs[d]] = ext.lower()[dirs[d]];
- }
-
- WriteASCII (file, data, ext, n, cgh->cctk_iteration,
- offset1, dirs,
- rl, mglevel, Carpet::map, component, tl,
- coord_time, coord_lower, coord_upper);
-
- // Append EOL after every component
- if (CCTK_MyProc(cgh)==0) {
- if (separate_components) {
- assert (file.good());
- file << endl;
- }
- }
- assert (file.good());
-
- } // for tl
-
- } END_COMPONENT_LOOP;
-
- // Append EOL after every complete set of components
- if (CCTK_MyProc(cgh)==0) {
- if (separate_grids) {
- assert (file.good());
- file << endl;
- }
- file.close();
- assert (file.good());
- }
-
- assert (! file.is_open());
-
- } END_MAP_LOOP;
-
- } // if (desired)
-
+ reflevel = 0;
+
} // if (ascending)
-
+
// Next direction combination
- done = true;
for (int d=0; d<outdim; ++d) {
++dirs[d];
- if (dirs[d]<groupdim) {
- done = false;
- break;
- }
+ if (dirs[d]<dim) goto notyetdone;
dirs[d] = 0;
}
-
- } while (! done); // all directions
-
- // Don't truncate again
- do_truncate.at(n) = false;
-
- return 0;
- }
-
-
-
- template<int outdim>
- int IOASCII<outdim>
- ::TimeToOutput (const cGH* const cctkGH, const int vindex)
- {
- DECLARE_CCTK_ARGUMENTS;
- DECLARE_CCTK_PARAMETERS;
-
- assert (vindex>=0 && vindex<CCTK_NumVars());
-
-
-
- const int grouptype = CCTK_GroupTypeFromVarI(vindex);
- switch (grouptype) {
- case CCTK_SCALAR:
- case CCTK_ARRAY:
- if (! do_global_mode) return 0;
- break;
- case CCTK_GF:
- // do nothing
break;
- default:
- assert (0);
- }
-
-
-
- // check whether to output at this iteration
- bool output_this_iteration;
-
- const char* myoutcriterion = GetStringParameter("out%dD_criterion");
- if (CCTK_EQUALS(myoutcriterion, "default")) {
- myoutcriterion = out_criterion;
- }
-
- if (CCTK_EQUALS (myoutcriterion, "never")) {
-
- // Never output
- output_this_iteration = false;
-
- } else if (CCTK_EQUALS (myoutcriterion, "iteration")) {
-
- int myoutevery = GetIntParameter("out%dD_every");
- if (myoutevery == -2) {
- myoutevery = out_every;
- }
- if (myoutevery <= 0) {
- // output is disabled
- output_this_iteration = false;
- } else if (cctk_iteration == this_iteration[outdim]) {
- // we already decided to output this iteration
- output_this_iteration = true;
- } else if (cctk_iteration
- >= last_output_iteration[outdim] + myoutevery) {
- // it is time for the next output
- output_this_iteration = true;
- last_output_iteration[outdim] = cctk_iteration;
- this_iteration[outdim] = cctk_iteration;
- } else {
- // we want no output at this iteration
- output_this_iteration = false;
- }
-
- } else if (CCTK_EQUALS (myoutcriterion, "divisor")) {
-
- int myoutevery = GetIntParameter("out%dD_every");
- if (myoutevery == -2) {
- myoutevery = out_every;
- }
- if (myoutevery <= 0) {
- // output is disabled
- output_this_iteration = false;
- } else if (cctk_iteration % myoutevery == 0) {
- // we already decided to output this iteration
- output_this_iteration = true;
- } else {
- // we want no output at this iteration
- output_this_iteration = false;
- }
-
- } else if (CCTK_EQUALS (myoutcriterion, "time")) {
-
- CCTK_REAL myoutdt = GetRealParameter("out%dD_dt");
- if (myoutdt == -2) {
- myoutdt = out_dt;
- }
- if (myoutdt < 0) {
- // output is disabled
- output_this_iteration = false;
- } else if (myoutdt == 0) {
- // output all iterations
- output_this_iteration = true;
- } else if (cctk_iteration == this_iteration[outdim]) {
- // we already decided to output this iteration
- output_this_iteration = true;
- } else if (cctk_time / cctk_delta_time
- >= (last_output_time[outdim] + myoutdt) / cctk_delta_time - 1.0e-12) {
- // it is time for the next output
- output_this_iteration = true;
- last_output_time[outdim] = cctk_time;
- this_iteration[outdim] = cctk_iteration;
- } else {
- // we want no output at this iteration
- output_this_iteration = false;
- }
-
- } else {
-
- assert (0);
-
- } // select output criterion
-
- if (! output_this_iteration) return 0;
-
-
-
- // check which variables to output
- static vector<bool> output_variables;
- static int output_variables_iteration = -1;
-
- if (cctk_iteration > output_variables_iteration) {
- output_variables.resize (CCTK_NumVars());
-
- const char* const varlist = GetStringParameter("out%dD_vars");
- if (CCTK_TraverseString (varlist, SetFlag, &output_variables,
- CCTK_GROUP_OR_VAR) < 0)
- {
- int abort_on_error = output_variables_iteration < 0 &&
- strict_io_parameter_check;
- CCTK_VWarn (abort_on_error ? 0 : 1, __LINE__, __FILE__,CCTK_THORNSTRING,
- "error while parsing parameter 'IOASCII::out%dD_vars'",
- outdim);
- }
-
- output_variables_iteration = cctk_iteration;
- }
-
- if (! output_variables.at(vindex)) return 0;
-
-
-
- if (last_output.at(mglevel).at(reflevel).at(vindex) == cctk_iteration) {
- // Has already been output during this iteration
- char* varname = CCTK_FullName(vindex);
- CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING,
- "Skipping output for variable \"%s\", because this variable "
- "has already been output during the current iteration -- "
- "probably via a trigger during the analysis stage",
- varname);
- free (varname);
- return 0;
- }
-
- assert (last_output.at(mglevel).at(reflevel).at(vindex) < cctk_iteration);
-
- // Should be output during this iteration
- return 1;
+
+ notyetdone: ;
+
+ } // all directions
+
+ break;
}
+
+ default:
+ abort();
+ }
+
+ // Don't truncate again
+ do_truncate[n] = false;
+
+ return 0;
+}
- template<int outdim>
- int IOASCII<outdim>
- ::TriggerOutput (const cGH* const cgh, const int vindex)
- {
- assert (vindex>=0 && vindex<CCTK_NumVars());
-
+template<int outdim>
+int IOASCII<outdim>::TimeToOutput (cGH* cgh, int vindex) {
+ assert (vindex>=0 && vindex<(int)last_output.size());
+ if (last_output[vindex] < cgh->cctk_iteration) {
+ return 1;
+ } else if (last_output[vindex] == cgh->cctk_iteration) {
char* varname = CCTK_FullName(vindex);
- const int retval = OutputVarAs (cgh, varname, CCTK_VarName(vindex));
+ CCTK_VWarn (5, __LINE__, __FILE__, CCTK_THORNSTRING,
+ "Skipping output for variable \"%s\", because this variable "
+ "has already been output during the current iteration -- "
+ "probably via a trigger during the analysis stage",
+ varname);
free (varname);
-
- last_output.at(mglevel).at(reflevel).at(vindex) = cgh->cctk_iteration;
-
- return retval;
- }
-
-
-
- template<int outdim>
- int IOASCII<outdim>
- ::GetGridOffset (const cGH* const cgh, const int dir,
- const char* const itempl, const char* const iglobal,
- const char* const ctempl, const char* const cglobal,
- const CCTK_REAL cfallback)
- {
- // First choice: explicit coordinate
- char cparam[1000];
- snprintf (cparam, sizeof cparam, ctempl, outdim);
- const int ncparam = CCTK_ParameterQueryTimesSet (cparam, CCTK_THORNSTRING);
- assert (ncparam >= 0);
- if (ncparam > 0) {
- int ptype;
- const CCTK_REAL* const pcoord
- = ((const CCTK_REAL*)CCTK_ParameterGet
- (cparam, CCTK_THORNSTRING, &ptype));
- assert (pcoord);
- const CCTK_REAL coord = *pcoord;
- assert (ptype == PARAMETER_REAL);
- return CoordToOffset (cgh, dir, coord, 0);
- }
-
- // Second choice: explicit index
- char iparam[1000];
- snprintf (iparam, sizeof iparam, itempl, outdim);
- const int niparam = CCTK_ParameterQueryTimesSet (iparam, CCTK_THORNSTRING);
- assert (niparam >= 0);
- if (niparam > 0) {
- int ptype;
- const int* const pindex
- = (const int*)CCTK_ParameterGet (iparam, CCTK_THORNSTRING, &ptype);
- assert (pindex);
- const int index = *pindex;
- assert (ptype == PARAMETER_INT);
- return index;
- }
-
- // Third choice: explicit global coordinate
- const char* iothorn = CCTK_ImplementationThorn ("IO");
- assert (iothorn);
- if (cglobal) {
- const int ncglobal = CCTK_ParameterQueryTimesSet (cglobal, iothorn);
- assert (ncglobal >= 0);
- if (ncglobal > 0) {
- int ptype;
- const CCTK_REAL* const pcoord
- = (const CCTK_REAL*)CCTK_ParameterGet (cglobal, iothorn, &ptype);
- assert (pcoord);
- const CCTK_REAL coord = *pcoord;
- assert (ptype == PARAMETER_REAL);
- return CoordToOffset (cgh, dir, coord, 0);
- }
- }
-
- // Fourth choice: explicit global index
- if (iglobal) {
- const int niglobal = CCTK_ParameterQueryTimesSet (iglobal, iothorn);
- assert (niglobal >= 0);
- if (niglobal > 0) {
- int ptype;
- const int* const pindex
- = (const int*)CCTK_ParameterGet (iglobal, iothorn, &ptype);
- assert (pindex);
- const int index = *pindex;
- assert (ptype == PARAMETER_INT);
- return index;
- }
- }
-
- // Fifth choice: default coordinate
- return CoordToOffset (cgh, dir, cfallback, 0);
- }
-
-
-
- template<int outdim>
- int IOASCII<outdim>
- ::CoordToOffset (const cGH* cgh, const int dir, const CCTK_REAL coord,
- const int ifallback)
- {
- assert (dir>=1 && dir<=dim);
-
- assert (mglevel!=-1 && reflevel!=-1 && Carpet::map!=-1);
-
- const CCTK_REAL delta = cgh->cctk_delta_space[dir-1] / cgh->cctk_levfac[dir-1];
- const CCTK_REAL lower = cgh->cctk_origin_space[dir-1];
-#if 0
- const int npoints = cgh->cctk_gsh[dir-1];
- const CCTK_REAL upper = lower + (npoints-1) * delta;
-#endif
-
- const CCTK_REAL rindex = (coord - lower) / delta;
- int cindex = (int)floor(rindex + 0.75);
-
-#if 0
- if (cindex<0 || cindex>=npoints) {
- cindex = ifallback;
-
- assert (dir>=1 && dir<=3);
- CCTK_VWarn (1, __LINE__, __FILE__, CCTK_THORNSTRING,
- "The specified coordinate value %g for the %c-direction is not within the grid range [%g,%g] on convergence level %d, refinement level %d, map %d; using %g instead",
- coord, "xyz"[dir-1], lower, upper,
- mglevel, reflevel, Carpet::map, lower + delta * cindex);
- }
-
- assert (cindex>=0 && cindex<npoints);
-#else
- const void *dummy;
- dummy = &ifallback;
- dummy = &dummy;
-#endif
-
- return cindex;
- }
-
-
-
- template<int outdim>
- const char* IOASCII<outdim>
- ::GetStringParameter (const char* const parametertemplate)
- {
- char parametername[1000];
- snprintf (parametername, sizeof parametername, parametertemplate, outdim);
- int ptype;
- const char* const* const ppval = (const char* const*)CCTK_ParameterGet
- (parametername, CCTK_THORNSTRING, &ptype);
- assert (ppval);
- const char* const pval = *ppval;
- assert (ptype == PARAMETER_STRING || ptype == PARAMETER_KEYWORD);
- return pval;
- }
-
-
-
- template<int outdim>
- CCTK_INT IOASCII<outdim>
- ::GetIntParameter (const char* const parametertemplate)
- {
- char parametername[1000];
- snprintf (parametername, sizeof parametername, parametertemplate, outdim);
- int ptype;
- const CCTK_INT* const ppval
- = (const CCTK_INT*)CCTK_ParameterGet
- (parametername, CCTK_THORNSTRING, &ptype);
- assert (ppval);
- assert (ptype == PARAMETER_INT || ptype == PARAMETER_BOOLEAN);
- const CCTK_INT pval = *ppval;
- return pval;
- }
-
-
-
- template<int outdim>
- CCTK_REAL IOASCII<outdim>
- ::GetRealParameter (const char* const parametertemplate)
- {
- char parametername[1000];
- snprintf (parametername, sizeof parametername, parametertemplate, outdim);
- int ptype;
- const CCTK_REAL* const ppval
- = (const CCTK_REAL*)CCTK_ParameterGet
- (parametername, CCTK_THORNSTRING, &ptype);
- assert (ppval);
- assert (ptype == PARAMETER_REAL);
- const CCTK_REAL pval = *ppval;
- return pval;
- }
-
-
-
- void SetFlag (int index, const char* optstring, void* arg)
- {
- optstring = optstring;
- vector<bool>& flags = *(vector<bool>*)arg;
- flags.at(index) = true;
- }
-
-
-
- // Output
- template<int D,int DD>
- void WriteASCII (ostream& os,
- const gdata<D>* const gfdata,
- const bbox<int,D>& gfext,
- const int vi,
- const int time,
- const vect<int,D>& org,
- const vect<int,DD>& dirs,
- const int rl,
- const int ml,
- const int m,
- const int c,
- const int tl,
- const CCTK_REAL coord_time,
- const vect<CCTK_REAL,D>& coord_lower,
- const vect<CCTK_REAL,D>& coord_upper)
- {
- assert (DD<=D);
-
- if (gfdata->proc()==0) {
- // output on processor 0
-
- int rank;
- MPI_Comm_rank (dist::comm, &rank);
- if (rank == 0) {
-
- assert (os.good());
-
- os << "# iteration " << time << endl
- << "# refinement level " << rl
- << " multigrid level " << ml
- << " map " << m
- << " component " << c
- << " time level " << tl
- << endl
- << "# column format: it\ttl rl c ml\t";
- assert (D>=1 && D<=3);
- const char* const coords = "xyz";
- for (int d=0; d<D-1; ++d) os << "i" << coords[d] << " "; os << "i" << coords[D-1];
- os << "\ttime\t";
- for (int d=0; d<D-1; ++d) os << coords[d] << " "; os << coords[D-1];
- os << "\tdata" << endl;
-
- const vect<int,DD> lo = gfext.lower()[dirs];
- const vect<int,DD> up = gfext.upper()[dirs];
- const vect<int,DD> str = gfext.stride()[dirs];
- const bbox<int,DD> ext(lo,up,str);
-
- // Check whether the output origin is contained in the extent
- // of the data that should be output
- ivect org1(org);
- for (int d=0; d<DD; ++d) org1[dirs[d]] = ext.lower()[d];
- if (gfext.contains(org1)) {
-
- typename bbox<int,DD>::iterator it=ext.begin();
- do {
-
- ivect index(org);
- for (int d=0; d<DD; ++d) index[dirs[d]] = (*it)[d];
- os << time << "\t" << tl << " " << rl << " " << c << " " << ml
- << "\t";
- for (int d=0; d<D-1; ++d) os << index[d] << " "; os << index[D-1];
- os << "\t" << coord_time << "\t";
- for (int d=0; d<D; ++d) {
- assert (gfext.upper()[d] - gfext.lower()[d] >= 0);
- if (gfext.upper()[d] - gfext.lower()[d] == 0) {
- os << coord_lower[d];
- } else {
- os << (coord_lower[d] + (index[d] - gfext.lower()[d])
- * (coord_upper[d] - coord_lower[d])
- / (gfext.upper()[d] - gfext.lower()[d]));
- }
- if (d != D-1) os << " ";
- }
- os << "\t";
- switch (CCTK_VarTypeI(vi)) {
-#define TYPECASE(N,T) \
- case N: \
- os << (*(const data<T,D>*)gfdata)[index]; \
- break;
-#include "Carpet/Carpet/src/typecase"
-#undef TYPECASE
- default:
- UnsupportedVarType(vi);
- }
- os << endl;
-
- ++it;
-
- for (int d=0; d<DD; ++d) {
- if ((*it)[d]!=(*ext.end())[d]) break;
- os << endl;
- }
-
- } while (it!=ext.end());
-
- } else {
-
- os << "#" << endl;
-
- } // if ! ext contains org
-
- assert (os.good());
-
- }
-
- } else {
- // copy to processor 0 and output there
-
- gdata<D>* const tmp = gfdata->make_typed(vi);
- tmp->allocate(gfdata->extent(), 0);
- for (comm_state<dim> state; !state.done(); state.step()) {
- tmp->copy_from (state, gfdata, gfdata->extent());
- }
- WriteASCII (os, tmp, gfext, vi, time, org, dirs, rl, ml, m, c, tl,
- coord_time, coord_lower, coord_upper);
- delete tmp;
-
- }
+ return 0;
+ } else {
+ abort();
}
+}
+template<int outdim>
+int IOASCII<outdim>::TriggerOutput (cGH* cgh, int vindex) {
+ assert (vindex>=0 && vindex<CCTK_NumVars());
+
+ char* varname = CCTK_FullName(vindex);
+ int retval = OutputVarAs (cgh, varname, CCTK_VarName(vindex));
+ free (varname);
+
+ last_output[vindex] = cgh->cctk_iteration;
+
+ return retval;
+}
- // Explicit instantiation for all output dimensions
- template class IOASCII<0>;
- template class IOASCII<1>;
- template class IOASCII<2>;
- template class IOASCII<3>;
-
- template
- void WriteASCII (ostream& os,
- const gdata<3>* const gfdata,
- const bbox<int,3>& gfext,
- const int vi,
- const int time,
- const vect<int,3>& org,
- const vect<int,0>& dirs,
- const int rl,
- const int ml,
- const int m,
- const int c,
- const int tl,
- const CCTK_REAL coord_time,
- const vect<CCTK_REAL,3>& coord_lower,
- const vect<CCTK_REAL,3>& coord_upper);
-
- template
- void WriteASCII (ostream& os,
- const gdata<3>* const gfdata,
- const bbox<int,3>& gfext,
- const int vi,
- const int time,
- const vect<int,3>& org,
- const vect<int,1>& dirs,
- const int rl,
- const int ml,
- const int m,
- const int c,
- const int tl,
- const CCTK_REAL coord_time,
- const vect<CCTK_REAL,3>& coord_lower,
- const vect<CCTK_REAL,3>& coord_upper);
-
- template
- void WriteASCII (ostream& os,
- const gdata<3>* const gfdata,
- const bbox<int,3>& gfext,
- const int vi,
- const int time,
- const vect<int,3>& org,
- const vect<int,2>& dirs,
- const int rl,
- const int ml,
- const int m,
- const int c,
- const int tl,
- const CCTK_REAL coord_time,
- const vect<CCTK_REAL,3>& coord_lower,
- const vect<CCTK_REAL,3>& coord_upper);
- template
- void WriteASCII (ostream& os,
- const gdata<3>* const gfdata,
- const bbox<int,3>& gfext,
- const int vi,
- const int time,
- const vect<int,3>& org,
- const vect<int,3>& dirs,
- const int rl,
- const int ml,
- const int m,
- const int c,
- const int tl,
- const CCTK_REAL coord_time,
- const vect<CCTK_REAL,3>& coord_lower,
- const vect<CCTK_REAL,3>& coord_upper);
+// Explicit instantiation for all output dimensions
+template IOASCII<1>;
+template IOASCII<2>;
+template IOASCII<3>;
-} // namespace CarpetIOASCII
+} // namespace Carpet
diff --git a/Carpet/CarpetIOASCII/src/ioascii.hh b/Carpet/CarpetIOASCII/src/ioascii.hh
index 72ea5b97b..309f20704 100644
--- a/Carpet/CarpetIOASCII/src/ioascii.hh
+++ b/Carpet/CarpetIOASCII/src/ioascii.hh
@@ -1,23 +1,21 @@
-// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.hh,v 1.16 2004/04/03 12:38:12 schnetter Exp $
-
-#ifndef CARPETIOASCII_HH
-#define CARPETIOASCII_HH
+// $Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.hh,v 1.1 2001/03/01 13:40:10 eschnett Exp $
#include <vector>
#include "cctk.h"
+
+
-#include "ioascii.h"
-
-
-
-namespace CarpetIOASCII {
+namespace Carpet {
- using namespace std;
+ // scheduled functions
+ extern "C" {
+ int CarpetIOASCIIStartup();
+ }
- // Everything is a class template, so that it can easily be
+ // Everything is a template class, so that it can easily be
// instantiated for all output dimensions.
template<int outdim>
@@ -34,9 +32,8 @@ namespace CarpetIOASCII {
// Do truncate the output files for a variable
static vector<bool> do_truncate;
- // Last iteration on which a refinement level of a variable was
- // output (INT_MIN for none)
- static vector<vector<vector<int> > > last_output; // [ml][rl][var]
+ // Last iteration on which a variable was output (-1 for none)
+ static vector<int> last_output;
@@ -47,27 +44,13 @@ namespace CarpetIOASCII {
// registered functions
- static void* SetupGH (tFleshConfig* fc, int convLevel, cGH* cgh);
-
- static int OutputGH (const cGH* cgh);
- static int OutputVarAs (const cGH* cgh,
- const char* varname, const char* alias);
- static int TimeToOutput (const cGH* cgh, int vindex);
- static int TriggerOutput (const cGH* cgh, int vindex);
+ static void* SetupGH (tFleshConfig *fc, int convLevel, cGH *cgh);
- static int GetGridOffset (const cGH* cgh, int dir,
- const char* itempl, const char* iglobal,
- const char* ctempl, const char* cglobal,
- CCTK_REAL cfallback);
- static int CoordToOffset (const cGH* cgh, int dir, CCTK_REAL coord,
- int ifallback);
+ static int OutputGH (cGH* cgh);
+ static int OutputVarAs (cGH* cgh, const char* varname, const char* alias);
+ static int TimeToOutput (cGH* cgh, int vindex);
+ static int TriggerOutput (cGH* cgh, int vindex);
- static const char* GetStringParameter (const char* parametertemplate);
- static CCTK_INT GetIntParameter (const char* parametertemplate);
- static CCTK_REAL GetRealParameter (const char* parametertemplate);
-
- }; // struct IOASCII
+ };
-} // namespace CarpetIOASCII
-
-#endif // !defined(CARPETIOASCII_HH)
+} // namespace Carpet