8 #ifndef INJECTOR_MOMENTUM_H_
9 #define INJECTOR_MOMENTUM_H_
20 #include <AMReX_Config.H>
62 amrex::Real a_uz_m, amrex::Real a_ux_th,
63 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;
109 }
else if (u_m < 0.6*u_th) {
115 amrex::Real approx_u_th = u_th/std::sqrt( 1._rt - u_m/u_th );
116 amrex::Real reject_prefactor = (u_m/u_th)/(2._rt*u_th*u_th);
122 u = approx_u_th * std::sqrt(2._rt*std::log(1._rt/xrand));
125 if (xrand < std::exp(-reject_prefactor*(u-u_th)*(u-u_th))) reject =
false;
136 amrex::Real approx_u_m = u_m + u_th*u_th/u_m;
137 amrex::Real inv_um = 1._rt/u_m;
146 if (xrand < u*inv_um* std::exp(1._rt - u*inv_um)) reject =
false;
161 amrex::Real a_uz_m, amrex::Real a_ux_th,
162 amrex::Real a_uy_th, amrex::Real a_uz_th,
163 int a_flux_normal_axis,
int a_flux_direction) noexcept
170 bool raise_error =
false;
175 "When using the `gaussianflux` distribution, the central momentum along the flux axis must be positive or zero." );
183 using namespace amrex::literals;
186 amrex::Real u_m = 0, u_th = 0;
197 amrex::Real u = generateGaussianFluxDist(u_m, u_th, engine);
231 : velocity(b), temperature(t)
239 using namespace amrex::literals;
243 amrex::Real
const theta = temperature(
x,
y,
z);
245 amrex::Abort(
"Negative temperature parameter theta encountered, which is not allowed");
248 amrex::Real
const beta = velocity(
x,
y,
z);
249 if (beta <= -1._rt || beta >= 1._rt) {
250 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
253 amrex::Real
const vave = std::sqrt(theta);
254 int const dir = velocity.direction();
260 amrex::Real
const gamma = std::sqrt(1._rt + u[0]*u[0]+u[1]*u[1]+u[2]*u[2]);
280 u[dir] = 1._rt/std::sqrt(1._rt-beta*beta)*(u[dir]+
gamma*beta);
290 using namespace amrex::literals;
292 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
293 const amrex::Real beta = velocity(
x,
y,
z);
294 int const dir = velocity.direction();
295 const amrex::Real
gamma =
static_cast<amrex::Real
>(1._rt/sqrt(1._rt-beta*beta));
314 : velocity(b), temperature(t)
322 using namespace amrex::literals;
327 amrex::Real
const theta = temperature(
x,
y,
z);
330 if (theta < 0.1_rt) {
331 amrex::Abort(
"Temeprature parameter theta is less than minimum 0.1 allowed for Maxwell-Juttner");
334 amrex::Real
const beta = velocity(
x,
y,
z);
335 if (beta <= -1._rt || beta >= 1._rt) {
336 amrex::Abort(
"beta = v/c magnitude greater than or equal to 1");
338 int const dir = velocity.direction();
339 x1 =
static_cast<amrex::Real
>(0._rt);
340 gamma =
static_cast<amrex::Real
>(0._rt);
341 u[dir] =
static_cast<amrex::Real
>(0._rt);
348 gamma = std::sqrt(1._rt+u[dir]*u[dir]);
357 u[(dir+1)%3] = 2._rt*u[dir]*std::sqrt(
x1*(1._rt-
x1))*std::sin(2._rt*
MathConst::pi*x2);
358 u[(dir+2)%3] = 2._rt*u[dir]*std::sqrt(
x1*(1._rt-
x1))*std::cos(2._rt*
MathConst::pi*x2);
360 u[dir] = u[dir]*(2._rt*
x1-1._rt);
381 u[dir] = 1._rt/std::sqrt(1._rt-beta*beta)*(u[dir]+
gamma*beta);
391 using namespace amrex::literals;
393 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
394 amrex::Real
const beta = velocity(
x,
y,
z);
395 int const dir = velocity.direction();
396 amrex::Real
const gamma =
static_cast<amrex::Real
>(1._rt/sqrt(1._rt-beta*beta));
416 : u_over_r(a_u_over_r)
424 return {
x*u_over_r,
y*u_over_r,
z*u_over_r};
431 return {
x*u_over_r,
y*u_over_r,
z*u_over_r};
444 : m_ux_parser(a_ux_parser), m_uy_parser(a_uy_parser),
445 m_uz_parser(a_uz_parser) {}
479 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
481 object(t, a_ux, a_uy, a_uz)
490 object(t, a_ux_parser, a_uy_parser, a_uz_parser)
495 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
496 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
498 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
503 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
504 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th,
505 int a_flux_normal_axis,
int a_flux_direction)
507 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)
513 object(t, temperature, velocity)
520 object(t, temperature, velocity)
525 std::string
const& a_species_name)
527 object(t, a_species_name)
532 amrex::Real u_over_r)
557 return object.parser.getMomentum(
x,
y,
z,engine);
561 return object.gaussian.getMomentum(
x,
y,
z,engine);
563 case Type::gaussianflux:
565 return object.gaussianflux.getMomentum(
x,
y,
z,engine);
567 case Type::boltzmann:
569 return object.boltzmann.getMomentum(
x,
y,
z,engine);
573 return object.juttner.getMomentum(
x,
y,
z,engine);
577 return object.constant.getMomentum(
x,
y,
z,engine);
579 case Type::radial_expansion:
581 return object.radial_expansion.getMomentum(
x,
y,
z,engine);
585 return object.custom.getMomentum(
x,
y,
z,engine);
590 return {0.0,0.0,0.0};
605 return object.parser.getBulkMomentum(
x,
y,
z);
609 return object.gaussian.getBulkMomentum(
x,
y,
z);
611 case Type::gaussianflux:
613 return object.gaussianflux.getBulkMomentum(
x,
y,
z);
615 case Type::boltzmann:
617 return object.boltzmann.getBulkMomentum(
x,
y,
z);
621 return object.juttner.getBulkMomentum(
x,
y,
z);
625 return object.constant.getBulkMomentum(
x,
y,
z);
627 case Type::radial_expansion:
629 return object.radial_expansion.getBulkMomentum(
x,
y,
z);
633 return object.custom.getBulkMomentum(
x,
y,
z);
638 return {0.0,0.0,0.0};
643 enum struct Type { constant, custom, gaussian, gaussianflux, boltzmann, juttner, radial_expansion,
parser};
653 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
654 : constant(a_ux,a_uy,a_uz) {}
656 std::string
const& a_species_name) noexcept
657 : custom(a_species_name) {}
659 amrex::Real a_ux_m, amrex::Real a_uy_m,
660 amrex::Real a_uz_m, amrex::Real a_ux_th,
661 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
662 : gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
664 amrex::Real a_ux_m, amrex::Real a_uy_m,
665 amrex::Real a_uz_m, amrex::Real a_ux_th,
666 amrex::Real a_uy_th, amrex::Real a_uz_th,
667 int a_flux_normal_axis,
int a_flux_direction) noexcept
668 : 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) {}
676 amrex::Real u_over_r) noexcept
677 : radial_expansion(u_over_r) {}
682 :
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
def y
Definition: Excitation_Flag_Generator.py:76
def x
Formats datastring to remove "+" at the end of the string #####.
Definition: Excitation_Flag_Generator.py:75
def z
Definition: Excitation_Flag_Generator.py:77
static constexpr amrex::Real pi
ratio of a circle's circumference to its diameter
Definition: constant.H:23
Real RandomNormal(Real mean, Real stddev)
void Abort(const std::string &msg)
list x1
Definition: plot_particle_path.py:130
type
Definition: run_alltests_1node.py:72
parser
Definition: run_alltests.py:111
int gamma
Definition: stencil.py:446
Get temperature at a point on the grid.
Definition: GetTemperature.H:23
Definition: GetVelocity.H:21
Definition: InjectorMomentum.H:226
GetTemperature temperature
Definition: InjectorMomentum.H:302
GetVelocity velocity
Definition: InjectorMomentum.H:301
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 const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:288
InjectorMomentumBoltzmann(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:230
Definition: InjectorMomentum.H:34
amrex::Real m_uy
Definition: InjectorMomentum.H:54
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:48
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:40
amrex::Real m_ux
Definition: InjectorMomentum.H:54
InjectorMomentumConstant(amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:35
amrex::Real m_uz
Definition: InjectorMomentum.H:54
Definition: CustomMomentumProb.H:20
Definition: InjectorMomentum.H:697
Definition: InjectorMomentum.H:159
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:211
amrex::Real m_uy_m
Definition: InjectorMomentum.H:217
int m_flux_normal_axis
Definition: InjectorMomentum.H:219
amrex::Real m_ux_m
Definition: InjectorMomentum.H:217
amrex::Real m_uz_th
Definition: InjectorMomentum.H:218
amrex::Real m_ux_th
Definition: InjectorMomentum.H:218
amrex::Real m_uy_th
Definition: InjectorMomentum.H:218
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:160
amrex::Real m_uz_m
Definition: InjectorMomentum.H:217
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:180
int m_flux_direction
Definition: InjectorMomentum.H:220
Definition: InjectorMomentum.H:60
amrex::Real m_uz_m
Definition: InjectorMomentum.H:86
amrex::Real m_ux_m
Definition: InjectorMomentum.H:86
amrex::Real m_ux_th
Definition: InjectorMomentum.H:87
amrex::Real m_uy_th
Definition: InjectorMomentum.H:87
amrex::Real m_uy_m
Definition: InjectorMomentum.H:86
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:61
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:70
amrex::Real m_uz_th
Definition: InjectorMomentum.H:87
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:80
Definition: InjectorMomentum.H:476
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:531
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:550
Type type
Definition: InjectorMomentum.H:644
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:485
void clear()
Definition: InjectorMomentum.cpp:12
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:478
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:494
Type
Definition: InjectorMomentum.H:643
Object object
Definition: InjectorMomentum.H:692
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:599
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:502
InjectorMomentum(InjectorMomentumBoltzmann *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:510
InjectorMomentum(InjectorMomentumCustom *t, std::string const &a_species_name)
Definition: InjectorMomentum.H:524
InjectorMomentum(InjectorMomentumJuttner *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:517
Definition: InjectorMomentum.H:309
GetVelocity velocity
Definition: InjectorMomentum.H:402
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition: InjectorMomentum.H:389
GetTemperature temperature
Definition: InjectorMomentum.H:403
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:319
InjectorMomentumJuttner(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:313
Definition: InjectorMomentum.H:440
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:449
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:441
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:457
amrex::ParserExecutor< 3 > m_ux_parser
Definition: InjectorMomentum.H:462
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:414
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:415
amrex::Real u_over_r
Definition: InjectorMomentum.H:435
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:421
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:429
Definition: InjectorMomentum.H:651
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:685
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:663
Object(InjectorMomentumBoltzmann *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:669
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:678
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:688
InjectorMomentumCustom custom
Definition: InjectorMomentum.H:684
Object(InjectorMomentumCustom *, std::string const &a_species_name) noexcept
Definition: InjectorMomentum.H:655
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:689
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:687
InjectorMomentumGaussianFlux gaussianflux
Definition: InjectorMomentum.H:686
Object(InjectorMomentumJuttner *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:672
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:675
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:658
InjectorMomentumParser parser
Definition: InjectorMomentum.H:690
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:683
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:652