Skip to content

Commit 103db6e

Browse files
authored
EB: Add Fine Levels (AMReX-Codes#2881)
Add a new function EB2::addFineLevels() that can be used to add more fine levels to the existing EB IndexSpace without changing the coarse levels. This is useful for restarting with a larger amr.max_level. The issue is we build EB at the finest level first and then coarsen it to the coarse levels. If the restart run has a different finest level, the EB on the coarse levels could be different without using this new capability.
1 parent 6ebf8ff commit 103db6e

File tree

6 files changed

+62
-4
lines changed

6 files changed

+62
-4
lines changed

Src/EB/AMReX_EB2.H

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ public:
4949
virtual const Level& getLevel (const Geometry & geom) const = 0;
5050
virtual const Geometry& getGeometry (const Box& domain) const = 0;
5151
virtual const Box& coarsestDomain () const = 0;
52+
virtual void addFineLevels (int num_new_fine_levels) = 0;
5253

5354
protected:
5455
static AMREX_EXPORT Vector<std::unique_ptr<IndexSpace> > m_instance;
@@ -80,16 +81,21 @@ public:
8081
virtual const Box& coarsestDomain () const final {
8182
return m_geom.back().Domain();
8283
}
84+
virtual void addFineLevels (int num_new_fine_levels) final;
8385

8486
using F = typename G::FunctionType;
8587

8688
private:
8789

90+
G m_gshop;
91+
bool m_build_coarse_level_by_coarsening;
92+
bool m_extend_domain_face;
93+
int m_num_coarsen_opt;
94+
8895
Vector<GShopLevel<G> > m_gslevel;
8996
Vector<Geometry> m_geom;
9097
Vector<Box> m_domain;
9198
Vector<int> m_ngrow;
92-
std::unique_ptr<F> m_impfunc;
9399
};
94100

95101
#include <AMReX_EB2_IndexSpaceI.H>
@@ -125,6 +131,8 @@ void Build (const Geometry& geom,
125131
int maxCoarseningLevel (const Geometry& geom);
126132
int maxCoarseningLevel (IndexSpace const* ebis, const Geometry& geom);
127133

134+
void addFineLevels (int num_new_fine_levels);
135+
128136
}}
129137

130138
#endif

Src/EB/AMReX_EB2.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,15 @@ Build (const Geometry& geom, int required_coarsening_level,
230230
}
231231
}
232232

233+
void addFineLevels (int num_new_fine_levels)
234+
{
235+
BL_PROFILE("EB2::addFineLevels()");
236+
auto p = const_cast<IndexSpace*>(TopIndexSpace());
237+
if (p) {
238+
p->addFineLevels(num_new_fine_levels);
239+
}
240+
}
241+
233242
namespace {
234243
static int comp_max_crse_level (Box cdomain, const Box& domain)
235244
{

Src/EB/AMReX_EB2_IndexSpaceI.H

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ IndexSpaceImp<G>::IndexSpaceImp (const G& gshop, const Geometry& geom,
55
int max_coarsening_level,
66
int ngrow, bool build_coarse_level_by_coarsening,
77
bool extend_domain_face, int num_coarsen_opt)
8+
: m_gshop(gshop),
9+
m_build_coarse_level_by_coarsening(build_coarse_level_by_coarsening),
10+
m_extend_domain_face(extend_domain_face),
11+
m_num_coarsen_opt(num_coarsen_opt)
812
{
913
// build finest level (i.e., level 0) first
1014
AMREX_ALWAYS_ASSERT(required_coarsening_level >= 0 && required_coarsening_level <= 30);
@@ -56,8 +60,6 @@ IndexSpaceImp<G>::IndexSpaceImp (const G& gshop, const Geometry& geom,
5660
m_domain.push_back(cdomain);
5761
m_ngrow.push_back(ng);
5862
}
59-
60-
m_impfunc = std::make_unique<F>(gshop.GetImpFunc());
6163
}
6264

6365

@@ -78,3 +80,29 @@ IndexSpaceImp<G>::getGeometry (const Box& dom) const
7880
int i = std::distance(m_domain.begin(), it);
7981
return m_geom[i];
8082
}
83+
84+
template <typename G>
85+
void
86+
IndexSpaceImp<G>::addFineLevels (int num_new_fine_levels)
87+
{
88+
if (num_new_fine_levels <= 0) { return; }
89+
90+
if (m_num_coarsen_opt > 0) {
91+
m_num_coarsen_opt += num_new_fine_levels;
92+
}
93+
94+
IndexSpaceImp<G> fine_isp(m_gshop, amrex::refine(m_geom[0], 1<<num_new_fine_levels),
95+
num_new_fine_levels-1, num_new_fine_levels-1,
96+
m_ngrow[0], m_build_coarse_level_by_coarsening,
97+
m_extend_domain_face, m_num_coarsen_opt);
98+
99+
fine_isp.m_gslevel.reserve(m_domain.size()+num_new_fine_levels);
100+
for (int i = 0; i < m_domain.size(); ++i) {
101+
fine_isp.m_gslevel.emplace_back(std::move(m_gslevel[i]));
102+
}
103+
std::swap(fine_isp.m_gslevel, m_gslevel);
104+
105+
m_geom.insert(m_geom.begin(), fine_isp.m_geom.begin(), fine_isp.m_geom.end());
106+
m_domain.insert(m_domain.begin(), fine_isp.m_domain.begin(), fine_isp.m_domain.end());
107+
m_ngrow.insert(m_ngrow.begin(), fine_isp.m_ngrow.begin(), fine_isp.m_ngrow.end());
108+
}

Src/EB/AMReX_EB2_IndexSpace_STL.H

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public:
3333
virtual const Box& coarsestDomain () const final {
3434
return m_geom.back().Domain();
3535
}
36+
virtual void addFineLevels (int num_new_fine_levels) final;
3637

3738
private:
3839

Src/EB/AMReX_EB2_IndexSpace_STL.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,10 @@ IndexSpaceSTL::getGeometry (const Box& dom) const
8282
return m_geom[i];
8383
}
8484

85+
void
86+
IndexSpaceSTL::addFineLevels (int /*num_new_fine_levels*/)
87+
{
88+
amrex::Abort("IndexSpaceSTL::addFineLevels: todo");
89+
}
90+
8591
}}

Tests/EB/CNS/Source/main.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,13 @@ int main (int argc, char* argv[])
5353
AmrLevel::SetEBSupportLevel(EBSupport::full);
5454
AmrLevel::SetEBMaxGrowCells(CNS::numGrow(),4,2);
5555

56-
initialize_EB2(amr.Geom(amr.maxLevel()), amr.maxLevel(), amr.maxLevel());
56+
int max_eb_level = amr.maxLevel();
57+
ParmParse pp("amr");
58+
pp.query("max_eb_level", max_eb_level);
59+
initialize_EB2(amr.Geom(max_eb_level), max_eb_level, max_eb_level);
60+
if (max_eb_level < amr.maxLevel()) {
61+
EB2::addFineLevels(amr.maxLevel() - max_eb_level);
62+
}
5763

5864
amr.init(strt_time,stop_time);
5965

0 commit comments

Comments
 (0)