aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Particles/Deposition/CurrentDeposition.H12
-rw-r--r--Source/Particles/MultiParticleContainer.cpp9
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp9
-rw-r--r--Source/Utils/write_atomic_data_cpp.py6
4 files changed, 33 insertions, 3 deletions
diff --git a/Source/Particles/Deposition/CurrentDeposition.H b/Source/Particles/Deposition/CurrentDeposition.H
index 86cf89cd3..7dde90e96 100644
--- a/Source/Particles/Deposition/CurrentDeposition.H
+++ b/Source/Particles/Deposition/CurrentDeposition.H
@@ -7,6 +7,10 @@
* /param xp, yp, zp : Pointer to arrays of particle positions.
* \param wp : Pointer to array of particle weights.
* \param uxp uyp uzp : Pointer to arrays of particle momentum.
+ * \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 jx_arr : Array4 of current density, either full array or tile.
* \param jy_arr : Array4 of current density, either full array or tile.
* \param jz_arr : Array4 of current density, either full array or tile.
@@ -37,6 +41,8 @@ void doDepositionShapeN(const amrex::Real * const xp,
const amrex::Real stagger_shift,
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];
@@ -166,6 +172,10 @@ void doDepositionShapeN(const amrex::Real * const xp,
* /param xp, yp, zp : Pointer to arrays of particle positions.
* \param wp : Pointer to array of particle weights.
* \param uxp uyp uzp : Pointer to arrays of particle momentum.
+ * \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 Jx_arr : Array4 of current density, either full array or tile.
* \param Jy_arr : Array4 of current density, either full array or tile.
* \param Jz_arr : Array4 of current density, either full array or tile.
@@ -195,6 +205,8 @@ void doEsirkepovDepositionShapeN (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 dtsdx0 = dt*dxi;
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index e39930216..9e2cd097f 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -513,7 +513,7 @@ namespace
{
// For particle i in mfi, if is_ionized[i]=1, copy particle
// particle i from container pc_source into pc_product
- static void createIonizedParticles (
+ void createIonizedParticles (
int lev, const MFIter& mfi,
std::unique_ptr< WarpXParticleContainer>& pc_source,
std::unique_ptr< WarpXParticleContainer>& pc_product,
@@ -558,6 +558,9 @@ namespace
// The advantage of inclusive_scan is that the sum of is_ionized
// is in the last element, so no other reduction is required to get
// number of particles.
+ // Gpu::inclusive_scan runs on the current GPU stream, and synchronizes
+ // with the CPU, so that the next line (executed by the CPU) has the
+ // updated values of i_product
amrex::Gpu::inclusive_scan(is_ionized.begin(), is_ionized.end(), i_product.begin());
int np_ionized = i_product[np_source-1];
if (np_ionized == 0) return;
@@ -662,6 +665,10 @@ MultiParticleContainer::doFieldIonization ()
for (int lev = 0; lev <= pc_source->finestLevel(); ++lev){
+ // When using runtime components, AMReX requires to touch all tiles
+ // in serial and create particles tiles with runtime components if
+ // they do not exist (or if they were defined by default, i.e.,
+ // without runtime component).
#ifdef _OPENMP
// Touch all tiles of source species in serial if runtime attribs
for (MFIter mfi = pc_source->MakeMFIter(lev); mfi.isValid(); ++mfi) {
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index 4096d1911..4562b5c0a 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -1979,12 +1979,17 @@ void PhysicalParticleContainer::InitIonizationModule ()
{
if (!do_field_ionization) return;
ParmParse pp(species_name);
+ if (charge != PhysConst::q_e){
+ amrex::Warning(
+ "charge != q_e for ionizable species: overriding user value and setting charge = q_e.");
+ charge = PhysConst::q_e;
+ }
pp.query("ionization_initial_level", ionization_initial_level);
pp.get("ionization_product_species", ionization_product_name);
pp.get("physical_element", physical_element);
- // Add Real component for ionization level
+ // Add runtime integer component for ionization level
AddIntComp("ionization_level");
- plot_flags.resize(PIdx::nattribs + 1, 1);
+ // plot_flags.resize(PIdx::nattribs + 1, 1);
// Get atomic number and ionization energies from file
int ion_element_id = ion_map_ids[physical_element];
ion_atomic_number = ion_atomic_numbers[ion_element_id];
diff --git a/Source/Utils/write_atomic_data_cpp.py b/Source/Utils/write_atomic_data_cpp.py
index 21d61a075..b085d50eb 100644
--- a/Source/Utils/write_atomic_data_cpp.py
+++ b/Source/Utils/write_atomic_data_cpp.py
@@ -1,3 +1,9 @@
+'''
+This python script reads ionization tables in atomic_data.txt (generated from
+the NIST website) and extracts ionization levels into C++ file
+IonizationEnergiesTable.H, which contains tables + metadata.
+'''
+
import re, os
import numpy as np
from scipy.constants import e