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 
14 #include "WarpXParticleContainer.H"
18 
19 #ifdef WARPX_QED
23 
26 #endif
27 
28 #include <AMReX_IArrayBox.H>
29 
30 #include <map>
31 
40  : public WarpXParticleContainer
41 {
42 public:
43 
49  };
50 
51  PhysicalParticleContainer (amrex::AmrCore* amr_core,
52  int ispecies,
53  const std::string& name);
54 
55  PhysicalParticleContainer (amrex::AmrCore* amr_core);
56 
59  void BackwardCompatibility ();
60 
62 
63  virtual void InitData () override;
64 
65  void InitIonizationModule ();
66 
100  virtual void Evolve (int lev,
101  const amrex::MultiFab& Ex,
102  const amrex::MultiFab& Ey,
103  const amrex::MultiFab& Ez,
104  const amrex::MultiFab& Bx,
105  const amrex::MultiFab& By,
106  const amrex::MultiFab& Bz,
107  const amrex::MultiFab& Ex_avg,
108  const amrex::MultiFab& Ey_avg,
109  const amrex::MultiFab& Ez_avg,
110  const amrex::MultiFab& Bx_avg,
111  const amrex::MultiFab& By_avg,
112  const amrex::MultiFab& Bz_avg,
113  amrex::MultiFab& jx,
114  amrex::MultiFab& jy,
115  amrex::MultiFab& jz,
116  amrex::MultiFab* cjx,
117  amrex::MultiFab* cjy,
118  amrex::MultiFab* cjz,
119  amrex::MultiFab* rho,
120  amrex::MultiFab* crho,
121  const amrex::MultiFab* cEx,
122  const amrex::MultiFab* cEy,
123  const amrex::MultiFab* cEz,
124  const amrex::MultiFab* cBx,
125  const amrex::MultiFab* cBy,
126  const amrex::MultiFab* cBz,
127  amrex::Real t,
128  amrex::Real dt,
129  DtType a_dt_type=DtType::Full) override;
130 
131  virtual void PushPX (WarpXParIter& pti,
132  amrex::FArrayBox const * exfab,
133  amrex::FArrayBox const * eyfab,
134  amrex::FArrayBox const * ezfab,
135  amrex::FArrayBox const * bxfab,
136  amrex::FArrayBox const * byfab,
137  amrex::FArrayBox const * bzfab,
138  const int ngE, const int /*e_is_nodal*/,
139  const long offset,
140  const long np_to_push,
141  int lev, int gather_lev,
142  amrex::Real dt, ScaleFields scaleFields,
143  DtType a_dt_type=DtType::Full);
144 
145  virtual void PushP (int lev, amrex::Real dt,
146  const amrex::MultiFab& Ex,
147  const amrex::MultiFab& Ey,
148  const amrex::MultiFab& Ez,
149  const amrex::MultiFab& Bx,
150  const amrex::MultiFab& By,
151  const amrex::MultiFab& Bz) override;
152 
154  long& nfine_current,
155  long& nfine_gather,
156  long const np,
157  WarpXParIter& pti,
158  int const lev,
159  amrex::iMultiFab const* current_masks,
160  amrex::iMultiFab const* gather_masks,
161  RealVector& uxp,
162  RealVector& uyp,
163  RealVector& uzp,
164  RealVector& wp );
165 
166  virtual void PostRestart () final {}
167 
168  void SplitParticles (int lev);
169 
171  int lev,
172  int ngE,
173  const amrex::FArrayBox& Ex,
174  const amrex::FArrayBox& Ey,
175  const amrex::FArrayBox& Ez,
176  const amrex::FArrayBox& Bx,
177  const amrex::FArrayBox& By,
178  const amrex::FArrayBox& Bz);
179 
180  // Inject particles in Box 'part_box'
181  virtual void AddParticles (int lev);
182 
193  void AddPlasma (int lev, amrex::RealBox part_realbox = amrex::RealBox());
194 
195  void MapParticletoBoostedFrame (amrex::Real& x, amrex::Real& y, amrex::Real& z, std::array<amrex::Real, 3>& u);
196 
197  void AddGaussianBeam (
198  const amrex::Real x_m, const amrex::Real y_m, const amrex::Real z_m,
199  const amrex::Real x_rms, const amrex::Real y_rms, const amrex::Real z_rms,
200  const amrex::Real x_cut, const amrex::Real y_cut, const amrex::Real z_cut,
201  const amrex::Real q_tot, long npart, const int do_symmetrize);
202 
207  void AddPlasmaFromFile (amrex::ParticleReal q_tot,
208  amrex::ParticleReal z_shift);
209 
210  void CheckAndAddParticle (
211  amrex::Real x, amrex::Real y, amrex::Real z,
212  std::array<amrex::Real, 3> u,
213  amrex::Real weight,
214  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_x,
215  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_y,
216  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_z,
217  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_ux,
218  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_uy,
219  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_uz,
220  amrex::Gpu::HostVector<amrex::ParticleReal>& particle_w);
221 
222  virtual void GetParticleSlice (
223  const int direction, const amrex::Real z_old,
224  const amrex::Real z_new, const amrex::Real t_boost,
225  const amrex::Real t_lab, const amrex::Real dt,
226  DiagnosticParticles& diagnostic_particles) final;
227 
228  virtual void ConvertUnits (ConvertDirection convert_dir) override;
229 
269  void applyNCIFilter (
270  int lev, const amrex::Box& box,
271  amrex::Elixir& exeli, amrex::Elixir& eyeli, amrex::Elixir& ezeli,
272  amrex::Elixir& bxeli, amrex::Elixir& byeli, amrex::Elixir& bzeli,
273  amrex::FArrayBox& filtered_Ex, amrex::FArrayBox& filtered_Ey,
274  amrex::FArrayBox& filtered_Ez, amrex::FArrayBox& filtered_Bx,
275  amrex::FArrayBox& filtered_By, amrex::FArrayBox& filtered_Bz,
276  const amrex::FArrayBox& Ex, const amrex::FArrayBox& Ey,
277  const amrex::FArrayBox& Ez, const amrex::FArrayBox& Bx,
278  const amrex::FArrayBox& By, const amrex::FArrayBox& Bz,
279  amrex::FArrayBox const * & exfab, amrex::FArrayBox const * & eyfab,
280  amrex::FArrayBox const * & ezfab, amrex::FArrayBox const * & bxfab,
281  amrex::FArrayBox const * & byfab, amrex::FArrayBox const * & bzfab);
282 
290  void resample (const int timestep) override final;
291 
292 #ifdef WARPX_QED
293  //Functions decleared in WarpXParticleContainer.H
294  //containers for which QED processes could be relevant
295  //are expected to override these functions
296 
302  bool has_quantum_sync () const override;
303 
309  bool has_breit_wheeler () const override;
310 
316  (std::shared_ptr<BreitWheelerEngine> ptr) override;
317 
323  (std::shared_ptr<QuantumSynchrotronEngine> ptr) override;
324  //__________
325 
327 
329 #endif
330 
331 protected:
332  std::string species_name;
333  std::unique_ptr<PlasmaInjector> plasma_injector;
334 
335  // When true, adjust the transverse particle positions accounting
336  // for the difference between the Lorentz transformed time of the
337  // particle and the time of the boosted frame.
340 
342 
343  // Inject particles during the whole simulation
344  void ContinuousInjection (const amrex::RealBox& injection_box) override;
345 
346  //This function return true if the PhysicalParticleContainer contains electrons
347  //or positrons, false otherwise
348 
349  //When true PhysicalParticleContainer tries to use a pusher including
350  //radiation reaction
352 
353 #ifdef WARPX_QED
354  // A flag to enable quantum_synchrotron process for leptons
355  bool m_do_qed_quantum_sync = false;
356 
357  // A flag to enable breit_wheeler process [photons only!!]
359 
360  // A smart pointer to an instance of a Quantum Synchrotron engine
361  std::shared_ptr<QuantumSynchrotronEngine> m_shr_p_qs_engine;
362 
363  // A smart pointer to an instance of a Breit Wheeler engine [photons only!]
364  std::shared_ptr<BreitWheelerEngine> m_shr_p_bw_engine;
365 #endif
366 
367 };
368 
369 #endif
std::shared_ptr< QuantumSynchrotronEngine > m_shr_p_qs_engine
Definition: PhysicalParticleContainer.H:361
Definition: Ionization.H:17
void SplitParticles(int lev)
Definition: PhysicalParticleContainer.cpp:1245
DtType
Definition: WarpXDtType.H:10
This is a general class used for resampling that is instantiated as a member of MultiParticleContaine...
Definition: Resampling.H:37
void MapParticletoBoostedFrame(amrex::Real &x, amrex::Real &y, amrex::Real &z, std::array< amrex::Real, 3 > &u)
Definition: PhysicalParticleContainer.cpp:220
Definition: PhysicalParticleContainer.H:45
void set_quantum_sync_engine_ptr(std::shared_ptr< QuantumSynchrotronEngine > ptr) override
Definition: PhysicalParticleContainer.cpp:2042
Functor that scales E and B by a factor before pushing the particles. This is used for rigid injectio...
Definition: ScaleFields.H:13
bool has_quantum_sync() const override
Definition: PhysicalParticleContainer.cpp:2023
std::unique_ptr< PlasmaInjector > plasma_injector
Definition: PhysicalParticleContainer.H:333
def x
Definition: read_lab_particles.py:25
std::string species_name
Definition: PhysicalParticleContainer.H:332
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 int 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:1759
Definition: PhysicalParticleContainer.H:48
Definition: PhysicalParticleContainer.H:39
bool do_backward_propagation
Definition: PhysicalParticleContainer.H:339
IonizationFilterFunc getIonizationFunc(const WarpXParIter &pti, int lev, int 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:1979
PhysicalParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: PhysicalParticleContainer.cpp:92
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:1543
void set_breit_wheeler_engine_ptr(std::shared_ptr< BreitWheelerEngine > ptr) override
Definition: PhysicalParticleContainer.cpp:2035
Definition: PhysicalParticleContainer.H:46
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:268
def z
Definition: read_lab_particles.py:26
virtual void InitData() override
Definition: PhysicalParticleContainer.cpp:211
bool has_breit_wheeler() const override
Definition: PhysicalParticleContainer.cpp:2028
direction
Definition: AnyFFT.H:60
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: PhysicalParticleContainer.cpp:1748
virtual ~PhysicalParticleContainer()
Definition: PhysicalParticleContainer.H:61
int z_shift
Definition: yt3d_mpi.py:42
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, const amrex::MultiFab &Ex_avg, const amrex::MultiFab &Ey_avg, const amrex::MultiFab &Ez_avg, const amrex::MultiFab &Bx_avg, const amrex::MultiFab &By_avg, const amrex::MultiFab &Bz_avg, 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) override
Evolve is the central function PhysicalParticleContainer that advances plasma particles for a time dt...
Definition: PhysicalParticleContainer.cpp:925
bool m_do_qed_breit_wheeler
Definition: PhysicalParticleContainer.H:358
amrex::Vector< std::map< std::pair< int, int >, DiagnosticParticleData > > DiagnosticParticles
Definition: WarpXParticleContainer.H:147
PhotonEmissionFilterFunc getPhotonEmissionFilterFunc()
Definition: PhysicalParticleContainer.cpp:2048
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:44
virtual void ConvertUnits(ConvertDirection convert_dir) override
Definition: ParticleIO.cpp:109
Definition: PhysicalParticleContainer.H:47
virtual void AddParticles(int lev)
Definition: PhysicalParticleContainer.cpp:480
bool boost_adjust_transverse_positions
Definition: PhysicalParticleContainer.H:338
name
Definition: run_automated.py:204
std::shared_ptr< BreitWheelerEngine > m_shr_p_bw_engine
Definition: PhysicalParticleContainer.H:364
ConvertDirection
Definition: WarpXParticleContainer.H:31
Filter functor for the Breit Wheeler process.
Definition: QEDPairGeneration.H:28
PairGenerationFilterFunc getPairGenerationFilterFunc()
Definition: PhysicalParticleContainer.cpp:2055
void BackwardCompatibility()
Definition: PhysicalParticleContainer.cpp:195
void AddPlasma(int lev, amrex::RealBox part_realbox=amrex::RealBox())
Definition: PhysicalParticleContainer.cpp:526
bool do_classical_radiation_reaction
Definition: PhysicalParticleContainer.H:351
Resampling m_resampler
Definition: PhysicalParticleContainer.H:341
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:2001
PhysicalParticleType
Definition: PhysicalParticleContainer.H:44
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:1170
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:1411
void AddPlasmaFromFile(amrex::ParticleReal q_tot, amrex::ParticleReal z_shift)
Definition: PhysicalParticleContainer.cpp:352
bool m_do_qed_quantum_sync
Definition: PhysicalParticleContainer.H:355
Filter functor for the QED photon emission process.
Definition: QEDPhotonEmission.H:30
Definition: WarpXParticleContainer.H:76
void CheckAndAddParticle(amrex::Real x, amrex::Real y, amrex::Real z, std::array< amrex::Real, 3 > u, 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:455
void InitIonizationModule()
Definition: PhysicalParticleContainer.cpp:1917
virtual void PostRestart() final
Definition: PhysicalParticleContainer.H:166
Definition: WarpXParticleContainer.H:131