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
99 generateGaussianFluxDist( amrex::Real u_m, amrex::Real u_th,
amrex::RandomEngine const& engine ) {
101 using namespace amrex::literals;
104 amrex::Real u = 0._rt;
108 }
else if (u_m < 0.6*u_th) {
114 const amrex::Real approx_u_th = u_th/std::sqrt( 1._rt - u_m/u_th );
115 const amrex::Real reject_prefactor = (u_m/u_th)/(2._rt*u_th*u_th);
121 u = approx_u_th * std::sqrt(2._rt*std::log(1._rt/xrand));
124 if (xrand < std::exp(-reject_prefactor*(u-u_th)*(u-u_th))) reject =
false;
135 const amrex::Real approx_u_m = u_m + u_th*u_th/u_m;
136 const amrex::Real inv_um = 1._rt/u_m;
145 if (xrand < u*inv_um* std::exp(1._rt - u*inv_um)) reject =
false;
160 amrex::Real a_uz_m, amrex::Real a_ux_th,
161 amrex::Real a_uy_th, amrex::Real a_uz_th,
162 int a_flux_normal_axis,
int a_flux_direction) noexcept
169 bool raise_error =
false;
174 "When using the `gaussianflux` distribution, the central momentum along the flux axis must be positive or zero." );
182 using namespace amrex::literals;
185 amrex::Real u_m = 0, u_th = 0;
196 amrex::Real u = generateGaussianFluxDist(u_m, u_th, engine);
228 amrex::Real a_uz_min, amrex::Real a_ux_max,
229 amrex::Real a_uy_max, amrex::Real a_uz_max) noexcept
230 : m_ux_min(a_ux_min), m_uy_min(a_uy_min), m_uz_min(a_uz_min),
231 m_ux_max(a_ux_max), m_uy_max(a_uy_max), m_uz_max(a_uz_max)
233 m_Dux = m_ux_max - m_ux_min;
234 m_Duy = m_uy_max - m_uy_min;
235 m_Duz = m_uz_max - m_uz_min;
236 m_ux_h = 0.5 * (m_ux_max + m_ux_min);
237 m_uy_h = 0.5 * (m_uy_max + m_uy_min);
238 m_uz_h = 0.5 * (m_uz_max + m_uz_min);
273 : velocity(b), temperature(t)
278 getMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z,
281 using namespace amrex::literals;
285 amrex::Real
const theta = temperature(x,y,z);
287 amrex::Abort(
"Negative temperature parameter theta encountered, which is not allowed");
290 amrex::Real
const beta = velocity(x,y,z);
291 if (beta <= -1._rt || beta >= 1._rt) {
292 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
295 amrex::Real
const vave = std::sqrt(theta);
296 int const dir = velocity.direction();
302 amrex::Real
const gamma = std::sqrt(1._rt + u[0]*u[0]+u[1]*u[1]+u[2]*u[2]);
330 getBulkMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z)
const noexcept
332 using namespace amrex::literals;
334 for (
auto& el : u) el = 0.0_rt;
335 const amrex::Real
beta = velocity(x,y,z);
336 int const dir = velocity.direction();
356 : velocity(b), temperature(t)
361 getMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z,
364 using namespace amrex::literals;
369 amrex::Real
const theta = temperature(x,y,z);
372 if (theta < 0.1_rt) {
373 amrex::Abort(
"Temeprature parameter theta is less than minimum 0.1 allowed for Maxwell-Juttner");
376 amrex::Real
const beta = velocity(x,y,z);
377 if (beta <= -1._rt || beta >= 1._rt) {
378 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
380 int const dir = velocity.direction();
381 x1 =
static_cast<amrex::Real
>(0._rt);
382 gamma =
static_cast<amrex::Real
>(0._rt);
383 u[dir] =
static_cast<amrex::Real
>(0._rt);
390 gamma = std::sqrt(1._rt+u[dir]*u[dir]);
399 u[(dir+1)%3] = 2._rt*u[dir]*std::sqrt(
x1*(1._rt-
x1))*std::sin(2._rt*MathConst::pi*x2);
400 u[(dir+2)%3] = 2._rt*u[dir]*std::sqrt(
x1*(1._rt-
x1))*std::cos(2._rt*MathConst::pi*x2);
402 u[dir] = u[dir]*(2._rt*
x1-1._rt);
431 getBulkMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z)
const noexcept
433 using namespace amrex::literals;
435 for (
auto& el : u) el = 0.0_rt;
436 amrex::Real
const beta = velocity(x,y,z);
437 int const dir = velocity.direction();
458 : u_over_r(a_u_over_r)
466 return {x*u_over_r, y*u_over_r, z*u_over_r};
473 return {x*u_over_r, y*u_over_r, z*u_over_r};
486 : m_ux_parser(a_ux_parser), m_uy_parser(a_uy_parser),
487 m_uz_parser(a_uz_parser) {}
494 return amrex::XDim3{m_ux_parser(x,y,z),m_uy_parser(x,y,z),m_uz_parser(x,y,z)};
501 return amrex::XDim3{m_ux_parser(x,y,z),m_uy_parser(x,y,z),m_uz_parser(x,y,z)};
521 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
523 object(t, a_ux, a_uy, a_uz)
532 object(t, a_ux_parser, a_uy_parser, a_uz_parser)
537 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
538 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
540 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
545 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
546 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th,
547 int a_flux_normal_axis,
int a_flux_direction)
549 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)
554 amrex::Real a_ux_min, amrex::Real a_uy_min, amrex::Real a_uz_min,
555 amrex::Real a_ux_max, amrex::Real a_uy_max, amrex::Real a_uz_max)
557 object(t,a_ux_min,a_uy_min,a_uz_min,a_ux_max,a_uy_max,a_uz_max)
563 object(t, temperature, velocity)
570 object(t, temperature, velocity)
575 amrex::Real u_over_r)
600 return object.parser.getMomentum(x,y,z,engine);
604 return object.gaussian.getMomentum(x,y,z,engine);
606 case Type::gaussianflux:
608 return object.gaussianflux.getMomentum(x,y,z,engine);
612 return object.uniform.getMomentum(x,y,z,engine);
614 case Type::boltzmann:
616 return object.boltzmann.getMomentum(x,y,z,engine);
620 return object.juttner.getMomentum(x,y,z,engine);
624 return object.constant.getMomentum(x,y,z,engine);
626 case Type::radial_expansion:
628 return object.radial_expansion.getMomentum(x,y,z,engine);
633 return {0.0,0.0,0.0};
648 return object.parser.getBulkMomentum(x,y,z);
652 return object.gaussian.getBulkMomentum(x,y,z);
654 case Type::gaussianflux:
656 return object.gaussianflux.getBulkMomentum(x,y,z);
660 return object.uniform.getBulkMomentum(x,y,z);
662 case Type::boltzmann:
664 return object.boltzmann.getBulkMomentum(x,y,z);
668 return object.juttner.getBulkMomentum(x,y,z);
672 return object.constant.getBulkMomentum(x,y,z);
674 case Type::radial_expansion:
676 return object.radial_expansion.getBulkMomentum(x,y,z);
681 return {0.0,0.0,0.0};
686 enum struct Type { constant, gaussian, gaussianflux, uniform, boltzmann, juttner, radial_expansion,
parser };
696 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
697 : constant(a_ux,a_uy,a_uz) {}
699 amrex::Real a_ux_m, amrex::Real a_uy_m,
700 amrex::Real a_uz_m, amrex::Real a_ux_th,
701 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
702 : gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
704 amrex::Real a_ux_m, amrex::Real a_uy_m,
705 amrex::Real a_uz_m, amrex::Real a_ux_th,
706 amrex::Real a_uy_th, amrex::Real a_uz_th,
707 int a_flux_normal_axis,
int a_flux_direction) noexcept
708 : 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) {}
710 amrex::Real a_ux_min, amrex::Real a_uy_min,
711 amrex::Real a_uz_min, amrex::Real a_ux_max,
712 amrex::Real a_uy_max, amrex::Real a_uz_max) noexcept
713 : uniform(a_ux_min,a_uy_min,a_uz_min,a_ux_max,a_uy_max,a_uz_max) {}
721 amrex::Real u_over_r) noexcept
722 : radial_expansion(u_over_r) {}
727 :
parser(a_ux_parser, a_uy_parser, a_uz_parser) {}
#define AMREX_GPU_HOST_DEVICE
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition: TextMsg.H:13
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:432
int gamma
boosted frame
Definition: stencil.py:429
parser
Definition: stencil.py:409
Get temperature at a point on the grid.
Definition: GetTemperature.H:23
Definition: GetVelocity.H:21
Definition: InjectorMomentum.H:268
GetTemperature temperature
Definition: InjectorMomentum.H:344
GetVelocity velocity
Definition: InjectorMomentum.H:343
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:278
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:330
InjectorMomentumBoltzmann(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:272
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:742
Definition: InjectorMomentum.H:158
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:210
amrex::Real m_uy_m
Definition: InjectorMomentum.H:216
int m_flux_normal_axis
Definition: InjectorMomentum.H:218
amrex::Real m_ux_m
Definition: InjectorMomentum.H:216
amrex::Real m_uz_th
Definition: InjectorMomentum.H:217
amrex::Real m_ux_th
Definition: InjectorMomentum.H:217
amrex::Real m_uy_th
Definition: InjectorMomentum.H:217
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:159
amrex::Real m_uz_m
Definition: InjectorMomentum.H:216
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:179
int m_flux_direction
Definition: InjectorMomentum.H:219
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:518
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:574
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:593
Type type
Definition: InjectorMomentum.H:687
InjectorMomentum(InjectorMomentum &&)=delete
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:527
void clear()
Definition: InjectorMomentum.cpp:12
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:520
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:536
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:553
Type
Definition: InjectorMomentum.H:686
Object object
Definition: InjectorMomentum.H:737
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:642
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:544
InjectorMomentum(InjectorMomentumBoltzmann *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:560
InjectorMomentum(InjectorMomentumJuttner *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:567
Definition: InjectorMomentum.H:351
GetVelocity velocity
Definition: InjectorMomentum.H:444
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:431
GetTemperature temperature
Definition: InjectorMomentum.H:445
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:361
InjectorMomentumJuttner(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:355
Definition: InjectorMomentum.H:482
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:491
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:483
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:499
amrex::ParserExecutor< 3 > m_ux_parser
Definition: InjectorMomentum.H:504
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:456
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:457
amrex::Real u_over_r
Definition: InjectorMomentum.H:477
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:463
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:471
Definition: InjectorMomentum.H:694
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:729
InjectorMomentumUniform uniform
Definition: InjectorMomentum.H:731
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:703
Object(InjectorMomentumBoltzmann *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:714
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:723
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:733
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:709
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:734
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:732
InjectorMomentumGaussianFlux gaussianflux
Definition: InjectorMomentum.H:730
Object(InjectorMomentumJuttner *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:717
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:720
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:698
InjectorMomentumParser parser
Definition: InjectorMomentum.H:735
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:728
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:695