aboutsummaryrefslogtreecommitdiff
path: root/CarpetDev/CarpetIOF5/src/iof5.cc.old
diff options
context:
space:
mode:
Diffstat (limited to 'CarpetDev/CarpetIOF5/src/iof5.cc.old')
-rw-r--r--CarpetDev/CarpetIOF5/src/iof5.cc.old643
1 files changed, 0 insertions, 643 deletions
diff --git a/CarpetDev/CarpetIOF5/src/iof5.cc.old b/CarpetDev/CarpetIOF5/src/iof5.cc.old
deleted file mode 100644
index fe780030b..000000000
--- a/CarpetDev/CarpetIOF5/src/iof5.cc.old
+++ /dev/null
@@ -1,643 +0,0 @@
-#include <cctk.h>
-#include <cctk_Arguments.h>
-#include <cctk_Parameters.h>
-
-#include <cassert>
-#include <cstdlib>
-#include <cstring>
-#include <iomanip>
-#include <iostream>
-#include <limits>
-#include <sstream>
-#include <string>
-
-#include <hdf5.h>
-#include <F5/F5F.h>
-#include <F5/F5R.h>
-#include <F5/F5iterate.h>
-#include <F5/F5uniform.h>
-
-#include <bbox.hh>
-#include <vect.hh>
-
-#include <carpet.hh>
-
-
-
-namespace CarpetIOF5 {
-
- using namespace std;
- using namespace Carpet;
-
-
-
- // File mode for creating directories
- int const mode = 0755;
-
- // A nan
- CCTK_REAL const nan = numeric_limits<CCTK_REAL>::quiet_NaN();
-
- // Indentation
- inline string indent (int const n)
- {
- int const width = 3;
- return string(width*n, ' ');
- }
-
-
-
- typedef vect<hsize_t,dim> hvect;
- typedef vect<float,dim> fvect;
-
-
-
- static inline
- hvect v2h (ivect const& a)
- {
- return hvect(a);
- }
-
- static inline
- F5_vec3_point_t v2p (rvect const& a)
- {
- F5_vec3_point_t res;
- res.x = a[0];
- res.y = a[1];
- res.z = a[2];
- return res;
- }
-
- static inline
- F5_vec3_float_t v2f (rvect const& a)
- {
- F5_vec3_float_t res;
- res.x = a[0];
- res.y = a[1];
- res.z = a[2];
- return res;
- }
-
- static inline
- F5_vec3_double_t v2d (rvect const& a)
- {
- F5_vec3_double_t res;
- res.x = a[0];
- res.y = a[1];
- res.z = a[2];
- return res;
- }
-
-
-
- // Generate a good grid name (simulation name)
- string
- generate_gridname (cGH const *const cctkGH)
- {
-#if 0
- char const *const gridname = (char const*) UniqueSimulationID(cctkGH);
- assert (gridname);
- return gridname;
-#endif
- // Use the parameter file name, since the simulation ID is too
- // long and doesn't look nice
- char parfilename[10000];
- CCTK_ParameterFilename (sizeof parfilename, parfilename);
- char *const p = strstr(parfilename, ".par");
- if (p) *p = '\0';
- char *const s = strrchr(parfilename, '/');
- char *const gridname = s ? s+1 : parfilename;
- return gridname;
- }
-
-
-
- // Generate a good file name ("alias") for a variable
- string
- generate_basename (cGH const *const cctkGH,
- int const variable)
- {
- DECLARE_CCTK_PARAMETERS;
-
- assert (variable >= 0);
-
- ostringstream filename_buf;
-
- if (CCTK_EQUALS (file_content, "variable")) {
- char *const varname = CCTK_FullName(variable);
- assert (varname);
- for (char *p = varname; *p; ++p) {
- *p = tolower(*p);
- }
- filename_buf << varname;
- free (varname);
- }
- else if (CCTK_EQUALS (file_content, "group")) {
- char *const groupname = CCTK_GroupNameFromVarI(variable);
- assert (groupname);
- for (char *p = groupname; *p; ++p) {
- *p = tolower(*p);
- }
- filename_buf << groupname;
- free (groupname);
- }
- else if (CCTK_EQUALS (file_content, "thorn")) {
- char const *const impname = CCTK_ImpFromVarI(variable);
- char *const thornname = strdup(impname);
- assert (thornname);
- char *const colon = strchr(thornname, ':');
- assert (colon);
- *colon = '\0';
- for (char *p = thornname; *p; ++p) {
- *p = tolower(*p);
- }
- filename_buf << thornname;
- free (thornname);
- }
- else if (CCTK_EQUALS (file_content, "everything")) {
- filename_buf << out_filename;
- }
- else {
- assert (0);
- }
-
- if (out_timesteps_per_file > 0) {
- int const iteration = (cctkGH->cctk_iteration
- / out_timesteps_per_file * out_timesteps_per_file);
- filename_buf << ".it"
- << setw (iteration_digits) << setfill ('0') << iteration;
- }
-
- return filename_buf.str();
- }
-
-
-
- // Create the final file name on a particular processor
- string
- create_filename (cGH const *const cctkGH,
- string const basename,
- bool const create_directories)
- {
- DECLARE_CCTK_PARAMETERS;
-
- int const proc = CCTK_MyProc(cctkGH);
- int const nprocs = CCTK_nProcs(cctkGH);
-
- bool const use_IO_out_dir = strcmp(out_dir, "") == 0;
- string path = use_IO_out_dir ? IO_out_dir : out_dir;
-
- if (create_subdirs) {
- if (nprocs >= 10000) {
- ostringstream buf;
- buf << path + "/"
- << basename
- << ".p" << setw (max (0, processor_digits - 4)) << setfill ('0')
- << proc / 10000
- << "nnnn/";
- path = buf.str();
- if (create_directories) {
- check (CCTK_CreateDirectory (mode, path.c_str()) >= 0);
- }
- }
- if (nprocs >= 100) {
- ostringstream buf;
- buf << path + "/"
- << basename
- << ".p" << setw (max (0, processor_digits - 2)) << setfill ('0')
- << proc / 100
- << "nn/";
- path = buf.str();
- if (create_directories) {
- check (CCTK_CreateDirectory (mode, path.c_str()) >= 0);
- }
- }
- }
- if (one_dir_per_file and nprocs >= 1) {
- ostringstream buf;
- buf << path
- << basename
- << ".p" << setw (processor_digits) << setfill ('0')
- << proc
- << "/";
- path = buf.str();
- if (create_directories) {
- check (CCTK_CreateDirectory (mode, path.c_str()) >= 0);
- }
- }
- ostringstream buf;
- buf << path + "/"
- << basename
- << ".p" << setw (processor_digits) << setfill ('0') << proc
- << out_extension;
- return buf.str();
- }
-
-
-
- extern "C"
- void F5_Output (CCTK_ARGUMENTS)
- {
- DECLARE_CCTK_ARGUMENTS;
- DECLARE_CCTK_PARAMETERS;
-
- herr_t herr;
-
-
-
- assert (is_global_mode());
- CCTK_VInfo (CCTK_THORNSTRING, "F5_Output: iteration=%d", cctk_iteration);
-
- string const gridname = generate_gridname(cctkGH);
-
-
-
- // Open file
- static bool first_time = true;
-
- string const basename =
- generate_basename (cctkGH, CCTK_VarIndex("grid::r"));
- string const name =
- create_filename (cctkGH, basename, first_time);
-
- bool const truncate_file = first_time and IO_TruncateOutputFiles(cctkGH);
- hid_t const file =
- truncate_file ?
- H5Fcreate (name.c_str(), H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT) :
- H5Fopen (name.c_str(), H5F_ACC_RDWR, H5P_DEFAULT);
- assert (file >= 0);
- first_time = false;
-
-
-
- BEGIN_REFLEVEL_LOOP (cctkGH) {
- DECLARE_CCTK_ARGUMENTS;
-
-#if 0
- // Write data
-#warning "TODO: Save the coordinates in double precision"
- F5Path *const path =
- F5Fwrite_uniform_cartesian3D
- (file, cctk_time, gridname, &v2p(lower), &v2f(delta), &v2h(lsh)[0],
- "radius" /* group name */, H5T_NATIVE_DOUBLE, r, NULL, F5P_DEFAULT);
-#endif
-
- // Define grid hierarchy
- ivect const reffact = spacereffacts.AT(reflevel);
- F5Path *const path = F5Rcreate_vertex_refinement3D
- (file, cctk_time, gridname.c_str(), &v2h(reffact)[0], NULL);
-
- // Define iteration
- F5Rset_timestep (path, cctk_iteration);
-
-#if 0
- F5Path *refpath = NULL;
- static CCTK_REAL last_root_time = -1;
- if (reflevel == 0) {
- last_root_time = cctk_time;
- } else {
- refpath = F5Rcreate_relative_vertex_Qrefinement3D
- (file, cctk_time, gridname, &v2h(reffact)[0],
- last_root_time, &v2h(ivect(1))[0]);
- }
-#endif
-
-
-
- BEGIN_LOCAL_MAP_LOOP (cctkGH, CCTK_GF) {
- DECLARE_CCTK_ARGUMENTS;
-
- // Determine level coordinates
- ivect gsh;
- rvect origin, delta;
- rvect lower, upper;
- for (int d=0; d<dim; ++d) {
- gsh[d] = cctk_gsh[d];
- origin[d] = CCTK_ORIGIN_SPACE(d);
- delta[d] = CCTK_DELTA_SPACE(d);
- lower[d] = origin[d];
- upper[d] = lower[d] + (gsh[d]-1) * delta[d];
- }
-
- // Define level topology
- if (reflevel == 0) {
- // Choose (arbitrarily) the root level as default topology,
- // for readers which don't understand AMR
- F5Rlink_default_vertex_topology (path, &v2h(reffact)[0]);
- }
-
- // Define level geometry
- F5Fwrite_linear (path, FIBER_HDF5_POSITIONS_STRING,
- dim, &v2h(gsh)[0],
- F5T_COORD3_DOUBLE, &v2d(lower), &v2d(delta));
- F5Fset_range (path, &v2d(lower), &v2d(upper));
-
-
-
- BEGIN_LOCAL_COMPONENT_LOOP (cctkGH, CCTK_GF) {
- DECLARE_CCTK_ARGUMENTS;
-
- // Determine component coordinates
- ivect lbnd, lsh, lghosts, ughosts;
- rvect clower, cupper;
-#if 0
- F5_refinement3D_point_t iorigin, idelta;
-#endif
- for (int d=0; d<dim; ++d) {
- lbnd[d] = cctk_lbnd[d];
- lsh[d] = cctk_lsh[d];
- // F5 counts the total overlap, which is the sum of the
- // ghost zones on this and the adjacent component
- lghosts[d] = cctk_bbox[2*d ] ? 0 : 2*cctk_nghostzones[d];
- ughosts[d] = cctk_bbox[2*d+1] ? 0 : 2*cctk_nghostzones[d];
- clower[d] = origin[d] + cctk_lbnd[d] * delta[d];
- cupper[d] = clower[d] + (lsh[d]-1) * delta[d];
-#if 0
- iorigin.d[d].num =
- cctk_levoff[d] + cctk_lbnd[d] * cctk_levoffdenom[d];
- iorigin.d[d].denom = cctk_levoffdenom[d] * reffact[d];
- idelta .d[d].num = 1;
- idelta .d[d].denom = reffact[d];
-#endif
- }
- ostringstream buf2;
- buf2 << "component=" << component;
- string const cname = buf2.str();
-
-#if 0
- if (reflevel > 0) {
- F5Fwrite_linear_fraction (refpath, FIBER_HDF5_POSITIONS_STRING,
- cctk_dim, &v2h(gsh)[0], &v2h(lsh)[0],
- F5T_COORD3_INT_FRACTION32,
- &iorigin, &idelta, &v2h(lbnd)[0],
- cname.c_str());
- }
-#endif
-
- // Define coordinates
- // (This is redundant, since the level's overall bounding
- // box was already defined above, but it provides the
- // individual components' bounding boxes.)
- F5Fwrite_linear_fraction (path, FIBER_HDF5_POSITIONS_STRING,
- cctk_dim, &v2h(gsh)[0], &v2h(lsh)[0],
- F5T_COORD3_DOUBLE,
- &clower, &delta, &v2h(lbnd)[0],
- cname.c_str());
-
- // Write data
- // scalar field
- F5Fwrite_fraction (path, "radius" /* group name */,
- cctk_dim, &v2h(gsh)[0], &v2h(lsh)[0],
- H5T_NATIVE_DOUBLE, H5T_NATIVE_DOUBLE,
- r,
- &v2h(lbnd)[0], &v2h(lghosts)[0], &v2h(ughosts)[0],
- cname.c_str(), H5P_DEFAULT);
-
- // vector field
- void const* data[dim];
- data[0] = x;
- data[1] = y;
- data[2] = z;
- F5FSwrite_fraction (path, "coordinates" /* group name */,
- cctk_dim, &v2h(gsh)[0], &v2h(lsh)[0],
- F5T_VEC3_DOUBLE, F5T_VEC3_DOUBLE,
- data,
- &v2h(lbnd)[0], &v2h(lghosts)[0], &v2h(ughosts)[0],
- cname.c_str(), H5P_DEFAULT, 0);
-
- } END_LOCAL_COMPONENT_LOOP;
-
- } END_LOCAL_MAP_LOOP;
-
- // Close topology
- F5close (path);
-
- } END_REFLEVEL_LOOP;
-
- // Close file
- herr = H5Fclose (file);
- assert (not herr);
- }
-
-
-
- // Use a class for reading data, so that we have an easy way to pass
- // variables between the various iterators
- class iterator_t {
- cGH *cctkGH;
- double time;
- char const *gridname;
- char const *topologyname;
- int index_depth; // 0=vertex, 1=cell
- int topological_dimension;
- char const *fieldname;
- char const *fragmentname;
-
- public:
- iterator_t (cGH *const cctkGH_)
- : cctkGH(cctkGH_),
- time(nan),
- gridname(NULL),
- topologyname(NULL), index_depth(-1), topological_dimension(-1),
- fieldname(NULL),
- fragmentname(NULL)
- {
- }
-
-
-
- private:
-
- void read_timeslice (F5Path *const path)
- {
- cout << indent(1) << "time=" << time << "\n";
- F5iterate_grids (path, NULL, grid_iterator, this, NULL, NULL);
- }
-
- void read_grid (F5Path *const path)
- {
- cout << indent(2) << "grid=\"" << gridname << "\"\n";
- // F5iterate_vertex_fields (path, NULL, field_iterator, this, NULL, NULL);
- F5iterate_topologies (path, NULL, topology_iterator, this);
- }
-
- void read_topology (F5Path *const path)
- {
- herr_t herr;
-
- cout << indent(3) << "topology=\"" << topologyname << "\""
- << " (" << (index_depth==0 ? "vertex" : "cell") << ")\n";
-
- // Ignore topologies that are only an alias for another topology
- H5G_stat_t stat;
- herr = H5Gget_objinfo (path->Grid_hid, topologyname, false, &stat);
- assert (not herr);
- if (stat.type == H5G_LINK) {
- char linkval[100000];
- herr = H5Gget_linkval
- (path->Grid_hid, topologyname, sizeof linkval, linkval);
- assert (not herr);
- cout << indent(4) << "alias for topology \"" << linkval << "\"\n"
- << indent(4) << "ignoring this topology\n";
- return;
- }
-
- F5iterate_topology_fields (path, NULL, field_iterator, this, NULL, NULL);
- }
-
- void read_field (F5Path *const path)
- {
- cout << indent(4) << "field=\"" << fieldname << "\"\n";
- F5iterate_field_fragments (path, NULL, fragment_iterator, this);
- }
-
- void read_fragment (F5Path *const path)
- {
- herr_t herr;
-
- cout << indent(5) << "fragment=\"" << fragmentname << "\"\n";
-
- if (strcmp(fieldname, "radius") == 0) {
-
- hid_t const group = path->Field_hid;
- read_variable (group, fragmentname, CCTK_VarIndex("grid::r"));
-
- } else if (strcmp(fieldname, "coordinates") == 0) {
-
- hid_t const group =
- H5Gopen (path->Field_hid, fragmentname, H5P_DEFAULT);
- assert (group);
- read_variable (group, "x", CCTK_VarIndex("grid::x"));
- read_variable (group, "y", CCTK_VarIndex("grid::y"));
- read_variable (group, "z", CCTK_VarIndex("grid::z"));
- herr = H5Gclose (group);
- assert (not herr);
-
- } else {
- // do nothing
- }
- }
-
- void read_variable (hid_t const group, char const *const name,
- int const var)
- {
- assert (group >= 0);
- assert (name);
- assert (var >= 0);
-
- cout << indent(6) << "dataset=\"" << name << "\"\n";
- // hid_t const fragment = H5Dopen(group, name);
- // assert (fragment);
- //
- // hid_t const space = H5Dget_space(fragment);
- // assert (space);
- // int const rank = H5Sget_simple_extent_dims(space, NULL, NULL);
- // assert (rank>=0);
- //
- // assert (rank == cctk_dim);
- //
- // H5Sclose(space_id);
- }
-
-
-
- public:
-
- void iterate (hid_t const object)
- {
- F5iterate_timeslices (object, NULL, timeslice_iterator, this);
- }
-
- static
- herr_t timeslice_iterator (F5Path *const path, double const time,
- void *const userdata)
- {
- iterator_t* const iterator = (iterator_t*)userdata;
- iterator->time = time;
- iterator->read_timeslice (path);
- return 0;
- }
-
- static
- herr_t grid_iterator (F5Path *const path, char const *const gridname,
- void *const userdata)
- {
- iterator_t* const iterator = (iterator_t*)userdata;
- iterator->gridname = gridname;
- iterator->read_grid (path);
- return 0;
- }
-
- static
- herr_t topology_iterator (F5Path *const path,
- char const *const topologyname,
- int const index_depth,
- int const topological_dimension,
- void *const userdata)
- {
- iterator_t* const iterator = (iterator_t*)userdata;
- iterator->topologyname = topologyname;
- iterator->index_depth = index_depth;
- iterator->topological_dimension = topological_dimension;
- iterator->read_topology (path);
- return 0;
- }
-
- static
- herr_t field_iterator (F5Path *const path, char const *const fieldname,
- void *const userdata)
- {
- iterator_t* const iterator = (iterator_t*)userdata;
- iterator->fieldname = fieldname;
- iterator->read_field (path);
- return 0;
- }
-
- static
- herr_t fragment_iterator (F5Path *const path,
- char const *const fragmentname,
- void *const userdata)
- {
- iterator_t* const iterator = (iterator_t*)userdata;
- iterator->fragmentname = fragmentname;
- iterator->read_fragment (path);
- return 0;
- }
-
- };
-
-
-
- extern "C"
- void F5_Input (CCTK_ARGUMENTS)
- {
- DECLARE_CCTK_ARGUMENTS;
- DECLARE_CCTK_PARAMETERS;
-
- herr_t herr;
-
-
-
- assert (is_global_mode());
- CCTK_VInfo (CCTK_THORNSTRING, "F5_Input: iteration=%d", cctk_iteration);
-
-
-
- // Open file
- string const basename =
- generate_basename (cctkGH, CCTK_VarIndex("grid::r"));
- string const name =
- create_filename (cctkGH, basename, false);
-
- hid_t const file = H5Fopen (name.c_str(), H5F_ACC_RDONLY, H5P_DEFAULT);
- assert (file >= 0);
-
- // Iterate over all time slices
- iterator_t iterator(cctkGH);
- iterator.iterate (file);
-
- // Close file
- herr = H5Fclose (file);
- assert (not herr);
- }
-
-} // end namespace CarpetIOF5