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 
50  int ispecies,
51  const std::string& name);
52 
54 
57  void BackwardCompatibility ();
58 
60 
61  virtual void InitData () override;
62 
63  virtual void ReadHeader (std::istream& is) override;
64 
65  virtual void WriteHeader (std::ostream& os) const override;
66 
67  virtual void InitIonizationModule () override;
68 
69  /*
70  * \brief Returns a pointer to the plasma injector.
71  */
72  virtual PlasmaInjector* GetPlasmaInjector () override;
73 
108  virtual void Evolve (int lev,
109  const amrex::MultiFab& Ex,
110  const amrex::MultiFab& Ey,
111  const amrex::MultiFab& Ez,
112  const amrex::MultiFab& Bx,
113  const amrex::MultiFab& By,
114  const amrex::MultiFab& Bz,
115  amrex::MultiFab& jx,
116  amrex::MultiFab& jy,
117  amrex::MultiFab& jz,
118  amrex::MultiFab* cjx,
119  amrex::MultiFab* cjy,
120  amrex::MultiFab* cjz,
121  amrex::MultiFab* rho,
122  amrex::MultiFab* crho,
123  const amrex::MultiFab* cEx,
124  const amrex::MultiFab* cEy,
125  const amrex::MultiFab* cEz,
126  const amrex::MultiFab* cBx,
127  const amrex::MultiFab* cBy,
128  const amrex::MultiFab* cBz,
129  amrex::Real t,
130  amrex::Real dt,
131  DtType a_dt_type=DtType::Full,
132  bool skip_deposition=false ) override;
133 
134  virtual void PushPX (WarpXParIter& pti,
135  amrex::FArrayBox const * exfab,
136  amrex::FArrayBox const * eyfab,
137  amrex::FArrayBox const * ezfab,
138  amrex::FArrayBox const * bxfab,
139  amrex::FArrayBox const * byfab,
140  amrex::FArrayBox const * bzfab,
141  const amrex::IntVect ngEB, const int /*e_is_nodal*/,
142  const long offset,
143  const long np_to_push,
144  int lev, int gather_lev,
145  amrex::Real dt, ScaleFields scaleFields,
146  DtType a_dt_type=DtType::Full);
147 
148  virtual void PushP (int lev, amrex::Real dt,
149  const amrex::MultiFab& Ex,
150  const amrex::MultiFab& Ey,
151  const amrex::MultiFab& Ez,
152  const amrex::MultiFab& Bx,
153  const amrex::MultiFab& By,
154  const amrex::MultiFab& Bz) override;
155 
157  long& nfine_current,
158  long& nfine_gather,
159  long const np,
160  WarpXParIter& pti,
161  int const lev,
162  amrex::iMultiFab const* current_masks,
163  amrex::iMultiFab const* gather_masks );
164 
165  virtual void PostRestart () final {}
166 
167  void SplitParticles (int lev);
168 
170  int lev,
171  amrex::IntVect ngEB,
172  const amrex::FArrayBox& Ex,
173  const amrex::FArrayBox& Ey,
174  const amrex::FArrayBox& Ez,
175  const amrex::FArrayBox& Bx,
176  const amrex::FArrayBox& By,
177  const amrex::FArrayBox& Bz);
178 
179  // Inject particles in Box 'part_box'
180  virtual void AddParticles (int lev);
181 
192  void AddPlasma (int lev, amrex::RealBox part_realbox = amrex::RealBox());
193 
199  void AddPlasmaFlux (amrex::Real dt);
200 
201  void MapParticletoBoostedFrame (amrex::ParticleReal& x, amrex::ParticleReal& y, amrex::ParticleReal& z,
202  amrex::ParticleReal& ux, amrex::ParticleReal& uy, amrex::ParticleReal& uz,
203  amrex::ParticleReal t_lab = 0._prt);
204 
205  void AddGaussianBeam (
206  const amrex::Real x_m, const amrex::Real y_m, const amrex::Real z_m,
207  const amrex::Real x_rms, const amrex::Real y_rms, const amrex::Real z_rms,
208  const amrex::Real x_cut, const amrex::Real y_cut, const amrex::Real z_cut,
209  const amrex::Real q_tot, long npart, const int do_symmetrize, const int symmetrization_order);
210 
215  void AddPlasmaFromFile (amrex::ParticleReal q_tot,
216  amrex::ParticleReal z_shift);
217 
218  void CheckAndAddParticle (
219  amrex::ParticleReal x, amrex::ParticleReal y, amrex::ParticleReal z,
220  amrex::ParticleReal ux, amrex::ParticleReal uy, amrex::ParticleReal uz,
221  amrex::ParticleReal weight,
229  amrex::ParticleReal t_lab= 0._prt);
230 
246  amrex::PinnedArenaAllocator>& pinned_tile,
247  const int n_external_attr_real,
248  const int n_external_attr_int,
249  const amrex::RandomEngine& engine) override final;
250 
290  void applyNCIFilter (
291  int lev, const amrex::Box& box,
292  amrex::Elixir& exeli, amrex::Elixir& eyeli, amrex::Elixir& ezeli,
293  amrex::Elixir& bxeli, amrex::Elixir& byeli, amrex::Elixir& bzeli,
294  amrex::FArrayBox& filtered_Ex, amrex::FArrayBox& filtered_Ey,
295  amrex::FArrayBox& filtered_Ez, amrex::FArrayBox& filtered_Bx,
296  amrex::FArrayBox& filtered_By, amrex::FArrayBox& filtered_Bz,
297  const amrex::FArrayBox& Ex, const amrex::FArrayBox& Ey,
298  const amrex::FArrayBox& Ez, const amrex::FArrayBox& Bx,
299  const amrex::FArrayBox& By, const amrex::FArrayBox& Bz,
300  amrex::FArrayBox const * & exfab, amrex::FArrayBox const * & eyfab,
301  amrex::FArrayBox const * & ezfab, amrex::FArrayBox const * & bxfab,
302  amrex::FArrayBox const * & byfab, amrex::FArrayBox const * & bzfab);
303 
310  void resample (const int timestep) override final;
311 
312 #ifdef WARPX_QED
313  //Functions decleared in WarpXParticleContainer.H
314  //containers for which QED processes could be relevant
315  //are expected to override these functions
316 
322  bool has_quantum_sync () const override;
323 
329  bool has_breit_wheeler () const override;
330 
336  (std::shared_ptr<BreitWheelerEngine> ptr) override;
337 
343  (std::shared_ptr<QuantumSynchrotronEngine> ptr) override;
344  //__________
345 
347 
349 #endif
350 
351 protected:
352  std::string species_name;
353  std::unique_ptr<PlasmaInjector> plasma_injector;
354 
355  // When true, adjust the transverse particle positions accounting
356  // for the difference between the Lorentz transformed time of the
357  // particle and the time of the boosted frame.
360  bool m_rz_random_theta = true;
361 
363 
364  // Inject particles during the whole simulation
365  void ContinuousInjection (const amrex::RealBox& injection_box) override;
366 
367  // Continuously inject a flux of particles from a defined surface
368  void ContinuousFluxInjection (const amrex::Real t, const amrex::Real dt) override;
369 
370  //This function return true if the PhysicalParticleContainer contains electrons
371  //or positrons, false otherwise
372 
373  //When true PhysicalParticleContainer tries to use a pusher including
374  //radiation reaction
376 
377  // A flag to enable saving of the previous timestep positions
379 
380 #ifdef WARPX_QED
381  // A flag to enable quantum_synchrotron process for leptons
382  bool m_do_qed_quantum_sync = false;
383 
384  // A flag to enable breit_wheeler process [photons only!!]
386 
387  // A smart pointer to an instance of a Quantum Synchrotron engine
388  std::shared_ptr<QuantumSynchrotronEngine> m_shr_p_qs_engine;
389 
390  // A smart pointer to an instance of a Breit Wheeler engine [photons only!]
391  std::shared_ptr<BreitWheelerEngine> m_shr_p_bw_engine;
392 #endif
393  /* Vector of user-defined integer attributes for species, species_name */
394  std::vector<std::string> m_user_int_attribs;
395  /* Vector of user-defined real attributes for species, species_name */
396  std::vector<std::string> m_user_real_attribs;
397  /* Vector of user-defined parser for initializing user-defined integer attributes */
398  std::vector< std::unique_ptr<amrex::Parser> > m_user_int_attrib_parser;
399  /* Vector of user-defined parser for initializing user-defined real attributes */
400  std::vector< std::unique_ptr<amrex::Parser> > m_user_real_attrib_parser;
401 
402 };
403 
404 #endif
DtType
Definition: WarpXDtType.H:11
Filter functor for the Breit Wheeler process.
Definition: QEDPairGeneration.H:38
Filter functor for the QED photon emission process.
Definition: QEDPhotonEmission.H:43
Definition: PhysicalParticleContainer.H:46
void AddPlasmaFlux(amrex::Real dt)
Definition: PhysicalParticleContainer.cpp:1413
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)
Definition: Partition.cpp:53
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:2433
std::vector< std::string > m_user_int_attribs
Definition: PhysicalParticleContainer.H:394
virtual void DefaultInitializeRuntimeAttributes(amrex::ParticleTile< amrex::Particle< NStructReal, NStructInt >, NArrayReal, NArrayInt, amrex::PinnedArenaAllocator > &pinned_tile, const int n_external_attr_real, const int n_external_attr_int, const amrex::RandomEngine &engine) override final
Default initialize runtime attributes in a tile. This routine does not initialize the first n_externa...
Definition: PhysicalParticleContainer.cpp:675
std::unique_ptr< PlasmaInjector > plasma_injector
Definition: PhysicalParticleContainer.H:353
void MapParticletoBoostedFrame(amrex::ParticleReal &x, amrex::ParticleReal &y, amrex::ParticleReal &z, amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, amrex::ParticleReal t_lab=0._prt)
Definition: PhysicalParticleContainer.cpp:395
void AddPlasmaFromFile(amrex::ParticleReal q_tot, amrex::ParticleReal z_shift)
Definition: PhysicalParticleContainer.cpp:562
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:2890
std::shared_ptr< BreitWheelerEngine > m_shr_p_bw_engine
Definition: PhysicalParticleContainer.H:391
Resampling m_resampler
Definition: PhysicalParticleContainer.H:362
void SplitParticles(int lev)
Definition: PhysicalParticleContainer.cpp:2247
bool m_do_qed_quantum_sync
Definition: PhysicalParticleContainer.H:382
void ContinuousFluxInjection(const amrex::Real t, const amrex::Real dt) override
Definition: PhysicalParticleContainer.cpp:2585
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: PhysicalParticleContainer.cpp:2575
bool has_breit_wheeler() const override
Definition: PhysicalParticleContainer.cpp:2956
void AddPlasma(int lev, amrex::RealBox part_realbox=amrex::RealBox())
Definition: PhysicalParticleContainer.cpp:891
bool m_do_qed_breit_wheeler
Definition: PhysicalParticleContainer.H:385
PairGenerationFilterFunc getPairGenerationFilterFunc()
Definition: PhysicalParticleContainer.cpp:2983
bool do_classical_radiation_reaction
Definition: PhysicalParticleContainer.H:375
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:1928
virtual ~PhysicalParticleContainer()
Definition: PhysicalParticleContainer.H:59
std::shared_ptr< QuantumSynchrotronEngine > m_shr_p_qs_engine
Definition: PhysicalParticleContainer.H:388
std::vector< std::unique_ptr< amrex::Parser > > m_user_int_attrib_parser
Definition: PhysicalParticleContainer.H:398
virtual void InitData() override
Definition: PhysicalParticleContainer.cpp:389
virtual void ReadHeader(std::istream &is) override
Definition: ParticleIO.cpp:108
virtual void AddParticles(int lev)
Definition: PhysicalParticleContainer.cpp:814
void BackwardCompatibility()
Definition: PhysicalParticleContainer.cpp:373
virtual void PostRestart() final
Definition: PhysicalParticleContainer.H:165
bool m_save_previous_position
Definition: PhysicalParticleContainer.H:378
virtual void InitIonizationModule() override
Definition: PhysicalParticleContainer.cpp:2822
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 ngEB, 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:2602
void set_quantum_sync_engine_ptr(std::shared_ptr< QuantumSynchrotronEngine > ptr) override
Definition: PhysicalParticleContainer.cpp:2970
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, const int symmetrization_order)
Definition: PhysicalParticleContainer.cpp:442
std::vector< std::string > m_user_real_attribs
Definition: PhysicalParticleContainer.H:396
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::ParticleReal t_lab=0._prt)
Definition: PhysicalParticleContainer.cpp:788
virtual void WriteHeader(std::ostream &os) const override
Definition: ParticleIO.cpp:115
void set_breit_wheeler_engine_ptr(std::shared_ptr< BreitWheelerEngine > ptr) override
Definition: PhysicalParticleContainer.cpp:2963
bool boost_adjust_transverse_positions
Definition: PhysicalParticleContainer.H:358
virtual PlasmaInjector * GetPlasmaInjector() override
Definition: PhysicalParticleContainer.cpp:2911
bool has_quantum_sync() const override
Definition: PhysicalParticleContainer.cpp:2951
std::vector< std::unique_ptr< amrex::Parser > > m_user_real_attrib_parser
Definition: PhysicalParticleContainer.H:400
PhotonEmissionFilterFunc getPhotonEmissionFilterFunc()
Definition: PhysicalParticleContainer.cpp:2976
std::string species_name
Definition: PhysicalParticleContainer.H:352
bool m_rz_random_theta
Definition: PhysicalParticleContainer.H:360
bool do_backward_propagation
Definition: PhysicalParticleContainer.H:359
PhysicalParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: PhysicalParticleContainer.cpp:232
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:2916
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:2170
Definition: PlasmaInjector.H:41
This is a general class used for resampling that is instantiated as a member of MultiParticleContaine...
Definition: Resampling.H:42
Definition: WarpXParticleContainer.H:53
Definition: WarpXParticleContainer.H:105
static constexpr int NArrayInt
static constexpr int NArrayReal
name
Definition: run_automated.py:229
float dt
Definition: stencil.py:440
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