diff options
Diffstat (limited to 'Carpet/Carpet/src/SetupGH.cc')
-rw-r--r-- | Carpet/Carpet/src/SetupGH.cc | 184 |
1 files changed, 86 insertions, 98 deletions
diff --git a/Carpet/Carpet/src/SetupGH.cc b/Carpet/Carpet/src/SetupGH.cc index 929b35faf..98b36d0ba 100644 --- a/Carpet/Carpet/src/SetupGH.cc +++ b/Carpet/Carpet/src/SetupGH.cc @@ -19,6 +19,7 @@ #include <dist.hh> #include <ggf.hh> #include <gh.hh> +#include <region.hh> #include <vect.hh> #include "carpet.hh" @@ -44,8 +45,7 @@ namespace Carpet { static void setup_grid_hierarchy (cGH const * cctkGH); static void set_base_extent (int m, - vector<vector<ibbox> > & bbss, - vector<vector<bbvect> > & obss); + vector<vector<region_t> > & regss); static void allocate_group_data (cGH const * cctkGH); static void @@ -93,11 +93,9 @@ namespace Carpet { ivect & npoints); static void find_processor_decomposition - (cGH const * const cctkGH, - vector<vector<vector<ibbox> > > & bbsss, - vector<vector<vector<bbvect> > > & obsss, - vector<vector<vector<int> > > & psss, - vector<vector<vector<vector<ibbox> > > > & bbssss); + (cGH const * cctkGH, + vector<vector<vector<region_t> > > & regsss, + vector<vector<vector<vector<region_t> > > > & regssss); static void get_group_size (int group, cGroup const & gdata, @@ -241,7 +239,7 @@ namespace Carpet { // Calculate them from the default refinement factor spacereffacts.resize (maxreflevels); for (int n=0; n<maxreflevels; ++n) { - spacereffacts.at(n) = ivect (ipow ((int)refinement_factor, n)); + spacereffacts.at(n) = ivect (ipow (int(refinement_factor), n)); } } else { // Read them from the parameter @@ -254,7 +252,7 @@ namespace Carpet { } } // TODO: turn these into real error messages - assert ((int)spacereffacts.size() >= maxreflevels); + assert (int(spacereffacts.size()) >= maxreflevels); assert (all (spacereffacts.front() == 1)); for (int n=1; n<maxreflevels; ++n) { assert (all (spacereffacts.at(n) >= spacereffacts.at(n-1))); @@ -266,7 +264,7 @@ namespace Carpet { // Calculate them from the default refinement factor timereffacts.resize (maxreflevels); for (int n=0; n<maxreflevels; ++n) { - timereffacts.at(n) = ipow ((int)refinement_factor, n); + timereffacts.at(n) = ipow (int(refinement_factor), n); } } else { // Read them from the parameter @@ -278,7 +276,7 @@ namespace Carpet { } } // TODO: turn these into real error messages - assert ((int)timereffacts.size() >= maxreflevels); + assert (int(timereffacts.size()) >= maxreflevels); assert (timereffacts.front() == 1); for (int n=1; n<maxreflevels; ++n) { assert (timereffacts.at(n) >= timereffacts.at(n-1)); @@ -462,37 +460,28 @@ namespace Carpet { { DECLARE_CCTK_PARAMETERS; - // bbssss[m][rl][c][ml] - // bbsss [m][rl][c] - // obsss [m][rl][c] - // psss [m][rl][c] - - vector<vector<vector<ibbox > > > bbsss (maps); - vector<vector<vector<bbvect> > > obsss (maps); - + vector<vector<vector<region_t> > > regsss (maps); for (int m=0; m<maps; ++m) { - set_base_extent (m, bbsss.at(m), obsss.at(m)); + set_base_extent (m, regsss.at(m)); } - vector<vector<vector<int> > > psss (maps); - vector<vector<vector<vector<ibbox> > > > bbssss (maps); - - find_processor_decomposition (cctkGH, bbsss, obsss, psss, bbssss); + vector<vector<vector<vector<region_t> > > > regssss; + find_processor_decomposition (cctkGH, regsss, regssss); for (int m=0; m<maps; ++m) { // Check the regions - CheckRegions (bbssss.at(m), obsss.at(m), psss.at(m)); + CheckRegions (regssss.at(m)); #if 0 // Do this later because CactusBase/IO might not yet be // initialised // Write grid structure to file - OutputGridStructure (cctkGH, m, bbssss.at(m), obsss.at(m), psss.at(m)); + OutputGridStructure (cctkGH, m, regssss.at(m)); #endif // Recompose grid hierarchy - vhh.at(m)->regrid (bbssss.at(m), obsss.at(m), psss.at(m)); + vhh.at(m)->regrid (regssss.at(m)); int const rl = 0; vhh.at(m)->recompose (rl, false); @@ -503,8 +492,9 @@ namespace Carpet { int const rl = 0; for (int m=0; m<maps; ++m) { for (int c=0; c<vhh.at(m)->components(rl); ++c) { - ivect const lower = vhh.at(m)->extents().at(ml).at(rl).at(c).lower(); - ivect const upper = vhh.at(m)->extents().at(ml).at(rl).at(c).upper(); + ibbox const ext = vhh.at(m)->extent(ml,rl,c); + ivect const lower = ext.lower(); + ivect const upper = ext.upper(); int const convfact = ipow(mgfact, ml); assert (all(lower % maxspacereflevelfact == 0)); assert (all(upper % maxspacereflevelfact == 0)); @@ -512,7 +502,7 @@ namespace Carpet { cout << " [" << ml << "][" << rl << "][" << m << "][" << c << "]" << " exterior: " << "proc " - << vhh.at(m)->processors().at(rl).at(c) + << vhh.at(m)->processor(rl,c) << " " << lower / maxspacereflevelfact << " : " @@ -535,47 +525,59 @@ namespace Carpet { void set_base_extent (int const m, - vector<vector<ibbox> > & bbss, - vector<vector<bbvect> > & obss) + vector<vector<region_t> > & regss) { DECLARE_CCTK_PARAMETERS; // Create one refinement level int const rl = 0; - bbss.resize(1); - obss.resize(1); - vector<ibbox> & bbs = bbss.at(rl); - vector<bbvect> & obs = obss.at(rl); + regss.resize(1); + vector<region_t> & regs = regss.at(rl); if (CCTK_EQUALS (base_extents, "")) { // Default: one grid component covering everything - bbs.push_back (vhh.at(m)->baseextent); - obs.push_back (bbvect(true)); + region_t reg; + reg.extent = vhh.at(m)->baseextent; + reg.outer_boundaries = b2vect (bvect (true)); + reg.refinement_boundaries = b2vect (bvect (false)); + reg.map = m; + regs.push_back (reg); } else { // Read explicit grid components // TODO: invent something for the other convergence levels + vector<ibbox> exts; istringstream ext_str (base_extents); try { - ext_str >> bbs; + ext_str >> exts; } catch (input_error) { CCTK_WARN (0, "Could not parse parameter \"base_extents\""); } CCTK_VInfo (CCTK_THORNSTRING, - "Using %d grid components", (int)bbs.size()); - if (bbs.size() == 0) { + "Using %d grid components", int(exts.size())); + if (exts.size() == 0) { CCTK_WARN (0, "Cannot evolve with zero grid components"); } + vector<bbvect> obs; istringstream ob_str (base_outerbounds); try { ob_str >> obs; } catch (input_error) { CCTK_WARN (0, "Could not parse parameter \"base_outerbounds\""); } - assert (obs.size() == bbs.size()); + assert (obs.size() == exts.size()); + + for (size_t n=0; n<exts.size(); ++n) { + region_t reg; + reg.extent = exts.at(n); + reg.outer_boundaries = xpose(obs.at(n)); + reg.refinement_boundaries = b2vect(bvect(false)); + reg.map = m; + regs.push_back (reg); + } } } @@ -711,22 +713,22 @@ namespace Carpet { ivect const & convoffsets) { // Set refinement structure for scalars and arrays - vector<ibbox> bbs(1); - vector<bbvect> obs(1); + vector<region_t> regs(1); int const m=0; - bbs.at(0) = arrdata.at(group).at(m).hh->baseextent; - obs.at(0) = bbvect(true); + regs.at(0).extent = arrdata.at(group).at(m).hh->baseextent; + regs.at(0).outer_boundaries = b2vect(true); + regs.at(0).refinement_boundaries = b2vect(false); + regs.at(m).map = m; // Split it into components, one for each processor - vector<int> ps; switch (gdata.disttype) { case CCTK_DISTRIB_DEFAULT: { - SplitRegions_Automatic (cctkGH, bbs, obs, ps); + SplitRegions_Automatic (cctkGH, regs); break; } case CCTK_DISTRIB_CONSTANT: { int const d = gdata.dim==0 ? 0 : gdata.dim-1; - SplitRegions_AlongDir (cctkGH, bbs, obs, ps, d); + SplitRegions_AlongDir (cctkGH, regs, d); break; } default: @@ -734,45 +736,42 @@ namespace Carpet { } // Only one refinement level - vector<vector<ibbox> > bbss(1); - vector<vector<bbvect> > obss(1); - vector<vector<int> > pss(1); - bbss.at(0) = bbs; - obss.at(0) = obs; - pss.at(0) = ps; + vector<vector<region_t> > regss(1); + regss.at(0) = regs; // Create all multigrid levels - vector<vector<vector<ibbox> > > bbsss (mglevels); + vector<vector<vector<region_t> > > regsss (mglevels); ivect mgfact1; - iivect offset; + i2vect offset; for (int d=0; d<dim; ++d) { mgfact1[d] = ipow (mgfact, convpowers[d]); - offset[d][0] = 0; - offset[d][1] = convoffsets[d]; + offset[0][d] = 0; + offset[1][d] = convoffsets[d]; } - bbsss.at(0) = bbss; - + regsss.at(0) = regss; + for (int ml=1; ml<mglevels; ++ml) { int const rl = 0; - for (int c=0; c<(int)bbss.at(rl).size(); ++c) { + for (int c=0; c<int(regss.at(rl).size()); ++c) { // this base ivect const baselo = ivect(0); ivect const baselo1 = baselo; // next finer grid - ivect const flo = bbsss.at(ml-1).at(rl).at(c).lower(); - ivect const fhi = bbsss.at(ml-1).at(rl).at(c).upper(); - ivect const fstr = bbsss.at(ml-1).at(rl).at(c).stride(); + ivect const flo = regsss.at(ml-1).at(rl).at(c).extent.lower(); + ivect const fhi = regsss.at(ml-1).at(rl).at(c).extent.upper(); + ivect const fstr = regsss.at(ml-1).at(rl).at(c).extent.stride(); // this grid ivect const str = fstr * mgfact1; - ivect const lo = flo + xpose(obs.at(c))[0].ifthen - (+ (xpose(offset)[0] - mgfact1 * xpose(offset)[0]) * fstr, + ivect const lo = flo + regsss.at(ml-1).at(rl).at(c).outer_boundaries[0].ifthen + (+ (offset[0] - mgfact1 * offset[0]) * fstr, ivect(0)); - ivect const hi = fhi + xpose(obs.at(c))[1].ifthen - (- (xpose(offset)[1] - mgfact1 * xpose(offset)[1]) * fstr, + ivect const hi = fhi + regsss.at(ml-1).at(rl).at(c).outer_boundaries[1].ifthen + (- (offset[1] - mgfact1 * offset[1]) * fstr, ivect(0)); ivect const lo1 = baselo1 + (lo - baselo1 + str - 1) / str * str; ivect const hi1 = lo1 + (hi - lo1) / str * str; - bbsss.at(ml).at(rl).at(c) = ibbox(lo1, hi1, str); + regsss.at(ml).at(rl).at(c) = regsss.at(ml-1).at(rl).at(c); + regsss.at(ml).at(rl).at(c).extent = ibbox(lo1, hi1, str); } } @@ -781,7 +780,7 @@ namespace Carpet { char * const groupname = CCTK_GroupName (group); assert (groupname); Checkpoint ("Recomposing grid array group \"%s\"...", groupname); - arrdata.at(group).at(0).hh->regrid (bbsss, obss, pss); + arrdata.at(group).at(0).hh->regrid (regsss); arrdata.at(group).at(0).hh->recompose (0, false); Checkpoint ("Done recomposing grid array group \"%s\".", groupname); free (groupname); @@ -1168,7 +1167,7 @@ namespace Carpet { { CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "The domain size for map %d scaled for convergence level %d with convergence factor %d is not integer", - m, (int)basemglevel, (int)convergence_factor); + m, int(basemglevel), int(convergence_factor)); } // Sanity check @@ -1191,26 +1190,24 @@ namespace Carpet { void find_processor_decomposition (cGH const * const cctkGH, - vector<vector<vector<ibbox> > > & bbsss, - vector<vector<vector<bbvect> > > & obsss, - vector<vector<vector<int> > > & psss, - vector<vector<vector<vector<ibbox> > > > & bbssss) + vector<vector<vector<region_t> > > & regsss, + vector<vector<vector<vector<region_t> > > > & regssss) { DECLARE_CCTK_PARAMETERS; if (not regrid_in_level_mode) { // Distribute each map independently + assert (regssss.empty()); + regssss.resize (maps); for (int m=0; m<maps; ++m) { int const rl=0; - psss.at(m).resize(1); // Distribute onto the processors - SplitRegions - (cctkGH, bbsss.at(m).at(rl), obsss.at(m).at(rl), psss.at(m).at(rl)); + SplitRegions (cctkGH, regsss.at(m).at(rl)); // Create all multigrid levels - MakeMultigridBoxes (cctkGH, bbsss.at(m), obsss.at(m), bbssss.at(m)); + MakeMultigridBoxes (cctkGH, regsss.at(m), regssss.at(m)); } // for m } else { @@ -1218,28 +1215,19 @@ namespace Carpet { int const rl=0; + vector<vector<region_t> > regss(maps); for (int m=0; m<maps; ++m) { - psss.at(m).resize(1); - } - - vector<vector<ibbox> > bbss(maps); - vector<vector<bbvect> > obss(maps); - vector<vector<int> > pss(maps); - for (int m=0; m<maps; ++m) { - bbss.at(m) = bbsss.at(m).at(rl); - obss.at(m) = obsss.at(m).at(rl); + regss.at(m) = regsss.at(m).at(rl); } - SplitRegionsMaps (cctkGH, bbss, obss, pss); + SplitRegionsMaps (cctkGH, regss); for (int m=0; m<maps; ++m) { - bbsss.at(m).at(rl) = bbss.at(m); - obsss.at(m).at(rl) = obss.at(m); - psss.at(m).at(rl) = pss.at(m); + regsss.at(m).at(rl) = regss.at(m); } // Create all multigrid levels - MakeMultigridBoxesMaps (cctkGH, bbsss, obsss, bbssss); + MakeMultigridBoxesMaps (cctkGH, regsss, regssss); } // if } @@ -1302,7 +1290,7 @@ namespace Carpet { // Adapt array sizes for convergence level get_convergence_options (group, gdata, convpowers, convoffsets); - ivect baseconvpowers = convpowers * (int)basemglevel; + ivect baseconvpowers = convpowers * int(basemglevel); rvect real_sizes = (((rvect (sizes) - rvect (convoffsets)) @@ -1320,7 +1308,7 @@ namespace Carpet { char * const groupname = CCTK_GroupName (group); CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "The shape of group \"%s\" scaled for convergence level %d with convergence factor %d is negative", - groupname, (int)basemglevel, (int)convergence_factor); + groupname, int(basemglevel), int(convergence_factor)); free (groupname); } @@ -1328,7 +1316,7 @@ namespace Carpet { char * const groupname = CCTK_GroupName(group); CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "The shape of group \"%s\" scaled for convergence level %d with convergence factor %d is not integer", - groupname, (int)basemglevel, (int)convergence_factor); + groupname, int(basemglevel), int(convergence_factor)); free (groupname); } } @@ -1895,7 +1883,7 @@ namespace Carpet { if (any (min (lghosts, ughosts) < min_nghosts)) { CCTK_VWarn (0, __LINE__, __FILE__, CCTK_THORNSTRING, "There are not enough ghost zones for the desired spatial prolongation order on map %d. With Carpet::prolongation_order_space=%d, you need at least %d ghost zones.", - m, (int)prolongation_order_space, min_nghosts); + m, int(prolongation_order_space), min_nghosts); } } |