diff options
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 162 |
1 files changed, 88 insertions, 74 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index b22a6f79d..fd0980d45 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -313,17 +313,6 @@ MultiParticleContainer::InitData () } void -MultiParticleContainer::FieldGather (int lev, - const MultiFab& Ex, const MultiFab& Ey, - const MultiFab& Ez, const MultiFab& Bx, - const MultiFab& By, const MultiFab& Bz) -{ - for (auto& pc : allcontainers) { - pc->FieldGather(lev, Ex, Ey, Ez, Bx, By, Bz); - } -} - -void MultiParticleContainer::Evolve (int lev, const MultiFab& Ex, const MultiFab& Ey, const MultiFab& Ez, const MultiFab& Bx, const MultiFab& By, const MultiFab& Bz, @@ -634,7 +623,13 @@ MultiParticleContainer::getSpeciesID (std::string product_str) const } void -MultiParticleContainer::doFieldIonization () +MultiParticleContainer::doFieldIonization (int lev, + const MultiFab& Ex, + const MultiFab& Ey, + const MultiFab& Ez, + const MultiFab& Bx, + const MultiFab& By, + const MultiFab& Bz) { WARPX_PROFILE("MPC::doFieldIonization"); @@ -649,31 +644,31 @@ MultiParticleContainer::doFieldIonization () SmartCopyFactory copy_factory(*pc_source, *pc_product); auto phys_pc_ptr = static_cast<PhysicalParticleContainer*>(pc_source.get()); - auto Filter = phys_pc_ptr->getIonizationFunc(); auto Copy = copy_factory.getSmartCopy(); auto Transform = IonizationTransformFunc(); pc_source ->defineAllParticleTiles(); pc_product->defineAllParticleTiles(); - for (int lev = 0; lev <= pc_source->finestLevel(); ++lev) - { - const auto info = getMFItInfo(*pc_source, *pc_product); + auto info = getMFItInfo(*pc_source, *pc_product); #ifdef _OPENMP #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); - auto& dst_tile = pc_product->ParticlesAt(lev, mfi); + for (WarpXParIter pti(*pc_source, lev, info); pti.isValid(); ++pti) + { + auto& src_tile = pc_source ->ParticlesAt(lev, pti); + auto& dst_tile = pc_product->ParticlesAt(lev, pti); - const auto np_dst = dst_tile.numParticles(); - const auto num_added = filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst, - Filter, Copy, Transform); + auto Filter = phys_pc_ptr->getIonizationFunc(pti, lev, Ex.nGrow(), + Ex[pti], Ey[pti], Ez[pti], + Bx[pti], By[pti], Bz[pti]); - setNewParticleIDs(dst_tile, np_dst, num_added); - } + const auto np_dst = dst_tile.numParticles(); + const auto num_added = filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst, + Filter, Copy, Transform); + + setNewParticleIDs(dst_tile, np_dst, num_added); } } } @@ -1126,15 +1121,27 @@ MultiParticleContainer::doQEDSchwinger () } } -void MultiParticleContainer::doQedEvents() +void MultiParticleContainer::doQedEvents (int lev, + const MultiFab& Ex, + const MultiFab& Ey, + const MultiFab& Ez, + const MultiFab& Bx, + const MultiFab& By, + const MultiFab& Bz) { WARPX_PROFILE("MPC::doQedEvents"); - doQedBreitWheeler(); - doQedQuantumSync(); + doQedBreitWheeler(lev, Ex, Ey, Ez, Bx, By, Bz); + doQedQuantumSync(lev, Ex, Ey, Ez, Bx, By, Bz); } -void MultiParticleContainer::doQedBreitWheeler() +void MultiParticleContainer::doQedBreitWheeler (int lev, + const MultiFab& Ex, + const MultiFab& Ey, + const MultiFab& Ez, + const MultiFab& Bx, + const MultiFab& By, + const MultiFab& Bz) { WARPX_PROFILE("MPC::doQedBreitWheeler"); @@ -1160,40 +1167,48 @@ void MultiParticleContainer::doQedBreitWheeler() const auto CopyPos = copy_factory_pos.getSmartCopy(); const auto pair_gen_functor = m_shr_p_bw_engine->build_pair_functor(); - auto Transform = PairGenerationTransformFunc(pair_gen_functor); pc_source ->defineAllParticleTiles(); pc_product_pos->defineAllParticleTiles(); pc_product_ele->defineAllParticleTiles(); - for (int lev = 0; lev <= pc_source->finestLevel(); ++lev) - { - const auto info = getMFItInfo(*pc_source, *pc_product_ele, *pc_product_pos); + auto info = getMFItInfo(*pc_source, *pc_product_ele, *pc_product_pos); #ifdef _OPENMP #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); - auto& dst_ele_tile = pc_product_ele->ParticlesAt(lev, mfi); - auto& dst_pos_tile = pc_product_pos->ParticlesAt(lev, mfi); - - const auto np_dst_ele = dst_ele_tile.numParticles(); - const auto np_dst_pos = dst_pos_tile.numParticles(); - const auto num_added = filterCopyTransformParticles<1>( - dst_ele_tile, dst_pos_tile, - src_tile, np_dst_ele, np_dst_pos, - Filter, CopyEle, CopyPos, Transform); - - setNewParticleIDs(dst_ele_tile, np_dst_ele, num_added); - setNewParticleIDs(dst_pos_tile, np_dst_pos, num_added); - } + for (WarpXParIter pti(*pc_source, lev, info); pti.isValid(); ++pti) + { + auto Transform = PairGenerationTransformFunc(pair_gen_functor, + pti, lev, Ex.nGrow(), + Ex[pti], Ey[pti], Ez[pti], + Bx[pti], By[pti], Bz[pti], + pc_source->get_v_galilean()); + + auto& src_tile = pc_source->ParticlesAt(lev, pti); + auto& dst_ele_tile = pc_product_ele->ParticlesAt(lev, pti); + auto& dst_pos_tile = pc_product_pos->ParticlesAt(lev, pti); + + const auto np_dst_ele = dst_ele_tile.numParticles(); + const auto np_dst_pos = dst_pos_tile.numParticles(); + const auto num_added = filterCopyTransformParticles<1>( + dst_ele_tile, dst_pos_tile, + src_tile, np_dst_ele, np_dst_pos, + Filter, CopyEle, CopyPos, Transform); + + setNewParticleIDs(dst_ele_tile, np_dst_ele, num_added); + setNewParticleIDs(dst_pos_tile, np_dst_pos, num_added); } - } + } } -void MultiParticleContainer::doQedQuantumSync() +void MultiParticleContainer::doQedQuantumSync (int lev, + const MultiFab& Ex, + const MultiFab& Ey, + const MultiFab& Ez, + const MultiFab& Bx, + const MultiFab& By, + const MultiFab& Bz) { WARPX_PROFILE("MPC::doQedEvents::doQedQuantumSync"); @@ -1204,7 +1219,7 @@ void MultiParticleContainer::doQedQuantumSync() for (auto& pc_source : allcontainers){ if(!pc_source->has_quantum_sync()){ continue; } - // Get product species + // Get product species auto& pc_product_phot = allcontainers[pc_source->m_qed_quantum_sync_phot_product]; @@ -1215,42 +1230,41 @@ void MultiParticleContainer::doQedQuantumSync() const auto Filter = phys_pc_ptr->getPhotonEmissionFilterFunc(); const auto CopyPhot = copy_factory_phot.getSmartCopy(); - auto Transform = PhotonEmissionTransformFunc( - m_shr_p_qs_engine->build_optical_depth_functor(), - pc_source->particle_runtime_comps["optical_depth_QSR"], - m_shr_p_qs_engine->build_phot_em_functor()); - pc_source ->defineAllParticleTiles(); pc_product_phot->defineAllParticleTiles(); - for (int lev = 0; lev <= pc_source->finestLevel(); ++lev) - { - const auto info = getMFItInfo(*pc_source, *pc_product_phot); + auto info = getMFItInfo(*pc_source, *pc_product_phot); #ifdef _OPENMP #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); - auto& dst_tile = pc_product_phot->ParticlesAt(lev, mfi); + for (WarpXParIter pti(*pc_source, lev, info); pti.isValid(); ++pti) + { + auto Transform = PhotonEmissionTransformFunc( + m_shr_p_qs_engine->build_optical_depth_functor(), + pc_source->particle_runtime_comps["optical_depth_QSR"], + m_shr_p_qs_engine->build_phot_em_functor(), + pti, lev, Ex.nGrow(), + Ex[pti], Ey[pti], Ez[pti], + Bx[pti], By[pti], Bz[pti], + pc_source->get_v_galilean()); - const auto np_dst = dst_tile.numParticles(); + auto& src_tile = pc_source->ParticlesAt(lev, pti); + auto& dst_tile = pc_product_phot->ParticlesAt(lev, pti); - const auto num_added = - filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst, - Filter, CopyPhot, Transform); + const auto np_dst = dst_tile.numParticles(); - setNewParticleIDs(dst_tile, np_dst, num_added); + const auto num_added = + filterCopyTransformParticles<1>(dst_tile, src_tile, np_dst, + Filter, CopyPhot, Transform); - cleanLowEnergyPhotons( - dst_tile, np_dst, num_added, - m_quantum_sync_photon_creation_energy_threshold); + setNewParticleIDs(dst_tile, np_dst, num_added); - } + cleanLowEnergyPhotons( + dst_tile, np_dst, num_added, + m_quantum_sync_photon_creation_energy_threshold); } } - } void MultiParticleContainer::CheckQEDProductSpecies() |