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 QED_PAIR_GENERATION_H_
9 #define QED_PAIR_GENERATION_H_
10 
11 #include "Utils/WarpXConst.H"
17 
29 {
30 public:
31 
37  PairGenerationFilterFunc(int const opt_depth_runtime_comp)
38  : m_opt_depth_runtime_comp(opt_depth_runtime_comp)
39  {}
40 
49  template <typename PData>
50  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
51  bool operator() (const PData& ptd, int const i, amrex::RandomEngine const&) const noexcept
52  {
53  using namespace amrex;
54 
55  const amrex::ParticleReal opt_depth =
56  ptd.m_runtime_rdata[m_opt_depth_runtime_comp][i];
57  return (opt_depth < 0.0_rt);
58  }
59 
60 private:
62 };
63 
68 {
69 public:
70 
81  const WarpXParIter& a_pti, int lev, int ngE,
82  amrex::FArrayBox const& exfab,
83  amrex::FArrayBox const& eyfab,
84  amrex::FArrayBox const& ezfab,
85  amrex::FArrayBox const& bxfab,
86  amrex::FArrayBox const& byfab,
87  amrex::FArrayBox const& bzfab,
88  amrex::Array<amrex::Real,3> v_galilean,
89  int a_offset = 0);
90 
102  template <typename DstData, typename SrcData>
103  AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
104  void operator() (DstData& dst1, DstData& dst2, SrcData& src,
105  int const i_src, int const i_dst1, int const i_dst2) const noexcept
106  {
107  using namespace amrex;
108 
109  // gather E and B
110  amrex::ParticleReal xp, yp, zp;
111  m_get_position(i_src, xp, yp, zp);
112 
113  amrex::ParticleReal ex = 0._rt, ey = 0._rt, ez = 0._rt;
114  m_get_externalE(i_src, ex, ey, ez);
115 
116  amrex::ParticleReal bx = 0._rt, by = 0._rt, bz = 0._rt;
117  m_get_externalB(i_src, bx, by, bz);
118 
119  doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
120  m_ex_arr, m_ey_arr, m_ez_arr, m_bx_arr, m_by_arr, m_bz_arr,
121  m_ex_type, m_ey_type, m_ez_type, m_bx_type, m_by_type, m_bz_type,
122  m_dx_arr, m_xyzmin_arr, m_lo, m_n_rz_azimuthal_modes,
123  m_nox, m_galerkin_interpolation);
124 
125  //Despite the names of the variables, positrons and electrons
126  //can be exchanged, since the physical process is completely
127  //symmetric with respect to this exchange.
128  const auto& ux = src.m_rdata[PIdx::ux][i_src];
129  const auto& uy = src.m_rdata[PIdx::uy][i_src];
130  const auto& uz = src.m_rdata[PIdx::uz][i_src];
131  auto& e_ux = dst1.m_rdata[PIdx::ux][i_dst1];
132  auto& e_uy = dst1.m_rdata[PIdx::uy][i_dst1];
133  auto& e_uz = dst1.m_rdata[PIdx::uz][i_dst1];
134  auto& p_ux = dst2.m_rdata[PIdx::ux][i_dst2];
135  auto& p_uy = dst2.m_rdata[PIdx::uy][i_dst2];
136  auto& p_uz = dst2.m_rdata[PIdx::uz][i_dst2];
137  m_generate_functor(
138  ux, uy, uz,
139  ex, ey, ez,
140  bx, by, bz,
141  e_ux, e_uy, e_uz,
142  p_ux, p_uy, p_uz);
143 
144  src.m_aos[i_src].id() = -1; //destroy photon after pair generation
145  }
146 
147 private:
148 
155 
156  amrex::Array4<const amrex::Real> m_ex_arr;
157  amrex::Array4<const amrex::Real> m_ey_arr;
158  amrex::Array4<const amrex::Real> m_ez_arr;
159  amrex::Array4<const amrex::Real> m_bx_arr;
160  amrex::Array4<const amrex::Real> m_by_arr;
161  amrex::Array4<const amrex::Real> m_bz_arr;
162 
163  amrex::IndexType m_ex_type;
164  amrex::IndexType m_ey_type;
165  amrex::IndexType m_ez_type;
166  amrex::IndexType m_bx_type;
167  amrex::IndexType m_by_type;
168  amrex::IndexType m_bz_type;
169 
170  amrex::GpuArray<amrex::Real, 3> m_dx_arr;
171  amrex::GpuArray<amrex::Real, 3> m_xyzmin_arr;
172 
174  int m_nox;
176 
177  amrex::Dim3 m_lo;
178 };
179 
180 #endif //QED_PAIR_GENERATION_H_
Transform functor for the Breit-Wheeler process.
Definition: QEDPairGeneration.H:67
GetExternalBField m_get_externalB
Definition: QEDPairGeneration.H:154
GetExternalEField m_get_externalE
Definition: QEDPairGeneration.H:153
const BreitWheelerGeneratePairs m_generate_functor
Definition: QEDPairGeneration.H:150
amrex::IndexType m_bx_type
Definition: QEDPairGeneration.H:166
GetParticlePosition m_get_position
Definition: QEDPairGeneration.H:152
amrex::IndexType m_by_type
Definition: QEDPairGeneration.H:167
def uz
Definition: read_lab_particles.py:29
Functor that can be used to assign the external B field to a particle inside a ParallelFor kernel...
Definition: GetExternalFields.H:68
amrex::Array4< const amrex::Real > m_ey_arr
Definition: QEDPairGeneration.H:157
amrex::IndexType m_ex_type
Definition: QEDPairGeneration.H:163
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 long n_rz_azimuthal_modes)
Field gather for a single particle.
Definition: FieldGather.H:38
amrex::Array4< const amrex::Real > m_bx_arr
Definition: QEDPairGeneration.H:159
PairGenerationFilterFunc(int const opt_depth_runtime_comp)
Constructor of the PairGenerationFilterFunc functor.
Definition: QEDPairGeneration.H:37
amrex::GpuArray< amrex::Real, 3 > m_dx_arr
Definition: QEDPairGeneration.H:170
i
Definition: check_interp_points_and_weights.py:171
amrex::Dim3 m_lo
Definition: QEDPairGeneration.H:177
Definition: WarpXParticleContainer.H:37
Definition: WarpXParticleContainer.H:37
Filter functor for the Breit Wheeler process.
Definition: QEDPairGeneration.H:28
Definition: WarpXParticleContainer.H:37
amrex::IndexType m_ez_type
Definition: QEDPairGeneration.H:165
bool m_galerkin_interpolation
Definition: QEDPairGeneration.H:173
amrex::Array4< const amrex::Real > m_ex_arr
Definition: QEDPairGeneration.H:156
amrex::GpuArray< amrex::Real, 3 > m_xyzmin_arr
Definition: QEDPairGeneration.H:171
int m_opt_depth_runtime_comp
Definition: QEDPairGeneration.H:61
int m_n_rz_azimuthal_modes
Definition: QEDPairGeneration.H:175
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel...
Definition: GetAndSetPosition.H:25
Definition: BreitWheelerEngineWrapper.H:175
amrex::Array4< const amrex::Real > m_by_arr
Definition: QEDPairGeneration.H:160
amrex::IndexType m_ey_type
Definition: QEDPairGeneration.H:164
int m_nox
Definition: QEDPairGeneration.H:174
def ux
Definition: read_lab_particles.py:28
amrex::IndexType m_bz_type
Definition: QEDPairGeneration.H:168
amrex::Array4< const amrex::Real > m_ez_arr
Definition: QEDPairGeneration.H:158
Definition: WarpXParticleContainer.H:76
Functor that can be used to assign the external E field to a particle inside a ParallelFor kernel...
Definition: GetExternalFields.H:58
Definition: PML.H:52
amrex::Array4< const amrex::Real > m_bz_arr
Definition: QEDPairGeneration.H:161
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:51