diff options
Diffstat (limited to 'Source')
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 30 | ||||
-rw-r--r-- | Source/Particles/ParticleCreation/SmartCopy.H | 25 |
2 files changed, 30 insertions, 25 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index 45a23c56b..a4b6d0e36 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -642,14 +642,13 @@ void MultiParticleContainer::doFieldIonization () { BL_PROFILE("MPC::doFieldIonization"); + // Loop over all species. // Ionized particles in pc_source create particles in pc_product - for (auto& pc_source : allcontainers){ - - // Skip if not ionizable + for (auto& pc_source : allcontainers) + { if (!pc_source->do_field_ionization){ continue; } - // Get product species auto& pc_product = allcontainers[pc_source->ionization_product]; SmartCopyFactory copy_factory(*pc_source, *pc_product); @@ -661,7 +660,6 @@ MultiParticleContainer::doFieldIonization () for (int lev = 0; lev <= pc_source->finestLevel(); ++lev) { - // Enable tiling MFItInfo info; if (pc_source->do_tiling && Gpu::notInLaunchRegion()) { AMREX_ALWAYS_ASSERT_WITH_MESSAGE( @@ -686,30 +684,14 @@ MultiParticleContainer::doFieldIonization () dst_tile.resize(np_dst + np_src); - auto num_filter = filterAndTransformParticles(dst_tile, src_tile, np_dst, + auto num_added = filterAndTransformParticles(dst_tile, src_tile, np_dst, IonizationFilter, IonizationTransformFunc(), Copier); - dst_tile.resize(np_dst + num_filter); + dst_tile.resize(np_dst + num_added); - // Update NextID to include particles created in this function - int pid; -#ifdef _OPENMP -#pragma omp critical (ionization_nextid) -#endif - { - pid = Particle<0,0>::NextID(); - Particle<0,0>::NextID(pid+num_filter); - } - const int cpuid = ParallelDescriptor::MyProc(); - auto pp = dst_tile.GetArrayOfStructs()().data() + np_dst; - amrex::For(num_filter, [=] AMREX_GPU_DEVICE (int ip) noexcept - { - auto& p = pp[ip]; - p.id() = pid+ip; - p.cpu() = cpuid; - }); + setNewParticleIDs(dst_tile, np_dst, num_added); } } } diff --git a/Source/Particles/ParticleCreation/SmartCopy.H b/Source/Particles/ParticleCreation/SmartCopy.H index 8391dcee1..098586bac 100644 --- a/Source/Particles/ParticleCreation/SmartCopy.H +++ b/Source/Particles/ParticleCreation/SmartCopy.H @@ -5,6 +5,7 @@ #include <AMReX_GpuContainers.H> #include <AMReX_TypeTraits.H> +#include <AMReX_ParallelDescriptor.H> #include <map> #include <string> @@ -12,7 +13,6 @@ using NameMap = std::map<std::string, int>; using PolicyVec = amrex::Gpu::DeviceVector<InitializationPolicy>; - struct SmartCopyTag { std::vector<std::string> common_names; @@ -23,8 +23,31 @@ struct SmartCopyTag }; PolicyVec getPolicies (const NameMap& names) noexcept; + SmartCopyTag getSmartCopyTag (const NameMap& src, const NameMap& dst) noexcept; +template <typename PTile> +void setNewParticleIDs (PTile& ptile, int old_size, int num_added) +{ + int pid; +#ifdef _OPENMP +#pragma omp critical (ionization_nextid) +#endif + { + pid = PTile::ParticleType::NextID(); + PTile::ParticleType::NextID(pid + num_added); + } + + const int cpuid = amrex::ParallelDescriptor::MyProc(); + auto pp = ptile.GetArrayOfStructs()().data() + old_size; + amrex::For(num_added, [=] AMREX_GPU_DEVICE (int ip) noexcept + { + auto& p = pp[ip]; + p.id() = pid+ip; + p.cpu() = cpuid; + }); +} + struct SmartCopy { int m_num_copy_real; |