15 namespace ChandrashekarFlux
19 template<
typename GasModelT>
21 inline static void ComputeVolumeFluxKernel(
const GasModelT &gasModel,
22 const mfem::real_t* q1,
23 const mfem::real_t* q2,
24 const mfem::real_t* met1,
25 const mfem::real_t* met2,
26 mfem::real_t* F_tilde)
28 const int dim = gasModel.dim();
29 const int neq = gasModel.num_equations();
32 mfem::real_t met[3] = {0,0,0};
37 const mfem::real_t rho1 = gasModel.density(S1);
38 const mfem::real_t rho2 = gasModel.density(S2);
41 mfem::real_t mom_hat[3] = {0,0,0};
42 mfem::real_t h_hat = 0;
45 for (
int d=0; d<dim; ++d)
47 const mfem::real_t v1 = gasModel.velocity(S1, d);
48 const mfem::real_t v2 = gasModel.velocity(S2, d);
49 const mfem::real_t vbar = mfem::real_t(0.5)*(v1+v2);
53 mom_hat[d] = rho_ln * vbar;
55 h_hat += -mfem::real_t(0.25)*(v1*v1 + v2*v2) + vbar*vbar;
59 const mfem::real_t p1 = gasModel.pressure(S1);
60 const mfem::real_t p2 = gasModel.pressure(S2);
64 const mfem::real_t beta1 = mfem::real_t(0.5) * rho1 / p1;
65 const mfem::real_t beta2 = mfem::real_t(0.5) * rho2 / p2;
68 const mfem::real_t p_hat = mfem::real_t(0.5) * (rho1 + rho2) / (beta1 + beta2);
70 const mfem::real_t gm11 = gasModel.gamma(S1);
71 const mfem::real_t gm12 = gasModel.gamma(S2);
72 const mfem::real_t gm1_av_inv = mfem::real_t(2.0) / (gm11 + gm12 - mfem::real_t(2.0));
74 h_hat += mfem::real_t(0.5) / beta_ln * gm1_av_inv + p_hat / rho_ln;
79 const int mass_eq = gasModel.L.eq_mass;
80 const int mom0_eq = gasModel.L.eq_mom0;
81 const int ener_eq = gasModel.L.eq_energy;
82 F_tilde[mass_eq] = rho_ln * vn;
83 for (
int d=0; d<dim; ++d)
85 F_tilde[mom0_eq + d] = vn * mom_hat[d] + p_hat * met[d];
87 F_tilde[ener_eq] = rho_ln * vn * h_hat;
94 template<
typename GasModelT>
95 MFEM_HOST_DEVICE
inline static void ComputeFaceFluxKernel(
const GasModelT &gasModel,
const mfem::real_t *state1,
96 const mfem::real_t *state2,
const mfem::real_t *nor,
99 const int dim = gasModel.dim();
100 const int neq = gasModel.num_equations();
105 const mfem::real_t rho1 = gasModel.density(S1);
106 const mfem::real_t rho2 = gasModel.density(S2);
107 const mfem::real_t rho_mean = 0.5 * (rho1 + rho2);
109 const mfem::real_t drho = rho2 - rho1;
110 mfem::real_t mom[3] = {0.0, 0.0, 0.0};
111 mfem::real_t mom1[3] = {0.0, 0.0, 0.0};
112 mfem::real_t mom2[3] = {0.0, 0.0, 0.0};
113 mfem::real_t hhat = 0.0;
114 mfem::real_t diss = 0.0;
115 mfem::real_t vn = 0.0;
116 mfem::real_t vn1 = 0.0;
117 mfem::real_t vn2 = 0.0;
118 mfem::real_t nor_norm_squared = 0.0;
120 for(
int idim = 0;idim < dim;idim++){
121 mom1[idim] = gasModel.momentum(S1, idim);
122 mom2[idim] = gasModel.momentum(S2, idim);
123 const mfem::real_t v1 = mom1[idim]/rho1;
124 const mfem::real_t v2 = mom2[idim]/rho2;
125 const mfem::real_t vbar = 0.5 * (v1 + v2);
126 const mfem::real_t dv = v2 - v1;
127 vn += vbar * nor[idim];
128 vn1 += v1 * nor[idim];
129 vn2 += v2 * nor[idim];
130 nor_norm_squared += nor[idim] * nor[idim];
131 mom[idim] = rho_ln * vbar;
132 hhat += -0.25 * (v1*v1 + v2*v2) + vbar * vbar;
133 diss += 0.5 * drho * v1*v2 + rho_mean * dv * vbar;
135 const mfem::real_t p1 = gasModel.pressure(S1);
136 const mfem::real_t p2 = gasModel.pressure(S2);
143 const mfem::real_t beta1 = 0.5 * rho1 / p1;
144 const mfem::real_t beta2 = 0.5 * rho2 / p2;
147 const mfem::real_t p_hat = 0.5 * (rho1 + rho2) / (beta1 + beta2);
151 const mfem::real_t gm11 = gasModel.gamma(S1);
152 const mfem::real_t gm12 = gasModel.gamma(S2);
153 const mfem::real_t gm1_av_inv = 2.0/(gm11 + gm12 - 2.0);
155 hhat += 0.5 / beta_ln * gm1_av_inv + p_hat / rho_ln;
156 diss += 0.5 * drho * gm1_av_inv / beta_ln + 0.5 * rho_mean * gm1_av_inv * (1.0 / beta2 - 1.0 / beta1);
157 const int mass_eq = gasModel.L.eq_mass;
158 const int mom0_eq = gasModel.L.eq_mom0;
159 const int ener_eq = gasModel.L.eq_energy;
161 flux[mass_eq] = rho_ln * vn - 0.5 * lambda_max * (rho2 - rho1);
162 for (
int d = 0; d < dim; d++)
164 flux[mom0_eq + d] = vn * mom[d] + p_hat * nor[d]
165 - 0.5 * lambda_max * (mom2[d]-mom1[d]);
167 flux[ener_eq] = rho_ln * vn * hhat - 0.5 * lambda_max * diss;
172 template<
typename GasModelT>
174 const mfem::real_t *q1,
const mfem::real_t *q2,
175 const mfem::real_t *met1,
const mfem::real_t *met2,
176 mfem::real_t *F_tilde)
const{
177 ComputeVolumeFluxKernel(gasModel, q1, q2, met1, met2, F_tilde);
180 template<
typename GasModelT>
181 MFEM_HOST_DEVICE
inline void ComputeFaceFlux(
const GasModelT &gasModel,
const mfem::real_t *qminus,
182 const mfem::real_t *qplus,
const mfem::real_t *nor,
183 mfem::real_t *flux)
const {
184 ComputeFaceFluxKernel(gasModel, qminus, qplus, nor, flux);