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
64 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
65 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th)
100 generateGaussianFluxDist( amrex::Real u_m, amrex::Real u_th,
amrex::RandomEngine const& engine ) {
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
164 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
165 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th),
166 m_flux_normal_axis(a_flux_normal_axis),
167 m_flux_direction(a_flux_direction)
170 bool raise_error =
false;
171 if ((m_flux_normal_axis == 0) && (m_ux_m < 0)) raise_error =
true;
172 if ((m_flux_normal_axis == 1) && (m_uy_m < 0)) raise_error =
true;
173 if ((m_flux_normal_axis == 2) && (m_uz_m < 0)) raise_error =
true;
175 "When using the `gaussianflux` distribution, the central momentum along the flux axis must be positive or zero." );
186 amrex::Real u_m = 0, u_th = 0;
187 if (m_flux_normal_axis == 0) {
190 }
else if (m_flux_normal_axis == 1) {
193 }
else if (m_flux_normal_axis == 2) {
197 amrex::Real u = generateGaussianFluxDist(u_m, u_th, engine);
198 if (m_flux_direction < 0) u = -u;
203 amrex::Real
const ux = (m_flux_normal_axis == 0 ? u :
amrex::RandomNormal(m_ux_m, m_ux_th, engine));
204 amrex::Real
const uy = (m_flux_normal_axis == 1 ? u :
amrex::RandomNormal(m_uy_m, m_uy_th, engine));
205 amrex::Real
const uz = (m_flux_normal_axis == 2 ? u :
amrex::RandomNormal(m_uz_m, m_uz_th, engine));
231 : velocity(b), temperature(t)
236 getMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z,
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);
288 getBulkMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z)
const noexcept
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)
319 getMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z,
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);
344 while(u[dir]-gamma <= x1)
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);
374 if(-beta*u[dir]/gamma>x1)
381 u[dir] = 1._rt/std::sqrt(1._rt-beta*beta)*(u[dir]+gamma*beta);
389 getBulkMomentum (amrex::Real
const x, amrex::Real
const y, amrex::Real
const z)
const noexcept
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) {}
452 return amrex::XDim3{m_ux_parser(x,y,z),m_uy_parser(x,y,z),m_uz_parser(x,y,z)};
459 return amrex::XDim3{m_ux_parser(x,y,z),m_uy_parser(x,y,z),m_uz_parser(x,y,z)};
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) {}
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:429
InjectorMomentumJuttner(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:313
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:663
GetTemperature temperature
Definition: InjectorMomentum.H:403
InjectorMomentum(InjectorMomentumJuttner *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:517
int m_flux_normal_axis
Definition: InjectorMomentum.H:219
GetTemperature temperature
Definition: InjectorMomentum.H:302
InjectorMomentumConstant(amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:35
parser
Definition: run_alltests.py:111
int gamma
Definition: Stencil.py:474
InjectorMomentumCustom custom
Definition: InjectorMomentum.H:684
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
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:478
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:599
Definition: InjectorMomentum.H:158
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:685
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 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:180
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:485
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:531
Type
Definition: InjectorMomentum.H:643
Definition: InjectorMomentum.H:439
Object(InjectorMomentumJuttner *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:672
void clear()
Definition: InjectorMomentum.cpp:12
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:689
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
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
InjectorMomentumParser parser
Definition: InjectorMomentum.H:690
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:413
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:70
Definition: InjectorMomentum.H:308
InjectorMomentumBoltzmann(GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:230
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:683
Object(InjectorMomentumCustom *, std::string const &a_species_name) noexcept
Definition: InjectorMomentum.H:655
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
Definition: InjectorMomentum.H:59
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:80
Real RandomNormal(Real mean, Real stddev)
amrex::Real u_over_r
Definition: InjectorMomentum.H:435
amrex::Real m_uy
Definition: InjectorMomentum.H:54
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
#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:160
GetVelocity velocity
Definition: InjectorMomentum.H:402
Definition: InjectorMomentum.H:651
amrex::Real m_uz
Definition: InjectorMomentum.H:54
Definition: InjectorMomentum.H:225
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:687
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
amrex::Real m_uz_m
Definition: InjectorMomentum.H:86
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
amrex::Real m_uz_th
Definition: InjectorMomentum.H:218
amrex::Real m_uz_th
Definition: InjectorMomentum.H:87
amrex::ParserExecutor< 3 > m_uz_parser
Definition: InjectorMomentum.H:462
Definition: InjectorMomentum.H:697
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:457
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:652
GetVelocity velocity
Definition: InjectorMomentum.H:301
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:40
InjectorMomentum(InjectorMomentumBoltzmann *t, GetTemperature const &temperature, GetVelocity const &velocity)
Definition: InjectorMomentum.H:510
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
Definition: InjectorMomentum.H:475
#define WARPX_ALWAYS_ASSERT_WITH_MESSAGE(EX, MSG)
Definition: TextMsg.H:13
Object(InjectorMomentumBoltzmann *, GetTemperature const &t, GetVelocity const &b) noexcept
Definition: InjectorMomentum.H:669
amrex::Real m_uz_m
Definition: InjectorMomentum.H:217
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:415
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:688
Definition: CustomMomentumProb.H:19
Definition: InjectorMomentum.H:33
Object object
Definition: InjectorMomentum.H:692
InjectorMomentum(InjectorMomentumCustom *t, std::string const &a_species_name)
Definition: InjectorMomentum.H:524
Type type
Definition: InjectorMomentum.H:644
int m_flux_direction
Definition: InjectorMomentum.H:220
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
InjectorMomentumGaussianFlux gaussianflux
Definition: InjectorMomentum.H:686
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:211
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:319
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:48
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:675
amrex::Real m_ux
Definition: InjectorMomentum.H:54
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
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