WarpX
PhysicalParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2019-2020 Andrew Myers, Axel Huebl, David Grote
2  * Ligia Diana Amorim, Luca Fedeli, Maxence Thevenet
3  * Remi Lehe, Revathi Jambunathan, Weiqun Zhang
4  * Yinjian Zhao
5  *
6  * This file is part of WarpX.
7  *
8  * License: BSD-3-Clause-LBNL
9  */
10 #ifndef WARPX_PhysicalParticleContainer_H_
11 #define WARPX_PhysicalParticleContainer_H_
12 
13 #include "Evolve/WarpXDtType.H"
16 #ifdef WARPX_QED
21 #endif
24 #include "WarpXParticleContainer.H"
25 
26 #include <AMReX_GpuContainers.H>
27 #include <AMReX_Particles.H>
28 #include <AMReX_REAL.H>
29 #include <AMReX_RealBox.H>
30 
31 #include <AMReX_BaseFwd.H>
32 #include <AMReX_AmrCoreFwd.H>
33 
34 #include <memory>
35 #include <string>
36 
45  : public WarpXParticleContainer
46 {
47 public:
48 
54  };
55 
56  PhysicalParticleContainer (amrex::AmrCore* amr_core,
57  int ispecies,
58  const std::string& name);
59 
60  PhysicalParticleContainer (amrex::AmrCore* amr_core);
61 
64  void BackwardCompatibility ();
65 
67 
68  virtual void InitData () override;
69 
70  virtual void ReadHeader (std::istream& is) override;
71 
72  virtual void WriteHeader (std::ostream& os) const override;
73 
74  void InitIonizationModule ();
75 
109  virtual void Evolve (int lev,
110  const amrex::MultiFab& Ex,
111  const amrex::MultiFab& Ey,
112  const amrex::MultiFab& Ez,
113  const amrex::MultiFab& Bx,
114  const amrex::MultiFab& By,
115  const amrex::MultiFab& Bz,
116  amrex::MultiFab& jx,
117  amrex::MultiFab& jy,
118  amrex::MultiFab& jz,
119  amrex::MultiFab* cjx,
120  amrex::MultiFab* cjy,
121  amrex::MultiFab* cjz,
122  amrex::MultiFab* rho,
123  amrex::MultiFab* crho,
124  const amrex::MultiFab* cEx,
125  const amrex::MultiFab* cEy,
126  const amrex::MultiFab* cEz,
127  const amrex::MultiFab* cBx,
128  const amrex::MultiFab* cBy,
129  const amrex::MultiFab* cBz,
130  amrex::Real t,
131  amrex::Real dt,
132  DtType a_dt_type=DtType::Full,
133  bool skip_deposition=false ) override;
134 
135  virtual void PushPX (WarpXParIter& pti,
136  amrex::FArrayBox const * exfab,
137  amrex::FArrayBox const * eyfab,
138  amrex::FArrayBox const * ezfab,
139  amrex::FArrayBox const * bxfab,
140  amrex::FArrayBox const * byfab,
141  amrex::FArrayBox const * bzfab,
142  const amrex::IntVect ngE, const int /*e_is_nodal*/,
143  const long offset,
144  const long np_to_push,
145  int lev, int gather_lev,
146  amrex::Real dt, ScaleFields scaleFields,
147  DtType a_dt_type=DtType::Full);
148 
149  virtual void PushP (int lev, amrex::Real dt,
150  const amrex::MultiFab& Ex,
151  const amrex::MultiFab& Ey,
152  const amrex::MultiFab& Ez,
153  const amrex::MultiFab& Bx,
154  const amrex::MultiFab& By,
155  const amrex::MultiFab& Bz) override;
156 
158  long& nfine_current,
159  long& nfine_gather,
160  long const np,
161  WarpXParIter& pti,
162  int const lev,
163  amrex::iMultiFab const* current_masks,
164  amrex::iMultiFab const* gather_masks,
165  RealVector& uxp,
166  RealVector& uyp,
167  RealVector& uzp,
168  RealVector& wp );
169 
170  virtual void PostRestart () final {}
171 
172  void SplitParticles (int lev);
173 
175  int lev,
176  amrex::IntVect ngE,
177  const amrex::FArrayBox& Ex,
178  const amrex::FArrayBox& Ey,
179  const amrex::FArrayBox& Ez,
180  const amrex::FArrayBox& Bx,
181  const amrex::FArrayBox& By,
182  const amrex::FArrayBox& Bz);
183 
184  // Inject particles in Box 'part_box'
185  virtual void AddParticles (int lev);
186 
197  void AddPlasma (int lev, amrex::RealBox part_realbox = amrex::RealBox());
198 
205  void AddPlasmaFlux (int lev, amrex::Real dt);
206 
207  void MapParticletoBoostedFrame (amrex::Real& x, amrex::Real& y, amrex::Real& z,
208  amrex::Real& ux, amrex::Real& uy, amrex::Real& uz);
209 
210  void AddGaussianBeam (
211  const amrex::Real x_m, const amrex::Real y_m, const amrex::Real z_m,
212  const amrex::Real x_rms, const amrex::Real y_rms, const amrex::Real z_rms,
213  const amrex::Real x_cut, const amrex::Real y_cut, const amrex::Real z_cut,
214  const amrex::Real q_tot, long npart, const int do_symmetrize);
215 
220  void AddPlasmaFromFile (amrex::ParticleReal q_tot,
221  amrex::ParticleReal z_shift);
222 
223  void CheckAndAddParticle (
224  amrex::Real x, amrex::Real y, amrex::Real z,
225  amrex::Real ux, amrex::Real uy, amrex::Real uz,
226  amrex::Real weight,
227  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_x,
228  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_y,
229  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_z,
230  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_ux,
231  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_uy,
232  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_uz,
233  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_w);
234 
235  virtual void GetParticleSlice (
236  const int direction, const amrex::Real z_old,
237  const amrex::Real z_new, const amrex::Real t_boost,
238  const amrex::Real t_lab, const amrex::Real dt,
239  DiagnosticParticles& diagnostic_particles) final;
240 
247  virtual void ConvertUnits (ConvertDirection convert_dir) override;
248 
288  void applyNCIFilter (
289  int lev, const amrex::Box& box,
290  amrex::Elixir& exeli, amrex::Elixir& eyeli, amrex::Elixir& ezeli,
291  amrex::Elixir& bxeli, amrex::Elixir& byeli, amrex::Elixir& bzeli,
292  amrex::FArrayBox& filtered_Ex, amrex::FArrayBox& filtered_Ey,
293  amrex::FArrayBox& filtered_Ez, amrex::FArrayBox& filtered_Bx,
294  amrex::FArrayBox& filtered_By, amrex::FArrayBox& filtered_Bz,
295  const amrex::FArrayBox& Ex, const amrex::FArrayBox& Ey,
296  const amrex::FArrayBox& Ez, const amrex::FArrayBox& Bx,
297  const amrex::FArrayBox& By, const amrex::FArrayBox& Bz,
298  amrex::FArrayBox const * & exfab, amrex::FArrayBox const * & eyfab,
299  amrex::FArrayBox const * & ezfab, amrex::FArrayBox const * & bxfab,
300  amrex::FArrayBox const * & byfab, amrex::FArrayBox const * & bzfab);
301 
309  void resample (const int timestep) override final;
310 
311 #ifdef WARPX_QED
312  //Functions decleared in WarpXParticleContainer.H
313  //containers for which QED processes could be relevant
314  //are expected to override these functions
315 
321  bool has_quantum_sync () const override;
322 
328  bool has_breit_wheeler () const override;
329 
335  (std::shared_ptr<BreitWheelerEngine> ptr) override;
336 
342  (std::shared_ptr<QuantumSynchrotronEngine> ptr) override;
343  //__________
344 
346 
348 #endif
349 
350 protected:
351  std::string species_name;
352  std::unique_ptr<PlasmaInjector> plasma_injector;
353 
354  // When true, adjust the transverse particle positions accounting
355  // for the difference between the Lorentz transformed time of the
356  // particle and the time of the boosted frame.
359  bool m_rz_random_theta = true;
360 
362 
363  // Inject particles during the whole simulation
364  void ContinuousInjection (const amrex::RealBox& injection_box) override;
365 
366  // Continuously inject a flux of particles from a defined surface
367  void ContinuousFluxInjection (const amrex::Real dt) override;
368 
369  //This function return true if the PhysicalParticleContainer contains electrons
370  //or positrons, false otherwise
371 
372  //When true PhysicalParticleContainer tries to use a pusher including
373  //radiation reaction
375 
376  // A flag to enable saving of the previous timestep positions
378 
379 #ifdef WARPX_QED
380  // A flag to enable quantum_synchrotron process for leptons
381  bool m_do_qed_quantum_sync = false;
382 
383  // A flag to enable breit_wheeler process [photons only!!]
385 
386  // A smart pointer to an instance of a Quantum Synchrotron engine
387  std::shared_ptr<QuantumSynchrotronEngine> m_shr_p_qs_engine;
388 
389  // A smart pointer to an instance of a Breit Wheeler engine [photons only!]
390  std::shared_ptr<BreitWheelerEngine> m_shr_p_bw_engine;
391 #endif
392 
393 };
394 
395 #endif
std::shared_ptr< QuantumSynchrotronEngine > m_shr_p_qs_engine
Definition: PhysicalParticleContainer.H:387
Definition: Ionization.H:30
void SplitParticles(int lev)
Definition: PhysicalParticleContainer.cpp:1828
DtType
Definition: WarpXDtType.H:10
This is a general class used for resampling that is instantiated as a member of MultiParticleContaine...
Definition: Resampling.H:41
Definition: PhysicalParticleContainer.H:50
virtual void WriteHeader(std::ostream &os) const override
Definition: ParticleIO.cpp:112
virtual void PushPX(WarpXParIter &pti, amrex::FArrayBox const *exfab, amrex::FArrayBox const *eyfab, amrex::FArrayBox const *ezfab, amrex::FArrayBox const *bxfab, amrex::FArrayBox const *byfab, amrex::FArrayBox const *bzfab, const amrex::IntVect ngE, const int, const long offset, const long np_to_push, int lev, int gather_lev, amrex::Real dt, ScaleFields scaleFields, DtType a_dt_type=DtType::Full)
Definition: PhysicalParticleContainer.cpp:2335
void set_quantum_sync_engine_ptr(std::shared_ptr< QuantumSynchrotronEngine > ptr) override
Definition: PhysicalParticleContainer.cpp:2655
Functor that scales E and B by a factor before pushing the particles. This is used for rigid injectio...
Definition: ScaleFields.H:13
void ContinuousFluxInjection(const amrex::Real dt) override
Definition: PhysicalParticleContainer.cpp:2322
bool has_quantum_sync() const override
Definition: PhysicalParticleContainer.cpp:2636
std::unique_ptr< PlasmaInjector > plasma_injector
Definition: PhysicalParticleContainer.H:352
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, DtType a_dt_type=DtType::Full, bool skip_deposition=false) override
Evolve is the central function PhysicalParticleContainer that advances plasma particles for a time dt...
Definition: PhysicalParticleContainer.cpp:1510
def x
Definition: read_lab_particles.py:25
void MapParticletoBoostedFrame(amrex::Real &x, amrex::Real &y, amrex::Real &z, amrex::Real &ux, amrex::Real &uy, amrex::Real &uz)
Definition: PhysicalParticleContainer.cpp:354
std::string species_name
Definition: PhysicalParticleContainer.H:351
Definition: PhysicalParticleContainer.H:53
Definition: PhysicalParticleContainer.H:44
bool do_backward_propagation
Definition: PhysicalParticleContainer.H:358
def uz
Definition: read_lab_particles.py:29
PhysicalParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: PhysicalParticleContainer.cpp:208
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
Definition: PhysicalParticleContainer.cpp:2126
void set_breit_wheeler_engine_ptr(std::shared_ptr< BreitWheelerEngine > ptr) override
Definition: PhysicalParticleContainer.cpp:2648
Definition: PhysicalParticleContainer.H:51
void CheckAndAddParticle(amrex::Real x, amrex::Real y, amrex::Real z, amrex::Real ux, amrex::Real uy, amrex::Real uz, amrex::Real weight, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_x, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_y, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_z, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_ux, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_uy, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_uz, amrex::Gpu::HostVector< amrex::ParticleReal > &particle_w)
Definition: PhysicalParticleContainer.cpp:589
void AddGaussianBeam(const amrex::Real x_m, const amrex::Real y_m, const amrex::Real z_m, const amrex::Real x_rms, const amrex::Real y_rms, const amrex::Real z_rms, const amrex::Real x_cut, const amrex::Real y_cut, const amrex::Real z_cut, const amrex::Real q_tot, long npart, const int do_symmetrize)
Definition: PhysicalParticleContainer.cpp:402
bool m_rz_random_theta
Definition: PhysicalParticleContainer.H:359
def z
Definition: read_lab_particles.py:26
virtual void InitData() override
Definition: PhysicalParticleContainer.cpp:345
bool has_breit_wheeler() const override
Definition: PhysicalParticleContainer.cpp:2641
direction
Definition: AnyFFT.H:74
ConvertDirection
Definition: WarpXParticleContainer_fwd.H:22
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: PhysicalParticleContainer.cpp:2312
virtual ~PhysicalParticleContainer()
Definition: PhysicalParticleContainer.H:66
int z_shift
Definition: yt3d_mpi.py:42
bool m_do_qed_breit_wheeler
Definition: PhysicalParticleContainer.H:384
virtual void ReadHeader(std::istream &is) override
Definition: ParticleIO.cpp:105
amrex::Vector< std::map< std::pair< int, int >, DiagnosticParticleData > > DiagnosticParticles
Definition: WarpXParticleContainer.H:123
PhotonEmissionFilterFunc getPhotonEmissionFilterFunc()
Definition: PhysicalParticleContainer.cpp:2661
void PartitionParticlesInBuffers(long &nfine_current, long &nfine_gather, long const np, WarpXParIter &pti, int const lev, amrex::iMultiFab const *current_masks, amrex::iMultiFab const *gather_masks, RealVector &uxp, RealVector &uyp, RealVector &uzp, RealVector &wp)
Definition: Partition.cpp:55
virtual void ConvertUnits(ConvertDirection convert_dir) override
Definition: ParticleIO.cpp:156
Definition: PhysicalParticleContainer.H:52
virtual void AddParticles(int lev)
Definition: PhysicalParticleContainer.cpp:614
IonizationFilterFunc getIonizationFunc(const WarpXParIter &pti, int lev, amrex::IntVect ngE, const amrex::FArrayBox &Ex, const amrex::FArrayBox &Ey, const amrex::FArrayBox &Ez, const amrex::FArrayBox &Bx, const amrex::FArrayBox &By, const amrex::FArrayBox &Bz)
Definition: PhysicalParticleContainer.cpp:2579
bool boost_adjust_transverse_positions
Definition: PhysicalParticleContainer.H:357
name
Definition: run_automated.py:204
std::shared_ptr< BreitWheelerEngine > m_shr_p_bw_engine
Definition: PhysicalParticleContainer.H:390
Filter functor for the Breit Wheeler process.
Definition: QEDPairGeneration.H:37
PairGenerationFilterFunc getPairGenerationFilterFunc()
Definition: PhysicalParticleContainer.cpp:2668
void BackwardCompatibility()
Definition: PhysicalParticleContainer.cpp:329
void AddPlasma(int lev, amrex::RealBox part_realbox=amrex::RealBox())
Definition: PhysicalParticleContainer.cpp:690
bool do_classical_radiation_reaction
Definition: PhysicalParticleContainer.H:374
Resampling m_resampler
Definition: PhysicalParticleContainer.H:361
void resample(const int timestep) override final
This function determines if resampling should be done for the current species, and if so...
Definition: PhysicalParticleContainer.cpp:2601
bool m_save_previous_position
Definition: PhysicalParticleContainer.H:377
PhysicalParticleType
Definition: PhysicalParticleContainer.H:49
void applyNCIFilter(int lev, const amrex::Box &box, amrex::Elixir &exeli, amrex::Elixir &eyeli, amrex::Elixir &ezeli, amrex::Elixir &bxeli, amrex::Elixir &byeli, amrex::Elixir &bzeli, amrex::FArrayBox &filtered_Ex, amrex::FArrayBox &filtered_Ey, amrex::FArrayBox &filtered_Ez, amrex::FArrayBox &filtered_Bx, amrex::FArrayBox &filtered_By, amrex::FArrayBox &filtered_Bz, const amrex::FArrayBox &Ex, const amrex::FArrayBox &Ey, const amrex::FArrayBox &Ez, const amrex::FArrayBox &Bx, const amrex::FArrayBox &By, const amrex::FArrayBox &Bz, amrex::FArrayBox const *&exfab, amrex::FArrayBox const *&eyfab, amrex::FArrayBox const *&ezfab, amrex::FArrayBox const *&bxfab, amrex::FArrayBox const *&byfab, amrex::FArrayBox const *&bzfab)
Apply NCI Godfrey filter to all components of E and B before gather.
Definition: PhysicalParticleContainer.cpp:1753
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
Definition: PhysicalParticleContainer.cpp:1994
void AddPlasmaFromFile(amrex::ParticleReal q_tot, amrex::ParticleReal z_shift)
Definition: PhysicalParticleContainer.cpp:486
bool m_do_qed_quantum_sync
Definition: PhysicalParticleContainer.H:381
Filter functor for the QED photon emission process.
Definition: QEDPhotonEmission.H:42
def ux
Definition: read_lab_particles.py:28
Definition: WarpXParticleContainer.H:58
void InitIonizationModule()
Definition: PhysicalParticleContainer.cpp:2515
void AddPlasmaFlux(int lev, amrex::Real dt)
Definition: PhysicalParticleContainer.cpp:1129
virtual void PostRestart() final
Definition: PhysicalParticleContainer.H:170
Definition: WarpXParticleContainer.H:110