7#ifndef WARPX_ACCELERATORLATTICE_LATTICEELEMENTS_LATTICEELEMENTFINDER_H_
8#define WARPX_ACCELERATORLATTICE_LATTICEELEMENTS_LATTICEELEMENTFINDER_H_
159 amrex::ParticleReal& field_Ex,
160 amrex::ParticleReal& field_Ey,
161 amrex::ParticleReal& field_Ez,
162 amrex::ParticleReal& field_Bx,
163 amrex::ParticleReal& field_By,
164 amrex::ParticleReal& field_Bz)
const noexcept
167 using namespace amrex::literals;
169 amrex::ParticleReal x, y, z;
174 const int iz =
static_cast<int>((z -
m_zmin)/
m_dz);
178 amrex::ParticleReal
const vzp =
m_uz[i]/gamma;
180 amrex::ParticleReal zpvdt = z + vzp*
m_dt;
188 amrex::ParticleReal Ex_sum = 0._prt;
189 amrex::ParticleReal Ey_sum = 0._prt;
190 const amrex::ParticleReal Ez_sum = 0._prt;
191 amrex::ParticleReal Bx_sum = 0._prt;
192 amrex::ParticleReal By_sum = 0._prt;
193 const amrex::ParticleReal Bz_sum = 0._prt;
195 if (
d_quad.nelements > 0) {
198 amrex::ParticleReal Ex, Ey, Bx, By;
199 d_quad.get_field(ielement, x, y, z, zpvdt, Ex, Ey, Bx, By);
210 amrex::ParticleReal Ex, Ey, Bx, By;
211 d_plasmalens.get_field(ielement, x, y, z, zpvdt, Ex, Ey, Bx, By);
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
Definition AcceleratorLattice.H:21
Definition WarpXParticleContainer.H:117
static constexpr auto c
vacuum speed of light [m/s]
Definition constant.H:44
PODVector< T, ArenaAllocator< T > > DeviceVector
Functor that can be used to extract the positions of the macroparticles inside a ParallelFor kernel.
Definition GetAndSetPosition.H:75
Definition HardEdgedPlasmaLens.H:64
Definition HardEdgedQuadrupole.H:64
The lattice element finder class that can be trivially copied to the device. This only has simple dat...
Definition LatticeElementFinder.H:108
const amrex::ParticleReal *AMREX_RESTRICT m_ux
Definition LatticeElementFinder.H:139
const amrex::ParticleReal *AMREX_RESTRICT m_uy
Definition LatticeElementFinder.H:140
int const * d_plasmalens_indices_arr
Definition LatticeElementFinder.H:149
amrex::Real m_time
Definition LatticeElementFinder.H:136
HardEdgedPlasmaLensDevice d_plasmalens
Definition LatticeElementFinder.H:145
amrex::Real m_dt
Definition LatticeElementFinder.H:131
bool m_initialized
Definition LatticeElementFinder.H:126
void InitLatticeElementFinderDevice(WarpXParIter const &a_pti, int a_offset, AcceleratorLattice const &accelerator_lattice, LatticeElementFinder const &h_finder, const amrex::Vector< amrex::Real > &dts)
Initialize the data needed to do the lookups.
Definition LatticeElementFinder.cpp:96
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void operator()(const 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
Gather the field for the particle from the lattice elements.
Definition LatticeElementFinder.H:158
amrex::Real m_dz
Definition LatticeElementFinder.H:130
int const * d_quad_indices_arr
Definition LatticeElementFinder.H:148
amrex::ParticleReal m_uz_boost
Definition LatticeElementFinder.H:135
const amrex::ParticleReal *AMREX_RESTRICT m_uz
Definition LatticeElementFinder.H:141
amrex::Real m_zmin
Definition LatticeElementFinder.H:129
HardEdgedQuadrupoleDevice d_quad
Definition LatticeElementFinder.H:144
GetParticlePosition< PIdx > m_get_position
Definition LatticeElementFinder.H:138
amrex::ParticleReal m_gamma_boost
Definition LatticeElementFinder.H:134
Definition LatticeElementFinder.H:27
void setup_lattice_indices(amrex::Gpu::DeviceVector< amrex::ParticleReal > const &zs, amrex::Gpu::DeviceVector< amrex::ParticleReal > const &ze, amrex::Gpu::DeviceVector< int > &indices) const
Fill in the index lookup tables This loops over the grid (in z) and finds the lattice element closest...
Definition LatticeElementFinder.cpp:133
amrex::Gpu::DeviceVector< int > d_quad_indices
Definition LatticeElementFinder.H:87
int m_nz
Definition LatticeElementFinder.H:64
amrex::Real m_zmin
Definition LatticeElementFinder.H:65
LatticeElementFinderDevice GetFinderDeviceInstance(WarpXParIter const &a_pti, int a_offset, AcceleratorLattice const &accelerator_lattice, const amrex::Vector< amrex::Real > &dts) const
Get the device level instance associated with this instance.
Definition LatticeElementFinder.cpp:86
amrex::Gpu::DeviceVector< int > d_plasmalens_indices
Definition LatticeElementFinder.H:88
amrex::ParticleReal m_gamma_boost
Definition LatticeElementFinder.H:70
amrex::Real m_time
Definition LatticeElementFinder.H:72
void UpdateIndices(int lev, amrex::MFIter const &a_mfi, AcceleratorLattice const &accelerator_lattice, const amrex::Vector< amrex::Real > &time)
Update the index lookup tables for each element type, filling in the values.
Definition LatticeElementFinder.cpp:61
amrex::Real m_dz
Definition LatticeElementFinder.H:66
amrex::ParticleReal m_uz_boost
Definition LatticeElementFinder.H:71
void InitElementFinder(int lev, amrex::Real gamma_boost, const amrex::Vector< amrex::Real > &time, amrex::MFIter const &a_mfi, AcceleratorLattice const &accelerator_lattice)
Initialize the element finder at the level and grid.
Definition LatticeElementFinder.cpp:18
void AllocateIndices(AcceleratorLattice const &accelerator_lattice)
Allocate the index lookup tables for each element type.
Definition LatticeElementFinder.cpp:46