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
41namespace
42{
47 std::map<std::string, InitializationPolicy> initialization_policies = {
52#ifdef WARPX_DIM_RZ
54#endif
55
56#ifdef WARPX_QED
57 {"opticalDepthBW", InitializationPolicy::RandomExp},
58 {"opticalDepthQSR", InitializationPolicy::RandomExp}
59#endif
60
61 };
62}
63
66{
67 switch (policy) {
68 case InitializationPolicy::Zero : return 0.0;
69 case InitializationPolicy::One : return 1.0;
71 return -std::log(amrex::Random(engine));
72 }
73 default : {
74 amrex::Abort("Initialization Policy not recognized");
75 return 1.0;
76 }
77 }
78}
79
81int initializeIntValue (const InitializationPolicy policy) noexcept
82{
83 switch (policy) {
84 case InitializationPolicy::Zero : return 0;
85 case InitializationPolicy::One : return 1;
86 default : {
87 amrex::Abort("Initialization Policy not recognized");
88 return 1;
89 }
90 }
91}
92
94
113template <typename PTile, typename DstPC>
115 const DstPC& pc,
116 int start, int stop,
117 const int n_external_attr_real = 0,
118 const int n_external_attr_int = 0
119#ifdef WARPX_QED
120 , const bool do_qed_comps = false )
121#else
122 )
123#endif
124{
125 using namespace amrex::literals;
126
127 const std::vector<std::string>& user_real_attribs = pc.getUserRealAttribs();
128 const std::vector<std::string>& user_int_attribs = pc.getUserIntAttribs();
129 const std::vector<std::string>& particle_comps = pc.GetRealSoANames();
130 const std::vector<std::string>& particle_icomps = pc.GetIntSoANames();
131 const std::vector<amrex::Parser*>& user_real_attrib_parser = pc.getUserRealAttribParser();
132 const std::vector<amrex::Parser*>& user_int_attrib_parser = pc.getUserIntAttribParser();
133#ifdef WARPX_QED
134 BreitWheelerEngine* p_bw_engine = pc.get_breit_wheeler_engine_ptr();
135 QuantumSynchrotronEngine* p_qs_engine = pc.get_quantum_sync_engine_ptr();
136#endif
137 const int ionization_initial_level = pc.getIonizationInitialLevel();
138
139 // Preparing data needed for user defined attributes
140 const auto n_user_real_attribs = static_cast<int>(user_real_attribs.size());
141 const auto n_user_int_attribs = static_cast<int>(user_int_attribs.size());
142 const auto get_position = GetParticlePosition<PIdx>(ptile);
143 const auto soa = ptile.getParticleTileData();
144 const amrex::ParticleReal* AMREX_RESTRICT ux = soa.m_rdata[PIdx::ux];
145 const amrex::ParticleReal* AMREX_RESTRICT uy = soa.m_rdata[PIdx::uy];
146 const amrex::ParticleReal* AMREX_RESTRICT uz = soa.m_rdata[PIdx::uz];
147 constexpr int lev = 0;
148 const amrex::Real t = WarpX::GetInstance().gett_new(lev);
149
150 // Check: does the particle data reside on CPU or GPU?
151 amrex::Arena const * const pc_arena = pc.arena();
152 const bool run_on_gpu =
153 pc_arena->isManaged() || pc_arena->isDevice();
154
155 // Initialize the last NumRuntimeRealComps() - n_external_attr_real runtime real attributes
156 for (int j = PIdx::nattribs + n_external_attr_real; j < ptile.NumRealComps() ; ++j)
157 {
158 auto attr_ptr = ptile.GetStructOfArrays().GetRealData(j).data();
159#ifdef WARPX_QED
160 // Current runtime comp is quantum synchrotron optical depth
161 auto const it_qsr = std::find(particle_comps.begin(), particle_comps.end(), "opticalDepthQSR");
162 if (it_qsr != particle_comps.end() &&
163 std::distance(particle_comps.begin(), it_qsr) == j)
164 {
165 if (!do_qed_comps) { continue; }
166 const QuantumSynchrotronGetOpticalDepth quantum_sync_get_opt =
167 p_qs_engine->build_optical_depth_functor();
168 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
169 if (run_on_gpu) {
170 amrex::ParallelForRNG(stop - start,
171 [=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept {
172 const int ip = i + start;
173 attr_ptr[ip] = quantum_sync_get_opt(engine);
174 });
175 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
176 } else {
177 for (int ip = start; ip < stop; ++ip) {
178#ifdef AMREX_USE_GPU
179 attr_ptr[ip] = quantum_sync_get_opt(amrex::RandomEngine{nullptr});
180#else
181 attr_ptr[ip] = quantum_sync_get_opt(amrex::RandomEngine{});
182#endif
183 }
184 }
185 }
186
187 // Current runtime comp is Breit-Wheeler optical depth
188 auto const it_bw = std::find(particle_comps.begin(), particle_comps.end(), "opticalDepthBW");
189 if (it_bw != particle_comps.end() &&
190 std::distance(particle_comps.begin(), it_bw) == j)
191 {
192 if (!do_qed_comps) { continue; }
193 const BreitWheelerGetOpticalDepth breit_wheeler_get_opt =
194 p_bw_engine->build_optical_depth_functor();;
195 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
196 if (run_on_gpu) {
197 amrex::ParallelForRNG(stop - start,
198 [=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept {
199 const int ip = i + start;
200 attr_ptr[ip] = breit_wheeler_get_opt(engine);
201 });
202 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
203 } else {
204 for (int ip = start; ip < stop; ++ip) {
205#ifdef AMREX_USE_GPU
206 attr_ptr[ip] = breit_wheeler_get_opt(amrex::RandomEngine{nullptr});
207#else
208 attr_ptr[ip] = breit_wheeler_get_opt(amrex::RandomEngine{});
209#endif
210 }
211 }
212 }
213#endif
214
215 for (int ia = 0; ia < n_user_real_attribs; ++ia)
216 {
217 // Current runtime comp is ia-th user defined attribute
218 auto const it_ura = std::find(particle_comps.begin(), particle_comps.end(), user_real_attribs[ia]);
219 if (it_ura != particle_comps.end() &&
220 std::distance(particle_comps.begin(), it_ura) == j)
221 {
222 const amrex::ParserExecutor<7> user_real_attrib_parserexec =
223 user_real_attrib_parser[ia]->compile<7>();
224 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
225 if (run_on_gpu) {
226 amrex::ParallelFor(stop - start,
227 [=] AMREX_GPU_DEVICE (int i) noexcept {
228 const int ip = i + start;
229 amrex::ParticleReal xp, yp, zp;
230 get_position(ip, xp, yp, zp);
231 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
232 ux[ip], uy[ip], uz[ip], t);
233 });
234 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
235 } else {
236 for (int ip = start; ip < stop; ++ip) {
237 amrex::ParticleReal xp, yp, zp;
238 get_position(ip, xp, yp, zp);
239 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
240 ux[ip], uy[ip], uz[ip], t);
241 }
242 }
243 }
244 }
245 }
246
247 // Initialize the last NumRuntimeIntComps() - n_external_attr_int runtime int attributes
248 for (int j = n_external_attr_int; j < ptile.NumIntComps() ; ++j)
249 {
250 auto attr_ptr = ptile.GetStructOfArrays().GetIntData(j).data();
251
252 // Current runtime comp is ionization level
253 auto const it_ioniz = std::find(particle_icomps.begin(), particle_icomps.end(), "ionizationLevel");
254 if (it_ioniz != particle_icomps.end() &&
255 std::distance(particle_icomps.begin(), it_ioniz) == j)
256 {
257 if (run_on_gpu) {
258 amrex::ParallelFor(stop - start,
259 [=] AMREX_GPU_DEVICE (int i) noexcept {
260 const int ip = i + start;
261 attr_ptr[ip] = ionization_initial_level;
262 });
263 } else {
264 for (int ip = start; ip < stop; ++ip) {
265 attr_ptr[ip] = ionization_initial_level;
266 }
267 }
268 }
269
270 for (int ia = 0; ia < n_user_int_attribs; ++ia)
271 {
272 // Current runtime comp is ia-th user defined attribute
273 auto const it_uia = std::find(particle_icomps.begin(), particle_icomps.end(), user_int_attribs[ia]);
274 if (it_uia != particle_icomps.end() &&
275 std::distance(particle_icomps.begin(), it_uia) == j)
276 {
277 const amrex::ParserExecutor<7> user_int_attrib_parserexec =
278 user_int_attrib_parser[ia]->compile<7>();
279 if (run_on_gpu) {
280 amrex::ParallelFor(stop - start,
281 [=] AMREX_GPU_DEVICE (int i) noexcept {
282 const int ip = i + start;
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 } else {
289 for (int ip = start; ip < stop; ++ip) {
290 amrex::ParticleReal xp, yp, zp;
291 get_position(ip, xp, yp, zp);
292 attr_ptr[ip] = static_cast<int>(
293 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
294 }
295 }
296 }
297 }
298 }
299}
300
301}
302
303#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:81
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
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal initializeRealValue(const InitializationPolicy policy, amrex::RandomEngine const &engine) noexcept
Definition DefaultInitialization.H:65
Definition BreitWheelerEngineWrapper.H:294
BreitWheelerGetOpticalDepth build_optical_depth_functor() const
Definition BreitWheelerEngineWrapper.cpp:39
Definition BreitWheelerEngineWrapper.H:78
Definition QuantumSyncEngineWrapper.H:274
QuantumSynchrotronGetOpticalDepth build_optical_depth_functor()
Definition QuantumSyncEngineWrapper.cpp:39
Definition QuantumSyncEngineWrapper.H:76
static WarpX & GetInstance()
Definition WarpX.cpp:299
amrex::Vector< amrex::Real > gett_new() const
Definition WarpX.H:714
virtual bool isManaged() const
virtual bool isDevice() const
amrex_real Real
amrex_particle_real ParticleReal
Real Random()
Definition DefaultInitialization.H:93
void DefaultInitializeRuntimeAttributes(PTile &ptile, const DstPC &pc, int start, int stop, const int n_external_attr_real=0, const int n_external_attr_int=0, const bool do_qed_comps=false)
Default initialize runtime attributes in a tile. This routine does not initialize the first n_externa...
Definition DefaultInitialization.H:114
void ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
AMREX_ATTRIBUTE_FLATTEN_FOR void ParallelForRNG(T n, L const &f) noexcept
void Abort(const std::string &msg)
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
@ nattribs
Definition WarpXParticleContainer.H:70
@ uz
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70