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 
10 #include "QedWrapperCommons.H"
11 #include "QedChiFunctions.H"
12 #include "Utils/WarpXConst.H"
13 
14 #include <AMReX_Array.H>
15 #include <AMReX_Vector.H>
16 #include <AMReX_Gpu.H>
17 
18 #include <physics/quantum_sync/quantum_sync_engine_tables.hpp>
19 #include <physics/quantum_sync/quantum_sync_engine_core.hpp>
20 
21 #include <string>
22 #include <vector>
23 
24 // Aliases =============================
26  picsar::multi_physics::phys::quantum_sync::
27  dndt_lookup_table_params<amrex::Real>;
28 
29 using QS_dndt_table =
30  picsar::multi_physics::phys::quantum_sync::
31  dndt_lookup_table<
32  amrex::Real,
33  amrex::Gpu::DeviceVector<amrex::Real>>;
34 
35 using QS_dndt_table_view = QS_dndt_table::view_type;
36 
38  picsar::multi_physics::phys::quantum_sync::
39  photon_emission_lookup_table_params<amrex::Real>;
40 
41 using QS_phot_em_table =
42  picsar::multi_physics::phys::quantum_sync::
43  photon_emission_lookup_table<
44  amrex::Real,
45  amrex::Gpu::DeviceVector<amrex::Real>>;
46 
47 using QS_phot_em_table_view = QS_phot_em_table::view_type;
48 
50 {
53 };
54 
55 // Functors ==================================
56 
57 // These functors allow using the core elementary functions of the library.
58 // They are generated by a factory class (QuantumSynchrotronEngine, see below).
59 // They can be included in GPU kernels.
60 
66 {
67 public:
73  {};
74 
79  AMREX_GPU_HOST_DEVICE
80  AMREX_FORCE_INLINE
81  amrex::Real operator() () const noexcept
82  {
83  namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
84 
85  //A random number in [0,1) should be provided as an argument.
86  return pxr_qs::get_optical_depth(amrex::Random());
87  }
88 };
89 //____________________________________________
90 
96 {
97 public:
98 
103 
111  const QS_dndt_table_view table_view,
112  const amrex::ParticleReal qs_minimum_chi_part):
113  m_table_view{table_view}, m_qs_minimum_chi_part{qs_minimum_chi_part}{};
114 
127  AMREX_GPU_DEVICE
128  AMREX_FORCE_INLINE
130  const amrex::Real ux, const amrex::Real uy, const amrex::Real uz,
131  const amrex::Real ex, const amrex::Real ey, const amrex::Real ez,
132  const amrex::Real bx, const amrex::Real by, const amrex::Real bz,
133  const amrex::Real dt, amrex::Real& opt_depth) const noexcept
134  {
135  using namespace amrex::literals;
136  namespace pxr_p = picsar::multi_physics::phys;
137  namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
138 
139  constexpr amrex::Real m_e = PhysConst::m_e;
140  constexpr amrex::Real inv_c2 = 1._rt/(PhysConst::c*PhysConst::c);
141  const amrex::Real gamma = std::sqrt(1._rt + (ux*ux + uy*uy + uz*uz)*inv_c2);
142  const auto energy = gamma*m_e*PhysConst::c*PhysConst::c;
143 
144  const auto chi_part = QedUtils::chi_ele_pos(
145  m_e*ux, m_e*uy, m_e*uz, ex, ey, ez, bx, by, bz);
146 
147  if (chi_part < m_qs_minimum_chi_part)
148  return 0;
149 
150  const auto is_out = pxr_qs::evolve_optical_depth<
151  amrex::Real,
153  pxr_p::unit_system::SI>(
154  energy, chi_part, dt, opt_depth, m_table_view);
155 
156  return is_out;
157  }
158 
159 private:
161  amrex::ParticleReal m_qs_minimum_chi_part;
162 };
163 
169 {
170 public:
171 
176 
186  const QS_phot_em_table_view table_view):
187  m_table_view{table_view}{};
188 
199  AMREX_GPU_DEVICE
200  AMREX_FORCE_INLINE
202  amrex::Real& ux, amrex::Real& uy, amrex::Real& uz,
203  const amrex::Real ex, const amrex::Real ey, const amrex::Real ez,
204  const amrex::Real bx, const amrex::Real by, const amrex::Real bz,
205  amrex::Real& g_ux, amrex::Real& g_uy, amrex::Real& g_uz) const noexcept
206  {
207  using namespace amrex;
208  namespace pxr_m = picsar::multi_physics::math;
209  namespace pxr_p = picsar::multi_physics::phys;
210  namespace pxr_qs = picsar::multi_physics::phys::quantum_sync;
211 
212  const auto rand_zero_one_minus_epsi = amrex::Random();
213 
214  constexpr ParticleReal me = PhysConst::m_e;
215  constexpr ParticleReal one_over_me = 1._prt/me;
216 
217  // Particle momentum is stored as gamma * velocity.
218  // Convert to m * gamma * velocity
219  auto px = ux*me;
220  auto py = uy*me;
221  auto pz = uz*me;
222 
223  const auto chi_particle = QedUtils::chi_ele_pos(
224  px, py, pz, ex, ey, ez, bx, by, bz);
225 
226  auto momentum_particle = pxr_m::vec3<amrex::Real>{px, py, pz};
227  auto momentum_photon = pxr_m::vec3<amrex::Real>();
228 
229  const auto is_out = pxr_qs::generate_photon_update_momentum<
230  amrex::Real,
232  pxr_p::unit_system::SI>(
233  chi_particle, momentum_particle,
234  rand_zero_one_minus_epsi,
235  m_table_view,
236  momentum_photon);
237 
238  ux = momentum_particle[0]*one_over_me;
239  uy = momentum_particle[1]*one_over_me;
240  uz = momentum_particle[2]*one_over_me;
241  g_ux = momentum_photon[0]*one_over_me;
242  g_uy = momentum_photon[1]*one_over_me;
243  g_uz = momentum_photon[2]*one_over_me;
244 
245  return is_out;
246  }
247 
248 private:
250 
251 };
252 
253 // Factory class =============================
254 
259 {
260 public:
265 
269  QuantumSynchrotronGetOpticalDepth build_optical_depth_functor ();
270 
274  QuantumSynchrotronEvolveOpticalDepth build_evolve_functor ();
275 
279  QuantumSynchrotronPhotonEmission build_phot_em_functor ();
280 
284  bool are_lookup_tables_initialized () const;
285 
292  std::vector<char> export_lookup_tables_data () const;
293 
301  bool init_lookup_tables_from_raw_data (const std::vector<char>& raw_data,
302  const amrex::Real qs_minimum_chi_part);
303 
309  void init_builtin_tables(const amrex::Real qs_minimum_chi_part);
310 
317  void compute_lookup_tables (PicsarQuantumSyncCtrl ctrl,
318  const amrex::Real qs_minimum_chi_part);
319 
325  PicsarQuantumSyncCtrl get_default_ctrl() const;
326 
327  amrex::Real get_minimum_chi_part() const;
328 
329 private:
330  bool m_lookup_tables_initialized = false;
331 
332  //Variables to store the minimum chi parameters to enable
333  //Quantum Synchrotron process
335 
338 
339  void init_builtin_dndt_table();
340  void init_builtin_phot_em_table();
341 };
342 
343 //============================================
344 
345 #endif //WARPX_quantum_sync_engine_wrapper_h_
QS_phot_em_table_view m_table_view
Definition: QuantumSyncEngineWrapper.H:249
picsar::multi_physics::phys::quantum_sync::photon_emission_lookup_table< amrex::Real, amrex::Gpu::DeviceVector< amrex::Real > > QS_phot_em_table
Definition: QuantumSyncEngineWrapper.H:45
amrex::ParticleReal m_qs_minimum_chi_part
Definition: QuantumSyncEngineWrapper.H:161
QS_dndt_table_view m_table_view
Definition: QuantumSyncEngineWrapper.H:160
QuantumSynchrotronEvolveOpticalDepth()
Definition: QuantumSyncEngineWrapper.H:102
picsar::multi_physics::phys::quantum_sync::dndt_lookup_table_params< amrex::Real > QS_dndt_table_params
Definition: QuantumSyncEngineWrapper.H:27
QS_phot_em_table::view_type QS_phot_em_table_view
Definition: QuantumSyncEngineWrapper.H:47
QuantumSynchrotronPhotonEmission(const QS_phot_em_table_view table_view)
Definition: QuantumSyncEngineWrapper.H:185
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real chi_ele_pos(const amrex::Real px, const amrex::Real py, const amrex::Real pz, const amrex::Real ex, const amrex::Real ey, const amrex::Real ez, const amrex::Real bx, const amrex::Real by, const amrex::Real bz)
Definition: QedChiFunctions.H:51
Definition: QuantumSyncEngineWrapper.H:65
QS_dndt_table::view_type QS_dndt_table_view
Definition: QuantumSyncEngineWrapper.H:35
AMREX_GPU_DEVICE AMREX_FORCE_INLINE bool operator()(amrex::Real &ux, amrex::Real &uy, 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, amrex::Real &g_ux, amrex::Real &g_uy, amrex::Real &g_uz) const noexcept
Definition: QuantumSyncEngineWrapper.H:201
me
Definition: yt3d_mpi.py:139
QuantumSynchrotronGetOpticalDepth()
Definition: QuantumSyncEngineWrapper.H:72
def uz
Definition: read_lab_particles.py:29
QS_dndt_table m_dndt_table
Definition: QuantumSyncEngineWrapper.H:336
QS_phot_em_table_params phot_em_params
Definition: QuantumSyncEngineWrapper.H:52
QS_phot_em_table m_phot_em_table
Definition: QuantumSyncEngineWrapper.H:337
amrex::Real m_qs_minimum_chi_part
Definition: QuantumSyncEngineWrapper.H:334
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:129
Definition: QuantumSyncEngineWrapper.H:49
QS_dndt_table_params dndt_params
Definition: QuantumSyncEngineWrapper.H:51
Definition: QuantumSyncEngineWrapper.H:168
Definition: QuantumSyncEngineWrapper.H:95
QuantumSynchrotronEvolveOpticalDepth(const QS_dndt_table_view table_view, const amrex::ParticleReal qs_minimum_chi_part)
Definition: QuantumSyncEngineWrapper.H:110
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:39
picsar::multi_physics::phys::quantum_sync::dndt_lookup_table< amrex::Real, amrex::Gpu::DeviceVector< amrex::Real > > QS_dndt_table
Definition: QuantumSyncEngineWrapper.H:33
Definition: QuantumSyncEngineWrapper.H:258
Definition: PML.H:52
QuantumSynchrotronPhotonEmission()
Definition: QuantumSyncEngineWrapper.H:175