Block-Structured AMR Software Framework
 
Loading...
Searching...
No Matches
AMReX_EB2.H
Go to the documentation of this file.
1#ifndef AMREX_EB2_H_
2#define AMREX_EB2_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Geometry.H>
6#include <AMReX_Vector.H>
8#include <AMReX_EB2_Level.H>
9
10#include <cmath>
11#include <algorithm>
12#include <memory>
13#include <type_traits>
14#include <string>
15
16namespace amrex::EB2 {
17
19
20void useEB2 (bool);
21
22void Initialize ();
23void Finalize ();
24
26{
27public:
28 virtual ~IndexSpace() = default;
29
30 IndexSpace () noexcept = default;
31 IndexSpace (IndexSpace const&) = delete;
32 IndexSpace (IndexSpace &&) = delete;
33 IndexSpace& operator= (IndexSpace const&) = delete;
34 IndexSpace& operator= (IndexSpace &&) = delete;
35
36 // This function will take the ownership of the IndexSpace
37 // pointer, and put it on the top of the stack (i.e., back of the
38 // vector). If the pointer is already in the stack, it will be
39 // moved to the top.
40 static void push (IndexSpace* ispace);
41
42 // This erases `ispace` from the stack.
43 static void erase (IndexSpace* ispace);
44
45 static void pop () noexcept { m_instance.pop_back(); }
46 static void clear () noexcept { m_instance.clear(); }
47 static IndexSpace& top () {
49 "Have you forgot to call EB2::build? It's required even if the geometry is all regular.");
50 return *(m_instance.back());
51 }
52 static bool empty () noexcept { return m_instance.empty(); }
53 static int size () noexcept { return static_cast<int>(m_instance.size()); }
54
55 [[nodiscard]] virtual const Level& getLevel (const Geometry & geom) const = 0;
56 [[nodiscard]] virtual const Geometry& getGeometry (const Box& domain) const = 0;
57 [[nodiscard]] virtual const Box& coarsestDomain () const = 0;
58 virtual void addFineLevels (int num_new_fine_levels) = 0;
59 virtual void addRegularCoarseLevels (int num_new_coarse_levels) = 0;
60
61 virtual void setShift (int, int) {
62 amrex::Abort("IndexSpace::setShift: not supported");
63 }
64
65protected:
67};
68
69const IndexSpace* TopIndexSpaceIfPresent () noexcept;
70inline const IndexSpace* TopIndexSpace () noexcept { return TopIndexSpaceIfPresent(); }
71
72template <typename G>
74 : public IndexSpace
75{
76public:
77
78 IndexSpaceImp (const G& gshop, const Geometry& geom,
79 int required_coarsening_level, int max_coarsening_level,
80 int ngrow, bool build_coarse_level_by_coarsening,
82
83 IndexSpaceImp (const G& gshop, const Vector<Geometry>& geom,
84 int ngrow,
86
89 void operator= (IndexSpaceImp<G> const&) = delete;
90 void operator= (IndexSpaceImp<G> &&) = delete;
91
92 ~IndexSpaceImp () override = default;
93
94 [[nodiscard]] const Level& getLevel (const Geometry& geom) const final;
95 [[nodiscard]] const Geometry& getGeometry (const Box& dom) const final;
96 [[nodiscard]] const Box& coarsestDomain () const final {
97 return m_geom.back().Domain();
98 }
99 void addFineLevels (int num_new_fine_levels) final;
100 void addRegularCoarseLevels (int num_new_coarse_levels) final;
101
102 void setShift (int direction, int ncells) override;
103
104 using F = typename G::FunctionType;
105
106private:
107
112
117};
118
120
121bool ExtendDomainFace ();
122int NumCoarsenOpt ();
123
125template <typename G>
126void
127Build (const G& gshop, const Geometry& geom,
128 int required_coarsening_level, int max_coarsening_level,
129 int ngrow = 4, bool build_coarse_level_by_coarsening = true,
132{
133 BL_PROFILE("EB2::Initialize()");
134 IndexSpace::push(new IndexSpaceImp<G>(gshop, geom,
135 required_coarsening_level,
136 max_coarsening_level,
137 ngrow, build_coarse_level_by_coarsening,
140} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
141
143template <typename G>
144void
145Build (const G& gshop, Vector<Geometry> geom,
146 int ngrow = 4,
149{
150 BL_PROFILE("EB2::Initialize()");
151 std::sort(geom.begin(), geom.end(), [] (Geometry const& a, Geometry const& b) { return a.Domain().numPts() > b.Domain().numPts(); });
152 IndexSpace::push(new IndexSpaceImp<G>(gshop, geom,
153 ngrow,
156} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
157
159void Build (const Geometry& geom,
160 int required_coarsening_level,
161 int max_coarsening_level,
162 int ngrow = 4,
163 bool build_coarse_level_by_coarsening = true,
166
167void BuildFromChkptFile (std::string const& fname,
168 const Geometry& geom,
169 int required_coarsening_level,
170 int max_coarsening_level,
171 int ngrow = 4,
172 bool build_coarse_level_by_coarsening = true,
174
175int maxCoarseningLevel (const Geometry& geom);
176int maxCoarseningLevel (IndexSpace const* ebis, const Geometry& geom);
177
178void addFineLevels (int num_new_fine_levels);
179
180void addRegularCoarseLevels (int num_new_coarse_levels);
181
182}
183
184#endif
#define BL_PROFILE(a)
Definition AMReX_BLProfiler.H:551
#define AMREX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition AMReX_BLassert.H:49
#define AMREX_EXPORT
Definition AMReX_Extension.H:191
Definition AMReX_EB2.H:75
typename G::FunctionType F
Definition AMReX_EB2.H:104
const Box & coarsestDomain() const final
Definition AMReX_EB2.H:96
const Level & getLevel(const Geometry &geom) const final
Definition AMReX_EB2_IndexSpaceI.H:94
Vector< GShopLevel< G > > m_gslevel
Definition AMReX_EB2.H:113
Vector< int > m_ngrow
Definition AMReX_EB2.H:116
int m_num_coarsen_opt
Definition AMReX_EB2.H:111
~IndexSpaceImp() override=default
void addFineLevels(int num_new_fine_levels) final
Definition AMReX_EB2_IndexSpaceI.H:112
IndexSpaceImp(IndexSpaceImp< G > const &)=delete
Vector< Geometry > m_geom
Definition AMReX_EB2.H:114
void addRegularCoarseLevels(int num_new_coarse_levels) final
Definition AMReX_EB2_IndexSpaceI.H:138
G m_gshop
Definition AMReX_EB2.H:108
Vector< Box > m_domain
Definition AMReX_EB2.H:115
bool m_extend_domain_face
Definition AMReX_EB2.H:110
const Geometry & getGeometry(const Box &dom) const final
Definition AMReX_EB2_IndexSpaceI.H:103
IndexSpaceImp(IndexSpaceImp< G > &&)=delete
bool m_build_coarse_level_by_coarsening
Definition AMReX_EB2.H:109
void operator=(IndexSpaceImp< G > const &)=delete
void setShift(int direction, int ncells) override
Definition AMReX_EB2_IndexSpaceI.H:184
Definition AMReX_EB2.H:26
virtual const Geometry & getGeometry(const Box &domain) const =0
virtual const Level & getLevel(const Geometry &geom) const =0
IndexSpace() noexcept=default
virtual void addFineLevels(int num_new_fine_levels)=0
static void pop() noexcept
Definition AMReX_EB2.H:45
static void push(IndexSpace *ispace)
Definition AMReX_EB2.cpp:53
static bool empty() noexcept
Definition AMReX_EB2.H:52
virtual void addRegularCoarseLevels(int num_new_coarse_levels)=0
static Vector< std::unique_ptr< IndexSpace > > m_instance
Definition AMReX_EB2.H:66
static int size() noexcept
Definition AMReX_EB2.H:53
virtual ~IndexSpace()=default
virtual const Box & coarsestDomain() const =0
static void clear() noexcept
Definition AMReX_EB2.H:46
virtual void setShift(int, int)
Definition AMReX_EB2.H:61
static IndexSpace & top()
Definition AMReX_EB2.H:47
static void erase(IndexSpace *ispace)
Definition AMReX_EB2.cpp:66
Definition AMReX_EB2_Level.H:33
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:74
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
void Build(const Geometry &geom, int required_coarsening_level, int max_coarsening_level, int ngrow, bool build_coarse_level_by_coarsening, bool a_extend_domain_face, int a_num_coarsen_opt)
Definition AMReX_EB2.cpp:84
Definition AMReX_FabArrayBase.H:33
int NumCoarsenOpt()
Definition AMReX_EB2.cpp:47
void addRegularCoarseLevels(int num_new_coarse_levels)
Definition AMReX_EB2.cpp:246
bool ExtendDomainFace()
Definition AMReX_EB2.cpp:42
int maxCoarseningLevel(const Geometry &geom)
Definition AMReX_EB2.cpp:282
void Initialize()
Definition AMReX_EB2.cpp:27
int max_grid_size
Definition AMReX_EB2.cpp:23
void addFineLevels(int num_new_fine_levels)
Definition AMReX_EB2.cpp:237
const IndexSpace * TopIndexSpace() noexcept
Definition AMReX_EB2.H:70
int num_coarsen_opt
Definition AMReX_EB2.cpp:25
bool extend_domain_face
Definition AMReX_EB2.cpp:24
const IndexSpace * TopIndexSpaceIfPresent() noexcept
Definition AMReX_EB2.cpp:76
void useEB2(bool)
void BuildFromChkptFile(std::string const &fname, const Geometry &geom, int required_coarsening_level, int max_coarsening_level, int ngrow, bool build_coarse_level_by_coarsening, bool a_extend_domain_face)
Definition AMReX_EB2.cpp:255
void Finalize()
Definition AMReX_EB2.cpp:37
void Abort(const std::string &msg)
Print out message to cerr and exit via abort().
Definition AMReX.cpp:230