aboutsummaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
Diffstat (limited to 'Source')
-rw-r--r--Source/Diagnostics/ReducedDiags/FieldProbe.H6
-rw-r--r--Source/Diagnostics/ReducedDiags/FieldProbe.cpp41
-rw-r--r--Source/Particles/Pusher/GetAndSetPosition.H4
3 files changed, 48 insertions, 3 deletions
diff --git a/Source/Diagnostics/ReducedDiags/FieldProbe.H b/Source/Diagnostics/ReducedDiags/FieldProbe.H
index 15c5d18f2..27c526187 100644
--- a/Source/Diagnostics/ReducedDiags/FieldProbe.H
+++ b/Source/Diagnostics/ReducedDiags/FieldProbe.H
@@ -76,6 +76,9 @@ private:
//! counts number of particles for all MPI ranks
long m_valid_particles {0};
+ //! remember the last time @see ComputeDiags was called to count the number of steps in between (for non-integrated detectors)
+ int m_last_compute_step = 0;
+
//! determines geometry of detector point distribution
DetectorGeometry m_probe_geometry = DetectorGeometry::Point;
@@ -100,6 +103,9 @@ private:
//! Judges whether to gather raw fields or interpolated data
bool raw_fields = false;
+ //! Judges whether to follow a moving window
+ bool do_moving_window_FP = false;
+
/**
* Built-in function in ReducedDiags to write out test data
*/
diff --git a/Source/Diagnostics/ReducedDiags/FieldProbe.cpp b/Source/Diagnostics/ReducedDiags/FieldProbe.cpp
index 531e044c1..ff2327bfd 100644
--- a/Source/Diagnostics/ReducedDiags/FieldProbe.cpp
+++ b/Source/Diagnostics/ReducedDiags/FieldProbe.cpp
@@ -8,6 +8,8 @@
#include "FieldProbe.H"
#include "FieldProbeParticleContainer.H"
#include "Particles/Gather/FieldGather.H"
+#include "Particles/Pusher/GetAndSetPosition.H"
+#include "Particles/Pusher/UpdatePosition.H"
#include "Utils/IntervalsParser.H"
#include "Utils/TextMsg.H"
@@ -147,6 +149,7 @@ FieldProbe::FieldProbe (std::string rd_name)
pp_rd_name.query("integrate", m_field_probe_integrate);
pp_rd_name.query("raw_fields", raw_fields);
pp_rd_name.query("interp_order", interp_order);
+ pp_rd_name.query("do_moving_window_FP", do_moving_window_FP);
if (WarpX::gamma_boost > 1.0_rt)
{
@@ -385,6 +388,18 @@ void FieldProbe::ComputeDiags (int step)
{
const amrex::Geometry& gm = warpx.Geom(lev);
const auto prob_lo = gm.ProbLo();
+ amrex::Real const dt = WarpX::GetInstance().getdt(lev);
+ // Calculates particle movement in moving window sims
+ amrex::Real move_dist = 0.0;
+ bool const update_particles_moving_window =
+ do_moving_window_FP &&
+ step > warpx.start_moving_window_step &&
+ step <= warpx.end_moving_window_step;
+ if (update_particles_moving_window)
+ {
+ int step_diff = step - m_last_compute_step;
+ move_dist = dt*warpx.moving_window_v*step_diff;
+ }
// get MultiFab data at lev
const amrex::MultiFab &Ex = warpx.getEfield(lev, 0);
@@ -426,8 +441,30 @@ void FieldProbe::ComputeDiags (int step)
for (MyParIter pti(m_probe, lev); pti.isValid(); ++pti)
{
const auto getPosition = GetParticlePosition(pti);
- auto const np = pti.numParticles();
+ auto setPosition = SetParticlePosition(pti);
+ auto const np = pti.numParticles();
+ if (update_particles_moving_window)
+ {
+ const auto temp_warpx_moving_window = warpx.moving_window_dir;
+ amrex::ParallelFor( np, [=] AMREX_GPU_DEVICE (long ip)
+ {
+ amrex::ParticleReal xp, yp, zp;
+ getPosition(ip, xp, yp, zp);
+ if (temp_warpx_moving_window == 0)
+ {
+ setPosition(ip, xp+move_dist, yp, zp);
+ }
+ if (temp_warpx_moving_window == 1)
+ {
+ setPosition(ip, xp, yp+move_dist, zp);
+ }
+ if (temp_warpx_moving_window == WARPX_ZINDEX)
+ {
+ setPosition(ip, xp, yp, zp+move_dist);
+ }
+ });
+ }
if( ProbeInDomain() )
{
const auto cell_size = gm.CellSizeArray();
@@ -478,7 +515,6 @@ void FieldProbe::ComputeDiags (int step)
const int temp_interp_order = interp_order;
const bool temp_raw_fields = raw_fields;
const bool temp_field_probe_integrate = m_field_probe_integrate;
- amrex::Real const dt = WarpX::GetInstance().getdt(lev);
// Interpolating to the probe positions for each particle
amrex::ParallelFor( np, [=] AMREX_GPU_DEVICE (long ip)
@@ -613,6 +649,7 @@ void FieldProbe::ComputeDiags (int step)
}// end loop over refinement levels
// make sure data is in m_data on the IOProcessor
// TODO: In the future, we want to use a parallel I/O method instead (plotfiles or openPMD)
+ m_last_compute_step = step;
} // end void FieldProbe::ComputeDiags
void FieldProbe::WriteToFile (int step) const
diff --git a/Source/Particles/Pusher/GetAndSetPosition.H b/Source/Particles/Pusher/GetAndSetPosition.H
index 58dbe02c1..406789579 100644
--- a/Source/Particles/Pusher/GetAndSetPosition.H
+++ b/Source/Particles/Pusher/GetAndSetPosition.H
@@ -155,7 +155,9 @@ struct SetParticlePosition
#if defined(WARPX_DIM_RZ)
RType* AMREX_RESTRICT m_theta;
#endif
- SetParticlePosition (WarpXParIter& a_pti, int a_offset = 0) noexcept
+
+ template <typename ptiType>
+ SetParticlePosition (const ptiType& a_pti, int a_offset = 0) noexcept
{
auto& aos = a_pti.GetArrayOfStructs();
m_structs = aos().dataPtr() + a_offset;