EntityParticleContainer Class Reference

SPADES API: spades::particles::EntityParticleContainer Class Reference
SPADES API
spades::particles::EntityParticleContainer Class Reference

Main SPADES entity container. More...

#include <EntityParticleContainer.H>

Inheritance diagram for spades::particles::EntityParticleContainer:
[legend]
Collaboration diagram for spades::particles::EntityParticleContainer:
[legend]

Public Member Functions

 EntityParticleContainer (amrex::AmrParGDB *par_gdb, int ngrow=0)
 Constructor.
 
 EntityParticleContainer (const amrex::Vector< amrex::Geometry > &geom, const amrex::Vector< amrex::DistributionMapping > &dmap, const amrex::Vector< amrex::BoxArray > &ba, int ngrow=0)
 Constructor.
 
void initialize_entities ()
 Initialize the entities.
 
void sort () override
 Sort the entities.
 
void write_plot_file (const std::string &plt_filename) override
 Write the particles to file.
 
void read_parameters () override
 Read user parameters.
 
void initialize_variable_names () override
 Initialize variable names.
 
- Public Member Functions inherited from spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >
 SpadesParticleContainer (amrex::AmrParGDB *par_gdb, int ngrow=0)
 Constructor.
 
 SpadesParticleContainer (const amrex::Vector< amrex::Geometry > &geom, const amrex::Vector< amrex::DistributionMapping > &dmap, const amrex::Vector< amrex::BoxArray > &ba, int ngrow=0)
 Constructor.
 
void initialize_state ()
 Initialize particle states (counts and offsets)
 
void clear_state ()
 Delete particle states (counts and offsets)
 
void update_counts ()
 Update the particle counts and offsets.
 
void count_particles ()
 Update the particle counts.
 
void count_offsets ()
 Update the particle offsets.
 
const amrex::iMultiFab & counts () const
 Get the particle counts.
 
const amrex::iMultiFab & offsets () const
 Get the particle offsets.
 
amrex::Long total_count (const int typ) const
 Get the total number of particles of typ.
 
amrex::Long min_count (const int typ) const
 Get the minimum number of particles of typ.
 
amrex::Long max_count (const int typ) const
 Get the maximum number of particles of typ.
 
void check_sort (const amrex::MFIter &mfi)
 Check the result of the sort operation.
 
void sort_impl (const CompareFunctor &compare)
 Sort the particles implementation.
 
void sort_impl (const CompareFunc &compare)
 
void sort_impl (const CompareFunc &compare)
 
void nonencoded_sort_impl (const CompareFunctor &compare)
 Non-encoded sort the particles implementation.
 
void nonencoded_sort_impl (const CompareFunc &compare)
 
void nonencoded_sort_impl (const CompareFunc &compare)
 
void encoded_sort_impl ()
 Encoded sort the particles implementation.
 
void print_messages (const std::string &header)
 Print all the particles to screen.
 
void reposition_particles ()
 Reposition the particles inside a cell for visualization.
 
int ngrow () const
 Number of grow cells.
 
void write_plot_file_impl (const std::string &plt_filename, const std::string &name)
 Write the particles to file (implementation)
 
void check_sort_type (const std::string &sort_type)
 Check valid sort type.
 
ParticleArrays< NArrayReal, NArrayInt, ParticleType, RealVector, IntVectorparticle_arrays (ParticleTileType &pti) const
 

Static Public Member Functions

static std::string identifier ()
 Class identifier name.
 
- Static Public Member Functions inherited from spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >
static std::string identifier ()
 Class identifier name.
 

Private Attributes

int m_entities_per_lp {1}
 Initial entities per LP.
 

Additional Inherited Members

- Public Types inherited from spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >
using ParticleType
 
using ParticleTileType
 
using IntVector
 
using RealVector
 
- Static Public Attributes inherited from spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >
static constexpr int LEV
 Level index.
 
- Protected Attributes inherited from spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >
int m_ngrow
 Number of grow cells.
 
amrex::Vector< int > m_writeflags_real
 Flags for real data to write to file.
 
amrex::Vector< int > m_writeflags_int
 Flags for int data to write to file.
 
amrex::Vector< std::string > m_real_data_names
 Names for real data to write to file.
 
amrex::Vector< std::string > m_int_data_names
 Names for int data to write to file.
 
std::string m_sort_type
 Sort type.
 
amrex::iMultiFab m_counts
 Count of particles in each cell.
 
amrex::iMultiFab m_offsets
 Offsets of particles in each cell.
 
amrex::MultiFab m_min_timestamp
 Minimum timestamp in each cell for each type.
 
amrex::MultiFab m_max_timestamp
 Maximum timestamp in each cell for each type.
 

Detailed Description

Main SPADES entity container.

Constructor & Destructor Documentation

◆ EntityParticleContainer() [1/2]

spades::particles::EntityParticleContainer::EntityParticleContainer ( amrex::AmrParGDB * par_gdb,
int ngrow = 0 )
explicit

Constructor.

Parameters
par_gdb[in] particle database
ngrow[in] number of grow cells
10 0,
11 0,
14{}
SpadesParticleContainer(amrex::AmrParGDB *par_gdb, int ngrow=0)
Definition SpadesParticleContainer.H:9
@ ncomps
Definition EntityData.H:18
@ ncomps
Definition EntityData.H:12
static constexpr int NTYPES
Number of different entity types.
Definition EntityData.H:31

◆ EntityParticleContainer() [2/2]

spades::particles::EntityParticleContainer::EntityParticleContainer ( const amrex::Vector< amrex::Geometry > & geom,
const amrex::Vector< amrex::DistributionMapping > & dmap,
const amrex::Vector< amrex::BoxArray > & ba,
int ngrow = 0 )
explicit

Constructor.

Parameters
geom[in] geometry
dmap[in] distribution map
ba[in] box array
ngrow[in] number of grow cells

Member Function Documentation

◆ identifier()

static std::string spades::particles::EntityParticleContainer::identifier ( )
inlinestatic

Class identifier name.

Returns
class identifier
31{ return "entities"; }
Here is the caller graph for this function:

◆ initialize_entities()

void spades::particles::EntityParticleContainer::initialize_entities ( )

Initialize the entities.

64{
65 BL_PROFILE("spades::EntityParticleContainer::initialize_entities()");
66
67 const auto& plo = Geom(LEV).ProbLoArray();
68 const auto& dx = Geom(LEV).CellSizeArray();
69 const auto& dom = Geom(LEV).Domain();
70 const auto entities_per_lp = m_entities_per_lp;
71
72 for (amrex::MFIter mfi = MakeMFIter(LEV); mfi.isValid(); ++mfi) {
73 DefineAndReturnParticleTile(LEV, mfi);
74 }
75
76 amrex::iMultiFab num_particles(
77 ParticleBoxArray(LEV), ParticleDistributionMap(LEV), 1, 0,
78 amrex::MFInfo());
79 amrex::iMultiFab init_offsets(
80 ParticleBoxArray(LEV), ParticleDistributionMap(LEV), 1, 0,
81 amrex::MFInfo());
82 num_particles.setVal(entities_per_lp);
83 init_offsets.setVal(0);
84
85 for (amrex::MFIter mfi = MakeMFIter(LEV); mfi.isValid(); ++mfi) {
86 const amrex::Box& box = mfi.tilebox();
87
88 const auto ncells = static_cast<int>(box.numPts());
89 const int* in = num_particles[mfi].dataPtr();
90 int* out = init_offsets[mfi].dataPtr();
91 const auto np = amrex::Scan::PrefixSum<int>(
92 ncells, [=] AMREX_GPU_DEVICE(int i) -> int { return in[i]; },
93 [=] AMREX_GPU_DEVICE(int i, int const& xi) { out[i] = xi; },
94 amrex::Scan::Type::exclusive, amrex::Scan::retSum);
95
96 const amrex::Long pid = ParticleType::NextID();
97 ParticleType::NextID(pid + np);
98 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
99 static_cast<amrex::Long>(pid + np) < amrex::LastParticleID,
100 "Error: overflow on particle id numbers!");
101
102 const auto my_proc = amrex::ParallelDescriptor::MyProc();
103 const auto& offset_arr = init_offsets[mfi].const_array();
104 const auto& num_particles_arr = num_particles[mfi].const_array();
105 const auto index = std::make_pair(mfi.index(), mfi.LocalTileIndex());
106 auto& pti = GetParticles(LEV)[index];
107 pti.resize(np);
108 const auto parrs = particle_arrays(pti);
109
110 amrex::ParallelFor(
111 box, [=] AMREX_GPU_DEVICE(
112 int i, int j, int AMREX_D_PICK(, , k)) noexcept {
113 const amrex::IntVect iv(AMREX_D_DECL(i, j, k));
114 const int start = offset_arr(iv);
115 for (int n = start; n < start + num_particles_arr(iv); n++) {
116 auto& p = parrs.m_aos[n];
117 p.id() = pid + n;
118 p.cpu() = my_proc;
119
120 MarkEntityUndefined()(n, parrs);
121 parrs.m_idata[EntityIntData::owner][n] =
122 static_cast<int>(dom.index(iv));
123
124 AMREX_D_TERM(
125 p.pos(0) = plo[0] + (iv[0] + constants::HALF) * dx[0];
126 , p.pos(1) = plo[1] + (iv[1] + constants::HALF) * dx[1];
127 ,
128 p.pos(2) = plo[2] + (iv[2] + constants::HALF) * dx[2];)
129
130 AMREX_D_TERM(parrs.m_idata[CommonIntData::i][n] = iv[0];
131 , parrs.m_idata[CommonIntData::j][n] = iv[1];
132 , parrs.m_idata[CommonIntData::k][n] = iv[2];)
133 }
134
135 for (int n = start; n < start + entities_per_lp; n++) {
136 const amrex::Real ts = 0.0;
137
138 parrs.m_rdata[CommonRealData::timestamp][n] = ts;
139 parrs.m_idata[CommonIntData::type_id][n] =
141 }
142 });
143
144 // This is necessary
145 amrex::Gpu::streamSynchronize();
146 }
147 Redistribute();
148
149 // Sanity check all initial particles
150#ifdef AMREX_USE_OMP
151#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
152#endif
153 for (MyParIter pti(*this, LEV); pti.isValid(); ++pti) {
154 const size_t np = pti.numParticles();
155 const auto parrs = particle_arrays(pti.GetParticleTile());
156
157 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(long pidx) noexcept {
158 bool valid_type = false;
159 for (int typ = 0; typ < EntityTypes::NTYPES; typ++) {
160 valid_type = parrs.m_idata[CommonIntData::type_id][pidx] == typ;
161 if (valid_type) {
162 break;
163 }
164 }
165 AMREX_ASSERT(valid_type);
166 AMREX_ASSERT(parrs.m_aos[pidx].id() >= 0);
167 });
168 }
169}
int m_entities_per_lp
Initial entities per LP.
Definition EntityParticleContainer.H:72
ParticleArrays< NArrayReal, NArrayInt, ParticleType, RealVector, IntVector > particle_arrays(ParticleTileType &pti) const
Definition SpadesParticleContainer.H:218
static constexpr amrex::Real HALF
Definition Constants.H:37
@ type_id
Definition ParticleData.H:18
@ timestamp
Definition ParticleData.H:12
@ owner
Definition EntityData.H:18
static constexpr int ENTITY
Entity.
Definition EntityData.H:25
Here is the call graph for this function:

◆ initialize_variable_names()

void spades::particles::EntityParticleContainer::initialize_variable_names ( )
overridevirtual

Initialize variable names.

Implements spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >.

39{
40 BL_PROFILE("spades::EntityParticleContainer::initialize_variable_names()");
41
46
49
50 AMREX_D_TERM(
51 m_int_data_names[CommonIntData::i] = "i";
52 m_writeflags_int[CommonIntData::i] = 1;
53 , m_int_data_names[CommonIntData::j] = "j";
54 m_writeflags_int[CommonIntData::j] = 1;
55 , m_int_data_names[CommonIntData::k] = "k";
56 m_writeflags_int[CommonIntData::k] = 1;)
61}

◆ read_parameters()

void spades::particles::EntityParticleContainer::read_parameters ( )
overridevirtual

Read user parameters.

Reimplemented from spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >.

30{
32 {
33 amrex::ParmParse pp("spades");
34 pp.query("entities_per_lp", m_entities_per_lp);
35 }
36}
virtual void read_parameters()
Read user parameters.
Definition SpadesParticleContainer.H:197
Here is the call graph for this function:

◆ sort()

void spades::particles::EntityParticleContainer::sort ( )
overridevirtual

Sort the entities.

Implements spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >.

172{
173 BL_PROFILE("spades::EntityParticleContainer::sort()");
174
175 sort_impl(CompareParticle());
176}
Here is the call graph for this function:

◆ write_plot_file()

void spades::particles::EntityParticleContainer::write_plot_file ( const std::string & plt_filename)
inlineoverridevirtual

Write the particles to file.

Parameters
plt_filename[in] file name for the plot file

Implements spades::particles::SpadesParticleContainer< EntityTypes::NTYPES, 0, 0, EntityRealData::ncomps, EntityIntData::ncomps >.

60 {
61 write_plot_file_impl(plt_filename, identifier());
62 };
static std::string identifier()
Class identifier name.
Definition EntityParticleContainer.H:31
void write_plot_file_impl(const std::string &plt_filename, const std::string &name)
Definition SpadesParticleContainer.H:760
Here is the call graph for this function:

Member Data Documentation

◆ m_entities_per_lp

int spades::particles::EntityParticleContainer::m_entities_per_lp {1}
private

Initial entities per LP.

72{1};

The documentation for this class was generated from the following files: