diff options
author | 2019-12-18 10:59:51 -0800 | |
---|---|---|
committer | 2019-12-18 10:59:51 -0800 | |
commit | 3e39a37f37e693308d54791f9ce4320cf368ea83 (patch) | |
tree | 1750c993071686de44c06ae41cb33e7f815b3781 /Source/Particles/MultiParticleContainer.cpp | |
parent | d76fa513ff75ee723de8b8a055f8106105fbe058 (diff) | |
parent | 38b593dcb880fc292caa5fb3e2c75baa5d0b61d3 (diff) | |
download | WarpX-3e39a37f37e693308d54791f9ce4320cf368ea83.tar.gz WarpX-3e39a37f37e693308d54791f9ce4320cf368ea83.tar.zst WarpX-3e39a37f37e693308d54791f9ce4320cf368ea83.zip |
Merge pull request #539 from Yin-YinjianZhao/collision
Adding Collision Module into WarpX
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r-- | Source/Particles/MultiParticleContainer.cpp | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp index bf1ffb74e..d84bc1afa 100644 --- a/Source/Particles/MultiParticleContainer.cpp +++ b/Source/Particles/MultiParticleContainer.cpp @@ -54,6 +54,14 @@ MultiParticleContainer::MultiParticleContainer (AmrCore* amr_core) } } ionization_process = IonizationProcess(); + + // collision + allcollisions.resize(ncollisions); + for (int i = 0; i < ncollisions; ++i) { + allcollisions[i].reset + (new CollisionType(species_names, collision_names[i])); + } + } void @@ -120,6 +128,15 @@ MultiParticleContainer::ReadParameters () } } + // collision + ParmParse pc("collisions"); + pc.query("ncollisions", ncollisions); + BL_ASSERT(ncollisions >= 0); + if (ncollisions > 0) { + pc.getarr("collision_names", collision_names); + BL_ASSERT(collision_names.size() == ncollisions); + } + } pp.query("use_fdtd_nci_corr", WarpX::use_fdtd_nci_corr); @@ -609,6 +626,40 @@ MultiParticleContainer::doFieldIonization () } // pc_source } +void +MultiParticleContainer::doCoulombCollisions () +{ + BL_PROFILE("MPC::doCoulombCollisions"); + + for (int i = 0; i < ncollisions; ++i) + { + auto& species1 = allcontainers[ allcollisions[i]->m_species1_index ]; + auto& species2 = allcontainers[ allcollisions[i]->m_species2_index ]; + + // Enable tiling + MFItInfo info; + if (Gpu::notInLaunchRegion()) info.EnableTiling(species1->tile_size); + + // Loop over refinement levels + for (int lev = 0; lev <= species1->finestLevel(); ++lev){ + + // Loop over all grids/tiles at this level +#ifdef _OPENMP + info.SetDynamic(true); + #pragma omp parallel if (Gpu::notInLaunchRegion()) +#endif + for (MFIter mfi = species1->MakeMFIter(lev, info); mfi.isValid(); ++mfi){ + + CollisionType::doCoulombCollisionsWithinTile + ( lev, mfi, species1, species2, + allcollisions[i]->m_isSameSpecies, + allcollisions[i]->m_CoulombLog ); + + } + } + } +} + #ifdef WARPX_QED void MultiParticleContainer::InitQED () { |