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>
52 inline DEAL_II_ALWAYS_INLINE
53 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
55 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> &grad_u)
const;
65 inline DEAL_II_ALWAYS_INLINE
83 inline DEAL_II_ALWAYS_INLINE
90 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
91 dealii::VectorizedArray<number> penalty_parameter)
const;
103 inline DEAL_II_ALWAYS_INLINE
104 std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
108 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const;
127 const std::pair<ConservedVariables, ConservedVariables> &w_q,
128 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_w_q,
129 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
130 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_delta_w_q,
131 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
132 dealii::VectorizedArray<number> penalty_parameter)
const;
165 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
166 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
167 dealii::VectorizedArray<number> penalty_parameter)
const;
180 template <
int dim,
typename number>
182 : material(material_in)
188 template <
int dim,
typename number>
189 inline DEAL_II_ALWAYS_INLINE
190 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
192 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> &grad_u)
const
194 const dealii::VectorizedArray<number> div_u = 2. / 3. * dealii::trace(grad_u);
196 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> out;
197 for (
unsigned int d = 0; d < dim; ++d)
199 for (
unsigned int e = 0; e < dim; ++e)
200 out[d][e] = material.dynamic_viscosity * (grad_u[d][e] + grad_u[e][d]);
201 out[d][d] -= material.dynamic_viscosity * div_u;
207 template <
int dim,
typename number>
208 inline DEAL_II_ALWAYS_INLINE
217 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity = state_view.velocity();
219 const auto grad_u = state_view.grad_velocity();
221 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> viscous_stress =
222 calculate_viscous_stress_tensor(grad_u);
224 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> neg_heat_flux =
225 state_view.thermal_conductivity() * state_view.grad_temperature();
228 for (
unsigned int d = 0; d < dim; ++d)
234 for (
unsigned int e = 0; e < dim; ++e)
235 flux[e + 1][d] = viscous_stress[e][d];
238 flux[dim + 1][d] = neg_heat_flux[d];
240 for (
unsigned int e = 0; e < dim; ++e)
241 flux[dim + 1][d] += velocity[e] * viscous_stress[d][e];
247 template <
int dim,
typename number>
248 inline DEAL_II_ALWAYS_INLINE
255 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
258 const auto flux_m = calculate_viscous_flux(u_m, grad_u_m);
260 const auto flux_p = calculate_viscous_flux(u_p, grad_u_p);
262 return contract_average_tensor_with_vector<n_conserved_variables<dim>,
264 dealii::VectorizedArray<number>>(flux_m,
267 penalty_parameter * material.dynamic_viscosity / material.reference_density *
271 template <
int dim,
typename number>
272 inline DEAL_II_ALWAYS_INLINE
277 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal)
const
278 -> std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
281 for (
unsigned int e = 0; e < n_conserved_variables<dim>; ++e)
282 for (
unsigned int d = 0; d < dim; ++d)
283 jump_u[e][d] = (u_m[e] - u_p[e]) * normal[d];
289 return std::make_pair(flux_m, flux_p);
292 template <
int dim,
typename number>
293 inline DEAL_II_ALWAYS_INLINE
296 const std::pair<ConservedVariables, ConservedVariables> &w_q,
297 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_w_q,
298 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
299 const std::pair<ConservedVariablesGradient, ConservedVariablesGradient> &grad_delta_w_q,
300 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
304 0.5 * calculate_jacobian_viscous_flux(w_q.second,
307 grad_delta_w_q.second);
311 grad_delta_w_q.first);
314 for (
unsigned int i = 0; i < n_conserved_variables<dim>; ++i)
315 flux[i] = (flux_p[i] + flux_m[i]);
318 calculate_jacobian_viscous_numerical_flux_jump_term(delta_w_q, normal, penalty_parameter);
322 template <
int dim,
typename number>
323 inline DEAL_II_ALWAYS_INLINE
335 dealii::VectorizedArray<number> rho_inv = 1.0 / w_q[0];
336 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> m_q;
337 for (
unsigned int i = 0; i < dim; ++i)
339 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> delta_m_q;
340 for (
unsigned int i = 0; i < dim; ++i)
341 delta_m_q[i] = delta_w_q[i + 1];
344 viscous_differential_change[0] = dealii::Tensor<1, dim, dealii::VectorizedArray<number>>();
348 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> grad_m_q;
349 for (
unsigned int i = 0; i < dim; ++i)
350 grad_m_q[i] = grad_w_q[i + 1];
351 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> grad_delta_m_q;
352 for (
unsigned int i = 0; i < dim; ++i)
353 grad_delta_m_q[i] = grad_delta_w_q[i + 1];
355 auto v_q = state_view.velocity();
356 const auto grad_v_q_temp = state_view.grad_velocity();
357 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> grad_v_q;
358 for (
unsigned int i = 0; i < dim; ++i)
359 for (
unsigned int j = 0; j < dim; ++j)
360 grad_v_q[i][j] = grad_v_q_temp[i][j];
362 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_a =
363 rho_inv * (-delta_w_q[0] * grad_v_q);
364 param_a += rho_inv * rho_inv * delta_w_q[0] *
dyadic_product(v_q, grad_w_q[0]);
367 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_c =
370 param_c -= 2. / 3. *
trace(param_a) * identity<dim, dealii::VectorizedArray<number>>();
371 param_c *= material.dynamic_viscosity;
373 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_b =
374 rho_inv * grad_delta_m_q;
375 param_b -= rho_inv * rho_inv *
dyadic_product(delta_m_q, grad_w_q[0]);
377 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_d =
380 param_d -= 2. / 3. *
trace(param_b) * identity<dim, dealii::VectorizedArray<number>>();
381 param_d *= material.dynamic_viscosity;
384 for (
unsigned int i = 0; i < dim; ++i)
386 viscous_differential_change[i + 1] = param_c[i] + param_d[i];
390 const auto tau_temp = calculate_viscous_stress_tensor(grad_v_q_temp);
392 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> tau;
393 for (
unsigned int i = 0; i < dim; ++i)
394 for (
unsigned int j = 0; j < dim; ++j)
395 tau[i][j] = tau_temp[i][j];
397 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> rho_energy_density;
402 rho_energy_density +=
403 lambda_div_c * (-rho_inv * rho_inv * grad_w_q[dim + 1] * delta_w_q[0] +
404 rho_inv * rho_inv * rho_inv * w_q[dim + 1] * delta_w_q[0] * grad_w_q[0] +
405 grad_w_q[0] * w_q[dim + 1] * rho_inv * rho_inv * rho_inv * delta_w_q[0] -
406 w_q[dim + 1] * rho_inv * rho_inv * grad_delta_w_q[0] +
409 rho_energy_density -=
410 lambda_div_c * rho_inv * rho_inv *
415 rho_energy_density +=
420 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> momentum_energy_density;
424 momentum_energy_density -=
426 momentum_energy_density += lambda_div_c * rho_inv * rho_inv * rho_inv *
431 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> energy_energy_density;
432 energy_energy_density += rho_inv * grad_delta_w_q[dim + 1];
433 energy_energy_density -= grad_w_q[0] * rho_inv * rho_inv * delta_w_q[dim + 1];
434 energy_energy_density *= lambda_div_c;
437 viscous_differential_change[dim + 1] =
438 rho_energy_density + momentum_energy_density + energy_energy_density;
439 return viscous_differential_change;
442 template <
int dim,
typename number>
443 inline DEAL_II_ALWAYS_INLINE
446 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
447 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
451 penalty_parameter * material.dynamic_viscosity / material.reference_density *
452 identity<n_conserved_variables<dim>, dealii::VectorizedArray<number>>(),
This file contains various functions that can be used to set and evaluate boundary conditions for the...
Definition boundary_condition_functions.hpp:17
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, dealii::Tensor< 1, dim, VectorizedArrayType > > ConservedVariablesGradientType
Definition data_types.hpp:54
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, VectorizedArrayType > ConservedVariablesType
Definition data_types.hpp:45
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
This file provides a collection of view types for the compressible Navier–Stokes solver....
Definition state_views.hpp:307
Collection of material parameters for a specific fluid phase.
Definition material.hpp:140
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:325
DofValueAndGradientStateView< dim, number, const ConservedVariables, const ConservedVariablesGradient > ValueAndGradientStateView
Definition viscous_kernels.hpp:39
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:295
ViscousKernels(const MaterialPhaseData< number > &material_in)
Definition viscous_kernels.hpp:181
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:274
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:250
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:191
const MaterialPhaseData< number > & material
Object which provides all relevant material properties for a specific phase.
Definition viscous_kernels.hpp:171
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:445
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:210
number lambda_div_c
precomputed constant
Definition viscous_kernels.hpp:174