3#include <deal.II/base/config.h>
5#include <deal.II/base/tensor.h>
6#include <deal.II/base/vectorization.h>
29 template <
int dim,
typename number>
46 inline DEAL_II_ALWAYS_INLINE
47 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
49 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> &grad_u)
const;
59 inline DEAL_II_ALWAYS_INLINE
77 inline DEAL_II_ALWAYS_INLINE
84 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
85 dealii::VectorizedArray<number> penalty_parameter)
const;
97 inline DEAL_II_ALWAYS_INLINE
98 std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
102 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const;
121 const std::pair<ConservedVariables, ConservedVariables> &w_q,
122 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_w_q,
123 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
124 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_delta_w_q,
125 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
126 dealii::VectorizedArray<number> penalty_parameter)
const;
159 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
160 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
161 dealii::VectorizedArray<number> penalty_parameter)
const;
174 template <
int dim,
typename number>
176 : material(material_in)
182 template <
int dim,
typename number>
183 inline DEAL_II_ALWAYS_INLINE
184 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
186 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> &grad_u)
const
188 const dealii::VectorizedArray<number> div_u = 2. / 3. * dealii::trace(grad_u);
190 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> out;
191 for (
unsigned int d = 0; d < dim; ++d)
193 for (
unsigned int e = 0; e < dim; ++e)
194 out[d][e] = material.data.dynamic_viscosity * (grad_u[d][e] + grad_u[e][d]);
195 out[d][d] -= material.data.dynamic_viscosity * div_u;
201 template <
int dim,
typename number>
202 inline DEAL_II_ALWAYS_INLINE
209 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity =
210 calculate_velocity<dim, number>(conserved_variables);
214 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> viscous_stress =
215 calculate_viscous_stress_tensor(grad_u);
217 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> neg_heat_flux =
218 material.data.thermal_conductivity *
219 material.eos_utils->calculate_grad_T(conserved_variables, grad_conserved_variables);
222 for (
unsigned int d = 0; d < dim; ++d)
228 for (
unsigned int e = 0; e < dim; ++e)
229 flux[e + 1][d] = viscous_stress[e][d];
232 flux[dim + 1][d] = neg_heat_flux[d];
234 for (
unsigned int e = 0; e < dim; ++e)
235 flux[dim + 1][d] += velocity[e] * viscous_stress[d][e];
241 template <
int dim,
typename number>
242 inline DEAL_II_ALWAYS_INLINE
249 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
252 const auto flux_m = calculate_viscous_flux(u_m, grad_u_m);
254 const auto flux_p = calculate_viscous_flux(u_p, grad_u_p);
256 return contract_average_tensor_with_vector<n_conserved_variables<dim>,
258 dealii::VectorizedArray<number>>(flux_m,
261 penalty_parameter * material.data.dynamic_viscosity / material.data.reference_density *
265 template <
int dim,
typename number>
266 inline DEAL_II_ALWAYS_INLINE
271 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const
272 -> std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
275 for (
unsigned int e = 0; e < n_conserved_variables<dim>; ++e)
276 for (
unsigned int d = 0; d < dim; ++d)
277 jump_u[e][d] = (u_m[e] - u_p[e]) * normal[d];
283 return std::make_pair(flux_m, flux_p);
286 template <
int dim,
typename number>
287 inline DEAL_II_ALWAYS_INLINE
290 const std::pair<ConservedVariables, ConservedVariables> &w_q,
291 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_w_q,
292 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
293 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_delta_w_q,
294 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
298 0.5 * calculate_jacobian_viscous_flux(w_q.second,
301 grad_delta_w_q.second);
305 grad_delta_w_q.first);
308 for (
unsigned int i = 0; i < n_conserved_variables<dim>; ++i)
309 flux[i] = (flux_p[i] + flux_m[i]);
312 calculate_jacobian_viscous_numerical_flux_jump_term(delta_w_q, normal, penalty_parameter);
316 template <
int dim,
typename number>
317 inline DEAL_II_ALWAYS_INLINE
328 dealii::VectorizedArray<number> rho_inv = 1.0 / w_q[0];
329 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> m_q;
330 for (
unsigned int i = 0; i < dim; ++i)
332 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> delta_m_q;
333 for (
unsigned int i = 0; i < dim; ++i)
334 delta_m_q[i] = delta_w_q[i + 1];
337 viscous_differential_change[0] = dealii::Tensor<1, dim, dealii::VectorizedArray<number>>();
341 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> grad_m_q;
342 for (
unsigned int i = 0; i < dim; ++i)
343 grad_m_q[i] = grad_w_q[i + 1];
344 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> grad_delta_m_q;
345 for (
unsigned int i = 0; i < dim; ++i)
346 grad_delta_m_q[i] = grad_delta_w_q[i + 1];
348 auto v_q = calculate_velocity<dim, number>(w_q);
350 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> grad_v_q;
351 for (
unsigned int i = 0; i < dim; ++i)
352 for (
unsigned int j = 0; j < dim; ++j)
353 grad_v_q[i][j] = grad_v_q_temp[i][j];
355 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_a =
356 rho_inv * (-delta_w_q[0] * grad_v_q);
357 param_a += rho_inv * rho_inv * delta_w_q[0] *
dyadic_product(v_q, grad_w_q[0]);
360 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_c =
363 param_c -= 2. / 3. *
trace(param_a) * identity<dim, dealii::VectorizedArray<number>>();
364 param_c *= material.data.dynamic_viscosity;
366 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_b =
367 rho_inv * grad_delta_m_q;
368 param_b -= rho_inv * rho_inv *
dyadic_product(delta_m_q, grad_w_q[0]);
370 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_d =
373 param_d -= 2. / 3. *
trace(param_b) * identity<dim, dealii::VectorizedArray<number>>();
374 param_d *= material.data.dynamic_viscosity;
377 for (
unsigned int i = 0; i < dim; ++i)
379 viscous_differential_change[i + 1] = param_c[i] + param_d[i];
383 const auto tau_temp = calculate_viscous_stress_tensor(grad_v_q_temp);
385 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> tau;
386 for (
unsigned int i = 0; i < dim; ++i)
387 for (
unsigned int j = 0; j < dim; ++j)
388 tau[i][j] = tau_temp[i][j];
390 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> rho_energy_density;
395 rho_energy_density +=
396 lambda_div_c * (-rho_inv * rho_inv * grad_w_q[dim + 1] * delta_w_q[0] +
397 rho_inv * rho_inv * rho_inv * w_q[dim + 1] * delta_w_q[0] * grad_w_q[0] +
398 grad_w_q[0] * w_q[dim + 1] * rho_inv * rho_inv * rho_inv * delta_w_q[0] -
399 w_q[dim + 1] * rho_inv * rho_inv * grad_delta_w_q[0] +
402 rho_energy_density -=
403 lambda_div_c * rho_inv * rho_inv *
408 rho_energy_density +=
413 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> momentum_energy_density;
417 momentum_energy_density -=
419 momentum_energy_density += lambda_div_c * rho_inv * rho_inv * rho_inv *
424 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> energy_energy_density;
425 energy_energy_density += rho_inv * grad_delta_w_q[dim + 1];
426 energy_energy_density -= grad_w_q[0] * rho_inv * rho_inv * delta_w_q[dim + 1];
427 energy_energy_density *= lambda_div_c;
430 viscous_differential_change[dim + 1] =
431 rho_energy_density + momentum_energy_density + energy_energy_density;
432 return viscous_differential_change;
435 template <
int dim,
typename number>
436 inline DEAL_II_ALWAYS_INLINE
439 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
440 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
444 penalty_parameter * material.data.dynamic_viscosity / material.data.reference_density *
445 identity<n_conserved_variables<dim>, dealii::VectorizedArray<number>>(),
A class which provides all relevant material properties for a specific phase.
Definition material_data.hpp:18
This file contains various functions that can be used to set and evaluate boundary conditions for the...
Definition boundary_condition_functions.hpp:17
DEAL_II_ALWAYS_INLINE dealii::Tensor< 2, dim, dealii::VectorizedArray< number > > calculate_grad_velocity(const ConservedVariablesType< dim, number > &conserved_variables, const ConservedVariablesGradientType< dim, number > &grad_conserved_variables)
Calculate the velocity gradient.
Definition utils.hpp:191
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, dealii::Tensor< 1, dim, VectorizedArrayType > > ConservedVariablesGradientType
Definition data_types.hpp:44
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, VectorizedArrayType > ConservedVariablesType
Definition data_types.hpp:35
dealii::Tensor< 1, T1_dim, dealii::Tensor< 1, T2_dim, number > > dyadic_product(const number *a_start, const number *b_start)
Definition dealii_tensor.hpp:203
dealii::Tensor< 1, a, dealii::Tensor< 1, c, number > > matrix_matrix_product(const dealii::Tensor< 1, a, dealii::Tensor< 1, b, number > > &matrix1, const dealii::Tensor< 1, b, dealii::Tensor< 1, c, number > > &matrix2)
Definition dealii_tensor.hpp:93
dealii::Tensor< 1, dim, dealii::Tensor< 1, dim, number > > identity()
Definition dealii_tensor.hpp:269
dealii::Tensor< 1, T2_dim, dealii::Tensor< 1, T1_dim, number > > transpose(const dealii::Tensor< 1, T1_dim, dealii::Tensor< 1, T2_dim, number > > &in)
Definition dealii_tensor.hpp:232
number trace(const dealii::Tensor< 1, dim, dealii::Tensor< 1, dim, number > > &in)
Definition dealii_tensor.hpp:246
dealii::Tensor< 1, n_rows, number > matrix_vector_product(const dealii::Tensor< 1, n_rows, dealii::Tensor< 1, n_columns, number > > &matrix, const dealii::Tensor< 1, n_columns, number > &vector)
Definition dealii_tensor.hpp:80
Viscous kernel operations for compressible flow solvers.
Definition viscous_kernels.hpp:31
ConservedVariablesGradient calculate_jacobian_viscous_flux(const ConservedVariables &w_q, const ConservedVariablesGradient &grad_w_q, const ConservedVariables &delta_w_q, const ConservedVariablesGradient &grad_delta_w_q) const
Compute the linearization of the viscous flux with respect to the primary variables.
Definition viscous_kernels.hpp:319
ConservedVariablesGradient calculate_jacobian_viscous_numerical_flux(const std::pair< ConservedVariables, ConservedVariables > &w_q, const std::pair< ConservedVariablesGradient, ConservedVariablesGradient > &grad_w_q, const std::pair< ConservedVariables, ConservedVariables > &delta_w_q, const std::pair< ConservedVariablesGradient, ConservedVariablesGradient > &grad_delta_w_q, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal, dealii::VectorizedArray< number > penalty_parameter) const
Compute the linearization of the viscous numerical flux with respect to the primary variables.
Definition viscous_kernels.hpp:289
DEAL_II_ALWAYS_INLINE std::pair< ConservedVariablesGradient, ConservedVariablesGradient > calculate_viscous_numerical_flux_gradient(const ConservedVariables &u_m, const ConservedVariables &u_p, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal) const
Calculate the visocus flux, where jump(u) instead of grad(u) is used resulting in the F_v(u,...
Definition viscous_kernels.hpp:268
ConservedVariablesType< dim, number > ConservedVariables
Definition viscous_kernels.hpp:32
DEAL_II_ALWAYS_INLINE ConservedVariables calculate_viscous_numerical_flux(const ConservedVariables &u_m, const ConservedVariables &u_p, const ConservedVariablesGradient &grad_u_m, const ConservedVariablesGradient &grad_u_p, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal, dealii::VectorizedArray< number > penalty_parameter) const
Calculate the viscous numerical flux F_v^* using the symmetric interior penalty method.
Definition viscous_kernels.hpp:244
ViscousKernels(const Material< dim, number > &material_in)
Definition viscous_kernels.hpp:175
ConservedVariablesGradientType< dim, number > ConservedVariablesGradient
Definition viscous_kernels.hpp:33
DEAL_II_ALWAYS_INLINE dealii::Tensor< 2, dim, dealii::VectorizedArray< number > > calculate_viscous_stress_tensor(const dealii::Tensor< 2, dim, dealii::VectorizedArray< number > > &grad_u) const
Calculate the viscous stress tensor.
Definition viscous_kernels.hpp:185
const Material< dim, number > & material
Object which provides all relevant material properties for a specific phase.
Definition viscous_kernels.hpp:165
ConservedVariablesGradient calculate_jacobian_viscous_numerical_flux_jump_term(const std::pair< ConservedVariables, ConservedVariables > &delta_w_q, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal, dealii::VectorizedArray< number > penalty_parameter) const
Compute the linearization of the viscous numerical flux jump term.
Definition viscous_kernels.hpp:438
DEAL_II_ALWAYS_INLINE ConservedVariablesGradient calculate_viscous_flux(const ConservedVariables &conserved_variables, const ConservedVariablesGradient &grad_conserved_variables) const
Calculate the viscous flux F_v, i.e. F_v(u, grad(u)).
Definition viscous_kernels.hpp:204
number lambda_div_c
precomputed constant
Definition viscous_kernels.hpp:168