WarpX
PlasmaInjector.H
Go to the documentation of this file.
1 /* Copyright 2019 Andrew Myers, Axel Huebl, David Grote
2  * Maxence Thevenet, Remi Lehe, Weiqun Zhang
3  *
4  *
5  * This file is part of WarpX.
6  *
7  * License: BSD-3-Clause-LBNL
8  */
9 #ifndef WARPX_PLASMA_INJECTOR_H_
10 #define WARPX_PLASMA_INJECTOR_H_
11 
12 #include "InjectorDensity.H"
13 #include "InjectorFlux.H"
14 #include "InjectorMomentum.H"
15 #include "TemperatureProperties.H"
16 #include "VelocityProperties.H"
18 
19 #include "InjectorPosition_fwd.H"
20 
21 #include <AMReX_Dim3.H>
22 #include <AMReX_REAL.H>
23 #include <AMReX_Vector.H>
24 #include <AMReX_ParmParse.H>
25 
26 #include <AMReX_BaseFwd.H>
27 
28 #ifdef WARPX_USE_OPENPMD
29 # include <openPMD/openPMD.hpp>
30 #endif
31 
32 #include <limits>
33 #include <memory>
34 #include <string>
35 
42 {
43 
44 public:
45 
47  PlasmaInjector () = default;
48 
49  PlasmaInjector (int ispecies, const std::string& name, const amrex::Geometry& geom,
50  const std::string& src_name="");
51 
52  // Default move and copy operations
53  PlasmaInjector(const PlasmaInjector&) = delete;
57 
59 
60  // bool: whether the point (x, y, z) is inside the plasma region
61  [[nodiscard]] bool insideBounds (
62  amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
63 
64  // bool: whether the region defined by lo and hi overlaps with the plasma region
65  [[nodiscard]] bool overlapsWith (
66  const amrex::XDim3& lo, const amrex::XDim3& hi) const noexcept;
67 
70 
72 
73  // gamma * beta
74  [[nodiscard]] amrex::XDim3 getMomentum (
75  amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
76 
77  bool queryCharge (amrex::ParticleReal& a_charge) const;
78  bool queryMass (amrex::ParticleReal& a_mass) const;
79 
80  // bool: whether the initial injection of particles should be done
81  // This routine is called during initialization of the plasma.
82  [[nodiscard]] bool doInjection () const noexcept { return h_inj_pos != nullptr;}
83 
84  // bool: whether the flux injection of particles should be done.
85  [[nodiscard]] bool doFluxInjection () const noexcept { return h_flux_pos != nullptr;}
86 
87  bool add_single_particle = false;
90  amrex::ParticleReal single_particle_weight;
91 
92  bool add_multiple_particles = false;
100 
101  bool gaussian_beam = false;
102  amrex::Real x_m;
103  amrex::Real y_m;
104  amrex::Real z_m;
105  amrex::Real x_rms;
106  amrex::Real y_rms;
107  amrex::Real z_rms;
108  amrex::Real x_cut = std::numeric_limits<amrex::Real>::max();
109  amrex::Real y_cut = std::numeric_limits<amrex::Real>::max();
110  amrex::Real z_cut = std::numeric_limits<amrex::Real>::max();
111  amrex::Real q_tot = 0.0;
112  long npart;
113  int do_symmetrize = 0;
115  bool do_focusing = false;
116  amrex::Real focal_distance;
117 
118  bool external_file = false;
119  amrex::Real z_shift = 0.0;
120 #ifdef WARPX_USE_OPENPMD
122  std::unique_ptr<openPMD::Series> m_openpmd_input_series;
123 #endif
124 
125  amrex::Real surface_flux_pos; // surface location
126  amrex::Real flux_tmin = -1.; // Time after which we start injecting particles
127  amrex::Real flux_tmax = -1.; // Time after which we stop injecting particles
128  // Flux normal axis represents the direction in which to emit particles
129  // When compiled in Cartesian geometry, 0 = x, 1 = y, 2 = z
130  // When compiled in cylindrical geometry, 0 = radial, 1 = azimuthal, 2 = z
132  int flux_direction; // -1 for left, +1 for right
133 
134  bool radially_weighted = true;
135 
136  std::string str_flux_function;
137 
138  amrex::Real xmin, xmax;
139  amrex::Real ymin, ymax;
140  amrex::Real zmin, zmax;
141  amrex::Real density_min = std::numeric_limits<amrex::Real>::epsilon();
142  amrex::Real density_max = std::numeric_limits<amrex::Real>::max();
143 
144  [[nodiscard]] InjectorPosition* getInjectorPosition () const;
145  [[nodiscard]] InjectorPosition* getInjectorFluxPosition () const;
146  [[nodiscard]] InjectorDensity* getInjectorDensity () const;
147 
148  [[nodiscard]] InjectorFlux* getInjectorFlux () const;
149  [[nodiscard]] InjectorMomentum* getInjectorMomentumDevice () const;
150  [[nodiscard]] InjectorMomentum* getInjectorMomentumHost () const;
151 
152 protected:
153 
154  bool mass_from_source = false;
155  bool charge_from_source = false;
156  amrex::ParticleReal mass, charge;
157 
159 
160  amrex::Real flux;
161 
163  std::string species_name;
164  std::string source_name;
165 
166  std::unique_ptr<InjectorPosition> h_inj_pos;
168 
169  std::unique_ptr<InjectorPosition> h_flux_pos;
171 
172  std::unique_ptr<InjectorDensity,InjectorDensityDeleter> h_inj_rho;
174  std::unique_ptr<amrex::Parser> density_parser;
175 
176  std::unique_ptr<InjectorFlux,InjectorFluxDeleter> h_inj_flux;
178  std::unique_ptr<amrex::Parser> flux_parser;
179 
180  std::unique_ptr<InjectorMomentum,InjectorMomentumDeleter> h_inj_mom;
182  std::unique_ptr<amrex::Parser> ux_parser;
183  std::unique_ptr<amrex::Parser> uy_parser;
184  std::unique_ptr<amrex::Parser> uz_parser;
185  std::unique_ptr<amrex::Parser> ux_th_parser;
186  std::unique_ptr<amrex::Parser> uy_th_parser;
187  std::unique_ptr<amrex::Parser> uz_th_parser;
188 
189  // Keep a pointer to TemperatureProperties to ensure the lifetime of the
190  // contained Parser
191  std::unique_ptr<TemperatureProperties> h_mom_temp;
192  std::unique_ptr<VelocityProperties> h_mom_vel;
193 
194  void setupSingleParticle (amrex::ParmParse const& pp_species);
195  void setupMultipleParticles (amrex::ParmParse const& pp_species);
196  void setupGaussianBeam (amrex::ParmParse const& pp_species);
197  void setupNRandomPerCell (amrex::ParmParse const& pp_species);
198  void setupNFluxPerCell (amrex::ParmParse const& pp_species);
199  void setupNuniformPerCell (amrex::ParmParse const& pp_species);
200  void setupExternalFile (amrex::ParmParse const& pp_species);
201 
202  void parseFlux (amrex::ParmParse const& pp_species);
203 };
204 
205 #endif //WARPX_PLASMA_INJECTOR_H_
PhysicalSpecies
Definition: SpeciesPhysicalProperties.H:16
Definition: PlasmaInjector.H:42
bool insideBounds(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:570
void setupExternalFile(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:425
void setupMultipleParticles(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:197
InjectorPosition * d_inj_pos
Definition: PlasmaInjector.H:167
std::unique_ptr< InjectorDensity, InjectorDensityDeleter > h_inj_rho
Definition: PlasmaInjector.H:172
std::string str_flux_function
Definition: PlasmaInjector.H:136
amrex::Vector< amrex::ParticleReal > multiple_particles_weight
Definition: PlasmaInjector.H:99
amrex::ParticleReal charge
Definition: PlasmaInjector.H:156
bool charge_from_source
Definition: PlasmaInjector.H:155
std::unique_ptr< amrex::Parser > uz_th_parser
Definition: PlasmaInjector.H:187
void setupNuniformPerCell(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:371
std::unique_ptr< InjectorMomentum, InjectorMomentumDeleter > h_inj_mom
Definition: PlasmaInjector.H:180
amrex::Real x_rms
Definition: PlasmaInjector.H:105
amrex::Vector< amrex::ParticleReal > multiple_particles_ux
Definition: PlasmaInjector.H:96
InjectorFlux * getInjectorFlux() const
Definition: PlasmaInjector.cpp:622
InjectorPosition * d_flux_pos
Definition: PlasmaInjector.H:170
amrex::Real z_rms
Definition: PlasmaInjector.H:107
InjectorDensity * d_inj_rho
Definition: PlasmaInjector.H:173
long npart
Definition: PlasmaInjector.H:112
void setupGaussianBeam(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:220
amrex::Real x_m
Definition: PlasmaInjector.H:102
PlasmaInjector()=default
bool queryCharge(amrex::ParticleReal &a_charge) const
Definition: PlasmaInjector.cpp:586
amrex::Vector< amrex::ParticleReal > multiple_particles_uy
Definition: PlasmaInjector.H:97
bool radially_weighted
Definition: PlasmaInjector.H:134
InjectorMomentum * getInjectorMomentumHost() const
Definition: PlasmaInjector.cpp:634
InjectorPosition * getInjectorPosition() const
Definition: PlasmaInjector.cpp:604
amrex::Vector< amrex::ParticleReal > multiple_particles_uz
Definition: PlasmaInjector.H:98
bool doFluxInjection() const noexcept
Definition: PlasmaInjector.H:85
amrex::Real x_cut
Definition: PlasmaInjector.H:108
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_x
Definition: PlasmaInjector.H:93
bool overlapsWith(const amrex::XDim3 &lo, const amrex::XDim3 &hi) const noexcept
Definition: PlasmaInjector.cpp:577
std::unique_ptr< amrex::Parser > uz_parser
Definition: PlasmaInjector.H:184
amrex::Real z_cut
Definition: PlasmaInjector.H:110
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_y
Definition: PlasmaInjector.H:94
std::unique_ptr< amrex::Parser > ux_th_parser
Definition: PlasmaInjector.H:185
PlasmaInjector(const PlasmaInjector &)=delete
void parseFlux(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:530
amrex::Real q_tot
Definition: PlasmaInjector.H:111
amrex::Real flux_tmin
Definition: PlasmaInjector.H:126
bool add_multiple_particles
Definition: PlasmaInjector.H:92
amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:563
amrex::Real flux_tmax
Definition: PlasmaInjector.H:127
std::unique_ptr< InjectorFlux, InjectorFluxDeleter > h_inj_flux
Definition: PlasmaInjector.H:176
amrex::Real xmin
Definition: PlasmaInjector.H:138
std::unique_ptr< amrex::Parser > uy_parser
Definition: PlasmaInjector.H:183
int symmetrization_order
Definition: PlasmaInjector.H:114
std::unique_ptr< openPMD::Series > m_openpmd_input_series
additional z offset for particle positions
Definition: PlasmaInjector.H:122
void setupSingleParticle(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:186
amrex::Real ymax
Definition: PlasmaInjector.H:139
amrex::ParticleReal mass
Definition: PlasmaInjector.H:156
PlasmaInjector & operator=(const PlasmaInjector &)=delete
std::string species_name
Definition: PlasmaInjector.H:163
void setupNRandomPerCell(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:263
InjectorMomentum * d_inj_mom
Definition: PlasmaInjector.H:181
amrex::ParticleReal single_particle_weight
Definition: PlasmaInjector.H:90
std::unique_ptr< amrex::Parser > ux_parser
Definition: PlasmaInjector.H:182
bool external_file
Definition: PlasmaInjector.H:118
amrex::Real xmax
Definition: PlasmaInjector.H:138
amrex::Real zmin
Definition: PlasmaInjector.H:140
PlasmaInjector & operator=(PlasmaInjector &&)=default
std::unique_ptr< TemperatureProperties > h_mom_temp
Definition: PlasmaInjector.H:191
std::unique_ptr< amrex::Parser > flux_parser
Definition: PlasmaInjector.H:178
int do_symmetrize
Definition: PlasmaInjector.H:113
amrex::Real y_rms
Definition: PlasmaInjector.H:106
amrex::Real ymin
Definition: PlasmaInjector.H:139
amrex::Real density_min
Definition: PlasmaInjector.H:141
amrex::Real focal_distance
Definition: PlasmaInjector.H:116
InjectorDensity * getInjectorDensity() const
Definition: PlasmaInjector.cpp:616
amrex::Vector< int > num_particles_per_cell_each_dim
Definition: PlasmaInjector.H:71
bool add_single_particle
Definition: PlasmaInjector.H:87
int num_particles_per_cell
Definition: PlasmaInjector.H:68
amrex::Real z_shift
initialize from an openPMD file
Definition: PlasmaInjector.H:119
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_z
Definition: PlasmaInjector.H:95
bool gaussian_beam
Definition: PlasmaInjector.H:101
amrex::Real zmax
Definition: PlasmaInjector.H:140
amrex::Real z_m
Definition: PlasmaInjector.H:104
InjectorMomentum * getInjectorMomentumDevice() const
Definition: PlasmaInjector.cpp:628
amrex::Vector< amrex::ParticleReal > single_particle_u
Definition: PlasmaInjector.H:89
bool do_focusing
Definition: PlasmaInjector.H:115
PhysicalSpecies physical_species
Definition: PlasmaInjector.H:158
bool doInjection() const noexcept
Definition: PlasmaInjector.H:82
bool mass_from_source
Definition: PlasmaInjector.H:154
std::unique_ptr< amrex::Parser > uy_th_parser
Definition: PlasmaInjector.H:186
std::unique_ptr< InjectorPosition > h_flux_pos
Definition: PlasmaInjector.H:169
std::string source_name
Definition: PlasmaInjector.H:164
InjectorFlux * d_inj_flux
Definition: PlasmaInjector.H:177
int flux_direction
Definition: PlasmaInjector.H:132
InjectorPosition * getInjectorFluxPosition() const
Definition: PlasmaInjector.cpp:610
std::unique_ptr< amrex::Parser > density_parser
Definition: PlasmaInjector.H:174
int species_id
Definition: PlasmaInjector.H:162
amrex::Real density_max
Definition: PlasmaInjector.H:142
amrex::Vector< amrex::ParticleReal > single_particle_pos
Definition: PlasmaInjector.H:88
std::unique_ptr< InjectorPosition > h_inj_pos
Definition: PlasmaInjector.H:166
amrex::Real y_cut
Definition: PlasmaInjector.H:109
bool queryMass(amrex::ParticleReal &a_mass) const
Definition: PlasmaInjector.cpp:595
amrex::Real num_particles_per_cell_real
Definition: PlasmaInjector.H:69
amrex::Real flux
Definition: PlasmaInjector.H:160
PlasmaInjector(PlasmaInjector &&)=default
std::unique_ptr< VelocityProperties > h_mom_vel
Definition: PlasmaInjector.H:192
void setupNFluxPerCell(amrex::ParmParse const &pp_species)
Definition: PlasmaInjector.cpp:294
int flux_normal_axis
Definition: PlasmaInjector.H:131
amrex::Real surface_flux_pos
Definition: PlasmaInjector.H:125
amrex::Real y_m
Definition: PlasmaInjector.H:103
name
Definition: run_automated.py:229
Definition: InjectorDensity.H:130
Definition: InjectorFlux.H:64
Definition: InjectorMomentum.H:505
Definition: InjectorPosition.H:121