WarpX
Loading...
Searching...
No Matches
InjectorDensity.H
Go to the documentation of this file.
1/* Copyright 2019 Axel Huebl, Maxence Thevenet, Weiqun Zhang
2 * Michael Rowan
3 *
4 *
5 * This file is part of WarpX.
6 *
7 * License: BSD-3-Clause-LBNL
8 */
9#ifndef WARPX_INJECTOR_DENSITY_H_
10#define WARPX_INJECTOR_DENSITY_H_
11
13#include "Utils/WarpXConst.H"
14
15#include <AMReX.H>
16#include <AMReX_Array.H>
17#include <AMReX_GpuQualifiers.H>
18#include <AMReX_Math.H>
19#include <AMReX_Parser.H>
20#include <AMReX_REAL.H>
21
22#include <cmath>
23#include <string>
24
25// struct whose getDensity returns constant density.
27{
28 InjectorDensityConstant (amrex::Real a_rho) noexcept : m_rho(a_rho) {}
29
30 [[nodiscard]]
32 amrex::Real
33 getDensity (amrex::Real, amrex::Real, amrex::Real) const noexcept
34 {
35 return m_rho;
36 }
37
38private:
39 amrex::Real m_rho;
40};
41
42// struct whose getDensity returns local density computed from parser.
44{
46 : m_parser(a_parser) {}
47
48 [[nodiscard]]
50 amrex::Real
51 getDensity (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
52 {
53 return m_parser(x,y,z);
54 }
55
57};
58
59// struct whose getDensity returns local density computed from predefined profile.
61{
62 InjectorDensityPredefined (std::string const& a_species_name);
63
64 void clear ();
65
66 [[nodiscard]]
68 amrex::Real
69 getDensity (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
70 {
71 // Choices for profile are:
72 // - parabolic_channel
73 switch (profile)
74 {
76 {
77 // These are cast as double to ensure sufficient precision in the
78 // initialized profile density profile; without these, single and
79 // double precision versions of the executable can show disagreement
80 // From testing, it seems that (for at least some setups), it is only
81 // necessary to case n0 as double to get good agreement between single
82 // and double precision, but just in case, all are cast as double.
83 const double z_start = p[0];
84 const double ramp_up = p[1];
85 const double plateau = p[2];
86 const double ramp_down = p[3];
87 const double rc = p[4];
88 const double n0 = p[5];
89 const double kp = PhysConst::q_e/PhysConst::c
90 *std::sqrt( n0/(PhysConst::m_e*PhysConst::ep0) );
91 double n;
92
93 // Longitudinal profile, normalized to 1
94 if ((z-z_start)>=0 and
95 (z-z_start)<ramp_up ) {
96 n = 0.5*(1.-std::cos(MathConst::pi*(z-z_start)/ramp_up));
97 } else if ((z-z_start)>=ramp_up and
98 (z-z_start)< ramp_up+plateau ) {
99 n = 1.;
100 } else if ((z-z_start)>=ramp_up+plateau and
101 (z-z_start)< ramp_up+plateau+ramp_down) {
102 n = 0.5*(1.+std::cos(MathConst::pi*((z-z_start)-ramp_up-plateau)/ramp_down));
103 } else {
104 n = 0.;
105 }
106 // Multiply by transverse profile, and physical density
107 n *= n0*(1.+4.*(x*x+y*y)/(kp*kp*rc*rc*rc*rc));
108 return static_cast<amrex::Real>(n);
109 }
110 default:
111 amrex::Abort("InjectorDensityPredefined: how did we get here?");
112 return amrex::Real(0.0);
113 }
114 }
115
116private:
120};
121
122// struct whose getDensity returns density from file.
124{
125 InjectorDensityFromFile (std::string const& a_file_name);
126
127 void clear ();
128
129 [[nodiscard]]
131 amrex::Real
132 getDensity (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
133 {
134#if (AMREX_SPACEDIM < 3)
136#endif
137#if (AMREX_SPACEDIM == 1)
139#elif defined(WARPX_DIM_RZ)
140 return m_external_field_view(amrex::RealVect{std::sqrt(x*x+y*y),z});
141#elif defined(WARPX_DIM_XZ)
143#else
145#endif
146 }
147
148private:
151};
152
153// Base struct for density injector.
154// InjectorDensity contains a union (called Object) that holds any one
155// instance of:
156// - InjectorDensityConstant : to generate constant density;
157// - InjectorDensityParser : to generate density from parser;
158// - InjectorDensityPredefined: to generate density from predefined profile;
159// - InjectorDensityFromFile : to generate density from file;
160// The choice is made at runtime, depending in the constructor called.
161// This mimics virtual functions.
163{
164 // This constructor stores a InjectorDensityConstant in union object.
166 : type(Type::constant),
167 object(t,a_rho)
168 { }
169
170 // This constructor stores a InjectorDensityParser in union object.
172 : type(Type::parser),
173 object(t,a_parser)
174 { }
175
176 // This constructor stores a InjectorDensityPredefined in union object.
177 InjectorDensity (InjectorDensityPredefined* t, std::string const& a_species_name)
178 : type(Type::predefined),
179 object(t,a_species_name)
180 { }
181
182 // This constructor stores a InjectorDensityFromFile in union object.
183 InjectorDensity (InjectorDensityFromFile* t, std::string const& a_file_name)
184 : type(Type::fromfile),
185 object(t,a_file_name)
186 { }
187
188 // Explicitly prevent the compiler from generating copy constructors
189 // and copy assignment operators.
192 void operator= (InjectorDensity const&) = delete;
193 void operator= (InjectorDensity &&) = delete;
194
195 // Default destructor
196 ~InjectorDensity () = default;
197
198 void clear ();
199
200 // call getDensity from the object stored in the union
201 // (the union is called Object, and the instance is called object).
202 [[nodiscard]]
204 amrex::Real
205 getDensity (amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
206 {
207 switch (type)
208 {
209 case Type::parser:
210 {
211 return object.parser.getDensity(x,y,z);
212 }
213 case Type::constant:
214 {
215 return object.constant.getDensity(x,y,z);
216 }
217 case Type::predefined:
218 {
219 return object.predefined.getDensity(x,y,z);
220 }
221 case Type::fromfile:
222 {
223 return object.fromfile.getDensity(x,y,z);
224 }
225 default:
226 {
227 amrex::Abort("InjectorDensity: unknown type");
228 return 0.0;
229 }
230 }
231 }
232
233private:
236
237 // An instance of union Object constructs and stores any one of
238 // the objects declared (constant or parser or predefined).
239 union Object {
240 Object (InjectorDensityConstant*, amrex::Real a_rho) noexcept
241 : constant(a_rho) {}
243 : parser(a_parser) {}
244 Object (InjectorDensityPredefined*, std::string const& a_species_name)
245 : predefined(a_species_name) {}
246 Object (InjectorDensityFromFile*, std::string const& a_file_name)
247 : fromfile(a_file_name) {}
252 };
254};
255
256// In order for InjectorDensity to be trivially copyable, its destructor
257// must be trivial. So we have to rely on a custom deleter for unique_ptr.
260 if (p) {
261 p->clear();
262 delete p;
263 }
264 }
265};
266
267#endif //WARPX_INJECTOR_DENSITY_H_
#define AMREX_GPU_HOST_DEVICE
Definition ExternalField.H:154
static constexpr auto c
vacuum speed of light [m/s]
Definition constant.H:44
static constexpr auto ep0
vacuum permittivity: dielectric permittivity of vacuum [F/m]
Definition constant.H:46
static constexpr auto m_e
electron mass [kg]
Definition constant.H:54
static constexpr auto q_e
elementary charge [C]
Definition constant.H:52
static constexpr amrex::Real pi
ratio of a circle's circumference to its diameter
Definition constant.H:23
__host__ __device__ void ignore_unused(const Ts &...)
RealVectND< 3 > RealVect
void Abort(const std::string &msg)
Definition ExternalField.H:75
Definition InjectorDensity.H:27
InjectorDensityConstant(amrex::Real a_rho) noexcept
Definition InjectorDensity.H:28
amrex::Real m_rho
Definition InjectorDensity.H:39
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition InjectorDensity.H:33
Definition InjectorDensity.H:258
void operator()(InjectorDensity *p) const
Definition InjectorDensity.H:259
Definition InjectorDensity.H:124
ExternalFieldReader * m_external_field_reader
Definition InjectorDensity.H:150
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:132
void clear()
Definition InjectorDensity.cpp:84
InjectorDensityFromFile(std::string const &a_file_name)
Definition InjectorDensity.cpp:78
ExternalFieldView m_external_field_view
Definition InjectorDensity.H:149
Definition InjectorDensity.H:163
~InjectorDensity()=default
Type type
Definition InjectorDensity.H:235
InjectorDensity(InjectorDensityPredefined *t, std::string const &a_species_name)
Definition InjectorDensity.H:177
Type
Definition InjectorDensity.H:234
@ parser
Definition InjectorDensity.H:234
@ constant
Definition InjectorDensity.H:234
@ predefined
Definition InjectorDensity.H:234
@ fromfile
Definition InjectorDensity.H:234
void operator=(InjectorDensity const &)=delete
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:205
InjectorDensity(InjectorDensityConstant *t, amrex::Real a_rho)
Definition InjectorDensity.H:165
Object object
Definition InjectorDensity.H:253
InjectorDensity(InjectorDensityParser *t, amrex::ParserExecutor< 3 > const &a_parser)
Definition InjectorDensity.H:171
InjectorDensity(InjectorDensityFromFile *t, std::string const &a_file_name)
Definition InjectorDensity.H:183
InjectorDensity(InjectorDensity const &)=delete
void clear()
Definition InjectorDensity.cpp:22
InjectorDensity(InjectorDensity &&)=delete
Definition InjectorDensity.H:44
InjectorDensityParser(amrex::ParserExecutor< 3 > const &a_parser) noexcept
Definition InjectorDensity.H:45
amrex::ParserExecutor< 3 > m_parser
Definition InjectorDensity.H:56
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:51
Definition InjectorDensity.H:61
Profile profile
Definition InjectorDensity.H:118
InjectorDensityPredefined(std::string const &a_species_name)
Definition InjectorDensity.cpp:45
Profile
Definition InjectorDensity.H:117
@ parabolic_channel
Definition InjectorDensity.H:117
@ null
Definition InjectorDensity.H:117
amrex::GpuArray< amrex::Real, 6 > p
Definition InjectorDensity.H:119
void clear()
Definition InjectorDensity.cpp:74
AMREX_GPU_HOST_DEVICE amrex::Real getDensity(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorDensity.H:69
Definition InjectorDensity.H:239
InjectorDensityConstant constant
Definition InjectorDensity.H:248
Object(InjectorDensityParser *, amrex::ParserExecutor< 3 > const &a_parser) noexcept
Definition InjectorDensity.H:242
InjectorDensityPredefined predefined
Definition InjectorDensity.H:250
Object(InjectorDensityFromFile *, std::string const &a_file_name)
Definition InjectorDensity.H:246
InjectorDensityFromFile fromfile
Definition InjectorDensity.H:251
Object(InjectorDensityPredefined *, std::string const &a_species_name)
Definition InjectorDensity.H:244
InjectorDensityParser parser
Definition InjectorDensity.H:249
Object(InjectorDensityConstant *, amrex::Real a_rho) noexcept
Definition InjectorDensity.H:240