WarpX
QEDPairGeneration.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 
8 #ifndef WARPX_QED_PAIR_GENERATION_H_
9 #define WARPX_QED_PAIR_GENERATION_H_
10 
16 
17 #include <AMReX_Array.H>
18 #include <AMReX_Array4.H>
19 #include <AMReX_Dim3.H>
20 #include <AMReX_Extension.H>
21 #include <AMReX_GpuQualifiers.H>
22 #include <AMReX_IndexType.H>
23 #include <AMReX_REAL.H>
24 
25 #include <AMReX_BaseFwd.H>
26 
38 {
39 public:
40 
46  PairGenerationFilterFunc(int const opt_depth_runtime_comp)
47  : m_opt_depth_runtime_comp(opt_depth_runtime_comp)
48  {}
49 
58  template <typename PData>
60  bool operator() (const PData& ptd, int const i, amrex::RandomEngine const&) const noexcept
61  {
62  using namespace amrex;
63 
64  const amrex::ParticleReal opt_depth =
65  ptd.m_runtime_rdata[m_opt_depth_runtime_comp][i];
66  return (opt_depth < 0.0_rt);
67  }
68 
69 private:
71 };
72 
77 {
78 public:
79 
100  const WarpXParIter& a_pti, int lev, amrex::IntVect ngEB,
101  amrex::FArrayBox const& exfab,
102  amrex::FArrayBox const& eyfab,
103  amrex::FArrayBox const& ezfab,
104  amrex::FArrayBox const& bxfab,
105  amrex::FArrayBox const& byfab,
106  amrex::FArrayBox const& bzfab,
107  amrex::Vector<amrex::ParticleReal>& E_external_particle,
108  amrex::Vector<amrex::ParticleReal>& B_external_particle,
109  int a_offset = 0);
110 
123  template <typename DstData, typename SrcData>
125  void operator() (DstData& dst1, DstData& dst2, SrcData& src,
126  int const i_src, int const i_dst1, int const i_dst2,
127  amrex::RandomEngine const& engine) const noexcept
128  {
129  using namespace amrex;
130 
131  // gather E and B
132  amrex::ParticleReal xp, yp, zp;
133  m_get_position(i_src, xp, yp, zp);
134 
135  amrex::ParticleReal ex = m_Ex_external_particle;
136  amrex::ParticleReal ey = m_Ey_external_particle;
137  amrex::ParticleReal ez = m_Ez_external_particle;
138  amrex::ParticleReal bx = m_Bx_external_particle;
139  amrex::ParticleReal by = m_By_external_particle;
140  amrex::ParticleReal bz = m_Bz_external_particle;
141 
142  m_get_externalEB(i_src, ex, ey, ez, bx, by, bz);
143 
144  doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
145  m_ex_arr, m_ey_arr, m_ez_arr, m_bx_arr, m_by_arr, m_bz_arr,
146  m_ex_type, m_ey_type, m_ez_type, m_bx_type, m_by_type, m_bz_type,
147  m_dx_arr, m_xyzmin_arr, m_lo, m_n_rz_azimuthal_modes,
148  m_nox, m_galerkin_interpolation);
149 
150  //Despite the names of the variables, positrons and electrons
151  //can be exchanged, since the physical process is completely
152  //symmetric with respect to this exchange.
153  const auto& ux = src.m_rdata[PIdx::ux][i_src];
154  const auto& uy = src.m_rdata[PIdx::uy][i_src];
155  const auto& uz = src.m_rdata[PIdx::uz][i_src];
156  auto& e_ux = dst1.m_rdata[PIdx::ux][i_dst1];
157  auto& e_uy = dst1.m_rdata[PIdx::uy][i_dst1];
158  auto& e_uz = dst1.m_rdata[PIdx::uz][i_dst1];
159  auto& p_ux = dst2.m_rdata[PIdx::ux][i_dst2];
160  auto& p_uy = dst2.m_rdata[PIdx::uy][i_dst2];
161  auto& p_uz = dst2.m_rdata[PIdx::uz][i_dst2];
162  m_generate_functor(
163  ux, uy, uz,
164  ex, ey, ez,
165  bx, by, bz,
166  e_ux, e_uy, e_uz,
167  p_ux, p_uy, p_uz,
168  engine);
169 
170  src.m_idcpu[i_src] = amrex::ParticleIdCpus::Invalid; // destroy photon after pair generation
171  }
172 
173 private:
174 
180  amrex::ParticleReal m_Ex_external_particle;
181  amrex::ParticleReal m_Ey_external_particle;
182  amrex::ParticleReal m_Ez_external_particle;
183  amrex::ParticleReal m_Bx_external_particle;
184  amrex::ParticleReal m_By_external_particle;
185  amrex::ParticleReal m_Bz_external_particle;
186 
193 
200 
203 
205  int m_nox;
207 
209 };
210 
211 #endif //WARPX_QED_PAIR_GENERATION_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void doGatherShapeN(const amrex::ParticleReal xp, const amrex::ParticleReal yp, const amrex::ParticleReal zp, amrex::ParticleReal &Exp, amrex::ParticleReal &Eyp, amrex::ParticleReal &Ezp, amrex::ParticleReal &Bxp, amrex::ParticleReal &Byp, amrex::ParticleReal &Bzp, amrex::Array4< amrex::Real const > const &ex_arr, amrex::Array4< amrex::Real const > const &ey_arr, amrex::Array4< amrex::Real const > const &ez_arr, amrex::Array4< amrex::Real const > const &bx_arr, amrex::Array4< amrex::Real const > const &by_arr, amrex::Array4< amrex::Real const > const &bz_arr, const amrex::IndexType ex_type, const amrex::IndexType ey_type, const amrex::IndexType ez_type, const amrex::IndexType bx_type, const amrex::IndexType by_type, const amrex::IndexType bz_type, const amrex::GpuArray< amrex::Real, 3 > &dx, const amrex::GpuArray< amrex::Real, 3 > &xyzmin, const amrex::Dim3 &lo, const int n_rz_azimuthal_modes)
Field gather for a single particle.
Definition: FieldGather.H:38
Definition: BreitWheelerEngineWrapper.H:196
Filter functor for the Breit Wheeler process.
Definition: QEDPairGeneration.H:38
int m_opt_depth_runtime_comp
Definition: QEDPairGeneration.H:70
PairGenerationFilterFunc(int const opt_depth_runtime_comp)
Constructor of the PairGenerationFilterFunc functor.
Definition: QEDPairGeneration.H:46
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool operator()(const PData &ptd, int const i, amrex::RandomEngine const &) const noexcept
Functor call. This method determines if a given (photon) particle should undergo pair generation.
Definition: QEDPairGeneration.H:60
Transform functor for the Breit-Wheeler process.
Definition: QEDPairGeneration.H:77
GetExternalEBField m_get_externalEB
Definition: QEDPairGeneration.H:179
amrex::IndexType m_ey_type
Definition: QEDPairGeneration.H:195
GetParticlePosition< PIdx > m_get_position
Definition: QEDPairGeneration.H:178
amrex::Array4< const amrex::Real > m_ex_arr
Definition: QEDPairGeneration.H:187
amrex::Dim3 m_lo
Definition: QEDPairGeneration.H:208
amrex::IndexType m_ex_type
Definition: QEDPairGeneration.H:194
bool m_galerkin_interpolation
Definition: QEDPairGeneration.H:204
amrex::Array4< const amrex::Real > m_ey_arr
Definition: QEDPairGeneration.H:188
amrex::Array4< const amrex::Real > m_by_arr
Definition: QEDPairGeneration.H:191
const BreitWheelerGeneratePairs m_generate_functor
Definition: QEDPairGeneration.H:176
amrex::IndexType m_ez_type
Definition: QEDPairGeneration.H:196
amrex::IndexType m_bz_type
Definition: QEDPairGeneration.H:199
int m_nox
Definition: QEDPairGeneration.H:205
amrex::Array4< const amrex::Real > m_ez_arr
Definition: QEDPairGeneration.H:189
amrex::ParticleReal m_Ez_external_particle
Definition: QEDPairGeneration.H:182
int m_n_rz_azimuthal_modes
Definition: QEDPairGeneration.H:206
amrex::GpuArray< amrex::Real, 3 > m_xyzmin_arr
Definition: QEDPairGeneration.H:202
amrex::ParticleReal m_Ey_external_particle
Definition: QEDPairGeneration.H:181
amrex::ParticleReal m_By_external_particle
Definition: QEDPairGeneration.H:184
amrex::Array4< const amrex::Real > m_bz_arr
Definition: QEDPairGeneration.H:192
amrex::ParticleReal m_Bz_external_particle
Definition: QEDPairGeneration.H:185
amrex::IndexType m_bx_type
Definition: QEDPairGeneration.H:197
amrex::GpuArray< amrex::Real, 3 > m_dx_arr
Definition: QEDPairGeneration.H:201
amrex::ParticleReal m_Ex_external_particle
Definition: QEDPairGeneration.H:180
amrex::ParticleReal m_Bx_external_particle
Definition: QEDPairGeneration.H:183
amrex::IndexType m_by_type
Definition: QEDPairGeneration.H:198
amrex::Array4< const amrex::Real > m_bx_arr
Definition: QEDPairGeneration.H:190
Definition: WarpXParticleContainer.H:53
constexpr std::uint64_t Invalid
i
Definition: check_interp_points_and_weights.py:174
Functor class that assigns external field values (E and B) to particles.
Definition: GetExternalFields.H:25
@ uz
Definition: NamedComponentParticleContainer.H:34
@ uy
Definition: NamedComponentParticleContainer.H:34
@ ux
Definition: NamedComponentParticleContainer.H:34