chombo-discharge
Loading...
Searching...
No Matches
CD_ParticleContainer.H
Go to the documentation of this file.
1/* chombo-discharge
2 * Copyright © 2021 SINTEF Energy Research.
3 * Please refer to Copyright.txt and LICENSE in the chombo-discharge root directory.
4 */
5
12#ifndef CD_ParticleContainer_H
13#define CD_ParticleContainer_H
14
15// Chombo includes
16#include <Particle.H>
17#include <ParticleData.H>
18#include <ParticleValidRegion.H>
19#include <BinItem.H>
20#include <BinFab.H>
21#include <ProblemDomain.H>
22#include <DisjointBoxLayout.H>
23#include <BaseEBCellFAB.H>
24
25// Our includes
26#include <CD_OpenMP.H>
27#include <CD_LevelTiles.H>
28#include <CD_ParticleMap.H>
29#include <CD_NamespaceHeader.H>
30
34template <class P>
36
40template <class P>
42
49template <class P>
51{
52public:
53 using ValidMask = RefCountedPtr<LevelData<BaseFab<bool>>>;
54
59
75 const Vector<Real>& a_dx,
76 const Vector<int>& a_refRat,
79 const RealVect& a_probLo,
80 const int a_blockingFactor,
81 const int a_finestLevel,
82 const std::string a_realm);
83
87 virtual ~ParticleContainer();
88
102 void
105 const Vector<Real>& a_dx,
106 const Vector<int>& a_refRat,
109 const RealVect& a_probLo,
110 const int a_blockingFactor,
111 const int a_finestLevel,
112 const std::string a_realm);
113
125 void
128 const Vector<Real>& a_dx,
129 const Vector<int>& a_refRat,
132 const int a_base,
133 const int a_newFinestLevel);
134
139 void
140 preRegrid(const int a_base);
141
145 void
146 resetParticleIDs() noexcept;
147
153 void
155
161 void
162 copyMaskParticles(const int a_level, const LevelData<BaseFab<bool>>& a_mask) const;
163
169 void
171
177 void
179
183 void
184 sortParticles() noexcept;
185
189 void
191
195 void
196 clearBufferParticles() const;
197
201 void
202 clearMaskParticles() const;
203
207 void
208 clearOutcast() noexcept;
209
214 void
216
220 bool
221 isOrganizedByCell() const;
222
226 int
227 getFinestLevel() const;
228
232 const std::string
233 getRealm() const;
234
240 getParticles();
241
246 const AMRParticles<P>&
247 getParticles() const;
248
255
260 const AMRParticles<P>&
261 getBufferParticles() const;
262
269
274 const AMRParticles<P>&
275 getMaskParticles() const;
276
281 getGrids() const;
282
287 const RealVect
288 getProbLo() const noexcept;
289
294 const Vector<RealVect>
295 getDx() const noexcept;
296
302 operator[](const int a_level);
303
308 const ParticleData<P>&
309 operator[](const int a_level) const;
310
317
323 getCellParticles() const;
324
331 getCellParticles(const int a_level);
332
339 getCellParticles(const int a_level) const;
340
347 BinFab<P>&
348 getCellParticles(const int a_level, const DataIndex a_dit);
349
356 const BinFab<P>&
357 getCellParticles(const int a_level, const DataIndex a_dit) const;
358
366 void
368
376 void
378
383 void
385
390 void
392
397 void
399
404 void
406
413 void
414 addParticles(const BinFab<P>& a_particles, const int a_lvl, const DataIndex a_dit);
415
422 void
424
429 void
431
436 void
438
442 void
443 sanityCheck() const noexcept;
444
448 void
449 remap();
450
456 void
458
464 void
466
473 void
475
483 template <Real& (P::*particleScalarField)()>
484 inline void
485 setValue(const Real a_value);
486
494 template <RealVect& (P::*particleVectorField)()>
495 inline void
497
501 unsigned long long
503
507 unsigned long long
509
513 unsigned long long
515
519 unsigned long long
521
525 unsigned long long
527
531 unsigned long long
533
534protected:
535 // Reductions for performing catenation and join operations in a thread-safe manner.
536#pragma omp declare reduction(catenate : List<P> : ThreadSafeCatenation<P>(omp_out, omp_in))
537#pragma omp declare reduction(join : List<P> : ThreadSafeJoin<P>(omp_out, omp_in))
538
543
548
553
558
563
568
573
578
583
588
593
598
603
608
613
618
623
628
637
643
649
654
660 void
661 setupGrownGrids(const int a_base, const int a_finestLevel);
662
668 void
669 setupParticleData(const int a_base, const int a_finestLevel);
670
677 inline void
679
686 inline void
688
694 inline void
696 List<P>& a_unmappedParticles) const noexcept;
697
703 inline void
705 std::vector<ParticleMap<List<P>>>& a_localParticles) const noexcept;
706
712 inline void
714};
715
716#include <CD_NamespaceFooter.H>
717
719
720#endif
Declaration of LevelTiles.
Declaration of various useful OpenMP-related utilities.
Implementation of CD_ParticleContainer.H.
Templated class for holding particles on an AMR hierarchy with particle remapping.
Definition CD_ParticleContainer.H:51
Vector< ProblemDomain > m_domains
Problem domains.
Definition CD_ParticleContainer.H:602
AMRCellParticles< P > & getCellParticles()
Get all cell particles.
Definition CD_ParticleContainerImplem.H:358
Vector< BoxLayout > m_grownGrids
Grown layouts.
Definition CD_ParticleContainer.H:612
void getCellParticlesDestructive(BinFab< P > &a_cellParticles, const int a_lvl, const DataIndex a_dit)
Fill a cell-sorted particle data holder with all the particles in the grid patch. The original partic...
Definition CD_ParticleContainerImplem.H:428
void organizeParticlesByPatch()
Sort particles by cell.
Definition CD_ParticleContainerImplem.H:508
bool m_verbose
Verbose or not.
Definition CD_ParticleContainer.H:582
const Vector< RealVect > getDx() const noexcept
Get grid resolutions.
Definition CD_ParticleContainerImplem.H:263
void clearMaskParticles() const
Clear the "mask" particles.
Definition CD_ParticleContainerImplem.H:1728
unsigned long long getNumberOfOutcastParticlesGlobal() const
Get global number of particles.
Definition CD_ParticleContainerImplem.H:1514
Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > m_validRegion
Map of valid cells; evaluates to false if a cell is covered by a finer grid.
Definition CD_ParticleContainer.H:607
AMRCellParticles< P > m_cellSortedParticles
Cell particles.
Definition CD_ParticleContainer.H:653
void setupParticleData(const int a_base, const int a_finestLevel)
Setup function for the particle data (m_particles and m_maskParticles)
Definition CD_ParticleContainerImplem.H:154
AMRParticles< P > m_particles
The actual particles that this ParticleContainer represents.
Definition CD_ParticleContainer.H:627
const RealVect getProbLo() const noexcept
Get lower-left corner.
Definition CD_ParticleContainerImplem.H:256
void admitValidParticles(List< P > &a_evictedParticles, ParticleData< P > &a_particles, const int a_coarseLevel)
Evict particles if they move out of the valid region.
unsigned long long getNumberOfValidParticlesLocal() const
Get local number of particles.
Definition CD_ParticleContainerImplem.H:1443
void setValue(const Real a_value)
Set the particle member to the input value.
Definition CD_ParticleContainerImplem.H:1388
bool m_debug
Debug or not.
Definition CD_ParticleContainer.H:577
bool m_isOrganizedByCell
Check if particle container is "cell sorted".
Definition CD_ParticleContainer.H:567
void preRegrid(const int a_base)
Cache particles before calling regrid.
Definition CD_ParticleContainerImplem.H:1219
void define(const Vector< DisjointBoxLayout > &a_grids, const Vector< ProblemDomain > &a_domains, const Vector< Real > &a_dx, const Vector< int > &a_refRat, const Vector< ValidMask > &a_validMask, const Vector< RefCountedPtr< LevelTiles > > &a_levelTiles, const RealVect &a_probLo, const int a_blockingFactor, const int a_finestLevel, const std::string a_realm)
Define the container. This will do a clear-out of all particles.
Definition CD_ParticleContainerImplem.H:77
virtual ~ParticleContainer()
Destructor ( does nothing)
Definition CD_ParticleContainerImplem.H:70
Vector< RefCountedPtr< LevelTiles > > m_levelTiles
Tiled AMR space.
Definition CD_ParticleContainer.H:587
void sortParticles() noexcept
Sort particles according to the < operator in the particle.
Definition CD_ParticleContainerImplem.H:197
const Vector< DisjointBoxLayout > & getGrids() const
Get the AMR grids.
Definition CD_ParticleContainerImplem.H:249
int m_blockingFactor
Blocking factor, aka grid size.
Definition CD_ParticleContainer.H:547
unsigned long long getNumberOfOutcastParticlesLocal() const
Get local number of particles.
Definition CD_ParticleContainerImplem.H:1485
ParticleData< P > & operator[](const int a_level)
Get particle data on a level.
Definition CD_ParticleContainerImplem.H:332
void addParticles(const List< P > &a_particles)
Add particles to container.
Definition CD_ParticleContainerImplem.H:551
void setupGrownGrids(const int a_base, const int a_finestLevel)
Set up grown grids.
Definition CD_ParticleContainerImplem.H:123
unsigned long long getNumberOfMaskParticlesGlobal() const
Get the number particles in the halo cells.
Definition CD_ParticleContainerImplem.H:1556
void clear(AMRParticles< P > &a_particles) const
Clear particles on input data holder.
Definition CD_ParticleContainerImplem.H:1752
void remap()
Remap over the entire AMR hierarchy.
Definition CD_ParticleContainerImplem.H:973
Vector< int > m_refRat
Refinement ratios. Entry at index 'l' is the refinement between level 'l' and level 'l+1'.
Definition CD_ParticleContainer.H:622
bool m_profile
Profile or not.
Definition CD_ParticleContainer.H:572
void clearParticles()
Clear all particles.
Definition CD_ParticleContainerImplem.H:1710
int m_finestLevel
Finest grid level.
Definition CD_ParticleContainer.H:552
bool m_isDefined
Check if particle container is defined.
Definition CD_ParticleContainer.H:562
void clearOutcast() noexcept
Clear outcast particles.
Definition CD_ParticleContainerImplem.H:1737
void catenateParticleMaps(std::vector< ParticleMap< List< P > > > &a_globalParticles, std::vector< ParticleMap< List< P > > > &a_localParticles) const noexcept
Catenate the particles. This is usually called within OpenMP parallel regions.
Definition CD_ParticleContainerImplem.H:1169
unsigned long long getNumberOfMaskParticlesLocal() const
Get the number particles in the halo cells.
Definition CD_ParticleContainerImplem.H:1527
void organizeParticlesByCell()
Sort particles by cell.
Definition CD_ParticleContainerImplem.H:474
AMRParticles< P > m_bufferParticles
Special data holder that holds particles on a grown grid layout.
Definition CD_ParticleContainer.H:636
void mapParticlesToAMRGrid(std::vector< ParticleMap< List< P > > > &a_mappedParticles, List< P > &a_unmappedParticles) const noexcept
Iterate through the unmapped particles and map them to proper level, grid indices,...
Definition CD_ParticleContainerImplem.H:1110
int getFinestLevel() const
Get finest AMR level.
Definition CD_ParticleContainerImplem.H:231
std::string m_realm
Realm on which the ParticleContainer is defined.
Definition CD_ParticleContainer.H:542
void clearBufferParticles() const
Clear the buffer particles.
Definition CD_ParticleContainerImplem.H:1719
void assignLocalParticles(ParticleMap< List< P > > &a_mappedParticles, AMRParticles< P > &a_particleData) const noexcept
Gather particles locally.
Definition CD_ParticleContainerImplem.H:1189
Vector< DisjointBoxLayout > m_grids
AMR grids.
Definition CD_ParticleContainer.H:592
const std::string getRealm() const
Get the realm where this ParticleContainer lives.
Definition CD_ParticleContainerImplem.H:240
RealVect m_probLo
Lower left corner of the physical domain.
Definition CD_ParticleContainer.H:557
void transferParticlesToSingleList(List< P > &a_list, AMRParticles< P > &a_particles) const noexcept
Gather the particles onto a single list.
Definition CD_ParticleContainerImplem.H:1064
bool isOrganizedByCell() const
Is cell-sorted or not.
Definition CD_ParticleContainerImplem.H:224
void transferMaskParticles(const Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > &a_mask)
Copy particles to the mask particle data holder.
Definition CD_ParticleContainerImplem.H:1637
void copyParticlesToSingleList(List< P > &a_list, const AMRParticles< P > &a_particles) const noexcept
Copy the input particles onto a single list.
Definition CD_ParticleContainerImplem.H:1087
ParticleContainer()
Default constructor. Leaves object in undefined state.
Definition CD_ParticleContainerImplem.H:34
void sanityCheck() const noexcept
Run a sanity check and make sure all particles are in their correctly assigned box.
Definition CD_ParticleContainerImplem.H:1038
Vector< DisjointBoxLayout > m_oldGrids
Old AMR grids. Used during regrids.
Definition CD_ParticleContainer.H:597
AMRParticles< P > m_maskParticles
Special data holder that holds copies of particles on the coarse level that are within a specified ra...
Definition CD_ParticleContainer.H:642
AMRParticles< P > & getMaskParticles()
Get the mask particles.
Definition CD_ParticleContainerImplem.H:314
unsigned long long getNumberOfValidParticlesGlobal() const
Get global number of particles.
Definition CD_ParticleContainerImplem.H:1472
void resetParticleIDs() noexcept
Compute new particle IDs.
Definition CD_ParticleContainerImplem.H:1260
void addParticlesDestructive(List< P > &a_particles)
Add particles to container. The input particles are destroyed by this routine.
Definition CD_ParticleContainerImplem.H:617
AMRParticles< P > & getBufferParticles()
Get buffer particles on all levels.
Definition CD_ParticleContainerImplem.H:296
Vector< RealVect > m_dx
Resolutions on each grid level.
Definition CD_ParticleContainer.H:617
AMRParticles< P > & getParticles()
Get all particles on all levels.
Definition CD_ParticleContainerImplem.H:270
AMRParticles< P > m_cacheParticles
Particles stored on the old grid.
Definition CD_ParticleContainer.H:648
void transferParticles(ParticleContainer< P > &a_otherContainer)
Move particles into this container.
Definition CD_ParticleContainerImplem.H:914
void regrid(const Vector< DisjointBoxLayout > &a_grids, const Vector< ProblemDomain > &a_domains, const Vector< Real > &a_dx, const Vector< int > &a_refRat, const Vector< ValidMask > &a_validMask, const Vector< RefCountedPtr< LevelTiles > > &a_levelTiles, const int a_base, const int a_newFinestLevel)
Regrid function. a_base is the coarsest grid level which did not change.
Definition CD_ParticleContainerImplem.H:1298
void copyMaskParticles(const Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > &a_mask) const
Copy particles to mask particle data holder.
Definition CD_ParticleContainerImplem.H:1569
Base class for a tracer particle solver. This solver can advance particles in a pre-defined velocity ...
Definition CD_TracerParticleSolver.H:37
TracerParticleSolver()
Default constructor.
Definition CD_TracerParticleSolverImplem.H:25