Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_ParticleContainerBase.H
Go to the documentation of this file.
1#ifndef AMREX_PARTICLECONTAINERBASE_H_
2#define AMREX_PARTICLECONTAINERBASE_H_
3#include <AMReX_Config.H>
4
5#include <AMReX_Extension.H>
6#include <AMReX_INT.H>
7#include <AMReX_IntVect.H>
8#include <AMReX_ParGDB.H>
9#include <AMReX_Geometry.H>
11#include <AMReX_BoxArray.H>
12#include <AMReX_Vector.H>
13#include <AMReX_ParticleUtil.H>
14#include <AMReX_MultiFab.H>
15#include <AMReX_iMultiFab.H>
17#include <AMReX_DenseBins.H>
18
19#include <string>
20
21namespace amrex {
22
23#if defined(AMREX_USE_MPI)
40#endif
41
43{
44public:
45
47
49 :
50 m_gdb(gdb)
51 {}
52
54 const DistributionMapping & dmap,
55 const BoxArray & ba)
56 :
57 m_gdb_object(std::make_unique<ParGDB>(geom,dmap,ba)),
58 m_gdb(static_cast<ParGDBBase*>(m_gdb_object.get()))
59 {
60 }
61
63 const Vector<DistributionMapping> & dmap,
64 const Vector<BoxArray> & ba,
65 const Vector<int> & rr)
66 :
67 m_gdb_object(std::make_unique<ParGDB>(geom,dmap,ba,rr)),
68 m_gdb(static_cast<ParGDBBase*>(m_gdb_object.get()))
69 {
70 }
71
73 const Vector<DistributionMapping> & dmap,
74 const Vector<BoxArray> & ba,
75 const Vector<IntVect> & rr)
76 :
77 m_gdb_object(std::make_unique<ParGDB>(geom,dmap,ba,rr)),
78 m_gdb(static_cast<ParGDBBase*>(m_gdb_object.get()))
79 {
80 }
81
82 virtual ~ParticleContainerBase () = default;
83
86
88 ParticleContainerBase& operator= ( ParticleContainerBase && ) noexcept = default;
89
90 void Define (ParGDBBase* gdb) { m_gdb = gdb;}
91
92 void Define (const Geometry & geom,
93 const DistributionMapping & dmap,
94 const BoxArray & ba);
95
96 void Define (const Vector<Geometry> & geom,
97 const Vector<DistributionMapping> & dmap,
98 const Vector<BoxArray> & ba,
99 const Vector<int> & rr);
100
101 void Define (const Vector<Geometry> & geom,
102 const Vector<DistributionMapping> & dmap,
103 const Vector<BoxArray> & ba,
104 const Vector<IntVect> & rr);
105
106 bool isDefined () const { return m_gdb != nullptr; }
107
108 virtual void reserveData ();
109 virtual void resizeData ();
110 void RedefineDummyMF (int lev);
111
112 MFIter MakeMFIter (int lev, const MFItInfo& info) const {
113 AMREX_ASSERT(m_dummy_mf[lev] != nullptr);
114 return MFIter(*m_dummy_mf[lev], info);
115 }
116
117 MFIter MakeMFIter (int lev) const {
118 AMREX_ASSERT(m_dummy_mf[lev] != nullptr);
120 }
121
122 MFIter MakeMFIter (int lev, bool tile) const {
123 AMREX_ASSERT(m_dummy_mf[lev] != nullptr);
124 return MFIter(*m_dummy_mf[lev], tile ? tile_size : IntVect::TheZeroVector());
125 }
126
135 void SetParGDB (const Geometry & geom,
136 const DistributionMapping & dmap,
137 const BoxArray & ba);
138
148 void SetParGDB (const Vector<Geometry> & geom,
149 const Vector<DistributionMapping> & dmap,
150 const Vector<BoxArray> & ba,
151 const Vector<IntVect> & rr);
152
164 void SetParGDB (const Vector<Geometry> & geom,
165 const Vector<DistributionMapping> & dmap,
166 const Vector<BoxArray> & ba,
167 const Vector<int> & rr);
168
176 void SetParticleBoxArray (int lev, BoxArray new_ba);
177
185 void SetParticleDistributionMap (int lev, DistributionMapping new_dmap);
186
194 void SetParticleGeometry (int lev, Geometry new_geom);
195
200 const BoxArray& ParticleBoxArray (int lev) const
201 { return m_gdb->ParticleBoxArray(lev); }
202
208 { return m_gdb->ParticleDistributionMap(lev); }
209
214 const Geometry& Geom (int lev) const { return m_gdb->ParticleGeom(lev); }
215
220 const Geometry& ParticleGeom (int lev) const { return m_gdb->ParticleGeom(lev); }
221
223 int finestLevel () const { return m_gdb->finestLevel(); }
224
226 int maxLevel () const { return m_gdb->maxLevel(); }
227
229 int numLevels() const { return finestLevel() + 1; }
230
232 const ParGDBBase* GetParGDB () const { return m_gdb; }
233
235 ParGDBBase* GetParGDB () { return m_gdb; }
236
237 int Verbose () const { return m_verbose; }
238
239 void SetVerbose (int verbose) { m_verbose = verbose; }
240
241 [[nodiscard]] int stableRedistribute () const {return m_stable_redistribute; }
242
243 void setStableRedistribute (int stable) { m_stable_redistribute = stable; }
244
245 const ParticleBufferMap& BufferMap () const {return m_buffer_map;}
246
247#if defined(AMREX_USE_MPI)
248 void ensureParticleHandshakeWindow () const;
249 [[nodiscard]] Long* particleHandshakeBuffer () const
251 [[nodiscard]] MPI_Win particleHandshakeWindow () const
252 { return m_particle_handshake_window ? m_particle_handshake_window->win : MPI_WIN_NULL; }
253#endif
254
256 {
257 return computeNeighborProcs(this->GetParGDB(), ngrow);
258 }
259
260 Vector<int> NeighborProcs(int ngrow) const
261 {
262 return NeighborProcs(IntVect(ngrow));
263 }
264
265 template <class MF>
266 bool OnSameGrids (int level, const MF& mf) const { return m_gdb->OnSameGrids(level, mf); }
267
268 [[nodiscard]] Arena* arena () const {
269 return m_arena;
270 }
271
272 void SetArena (Arena* a) {
273 m_arena = a;
274 }
275
276 static const std::string& CheckpointVersion ();
277 static const std::string& PlotfileVersion ();
278 static const std::string& DataPrefix ();
279 static int MaxReaders ();
280 static Long MaxParticlesPerRead ();
281 static const std::string& AggregationType ();
282 static int AggregationBuffer ();
283
289
290protected:
291
292 bool RedistributeMaskLooksCheap (int lev, IntVect nghost) const;
293
294 void BuildRedistributeMask (int lev, IntVect nghost) const;
295
296 void BuildRedistributeMask (int lev, int nghost=1) const
297 {
298 BuildRedistributeMask(lev, IntVect(nghost));
299 }
300 void defineBufferMap () const;
301
302 int m_verbose{0};
304 std::unique_ptr<ParGDB> m_gdb_object = std::make_unique<ParGDB>();
305 ParGDBBase* m_gdb{nullptr};
307 Arena* m_arena = nullptr;
308
309 mutable std::unique_ptr<iMultiFab> redistribute_mask_ptr;
310 mutable IntVect redistribute_mask_nghost = IntVect(std::numeric_limits<int>::min());
311 mutable bool redistribute_mask_cost_cached = false;
312 mutable bool redistribute_mask_cost = false;
313 mutable IntVect redistribute_mask_cost_nghost = IntVect(std::numeric_limits<int>::min());
318
319#if defined(AMREX_USE_MPI)
320 mutable std::unique_ptr<ParticleHandshakeWindow> m_particle_handshake_window;
321#endif
322
323};
324
325} // namespace amrex
326
327#endif // AMREX_PARTICLECONTAINERBASE_H_
#define AMREX_ASSERT(EX)
Definition AMReX_BLassert.H:38
Container and helper utilities for sets of boxes on integer index space.
Maps FABs in a FabArray to MPI processes.
Compiler- and backend-specific extension macros (e.g., restrict, SIMD, inline).
#define AMREX_EXPORT
Definition AMReX_Extension.H:223
Problem-domain geometry: maps between index space and physical space.
Definition AMReX_ParticleLocator.H:304
Abstract base class for memory arenas.
Definition AMReX_Arena.H:154
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:681
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:51
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:85
__host__ static __device__ constexpr IntVectND< dim > TheZeroVector() noexcept
This static member function returns a reference to a constant IntVectND object, all of whose dim argu...
Definition AMReX_IntVect.H:771
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
Definition AMReX_ParGDB.H:13
virtual int maxLevel() const =0
virtual const DistributionMapping & ParticleDistributionMap(int level) const =0
virtual const BoxArray & ParticleBoxArray(int level) const =0
bool OnSameGrids(int level, const MF &mf) const
Definition AMReX_ParGDB.H:133
virtual int finestLevel() const =0
virtual const Geometry & ParticleGeom(int level) const =0
we use this for non-Amr particle code
Definition AMReX_ParGDB.H:66
Definition AMReX_ParticleBufferMap.H:59
Definition AMReX_ParticleContainerBase.H:43
int stableRedistribute() const
Definition AMReX_ParticleContainerBase.H:241
ParticleContainerBase & operator=(const ParticleContainerBase &)=delete
amrex::Vector< int > neighbor_procs
Definition AMReX_ParticleContainerBase.H:316
bool isDefined() const
Definition AMReX_ParticleContainerBase.H:106
IntVect redistribute_mask_nghost
Definition AMReX_ParticleContainerBase.H:310
void BuildRedistributeMask(int lev, int nghost=1) const
Definition AMReX_ParticleContainerBase.H:296
std::unique_ptr< iMultiFab > redistribute_mask_ptr
Definition AMReX_ParticleContainerBase.H:309
ParticleContainerBase(const Vector< Geometry > &geom, const Vector< DistributionMapping > &dmap, const Vector< BoxArray > &ba, const Vector< int > &rr)
Definition AMReX_ParticleContainerBase.H:62
const DistributionMapping & ParticleDistributionMap(int lev) const
Get the DistributionMapping for a given level.
Definition AMReX_ParticleContainerBase.H:207
Vector< int > NeighborProcs(int ngrow) const
Definition AMReX_ParticleContainerBase.H:260
ParGDBBase * m_gdb
Definition AMReX_ParticleContainerBase.H:305
void SetVerbose(int verbose)
Definition AMReX_ParticleContainerBase.H:239
bool redistribute_mask_cost_cached
Definition AMReX_ParticleContainerBase.H:311
const BoxArray & ParticleBoxArray(int lev) const
Get the BoxArray for a given level.
Definition AMReX_ParticleContainerBase.H:200
virtual void reserveData()
Definition AMReX_ParticleContainerBase.cpp:70
ParticleBufferMap m_buffer_map
Definition AMReX_ParticleContainerBase.H:317
void SetArena(Arena *a)
Definition AMReX_ParticleContainerBase.H:272
MFIter MakeMFIter(int lev, bool tile) const
Definition AMReX_ParticleContainerBase.H:122
void setStableRedistribute(int stable)
Definition AMReX_ParticleContainerBase.H:243
std::unique_ptr< ParticleHandshakeWindow > m_particle_handshake_window
Definition AMReX_ParticleContainerBase.H:320
bool redistribute_mask_cost
Definition AMReX_ParticleContainerBase.H:312
MFIter MakeMFIter(int lev) const
Definition AMReX_ParticleContainerBase.H:117
static const std::string & PlotfileVersion()
Definition AMReX_ParticleContainerBase.cpp:249
static const std::string & AggregationType()
Definition AMReX_ParticleContainerBase.cpp:321
const Geometry & Geom(int lev) const
Get the Geometry for a given level.
Definition AMReX_ParticleContainerBase.H:214
MPI_Win particleHandshakeWindow() const
Definition AMReX_ParticleContainerBase.H:251
ParticleContainerBase(ParticleContainerBase &&) noexcept=default
ParGDBBase * GetParGDB()
Get the ParGDB object used to define this container.
Definition AMReX_ParticleContainerBase.H:235
static const std::string & CheckpointVersion()
Definition AMReX_ParticleContainerBase.cpp:233
void Define(ParGDBBase *gdb)
Definition AMReX_ParticleContainerBase.H:90
static bool memEfficientSort
Definition AMReX_ParticleContainerBase.H:286
ParticleContainerBase(const ParticleContainerBase &)=delete
bool RedistributeMaskLooksCheap(int lev, IntVect nghost) const
Definition AMReX_ParticleContainerBase.cpp:361
ParticleContainerBase(const Geometry &geom, const DistributionMapping &dmap, const BoxArray &ba)
Definition AMReX_ParticleContainerBase.H:53
int numLevels() const
the number of defined levels in the ParticleContainer
Definition AMReX_ParticleContainerBase.H:229
static const std::string & DataPrefix()
Definition AMReX_ParticleContainerBase.cpp:264
Arena * arena() const
Definition AMReX_ParticleContainerBase.H:268
ParticleContainerBase(ParGDBBase *gdb)
Definition AMReX_ParticleContainerBase.H:48
std::unique_ptr< ParGDB > m_gdb_object
Definition AMReX_ParticleContainerBase.H:304
static Long MaxParticlesPerRead()
Definition AMReX_ParticleContainerBase.cpp:296
int m_verbose
Definition AMReX_ParticleContainerBase.H:302
BoxArray redistribute_mask_cost_ba
Definition AMReX_ParticleContainerBase.H:314
void SetParticleBoxArray(int lev, BoxArray new_ba)
Set the particle BoxArray. If the container was previously set to to track the AMR hierarchy of an Am...
Definition AMReX_ParticleContainerBase.cpp:195
const ParGDBBase * GetParGDB() const
Get the ParGDB object used to define this container (const version)
Definition AMReX_ParticleContainerBase.H:232
bool OnSameGrids(int level, const MF &mf) const
Definition AMReX_ParticleContainerBase.H:266
void ensureParticleHandshakeWindow() const
Definition AMReX_ParticleContainerBase.cpp:125
virtual ~ParticleContainerBase()=default
static bool do_tiling
Definition AMReX_ParticleContainerBase.H:284
void BuildRedistributeMask(int lev, IntVect nghost) const
Definition AMReX_ParticleContainerBase.cpp:427
DistributionMapping redistribute_mask_cost_dmap
Definition AMReX_ParticleContainerBase.H:315
AmrParticleLocator< DenseBins< Box > > m_particle_locator
Definition AMReX_ParticleContainerBase.H:288
int finestLevel() const
the finest level actually defined for the ParticleContainer
Definition AMReX_ParticleContainerBase.H:223
Long * particleHandshakeBuffer() const
Definition AMReX_ParticleContainerBase.H:249
void defineBufferMap() const
Definition AMReX_ParticleContainerBase.cpp:102
static int AggregationBuffer()
Definition AMReX_ParticleContainerBase.cpp:341
IntVect redistribute_mask_cost_nghost
Definition AMReX_ParticleContainerBase.H:313
void RedefineDummyMF(int lev)
Definition AMReX_ParticleContainerBase.cpp:84
int maxLevel() const
the finest allowed level in the ParticleContainer, whether it is defined or not.
Definition AMReX_ParticleContainerBase.H:226
static bool use_comms_arena
Definition AMReX_ParticleContainerBase.H:287
Vector< std::unique_ptr< MultiFab > > m_dummy_mf
Definition AMReX_ParticleContainerBase.H:306
MFIter MakeMFIter(int lev, const MFItInfo &info) const
Definition AMReX_ParticleContainerBase.H:112
const ParticleBufferMap & BufferMap() const
Definition AMReX_ParticleContainerBase.H:245
void SetParticleGeometry(int lev, Geometry new_geom)
Set the particle Geometry. If the container was previously set to to track the AMR hierarchy of an Am...
Definition AMReX_ParticleContainerBase.cpp:221
void SetParticleDistributionMap(int lev, DistributionMapping new_dmap)
Set the particle DistributionMapping. If the container was previously set to to track the AMR hierarc...
Definition AMReX_ParticleContainerBase.cpp:208
const Geometry & ParticleGeom(int lev) const
Get the particle Geometry for a given level.
Definition AMReX_ParticleContainerBase.H:220
static int MaxReaders()
Definition AMReX_ParticleContainerBase.cpp:274
Vector< int > NeighborProcs(IntVect ngrow) const
Definition AMReX_ParticleContainerBase.H:255
void SetParGDB(const Geometry &geom, const DistributionMapping &dmap, const BoxArray &ba)
Set the particle Geometry, DistributionMapping, and BoxArray. If the container was previously set to ...
Definition AMReX_ParticleContainerBase.cpp:166
Arena * m_arena
Definition AMReX_ParticleContainerBase.H:307
int Verbose() const
Definition AMReX_ParticleContainerBase.H:237
int m_stable_redistribute
Definition AMReX_ParticleContainerBase.H:303
static IntVect tile_size
Definition AMReX_ParticleContainerBase.H:285
ParticleContainerBase(const Vector< Geometry > &geom, const Vector< DistributionMapping > &dmap, const Vector< BoxArray > &ba, const Vector< IntVect > &rr)
Definition AMReX_ParticleContainerBase.H:72
virtual void resizeData()
Definition AMReX_ParticleContainerBase.cpp:75
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
amrex_long Long
Definition AMReX_INT.H:30
int MPI_Comm
Definition AMReX_ccse-mpi.H:51
static constexpr int MPI_COMM_NULL
Definition AMReX_ccse-mpi.H:59
Definition AMReX_Amr.cpp:50
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:38
Vector< int > computeNeighborProcs(const ParGDBBase *a_gdb, IntVect ngrow)
Definition AMReX_ParticleUtil.cpp:22
__host__ __device__ constexpr int get(IntVectND< dim > const &iv) noexcept
Get the Idx-th element of IntVectND<dim>
Definition AMReX_IntVect.H:1360
Definition AMReX_MFIter.H:20
Definition AMReX_ParticleContainerBase.H:25
~ParticleHandshakeWindow()
Definition AMReX_ParticleContainerBase.cpp:113
ParticleHandshakeWindow(ParticleHandshakeWindow &&)=delete
Long * ptr
Definition AMReX_ParticleContainerBase.H:36
MPI_Win win
Definition AMReX_ParticleContainerBase.H:35
ParticleHandshakeWindow(const ParticleHandshakeWindow &)=delete
MPI_Comm comm
Definition AMReX_ParticleContainerBase.H:38
int nprocs
Definition AMReX_ParticleContainerBase.H:37
ParticleHandshakeWindow & operator=(const ParticleHandshakeWindow &)=delete