14 namespace NavierStokesFlux
17 template<
typename GasT>
18 MFEM_HOST_DEVICE
inline static void
19 ComputeInviscidFluxKernel(
const GasT &gas,
20 const mfem::real_t *state,
26 const int dim = gas.dim();
27 const mfem::real_t
density = gas.density(S);
28 const mfem::real_t spec_vol = 1.0/
density;
30 for(
int idim = 0;idim < dim;idim++){
31 momentum[idim] = gas.
momentum(S, idim);
34 const mfem::real_t energy = gas.energy(S);
35 const mfem::real_t
pressure = gas.pressure(S);
36 const mfem::real_t ke = gas.kinetic_energy_density(S);
37 const int eq_mass = gas.L.eq_mass;
38 const int eq_mom0 = gas.L.eq_mom0;
39 const int eq_ener = gas.L.eq_energy;
40 const int eq_spec = gas.L.eq_scalar0;
42 const mfem::real_t H = (energy +
pressure)*spec_vol;
44 for (
int d = 0; d < dim; d++)
46 inv_flux[eq_mass][d] = momentum[d];
47 for (
int i = 0; i < dim; i++)
50 inv_flux[eq_mom0+i][d] = momentum[i]*momentum[d]*spec_vol;
54 inv_flux[eq_ener][d] = momentum[d]*H;
55 for(
int s = 0;s < gas.L.num_scalars;s++){
56 inv_flux[eq_spec+s][d] = gas.scalar(S, s) * momentum[d] * spec_vol;
67 template<
typename GasT>
68 MFEM_HOST_DEVICE
inline
69 static void ComputeViscousFluxKernel(
const GasT &gas,
70 const mfem::real_t *state,
71 const mfem::real_t *dprim_x,
72 const mfem::real_t *dprim_y,
73 const mfem::real_t *dprim_z,
75 bool axisymmetric =
false,
76 mfem::real_t radius = 0.0,
77 mfem::real_t *azimuthal_stress =
nullptr)
81 const int dim = gas.dim();
84 for(
int idir = 0;idir < dim;idir++){
85 visc_flux[q][idir] = 0.0;
92 const mfem::real_t mu = gas.viscosity(S);
93 const mfem::real_t kappa = gas.thermal_conductivity(S);
94 const mfem::real_t mu_bulk = gas.bulk_viscosity(S);
97 const int eq_mass = gas.L.eq_mass;
98 const int eq_mom0 = gas.L.eq_mom0;
99 const int eq_ener = gas.L.eq_energy;
100 const int nscalar = gas.L.num_scalars;
108 grad_rho[0] = dprim_x[eq_mass];
109 grad_vel[0][0] = dprim_x[eq_mom0];
110 grad_p[0] = dprim_x[eq_ener];
112 grad_rho[1] = dprim_y[eq_mass];
113 grad_vel[0][1] = dprim_y[eq_mom0];
114 grad_vel[1][0] = dprim_x[eq_mom0+1];
115 grad_vel[1][1] = dprim_y[eq_mom0+1];
116 grad_p[1] = dprim_y[eq_ener];
118 grad_rho[2] = dprim_z[eq_mass];
119 grad_vel[0][2] = dprim_z[eq_mom0];
120 grad_vel[1][2] = dprim_z[eq_mom0+1];
121 grad_vel[2][0] = dprim_x[eq_mom0+2];
122 grad_vel[2][1] = dprim_y[eq_mom0+2];
123 grad_vel[2][2] = dprim_z[eq_mom0+2];
124 grad_p[2] = dprim_z[eq_ener];
128 gas.grad_temperature(S, grad_rho, grad_p, grad_t);
130 mfem::real_t div_vel = 0.0;
131 for(
int i = 0;i < dim;i++){
133 div_vel += grad_vel[i][i];
135 mfem::real_t radial_rate = 0.0;
143 radial_rate = vel[radial] / radius;
147 radial_rate = grad_vel[radial][radial];
153 div_vel += radial_rate;
156 if (azimuthal_stress)
158 *azimuthal_stress = 0.0;
161 *azimuthal_stress = mu *
162 (2.0 * radial_rate - mu_bulk * div_vel);
171 for (
int dir = 0; dir < dim; ++dir)
174 for (
int mom = 0; mom < dim; ++mom)
176 mfem::real_t tau = 0.0;
181 tau = mu * (2.0 * grad_vel[mom][dir] - mu_bulk * div_vel);
185 tau = mu * (grad_vel[mom][dir] + grad_vel[dir][mom]);
188 visc_flux[eq_mom0 + mom][dir] = tau;
190 mfem::real_t eflux = kappa * grad_t[dir];
191 for(
int mom = 0;mom < dim;mom++)
193 eflux += vel[mom] * visc_flux[eq_mom0 + mom][dir];
195 visc_flux[eq_ener][dir] = eflux;
199 template<
typename GasT>
200 MFEM_HOST_DEVICE
inline
201 static void compute_ref_viscous_flux(
const GasT &gas,
204 const mfem::real_t *state,
205 const mfem::real_t *dqx,
206 const mfem::real_t *dqy,
207 const mfem::real_t *dqz,
208 const mfem::real_t *adj_row,
210 bool axisymmetric =
false,
211 mfem::real_t radius = 0.0)
216 ComputeViscousFluxKernel(gas, state, dqx, dqy, dqz, flux_phys,
217 axisymmetric, radius);
219 for (
int q = 0; q < neq; ++q)
222 for (
int j = 0; j < dim; ++j)
223 f_ref[q] += adj_row[j] * flux_phys[q][j];