7 #ifndef WARPX_PARTICLEBOUNDARIES_K_H_
8 #define WARPX_PARTICLEBOUNDARIES_K_H_
16 using namespace amrex::literals;
23 bool& change_sign_ux,
bool& rethermalize_x,
bool& particle_lost,
25 amrex::Real refl_probability_xmin, amrex::Real refl_probability_xmax,
33 if (refl_probability_xmin == 0 ||
amrex::Random(engine) > refl_probability_xmin) {
39 change_sign_ux =
true;
44 change_sign_ux =
true;
48 rethermalize_x =
true;
56 if (refl_probability_xmax == 0 ||
amrex::Random(engine) > refl_probability_xmax) {
62 change_sign_ux =
true;
67 change_sign_ux =
true;
71 rethermalize_x =
true;
83 amrex::ParticleReal& u_tang2, amrex::Real uth,
88 u_norm = (uth > 0._rt) ? std::copysign(1._prt, -u_norm) *
PhysConst::c * generateGaussianFluxDist(0._rt, uth, engine) : 0._rt;
113 #ifndef WARPX_DIM_1D_Z
114 amrex::ParticleReal& x, amrex::Real
xmin, amrex::Real
xmax,
116 #
if (defined WARPX_DIM_3D) || (defined WARPX_DIM_RZ)
117 amrex::ParticleReal& y,
119 #
if (defined WARPX_DIM_3D)
120 amrex::Real ymin, amrex::Real ymax,
122 amrex::ParticleReal& z, amrex::Real zmin, amrex::Real zmax,
123 amrex::ParticleReal& ux, amrex::ParticleReal& uy, amrex::ParticleReal& uz,
128 bool change_sign_ux =
false;
129 bool change_sign_uy =
false;
130 bool change_sign_uz =
false;
132 #ifndef WARPX_DIM_1D_Z
133 bool rethermalize_x =
false;
138 if (rethermalize_x) {
143 bool rethermalize_y =
false;
144 apply_boundary(y, ymin, ymax, change_sign_uy, rethermalize_y, particle_lost,
148 if (rethermalize_y) {
152 bool rethermalize_z =
false;
153 apply_boundary(z, zmin, zmax, change_sign_uz, rethermalize_z, particle_lost,
157 if (rethermalize_z) {
162 change_sign_ux =
true;
163 change_sign_uy =
true;
164 change_sign_uz =
true;
169 if (change_sign_ux && change_sign_uy) {
172 }
else if (change_sign_ux) {
175 amrex::Real ur = ux*std::cos(y) + uy*std::sin(y);
176 const amrex::Real ut = -ux*std::sin(y) + uy*std::cos(y);
178 ux = ur*std::cos(y) - ut*std::sin(y);
179 uy = ur*std::sin(y) + ut*std::cos(y);
182 if (change_sign_ux) { ux = -ux; }
183 if (change_sign_uy) { uy = -uy; }
185 if (change_sign_uz) { uz = -uz; }
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
ParticleBoundaryType
Definition: WarpXAlgorithmSelection.H:173
@ Absorbing
particles crossing domain boundary are removed
@ Reflecting
particles are reflected
@ Open
particles cross domain boundary leave with damped j
Definition: ParticleBoundaries_K.H:15
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void thermalize_boundary_particle(amrex::ParticleReal &u_norm, amrex::ParticleReal &u_tang1, amrex::ParticleReal &u_tang2, amrex::Real uth, amrex::RandomEngine const &engine)
Definition: ParticleBoundaries_K.H:82
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void apply_boundary(amrex::ParticleReal &x, amrex::Real xmin, amrex::Real xmax, bool &change_sign_ux, bool &rethermalize_x, bool &particle_lost, ParticleBoundaryType xmin_bc, ParticleBoundaryType xmax_bc, amrex::Real refl_probability_xmin, amrex::Real refl_probability_xmax, amrex::RandomEngine const &engine)
Definition: ParticleBoundaries_K.H:22
AMREX_GPU_HOST_DEVICE AMREX_FORCE_INLINE void apply_boundaries(amrex::ParticleReal &x, amrex::Real xmin, amrex::Real xmax, amrex::ParticleReal &y, amrex::ParticleReal &z, amrex::Real zmin, amrex::Real zmax, amrex::ParticleReal &ux, amrex::ParticleReal &uy, amrex::ParticleReal &uz, bool &particle_lost, ParticleBoundaries::ParticleBoundariesData const &boundaries, amrex::RandomEngine const &engine)
Definition: ParticleBoundaries_K.H:112
static constexpr auto c
vacuum speed of light [m/s]
Definition: constant.H:44
Real RandomNormal(Real mean, Real stddev)
xmin
Definition: stencil.py:424
xmax
Definition: stencil.py:425
Definition: ParticleBoundaries.H:51
bool reflect_all_velocities
Definition: ParticleBoundaries.H:68
amrex::ParserExecutor< 1 > reflection_model_ylo
Definition: ParticleBoundaries.H:63
ParticleBoundaryType ymax_bc
Definition: ParticleBoundaries.H:56
amrex::Real m_uth
Definition: ParticleBoundaries.H:59
ParticleBoundaryType xmin_bc
Definition: ParticleBoundaries.H:53
amrex::ParserExecutor< 1 > reflection_model_zhi
Definition: ParticleBoundaries.H:66
ParticleBoundaryType xmax_bc
Definition: ParticleBoundaries.H:54
amrex::ParserExecutor< 1 > reflection_model_xhi
Definition: ParticleBoundaries.H:62
ParticleBoundaryType zmax_bc
Definition: ParticleBoundaries.H:58
amrex::ParserExecutor< 1 > reflection_model_zlo
Definition: ParticleBoundaries.H:65
ParticleBoundaryType ymin_bc
Definition: ParticleBoundaries.H:55
amrex::ParserExecutor< 1 > reflection_model_xlo
Definition: ParticleBoundaries.H:61
ParticleBoundaryType zmin_bc
Definition: ParticleBoundaries.H:57
amrex::ParserExecutor< 1 > reflection_model_yhi
Definition: ParticleBoundaries.H:64