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 "Evolve/WarpXDtType.H"
13 #include "Evolve/WarpXPushType.H"
14 #include "Laser/LaserProfiles.H"
15 #include "WarpXParticleContainer.H"
16 
17 #include <AMReX_Extension.H>
18 #include <AMReX_Random.H>
19 #include <AMReX_REAL.H>
20 #include <AMReX_RealBox.H>
21 #include <AMReX_Vector.H>
22 
23 #include <AMReX_BaseFwd.H>
24 #include <AMReX_AmrCoreFwd.H>
25 
26 #include <limits>
27 #include <memory>
28 #include <string>
29 
42  : public WarpXParticleContainer
43 {
44 public:
45  LaserParticleContainer (amrex::AmrCore* amr_core, int ispecies, const std::string& name);
46  ~LaserParticleContainer () override = default;
47 
52 
53  void InitData () final;
54 
59  typename ContainerLike<amrex::PinnedArenaAllocator>::ParticleTileType& /*pinned_tile*/,
60  int /*n_external_attr_real*/,
61  int /*n_external_attr_int*/) final {}
62 
63  void ReadHeader (std::istream& is) final;
64 
65  void WriteHeader (std::ostream& os) const final;
66 
67  void Evolve (int lev,
68  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
69  const amrex::MultiFab&, const amrex::MultiFab&, const amrex::MultiFab&,
72  amrex::MultiFab* rho, amrex::MultiFab* crho,
73  const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*,
74  const amrex::MultiFab*, const amrex::MultiFab*, const amrex::MultiFab*,
75  amrex::Real t, amrex::Real dt, DtType a_dt_type=DtType::Full,
76  bool skip_deposition=false, PushType push_type=PushType::Explicit) final;
77 
78  void PushP (int lev, amrex::Real dt,
79  const amrex::MultiFab& ,
80  const amrex::MultiFab& ,
81  const amrex::MultiFab& ,
82  const amrex::MultiFab& ,
83  const amrex::MultiFab& ,
84  const amrex::MultiFab& ) final;
85 
86  void PostRestart () final;
87 
88  void calculate_laser_plane_coordinates (const WarpXParIter& pti, int np,
89  amrex::Real * AMREX_RESTRICT pplane_Xp,
90  amrex::Real * AMREX_RESTRICT pplane_Yp);
91 
92  void update_laser_particle (WarpXParIter& pti, int np, amrex::ParticleReal * AMREX_RESTRICT puxp,
93  amrex::ParticleReal * AMREX_RESTRICT puyp,
94  amrex::ParticleReal * AMREX_RESTRICT puzp,
95  amrex::ParticleReal const * AMREX_RESTRICT pwp,
96  amrex::Real const * AMREX_RESTRICT amplitude,
97  amrex::Real dt);
98 
99 protected:
100 
101  std::string m_laser_name;
102 
103 private:
104  // runtime paramters
105  amrex::Vector<amrex::Real> m_position;
106  amrex::Vector<amrex::Real> m_nvec;
107  amrex::Vector<amrex::Real> m_p_X;// ! Polarization
108 
109  amrex::Real m_e_max = std::numeric_limits<amrex::Real>::quiet_NaN();
110  amrex::Real m_wavelength = std::numeric_limits<amrex::Real>::quiet_NaN();
111 
112  amrex::Real m_Z0_lab = 0; // Position of the antenna in the lab frame
113 
115 
116  // computed using runtime parameters
117  amrex::Vector<amrex::Real> m_p_Y;
118  amrex::Vector<amrex::Real> m_u_X;
119  amrex::Vector<amrex::Real> m_u_Y;
120  amrex::Real m_weight = std::numeric_limits<amrex::Real>::quiet_NaN();
121  amrex::Real m_mobility = std::numeric_limits<amrex::Real>::quiet_NaN();
122 
123 
124  // laser particle domain
126  // Theoretical position of the antenna. Used if do_continuous_injection=1.
127  // Track the position of the antenna until it enters the simulation domain.
129 
130  void ComputeSpacing (int lev, amrex::Real& Sx, amrex::Real& Sy) const;
131  void ComputeWeightMobility (amrex::Real Sx, amrex::Real Sy);
132  void InitData (int lev);
133  // Inject the laser antenna during the simulation, if it started
134  // outside of the simulation domain and enters it.
135  void ContinuousInjection(const amrex::RealBox& injection_box) override;
136 
141  void UpdateAntennaPosition (amrex::Real dt) override;
142 
143  // Unique (smart) pointer to the laser profile
144  std::unique_ptr<WarpXLaserProfiles::ILaserProfile> m_up_laser_profile;
145 
146  // Flag to disable the laser (e.g., if e_max is 0)
147  bool m_enabled = true;
148 };
149 
150 #endif
DtType
Definition: WarpXDtType.H:11
PushType
Definition: WarpXPushType.H:12
Definition: LaserParticleContainer.H:43
amrex::Real m_e_max
Definition: LaserParticleContainer.H:109
amrex::Vector< amrex::Real > m_u_X
Definition: LaserParticleContainer.H:118
void ComputeSpacing(int lev, amrex::Real &Sx, amrex::Real &Sy) const
Definition: LaserParticleContainer.cpp:714
~LaserParticleContainer() override=default
void WriteHeader(std::ostream &os) const final
Definition: ParticleIO.cpp:60
amrex::Real m_wavelength
Definition: LaserParticleContainer.H:110
void ReadHeader(std::istream &is) final
Definition: ParticleIO.cpp:48
amrex::RealBox m_laser_injection_box
Definition: LaserParticleContainer.H:125
LaserParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition: LaserParticleContainer.cpp:82
amrex::Vector< amrex::Real > m_position
Definition: LaserParticleContainer.H:105
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:774
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition: LaserParticleContainer.cpp:281
long m_min_particles_per_mode
Definition: LaserParticleContainer.H:114
amrex::Real m_weight
Definition: LaserParticleContainer.H:120
amrex::Real m_Z0_lab
Definition: LaserParticleContainer.H:112
amrex::Real m_mobility
Definition: LaserParticleContainer.H:121
std::unique_ptr< WarpXLaserProfiles::ILaserProfile > m_up_laser_profile
Definition: LaserParticleContainer.H:144
amrex::Vector< amrex::Real > m_p_Y
Definition: LaserParticleContainer.H:117
void ComputeWeightMobility(amrex::Real Sx, amrex::Real Sy)
Definition: LaserParticleContainer.cpp:749
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, PushType push_type=PushType::Explicit) final
Definition: LaserParticleContainer.cpp:557
void InitData() final
Definition: LaserParticleContainer.cpp:352
amrex::Vector< amrex::Real > m_updated_position
Definition: LaserParticleContainer.H:128
LaserParticleContainer(LaserParticleContainer const &)=delete
void UpdateAntennaPosition(amrex::Real dt) override
Update antenna position for continuous injection of lasers in a boosted frame.
Definition: LaserParticleContainer.cpp:323
void calculate_laser_plane_coordinates(const WarpXParIter &pti, int np, amrex::Real *AMREX_RESTRICT pplane_Xp, amrex::Real *AMREX_RESTRICT pplane_Yp)
Definition: LaserParticleContainer.cpp:789
LaserParticleContainer(LaserParticleContainer &&)=default
std::string m_laser_name
Definition: LaserParticleContainer.H:101
void DefaultInitializeRuntimeAttributes(typename ContainerLike< amrex::PinnedArenaAllocator >::ParticleTileType &, int, int) final
Method to initialize runtime attributes. Does nothing for LaserParticleContainer.
Definition: LaserParticleContainer.H:58
amrex::Vector< amrex::Real > m_u_Y
Definition: LaserParticleContainer.H:119
void PostRestart() final
Definition: LaserParticleContainer.cpp:703
void update_laser_particle(WarpXParIter &pti, int np, amrex::ParticleReal *AMREX_RESTRICT puxp, amrex::ParticleReal *AMREX_RESTRICT puyp, amrex::ParticleReal *AMREX_RESTRICT puzp, amrex::ParticleReal const *AMREX_RESTRICT pwp, amrex::Real const *AMREX_RESTRICT amplitude, amrex::Real dt)
Definition: LaserParticleContainer.cpp:846
bool m_enabled
Definition: LaserParticleContainer.H:147
amrex::Vector< amrex::Real > m_p_X
Normal of the plane of the antenna.
Definition: LaserParticleContainer.H:107
amrex::Vector< amrex::Real > m_nvec
Coordinates of one of the point of the antenna.
Definition: LaserParticleContainer.H:106
LaserParticleContainer & operator=(LaserParticleContainer const &)=delete
Definition: WarpXParticleContainer.H:53
Definition: WarpXParticleContainer.H:111
Definition: LaserProfiles.H:27
name
Definition: run_automated.py:229
float dt
Definition: stencil.py:442