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 PLASMA_INJECTOR_H_
10 #define 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 
25 #include <AMReX_BaseFwd.H>
26 
27 #ifdef WARPX_USE_OPENPMD
28 # include <openPMD/openPMD.hpp>
29 #endif
30 
31 #include <limits>
32 #include <memory>
33 #include <string>
34 
41 {
42 
43 public:
44 
46  PlasmaInjector () = default;
47 
48  PlasmaInjector (int ispecies, const std::string& name, const amrex::Geometry& geom);
49 
50  // Default move and copy operations
51  PlasmaInjector(const PlasmaInjector&) = delete;
55 
57 
58  // bool: whether the point (x, y, z) is inside the plasma region
59  bool insideBounds (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
60 
61  // bool: whether the region defined by lo and hi overlaps with the plasma region
62  bool overlapsWith (const amrex::XDim3& lo, const amrex::XDim3& hi) const noexcept;
63 
66 
68 
69  // gamma * beta
70  amrex::XDim3 getMomentum (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
71 
72  amrex::Real getCharge () {return charge;}
73  amrex::Real getMass () {return mass;}
75 
76  // bool: whether the initial injection of particles should be done
77  // This routine is called during initialization of the plasma.
78  bool doInjection () const noexcept { return h_inj_pos != nullptr;}
79 
80  // bool: whether the flux injection of particles should be done.
81  bool doFluxInjection () const noexcept { return h_flux_pos != nullptr;}
82 
83  bool add_single_particle = false;
86  amrex::ParticleReal single_particle_weight;
87 
88  bool add_multiple_particles = false;
96 
97  bool gaussian_beam = false;
98  amrex::Real x_m;
99  amrex::Real y_m;
100  amrex::Real z_m;
101  amrex::Real x_rms;
102  amrex::Real y_rms;
103  amrex::Real z_rms;
104  amrex::Real x_cut = std::numeric_limits<amrex::Real>::max();
105  amrex::Real y_cut = std::numeric_limits<amrex::Real>::max();
106  amrex::Real z_cut = std::numeric_limits<amrex::Real>::max();
107  amrex::Real q_tot = 0.0;
108  long npart;
109  int do_symmetrize = 0;
111 
112  bool external_file = false;
113  amrex::Real z_shift = 0.0;
114 #ifdef WARPX_USE_OPENPMD
116  std::unique_ptr<openPMD::Series> m_openpmd_input_series;
117 #endif
118 
119  amrex::Real surface_flux_pos; // surface location
120  amrex::Real flux_tmin = -1.; // Time after which we start injecting particles
121  amrex::Real flux_tmax = -1.; // Time after which we stop injecting particles
122  // Flux normal axis represents the direction in which to emit particles
123  // When compiled in Cartesian geometry, 0 = x, 1 = y, 2 = z
124  // When compiled in cylindrical geometry, 0 = radial, 1 = azimuthal, 2 = z
126  int flux_direction; // -1 for left, +1 for right
127 
128  bool radially_weighted = true;
129 
130  std::string str_flux_function;
131 
132  amrex::Real xmin, xmax;
133  amrex::Real ymin, ymax;
134  amrex::Real zmin, zmax;
135  amrex::Real density_min = std::numeric_limits<amrex::Real>::epsilon();
136  amrex::Real density_max = std::numeric_limits<amrex::Real>::max();
137 
141 
145 
146 protected:
147 
148  amrex::Real mass, charge;
149 
151 
152  amrex::Real flux;
153 
155  std::string species_name;
156 
157  std::unique_ptr<InjectorPosition> h_inj_pos;
159 
160  std::unique_ptr<InjectorPosition> h_flux_pos;
162 
163  std::unique_ptr<InjectorDensity,InjectorDensityDeleter> h_inj_rho;
165  std::unique_ptr<amrex::Parser> density_parser;
166 
167  std::unique_ptr<InjectorFlux,InjectorFluxDeleter> h_inj_flux;
169  std::unique_ptr<amrex::Parser> flux_parser;
170 
171  std::unique_ptr<InjectorMomentum,InjectorMomentumDeleter> h_inj_mom;
173  std::unique_ptr<amrex::Parser> ux_parser;
174  std::unique_ptr<amrex::Parser> uy_parser;
175  std::unique_ptr<amrex::Parser> uz_parser;
176 
177  // Keep a pointer to TemperatureProperties to ensure the lifetime of the
178  // contained Parser
179  std::unique_ptr<TemperatureProperties> h_mom_temp;
180  std::unique_ptr<VelocityProperties> h_mom_vel;
181 
182  void setupSingleParticle (const amrex::ParmParse& pp_species_name);
183  void setupMultipleParticles (const amrex::ParmParse& pp_species_name);
184  void setupGaussianBeam (const amrex::ParmParse& pp_species_name);
185  void setupNRandomPerCell (const amrex::ParmParse& pp_species_name);
186  void setupNFluxPerCell (const amrex::ParmParse& pp_species_name);
187  void setupNuniformPerCell (const amrex::ParmParse& pp_species_name);
188  void setupExternalFile (const amrex::ParmParse& pp_species_name);
189 
190  void parseFlux (const amrex::ParmParse& pp_species_name);
191 };
192 
193 #endif
PhysicalSpecies
Definition: SpeciesPhysicalProperties.H:16
Definition: PlasmaInjector.H:41
bool insideBounds(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:574
void setupMultipleParticles(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:201
void setupNFluxPerCell(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:295
InjectorPosition * d_inj_pos
Definition: PlasmaInjector.H:158
std::unique_ptr< InjectorDensity, InjectorDensityDeleter > h_inj_rho
Definition: PlasmaInjector.H:163
PhysicalSpecies getPhysicalSpecies() const
Definition: PlasmaInjector.H:74
std::string str_flux_function
Definition: PlasmaInjector.H:130
amrex::Vector< amrex::ParticleReal > multiple_particles_weight
Definition: PlasmaInjector.H:95
std::unique_ptr< InjectorMomentum, InjectorMomentumDeleter > h_inj_mom
Definition: PlasmaInjector.H:171
amrex::Real x_rms
Definition: PlasmaInjector.H:101
amrex::Vector< amrex::ParticleReal > multiple_particles_ux
Definition: PlasmaInjector.H:92
InjectorPosition * d_flux_pos
Definition: PlasmaInjector.H:161
amrex::Real z_rms
Definition: PlasmaInjector.H:103
InjectorDensity * d_inj_rho
Definition: PlasmaInjector.H:164
long npart
Definition: PlasmaInjector.H:108
amrex::Real x_m
Definition: PlasmaInjector.H:98
PlasmaInjector()=default
amrex::Vector< amrex::ParticleReal > multiple_particles_uy
Definition: PlasmaInjector.H:93
bool radially_weighted
Definition: PlasmaInjector.H:128
amrex::Vector< amrex::ParticleReal > multiple_particles_uz
Definition: PlasmaInjector.H:94
bool doFluxInjection() const noexcept
Definition: PlasmaInjector.H:81
amrex::Real x_cut
Definition: PlasmaInjector.H:104
InjectorPosition * getInjectorPosition()
Definition: PlasmaInjector.cpp:590
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_x
Definition: PlasmaInjector.H:89
bool overlapsWith(const amrex::XDim3 &lo, const amrex::XDim3 &hi) const noexcept
Definition: PlasmaInjector.cpp:581
std::unique_ptr< amrex::Parser > uz_parser
Definition: PlasmaInjector.H:175
amrex::Real z_cut
Definition: PlasmaInjector.H:106
InjectorFlux * getInjectorFlux()
Definition: PlasmaInjector.cpp:608
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_y
Definition: PlasmaInjector.H:90
InjectorMomentum * getInjectorMomentumDevice()
Definition: PlasmaInjector.cpp:614
PlasmaInjector(const PlasmaInjector &)=delete
void setupNRandomPerCell(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:266
void parseFlux(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:533
amrex::Real q_tot
Definition: PlasmaInjector.H:107
amrex::Real flux_tmin
Definition: PlasmaInjector.H:120
bool add_multiple_particles
Definition: PlasmaInjector.H:88
amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:567
void setupSingleParticle(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:187
amrex::Real flux_tmax
Definition: PlasmaInjector.H:121
void setupNuniformPerCell(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:373
std::unique_ptr< InjectorFlux, InjectorFluxDeleter > h_inj_flux
Definition: PlasmaInjector.H:167
amrex::Real xmin
Definition: PlasmaInjector.H:132
std::unique_ptr< amrex::Parser > uy_parser
Definition: PlasmaInjector.H:174
int symmetrization_order
Definition: PlasmaInjector.H:110
InjectorMomentum * getInjectorMomentumHost()
Definition: PlasmaInjector.cpp:620
std::unique_ptr< openPMD::Series > m_openpmd_input_series
additional z offset for particle positions
Definition: PlasmaInjector.H:116
amrex::Real ymax
Definition: PlasmaInjector.H:133
PlasmaInjector & operator=(const PlasmaInjector &)=delete
std::string species_name
Definition: PlasmaInjector.H:155
InjectorMomentum * d_inj_mom
Definition: PlasmaInjector.H:172
InjectorDensity * getInjectorDensity()
Definition: PlasmaInjector.cpp:602
amrex::ParticleReal single_particle_weight
Definition: PlasmaInjector.H:86
std::unique_ptr< amrex::Parser > ux_parser
Definition: PlasmaInjector.H:173
bool external_file
Definition: PlasmaInjector.H:112
InjectorPosition * getInjectorFluxPosition()
Definition: PlasmaInjector.cpp:596
amrex::Real xmax
Definition: PlasmaInjector.H:132
amrex::Real zmin
Definition: PlasmaInjector.H:134
PlasmaInjector & operator=(PlasmaInjector &&)=default
std::unique_ptr< TemperatureProperties > h_mom_temp
Definition: PlasmaInjector.H:179
std::unique_ptr< amrex::Parser > flux_parser
Definition: PlasmaInjector.H:169
int do_symmetrize
Definition: PlasmaInjector.H:109
amrex::Real y_rms
Definition: PlasmaInjector.H:102
amrex::Real ymin
Definition: PlasmaInjector.H:133
amrex::Real density_min
Definition: PlasmaInjector.H:135
void setupExternalFile(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:426
amrex::Vector< int > num_particles_per_cell_each_dim
Definition: PlasmaInjector.H:67
bool add_single_particle
Definition: PlasmaInjector.H:83
int num_particles_per_cell
Definition: PlasmaInjector.H:64
amrex::Real z_shift
initialize from an openPMD file
Definition: PlasmaInjector.H:113
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_z
Definition: PlasmaInjector.H:91
bool gaussian_beam
Definition: PlasmaInjector.H:97
amrex::Real zmax
Definition: PlasmaInjector.H:134
amrex::Real z_m
Definition: PlasmaInjector.H:100
amrex::Real getMass()
Definition: PlasmaInjector.H:73
amrex::Vector< amrex::ParticleReal > single_particle_u
Definition: PlasmaInjector.H:85
void setupGaussianBeam(const amrex::ParmParse &pp_species_name)
Definition: PlasmaInjector.cpp:231
PhysicalSpecies physical_species
Definition: PlasmaInjector.H:150
bool doInjection() const noexcept
Definition: PlasmaInjector.H:78
amrex::Real getCharge()
Definition: PlasmaInjector.H:72
std::unique_ptr< InjectorPosition > h_flux_pos
Definition: PlasmaInjector.H:160
InjectorFlux * d_inj_flux
Definition: PlasmaInjector.H:168
int flux_direction
Definition: PlasmaInjector.H:126
std::unique_ptr< amrex::Parser > density_parser
Definition: PlasmaInjector.H:165
int species_id
Definition: PlasmaInjector.H:154
amrex::Real density_max
Definition: PlasmaInjector.H:136
amrex::Real charge
Definition: PlasmaInjector.H:148
amrex::Vector< amrex::ParticleReal > single_particle_pos
Definition: PlasmaInjector.H:84
amrex::Real mass
Definition: PlasmaInjector.H:148
std::unique_ptr< InjectorPosition > h_inj_pos
Definition: PlasmaInjector.H:157
amrex::Real y_cut
Definition: PlasmaInjector.H:105
amrex::Real num_particles_per_cell_real
Definition: PlasmaInjector.H:65
amrex::Real flux
Definition: PlasmaInjector.H:152
PlasmaInjector(PlasmaInjector &&)=default
std::unique_ptr< VelocityProperties > h_mom_vel
Definition: PlasmaInjector.H:180
int flux_normal_axis
Definition: PlasmaInjector.H:125
amrex::Real surface_flux_pos
Definition: PlasmaInjector.H:119
amrex::Real y_m
Definition: PlasmaInjector.H:99
name
Definition: run_automated.py:229
Definition: InjectorDensity.H:127
Definition: InjectorFlux.H:62
Definition: InjectorMomentum.H:514
Definition: InjectorPosition.H:118