aboutsummaryrefslogtreecommitdiff
path: root/CarpetDev/CarpetIOF5/src/writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'CarpetDev/CarpetIOF5/src/writer.cc')
-rw-r--r--CarpetDev/CarpetIOF5/src/writer.cc245
1 files changed, 144 insertions, 101 deletions
diff --git a/CarpetDev/CarpetIOF5/src/writer.cc b/CarpetDev/CarpetIOF5/src/writer.cc
index df1949369..cf00271a0 100644
--- a/CarpetDev/CarpetIOF5/src/writer.cc
+++ b/CarpetDev/CarpetIOF5/src/writer.cc
@@ -1,22 +1,29 @@
+#include <cstdlib>
#include <sstream>
+#include <string>
+
+#include <hdf5.h>
#include "cctk.h"
#include "cctk_Arguments.h"
#include "cctk_Parameters.h"
#include "carpet.hh"
+#include "modes.hh"
#include "data_region.hh"
#include "file.hh"
#include "meta_data_region.hh"
+#include "physical_quantity.hh"
#include "simulation.hh"
#include "tensor_component.hh"
#include "timestep.hh"
#include "topology.hh"
+#include "utils.hh"
#include "writer.hh"
-
+
namespace CarpetIOF5 {
writer_t::
@@ -33,20 +40,18 @@ namespace CarpetIOF5 {
write (F5::file_t & file)
const
{
- write_meta (file, file.get_have_metafile());
+ write_meta (file);
}
void writer_t::
- write_meta (F5::file_t & file,
- bool const have_metafile)
+ write_meta (F5::file_t & file)
const
{
DECLARE_CCTK_PARAMETERS;
- if (verbose or veryverbose)
- {
+ if (verbose or veryverbose) {
CCTK_VInfo (CCTK_THORNSTRING,
"OutputVarAs/write_meta");
}
@@ -55,24 +60,22 @@ namespace CarpetIOF5 {
if (Carpet::is_meta_mode())
{
- for (Carpet::mglevel_iterator mglevel_iter (m_cctkGH);
- not mglevel_iter.done();
- mglevel_iter.step())
+ BEGIN_MGLEVEL_LOOP (m_cctkGH)
{
- write_one_mglevel (timestep, have_metafile);
+ write_one_mglevel (timestep);
}
+ END_MGLEVEL_LOOP;
}
else
{
- write_one_mglevel (timestep, have_metafile);
+ write_one_mglevel (timestep);
}
}
void writer_t::
- write_one_mglevel (F5::timestep_t & timestep,
- bool const have_metafile)
+ write_one_mglevel (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -84,12 +87,6 @@ namespace CarpetIOF5 {
Carpet::mglevel);
}
- ostringstream namebuf;
- namebuf << "convlevel=" << m_cctkGH->cctk_convlevel;
- string const namestr = namebuf.str();
- char const * const name = namestr.c_str();
- F5::simulation_t simulation (timestep, name);
-
int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
assert (grouptype >= 0);
switch (grouptype)
@@ -97,9 +94,20 @@ namespace CarpetIOF5 {
case CCTK_ARRAY:
case CCTK_SCALAR:
{
- if (Carpet::do_global_mode)
+ if (Carpet::is_global_mode())
{
- write_global (simulation, have_metafile);
+ ENTER_LEVEL_MODE (m_cctkGH, 0)
+ {
+ write_global (timestep);
+ }
+ LEAVE_LEVEL_MODE;
+ }
+ else
+ {
+ if (Carpet::do_global_mode)
+ {
+ write_global (timestep);
+ }
}
}
break;
@@ -107,16 +115,15 @@ namespace CarpetIOF5 {
{
if (Carpet::is_global_mode())
{
- for (Carpet::reflevel_iterator reflevel_iter (m_cctkGH);
- not reflevel_iter.done();
- reflevel_iter.step())
+ BEGIN_REFLEVEL_LOOP (m_cctkGH)
{
- write_one_reflevel (simulation, have_metafile);
+ write_one_reflevel (timestep);
}
+ END_REFLEVEL_LOOP;
}
else
{
- write_one_reflevel (simulation, have_metafile);
+ write_one_reflevel (timestep);
}
}
break;
@@ -128,69 +135,96 @@ namespace CarpetIOF5 {
void writer_t::
- write_global (F5::simulation_t & simulation,
- bool const have_metafile)
+ write_global (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
if (verbose or veryverbose)
{
- CCTK_INFO ("OutputVarAs/write_global");
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_global");
}
- F5::unigrid_topology_t topology (simulation);
-
int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
- assert (grouptype >= 0);
assert (grouptype == CCTK_SCALAR or grouptype == CCTK_ARRAY);
- vect<CCTK_REAL, dim> level_origin, level_delta;
- for (int d=0; d<dim; ++d)
- {
- level_origin[d] = 0.0;
- level_delta[d] = 1.0;
- }
- F5::Cartesian_coordinate_system_t coordinate_system
- (topology, level_origin, level_delta);
-
- int const group = CCTK_GroupIndexFromVarI (m_variable);
- assert (group >= 0 and group < CCTK_NumGroups());
- F5::physical_quantity_t physical_quantity (coordinate_system, group);
-
- F5::tensor_component_t tensor_component (physical_quantity, m_variable);
-
- int const map = 0;
- int const reflevel = 0;
- int const myproc = CCTK_MyProc (m_cctkGH);
- dh * const dd = Carpet::arrdata.at(group).at(map).dd;
- dh::dboxes const & boxes
- = dd->boxes.at(Carpet::mglevel).at(reflevel).at(myproc);
- bbox<int, dim> const & region = determine_region (boxes);
-
- if (have_metafile)
+ BEGIN_MAP_LOOP (m_cctkGH, grouptype)
{
- F5::meta_data_region_t meta_data_region (tensor_component, region);
- gh * const hh = Carpet::vhh.at(Carpet::map);
- int const proc = hh->processor (Carpet::reflevel, Carpet::component);
- meta_data_region.write (proc);
+
+ // Name the grid after the variable group
+ ostringstream namebuf;
+ char * const c_name = CCTK_GroupNameFromVarI (m_variable);
+ namebuf << "Cactus-" << c_name;
+ free (c_name);
+ string const name = namebuf.str();
+ F5::simulation_t simulation (timestep, name.c_str());
+
+ F5::unigrid_topology_t topology (simulation);
+
+ vect<CCTK_REAL, dim> const level_origin (0.0), level_delta (1.0);
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ int const group = CCTK_GroupIndexFromVarI (m_variable);
+ assert (group >= 0 and group < CCTK_NumGroups());
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ int const myproc = CCTK_MyProc (m_cctkGH);
+
+ F5::file_t & file = timestep.get_file();
+ bool const write_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ if (write_metafile)
+ {
+
+ BEGIN_COMPONENT_LOOP (m_cctkGH, grouptype)
+ {
+ dh * const dd = Carpet::arrdata.at(group).at(Carpet::map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
+
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ int const proc = hh->processor (Carpet::reflevel, Carpet::component);
+ meta_data_region.write (proc);
+ }
+ END_COMPONENT_LOOP;
+
+ }
+ else // if not write_metafile
+ {
+
+ BEGIN_LOCAL_COMPONENT_LOOP (m_cctkGH, grouptype)
+ {
+ dh * const dd = Carpet::arrdata.at(group).at(Carpet::map).dd;
+ dh::dboxes const & boxes
+ = dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel).at(myproc);
+ bbox<int, dim> const & region = determine_region (boxes);
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
+ int const timelevel = 0;
+ void const * const varptr
+ = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (m_variable);
+ assert (vartype >= 0);
+ tensor_component.write (varptr, vartype);
+ }
+ END_LOCAL_COMPONENT_LOOP;
+
+ } // if not write_metafile
+
}
-
- F5::data_region_t data_region (tensor_component, region);
- int const timelevel = 0;
- void const * const varptr
- = CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
- assert (varptr != 0);
- int const vartype = CCTK_VarTypeI (m_variable);
- assert (vartype >= 0);
- data_region.write (varptr, vartype);
+ END_MAP_LOOP;
}
void writer_t::
- write_one_reflevel (F5::simulation_t & simulation,
- bool const have_metafile)
+ write_one_reflevel (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -203,29 +237,26 @@ namespace CarpetIOF5 {
}
int const grouptype = CCTK_GroupTypeFromVarI (m_variable);
- assert (grouptype >= 0);
assert (grouptype == CCTK_GF);
if (Carpet::is_level_mode())
{
- for (Carpet::map_iterator map_iter (m_cctkGH, grouptype);
- not map_iter.done();
- map_iter.step())
+ BEGIN_MAP_LOOP (m_cctkGH, grouptype)
{
- write_one_map (simulation, have_metafile);
+ write_one_map (timestep);
}
+ END_MAP_LOOP;
}
else
{
- write_one_map (simulation, have_metafile);
+ write_one_map (timestep);
}
}
void writer_t::
- write_one_map (F5::simulation_t & simulation,
- bool const have_metafile)
+ write_one_map (F5::timestep_t & timestep)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -236,8 +267,19 @@ namespace CarpetIOF5 {
"OutputVarAs/write_one_map map=%d", Carpet::map);
}
+ // Name the grid after the map number
+ ostringstream namebuf;
+ namebuf << "Carpet";
+ if (Carpet::maps > 1)
+ {
+ namebuf << "-map" << Carpet::map;
+ }
+ string const name = namebuf.str();
+ F5::simulation_t simulation (timestep, name.c_str());
+
F5::mesh_refinement_topology_t topology
- (simulation, Carpet::map, Carpet::reflevel, Carpet::maxreflevels,
+ (simulation,
+ Carpet::map, Carpet::maps, Carpet::reflevel, Carpet::maxreflevels,
Carpet::spacereflevelfact, Carpet::maxspacereflevelfact);
vect<CCTK_REAL, dim> level_origin, level_delta;
@@ -255,31 +297,27 @@ namespace CarpetIOF5 {
assert (group >= 0 and group < CCTK_NumGroups());
F5::physical_quantity_t physical_quantity (coordinate_system, group);
- F5::tensor_component_t tensor_component (physical_quantity, m_variable);
-
if (Carpet::is_singlemap_mode())
{
int const grouptype = CCTK_GroupTypeI (group);
assert (grouptype >= 0);
- for (Carpet::component_iterator component_iter (m_cctkGH, grouptype);
- not component_iter.done();
- component_iter.step())
+ BEGIN_COMPONENT_LOOP (m_cctkGH, grouptype)
{
- write_one_component (tensor_component, have_metafile);
+ write_one_component (physical_quantity);
}
+ END_COMPONENT_LOOP;
}
else
{
- write_one_component (tensor_component, have_metafile);
+ write_one_component (physical_quantity);
}
}
void writer_t::
- write_one_component (F5::tensor_component_t & tensor_component,
- bool const have_metafile)
+ write_one_component (F5::physical_quantity_t & physical_quantity)
const
{
DECLARE_CCTK_PARAMETERS;
@@ -293,30 +331,37 @@ namespace CarpetIOF5 {
gh * const hh = Carpet::vhh.at(Carpet::map);
bool const is_local = hh->is_local (Carpet::reflevel, Carpet::component);
- if (have_metafile or is_local)
+
+ F5::file_t & file
+ = (physical_quantity.get_coordinate_system().get_topology()
+ .get_simulation().get_timestep().get_file());
+ bool const write_metafile
+ = file.get_is_metafile() and not file.get_is_datafile();
+ if (write_metafile or is_local)
{
dh * const dd = Carpet::vdd.at(Carpet::map);
bbox<int, dim> const & region
= (dd->boxes.at(Carpet::mglevel).at(Carpet::reflevel)
.at(Carpet::component).exterior);
- if (have_metafile)
+ if (write_metafile)
{
- F5::meta_data_region_t meta_data_region (tensor_component, region);
+ F5::meta_data_region_t meta_data_region (physical_quantity, region);
int const proc = hh->processor (Carpet::reflevel, Carpet::component);
meta_data_region.write (proc);
}
-
- if (is_local)
+ else if (is_local)
{
- F5::data_region_t data_region (tensor_component, region);
+ F5::data_region_t data_region (physical_quantity, region);
+
+ F5::tensor_component_t tensor_component (data_region, m_variable);
int const timelevel = 0;
void const * const varptr
= CCTK_VarDataPtrI (m_cctkGH, timelevel, m_variable);
assert (varptr != 0);
int const vartype = CCTK_VarTypeI (m_variable);
assert (vartype >= 0);
- data_region.write (varptr, vartype);
+ tensor_component.write (varptr, vartype);
}
}
}
@@ -325,19 +370,17 @@ namespace CarpetIOF5 {
bbox<int,dim> const & writer_t::
determine_region (dh::dboxes const & boxes)
- const
{
DECLARE_CCTK_PARAMETERS;
+ // TODO: use superregions instead of regions (? only if the
+ // regions are on the same processor?)
+
bbox<int,dim> dh::dboxes::* boxptr;
if (CCTK_EQUALS (output_regions, "exterior"))
{
boxptr = & dh::dboxes::exterior;
}
- else if (CCTK_EQUALS (output_regions, "communicated"))
- {
- boxptr = & dh::dboxes::communicated;
- }
else if (CCTK_EQUALS (output_regions, "owned"))
{
boxptr = & dh::dboxes::owned;