15 namespace LaxFriedrichsFlux
20 template<
typename GasT>
22 inline static mfem::real_t ComputeVolumeFluxKernel(
const GasT &gas,
23 const mfem::real_t* q1,
24 const mfem::real_t* q2,
25 const mfem::real_t* met1,
26 const mfem::real_t* met2,
27 mfem::real_t* F_tilde)
29 const int dim = gas.dim();
30 const int neq = gas.num_equations();
33 mfem::real_t met[3] = {0,0,0};
41 NavierStokesFlux::ComputeInviscidFluxKernel(gas, q1, inv_flux_1);
42 NavierStokesFlux::ComputeInviscidFluxKernel(gas, q2, inv_flux_2);
43 for(
int ieq=0;ieq < neq;ieq++){
44 inv_flux_bar[ieq] = 0;
45 for(
int idim = 0;idim < dim;idim++){
46 inv_flux_bar[ieq] += 0.5*(inv_flux_1[ieq][idim] + inv_flux_2[ieq][idim])*met[idim];
50 mfem::real_t vn_1 = 0;
51 mfem::real_t vn_2 = 0;
52 mfem::real_t mnorm = 0;
53 for (
int d=0; d<dim; ++d)
55 const mfem::real_t v1 = gas.velocity(S1, d);
56 const mfem::real_t v2 = gas.velocity(S2, d);
59 mnorm += met[d]*met[d];
64 const mfem::real_t c1 = gas.sound_speed(S1)*mnorm;
65 const mfem::real_t c2 = gas.sound_speed(S2)*mnorm;
66 const mfem::real_t lambda_max =
Kernels::rmax(vn_1 + c1, vn_2 + c2);
68 for(
int ieq = 0;ieq < neq;ieq++){
69 F_tilde[ieq] = inv_flux_bar[ieq];
75 template<
typename GasModelT>
76 MFEM_HOST_DEVICE
inline static mfem::real_t
77 ComputeFaceFluxKernel(
const GasModelT &gasModel,
78 const mfem::real_t *state1,
79 const mfem::real_t *state2,
80 const mfem::real_t *nor,
83 const int dim = gasModel.dim();
84 const int neq = gasModel.num_equations();
92 NavierStokesFlux::ComputeInviscidFluxKernel(gasModel, state1, inv_flux_1);
93 NavierStokesFlux::ComputeInviscidFluxKernel(gasModel, state2, inv_flux_2);
95 mfem::real_t vn1 = 0.0;
96 mfem::real_t vn2 = 0.0;
97 mfem::real_t nor_mag2 = 0.0;
99 for (
int d = 0; d < dim; ++d)
101 vn1 += gasModel.velocity(S1, d) * nor[d];
102 vn2 += gasModel.velocity(S2, d) * nor[d];
103 nor_mag2 += nor[d] * nor[d];
111 const mfem::real_t c1 = gasModel.sound_speed(S1);
112 const mfem::real_t c2 = gasModel.sound_speed(S2);
113 const mfem::real_t lambda_max =
117 for (
int ieq = 0; ieq < neq; ++ieq)
119 mfem::real_t fn1 = 0.0;
120 mfem::real_t fn2 = 0.0;
122 for (
int d = 0; d < dim; ++d)
124 fn1 += inv_flux_1[ieq][d] * nor[d];
125 fn2 += inv_flux_2[ieq][d] * nor[d];
128 const mfem::real_t central_flux = 0.5 * (fn1 + fn2);
129 const mfem::real_t jump = state2[ieq] - state1[ieq];
131 flux[ieq] = central_flux - 0.5 * lambda_max * jump;
137 template<
typename GasModelT>
139 const mfem::real_t *q1,
const mfem::real_t *q2,
140 const mfem::real_t *met1,
const mfem::real_t *met2,
141 mfem::real_t *F_tilde)
const{
142 return ComputeVolumeFluxKernel(gasModel, q1, q2, met1, met2, F_tilde);
144 template<
typename GasModelT>
145 MFEM_HOST_DEVICE
inline mfem::real_t
ComputeFaceFlux(
const GasModelT &gasModel,
const mfem::real_t *qminus,
146 const mfem::real_t *qplus,
const mfem::real_t *nor,
147 mfem::real_t *flux)
const {
148 return ComputeFaceFluxKernel(gasModel, qminus, qplus, nor, flux);
MFEM_HOST_DEVICE void ComputeMeanVec(const mfem::real_t *a, const mfem::real_t *b, mfem::real_t *out, int n)
Definition theseus_kernels.hpp:101
MFEM_HOST_DEVICE mfem::real_t ComputeVolumeFlux(const GasModelT &gasModel, const mfem::real_t *q1, const mfem::real_t *q2, const mfem::real_t *met1, const mfem::real_t *met2, mfem::real_t *F_tilde) const
Definition LaxFriedrichsFlux.hpp:138
MFEM_HOST_DEVICE mfem::real_t ComputeFaceFlux(const GasModelT &gasModel, const mfem::real_t *qminus, const mfem::real_t *qplus, const mfem::real_t *nor, mfem::real_t *flux) const
Definition LaxFriedrichsFlux.hpp:145