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_GpuContainers.H>
18 #include <AMReX_GpuQualifiers.H>
19 #include <AMReX_REAL.H>
20 #include <AMReX_Random.H>
21 #include <AMReX_Vector.H>
22 
23 #include <picsar_qed/containers/picsar_array.hpp>
24 #include <picsar_qed/math/cmath_overloads.hpp>
25 #include <picsar_qed/math/vec_functions.hpp>
26 #include <picsar_qed/physics/phys_constants.h>
27 #include <picsar_qed/physics/quantum_sync/quantum_sync_engine_core.hpp>
28 #include <picsar_qed/physics/quantum_sync/quantum_sync_engine_tables.hpp>
29 #include <picsar_qed/physics/unit_conversion.hpp>
30 
31 #include <cmath>
32 #include <vector>
33 
34 namespace amrex { struct RandomEngine; }
35 
36 // Aliases =============================
38  picsar::multi_physics::phys::quantum_sync::
39  dndt_lookup_table_params<amrex::Real>;
40 
41 using QS_dndt_table =
42  picsar::multi_physics::phys::quantum_sync::
43  dndt_lookup_table<
44  amrex::Real,
45  amrex::Gpu::DeviceVector<amrex::Real>>;
46 
47 using QS_dndt_table_view = QS_dndt_table::view_type;
48 
50  picsar::multi_physics::phys::quantum_sync::
51  photon_emission_lookup_table_params<amrex::Real>;
52 
53 using QS_phot_em_table =
54  picsar::multi_physics::phys::quantum_sync::
55  photon_emission_lookup_table<
56  amrex::Real,
57  amrex::Gpu::DeviceVector<amrex::Real>>;
58 
59 using QS_phot_em_table_view = QS_phot_em_table::view_type;
60 
62 {
65 };
66 
67 // Functors ==================================
68 
69 // These functors allow using the core elementary functions of the library.
70 // They are generated by a factory class (QuantumSynchrotronEngine, see below).
71 // They can be included in GPU kernels.
72 
78 {
79 public:
85  {}
86 
91  AMREX_GPU_HOST_DEVICE
92  AMREX_FORCE_INLINE
93  amrex::Real operator() (amrex::RandomEngine const& engine) const noexcept
94  {
95  namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
96 
97  //A random number in [0,1) should be provided as an argument.
98  return pxr_qs::get_optical_depth(amrex::Random(engine));
99  }
100 };
101 //____________________________________________
102 
108 {
109 public:
110 
115 
123  const QS_dndt_table_view table_view,
124  const amrex::ParticleReal qs_minimum_chi_part):
125  m_table_view{table_view}, m_qs_minimum_chi_part{qs_minimum_chi_part}{}
126 
139  AMREX_GPU_DEVICE
140  AMREX_FORCE_INLINE
142  const amrex::Real ux, const amrex::Real uy, const amrex::Real uz,
143  const amrex::Real ex, const amrex::Real ey, const amrex::Real ez,
144  const amrex::Real bx, const amrex::Real by, const amrex::Real bz,
145  const amrex::Real dt, amrex::Real& opt_depth) const noexcept
146  {
147  using namespace amrex::literals;
148  namespace pxr_p = picsar::multi_physics::phys;
149  namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
150 
151  constexpr amrex::Real m_e = PhysConst::m_e;
152  constexpr amrex::Real inv_c2 = 1._rt/(PhysConst::c*PhysConst::c);
153  const amrex::Real gamma = std::sqrt(1._rt + (ux*ux + uy*uy + uz*uz)*inv_c2);
154  const auto energy = gamma*m_e*PhysConst::c*PhysConst::c;
155 
156  const auto chi_part = QedUtils::chi_ele_pos(
157  m_e*ux, m_e*uy, m_e*uz, ex, ey, ez, bx, by, bz);
158 
159  if (chi_part < m_qs_minimum_chi_part)
160  return 0;
161 
162  const auto is_out = pxr_qs::evolve_optical_depth<
163  amrex::Real,
165  pxr_p::unit_system::SI>(
166  energy, chi_part, dt, opt_depth, m_table_view);
167 
168  return is_out;
169  }
170 
171 private:
173  amrex::ParticleReal m_qs_minimum_chi_part;
174 };
175 
181 {
182 public:
183 
188 
198  const QS_phot_em_table_view table_view):
199  m_table_view{table_view}{}
200 
212  AMREX_GPU_DEVICE
213  AMREX_FORCE_INLINE
215  amrex::ParticleReal& ux, amrex::ParticleReal& uy,
216  amrex::ParticleReal& uz,
217  const amrex::ParticleReal ex, const amrex::ParticleReal ey,
218  const amrex::ParticleReal ez, const amrex::ParticleReal bx,
219  const amrex::ParticleReal by, const amrex::ParticleReal bz,
220  amrex::ParticleReal& g_ux, amrex::ParticleReal& g_uy,
221  amrex::ParticleReal& g_uz, amrex::RandomEngine const& engine) const noexcept
222  {
223  using namespace amrex;
224  namespace pxr_m = picsar::multi_physics::math;
225  namespace pxr_p = picsar::multi_physics::phys;
226  namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
227 
228  const auto rand_zero_one_minus_epsi = amrex::Random(engine);
229 
230  constexpr ParticleReal me = PhysConst::m_e;
231  constexpr ParticleReal one_over_me = 1._prt/me;
232 
233  // Particle momentum is stored as gamma * velocity.
234  // Convert to m * gamma * velocity
235  auto px = ux*me;
236  auto py = uy*me;
237  auto pz = uz*me;
238 
239  const auto chi_particle = QedUtils::chi_ele_pos(
240  px, py, pz, ex, ey, ez, bx, by, bz);
241 
242  auto momentum_particle = pxr_m::vec3<amrex::ParticleReal>{px, py, pz};
243  auto momentum_photon = pxr_m::vec3<amrex::ParticleReal>();
244 
245  const auto is_out = pxr_qs::generate_photon_update_momentum<
246  amrex::ParticleReal,
248  pxr_p::unit_system::SI>(
249  chi_particle, momentum_particle,
250  rand_zero_one_minus_epsi,
251  m_table_view,
252  momentum_photon);
253 
254  ux = momentum_particle[0]*one_over_me;
255  uy = momentum_particle[1]*one_over_me;
256  uz = momentum_particle[2]*one_over_me;
257  g_ux = momentum_photon[0]*one_over_me;
258  g_uy = momentum_photon[1]*one_over_me;
259  g_uz = momentum_photon[2]*one_over_me;
260 
261  return is_out;
262  }
263 
264 private:
266 
267 };
268 
269 // Factory class =============================
270 
275 {
276 public:
281 
285  QuantumSynchrotronGetOpticalDepth build_optical_depth_functor ();
286 
290  QuantumSynchrotronEvolveOpticalDepth build_evolve_functor ();
291 
295  QuantumSynchrotronPhotonEmission build_phot_em_functor ();
296 
300  bool are_lookup_tables_initialized () const;
301 
308  std::vector<char> export_lookup_tables_data () const;
309 
317  bool init_lookup_tables_from_raw_data (const std::vector<char>& raw_data,
318  const amrex::Real qs_minimum_chi_part);
319 
325  void init_builtin_tables(const amrex::Real qs_minimum_chi_part);
326 
333  void compute_lookup_tables (PicsarQuantumSyncCtrl ctrl,
334  const amrex::Real qs_minimum_chi_part);
335 
341  PicsarQuantumSyncCtrl get_default_ctrl() const;
342 
343  amrex::Real get_minimum_chi_part() const;
344 
345 private:
346  bool m_lookup_tables_initialized = false;
347 
348  //Variables to store the minimum chi parameters to enable
349  //Quantum Synchrotron process
351 
354 
355  void init_builtin_dndt_table();
356  void init_builtin_phot_em_table();
357 };
358 
359 //============================================
360 
361 #endif //WARPX_quantum_sync_engine_wrapper_h_
QS_phot_em_table_view m_table_view
Definition: QuantumSyncEngineWrapper.H:265
picsar::multi_physics::phys::quantum_sync::photon_emission_lookup_table< amrex::Real, amrex::Gpu::DeviceVector< amrex::Real > > QS_phot_em_table
Definition: QuantumSyncEngineWrapper.H:57
amrex::ParticleReal m_qs_minimum_chi_part
Definition: QuantumSyncEngineWrapper.H:173
QS_dndt_table_view m_table_view
Definition: QuantumSyncEngineWrapper.H:172
QuantumSynchrotronEvolveOpticalDepth()
Definition: QuantumSyncEngineWrapper.H:114
picsar::multi_physics::phys::quantum_sync::dndt_lookup_table_params< amrex::Real > QS_dndt_table_params
Definition: QuantumSyncEngineWrapper.H:39
QS_phot_em_table::view_type QS_phot_em_table_view
Definition: QuantumSyncEngineWrapper.H:59
QuantumSynchrotronPhotonEmission(const QS_phot_em_table_view table_view)
Definition: QuantumSyncEngineWrapper.H:197
Definition: QuantumSyncEngineWrapper.H:77
QS_dndt_table::view_type QS_dndt_table_view
Definition: QuantumSyncEngineWrapper.H:47
me
Definition: yt3d_mpi.py:139
QuantumSynchrotronGetOpticalDepth()
Definition: QuantumSyncEngineWrapper.H:84
def uz
Definition: read_lab_particles.py:29
QS_dndt_table m_dndt_table
Definition: QuantumSyncEngineWrapper.H:352
QS_phot_em_table_params phot_em_params
Definition: QuantumSyncEngineWrapper.H:64
QS_phot_em_table m_phot_em_table
Definition: QuantumSyncEngineWrapper.H:353
amrex::Real m_qs_minimum_chi_part
Definition: QuantumSyncEngineWrapper.H:350
AMREX_GPU_DEVICE AMREX_FORCE_INLINE int operator()(const amrex::Real ux, const amrex::Real uy, const amrex::Real uz, const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, const amrex::Real bx, const amrex::Real by, const amrex::Real bz, const amrex::Real dt, amrex::Real &opt_depth) const noexcept
Definition: QuantumSyncEngineWrapper.H:141
Definition: QuantumSyncEngineWrapper.H:61
QS_dndt_table_params dndt_params
Definition: QuantumSyncEngineWrapper.H:63
Definition: QuantumSyncEngineWrapper.H:180
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
Definition: QuantumSyncEngineWrapper.H:107
QuantumSynchrotronEvolveOpticalDepth(const QS_dndt_table_view table_view, const amrex::ParticleReal qs_minimum_chi_part)
Definition: QuantumSyncEngineWrapper.H:122
def ux
Definition: read_lab_particles.py:28
picsar::multi_physics::phys::quantum_sync::photon_emission_lookup_table_params< amrex::Real > QS_phot_em_table_params
Definition: QuantumSyncEngineWrapper.H:51
picsar::multi_physics::phys::quantum_sync::dndt_lookup_table< amrex::Real, amrex::Gpu::DeviceVector< amrex::Real > > QS_dndt_table
Definition: QuantumSyncEngineWrapper.H:45
Definition: QuantumSyncEngineWrapper.H:274
Definition: BreitWheelerEngineWrapper.H:35
QuantumSynchrotronPhotonEmission()
Definition: QuantumSyncEngineWrapper.H:187
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:214