From b334e22363d03fdf2127ad9d793976be3d61d543 Mon Sep 17 00:00:00 2001 From: Erik Schnetter Date: Sat, 3 Dec 2005 05:28:00 +0000 Subject: 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 --- CarpetDev/CarpetIOF5/param.ccl | 8 + CarpetDev/CarpetIOF5/schedule.ccl | 6 + CarpetDev/CarpetIOF5/src/IOF5.cc | 312 +++++--------------------- CarpetDev/CarpetIOF5/src/data_region.cc | 7 +- CarpetDev/CarpetIOF5/src/make.code.defn | 3 +- CarpetDev/CarpetIOF5/src/physical_quantity.cc | 4 + CarpetDev/CarpetIOF5/src/timestep.cc | 2 +- CarpetDev/CarpetIOF5/src/write.cc | 284 +++++++++++++++++++++++ CarpetDev/CarpetIOF5/src/write.hh | 56 +++++ 9 files changed, 420 insertions(+), 262 deletions(-) create mode 100644 CarpetDev/CarpetIOF5/src/write.cc create mode 100644 CarpetDev/CarpetIOF5/src/write.hh (limited to 'CarpetDev') 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; @@ -188,6 +180,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,228 +404,13 @@ 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; } - 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 level_origin, level_delta; - for (int d=0; d 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 level_origin, level_delta; - for (int d=0; d= 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 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) { 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 (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::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 + +#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 level_origin, level_delta; + for (int d=0; d 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 level_origin, level_delta; + for (int d=0; d= 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 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 -- cgit v1.2.3