8 #ifndef INJECTOR_MOMENTUM_H_ 9 #define INJECTOR_MOMENTUM_H_ 19 #include <AMReX_Config.H> 61 amrex::Real a_uz_m, amrex::Real a_ux_th,
62 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
63 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
64 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th)
97 amrex::Real a_uz_m, amrex::Real a_ux_th,
98 amrex::Real a_uy_th, amrex::Real a_uz_th,
99 int a_flux_normal_axis,
int a_flux_direction) noexcept
100 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
101 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th),
102 m_flux_normal_axis(a_flux_normal_axis),
103 m_flux_direction(a_flux_direction)
114 amrex::Real ur = std::sqrt(2._rt*std::log(1._rt/urand));
115 if (m_flux_direction < 0) ur = -ur;
120 amrex::Real
const ux = (m_flux_normal_axis == 0 ? m_ux_th*ur :
amrex::RandomNormal(m_ux_m, m_ux_th, engine));
121 amrex::Real
const uy = (m_flux_normal_axis == 1 ? m_uy_th*ur :
amrex::RandomNormal(m_uy_m, m_uy_th, engine));
122 amrex::Real
const uz = (m_flux_normal_axis == 2 ? m_uz_th*ur :
amrex::RandomNormal(m_uz_m, m_uz_th, engine));
148 : velocity(b), temperature(t)
160 amrex::Real
const theta = temperature(
x,y,
z);
162 amrex::Abort(
"Negative temperature parameter theta encountered, which is not allowed");
165 amrex::Real
const beta = velocity(
x,y,
z);
166 if (beta <= -1._rt || beta >= 1._rt) {
167 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
170 amrex::Real
const vave = std::sqrt(theta);
171 int const dir = velocity.direction();
177 amrex::Real
const gamma = std::sqrt(1._rt + u[0]*u[0]+u[1]*u[1]+u[2]*u[2]);
197 u[dir] = 1._rt/std::sqrt(1._rt-beta*beta)*(u[dir]+gamma*beta);
207 using namespace amrex;
209 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
210 const Real beta = velocity(
x,y,
z);
211 int const dir = velocity.direction();
212 const Real
gamma =
static_cast<amrex::Real
>(1./
sqrt(1+beta*beta));
214 return XDim3 {u[0],u[1],u[2]};
231 : velocity(b), temperature(t)
243 amrex::Real
const theta = temperature(
x,y,
z);
247 amrex::Abort(
"Temeprature parameter theta is less than minimum 0.1 allowed for Maxwell-Juttner");
250 amrex::Real
const beta = velocity(
x,y,
z);
251 if (beta <= -1 || beta >= 1) {
252 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
254 int const dir = velocity.direction();
255 x1 =
static_cast<amrex::Real
>(0.);
256 gamma =
static_cast<amrex::Real
>(0.);
257 u[dir] =
static_cast<amrex::Real
>(0.);
260 while(u[dir]-gamma <= x1)
264 gamma = std::sqrt(1+u[dir]*u[dir]);
273 u[(dir+1)%3] = 2*u[dir]*std::sqrt(x1*(1-x1))*std::sin(2*
MathConst::pi*x2);
274 u[(dir+2)%3] = 2*u[dir]*std::sqrt(x1*(1-x1))*std::cos(2*
MathConst::pi*x2);
276 u[dir] = u[dir]*(2*x1-1);
290 if(-beta*u[dir]/gamma>x1)
297 u[dir] = 1/std::sqrt(1-beta*beta)*(u[dir]+gamma*beta);
307 using namespace amrex;
309 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
310 Real
const beta = velocity(
x,y,
z);
311 int const dir = velocity.direction();
312 const Real
gamma =
static_cast<Real
>(1./
sqrt(1.+beta*beta));
314 return XDim3 {u[0],u[1],u[2]};
332 : u_over_r(a_u_over_r)
340 return {
x*u_over_r, y*u_over_r,
z*u_over_r};
347 return {
x*u_over_r, y*u_over_r,
z*u_over_r};
360 : m_ux_parser(a_ux_parser), m_uy_parser(a_uy_parser),
361 m_uz_parser(a_uz_parser) {}
395 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
397 object(t, a_ux, a_uy, a_uz)
406 object(t, a_ux_parser, a_uy_parser, a_uz_parser)
411 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
412 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
414 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
419 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
420 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th,
421 int a_flux_normal_axis,
int a_flux_direction)
423 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th,a_flux_normal_axis,a_flux_direction)
429 object(t, temperature, velocity)
436 object(t, temperature, velocity)
441 std::string
const& a_species_name)
443 object(t, a_species_name)
448 amrex::Real u_over_r)
473 return object.parser.getMomentum(
x,y,
z,engine);
477 return object.gaussian.getMomentum(
x,y,
z,engine);
479 case Type::gaussianflux:
481 return object.gaussianflux.getMomentum(
x,y,
z,engine);
483 case Type::boltzmann:
485 return object.boltzmann.getMomentum(
x,y,
z,engine);
489 return object.juttner.getMomentum(
x,y,
z,engine);
493 return object.constant.getMomentum(
x,y,
z,engine);
495 case Type::radial_expansion:
497 return object.radial_expansion.getMomentum(
x,y,
z,engine);
501 return object.custom.getMomentum(
x,y,
z,engine);
506 return {0.0,0.0,0.0};
521 return object.parser.getBulkMomentum(
x,y,
z);
525 return object.gaussian.getBulkMomentum(
x,y,
z);
527 case Type::gaussianflux:
529 return object.gaussianflux.getBulkMomentum(
x,y,
z);
531 case Type::boltzmann:
533 return object.boltzmann.getBulkMomentum(
x,y,
z);
537 return object.juttner.getBulkMomentum(
x,y,
z);
541 return object.constant.getBulkMomentum(
x,y,
z);
543 case Type::radial_expansion:
545 return object.radial_expansion.getBulkMomentum(
x,y,
z);
549 return object.custom.getBulkMomentum(
x,y,
z);
554 return {0.0,0.0,0.0};
559 enum struct Type { constant, custom, gaussian, gaussianflux, boltzmann, juttner, radial_expansion,
parser};
569 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
570 : constant(a_ux,a_uy,a_uz) {}
572 std::string
const& a_species_name) noexcept
573 : custom(a_species_name) {}
575 amrex::Real a_ux_m, amrex::Real a_uy_m,
576 amrex::Real a_uz_m, amrex::Real a_ux_th,
577 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
578 : gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
580 amrex::Real a_ux_m, amrex::Real a_uy_m,
581 amrex::Real a_uz_m, amrex::Real a_ux_th,
582 amrex::Real a_uy_th, amrex::Real a_uz_th,
583 int a_flux_normal_axis,
int a_flux_direction) noexcept
584 : gaussianflux(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th,a_flux_normal_axis,a_flux_direction) {}
592 amrex::Real u_over_r) noexcept
593 : radial_expansion(u_over_r) {}
598 :
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:345
InjectorMomentumJuttner(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:230
Definition: GetVelocity.H:20
Object(InjectorMomentumGaussianFlux *, 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, int a_flux_normal_axis, int a_flux_direction) noexcept
Definition: InjectorMomentum.H:579
GetTemperature temperature
Definition: InjectorMomentum.H:319
InjectorMomentum(InjectorMomentumJuttner *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:433
int m_flux_normal_axis
Definition: InjectorMomentum.H:136
GetTemperature temperature
Definition: InjectorMomentum.H:219
InjectorMomentumConstant(amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:34
parser
Definition: run_alltests.py:111
int gamma
Definition: Stencil.py:474
InjectorMomentumCustom custom
Definition: InjectorMomentum.H:600
Object(InjectorMomentumParser *, amrex::ParserExecutor< 3 > const &a_ux_parser, amrex::ParserExecutor< 3 > const &a_uy_parser, amrex::ParserExecutor< 3 > const &a_uz_parser) noexcept
Definition: InjectorMomentum.H:594
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:394
def x
Definition: read_lab_particles.py:26
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:515
Definition: InjectorMomentum.H:94
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:601
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:153
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:108
Get temperature at a point on the grid.
Definition: GetTemperature.H:22
InjectorMomentum(InjectorMomentumParser *t, amrex::ParserExecutor< 3 > const &a_ux_parser, amrex::ParserExecutor< 3 > const &a_uy_parser, amrex::ParserExecutor< 3 > const &a_uz_parser)
Definition: InjectorMomentum.H:401
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:447
Type
Definition: InjectorMomentum.H:559
Definition: InjectorMomentum.H:355
def uz
Definition: read_lab_particles.py:30
Object(InjectorMomentumJuttner *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:588
void clear()
Definition: InjectorMomentum.cpp:12
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:605
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:365
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:60
InjectorMomentumParser parser
Definition: InjectorMomentum.H:606
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:329
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:69
Definition: InjectorMomentum.H:225
InjectorMomentumBoltzmann(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:147
def z
Definition: read_lab_particles.py:27
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:599
Object(InjectorMomentumCustom *, std::string const &a_species_name) noexcept
Definition: InjectorMomentum.H:571
InjectorMomentumParser(amrex::ParserExecutor< 3 > const &a_ux_parser, amrex::ParserExecutor< 3 > const &a_uy_parser, amrex::ParserExecutor< 3 > const &a_uz_parser) noexcept
Definition: InjectorMomentum.H:357
Definition: InjectorMomentum.H:58
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:79
Real RandomNormal(Real mean, Real stddev)
amrex::Real u_over_r
Definition: InjectorMomentum.H:351
amrex::Real m_uy
Definition: InjectorMomentum.H:53
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:466
#define AMREX_GPU_HOST_DEVICE
void Abort(const std::string &msg)
InjectorMomentumGaussianFlux(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, int a_flux_normal_axis, int a_flux_direction) noexcept
Definition: InjectorMomentum.H:96
GetVelocity velocity
Definition: InjectorMomentum.H:318
Definition: InjectorMomentum.H:567
amrex::Real m_uz
Definition: InjectorMomentum.H:53
Definition: InjectorMomentum.H:142
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:603
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:410
amrex::Real m_uz_m
Definition: InjectorMomentum.H:85
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:205
amrex::Real m_uz_th
Definition: InjectorMomentum.H:135
amrex::Real m_uz_th
Definition: InjectorMomentum.H:86
amrex::ParserExecutor< 3 > m_uz_parser
Definition: InjectorMomentum.H:378
Definition: InjectorMomentum.H:613
type
Definition: run_alltests_1node.py:72
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:373
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:568
GetVelocity velocity
Definition: InjectorMomentum.H:218
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:39
InjectorMomentum(InjectorMomentumBoltzmann *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:426
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:305
Definition: InjectorMomentum.H:391
Object(InjectorMomentumBoltzmann *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:585
amrex::Real m_uz_m
Definition: InjectorMomentum.H:134
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:331
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:604
Definition: CustomMomentumProb.H:19
Definition: InjectorMomentum.H:32
Object object
Definition: InjectorMomentum.H:608
InjectorMomentum(InjectorMomentumCustom *t, std::string const &a_species_name)
Definition: InjectorMomentum.H:440
Type type
Definition: InjectorMomentum.H:560
int m_flux_direction
Definition: InjectorMomentum.H:137
InjectorMomentum(InjectorMomentumGaussianFlux *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, int a_flux_normal_axis, int a_flux_direction)
Definition: InjectorMomentum.H:418
static constexpr amrex::Real pi
ratio of a circle's circumference to its diameter
Definition: constant.H:23
InjectorMomentumGaussianFlux gaussianflux
Definition: InjectorMomentum.H:602
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:128
def ux
Definition: read_lab_particles.py:29
list x1
Definition: plot_particle_path.py:130
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:236
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:47
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:591
amrex::Real m_ux
Definition: InjectorMomentum.H:53
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:574
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:337