1#ifndef WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_
2#define WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_
64 amrex::ParticleReal& field_Ex,
65 amrex::ParticleReal& field_Ey,
66 amrex::ParticleReal& field_Ez,
67 amrex::ParticleReal& field_Bx,
68 amrex::ParticleReal& field_By,
69 amrex::ParticleReal& field_Bz)
const noexcept
71 using namespace amrex::literals;
75 field_Bx, field_By, field_Bz);
80 amrex::ParticleReal Ex = 0._prt;
81 amrex::ParticleReal Ey = 0._prt;
82 amrex::ParticleReal Ez = 0._prt;
83 amrex::ParticleReal Bx = 0._prt;
84 amrex::ParticleReal By = 0._prt;
85 amrex::ParticleReal Bz = 0._prt;
91 amrex::ParticleReal x, y, z;
93 amrex::Real lab_time =
m_time;
98 Ex =
m_Exfield_partparser((amrex::ParticleReal) x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
99 Ey =
m_Eyfield_partparser((amrex::ParticleReal) x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
100 Ez =
m_Ezfield_partparser((amrex::ParticleReal) x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
105 amrex::ParticleReal x, y, z;
107 amrex::Real lab_time =
m_time;
112 Bx =
m_Bxfield_partparser((amrex::ParticleReal) x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
113 By =
m_Byfield_partparser((amrex::ParticleReal) x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
114 Bz =
m_Bzfield_partparser((amrex::ParticleReal) x, (amrex::ParticleReal) y, (amrex::ParticleReal) z, lab_time);
120 amrex::ParticleReal x, y, z;
123 const amrex::ParticleReal uxp =
m_ux[i];
124 const amrex::ParticleReal uyp =
m_uy[i];
125 const amrex::ParticleReal uzp =
m_uz[i];
127 const amrex::ParticleReal gamma = std::sqrt(1._prt + (uxp*uxp + uyp*uyp + uzp*uzp)*inv_c2);
128 const amrex::ParticleReal vzp = uzp/gamma;
131 amrex::ParticleReal zl = z;
132 amrex::ParticleReal zr = z + vzp*
m_dt;
152 amrex::ParticleReal
const zl_bounded = std::min(std::max(zl, lens_start), lens_end);
153 amrex::ParticleReal
const zr_bounded = std::min(std::max(zr, lens_start), lens_end);
154 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:112
constexpr auto c
vacuum speed of light [m/s]
Definition constant.H:149
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_lengths
Definition GetExternalFields.H:48
const amrex::ParticleReal *AMREX_RESTRICT m_ux
Definition GetExternalFields.H:53
amrex::ParserExecutor< 4 > m_Bzfield_partparser
Definition GetExternalFields.H:41
const amrex::ParticleReal *AMREX_RESTRICT m_uy
Definition GetExternalFields.H:54
amrex::Real m_time
Definition GetExternalFields.H:44
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_B
Definition GetExternalFields.H:50
amrex::Real m_dt
Definition GetExternalFields.H:52
GetExternalEBField()=default
amrex::ParticleReal m_uz_boost
Definition GetExternalFields.H:34
LatticeElementFinderDevice d_lattice_element_finder
Definition GetExternalFields.H:57
amrex::ParticleReal m_gamma_boost
Definition GetExternalFields.H:33
int m_n_lenses
Definition GetExternalFields.H:51
ExternalFieldInitType m_Etype
Definition GetExternalFields.H:30
GetParticlePosition< PIdx > m_get_position
Definition GetExternalFields.H:43
ExternalFieldInitType
Definition GetExternalFields.H:24
@ Parser
Definition GetExternalFields.H:24
@ Unknown
Definition GetExternalFields.H:24
@ None
Definition GetExternalFields.H:24
@ RepeatedPlasmaLens
Definition GetExternalFields.H:24
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:63
ExternalFieldInitType m_Btype
Definition GetExternalFields.H:31
amrex::ParserExecutor< 4 > m_Exfield_partparser
Definition GetExternalFields.H:36
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool isNoOp() const
Definition GetExternalFields.H:60
amrex::ParticleReal m_repeated_plasma_lens_period
Definition GetExternalFields.H:46
amrex::ParserExecutor< 4 > m_Bxfield_partparser
Definition GetExternalFields.H:39
const amrex::ParticleReal *AMREX_RESTRICT m_uz
Definition GetExternalFields.H:55
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_E
Definition GetExternalFields.H:49
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_starts
Definition GetExternalFields.H:47
amrex::ParserExecutor< 4 > m_Byfield_partparser
Definition GetExternalFields.H:40
amrex::ParserExecutor< 4 > m_Ezfield_partparser
Definition GetExternalFields.H:38
amrex::ParserExecutor< 4 > m_Eyfield_partparser
Definition GetExternalFields.H:37
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
The lattice element finder class that can be trivially copied to the device. This only has simple dat...
Definition LatticeElementFinder.H:108
Definition WarpXParticleContainer.H:65