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  virtual void GetParticleSlice(const int /*direction*/, const amrex::Real /*z_old*/,
141  const amrex::Real /*z_new*/, const amrex::Real /*t_boost*/,
142  const amrex::Real /*t_lab*/, const amrex::Real /*dt*/,
143  DiagnosticParticles& /*diagnostic_particles*/) {}
144 
145  void AllocData ();
146 
151  virtual void DefaultInitializeRuntimeAttributes (
152  amrex::ParticleTile<NStructReal, NStructInt, NArrayReal,
153  NArrayInt,amrex::PinnedArenaAllocator>& pinned_tile,
154  const int n_external_attr_real,
155  const int n_external_attr_int,
156  const amrex::RandomEngine& engine) = 0;
157 
163  void PushX ( amrex::Real dt);
164  void PushX (int lev, amrex::Real dt);
165 
169  virtual void PushP (int lev, amrex::Real dt,
170  const amrex::MultiFab& Ex,
171  const amrex::MultiFab& Ey,
172  const amrex::MultiFab& Ez,
173  const amrex::MultiFab& Bx,
174  const amrex::MultiFab& By,
175  const amrex::MultiFab& Bz) = 0;
176 
188  void DepositCurrent (amrex::Vector<std::array< std::unique_ptr<amrex::MultiFab>, 3 > >& J,
189  const amrex::Real dt, const amrex::Real relative_time);
190 
201  void DepositCharge (amrex::Vector<std::unique_ptr<amrex::MultiFab> >& rho,
202  const bool local = false, const bool reset = false,
203  const bool do_rz_volume_scaling = false,
204  const bool interpolate_across_levels = true,
205  const int icomp = 0);
206 
207  std::unique_ptr<amrex::MultiFab> GetChargeDensity(int lev, bool local = false);
208 
209  virtual void DepositCharge (WarpXParIter& pti,
210  RealVector const & wp,
211  const int * const ion_lev,
212  amrex::MultiFab* rho,
213  int icomp,
214  const long offset,
215  const long np_to_depose,
216  int thread_num,
217  int lev,
218  int depos_lev);
219 
220  virtual void DepositCurrent (WarpXParIter& pti,
221  RealVector const & wp,
222  RealVector const & uxp,
223  RealVector const & uyp,
224  RealVector const & uzp,
225  int const * const ion_lev,
226  amrex::MultiFab* const jx,
227  amrex::MultiFab* const jy,
228  amrex::MultiFab* const jz,
229  long const offset,
230  long const np_to_depose,
231  int const thread_num,
232  int const lev,
233  int const depos_lev,
234  amrex::Real const dt,
235  amrex::Real const relative_time);
236 
237  // If particles start outside of the domain, ContinuousInjection
238  // makes sure that they are initialized when they enter the domain, and
239  // NOT before. Virtual function, overriden by derived classes.
240  // Current status:
241  // PhysicalParticleContainer: implemented.
242  // LaserParticleContainer: implemented.
243  // RigidInjectedParticleContainer: not implemented.
244  virtual void ContinuousInjection(const amrex::RealBox& /*injection_box*/) {}
245  // Update optional sub-class-specific injection location.
246  virtual void UpdateContinuousInjectionPosition(amrex::Real /*dt*/) {}
247 
248  // Inject a continuous flux of particles from a defined plane
249  virtual void ContinuousFluxInjection(amrex::Real /*t*/, amrex::Real /*dt*/) {}
250 
255  amrex::ParticleReal sumParticleCharge(bool local = false);
256 
257  std::array<amrex::ParticleReal, 3> meanParticleVelocity(bool local = false);
258 
259  amrex::ParticleReal maxParticleVelocity(bool local = false);
260 
285  void AddNParticles (int lev,
286  int n, const amrex::ParticleReal* x, const amrex::ParticleReal* y, const amrex::ParticleReal* z,
287  const amrex::ParticleReal* vx, const amrex::ParticleReal* vy, const amrex::ParticleReal* vz,
288  const int nattr_real, const amrex::ParticleReal* attr_real,
289  const int nattr_int, const int* attr_int,
290  int uniqueparticles, amrex::Long id=-1);
291 
292  virtual void ReadHeader (std::istream& is) = 0;
293 
294  virtual void WriteHeader (std::ostream& os) const = 0;
295 
296  static void ReadParameters ();
297 
298  static void BackwardCompatibility ();
299 
305  void ApplyBoundaryConditions ();
306 
307  bool do_splitting = false;
308  int do_not_deposit = 0;
309  bool initialize_self_fields = false;
310  amrex::Real self_fields_required_precision = amrex::Real(1.e-11);
311  amrex::Real self_fields_absolute_tolerance = amrex::Real(0.0);
312  int self_fields_max_iters = 200;
313  int self_fields_verbosity = 2;
314 
315  // split along diagonals (0) or axes (1)
316  int split_type = 0;
317 
318  int doBackTransformedDiagnostics () const { return do_back_transformed_diagnostics; }
323  void SetDoBackTransformedParticles(const bool do_back_transformed_particles) {
324  m_do_back_transformed_particles = do_back_transformed_particles;
325  }
326 
327  //amrex::Real getCharge () {return charge;}
328  amrex::ParticleReal getCharge () const {return charge;}
329  //amrex::Real getMass () {return mass;}
330  amrex::ParticleReal getMass () const {return mass;}
331 
332  int DoFieldIonization() const { return do_field_ionization; }
333 
334 #ifdef WARPX_QED
335  //Species for which QED effects are relevant should override these methods
336  virtual bool has_quantum_sync() const {return false;}
337  virtual bool has_breit_wheeler() const {return false;}
338 
339  int DoQED() const { return has_quantum_sync() || has_breit_wheeler(); }
340 #else
341  int DoQED() const { return false; }
342 #endif
343 
344  /* \brief This function tests if the current species
345  * is of a given PhysicalSpecies (specified as a template parameter).
346  * @tparam PhysSpec the PhysicalSpecies to test against
347  * @return the result of the test
348  */
349  template<PhysicalSpecies PhysSpec>
350  bool AmIA () const noexcept {return (physical_species == PhysSpec);}
351 
355  std::string getSpeciesTypeName () const {return species::get_name(physical_species);}
356 
363  virtual void resample (const int /*timestep*/) {}
364 
371  void defineAllParticleTiles () noexcept;
372 
373 protected:
375 
376  amrex::ParticleReal charge;
377  amrex::ParticleReal mass;
379 
380  // Controls boundaries for particles exiting the domain
382 
384  bool m_deposit_on_main_grid = false;
385 
387  bool m_gather_from_main_grid = false;
388 
389  int do_not_push = 0;
390  int do_not_gather = 0;
391 
392  // Whether to allow particles outside of the simulation domain to be
393  // initialized when they enter the domain.
394  // This is currently required because continuous injection does not
395  // support all features allowed by direct injection.
396  int do_continuous_injection = 0;
397 
398  int do_field_ionization = 0;
402  int ionization_initial_level = 0;
407  std::string physical_element;
408 
409  int do_resampling = 0;
410 
411  int do_back_transformed_diagnostics = 1;
413  bool m_do_back_transformed_particles = false;
414 
415 #ifdef WARPX_QED
416  //Species can receive a shared pointer to a QED engine (species for
417  //which this is relevant should override these functions)
418  virtual void
419  set_breit_wheeler_engine_ptr(std::shared_ptr<BreitWheelerEngine>){}
420  virtual void
421  set_quantum_sync_engine_ptr(std::shared_ptr<QuantumSynchrotronEngine>){}
422 
429 
430 #endif
435 
436 public:
437  using PairIndex = std::pair<int, int>;
438  using TmpParticleTile = std::array<amrex::Gpu::DeviceVector<amrex::ParticleReal>,
441 
442  TmpParticles getTmpParticleData () const noexcept {return tmp_particle_data;}
443 protected:
445 
446 private:
447  virtual void particlePostLocate(ParticleType& p, const amrex::ParticleLocData& pld,
448  const int lev) override;
449 
450 };
451 
452 #endif
const RealVector & GetAttribs(int comp) const
Definition: WarpXParticleContainer.H:67
virtual void UpdateContinuousInjectionPosition(amrex::Real)
Definition: WarpXParticleContainer.H:246
DtType
Definition: WarpXDtType.H:10
std::array< amrex::Gpu::DeviceVector< amrex::ParticleReal >, TmpIdx::nattribs > TmpParticleTile
Definition: WarpXParticleContainer.H:439
virtual void GetParticleSlice(const int, const amrex::Real, const amrex::Real, const amrex::Real, const amrex::Real, const amrex::Real, DiagnosticParticles &)
Definition: WarpXParticleContainer.H:140
virtual void set_breit_wheeler_engine_ptr(std::shared_ptr< BreitWheelerEngine >)
Definition: WarpXParticleContainer.H:419
int m_qed_breit_wheeler_ele_product
Definition: WarpXParticleContainer.H:423
amrex::Vector< amrex::FArrayBox > local_rho
Definition: WarpXParticleContainer.H:431
typename SoA::IntVector IntVector
amrex::Gpu::DeviceVector< amrex::Real > adk_power
Definition: WarpXParticleContainer.H:404
int m_qed_breit_wheeler_pos_product
Definition: WarpXParticleContainer.H:425
std::string getSpeciesTypeName() const
This function returns a string containing the name of the species type.
Definition: WarpXParticleContainer.H:355
RealVector & GetAttribs(int comp)
Definition: WarpXParticleContainer.H:71
IntVector & GetiAttribs(int comp)
Definition: WarpXParticleContainer.H:75
def x
Definition: read_lab_particles.py:26
int DoFieldIonization() const
Definition: WarpXParticleContainer.H:332
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:442
virtual void set_quantum_sync_engine_ptr(std::shared_ptr< QuantumSynchrotronEngine >)
Definition: WarpXParticleContainer.H:421
bool AmIA() const noexcept
Definition: WarpXParticleContainer.H:350
int dt
Definition: Stencil.py:468
int DoQED() const
Definition: WarpXParticleContainer.H:339
std::string get_name(const PhysicalSpecies &ps)
Returns the name associated to a PhysicalSpecies.
Definition: SpeciesPhysicalProperties.cpp:292
virtual void ContinuousInjection(const amrex::RealBox &)
Definition: WarpXParticleContainer.H:244
amrex::ParticleReal getCharge() const
Definition: WarpXParticleContainer.H:328
amrex::Gpu::DeviceVector< amrex::Real > adk_prefactor
Definition: WarpXParticleContainer.H:405
def z
Definition: read_lab_particles.py:27
amrex::ParticleReal charge
Definition: WarpXParticleContainer.H:376
amrex::ParticleReal getMass() const
Definition: WarpXParticleContainer.H:330
amrex::ParticleReal mass
Definition: WarpXParticleContainer.H:377
PhysicalSpecies physical_species
Definition: WarpXParticleContainer.H:378
amrex::Vector< amrex::FArrayBox > local_jz
Definition: WarpXParticleContainer.H:434
virtual ~WarpXParticleContainer()
Definition: WarpXParticleContainer.H:117
int doBackTransformedDiagnostics() const
Definition: WarpXParticleContainer.H:318
Definition: NamedComponentParticleContainer.H:45
std::string ionization_product_name
Definition: WarpXParticleContainer.H:400
amrex::Gpu::DeviceVector< amrex::Real > ionization_energies
Definition: WarpXParticleContainer.H:403
TmpParticles tmp_particle_data
Definition: WarpXParticleContainer.H:444
int n
Definition: run_libensemble_on_warpx.py:67
int species_id
Definition: WarpXParticleContainer.H:374
virtual void InitIonizationModule()
Definition: WarpXParticleContainer.H:121
amrex::Gpu::DeviceVector< amrex::Real > adk_exp_prefactor
Definition: WarpXParticleContainer.H:406
Definition: WarpXParticleContainer_fwd.H:36
virtual bool has_quantum_sync() const
Definition: WarpXParticleContainer.H:336
std::string physical_element
Definition: WarpXParticleContainer.H:407
int ionization_product
Definition: WarpXParticleContainer.H:399
void SetDoBackTransformedParticles(const bool do_back_transformed_particles)
Definition: WarpXParticleContainer.H:323
WarpXParticleContainer::ParticleType ParticleType
Definition: ParticleUtils.cpp:29
virtual void ContinuousFluxInjection(amrex::Real, amrex::Real)
Definition: WarpXParticleContainer.H:249
std::string m_qed_quantum_sync_phot_product_name
Definition: WarpXParticleContainer.H:428
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:363
virtual bool has_breit_wheeler() const
Definition: WarpXParticleContainer.H:337
typename SoA::RealVector RealVector
std::string m_qed_breit_wheeler_ele_product_name
Definition: WarpXParticleContainer.H:424
std::pair< int, int > PairIndex
Definition: WarpXParticleContainer.H:437
amrex::Vector< amrex::FArrayBox > local_jx
Definition: WarpXParticleContainer.H:432
std::string m_qed_breit_wheeler_pos_product_name
Definition: WarpXParticleContainer.H:426
int ion_atomic_number
Definition: WarpXParticleContainer.H:401
Definition: WarpXParticleContainer.H:49
std::array< RealVector, PIdx::nattribs > & GetAttribs()
Definition: WarpXParticleContainer.H:63
int m_qed_quantum_sync_phot_product
Definition: WarpXParticleContainer.H:427
friend MultiParticleContainer
Definition: WarpXParticleContainer.H:105
Definition: WarpXParticleContainer.H:101
amrex::Vector< amrex::FArrayBox > local_jy
Definition: WarpXParticleContainer.H:433
ParticleBoundaries m_boundary_conditions
Definition: WarpXParticleContainer.H:381