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 "InjectorMomentum.H"
15 
16 #include "InjectorPosition_fwd.H"
17 
18 #include <AMReX_Dim3.H>
19 #include <AMReX_REAL.H>
20 #include <AMReX_Vector.H>
21 
22 #include <AMReX_BaseFwd.H>
23 
24 #ifdef WARPX_USE_OPENPMD
25 # include <openPMD/openPMD.hpp>
26 #endif
27 
28 #include <limits>
29 #include <memory>
30 #include <string>
31 
38 {
39 
40 public:
41 
42  PlasmaInjector ();
43 
44  PlasmaInjector (int ispecies, const std::string& name);
45 
46  ~PlasmaInjector ();
47 
48  // bool: whether the point (x, y, z) is inside the plasma region
49  bool insideBounds (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
50 
51  // bool: whether the region defined by lo and hi overlaps with the plasma region
52  bool overlapsWith (const amrex::XDim3& lo, const amrex::XDim3& hi) const noexcept;
53 
56 
57  amrex::Vector<int> num_particles_per_cell_each_dim;
58 
59  // gamma * beta
60  amrex::XDim3 getMomentum (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
61 
62  amrex::Real getCharge () {return charge;}
63  amrex::Real getMass () {return mass;}
65 
66  // bool: whether the initial injection of particles should be done
67  // This routine is called during initialization of the plasma. When injecting
68  // a surface flux, no injection is done doing initialization so return false.
69  bool doInjection () const noexcept { return h_inj_pos != nullptr && !surface_flux;}
70 
71  bool add_single_particle = false;
72  amrex::Vector<amrex::ParticleReal> single_particle_pos;
73  amrex::Vector<amrex::ParticleReal> single_particle_vel;
74  amrex::ParticleReal single_particle_weight;
75 
76  bool add_multiple_particles = false;
77  amrex::Vector<amrex::ParticleReal> multiple_particles_pos_x;
78  amrex::Vector<amrex::ParticleReal> multiple_particles_pos_y;
79  amrex::Vector<amrex::ParticleReal> multiple_particles_pos_z;
80  amrex::Vector<amrex::ParticleReal> multiple_particles_vel_x;
81  amrex::Vector<amrex::ParticleReal> multiple_particles_vel_y;
82  amrex::Vector<amrex::ParticleReal> multiple_particles_vel_z;
83  amrex::Vector<amrex::ParticleReal> multiple_particles_weight;
84 
85  bool gaussian_beam = false;
86  amrex::Real x_m;
87  amrex::Real y_m;
88  amrex::Real z_m;
89  amrex::Real x_rms;
90  amrex::Real y_rms;
91  amrex::Real z_rms;
92  amrex::Real x_cut = std::numeric_limits<amrex::Real>::max();
93  amrex::Real y_cut = std::numeric_limits<amrex::Real>::max();
94  amrex::Real z_cut = std::numeric_limits<amrex::Real>::max();
95  amrex::Real q_tot = 0.0;
96  long npart;
97  int do_symmetrize = 0;
98 
99  bool external_file = false;
100  amrex::Real z_shift = 0.0;
101 #ifdef WARPX_USE_OPENPMD
102  std::unique_ptr<openPMD::Series> m_openpmd_input_series;
104 #endif
105 
106  bool surface_flux = false; // inject from a surface
107  amrex::Real surface_flux_pos; // surface location
109  int flux_direction; // -1 for left, +1 for right
110 
111  bool radially_weighted = true;
112 
113  std::string str_density_function;
117 
118  amrex::Real xmin, xmax;
119  amrex::Real ymin, ymax;
120  amrex::Real zmin, zmax;
121  amrex::Real density_min = std::numeric_limits<amrex::Real>::epsilon();
122  amrex::Real density_max = std::numeric_limits<amrex::Real>::max();
123 
127 
128 protected:
129 
130  amrex::Real mass, charge;
131 
133 
134  amrex::Real density;
135 
137  std::string species_name;
138 
139  std::unique_ptr<InjectorPosition> h_inj_pos;
141 
142  std::unique_ptr<InjectorDensity,InjectorDensityDeleter> h_inj_rho;
144  std::unique_ptr<amrex::Parser> density_parser;
145 
146  std::unique_ptr<InjectorMomentum,InjectorMomentumDeleter> h_inj_mom;
148  std::unique_ptr<amrex::Parser> ux_parser;
149  std::unique_ptr<amrex::Parser> uy_parser;
150  std::unique_ptr<amrex::Parser> uz_parser;
151 
152  void parseDensity (amrex::ParmParse& pp);
153  void parseMomentum (amrex::ParmParse& pp);
154 };
155 
156 #endif
amrex::Real num_particles_per_cell_real
Definition: PlasmaInjector.H:55
std::unique_ptr< amrex::Parser > uy_parser
Definition: PlasmaInjector.H:149
bool surface_flux
Definition: PlasmaInjector.H:106
amrex::Real xmin
Definition: PlasmaInjector.H:118
InjectorMomentum * d_inj_mom
Definition: PlasmaInjector.H:147
PhysicalSpecies getPhysicalSpecies() const
Definition: PlasmaInjector.H:64
PhysicalSpecies physical_species
Definition: PlasmaInjector.H:132
amrex::Real mass
Definition: PlasmaInjector.H:130
amrex::Real z_m
Definition: PlasmaInjector.H:88
amrex::ParticleReal single_particle_weight
Definition: PlasmaInjector.H:74
std::unique_ptr< openPMD::Series > m_openpmd_input_series
additional z offset for particle positions
Definition: PlasmaInjector.H:103
Definition: PlasmaInjector.H:37
bool gaussian_beam
Definition: PlasmaInjector.H:85
amrex::Real getCharge()
Definition: PlasmaInjector.H:62
std::unique_ptr< amrex::Parser > uz_parser
Definition: PlasmaInjector.H:150
amrex::Vector< amrex::ParticleReal > multiple_particles_vel_z
Definition: PlasmaInjector.H:82
std::unique_ptr< amrex::Parser > ux_parser
Definition: PlasmaInjector.H:148
def x
Definition: read_lab_particles.py:25
amrex::Real x_cut
Definition: PlasmaInjector.H:92
bool add_multiple_particles
Definition: PlasmaInjector.H:76
PhysicalSpecies
Definition: SpeciesPhysicalProperties.H:19
amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:627
amrex::Real q_tot
Definition: PlasmaInjector.H:95
std::unique_ptr< amrex::Parser > density_parser
Definition: PlasmaInjector.H:144
void parseDensity(amrex::ParmParse &pp)
Definition: PlasmaInjector.cpp:442
amrex::Real density_max
Definition: PlasmaInjector.H:122
bool add_single_particle
Definition: PlasmaInjector.H:71
amrex::Real x_m
Definition: PlasmaInjector.H:86
amrex::Real z_rms
Definition: PlasmaInjector.H:91
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_x
Definition: PlasmaInjector.H:77
bool radially_weighted
Definition: PlasmaInjector.H:111
amrex::Real x_rms
Definition: PlasmaInjector.H:89
amrex::Real z_cut
Definition: PlasmaInjector.H:94
bool doInjection() const noexcept
Definition: PlasmaInjector.H:69
int num_particles_per_cell
Definition: PlasmaInjector.H:54
amrex::Vector< int > num_particles_per_cell_each_dim
Definition: PlasmaInjector.H:57
def z
Definition: read_lab_particles.py:26
std::string species_name
Definition: PlasmaInjector.H:137
amrex::Real ymax
Definition: PlasmaInjector.H:119
amrex::Real density_min
Definition: PlasmaInjector.H:121
int species_id
Definition: PlasmaInjector.H:136
int flux_direction
Definition: PlasmaInjector.H:109
std::unique_ptr< InjectorPosition > h_inj_pos
Definition: PlasmaInjector.H:139
amrex::Real charge
Definition: PlasmaInjector.H:130
std::unique_ptr< InjectorMomentum, InjectorMomentumDeleter > h_inj_mom
Definition: PlasmaInjector.H:146
PlasmaInjector()
Definition: PlasmaInjector.cpp:52
std::unique_ptr< InjectorDensity, InjectorDensityDeleter > h_inj_rho
Definition: PlasmaInjector.H:142
amrex::Real y_m
Definition: PlasmaInjector.H:87
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_y
Definition: PlasmaInjector.H:78
std::string str_density_function
Definition: PlasmaInjector.H:113
long npart
Definition: PlasmaInjector.H:96
int flux_normal_axis
Definition: PlasmaInjector.H:108
InjectorMomentum * getInjectorMomentum()
Definition: PlasmaInjector.cpp:660
InjectorPosition * d_inj_pos
Definition: PlasmaInjector.H:140
amrex::Real z_shift
initialize from an openPMD file
Definition: PlasmaInjector.H:100
amrex::Real y_cut
Definition: PlasmaInjector.H:93
amrex::Vector< amrex::ParticleReal > multiple_particles_vel_x
Definition: PlasmaInjector.H:80
name
Definition: run_automated.py:204
int do_symmetrize
Definition: PlasmaInjector.H:97
bool external_file
Definition: PlasmaInjector.H:99
Definition: InjectorMomentum.H:362
InjectorDensity * getInjectorDensity()
Definition: PlasmaInjector.cpp:654
InjectorPosition * getInjectorPosition()
Definition: PlasmaInjector.cpp:648
amrex::Vector< amrex::ParticleReal > multiple_particles_weight
Definition: PlasmaInjector.H:83
amrex::Real surface_flux_pos
Definition: PlasmaInjector.H:107
bool insideBounds(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: PlasmaInjector.cpp:632
amrex::Real xmax
Definition: PlasmaInjector.H:118
~PlasmaInjector()
Definition: PlasmaInjector.cpp:424
std::string str_momentum_function_ux
Definition: PlasmaInjector.H:114
amrex::Real getMass()
Definition: PlasmaInjector.H:63
void parseMomentum(amrex::ParmParse &pp)
Definition: PlasmaInjector.cpp:478
std::string str_momentum_function_uy
Definition: PlasmaInjector.H:115
amrex::Real ymin
Definition: PlasmaInjector.H:119
amrex::Real y_rms
Definition: PlasmaInjector.H:90
bool overlapsWith(const amrex::XDim3 &lo, const amrex::XDim3 &hi) const noexcept
Definition: PlasmaInjector.cpp:639
Definition: InjectorPosition.H:98
std::string str_momentum_function_uz
Definition: PlasmaInjector.H:116
amrex::Real zmin
Definition: PlasmaInjector.H:120
Definition: InjectorDensity.H:128
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_z
Definition: PlasmaInjector.H:79
amrex::Vector< amrex::ParticleReal > single_particle_vel
Definition: PlasmaInjector.H:73
amrex::Real zmax
Definition: PlasmaInjector.H:120
amrex::Vector< amrex::ParticleReal > multiple_particles_vel_y
Definition: PlasmaInjector.H:81
amrex::Real density
Definition: PlasmaInjector.H:134
amrex::Vector< amrex::ParticleReal > single_particle_pos
Definition: PlasmaInjector.H:72
InjectorDensity * d_inj_rho
Definition: PlasmaInjector.H:143