1 #ifndef WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_ 2 #define WARPX_PARTICLES_GATHER_GETEXTERNALFIELDS_H_ 65 bool isNoOp ()
const {
return (m_Etype ==
None && m_Btype ==
None && !d_lattice_element_finder.has_value()); }
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
78 if (d_lattice_element_finder) {
80 (*d_lattice_element_finder)(
i, field_Ex, field_Ey, field_Ez,
81 field_Bx, field_By, field_Bz);
84 if (m_Etype ==
None && m_Btype ==
None)
return;
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;
97 Ex = m_Efield_value[0];
98 Ey = m_Efield_value[1];
99 Ez = m_Efield_value[2];
101 else if (m_Etype == ExternalFieldInitType::Parser)
103 amrex::ParticleReal x, y, z;
105 amrex::Real lab_time =
m_time;
106 if (m_gamma_boost > 1._prt) {
107 lab_time = m_gamma_boost*m_time + m_uz_boost*z*inv_c2;
108 z = m_gamma_boost*z + m_uz_boost*
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);
117 Bx = m_Bfield_value[0];
118 By = m_Bfield_value[1];
119 Bz = m_Bfield_value[2];
121 else if (m_Btype == ExternalFieldInitType::Parser)
123 amrex::ParticleReal x, y, z;
125 amrex::Real lab_time =
m_time;
126 if (m_gamma_boost > 1._prt) {
127 lab_time = m_gamma_boost*m_time + m_uz_boost*z*inv_c2;
128 z = m_gamma_boost*z + m_uz_boost*
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;
151 if (m_gamma_boost > 1._prt) {
152 zl = m_gamma_boost*zl + m_uz_boost*
m_time;
153 zr = m_gamma_boost*zr + m_uz_boost*(m_time +
m_dt);
157 int i_lens =
static_cast<int>(std::floor(zl/m_repeated_plasma_lens_period));
160 amrex::ParticleReal
const lens_end = lens_start + m_repeated_plasma_lens_lengths[i_lens];
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));
173 Ex += x*frac*m_repeated_plasma_lens_strengths_E[i_lens];
174 Ey += y*frac*m_repeated_plasma_lens_strengths_E[i_lens];
175 Bx += +y*frac*m_repeated_plasma_lens_strengths_B[i_lens];
176 By += -x*frac*m_repeated_plasma_lens_strengths_B[i_lens];
180 if (m_gamma_boost > 1._prt) {
182 const amrex::ParticleReal Ex_boost = m_gamma_boost*Ex - m_uz_boost*By;
183 const amrex::ParticleReal Ey_boost = m_gamma_boost*Ey + m_uz_boost*Bx;
184 const amrex::ParticleReal Bx_boost = m_gamma_boost*Bx + m_uz_boost*Ey*inv_c2;
185 const amrex::ParticleReal By_boost = m_gamma_boost*By - m_uz_boost*Ex*inv_c2;
const amrex::ParticleReal *AMREX_RESTRICT m_uy
Definition: GetExternalFields.H:59
Definition: GetExternalFields.H:26
amrex::Real m_time
Definition: GetExternalFields.H:49
ExternalFieldInitType m_Btype
Definition: GetExternalFields.H:33
Definition: GetExternalFields.H:26
int gamma
Definition: Stencil.py:474
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
amrex::ParticleReal m_repeated_plasma_lens_period
Definition: GetExternalFields.H:51
GetExternalEBField()=default
amrex::ParserExecutor< 4 > m_Byfield_partparser
Definition: GetExternalFields.H:45
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_lengths
Definition: GetExternalFields.H:53
amrex::ParserExecutor< 4 > m_Bzfield_partparser
Definition: GetExternalFields.H:46
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
amrex::ParserExecutor< 4 > m_Bxfield_partparser
Definition: GetExternalFields.H:44
amrex::GpuArray< amrex::ParticleReal, 3 > m_Efield_value
Definition: GetExternalFields.H:38
amrex::ParserExecutor< 4 > m_Ezfield_partparser
Definition: GetExternalFields.H:43
amrex::ParserExecutor< 4 > m_Exfield_partparser
Definition: GetExternalFields.H:41
amrex::GpuArray< amrex::ParticleReal, 3 > m_Bfield_value
Definition: GetExternalFields.H:39
std::optional< LatticeElementFinderDevice > d_lattice_element_finder
Definition: GetExternalFields.H:62
ExternalFieldInitType
Definition: GetExternalFields.H:26
Definition: GetExternalFields.H:26
int m_n_lenses
Definition: GetExternalFields.H:56
#define AMREX_FORCE_INLINE
amrex::ParserExecutor< 4 > m_Eyfield_partparser
Definition: GetExternalFields.H:42
Functor class that assigns external field values (E and B) to particles.
Definition: GetExternalFields.H:24
#define AMREX_GPU_HOST_DEVICE
i
Definition: check_interp_points_and_weights.py:174
const amrex::ParticleReal *AMREX_RESTRICT m_ux
Definition: GetExternalFields.H:58
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_starts
Definition: GetExternalFields.H:52
GetParticlePosition m_get_position
Definition: GetExternalFields.H:48
ExternalFieldInitType m_Etype
Definition: GetExternalFields.H:32
amrex::ParticleReal m_gamma_boost
Definition: GetExternalFields.H:35
amrex::Real m_dt
Definition: GetExternalFields.H:57
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE bool isNoOp() const
Definition: GetExternalFields.H:65
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
amrex::ParticleReal m_uz_boost
Definition: GetExternalFields.H:36
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel...
Definition: GetAndSetPosition.H:52
Definition: WarpXParticleContainer.H:49
Definition: GetExternalFields.H:26
Definition: GetExternalFields.H:26
const amrex::ParticleReal *AMREX_RESTRICT m_repeated_plasma_lens_strengths_B
Definition: GetExternalFields.H:55