WarpX
Loading...
Searching...
No Matches
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
33
38{
39public:
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
69private:
71};
72
77{
78public:
79
102 const WarpXParIter& a_pti, int lev, amrex::IntVect ngEB,
103 amrex::FArrayBox const& exfab,
104 amrex::FArrayBox const& eyfab,
105 amrex::FArrayBox const& ezfab,
106 amrex::FArrayBox const& bxfab,
107 amrex::FArrayBox const& byfab,
108 amrex::FArrayBox const& bzfab,
109 amrex::Vector<amrex::ParticleReal>& E_external_particle,
110 amrex::Vector<amrex::ParticleReal>& B_external_particle,
111 int a_offset = 0);
112
125 template <typename DstData, typename SrcData>
127 void operator() (DstData& dst1, DstData& dst2, SrcData& src,
128 int const i_src, int const i_dst1, int const i_dst2,
129 amrex::RandomEngine const& engine) const noexcept
130 {
131 using namespace amrex;
132
133 // gather E and B
134 amrex::ParticleReal xp, yp, zp;
135 m_get_position(i_src, xp, yp, zp);
136
137 amrex::ParticleReal ex = m_Ex_external_particle;
138 amrex::ParticleReal ey = m_Ey_external_particle;
139 amrex::ParticleReal ez = m_Ez_external_particle;
140 amrex::ParticleReal bx = m_Bx_external_particle;
141 amrex::ParticleReal by = m_By_external_particle;
142 amrex::ParticleReal bz = m_Bz_external_particle;
143
144 m_get_externalEB(i_src, ex, ey, ez, bx, by, bz);
145
146 doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
151
152 //Despite the names of the variables, positrons and electrons
153 //can be exchanged, since the physical process is completely
154 //symmetric with respect to this exchange.
155 const auto& ux = src.m_rdata[PIdx::ux][i_src];
156 const auto& uy = src.m_rdata[PIdx::uy][i_src];
157 const auto& uz = src.m_rdata[PIdx::uz][i_src];
158 auto& e_ux = dst1.m_rdata[PIdx::ux][i_dst1];
159 auto& e_uy = dst1.m_rdata[PIdx::uy][i_dst1];
160 auto& e_uz = dst1.m_rdata[PIdx::uz][i_dst1];
161 auto& p_ux = dst2.m_rdata[PIdx::ux][i_dst2];
162 auto& p_uy = dst2.m_rdata[PIdx::uy][i_dst2];
163 auto& p_uz = dst2.m_rdata[PIdx::uz][i_dst2];
165 ux, uy, uz,
166 ex, ey, ez,
167 bx, by, bz,
168 e_ux, e_uy, e_uz,
169 p_ux, p_uy, p_uz,
170 engine);
171
172 src.m_idcpu[i_src] = amrex::ParticleIdCpus::Invalid; // destroy photon after pair generation
173 }
174
175private:
176
179
182 amrex::ParticleReal m_Ex_external_particle;
183 amrex::ParticleReal m_Ey_external_particle;
184 amrex::ParticleReal m_Ez_external_particle;
185 amrex::ParticleReal m_Bx_external_particle;
186 amrex::ParticleReal m_By_external_particle;
187 amrex::ParticleReal m_Bz_external_particle;
188
195
202
205
207 int m_nox;
209
211};
212
213#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::XDim3 &dinv, const amrex::XDim3 &xyzmin, const amrex::Dim3 &lo, const int n_rz_azimuthal_modes)
Field gather for a single particle.
Definition FieldGather.H:349
Definition BreitWheelerEngineWrapper.H:196
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
GetExternalEBField m_get_externalEB
Definition QEDPairGeneration.H:181
amrex::IndexType m_ey_type
Definition QEDPairGeneration.H:197
GetParticlePosition< PIdx > m_get_position
Definition QEDPairGeneration.H:180
amrex::Array4< const amrex::Real > m_ex_arr
Definition QEDPairGeneration.H:189
amrex::Dim3 m_lo
Definition QEDPairGeneration.H:210
PairGenerationTransformFunc(BreitWheelerGeneratePairs generate_functor, const WarpXParIter &a_pti, int lev, amrex::IntVect ngEB, amrex::FArrayBox const &exfab, amrex::FArrayBox const &eyfab, amrex::FArrayBox const &ezfab, amrex::FArrayBox const &bxfab, amrex::FArrayBox const &byfab, amrex::FArrayBox const &bzfab, amrex::Vector< amrex::ParticleReal > &E_external_particle, amrex::Vector< amrex::ParticleReal > &B_external_particle, int a_offset=0)
Constructor of the PairGenerationTransformFunc functor.
Definition QEDPairGeneration.cpp:21
amrex::IndexType m_ex_type
Definition QEDPairGeneration.H:196
bool m_galerkin_interpolation
Definition QEDPairGeneration.H:206
amrex::Array4< const amrex::Real > m_ey_arr
Definition QEDPairGeneration.H:190
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(DstData &dst1, DstData &dst2, SrcData &src, int const i_src, int const i_dst1, int const i_dst2, amrex::RandomEngine const &engine) const noexcept
Functor call. It determines the properties of the generated pair and it sets to -1 the id of the sour...
Definition QEDPairGeneration.H:127
amrex::Array4< const amrex::Real > m_by_arr
Definition QEDPairGeneration.H:193
amrex::XDim3 m_xyzmin
Definition QEDPairGeneration.H:204
amrex::XDim3 m_dinv
Definition QEDPairGeneration.H:203
BreitWheelerGeneratePairs m_generate_functor
Definition QEDPairGeneration.H:178
amrex::IndexType m_ez_type
Definition QEDPairGeneration.H:198
amrex::IndexType m_bz_type
Definition QEDPairGeneration.H:201
int m_nox
Definition QEDPairGeneration.H:207
amrex::Array4< const amrex::Real > m_ez_arr
Definition QEDPairGeneration.H:191
amrex::ParticleReal m_Ez_external_particle
Definition QEDPairGeneration.H:184
int m_n_rz_azimuthal_modes
Definition QEDPairGeneration.H:208
amrex::ParticleReal m_Ey_external_particle
Definition QEDPairGeneration.H:183
amrex::ParticleReal m_By_external_particle
Definition QEDPairGeneration.H:186
amrex::Array4< const amrex::Real > m_bz_arr
Definition QEDPairGeneration.H:194
amrex::ParticleReal m_Bz_external_particle
Definition QEDPairGeneration.H:187
amrex::IndexType m_bx_type
Definition QEDPairGeneration.H:199
amrex::ParticleReal m_Ex_external_particle
Definition QEDPairGeneration.H:182
amrex::ParticleReal m_Bx_external_particle
Definition QEDPairGeneration.H:185
amrex::IndexType m_by_type
Definition QEDPairGeneration.H:200
amrex::Array4< const amrex::Real > m_bx_arr
Definition QEDPairGeneration.H:192
Definition WarpXParticleContainer.H:117
constexpr std::uint64_t Invalid
IndexTypeND< 3 > IndexType
IntVectND< 3 > IntVect
Functor class that assigns external field values (E and B) to particles.
Definition GetExternalFields.H:23
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
@ uz
Definition WarpXParticleContainer.H:70
@ uy
Definition WarpXParticleContainer.H:70
@ ux
Definition WarpXParticleContainer.H:70