aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/ElementaryProcess/Ionization.H
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/ElementaryProcess/Ionization.H')
-rw-r--r--Source/Particles/ElementaryProcess/Ionization.H78
1 files changed, 68 insertions, 10 deletions
diff --git a/Source/Particles/ElementaryProcess/Ionization.H b/Source/Particles/ElementaryProcess/Ionization.H
index 6cf30bd4d..6275c7af4 100644
--- a/Source/Particles/ElementaryProcess/Ionization.H
+++ b/Source/Particles/ElementaryProcess/Ionization.H
@@ -10,38 +10,96 @@
#include "Utils/WarpXConst.H"
#include "Particles/WarpXParticleContainer.H"
+#include "Particles/Gather/GetExternalFields.H"
+#include "Particles/Gather/FieldGather.H"
+#include "Particles/Pusher/GetAndSetPosition.H"
struct IonizationFilterFunc
{
- const amrex::Real* const AMREX_RESTRICT m_ionization_energies;
- const amrex::Real* const AMREX_RESTRICT m_adk_prefactor;
- const amrex::Real* const AMREX_RESTRICT m_adk_exp_prefactor;
- const amrex::Real* const AMREX_RESTRICT m_adk_power;
+ const amrex::Real* AMREX_RESTRICT m_ionization_energies;
+ const amrex::Real* AMREX_RESTRICT m_adk_prefactor;
+ const amrex::Real* AMREX_RESTRICT m_adk_exp_prefactor;
+ const amrex::Real* AMREX_RESTRICT m_adk_power;
int comp;
int m_atomic_number;
+ GetParticlePosition m_get_position;
+ GetExternalEField m_get_externalE;
+ GetExternalBField m_get_externalB;
+
+ amrex::Array4<const amrex::Real> m_ex_arr;
+ amrex::Array4<const amrex::Real> m_ey_arr;
+ amrex::Array4<const amrex::Real> m_ez_arr;
+ amrex::Array4<const amrex::Real> m_bx_arr;
+ amrex::Array4<const amrex::Real> m_by_arr;
+ amrex::Array4<const amrex::Real> m_bz_arr;
+
+ amrex::IndexType m_ex_type;
+ amrex::IndexType m_ey_type;
+ amrex::IndexType m_ez_type;
+ amrex::IndexType m_bx_type;
+ amrex::IndexType m_by_type;
+ amrex::IndexType m_bz_type;
+
+ amrex::GpuArray<amrex::Real, 3> m_dx_arr;
+ amrex::GpuArray<amrex::Real, 3> m_xyzmin_arr;
+
+ int m_l_lower_order_in_v;
+ int m_nox;
+ int m_n_rz_azimuthal_modes;
+
+ amrex::Dim3 m_lo;
+
+ IonizationFilterFunc (const WarpXParIter& a_pti, int lev, int ngE,
+ amrex::FArrayBox const& exfab,
+ amrex::FArrayBox const& eyfab,
+ amrex::FArrayBox const& ezfab,
+ amrex::FArrayBox const& bxfab,
+ amrex::FArrayBox const& byfab,
+ amrex::FArrayBox const& bzfab,
+ amrex::Array<amrex::Real,3> v_galilean,
+ const amrex::Real* const AMREX_RESTRICT a_ionization_energies,
+ const amrex::Real* const AMREX_RESTRICT a_adk_prefactor,
+ const amrex::Real* const AMREX_RESTRICT a_adk_exp_prefactor,
+ const amrex::Real* const AMREX_RESTRICT a_adk_power,
+ int a_comp,
+ int a_atomic_number,
+ int a_offset = 0) noexcept;
+
template <typename PData>
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE
bool operator() (const PData& ptd, int i) const noexcept
{
+ using namespace amrex::literals;
+
const int ion_lev = ptd.m_runtime_idata[comp][i];
if (ion_lev < m_atomic_number)
{
constexpr amrex::Real c = PhysConst::c;
constexpr amrex::Real c2_inv = 1./c/c;
+ // gather E and B
+ amrex::ParticleReal xp, yp, zp;
+ m_get_position(i, xp, yp, zp);
+
+ amrex::ParticleReal ex = 0._rt, ey = 0._rt, ez = 0._rt;
+ m_get_externalE(i, ex, ey, ez);
+
+ amrex::ParticleReal bx = 0._rt, by = 0._rt, bz = 0._rt;
+ m_get_externalB(i, bx, by, bz);
+
+ doGatherShapeN(xp, yp, zp, ex, ey, ez, bx, by, bz,
+ m_ex_arr, m_ey_arr, m_ez_arr, m_bx_arr, m_by_arr, m_bz_arr,
+ m_ex_type, m_ey_type, m_ez_type, m_bx_type, m_by_type, m_bz_type,
+ m_dx_arr, m_xyzmin_arr, m_lo, m_n_rz_azimuthal_modes,
+ m_nox, m_l_lower_order_in_v);
+
// Compute electric field amplitude in the particle's frame of
// reference (particularly important when in boosted frame).
amrex::ParticleReal ux = ptd.m_rdata[PIdx::ux][i];
amrex::ParticleReal uy = ptd.m_rdata[PIdx::uy][i];
amrex::ParticleReal uz = ptd.m_rdata[PIdx::uz][i];
- amrex::ParticleReal ex = ptd.m_rdata[PIdx::Ex][i];
- amrex::ParticleReal ey = ptd.m_rdata[PIdx::Ey][i];
- amrex::ParticleReal ez = ptd.m_rdata[PIdx::Ez][i];
- amrex::ParticleReal bx = ptd.m_rdata[PIdx::Bx][i];
- amrex::ParticleReal by = ptd.m_rdata[PIdx::By][i];
- amrex::ParticleReal bz = ptd.m_rdata[PIdx::Bz][i];
amrex::Real ga = std::sqrt(1. + (ux*ux + uy*uy + uz*uz) * c2_inv);
amrex::Real E = std::sqrt(