aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles')
-rwxr-xr-xSource/Particles/Deposition/ChargeDeposition.H13
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp25
-rw-r--r--Source/Particles/WarpXParticleContainer.H1
-rw-r--r--Source/Particles/WarpXParticleContainer.cpp23
4 files changed, 50 insertions, 12 deletions
diff --git a/Source/Particles/Deposition/ChargeDeposition.H b/Source/Particles/Deposition/ChargeDeposition.H
index 26d42370e..4253f5e76 100755
--- a/Source/Particles/Deposition/ChargeDeposition.H
+++ b/Source/Particles/Deposition/ChargeDeposition.H
@@ -6,6 +6,10 @@
/* \brief Charge Deposition for thread thread_num
* /param xp, yp, zp : Pointer to arrays of particle positions.
* \param wp : Pointer to array of particle weights.
+ * \param ion_lev : Pointer 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.
* \param rho_arr : Array4 of charge density, either full array or tile.
* \param np_to_depose : Number of particles for which current is deposited.
* \param dx : 3D cell size
@@ -18,6 +22,7 @@ void doChargeDepositionShapeN(const amrex::Real * const xp,
const amrex::Real * const yp,
const amrex::Real * const zp,
const amrex::Real * const wp,
+ const int * const ion_lev,
const amrex::Array4<amrex::Real>& rho_arr,
const long np_to_depose,
const std::array<amrex::Real,3>& dx,
@@ -25,6 +30,9 @@ void doChargeDepositionShapeN(const amrex::Real * const xp,
const amrex::Dim3 lo,
const amrex::Real q)
{
+ // Whether ion_lev is a null pointer (do_ionization=0) or a real pointer
+ // (do_ionization=1)
+ const bool do_ionization = ion_lev;
const amrex::Real dxi = 1.0/dx[0];
const amrex::Real dzi = 1.0/dx[2];
#if (AMREX_SPACEDIM == 2)
@@ -43,7 +51,10 @@ void doChargeDepositionShapeN(const amrex::Real * const xp,
np_to_depose,
[=] AMREX_GPU_DEVICE (long ip) {
// --- Get particle quantities
- const amrex::Real wq = q*wp[ip]*invvol;
+ amrex::Real wq = q*wp[ip]*invvol;
+ if (do_ionization){
+ wq *= ion_lev[ip];
+ }
// --- Compute shape factors
// x direction
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index 4562b5c0a..3db413104 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -1179,9 +1179,18 @@ PhysicalParticleContainer::Evolve (int lev,
BL_PROFILE_VAR_STOP(blp_copy);
if (rho) {
- DepositCharge(pti, wp, rho, 0, 0, np_current, thread_num, lev, lev);
+
+ int* AMREX_RESTRICT ion_lev;
+ if (do_field_ionization){
+ ion_lev = pti.GetiAttribs(particle_icomps["ionization_level"]).dataPtr();
+ } else {
+ ion_lev = nullptr;
+ }
+ DepositCharge(pti, wp, ion_lev, rho, 0, 0,
+ np_current, thread_num, lev, lev);
if (has_buffer){
- DepositCharge(pti, wp, crho, 0, np_current, np-np_current, thread_num, lev, lev-1);
+ DepositCharge(pti, wp, ion_lev, crho, 0, np_current,
+ np-np_current, thread_num, lev, lev-1);
}
}
@@ -1327,9 +1336,17 @@ PhysicalParticleContainer::Evolve (int lev,
}
if (rho) {
- DepositCharge(pti, wp, rho, 1, 0, np_current, thread_num, lev, lev);
+ int* AMREX_RESTRICT ion_lev;
+ if (do_field_ionization){
+ ion_lev = pti.GetiAttribs(particle_icomps["ionization_level"]).dataPtr();
+ } else {
+ ion_lev = nullptr;
+ }
+ DepositCharge(pti, wp, ion_lev, rho, 1, 0,
+ np_current, thread_num, lev, lev);
if (has_buffer){
- DepositCharge(pti, wp, crho, 1, np_current, np-np_current, thread_num, lev, lev-1);
+ DepositCharge(pti, wp, ion_lev, crho, 1, np_current,
+ np-np_current, thread_num, lev, lev-1);
}
}
diff --git a/Source/Particles/WarpXParticleContainer.H b/Source/Particles/WarpXParticleContainer.H
index 65eec3c2d..c252eee6b 100644
--- a/Source/Particles/WarpXParticleContainer.H
+++ b/Source/Particles/WarpXParticleContainer.H
@@ -171,6 +171,7 @@ public:
virtual void DepositCharge(WarpXParIter& pti,
RealVector& wp,
+ const int * const ion_lev,
amrex::MultiFab* rho,
int icomp,
const long offset,
diff --git a/Source/Particles/WarpXParticleContainer.cpp b/Source/Particles/WarpXParticleContainer.cpp
index 87c2d5e90..20f8c3e00 100644
--- a/Source/Particles/WarpXParticleContainer.cpp
+++ b/Source/Particles/WarpXParticleContainer.cpp
@@ -562,6 +562,7 @@ WarpXParticleContainer::DepositCurrent(WarpXParIter& pti,
void
WarpXParticleContainer::DepositCharge (WarpXParIter& pti, RealVector& wp,
+ const int * const ion_lev,
MultiFab* rho, int icomp,
const long offset, const long np_to_depose,
int thread_num, int lev, int depos_lev)
@@ -623,14 +624,14 @@ WarpXParticleContainer::DepositCharge (WarpXParIter& pti, RealVector& wp,
BL_PROFILE_VAR_START(blp_ppc_chd);
if (WarpX::nox == 1){
- doChargeDepositionShapeN<1>(xp, yp, zp, wp.dataPtr()+offset, rho_arr,
- np_to_depose, dx, xyzmin, lo, q);
+ doChargeDepositionShapeN<1>(xp, yp, zp, wp.dataPtr()+offset, ion_lev,
+ rho_arr, np_to_depose, dx, xyzmin, lo, q);
} else if (WarpX::nox == 2){
- doChargeDepositionShapeN<2>(xp, yp, zp, wp.dataPtr()+offset, rho_arr,
- np_to_depose, dx, xyzmin, lo, q);
+ doChargeDepositionShapeN<2>(xp, yp, zp, wp.dataPtr()+offset, ion_lev,
+ rho_arr, np_to_depose, dx, xyzmin, lo, q);
} else if (WarpX::nox == 3){
- doChargeDepositionShapeN<3>(xp, yp, zp, wp.dataPtr()+offset, rho_arr,
- np_to_depose, dx, xyzmin, lo, q);
+ doChargeDepositionShapeN<3>(xp, yp, zp, wp.dataPtr()+offset, ion_lev,
+ rho_arr, np_to_depose, dx, xyzmin, lo, q);
}
BL_PROFILE_VAR_STOP(blp_ppc_chd);
@@ -740,7 +741,15 @@ WarpXParticleContainer::GetChargeDensity (int lev, bool local)
pti.GetPosition(m_xp[thread_num], m_yp[thread_num], m_zp[thread_num]);
- DepositCharge(pti, wp, rho.get(), 0, 0, np, thread_num, lev, lev);
+ int* AMREX_RESTRICT ion_lev;
+ if (do_field_ionization){
+ ion_lev = pti.GetiAttribs(particle_icomps["ionization_level"]).dataPtr();
+ } else {
+ ion_lev = nullptr;
+ }
+
+ DepositCharge(pti, wp, ion_lev, rho.get(), 0, 0, np,
+ thread_num, lev, lev);
}
#ifdef _OPENMP
}