aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar atmyers <atmyers2@gmail.com> 2020-02-03 09:48:18 -0800
committerGravatar atmyers <atmyers2@gmail.com> 2020-02-03 09:48:18 -0800
commitffc3c525e574fd3ad0f5c6a5329ef07e25f39ceb (patch)
tree28a89aa198091abe55a9207db0ef810b1ec3e271 /Source/Particles/MultiParticleContainer.cpp
parent25315be1959c455f189987c24be54c4b30335eaf (diff)
downloadWarpX-ffc3c525e574fd3ad0f5c6a5329ef07e25f39ceb.tar.gz
WarpX-ffc3c525e574fd3ad0f5c6a5329ef07e25f39ceb.tar.zst
WarpX-ffc3c525e574fd3ad0f5c6a5329ef07e25f39ceb.zip
more work on elementary_process
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp55
1 files changed, 36 insertions, 19 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index fe8354da0..dc04c7e5b 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -654,6 +654,7 @@ MultiParticleContainer::doFieldIonization ()
SmartCopyFactory copy_factory(*pc_source, *pc_product);
auto Copier = copy_factory.getSmartCopy();
+ auto IonizationFilter = static_cast<PhysicalParticleContainer*>(pc_source.get())->getIonizationFunc();
pc_source ->defineAllParticleTiles();
pc_product->defineAllParticleTiles();
@@ -677,25 +678,41 @@ MultiParticleContainer::doFieldIonization ()
// Loop over all grids (if not tiling) or grids and tiles (if tiling)
for (MFIter mfi = pc_source->MakeMFIter(lev, info); mfi.isValid(); ++mfi)
{
- // Ionization mask: one element per source particles.
- // 0 if not ionized, 1 if ionized.
- amrex::Gpu::ManagedDeviceVector<int> is_ionized;
- pc_source->buildIonizationMask(mfi, lev, is_ionized);
- // Create particles in pc_product
- int do_boost = WarpX::do_back_transformed_diagnostics
- && pc_product->doBackTransformedDiagnostics();
- amrex::Gpu::ManagedDeviceVector<int> v_do_back_transformed_product{do_boost};
- const amrex::Vector<WarpXParticleContainer*> v_pc_product {pc_product.get()};
- // Copy source to product particles, and increase ionization
- // level of source particle
- ionization_process.createParticles(lev, mfi, pc_source, v_pc_product,
- is_ionized, v_do_back_transformed_product);
- // Synchronize to prevent the destruction of temporary arrays (at the
- // end of the function call) before the kernel executes.
- Gpu::streamSynchronize();
- }
- } // lev
- } // pc_source
+ auto& src_tile = pc_source ->ParticlesAt(lev, mfi);
+ auto& dst_tile = pc_product->ParticlesAt(lev, mfi);
+
+ auto np_src = src_tile.numParticles();
+ auto np_dst = dst_tile.numParticles();
+
+ dst_tile.resize(np_dst + np_src);
+
+ auto num_filter = filterAndTransformParticles(dst_tile, src_tile,
+ IonizationFilter,
+ IonizationTransformFunc(),
+ Copier);
+
+ dst_tile.resize(np_dst + num_filter);
+
+ // 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;
+ });
+ }
+ }
+ }
}
void