Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_AmrMesh.H
Go to the documentation of this file.
1#ifndef BL_AMRMESH_H_
2#define BL_AMRMESH_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Array.H>
6#include <AMReX_Vector.H>
7#include <AMReX_RealBox.H>
8#include <AMReX_IntVect.H>
9#include <AMReX_Geometry.H>
11#include <AMReX_BoxArray.H>
12#include <AMReX_TagBox.H>
13
14#ifdef AMREX_USE_BITTREE
15#include <Bittree_BittreeAmr.h>
16#endif
17
18namespace amrex {
19
20struct AmrInfo {
21 int verbose = 0;
23 int max_level = 0;
29#if defined(AMREX_USE_GPU)
31#else
33#endif
37 Real grid_eff = static_cast<Real>(0.7);
39 int n_proper = 1;
42
47 bool refine_grid_layout = true;
48
54
55 bool check_input = true;
56 bool use_new_chop = false;
59};
60
63 : protected AmrInfo
64{
65public:
66
67 friend std::ostream& operator<< (std::ostream& os, AmrMesh const& amr_mesh);
68
69 AmrMesh ();
70
71 AmrMesh (const RealBox* rb, int max_level_in,
72 const Vector<int>& n_cell_in, int coord=-1,
74 const int* is_per = nullptr);
75
76 AmrMesh (const RealBox& rb, int max_level_in,
77 const Vector<int>& n_cell_in, int coord,
78 Vector<IntVect> const& a_refrat,
79 Array<int,AMREX_SPACEDIM> const& is_per);
80
81 AmrMesh (Geometry const& level_0_geom, AmrInfo const& amr_info);
82
83 AmrMesh (const AmrMesh& rhs) = delete;
84 AmrMesh& operator= (const AmrMesh& rhs) = delete;
85
86 AmrMesh (AmrMesh&& rhs) = default;
87 AmrMesh& operator= (AmrMesh&& rhs) = default;
88
89 virtual ~AmrMesh () = default;
90
91 [[nodiscard]] int Verbose () const noexcept { return verbose; }
92
94 [[nodiscard]] int maxLevel () const noexcept { return max_level; }
95
97 [[nodiscard]] int finestLevel () const noexcept { return finest_level; }
98
100 [[nodiscard]] IntVect refRatio (int lev) const noexcept { return ref_ratio[lev]; }
101
103 [[nodiscard]] int MaxRefRatio (int lev) const noexcept;
104
106 [[nodiscard]] const Vector<IntVect>& refRatio () const noexcept { return ref_ratio; }
107
108 [[nodiscard]] const Vector<Geometry>& Geom () const noexcept { return geom; }
109 [[nodiscard]] const Vector<DistributionMapping>& DistributionMap () const noexcept { return dmap; }
110 [[nodiscard]] const Vector<BoxArray>& boxArray () const noexcept { return grids; }
111
112 [[nodiscard]] const Geometry& Geom (int lev) const noexcept { return geom[lev]; }
113 [[nodiscard]] const DistributionMapping& DistributionMap (int lev) const noexcept { return dmap[lev]; }
114 [[nodiscard]] const BoxArray& boxArray (int lev) const noexcept { return grids[lev]; }
115
116 [[nodiscard]] Vector<Geometry> Geom (int a_coarsest_lev, int a_finest_lev) const noexcept {
118 r.reserve(a_finest_lev-a_coarsest_lev+1);
119 for (int lev = a_coarsest_lev; lev <= a_finest_lev; ++lev) {
120 r.push_back(geom[lev]);
121 }
122 return r;
123 }
124 [[nodiscard]] Vector<BoxArray> boxArray (int a_coarsest_lev, int a_finest_lev) const noexcept {
126 r.reserve(a_finest_lev-a_coarsest_lev+1);
127 for (int lev = a_coarsest_lev; lev <= a_finest_lev; ++lev) {
128 r.push_back(grids[lev]);
129 }
130 return r;
131 }
132 [[nodiscard]] Vector<DistributionMapping> DistributionMap (int a_coarsest_lev, int a_finest_lev) const noexcept {
134 r.reserve(a_finest_lev-a_coarsest_lev+1);
135 for (int lev = a_coarsest_lev; lev <= a_finest_lev; ++lev) {
136 r.push_back(dmap[lev]);
137 }
138 return r;
139 }
140
141 Vector<Geometry>& Geom () noexcept { return geom; }
142 Geometry& Geom (int lev) noexcept { return geom[lev]; }
143
144 void SetMaxGridSize (int new_mgs) noexcept {
145 max_grid_size.assign(max_level+1, IntVect{AMREX_D_DECL(new_mgs,new_mgs,new_mgs)});
146 }
147 void SetMaxGridSize (const IntVect& new_mgs) noexcept {
148 max_grid_size.assign(max_level+1, new_mgs);
149 }
150 void SetMaxGridSize (const Vector<int>& new_mgs) noexcept {
151 max_grid_size.resize(max_level+1);
152 for (int i = 0; i <= max_level; ++i) {
153 max_grid_size[i] = IntVect{AMREX_D_DECL(new_mgs[i],new_mgs[i],new_mgs[i])};
154 }
155 }
156 void SetMaxGridSize (const Vector<IntVect>& new_mgs) noexcept {
157 max_grid_size.assign(new_mgs.cbegin(), new_mgs.cbegin()+max_level+1);
158 }
159
160 void SetBlockingFactor (int new_bf) noexcept {
161 blocking_factor.assign(max_level+1, IntVect{AMREX_D_DECL(new_bf,new_bf,new_bf)});
162 }
163 void SetBlockingFactor (const IntVect& new_bf) noexcept {
164 blocking_factor.assign(max_level+1, new_bf);
165 }
166 void SetBlockingFactor (const Vector<int>& new_bf) noexcept {
167 blocking_factor.resize(max_level+1);
168 for (int i = 0; i <= max_level; ++i) {
169 blocking_factor[i] = IntVect{AMREX_D_DECL(new_bf[i],new_bf[i],new_bf[i])};
170 }
171 }
172 void SetBlockingFactor (const Vector<IntVect>& new_bf) noexcept {
173 blocking_factor.assign(new_bf.cbegin(), new_bf.cend()+max_level+1);
174 }
175
176 void SetGridEff (Real eff) noexcept { grid_eff = eff; }
177 void SetNProper (int n) noexcept { n_proper = n; }
178
180
181 void SetFinestLevel (int new_finest_level) noexcept { finest_level = new_finest_level; }
182 void SetDistributionMap (int lev, const DistributionMapping& dmap_in) noexcept;
183 void SetBoxArray (int lev, const BoxArray& ba_in) noexcept;
184 void SetGeometry (int lev, const Geometry& geom_in) noexcept;
185
187 [[nodiscard]] int GetLevel (Box const& domain) const noexcept;
188
189 void ClearDistributionMap (int lev) noexcept;
190 void ClearBoxArray (int lev) noexcept;
191
193 [[nodiscard]] int nErrorBuf (int lev, int direction = 0) const noexcept { return n_error_buf[lev][direction]; }
194
196 [[nodiscard]] const IntVect& nErrorBufVect (int lev) const noexcept { return n_error_buf[lev]; }
197
199 [[nodiscard]] Real gridEff () const noexcept { return grid_eff; }
200
202 [[nodiscard]] int nProper () const noexcept { return n_proper; }
203
205 [[nodiscard]] const IntVect& blockingFactor (int lev) const noexcept { return blocking_factor[lev]; }
206
208 [[nodiscard]] const IntVect& maxGridSize (int lev) const noexcept { return max_grid_size[lev]; }
209
210 [[nodiscard]] bool LevelDefined (int lev) const noexcept;
211
213 [[nodiscard]] bool useFixedCoarseGrids () const noexcept { return use_fixed_coarse_grids; }
214
216 [[nodiscard]] int useFixedUpToLevel () const noexcept { return use_fixed_upto_level; }
217
219 void ChopGrids (int lev, BoxArray& ba, int target_size) const;
220
222 [[nodiscard]] BoxArray MakeBaseGrids () const;
223
238 void MakeNewGrids (int lbase, Real time, int& new_finest, Vector<BoxArray>& new_grids);
239
241 void MakeNewGrids (Real time = 0.0);
242
246 virtual void MakeNewLevelFromScratch (int /*lev*/, Real /*time*/, const BoxArray& /*ba*/, const DistributionMapping& /*dm*/) {}
247
249 virtual void ErrorEst (int /*lev*/, TagBoxArray& /*tags*/, Real /*time*/, int /*ngrow*/) {}
250
252 virtual void ManualTagsPlacement (int /*lev*/, TagBoxArray& /*tags*/, const Vector<IntVect>& /*bf_lev*/) {}
253
260 virtual void PostProcessBaseGrids(BoxArray& /*box_array*/) const {}
261
262 [[nodiscard]] virtual BoxArray GetAreaNotToTag (int /*lev*/) { return BoxArray(); }
263
264 [[nodiscard]] Long CountCells (int lev) const noexcept;
265
266 [[nodiscard]] virtual DistributionMapping MakeDistributionMap (int lev, BoxArray const& ba);
267
268protected:
269
274
275#ifdef AMREX_USE_BITTREE
276 bool use_bittree = false;
277 std::unique_ptr<bittree::BittreeAmr> btmesh;
278#endif
279
280 unsigned int num_setdm = 0;
281 unsigned int num_setba = 0;
282
283 void checkInput();
284
285 void SetIterateToFalse () noexcept { iterate_on_new_grids = false; }
286 void SetUseNewChop () noexcept { use_new_chop = true; }
287
288private:
289 void InitAmrMesh (int max_level_in, const Vector<int>& n_cell_in,
291 const RealBox* rb = nullptr, int coord = -1,
292 const int* is_per = nullptr);
293
294 static void ProjPeriodic (BoxList& blout, const Box& domain,
295 Array<int,AMREX_SPACEDIM> const& is_per);
296};
297
298std::ostream& operator<< (std::ostream& os, AmrMesh const& amr_mesh);
299
300}
301
302#endif
#define AMREX_D_PICK(a, b, c)
Definition AMReX_SPACE.H:173
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
Definition AMReX_AmrMesh.H:64
void SetBlockingFactor(const Vector< IntVect > &new_bf) noexcept
Definition AMReX_AmrMesh.H:172
const Geometry & Geom(int lev) const noexcept
Definition AMReX_AmrMesh.H:112
AmrMesh()
Definition AMReX_AmrMesh.cpp:18
Vector< Geometry > geom
Definition AMReX_AmrMesh.H:271
const Vector< DistributionMapping > & DistributionMap() const noexcept
Definition AMReX_AmrMesh.H:109
virtual void MakeNewLevelFromScratch(int, Real, const BoxArray &, const DistributionMapping &)
Definition AMReX_AmrMesh.H:246
int maxLevel() const noexcept
Return the max level.
Definition AMReX_AmrMesh.H:94
void SetIterateToFalse() noexcept
Definition AMReX_AmrMesh.H:285
unsigned int num_setdm
Definition AMReX_AmrMesh.H:280
void SetBlockingFactor(const Vector< int > &new_bf) noexcept
Definition AMReX_AmrMesh.H:166
friend std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1237
const BoxArray & boxArray(int lev) const noexcept
Definition AMReX_AmrMesh.H:114
void SetBoxArray(int lev, const BoxArray &ba_in) noexcept
Definition AMReX_AmrMesh.cpp:407
const IntVect & nErrorBufVect(int lev) const noexcept
Return the number of buffer cells (as an IntVect) in error estimator.
Definition AMReX_AmrMesh.H:196
AmrMesh(AmrMesh &&rhs)=default
unsigned int num_setba
Definition AMReX_AmrMesh.H:281
void SetDistributionMap(int lev, const DistributionMapping &dmap_in) noexcept
Definition AMReX_AmrMesh.cpp:400
void SetMaxGridSize(int new_mgs) noexcept
Definition AMReX_AmrMesh.H:144
bool LevelDefined(int lev) const noexcept
Definition AMReX_AmrMesh.cpp:442
void SetUseNewChop() noexcept
Definition AMReX_AmrMesh.H:286
const IntVect & blockingFactor(int lev) const noexcept
Return the blocking factor at level lev.
Definition AMReX_AmrMesh.H:205
Vector< DistributionMapping > DistributionMap(int a_coarsest_lev, int a_finest_lev) const noexcept
Definition AMReX_AmrMesh.H:132
Vector< Geometry > Geom(int a_coarsest_lev, int a_finest_lev) const noexcept
Definition AMReX_AmrMesh.H:116
int useFixedUpToLevel() const noexcept
Up to what level should we keep the coarser grids fixed (and not regrid those levels)?
Definition AMReX_AmrMesh.H:216
int finestLevel() const noexcept
Return the finest level.
Definition AMReX_AmrMesh.H:97
int GetLevel(Box const &domain) const noexcept
Given domain box, return AMR level. Return -1 if there is no match.
Definition AMReX_AmrMesh.cpp:420
void SetGridEff(Real eff) noexcept
Definition AMReX_AmrMesh.H:176
int finest_level
Current finest level.
Definition AMReX_AmrMesh.H:270
Geometry & Geom(int lev) noexcept
Definition AMReX_AmrMesh.H:142
Real gridEff() const noexcept
Return the minimum allowable grid efficiency.
Definition AMReX_AmrMesh.H:199
IntVect refRatio(int lev) const noexcept
Return the refinement ratio for level lev.
Definition AMReX_AmrMesh.H:100
void ChopGrids(int lev, BoxArray &ba, int target_size) const
"Try" to chop up grids so that the number of boxes in the BoxArray is greater than the target_size.
Definition AMReX_AmrMesh.cpp:468
virtual void ErrorEst(int, TagBoxArray &, Real, int)
Tag cells for refinement. TagBoxArray tags is built on level lev grids.
Definition AMReX_AmrMesh.H:249
int MaxRefRatio(int lev) const noexcept
Return the maximum refinement ratio in any direction.
Definition AMReX_AmrMesh.cpp:390
virtual ~AmrMesh()=default
void checkInput()
Definition AMReX_AmrMesh.cpp:1119
void SetMaxGridSize(const IntVect &new_mgs) noexcept
Definition AMReX_AmrMesh.H:147
virtual BoxArray GetAreaNotToTag(int)
Definition AMReX_AmrMesh.H:262
Vector< BoxArray > boxArray(int a_coarsest_lev, int a_finest_lev) const noexcept
Definition AMReX_AmrMesh.H:124
int Verbose() const noexcept
Definition AMReX_AmrMesh.H:91
int nProper() const noexcept
Return the number of cells to define proper nesting.
Definition AMReX_AmrMesh.H:202
AmrMesh(const AmrMesh &rhs)=delete
void SetGeometry(int lev, const Geometry &geom_in) noexcept
Definition AMReX_AmrMesh.cpp:414
const DistributionMapping & DistributionMap(int lev) const noexcept
Definition AMReX_AmrMesh.H:113
void SetFinestLevel(int new_finest_level) noexcept
Set ref_ratio would require rebuilding Geometry objects.
Definition AMReX_AmrMesh.H:181
const IntVect & maxGridSize(int lev) const noexcept
Return the largest allowable grid.
Definition AMReX_AmrMesh.H:208
Vector< DistributionMapping > dmap
Definition AMReX_AmrMesh.H:272
void SetBlockingFactor(int new_bf) noexcept
Definition AMReX_AmrMesh.H:160
virtual void ManualTagsPlacement(int, TagBoxArray &, const Vector< IntVect > &)
Manually tag. Note that tags is built on level lev grids coarsened by bf_lev[lev].
Definition AMReX_AmrMesh.H:252
virtual DistributionMapping MakeDistributionMap(int lev, BoxArray const &ba)
Definition AMReX_AmrMesh.cpp:448
const Vector< IntVect > & refRatio() const noexcept
Return refinement ratios between all levels.
Definition AMReX_AmrMesh.H:106
const Vector< Geometry > & Geom() const noexcept
Definition AMReX_AmrMesh.H:108
BoxArray MakeBaseGrids() const
Make a level 0 grids covering the whole domain. It does NOT install the new grids.
Definition AMReX_AmrMesh.cpp:522
void MakeNewGrids(int lbase, Real time, int &new_finest, Vector< BoxArray > &new_grids)
Make new grids based on error estimates. This function expects that valid BoxArrays exist in this->gr...
Definition AMReX_AmrMesh.cpp:549
Vector< Geometry > & Geom() noexcept
Definition AMReX_AmrMesh.H:141
int nErrorBuf(int lev, int direction=0) const noexcept
Return the number of buffer cells (as a single integer) in error estimator.
Definition AMReX_AmrMesh.H:193
virtual void PostProcessBaseGrids(BoxArray &) const
Definition AMReX_AmrMesh.H:260
void SetMaxGridSize(const Vector< IntVect > &new_mgs) noexcept
Definition AMReX_AmrMesh.H:156
Long CountCells(int lev) const noexcept
Definition AMReX_AmrMesh.cpp:1232
void SetBlockingFactor(const IntVect &new_bf) noexcept
Definition AMReX_AmrMesh.H:163
void SetMaxGridSize(const Vector< int > &new_mgs) noexcept
Definition AMReX_AmrMesh.H:150
Vector< BoxArray > grids
Definition AMReX_AmrMesh.H:273
AmrMesh & operator=(const AmrMesh &rhs)=delete
void SetNProper(int n) noexcept
Definition AMReX_AmrMesh.H:177
bool useFixedCoarseGrids() const noexcept
Should we keep the coarser grids fixed (and not regrid those levels) at all?
Definition AMReX_AmrMesh.H:213
const Vector< BoxArray > & boxArray() const noexcept
Definition AMReX_AmrMesh.H:110
void ClearDistributionMap(int lev) noexcept
Definition AMReX_AmrMesh.cpp:430
void ClearBoxArray(int lev) noexcept
Definition AMReX_AmrMesh.cpp:436
A collection of Boxes stored in an Array.
Definition AMReX_BoxArray.H:567
A class for managing a List of Boxes that share a common IndexType. This class implements operations ...
Definition AMReX_BoxList.H:52
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:43
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
A Box with real dimensions.
Definition AMReX_RealBox.H:26
An array of TagBoxes.
Definition AMReX_TagBox.H:150
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:79
amrex_long Long
Definition AMReX_INT.H:30
std::array< T, N > Array
Definition AMReX_Array.H:26
Definition AMReX_Amr.cpp:49
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:33
std::ostream & operator<<(std::ostream &os, AmrMesh const &amr_mesh)
Definition AMReX_AmrMesh.cpp:1237
Definition AMReX_AmrMesh.H:20
int n_proper
Cells required for proper nesting.
Definition AMReX_AmrMesh.H:39
bool refine_grid_layout
Definition AMReX_AmrMesh.H:47
bool use_fixed_coarse_grids
Definition AMReX_AmrMesh.H:41
Vector< IntVect > ref_ratio
Refinement ratios.
Definition AMReX_AmrMesh.H:25
bool use_new_chop
Definition AMReX_AmrMesh.H:56
Real grid_eff
Grid efficiency.
Definition AMReX_AmrMesh.H:37
bool iterate_on_new_grids
Definition AMReX_AmrMesh.H:57
int max_grid_iterations
Definition AMReX_AmrMesh.H:58
bool check_input
Definition AMReX_AmrMesh.H:55
Vector< IntVect > n_error_buf
Buffer cells around each tagged cell.
Definition AMReX_AmrMesh.H:35
int max_level
Maximum allowed level.
Definition AMReX_AmrMesh.H:23
IntVect refine_grid_layout_dims
Definition AMReX_AmrMesh.H:53
Vector< IntVect > max_grid_size
Maximum allowable grid size (by level).
Definition AMReX_AmrMesh.H:30
int use_fixed_upto_level
Definition AMReX_AmrMesh.H:40
int verbose
Definition AMReX_AmrMesh.H:21
Vector< IntVect > blocking_factor
Blocking factor in grid generation (by level).
Definition AMReX_AmrMesh.H:27