aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/PhysicalParticleContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/PhysicalParticleContainer.cpp')
-rw-r--r--Source/Particles/PhysicalParticleContainer.cpp103
1 files changed, 11 insertions, 92 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index 588f8f0ae..6572657ff 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -375,19 +375,7 @@ PhysicalParticleContainer::AddPlasma (int lev, RealBox part_realbox)
scale_fac = dx[0]*dx[1]/num_ppc;
#endif
-#ifdef _OPENMP
- // First touch all tiles in the map in serial
- for (MFIter mfi = MakeMFIter(lev); mfi.isValid(); ++mfi) {
- auto index = std::make_pair(mfi.index(), mfi.LocalTileIndex());
- GetParticles(lev)[index];
- tmp_particle_data.resize(finestLevel()+1);
- // Create map entry if not there
- tmp_particle_data[lev][index];
- if ( (NumRuntimeRealComps()>0) || (NumRuntimeIntComps()>0) ) {
- DefineAndReturnParticleTile(lev, mfi.index(), mfi.LocalTileIndex());
- }
- }
-#endif
+ defineAllParticleTiles();
MultiFab* cost = WarpX::getCosts(lev);
@@ -2338,86 +2326,17 @@ void PhysicalParticleContainer::InitIonizationModule ()
}
}
-/* \brief create mask of ionized particles (1 if ionized, 0 otherwise)
- *
- * \param mfi: tile or grid
- * \param lev: MR level
- * \param ionization_mask: Array with as many elements as particles in mfi.
- * This function initialized the array, and set each element to 1 or 0
- * depending on whether the particle is ionized or not.
- */
-void
-PhysicalParticleContainer::buildIonizationMask (const amrex::MFIter& mfi, const int lev,
- amrex::Gpu::ManagedDeviceVector<int>& ionization_mask)
+IonizationFilterFunc
+PhysicalParticleContainer::getIonizationFunc ()
{
- BL_PROFILE("PPC::buildIonizationMask");
- // Get pointers to ionization data from pc_source
- const Real * const AMREX_RESTRICT p_ionization_energies = ionization_energies.dataPtr();
- const Real * const AMREX_RESTRICT p_adk_prefactor = adk_prefactor.dataPtr();
- const Real * const AMREX_RESTRICT p_adk_exp_prefactor = adk_exp_prefactor.dataPtr();
- const Real * const AMREX_RESTRICT p_adk_power = adk_power.dataPtr();
-
- // Current tile info
- const int grid_id = mfi.index();
- const int tile_id = mfi.LocalTileIndex();
-
- // Get GPU-friendly arrays of particle data
- auto& ptile = GetParticles(lev)[std::make_pair(grid_id,tile_id)];
- // Only need attribs (i.e., SoA data)
- auto& soa = ptile.GetStructOfArrays();
- const int np = ptile.GetArrayOfStructs().size();
-
- // If no particle, nothing to do.
- if (np == 0) return;
- // Otherwise, resize ionization_mask, and get poiters to attribs arrays.
- ionization_mask.resize(np);
- int * const AMREX_RESTRICT p_ionization_mask = ionization_mask.data();
- const ParticleReal * const AMREX_RESTRICT ux = soa.GetRealData(PIdx::ux).data();
- const ParticleReal * const AMREX_RESTRICT uy = soa.GetRealData(PIdx::uy).data();
- const ParticleReal * const AMREX_RESTRICT uz = soa.GetRealData(PIdx::uz).data();
- const ParticleReal * const AMREX_RESTRICT ex = soa.GetRealData(PIdx::Ex).data();
- const ParticleReal * const AMREX_RESTRICT ey = soa.GetRealData(PIdx::Ey).data();
- const ParticleReal * const AMREX_RESTRICT ez = soa.GetRealData(PIdx::Ez).data();
- const ParticleReal * const AMREX_RESTRICT bx = soa.GetRealData(PIdx::Bx).data();
- const ParticleReal * const AMREX_RESTRICT by = soa.GetRealData(PIdx::By).data();
- const ParticleReal * const AMREX_RESTRICT bz = soa.GetRealData(PIdx::Bz).data();
- int* ion_lev = soa.GetIntData(particle_icomps["ionization_level"]).data();
-
- Real c = PhysConst::c;
- Real c2_inv = 1./c/c;
- int atomic_number = ion_atomic_number;
-
- // Loop over all particles in grid/tile. If ionized, set mask to 1
- // and increment ionization level.
- ParallelFor(
- np,
- [=] AMREX_GPU_DEVICE (long i) {
- // Get index of ionization_level
- p_ionization_mask[i] = 0;
- if ( ion_lev[i]<atomic_number ){
- Real random_draw = amrex::Random();
- // Compute electric field amplitude in the particle's frame of
- // reference (particularly important when in boosted frame).
- Real ga = std::sqrt(1. + (ux[i]*ux[i] + uy[i]*uy[i] + uz[i]*uz[i]) * c2_inv);
- Real E = std::sqrt(
- - ( ux[i]*ex[i] + uy[i]*ey[i] + uz[i]*ez[i] ) * ( ux[i]*ex[i] + uy[i]*ey[i] + uz[i]*ez[i] ) * c2_inv
- + ( ga *ex[i] + uy[i]*bz[i] - uz[i]*by[i] ) * ( ga *ex[i] + uy[i]*bz[i] - uz[i]*by[i] )
- + ( ga *ey[i] + uz[i]*bx[i] - ux[i]*bz[i] ) * ( ga *ey[i] + uz[i]*bx[i] - ux[i]*bz[i] )
- + ( ga *ez[i] + ux[i]*by[i] - uy[i]*bx[i] ) * ( ga *ez[i] + ux[i]*by[i] - uy[i]*bx[i] )
- );
- // Compute probability of ionization p
- Real w_dtau = 1./ ga * p_adk_prefactor[ion_lev[i]] *
- std::pow(E,p_adk_power[ion_lev[i]]) *
- std::exp( p_adk_exp_prefactor[ion_lev[i]]/E );
- Real p = 1. - std::exp( - w_dtau );
-
- if (random_draw < p){
- // update mask
- p_ionization_mask[i] = 1;
- }
- }
- }
- );
+ BL_PROFILE("PPC::getIonizationFunc");
+
+ return IonizationFilterFunc{ionization_energies.dataPtr(),
+ adk_prefactor.dataPtr(),
+ adk_exp_prefactor.dataPtr(),
+ adk_power.dataPtr(),
+ particle_icomps["ionization_level"],
+ ion_atomic_number};
}
//This function return true if the PhysicalParticleContainer contains electrons