75 BL_PROFILE(
"spades::EntityParticleContainer::initialize_entities()");
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;
83 for (amrex::MFIter mfi = MakeMFIter(
LEV); mfi.isValid(); ++mfi) {
84 DefineAndReturnParticleTile(
LEV, mfi);
87 amrex::iMultiFab num_particles(
88 ParticleBoxArray(
LEV), ParticleDistributionMap(
LEV), 1, 0,
90 amrex::iMultiFab init_offsets(
91 ParticleBoxArray(
LEV), ParticleDistributionMap(
LEV), 1, 0,
93 num_particles.setVal(entities_per_lp);
94 init_offsets.setVal(0);
96 for (amrex::MFIter mfi = MakeMFIter(
LEV); mfi.isValid(); ++mfi) {
97 const amrex::Box& box = mfi.tilebox();
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);
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!");
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];
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];
133 static_cast<int>(dom.index(iv));
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];)
146 for (
int n = start; n < start + entities_per_lp; n++) {
147 init_entity_op(parrs, n);
152 amrex::Gpu::streamSynchronize();
158#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
160 for (MyParIter pti(*
this,
LEV); pti.isValid(); ++pti) {
161 const size_t np = pti.numParticles();
164 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(
long pidx)
noexcept {
165 bool valid_type =
false;
172 AMREX_ASSERT(valid_type);
173 AMREX_ASSERT(parrs.m_aos[pidx].id() >= 0);
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
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