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
124template <typename G>
125void
126Build (const G& gshop, const Geometry& geom,
127 int required_coarsening_level, int max_coarsening_level,
128 int ngrow = 4, bool build_coarse_level_by_coarsening = true,
131{
132 BL_PROFILE("EB2::Initialize()");
133 IndexSpace::push(new IndexSpaceImp<G>(gshop, geom,
134 required_coarsening_level,
135 max_coarsening_level,
136 ngrow, build_coarse_level_by_coarsening,
139} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
140
141template <typename G>
142void
143Build (const G& gshop, Vector<Geometry> geom,
144 int ngrow = 4,
147{
148 BL_PROFILE("EB2::Initialize()");
149 std::sort(geom.begin(), geom.end(), [] (Geometry const& a, Geometry const& b) { return a.Domain().numPts() > b.Domain().numPts(); });
150 IndexSpace::push(new IndexSpaceImp<G>(gshop, geom,
151 ngrow,
154} // NOLINT(clang-analyzer-cplusplus.NewDeleteLeaks)
155
156void Build (const Geometry& geom,
157 int required_coarsening_level,
158 int max_coarsening_level,
159 int ngrow = 4,
160 bool build_coarse_level_by_coarsening = true,
163
164void BuildFromChkptFile (std::string const& fname,
165 const Geometry& geom,
166 int required_coarsening_level,
167 int max_coarsening_level,
168 int ngrow = 4,
169 bool build_coarse_level_by_coarsening = true,
171
172int maxCoarseningLevel (const Geometry& geom);
173int maxCoarseningLevel (IndexSpace const* ebis, const Geometry& geom);
174
175void addFineLevels (int num_new_fine_levels);
176
177void addRegularCoarseLevels (int num_new_coarse_levels);
178
179}
180
181#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:73
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:28
Definition AMReX_FabArrayBase.H:33
int NumCoarsenOpt()
Definition AMReX_EB2.cpp:47
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
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