diff --git a/Src/EB/AMReX_EB2.H b/Src/EB/AMReX_EB2.H index a73bf5bdd3d..f76fc8ddafe 100644 --- a/Src/EB/AMReX_EB2.H +++ b/Src/EB/AMReX_EB2.H @@ -56,6 +56,7 @@ public: [[nodiscard]] virtual const Geometry& getGeometry (const Box& domain) const = 0; [[nodiscard]] virtual const Box& coarsestDomain () const = 0; virtual void addFineLevels (int num_new_fine_levels) = 0; + virtual void addRegularCoarseLevels (int num_new_coarse_levels) = 0; protected: static AMREX_EXPORT Vector > m_instance; @@ -88,6 +89,7 @@ public: return m_geom.back().Domain(); } void addFineLevels (int num_new_fine_levels) final; + void addRegularCoarseLevels (int num_new_coarse_levels) final; using F = typename G::FunctionType; @@ -147,6 +149,8 @@ int maxCoarseningLevel (IndexSpace const* ebis, const Geometry& geom); void addFineLevels (int num_new_fine_levels); +void addRegularCoarseLevels (int num_new_coarse_levels); + } #endif diff --git a/Src/EB/AMReX_EB2.cpp b/Src/EB/AMReX_EB2.cpp index fab107dabb7..8786da3c124 100644 --- a/Src/EB/AMReX_EB2.cpp +++ b/Src/EB/AMReX_EB2.cpp @@ -240,6 +240,14 @@ void addFineLevels (int num_new_fine_levels) } } +void addRegularCoarseLevels (int num_new_coarse_levels) +{ + auto *p = const_cast(TopIndexSpace()); + if (p) { + p->addRegularCoarseLevels(num_new_coarse_levels); + } +} + void BuildFromChkptFile (std::string const& fname, const Geometry& geom, int required_coarsening_level, diff --git a/Src/EB/AMReX_EB2_IndexSpaceI.H b/Src/EB/AMReX_EB2_IndexSpaceI.H index e7db810b03b..b7f4c9b6ea0 100644 --- a/Src/EB/AMReX_EB2_IndexSpaceI.H +++ b/Src/EB/AMReX_EB2_IndexSpaceI.H @@ -106,3 +106,45 @@ IndexSpaceImp::addFineLevels (int num_new_fine_levels) m_domain.insert(m_domain.begin(), fine_isp.m_domain.begin(), fine_isp.m_domain.end()); m_ngrow.insert(m_ngrow.begin(), fine_isp.m_ngrow.begin(), fine_isp.m_ngrow.end()); } + +template +void +IndexSpaceImp::addRegularCoarseLevels (int num_new_coarse_levels) +{ + if (num_new_coarse_levels <= 0) { return; } + + auto nlevs_old = int(m_gslevel.size()); + int nlevs_new = nlevs_old + num_new_coarse_levels; + + Vector> new_gslevel; + new_gslevel.reserve(nlevs_new); + + Vector new_geom; + new_geom.reserve(nlevs_new); + + Vector new_domain; + new_domain.reserve(nlevs_new); + + Vector new_ngrow; + new_ngrow.reserve(nlevs_new); + + for (int ilev = 0; ilev < num_new_coarse_levels; ++ilev) { + int rr = 1 << (num_new_coarse_levels-ilev); // 2^(num_new_coarse_levels-ilev) + new_geom.push_back(amrex::coarsen(m_geom[0], rr)); + new_domain.push_back(new_geom.back().Domain()); + new_ngrow.push_back(m_ngrow[0]); + new_gslevel.push_back(GShopLevel::makeAllRegular(this, new_geom.back())); + } + + for (int ilev = 0; ilev < nlevs_old; ++ilev) { + new_gslevel.emplace_back(std::move(m_gslevel[ilev])); + new_geom.push_back (m_geom [ilev]); + new_domain.push_back(m_domain[ilev]); + new_ngrow.push_back (m_ngrow [ilev]); + } + + std::swap(new_gslevel, m_gslevel); + std::swap(new_geom , m_geom); + std::swap(new_domain , m_domain); + std::swap(new_ngrow , m_ngrow); +} diff --git a/Src/EB/AMReX_EB2_IndexSpace_STL.H b/Src/EB/AMReX_EB2_IndexSpace_STL.H index 7ebaaeb7646..0c72d076ea2 100644 --- a/Src/EB/AMReX_EB2_IndexSpace_STL.H +++ b/Src/EB/AMReX_EB2_IndexSpace_STL.H @@ -34,6 +34,7 @@ public: return m_geom.back().Domain(); } void addFineLevels (int num_new_fine_levels) final; + void addRegularCoarseLevels (int num_new_coarse_levels) final; private: diff --git a/Src/EB/AMReX_EB2_IndexSpace_STL.cpp b/Src/EB/AMReX_EB2_IndexSpace_STL.cpp index 335b490ce48..662aaf14dd6 100644 --- a/Src/EB/AMReX_EB2_IndexSpace_STL.cpp +++ b/Src/EB/AMReX_EB2_IndexSpace_STL.cpp @@ -88,4 +88,10 @@ IndexSpaceSTL::addFineLevels (int /*num_new_fine_levels*/) amrex::Abort("IndexSpaceSTL::addFineLevels: todo"); } +void +IndexSpaceSTL::addRegularCoarseLevels (int /*num_new_coarse_levels*/) +{ + amrex::Abort("IndexSpaceSTL::addRegularCoarseLevels: todo"); +} + } diff --git a/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.H b/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.H index 2605118d3b2..cdac3efb7f2 100644 --- a/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.H +++ b/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.H @@ -33,6 +33,7 @@ public: return m_geom.back().Domain(); } void addFineLevels (int num_new_fine_levels) final; + void addRegularCoarseLevels (int num_new_coarse_levels) final; private: diff --git a/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.cpp b/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.cpp index 68688c5aab8..cd811d73688 100644 --- a/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.cpp +++ b/Src/EB/AMReX_EB2_IndexSpace_chkpt_file.cpp @@ -83,4 +83,10 @@ IndexSpaceChkptFile::addFineLevels (int /*num_new_fine_levels*/) amrex::Abort("IndexSpaceChkptFile::addFineLevels: not supported"); } +void +IndexSpaceChkptFile::addRegularCoarseLevels (int /*num_new_coarse_levels*/) +{ + amrex::Abort("IndexSpaceChkptFile::addRegularCoarseLevels: not supported"); +} + } diff --git a/Src/EB/AMReX_EB2_Level.H b/Src/EB/AMReX_EB2_Level.H index d7f9a6f361c..07f6473d3bf 100644 --- a/Src/EB/AMReX_EB2_Level.H +++ b/Src/EB/AMReX_EB2_Level.H @@ -101,6 +101,15 @@ public: GShopLevel (IndexSpace const* is, const Geometry& geom); void define_fine (G const& gshop, const Geometry& geom, int max_grid_size, int ngrow, bool extend_domain_face, int num_crse_opt); + + static GShopLevel + makeAllRegular(IndexSpace const* is, const Geometry& geom) + { + GShopLevel r(is, geom); + r.m_allregular = true; + r.m_ok = true; + return r; + } }; template