diff options
Diffstat (limited to 'CarpetDev/CarpetIOF5/src/writer.cc')
-rw-r--r-- | CarpetDev/CarpetIOF5/src/writer.cc | 245 |
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; |