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
100 generateGaussianFluxDist( amrex::Real u_m, amrex::Real u_th,
amrex::RandomEngine const& engine ) {
102 using namespace amrex::literals;
105 amrex::Real u = 0._rt;
107 const amrex::Real abs_u_m = std::abs(u_m);
111 }
else if (abs_u_m < 0.6*u_th) {
117 const amrex::Real umsign = std::copysign(1._rt, u_m);
118 const amrex::Real approx_u_th = u_th/std::sqrt( 1._rt - abs_u_m/u_th );
119 const amrex::Real reject_prefactor = (abs_u_m/u_th)/(2._rt*u_th*u_th);
125 u = approx_u_th * std::sqrt(2._rt*std::log(1._rt/xrand));
128 if (xrand < std::exp(-reject_prefactor*(u - umsign*u_th)*(u - umsign*u_th))) reject =
false;
139 const amrex::Real approx_u_m = u_m + u_th*u_th/abs_u_m;
140 const amrex::Real inv_um = 1._rt/abs_u_m;
149 if (xrand < u*inv_um* std::exp(1._rt - u*inv_um)) reject =
false;
164 amrex::Real a_uz_m, amrex::Real a_ux_th,
165 amrex::Real a_uy_th, amrex::Real a_uz_th,
166 int a_flux_normal_axis,
int a_flux_direction) noexcept
179 using namespace amrex::literals;
182 amrex::Real u_m = 0, u_th = 0;
193 amrex::Real u = generateGaussianFluxDist(u_m, u_th, engine);
225 amrex::Real a_uz_min, amrex::Real a_ux_max,
226 amrex::Real a_uy_max, amrex::Real a_uz_max) noexcept
227 : m_ux_min(a_ux_min), m_uy_min(a_uy_min), m_uz_min(a_uz_min),
228 m_ux_max(a_ux_max), m_uy_max(a_uy_max), m_uz_max(a_uz_max),
229 m_Dux(m_ux_max - m_ux_min),
230 m_Duy(m_uy_max - m_uy_min),
231 m_Duz(m_uz_max - m_uz_min),
232 m_ux_h(amrex::Real(0.5) * (m_ux_max + m_ux_min)),
233 m_uy_h(amrex::Real(0.5) * (m_uy_max + m_uy_min)),
234 m_uz_h(amrex::Real(0.5) * (m_uz_max + m_uz_min))
269 : velocity(b), temperature(t)
274 getMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z,
277 using namespace amrex::literals;
281 amrex::Real
const theta = temperature(x,y,z);
283 amrex::Abort(
"Negative temperature parameter theta encountered, which is not allowed");
286 amrex::Real
const beta = velocity(x,y,z);
287 if (beta <= -1._rt || beta >= 1._rt) {
288 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
291 amrex::Real
const vave = std::sqrt(theta);
292 int const dir = velocity.direction();
298 amrex::Real
const gamma = std::sqrt(1._rt + u[0]*u[0]+u[1]*u[1]+u[2]*u[2]);
326 getBulkMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z)
const noexcept
328 using namespace amrex::literals;
330 for (
auto& el : u) el = 0.0_rt;
331 const amrex::Real
beta = velocity(x,y,z);
332 int const dir = velocity.direction();
352 : velocity(b), temperature(t)
357 getMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z,
360 using namespace amrex::literals;
365 amrex::Real
const theta = temperature(x,y,z);
368 if (theta < 0.1_rt) {
369 amrex::Abort(
"Temeprature parameter theta is less than minimum 0.1 allowed for Maxwell-Juttner");
372 amrex::Real
const beta = velocity(x,y,z);
373 if (beta <= -1._rt || beta >= 1._rt) {
374 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
376 int const dir = velocity.direction();
377 x1 =
static_cast<amrex::Real
>(0._rt);
378 gamma =
static_cast<amrex::Real
>(0._rt);
379 u[dir] =
static_cast<amrex::Real
>(0._rt);
386 gamma = std::sqrt(1._rt+u[dir]*u[dir]);
395 u[(dir+1)%3] = 2._rt*u[dir]*std::sqrt(
x1*(1._rt-
x1))*std::sin(2._rt*MathConst::pi*x2);
396 u[(dir+2)%3] = 2._rt*u[dir]*std::sqrt(
x1*(1._rt-
x1))*std::cos(2._rt*MathConst::pi*x2);
398 u[dir] = u[dir]*(2._rt*
x1-1._rt);
427 getBulkMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z)
const noexcept
429 using namespace amrex::literals;
431 for (
auto& el : u) el = 0.0_rt;
432 amrex::Real
const beta = velocity(x,y,z);
433 int const dir = velocity.direction();
454 : u_over_r(a_u_over_r)
462 return {x*u_over_r, y*u_over_r, z*u_over_r};
469 return {x*u_over_r, y*u_over_r, z*u_over_r};
482 : m_ux_parser(a_ux_parser), m_uy_parser(a_uy_parser),
483 m_uz_parser(a_uz_parser) {}
490 return amrex::XDim3{m_ux_parser(x,y,z),m_uy_parser(x,y,z),m_uz_parser(x,y,z)};
497 return amrex::XDim3{m_ux_parser(x,y,z),m_uy_parser(x,y,z),m_uz_parser(x,y,z)};
517 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
519 object(t, a_ux, a_uy, a_uz)
528 object(t, a_ux_parser, a_uy_parser, a_uz_parser)
533 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
534 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
536 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
541 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
542 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th,
543 int a_flux_normal_axis,
int a_flux_direction)
545 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)
550 amrex::Real a_ux_min, amrex::Real a_uy_min, amrex::Real a_uz_min,
551 amrex::Real a_ux_max, amrex::Real a_uy_max, amrex::Real a_uz_max)
553 object(t,a_ux_min,a_uy_min,a_uz_min,a_ux_max,a_uy_max,a_uz_max)
559 object(t, temperature, velocity)
566 object(t, temperature, velocity)
571 amrex::Real u_over_r)
599 return object.parser.getMomentum(x,y,z,engine);
603 return object.gaussian.getMomentum(x,y,z,engine);
605 case Type::gaussianflux:
607 return object.gaussianflux.getMomentum(x,y,z,engine);
611 return object.uniform.getMomentum(x,y,z,engine);
613 case Type::boltzmann:
615 return object.boltzmann.getMomentum(x,y,z,engine);
619 return object.juttner.getMomentum(x,y,z,engine);
623 return object.constant.getMomentum(x,y,z,engine);
625 case Type::radial_expansion:
627 return object.radial_expansion.getMomentum(x,y,z,engine);
632 return {0.0,0.0,0.0};
647 return object.parser.getBulkMomentum(x,y,z);
651 return object.gaussian.getBulkMomentum(x,y,z);
653 case Type::gaussianflux:
655 return object.gaussianflux.getBulkMomentum(x,y,z);
659 return object.uniform.getBulkMomentum(x,y,z);
661 case Type::boltzmann:
663 return object.boltzmann.getBulkMomentum(x,y,z);
667 return object.juttner.getBulkMomentum(x,y,z);
671 return object.constant.getBulkMomentum(x,y,z);
673 case Type::radial_expansion:
675 return object.radial_expansion.getBulkMomentum(x,y,z);
680 return {0.0,0.0,0.0};
685 enum struct Type { constant, gaussian, gaussianflux, uniform, boltzmann, juttner, radial_expansion,
parser };
695 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
696 : constant(a_ux,a_uy,a_uz) {}
698 amrex::Real a_ux_m, amrex::Real a_uy_m,
699 amrex::Real a_uz_m, amrex::Real a_ux_th,
700 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
701 : gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
703 amrex::Real a_ux_m, amrex::Real a_uy_m,
704 amrex::Real a_uz_m, amrex::Real a_ux_th,
705 amrex::Real a_uy_th, amrex::Real a_uz_th,
706 int a_flux_normal_axis,
int a_flux_direction) noexcept
707 : 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) {}
709 amrex::Real a_ux_min, amrex::Real a_uy_min,
710 amrex::Real a_uz_min, amrex::Real a_ux_max,
711 amrex::Real a_uy_max, amrex::Real a_uz_max) noexcept
712 : uniform(a_ux_min,a_uy_min,a_uz_min,a_ux_max,a_uy_max,a_uz_max) {}
720 amrex::Real u_over_r) noexcept
721 : radial_expansion(u_over_r) {}
726 :
parser(a_ux_parser, a_uy_parser, a_uz_parser) {}
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
Real RandomNormal(Real mean, Real stddev)
void Abort(const std::string &msg)
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE GpuComplex< T > sqrt(const GpuComplex< T > &a_z) noexcept
list x1
Definition: plot_particle_path.py:130
type
Definition: run_alltests_1node.py:72
beta
Definition: stencil.py:434
int gamma
boosted frame
Definition: stencil.py:431
parser
Definition: stencil.py:411
Get temperature at a point on the grid.
Definition: GetTemperature.H:23
Definition: GetVelocity.H:21
Definition: InjectorMomentum.H:264
GetTemperature temperature
Definition: InjectorMomentum.H:340
GetVelocity velocity
Definition: InjectorMomentum.H:339
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:274
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:326
InjectorMomentumBoltzmann(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:268
Definition: InjectorMomentum.H:33
amrex::Real m_uy
Definition: InjectorMomentum.H:53
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:47
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:39
amrex::Real m_ux
Definition: InjectorMomentum.H:53
InjectorMomentumConstant(amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:34
amrex::Real m_uz
Definition: InjectorMomentum.H:53
Definition: InjectorMomentum.H:741
Definition: InjectorMomentum.H:162
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:207
amrex::Real m_uy_m
Definition: InjectorMomentum.H:213
int m_flux_normal_axis
Definition: InjectorMomentum.H:215
amrex::Real m_ux_m
Definition: InjectorMomentum.H:213
amrex::Real m_uz_th
Definition: InjectorMomentum.H:214
amrex::Real m_ux_th
Definition: InjectorMomentum.H:214
amrex::Real m_uy_th
Definition: InjectorMomentum.H:214
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:163
amrex::Real m_uz_m
Definition: InjectorMomentum.H:213
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:176
int m_flux_direction
Definition: InjectorMomentum.H:216
Definition: InjectorMomentum.H:59
amrex::Real m_uz_m
Definition: InjectorMomentum.H:85
amrex::Real m_ux_m
Definition: InjectorMomentum.H:85
amrex::Real m_ux_th
Definition: InjectorMomentum.H:86
amrex::Real m_uy_th
Definition: InjectorMomentum.H:86
amrex::Real m_uy_m
Definition: InjectorMomentum.H:85
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
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:69
amrex::Real m_uz_th
Definition: InjectorMomentum.H:86
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:79
Definition: InjectorMomentum.H:514
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:570
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:592
Type type
Definition: InjectorMomentum.H:686
InjectorMomentum(InjectorMomentum &&)=delete
~InjectorMomentum()=default
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:523
void clear()
Definition: InjectorMomentum.cpp:12
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:516
InjectorMomentum(InjectorMomentum const &)=delete
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:532
InjectorMomentum(InjectorMomentumUniform *t, amrex::Real a_ux_min, amrex::Real a_uy_min, amrex::Real a_uz_min, amrex::Real a_ux_max, amrex::Real a_uy_max, amrex::Real a_uz_max)
Definition: InjectorMomentum.H:549
Type
Definition: InjectorMomentum.H:685
Object object
Definition: InjectorMomentum.H:736
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:641
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:540
InjectorMomentum(InjectorMomentumBoltzmann *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:556
InjectorMomentum(InjectorMomentumJuttner *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:563
Definition: InjectorMomentum.H:347
GetVelocity velocity
Definition: InjectorMomentum.H:440
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:427
GetTemperature temperature
Definition: InjectorMomentum.H:441
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:357
InjectorMomentumJuttner(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:351
Definition: InjectorMomentum.H:478
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:487
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:479
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:495
amrex::ParserExecutor< 3 > m_ux_parser
Definition: InjectorMomentum.H:500
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:452
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:453
amrex::Real u_over_r
Definition: InjectorMomentum.H:473
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:459
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:467
Definition: InjectorMomentum.H:693
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:728
InjectorMomentumUniform uniform
Definition: InjectorMomentum.H:730
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:702
Object(InjectorMomentumBoltzmann *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:713
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:722
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:732
Object(InjectorMomentumUniform *, amrex::Real a_ux_min, amrex::Real a_uy_min, amrex::Real a_uz_min, amrex::Real a_ux_max, amrex::Real a_uy_max, amrex::Real a_uz_max) noexcept
Definition: InjectorMomentum.H:708
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:733
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:731
InjectorMomentumGaussianFlux gaussianflux
Definition: InjectorMomentum.H:729
Object(InjectorMomentumJuttner *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:716
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:719
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:697
InjectorMomentumParser parser
Definition: InjectorMomentum.H:734
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:727
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:694