WarpX
Functions
CurrentDeposition.H File Reference
#include "Particles/Deposition/SharedDepositionUtils.H"
#include "ablastr/parallelization/KernelTimer.H"
#include "Particles/Pusher/GetAndSetPosition.H"
#include "Particles/ShapeFactors.H"
#include "Utils/TextMsg.H"
#include "Utils/WarpXAlgorithmSelection.H"
#include "Utils/WarpXConst.H"
#include "Utils/WarpX_Complex.H"
#include "WarpX.H"
#include <AMReX.H>
#include <AMReX_Arena.H>
#include <AMReX_Array4.H>
#include <AMReX_REAL.H>

Go to the source code of this file.

Functions

template<int depos_order>
AMREX_GPU_HOST_DEVICE AMREX_INLINE void doDepositionShapeNKernel (const amrex::ParticleReal xp, const amrex::ParticleReal yp, const amrex::ParticleReal zp, const amrex::ParticleReal wq, const amrex::ParticleReal vx, const amrex::ParticleReal vy, const amrex::ParticleReal vz, amrex::Array4< amrex::Real > const &jx_arr, amrex::Array4< amrex::Real > const &jy_arr, amrex::Array4< amrex::Real > const &jz_arr, amrex::IntVect const &jx_type, amrex::IntVect const &jy_type, amrex::IntVect const &jz_type, const amrex::Real relative_time, AMREX_D_DECL(const amrex::Real dzi, const amrex::Real dxi, const amrex::Real dyi), AMREX_D_DECL(const amrex::Real zmin, const amrex::Real xmin, const amrex::Real ymin), const amrex::Real invvol, const amrex::Dim3 lo, const int n_rz_azimuthal_modes)
 Kernel for the direct current deposition for thread thread_num. More...
 
template<int depos_order>
void doDepositionShapeN (const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, const amrex::ParticleReal *const uxp, const amrex::ParticleReal *const uyp, const amrex::ParticleReal *const uzp, const int *ion_lev, amrex::FArrayBox &jx_fab, amrex::FArrayBox &jy_fab, amrex::FArrayBox &jz_fab, long np_to_deposit, amrex::Real relative_time, const std::array< amrex::Real, 3 > &dx, const std::array< amrex::Real, 3 > &xyzmin, amrex::Dim3 lo, amrex::Real q, int n_rz_azimuthal_modes)
 Current Deposition for thread thread_num. More...
 
template<int depos_order>
void doDepositionShapeNImplicit (const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, const amrex::ParticleReal *const uxp_n, const amrex::ParticleReal *const uyp_n, const amrex::ParticleReal *const uzp_n, const amrex::ParticleReal *const uxp, const amrex::ParticleReal *const uyp, const amrex::ParticleReal *const uzp, const int *const ion_lev, amrex::FArrayBox &jx_fab, amrex::FArrayBox &jy_fab, amrex::FArrayBox &jz_fab, const long np_to_deposit, const std::array< amrex::Real, 3 > &dx, const std::array< amrex::Real, 3 > &xyzmin, const amrex::Dim3 lo, const amrex::Real q, const int n_rz_azimuthal_modes)
 Direct current deposition for thread thread_num for the implicit scheme The only difference from doDepositionShapeN is in how the particle gamma is calculated. More...
 
template<int depos_order>
void doDepositionSharedShapeN (const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, const amrex::ParticleReal *const uxp, const amrex::ParticleReal *const uyp, const amrex::ParticleReal *const uzp, const int *ion_lev, amrex::FArrayBox &jx_fab, amrex::FArrayBox &jy_fab, amrex::FArrayBox &jz_fab, long np_to_deposit, const amrex::Real relative_time, const std::array< amrex::Real, 3 > &dx, const std::array< amrex::Real, 3 > &xyzmin, amrex::Dim3 lo, amrex::Real q, int n_rz_azimuthal_modes, const amrex::DenseBins< WarpXParticleContainer::ParticleTileType::ParticleTileDataType > &a_bins, const amrex::Box &box, const amrex::Geometry &geom, const amrex::IntVect &a_tbox_max_size)
 Current Deposition for thread thread_num using shared memory. More...
 
template<int depos_order>
void doEsirkepovDepositionShapeN (const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, const amrex::ParticleReal *const uxp, const amrex::ParticleReal *const uyp, const amrex::ParticleReal *const uzp, const int *ion_lev, const amrex::Array4< amrex::Real > &Jx_arr, const amrex::Array4< amrex::Real > &Jy_arr, const amrex::Array4< amrex::Real > &Jz_arr, long np_to_deposit, amrex::Real dt, amrex::Real relative_time, const std::array< amrex::Real, 3 > &dx, std::array< amrex::Real, 3 > xyzmin, amrex::Dim3 lo, amrex::Real q, int n_rz_azimuthal_modes)
 Esirkepov Current Deposition for thread thread_num. More...
 
template<int depos_order>
void doChargeConservingDepositionShapeNImplicit (const amrex::ParticleReal *const xp_n, const amrex::ParticleReal *const yp_n, const amrex::ParticleReal *const zp_n, const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, [[maybe_unused]]const amrex::ParticleReal *const uxp_n, [[maybe_unused]]const amrex::ParticleReal *const uyp_n, [[maybe_unused]]const amrex::ParticleReal *const uzp_n, [[maybe_unused]]const amrex::ParticleReal *const uxp_nph, [[maybe_unused]]const amrex::ParticleReal *const uyp_nph, [[maybe_unused]]const amrex::ParticleReal *const uzp_nph, const int *const ion_lev, const amrex::Array4< amrex::Real > &Jx_arr, const amrex::Array4< amrex::Real > &Jy_arr, const amrex::Array4< amrex::Real > &Jz_arr, const long np_to_deposit, const amrex::Real dt, const std::array< amrex::Real, 3 > &dx, const std::array< amrex::Real, 3 > xyzmin, const amrex::Dim3 lo, const amrex::Real q, const int n_rz_azimuthal_modes)
 Esirkepov Current Deposition for thread thread_num for implicit scheme The difference from doEsirkepovDepositionShapeN is in how the old and new particles positions are determined and in how the particle gamma is calculated. More...
 
template<int depos_order>
void doVillasenorDepositionShapeNImplicit (const amrex::ParticleReal *const xp_n, const amrex::ParticleReal *const yp_n, const amrex::ParticleReal *const zp_n, const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, [[maybe_unused]]const amrex::ParticleReal *const uxp_n, [[maybe_unused]]const amrex::ParticleReal *const uyp_n, [[maybe_unused]]const amrex::ParticleReal *const uzp_n, [[maybe_unused]]const amrex::ParticleReal *const uxp_nph, [[maybe_unused]]const amrex::ParticleReal *const uyp_nph, [[maybe_unused]]const amrex::ParticleReal *const uzp_nph, const int *const ion_lev, const amrex::Array4< amrex::Real > &Jx_arr, const amrex::Array4< amrex::Real > &Jy_arr, const amrex::Array4< amrex::Real > &Jz_arr, const long np_to_deposit, const amrex::Real dt, const std::array< amrex::Real, 3 > &dx, const std::array< amrex::Real, 3 > xyzmin, const amrex::Dim3 lo, const amrex::Real q, const int n_rz_azimuthal_modes)
 Villasenor and Buneman Current Deposition for thread thread_num for implicit scheme. The specifics for the implicit scheme are in how gamma is determined. This is a charge- conserving deposition. The difference from Esirkepov is that the deposit is done segment by segment, where the segments are determined by cell crossings. In general, this results in a tighter stencil. The implementation is valid for an arbitrary number of cell crossings. More...
 
template<int depos_order>
void doVayDepositionShapeN (const GetParticlePosition< PIdx > &GetPosition, const amrex::ParticleReal *const wp, const amrex::ParticleReal *const uxp, const amrex::ParticleReal *const uyp, const amrex::ParticleReal *const uzp, const int *const ion_lev, amrex::FArrayBox &Dx_fab, amrex::FArrayBox &Dy_fab, amrex::FArrayBox &Dz_fab, long np_to_deposit, amrex::Real dt, amrex::Real relative_time, const std::array< amrex::Real, 3 > &dx, const std::array< amrex::Real, 3 > &xyzmin, amrex::Dim3 lo, amrex::Real q, int n_rz_azimuthal_modes)
 Vay current deposition (Vay et al, 2013) for thread thread_num: deposit D in real space and store the result in Dx_fab, Dy_fab, Dz_fab. More...
 

Function Documentation

◆ doChargeConservingDepositionShapeNImplicit()

template<int depos_order>
void doChargeConservingDepositionShapeNImplicit ( const amrex::ParticleReal *const  xp_n,
const amrex::ParticleReal *const  yp_n,
const amrex::ParticleReal *const  zp_n,
const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
[[maybe_unused] ]const amrex::ParticleReal *const  uxp_n,
[[maybe_unused] ]const amrex::ParticleReal *const  uyp_n,
[[maybe_unused] ]const amrex::ParticleReal *const  uzp_n,
[[maybe_unused] ]const amrex::ParticleReal *const  uxp_nph,
[[maybe_unused] ]const amrex::ParticleReal *const  uyp_nph,
[[maybe_unused] ]const amrex::ParticleReal *const  uzp_nph,
const int *const  ion_lev,
const amrex::Array4< amrex::Real > &  Jx_arr,
const amrex::Array4< amrex::Real > &  Jy_arr,
const amrex::Array4< amrex::Real > &  Jz_arr,
const long  np_to_deposit,
const amrex::Real  dt,
const std::array< amrex::Real, 3 > &  dx,
const std::array< amrex::Real, 3 >  xyzmin,
const amrex::Dim3  lo,
const amrex::Real  q,
const int  n_rz_azimuthal_modes 
)

Esirkepov Current Deposition for thread thread_num for implicit scheme The difference from doEsirkepovDepositionShapeN is in how the old and new particles positions are determined and in how the particle gamma is calculated.

Template Parameters
depos_orderdeposition order
Parameters
xp_n,yp_n,zp_nPointer to arrays of particle position at time level n.
GetPositionA functor for returning the particle position.
wpPointer to array of particle weights.
uxp_n,uyp_n,uzp_nPointer to arrays of particle momentum at time level n.
uxp_nph,uyp_nph,uzp_nphPointer to arrays of particle momentum at time level n + 1/2.
ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is a null pointer.
Jx_arr,Jy_arr,Jz_arrArray4 of current density, either full array or tile.
np_to_depositNumber of particles for which current is deposited.
dtTime step for particle level
dx3D cell size
xyzminPhysical lower bounds of domain.
loIndex lower bounds of domain.
qspecies charge.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.

◆ doDepositionShapeN()

template<int depos_order>
void doDepositionShapeN ( const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
const amrex::ParticleReal *const  uxp,
const amrex::ParticleReal *const  uyp,
const amrex::ParticleReal *const  uzp,
const int ion_lev,
amrex::FArrayBox jx_fab,
amrex::FArrayBox jy_fab,
amrex::FArrayBox jz_fab,
long  np_to_deposit,
amrex::Real  relative_time,
const std::array< amrex::Real, 3 > &  dx,
const std::array< amrex::Real, 3 > &  xyzmin,
amrex::Dim3  lo,
amrex::Real  q,
int  n_rz_azimuthal_modes 
)

Current Deposition for thread thread_num.

Template Parameters
depos_orderdeposition order
Parameters
GetPositionA functor for returning the particle position.
wpPointer to array of particle weights.
uxp,uyp,uzpPointer to arrays of particle momentum.
ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is a null pointer.
jx_fab,jy_fab,jz_fabFArrayBox of current density, either full array or tile.
np_to_depositNumber of particles for which current is deposited.
relative_timeTime at which to deposit J, relative to the time of the current positions of the particles. When different than 0, the particle position will be temporarily modified to match the time of the deposition.
dx3D cell size
xyzminPhysical lower bounds of domain.
loIndex lower bounds of domain.
qspecies charge.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.

◆ doDepositionShapeNImplicit()

template<int depos_order>
void doDepositionShapeNImplicit ( const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
const amrex::ParticleReal *const  uxp_n,
const amrex::ParticleReal *const  uyp_n,
const amrex::ParticleReal *const  uzp_n,
const amrex::ParticleReal *const  uxp,
const amrex::ParticleReal *const  uyp,
const amrex::ParticleReal *const  uzp,
const int *const  ion_lev,
amrex::FArrayBox jx_fab,
amrex::FArrayBox jy_fab,
amrex::FArrayBox jz_fab,
const long  np_to_deposit,
const std::array< amrex::Real, 3 > &  dx,
const std::array< amrex::Real, 3 > &  xyzmin,
const amrex::Dim3  lo,
const amrex::Real  q,
const int  n_rz_azimuthal_modes 
)

Direct current deposition for thread thread_num for the implicit scheme The only difference from doDepositionShapeN is in how the particle gamma is calculated.

Template Parameters
depos_orderdeposition order
Parameters
GetPositionA functor for returning the particle position.
wpPointer to array of particle weights.
uxp_n,uyp_n,uzp_nPointer to arrays of particle momentum at time n.
uxp,uyp,uzpPointer to arrays of particle momentum at time n+1/2.
ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is a null pointer.
jx_fab,jy_fab,jz_fabFArrayBox of current density, either full array or tile.
np_to_depositNumber of particles for which current is deposited.
dx3D cell size
xyzminPhysical lower bounds of domain.
loIndex lower bounds of domain.
qspecies charge.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.

◆ doDepositionShapeNKernel()

template<int depos_order>
AMREX_GPU_HOST_DEVICE AMREX_INLINE void doDepositionShapeNKernel ( const amrex::ParticleReal  xp,
const amrex::ParticleReal  yp,
const amrex::ParticleReal  zp,
const amrex::ParticleReal  wq,
const amrex::ParticleReal  vx,
const amrex::ParticleReal  vy,
const amrex::ParticleReal  vz,
amrex::Array4< amrex::Real > const &  jx_arr,
amrex::Array4< amrex::Real > const &  jy_arr,
amrex::Array4< amrex::Real > const &  jz_arr,
amrex::IntVect const &  jx_type,
amrex::IntVect const &  jy_type,
amrex::IntVect const &  jz_type,
const amrex::Real  relative_time,
AMREX_D_DECL(const amrex::Real dzi, const amrex::Real dxi, const amrex::Real dyi)  ,
AMREX_D_DECL(const amrex::Real zmin, const amrex::Real xmin, const amrex::Real ymin)  ,
const amrex::Real  invvol,
const amrex::Dim3  lo,
const int  n_rz_azimuthal_modes 
)

Kernel for the direct current deposition for thread thread_num.

Template Parameters
depos_orderdeposition order
Parameters
xp,yp,zpThe particle positions.
wqThe charge of the macroparticle
vx,vy,vzThe particle velocities
jx_arr,jy_arr,jz_arrArray4 of current density, either full array or tile.
jx_type,jy_type,jz_typeThe grid types along each direction, either NODE or CELL
relative_timeTime at which to deposit J, relative to the time of the current positions of the particles. When different than 0, the particle position will be temporarily modified to match the time of the deposition.
dzi,dxi,dyiThe inverse cell sizes
zmin,xmin,yminThe lower bounds of the domain
invvolThe inverse volume of a grid cell
loIndex lower bounds of domain.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.

◆ doDepositionSharedShapeN()

template<int depos_order>
void doDepositionSharedShapeN ( const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
const amrex::ParticleReal *const  uxp,
const amrex::ParticleReal *const  uyp,
const amrex::ParticleReal *const  uzp,
const int ion_lev,
amrex::FArrayBox jx_fab,
amrex::FArrayBox jy_fab,
amrex::FArrayBox jz_fab,
long  np_to_deposit,
const amrex::Real  relative_time,
const std::array< amrex::Real, 3 > &  dx,
const std::array< amrex::Real, 3 > &  xyzmin,
amrex::Dim3  lo,
amrex::Real  q,
int  n_rz_azimuthal_modes,
const amrex::DenseBins< WarpXParticleContainer::ParticleTileType::ParticleTileDataType > &  a_bins,
const amrex::Box box,
const amrex::Geometry geom,
const amrex::IntVect a_tbox_max_size 
)

Current Deposition for thread thread_num using shared memory.

Template Parameters
depos_orderdeposition order
Parameters
GetPositionA functor for returning the particle position.
wpPointer to array of particle weights.
uxp,uyp,uzpPointer to arrays of particle momentum.
ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is a null pointer.
jx_fab,jy_fab,jz_fabFArrayBox of current density, either full array or tile.
np_to_depositNumber of particles for which current is deposited.
dtTime step for particle level
relative_timeTime at which to deposit J, relative to the time of the current positions of the particles. When different than 0, the particle position will be temporarily modified to match the time of the deposition.
dx3D cell size
xyzminPhysical lower bounds of domain.
loIndex lower bounds of domain.
qspecies charge.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.

◆ doEsirkepovDepositionShapeN()

template<int depos_order>
void doEsirkepovDepositionShapeN ( const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
const amrex::ParticleReal *const  uxp,
const amrex::ParticleReal *const  uyp,
const amrex::ParticleReal *const  uzp,
const int ion_lev,
const amrex::Array4< amrex::Real > &  Jx_arr,
const amrex::Array4< amrex::Real > &  Jy_arr,
const amrex::Array4< amrex::Real > &  Jz_arr,
long  np_to_deposit,
amrex::Real  dt,
amrex::Real  relative_time,
const std::array< amrex::Real, 3 > &  dx,
std::array< amrex::Real, 3 >  xyzmin,
amrex::Dim3  lo,
amrex::Real  q,
int  n_rz_azimuthal_modes 
)

Esirkepov Current Deposition for thread thread_num.

Template Parameters
depos_orderdeposition order
Parameters
GetPositionA functor for returning the particle position.
wpPointer to array of particle weights.
uxp,uyp,uzpPointer to arrays of particle momentum.
ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is a null pointer.
Jx_arr,Jy_arr,Jz_arrArray4 of current density, either full array or tile.
np_to_depositNumber of particles for which current is deposited.
dtTime step for particle level
[in]relative_timeTime at which to deposit J, relative to the time of the current positions of the particles. When different than 0, the particle position will be temporarily modified to match the time of the deposition.
dx3D cell size
xyzminPhysical lower bounds of domain.
loIndex lower bounds of domain.
qspecies charge.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.

◆ doVayDepositionShapeN()

template<int depos_order>
void doVayDepositionShapeN ( const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
const amrex::ParticleReal *const  uxp,
const amrex::ParticleReal *const  uyp,
const amrex::ParticleReal *const  uzp,
const int *const  ion_lev,
amrex::FArrayBox Dx_fab,
amrex::FArrayBox Dy_fab,
amrex::FArrayBox Dz_fab,
long  np_to_deposit,
amrex::Real  dt,
amrex::Real  relative_time,
const std::array< amrex::Real, 3 > &  dx,
const std::array< amrex::Real, 3 > &  xyzmin,
amrex::Dim3  lo,
amrex::Real  q,
int  n_rz_azimuthal_modes 
)

Vay current deposition (Vay et al, 2013) for thread thread_num: deposit D in real space and store the result in Dx_fab, Dy_fab, Dz_fab.

Template Parameters
depos_orderdeposition order
Parameters
[in]GetPositionFunctor that returns the particle position
[in]wpPointer to array of particle weights
[in]uxp,uyp,uzpPointer to arrays of particle momentum along x
[in]ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is null
[in,out]Dx_fab,Dy_fab,Dz_fabFArrayBox of Vay current density, either full array or tile
[in]np_to_depositNumber of particles for which current is deposited
[in]dtTime step for particle level
[in]relative_timeTime at which to deposit D, relative to the time of the current positions of the particles. When different than 0, the particle position will be temporarily modified to match the time of the deposition.
[in]dx3D cell size
[in]xyzmin3D lower bounds of physical domain
[in]loDimension-agnostic lower bounds of index domain
[in]qSpecies charge
[in]n_rz_azimuthal_modesNumber of azimuthal modes in RZ geometry

◆ doVillasenorDepositionShapeNImplicit()

template<int depos_order>
void doVillasenorDepositionShapeNImplicit ( const amrex::ParticleReal *const  xp_n,
const amrex::ParticleReal *const  yp_n,
const amrex::ParticleReal *const  zp_n,
const GetParticlePosition< PIdx > &  GetPosition,
const amrex::ParticleReal *const  wp,
[[maybe_unused] ]const amrex::ParticleReal *const  uxp_n,
[[maybe_unused] ]const amrex::ParticleReal *const  uyp_n,
[[maybe_unused] ]const amrex::ParticleReal *const  uzp_n,
[[maybe_unused] ]const amrex::ParticleReal *const  uxp_nph,
[[maybe_unused] ]const amrex::ParticleReal *const  uyp_nph,
[[maybe_unused] ]const amrex::ParticleReal *const  uzp_nph,
const int *const  ion_lev,
const amrex::Array4< amrex::Real > &  Jx_arr,
const amrex::Array4< amrex::Real > &  Jy_arr,
const amrex::Array4< amrex::Real > &  Jz_arr,
const long  np_to_deposit,
const amrex::Real  dt,
const std::array< amrex::Real, 3 > &  dx,
const std::array< amrex::Real, 3 >  xyzmin,
const amrex::Dim3  lo,
const amrex::Real  q,
const int  n_rz_azimuthal_modes 
)

Villasenor and Buneman Current Deposition for thread thread_num for implicit scheme. The specifics for the implicit scheme are in how gamma is determined. This is a charge- conserving deposition. The difference from Esirkepov is that the deposit is done segment by segment, where the segments are determined by cell crossings. In general, this results in a tighter stencil. The implementation is valid for an arbitrary number of cell crossings.

Parameters
depos_orderdeposition order
xp_n,yp_n,zp_nPointer to arrays of particle position at time level n.
GetPositionA functor for returning the particle position.
wpPointer to array of particle weights.
uxp_n,uyp_n,uzp_nPointer to arrays of particle momentum at time level n.
uxp_nph,uyp_nph,uzp_nphPointer to arrays of particle momentum at time level n + 1/2.
ion_levPointer to array of particle ionization level. This is required to have the charge of each macroparticle since q is a scalar. For non-ionizable species, ion_lev is a null pointer.
Jx_arr,Jy_arr,Jz_arrArray4 of current density, either full array or tile.
np_to_depositNumber of particles for which current is deposited.
dtTime step for particle level
dx3D cell size
xyzminPhysical lower bounds of domain.
loIndex lower bounds of domain.
qspecies charge.
n_rz_azimuthal_modesNumber of azimuthal modes when using RZ geometry.