7 #ifndef WARPX_breit_wheeler_engine_wrapper_h_
8 #define WARPX_breit_wheeler_engine_wrapper_h_
21 #include <picsar_qed/containers/picsar_array.hpp>
22 #include <picsar_qed/math/cmath_overloads.hpp>
23 #include <picsar_qed/math/math_constants.h>
24 #include <picsar_qed/math/vec_functions.hpp>
25 #include <picsar_qed/physics/breit_wheeler/breit_wheeler_engine_core.hpp>
26 #include <picsar_qed/physics/breit_wheeler/breit_wheeler_engine_tables.hpp>
27 #include <picsar_qed/physics/gamma_functions.hpp>
28 #include <picsar_qed/physics/phys_constants.h>
29 #include <picsar_qed/physics/unit_conversion.hpp>
34 namespace amrex {
struct RandomEngine; }
38 picsar::multi_physics::phys::breit_wheeler::
39 dndt_lookup_table_params<amrex::ParticleReal>;
42 picsar::multi_physics::phys::breit_wheeler::
50 picsar::multi_physics::phys::breit_wheeler::
51 pair_prod_lookup_table_params<amrex::ParticleReal>;
54 picsar::multi_physics::phys::breit_wheeler::
55 pair_prod_lookup_table<
94 namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler;
124 const amrex::ParticleReal bw_minimum_chi_phot):
144 const amrex::ParticleReal ux,
const amrex::ParticleReal uy,
145 const amrex::ParticleReal uz,
const amrex::ParticleReal ex,
146 const amrex::ParticleReal ey,
const amrex::ParticleReal ez,
147 const amrex::ParticleReal bx,
const amrex::ParticleReal by,
148 const amrex::ParticleReal bz,
const amrex::Real
dt,
149 amrex::ParticleReal& opt_depth)
const noexcept
151 namespace pxr_m = picsar::multi_physics::math;
152 namespace pxr_p = picsar::multi_physics::phys;
153 namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler;
156 const auto u_norm = std::sqrt(ux*ux + uy*uy + uz*uz);
159 const auto px =
m_e*ux;
160 const auto py =
m_e*uy;
161 const auto pz =
m_e*uz;
164 px, py, pz, ex, ey, ez, bx, by, bz);
169 const auto gamma_photon = pxr_p::compute_gamma_photon<
170 amrex::ParticleReal, pxr_p::unit_system::SI>(
172 if (gamma_photon < pxr_m::two<amrex::ParticleReal> ||
177 const auto is_out = pxr_bw::evolve_optical_depth<
180 pxr_p::unit_system::SI>(
232 const amrex::ParticleReal ux,
const amrex::ParticleReal uy,
233 const amrex::ParticleReal uz,
const amrex::ParticleReal ex,
234 const amrex::ParticleReal ey,
const amrex::ParticleReal ez,
235 const amrex::ParticleReal bx,
const amrex::ParticleReal by,
236 const amrex::ParticleReal bz, amrex::ParticleReal& e_ux,
237 amrex::ParticleReal& e_uy, amrex::ParticleReal& e_uz,
238 amrex::ParticleReal& p_ux, amrex::ParticleReal& p_uy,
239 amrex::ParticleReal& p_uz,
242 using namespace amrex;
243 namespace pxr_m = picsar::multi_physics::math;
244 namespace pxr_p = picsar::multi_physics::phys;
245 namespace pxr_bw = picsar::multi_physics::phys::breit_wheeler;
250 constexpr ParticleReal one_over_me = 1._prt/
me;
259 px, py, pz, ex, ey, ez, bx, by, bz);
261 const auto momentum_photon = pxr_m::vec3<amrex::ParticleReal>{px, py, pz};
262 auto momentum_ele = pxr_m::vec3<amrex::ParticleReal>();
263 auto momentum_pos = pxr_m::vec3<amrex::ParticleReal>();
265 const auto is_out = pxr_bw::generate_breit_wheeler_pairs<
268 pxr_p::unit_system::SI>(
270 rand_zero_one_minus_epsi,
272 momentum_ele, momentum_pos);
274 e_ux = momentum_ele[0]*one_over_me;
275 e_uy = momentum_ele[1]*one_over_me;
276 e_uz = momentum_ele[2]*one_over_me;
277 p_ux = momentum_pos[0]*one_over_me;
278 p_uy = momentum_pos[1]*one_over_me;
279 p_uz = momentum_pos[2]*one_over_me;
319 [[nodiscard]]
bool are_lookup_tables_initialized ()
const;
327 [[nodiscard]] std::vector<char> export_lookup_tables_data ()
const;
336 bool init_lookup_tables_from_raw_data (
337 const std::vector<char>& raw_data,
338 amrex::ParticleReal bw_minimum_chi_phot);
345 void init_builtin_tables(amrex::ParticleReal bw_minimum_chi_phot);
354 amrex::ParticleReal bw_minimum_chi_phot);
363 [[nodiscard]] amrex::ParticleReal get_minimum_chi_phot()
const;
366 bool m_lookup_tables_initialized =
false;
375 void init_builtin_dndt_table();
376 void init_builtin_pair_prod_table();
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
picsar::multi_physics::phys::breit_wheeler::dndt_lookup_table< amrex::ParticleReal, PicsarQedVector< amrex::ParticleReal > > BW_dndt_table
Definition: BreitWheelerEngineWrapper.H:45
picsar::multi_physics::phys::breit_wheeler::pair_prod_lookup_table< amrex::ParticleReal, PicsarQedVector< amrex::ParticleReal > > BW_pair_prod_table
Definition: BreitWheelerEngineWrapper.H:57
picsar::multi_physics::phys::breit_wheeler::dndt_lookup_table_params< amrex::ParticleReal > BW_dndt_table_params
Definition: BreitWheelerEngineWrapper.H:39
BW_dndt_table::view_type BW_dndt_table_view
Definition: BreitWheelerEngineWrapper.H:47
picsar::multi_physics::phys::breit_wheeler::pair_prod_lookup_table_params< amrex::ParticleReal > BW_pair_prod_table_params
Definition: BreitWheelerEngineWrapper.H:51
BW_pair_prod_table::view_type BW_pair_prod_table_view
Definition: BreitWheelerEngineWrapper.H:59
std::vector< Real > PicsarQedVector
Definition: QedWrapperCommons.H:105
Definition: BreitWheelerEngineWrapper.H:294
BreitWheelerEngine()=default
BW_pair_prod_table m_pair_prod_table
Definition: BreitWheelerEngineWrapper.H:373
amrex::ParticleReal m_bw_minimum_chi_phot
Definition: BreitWheelerEngineWrapper.H:370
BW_dndt_table m_dndt_table
Definition: BreitWheelerEngineWrapper.H:372
Definition: BreitWheelerEngineWrapper.H:107
BW_dndt_table_view m_table_view
Definition: BreitWheelerEngineWrapper.H:187
BreitWheelerEvolveOpticalDepth(const BW_dndt_table_view table_view, const amrex::ParticleReal bw_minimum_chi_phot)
Definition: BreitWheelerEngineWrapper.H:122
amrex::ParticleReal m_bw_minimum_chi_phot
Definition: BreitWheelerEngineWrapper.H:188
BreitWheelerEvolveOpticalDepth()=default
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: BreitWheelerEngineWrapper.H:143
Definition: BreitWheelerEngineWrapper.H:196
BreitWheelerGeneratePairs()=default
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, amrex::ParticleReal &e_ux, amrex::ParticleReal &e_uy, amrex::ParticleReal &e_uz, amrex::ParticleReal &p_ux, amrex::ParticleReal &p_uy, amrex::ParticleReal &p_uz, amrex::RandomEngine const &engine) const noexcept
Definition: BreitWheelerEngineWrapper.H:231
BW_pair_prod_table_view m_table_view
Definition: BreitWheelerEngineWrapper.H:285
BreitWheelerGeneratePairs(const BW_pair_prod_table_view table_view)
Definition: BreitWheelerEngineWrapper.H:212
Definition: BreitWheelerEngineWrapper.H:78
BreitWheelerGetOpticalDepth()=default
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE amrex::ParticleReal operator()(amrex::RandomEngine const &engine) const noexcept
Definition: BreitWheelerEngineWrapper.H:92
AMREX_GPU_DEVICE AMREX_FORCE_INLINE amrex::Real chi_photon(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:31
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
float dt
Definition: stencil.py:442
me
Definition: yt3d_mpi.py:142
Definition: BreitWheelerEngineWrapper.H:62
BW_pair_prod_table_params pair_prod_params
Definition: BreitWheelerEngineWrapper.H:64
BW_dndt_table_params dndt_params
Definition: BreitWheelerEngineWrapper.H:63