8 #ifndef INJECTOR_MOMENTUM_H_ 9 #define INJECTOR_MOMENTUM_H_ 15 #include <AMReX_Gpu.H> 16 #include <AMReX_Dim3.H> 27 amrex::RandomEngine
const&)
const noexcept
48 amrex::Real a_uz_m, amrex::Real a_ux_th,
49 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
50 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
51 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th)
57 amrex::RandomEngine
const& engine)
const noexcept
59 return amrex::XDim3{amrex::RandomNormal(m_ux_m, m_ux_th, engine),
60 amrex::RandomNormal(m_uy_m, m_uy_th, engine),
61 amrex::RandomNormal(m_uz_m, m_uz_th, engine)};
68 return amrex::XDim3{m_ux_m, m_uy_m, m_uz_m};
85 : dir(d), beta(b), vave(std::sqrt(2.*t))
91 amrex::RandomEngine
const& engine)
const noexcept
93 amrex::Real
x1, x2, gamma;
95 x1 = amrex::Random(engine);
96 x2 = amrex::Random(engine);
100 u[(dir+1)%3] = vave*std::sqrt(-std::log(x1)) *std::sin(2*M_PI*x2);
101 u[(dir+2)%3] = vave*std::sqrt(-std::log(x1)) *std::cos(2*M_PI*x2);
102 u[dir] = vave*std::sqrt(-std::log(amrex::Random(engine)))*
103 std::sin(2*M_PI*amrex::Random(engine));
104 gamma = u[0]*u[0]+u[1]*u[1]+u[2]*u[2];
105 gamma = std::sqrt(1+gamma);
117 x1 = amrex::Random(engine);
118 if(-beta*u[dir]/gamma > x1)
125 u[dir] = 1/std::sqrt(1-beta*beta)*(u[dir]+gamma*beta);
128 return amrex::XDim3 {u[0],u[1],u[2]};
131 AMREX_GPU_HOST_DEVICE
135 using namespace amrex;
137 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
138 const Real gamma = 1./sqrt(1+beta*beta);
140 return XDim3 {u[0],u[1],u[2]};
158 : dir(d), beta(b), theta(t)
161 AMREX_GPU_HOST_DEVICE
164 amrex::RandomEngine
const& engine)
const noexcept
168 amrex::Real
x1, x2, gamma;
175 while(u[dir]-gamma <= x1)
178 std::log(amrex::Random(engine)*amrex::Random(engine)*amrex::Random(engine));
179 gamma = std::sqrt(1+u[dir]*u[dir]);
180 x1 = theta*std::log(amrex::Random(engine));
184 x1 = amrex::Random(engine);
185 x2 = amrex::Random(engine);
188 u[(dir+1)%3] = 2*u[dir]*std::sqrt(x1*(1-x1))*std::sin(2*M_PI*x2);
189 u[(dir+2)%3] = 2*u[dir]*std::sqrt(x1*(1-x1))*std::cos(2*M_PI*x2);
191 u[dir] = u[dir]*(2*x1-1);
192 x1 = amrex::Random(engine);
205 if(-beta*u[dir]/gamma>x1)
212 u[dir] = 1/std::sqrt(1-beta*beta)*(u[dir]+gamma*beta);
215 return amrex::XDim3 {u[0],u[1],u[2]};
218 AMREX_GPU_HOST_DEVICE
222 using namespace amrex;
224 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
225 const Real gamma = 1./sqrt(1+beta*beta);
227 return XDim3 {u[0],u[1],u[2]};
245 : u_over_r(a_u_over_r)
248 AMREX_GPU_HOST_DEVICE
251 amrex::RandomEngine
const&)
const noexcept
253 return {
x*u_over_r, y*u_over_r,
z*u_over_r};
256 AMREX_GPU_HOST_DEVICE
260 return {
x*u_over_r, y*u_over_r,
z*u_over_r};
273 : m_ux_parser(a_ux_parser), m_uy_parser(a_uy_parser),
274 m_uz_parser(a_uz_parser) {}
276 AMREX_GPU_HOST_DEVICE
279 amrex::RandomEngine
const&)
const noexcept
281 return amrex::XDim3{m_ux_parser(
x,y,
z),m_uy_parser(
x,y,
z),m_uz_parser(
x,y,
z)};
284 AMREX_GPU_HOST_DEVICE
288 return amrex::XDim3{m_ux_parser(
x,y,
z),m_uy_parser(
x,y,
z),m_uz_parser(
x,y,
z)};
307 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
309 object(t, a_ux, a_uy, a_uz)
318 object(t, a_ux_parser, a_uy_parser, a_uz_parser)
323 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
324 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
326 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
330 amrex::Real theta, amrex::Real beta,
int dir)
332 object(t, theta, beta, dir)
337 amrex::Real theta, amrex::Real beta,
int dir)
339 object(t, theta, beta, dir)
344 std::string
const& a_species_name)
346 object(t, a_species_name)
351 amrex::Real u_over_r)
367 AMREX_GPU_HOST_DEVICE
370 amrex::RandomEngine
const& engine)
const noexcept
376 return object.parser.getMomentum(
x,y,
z,engine);
380 return object.gaussian.getMomentum(
x,y,
z,engine);
382 case Type::boltzmann:
384 return object.boltzmann.getMomentum(
x,y,
z,engine);
388 return object.juttner.getMomentum(
x,y,
z,engine);
392 return object.constant.getMomentum(
x,y,
z,engine);
394 case Type::radial_expansion:
396 return object.radial_expansion.getMomentum(
x,y,
z,engine);
400 return object.custom.getMomentum(
x,y,
z,engine);
404 amrex::Abort(
"InjectorMomentum: unknown type");
405 return {0.0,0.0,0.0};
412 AMREX_GPU_HOST_DEVICE
420 return object.parser.getBulkMomentum(
x,y,
z);
424 return object.gaussian.getBulkMomentum(
x,y,
z);
426 case Type::boltzmann:
428 return object.boltzmann.getBulkMomentum(
x,y,
z);
432 return object.juttner.getBulkMomentum(
x,y,
z);
436 return object.constant.getBulkMomentum(
x,y,
z);
438 case Type::radial_expansion:
440 return object.radial_expansion.getBulkMomentum(
x,y,
z);
444 return object.custom.getBulkMomentum(
x,y,
z);
448 amrex::Abort(
"InjectorMomentum: unknown type");
449 return {0.0,0.0,0.0};
455 enum struct Type { constant, custom, gaussian, boltzmann, juttner, radial_expansion,
parser};
463 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
464 : constant(a_ux,a_uy,a_uz) {}
466 std::string
const& a_species_name) noexcept
467 : custom(a_species_name) {}
469 amrex::Real a_ux_m, amrex::Real a_uy_m,
470 amrex::Real a_uz_m, amrex::Real a_ux_th,
471 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
472 : gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
474 amrex::Real t, amrex::Real b,
int dir) noexcept
475 : boltzmann(t,b,dir) {}
477 amrex::Real t, amrex::Real b,
int dir) noexcept
478 : juttner(t,b,dir) {}
480 amrex::Real u_over_r) noexcept
481 : radial_expansion(u_over_r) {}
486 :
parser(a_ux_parser, a_uy_parser, a_uz_parser) {}
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:258
GpuParser< 3 > m_uz_parser
Definition: InjectorMomentum.H:291
InjectorMomentumConstant(amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:21
parser
Definition: run_alltests.py:107
InjectorMomentumCustom custom
Definition: InjectorMomentum.H:488
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:306
def x
Definition: read_lab_particles.py:25
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:414
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:489
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:350
Type
Definition: InjectorMomentum.H:455
Definition: InjectorMomentum.H:268
void clear()
Definition: InjectorMomentum.cpp:14
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:492
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:278
InjectorMomentumGaussian(amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m, amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
Definition: InjectorMomentum.H:47
InjectorMomentumParser parser
Definition: InjectorMomentum.H:493
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:242
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:56
Definition: InjectorMomentum.H:151
def z
Definition: read_lab_particles.py:26
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:487
Object(InjectorMomentumCustom *, std::string const &a_species_name) noexcept
Definition: InjectorMomentum.H:465
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:163
Definition: InjectorMomentum.H:45
amrex::Real vave
Definition: InjectorMomentum.H:145
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:90
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:66
amrex::Real u_over_r
Definition: InjectorMomentum.H:264
InjectorMomentumJuttner(amrex::Real t, amrex::Real b, int d) noexcept
Definition: InjectorMomentum.H:157
Object(InjectorMomentumBoltzmann *, amrex::Real t, amrex::Real b, int dir) noexcept
Definition: InjectorMomentum.H:473
amrex::Real m_uy
Definition: InjectorMomentum.H:40
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:369
Definition: InjectorMomentum.H:461
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:133
amrex::Real m_uz
Definition: InjectorMomentum.H:40
Definition: InjectorMomentum.H:78
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:490
InjectorMomentum(InjectorMomentumGaussian *t, amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m, amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
Definition: InjectorMomentum.H:322
Object(InjectorMomentumJuttner *, amrex::Real t, amrex::Real b, int dir) noexcept
Definition: InjectorMomentum.H:476
amrex::Real m_uz_m
Definition: InjectorMomentum.H:72
amrex::Real m_uz_th
Definition: InjectorMomentum.H:73
Definition: InjectorMomentum.H:500
type
Definition: run_alltests_1node.py:67
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:286
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:462
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:26
int dir
Definition: InjectorMomentum.H:231
Definition: WarpXParser.H:26
Definition: InjectorMomentum.H:303
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:220
InjectorMomentumParser(WarpXParser const &a_ux_parser, WarpXParser const &a_uy_parser, WarpXParser const &a_uz_parser) noexcept
Definition: InjectorMomentum.H:270
InjectorMomentum(InjectorMomentumJuttner *t, amrex::Real theta, amrex::Real beta, int dir)
Definition: InjectorMomentum.H:336
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:244
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:491
Definition: CustomMomentumProb.H:19
Definition: InjectorMomentum.H:19
Object object
Definition: InjectorMomentum.H:495
InjectorMomentum(InjectorMomentumCustom *t, std::string const &a_species_name)
Definition: InjectorMomentum.H:343
Type type
Definition: InjectorMomentum.H:456
Object(InjectorMomentumParser *, WarpXParser const &a_ux_parser, WarpXParser const &a_uy_parser, WarpXParser const &a_uz_parser) noexcept
Definition: InjectorMomentum.H:482
InjectorMomentum(InjectorMomentumParser *t, WarpXParser const &a_ux_parser, WarpXParser const &a_uy_parser, WarpXParser const &a_uz_parser)
Definition: InjectorMomentum.H:313
list x1
Definition: plot_particle_path.py:128
InjectorMomentumBoltzmann(amrex::Real t, amrex::Real b, int d) noexcept
Definition: InjectorMomentum.H:84
amrex::Real theta
Definition: InjectorMomentum.H:232
InjectorMomentum(InjectorMomentumBoltzmann *t, amrex::Real theta, amrex::Real beta, int dir)
Definition: InjectorMomentum.H:329
int dir
Definition: InjectorMomentum.H:144
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:34
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:479
amrex::Real m_ux
Definition: InjectorMomentum.H:40
Object(InjectorMomentumGaussian *, amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m, amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
Definition: InjectorMomentum.H:468
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:250