15 namespace LaxFriedrichsFlux
20 template<
typename GasT>
22 inline static void 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};
39 NavierStokesFlux::ComputeInviscidFluxKernel(gas, q1, inv_flux_1);
40 NavierStokesFlux::ComputeInviscidFluxKernel(gas, q2, inv_flux_2);
41 for(
int ieq=0;ieq < neq;ieq++){
42 inv_flux_bar[ieq] = 0;
43 for(
int idim = 0;idim < dim;idim++){
44 inv_flux_bar[ieq] += 0.5*(inv_flux_1[ieq][idim] + inv_flux_2[ieq][idim])*met[idim];
48 for(
int ieq = 0;ieq < neq;ieq++){
49 F_tilde[ieq] = inv_flux_bar[ieq];
54 template<
typename GasModelT>
55 MFEM_HOST_DEVICE
inline static void
56 ComputeFaceFluxKernel(
const GasModelT &gasModel,
57 const mfem::real_t *state1,
58 const mfem::real_t *state2,
59 const mfem::real_t *nor,
62 const int dim = gasModel.dim();
63 const int neq = gasModel.num_equations();
68 NavierStokesFlux::ComputeInviscidFluxKernel(gasModel, state1, inv_flux_1);
69 NavierStokesFlux::ComputeInviscidFluxKernel(gasModel, state2, inv_flux_2);
71 const mfem::real_t lambda_max =
72 NavierStokesFlux::MaximumNormalWaveSpeed(
73 gasModel, state1, state2, nor);
75 for (
int ieq = 0; ieq < neq; ++ieq)
77 mfem::real_t fn1 = 0.0;
78 mfem::real_t fn2 = 0.0;
80 for (
int d = 0; d < dim; ++d)
82 fn1 += inv_flux_1[ieq][d] * nor[d];
83 fn2 += inv_flux_2[ieq][d] * nor[d];
86 const mfem::real_t central_flux = 0.5 * (fn1 + fn2);
87 const mfem::real_t jump = state2[ieq] - state1[ieq];
89 flux[ieq] = central_flux - 0.5 * lambda_max * jump;
94 template<
typename GasModelT>
96 const mfem::real_t *q1,
const mfem::real_t *q2,
97 const mfem::real_t *met1,
const mfem::real_t *met2,
98 mfem::real_t *F_tilde)
const{
99 ComputeVolumeFluxKernel(gasModel, q1, q2, met1, met2, F_tilde);
101 template<
typename GasModelT>
102 MFEM_HOST_DEVICE
inline void ComputeFaceFlux(
const GasModelT &gasModel,
const mfem::real_t *qminus,
103 const mfem::real_t *qplus,
const mfem::real_t *nor,
104 mfem::real_t *flux)
const {
105 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 void 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:102
MFEM_HOST_DEVICE void 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:95