WarpX
Loading...
Searching...
No Matches
QEDPhotonEmission.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_PHOTON_EMISSION_H_
9#define WARPX_QED_PHOTON_EMISSION_H_
10
16#include "Utils/WarpXConst.H"
17
18#include <AMReX_Array.H>
19#include <AMReX_Array4.H>
20#include <AMReX_Dim3.H>
21#include <AMReX_Extension.H>
22#include <AMReX_GpuLaunch.H>
23#include <AMReX_GpuQualifiers.H>
24#include <AMReX_IndexType.H>
25#include <AMReX_ParticleTile.H>
26#include <AMReX_REAL.H>
27
28#include <AMReX_BaseFwd.H>
29
30#include <algorithm>
31#include <limits>
32
39
44{
45public:
46
52 PhotonEmissionFilterFunc(int const opt_depth_runtime_comp)
53 : m_opt_depth_runtime_comp(opt_depth_runtime_comp)
54 {}
55
64 template <typename PData>
66 bool operator() (const PData& ptd, int const i, amrex::RandomEngine const&) const noexcept
67 {
68 using namespace amrex;
69
70 const amrex::ParticleReal opt_depth =
71 ptd.m_runtime_rdata[m_opt_depth_runtime_comp][i];
72 return (opt_depth < 0.0_rt);
73 }
74
75private:
77};
78
83{
84
85public:
86
114 QuantumSynchrotronGetOpticalDepth opt_depth_functor,
115 int opt_depth_runtime_comp,
116 QuantumSynchrotronPhotonEmission emission_functor,
117 const WarpXParIter& a_pti, int lev, amrex::IntVect ngEB,
118 amrex::FArrayBox const& exfab,
119 amrex::FArrayBox const& eyfab,
120 amrex::FArrayBox const& ezfab,
121 amrex::FArrayBox const& bxfab,
122 amrex::FArrayBox const& byfab,
123 amrex::FArrayBox const& bzfab,
124 amrex::Vector<amrex::ParticleReal>& E_external_particle,
125 amrex::Vector<amrex::ParticleReal>& B_external_particle,
126 int a_offset = 0);
127
138 template <typename DstData, typename SrcData>
140 void operator() (DstData& dst, SrcData& src, int i_src, int i_dst,
141 amrex::RandomEngine const& engine) const noexcept
142 {
143 using namespace amrex;
144
145 // gather E and B
146 amrex::ParticleReal xp, yp, zp;
147 m_get_position(i_src, xp, yp, zp);
148
149 amrex::ParticleReal ex = m_Ex_external_particle;
150 amrex::ParticleReal ey = m_Ey_external_particle;
151 amrex::ParticleReal ez = m_Ez_external_particle;
152 amrex::ParticleReal bx = m_Bx_external_particle;
153 amrex::ParticleReal by = m_By_external_particle;
154 amrex::ParticleReal bz = m_Bz_external_particle;
155
156 m_get_externalEB(i_src, ex, ey, ez, bx, by, bz);
157
158 doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
163
164 auto& ux = src.m_rdata[PIdx::ux][i_src];
165 auto& uy = src.m_rdata[PIdx::uy][i_src];
166 auto& uz = src.m_rdata[PIdx::uz][i_src];
167 auto& g_ux = dst.m_rdata[PIdx::ux][i_dst];
168 auto& g_uy = dst.m_rdata[PIdx::uy][i_dst];
169 auto& g_uz = dst.m_rdata[PIdx::uz][i_dst];
171 ux, uy, uz,
172 ex, ey, ez,
173 bx, by, bz,
174 g_ux, g_uy, g_uz,
175 engine);
176
177 //Initialize the optical depth component of the source species.
178 src.m_runtime_rdata[m_opt_depth_runtime_comp][i_src] =
179 m_opt_depth_functor(engine);
180 }
181
182private:
185
187
190
193 amrex::ParticleReal m_Ex_external_particle;
194 amrex::ParticleReal m_Ey_external_particle;
195 amrex::ParticleReal m_Ez_external_particle;
196 amrex::ParticleReal m_Bx_external_particle;
197 amrex::ParticleReal m_By_external_particle;
198 amrex::ParticleReal m_Bz_external_particle;
199
206
213
216
218 int m_nox;
220
222};
223
224
237template <typename PTile>
239 PTile& ptile,
240 const int old_size, const int num_added,
241 const amrex::ParticleReal energy_threshold)
242{
243 auto& soa = ptile.GetStructOfArrays();
244 auto p_idcpu = soa.GetIdCPUData().data() + old_size;
245 const auto p_ux = soa.GetRealData(PIdx::ux).data() + old_size;
246 const auto p_uy = soa.GetRealData(PIdx::uy).data() + old_size;
247 const auto p_uz = soa.GetRealData(PIdx::uz).data() + old_size;
248
249 //The square of the energy threshold
250 const auto energy_threshold2 = std::max(
251 energy_threshold*energy_threshold,
252 std::numeric_limits<amrex::ParticleReal>::min());
253
254 amrex::ParallelFor(num_added, [=] AMREX_GPU_DEVICE (int ip) noexcept
255 {
256 const auto ux = p_ux[ip];
257 const auto uy = p_uy[ip];
258 const auto uz = p_uz[ip];
259
260 //The square of the photon energy (in SI units)
261 // ( Particle momentum is stored as gamma * velocity.)
262 constexpr amrex::ParticleReal me_c = PhysConst::m_e*PhysConst::c;
263 const auto phot_energy2 = (ux*ux + uy*uy + uz*uz)*me_c*me_c;
264
265 if (phot_energy2 < energy_threshold2) {
266 p_idcpu[ip] = amrex::ParticleIdCpus::Invalid;
267 }
268 });
269}
270
271
272#endif //WARPX_QED_PHOTON_EMISSION_H_
#define AMREX_FORCE_INLINE
#define AMREX_GPU_DEVICE
#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
void cleanLowEnergyPhotons(PTile &ptile, const int old_size, const int num_added, const amrex::ParticleReal energy_threshold)
Free function to call to remove immediately low energy photons by setting their ID to -1....
Definition QEDPhotonEmission.H:238
int m_opt_depth_runtime_comp
Definition QEDPhotonEmission.H:76
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 (electron or positron) particle should undergo QED ph...
Definition QEDPhotonEmission.H:66
PhotonEmissionFilterFunc(int const opt_depth_runtime_comp)
Constructor of the PhotonEmissionFilterFunc functor.
Definition QEDPhotonEmission.H:52
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(DstData &dst, SrcData &src, int i_src, int i_dst, amrex::RandomEngine const &engine) const noexcept
Functor call. It determines the properties of the generated photon and updates the momentum of the so...
Definition QEDPhotonEmission.H:140
GetParticlePosition< PIdx > m_get_position
Definition QEDPhotonEmission.H:191
amrex::ParticleReal m_Ey_external_particle
Definition QEDPhotonEmission.H:194
amrex::Array4< const amrex::Real > m_ey_arr
Definition QEDPhotonEmission.H:201
amrex::ParticleReal m_By_external_particle
Definition QEDPhotonEmission.H:197
int m_opt_depth_runtime_comp
Definition QEDPhotonEmission.H:186
bool m_galerkin_interpolation
Definition QEDPhotonEmission.H:217
amrex::IndexType m_bz_type
Definition QEDPhotonEmission.H:212
int m_nox
Definition QEDPhotonEmission.H:218
amrex::ParticleReal m_Ez_external_particle
Definition QEDPhotonEmission.H:195
amrex::IndexType m_by_type
Definition QEDPhotonEmission.H:211
amrex::Array4< const amrex::Real > m_ex_arr
Definition QEDPhotonEmission.H:200
PhotonEmissionTransformFunc(QuantumSynchrotronGetOpticalDepth opt_depth_functor, int opt_depth_runtime_comp, QuantumSynchrotronPhotonEmission emission_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 PhotonEmissionTransformFunc functor.
Definition QEDPhotonEmission.cpp:20
amrex::XDim3 m_dinv
Definition QEDPhotonEmission.H:214
amrex::IndexType m_ex_type
Definition QEDPhotonEmission.H:207
amrex::IndexType m_bx_type
Definition QEDPhotonEmission.H:210
amrex::IndexType m_ey_type
Definition QEDPhotonEmission.H:208
QuantumSynchrotronGetOpticalDepth m_opt_depth_functor
Definition QEDPhotonEmission.H:184
amrex::IndexType m_ez_type
Definition QEDPhotonEmission.H:209
amrex::Array4< const amrex::Real > m_bx_arr
Definition QEDPhotonEmission.H:203
int m_n_rz_azimuthal_modes
Definition QEDPhotonEmission.H:219
QuantumSynchrotronPhotonEmission m_emission_functor
Definition QEDPhotonEmission.H:189
amrex::Array4< const amrex::Real > m_ez_arr
Definition QEDPhotonEmission.H:202
amrex::ParticleReal m_Bz_external_particle
Definition QEDPhotonEmission.H:198
amrex::ParticleReal m_Ex_external_particle
Definition QEDPhotonEmission.H:193
amrex::Array4< const amrex::Real > m_by_arr
Definition QEDPhotonEmission.H:204
amrex::XDim3 m_xyzmin
Definition QEDPhotonEmission.H:215
GetExternalEBField m_get_externalEB
Definition QEDPhotonEmission.H:192
amrex::ParticleReal m_Bx_external_particle
Definition QEDPhotonEmission.H:196
amrex::Dim3 m_lo
Definition QEDPhotonEmission.H:221
amrex::Array4< const amrex::Real > m_bz_arr
Definition QEDPhotonEmission.H:205
Definition QuantumSyncEngineWrapper.H:76
Definition QuantumSyncEngineWrapper.H:179
Definition WarpXParticleContainer.H:117
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:54
constexpr std::uint64_t Invalid
std::enable_if_t< std::is_integral_v< T > > ParallelFor(TypeList< CTOs... > ctos, std::array< int, sizeof...(CTOs)> const &runtime_options, T N, F &&f)
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