13#ifndef CD_PARTICLECONTAINER_H
14#define CD_PARTICLECONTAINER_H
30#include <ProblemDomain.H>
31#include <DisjointBoxLayout.H>
33#include <DataIterator.H>
34#include <LayoutData.H>
37#include <RefCountedPtr.H>
48#include <CD_NamespaceHeader.H>
55template <
typename P,
typename Traits>
121template <
typename P = NoPayload,
typename Traits = ParticleTraits<P>>
193 define(
const Vector<DisjointBoxLayout>& a_grids,
194 const Vector<ProblemDomain>& a_domains,
195 const Vector<Real>& a_dx,
196 const Vector<int>& a_refRat,
197 const RealVect& a_probLo,
198 const int a_minBlockSize,
199 const Vector<RefCountedPtr<LevelTiles>>& a_levelTiles,
200 const int a_finestLevel,
201 const std::string& a_realm,
202 const Vector<RefCountedPtr<LevelData<BaseFab<bool>>>>* a_validCells)
204 CH_TIME(
"ParticleContainer::define");
206 CH_assert(a_grids.size() > a_finestLevel);
207 CH_assert(a_domains.size() > a_finestLevel);
208 CH_assert(a_dx.size() > a_finestLevel);
209 CH_assert(a_refRat.size() > a_finestLevel);
210 CH_assert(a_levelTiles.size() > a_finestLevel);
222 m_dx.resize(a_finestLevel + 1);
223 for (
int lvl = 0; lvl <= a_finestLevel; lvl++) {
224 m_dx[lvl] = a_dx[lvl] * RealVect::Unit;
232 for (
int lvl = 0; lvl <= a_finestLevel; lvl++) {
240 for (
int lvl = 0; lvl <= a_finestLevel; lvl++) {
259 const Vector<DisjointBoxLayout>&
444 CH_TIME(
"ParticleContainer::clearParticles");
450 const DisjointBoxLayout& dbl =
m_grids[lvl];
451 const DataIterator& dit = dbl.dataIterator();
452 const int nbox = dit.size();
454#pragma omp parallel for schedule(runtime)
455 for (
int mybox = 0; mybox < nbox; mybox++) {
456 const DataIndex& din = dit[mybox];
480 CH_TIME(
"ParticleContainer::addParticlesDestructive");
485 DataIterator dit =
m_grids[lvl].dataIterator();
511 CH_TIME(
"ParticleContainer::getNumberOfValidParticlesLocal");
515 unsigned long long n = 0;
518 const DisjointBoxLayout& dbl =
m_grids[lvl];
519 const DataIterator& dit = dbl.dataIterator();
520 const int nbox = dit.size();
522#pragma omp parallel for schedule(runtime) reduction(+ : n)
523 for (
int mybox = 0; mybox < nbox; mybox++) {
524 const DataIndex& din = dit[mybox];
525 const Leaf& leaf = level[din];
527 for (std::size_t i = 0; i < leaf.
size(); i++) {
545 CH_TIME(
"ParticleContainer::getNumberOfValidParticlesGlobal");
616 regrid(
const Vector<DisjointBoxLayout>& a_grids,
617 const Vector<ProblemDomain>& a_domains,
618 const Vector<Real>& a_dx,
619 const Vector<int>& a_refRat,
620 const int a_minBlockSize,
621 const Vector<RefCountedPtr<LevelTiles>>& a_levelTiles,
622 const int a_newFinestLevel);
704 copyMaskParticles(
const Vector<RefCountedPtr<LevelData<BaseFab<bool>>>>& a_mask);
739 CH_TIME(
"ParticleContainer::clearMaskParticles");
745 const DisjointBoxLayout& dbl =
m_grids[lvl];
746 const DataIterator& dit = dbl.dataIterator();
748 const int nbox = dit.size();
750#pragma omp parallel for schedule(runtime)
751 for (
int mybox = 0; mybox < nbox; mybox++) {
752 const DataIndex& din = dit[mybox];
765 CH_TIME(
"ParticleContainer::clearBufferParticles");
772 const DataIterator& dit = dbl.dataIterator();
774 const int nbox = dit.size();
776#pragma omp parallel for schedule(runtime)
777 for (
int mybox = 0; mybox < nbox; mybox++) {
778 const DataIndex& din = dit[mybox];
789 const Vector<BoxLayout>&
806 CH_TIME(
"ParticleContainer::transferParticles");
814 const DisjointBoxLayout& dbl =
m_grids[lvl];
815 const DataIterator& dit = dbl.dataIterator();
817 const int nbox = dit.size();
819#pragma omp parallel for schedule(runtime)
820 for (
int mybox = 0; mybox < nbox; mybox++) {
821 const DataIndex& din = dit[mybox];
823 dst[din].catenate(src[din]);
845 CH_TIME(
"ParticleContainer::organizeParticlesByCell");
852 const DisjointBoxLayout& dbl =
m_grids[lvl];
853 const DataIterator& dit = dbl.dataIterator();
855 const int nbox = dit.size();
857#pragma omp parallel for schedule(runtime)
858 for (
int mybox = 0; mybox < nbox; mybox++) {
859 const DataIndex& din = dit[mybox];
876 CH_TIME(
"ParticleContainer::organizeParticlesByPatch");
1022 const Vector<RefCountedPtr<LevelData<BaseFab<bool>>>>*
m_validCells =
nullptr;
1074 for (
int dir = 0; dir < SpaceDim; dir++) {
1075 iv[dir] =
static_cast<int>(std::floor((a_pos[dir] -
m_probLo[dir]) /
m_dx[a_lvl][dir]));
1090 inValidBox(
const int a_lvl,
const Box& a_box,
const RealVect& a_pos)
const
1092 return a_box.contains(this->
cellIndex(a_lvl, a_pos));
1096#include <CD_NamespaceFooter.H>
Declaration of LevelTiles.
Agglomeration of basic MPI reductions.
Implementation of CD_ParticleContainer.H.
Vector< RefCountedPtr< LayoutData< ParticleSoA< P, Traits > > > > AMRParticlesSoA
Per-level holder vector: one ParticleSoA leaf container per box, per level.
Definition CD_ParticleContainer.H:56
Declaration of ParticleGhostMask, a per-box CSR lookup of particle ghost scatter targets.
Vector< RefCountedPtr< LayoutData< ParticleGhostMask > > > AMRParticleGhostMask
AMR-wide particle ghost-target lookup: one per-box CSR table per level, indexed by SOURCE level.
Definition CD_ParticleGhostMask.H:210
Declaration of ParticleSoA, an arena-backed Struct-of-Arrays particle container.
std::int64_t ParticleID
Global particle identifier type (container-owned metadata column; fixed-width for I/O).
Definition CD_ParticleSoA.H:161
AMR-hierarchy container of computational particles, stored per patch in Struct-of-Arrays form.
Definition CD_ParticleContainer.H:123
const LevelParticles & operator[](const int a_lvl) const
Valid particles on one level (const).
Definition CD_ParticleContainer.H:396
void fillGhostParticles(const AMRParticleGhostMask &a_maskSame, const AMRParticleGhostMask &a_maskCoarToFine, const AMRParticleGhostMask &a_maskFineToCoar)
Fill each patch's ghost halo from prebuilt Realm particle ghost masks.
Definition CD_ParticleContainerImplem.H:856
bool isDefined() const
Whether define() has been called.
Definition CD_ParticleContainer.H:426
const Vector< BoxLayout > & getGrownGrids() const
Per-level grown grids that the buffer particles live on.
Definition CD_ParticleContainer.H:790
void regrid(const Vector< DisjointBoxLayout > &a_grids, const Vector< ProblemDomain > &a_domains, const Vector< Real > &a_dx, const Vector< int > &a_refRat, const int a_minBlockSize, const Vector< RefCountedPtr< LevelTiles > > &a_levelTiles, const int a_newFinestLevel)
Rebuild over a new AMR layout and redistribute the preRegrid()-cached particles onto it.
Definition CD_ParticleContainerImplem.H:540
void clearParticles()
Drop all valid particles on every level (keeps each leaf's arena capacity).
Definition CD_ParticleContainer.H:442
AMRParticlesSoA< P, Traits > m_maskParticles
Halo/mask particles per level.
Definition CD_ParticleContainer.H:1052
IntVect cellIndex(const int a_lvl, const RealVect &a_pos) const
Cell index containing a position on a given level (floor((x - probLo)/dx)).
Definition CD_ParticleContainer.H:1071
Vector< RealVect > getDx() const
Per-level grid spacing.
Definition CD_ParticleContainer.H:270
void transferMaskParticles(const Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > &a_mask)
Move the valid particles selected by a per-cell mask into the mask holder, all levels.
Definition CD_ParticleContainerImplem.H:962
AMRParticlesSoA< P, Traits > m_cacheParticles
Regrid cache: the pre-regrid valid holders, kept alive over the old layout by preRegrid().
Definition CD_ParticleContainer.H:1042
int m_finestLevel
Finest AMR level index.
Definition CD_ParticleContainer.H:1003
ParticleContainer & operator=(const ParticleContainer &)=delete
Copy assignment is deleted (move-only ownership).
void setupGrownGrids()
Build the grown grids (buffer-particle layout): boxes grown by the refinement factor.
Definition CD_ParticleContainerImplem.H:877
MoverPool gatherMoversToPool()
Mask fast path for remap(): pool ONLY the movers, leaving stayers in place.
Definition CD_ParticleContainerImplem.H:143
ParticleContainer()
Construct an empty, undefined container. Call define() before use.
Definition CD_ParticleContainer.H:143
void organizeParticlesByPatch()
Return to a by-patch view (the leaves remain a single contiguous array per patch).
Definition CD_ParticleContainer.H:874
void clearGhostParticles()
Remove every ghost particle (any non-Valid GhostType) from all levels and patches.
Definition CD_ParticleContainerImplem.H:598
Vector< BoxLayout > m_grownGrids
Per-level grown grids (boxes grown by the refinement factor on finer levels) for the buffer.
Definition CD_ParticleContainer.H:1062
unsigned long long getNumberOfValidParticlesGlobal() const
Number of valid particles across all ranks.
Definition CD_ParticleContainer.H:543
std::vector< std::map< PoolKey, Leaf > > MoverPool
Per-rank pool of movers: pool[rank] maps a destination patch to a small SoA of particles.
Definition CD_ParticleContainer.H:911
void preRegrid()
Cache the current valid particles ahead of a regrid.
Definition CD_ParticleContainerImplem.H:525
AMRParticlesSoA< P, Traits > m_bufferParticles
Grown-grid buffer particles per level (on m_grownGrids; filled during halo deposition).
Definition CD_ParticleContainer.H:1057
const AMRParticlesSoA< P, Traits > & getBufferParticles() const
The grown-grid buffer particles on all levels (const).
Definition CD_ParticleContainer.H:367
int getFinestLevel() const
Finest AMR level index.
Definition CD_ParticleContainer.H:290
Vector< int > m_refRat
Per-level refinement ratios (entry l is the ratio between level l and l+1).
Definition CD_ParticleContainer.H:983
void organizeParticlesByCell()
Cell-sort every valid leaf (counting sort into Fortran cell order + CSR cell offsets).
Definition CD_ParticleContainer.H:843
unsigned long long getNumberOfOutcastParticlesGlobal() const
Number of particles dropped off-domain by the most recent remap(), across all ranks.
Definition CD_ParticleContainer.H:567
const AMRParticlesSoA< P, Traits > & getMaskParticles() const
The halo/mask particles on all levels (const).
Definition CD_ParticleContainer.H:347
AMRParticlesSoA< P, Traits > m_particles
Valid particles: one ParticleSoA leaf per box, per level.
Definition CD_ParticleContainer.H:1037
LevelParticles & operator[](const int a_lvl)
Valid particles on one level (index by DataIndex to reach a patch's Leaf).
Definition CD_ParticleContainer.H:382
unsigned long long getNumberOfOutcastParticlesLocal() const
Number of particles dropped off-domain by the most recent remap() on this rank.
Definition CD_ParticleContainer.H:557
void claimOwnership(const bool a_onlyValidRegion)
Claim ownership of this rank's particles by stamping their owner rank (rankID = procID()).
Definition CD_ParticleContainerImplem.H:634
void define(const Vector< DisjointBoxLayout > &a_grids, const Vector< ProblemDomain > &a_domains, const Vector< Real > &a_dx, const Vector< int > &a_refRat, const RealVect &a_probLo, const int a_minBlockSize, const Vector< RefCountedPtr< LevelTiles > > &a_levelTiles, const int a_finestLevel, const std::string &a_realm, const Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > *a_validCells)
Allocate the per-level holders and the per-level tile-ownership maps over the AMR grids.
Definition CD_ParticleContainer.H:193
const Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > * m_validCells
Optional alias to the realm's valid-cell mask (true = cell not covered by a finer level).
Definition CD_ParticleContainer.H:1022
bool isOrganizedByCell() const
Whether the valid leaves are currently cell-sorted.
Definition CD_ParticleContainer.H:416
const Vector< DisjointBoxLayout > & getGrids() const
Per-level AMR grids.
Definition CD_ParticleContainer.H:260
bool m_isOrganizedByCell
Whether the valid leaves are currently cell-sorted.
Definition CD_ParticleContainer.H:1032
std::string m_realm
Realm label (diagnostics only).
Definition CD_ParticleContainer.H:1013
void distributeFromPool(MoverPool &a_pool, const bool a_setOwnerToReceiver)
Assign a pool into the valid holders: local appends + MPI scatter.
Definition CD_ParticleContainerImplem.H:262
unsigned long long m_numOutcastLocal
Particles dropped off-domain by the most recent remap() (local count).
Definition CD_ParticleContainer.H:1008
RealVect getProbLo() const
Lower-left corner of the physical domain.
Definition CD_ParticleContainer.H:280
int m_minBlockSize
Grid blocking factor (tile size).
Definition CD_ParticleContainer.H:998
AMRParticlesSoA< P, Traits > & getBufferParticles()
The grown-grid buffer particles on all levels.
Definition CD_ParticleContainer.H:357
RealVect m_probLo
Lower-left corner of the physical domain.
Definition CD_ParticleContainer.H:993
long long resetParticleIDs(const bool a_onlyValidRegion, const ParticleID a_startID)
Assign globally-unique, contiguous particle IDs to the owned particles.
Definition CD_ParticleContainerImplem.H:671
std::string getRealm() const
Realm label.
Definition CD_ParticleContainer.H:300
void remap()
Redistribute every valid particle to the patch/level/rank that owns its cell.
Definition CD_ParticleContainerImplem.H:494
void clearMaskParticles()
Drop all mask/halo particles on every level (keeps capacity).
Definition CD_ParticleContainer.H:737
Vector< RefCountedPtr< LevelTiles > > m_levelTiles
Per-level tile-ownership maps (cell tile -> owning grid index / rank), used by remap().
Definition CD_ParticleContainer.H:988
MoverPool gatherToPool(AMRParticlesSoA< P, Traits > &a_source, const Vector< DisjointBoxLayout > &a_sourceGrids)
Gather every particle of a source holder into a per-rank, per-destination-patch pool.
Definition CD_ParticleContainerImplem.H:49
void addParticlesDestructive(ParticleSoA< P, Traits > &a_particles)
Add a free-standing buffer of particles to the container, routing each to its owner.
Definition CD_ParticleContainer.H:478
void clearBufferParticles()
Drop all buffer particles on every level (keeps capacity).
Definition CD_ParticleContainer.H:763
const AMRParticlesSoA< P, Traits > & getParticles() const
The valid particles on all levels (const).
Definition CD_ParticleContainer.H:327
LayoutData< Leaf > LevelParticles
The per-level holder type (one Leaf per box on the level's DisjointBoxLayout).
Definition CD_ParticleContainer.H:133
unsigned long long getNumberOfValidParticlesLocal() const
Number of valid particles owned by this rank.
Definition CD_ParticleContainer.H:509
Vector< ProblemDomain > m_domains
Per-level problem domains.
Definition CD_ParticleContainer.H:973
ParticleContainer(const ParticleContainer &)=delete
Copy construction is deleted (holders are shared RefCountedPtr – a copy would alias).
LevelTiles::LevelAndBox findDestination(const RealVect &a_pos) const
Map a position to its owning (level, grid index, rank) via the finest containing tile.
Definition CD_ParticleContainerImplem.H:42
void copyMaskParticles(const Vector< RefCountedPtr< LevelData< BaseFab< bool > > > > &a_mask)
Copy the valid particles selected by a per-cell mask into the mask holder, all levels.
Definition CD_ParticleContainerImplem.H:901
~ParticleContainer()=default
Destructor.
void transferParticles(AMRParticlesSoA< P, Traits > &a_source)
Move all particles from another holder (on the same valid grids) into the valid holder.
Definition CD_ParticleContainer.H:804
Vector< RealVect > m_dx
Per-level grid spacing (isotropic, stored as RealVect).
Definition CD_ParticleContainer.H:978
Vector< DisjointBoxLayout > m_grids
Per-level AMR grids.
Definition CD_ParticleContainer.H:968
std::pair< int, unsigned int > PoolKey
Pool key identifying a destination patch: (level, grid index within the level).
Definition CD_ParticleContainer.H:906
bool m_isDefined
Whether define() has been called.
Definition CD_ParticleContainer.H:1027
bool inValidBox(const int a_lvl, const Box &a_box, const RealVect &a_pos) const
True if a position's cell lies inside a (grid) box on a given level.
Definition CD_ParticleContainer.H:1090
MoverPool gatherGhostsFromMasks(const AMRParticleGhostMask &a_maskSame, const AMRParticleGhostMask &a_maskCoarToFine, const AMRParticleGhostMask &a_maskFineToCoar)
Gather ghost copies into a per-rank pool using prebuilt particle ghost masks.
Definition CD_ParticleContainerImplem.H:754
AMRParticlesSoA< P, Traits > & getMaskParticles()
The halo/mask particles on all levels.
Definition CD_ParticleContainer.H:337
Vector< DisjointBoxLayout > m_cacheGrids
The old (pre-regrid) grids the cache holders are defined on (for iterating the cache).
Definition CD_ParticleContainer.H:1047
AMRParticlesSoA< P, Traits > & getParticles()
The valid particles on all levels.
Definition CD_ParticleContainer.H:317
Arena-backed Struct-of-Arrays particle container for a single grid patch.
Definition CD_ParticleSoA.H:655
bool isGhost(const std::size_t a_index) const noexcept
Whether particle i is a ghost particle (any non-Valid designation).
Definition CD_ParticleSoA.H:1331
std::size_t size() const noexcept
Number of particles currently stored.
Definition CD_ParticleSoA.H:882
Real sum(const Real &a_value) noexcept
Compute the sum across all MPI ranks.
Definition CD_ParallelOpsImplem.H:354
Result of a point->block query. See findDestination.
Definition CD_LevelTiles.H:123