aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/MultiParticleContainer.cpp
diff options
context:
space:
mode:
authorGravatar Dave Grote <grote1@llnl.gov> 2019-05-14 15:07:00 -0700
committerGravatar Dave Grote <grote1@llnl.gov> 2019-05-14 15:07:00 -0700
commit57678539e60513c8bb05035b7a20aca57d3afc0c (patch)
tree3131de5e287c31819c77730ce194c9534e9ada22 /Source/Particles/MultiParticleContainer.cpp
parent12ffd463b41c0819573ea2692d035914c47841ab (diff)
parent88466008b28521d28194f1091ee367d6fbcef8a1 (diff)
downloadWarpX-57678539e60513c8bb05035b7a20aca57d3afc0c.tar.gz
WarpX-57678539e60513c8bb05035b7a20aca57d3afc0c.tar.zst
WarpX-57678539e60513c8bb05035b7a20aca57d3afc0c.zip
Merge branch 'dev' into RZgeometry
Diffstat (limited to 'Source/Particles/MultiParticleContainer.cpp')
-rw-r--r--Source/Particles/MultiParticleContainer.cpp94
1 files changed, 83 insertions, 11 deletions
diff --git a/Source/Particles/MultiParticleContainer.cpp b/Source/Particles/MultiParticleContainer.cpp
index a4df1f83a..6d618c096 100644
--- a/Source/Particles/MultiParticleContainer.cpp
+++ b/Source/Particles/MultiParticleContainer.cpp
@@ -31,16 +31,31 @@ MultiParticleContainer::MultiParticleContainer (AmrCore* amr_core)
pc_tmp.reset(new PhysicalParticleContainer(amr_core));
- if (WarpX::do_boosted_frame_diagnostic && WarpX::do_boosted_frame_particles)
+ // Compute the number of species for which lab-frame data is dumped
+ // nspecies_lab_frame_diags, and map their ID to MultiParticleContainer
+ // particle IDs in map_species_lab_diags.
+ map_species_boosted_frame_diags.resize(nspecies);
+ nspecies_boosted_frame_diags = 0;
+ for (int i=0; i<nspecies; i++){
+ auto& pc = allcontainers[i];
+ if (pc->do_boosted_frame_diags){
+ map_species_boosted_frame_diags[nspecies_boosted_frame_diags] = i;
+ do_boosted_frame_diags = 1;
+ nspecies_boosted_frame_diags += 1;
+ }
+ }
+
+ if (WarpX::do_boosted_frame_diagnostic && do_boosted_frame_diags)
{
- for (int i = 0; i < nspecies + nlasers; ++i)
+ for (int i = 0; i < nspecies_boosted_frame_diags; ++i)
{
- allcontainers[i]->AddRealComp("xold");
- allcontainers[i]->AddRealComp("yold");
- allcontainers[i]->AddRealComp("zold");
- allcontainers[i]->AddRealComp("uxold");
- allcontainers[i]->AddRealComp("uyold");
- allcontainers[i]->AddRealComp("uzold");
+ int is = map_species_boosted_frame_diags[i];
+ allcontainers[is]->AddRealComp("xold");
+ allcontainers[is]->AddRealComp("yold");
+ allcontainers[is]->AddRealComp("zold");
+ allcontainers[is]->AddRealComp("uxold");
+ allcontainers[is]->AddRealComp("uyold");
+ allcontainers[is]->AddRealComp("uzold");
}
pc_tmp->AddRealComp("xold");
pc_tmp->AddRealComp("yold");
@@ -376,13 +391,25 @@ MultiParticleContainer
BL_PROFILE("MultiParticleContainer::GetLabFrameData");
- for (int i = 0; i < nspecies; ++i){
- WarpXParticleContainer* pc = allcontainers[i].get();
+ // Loop over particle species
+ for (int i = 0; i < nspecies_boosted_frame_diags; ++i){
+ int isp = map_species_boosted_frame_diags[i];
+ WarpXParticleContainer* pc = allcontainers[isp].get();
WarpXParticleContainer::DiagnosticParticles diagnostic_particles;
pc->GetParticleSlice(direction, z_old, z_new, t_boost, t_lab, dt, diagnostic_particles);
-
+ // Here, diagnostic_particles[lev][index] is a WarpXParticleContainer::DiagnosticParticleData
+ // where "lev" is the AMR level and "index" is a [grid index][tile index] pair.
+
+ // Loop over AMR levels
for (int lev = 0; lev <= pc->finestLevel(); ++lev){
+ // Loop over [grid index][tile index] pairs
+ // and Fills parts[species number i] with particle data from all grids and
+ // tiles in diagnostic_particles. parts contains particles from all
+ // AMR levels indistinctly.
for (auto it = diagnostic_particles[lev].begin(); it != diagnostic_particles[lev].end(); ++it){
+ // it->first is the [grid index][tile index] key
+ // it->second is the corresponding
+ // WarpXParticleContainer::DiagnosticParticleData value
parts[i].GetRealData(DiagIdx::w).insert( parts[i].GetRealData(DiagIdx::w ).end(),
it->second.GetRealData(DiagIdx::w ).begin(),
it->second.GetRealData(DiagIdx::w ).end());
@@ -414,3 +441,48 @@ MultiParticleContainer
}
}
}
+
+/* \brief Continuous injection for particles initially outside of the domain.
+ * \param injection_box: Domain where new particles should be injected.
+ * Loop over all WarpXParticleContainer in MultiParticleContainer and
+ * calls virtual function ContinuousInjection.
+ */
+void
+MultiParticleContainer::ContinuousInjection(const RealBox& injection_box) const
+{
+ for (int i=0; i<nspecies+nlasers; i++){
+ auto& pc = allcontainers[i];
+ if (pc->do_continuous_injection){
+ pc->ContinuousInjection(injection_box);
+ }
+ }
+}
+
+/* \brief Update position of continuous injection parameters.
+ * \param dt: simulation time step (level 0)
+ * All classes inherited from WarpXParticleContainer do not have
+ * a position to update (PhysicalParticleContainer does not do anything).
+ */
+void
+MultiParticleContainer::UpdateContinuousInjectionPosition(Real dt) const
+{
+ for (int i=0; i<nspecies+nlasers; i++){
+ auto& pc = allcontainers[i];
+ if (pc->do_continuous_injection){
+ pc->UpdateContinuousInjectionPosition(dt);
+ }
+ }
+}
+
+int
+MultiParticleContainer::doContinuousInjection() const
+{
+ int warpx_do_continuous_injection = 0;
+ for (int i=0; i<nspecies+nlasers; i++){
+ auto& pc = allcontainers[i];
+ if (pc->do_continuous_injection){
+ warpx_do_continuous_injection = 1;
+ }
+ }
+ return warpx_do_continuous_injection;
+}