WarpX
Loading...
Searching...
No Matches
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"
16#include "VelocityProperties.H"
18
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#include <any>
29#include <limits>
30#include <memory>
31#include <string>
32
39{
40
41public:
42
44 PlasmaInjector () = default;
45
46 PlasmaInjector (int ispecies, const std::string& name, const amrex::Geometry& geom,
47 const std::string& src_name="");
48
49 // Default move and copy operations
54
56
57 // bool: whether the point (x, y, z) is inside the plasma region
58 [[nodiscard]] bool insideBounds (
59 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 [[nodiscard]] bool overlapsWith (
63 const amrex::XDim3& lo, const amrex::XDim3& hi) const noexcept;
64
67
69
70 // gamma * beta
71 [[nodiscard]] amrex::XDim3 getMomentum (
72 amrex::Real x, amrex::Real y, amrex::Real z) const noexcept;
73
74 bool queryCharge (amrex::ParticleReal& a_charge) const;
75 bool queryMass (amrex::ParticleReal& a_mass) const;
76
77 // bool: whether the initial injection of particles should be done
78 // This routine is called during initialization of the plasma.
79 [[nodiscard]] bool doInjection () const noexcept { return h_inj_pos != nullptr;}
80
81 // bool: whether the flux injection of particles should be done.
82 [[nodiscard]] bool doFluxInjection () const noexcept { return h_flux_pos != nullptr;}
83
84 bool add_single_particle = false;
88
97
98 bool gaussian_beam = false;
105 amrex::Real x_cut = std::numeric_limits<amrex::Real>::max();
106 amrex::Real y_cut = std::numeric_limits<amrex::Real>::max();
107 amrex::Real z_cut = std::numeric_limits<amrex::Real>::max();
110 long npart;
113 bool do_focusing = false;
115 bool do_rotation = false;
119
120 bool external_file = false;
122#ifdef WARPX_USE_OPENPMD
125#endif
126
127 amrex::Real surface_flux_pos; // surface location
128 amrex::Real flux_tmin = -1.; // Time after which we start injecting particles
129 amrex::Real flux_tmax = -1.; // Time after which we stop injecting particles
130 // Flux normal axis represents the direction in which to emit particles
131 // When compiled in Cartesian geometry, 0 = x, 1 = y, 2 = z
132 // When compiled in cylindrical geometry, 0 = radial, 1 = azimuthal, 2 = z
134 int flux_direction; // -1 for left, +1 for right
135
136 // With radial geometry, the number of particles per cell will be proportional to r**radial_numpercell_power
138
139 bool m_inject_from_eb = false; // whether to inject from the embedded boundary
140
141 std::string str_flux_function;
142
146 amrex::Real density_min = std::numeric_limits<amrex::Real>::epsilon();
147 amrex::Real density_max = std::numeric_limits<amrex::Real>::max();
148
149 [[nodiscard]] InjectorPosition* getInjectorPosition () const;
150 [[nodiscard]] InjectorPosition* getInjectorFluxPosition () const;
151 [[nodiscard]] InjectorDensity* getInjectorDensity (int li) const;
152
153 [[nodiscard]] InjectorFlux* getInjectorFlux () const;
154 [[nodiscard]] InjectorMomentum* getInjectorMomentumDevice () const;
155 [[nodiscard]] InjectorMomentum* getInjectorMomentumHost () const;
156
157 void prepare (amrex::BoxArray const& grids,
158 amrex::DistributionMapping const& dmap,
159 amrex::IntVect const& ngrow,
160 std::function<amrex::Real(amrex::Real)> const& get_zlab);
161
162 void prepare (amrex::RealBox const& pbox, int moving_dir, int moving_sign,
163 std::function<amrex::Real(amrex::Real)> const& get_zlab);
164
165 [[nodiscard]] bool distributedInjectorDensity () const { return inj_rho_distributed; }
166
167protected:
168
169 bool mass_from_source = false;
170 bool charge_from_source = false;
172
174
176
178 std::string species_name;
179 std::string source_name;
180
182
183 std::unique_ptr<InjectorPosition> h_inj_pos;
185
186 std::unique_ptr<InjectorPosition> h_flux_pos;
188
189 std::unique_ptr<InjectorDensity,InjectorDensityDeleter> h_inj_rho;
192 bool inj_rho_prepared = false;
193 std::unique_ptr<amrex::Parser> density_parser;
194
195 std::unique_ptr<InjectorFlux,InjectorFluxDeleter> h_inj_flux;
197 std::unique_ptr<amrex::Parser> flux_parser;
198
199 std::unique_ptr<InjectorMomentum,InjectorMomentumDeleter> h_inj_mom;
201 std::unique_ptr<amrex::Parser> ux_parser;
202 std::unique_ptr<amrex::Parser> uy_parser;
203 std::unique_ptr<amrex::Parser> uz_parser;
204 std::unique_ptr<amrex::Parser> ux_th_parser;
205 std::unique_ptr<amrex::Parser> uy_th_parser;
206 std::unique_ptr<amrex::Parser> uz_th_parser;
207
208 // Keep a pointer to TemperatureProperties to ensure the lifetime of the
209 // contained Parser
210 std::unique_ptr<TemperatureProperties> h_mom_temp;
211 std::unique_ptr<VelocityProperties> h_mom_vel;
212
213 void setupSingleParticle (amrex::ParmParse const& pp_species);
214 void setupMultipleParticles (amrex::ParmParse const& pp_species);
215 void setupGaussianBeam (amrex::ParmParse const& pp_species);
216 void setupNRandomPerCell (amrex::ParmParse const& pp_species);
217 void setupNFluxPerCell (amrex::ParmParse const& pp_species);
218 void setupNuniformPerCell (amrex::ParmParse const& pp_species);
219 void setupExternalFile (amrex::ParmParse const& pp_species);
220
221 void parseFlux (amrex::ParmParse const& pp_species);
222};
223
224#endif //WARPX_PLASMA_INJECTOR_H_
PhysicalSpecies
Definition SpeciesPhysicalProperties.H:16
@ unspecified
Definition SpeciesPhysicalProperties.H:17
bool insideBounds(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition PlasmaInjector.cpp:630
void setupExternalFile(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:480
void setupMultipleParticles(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:206
InjectorPosition * d_inj_pos
Definition PlasmaInjector.H:184
std::unique_ptr< InjectorDensity, InjectorDensityDeleter > h_inj_rho
Definition PlasmaInjector.H:189
amrex::Real rotation_angle
Definition PlasmaInjector.H:117
std::string str_flux_function
Definition PlasmaInjector.H:141
amrex::Vector< amrex::ParticleReal > multiple_particles_weight
Definition PlasmaInjector.H:96
amrex::ParticleReal charge
Definition PlasmaInjector.H:171
bool charge_from_source
Definition PlasmaInjector.H:170
std::unique_ptr< amrex::Parser > uz_th_parser
Definition PlasmaInjector.H:206
void setupNuniformPerCell(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:427
std::unique_ptr< InjectorMomentum, InjectorMomentumDeleter > h_inj_mom
Definition PlasmaInjector.H:199
amrex::Real radial_numpercell_power
Definition PlasmaInjector.H:137
amrex::Real x_rms
Definition PlasmaInjector.H:102
amrex::Vector< amrex::ParticleReal > multiple_particles_ux
Definition PlasmaInjector.H:93
InjectorFlux * getInjectorFlux() const
Definition PlasmaInjector.cpp:690
InjectorPosition * d_flux_pos
Definition PlasmaInjector.H:187
amrex::Real z_rms
Definition PlasmaInjector.H:104
InjectorDensity * d_inj_rho
Definition PlasmaInjector.H:190
long npart
Definition PlasmaInjector.H:110
void setupGaussianBeam(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:229
amrex::Real x_m
Definition PlasmaInjector.H:99
PlasmaInjector()=default
bool queryCharge(amrex::ParticleReal &a_charge) const
Definition PlasmaInjector.cpp:646
amrex::Vector< amrex::ParticleReal > multiple_particles_uy
Definition PlasmaInjector.H:94
InjectorMomentum * getInjectorMomentumHost() const
Definition PlasmaInjector.cpp:702
InjectorPosition * getInjectorPosition() const
Definition PlasmaInjector.cpp:664
amrex::Vector< amrex::ParticleReal > multiple_particles_uz
Definition PlasmaInjector.H:95
bool doFluxInjection() const noexcept
Definition PlasmaInjector.H:82
amrex::Real x_cut
Definition PlasmaInjector.H:105
amrex::Real N_tot
Definition PlasmaInjector.H:109
bool do_rotation
Definition PlasmaInjector.H:115
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_x
Definition PlasmaInjector.H:90
bool overlapsWith(const amrex::XDim3 &lo, const amrex::XDim3 &hi) const noexcept
Definition PlasmaInjector.cpp:637
std::unique_ptr< amrex::Parser > uz_parser
Definition PlasmaInjector.H:203
amrex::Real z_cut
Definition PlasmaInjector.H:107
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_y
Definition PlasmaInjector.H:91
std::unique_ptr< amrex::Parser > ux_th_parser
Definition PlasmaInjector.H:204
PlasmaInjector(const PlasmaInjector &)=delete
void parseFlux(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:586
bool do_rotation_momenta
Definition PlasmaInjector.H:116
amrex::Real q_tot
Definition PlasmaInjector.H:108
amrex::Real flux_tmin
Definition PlasmaInjector.H:128
bool distributedInjectorDensity() const
Definition PlasmaInjector.H:165
bool add_multiple_particles
Definition PlasmaInjector.H:89
amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition PlasmaInjector.cpp:619
amrex::Real flux_tmax
Definition PlasmaInjector.H:129
std::unique_ptr< InjectorFlux, InjectorFluxDeleter > h_inj_flux
Definition PlasmaInjector.H:195
amrex::Real xmin
Definition PlasmaInjector.H:143
std::unique_ptr< amrex::Parser > uy_parser
Definition PlasmaInjector.H:202
int symmetrization_order
Definition PlasmaInjector.H:112
void setupSingleParticle(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:195
amrex::Real ymax
Definition PlasmaInjector.H:144
amrex::ParticleReal mass
Definition PlasmaInjector.H:171
std::string species_name
Definition PlasmaInjector.H:178
void setupNRandomPerCell(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:301
InjectorMomentum * d_inj_mom
Definition PlasmaInjector.H:200
amrex::ParticleReal single_particle_weight
Definition PlasmaInjector.H:87
std::unique_ptr< amrex::Parser > ux_parser
Definition PlasmaInjector.H:201
bool external_file
Definition PlasmaInjector.H:120
PlasmaInjector & operator=(PlasmaInjector &&)=default
amrex::Vector< amrex::Real > rotation_axis
Definition PlasmaInjector.H:118
amrex::Real xmax
Definition PlasmaInjector.H:143
amrex::Real zmin
Definition PlasmaInjector.H:145
InjectorDensity * getInjectorDensity(int li) const
Definition PlasmaInjector.cpp:676
std::unique_ptr< TemperatureProperties > h_mom_temp
Definition PlasmaInjector.H:210
std::unique_ptr< amrex::Parser > flux_parser
Definition PlasmaInjector.H:197
int do_symmetrize
Definition PlasmaInjector.H:111
amrex::Real y_rms
Definition PlasmaInjector.H:103
amrex::Real ymin
Definition PlasmaInjector.H:144
amrex::Real density_min
Definition PlasmaInjector.H:146
amrex::Real focal_distance
Definition PlasmaInjector.H:114
amrex::Vector< int > num_particles_per_cell_each_dim
Definition PlasmaInjector.H:68
bool add_single_particle
Definition PlasmaInjector.H:84
int num_particles_per_cell
Definition PlasmaInjector.H:65
amrex::Real z_shift
initialize from an openPMD file
Definition PlasmaInjector.H:121
bool m_inject_from_eb
Definition PlasmaInjector.H:139
amrex::Vector< amrex::ParticleReal > multiple_particles_pos_z
Definition PlasmaInjector.H:92
bool gaussian_beam
Definition PlasmaInjector.H:98
amrex::Real zmax
Definition PlasmaInjector.H:145
bool inj_rho_prepared
Definition PlasmaInjector.H:192
amrex::Real z_m
Definition PlasmaInjector.H:101
InjectorMomentum * getInjectorMomentumDevice() const
Definition PlasmaInjector.cpp:696
amrex::Vector< amrex::ParticleReal > single_particle_u
Definition PlasmaInjector.H:86
bool do_focusing
Definition PlasmaInjector.H:113
std::any m_openpmd_input_series
additional z offset for particle positions
Definition PlasmaInjector.H:124
PhysicalSpecies physical_species
Definition PlasmaInjector.H:173
bool doInjection() const noexcept
Definition PlasmaInjector.H:79
bool mass_from_source
Definition PlasmaInjector.H:169
std::unique_ptr< amrex::Parser > uy_th_parser
Definition PlasmaInjector.H:205
std::unique_ptr< InjectorPosition > h_flux_pos
Definition PlasmaInjector.H:186
std::string source_name
Definition PlasmaInjector.H:179
InjectorFlux * d_inj_flux
Definition PlasmaInjector.H:196
int flux_direction
Definition PlasmaInjector.H:134
InjectorPosition * getInjectorFluxPosition() const
Definition PlasmaInjector.cpp:670
std::unique_ptr< amrex::Parser > density_parser
Definition PlasmaInjector.H:193
int species_id
Definition PlasmaInjector.H:177
amrex::Real density_max
Definition PlasmaInjector.H:147
amrex::Vector< amrex::ParticleReal > single_particle_pos
Definition PlasmaInjector.H:85
std::unique_ptr< InjectorPosition > h_inj_pos
Definition PlasmaInjector.H:183
void prepare(amrex::BoxArray const &grids, amrex::DistributionMapping const &dmap, amrex::IntVect const &ngrow, std::function< amrex::Real(amrex::Real)> const &get_zlab)
Definition PlasmaInjector.cpp:707
PlasmaInjector & operator=(const PlasmaInjector &)=delete
amrex::Real y_cut
Definition PlasmaInjector.H:106
bool queryMass(amrex::ParticleReal &a_mass) const
Definition PlasmaInjector.cpp:655
amrex::Real num_particles_per_cell_real
Definition PlasmaInjector.H:66
amrex::Real flux
Definition PlasmaInjector.H:175
PlasmaInjector(PlasmaInjector &&)=default
amrex::Geometry m_geom
Definition PlasmaInjector.H:181
std::unique_ptr< VelocityProperties > h_mom_vel
Definition PlasmaInjector.H:211
void setupNFluxPerCell(amrex::ParmParse const &pp_species)
Definition PlasmaInjector.cpp:332
int flux_normal_axis
Definition PlasmaInjector.H:133
amrex::Real surface_flux_pos
Definition PlasmaInjector.H:127
amrex::Real y_m
Definition PlasmaInjector.H:100
bool inj_rho_distributed
Definition PlasmaInjector.H:191
amrex_real Real
amrex_particle_real ParticleReal
IntVectND< 3 > IntVect
Definition InjectorDensity.H:190
Definition InjectorFlux.H:64
Definition InjectorMomentum.H:505
Definition InjectorPosition.H:130