/home/runner/work/spades/spades/Source/Models/Phold.H Source File

SPADES API: /home/runner/work/spades/spades/Source/Models/Phold.H Source File
SPADES API
Phold.H
Go to the documentation of this file.
1#ifndef PHOLD_H
2#define PHOLD_H
3#include <AMReX_ParmParse.H>
4#include <AMReX_Geometry.H>
5#include "Source/Constants.H"
6#include "Source/Utilities.H"
7#include "Source/MessageOps.H"
9#include "Source/EntityData.H"
10
11namespace spades::models {
12
14class Phold
15{
16public:
21 static std::string identifier() { return "phold"; }
22
24 explicit Phold();
25
27 void read_parameters();
28
29 [[nodiscard]] const amrex::Geometry& geom() const { return m_geom; }
30
35 struct ProcessOp
36 {
52 template <class MParrs, class EParrs>
53 AMREX_GPU_DEVICE int operator()(
54 const MParrs& msg_parrs,
55 const EParrs& ent_parrs,
56 const amrex::IntVect& iv,
57 const int rcv_msg,
58 const int snd_msg,
59 const int ent,
60 const int ent_idx,
61 amrex::RandomEngine const& engine) const
62 {
63 const auto& dlo = m_dom.smallEnd();
64 const auto& dhi = m_dom.bigEnd();
65 const auto ts =
66 msg_parrs
67 .m_rdata[particles::CommonRealData::timestamp][rcv_msg];
68
69 msg_parrs
71 ent_parrs
72 .m_rdata[particles::CommonRealData::timestamp][ent_idx];
73 ent_parrs.m_rdata[particles::CommonRealData::timestamp][ent_idx] =
74 ts;
75 msg_parrs.m_idata[particles::CommonIntData::type_id][rcv_msg] =
77
78 const auto ent_lvt =
79 ent_parrs
80 .m_rdata[particles::CommonRealData::timestamp][ent_idx];
81 const amrex::IntVect iv_dest(AMREX_D_DECL(
82 amrex::Random_int(dhi[0] - dlo[0] + 1, engine) + dlo[0],
83 amrex::Random_int(dhi[1] - dlo[1] + 1, engine) + dlo[1],
84 amrex::Random_int(dhi[2] - dlo[2] + 1, engine) + dlo[2]));
85 const amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> pos = {
86 AMREX_D_DECL(
87 m_plo[0] + (iv_dest[0] + constants::HALF) * m_dx[0],
88 m_plo[1] + (iv_dest[1] + constants::HALF) * m_dx[1],
89 m_plo[2] + (iv_dest[2] + constants::HALF) * m_dx[2])};
90 const int rcv_ent =
91 static_cast<int>(amrex::Random_int(m_entities_per_lp, engine));
92 const amrex::Real next_ts =
93 ent_lvt + random_exponential(m_lambda, engine) + m_lookahead;
94
96 snd_msg, msg_parrs, next_ts, pos, iv_dest,
97 static_cast<int>(m_dom.index(iv)), ent,
98 static_cast<int>(m_dom.index(iv_dest)), rcv_ent);
99 const int n_sent_messages = 1;
100 return n_sent_messages;
101 }
102
104 amrex::Real m_lookahead{1.0};
105
109 amrex::Real m_lambda{1.0};
110
113
115 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> m_dx;
116
118 amrex::Box m_dom;
119
121 amrex::GpuArray<amrex::Real, AMREX_SPACEDIM> m_plo;
122 };
123
125
130 [[nodiscard]] ProcessType process_op() const { return m_process_op; }
131
132 // Message processing operator
134
140 {
148 template <class EParrs>
149 AMREX_GPU_DEVICE void
150 operator()(const EParrs& ent_parrs, const int n) const
151 {
152 const amrex::Real ts = 0.0;
153
154 ent_parrs.m_rdata[particles::CommonRealData::timestamp][n] = ts;
155 ent_parrs.m_idata[particles::CommonIntData::type_id][n] =
157 }
158
161 };
162
164
169 [[nodiscard]] InitEntityType init_entity_op() const
170 {
171 return m_init_entity_op;
172 }
173
174 // Initialize entity operator
176
182 {
191 template <class MParrs>
192 AMREX_GPU_DEVICE void operator()(
193 const MParrs& msg_parrs,
194 const int n,
195 amrex::RandomEngine const& engine) const
196 {
197 const amrex::Real ts =
199 msg_parrs.m_idata[particles::CommonIntData::type_id][n] =
201 msg_parrs.m_rdata[particles::CommonRealData::timestamp][n] = ts;
202 msg_parrs.m_rdata[particles::MessageRealData::creation_time][n] =
203 0.0;
204 }
205
207 amrex::Real m_lookahead{1.0};
208
211
215 amrex::Real m_lambda{1.0};
216 };
217
219
224 [[nodiscard]] InitMessageType init_message_op() const
225 {
226 return m_init_message_op;
227 }
228
229 // Initialize message operator
231
232private:
233 // Domain geometry
234 amrex::Geometry m_geom;
235};
236
237} // namespace spades::models
238#endif /* PHOLD_H */
PHOLD model.
Definition Phold.H:15
const amrex::Geometry & geom() const
Definition Phold.H:29
InitMessageType init_message_op() const
Initialize message operator.
Definition Phold.H:224
ProcessType process_op() const
Message processing operator.
Definition Phold.H:130
Phold()
Constructor.
Definition Phold.cpp:5
amrex::Geometry m_geom
Definition Phold.H:234
InitEntityOp m_init_entity_op
Definition Phold.H:175
ProcessOp m_process_op
Definition Phold.H:133
InitEntityType init_entity_op() const
Initialize entity operator.
Definition Phold.H:169
void read_parameters()
Read user parameters.
Definition Phold.cpp:7
InitMessageOp m_init_message_op
Definition Phold.H:230
static std::string identifier()
Class identifier name.
Definition Phold.H:21
static constexpr amrex::Real HALF
Definition Constants.H:37
Definition Phold.cpp:3
amrex::Real random_exponential(const amrex::Real lambda)
Exponential distribution.
Definition Utilities.cpp:4
A struct that defines an operator for initializing entities.
Definition Phold.H:140
int m_entities_per_lp
Number of entities per logical process (optional user input)
Definition Phold.H:160
AMREX_GPU_DEVICE void operator()(const EParrs &ent_parrs, const int n) const
Callable operator to initialize an entity.
Definition Phold.H:150
A struct that defines an operator for initializing entities.
Definition Phold.H:182
AMREX_GPU_DEVICE void operator()(const MParrs &msg_parrs, const int n, amrex::RandomEngine const &engine) const
Callable operator to initialize an message.
Definition Phold.H:192
amrex::Real m_lookahead
Lookahead value (optional user input)
Definition Phold.H:207
int m_messages_per_lp
Initial messages per LP.
Definition Phold.H:210
amrex::Real m_lambda
Definition Phold.H:215
A struct that defines an operator for processing messages.
Definition Phold.H:36
int m_entities_per_lp
Number of entities per logical process (optional user input)
Definition Phold.H:112
amrex::Real m_lambda
Definition Phold.H:109
AMREX_GPU_DEVICE int operator()(const MParrs &msg_parrs, const EParrs &ent_parrs, const amrex::IntVect &iv, const int rcv_msg, const int snd_msg, const int ent, const int ent_idx, amrex::RandomEngine const &engine) const
Callable operator to process a message.
Definition Phold.H:53
amrex::Real m_lookahead
Lookahead value (optional user input)
Definition Phold.H:104
amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > m_dx
Spatial discretization.
Definition Phold.H:115
amrex::GpuArray< amrex::Real, AMREX_SPACEDIM > m_plo
Problem low bounds.
Definition Phold.H:121
amrex::Box m_dom
Domain.
Definition Phold.H:118
@ type_id
Definition ParticleData.H:18
@ timestamp
Definition ParticleData.H:12
Functor for populating message data.
Definition MessageOps.H:14
static constexpr int ENTITY
Entity.
Definition EntityData.H:25
@ old_timestamp
Definition MessageData.H:12
@ creation_time
Definition MessageData.H:13
static constexpr int MESSAGE
Message.
Definition MessageData.H:36
static constexpr int PROCESSED
Processed message.
Definition MessageData.H:38