aboutsummaryrefslogtreecommitdiff
path: root/Carpet/CarpetIOASCII/src
diff options
context:
space:
mode:
authorschnetter <>2002-01-09 22:42:00 +0000
committerschnetter <>2002-01-09 22:42:00 +0000
commit21ec705634caf28a5c6c1826b0823482915d142f (patch)
treecc720de8d0358cfd2e110499586bf8077de63308 /Carpet/CarpetIOASCII/src
parent313504329f18e0bba86b7cf05c7a95a167e085f5 (diff)
Moved ASCII output from CarpetLib (where it never belonged) to
Moved ASCII output from CarpetLib (where it never belonged) to CarpetIOASCII. Added parameter to not output the ghost zones for ASCII output. darcs-hash:20020109224240-07bb3-457f3768c8aee0b68db6a7a85741ccd9191ee39e.gz
Diffstat (limited to 'Carpet/CarpetIOASCII/src')
-rw-r--r--Carpet/CarpetIOASCII/src/ioascii.cc218
1 files changed, 210 insertions, 8 deletions
diff --git a/Carpet/CarpetIOASCII/src/ioascii.cc b/Carpet/CarpetIOASCII/src/ioascii.cc
index 14ee7962b..7b64b12b8 100644
--- a/Carpet/CarpetIOASCII/src/ioascii.cc
+++ b/Carpet/CarpetIOASCII/src/ioascii.cc
@@ -17,6 +17,7 @@
#include "CactusBase/IOUtil/src/ioutil_CheckpointRecovery.h"
#include "Carpet/CarpetLib/src/data.hh"
+#include "Carpet/CarpetLib/src/dist.hh"
#include "Carpet/CarpetLib/src/gdata.hh"
#include "Carpet/CarpetLib/src/gf.hh"
#include "Carpet/CarpetLib/src/ggf.hh"
@@ -26,10 +27,15 @@
#include "ioascii.hh"
-static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.cc,v 1.27 2002/01/08 13:49:22 schnetter Exp $";
+static const char* rcsid = "$Header: /home/eschnett/C/carpet/Carpet/Carpet/CarpetIOASCII/src/ioascii.cc,v 1.28 2002/01/09 23:42:40 schnetter Exp $";
+// That's a hack
+namespace Carpet {
+ void UnsupportedVarType (const int vindex);
+}
+
using namespace std;
using namespace Carpet;
@@ -39,6 +45,22 @@ static bool CheckForVariable (const cGH* const cgh,
const char* const varlist, const int vindex);
static void SetFlag (int index, const char* optstring, void* arg);
+template<int D,int DD>
+static void WriteASCII (ostream& os,
+ const generic_data<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 tl,
+ const int rl,
+ const int c,
+ const int ml,
+ const CCTK_REAL coord_time,
+ const vect<CCTK_REAL,D>& coord_lower,
+ const vect<CCTK_REAL,D>& coord_upper);
+
int CarpetIOASCIIStartup()
@@ -332,8 +354,27 @@ int CarpetIOASCII<outdim>
const generic_data<dim>* const data
= (*ff) (tl, reflevel, component, mglevel);
- const bbox<int,dim> ext = data->extent();
- const vect<int,dim> offset1 = offset * ext.stride();
+ bbox<int,dim> ext = data->extent();
+
+ vect<int,dim> lo = ext.lower();
+ vect<int,dim> hi = ext.upper();
+ vect<int,dim> 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 = bbox<int,dim>(lo,hi,str);
// coordinates
const double coord_time = cgh->cctk_time;
@@ -357,12 +398,14 @@ int CarpetIOASCII<outdim>
}
// Note: don't permute the "coord_delta" and "data->extent().lower()"
// (you'll pick up the integer operator* then)
- const vect<double,dim> coord_lower = global_lower + coord_delta * vect<double,dim>(data->extent().lower());
- const vect<double,dim> coord_upper = global_lower + coord_delta * vect<double,dim>(data->extent().upper());
+ const vect<double,dim> coord_lower = global_lower + coord_delta * vect<double,dim>(lo);
+ const vect<double,dim> coord_upper = global_lower + coord_delta * vect<double,dim>(hi);
+
+ const vect<int,dim> offset1 = offset * ext.stride();
- data->write_ascii (file, cgh->cctk_iteration, offset1, dirs,
- tl, reflevel, component, mglevel,
- coord_time, coord_lower, coord_upper);
+ WriteASCII (file, data, ext, n, cgh->cctk_iteration, offset1, dirs,
+ tl, reflevel, component, mglevel,
+ coord_time, coord_lower, coord_upper);
// Append EOL after every component
if (CCTK_MyProc(cgh)==0) {
@@ -634,7 +677,166 @@ void SetFlag (int index, const char* optstring, void* arg)
+// Output
+template<int D,int DD>
+void WriteASCII (ostream& os,
+ const generic_data<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 tl,
+ const int rl,
+ const int c,
+ const int ml,
+ 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
+ << "# time level " << tl << " refinement level " << rl
+ << " component " << c << " multigrid level " << ml << endl
+ << "# column format: it tl rl c ml ";
+ assert (D>=1 && D<=3);
+ const char* const coords = "xyz";
+ for (int d=0; d<D; ++d) os << " i" << coords[d];
+ os << " time ";
+ for (int d=0; d<D; ++d) os << " " << coords[d];
+ os << " data" << 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
+ vect<int,dim> org1(org);
+ for (int d=0; d<DD; ++d) org1[dirs[d]] = ext.lower()[d];
+ if (gfext.contains(org1)) {
+
+ for (bbox<int,DD>::iterator it=ext.begin(); it!=ext.end(); ++it) {
+ vect<int,dim> index(org);
+ for (int d=0; d<DD; ++d) index[dirs[d]] = (*it)[d];
+ os << time << " " << tl << " " << rl << " " << c << " " << ml
+ << " ";
+ for (int d=0; d<D; ++d) os << index[d] << " ";
+ os << " " << coord_time << " ";
+ for (int d=0; d<D; ++d) {
+ if (gfext.upper()[d] - gfext.lower()[d] != 0) {
+ os << (coord_lower[d] + (index[d] - gfext.lower()[d])
+ * (coord_upper[d] - coord_lower[d])
+ / (gfext.upper()[d] - gfext.lower()[d])) << " ";
+ } else {
+ os << coord_lower[d] << " ";
+ }
+ }
+ os << " ";
+ switch (CCTK_VarTypeI(vi)) {
+#define TYPECASE(N,T) \
+ case N: \
+ os << (*(data<T,D>*)gfdata)[index]; \
+ break;
+#include "Carpet/Carpet/src/typecase"
+#undef TYPECASE
+ default:
+ UnsupportedVarType(vi);
+ }
+ os << endl;
+ for (int d=0; d<DD; ++d) {
+ if (index[dirs[d]]!=gfext.upper()[dirs[d]]) break;
+ os << endl;
+ }
+ }
+
+ } else {
+
+ os << "#" << endl;
+
+ } // if ! ext contains org
+
+ assert (os.good());
+
+ }
+
+ } else {
+ // copy to processor 0 and output there
+
+ generic_data<D>* const tmp = gfdata->make_typed();
+ tmp->allocate(gfdata->extent(), 0);
+ tmp->copy_from (gfdata, gfdata->extent());
+ WriteASCII (os, tmp, gfext, vi, time, org, dirs, tl, rl, c, ml,
+ coord_time, coord_lower, coord_upper);
+ delete tmp;
+
+ }
+}
+
+
+
+
+
// Explicit instantiation for all output dimensions
template class CarpetIOASCII<1>;
template class CarpetIOASCII<2>;
template class CarpetIOASCII<3>;
+
+template
+void WriteASCII (ostream& os,
+ const generic_data<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 tl,
+ const int rl,
+ const int c,
+ const int ml,
+ 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 generic_data<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 tl,
+ const int rl,
+ const int c,
+ const int ml,
+ 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 generic_data<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 tl,
+ const int rl,
+ const int c,
+ const int ml,
+ const CCTK_REAL coord_time,
+ const vect<CCTK_REAL,3>& coord_lower,
+ const vect<CCTK_REAL,3>& coord_upper);