aboutsummaryrefslogtreecommitdiff
path: root/CarpetDev/CarpetIOF5
diff options
context:
space:
mode:
authorErik Schnetter <schnetter@cct.lsu.edu>2005-12-03 05:28:00 +0000
committerErik Schnetter <schnetter@cct.lsu.edu>2005-12-03 05:28:00 +0000
commitb334e22363d03fdf2127ad9d793976be3d61d543 (patch)
tree3944d33704c7a6cd7a9f50b2d58bb2c8ee657da9 /CarpetDev/CarpetIOF5
parent566b7961335f5ee5431d5a5073c7ba0a1bb79792 (diff)
CarpetIOF5: Further development.
Make it work with multiple grid patches. Break large file IOF5.cc into two, splitting off write.cc. Some cleanup. Introduce parameter "verbose". darcs-hash:20051203052823-dae7b-fa36f867e8050de2940ba7ee179685872eda0864.gz
Diffstat (limited to 'CarpetDev/CarpetIOF5')
-rw-r--r--CarpetDev/CarpetIOF5/param.ccl8
-rw-r--r--CarpetDev/CarpetIOF5/schedule.ccl6
-rw-r--r--CarpetDev/CarpetIOF5/src/IOF5.cc312
-rw-r--r--CarpetDev/CarpetIOF5/src/data_region.cc7
-rw-r--r--CarpetDev/CarpetIOF5/src/make.code.defn3
-rw-r--r--CarpetDev/CarpetIOF5/src/physical_quantity.cc4
-rw-r--r--CarpetDev/CarpetIOF5/src/timestep.cc2
-rw-r--r--CarpetDev/CarpetIOF5/src/write.cc284
-rw-r--r--CarpetDev/CarpetIOF5/src/write.hh56
9 files changed, 420 insertions, 262 deletions
diff --git a/CarpetDev/CarpetIOF5/param.ccl b/CarpetDev/CarpetIOF5/param.ccl
index 1fae1f165..36663f2bf 100644
--- a/CarpetDev/CarpetIOF5/param.ccl
+++ b/CarpetDev/CarpetIOF5/param.ccl
@@ -1,5 +1,13 @@
# Parameter definitions for thorn CarpetIOF5
+BOOLEAN verbose "Produce screen output while running"
+{
+} no
+
+BOOLEAN veryverbose "Produce much screen output while running"
+{
+} no
+
SHARES: IO
USES STRING out_dir AS IO_out_dir
diff --git a/CarpetDev/CarpetIOF5/schedule.ccl b/CarpetDev/CarpetIOF5/schedule.ccl
index 91f484a74..3f6209662 100644
--- a/CarpetDev/CarpetIOF5/schedule.ccl
+++ b/CarpetDev/CarpetIOF5/schedule.ccl
@@ -6,3 +6,9 @@ SCHEDULE CarpetIOF5_Startup AT startup AFTER IOUtil_Startup
{
LANG: C
} "Startup routine"
+
+SCHEDULE CarpetIOF5_Init AT basegrid
+{
+ LANG: C
+ OPTIONS: global
+} "Initialisation routine"
diff --git a/CarpetDev/CarpetIOF5/src/IOF5.cc b/CarpetDev/CarpetIOF5/src/IOF5.cc
index 3833c1375..4c0fbf78c 100644
--- a/CarpetDev/CarpetIOF5/src/IOF5.cc
+++ b/CarpetDev/CarpetIOF5/src/IOF5.cc
@@ -13,16 +13,10 @@
#include "carpet.hh"
-#include "coordinate_system.hh"
-#include "data_region.hh"
#include "extending.hh"
#include "file.hh"
-#include "physical_quantity.hh"
-#include "simulation.hh"
-#include "tensor_component.hh"
-#include "timestep.hh"
-#include "topology.hh"
#include "utils.hh"
+#include "write.hh"
@@ -50,6 +44,9 @@ namespace CarpetIOF5 {
int const convlevel,
cGH * const cctkGH);
+ extern "C" void
+ CarpetIOF5_Init (CCTK_ARGUMENTS);
+
static int
@@ -60,6 +57,9 @@ namespace CarpetIOF5 {
char const * options,
void * ptr);
+ static int
+ base_10_digits (int number);
+
static int
@@ -79,33 +79,6 @@ namespace CarpetIOF5 {
char const * varname,
char const * alias);
- static void
- write_one_mglevel (cGH const * cctkGH,
- F5::timestep_t & timestep,
- int group,
- int variable);
-
- static void
- write_global (cGH const * cctkGH,
- F5::simulation_t & simulation,
- int group,
- int variable);
-
- static void
- write_one_reflevel (cGH const * cctkGH,
- F5::simulation_t & simulation,
- int group,
- int variable);
-
- static void
- write_one_map (cGH const * cctkGH,
- F5::tensor_component_t & tensor_component,
- int group);
-
- static void
- write_one_component (cGH const * cctkGH,
- F5::tensor_component_t & tensor_component);
-
static void
@@ -116,7 +89,9 @@ namespace CarpetIOF5 {
int
CarpetIOF5_Startup ()
{
- CCTK_INFO ("Startup");
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose) CCTK_INFO ("Startup");
return extending_t::create (Setup);
}
@@ -127,14 +102,31 @@ namespace CarpetIOF5 {
int const convlevel,
cGH * const cctkGH)
{
+ DECLARE_CCTK_PARAMETERS;
+
assert (fleshconfig != 0);
- CCTK_INFO ("Setup");
+ if (verbose) CCTK_INFO ("Setup");
return extending_t::setup
(cctkGH, OutputGH, TimeToOutput, TriggerOutput, OutputVarAs);
}
+ void
+ CarpetIOF5_Init (CCTK_ARGUMENTS)
+ {
+ DECLARE_CCTK_ARGUMENTS;
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose) CCTK_INFO ("Init");
+
+ * next_output_iteration = 0;
+ * next_output_time = cctk_time;
+ * this_iteration = -1;
+ }
+
+
+
int
OutputGH (cGH const * const cctkGH)
{
@@ -142,7 +134,7 @@ namespace CarpetIOF5 {
assert (cctkGH != 0);
- CCTK_INFO ("OutputGH");
+ if (verbose) CCTK_INFO ("OutputGH");
int ierr;
@@ -189,6 +181,21 @@ namespace CarpetIOF5 {
int
+ base_10_digits (int number)
+ {
+ number = abs (number);
+ int digits = 1;
+ while (number >= 10)
+ {
+ number /= 10;
+ ++ digits;
+ }
+ return digits;
+ }
+
+
+
+ int
TimeToOutput (cGH const * const cctkGH,
int const variable)
{
@@ -200,6 +207,7 @@ namespace CarpetIOF5 {
assert (Carpet::is_level_mode());
+ if (verbose)
{
char * const fullname = CCTK_FullName(variable);
CCTK_VInfo (CCTK_THORNSTRING, "TimeToOutput \"%s\"", fullname);
@@ -310,7 +318,7 @@ namespace CarpetIOF5 {
(Carpet::mglevel, Carpet::reflevel, variable, cctk_iteration);
}
}
-
+
return should_output;
}
@@ -325,6 +333,7 @@ namespace CarpetIOF5 {
assert (cctkGH != 0);
assert (variable >= 0 and variable < CCTK_NumVars());
+ if (verbose)
{
char * const fullname = CCTK_FullName(variable);
CCTK_VInfo (CCTK_THORNSTRING, "TriggerOutput \"%s\"", fullname);
@@ -354,8 +363,11 @@ namespace CarpetIOF5 {
assert (varname != 0);
assert (alias != 0);
- CCTK_VInfo (CCTK_THORNSTRING, "OutputVarAs \"%s\" \"%s\"",
- varname, alias);
+ if (verbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING, "OutputVarAs \"%s\" \"%s\"",
+ varname, alias);
+ }
int const variable = CCTK_VarIndex (varname);
if (variable < 0)
@@ -376,8 +388,7 @@ namespace CarpetIOF5 {
ostringstream filenamebuf;
bool const use_IO_out_dir = strcmp (out_dir, "") == 0;
- int const maxval = CCTK_nProcs (cctkGH);
- int const digits = 1 + int (floor (log (double (maxval)) / log (10.0)));
+ int const digits = base_10_digits (CCTK_nProcs (cctkGH) - 1);
filenamebuf << (use_IO_out_dir ? IO_out_dir : out_dir)
<< "/"
<< alias
@@ -393,21 +404,7 @@ namespace CarpetIOF5 {
F5::file_t file (cctkGH, filename, do_truncate);
- F5::timestep_t timestep (file, cctkGH->cctk_time);
-
- if (Carpet::is_meta_mode())
- {
- for (Carpet::mglevel_iterator mglevel_iter (cctkGH);
- ! mglevel_iter.done();
- mglevel_iter.step())
- {
- write_one_mglevel (cctkGH, timestep, group, variable);
- }
- }
- else
- {
- write_one_mglevel (cctkGH, timestep, group, variable);
- }
+ write::write_meta (cctkGH, file, group, variable);
return Error_none;
}
@@ -415,207 +412,6 @@ namespace CarpetIOF5 {
void
- write_one_mglevel (cGH const * const cctkGH,
- F5::timestep_t & timestep,
- int const group,
- int const variable)
- {
- CCTK_VInfo (CCTK_THORNSTRING,
- "OutputVarAs/write_one_mglevel mglevel=%d", Carpet::mglevel);
-
- ostringstream namebuf;
- namebuf << "convlevel=" << 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_GroupTypeI (group);
- assert (grouptype >= 0);
- switch (grouptype)
- {
- case CCTK_ARRAY:
- case CCTK_SCALAR:
- {
- if (Carpet::do_global_mode)
- {
- write_global (cctkGH, simulation, group, variable);
- }
- }
- break;
- case CCTK_GF:
- {
- if (Carpet::is_global_mode())
- {
- for (Carpet::reflevel_iterator reflevel_iter (cctkGH);
- ! reflevel_iter.done();
- reflevel_iter.step())
- {
- write_one_reflevel (cctkGH, simulation, group, variable);
- }
- }
- else
- {
- write_one_reflevel (cctkGH, simulation, group, variable);
- }
- }
- break;
- default:
- assert (0);
- }
- }
-
-
-
- void
- write_global (cGH const * const cctkGH,
- F5::simulation_t & simulation,
- int const group,
- int const variable)
- {
- CCTK_INFO ("OutputVarAs/write_global");
-
- F5::unigrid_topology_t topology (simulation);
-
- int const grouptype = CCTK_GroupTypeI (group);
- 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);
-
- F5::physical_quantity_t physical_quantity (coordinate_system, group);
-
- F5::tensor_component_t tensor_component (physical_quantity, variable);
-
- int const myproc = CCTK_MyProc (cctkGH);
- dh * const dd = Carpet::arrdata.at(group).at(0).dd;
- bbox<int, dim> const & region
- = dd->boxes.at(Carpet::mglevel).at(0).at(myproc).exterior;
-
- F5::data_region_t data_region (tensor_component, region);
-
- void const * const varptr = CCTK_VarDataPtrI (cctkGH, 0, variable);
- assert (varptr != 0);
- int const vartype = CCTK_VarTypeI (variable);
- assert (vartype >= 0);
- data_region.write (varptr, vartype);
- }
-
-
-
- void
- write_one_reflevel (cGH const * const cctkGH,
- F5::simulation_t & simulation,
- int const group,
- int const variable)
- {
- CCTK_VInfo (CCTK_THORNSTRING,
- "OutputVarAs/write_one_reflevel reflevel=%d",
- Carpet::reflevel);
-
- int const grouptype = CCTK_GroupTypeI (group);
- assert (grouptype >= 0);
- assert (grouptype == CCTK_GF);
-
- F5::mesh_refinement_topology_t topology
- (simulation, Carpet::reflevel, Carpet::maxreflevels,
- Carpet::spacereflevelfact, Carpet::maxspacereflevelfact);
-
- vect<CCTK_REAL, dim> level_origin, level_delta;
- for (int d=0; d<dim; ++d)
- {
- DECLARE_CCTK_ARGUMENTS;
- level_origin[d] = CCTK_ORIGIN_SPACE(d);
- level_delta[d] = CCTK_DELTA_SPACE(d);
- }
- F5::Cartesian_coordinate_system_t coordinate_system
- (topology, level_origin, level_delta);
-
- F5::physical_quantity_t physical_quantity (coordinate_system, group);
-
- F5::tensor_component_t tensor_component (physical_quantity, variable);
-
- if (Carpet::is_level_mode())
- {
- for (Carpet::map_iterator map_iter (cctkGH, grouptype);
- ! map_iter.done();
- map_iter.step())
- {
- write_one_map (cctkGH, tensor_component, group);
- }
- }
- else
- {
- write_one_map (cctkGH, tensor_component, group);
- }
- }
-
-
-
- void
- write_one_map (cGH const * const cctkGH,
- F5::tensor_component_t & tensor_component,
- int const group)
- {
- CCTK_VInfo (CCTK_THORNSTRING,
- "OutputVarAs/write_one_map map=%d", Carpet::map);
-
- if (Carpet::is_singlemap_mode())
- {
- int const grouptype = CCTK_GroupTypeI (group);
- assert (grouptype >= 0);
-
- for (Carpet::component_iterator component_iter (cctkGH, grouptype);
- ! component_iter.done();
- component_iter.step())
- {
- write_one_component (cctkGH, tensor_component);
- }
- }
- else
- {
- write_one_component (cctkGH, tensor_component);
- }
- }
-
-
-
- void
- write_one_component (cGH const * const cctkGH,
- F5::tensor_component_t & tensor_component)
- {
- CCTK_VInfo (CCTK_THORNSTRING,
- "OutputVarAs/write_one_component component=%d",
- Carpet::component);
-
- gh * const hh = Carpet::vhh.at(Carpet::map);
- if (hh->is_local (Carpet::reflevel, Carpet::component))
- {
- 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);
-
- F5::data_region_t data_region (tensor_component, region);
-
- int const variable = tensor_component.get_variable();
- void const * const varptr = CCTK_VarDataPtrI (cctkGH, 0, variable);
- assert (varptr != 0);
- int const vartype = CCTK_VarTypeI (variable);
- assert (vartype >= 0);
- data_region.write (varptr, vartype);
- }
- }
-
-
-
- void
WriteParameters (F5::file_t & file)
{
hid_t const parameter_group
diff --git a/CarpetDev/CarpetIOF5/src/data_region.cc b/CarpetDev/CarpetIOF5/src/data_region.cc
index d19700cc3..66f61e8cc 100644
--- a/CarpetDev/CarpetIOF5/src/data_region.cc
+++ b/CarpetDev/CarpetIOF5/src/data_region.cc
@@ -5,6 +5,8 @@
#include "cctk.h"
+#include "carpet.hh"
+
#include "data_region.hh"
#include "utils.hh"
@@ -27,7 +29,8 @@ namespace CarpetIOF5 {
assert (! region.empty());
ostringstream namebuf;
- namebuf << "region=" << m_region;
+ namebuf << "map=" << Carpet::map << " "
+ << "region=" << m_region;
string const namestr = namebuf.str();
char const * const name = namestr.c_str();
assert (name != 0);
@@ -44,7 +47,7 @@ namespace CarpetIOF5 {
= (region.shape() / region.stride()).reverse();
m_dataspace = H5Screate_simple (dim, & dims [0], & dims [0]);
assert (m_dataspace >= 0);
-
+
m_dataset
= H5Dcreate (m_tensor_component.get_hdf5_tensor_component(), name,
hdf5_datatype, m_dataspace, m_properties);
diff --git a/CarpetDev/CarpetIOF5/src/make.code.defn b/CarpetDev/CarpetIOF5/src/make.code.defn
index 05dce8360..40fab33c2 100644
--- a/CarpetDev/CarpetIOF5/src/make.code.defn
+++ b/CarpetDev/CarpetIOF5/src/make.code.defn
@@ -11,7 +11,8 @@ SRCS = IOF5.cc \
tensor_component.cc \
timestep.cc \
topology.cc \
- utils.cc
+ utils.cc \
+ write.cc
# Subdirectories containing source files
SUBDIRS =
diff --git a/CarpetDev/CarpetIOF5/src/physical_quantity.cc b/CarpetDev/CarpetIOF5/src/physical_quantity.cc
index fa5fa00d5..bd1ee4f7c 100644
--- a/CarpetDev/CarpetIOF5/src/physical_quantity.cc
+++ b/CarpetDev/CarpetIOF5/src/physical_quantity.cc
@@ -22,6 +22,10 @@ namespace CarpetIOF5 {
char * const name = CCTK_GroupName (group);
assert (name != 0);
+ for (char * p = name; * p; ++ p)
+ {
+ * p = static_cast<char> (tolower (* p));
+ }
m_hdf5_physical_quantity
= open_or_create_group (m_coordinate_system
diff --git a/CarpetDev/CarpetIOF5/src/timestep.cc b/CarpetDev/CarpetIOF5/src/timestep.cc
index 37d37cd20..746c2fd6f 100644
--- a/CarpetDev/CarpetIOF5/src/timestep.cc
+++ b/CarpetDev/CarpetIOF5/src/timestep.cc
@@ -42,7 +42,7 @@ namespace CarpetIOF5 {
{
// Create a string from the time without losing information
int const precision = numeric_limits<CCTK_REAL>::digits10 + 2;
- buf << setprecision (precision) << "T=" << time;
+ buf << setprecision (precision) << "t=" << time;
}
m_name = buf.str();
diff --git a/CarpetDev/CarpetIOF5/src/write.cc b/CarpetDev/CarpetIOF5/src/write.cc
new file mode 100644
index 000000000..bba4523f9
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/src/write.cc
@@ -0,0 +1,284 @@
+#include <sstream>
+
+#include "cctk.h"
+#include "cctk_Arguments.h"
+#include "cctk_Parameters.h"
+
+#include "carpet.hh"
+
+#include "data_region.hh"
+#include "file.hh"
+#include "simulation.hh"
+#include "tensor_component.hh"
+#include "timestep.hh"
+#include "topology.hh"
+#include "write.hh"
+
+
+
+namespace CarpetIOF5 {
+
+ namespace write {
+
+ void
+ write_meta (cGH const * const cctkGH,
+ F5::file_t & file,
+ int const group,
+ int const variable)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_meta");
+ }
+
+ F5::timestep_t timestep (file, cctkGH->cctk_time);
+
+ if (Carpet::is_meta_mode())
+ {
+ for (Carpet::mglevel_iterator mglevel_iter (cctkGH);
+ ! mglevel_iter.done();
+ mglevel_iter.step())
+ {
+ write_one_mglevel (cctkGH, timestep, group, variable);
+ }
+ }
+ else
+ {
+ write_one_mglevel (cctkGH, timestep, group, variable);
+ }
+ }
+
+
+
+ void
+ write_one_mglevel (cGH const * const cctkGH,
+ F5::timestep_t & timestep,
+ int const group,
+ int const variable)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_mglevel mglevel=%d",
+ Carpet::mglevel);
+ }
+
+ ostringstream namebuf;
+ namebuf << "convlevel=" << 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_GroupTypeI (group);
+ assert (grouptype >= 0);
+ switch (grouptype)
+ {
+ case CCTK_ARRAY:
+ case CCTK_SCALAR:
+ {
+ if (Carpet::do_global_mode)
+ {
+ write_global (cctkGH, simulation, group, variable);
+ }
+ }
+ break;
+ case CCTK_GF:
+ {
+ if (Carpet::is_global_mode())
+ {
+ for (Carpet::reflevel_iterator reflevel_iter (cctkGH);
+ ! reflevel_iter.done();
+ reflevel_iter.step())
+ {
+ write_one_reflevel (cctkGH, simulation, group, variable);
+ }
+ }
+ else
+ {
+ write_one_reflevel (cctkGH, simulation, group, variable);
+ }
+ }
+ break;
+ default:
+ assert (0);
+ }
+ }
+
+
+
+ void
+ write_global (cGH const * const cctkGH,
+ F5::simulation_t & simulation,
+ int const group,
+ int const variable)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_INFO ("OutputVarAs/write_global");
+ }
+
+ F5::unigrid_topology_t topology (simulation);
+
+ int const grouptype = CCTK_GroupTypeI (group);
+ 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);
+
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ F5::tensor_component_t tensor_component (physical_quantity, variable);
+
+ int const myproc = CCTK_MyProc (cctkGH);
+ dh * const dd = Carpet::arrdata.at(group).at(0).dd;
+ bbox<int, dim> const & region
+ = dd->boxes.at(Carpet::mglevel).at(0).at(myproc).exterior;
+
+ F5::data_region_t data_region (tensor_component, region);
+
+ void const * const varptr = CCTK_VarDataPtrI (cctkGH, 0, variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (variable);
+ assert (vartype >= 0);
+ data_region.write (varptr, vartype);
+ }
+
+
+
+ void
+ write_one_reflevel (cGH const * const cctkGH,
+ F5::simulation_t & simulation,
+ int const group,
+ int const variable)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_reflevel reflevel=%d",
+ Carpet::reflevel);
+ }
+
+ int const grouptype = CCTK_GroupTypeI (group);
+ assert (grouptype >= 0);
+ assert (grouptype == CCTK_GF);
+
+ F5::mesh_refinement_topology_t topology
+ (simulation, Carpet::reflevel, Carpet::maxreflevels,
+ Carpet::spacereflevelfact, Carpet::maxspacereflevelfact);
+
+ if (Carpet::is_level_mode())
+ {
+ for (Carpet::map_iterator map_iter (cctkGH, grouptype);
+ ! map_iter.done();
+ map_iter.step())
+ {
+ write_one_map (cctkGH, topology, group, variable);
+ }
+ }
+ else
+ {
+ write_one_map (cctkGH, topology, group, variable);
+ }
+ }
+
+
+
+ void
+ write_one_map (cGH const * const cctkGH,
+ F5::topology_t & topology,
+ int const group,
+ int const variable)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_map map=%d", Carpet::map);
+ }
+
+ vect<CCTK_REAL, dim> level_origin, level_delta;
+ for (int d=0; d<dim; ++d)
+ {
+ DECLARE_CCTK_ARGUMENTS;
+ level_origin[d] = CCTK_ORIGIN_SPACE(d);
+ level_delta[d] = CCTK_DELTA_SPACE(d);
+ }
+ F5::Cartesian_coordinate_system_t coordinate_system
+ (topology, level_origin, level_delta);
+
+ F5::physical_quantity_t physical_quantity (coordinate_system, group);
+
+ F5::tensor_component_t tensor_component (physical_quantity, variable);
+
+ if (Carpet::is_singlemap_mode())
+ {
+ int const grouptype = CCTK_GroupTypeI (group);
+ assert (grouptype >= 0);
+
+ for (Carpet::component_iterator component_iter (cctkGH, grouptype);
+ ! component_iter.done();
+ component_iter.step())
+ {
+ write_one_component (cctkGH, tensor_component);
+ }
+ }
+ else
+ {
+ write_one_component (cctkGH, tensor_component);
+ }
+ }
+
+
+
+ void
+ write_one_component (cGH const * const cctkGH,
+ F5::tensor_component_t & tensor_component)
+ {
+ DECLARE_CCTK_PARAMETERS;
+
+ if (verbose or veryverbose)
+ {
+ CCTK_VInfo (CCTK_THORNSTRING,
+ "OutputVarAs/write_one_component component=%d",
+ Carpet::component);
+ }
+
+ gh * const hh = Carpet::vhh.at(Carpet::map);
+ if (hh->is_local (Carpet::reflevel, Carpet::component))
+ {
+ 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);
+
+ F5::data_region_t data_region (tensor_component, region);
+
+ int const variable = tensor_component.get_variable();
+ void const * const varptr = CCTK_VarDataPtrI (cctkGH, 0, variable);
+ assert (varptr != 0);
+ int const vartype = CCTK_VarTypeI (variable);
+ assert (vartype >= 0);
+ data_region.write (varptr, vartype);
+ }
+ }
+
+ } // namespace write
+
+} // namespace CarpetIOF5
diff --git a/CarpetDev/CarpetIOF5/src/write.hh b/CarpetDev/CarpetIOF5/src/write.hh
new file mode 100644
index 000000000..08a45ef9b
--- /dev/null
+++ b/CarpetDev/CarpetIOF5/src/write.hh
@@ -0,0 +1,56 @@
+#ifndef WRITE_HH
+#define WRITE_HH
+
+#include "cctk.h"
+
+#include "file.hh"
+#include "simulation.hh"
+#include "tensor_component.hh"
+#include "timestep.hh"
+#include "topology.hh"
+
+
+
+namespace CarpetIOF5 {
+
+ namespace write {
+
+ void
+ write_meta (cGH const * cctkGH,
+ F5::file_t & file,
+ int group,
+ int variable);
+
+ void
+ write_one_mglevel (cGH const * cctkGH,
+ F5::timestep_t & timestep,
+ int group,
+ int variable);
+
+ void
+ write_global (cGH const * cctkGH,
+ F5::simulation_t & simulation,
+ int group,
+ int variable);
+
+ void
+ write_one_reflevel (cGH const * cctkGH,
+ F5::simulation_t & simulation,
+ int group,
+ int variable);
+
+ void
+ write_one_map (cGH const * cctkGH,
+ F5::topology_t & topology,
+ int group,
+ int variable);
+
+ void
+ write_one_component (cGH const * cctkGH,
+ F5::tensor_component_t & tensor_component);
+
+ } // namespace write
+
+} // namespace CarpetIOF5
+
+#endif // #ifndef WRITE_HH