WarpX
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 "LaserProfiles.H"
13 
15 #include "Utils/WarpXConst.H"
16 #include "Parser/WarpXParser.H"
17 
18 #include <memory>
19 #include <limits>
20 
33  : public WarpXParticleContainer
34 {
35 public:
36  LaserParticleContainer (amrex::AmrCore* amr_core, int ispecies, const std::string& name);
38 
39  virtual void InitData () final;
40 
41  virtual void Evolve (int lev,
42  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
43  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
44  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
45  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
46  amrex::MultiFab& jx, amrex::MultiFab& jy, amrex::MultiFab& jz,
47  amrex::MultiFab*, amrex::MultiFab*, amrex::MultiFab*,
48  amrex::MultiFab* rho, amrex::MultiFab* crho,
49  const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*,
50  const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*,
51  amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full) final;
52 
53  virtual void PushP (int lev, amrex::Real dt,
54  const amrex::MultiFab& ,
55  const amrex::MultiFab& ,
56  const amrex::MultiFab& ,
57  const amrex::MultiFab& ,
58  const amrex::MultiFab& ,
59  const amrex::MultiFab& ) final;
60 
61  virtual void PostRestart () final;
62 
63  void calculate_laser_plane_coordinates (const WarpXParIter& pti, const int np,
64  amrex::Real * AMREX_RESTRICT const pplane_Xp,
65  amrex::Real * AMREX_RESTRICT const pplane_Yp);
66 
67  void update_laser_particle (WarpXParIter& pti, const int np, amrex::ParticleReal * AMREX_RESTRICT const puxp,
68  amrex::ParticleReal * AMREX_RESTRICT const puyp,
69  amrex::ParticleReal * AMREX_RESTRICT const puzp,
70  amrex::ParticleReal const * AMREX_RESTRICT const pwp,
71  amrex::Real const * AMREX_RESTRICT const amplitude,
72  const amrex::Real dt);
73 
74 protected:
75 
76  std::string m_laser_name;
77 
78 private:
79  // runtime paramters
80  amrex::Vector<amrex::Real> m_position;
81  amrex::Vector<amrex::Real> m_nvec;
82  amrex::Vector<amrex::Real> m_p_X;// ! Polarization
83 
84  long m_pusher_algo = -1;
85  amrex::Real m_e_max = std::numeric_limits<amrex::Real>::quiet_NaN();
86  amrex::Real m_wavelength = std::numeric_limits<amrex::Real>::quiet_NaN();
87 
88  amrex::Real m_Z0_lab = 0; // Position of the antenna in the lab frame
89 
91 
92  // computed using runtime parameters
93  amrex::Vector<amrex::Real> m_p_Y;
94  amrex::Vector<amrex::Real> m_u_X;
95  amrex::Vector<amrex::Real> m_u_Y;
96  amrex::Real m_weight = std::numeric_limits<amrex::Real>::quiet_NaN();
97  amrex::Real m_mobility = std::numeric_limits<amrex::Real>::quiet_NaN();
98 
99 
100  // laser particle domain
101  amrex::RealBox m_laser_injection_box;
102  // Theoretical position of the antenna. Used if do_continuous_injection=1.
103  // Track the position of the antenna until it enters the simulation domain.
104  amrex::Vector<amrex::Real> m_updated_position;
105 
106  void ComputeSpacing (int lev, amrex::Real& Sx, amrex::Real& Sy) const;
107  void ComputeWeightMobility (amrex::Real Sx, amrex::Real Sy);
108  void InitData (int lev);
109  // Inject the laser antenna during the simulation, if it started
110  // outside of the simulation domain and enters it.
111  void ContinuousInjection(const amrex::RealBox& injection_box) override;
112  // Update position of the antenna
113  void UpdateContinuousInjectionPosition(amrex::Real dt) override;
114 
115  // Unique (smart) pointer to the laser profile
116  std::unique_ptr<WarpXLaserProfiles::ILaserProfile> m_up_laser_profile;
117 
118 };
119 
120 #endif
amrex::Vector< amrex::Real > m_p_X
Normal of the plane of the antenna.
Definition: LaserParticleContainer.H:82
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:666
DtType
Definition: WarpXDtType.H:10
amrex::Real m_Z0_lab
Definition: LaserParticleContainer.H:88
amrex::Vector< amrex::Real > m_nvec
Coordinates of one of the point of the antenna.
Definition: LaserParticleContainer.H:81
amrex::Real m_e_max
Definition: LaserParticleContainer.H:85
amrex::Real m_wavelength
Definition: LaserParticleContainer.H:86
virtual void PostRestart() final
Definition: LaserParticleContainer.cpp:539
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:614
long m_min_particles_per_mode
Definition: LaserParticleContainer.H:90
amrex::Real m_mobility
Definition: LaserParticleContainer.H:97
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: LaserParticleContainer.cpp:171
void ComputeSpacing(int lev, amrex::Real &Sx, amrex::Real &Sy) const
Definition: LaserParticleContainer.cpp:549
LaserParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: LaserParticleContainer.cpp:33
amrex::Real m_weight
Definition: LaserParticleContainer.H:96
virtual ~LaserParticleContainer()
Definition: LaserParticleContainer.H:37
Definition: LaserParticleContainer.H:32
void ComputeWeightMobility(amrex::Real Sx, amrex::Real Sy)
Definition: LaserParticleContainer.cpp:575
amrex::Vector< amrex::Real > m_p_Y
Definition: LaserParticleContainer.H:93
name
Definition: run_automated.py:204
virtual void Evolve(int lev, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, const amrex::MultiFab &, 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) final
Definition: LaserParticleContainer.cpp:399
amrex::Vector< amrex::Real > m_position
Definition: LaserParticleContainer.H:80
amrex::Vector< amrex::Real > m_u_Y
Definition: LaserParticleContainer.H:95
amrex::Vector< amrex::Real > m_u_X
Definition: LaserParticleContainer.H:94
virtual void InitData() final
Definition: LaserParticleContainer.cpp:223
amrex::Vector< amrex::Real > m_updated_position
Definition: LaserParticleContainer.H:104
amrex::RealBox m_laser_injection_box
Definition: LaserParticleContainer.H:101
std::unique_ptr< WarpXLaserProfiles::ILaserProfile > m_up_laser_profile
Definition: LaserParticleContainer.H:116
long m_pusher_algo
Definition: LaserParticleContainer.H:84
Definition: WarpXParticleContainer.H:76
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:599
void UpdateContinuousInjectionPosition(amrex::Real dt) override
Definition: LaserParticleContainer.cpp:201
std::string m_laser_name
Definition: LaserParticleContainer.H:76
Definition: WarpXParticleContainer.H:131