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 mfem::real_t v = gasModel.velocity(S, 0);
166 const mfem::real_t c = gasModel.sound_speed(S);
167 const int mom_eq = gasModel.L.eq_mom0;
168 for(
int idim = 0;idim < dim;idim++)
169 fluxN[mom_eq+idim] = p_star * nor[idim];
170 return std::abs(v) + c;
173 template<
typename GasModelT>
176 const mfem::real_t *gradPrim_x,
const mfem::real_t *gradPrim_y,
177 const mfem::real_t *gradPrim_z,
179 const mfem::real_t qWall,
bool axisymmetric,
180 mfem::real_t radius, mfem::real_t *fluxN)
185 const int dim = gasModel.L.dim;
186 const int neq = gasModel.L.nequations();
187 mfem::real_t normag = 0.0;
188 for(
int idim = 0;idim < dim;idim++){
189 unit_nor[idim] = nor[idim];
190 normag += nor[idim]*nor[idim];
194 for(
int ieq = 0;ieq < neq;ieq++){
195 state2[ieq] = state1[ieq];
203 const mfem::real_t v = gasModel.velocity(S, 0);
204 const mfem::real_t c = gasModel.sound_speed(S);
205 const int mom_eq = gasModel.L.eq_mom0;
206 for(
int idim = 0;idim < dim;idim++)
207 fluxN[mom_eq+idim] = p_star * nor[idim];
210 mfem::real_t qn = qWall * normag;
211 NavierStokesFlux::ComputeViscousFluxKernel(gasModel, state1, gradPrim_x, gradPrim_y,
212 gradPrim_z, visc_flux, axisymmetric, radius);
214 for(
int j = 0;j < neq;j++){
216 for(
int idim = 0;idim < dim;idim++){
217 vflux_n[j] += nor[idim]*visc_flux[j][idim];
220 const int ener_eq = gasModel.L.eq_energy;
221 vflux_n[ener_eq] = qn;
222 for(
int idim = 0;idim < dim;idim++){
223 vflux_n[ener_eq] += vWall[idim]*vflux_n[mom_eq+idim];
225 for(
int j = 0; j < neq;j++){
226 fluxN[j] -= vflux_n[j];
228 return std::abs(v) + c;
231 template<
typename GasModelT>
234 const mfem::real_t *state1,
235 const mfem::real_t *gradPrim_x,
236 const mfem::real_t *gradPrim_y,
237 const mfem::real_t *gradPrim_z,
238 const mfem::real_t *nor,
240 const mfem::real_t tWall,
241 bool axisymmetric, mfem::real_t radius,
248 const int dim = gasModel.L.dim;
249 const int neq = gasModel.L.nequations();
250 const int mom_eq = gasModel.L.eq_mom0;
251 const int ener_eq = gasModel.L.eq_energy;
253 for (
int idim = 0; idim < dim; ++idim)
255 unit_nor[idim] = nor[idim];
258 for (
int ieq = 0; ieq < neq; ++ieq)
260 state2[ieq] = state1[ieq];
270 const mfem::real_t vn = gasModel.velocity(Srot, 0);
271 const mfem::real_t c = gasModel.sound_speed(Srot);
273 for (
int idim = 0; idim < dim; ++idim)
275 fluxN[mom_eq + idim] = p_star * nor[idim];
279 Theseus::NavierStokesFlux::ComputeViscousFluxKernel(gasModel, state1, gradPrim_x,
280 gradPrim_y, gradPrim_z, visc_flux,
281 axisymmetric, radius);
284 for (
int eq = 0; eq < neq; ++eq)
287 for (
int idim = 0; idim < dim; ++idim)
289 vflux_n[eq] += nor[idim] * visc_flux[eq][idim];
296 mfem::real_t conductive_n = vflux_n[ener_eq];
297 for (
int idim = 0; idim < dim; ++idim)
299 const mfem::real_t u_trace = gasModel.
velocity(S, idim);
300 conductive_n -= u_trace * vflux_n[mom_eq + idim];
304 vflux_n[ener_eq] = conductive_n;
305 for (
int idim = 0; idim < dim; ++idim)
307 vflux_n[ener_eq] += vWall[idim] * vflux_n[mom_eq + idim];
313 for (
int eq = 0; eq < neq; ++eq)
315 fluxN[eq] -= vflux_n[eq];
318 return std::abs(vn) + c;
322 template <
typename DeviceCacheT>
326 const mfem::real_t *state1,
327 const mfem::real_t *nor,
330 const auto &gas = dc.gas;
331 const mfem::real_t *scalar_data = dc.bc_scalar_d;
332 const mfem::real_t *vector_data = dc.bc_vector_d;
339 return dc.iflux.ComputeFaceFlux(gas, state1, state1, nor, fluxN);
343 const mfem::real_t *bc_state = vector_data + bc.
data_index;
344 return dc.iflux.ComputeFaceFlux(gas, state1, bc_state, nor, fluxN);
349 const int neq = dc.num_equations;
352 for(
int ieq = 0;ieq < neq;ieq++){
353 bc_state[ieq] = state1[ieq];
356 const int dim = dc.dim;
359 for(
int idim = 0;idim < dim;idim++){
360 unorm[idim] = nor[idim];
361 mom[idim] = S.
momentum(gas.L, idim);
365 for(
int idim = 0;idim < dim;idim++){
366 mfem::real_t mm = -2.0*nv*unorm[idim] + mom[idim];
367 S2.set_momentum(gas.L, idim, mm);
369 return dc.iflux.ComputeFaceFlux(gas, state1, bc_state, nor, fluxN);
375 return dc.iflux.ComputeFaceFlux(gas, state1, bc_state, nor, fluxN);
379 const int neq = dc.num_equations;
380 for (
int eq = 0; eq < neq; ++eq) { fluxN[eq] = 0.0; }
387 template <
typename DeviceCacheT>
391 const mfem::real_t *state1,
392 const mfem::real_t *gradPrim_x,
393 const mfem::real_t *gradPrim_y,
394 const mfem::real_t *gradPrim_z,
395 const mfem::real_t *nor,
399 const auto &gas = dc.gas;
400 const int dim = dc.dim;
401 const mfem::real_t *scalar_data = dc.bc_scalar_d;
402 const mfem::real_t *vector_data = dc.bc_vector_d;
410 dc, bc, state1, nor, fluxN);
414 const mfem::real_t *bc_vec_data = vector_data + bc.
data_index;
416 for(
int idim=0;idim < dim;idim++){
417 vWall[idim] = bc_vec_data[idim];
419 const mfem::real_t qWall = bc_vec_data[dim];
421 gradPrim_z, nor, vWall, qWall,
422 dc.axisymmetric, radius, fluxN);
426 const mfem::real_t *bc_vec_data = vector_data + bc.
data_index;
428 for(
int idim=0;idim < dim;idim++){
429 vWall[idim] = bc_vec_data[idim];
431 const mfem::real_t tWall = bc_vec_data[dim];
433 gradPrim_z, nor, vWall, tWall,
434 dc.axisymmetric, radius, fluxN);
439 dc, bc, state1, nor, fluxN);
441 NavierStokesFlux::ComputeViscousFluxKernel(
442 gas, state1, gradPrim_x, gradPrim_y, gradPrim_z,
443 viscous_flux, dc.axisymmetric, radius);
444 for (
int equation = 0; equation < dc.num_equations; ++equation)
446 for (
int direction = 0; direction < dim; ++direction)
449 nor[direction] * viscous_flux[equation][direction];
456 const int neq = dc.num_equations;
457 for (
int eq = 0; eq < neq; ++eq) { fluxN[eq] = 0.0; }
MFEM_HOST_DEVICE mfem::real_t 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 mfem::real_t 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:233
MFEM_HOST_DEVICE mfem::real_t 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:324
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 mfem::real_t 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:389
MFEM_HOST_DEVICE mfem::real_t 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:175
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