aboutsummaryrefslogtreecommitdiff
path: root/CarpetDev/CarpetIOF5/src/util.cc
diff options
context:
space:
mode:
Diffstat (limited to 'CarpetDev/CarpetIOF5/src/util.cc')
-rw-r--r--CarpetDev/CarpetIOF5/src/util.cc221
1 files changed, 220 insertions, 1 deletions
diff --git a/CarpetDev/CarpetIOF5/src/util.cc b/CarpetDev/CarpetIOF5/src/util.cc
index 3d924e775..b2ef6fae2 100644
--- a/CarpetDev/CarpetIOF5/src/util.cc
+++ b/CarpetDev/CarpetIOF5/src/util.cc
@@ -381,7 +381,7 @@ namespace CarpetIOF5 {
- char const *const grid_structure = "Grid Structure v5";
+ char const *const grid_structure = "Grid Structure v6";
string
serialise_grid_structure(cGH const *const cctkGH)
@@ -398,14 +398,233 @@ namespace CarpetIOF5 {
buf << "regions:" << vhh.AT(m)->regions.AT(0) << ",";
buf << "ghost_widths:" << vdd.AT(m)->ghost_widths << ",";
buf << "buffer_widths:" << vdd.AT(m)->buffer_widths << ",";
+ buf << "overlap_widths:" << vdd.AT(m)->overlap_widths << ",";
buf << "prolongation_orders_space:"
<< vdd.AT(m)->prolongation_orders_space << ",";
buf << "},";
}
buf << "],";
+ buf << "global_time:" << global_time << ",";
+ buf << "delta_time:" << delta_time << ",";
buf << "times:" << *tt << ",";
buf << "}.";
return buf.str();
}
+ void
+ deserialise_grid_structure(cGH const *const cctkGH, string const str)
+ {
+ // Define variables for the metadata that will be read in
+ int const my_maps = maps;
+ vector<gh::rregs> my_superregions(my_maps);
+ vector<gh::rregs> my_regions(my_maps);
+ vector<vector<i2vect> > my_ghost_widths(my_maps);
+ vector<vector<i2vect> > my_buffer_widths(my_maps);
+ vector<vector<i2vect> > my_overlap_widths(my_maps);
+ vector<int> my_prolongation_orders_space(my_maps);
+ CCTK_REAL my_global_time, my_delta_time;
+ th my_tt(tt->h, tt->time_interpolation_during_regridding);
+
+ // Read in the metadata
+ istringstream is(str);
+ skipws(is);
+ consume(is, grid_structure);
+ skipws(is);
+ consume(is, "{");
+ skipws(is);
+ consume(is, "maps");
+ skipws(is);
+ consume(is, '=');
+ skipws(is);
+ consume(is, '[');
+ for (int m=0; m<my_maps; ++m) {
+ skipws(is);
+ consume(is, "[");
+ int my_m;
+ is >> my_m;
+ assert(my_m == m);
+ skipws(is);
+ consume(is, ']');
+ skipws(is);
+ consume(is, '=');
+ skipws(is);
+ consume(is, '{');
+ skipws(is);
+ consume(is, "superregions:");
+ skipws(is);
+ is >> my_superregions.AT(m);
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "regions:");
+ skipws(is);
+ // ignore region specification
+ // is >> my_regions.AT(m);
+ gh::rregs tmp_regions;
+ is >> tmp_regions;
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "ghost_widths:");
+ skipws(is);
+ is >> my_ghost_widths.AT(m);
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "buffer_widths:");
+ skipws(is);
+ is >> my_buffer_widths.AT(m);
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "overlap_widths:");
+ skipws(is);
+ is >> my_overlap_widths.AT(m);
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "prolongation_orders_space:");
+ skipws(is);
+ is >> my_prolongation_orders_space.AT(m);
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, '}');
+ skipws(is);
+ consume(is, ',');
+ }
+ skipws(is);
+ consume(is, ']');
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "global_time:");
+ is >> my_global_time;
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "delta_time:");
+ is >> my_delta_time;
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, "times:");
+ is >> my_tt;
+ skipws(is);
+ consume(is, ',');
+ skipws(is);
+ consume(is, '}');
+ skipws(is);
+ consume(is, '.');
+
+ // Change Carpet's grid structure according to what has just been
+ // read
+ {
+ int type;
+ void const *const ptr =
+ CCTK_ParameterGet("regrid_in_level_mode", "Carpet", & type);
+ assert(ptr);
+ assert(type == PARAMETER_BOOLEAN);
+ CCTK_INT const regrid_in_level_mode = *static_cast<CCTK_INT const*>(ptr);
+ assert(regrid_in_level_mode);
+ }
+
+ // Count refinement levels
+ vector<int> rls(maps);
+ for (int m=0; m<maps; ++m) {
+ rls.AT(m) = my_superregions.AT(m).size();
+ }
+ int maxrl = 0;
+ for (int m=0; m<maps; ++m) {
+ maxrl = max(maxrl, rls.AT(m));
+ }
+ // All maps must have the same number of refinement levels
+ for (int m=0; m<maps; ++m) {
+ my_superregions.AT(m).resize(maxrl);
+ my_regions.AT(m).resize(maxrl);
+ }
+
+ // Make multiprocessor aware
+ for (int rl=0; rl<maxrl; ++rl) {
+ vector<gh::cregs> superregss(maps);
+ for (int m=0; m<maps; ++m) {
+ superregss.AT(m) = my_superregions.AT(m).AT(rl);
+ }
+ vector<gh::cregs> regss(maps);
+ Carpet::SplitRegionsMaps(cctkGH, superregss, regss);
+ for (int m=0; m<maps; ++m) {
+ my_superregions.AT(m).AT(rl) = superregss.AT(m);
+ my_regions.AT(m).AT(rl) = regss.AT(m);
+ }
+ } // for rl
+
+ // Make multigrid aware
+ vector<gh::mregs> my_multigrid_regions(maps);
+ Carpet::MakeMultigridBoxesMaps(cctkGH, my_regions, my_multigrid_regions);
+
+ // Regrid (ignoring the previous content of the grid hierarchy)
+ for (int m=0; m<maps; ++m) {
+ RegridMap
+ (cctkGH, m, my_superregions.AT(m), my_multigrid_regions.AT(m), false);
+ } // for m
+
+ // Set up time hierarchy after RegridMap created it
+ for (int ml=0; ml<vhh.AT(0)->mglevels(); ++ ml) {
+ for (int rl=0; rl<vhh.AT(0)->reflevels(); ++ rl) {
+ for (int tl=0; tl<tt->timelevels; ++ tl) {
+ tt->set_time(ml, rl, tl, my_tt.get_time(ml, rl, tl));
+ }
+ tt->set_delta(ml, rl, my_tt.get_delta(ml, rl));
+ }
+ }
+
+ PostRegrid(cctkGH);
+
+ // Ensure we are in global mode
+ assert(is_global_mode());
+ global_time = my_global_time;
+ (const_cast<cGH*>(cctkGH))->cctk_time = global_time;
+ delta_time = my_delta_time;
+ timereflevelfact = timereffacts.AT(reflevels - 1);
+ spacereflevelfact = ivect(-get_deadbeef());
+ ivect::ref(cctkGH->cctk_levfac) = spacereflevelfact;
+ (const_cast<cGH*>(cctkGH))->cctk_timefac = timereflevelfact;
+
+ // Recompose the grid structure (ignoring the previous content of
+ // the grid hierarchy)
+ for (int rl=0; rl<reflevels; ++rl) {
+ Recompose(cctkGH, rl, false);
+ }
+
+ // Free old grid structure
+ RegridFree(cctkGH, false);
+
+ // Check ghost and buffer widths and prolongation orders
+ // TODO: Instead of only checking them, set them during
+ // regridding; this requires setting them during regridding
+ // instead of during setup.
+ for (int m=0; m<maps; ++m) {
+ assert(vdd.AT(m)->ghost_widths.size() == my_ghost_widths.AT(m).size());
+ for (int rl=0; rl<int(my_ghost_widths.AT(m).size()); ++rl) {
+ assert(all(all(vdd.AT(m)->ghost_widths.AT(rl) ==
+ my_ghost_widths.AT(m).AT(rl))));
+ }
+ assert(vdd.AT(m)->buffer_widths.size() == my_buffer_widths.AT(m).size());
+ for (int rl=0; rl<int(my_buffer_widths.AT(m).size()); ++rl) {
+ assert(all(all(vdd.AT(m)->buffer_widths.AT(rl) ==
+ my_buffer_widths.AT(m).AT(rl))));
+ }
+ assert(vdd.AT(m)->overlap_widths.size() ==
+ my_overlap_widths.AT(m).size());
+ for (int rl=0; rl<int(my_overlap_widths.AT(m).size()); ++rl) {
+ assert(all(all(vdd.AT(m)->overlap_widths.AT(rl) ==
+ my_overlap_widths.AT(m).AT(rl))));
+ }
+ for (int rl=0; rl<int(my_prolongation_orders_space.size()); ++rl) {
+ assert(vdd.AT(m)->prolongation_orders_space.AT(rl) ==
+ my_prolongation_orders_space.AT(rl));
+ }
+ }
+ }
+
} // end namespace CarpetIOF5