WarpX
Loading...
Searching...
No Matches
DefaultInitialization.H
Go to the documentation of this file.
1/* Copyright 2019-2020 Andrew Myers, Axel Huebl,
2 * Maxence Thevenet
3 *
4 * This file is part of WarpX.
5 *
6 * License: BSD-3-Clause-LBNL
7 */
8#ifndef WARPX_DEFAULTINITIALIZATION_H_
9#define WARPX_DEFAULTINITIALIZATION_H_
10
11#include <WarpX.H>
12#ifdef WARPX_QED
15#endif
16
17#include <AMReX_GpuContainers.H>
18#include <AMReX_REAL.H>
19
20#include <cmath>
21#include <map>
22#include <string>
23
40
45static std::map<std::string, InitializationPolicy> initialization_policies = {
50#ifdef WARPX_DIM_RZ
52#endif
53
54#ifdef WARPX_QED
55 {"opticalDepthBW", InitializationPolicy::RandomExp},
56 {"opticalDepthQSR", InitializationPolicy::RandomExp}
57#endif
58
59};
60
62amrex::ParticleReal initializeRealValue (const InitializationPolicy policy, amrex::RandomEngine const& engine) noexcept
63{
64 switch (policy) {
65 case InitializationPolicy::Zero : return 0.0;
66 case InitializationPolicy::One : return 1.0;
68 return -std::log(amrex::Random(engine));
69 }
70 default : {
71 amrex::Abort("Initialization Policy not recognized");
72 return 1.0;
73 }
74 }
75}
76
78int initializeIntValue (const InitializationPolicy policy) noexcept
79{
80 switch (policy) {
81 case InitializationPolicy::Zero : return 0;
82 case InitializationPolicy::One : return 1;
83 default : {
84 amrex::Abort("Initialization Policy not recognized");
85 return 1;
86 }
87 }
88}
89
91
117template <typename PTile>
119 const int n_external_attr_real,
120 const int n_external_attr_int,
121 const std::vector<std::string>& user_real_attribs,
122 const std::vector<std::string>& user_int_attribs,
123 const std::vector<std::string>& particle_comps,
124 const std::vector<std::string>& particle_icomps,
125 const std::vector<amrex::Parser*>& user_real_attrib_parser,
126 const std::vector<amrex::Parser*>& user_int_attrib_parser,
127#ifdef WARPX_QED
128 const bool do_qed_comps,
129 BreitWheelerEngine* p_bw_engine,
130 QuantumSynchrotronEngine* p_qs_engine,
131#endif
132 const int ionization_initial_level,
133 int start, int stop)
134{
135 using namespace amrex::literals;
136
137 // Preparing data needed for user defined attributes
138 const auto n_user_real_attribs = static_cast<int>(user_real_attribs.size());
139 const auto n_user_int_attribs = static_cast<int>(user_int_attribs.size());
140 const auto get_position = GetParticlePosition<PIdx>(ptile);
141 const auto soa = ptile.getParticleTileData();
142 const amrex::ParticleReal* AMREX_RESTRICT ux = soa.m_rdata[PIdx::ux];
143 const amrex::ParticleReal* AMREX_RESTRICT uy = soa.m_rdata[PIdx::uy];
144 const amrex::ParticleReal* AMREX_RESTRICT uz = soa.m_rdata[PIdx::uz];
145 constexpr int lev = 0;
146 const amrex::Real t = WarpX::GetInstance().gett_new(lev);
147
148 // Initialize the last NumRuntimeRealComps() - n_external_attr_real runtime real attributes
149 for (int j = PIdx::nattribs + n_external_attr_real; j < ptile.NumRealComps() ; ++j)
150 {
151 auto attr_ptr = ptile.GetStructOfArrays().GetRealData(j).data();
152#ifdef WARPX_QED
153 // Current runtime comp is quantum synchrotron optical depth
154 auto const it_qsr = std::find(particle_comps.begin(), particle_comps.end(), "opticalDepthQSR");
155 if (it_qsr != particle_comps.end() &&
156 std::distance(particle_comps.begin(), it_qsr) == j)
157 {
158 if (!do_qed_comps) { continue; }
159 const QuantumSynchrotronGetOpticalDepth quantum_sync_get_opt =
160 p_qs_engine->build_optical_depth_functor();
161 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
163 amrex::ParallelForRNG(stop - start,
164 [=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept {
165 const int ip = i + start;
166 attr_ptr[ip] = quantum_sync_get_opt(engine);
167 });
168 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
169 } else {
170 for (int ip = start; ip < stop; ++ip) {
171#ifdef AMREX_USE_GPU
172 attr_ptr[ip] = quantum_sync_get_opt(amrex::RandomEngine{nullptr});
173#else
174 attr_ptr[ip] = quantum_sync_get_opt(amrex::RandomEngine{});
175#endif
176 }
177 }
178 }
179
180 // Current runtime comp is Breit-Wheeler optical depth
181 auto const it_bw = std::find(particle_comps.begin(), particle_comps.end(), "opticalDepthBW");
182 if (it_bw != particle_comps.end() &&
183 std::distance(particle_comps.begin(), it_bw) == j)
184 {
185 if (!do_qed_comps) { continue; }
186 const BreitWheelerGetOpticalDepth breit_wheeler_get_opt =
187 p_bw_engine->build_optical_depth_functor();;
188 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
190 amrex::ParallelForRNG(stop - start,
191 [=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept {
192 const int ip = i + start;
193 attr_ptr[ip] = breit_wheeler_get_opt(engine);
194 });
195 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
196 } else {
197 for (int ip = start; ip < stop; ++ip) {
198#ifdef AMREX_USE_GPU
199 attr_ptr[ip] = breit_wheeler_get_opt(amrex::RandomEngine{nullptr});
200#else
201 attr_ptr[ip] = breit_wheeler_get_opt(amrex::RandomEngine{});
202#endif
203 }
204 }
205 }
206#endif
207
208 for (int ia = 0; ia < n_user_real_attribs; ++ia)
209 {
210 // Current runtime comp is ia-th user defined attribute
211 auto const it_ura = std::find(particle_comps.begin(), particle_comps.end(), user_real_attribs[ia]);
212 if (it_ura != particle_comps.end() &&
213 std::distance(particle_comps.begin(), it_ura) == j)
214 {
215 const amrex::ParserExecutor<7> user_real_attrib_parserexec =
216 user_real_attrib_parser[ia]->compile<7>();
217 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
219 amrex::ParallelFor(stop - start,
220 [=] AMREX_GPU_DEVICE (int i) noexcept {
221 const int ip = i + start;
222 amrex::ParticleReal xp, yp, zp;
223 get_position(ip, xp, yp, zp);
224 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
225 ux[ip], uy[ip], uz[ip], t);
226 });
227 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
228 } else {
229 for (int ip = start; ip < stop; ++ip) {
230 amrex::ParticleReal xp, yp, zp;
231 get_position(ip, xp, yp, zp);
232 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
233 ux[ip], uy[ip], uz[ip], t);
234 }
235 }
236 }
237 }
238 }
239
240 // Initialize the last NumRuntimeIntComps() - n_external_attr_int runtime int attributes
241 for (int j = n_external_attr_int; j < ptile.NumIntComps() ; ++j)
242 {
243 auto attr_ptr = ptile.GetStructOfArrays().GetIntData(j).data();
244
245 // Current runtime comp is ionization level
246 auto const it_ioniz = std::find(particle_icomps.begin(), particle_icomps.end(), "ionizationLevel");
247 if (it_ioniz != particle_icomps.end() &&
248 std::distance(particle_icomps.begin(), it_ioniz) == j)
249 {
251 amrex::ParallelFor(stop - start,
252 [=] AMREX_GPU_DEVICE (int i) noexcept {
253 const int ip = i + start;
254 attr_ptr[ip] = ionization_initial_level;
255 });
256 } else {
257 for (int ip = start; ip < stop; ++ip) {
258 attr_ptr[ip] = ionization_initial_level;
259 }
260 }
261 }
262
263 for (int ia = 0; ia < n_user_int_attribs; ++ia)
264 {
265 // Current runtime comp is ia-th user defined attribute
266 auto const it_uia = std::find(particle_icomps.begin(), particle_icomps.end(), user_int_attribs[ia]);
267 if (it_uia != particle_icomps.end() &&
268 std::distance(particle_icomps.begin(), it_uia) == j)
269 {
270 const amrex::ParserExecutor<7> user_int_attrib_parserexec =
271 user_int_attrib_parser[ia]->compile<7>();
273 amrex::ParallelFor(stop - start,
274 [=] AMREX_GPU_DEVICE (int i) noexcept {
275 const int ip = i + start;
276 amrex::ParticleReal xp, yp, zp;
277 get_position(ip, xp, yp, zp);
278 attr_ptr[ip] = static_cast<int>(
279 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
280 });
281 } else {
282 for (int ip = start; ip < stop; ++ip) {
283 amrex::ParticleReal xp, yp, zp;
284 get_position(ip, xp, yp, zp);
285 attr_ptr[ip] = static_cast<int>(
286 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
287 }
288 }
289 }
290 }
291 }
292}
293
294}
295
296#endif //WARPX_DEFAULTINITIALIZATION_H_
#define AMREX_FORCE_INLINE
#define AMREX_RESTRICT
#define AMREX_GPU_DEVICE
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE int initializeIntValue(const InitializationPolicy policy) noexcept
Definition DefaultInitialization.H:78
InitializationPolicy
This set of initialization policies describes what happens when we need to create a new particle due ...
Definition DefaultInitialization.H:39
@ One
Definition DefaultInitialization.H:39
@ RandomExp
Definition DefaultInitialization.H:39
@ Zero
Definition DefaultInitialization.H:39
static std::map< std::string, InitializationPolicy > initialization_policies
This map sets the initialization policy for each particle component used in WarpX.
Definition DefaultInitialization.H:45
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal initializeRealValue(const InitializationPolicy policy, amrex::RandomEngine const &engine) noexcept
Definition DefaultInitialization.H:62
Definition BreitWheelerEngineWrapper.H:294
BreitWheelerGetOpticalDepth build_optical_depth_functor() const
Definition BreitWheelerEngineWrapper.cpp:39
Definition BreitWheelerEngineWrapper.H:78
Definition QuantumSyncEngineWrapper.H:273
QuantumSynchrotronGetOpticalDepth build_optical_depth_functor()
Definition QuantumSyncEngineWrapper.cpp:39
Definition QuantumSyncEngineWrapper.H:76
static WarpX & GetInstance()
Definition WarpX.cpp:298
amrex::Vector< amrex::Real > gett_new() const
Definition WarpX.H:696
Definition DefaultInitialization.H:90
void DefaultInitializeRuntimeAttributes(PTile &ptile, const int n_external_attr_real, const int n_external_attr_int, const std::vector< std::string > &user_real_attribs, const std::vector< std::string > &user_int_attribs, const std::vector< std::string > &particle_comps, const std::vector< std::string > &particle_icomps, const std::vector< amrex::Parser * > &user_real_attrib_parser, const std::vector< amrex::Parser * > &user_int_attrib_parser, const bool do_qed_comps, BreitWheelerEngine *p_bw_engine, QuantumSynchrotronEngine *p_qs_engine, const int ionization_initial_level, int start, int stop)
Default initialize runtime attributes in a tile. This routine does not initialize the first n_externa...
Definition DefaultInitialization.H:118
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
Real Random()
void Abort(const std::string &msg)
AMREX_ATTRIBUTE_FLATTEN_FOR void ParallelForRNG(T n, L const &f) noexcept
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
@ nattribs
number of compile-time attributes
Definition WarpXParticleContainer.H:77
@ uz
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70