WarpX
Loading...
Searching...
No Matches
QuantumSyncEngineWrapper.H
Go to the documentation of this file.
1/* Copyright 2019 Luca Fedeli
2 *
3 * This file is part of WarpX.
4 *
5 * License: BSD-3-Clause-LBNL
6 */
7#ifndef WARPX_quantum_sync_engine_wrapper_h_
8#define WARPX_quantum_sync_engine_wrapper_h_
9
11
12#include "QedChiFunctions.H"
13#include "QedWrapperCommons.H"
14#include "Utils/WarpXConst.H"
15
16#include <AMReX_Extension.H>
17#include <AMReX_GpuQualifiers.H>
18#include <AMReX_REAL.H>
19#include <AMReX_Random.H>
20
21#include <picsar_qed/containers/picsar_array.hpp>
22#include <picsar_qed/math/cmath_overloads.hpp>
23#include <picsar_qed/math/vec_functions.hpp>
24#include <picsar_qed/physics/phys_constants.h>
25#include <picsar_qed/physics/quantum_sync/quantum_sync_engine_core.hpp>
26#include <picsar_qed/physics/quantum_sync/quantum_sync_engine_tables.hpp>
27#include <picsar_qed/physics/unit_conversion.hpp>
28
29#include <cmath>
30#include <vector>
31
32namespace amrex { struct RandomEngine; }
33
34// Aliases =============================
36 picsar::multi_physics::phys::quantum_sync::
37 dndt_lookup_table_params<amrex::ParticleReal>;
38
40 picsar::multi_physics::phys::quantum_sync::
41 dndt_lookup_table<
42 amrex::ParticleReal,
44
45using QS_dndt_table_view = QS_dndt_table::view_type;
46
48 picsar::multi_physics::phys::quantum_sync::
49 photon_emission_lookup_table_params<amrex::ParticleReal>;
50
52 picsar::multi_physics::phys::quantum_sync::
53 photon_emission_lookup_table<
54 amrex::ParticleReal,
56
57using QS_phot_em_table_view = QS_phot_em_table::view_type;
58
64
65// Functors ==================================
66
67// These functors allow using the core elementary functions of the library.
68// They are generated by a factory class (QuantumSynchrotronEngine, see below).
69// They can be included in GPU kernels.
70
76{
77public:
83
90 amrex::ParticleReal operator() (amrex::RandomEngine const& engine) const noexcept
91 {
92 namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
93
94 //A random number in [0,1) should be provided as an argument.
95 return pxr_qs::get_optical_depth(amrex::Random(engine));
96 }
97};
98//____________________________________________
99
105{
106public:
107
112
120 const QS_dndt_table_view table_view,
121 const amrex::ParticleReal qs_minimum_chi_part):
122 m_table_view{table_view}, m_qs_minimum_chi_part{qs_minimum_chi_part}{}
123
139 const amrex::ParticleReal ux, const amrex::ParticleReal uy, const amrex::ParticleReal uz,
140 const amrex::ParticleReal ex, const amrex::ParticleReal ey, const amrex::ParticleReal ez,
141 const amrex::ParticleReal bx, const amrex::ParticleReal by, const amrex::ParticleReal bz,
142 const amrex::Real dt, amrex::ParticleReal& opt_depth) const noexcept
143 {
144 using namespace amrex::literals;
145 namespace pxr_p = picsar::multi_physics::phys;
146 namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
147
148 constexpr amrex::ParticleReal m_e = PhysConst::m_e;
149 constexpr amrex::ParticleReal inv_c2 = 1._rt/(PhysConst::c*PhysConst::c);
150 const amrex::ParticleReal gamma = std::sqrt(1._rt + (ux*ux + uy*uy + uz*uz)*inv_c2);
151 const auto energy = gamma*m_e*PhysConst::c*PhysConst::c;
152
153 const auto chi_part = QedUtils::chi_ele_pos(
154 m_e*ux, m_e*uy, m_e*uz, ex, ey, ez, bx, by, bz);
155
156 if (chi_part < m_qs_minimum_chi_part) {
157 return 0;
158 }
159
160 const auto is_out = pxr_qs::evolve_optical_depth<
161 amrex::ParticleReal,
163 pxr_p::unit_system::SI>(
164 energy, chi_part, dt, opt_depth, m_table_view);
165
166 return is_out;
167 }
168
169private:
171 amrex::ParticleReal m_qs_minimum_chi_part;
172};
173
179{
180public:
181
186
196 const QS_phot_em_table_view table_view):
197 m_table_view{table_view}{}
198
213 amrex::ParticleReal& ux, amrex::ParticleReal& uy,
214 amrex::ParticleReal& uz,
215 const amrex::ParticleReal ex, const amrex::ParticleReal ey,
216 const amrex::ParticleReal ez, const amrex::ParticleReal bx,
217 const amrex::ParticleReal by, const amrex::ParticleReal bz,
218 amrex::ParticleReal& g_ux, amrex::ParticleReal& g_uy,
219 amrex::ParticleReal& g_uz, amrex::RandomEngine const& engine) const noexcept
220 {
221 using namespace amrex;
222 namespace pxr_m = picsar::multi_physics::math;
223 namespace pxr_p = picsar::multi_physics::phys;
224 namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
225
226 const auto rand_zero_one_minus_epsi = amrex::Random(engine);
227
228 constexpr ParticleReal me = PhysConst::m_e;
229 constexpr ParticleReal one_over_me = 1._prt/me;
230
231 // Particle momentum is stored as gamma * velocity.
232 // Convert to m * gamma * velocity
233 auto px = ux*me;
234 auto py = uy*me;
235 auto pz = uz*me;
236
237 const auto chi_particle = QedUtils::chi_ele_pos(
238 px, py, pz, ex, ey, ez, bx, by, bz);
239
240 auto momentum_particle = pxr_m::vec3<amrex::ParticleReal>{px, py, pz};
241 auto momentum_photon = pxr_m::vec3<amrex::ParticleReal>();
242
243 const auto is_out = pxr_qs::generate_photon_update_momentum<
244 amrex::ParticleReal,
246 pxr_p::unit_system::SI>(
247 chi_particle, momentum_particle,
248 rand_zero_one_minus_epsi,
250 momentum_photon);
251
252 ux = momentum_particle[0]*one_over_me;
253 uy = momentum_particle[1]*one_over_me;
254 uz = momentum_particle[2]*one_over_me;
255 g_ux = momentum_photon[0]*one_over_me;
256 g_uy = momentum_photon[1]*one_over_me;
257 g_uz = momentum_photon[2]*one_over_me;
258
259 return is_out;
260 }
261
262private:
264
265};
266
267// Factory class =============================
268
273{
274public:
279
284
289
294
298 [[nodiscard]] bool are_lookup_tables_initialized () const;
299
306 [[nodiscard]] std::vector<char> export_lookup_tables_data () const;
307
315 bool init_lookup_tables_from_raw_data (const std::vector<char>& raw_data,
316 amrex::ParticleReal qs_minimum_chi_part);
317
323 void init_builtin_tables(amrex::ParticleReal qs_minimum_chi_part);
324
332 amrex::ParticleReal qs_minimum_chi_part);
333
339 [[nodiscard]] PicsarQuantumSyncCtrl get_default_ctrl() const;
340
341 [[nodiscard]] amrex::ParticleReal get_minimum_chi_part() const;
342
343private:
345
346 //Variables to store the minimum chi parameters to enable
347 //Quantum Synchrotron process
348 amrex::ParticleReal m_qs_minimum_chi_part;
349
352
355};
356
357//============================================
358
359#endif //WARPX_quantum_sync_engine_wrapper_h_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_DEVICE
#define AMREX_GPU_HOST_DEVICE
std::vector< Real > PicsarQedVector
Definition QedWrapperCommons.H:105
picsar::multi_physics::phys::quantum_sync:: dndt_lookup_table< amrex::ParticleReal, PicsarQedVector< amrex::ParticleReal > > QS_dndt_table
Definition QuantumSyncEngineWrapper.H:39
picsar::multi_physics::phys::quantum_sync:: photon_emission_lookup_table_params< amrex::ParticleReal > QS_phot_em_table_params
Definition QuantumSyncEngineWrapper.H:47
QS_dndt_table::view_type QS_dndt_table_view
Definition QuantumSyncEngineWrapper.H:45
picsar::multi_physics::phys::quantum_sync:: dndt_lookup_table_params< amrex::ParticleReal > QS_dndt_table_params
Definition QuantumSyncEngineWrapper.H:35
QS_phot_em_table::view_type QS_phot_em_table_view
Definition QuantumSyncEngineWrapper.H:57
picsar::multi_physics::phys::quantum_sync:: photon_emission_lookup_table< amrex::ParticleReal, PicsarQedVector< amrex::ParticleReal > > QS_phot_em_table
Definition QuantumSyncEngineWrapper.H:51
PicsarQuantumSyncCtrl get_default_ctrl() const
Definition QuantumSyncEngineWrapper.cpp:129
QS_phot_em_table m_phot_em_table
Definition QuantumSyncEngineWrapper.H:351
void compute_lookup_tables(PicsarQuantumSyncCtrl ctrl, amrex::ParticleReal qs_minimum_chi_part)
Definition QuantumSyncEngineWrapper.cpp:144
bool m_lookup_tables_initialized
Definition QuantumSyncEngineWrapper.H:344
void init_builtin_phot_em_table()
Definition QuantumSyncEngineWrapper.cpp:198
QuantumSynchrotronEngine()=default
bool init_lookup_tables_from_raw_data(const std::vector< char > &raw_data, amrex::ParticleReal qs_minimum_chi_part)
Definition QuantumSyncEngineWrapper.cpp:65
QS_dndt_table m_dndt_table
Definition QuantumSyncEngineWrapper.H:350
QuantumSynchrotronEvolveOpticalDepth build_evolve_functor()
Definition QuantumSyncEngineWrapper.cpp:44
void init_builtin_tables(amrex::ParticleReal qs_minimum_chi_part)
Definition QuantumSyncEngineWrapper.cpp:95
amrex::ParticleReal m_qs_minimum_chi_part
Definition QuantumSyncEngineWrapper.H:348
QuantumSynchrotronPhotonEmission build_phot_em_functor()
Definition QuantumSyncEngineWrapper.cpp:51
amrex::ParticleReal get_minimum_chi_part() const
Definition QuantumSyncEngineWrapper.cpp:139
bool are_lookup_tables_initialized() const
Definition QuantumSyncEngineWrapper.cpp:59
std::vector< char > export_lookup_tables_data() const
Definition QuantumSyncEngineWrapper.cpp:105
QuantumSynchrotronGetOpticalDepth build_optical_depth_functor()
Definition QuantumSyncEngineWrapper.cpp:39
void init_builtin_dndt_table()
Definition QuantumSyncEngineWrapper.cpp:164
Definition QuantumSyncEngineWrapper.H:105
amrex::ParticleReal m_qs_minimum_chi_part
Definition QuantumSyncEngineWrapper.H:171
QS_dndt_table_view m_table_view
Definition QuantumSyncEngineWrapper.H:170
QuantumSynchrotronEvolveOpticalDepth(const QS_dndt_table_view table_view, const amrex::ParticleReal qs_minimum_chi_part)
Definition QuantumSyncEngineWrapper.H:119
AMREX_GPU_DEVICE AMREX_FORCE_INLINE int operator()(const amrex::ParticleReal ux, const amrex::ParticleReal uy, const amrex::ParticleReal uz, const amrex::ParticleReal ex, const amrex::ParticleReal ey, const amrex::ParticleReal ez, const amrex::ParticleReal bx, const amrex::ParticleReal by, const amrex::ParticleReal bz, const amrex::Real dt, amrex::ParticleReal &opt_depth) const noexcept
Definition QuantumSyncEngineWrapper.H:138
Definition QuantumSyncEngineWrapper.H:76
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal operator()(amrex::RandomEngine const &engine) const noexcept
Definition QuantumSyncEngineWrapper.H:90
Definition QuantumSyncEngineWrapper.H:179
AMREX_GPU_DEVICE AMREX_FORCE_INLINE bool operator()(amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, const amrex::ParticleReal ex, const amrex::ParticleReal ey, const amrex::ParticleReal ez, const amrex::ParticleReal bx, const amrex::ParticleReal by, const amrex::ParticleReal bz, amrex::ParticleReal &g_ux, amrex::ParticleReal &g_uy, amrex::ParticleReal &g_uz, amrex::RandomEngine const &engine) const noexcept
Definition QuantumSyncEngineWrapper.H:212
QS_phot_em_table_view m_table_view
Definition QuantumSyncEngineWrapper.H:263
QuantumSynchrotronPhotonEmission(const QS_phot_em_table_view table_view)
Definition QuantumSyncEngineWrapper.H:195
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real chi_ele_pos(const amrex::ParticleReal px, const amrex::ParticleReal py, const amrex::ParticleReal pz, const amrex::ParticleReal ex, const amrex::ParticleReal ey, const amrex::ParticleReal ez, const amrex::ParticleReal bx, const amrex::ParticleReal by, const amrex::ParticleReal bz)
Definition QedChiFunctions.H:53
constexpr auto c
vacuum speed of light [m/s]
Definition constant.H:149
constexpr auto m_e
electron mass [kg]
Definition constant.H:161
Real Random()
Definition QuantumSyncEngineWrapper.H:60
QS_phot_em_table_params phot_em_params
Definition QuantumSyncEngineWrapper.H:62
QS_dndt_table_params dndt_params
Definition QuantumSyncEngineWrapper.H:61