8 #ifndef INJECTOR_MOMENTUM_H_ 9 #define INJECTOR_MOMENTUM_H_ 15 #include <AMReX_Config.H> 16 #include <AMReX_Dim3.H> 17 #include <AMReX_GpuQualifiers.H> 18 #include <AMReX_REAL.H> 19 #include <AMReX_Parser.H> 20 #include <AMReX_Random.H> 22 #include <AMReX_BaseFwd.H> 36 amrex::RandomEngine
const&)
const noexcept
57 amrex::Real a_uz_m, amrex::Real a_ux_th,
58 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
59 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
60 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th)
66 amrex::RandomEngine
const& engine)
const noexcept
68 return amrex::XDim3{amrex::RandomNormal(m_ux_m, m_ux_th, engine),
69 amrex::RandomNormal(m_uy_m, m_uy_th, engine),
70 amrex::RandomNormal(m_uz_m, m_uz_th, engine)};
77 return amrex::XDim3{m_ux_m, m_uy_m, m_uz_m};
93 amrex::Real a_uz_m, amrex::Real a_ux_th,
94 amrex::Real a_uy_th, amrex::Real a_uz_th,
95 int a_flux_normal_axis,
int a_flux_direction) noexcept
96 : m_ux_m(a_ux_m), m_uy_m(a_uy_m), m_uz_m(a_uz_m),
97 m_ux_th(a_ux_th), m_uy_th(a_uy_th), m_uz_th(a_uz_th),
98 m_flux_normal_axis(a_flux_normal_axis),
99 m_flux_direction(a_flux_direction)
102 AMREX_GPU_HOST_DEVICE
105 amrex::RandomEngine
const& engine)
const noexcept
109 amrex::Real
const urand = 1._rt - amrex::Random(engine);
110 amrex::Real ur = std::sqrt(2._rt*std::log(1._rt/urand));
111 if (m_flux_direction < 0) ur = -ur;
114 amrex::Real
const ux = (m_flux_normal_axis == 0 ? m_ux_th*ur : amrex::RandomNormal(m_ux_m, m_ux_th, engine));
115 amrex::Real
const uy = (m_flux_normal_axis == 1 && AMREX_SPACEDIM==3 ? m_uy_th*ur : amrex::RandomNormal(m_uy_m, m_uy_th, engine));
116 amrex::Real
const uz = (m_flux_normal_axis == AMREX_SPACEDIM-1 ? m_uz_th*ur : amrex::RandomNormal(m_uz_m, m_uz_th, engine));
117 return amrex::XDim3{
ux, uy, uz};
120 AMREX_GPU_HOST_DEVICE
124 return amrex::XDim3{m_ux_m, m_uy_m, m_uz_m};
143 : dir(d), beta(b), vave(std::sqrt(amrex::Real(2.)*t))
146 AMREX_GPU_HOST_DEVICE
149 amrex::RandomEngine
const& engine)
const noexcept
151 amrex::Real
x1, x2, gamma;
153 x1 = amrex::Random(engine);
154 x2 = amrex::Random(engine);
158 u[(dir+1)%3] = vave*std::sqrt(-std::log(x1)) *std::sin(2*MathConst::pi*x2);
159 u[(dir+2)%3] = vave*std::sqrt(-std::log(x1)) *std::cos(2*MathConst::pi*x2);
160 u[dir] = vave*std::sqrt(-std::log(amrex::Random(engine)))*
161 std::sin(2*MathConst::pi*amrex::Random(engine));
162 gamma = u[0]*u[0]+u[1]*u[1]+u[2]*u[2];
163 gamma = std::sqrt(1+gamma);
175 x1 = amrex::Random(engine);
176 if(-beta*u[dir]/gamma > x1)
183 u[dir] = 1/std::sqrt(1-beta*beta)*(u[dir]+gamma*beta);
186 return amrex::XDim3 {u[0],u[1],u[2]};
189 AMREX_GPU_HOST_DEVICE
193 using namespace amrex;
195 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
196 const Real gamma =
static_cast<amrex::Real
>(1./sqrt(1+beta*beta));
198 return XDim3 {u[0],u[1],u[2]};
216 : dir(d), beta(b), theta(t)
219 AMREX_GPU_HOST_DEVICE
222 amrex::RandomEngine
const& engine)
const noexcept
226 amrex::Real
x1, x2, gamma;
228 x1 =
static_cast<amrex::Real
>(0.);
229 gamma =
static_cast<amrex::Real
>(0.);
230 u[dir] =
static_cast<amrex::Real
>(0.);
233 while(u[dir]-gamma <= x1)
236 std::log(amrex::Random(engine)*amrex::Random(engine)*amrex::Random(engine));
237 gamma = std::sqrt(1+u[dir]*u[dir]);
238 x1 = theta*std::log(amrex::Random(engine));
242 x1 = amrex::Random(engine);
243 x2 = amrex::Random(engine);
246 u[(dir+1)%3] = 2*u[dir]*std::sqrt(x1*(1-x1))*std::sin(2*MathConst::pi*x2);
247 u[(dir+2)%3] = 2*u[dir]*std::sqrt(x1*(1-x1))*std::cos(2*MathConst::pi*x2);
249 u[dir] = u[dir]*(2*x1-1);
250 x1 = amrex::Random(engine);
263 if(-beta*u[dir]/gamma>x1)
270 u[dir] = 1/std::sqrt(1-beta*beta)*(u[dir]+gamma*beta);
273 return amrex::XDim3 {u[0],u[1],u[2]};
276 AMREX_GPU_HOST_DEVICE
280 using namespace amrex;
282 for (
int idim = 0; idim < 3; ++idim) u[idim] = 0.0_rt;
283 const Real gamma =
static_cast<Real
>(1./sqrt(1.+beta*beta));
285 return XDim3 {u[0],u[1],u[2]};
303 : u_over_r(a_u_over_r)
306 AMREX_GPU_HOST_DEVICE
309 amrex::RandomEngine
const&)
const noexcept
311 return {
x*u_over_r, y*u_over_r,
z*u_over_r};
314 AMREX_GPU_HOST_DEVICE
318 return {
x*u_over_r, y*u_over_r,
z*u_over_r};
329 amrex::ParserExecutor<3>
const& a_uy_parser,
330 amrex::ParserExecutor<3>
const& a_uz_parser) noexcept
331 : m_ux_parser(a_ux_parser), m_uy_parser(a_uy_parser),
332 m_uz_parser(a_uz_parser) {}
334 AMREX_GPU_HOST_DEVICE
337 amrex::RandomEngine
const&)
const noexcept
339 return amrex::XDim3{m_ux_parser(
x,y,
z),m_uy_parser(
x,y,
z),m_uz_parser(
x,y,
z)};
342 AMREX_GPU_HOST_DEVICE
346 return amrex::XDim3{m_ux_parser(
x,y,
z),m_uy_parser(
x,y,
z),m_uz_parser(
x,y,
z)};
366 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
368 object(t, a_ux, a_uy, a_uz)
373 amrex::ParserExecutor<3>
const& a_ux_parser,
374 amrex::ParserExecutor<3>
const& a_uy_parser,
375 amrex::ParserExecutor<3>
const& a_uz_parser)
377 object(t, a_ux_parser, a_uy_parser, a_uz_parser)
382 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
383 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th)
385 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
390 amrex::Real a_ux_m, amrex::Real a_uy_m, amrex::Real a_uz_m,
391 amrex::Real a_ux_th, amrex::Real a_uy_th, amrex::Real a_uz_th,
392 int a_flux_normal_axis,
int a_flux_direction)
394 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)
398 amrex::Real theta, amrex::Real beta,
int dir)
400 object(t, theta, beta, dir)
405 amrex::Real theta, amrex::Real beta,
int dir)
407 object(t, theta, beta, dir)
412 std::string
const& a_species_name)
414 object(t, a_species_name)
419 amrex::Real u_over_r)
435 AMREX_GPU_HOST_DEVICE
438 amrex::RandomEngine
const& engine)
const noexcept
444 return object.parser.getMomentum(
x,y,
z,engine);
448 return object.gaussian.getMomentum(
x,y,
z,engine);
450 case Type::gaussianflux:
452 return object.gaussianflux.getMomentum(
x,y,
z,engine);
454 case Type::boltzmann:
456 return object.boltzmann.getMomentum(
x,y,
z,engine);
460 return object.juttner.getMomentum(
x,y,
z,engine);
464 return object.constant.getMomentum(
x,y,
z,engine);
466 case Type::radial_expansion:
468 return object.radial_expansion.getMomentum(
x,y,
z,engine);
472 return object.custom.getMomentum(
x,y,
z,engine);
476 amrex::Abort(
"InjectorMomentum: unknown type");
477 return {0.0,0.0,0.0};
484 AMREX_GPU_HOST_DEVICE
492 return object.parser.getBulkMomentum(
x,y,
z);
496 return object.gaussian.getBulkMomentum(
x,y,
z);
498 case Type::gaussianflux:
500 return object.gaussianflux.getBulkMomentum(
x,y,
z);
502 case Type::boltzmann:
504 return object.boltzmann.getBulkMomentum(
x,y,
z);
508 return object.juttner.getBulkMomentum(
x,y,
z);
512 return object.constant.getBulkMomentum(
x,y,
z);
514 case Type::radial_expansion:
516 return object.radial_expansion.getBulkMomentum(
x,y,
z);
520 return object.custom.getBulkMomentum(
x,y,
z);
524 amrex::Abort(
"InjectorMomentum: unknown type");
525 return {0.0,0.0,0.0};
531 enum struct Type { constant, custom, gaussian, gaussianflux, boltzmann, juttner, radial_expansion,
parser};
539 amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
540 : constant(a_ux,a_uy,a_uz) {}
542 std::string
const& a_species_name) noexcept
543 : custom(a_species_name) {}
545 amrex::Real a_ux_m, amrex::Real a_uy_m,
546 amrex::Real a_uz_m, amrex::Real a_ux_th,
547 amrex::Real a_uy_th, amrex::Real a_uz_th) noexcept
548 : gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
550 amrex::Real a_ux_m, amrex::Real a_uy_m,
551 amrex::Real a_uz_m, amrex::Real a_ux_th,
552 amrex::Real a_uy_th, amrex::Real a_uz_th,
553 int a_flux_normal_axis,
int a_flux_direction) noexcept
554 : 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) {}
556 amrex::Real t, amrex::Real b,
int dir) noexcept
557 : boltzmann(t,b,dir) {}
559 amrex::Real t, amrex::Real b,
int dir) noexcept
560 : juttner(t,b,dir) {}
562 amrex::Real u_over_r) noexcept
563 : radial_expansion(u_over_r) {}
565 amrex::ParserExecutor<3>
const& a_ux_parser,
566 amrex::ParserExecutor<3>
const& a_uy_parser,
567 amrex::ParserExecutor<3>
const& a_uz_parser) noexcept
568 :
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:316
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:549
int m_flux_normal_axis
Definition: InjectorMomentum.H:130
InjectorMomentumConstant(amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:30
parser
Definition: run_alltests.py:107
InjectorMomentumCustom custom
Definition: InjectorMomentum.H:570
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:564
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition: InjectorMomentum.H:365
def x
Definition: read_lab_particles.py:25
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:486
Definition: InjectorMomentum.H:90
InjectorMomentumGaussian gaussian
Definition: InjectorMomentum.H:571
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:104
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:372
InjectorMomentum(InjectorMomentumRadialExpansion *t, amrex::Real u_over_r)
Definition: InjectorMomentum.H:418
Type
Definition: InjectorMomentum.H:531
Definition: InjectorMomentum.H:326
def uz
Definition: read_lab_particles.py:29
void clear()
Definition: InjectorMomentum.cpp:12
InjectorMomentumRadialExpansion radial_expansion
Definition: InjectorMomentum.H:575
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:336
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:56
InjectorMomentumParser parser
Definition: InjectorMomentum.H:576
struct whose getMomentum returns momentum for 1 particle, for radial expansion.
Definition: InjectorMomentum.H:300
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:65
Definition: InjectorMomentum.H:209
def z
Definition: read_lab_particles.py:26
InjectorMomentumConstant constant
Definition: InjectorMomentum.H:569
Object(InjectorMomentumCustom *, std::string const &a_species_name) noexcept
Definition: InjectorMomentum.H:541
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:221
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:328
Definition: InjectorMomentum.H:54
amrex::Real vave
Definition: InjectorMomentum.H:203
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition: InjectorMomentum.H:148
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:75
amrex::Real u_over_r
Definition: InjectorMomentum.H:322
InjectorMomentumJuttner(amrex::Real t, amrex::Real b, int d) noexcept
Definition: InjectorMomentum.H:215
Object(InjectorMomentumBoltzmann *, amrex::Real t, amrex::Real b, int dir) noexcept
Definition: InjectorMomentum.H:555
amrex::Real m_uy
Definition: InjectorMomentum.H:49
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:437
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:92
Definition: InjectorMomentum.H:537
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:191
amrex::Real m_uz
Definition: InjectorMomentum.H:49
Definition: InjectorMomentum.H:136
InjectorMomentumBoltzmann boltzmann
Definition: InjectorMomentum.H:573
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:381
Object(InjectorMomentumJuttner *, amrex::Real t, amrex::Real b, int dir) noexcept
Definition: InjectorMomentum.H:558
amrex::Real m_uz_m
Definition: InjectorMomentum.H:81
amrex::Real m_uz_th
Definition: InjectorMomentum.H:129
amrex::Real m_uz_th
Definition: InjectorMomentum.H:82
amrex::ParserExecutor< 3 > m_uz_parser
Definition: InjectorMomentum.H:349
Definition: InjectorMomentum.H:583
type
Definition: run_alltests_1node.py:67
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition: InjectorMomentum.H:344
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition: InjectorMomentum.H:538
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:35
int dir
Definition: InjectorMomentum.H:289
Definition: InjectorMomentum.H:362
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:278
InjectorMomentum(InjectorMomentumJuttner *t, amrex::Real theta, amrex::Real beta, int dir)
Definition: InjectorMomentum.H:404
amrex::Real m_uz_m
Definition: InjectorMomentum.H:128
InjectorMomentumRadialExpansion(amrex::Real a_u_over_r) noexcept
Definition: InjectorMomentum.H:302
InjectorMomentumJuttner juttner
Definition: InjectorMomentum.H:574
Definition: CustomMomentumProb.H:19
Definition: InjectorMomentum.H:28
Object object
Definition: InjectorMomentum.H:578
InjectorMomentum(InjectorMomentumCustom *t, std::string const &a_species_name)
Definition: InjectorMomentum.H:411
Type type
Definition: InjectorMomentum.H:532
int m_flux_direction
Definition: InjectorMomentum.H:131
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:389
InjectorMomentumGaussianFlux gaussianflux
Definition: InjectorMomentum.H:572
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:122
def ux
Definition: read_lab_particles.py:28
list x1
Definition: plot_particle_path.py:128
InjectorMomentumBoltzmann(amrex::Real t, amrex::Real b, int d) noexcept
Definition: InjectorMomentum.H:142
Definition: BreitWheelerEngineWrapper.H:35
amrex::Real theta
Definition: InjectorMomentum.H:290
InjectorMomentum(InjectorMomentumBoltzmann *t, amrex::Real theta, amrex::Real beta, int dir)
Definition: InjectorMomentum.H:397
int dir
Definition: InjectorMomentum.H:202
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition: InjectorMomentum.H:43
Object(InjectorMomentumRadialExpansion *, amrex::Real u_over_r) noexcept
Definition: InjectorMomentum.H:561
amrex::Real m_ux
Definition: InjectorMomentum.H:49
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:544
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition: InjectorMomentum.H:308