1 #ifndef WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_
2 #define WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_
58 const
amrex::ParticleReal* AMREX_RESTRICT
m_ux =
nullptr;
59 const
amrex::ParticleReal* AMREX_RESTRICT
m_uy =
nullptr;
60 const
amrex::ParticleReal* AMREX_RESTRICT
m_uz =
nullptr;
64 AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
69 amrex::ParticleReal& field_Ex,
70 amrex::ParticleReal& field_Ey,
71 amrex::ParticleReal& field_Ez,
72 amrex::ParticleReal& field_Bx,
73 amrex::ParticleReal& field_By,
74 amrex::ParticleReal& field_Bz)
const noexcept
76 using namespace amrex::literals;
80 (*d_lattice_element_finder)(
i, field_Ex, field_Ey, field_Ez,
81 field_Bx, field_By, field_Bz);
86 amrex::ParticleReal Ex = 0._prt;
87 amrex::ParticleReal Ey = 0._prt;
88 amrex::ParticleReal Ez = 0._prt;
89 amrex::ParticleReal Bx = 0._prt;
90 amrex::ParticleReal By = 0._prt;
91 amrex::ParticleReal Bz = 0._prt;
101 else if (
m_Etype == ExternalFieldInitType::Parser)
103 amrex::ParticleReal
x,
y,
z;
105 amrex::Real lab_time =
m_time;
110 Ex =
m_Exfield_partparser((amrex::ParticleReal)
x, (amrex::ParticleReal)
y, (amrex::ParticleReal)
z, lab_time);
111 Ey =
m_Eyfield_partparser((amrex::ParticleReal)
x, (amrex::ParticleReal)
y, (amrex::ParticleReal)
z, lab_time);
112 Ez =
m_Ezfield_partparser((amrex::ParticleReal)
x, (amrex::ParticleReal)
y, (amrex::ParticleReal)
z, lab_time);
121 else if (
m_Btype == ExternalFieldInitType::Parser)
123 amrex::ParticleReal
x,
y,
z;
125 amrex::Real lab_time =
m_time;
138 amrex::ParticleReal
x,
y,
z;
141 const amrex::ParticleReal uxp =
m_ux[
i];
142 const amrex::ParticleReal uyp =
m_uy[
i];
143 const amrex::ParticleReal uzp =
m_uz[
i];
145 const amrex::ParticleReal
gamma = std::sqrt(1._prt + (uxp*uxp + uyp*uyp + uzp*uzp)*inv_c2);
146 const amrex::ParticleReal vzp = uzp/
gamma;
148 amrex::ParticleReal zl =
z;
149 amrex::ParticleReal zr =
z + vzp*
m_dt;
167 amrex::ParticleReal
const zl_bounded = std::min(std::max(zl, lens_start), lens_end);
168 amrex::ParticleReal
const zr_bounded = std::min(std::max(zr, lens_start), lens_end);
169 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:52
def y
Definition: Excitation_Flag_Generator.py:76
def x
Formats datastring to remove "+" at the end of the string #####.
Definition: Excitation_Flag_Generator.py:75
def z
Definition: Excitation_Flag_Generator.py:77
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
Definition: stencil.py:446
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:53
const amrex::ParticleReal *AMREX_RESTRICT m_ux
Definition: GetExternalFields.H:58
amrex::ParserExecutor< 4 > m_Bzfield_partparser
Definition: GetExternalFields.H:46
const amrex::ParticleReal *AMREX_RESTRICT m_uy
Definition: GetExternalFields.H:59
amrex::Real m_time
Definition: GetExternalFields.H:49
amrex::GpuArray< amrex::ParticleReal, 3 > m_Efield_value
Definition: GetExternalFields.H:38
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_B
Definition: GetExternalFields.H:55
GetParticlePosition m_get_position
Definition: GetExternalFields.H:48
amrex::Real m_dt
Definition: GetExternalFields.H:57
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:56
ExternalFieldInitType m_Etype
Definition: GetExternalFields.H:32
std::optional< LatticeElementFinderDevice > d_lattice_element_finder
Definition: GetExternalFields.H:62
ExternalFieldInitType
Definition: GetExternalFields.H:26
@ Parser
Definition: GetExternalFields.H:26
@ Unknown
Definition: GetExternalFields.H:26
@ Constant
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:68
ExternalFieldInitType m_Btype
Definition: GetExternalFields.H:33
amrex::ParserExecutor< 4 > m_Exfield_partparser
Definition: GetExternalFields.H:41
amrex::GpuArray< amrex::ParticleReal, 3 > m_Bfield_value
Definition: GetExternalFields.H:39
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool isNoOp() const
Definition: GetExternalFields.H:65
amrex::ParticleReal m_repeated_plasma_lens_period
Definition: GetExternalFields.H:51
amrex::ParserExecutor< 4 > m_Bxfield_partparser
Definition: GetExternalFields.H:44
const amrex::ParticleReal *AMREX_RESTRICT m_uz
Definition: GetExternalFields.H:60
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_E
Definition: GetExternalFields.H:54
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_starts
Definition: GetExternalFields.H:52
amrex::ParserExecutor< 4 > m_Byfield_partparser
Definition: GetExternalFields.H:45
amrex::ParserExecutor< 4 > m_Ezfield_partparser
Definition: GetExternalFields.H:43
amrex::ParserExecutor< 4 > m_Eyfield_partparser
Definition: GetExternalFields.H:42
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition: GetAndSetPosition.H:53
The lattice element finder class that can be trivially copied to the device. This only has simple dat...
Definition: LatticeElementFinder.H:153