EntityParticleContainer Class Reference
SPADES API
|
spades::particles::EntityParticleContainer Class Reference
Main SPADES entity container. More...
#include <EntityParticleContainer.H>
Inheritance diagram for spades::particles::EntityParticleContainer:
Collaboration diagram for spades::particles::EntityParticleContainer:
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. | |
![]() | |
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, IntVector > | particle_arrays (ParticleTileType &pti) const |
Static Public Member Functions | |
static std::string | identifier () |
Class identifier name. | |
![]() | |
static std::string | identifier () |
Class identifier name. | |
Private Attributes | |
int | m_entities_per_lp {1} |
Initial entities per LP. | |
Additional Inherited Members | |
![]() | |
using | ParticleType |
using | ParticleTileType |
using | IntVector |
using | RealVector |
![]() | |
static constexpr int | LEV |
Level index. | |
![]() | |
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]
|
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
int ngrow() const
Definition SpadesParticleContainer.H:180
static constexpr int NTYPES
Number of different entity types.
Definition EntityData.H:31
◆ EntityParticleContainer() [2/2]
|
explicit |
Constructor.
- Parameters
-
geom [in] geometry dmap [in] distribution map ba [in] box array ngrow [in] number of grow cells
Member Function Documentation
◆ 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
71
73 DefineAndReturnParticleTile(LEV, mfi);
74 }
75
76 amrex::iMultiFab num_particles(
78 amrex::MFInfo());
79 amrex::iMultiFab init_offsets(
81 amrex::MFInfo());
82 num_particles.setVal(entities_per_lp);
83 init_offsets.setVal(0);
84
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());
107 pti.resize(np);
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] =
140 EntityTypes::ENTITY;
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
154 const size_t np = pti.numParticles();
156
157 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(long pidx) noexcept {
158 bool valid_type = false;
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 int LEV
Definition SpadesParticleContainer.H:183
Here is the call graph for this function:
◆ initialize_variable_names()
|
overridevirtual |
Initialize variable names.
39{
40 BL_PROFILE("spades::EntityParticleContainer::initialize_variable_names()");
41
46
49
50 AMREX_D_TERM(
52 m_writeflags_int[CommonIntData::i] = 1;
54 m_writeflags_int[CommonIntData::j] = 1;
56 m_writeflags_int[CommonIntData::k] = 1;)
61}
amrex::Vector< std::string > m_int_data_names
Definition SpadesParticleContainer.H:241
amrex::Vector< std::string > m_real_data_names
Definition SpadesParticleContainer.H:238
amrex::Vector< int > m_writeflags_real
Definition SpadesParticleContainer.H:232
amrex::Vector< int > m_writeflags_int
Definition SpadesParticleContainer.H:235
◆ 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");
35 }
36}
virtual void read_parameters()
Read user parameters.
Definition SpadesParticleContainer.H:197
Here is the call graph for this function:
◆ sort()
|
overridevirtual |
Sort the entities.
172{
173 BL_PROFILE("spades::EntityParticleContainer::sort()");
174
175 sort_impl(CompareParticle());
176}
void sort_impl(const CompareFunctor &compare)
Here is the call graph for this function:
◆ write_plot_file()
|
inlineoverridevirtual |
Write the particles to file.
- Parameters
-
plt_filename [in] file name for the plot file
60 {
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
|
private |
Initial entities per LP.
72{1};
The documentation for this class was generated from the following files:
- /home/runner/work/spades/spades/Source/EntityParticleContainer.H
- /home/runner/work/spades/spades/Source/EntityParticleContainer.cpp
Generated by