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 [[maybe_unused]] amrex::ParticleReal& y,
114 [[maybe_unused]] amrex::ParticleReal& z,
116 amrex::ParticleReal& ux, amrex::ParticleReal& uy, amrex::ParticleReal& uz,
121 bool change_sign_ux =
false;
122 bool change_sign_uy =
false;
123 bool change_sign_uz =
false;
125#ifndef WARPX_DIM_1D_Z
126 bool rethermalize_x =
false;
127 apply_boundary(x, gridmin.
x, gridmax.
x, change_sign_ux, rethermalize_x, particle_lost,
131 if (rethermalize_x) {
136 bool rethermalize_y =
false;
137 apply_boundary(y, gridmin.
y, gridmax.
y, change_sign_uy, rethermalize_y, particle_lost,
141 if (rethermalize_y) {
145#if defined(WARPX_ZINDEX)
146 bool rethermalize_z =
false;
147 apply_boundary(z, gridmin.
z, gridmax.
z, change_sign_uz, rethermalize_z, particle_lost,
151 if (rethermalize_z) {
157 change_sign_ux =
true;
158 change_sign_uy =
true;
159 change_sign_uz =
true;
162#if defined(WARPX_DIM_RZ) || defined(WARPX_DIM_RCYLINDER)
165 if (change_sign_ux && change_sign_uy) {
168 }
else if (change_sign_ux) {
171 amrex::Real ur = ux*std::cos(y) + uy*std::sin(y);
172 const amrex::Real ut = -ux*std::sin(y) + uy*std::cos(y);
174 ux = ur*std::cos(y) - ut*std::sin(y);
175 uy = ur*std::sin(y) + ut*std::cos(y);
177 if (change_sign_uz) { uz = -uz; }
178#elif defined(WARPX_DIM_RSPHERE)
181 const amrex::Real costheta = std::cos(y);
182 const amrex::Real sintheta = std::sin(y);
183 const amrex::Real cosphi = std::cos(z);
184 const amrex::Real sinphi = std::sin(z);
185 amrex::Real ur = +ux*costheta*sinphi + uy*sintheta*sinphi + uz*cosphi;
186 amrex::Real ut = -ux*sintheta + uy*costheta;
187 amrex::Real up = -ux*costheta*cosphi - uy*sintheta*cosphi + uz*sinphi;
188 if (change_sign_ux) { ur = -ur; }
189 if (change_sign_uy) { ut = -ut; }
190 if (change_sign_uz) { up = -up; }
191 ux = sinphi*costheta*ur - sintheta*ut - cosphi*costheta*up;
192 uy = sinphi*sintheta*ur + costheta*ut - cosphi*sintheta*up;
193 uz = cosphi*ur + sinphi*up;
195 if (change_sign_ux) { ux = -ux; }
196 if (change_sign_uy) { uy = -uy; }
197 if (change_sign_uz) { uz = -uz; }
#define AMREX_FORCE_INLINE
#define AMREX_GPU_HOST_DEVICE
ParticleBoundaryType
Definition WarpXAlgorithmSelection.H:146
@ Absorbing
Definition WarpXAlgorithmSelection.H:146
@ Reflecting
Definition WarpXAlgorithmSelection.H:148
@ Open
Definition WarpXAlgorithmSelection.H:147
@ Thermal
Definition WarpXAlgorithmSelection.H:150
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::ParticleReal &y, amrex::ParticleReal &z, amrex::XDim3 gridmin, amrex::XDim3 gridmax, 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)
Definition ParticleBoundaries.H:74
bool reflect_all_velocities
Definition ParticleBoundaries.H:91
amrex::ParserExecutor< 1 > reflection_model_ylo
Definition ParticleBoundaries.H:86
ParticleBoundaryType ymax_bc
Definition ParticleBoundaries.H:79
amrex::Real m_uth
Definition ParticleBoundaries.H:82
ParticleBoundaryType xmin_bc
Definition ParticleBoundaries.H:76
amrex::ParserExecutor< 1 > reflection_model_zhi
Definition ParticleBoundaries.H:89
ParticleBoundaryType xmax_bc
Definition ParticleBoundaries.H:77
amrex::ParserExecutor< 1 > reflection_model_xhi
Definition ParticleBoundaries.H:85
ParticleBoundaryType zmax_bc
Definition ParticleBoundaries.H:81
amrex::ParserExecutor< 1 > reflection_model_zlo
Definition ParticleBoundaries.H:88
ParticleBoundaryType ymin_bc
Definition ParticleBoundaries.H:78
amrex::ParserExecutor< 1 > reflection_model_xlo
Definition ParticleBoundaries.H:84
ParticleBoundaryType zmin_bc
Definition ParticleBoundaries.H:80
amrex::ParserExecutor< 1 > reflection_model_yhi
Definition ParticleBoundaries.H:87