WarpX
Loading...
Searching...
No Matches
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 "Laser/LaserProfiles.H"
14
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
43{
44public:
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::PolymorphicArenaAllocator>::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
68 int lev,
69 const std::string& current_fp_string,
71 bool skip_deposition=false,
74 ImplicitOptions const * implicit_options = nullptr) final;
75
76 void PushP (int lev, amrex::Real dt,
77 const amrex::MultiFab& ,
78 const amrex::MultiFab& ,
79 const amrex::MultiFab& ,
80 const amrex::MultiFab& ,
81 const amrex::MultiFab& ,
82 const amrex::MultiFab& ,
83 MomentumPushType momentum_push_type = MomentumPushType::Full) final;
84
85 void PostRestart () final;
86
87 void calculate_laser_plane_coordinates (const WarpXParIter& pti, int np,
88 amrex::Real * AMREX_RESTRICT pplane_Xp,
89 amrex::Real * AMREX_RESTRICT pplane_Yp);
90
91 void update_laser_particle (WarpXParIter& pti, int np, amrex::ParticleReal * AMREX_RESTRICT puxp,
92 amrex::ParticleReal * AMREX_RESTRICT puyp,
93 amrex::ParticleReal * AMREX_RESTRICT puzp,
94 amrex::ParticleReal const * AMREX_RESTRICT pwp,
95 amrex::Real const * AMREX_RESTRICT amplitude,
96 amrex::Real dt, PushType push_type=PushType::Explicit);
97
98protected:
99
100 std::string m_laser_name;
101
102private:
103 // runtime paramters
104 amrex::Vector<amrex::Real> m_position;
105 amrex::Vector<amrex::Real> m_nvec;
106 amrex::Vector<amrex::Real> m_p_X;// ! Polarization
107
108 amrex::Real m_e_max = std::numeric_limits<amrex::Real>::quiet_NaN();
109 amrex::Real m_wavelength = std::numeric_limits<amrex::Real>::quiet_NaN();
110
111 amrex::Real m_Z0_lab = 0; // Position of the antenna in the lab frame
112
114
115 // computed using runtime parameters
116 amrex::Vector<amrex::Real> m_p_Y;
117 amrex::Vector<amrex::Real> m_u_X;
118 amrex::Vector<amrex::Real> m_u_Y;
119 amrex::Real m_weight = std::numeric_limits<amrex::Real>::quiet_NaN();
120 amrex::Real m_mobility = std::numeric_limits<amrex::Real>::quiet_NaN();
121
122
123 // laser particle domain
125 // Theoretical position of the antenna. Used if do_continuous_injection=1.
126 // Track the position of the antenna until it enters the simulation domain.
128
129 void ComputeSpacing (int lev, amrex::Real& Sx, amrex::Real& Sy) const;
130 void ComputeWeightMobility (amrex::Real Sx, amrex::Real Sy);
131 void InitData (int lev);
132 // Inject the laser antenna during the simulation, if it started
133 // outside of the simulation domain and enters it.
134 void ContinuousInjection(const amrex::RealBox& injection_box) override;
135
140 void UpdateAntennaPosition (amrex::Real dt) override;
141
142 // Unique (smart) pointer to the laser profile
143 std::unique_ptr<WarpXLaserProfiles::ILaserProfile> m_up_laser_profile;
144
145 // Flag to disable the laser (e.g., if e_max is 0)
146 bool m_enabled = true;
147};
148
149#endif
#define AMREX_RESTRICT
@ Full
Definition Diagnostics.H:24
@ Explicit
Definition WarpXAlgorithmSelection.H:37
PushType
Particle push scheme.
Definition WarpXAlgorithmSelection.H:170
PositionPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:180
@ Full
Definition WarpXAlgorithmSelection.H:180
MomentumPushType
For advanced collision algorithms that split the particle push in substeps.
Definition WarpXAlgorithmSelection.H:189
@ Full
Definition WarpXAlgorithmSelection.H:189
SubcyclingHalf
Subcycling half selector.
Definition WarpXAlgorithmSelection.H:166
@ None
Definition WarpXAlgorithmSelection.H:166
amrex::Real m_e_max
Definition LaserParticleContainer.H:108
amrex::Vector< amrex::Real > m_u_X
Definition LaserParticleContainer.H:117
void ComputeSpacing(int lev, amrex::Real &Sx, amrex::Real &Sy) const
Definition LaserParticleContainer.cpp:732
~LaserParticleContainer() override=default
LaserParticleContainer & operator=(LaserParticleContainer const &)=delete
void WriteHeader(std::ostream &os) const final
Definition ParticleIO.cpp:65
amrex::Real m_wavelength
Definition LaserParticleContainer.H:109
void ReadHeader(std::istream &is) final
Definition ParticleIO.cpp:53
amrex::RealBox m_laser_injection_box
Definition LaserParticleContainer.H:124
LaserParticleContainer(amrex::AmrCore *amr_core, int ispecies, const std::string &name)
Definition LaserParticleContainer.cpp:82
amrex::Vector< amrex::Real > m_position
Definition LaserParticleContainer.H:104
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 &, MomentumPushType momentum_push_type=MomentumPushType::Full) final
Definition LaserParticleContainer.cpp:784
void ContinuousInjection(const amrex::RealBox &injection_box) override
Definition LaserParticleContainer.cpp:284
void DefaultInitializeRuntimeAttributes(typename ContainerLike< amrex::PolymorphicArenaAllocator >::ParticleTileType &, int, int) final
Method to initialize runtime attributes. Does nothing for LaserParticleContainer.
Definition LaserParticleContainer.H:58
long m_min_particles_per_mode
Definition LaserParticleContainer.H:113
amrex::Real m_weight
Definition LaserParticleContainer.H:119
amrex::Real m_Z0_lab
Definition LaserParticleContainer.H:111
amrex::Real m_mobility
Definition LaserParticleContainer.H:120
std::unique_ptr< WarpXLaserProfiles::ILaserProfile > m_up_laser_profile
Definition LaserParticleContainer.H:143
amrex::Vector< amrex::Real > m_p_Y
Definition LaserParticleContainer.H:116
void ComputeWeightMobility(amrex::Real Sx, amrex::Real Sy)
Definition LaserParticleContainer.cpp:766
void InitData() final
Definition LaserParticleContainer.cpp:357
amrex::Vector< amrex::Real > m_updated_position
Definition LaserParticleContainer.H:127
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:326
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:800
LaserParticleContainer(LaserParticleContainer &&)=default
std::string m_laser_name
Definition LaserParticleContainer.H:100
amrex::Vector< amrex::Real > m_u_Y
Definition LaserParticleContainer.H:118
void PostRestart() final
Definition LaserParticleContainer.cpp:721
void Evolve(ablastr::fields::MultiFabRegister &fields, int lev, const std::string &current_fp_string, amrex::Real t, amrex::Real dt, SubcyclingHalf subcycling_half=SubcyclingHalf::None, bool skip_deposition=false, PositionPushType position_push_type=PositionPushType::Full, MomentumPushType momentum_push_type=MomentumPushType::Full, ImplicitOptions const *implicit_options=nullptr) final
Pure virtual function to advance particles (typically by one time step).
Definition LaserParticleContainer.cpp:560
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, PushType push_type=PushType::Explicit)
Definition LaserParticleContainer.cpp:857
bool m_enabled
Definition LaserParticleContainer.H:146
amrex::Vector< amrex::Real > m_p_X
Normal of the plane of the antenna.
Definition LaserParticleContainer.H:106
amrex::Vector< amrex::Real > m_nvec
Coordinates of one of the point of the antenna.
Definition LaserParticleContainer.H:105
Definition WarpXParticleContainer.H:112
WarpXParticleContainer(amrex::AmrCore *amr_core, int ispecies)
Definition WarpXParticleContainer.cpp:94
amrex::ParticleContainer_impl< ParticleType, NArrayReal, NArrayInt, NewAllocator > ContainerLike
std::conditional_t< is_rtsoa_pc, ParticleTileRT< typename ParticleType::RealType, typename ParticleType::IntType >, ParticleTile< ParticleType, NArrayReal, NArrayInt, Allocator > > ParticleTileType
amrex_real Real
Definition LaserProfiles.H:27
Definition ImplicitOptions.H:7
Definition MultiFabRegister.H:272