1 #ifndef WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_
2 #define WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_
55 const
amrex::ParticleReal* AMREX_RESTRICT
m_ux =
nullptr;
56 const
amrex::ParticleReal* AMREX_RESTRICT
m_uy =
nullptr;
57 const
amrex::ParticleReal* AMREX_RESTRICT
m_uz =
nullptr;
61 [[nodiscard]] AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
66 amrex::ParticleReal& field_Ex,
67 amrex::ParticleReal& field_Ey,
68 amrex::ParticleReal& field_Ez,
69 amrex::ParticleReal& field_Bx,
70 amrex::ParticleReal& field_By,
71 amrex::ParticleReal& field_Bz)
const noexcept
73 using namespace amrex::literals;
77 (*d_lattice_element_finder)(
i, field_Ex, field_Ey, field_Ez,
78 field_Bx, field_By, field_Bz);
83 amrex::ParticleReal Ex = 0._prt;
84 amrex::ParticleReal Ey = 0._prt;
85 amrex::ParticleReal Ez = 0._prt;
86 amrex::ParticleReal Bx = 0._prt;
87 amrex::ParticleReal By = 0._prt;
88 amrex::ParticleReal Bz = 0._prt;
92 if (
m_Etype == ExternalFieldInitType::Parser)
94 amrex::ParticleReal
x, y, z;
96 amrex::Real lab_time =
m_time;
101 Ex =
m_Exfield_partparser((amrex::ParticleReal)
x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
102 Ey =
m_Eyfield_partparser((amrex::ParticleReal)
x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
103 Ez =
m_Ezfield_partparser((amrex::ParticleReal)
x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
106 if (
m_Btype == ExternalFieldInitType::Parser)
108 amrex::ParticleReal
x, y, z;
110 amrex::Real lab_time =
m_time;
123 amrex::ParticleReal
x, y, z;
126 const amrex::ParticleReal uxp =
m_ux[
i];
127 const amrex::ParticleReal uyp =
m_uy[
i];
128 const amrex::ParticleReal uzp =
m_uz[
i];
130 const amrex::ParticleReal
gamma = std::sqrt(1._prt + (uxp*uxp + uyp*uyp + uzp*uzp)*inv_c2);
131 const amrex::ParticleReal vzp = uzp/
gamma;
134 amrex::ParticleReal zl = z;
135 amrex::ParticleReal zr = z + vzp*
m_dt;
155 amrex::ParticleReal
const zl_bounded = std::min(std::max(zl, lens_start), lens_end);
156 amrex::ParticleReal
const zr_bounded = std::min(std::max(zr, lens_start), lens_end);
157 amrex::ParticleReal
const frac = ((zr - zl) == 0._rt ? 1._rt : (zr_bounded - zl_bounded)/(zr - zl));
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
Definition: WarpXParticleContainer.H:53
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
i
Definition: check_interp_points_and_weights.py:174
int gamma
boosted frame
Definition: stencil.py:431
Functor class that assigns external field values (E and B) to particles.
Definition: GetExternalFields.H:25
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_lengths
Definition: GetExternalFields.H:50
const amrex::ParticleReal *AMREX_RESTRICT m_ux
Definition: GetExternalFields.H:55
amrex::ParserExecutor< 4 > m_Bzfield_partparser
Definition: GetExternalFields.H:43
const amrex::ParticleReal *AMREX_RESTRICT m_uy
Definition: GetExternalFields.H:56
amrex::Real m_time
Definition: GetExternalFields.H:46
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_B
Definition: GetExternalFields.H:52
amrex::Real m_dt
Definition: GetExternalFields.H:54
GetExternalEBField()=default
amrex::ParticleReal m_uz_boost
Definition: GetExternalFields.H:36
amrex::ParticleReal m_gamma_boost
Definition: GetExternalFields.H:35
int m_n_lenses
Definition: GetExternalFields.H:53
ExternalFieldInitType m_Etype
Definition: GetExternalFields.H:32
std::optional< LatticeElementFinderDevice > d_lattice_element_finder
Definition: GetExternalFields.H:59
GetParticlePosition< PIdx > m_get_position
Definition: GetExternalFields.H:45
ExternalFieldInitType
Definition: GetExternalFields.H:26
@ Parser
Definition: GetExternalFields.H:26
@ Unknown
Definition: GetExternalFields.H:26
@ None
Definition: GetExternalFields.H:26
@ RepeatedPlasmaLens
Definition: GetExternalFields.H:26
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(long i, amrex::ParticleReal &field_Ex, amrex::ParticleReal &field_Ey, amrex::ParticleReal &field_Ez, amrex::ParticleReal &field_Bx, amrex::ParticleReal &field_By, amrex::ParticleReal &field_Bz) const noexcept
Definition: GetExternalFields.H:65
ExternalFieldInitType m_Btype
Definition: GetExternalFields.H:33
amrex::ParserExecutor< 4 > m_Exfield_partparser
Definition: GetExternalFields.H:38
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool isNoOp() const
Definition: GetExternalFields.H:62
amrex::ParticleReal m_repeated_plasma_lens_period
Definition: GetExternalFields.H:48
amrex::ParserExecutor< 4 > m_Bxfield_partparser
Definition: GetExternalFields.H:41
const amrex::ParticleReal *AMREX_RESTRICT m_uz
Definition: GetExternalFields.H:57
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_E
Definition: GetExternalFields.H:51
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_starts
Definition: GetExternalFields.H:49
amrex::ParserExecutor< 4 > m_Byfield_partparser
Definition: GetExternalFields.H:42
amrex::ParserExecutor< 4 > m_Ezfield_partparser
Definition: GetExternalFields.H:40
amrex::ParserExecutor< 4 > m_Eyfield_partparser
Definition: GetExternalFields.H:39
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition: GetAndSetPosition.H:63
The lattice element finder class that can be trivially copied to the device. This only has simple dat...
Definition: LatticeElementFinder.H:100
Definition: NamedComponentParticleContainer.H:24