WarpX
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 
32 namespace 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 
45 using 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 
57 using QS_phot_em_table_view = QS_phot_em_table::view_type;
58 
60 {
63 };
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 {
77 public:
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 {
106 public:
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 
169 private:
171  amrex::ParticleReal m_qs_minimum_chi_part;
172 };
173 
179 {
180 public:
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,
249  m_table_view,
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 
262 private:
264 
265 };
266 
267 // Factory class =============================
268 
273 {
274 public:
279 
283  [[nodiscard]] QuantumSynchrotronGetOpticalDepth build_optical_depth_functor ();
284 
288  [[nodiscard]] QuantumSynchrotronEvolveOpticalDepth build_evolve_functor ();
289 
293  [[nodiscard]] QuantumSynchrotronPhotonEmission build_phot_em_functor ();
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 
331  void compute_lookup_tables (PicsarQuantumSyncCtrl ctrl,
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 
343 private:
344  bool m_lookup_tables_initialized = false;
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 
353  void init_builtin_dndt_table();
354  void init_builtin_phot_em_table();
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
QS_dndt_table::view_type QS_dndt_table_view
Definition: QuantumSyncEngineWrapper.H:45
picsar::multi_physics::phys::quantum_sync::photon_emission_lookup_table< amrex::ParticleReal, PicsarQedVector< amrex::ParticleReal > > QS_phot_em_table
Definition: QuantumSyncEngineWrapper.H:55
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_params< amrex::ParticleReal > QS_phot_em_table_params
Definition: QuantumSyncEngineWrapper.H:49
picsar::multi_physics::phys::quantum_sync::dndt_lookup_table_params< amrex::ParticleReal > QS_dndt_table_params
Definition: QuantumSyncEngineWrapper.H:37
picsar::multi_physics::phys::quantum_sync::dndt_lookup_table< amrex::ParticleReal, PicsarQedVector< amrex::ParticleReal > > QS_dndt_table
Definition: QuantumSyncEngineWrapper.H:43
Definition: QuantumSyncEngineWrapper.H:273
QS_phot_em_table m_phot_em_table
Definition: QuantumSyncEngineWrapper.H:351
QuantumSynchrotronEngine()=default
QS_dndt_table m_dndt_table
Definition: QuantumSyncEngineWrapper.H:350
amrex::ParticleReal m_qs_minimum_chi_part
Definition: QuantumSyncEngineWrapper.H:348
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
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
static constexpr auto m_e
electron mass [kg]
Definition: constant.H:52
Real Random()
float dt
Definition: stencil.py:442
int gamma
boosted frame
Definition: stencil.py:431
me
Definition: yt3d_mpi.py:142
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