ARTEMIS
LaserParticleContainer.H
Go to the documentation of this file.
1 /* Copyright 2019 Andrew Myers, Axel Huebl, David Grote
2  * Luca Fedeli, Maxence Thevenet, Remi Lehe
3  * Weiqun Zhang
4  *
5  * This file is part of WarpX.
6  *
7  * License: BSD-3-Clause-LBNL
8  */
9 #ifndef WARPX_LaserParticleContainer_H_
10 #define WARPX_LaserParticleContainer_H_
11 
12 #include "Evolve/WarpXDtType.H"
13 #include "Laser/LaserProfiles.H"
14 #include "WarpXParticleContainer.H"
15 
16 #include <AMReX_Extension.H>
17 #include <AMReX_Random.H>
18 #include <AMReX_REAL.H>
19 #include <AMReX_RealBox.H>
20 #include <AMReX_Vector.H>
21 
22 #include <AMReX_BaseFwd.H>
23 #include <AMReX_AmrCoreFwd.H>
24 
25 #include <limits>
26 #include <memory>
27 #include <string>
28 
41  : public WarpXParticleContainer
42 {
43 public:
44  LaserParticleContainer (amrex::AmrCore* amr_core, int ispecies, const std::string& name);
46 
47  virtual void InitData () final;
48 
53  amrex::ParticleTile<amrex::Particle<NStructReal, NStructInt>,
54  NArrayReal, NArrayInt, amrex::PinnedArenaAllocator>& /*pinned_tile*/,
55  const int /*n_external_attr_real*/,
56  const int /*n_external_attr_int*/,
57  const amrex::RandomEngine& /*engine*/) override final {}
58 
59  virtual void ReadHeader (std::istream& is) final;
60 
61  virtual void WriteHeader (std::ostream& os) const final;
62 
63  virtual void Evolve (int lev,
64  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
65  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
68  amrex::MultiFab* rho, amrex::MultiFab* crho,
69  const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*,
70  const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*,
71  amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full,
72  bool skip_deposition=false) final;
73 
74  virtual void PushP (int lev, amrex::Real dt,
75  const amrex::MultiFab& ,
76  const amrex::MultiFab& ,
77  const amrex::MultiFab& ,
78  const amrex::MultiFab& ,
79  const amrex::MultiFab& ,
80  const amrex::MultiFab& ) final;
81 
82  virtual void PostRestart () final;
83 
84  void calculate_laser_plane_coordinates (const WarpXParIter& pti, const int np,
85  amrex::Real * AMREX_RESTRICT const pplane_Xp,
86  amrex::Real * AMREX_RESTRICT const pplane_Yp);
87 
88  void update_laser_particle (WarpXParIter& pti, const int np, amrex::ParticleReal * AMREX_RESTRICT const puxp,
89  amrex::ParticleReal * AMREX_RESTRICT const puyp,
90  amrex::ParticleReal * AMREX_RESTRICT const puzp,
91  amrex::ParticleReal const * AMREX_RESTRICT const pwp,
92  amrex::Real const * AMREX_RESTRICT const amplitude,
93  const amrex::Real dt);
94 
95 protected:
96 
97  std::string m_laser_name;
98 
99 private:
100  // runtime paramters
101  amrex::Vector<amrex::Real> m_position;
102  amrex::Vector<amrex::Real> m_nvec;
103  amrex::Vector<amrex::Real> m_p_X;// ! Polarization
104 
105  amrex::Real m_e_max = std::numeric_limits<amrex::Real>::quiet_NaN();
106  amrex::Real m_wavelength = std::numeric_limits<amrex::Real>::quiet_NaN();
107 
108  amrex::Real m_Z0_lab = 0; // Position of the antenna in the lab frame
109 
111 
112  // computed using runtime parameters
113  amrex::Vector<amrex::Real> m_p_Y;
114  amrex::Vector<amrex::Real> m_u_X;
115  amrex::Vector<amrex::Real> m_u_Y;
116  amrex::Real m_weight = std::numeric_limits<amrex::Real>::quiet_NaN();
117  amrex::Real m_mobility = std::numeric_limits<amrex::Real>::quiet_NaN();
118 
119 
120  // laser particle domain
122  // Theoretical position of the antenna. Used if do_continuous_injection=1.
123  // Track the position of the antenna until it enters the simulation domain.
125 
126  void ComputeSpacing (int lev, amrex::Real& Sx, amrex::Real& Sy) const;
127  void ComputeWeightMobility (amrex::Real Sx, amrex::Real Sy);
128  void InitData (int lev);
129  // Inject the laser antenna during the simulation, if it started
130  // outside of the simulation domain and enters it.
131  void ContinuousInjection(const amrex::RealBox& injection_box) override;
132  // Update position of the antenna
133  void UpdateContinuousInjectionPosition(amrex::Real dt) override;
134 
135  // Unique (smart) pointer to the laser profile
136  std::unique_ptr<WarpXLaserProfiles::ILaserProfile> m_up_laser_profile;
137 
138  // Flag to disable the laser (e.g., if e_max is 0)
139  bool m_enabled = true;
140 };
141 
142 #endif
DtType
Definition: WarpXDtType.H:11
Definition: LaserParticleContainer.H:42
void update_laser_particle(WarpXParIter &pti, const int np, amrex::ParticleReal *AMREX_RESTRICT const puxp, amrex::ParticleReal *AMREX_RESTRICT const puyp, amrex::ParticleReal *AMREX_RESTRICT const puzp, amrex::ParticleReal const *AMREX_RESTRICT const pwp, amrex::Real const *AMREX_RESTRICT const amplitude, const amrex::Real dt)
Definition: LaserParticleContainer.cpp:823
amrex::Real m_e_max
Definition: LaserParticleContainer.H:105
amrex::Vector< amrex::Real > m_u_X
Definition: LaserParticleContainer.H:114
void ComputeSpacing(int lev, amrex::Real &Sx, amrex::Real &Sy) const
Definition: LaserParticleContainer.cpp:691
void UpdateContinuousInjectionPosition(amrex::Real dt) override
Definition: LaserParticleContainer.cpp:305
virtual void WriteHeader(std::ostream &os) const final
Definition: ParticleIO.cpp:57
amrex::Real m_wavelength
Definition: LaserParticleContainer.H:106
virtual void ReadHeader(std::istream &is) final
Definition: ParticleIO.cpp:45
amrex::RealBox m_laser_injection_box
Definition: LaserParticleContainer.H:121
void calculate_laser_plane_coordinates(const WarpXParIter &pti, const int np, amrex::Real *AMREX_RESTRICT const pplane_Xp, amrex::Real *AMREX_RESTRICT const pplane_Yp)
Definition: LaserParticleContainer.cpp:766
virtual void Evolve(int lev, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, amrex::MultiFab &jx, amrex::MultiFab &jy, amrex::MultiFab &jz, amrex::MultiFab *, amrex::MultiFab *, amrex::MultiFab *, amrex::MultiFab *rho, amrex::MultiFab *crho, const amrex::MultiFab *, const amrex::MultiFab *, const amrex::MultiFab *, const amrex::MultiFab *, const amrex::MultiFab *, const amrex::MultiFab *, amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full, bool skip_deposition=false) final
Definition: LaserParticleContainer.cpp:534
LaserParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: LaserParticleContainer.cpp:82
virtual void DefaultInitializeRuntimeAttributes(amrex::ParticleTile< amrex::Particle< NStructReal, NStructInt >, NArrayReal, NArrayInt, amrex::PinnedArenaAllocator > &, const int, const int, const amrex::RandomEngine &) override final
Method to initialize runtime attributes. Does nothing for LaserParticleContainer.
Definition: LaserParticleContainer.H:52
amrex::Vector< amrex::Real > m_position
Definition: LaserParticleContainer.H:101
virtual void PushP(int lev, amrex::Real dt, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &) final
Definition: LaserParticleContainer.cpp:751
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: LaserParticleContainer.cpp:259
long m_min_particles_per_mode
Definition: LaserParticleContainer.H:110
amrex::Real m_weight
Definition: LaserParticleContainer.H:116
amrex::Real m_Z0_lab
Definition: LaserParticleContainer.H:108
amrex::Real m_mobility
Definition: LaserParticleContainer.H:117
std::unique_ptr< WarpXLaserProfiles::ILaserProfile > m_up_laser_profile
Definition: LaserParticleContainer.H:136
amrex::Vector< amrex::Real > m_p_Y
Definition: LaserParticleContainer.H:113
void ComputeWeightMobility(amrex::Real Sx, amrex::Real Sy)
Definition: LaserParticleContainer.cpp:726
virtual void InitData() final
Definition: LaserParticleContainer.cpp:334
amrex::Vector< amrex::Real > m_updated_position
Definition: LaserParticleContainer.H:124
std::string m_laser_name
Definition: LaserParticleContainer.H:97
amrex::Vector< amrex::Real > m_u_Y
Definition: LaserParticleContainer.H:115
virtual void PostRestart() final
Definition: LaserParticleContainer.cpp:680
bool m_enabled
Definition: LaserParticleContainer.H:139
amrex::Vector< amrex::Real > m_p_X
Normal of the plane of the antenna.
Definition: LaserParticleContainer.H:103
amrex::Vector< amrex::Real > m_nvec
Coordinates of one of the point of the antenna.
Definition: LaserParticleContainer.H:102
virtual ~LaserParticleContainer()
Definition: LaserParticleContainer.H:45
Definition: WarpXParticleContainer.H:52
Definition: WarpXParticleContainer.H:104
static constexpr int NArrayInt
static constexpr int NArrayReal
static constexpr int NStructInt
static constexpr int NStructReal
Definition: LaserProfiles.H:24
string name
Definition: stencil.py:452
int dt
Definition: stencil.py:440