16 template<
typename GasModelT>
18 const GasModelT &gas,
const mfem::real_t *interior,
19 mfem::real_t *exterior)
21 const int equations = gas.L.nequations();
22 for (
int equation = 0; equation < equations; ++equation)
24 exterior[equation] = interior[equation];
26 const int radial_momentum =
28 exterior[radial_momentum] = -interior[radial_momentum];
32 template <
typename DeviceCacheT>
33 MFEM_HOST_DEVICE
inline
36 const mfem::real_t *state1,
39 const auto &gas = dc.gas;
40 const int neq = dc.num_equations;
41 const int dim = dc.dim;
43 for (
int q = 0; q < neq; ++q)
45 fluxN[q] = mfem::real_t(0);
52 const mfem::real_t *vector_data = dc.bc_vector_d;
53 const mfem::real_t *Vwall = vector_data + bc.
data_index;
61 const mfem::real_t v = -gas.
energy(S);
64 F.set_mass(gas.L, gas.mass(S));
65 for(
int idim = 0;idim < dim;idim++){
66 F.set_momentum(gas.L, idim, Vwall[idim] * v);
68 F.set_energy(gas.L, -v);
69 for (
int q = 0; q < neq; ++q)
71 fluxN[q] -= state1[q];
78 const mfem::real_t *bc_data = dc.bc_vector_d + bc.
data_index;
79 const mfem::real_t *Vwall = bc_data;
80 const mfem::real_t Twall = bc_data[dim];
106 F.set_mass(gas.L, gas.mass(S));
107 for (
int idim = 0; idim < dim; ++idim)
109 F.set_momentum(gas.L, idim, Vwall[idim] * beta_like);
111 F.set_energy(gas.L, -beta_like);
113 for (
int q = 0; q < neq; ++q)
115 fluxN[q] -= state1[q];
125 for (
int equation = 0; equation < neq; ++equation)
127 fluxN[equation] = exterior[equation] - state1[equation];
135 for (
int q = 0; q < neq; ++q)
137 fluxN[q] = mfem::real_t(0);
145 template<
typename GasModelT>
148 const mfem::real_t *nor, mfem::real_t *fluxN)
153 const int dim = gasModel.L.dim;
154 const int neq = gasModel.L.nequations();
155 for(
int idim = 0;idim < dim;idim++)
156 unit_nor[idim] = nor[idim];
157 for(
int ieq = 0;ieq < neq;ieq++){
158 state2[ieq] = state1[ieq];
165 const int mom_eq = gasModel.L.eq_mom0;
166 for(
int idim = 0;idim < dim;idim++)
167 fluxN[mom_eq+idim] = p_star * nor[idim];
170 template<
typename GasModelT>
173 const mfem::real_t *gradPrim_x,
const mfem::real_t *gradPrim_y,
174 const mfem::real_t *gradPrim_z,
176 const mfem::real_t qWall,
bool axisymmetric,
177 mfem::real_t radius, mfem::real_t *fluxN)
182 const int dim = gasModel.L.dim;
183 const int neq = gasModel.L.nequations();
184 mfem::real_t normag = 0.0;
185 for(
int idim = 0;idim < dim;idim++){
186 unit_nor[idim] = nor[idim];
187 normag += nor[idim]*nor[idim];
191 for(
int ieq = 0;ieq < neq;ieq++){
192 state2[ieq] = state1[ieq];
200 const int mom_eq = gasModel.L.eq_mom0;
201 for(
int idim = 0;idim < dim;idim++)
202 fluxN[mom_eq+idim] = p_star * nor[idim];
205 mfem::real_t qn = qWall * normag;
206 NavierStokesFlux::ComputeViscousFluxKernel(gasModel, state1, gradPrim_x, gradPrim_y,
207 gradPrim_z, visc_flux, axisymmetric, radius);
209 for(
int j = 0;j < neq;j++){
211 for(
int idim = 0;idim < dim;idim++){
212 vflux_n[j] += nor[idim]*visc_flux[j][idim];
215 const int ener_eq = gasModel.L.eq_energy;
216 vflux_n[ener_eq] = qn;
217 for(
int idim = 0;idim < dim;idim++){
218 vflux_n[ener_eq] += vWall[idim]*vflux_n[mom_eq+idim];
220 for(
int j = 0; j < neq;j++){
221 fluxN[j] -= vflux_n[j];
225 template<
typename GasModelT>
228 const mfem::real_t *state1,
229 const mfem::real_t *gradPrim_x,
230 const mfem::real_t *gradPrim_y,
231 const mfem::real_t *gradPrim_z,
232 const mfem::real_t *nor,
234 const mfem::real_t tWall,
235 bool axisymmetric, mfem::real_t radius,
242 const int dim = gasModel.L.dim;
243 const int neq = gasModel.L.nequations();
244 const int mom_eq = gasModel.L.eq_mom0;
245 const int ener_eq = gasModel.L.eq_energy;
247 for (
int idim = 0; idim < dim; ++idim)
249 unit_nor[idim] = nor[idim];
252 for (
int ieq = 0; ieq < neq; ++ieq)
254 state2[ieq] = state1[ieq];
264 for (
int idim = 0; idim < dim; ++idim)
266 fluxN[mom_eq + idim] = p_star * nor[idim];
270 Theseus::NavierStokesFlux::ComputeViscousFluxKernel(gasModel, state1, gradPrim_x,
271 gradPrim_y, gradPrim_z, visc_flux,
272 axisymmetric, radius);
275 for (
int eq = 0; eq < neq; ++eq)
278 for (
int idim = 0; idim < dim; ++idim)
280 vflux_n[eq] += nor[idim] * visc_flux[eq][idim];
287 mfem::real_t conductive_n = vflux_n[ener_eq];
288 for (
int idim = 0; idim < dim; ++idim)
290 const mfem::real_t u_trace = gasModel.
velocity(S, idim);
291 conductive_n -= u_trace * vflux_n[mom_eq + idim];
295 vflux_n[ener_eq] = conductive_n;
296 for (
int idim = 0; idim < dim; ++idim)
298 vflux_n[ener_eq] += vWall[idim] * vflux_n[mom_eq + idim];
304 for (
int eq = 0; eq < neq; ++eq)
306 fluxN[eq] -= vflux_n[eq];
312 template <
typename DeviceCacheT>
316 const mfem::real_t *state1,
317 const mfem::real_t *nor,
320 const auto &gas = dc.gas;
321 const mfem::real_t *scalar_data = dc.bc_scalar_d;
322 const mfem::real_t *vector_data = dc.bc_vector_d;
330 dc.iflux.ComputeFaceFlux(gas, state1, state1, nor, fluxN);
335 const mfem::real_t *bc_state = vector_data + bc.
data_index;
336 dc.iflux.ComputeFaceFlux(gas, state1, bc_state, nor, fluxN);
342 const int neq = dc.num_equations;
345 for(
int ieq = 0;ieq < neq;ieq++){
346 bc_state[ieq] = state1[ieq];
349 const int dim = dc.dim;
352 for(
int idim = 0;idim < dim;idim++){
353 unorm[idim] = nor[idim];
354 mom[idim] = S.
momentum(gas.L, idim);
358 for(
int idim = 0;idim < dim;idim++){
359 mfem::real_t mm = -2.0*nv*unorm[idim] + mom[idim];
360 S2.set_momentum(gas.L, idim, mm);
362 dc.iflux.ComputeFaceFlux(gas, state1, bc_state, nor, fluxN);
369 dc.iflux.ComputeFaceFlux(gas, state1, bc_state, nor, fluxN);
374 const int neq = dc.num_equations;
375 for (
int eq = 0; eq < neq; ++eq) { fluxN[eq] = 0.0; }
381 template <
typename DeviceCacheT>
385 const mfem::real_t *state1,
386 const mfem::real_t *gradPrim_x,
387 const mfem::real_t *gradPrim_y,
388 const mfem::real_t *gradPrim_z,
389 const mfem::real_t *nor,
393 const auto &gas = dc.gas;
394 const int dim = dc.dim;
395 const mfem::real_t *scalar_data = dc.bc_scalar_d;
396 const mfem::real_t *vector_data = dc.bc_vector_d;
408 const mfem::real_t *bc_vec_data = vector_data + bc.
data_index;
410 for(
int idim=0;idim < dim;idim++){
411 vWall[idim] = bc_vec_data[idim];
413 const mfem::real_t qWall = bc_vec_data[dim];
415 gradPrim_z, nor, vWall, qWall,
416 dc.axisymmetric, radius, fluxN);
421 const mfem::real_t *bc_vec_data = vector_data + bc.
data_index;
423 for(
int idim=0;idim < dim;idim++){
424 vWall[idim] = bc_vec_data[idim];
426 const mfem::real_t tWall = bc_vec_data[dim];
428 gradPrim_z, nor, vWall, tWall,
429 dc.axisymmetric, radius, fluxN);
436 NavierStokesFlux::ComputeViscousFluxKernel(
437 gas, state1, gradPrim_x, gradPrim_y, gradPrim_z,
438 viscous_flux, dc.axisymmetric, radius);
439 for (
int equation = 0; equation < dc.num_equations; ++equation)
441 for (
int direction = 0; direction < dim; ++direction)
444 nor[direction] * viscous_flux[equation][direction];
451 const int neq = dc.num_equations;
452 for (
int eq = 0; eq < neq; ++eq) { fluxN[eq] = 0.0; }
MFEM_HOST_DEVICE void ComputeBdrFaceGradFlux(const DeviceCacheT &dc, const Theseus::BCDescriptor &bc, const mfem::real_t *state1, mfem::real_t *fluxN)
Definition bc_kernels.hpp:34
MFEM_HOST_DEVICE void NoSlipIsothWallFluxKernel(const GasModelT &gasModel, const mfem::real_t *state1, const mfem::real_t *gradPrim_x, const mfem::real_t *gradPrim_y, const mfem::real_t *gradPrim_z, const mfem::real_t *nor, const mfem::real_t vWall[Theseus::MAXDIM], const mfem::real_t tWall, bool axisymmetric, mfem::real_t radius, mfem::real_t *fluxN)
Definition bc_kernels.hpp:227
MFEM_HOST_DEVICE void ApplyViscousBoundaryCondition(const DeviceCacheT &dc, const Theseus::BCDescriptor &bc, const mfem::real_t *state1, const mfem::real_t *gradPrim_x, const mfem::real_t *gradPrim_y, const mfem::real_t *gradPrim_z, const mfem::real_t *nor, mfem::real_t radius, mfem::real_t *fluxN)
Definition bc_kernels.hpp:383
MFEM_HOST_DEVICE void SlipWallInviscidFluxKernel(const GasModelT &gasModel, const mfem::real_t *state1, const mfem::real_t *nor, mfem::real_t *fluxN)
Definition bc_kernels.hpp:147
MFEM_HOST_DEVICE void NoSlipAdiabWallFluxKernel(const GasModelT &gasModel, const mfem::real_t *state1, const mfem::real_t *gradPrim_x, const mfem::real_t *gradPrim_y, const mfem::real_t *gradPrim_z, const mfem::real_t *nor, const mfem::real_t vWall[Theseus::MAXDIM], const mfem::real_t qWall, bool axisymmetric, mfem::real_t radius, mfem::real_t *fluxN)
Definition bc_kernels.hpp:172
MFEM_HOST_DEVICE void ApplyBoundaryConditionInviscid(const DeviceCacheT &dc, const Theseus::BCDescriptor &bc, const mfem::real_t *state1, const mfem::real_t *nor, mfem::real_t *fluxN)
Definition bc_kernels.hpp:314
MFEM_HOST_DEVICE void ReflectAxisState(const GasModelT &gas, const mfem::real_t *interior, mfem::real_t *exterior)
Definition bc_kernels.hpp:17
MFEM_HOST_DEVICE mfem::real_t isothermal_wall_beta(const StateView &Se, mfem::real_t Tw, const GasModelT &gasModel)
Definition Flow.hpp:84
MFEM_HOST_DEVICE mfem::real_t slipwall_pstar(const StateView &S, const GasModelT &gasModel)
Definition Flow.hpp:57
MFEM_HOST_DEVICE void RotateState(const StateLayout layout, const mfem::real_t *nor, Theseus::PointStateViewRW &S)
Definition Flow.hpp:24
MFEM_HOST_DEVICE void Normalize(const int dim, mfem::real_t *vec)
Definition theseus_kernels.hpp:24
MFEM_HOST_DEVICE mfem::real_t rsqrt(mfem::real_t x)
Definition theseus_kernels.hpp:19
MFEM_HOST_DEVICE mfem::real_t Dot(const int dim, const mfem::real_t *vec1, const mfem::real_t *vec2)
Definition theseus_kernels.hpp:82
Definition AxisymmetricGeometry.hpp:15
constexpr const int MAXDIM
Definition theseus_kernels.hpp:14
constexpr const int MAXEQ
Definition theseus_kernels.hpp:13
BCType
Definition bc_cache_utilities.hpp:12
static constexpr int radial_coordinate
Definition AxisymmetricGeometry.hpp:20
Definition bc_cache_utilities.hpp:35
int type
Definition bc_cache_utilities.hpp:36
int data_index
Definition bc_cache_utilities.hpp:38
Definition GasState.hpp:218
MFEM_HOST_DEVICE mfem::real_t energy(const StateLayout &L) const
Definition GasState.hpp:295
MFEM_HOST_DEVICE mfem::real_t momentum(const StateLayout &L, int d) const
Definition GasState.hpp:245
Definition GasState.hpp:127
MFEM_HOST_DEVICE mfem::real_t velocity(const StateLayout &L, int d) const
Definition GasState.hpp:169