diff options
author | 2020-02-03 12:59:59 -0800 | |
---|---|---|
committer | 2020-02-03 12:59:59 -0800 | |
commit | 9b65ba8d6248f6caad7dac74a9de644d91d13b74 (patch) | |
tree | 16ad969e5fc5a881ac89d1da8ed9bc14259bcfa0 /Source/Particles/MultiParticleContainer.cpp | |
parent | 0818458c82b7e7862773efa827a983585d7da79f (diff) | |
download | WarpX-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.cpp | 47 |
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 () { |