From ffc3c525e574fd3ad0f5c6a5329ef07e25f39ceb Mon Sep 17 00:00:00 2001 From: atmyers Date: Mon, 3 Feb 2020 09:48:18 -0800 Subject: more work on elementary_process --- Source/Particles/MultiParticleContainer.cpp | 55 +++++++++++++++++++---------- 1 file changed, 36 insertions(+), 19 deletions(-) (limited to 'Source/Particles/MultiParticleContainer.cpp') 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(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 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 v_do_back_transformed_product{do_boost}; - const amrex::Vector 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 -- cgit v1.2.3