aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp55
1 files changed, 55 insertions, 0 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index 55768c6fc..f6f9ab1a2 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -54,6 +54,13 @@ 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 +127,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 +625,45 @@ MultiParticleContainer::doFieldIonization ()
} // pc_source
}
+void
+MultiParticleContainer::doCoulombCollisions ()
+{
+ BL_PROFILE("MPC::doCoulombCollisions");
+
+ for (int i = 0; i < ncollisions; ++i)
+ {
+ // At this point, the code always collides the first and second species
+ // TODO: Read the user input to read the different types of collisions requested
+ // and loop over all types of collisions, selecting each time the
+ // two types of species that will be collided
+ // auto& species1 = allcontainers[0];
+ // auto& species2 = allcontainers[1];
+ 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
+#endif
+ for (MFIter mfi = species1->MakeMFIter(lev, info); mfi.isValid(); ++mfi){
+
+ CollisionType::doCoulombCollisionsWithinTile
+ ( lev, mfi, species1, species2,
+ allcollisions[i]->m_isSameSpecies );
+
+ }
+ }
+ }
+}
+
#ifdef WARPX_QED
void MultiParticleContainer::InitQED ()
{