WarpX
WarpXParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2019-2020 Andrew Myers, Axel Huebl, David Grote
2  * Jean-Luc Vay, Junmin Gu, Luca Fedeli
3  * Maxence Thevenet, Remi Lehe, Revathi Jambunathan
4  * Weiqun Zhang, Yinjian Zhao
5  *
6  * This file is part of WarpX.
7  *
8  * License: BSD-3-Clause-LBNL
9  */
10 #ifndef WARPX_WarpXParticleContainer_H_
11 #define WARPX_WarpXParticleContainer_H_
12 
14 
15 #include "Evolve/WarpXDtType.H"
18 
19 #ifdef WARPX_QED
22 #endif
25 
26 #include <AMReX_Array.H>
27 #include <AMReX_FArrayBox.H>
28 #include <AMReX_GpuContainers.H>
29 #include <AMReX_INT.H>
30 #include <AMReX_ParIter.H>
31 #include <AMReX_Particles.H>
32 #include <AMReX_Random.H>
33 #include <AMReX_REAL.H>
34 #include <AMReX_StructOfArrays.H>
35 #include <AMReX_Vector.H>
36 
37 #include <AMReX_BaseFwd.H>
38 #include <AMReX_AmrCoreFwd.H>
39 
40 #include <array>
41 #include <iosfwd>
42 #include <map>
43 #include <memory>
44 #include <string>
45 #include <utility>
46 
47 using namespace amrex::literals;
48 
50  : public amrex::ParIter<0,0,PIdx::nattribs>
51 {
52 public:
54 
55  WarpXParIter (ContainerType& pc, int level);
56 
57  WarpXParIter (ContainerType& pc, int level, amrex::MFItInfo& info);
58 
59  const std::array<RealVector, PIdx::nattribs>& GetAttribs () const {
60  return GetStructOfArrays().GetRealData();
61  }
62 
63  std::array<RealVector, PIdx::nattribs>& GetAttribs () {
64  return GetStructOfArrays().GetRealData();
65  }
66 
67  const RealVector& GetAttribs (int comp) const {
68  return GetStructOfArrays().GetRealData(comp);
69  }
70 
71  RealVector& GetAttribs (int comp) {
72  return GetStructOfArrays().GetRealData(comp);
73  }
74 
75  IntVector& GetiAttribs (int comp) {
76  return GetStructOfArrays().GetIntData(comp);
77  }
78 };
79 
102  : public NamedComponentParticleContainer<amrex::DefaultAllocator>
103 {
104 public:
106 
107  // amrex::StructOfArrays with DiagIdx::nattribs amrex::ParticleReal components
108  // and 0 int components for the particle data.
110  // DiagnosticParticles is a vector, with one element per MR level.
111  // DiagnosticParticles[lev] is typically a key-value pair where the key is
112  // a pair [grid_index, tile_index], and the value is the corresponding
113  // DiagnosticParticleData (see above) on this tile.
115 
116  WarpXParticleContainer (amrex::AmrCore* amr_core, int ispecies);
118 
119  virtual void InitData () = 0;
120 
121  virtual void InitIonizationModule () {}
122 
128  virtual void Evolve (int lev,
129  const amrex::MultiFab& Ex, const amrex::MultiFab& Ey, const amrex::MultiFab& Ez,
130  const amrex::MultiFab& Bx, const amrex::MultiFab& By, const amrex::MultiFab& Bz,
133  amrex::MultiFab* rho, amrex::MultiFab* crho,
134  const amrex::MultiFab* cEx, const amrex::MultiFab* cEy, const amrex::MultiFab* cEz,
135  const amrex::MultiFab* cBx, const amrex::MultiFab* cBy, const amrex::MultiFab* cBz,
136  amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full, bool skip_deposition=false) = 0;
137 
138  virtual void PostRestart () = 0;
139 
140  void AllocData ();
141 
146  virtual void DefaultInitializeRuntimeAttributes (
147  amrex::ParticleTile<NStructReal, NStructInt, NArrayReal,
148  NArrayInt,amrex::PinnedArenaAllocator>& pinned_tile,
149  const int n_external_attr_real,
150  const int n_external_attr_int,
151  const amrex::RandomEngine& engine) = 0;
152 
158  void PushX ( amrex::Real dt);
159  void PushX (int lev, amrex::Real dt);
160 
164  virtual void PushP (int lev, amrex::Real dt,
165  const amrex::MultiFab& Ex,
166  const amrex::MultiFab& Ey,
167  const amrex::MultiFab& Ez,
168  const amrex::MultiFab& Bx,
169  const amrex::MultiFab& By,
170  const amrex::MultiFab& Bz) = 0;
171 
183  void DepositCurrent (amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& J,
184  const amrex::Real dt, const amrex::Real relative_time);
185 
196  void DepositCharge (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
197  const bool local = false, const bool reset = false,
198  const bool do_rz_volume_scaling = false,
199  const bool interpolate_across_levels = true,
200  const int icomp = 0);
201 
202  std::unique_ptr<amrex::MultiFab> GetChargeDensity(int lev, bool local = false);
203 
204  virtual void DepositCharge (WarpXParIter& pti,
205  RealVector const & wp,
206  const int * const ion_lev,
207  amrex::MultiFab* rho,
208  int icomp,
209  const long offset,
210  const long np_to_depose,
211  int thread_num,
212  int lev,
213  int depos_lev);
214 
215  virtual void DepositCurrent (WarpXParIter& pti,
216  RealVector const & wp,
217  RealVector const & uxp,
218  RealVector const & uyp,
219  RealVector const & uzp,
220  int const * const ion_lev,
221  amrex::MultiFab* const jx,
222  amrex::MultiFab* const jy,
223  amrex::MultiFab* const jz,
224  long const offset,
225  long const np_to_depose,
226  int const thread_num,
227  int const lev,
228  int const depos_lev,
229  amrex::Real const dt,
230  amrex::Real const relative_time);
231 
232  // If particles start outside of the domain, ContinuousInjection
233  // makes sure that they are initialized when they enter the domain, and
234  // NOT before. Virtual function, overriden by derived classes.
235  // Current status:
236  // PhysicalParticleContainer: implemented.
237  // LaserParticleContainer: implemented.
238  // RigidInjectedParticleContainer: not implemented.
239  virtual void ContinuousInjection(const amrex::RealBox& /*injection_box*/) {}
240  // Update optional sub-class-specific injection location.
241  virtual void UpdateContinuousInjectionPosition(amrex::Real /*dt*/) {}
242 
243  // Inject a continuous flux of particles from a defined plane
244  virtual void ContinuousFluxInjection(amrex::Real /*t*/, amrex::Real /*dt*/) {}
245 
250  amrex::ParticleReal sumParticleCharge(bool local = false);
251 
252  std::array<amrex::ParticleReal, 3> meanParticleVelocity(bool local = false);
253 
254  amrex::ParticleReal maxParticleVelocity(bool local = false);
255 
280  void AddNParticles (int lev,
281  int n, const amrex::ParticleReal* x, const amrex::ParticleReal* y, const amrex::ParticleReal* z,
282  const amrex::ParticleReal* ux, const amrex::ParticleReal* uy, const amrex::ParticleReal* uz,
283  const int nattr_real, const amrex::ParticleReal* attr_real,
284  const int nattr_int, const int* attr_int,
285  int uniqueparticles, amrex::Long id=-1);
286 
287  virtual void ReadHeader (std::istream& is) = 0;
288 
289  virtual void WriteHeader (std::ostream& os) const = 0;
290 
291  static void ReadParameters ();
292 
293  static void BackwardCompatibility ();
294 
297  void ApplyBoundaryConditions ();
298 
299  bool do_splitting = false;
300  int do_not_deposit = 0;
301  bool initialize_self_fields = false;
302  amrex::Real self_fields_required_precision = amrex::Real(1.e-11);
303  amrex::Real self_fields_absolute_tolerance = amrex::Real(0.0);
304  int self_fields_max_iters = 200;
305  int self_fields_verbosity = 2;
306 
307  // split along diagonals (0) or axes (1)
308  int split_type = 0;
309 
314  void SetDoBackTransformedParticles(const bool do_back_transformed_particles) {
315  m_do_back_transformed_particles = do_back_transformed_particles;
316  }
317 
318  //amrex::Real getCharge () {return charge;}
319  amrex::ParticleReal getCharge () const {return charge;}
320  //amrex::Real getMass () {return mass;}
321  amrex::ParticleReal getMass () const {return mass;}
322 
323  int DoFieldIonization() const { return do_field_ionization; }
324 
325 #ifdef WARPX_QED
326  //Species for which QED effects are relevant should override these methods
327  virtual bool has_quantum_sync() const {return false;}
328  virtual bool has_breit_wheeler() const {return false;}
329 
330  int DoQED() const { return has_quantum_sync() || has_breit_wheeler(); }
331 #else
332  int DoQED() const { return false; }
333 #endif
334 
335  /* \brief This function tests if the current species
336  * is of a given PhysicalSpecies (specified as a template parameter).
337  * @tparam PhysSpec the PhysicalSpecies to test against
338  * @return the result of the test
339  */
340  template<PhysicalSpecies PhysSpec>
341  bool AmIA () const noexcept {return (physical_species == PhysSpec);}
342 
346  std::string getSpeciesTypeName () const {return species::get_name(physical_species);}
347 
354  virtual void resample (const int /*timestep*/) {}
355 
362  void defineAllParticleTiles () noexcept;
363 
364 protected:
366 
367  amrex::ParticleReal charge;
368  amrex::ParticleReal mass;
370 
371  // Controls boundaries for particles exiting the domain
373 
375  bool m_deposit_on_main_grid = false;
376 
378  bool m_gather_from_main_grid = false;
379 
380  int do_not_push = 0;
381  int do_not_gather = 0;
382 
383  // Whether to allow particles outside of the simulation domain to be
384  // initialized when they enter the domain.
385  // This is currently required because continuous injection does not
386  // support all features allowed by direct injection.
387  int do_continuous_injection = 0;
388 
389  int do_field_ionization = 0;
393  int ionization_initial_level = 0;
398  std::string physical_element;
399 
400  int do_resampling = 0;
401 
403  bool m_do_back_transformed_particles = false;
404 
405 #ifdef WARPX_QED
406  //Species can receive a shared pointer to a QED engine (species for
407  //which this is relevant should override these functions)
408  virtual void
409  set_breit_wheeler_engine_ptr(std::shared_ptr<BreitWheelerEngine>){}
410  virtual void
411  set_quantum_sync_engine_ptr(std::shared_ptr<QuantumSynchrotronEngine>){}
412 
419 
420 #endif
425 
426 public:
427  using PairIndex = std::pair<int, int>;
428  using TmpParticleTile = std::array<amrex::Gpu::DeviceVector<amrex::ParticleReal>,
431 
432  TmpParticles getTmpParticleData () const noexcept {return tmp_particle_data;}
433 protected:
435 
436 private:
437  virtual void particlePostLocate(ParticleType& p, const amrex::ParticleLocData& pld,
438  const int lev) override;
439 
440 };
441 
442 #endif
const RealVector & GetAttribs(int comp) const
Definition: WarpXParticleContainer.H:67
virtual void UpdateContinuousInjectionPosition(amrex::Real)
Definition: WarpXParticleContainer.H:241
DtType
Definition: WarpXDtType.H:10
std::array< amrex::Gpu::DeviceVector< amrex::ParticleReal >, TmpIdx::nattribs > TmpParticleTile
Definition: WarpXParticleContainer.H:429
virtual void set_breit_wheeler_engine_ptr(std::shared_ptr< BreitWheelerEngine >)
Definition: WarpXParticleContainer.H:409
int m_qed_breit_wheeler_ele_product
Definition: WarpXParticleContainer.H:413
amrex::Vector< amrex::FArrayBox > local_rho
Definition: WarpXParticleContainer.H:421
typename SoA::IntVector IntVector
amrex::Gpu::DeviceVector< amrex::Real > adk_power
Definition: WarpXParticleContainer.H:395
int m_qed_breit_wheeler_pos_product
Definition: WarpXParticleContainer.H:415
std::string getSpeciesTypeName() const
This function returns a string containing the name of the species type.
Definition: WarpXParticleContainer.H:346
RealVector & GetAttribs(int comp)
Definition: WarpXParticleContainer.H:71
IntVector & GetiAttribs(int comp)
Definition: WarpXParticleContainer.H:75
int DoFieldIonization() const
Definition: WarpXParticleContainer.H:323
Definition: ParticleBoundaries.H:18
PhysicalSpecies
Definition: SpeciesPhysicalProperties.H:16
const std::array< RealVector, PIdx::nattribs > & GetAttribs() const
Definition: WarpXParticleContainer.H:59
TmpParticles getTmpParticleData() const noexcept
Definition: WarpXParticleContainer.H:432
virtual void set_quantum_sync_engine_ptr(std::shared_ptr< QuantumSynchrotronEngine >)
Definition: WarpXParticleContainer.H:411
bool AmIA() const noexcept
Definition: WarpXParticleContainer.H:341
int dt
Definition: Stencil.py:468
int DoQED() const
Definition: WarpXParticleContainer.H:330
std::string get_name(const PhysicalSpecies &ps)
Returns the name associated to a PhysicalSpecies.
Definition: SpeciesPhysicalProperties.cpp:294
virtual void ContinuousInjection(const amrex::RealBox &)
Definition: WarpXParticleContainer.H:239
amrex::ParticleReal getCharge() const
Definition: WarpXParticleContainer.H:319
amrex::Gpu::DeviceVector< amrex::Real > adk_prefactor
Definition: WarpXParticleContainer.H:396
amrex::ParticleReal charge
Definition: WarpXParticleContainer.H:367
amrex::ParticleReal getMass() const
Definition: WarpXParticleContainer.H:321
amrex::ParticleReal mass
Definition: WarpXParticleContainer.H:368
PhysicalSpecies physical_species
Definition: WarpXParticleContainer.H:369
amrex::Vector< amrex::FArrayBox > local_jz
Definition: WarpXParticleContainer.H:424
virtual ~WarpXParticleContainer()
Definition: WarpXParticleContainer.H:117
Definition: NamedComponentParticleContainer.H:45
std::string ionization_product_name
Definition: WarpXParticleContainer.H:391
amrex::Gpu::DeviceVector< amrex::Real > ionization_energies
Definition: WarpXParticleContainer.H:394
TmpParticles tmp_particle_data
Definition: WarpXParticleContainer.H:434
int n
Definition: run_libensemble_on_warpx.py:67
int species_id
Definition: WarpXParticleContainer.H:365
virtual void InitIonizationModule()
Definition: WarpXParticleContainer.H:121
amrex::Gpu::DeviceVector< amrex::Real > adk_exp_prefactor
Definition: WarpXParticleContainer.H:397
Definition: WarpXParticleContainer_fwd.H:36
virtual bool has_quantum_sync() const
Definition: WarpXParticleContainer.H:327
std::string physical_element
Definition: WarpXParticleContainer.H:398
int ionization_product
Definition: WarpXParticleContainer.H:390
void SetDoBackTransformedParticles(const bool do_back_transformed_particles)
Definition: WarpXParticleContainer.H:314
WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleUtils.cpp:29
virtual void ContinuousFluxInjection(amrex::Real, amrex::Real)
Definition: WarpXParticleContainer.H:244
std::string m_qed_quantum_sync_phot_product_name
Definition: WarpXParticleContainer.H:418
virtual void resample(const int)
Virtual method to resample the species. Overriden by PhysicalParticleContainer only. Empty body is here because making the method purely virtual would mean that we need to override the method for every derived class. Note that in practice this function is never called because resample() is only called for PhysicalParticleContainers.
Definition: WarpXParticleContainer.H:354
virtual bool has_breit_wheeler() const
Definition: WarpXParticleContainer.H:328
typename SoA::RealVector RealVector
std::string m_qed_breit_wheeler_ele_product_name
Definition: WarpXParticleContainer.H:414
std::pair< int, int > PairIndex
Definition: WarpXParticleContainer.H:427
amrex::Vector< amrex::FArrayBox > local_jx
Definition: WarpXParticleContainer.H:422
std::string m_qed_breit_wheeler_pos_product_name
Definition: WarpXParticleContainer.H:416
int ion_atomic_number
Definition: WarpXParticleContainer.H:392
Definition: WarpXParticleContainer.H:49
std::array< RealVector, PIdx::nattribs > & GetAttribs()
Definition: WarpXParticleContainer.H:63
int m_qed_quantum_sync_phot_product
Definition: WarpXParticleContainer.H:417
friend MultiParticleContainer
Definition: WarpXParticleContainer.H:105
Definition: WarpXParticleContainer.H:101
amrex::Vector< amrex::FArrayBox > local_jy
Definition: WarpXParticleContainer.H:423
ParticleBoundaries m_boundary_conditions
Definition: WarpXParticleContainer.H:372