93 BL_PROFILE(
"spades::MessageParticleContainer::initialize_messages()");
95 const auto& plo = Geom(
LEV).ProbLoArray();
96 const auto& dx = Geom(
LEV).CellSizeArray();
97 const auto& dom = Geom(
LEV).Domain();
98 const auto init_message_op = model.init_message_op();
99 const auto messages_per_lp = init_message_op.m_messages_per_lp;
100 const int total_messages_per_lp = 3 * messages_per_lp;
101 AMREX_ALWAYS_ASSERT(total_messages_per_lp > messages_per_lp);
103 for (amrex::MFIter mfi = MakeMFIter(
LEV); mfi.isValid(); ++mfi) {
104 DefineAndReturnParticleTile(
LEV, mfi);
107 amrex::iMultiFab num_particles(
108 ParticleBoxArray(
LEV), ParticleDistributionMap(
LEV), 1, 0,
110 amrex::iMultiFab init_offsets(
111 ParticleBoxArray(
LEV), ParticleDistributionMap(
LEV), 1, 0,
113 num_particles.setVal(total_messages_per_lp);
114 init_offsets.setVal(0);
116 for (amrex::MFIter mfi = MakeMFIter(
LEV); mfi.isValid(); ++mfi) {
117 const amrex::Box& box = mfi.tilebox();
119 const auto ncells =
static_cast<int>(box.numPts());
120 const int* in = num_particles[mfi].dataPtr();
121 int* out = init_offsets[mfi].dataPtr();
122 const auto np = amrex::Scan::PrefixSum<int>(
123 ncells, [=] AMREX_GPU_DEVICE(
int i) ->
int {
return in[i]; },
124 [=] AMREX_GPU_DEVICE(
int i,
int const& xi) { out[i] = xi; },
125 amrex::Scan::Type::exclusive, amrex::Scan::retSum);
127 const amrex::Long pid = ParticleType::NextID();
128 ParticleType::NextID(pid + np);
129 AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
130 static_cast<amrex::Long
>(pid + np) < amrex::LastParticleID,
131 "Error: overflow on particle id numbers!");
133 const auto my_proc = amrex::ParallelDescriptor::MyProc();
134 const auto& offset_arr = init_offsets[mfi].const_array();
135 const auto& num_particles_arr = num_particles[mfi].const_array();
136 const auto index = std::make_pair(mfi.index(), mfi.LocalTileIndex());
137 auto& pti = GetParticles(
LEV)[index];
140 amrex::ParallelForRNG(
141 box, [=] AMREX_GPU_DEVICE(
142 int i,
int j,
int AMREX_D_PICK(, , k),
143 amrex::RandomEngine
const& engine)
noexcept {
144 const amrex::IntVect iv(AMREX_D_DECL(i, j, k));
145 const int start = offset_arr(iv);
146 for (
int n = start; n < start + num_particles_arr(iv); n++) {
147 auto& p = parrs.m_aos[n];
153 static_cast<int>(dom.index(iv));
156 static_cast<int>(dom.index(iv));
165 AMREX_D_TERM(parrs.m_idata[CommonIntData::i][n] = iv[0];
166 , parrs.m_idata[CommonIntData::j][n] = iv[1];
167 , parrs.m_idata[CommonIntData::k][n] = iv[2];)
170 for (
int n = start; n < start + messages_per_lp; n++) {
171 init_message_op(parrs, n, engine);
178 amrex::Gpu::streamSynchronize();
184#pragma omp parallel if (amrex::Gpu::notInLaunchRegion())
186 for (MyParIter pti(*
this,
LEV); pti.isValid(); ++pti) {
187 const size_t np = pti.numParticles();
190 amrex::ParallelFor(np, [=] AMREX_GPU_DEVICE(
long pidx)
noexcept {
191 bool valid_type =
false;
198 AMREX_ASSERT(valid_type);
199 AMREX_ASSERT(parrs.m_aos[pidx].id() >= 0);
Main SPADES message container.
Definition MessageParticleContainer.H:25
void initialize_variable_names() override
Initialize variable names.
Definition MessageParticleContainer.cpp:34
void read_parameters() override
Read user parameters.
Definition MessageParticleContainer.cpp:29
void resolve_pairs()
Resolve message pairs (remove message/anti-message pairs)
Definition MessageParticleContainer.cpp:217
amrex::Real compute_gvt()
Compute the minimum time stamp of the messages.
Definition MessageParticleContainer.cpp:350
void write_plot_file(const std::string &plt_filename) override
Write the particles to file.
Definition MessageParticleContainer.H:78
void initialize_messages(const Model &model)
Initialize the messages.
Definition MessageParticleContainer.H:91
MessageParticleContainer(amrex::AmrParGDB *par_gdb, int ngrow=0)
Constructor.
Definition MessageParticleContainer.cpp:6
static std::string identifier()
Class identifier name.
Definition MessageParticleContainer.H:31
void garbage_collect(const amrex::Real gvt)
Perform garbage collection.
Definition MessageParticleContainer.cpp:323
void sort() override
Sort the messages.
Definition MessageParticleContainer.cpp:73
void update_undefined()
Update the undefined messages.
Definition MessageParticleContainer.cpp:80
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
Functor for making a message undefined.
Definition MessageOps.H:60
@ receiver_lp
Definition MessageData.H:23
@ pair_id
Definition MessageData.H:27
@ sender_entity
Definition MessageData.H:24
@ pair_cpu
Definition MessageData.H:26
@ sender_lp
Definition MessageData.H:22
@ receiver_entity
Definition MessageData.H:25
static constexpr int NTYPES
Number of different message types.
Definition MessageData.H:46