aboutsummaryrefslogtreecommitdiff
path: root/Source/Particles/PhysicalParticleContainer.H
diff options
context:
space:
mode:
Diffstat (limited to 'Source/Particles/PhysicalParticleContainer.H')
-rw-r--r--Source/Particles/PhysicalParticleContainer.H127
1 files changed, 127 insertions, 0 deletions
diff --git a/Source/Particles/PhysicalParticleContainer.H b/Source/Particles/PhysicalParticleContainer.H
new file mode 100644
index 000000000..5847a6359
--- /dev/null
+++ b/Source/Particles/PhysicalParticleContainer.H
@@ -0,0 +1,127 @@
+#ifndef WARPX_PhysicalParticleContainer_H_
+#define WARPX_PhysicalParticleContainer_H_
+
+#include <map>
+
+#include <AMReX_IArrayBox.H>
+
+#include <PlasmaInjector.H>
+#include <WarpXParticleContainer.H>
+
+class PhysicalParticleContainer
+ : public WarpXParticleContainer
+{
+public:
+ PhysicalParticleContainer (amrex::AmrCore* amr_core,
+ int ispecies,
+ const std::string& name);
+
+ PhysicalParticleContainer (amrex::AmrCore* amr_core);
+
+ virtual ~PhysicalParticleContainer () {}
+
+ virtual void InitData () override;
+
+#ifdef WARPX_DO_ELECTROSTATIC
+ virtual void FieldGatherES(const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
+ const amrex::Vector<std::unique_ptr<amrex::FabArray<amrex::BaseFab<int> > > >& masks) override;
+
+ virtual void EvolveES (const amrex::Vector<std::array<std::unique_ptr<amrex::MultiFab>, 3> >& E,
+ amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
+ amrex::Real t, amrex::Real dt) override;
+#endif // WARPX_DO_ELECTROSTATIC
+
+ virtual void FieldGather(int lev,
+ const amrex::MultiFab& Ex,
+ const amrex::MultiFab& Ey,
+ const amrex::MultiFab& Ez,
+ const amrex::MultiFab& Bx,
+ const amrex::MultiFab& By,
+ const amrex::MultiFab& Bz) final;
+
+ virtual void Evolve (int lev,
+ const amrex::MultiFab& Ex,
+ const amrex::MultiFab& Ey,
+ const amrex::MultiFab& Ez,
+ const amrex::MultiFab& Bx,
+ const amrex::MultiFab& By,
+ const amrex::MultiFab& Bz,
+ amrex::MultiFab& jx,
+ amrex::MultiFab& jy,
+ amrex::MultiFab& jz,
+ amrex::MultiFab* cjx,
+ amrex::MultiFab* cjy,
+ amrex::MultiFab* cjz,
+ amrex::MultiFab* rho,
+ amrex::MultiFab* crho,
+ const amrex::MultiFab* cEx,
+ const amrex::MultiFab* cEy,
+ const amrex::MultiFab* cEz,
+ const amrex::MultiFab* cBx,
+ const amrex::MultiFab* cBy,
+ const amrex::MultiFab* cBz,
+ amrex::Real t,
+ amrex::Real dt) override;
+
+ virtual void PushPX(WarpXParIter& pti,
+ amrex::Cuda::DeviceVector<amrex::Real>& xp,
+ amrex::Cuda::DeviceVector<amrex::Real>& yp,
+ amrex::Cuda::DeviceVector<amrex::Real>& zp,
+ amrex::Cuda::DeviceVector<amrex::Real>& giv,
+ amrex::Real dt);
+
+ virtual void PushP (int lev, amrex::Real dt,
+ const amrex::MultiFab& Ex,
+ const amrex::MultiFab& Ey,
+ const amrex::MultiFab& Ez,
+ const amrex::MultiFab& Bx,
+ const amrex::MultiFab& By,
+ const amrex::MultiFab& Bz) override;
+
+ virtual void PostRestart () final {}
+
+ void SplitParticles(int lev);
+
+ // Inject particles in Box 'part_box'
+ virtual void AddParticles (int lev);
+ void AddPlasma(int lev, amrex::RealBox part_realbox = amrex::RealBox());
+ void AddPlasmaCPU (int lev, amrex::RealBox part_realbox);
+#ifdef AMREX_USE_GPU
+ void AddPlasmaGPU (int lev, amrex::RealBox part_realbox);
+#endif
+
+ void MapParticletoBoostedFrame(amrex::Real& x, amrex::Real& y, amrex::Real& z, std::array<amrex::Real, 3>& u);
+
+ void AddGaussianBeam(amrex::Real x_m, amrex::Real y_m, amrex::Real z_m,
+ amrex::Real x_rms, amrex::Real y_rms, amrex::Real z_rms,
+ amrex::Real q_tot, long npart);
+
+ virtual void GetParticleSlice(const int direction, const amrex::Real z_old,
+ const amrex::Real z_new, const amrex::Real t_boost,
+ const amrex::Real t_lab, const amrex::Real dt,
+ DiagnosticParticles& diagnostic_particles) final;
+
+ bool injected = false;
+
+protected:
+
+ std::string species_name;
+ std::unique_ptr<PlasmaInjector> plasma_injector;
+
+ // When true, adjust the transverse particle positions accounting
+ // for the difference between the Lorentz transformed time of the
+ // particle and the time of the boosted frame.
+ bool boost_adjust_transverse_positions = false;
+ bool do_backward_propagation = false;
+
+ long NumParticlesToAdd (const amrex::Box& overlap_box,
+ const amrex::RealBox& overlap_realbox,
+ const amrex::RealBox& tile_real_box,
+ const amrex::RealBox& particle_real_box);
+
+ int GetRefineFac(const amrex::Real x, const amrex::Real y, const amrex::Real z);
+ std::unique_ptr<amrex::IArrayBox> m_refined_injection_mask = nullptr;
+
+};
+
+#endif