aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp30
-rw-r--r--Source/Particles/ParticleCreation/SmartCopy.H25
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;