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
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
110template <typename PTile, typename DstPC>
112 const DstPC& pc,
113 int start, int stop,
114 const int n_external_attr_real = 0,
115 const int n_external_attr_int = 0
116#ifdef WARPX_QED
117 , const bool do_qed_comps = false )
118#else
119 )
120#endif
121{
122 using namespace amrex::literals;
123
124 const std::vector<std::string>& user_real_attribs = pc.getUserRealAttribs();
125 const std::vector<std::string>& user_int_attribs = pc.getUserIntAttribs();
126 const std::vector<std::string>& particle_comps = pc.GetRealSoANames();
127 const std::vector<std::string>& particle_icomps = pc.GetIntSoANames();
128 const std::vector<amrex::Parser*>& user_real_attrib_parser = pc.getUserRealAttribParser();
129 const std::vector<amrex::Parser*>& user_int_attrib_parser = pc.getUserIntAttribParser();
130#ifdef WARPX_QED
131 BreitWheelerEngine* p_bw_engine = pc.get_breit_wheeler_engine_ptr();
132 QuantumSynchrotronEngine* p_qs_engine = pc.get_quantum_sync_engine_ptr();
133#endif
134 const int ionization_initial_level = pc.getIonizationInitialLevel();
135
136 // Preparing data needed for user defined attributes
137 const auto n_user_real_attribs = static_cast<int>(user_real_attribs.size());
138 const auto n_user_int_attribs = static_cast<int>(user_int_attribs.size());
139 const auto get_position = GetParticlePosition<PIdx>(ptile);
140 const auto soa = ptile.getParticleTileData();
141 const amrex::ParticleReal* AMREX_RESTRICT ux = soa.m_rdata[PIdx::ux];
142 const amrex::ParticleReal* AMREX_RESTRICT uy = soa.m_rdata[PIdx::uy];
143 const amrex::ParticleReal* AMREX_RESTRICT uz = soa.m_rdata[PIdx::uz];
144 constexpr int lev = 0;
145 const amrex::Real t = WarpX::GetInstance().gett_new(lev);
146
147 // Check: does the particle data reside on CPU or GPU?
148 amrex::Arena const * const pc_arena = pc.arena();
149 const bool run_on_gpu =
150 pc_arena->isManaged() || pc_arena->isDevice();
151
152 // Initialize the last NumRuntimeRealComps() - n_external_attr_real runtime real attributes
153 for (int j = PIdx::nattribs + n_external_attr_real; j < ptile.NumRealComps() ; ++j)
154 {
155 auto attr_ptr = ptile.GetStructOfArrays().GetRealData(j).data();
156#ifdef WARPX_QED
157 // Current runtime comp is quantum synchrotron optical depth
158 auto const it_qsr = std::find(particle_comps.begin(), particle_comps.end(), "opticalDepthQSR");
159 if (it_qsr != particle_comps.end() &&
160 std::distance(particle_comps.begin(), it_qsr) == j)
161 {
162 if (!do_qed_comps) { continue; }
163 const QuantumSynchrotronGetOpticalDepth quantum_sync_get_opt =
164 p_qs_engine->build_optical_depth_functor();
165 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
166 if (run_on_gpu) {
167 amrex::ParallelForRNG(stop - start,
168 [=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept {
169 const int ip = i + start;
170 attr_ptr[ip] = quantum_sync_get_opt(engine);
171 });
172 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
173 } else {
174 for (int ip = start; ip < stop; ++ip) {
175#ifdef AMREX_USE_GPU
176 attr_ptr[ip] = quantum_sync_get_opt(amrex::RandomEngine{nullptr});
177#else
178 attr_ptr[ip] = quantum_sync_get_opt(amrex::RandomEngine{});
179#endif
180 }
181 }
182 }
183
184 // Current runtime comp is Breit-Wheeler optical depth
185 auto const it_bw = std::find(particle_comps.begin(), particle_comps.end(), "opticalDepthBW");
186 if (it_bw != particle_comps.end() &&
187 std::distance(particle_comps.begin(), it_bw) == j)
188 {
189 if (!do_qed_comps) { continue; }
190 const BreitWheelerGetOpticalDepth breit_wheeler_get_opt =
191 p_bw_engine->build_optical_depth_functor();;
192 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
193 if (run_on_gpu) {
194 amrex::ParallelForRNG(stop - start,
195 [=] AMREX_GPU_DEVICE (int i, amrex::RandomEngine const& engine) noexcept {
196 const int ip = i + start;
197 attr_ptr[ip] = breit_wheeler_get_opt(engine);
198 });
199 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
200 } else {
201 for (int ip = start; ip < stop; ++ip) {
202#ifdef AMREX_USE_GPU
203 attr_ptr[ip] = breit_wheeler_get_opt(amrex::RandomEngine{nullptr});
204#else
205 attr_ptr[ip] = breit_wheeler_get_opt(amrex::RandomEngine{});
206#endif
207 }
208 }
209 }
210#endif
211
212 for (int ia = 0; ia < n_user_real_attribs; ++ia)
213 {
214 // Current runtime comp is ia-th user defined attribute
215 auto const it_ura = std::find(particle_comps.begin(), particle_comps.end(), user_real_attribs[ia]);
216 if (it_ura != particle_comps.end() &&
217 std::distance(particle_comps.begin(), it_ura) == j)
218 {
219 const amrex::ParserExecutor<7> user_real_attrib_parserexec =
220 user_real_attrib_parser[ia]->compile<7>();
221 // If the particle tile was allocated in a memory pool that can run on GPU, launch GPU kernel
222 if (run_on_gpu) {
223 amrex::ParallelFor(stop - start,
224 [=] AMREX_GPU_DEVICE (int i) noexcept {
225 const int ip = i + start;
226 amrex::ParticleReal xp, yp, zp;
227 get_position(ip, xp, yp, zp);
228 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
229 ux[ip], uy[ip], uz[ip], t);
230 });
231 // Otherwise (e.g. particle tile allocated in pinned memory), run on CPU
232 } else {
233 for (int ip = start; ip < stop; ++ip) {
234 amrex::ParticleReal xp, yp, zp;
235 get_position(ip, xp, yp, zp);
236 attr_ptr[ip] = user_real_attrib_parserexec(xp, yp, zp,
237 ux[ip], uy[ip], uz[ip], t);
238 }
239 }
240 }
241 }
242 }
243
244 // Initialize the last NumRuntimeIntComps() - n_external_attr_int runtime int attributes
245 for (int j = n_external_attr_int; j < ptile.NumIntComps() ; ++j)
246 {
247 auto attr_ptr = ptile.GetStructOfArrays().GetIntData(j).data();
248
249 // Current runtime comp is ionization level
250 auto const it_ioniz = std::find(particle_icomps.begin(), particle_icomps.end(), "ionizationLevel");
251 if (it_ioniz != particle_icomps.end() &&
252 std::distance(particle_icomps.begin(), it_ioniz) == j)
253 {
254 if (run_on_gpu) {
255 amrex::ParallelFor(stop - start,
256 [=] AMREX_GPU_DEVICE (int i) noexcept {
257 const int ip = i + start;
258 attr_ptr[ip] = ionization_initial_level;
259 });
260 } else {
261 for (int ip = start; ip < stop; ++ip) {
262 attr_ptr[ip] = ionization_initial_level;
263 }
264 }
265 }
266
267 for (int ia = 0; ia < n_user_int_attribs; ++ia)
268 {
269 // Current runtime comp is ia-th user defined attribute
270 auto const it_uia = std::find(particle_icomps.begin(), particle_icomps.end(), user_int_attribs[ia]);
271 if (it_uia != particle_icomps.end() &&
272 std::distance(particle_icomps.begin(), it_uia) == j)
273 {
274 const amrex::ParserExecutor<7> user_int_attrib_parserexec =
275 user_int_attrib_parser[ia]->compile<7>();
276 if (run_on_gpu) {
277 amrex::ParallelFor(stop - start,
278 [=] AMREX_GPU_DEVICE (int i) noexcept {
279 const int ip = i + start;
280 amrex::ParticleReal xp, yp, zp;
281 get_position(ip, xp, yp, zp);
282 attr_ptr[ip] = static_cast<int>(
283 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
284 });
285 } else {
286 for (int ip = start; ip < stop; ++ip) {
287 amrex::ParticleReal xp, yp, zp;
288 get_position(ip, xp, yp, zp);
289 attr_ptr[ip] = static_cast<int>(
290 user_int_attrib_parserexec(xp, yp, zp, ux[ip], uy[ip], uz[ip], t));
291 }
292 }
293 }
294 }
295 }
296}
297
298}
299
300#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: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:706
virtual bool isManaged() const
virtual bool isDevice() const
amrex_real Real
amrex_particle_real ParticleReal
Real Random()
Definition DefaultInitialization.H:90
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:111
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)
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
Definition WarpXParticleContainer.H:70
@ uz
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70