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"
14 #include "Evolve/WarpXPushType.H"
17 #ifdef WARPX_QED
22 #endif
25 #include "WarpXParticleContainer.H"
26 
27 #include <AMReX_GpuContainers.H>
28 #include <AMReX_Particles.H>
29 #include <AMReX_REAL.H>
30 #include <AMReX_RealBox.H>
31 
32 #include <AMReX_BaseFwd.H>
33 #include <AMReX_AmrCoreFwd.H>
34 
35 #include <memory>
36 #include <string>
37 
46  : public WarpXParticleContainer
47 {
48 public:
49 
51  int ispecies,
52  const std::string& name);
53 
55 
58  void BackwardCompatibility ();
59 
60  ~PhysicalParticleContainer () override = default;
61 
66 
67  void InitData () override;
68 
69  void ReadHeader (std::istream& is) override;
70 
71  void WriteHeader (std::ostream& os) const override;
72 
73  void InitIonizationModule () override;
74 
75  /*
76  * \brief Returns a pointer to the i'th plasma injector.
77  */
78  PlasmaInjector* GetPlasmaInjector (int i) override;
79 
115  void Evolve (int lev,
116  const amrex::MultiFab& Ex,
117  const amrex::MultiFab& Ey,
118  const amrex::MultiFab& Ez,
119  const amrex::MultiFab& Bx,
120  const amrex::MultiFab& By,
121  const amrex::MultiFab& Bz,
122  amrex::MultiFab& jx,
123  amrex::MultiFab& jy,
124  amrex::MultiFab& jz,
125  amrex::MultiFab* cjx,
126  amrex::MultiFab* cjy,
127  amrex::MultiFab* cjz,
128  amrex::MultiFab* rho,
129  amrex::MultiFab* crho,
130  const amrex::MultiFab* cEx,
131  const amrex::MultiFab* cEy,
132  const amrex::MultiFab* cEz,
133  const amrex::MultiFab* cBx,
134  const amrex::MultiFab* cBy,
135  const amrex::MultiFab* cBz,
136  amrex::Real t,
137  amrex::Real dt,
138  DtType a_dt_type=DtType::Full,
139  bool skip_deposition=false,
140  PushType push_type=PushType::Explicit) override;
141 
142  virtual void PushPX (WarpXParIter& pti,
143  amrex::FArrayBox const * exfab,
144  amrex::FArrayBox const * eyfab,
145  amrex::FArrayBox const * ezfab,
146  amrex::FArrayBox const * bxfab,
147  amrex::FArrayBox const * byfab,
148  amrex::FArrayBox const * bzfab,
149  amrex::IntVect ngEB, int /*e_is_nodal*/,
150  long offset,
151  long np_to_push,
152  int lev, int gather_lev,
153  amrex::Real dt, ScaleFields scaleFields,
154  DtType a_dt_type=DtType::Full);
155 
156  void ImplicitPushXP (WarpXParIter& pti,
157  amrex::FArrayBox const * exfab,
158  amrex::FArrayBox const * eyfab,
159  amrex::FArrayBox const * ezfab,
160  amrex::FArrayBox const * bxfab,
161  amrex::FArrayBox const * byfab,
162  amrex::FArrayBox const * bzfab,
163  amrex::IntVect ngEB, int /*e_is_nodal*/,
164  long offset,
165  long np_to_push,
166  int lev, int gather_lev,
167  amrex::Real dt, ScaleFields scaleFields,
168  DtType a_dt_type=DtType::Full);
169 
170  void PushP (int lev, amrex::Real dt,
171  const amrex::MultiFab& Ex,
172  const amrex::MultiFab& Ey,
173  const amrex::MultiFab& Ez,
174  const amrex::MultiFab& Bx,
175  const amrex::MultiFab& By,
176  const amrex::MultiFab& Bz) override;
177 
179  long& nfine_current,
180  long& nfine_gather,
181  long np,
182  WarpXParIter& pti,
183  int lev,
184  amrex::iMultiFab const* current_masks,
185  amrex::iMultiFab const* gather_masks );
186 
187  void PostRestart () final {}
188 
189  void SplitParticles (int lev);
190 
192  int lev,
193  amrex::IntVect ngEB,
194  const amrex::FArrayBox& Ex,
195  const amrex::FArrayBox& Ey,
196  const amrex::FArrayBox& Ez,
197  const amrex::FArrayBox& Bx,
198  const amrex::FArrayBox& By,
199  const amrex::FArrayBox& Bz);
200 
201  // Inject particles in Box 'part_box'
202  virtual void AddParticles (int lev);
203 
215  void AddPlasma (PlasmaInjector const& plasma_injector, int lev, amrex::RealBox part_realbox = amrex::RealBox());
216 
223  void AddPlasmaFlux (PlasmaInjector const& plasma_injector, amrex::Real dt);
224 
225  void MapParticletoBoostedFrame (amrex::ParticleReal& x, amrex::ParticleReal& y, amrex::ParticleReal& z,
226  amrex::ParticleReal& ux, amrex::ParticleReal& uy, amrex::ParticleReal& uz,
227  amrex::Real t_lab = 0.) const;
228 
229  void AddGaussianBeam (PlasmaInjector const& plasma_injector);
230 
236  void AddPlasmaFromFile (PlasmaInjector & plasma_injector,
237  amrex::ParticleReal q_tot,
238  amrex::ParticleReal z_shift);
239 
240  void CheckAndAddParticle (
241  amrex::ParticleReal x, amrex::ParticleReal y, amrex::ParticleReal z,
242  amrex::ParticleReal ux, amrex::ParticleReal uy, amrex::ParticleReal uz,
243  amrex::ParticleReal weight,
251  amrex::Real t_lab= 0.) const;
252 
267  int n_external_attr_real,
268  int n_external_attr_int) final;
269 
309  void applyNCIFilter (
310  int lev, const amrex::Box& box,
311  amrex::Elixir& exeli, amrex::Elixir& eyeli, amrex::Elixir& ezeli,
312  amrex::Elixir& bxeli, amrex::Elixir& byeli, amrex::Elixir& bzeli,
313  amrex::FArrayBox& filtered_Ex, amrex::FArrayBox& filtered_Ey,
314  amrex::FArrayBox& filtered_Ez, amrex::FArrayBox& filtered_Bx,
315  amrex::FArrayBox& filtered_By, amrex::FArrayBox& filtered_Bz,
316  const amrex::FArrayBox& Ex, const amrex::FArrayBox& Ey,
317  const amrex::FArrayBox& Ez, const amrex::FArrayBox& Bx,
318  const amrex::FArrayBox& By, const amrex::FArrayBox& Bz,
319  amrex::FArrayBox const * & ex_ptr, amrex::FArrayBox const * & ey_ptr,
320  amrex::FArrayBox const * & ez_ptr, amrex::FArrayBox const * & bx_ptr,
321  amrex::FArrayBox const * & by_ptr, amrex::FArrayBox const * & bz_ptr);
322 
329  void resample (int timestep, bool verbose=true) final;
330 
331 #ifdef WARPX_QED
332  //Functions decleared in WarpXParticleContainer.H
333  //containers for which QED processes could be relevant
334  //are expected to override these functions
335 
341  bool has_quantum_sync () const override;
342 
348  bool has_breit_wheeler () const override;
349 
355  (const std::shared_ptr<BreitWheelerEngine>& ptr) override;
356 
362  (const std::shared_ptr<QuantumSynchrotronEngine>& ptr) override;
363  //__________
364 
366  return m_shr_p_bw_engine.get();
367  }
368 
370  return m_shr_p_qs_engine.get();
371  }
372 
374 
376 #endif
377 
378  std::vector<std::string> getUserIntAttribs () const override {
379  return m_user_int_attribs;
380  }
381 
382  std::vector<std::string> getUserRealAttribs () const override {
383  return m_user_real_attribs;
384  }
385 
388  }
389 
392  }
393 
394 protected:
395  std::string species_name;
396  std::vector<std::unique_ptr<PlasmaInjector>> plasma_injectors;
397 
398  // When true, adjust the transverse particle positions accounting
399  // for the difference between the Lorentz transformed time of the
400  // particle and the time of the boosted frame.
403  bool m_rz_random_theta = true;
404 
405  // Impose t_lab from the openPMD file for externally loaded species
407 
409 
410  // Inject particles during the whole simulation
411  void ContinuousInjection (const amrex::RealBox& injection_box) override;
412 
413  // Continuously inject a flux of particles from a defined surface
414  void ContinuousFluxInjection (amrex::Real t, amrex::Real dt) override;
415 
416  //This function return true if the PhysicalParticleContainer contains electrons
417  //or positrons, false otherwise
418 
419  //When true PhysicalParticleContainer tries to use a pusher including
420  //radiation reaction
422 
423  // A flag to enable saving of the previous timestep positions
425 
426 #ifdef WARPX_QED
427  // A flag to enable quantum_synchrotron process for leptons
428  bool m_do_qed_quantum_sync = false;
429 
430  // A flag to enable breit_wheeler process [photons only!!]
432 
433  // A smart pointer to an instance of a Quantum Synchrotron engine
434  std::shared_ptr<QuantumSynchrotronEngine> m_shr_p_qs_engine;
435 
436  // A smart pointer to an instance of a Breit Wheeler engine [photons only!]
437  std::shared_ptr<BreitWheelerEngine> m_shr_p_bw_engine;
438 #endif
439  /* Vector of user-defined integer attributes for species, species_name */
440  std::vector<std::string> m_user_int_attribs;
441  /* Vector of user-defined real attributes for species, species_name */
442  std::vector<std::string> m_user_real_attribs;
443  /* Vector of user-defined parser for initializing user-defined integer attributes */
445  /* Vector of user-defined parser for initializing user-defined real attributes */
447 
448 };
449 
450 #endif
DtType
Definition: WarpXDtType.H:11
PushType
Definition: WarpXPushType.H:12
Definition: BreitWheelerEngineWrapper.H:294
Filter functor for the Breit Wheeler process.
Definition: QEDPairGeneration.H:38
Filter functor for the QED photon emission process.
Definition: QEDPhotonEmission.H:44
Definition: PhysicalParticleContainer.H:47
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:2545
void set_breit_wheeler_engine_ptr(const std::shared_ptr< BreitWheelerEngine > &ptr) override
Definition: PhysicalParticleContainer.cpp:3401
std::vector< std::string > getUserIntAttribs() const override
Definition: PhysicalParticleContainer.H:378
std::vector< std::string > m_user_int_attribs
Definition: PhysicalParticleContainer.H:440
PhysicalParticleContainer & operator=(PhysicalParticleContainer &&)=default
void ImplicitPushXP(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, amrex::IntVect ngEB, int, long offset, long np_to_push, int lev, int gather_lev, amrex::Real dt, ScaleFields scaleFields, DtType a_dt_type=DtType::Full)
Definition: PhysicalParticleContainer.cpp:2982
IonizationFilterFunc getIonizationFunc(const WarpXParIter &pti, int lev, amrex::IntVect ngEB, 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:3314
std::shared_ptr< BreitWheelerEngine > m_shr_p_bw_engine
Definition: PhysicalParticleContainer.H:437
amrex::Vector< amrex::Parser * > getUserIntAttribParser() const override
Definition: PhysicalParticleContainer.H:386
Resampling m_resampler
Definition: PhysicalParticleContainer.H:408
amrex::Vector< std::unique_ptr< amrex::Parser > > m_user_int_attrib_parser
Definition: PhysicalParticleContainer.H:444
PhysicalParticleContainer(PhysicalParticleContainer &&)=default
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, PushType push_type=PushType::Explicit) override
Evolve is the central function PhysicalParticleContainer that advances plasma particles for a time dt...
Definition: PhysicalParticleContainer.cpp:2007
void set_quantum_sync_engine_ptr(const std::shared_ptr< QuantumSynchrotronEngine > &ptr) override
Definition: PhysicalParticleContainer.cpp:3408
void SplitParticles(int lev)
Definition: PhysicalParticleContainer.cpp:2345
bool m_do_qed_quantum_sync
Definition: PhysicalParticleContainer.H:428
BreitWheelerEngine * get_breit_wheeler_engine_ptr() const override
Definition: PhysicalParticleContainer.H:365
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: PhysicalParticleContainer.cpp:2698
bool has_breit_wheeler() const override
Definition: PhysicalParticleContainer.cpp:3394
PhysicalParticleContainer(PhysicalParticleContainer const &)=delete
bool m_do_qed_breit_wheeler
Definition: PhysicalParticleContainer.H:431
PairGenerationFilterFunc getPairGenerationFilterFunc()
Definition: PhysicalParticleContainer.cpp:3421
bool do_classical_radiation_reaction
Definition: PhysicalParticleContainer.H:421
void MapParticletoBoostedFrame(amrex::ParticleReal &x, amrex::ParticleReal &y, amrex::ParticleReal &z, amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, amrex::Real t_lab=0.) const
Definition: PhysicalParticleContainer.cpp:487
std::shared_ptr< QuantumSynchrotronEngine > m_shr_p_qs_engine
Definition: PhysicalParticleContainer.H:434
void PartitionParticlesInBuffers(long &nfine_current, long &nfine_gather, long np, WarpXParIter &pti, int lev, amrex::iMultiFab const *current_masks, amrex::iMultiFab const *gather_masks)
Definition: Partition.cpp:52
void DefaultInitializeRuntimeAttributes(typename ContainerLike< amrex::PinnedArenaAllocator >::ParticleTileType &pinned_tile, int n_external_attr_real, int n_external_attr_int) final
Default initialize runtime attributes in a tile. This routine does not initialize the first n_externa...
Definition: PhysicalParticleContainer.cpp:838
bool impose_t_lab_from_file
Definition: PhysicalParticleContainer.H:406
void InitData() override
Definition: PhysicalParticleContainer.cpp:481
void ReadHeader(std::istream &is) override
Definition: ParticleIO.cpp:110
virtual void AddParticles(int lev)
Definition: PhysicalParticleContainer.cpp:886
void BackwardCompatibility()
Definition: PhysicalParticleContainer.cpp:465
void resample(int timestep, bool verbose=true) final
This function determines if resampling should be done for the current species, and if so,...
Definition: PhysicalParticleContainer.cpp:3347
amrex::Vector< std::unique_ptr< amrex::Parser > > m_user_real_attrib_parser
Definition: PhysicalParticleContainer.H:446
void AddPlasma(PlasmaInjector const &plasma_injector, int lev, amrex::RealBox part_realbox=amrex::RealBox())
Definition: PhysicalParticleContainer.cpp:955
void CheckAndAddParticle(amrex::ParticleReal x, amrex::ParticleReal y, amrex::ParticleReal z, amrex::ParticleReal ux, amrex::ParticleReal uy, amrex::ParticleReal uz, amrex::ParticleReal 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, amrex::Real t_lab=0.) const
Definition: PhysicalParticleContainer.cpp:860
QuantumSynchrotronEngine * get_quantum_sync_engine_ptr() const override
Definition: PhysicalParticleContainer.H:369
bool m_save_previous_position
Definition: PhysicalParticleContainer.H:424
void InitIonizationModule() override
Definition: PhysicalParticleContainer.cpp:3229
void PostRestart() final
Definition: PhysicalParticleContainer.H:187
std::vector< std::string > m_user_real_attribs
Definition: PhysicalParticleContainer.H:442
void ContinuousFluxInjection(amrex::Real t, amrex::Real dt) override
Definition: PhysicalParticleContainer.cpp:2710
~PhysicalParticleContainer() override=default
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 *&ex_ptr, amrex::FArrayBox const *&ey_ptr, amrex::FArrayBox const *&ez_ptr, amrex::FArrayBox const *&bx_ptr, amrex::FArrayBox const *&by_ptr, amrex::FArrayBox const *&bz_ptr)
Apply NCI Godfrey filter to all components of E and B before gather.
Definition: PhysicalParticleContainer.cpp:2268
void AddPlasmaFromFile(PlasmaInjector &plasma_injector, amrex::ParticleReal q_tot, amrex::ParticleReal z_shift)
Definition: PhysicalParticleContainer.cpp:711
void WriteHeader(std::ostream &os) const override
Definition: ParticleIO.cpp:117
void AddGaussianBeam(PlasmaInjector const &plasma_injector)
Definition: PhysicalParticleContainer.cpp:534
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, amrex::IntVect ngEB, int, long offset, long np_to_push, int lev, int gather_lev, amrex::Real dt, ScaleFields scaleFields, DtType a_dt_type=DtType::Full)
Definition: PhysicalParticleContainer.cpp:2729
PlasmaInjector * GetPlasmaInjector(int i) override
Definition: PhysicalParticleContainer.cpp:3338
bool boost_adjust_transverse_positions
Definition: PhysicalParticleContainer.H:401
PhysicalParticleContainer & operator=(PhysicalParticleContainer const &)=delete
std::vector< std::unique_ptr< PlasmaInjector > > plasma_injectors
Definition: PhysicalParticleContainer.H:396
bool has_quantum_sync() const override
Definition: PhysicalParticleContainer.cpp:3389
std::vector< std::string > getUserRealAttribs() const override
Definition: PhysicalParticleContainer.H:382
PhotonEmissionFilterFunc getPhotonEmissionFilterFunc()
Definition: PhysicalParticleContainer.cpp:3414
std::string species_name
Definition: PhysicalParticleContainer.H:395
bool m_rz_random_theta
Definition: PhysicalParticleContainer.H:403
bool do_backward_propagation
Definition: PhysicalParticleContainer.H:402
PhysicalParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: PhysicalParticleContainer.cpp:247
amrex::Vector< amrex::Parser * > getUserRealAttribParser() const override
Definition: PhysicalParticleContainer.H:390
void AddPlasmaFlux(PlasmaInjector const &plasma_injector, amrex::Real dt)
Definition: PhysicalParticleContainer.cpp:1486
Definition: PlasmaInjector.H:42
Definition: QuantumSyncEngineWrapper.H:273
This is a general class used for resampling that is instantiated as a member of MultiParticleContaine...
Definition: Resampling.H:51
Definition: WarpXParticleContainer.H:53
Definition: WarpXParticleContainer.H:111
ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > ParticleTileType
Vector< T * > GetVecOfPtrs(Vector< T > &a)
i
Definition: check_interp_points_and_weights.py:174
name
Definition: run_automated.py:229
float dt
Definition: stencil.py:442
int z_shift
Definition: yt3d_mpi.py:45
Definition: Ionization.H:31
Functor that scales E and B by a factor before pushing the particles. This is used for rigid injectio...
Definition: ScaleFields.H:14