/home/runner/work/spades/spades/Source/EntityParticleContainer.H Source File

SPADES API: /home/runner/work/spades/spades/Source/EntityParticleContainer.H Source File
SPADES API
EntityParticleContainer.H
Go to the documentation of this file.
1#ifndef ENTITYPARTICLECONTAINER_H
2#define ENTITYPARTICLECONTAINER_H
3#include <AMReX.H>
4#include <AMReX_AmrCore.H>
5#include <AMReX_AmrParGDB.H>
6#include <AMReX_Random.H>
8#include "EntityData.H"
9#include "EntityOps.H"
10#include "Utilities.H"
11
15namespace spades::particles {
16
20 EntityTypes::NTYPES,
21 0,
22 0,
23 EntityRealData::ncomps,
24 EntityIntData::ncomps>
25{
26public:
31 static std::string identifier() { return "entities"; }
32
38 explicit EntityParticleContainer(amrex::AmrParGDB* par_gdb, int ngrow = 0);
39
48 const amrex::Vector<amrex::Geometry>& geom,
49 const amrex::Vector<amrex::DistributionMapping>& dmap,
50 const amrex::Vector<amrex::BoxArray>& ba,
51 int ngrow = 0);
52
54 template <typename Model>
55 void initialize_entities(const Model& model);
56
58 void sort() override;
59
60 void write_plot_file(const std::string& plt_filename) override
61 {
62 write_plot_file_impl(plt_filename, identifier());
63 };
64
66 void read_parameters() override;
67
69 void initialize_variable_names() override;
70};
71
72template <typename Model>
74{
75 BL_PROFILE("spades::EntityParticleContainer::initialize_entities()");
76
77 const auto& plo = Geom(LEV).ProbLoArray();
78 const auto& dx = Geom(LEV).CellSizeArray();
79 const auto& dom = Geom(LEV).Domain();
80 const auto init_entity_op = model.init_entity_op();
81 const auto entities_per_lp = init_entity_op.m_entities_per_lp;
82
83 for (amrex::MFIter mfi = MakeMFIter(LEV); mfi.isValid(); ++mfi) {
84 DefineAndReturnParticleTile(LEV, mfi);
85 }
86
87 amrex::iMultiFab num_particles(
88 ParticleBoxArray(LEV), ParticleDistributionMap(LEV), 1, 0,
89 amrex::MFInfo());
90 amrex::iMultiFab init_offsets(
91 ParticleBoxArray(LEV), ParticleDistributionMap(LEV), 1, 0,
92 amrex::MFInfo());
93 num_particles.setVal(entities_per_lp);
94 init_offsets.setVal(0);
95
96 for (amrex::MFIter mfi = MakeMFIter(LEV); mfi.isValid(); ++mfi) {
97 const amrex::Box& box = mfi.tilebox();
98
99 const auto ncells = static_cast<int>(box.numPts());
100 const int* in = num_particles[mfi].dataPtr();
101 int* out = init_offsets[mfi].dataPtr();
102 const auto np = amrex::Scan::PrefixSum<int>(
103 ncells, [=] AMREX_GPU_DEVICE(int i) -> int { return in[i]; },
104 [=] AMREX_GPU_DEVICE(int i, int const& xi) { out[i] = xi; },
105 amrex::Scan::Type::exclusive, amrex::Scan::retSum);
106
107 const amrex::Long pid = ParticleType::NextID();
108 ParticleType::NextID(pid + np);
109 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
110 static_cast<amrex::Long>(pid + np) < amrex::LastParticleID,
111 "Error: overflow on particle id numbers!");
112
113 const auto my_proc = amrex::ParallelDescriptor::MyProc();
114 const auto& offset_arr = init_offsets[mfi].const_array();
115 const auto& num_particles_arr = num_particles[mfi].const_array();
116 const auto index = std::make_pair(mfi.index(), mfi.LocalTileIndex());
117 auto& pti = GetParticles(LEV)[index];
118 pti.resize(np);
119 const auto parrs = particle_arrays(pti);
120
121 amrex::ParallelFor(
122 box, [=] AMREX_GPU_DEVICE(
123 int i, int j, int AMREX_D_PICK(, , k)) noexcept {
124 const amrex::IntVect iv(AMREX_D_DECL(i, j, k));
125 const int start = offset_arr(iv);
126 for (int n = start; n < start + num_particles_arr(iv); n++) {
127 auto& p = parrs.m_aos[n];
128 p.id() = pid + n;
129 p.cpu() = my_proc;
130
131 MarkEntityUndefined()(n, parrs);
132 parrs.m_idata[EntityIntData::owner][n] =
133 static_cast<int>(dom.index(iv));
134
135 AMREX_D_TERM(
136 p.pos(0) = plo[0] + (iv[0] + constants::HALF) * dx[0];
137 , p.pos(1) = plo[1] + (iv[1] + constants::HALF) * dx[1];
138 ,
139 p.pos(2) = plo[2] + (iv[2] + constants::HALF) * dx[2];)
140
141 AMREX_D_TERM(parrs.m_idata[CommonIntData::i][n] = iv[0];
142 , parrs.m_idata[CommonIntData::j][n] = iv[1];
143 , parrs.m_idata[CommonIntData::k][n] = iv[2];)
144 }
145
146 for (int n = start; n < start + entities_per_lp; n++) {
147 init_entity_op(parrs, n);
148 }
149 });
150
151 // This is necessary
152 amrex::Gpu::streamSynchronize();
153 }
154 Redistribute();
155
156 // Sanity check all initial particles
157#ifdef AMREX_USE_OMP
158#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
159#endif
160 for (MyParIter pti(*this, LEV); pti.isValid(); ++pti) {
161 const size_t np = pti.numParticles();
162 const auto parrs = particle_arrays(pti.GetParticleTile());
163
164 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(long pidx) noexcept {
165 bool valid_type = false;
166 for (int typ = 0; typ < EntityTypes::NTYPES; typ++) {
167 valid_type = parrs.m_idata[CommonIntData::type_id][pidx] == typ;
168 if (valid_type) {
169 break;
170 }
171 }
172 AMREX_ASSERT(valid_type);
173 AMREX_ASSERT(parrs.m_aos[pidx].id() >= 0);
174 });
175 }
176}
177} // namespace spades::particles
178#endif
Main SPADES entity container.
Definition EntityParticleContainer.H:25
void write_plot_file(const std::string &plt_filename) override
Write the particles to file.
Definition EntityParticleContainer.H:60
static std::string identifier()
Class identifier name.
Definition EntityParticleContainer.H:31
void initialize_entities(const Model &model)
Initialize the entities.
Definition EntityParticleContainer.H:73
void initialize_variable_names() override
Initialize variable names.
Definition EntityParticleContainer.cpp:34
void sort() override
Sort the entities.
Definition EntityParticleContainer.cpp:59
EntityParticleContainer(amrex::AmrParGDB *par_gdb, int ngrow=0)
Constructor.
Definition EntityParticleContainer.cpp:6
void read_parameters() override
Read user parameters.
Definition EntityParticleContainer.cpp:29
Main SPADES particle container.
Definition SpadesParticleContainer.H:35
ParticleArrays< NArrayReal, NArrayInt, ParticleType, RealVector, IntVector > particle_arrays(ParticleTileType &pti) const
Definition SpadesParticleContainer.H:218
void write_plot_file_impl(const std::string &plt_filename, const std::string &name)
Definition SpadesParticleContainer.H:760
static constexpr amrex::Real HALF
Definition Constants.H:37
SPADES particles.
Definition EntityData.H:7
@ type_id
Definition ParticleData.H:18
@ owner
Definition EntityData.H:18
static constexpr int NTYPES
Number of different entity types.
Definition EntityData.H:31
Functor for making a entity undefined.
Definition EntityOps.H:14