4 int required_coarsening_level,
5 int max_coarsening_level,
6 int ngrow,
bool build_coarse_level_by_coarsening,
7 bool extend_domain_face,
int num_coarsen_opt)
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)
15 max_coarsening_level = std::max(required_coarsening_level,max_coarsening_level);
16 max_coarsening_level = std::min(30,max_coarsening_level);
18 int ngrow_finest = std::max(ngrow,0);
19 for (
int i = 1; i <= required_coarsening_level; ++i) {
23 m_geom.push_back(geom);
24 m_domain.push_back(geom.
Domain());
25 m_ngrow.push_back(ngrow_finest);
26 m_gslevel.reserve(max_coarsening_level+1);
27 m_gslevel.emplace_back(
this, gshop, geom, EB2::max_grid_size, ngrow_finest, extend_domain_face,
30 for (
int ilev = 1; ilev <= max_coarsening_level; ++ilev)
32 bool coarsenable = m_geom.back().Domain().coarsenable(2,2);
34 if (ilev <= required_coarsening_level) {
35 amrex::Abort(
"IndexSpaceImp: domain is not coarsenable at level "+std::to_string(ilev));
41 int ng = (ilev > required_coarsening_level) ? 0 : m_ngrow.back()/2;
45 m_gslevel.emplace_back(
this, ilev, EB2::max_grid_size, ng, cgeom, m_gslevel[ilev-1]);
46 if (!m_gslevel.back().isOK()) {
48 if (ilev <= required_coarsening_level) {
49 if (build_coarse_level_by_coarsening) {
50 amrex::Abort(
"Failed to build required coarse EB level "+std::to_string(ilev));
52 m_gslevel.emplace_back(
this, gshop, cgeom, EB2::max_grid_size, ng, extend_domain_face,
53 num_coarsen_opt-ilev);
59 m_geom.push_back(cgeom);
60 m_domain.push_back(cdomain);
61 m_ngrow.push_back(ng);
69 bool extend_domain_face,
int num_coarsen_opt)
71 m_build_coarse_level_by_coarsening(false),
72 m_extend_domain_face(extend_domain_face),
73 m_num_coarsen_opt(num_coarsen_opt)
76 auto nlevels =
int(geom.
size());
77 m_gslevel.reserve(nlevels);
79 for (
int ilev = 0; ilev < nlevels; ++ilev)
84 m_gslevel.emplace_back(
this, gshop, cgeom, EB2::max_grid_size, ng, extend_domain_face,
85 num_coarsen_opt-ilev);
86 m_geom.push_back(cgeom);
87 m_domain.push_back(cdomain);
88 m_ngrow.push_back(ng);
96 auto it = std::find(std::begin(m_domain), std::end(m_domain), geom.
Domain());
98 "IndexSpaceImp::getLevel: Geometry not found");
99 int i = std::distance(m_domain.begin(), it);
107 auto it = std::find(std::begin(m_domain), std::end(m_domain), dom);
109 "IndexSpaceImp::getLevel: domain not found");
110 int i = std::distance(m_domain.begin(), it);
118 if (num_new_fine_levels <= 0) {
return; }
120 "IndexSpaceImp::addFineLevels: num_new_fine_levels too large");
122 if (m_num_coarsen_opt > 0) {
123 m_num_coarsen_opt += num_new_fine_levels;
126 int rr_fine =
static_cast<int>(1U << num_new_fine_levels);
128 num_new_fine_levels-1, num_new_fine_levels-1,
129 m_ngrow[0], m_build_coarse_level_by_coarsening,
130 m_extend_domain_face, m_num_coarsen_opt);
132 fine_isp.m_gslevel.reserve(m_domain.size()+num_new_fine_levels);
133 for (
int i = 0; i < m_domain.size(); ++i) {
134 fine_isp.m_gslevel.emplace_back(std::move(m_gslevel[i]));
136 std::swap(fine_isp.m_gslevel, m_gslevel);
138 m_geom.insert(m_geom.begin(), fine_isp.m_geom.begin(), fine_isp.m_geom.end());
139 m_domain.insert(m_domain.begin(), fine_isp.m_domain.begin(), fine_isp.m_domain.end());
140 m_ngrow.insert(m_ngrow.begin(), fine_isp.m_ngrow.begin(), fine_isp.m_ngrow.end());
147 if (num_new_coarse_levels <= 0) {
return; }
149 "IndexSpaceImp::addRegularCoarseLevels: num_new_coarse_levels too large");
151 auto nlevs_old =
int(m_gslevel.size());
152 int nlevs_new = nlevs_old + num_new_coarse_levels;
155 new_gslevel.reserve(nlevs_new);
158 new_geom.reserve(nlevs_new);
161 new_domain.reserve(nlevs_new);
164 new_ngrow.reserve(nlevs_new);
166 for (
int ilev = 0; ilev < num_new_coarse_levels; ++ilev) {
167 int rr =
static_cast<int>(1U << (num_new_coarse_levels-ilev));
169 new_domain.push_back(new_geom.back().Domain());
170 new_ngrow.push_back(m_ngrow[0]);
174 for (
int ilev = 0; ilev < nlevs_old; ++ilev) {
175 new_gslevel.emplace_back(std::move(m_gslevel[ilev]));
176 new_geom.push_back (m_geom [ilev]);
177 new_domain.push_back(m_domain[ilev]);
178 new_ngrow.push_back (m_ngrow [ilev]);
181 std::swap(new_gslevel, m_gslevel);
182 std::swap(new_geom , m_geom);
183 std::swap(new_domain , m_domain);
184 std::swap(new_ngrow , m_ngrow);
186 for (
int ilev = num_new_coarse_levels-1; ilev >= 0; --ilev) {
187 m_gslevel[ilev].buildCutCellMask(m_gslevel[ilev+1]);
195 auto nlevs =
int(m_gslevel.size());
196 for (
int ilev = nlevs-1; ilev >= 0; --ilev) {
197 m_gslevel[ilev].setShift(direction, ncells);
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_ALWAYS_ASSERT(EX)
Definition AMReX_BLassert.H:50
Definition AMReX_EB2_Level.H:131
Definition AMReX_EB2.H:79
const Level & getLevel(const Geometry &geom) const final
Definition AMReX_EB2_IndexSpaceI.H:94
void addFineLevels(int num_new_fine_levels) final
Definition AMReX_EB2_IndexSpaceI.H:116
void addRegularCoarseLevels(int num_new_coarse_levels) final
Definition AMReX_EB2_IndexSpaceI.H:145
const Geometry & getGeometry(const Box &dom) const final
Definition AMReX_EB2_IndexSpaceI.H:105
IndexSpaceImp(const G &gshop, const Geometry &geom, int required_coarsening_level, int max_coarsening_level, int ngrow, bool build_coarse_level_by_coarsening, bool extend_domain_face, int num_coarsen_opt)
Definition AMReX_EB2_IndexSpaceI.H:3
void setShift(int direction, int ncells) override
Definition AMReX_EB2_IndexSpaceI.H:193
Definition AMReX_EB2_Level.H:42
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
const Box & Domain() const noexcept
Returns our rectangular domain.
Definition AMReX_Geometry.H:211
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Long size() const noexcept
Definition AMReX_Vector.H:53
__host__ __device__ BoxND< dim > coarsen(const BoxND< dim > &b, int ref_ratio) noexcept
Coarsen BoxND by given (positive) coarsening ratio.
Definition AMReX_Box.H:1409
__host__ __device__ BoxND< dim > refine(const BoxND< dim > &b, int ref_ratio) noexcept
Definition AMReX_Box.H:1459
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:240
const int[]
Definition AMReX_BLProfiler.cpp:1664