13 namespace ChandrashekarFlux
17 template<
typename GasModelT>
19 inline static mfem::real_t ComputeVolumeFluxKernel(
const GasModelT &gasModel,
20 const mfem::real_t* q1,
21 const mfem::real_t* q2,
22 const mfem::real_t* met1,
23 const mfem::real_t* met2,
24 mfem::real_t* F_tilde)
26 const int dim = gasModel.dim();
27 const int neq = gasModel.num_equations();
30 mfem::real_t met[3] = {0,0,0};
35 const mfem::real_t rho1 = gasModel.density(S1);
36 const mfem::real_t rho2 = gasModel.density(S2);
39 mfem::real_t mom_hat[3] = {0,0,0};
40 mfem::real_t h_hat = 0;
42 mfem::real_t v2_1 = 0;
43 mfem::real_t v2_2 = 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);
55 mom_hat[d] = rho_ln * vbar;
57 h_hat += -mfem::real_t(0.25)*(v1*v1 + v2*v2) + vbar*vbar;
61 const mfem::real_t p1 = gasModel.pressure(S1);
62 const mfem::real_t p2 = gasModel.pressure(S2);
67 const mfem::real_t c1 = gasModel.sound_speed(S1);
68 const mfem::real_t c2 = gasModel.sound_speed(S2);
70 const mfem::real_t lambda_max =
Kernels::rmax(speed1 + c1, speed2 + c2);
74 const mfem::real_t beta1 = mfem::real_t(0.5) * rho1 / p1;
75 const mfem::real_t beta2 = mfem::real_t(0.5) * rho2 / p2;
78 const mfem::real_t p_hat = mfem::real_t(0.5) * (rho1 + rho2) / (beta1 + beta2);
80 const mfem::real_t gm11 = gasModel.gamma(S1);
81 const mfem::real_t gm12 = gasModel.gamma(S2);
82 const mfem::real_t gm1_av_inv = mfem::real_t(2.0) / (gm11 + gm12 - mfem::real_t(2.0));
84 h_hat += mfem::real_t(0.5) / beta_ln * gm1_av_inv + p_hat / rho_ln;
89 const int mass_eq = gasModel.L.eq_mass;
90 const int mom0_eq = gasModel.L.eq_mom0;
91 const int ener_eq = gasModel.L.eq_energy;
92 F_tilde[mass_eq] = rho_ln * vn;
93 for (
int d=0; d<dim; ++d)
95 F_tilde[mom0_eq + d] = vn * mom_hat[d] + p_hat * met[d];
97 F_tilde[ener_eq] = rho_ln * vn * h_hat;
105 template<
typename GasModelT>
106 MFEM_HOST_DEVICE
inline static mfem::real_t ComputeFaceFluxKernel(
const GasModelT &gasModel,
const mfem::real_t *state1,
107 const mfem::real_t *state2,
const mfem::real_t *nor,
110 const int dim = gasModel.dim();
111 const int neq = gasModel.num_equations();
116 const mfem::real_t rho1 = gasModel.density(S1);
117 const mfem::real_t rho2 = gasModel.density(S2);
118 const mfem::real_t rho_mean = 0.5 * (rho1 + rho2);
120 const mfem::real_t drho = rho2 - rho1;
121 mfem::real_t mom[3] = {0.0, 0.0, 0.0};
122 mfem::real_t mom1[3] = {0.0, 0.0, 0.0};
123 mfem::real_t mom2[3] = {0.0, 0.0, 0.0};
124 mfem::real_t hhat = 0.0;
125 mfem::real_t diss = 0.0;
126 mfem::real_t v21 = 0.0;
127 mfem::real_t v22 = 0.0;
128 mfem::real_t vn = 0.0;
129 mfem::real_t nor_mag = 0.0;
131 for(
int idim = 0;idim < dim;idim++){
132 nor_mag += nor[idim]*nor[idim];
133 mom1[idim] = gasModel.momentum(S1, idim);
134 mom2[idim] = gasModel.momentum(S2, idim);
135 const mfem::real_t v1 = mom1[idim]/rho1;
136 const mfem::real_t v2 = mom2[idim]/rho2;
137 const mfem::real_t vbar = 0.5 * (v1 + v2);
138 const mfem::real_t dv = v2 - v1;
141 vn += vbar * nor[idim];
142 mom[idim] = rho_ln * vbar;
143 hhat += -0.25 * (v1*v1 + v2*v2) + vbar * vbar;
144 diss += 0.5 * drho * v1*v2 + rho_mean * dv * vbar;
146 nor_mag = std::sqrt(nor_mag);
148 const mfem::real_t p1 = gasModel.pressure(S1);
149 const mfem::real_t p2 = gasModel.pressure(S2);
151 const mfem::real_t vmag1 = std::sqrt(v21);
152 const mfem::real_t vmag2 = std::sqrt(v22);
154 const mfem::real_t c1 = gasModel.sound_speed(S1);
155 const mfem::real_t c2 = gasModel.sound_speed(S2);
157 const mfem::real_t lambda_max =
Kernels::rmax(vmag1 + c1, vmag2 + c2);
159 const mfem::real_t beta1 = 0.5 * rho1 / p1;
160 const mfem::real_t beta2 = 0.5 * rho2 / p2;
163 const mfem::real_t p_hat = 0.5 * (rho1 + rho2) / (beta1 + beta2);
167 const mfem::real_t gm11 = gasModel.gamma(S1);
168 const mfem::real_t gm12 = gasModel.gamma(S2);
169 const mfem::real_t gm1_av_inv = 2.0/(gm11 + gm12 - 2.0);
171 hhat += 0.5 / beta_ln * gm1_av_inv + p_hat / rho_ln;
172 diss += 0.5 * drho * gm1_av_inv / beta_ln + 0.5 * rho_mean * gm1_av_inv * (1.0 / beta2 - 1.0 / beta1);
173 const int mass_eq = gasModel.L.eq_mass;
174 const int mom0_eq = gasModel.L.eq_mom0;
175 const int ener_eq = gasModel.L.eq_energy;
177 flux[mass_eq] = rho_ln * vn - 0.5 * lambda_max * (rho2 - rho1) * nor_mag;
178 for (
int d = 0; d < dim; d++)
180 flux[mom0_eq + d] = vn * mom[d] + p_hat * nor[d] - 0.5 * lambda_max * (mom2[d]-mom1[d]) * nor_mag;
182 flux[ener_eq] = rho_ln * vn * hhat - 0.5 * lambda_max * diss * nor_mag;
188 template<
typename GasModelT>
190 const mfem::real_t *q1,
const mfem::real_t *q2,
191 const mfem::real_t *met1,
const mfem::real_t *met2,
192 mfem::real_t *F_tilde)
const{
193 return ComputeVolumeFluxKernel(gasModel, q1, q2, met1, met2, F_tilde);
196 template<
typename GasModelT>
197 MFEM_HOST_DEVICE
inline mfem::real_t
ComputeFaceFlux(
const GasModelT &gasModel,
const mfem::real_t *qminus,
198 const mfem::real_t *qplus,
const mfem::real_t *nor,
199 mfem::real_t *flux)
const {
200 return ComputeFaceFluxKernel(gasModel, qminus, qplus, nor, flux);