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.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.cpp b/Source/Particles/PhysicalParticleContainer.cpp
index d489cddfe..c704e824a 100644
--- a/Source/Particles/PhysicalParticleContainer.cpp
+++ b/Source/Particles/PhysicalParticleContainer.cpp
@@ -230,6 +230,19 @@ PhysicalParticleContainer::PhysicalParticleContainer (AmrCore* amr_core, int isp
}
#endif
+ // If old particle positions should be saved add the needed components
+ pp_species_name.query("save_previous_position", m_save_previous_position);
+ if (m_save_previous_position) {
+ AddRealComp("prev_x");
+#if (AMREX_SPACEDIM == 3)
+ AddRealComp("prev_y");
+#endif
+ AddRealComp("prev_z");
+#ifdef WARPX_DIM_RZ
+ amrex::Abort("Saving previous particle positions not yet implemented in RZ");
+#endif
+ }
+
// Get Galilean velocity
ParmParse pp_psatd("psatd");
bool use_default_v_galilean = false;
@@ -2317,6 +2330,20 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti,
ion_lev = pti.GetiAttribs(particle_icomps["ionization_level"]).dataPtr();
}
+ const bool save_previous_position = m_save_previous_position;
+ ParticleReal* x_old = nullptr;
+ ParticleReal* y_old = nullptr;
+ ParticleReal* z_old = nullptr;
+ if (save_previous_position) {
+ x_old = pti.GetAttribs(particle_comps["prev_x"]).dataPtr();
+#if (AMREX_SPACEDIM == 3)
+ y_old = pti.GetAttribs(particle_comps["prev_y"]).dataPtr();
+#else
+ amrex::ignore_unused(y_old);
+#endif
+ z_old = pti.GetAttribs(particle_comps["prev_z"]).dataPtr();
+ }
+
// Loop over the particles and update their momentum
const amrex::Real q = this->charge;
const amrex::Real m = this-> mass;
@@ -2344,6 +2371,14 @@ PhysicalParticleContainer::PushPX (WarpXParIter& pti,
amrex::ParticleReal xp, yp, zp;
getPosition(ip, xp, yp, zp);
+ if (save_previous_position) {
+ x_old[ip] = xp;
+#if (AMREX_SPACEDIM == 3)
+ y_old[ip] = yp;
+#endif
+ z_old[ip] = zp;
+ }
+
amrex::ParticleReal Exp = 0._rt, Eyp = 0._rt, Ezp = 0._rt;
amrex::ParticleReal Bxp = 0._rt, Byp = 0._rt, Bzp = 0._rt;