8#ifndef WARPX_INJECTOR_MOMENTUM_H_
9#define WARPX_INJECTOR_MOMENTUM_H_
20#include <AMReX_Config.H>
103 int a_flux_normal_axis,
int a_flux_direction) noexcept
131 amrex::Real u = generateGaussianFluxDist(u_m, u_th, engine);
222 if (u_std.
x < 0.0_rt || u_std.
y < 0.0_rt || u_std.
z < 0.0_rt) {
223 amrex::Abort(
"The standard deviation of normalized momentum must be non-negative.");
269 amrex::Abort(
"Temperature parameter theta is less than zero, "
270 "which is not allowed for Maxwell-Juttner distribution.");
277 amrex::Real const umean_mag = std::sqrt(u_mean.
x*u_mean.
x + u_mean.
y*u_mean.
y + u_mean.
z*u_mean.
z);
278 amrex::Real const gamma_bulk = std::sqrt(1._rt + umean_mag*umean_mag);
282 if (umean_mag > 0._rt) {
283 nx = u_mean.
x/umean_mag;
284 ny = u_mean.
y/umean_mag;
285 nz = u_mean.
z/umean_mag;
303 if (theta < 0.1_rt) {
308 gamma = std::sqrt(1._rt + u[0]*u[0] + u[1]*u[1] + u[2]*u[2]);
317 while(umag-gamma <= x1)
321 gamma = std::sqrt(1._rt+umag*umag);
329 u[0] = 2._rt*umag*std::sqrt(x1*(1._rt-x1))*sin_x2;
330 u[1] = 2._rt*umag*std::sqrt(x1*(1._rt-x1))*cos_x2;
331 u[2] = umag*(2._rt*x1-1._rt);
333 if (umean_mag == 0._rt) {
355 if(-beta*u_par/gamma>x1)
363 u_par = gamma_bulk*(u_par + gamma*beta);
364 return amrex::XDim3 {ux_perp + u_par*nx, uy_perp + u_par*ny, uz_perp + u_par*nz};
422 object(t, a_ux, a_uy, a_uz)
437 object(t,a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th)
444 int a_flux_normal_axis,
int a_flux_direction)
446 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)
454 object(t,a_ux_min,a_uy_min,a_uz_min,a_ux_max,a_uy_max,a_uz_max)
460 object(t, temperature, velocity)
467 object(t, temperature, velocity)
494 return object.parser.getMomentum(x,y,z,engine);
498 return object.gaussian.getMomentum(x,y,z,engine);
502 return object.gaussianflux.getMomentum(x,y,z,engine);
506 return object.uniform.getMomentum(x,y,z,engine);
510 return object.maxwellian.getMomentum(x,y,z,engine);
514 return object.juttner.getMomentum(x,y,z,engine);
518 return object.constant.getMomentum(x,y,z,engine);
523 return {0.0,0.0,0.0};
539 return object.parser.getBulkMomentum(x,y,z);
543 return object.gaussian.getBulkMomentum(x,y,z);
547 return object.gaussianflux.getBulkMomentum(x,y,z);
551 return object.uniform.getBulkMomentum(x,y,z);
555 return object.maxwellian.getBulkMomentum(x,y,z);
559 return object.juttner.getBulkMomentum(x,y,z);
563 return object.constant.getBulkMomentum(x,y,z);
568 return {0.0,0.0,0.0};
588 :
gaussian(a_ux_m,a_uy_m,a_uz_m,a_ux_th,a_uy_th,a_uz_th) {}
593 int a_flux_normal_axis,
int a_flux_direction) noexcept
594 :
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) {}
599 :
uniform(a_ux_min,a_uy_min,a_uz_min,a_ux_max,a_uy_max,a_uz_max) {}
#define AMREX_GPU_HOST_DEVICE
Real RandomNormal(Real mean, Real stddev)
constexpr auto pi
ratio of a circle's circumference to its diameter
Definition constant.H:29
__host__ __device__ std::pair< double, double > sincos(double x)
void Abort(const std::string &msg)
Get temperature at a point on the grid.
Definition GetTemperature.H:23
Definition GetTemperature.H:73
Definition GetVelocity.H:21
Definition InjectorMomentum.H:34
amrex::Real m_uy
Definition InjectorMomentum.H:56
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition InjectorMomentum.H:50
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &) const noexcept
Definition InjectorMomentum.H:41
amrex::Real m_ux
Definition InjectorMomentum.H:56
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:56
Definition InjectorMomentum.H:622
void operator()(InjectorMomentum *p) const
Definition InjectorMomentum.H:623
Definition InjectorMomentum.H:99
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition InjectorMomentum.H:146
amrex::Real m_uy_m
Definition InjectorMomentum.H:152
int m_flux_normal_axis
Definition InjectorMomentum.H:154
amrex::Real m_ux_m
Definition InjectorMomentum.H:152
amrex::Real m_uz_th
Definition InjectorMomentum.H:153
amrex::Real m_ux_th
Definition InjectorMomentum.H:153
amrex::Real m_uy_th
Definition InjectorMomentum.H:153
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:100
amrex::Real m_uz_m
Definition InjectorMomentum.H:152
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition InjectorMomentum.H:114
int m_flux_direction
Definition InjectorMomentum.H:155
Definition InjectorMomentum.H:62
amrex::Real m_uz_m
Definition InjectorMomentum.H:90
amrex::Real m_ux_m
Definition InjectorMomentum.H:90
amrex::Real m_ux_th
Definition InjectorMomentum.H:91
amrex::Real m_uy_th
Definition InjectorMomentum.H:91
amrex::Real m_uy_m
Definition InjectorMomentum.H:90
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:63
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real, amrex::Real, amrex::Real, amrex::RandomEngine const &engine) const noexcept
Definition InjectorMomentum.H:73
amrex::Real m_uz_th
Definition InjectorMomentum.H:91
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real, amrex::Real, amrex::Real) const noexcept
Definition InjectorMomentum.H:84
Definition InjectorMomentum.H:417
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:487
Type type
Definition InjectorMomentum.H:574
InjectorMomentum(InjectorMomentum &&)=delete
~InjectorMomentum()=default
void operator=(InjectorMomentum const &)=delete
void clear()
Definition InjectorMomentum.cpp:12
InjectorMomentum(InjectorMomentumConstant *t, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz)
Definition InjectorMomentum.H:419
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:433
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:450
Type
Definition InjectorMomentum.H:573
@ maxwellian
Definition InjectorMomentum.H:573
@ gaussian
Definition InjectorMomentum.H:573
@ parser
Definition InjectorMomentum.H:573
@ gaussianflux
Definition InjectorMomentum.H:573
@ constant
Definition InjectorMomentum.H:573
@ juttner
Definition InjectorMomentum.H:573
@ uniform
Definition InjectorMomentum.H:573
Object object
Definition InjectorMomentum.H:617
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorMomentum.H:533
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:441
InjectorMomentum(InjectorMomentumMaxwellian *t, GetTemperatureVector const &temperature, GetVelocityVector const &velocity)
Definition InjectorMomentum.H:457
InjectorMomentum(InjectorMomentumJuttner *t, GetTemperature const &temperature, GetVelocityVector const &velocity)
Definition InjectorMomentum.H:464
InjectorMomentum(InjectorMomentumParser *t, GetVelocityVector const &a_velocity)
Definition InjectorMomentum.H:426
Definition InjectorMomentum.H:250
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition InjectorMomentum.H:370
GetTemperature temperature
Definition InjectorMomentum.H:377
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:261
GetVelocityVector velocity
Definition InjectorMomentum.H:376
InjectorMomentumJuttner(GetTemperature const &t, GetVelocityVector const &b) noexcept
Definition InjectorMomentum.H:254
Definition InjectorMomentum.H:205
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:216
GetTemperatureVector temperature
Definition InjectorMomentum.H:243
GetVelocityVector velocity
Definition InjectorMomentum.H:242
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real const x, amrex::Real const y, amrex::Real const z) const noexcept
Definition InjectorMomentum.H:234
InjectorMomentumMaxwellian(GetTemperatureVector const &t, GetVelocityVector const &b) noexcept
Definition InjectorMomentum.H:209
Definition InjectorMomentum.H:382
AMREX_GPU_HOST_DEVICE amrex::XDim3 getMomentum(amrex::Real x, amrex::Real y, amrex::Real z, amrex::RandomEngine const &) const noexcept
Definition InjectorMomentum.H:389
InjectorMomentumParser(GetVelocityVector const &a_velocity) noexcept
Definition InjectorMomentum.H:383
GetVelocityVector m_velocity
Definition InjectorMomentum.H:403
AMREX_GPU_HOST_DEVICE amrex::XDim3 getBulkMomentum(amrex::Real x, amrex::Real y, amrex::Real z) const noexcept
Definition InjectorMomentum.H:398
Definition InjectorMomentum.H:580
InjectorMomentumGaussian gaussian
Definition InjectorMomentum.H:610
InjectorMomentumUniform uniform
Definition InjectorMomentum.H:612
Object(InjectorMomentumJuttner *, GetTemperature const &t, GetVelocityVector const &b) noexcept
Definition InjectorMomentum.H:603
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:589
Object(InjectorMomentumMaxwellian *, GetTemperatureVector const &t, GetVelocityVector const &b) noexcept
Definition InjectorMomentum.H:600
InjectorMomentumJuttner juttner
Definition InjectorMomentum.H:614
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:595
InjectorMomentumGaussianFlux gaussianflux
Definition InjectorMomentum.H:611
InjectorMomentumMaxwellian maxwellian
Definition InjectorMomentum.H:613
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:584
InjectorMomentumParser parser
Definition InjectorMomentum.H:615
InjectorMomentumConstant constant
Definition InjectorMomentum.H:609
Object(InjectorMomentumParser *, GetVelocityVector const &a_velocity) noexcept
Definition InjectorMomentum.H:606
Object(InjectorMomentumConstant *, amrex::Real a_ux, amrex::Real a_uy, amrex::Real a_uz) noexcept
Definition InjectorMomentum.H:581