aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Andrew Myers <atmyers2@gmail.com> 2020-02-03 12:59:59 -0800
committerGravatar Andrew Myers <atmyers2@gmail.com> 2020-02-03 12:59:59 -0800
commit9b65ba8d6248f6caad7dac74a9de644d91d13b74 (patch)
tree16ad969e5fc5a881ac89d1da8ed9bc14259bcfa0 /Source/Particles/MultiParticleContainer.cpp
parent0818458c82b7e7862773efa827a983585d7da79f (diff)
downloadWarpX-9b65ba8d6248f6caad7dac74a9de644d91d13b74.tar.gz
WarpX-9b65ba8d6248f6caad7dac74a9de644d91d13b74.tar.zst
WarpX-9b65ba8d6248f6caad7dac74a9de644d91d13b74.zip
clean up field ionization
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp47
1 files changed, 28 insertions, 19 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index a4b6d0e36..58eb10ff0 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -648,32 +648,24 @@ MultiParticleContainer::doFieldIonization ()
for (auto& pc_source : allcontainers)
{
if (!pc_source->do_field_ionization){ continue; }
-
+
auto& pc_product = allcontainers[pc_source->ionization_product];
SmartCopyFactory copy_factory(*pc_source, *pc_product);
- auto Copier = copy_factory.getSmartCopy();
- auto IonizationFilter = static_cast<PhysicalParticleContainer*>(pc_source.get())->getIonizationFunc();
+ auto Copy = copy_factory.getSmartCopy();
+ auto Filter = static_cast<PhysicalParticleContainer*>(pc_source.get())->getIonizationFunc();
+ auto Transform = IonizationTransformFunc();
pc_source ->defineAllParticleTiles();
pc_product->defineAllParticleTiles();
for (int lev = 0; lev <= pc_source->finestLevel(); ++lev)
{
- MFItInfo info;
- if (pc_source->do_tiling && Gpu::notInLaunchRegion()) {
- AMREX_ALWAYS_ASSERT_WITH_MESSAGE(
- pc_product->do_tiling,
- "For ionization, either all or none of the "
- "particle species must use tiling.");
- info.EnableTiling(pc_source->tile_size);
- }
+ auto info = getMFItInfo(*pc_source, *pc_product);
#ifdef _OPENMP
- info.SetDynamic(true);
-#pragma omp parallel
-#endif
- // Loop over all grids (if not tiling) or grids and tiles (if tiling)
+#pragma omp parallel if (Gpu::notInLaunchRegion())
+#endif
for (MFIter mfi = pc_source->MakeMFIter(lev, info); mfi.isValid(); ++mfi)
{
auto& src_tile = pc_source ->ParticlesAt(lev, mfi);
@@ -685,9 +677,7 @@ MultiParticleContainer::doFieldIonization ()
dst_tile.resize(np_dst + np_src);
auto num_added = filterAndTransformParticles(dst_tile, src_tile, np_dst,
- IonizationFilter,
- IonizationTransformFunc(),
- Copier);
+ Filter, Transform, Copy);
dst_tile.resize(np_dst + num_added);
@@ -717,7 +707,7 @@ MultiParticleContainer::doCoulombCollisions ()
// Loop over all grids/tiles at this level
#ifdef _OPENMP
info.SetDynamic(true);
- #pragma omp parallel if (Gpu::notInLaunchRegion())
+#pragma omp parallel if (Gpu::notInLaunchRegion())
#endif
for (MFIter mfi = species1->MakeMFIter(lev, info); mfi.isValid(); ++mfi){
@@ -731,6 +721,25 @@ MultiParticleContainer::doCoulombCollisions ()
}
}
+MFItInfo MultiParticleContainer::getMFItInfo (const WarpXParticleContainer& pc_src,
+ const WarpXParticleContainer& pc_dst) const noexcept
+{
+ MFItInfo info;
+
+ if (pc_src.do_tiling && Gpu::notInLaunchRegion()) {
+ AMREX_ALWAYS_ASSERT_WITH_MESSAGE(pc_dst.do_tiling,
+ "For ionization, either all or none of the "
+ "particle species must use tiling.");
+ info.EnableTiling(pc_src.tile_size);
+ }
+
+#ifdef _OPENMP
+ info.SetDynamic(true);
+#endif
+
+ return info;
+}
+
#ifdef WARPX_QED
void MultiParticleContainer::InitQED ()
{