#include #include #include #include #include "cctk.h" #include "cctk_Parameters.h" #include "defs.hh" #include "dh.hh" #include "th.hh" #include "vect.hh" #include "gh.hh" using namespace std; // Constructors gh:: gh (vector const & reffacts_, centering const refcent_, int const mgfact_, centering const mgcent_, vector > const & baseextents_, i2vect const & boundary_width_) : reffacts(reffacts_), refcent(refcent_), mgfact(mgfact_), mgcent(mgcent_), baseextents(baseextents_), boundary_width(boundary_width_) { assert (reffacts.size() >= 1); assert (all (reffacts.front() == 1)); for (int rl = 1; rl < (int)reffacts.size(); ++ rl) { assert (all (reffacts.AT(rl) >= reffacts.AT(rl-1))); assert (all (reffacts.AT(rl) % reffacts.AT(rl-1) == 0)); } assert (refcent == vertex_centered or refcent == cell_centered); assert (mgfact >= 1); assert (mgcent == vertex_centered or mgcent == cell_centered); assert (baseextents.size() >= 1); assert (baseextents.AT(0).size() >= 1); assert (baseextents.AT(0).size() == reffacts.size()); for (int ml = 1; ml < (int)baseextents.size(); ++ ml) { assert (baseextents.AT(ml).size() == baseextents.AT(ml-1).size()); } for (int ml = 0; ml < (int)baseextents.size(); ++ ml) { for (int rl = 1; rl < (int)baseextents.AT(ml).size(); ++ rl) { ibbox const & cbox = baseextents.AT(ml).AT(rl-1); ibbox const & fbox = baseextents.AT(ml).AT(rl); assert (all (cbox.stride() * reffacts.AT(rl-1) == fbox.stride() * reffacts.AT(rl))); } } assert (all (all (boundary_width >= 0))); for (int ml = 0; ml < (int)baseextents.size(); ++ ml) { for (int rl = 0; rl < (int)baseextents.AT(ml).size(); ++ rl) { ibbox const & box = baseextents.AT(ml).AT(rl); // This condition must hold even for zero-sized grid arrays assert (all (box.shape() / box.stride() >= boundary_width[0] + boundary_width[1])); } } } // Destructors gh:: ~gh () { } // Modifiers void gh:: regrid (mregs const & regs) { DECLARE_CCTK_PARAMETERS; // Save the grid hierarchy oldregions.clear (); swap (oldregions, regions); regions = regs; // Consistency checks // Note: there may be zero refinement levels // Check multigrid consistency assert (mglevels()>0); for (int ml=1; ml0); for (int c=0; c::iterator t=ths.begin(); t!=ths.end(); ++t) { (*t)->regrid(); } for (list::iterator d=dhs.begin(); d!=dhs.end(); ++d) { (*d)->regrid(); } } bool gh:: recompose (int const rl, bool const do_prolongate) { // Handle changes in number of mglevels if (oldregions.size() != regions.size()) { oldregions.resize (regions.size()); } bool const do_recompose = level_did_change(rl); if (do_recompose) { // Recompose the other hierarchies for (list::iterator d=dhs.begin(); d!=dhs.end(); ++d) { (*d)->recompose (rl, do_prolongate); } // Overwrite old with new grid hierarchy for (int ml=0; ml=0 and rl= (int)oldregions.AT(ml).size()) return true; if (regions.AT(ml).AT(rl).size() != oldregions.AT(ml).AT(rl).size()) { return true; } for (int c=0; c::const_iterator d = dhs.begin(); d != dhs.end(); ++ d, isfirst = false) { if (not isfirst) os << ","; os << *d; } } os << "}"; return os; }