ARTEMIS
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 "InjectorMomentum.H"
14 #include "TemperatureProperties.H"
15 #include "VelocityProperties.H"
17 
18 #include "InjectorPosition_fwd.H"
19 
20 #include <AMReX_Dim3.H>
21 #include <AMReX_REAL.H>
22 #include <AMReX_Vector.H>
23 
24 #include <AMReX_BaseFwd.H>
25 
26 #ifdef WARPX_USE_OPENPMD
27 # include <openPMD/openPMD.hpp>
28 #endif
29 
30 #include <limits>
31 #include <memory>
32 #include <string>
33 
40 {
41 
42 public:
43 
44  PlasmaInjector () = default;
45 
46  PlasmaInjector (int ispecies, const std::string& name);
47 
49 
50  // bool: whether the point (x, y, z) is inside the plasma region
51  bool insideBounds (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
52 
53  // bool: whether the region defined by lo and hi overlaps with the plasma region
54  bool overlapsWith (const amrex::XDim3& lo, const amrex::XDim3& hi) const noexcept;
55 
58 
60 
61  // gamma * beta
62  amrex::XDim3 getMomentum (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
63 
64  amrex::Real getCharge () {return charge;}
65  amrex::Real getMass () {return mass;}
67 
68  // bool: whether the initial injection of particles should be done
69  // This routine is called during initialization of the plasma. When injecting
70  // a surface flux, no injection is done doing initialization so return false.
71  bool doInjection () const noexcept { return h_inj_pos != nullptr && !surface_flux;}
72 
73  bool add_single_particle = false;
76  amrex::ParticleReal single_particle_weight;
77 
78  bool add_multiple_particles = false;
86 
87  bool gaussian_beam = false;
88  amrex::Real x_m;
89  amrex::Real y_m;
90  amrex::Real z_m;
91  amrex::Real x_rms;
92  amrex::Real y_rms;
93  amrex::Real z_rms;
94  amrex::Real x_cut = std::numeric_limits<amrex::Real>::max();
95  amrex::Real y_cut = std::numeric_limits<amrex::Real>::max();
96  amrex::Real z_cut = std::numeric_limits<amrex::Real>::max();
97  amrex::Real q_tot = 0.0;
98  long npart;
99  int do_symmetrize = 0;
101 
102  bool external_file = false;
103  amrex::Real z_shift = 0.0;
104 #ifdef WARPX_USE_OPENPMD
106  std::unique_ptr<openPMD::Series> m_openpmd_input_series;
107 #endif
108 
109  bool surface_flux = false; // inject from a surface
110  amrex::Real surface_flux_pos; // surface location
111  amrex::Real flux_tmin = -1.; // Time after which we start injecting particles
112  amrex::Real flux_tmax = -1.; // Time after which we stop injecting particles
113  // Flux normal axis represents the direction in which to emit particles
114  // When compiled in Cartesian geometry, 0 = x, 1 = y, 2 = z
115  // When compiled in cylindrical geometry, 0 = radial, 1 = azimuthal, 2 = z
117  int flux_direction; // -1 for left, +1 for right
118 
119  bool radially_weighted = true;
120 
121  std::string str_density_function;
125 
126  amrex::Real xmin, xmax;
127  amrex::Real ymin, ymax;
128  amrex::Real zmin, zmax;
129  amrex::Real density_min = std::numeric_limits<amrex::Real>::epsilon();
130  amrex::Real density_max = std::numeric_limits<amrex::Real>::max();
131 
135 
136 protected:
137 
138  amrex::Real mass, charge;
139 
141 
142  amrex::Real density;
143 
145  std::string species_name;
146 
147  std::unique_ptr<InjectorPosition> h_inj_pos;
149 
150  std::unique_ptr<InjectorDensity,InjectorDensityDeleter> h_inj_rho;
152  std::unique_ptr<amrex::Parser> density_parser;
153 
154  std::unique_ptr<InjectorMomentum,InjectorMomentumDeleter> h_inj_mom;
156  std::unique_ptr<amrex::Parser> ux_parser;
157  std::unique_ptr<amrex::Parser> uy_parser;
158  std::unique_ptr<amrex::Parser> uz_parser;
159 
160  // Keep a pointer to TemperatureProperties to ensure the lifetime of the
161  // contained Parser
162  std::unique_ptr<TemperatureProperties> h_mom_temp;
163  std::unique_ptr<VelocityProperties> h_mom_vel;
164 
165  void parseDensity (amrex::ParmParse& pp);
166  void parseMomentum (amrex::ParmParse& pp);
167 };
168 
169 #endif
PhysicalSpecies
Definition: SpeciesPhysicalProperties.H:16
Definition: PlasmaInjector.H:40
bool insideBounds(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:701
InjectorPosition * d_inj_pos
Definition: PlasmaInjector.H:148
std::unique_ptr< InjectorDensity, InjectorDensityDeleter > h_inj_rho
Definition: PlasmaInjector.H:150
PhysicalSpecies getPhysicalSpecies() const
Definition: PlasmaInjector.H:66
std::string str_momentum_function_uy
Definition: PlasmaInjector.H:123
amrex::Vector< amrex::ParticleReal > multiple_particles_weight
Definition: PlasmaInjector.H:85
std::unique_ptr< InjectorMomentum, InjectorMomentumDeleter > h_inj_mom
Definition: PlasmaInjector.H:154
amrex::Real x_rms
Definition: PlasmaInjector.H:91
amrex::Vector< amrex::ParticleReal > multiple_particles_ux
Definition: PlasmaInjector.H:82
amrex::Real z_rms
Definition: PlasmaInjector.H:93
InjectorDensity * d_inj_rho
Definition: PlasmaInjector.H:151
InjectorMomentum * getInjectorMomentum()
Definition: PlasmaInjector.cpp:729
long npart
Definition: PlasmaInjector.H:98
amrex::Real x_m
Definition: PlasmaInjector.H:88
PlasmaInjector()=default
amrex::Vector< amrex::ParticleReal > multiple_particles_uy
Definition: PlasmaInjector.H:83
bool radially_weighted
Definition: PlasmaInjector.H:119
amrex::Vector< amrex::ParticleReal > multiple_particles_uz
Definition: PlasmaInjector.H:84
amrex::Real x_cut
Definition: PlasmaInjector.H:94
InjectorPosition * getInjectorPosition()
Definition: PlasmaInjector.cpp:717
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_x
Definition: PlasmaInjector.H:79
bool overlapsWith(const amrex::XDim3 &lo, const amrex::XDim3 &hi) const noexcept
Definition: PlasmaInjector.cpp:708
std::string str_density_function
Definition: PlasmaInjector.H:121
std::unique_ptr< amrex::Parser > uz_parser
Definition: PlasmaInjector.H:158
amrex::Real z_cut
Definition: PlasmaInjector.H:96
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_y
Definition: PlasmaInjector.H:80
amrex::Real q_tot
Definition: PlasmaInjector.H:97
amrex::Real flux_tmin
Definition: PlasmaInjector.H:111
bool add_multiple_particles
Definition: PlasmaInjector.H:78
amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:690
amrex::Real flux_tmax
Definition: PlasmaInjector.H:112
amrex::Real xmin
Definition: PlasmaInjector.H:126
std::unique_ptr< amrex::Parser > uy_parser
Definition: PlasmaInjector.H:157
int symmetrization_order
Definition: PlasmaInjector.H:100
std::unique_ptr< openPMD::Series > m_openpmd_input_series
additional z offset for particle positions
Definition: PlasmaInjector.H:106
amrex::Real ymax
Definition: PlasmaInjector.H:127
std::string species_name
Definition: PlasmaInjector.H:145
InjectorMomentum * d_inj_mom
Definition: PlasmaInjector.H:155
InjectorDensity * getInjectorDensity()
Definition: PlasmaInjector.cpp:723
amrex::ParticleReal single_particle_weight
Definition: PlasmaInjector.H:76
std::unique_ptr< amrex::Parser > ux_parser
Definition: PlasmaInjector.H:156
bool external_file
Definition: PlasmaInjector.H:102
amrex::Real xmax
Definition: PlasmaInjector.H:126
amrex::Real zmin
Definition: PlasmaInjector.H:128
std::unique_ptr< TemperatureProperties > h_mom_temp
Definition: PlasmaInjector.H:162
std::string str_momentum_function_uz
Definition: PlasmaInjector.H:124
int do_symmetrize
Definition: PlasmaInjector.H:99
bool surface_flux
Definition: PlasmaInjector.H:109
amrex::Real y_rms
Definition: PlasmaInjector.H:92
amrex::Real ymin
Definition: PlasmaInjector.H:127
amrex::Real density_min
Definition: PlasmaInjector.H:129
amrex::Real density
Definition: PlasmaInjector.H:142
amrex::Vector< int > num_particles_per_cell_each_dim
Definition: PlasmaInjector.H:59
bool add_single_particle
Definition: PlasmaInjector.H:73
int num_particles_per_cell
Definition: PlasmaInjector.H:56
amrex::Real z_shift
initialize from an openPMD file
Definition: PlasmaInjector.H:103
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_z
Definition: PlasmaInjector.H:81
bool gaussian_beam
Definition: PlasmaInjector.H:87
amrex::Real zmax
Definition: PlasmaInjector.H:128
amrex::Real z_m
Definition: PlasmaInjector.H:90
amrex::Real getMass()
Definition: PlasmaInjector.H:65
amrex::Vector< amrex::ParticleReal > single_particle_u
Definition: PlasmaInjector.H:75
PhysicalSpecies physical_species
Definition: PlasmaInjector.H:140
bool doInjection() const noexcept
Definition: PlasmaInjector.H:71
amrex::Real getCharge()
Definition: PlasmaInjector.H:64
int flux_direction
Definition: PlasmaInjector.H:117
std::unique_ptr< amrex::Parser > density_parser
Definition: PlasmaInjector.H:152
int species_id
Definition: PlasmaInjector.H:144
amrex::Real density_max
Definition: PlasmaInjector.H:130
amrex::Real charge
Definition: PlasmaInjector.H:138
amrex::Vector< amrex::ParticleReal > single_particle_pos
Definition: PlasmaInjector.H:74
amrex::Real mass
Definition: PlasmaInjector.H:138
std::unique_ptr< InjectorPosition > h_inj_pos
Definition: PlasmaInjector.H:147
amrex::Real y_cut
Definition: PlasmaInjector.H:95
void parseMomentum(amrex::ParmParse &pp)
Definition: PlasmaInjector.cpp:578
amrex::Real num_particles_per_cell_real
Definition: PlasmaInjector.H:57
void parseDensity(amrex::ParmParse &pp)
Definition: PlasmaInjector.cpp:540
std::unique_ptr< VelocityProperties > h_mom_vel
Definition: PlasmaInjector.H:163
int flux_normal_axis
Definition: PlasmaInjector.H:116
std::string str_momentum_function_ux
Definition: PlasmaInjector.H:122
amrex::Real surface_flux_pos
Definition: PlasmaInjector.H:110
amrex::Real y_m
Definition: PlasmaInjector.H:89
def y
Definition: Excitation_Flag_Generator.py:76
def x
Formats datastring to remove "+" at the end of the string #####.
Definition: Excitation_Flag_Generator.py:75
def z
Definition: Excitation_Flag_Generator.py:77
string name
Definition: stencil.py:452
Definition: InjectorDensity.H:129
Definition: InjectorMomentum.H:476
Definition: InjectorPosition.H:118