include/meltpooldg/compressible_flow/viscous_kernels.hpp Source File

Developer Documentation: include/meltpooldg/compressible_flow/viscous_kernels.hpp Source File
Developer Documentation
viscous_kernels.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/config.h>
4
5#include <deal.II/base/tensor.h>
6#include <deal.II/base/vectorization.h>
7
13
14#include <utility>
15
16
18{
29 template <int dim, typename number>
31 {
34
37 number,
40
41 explicit ViscousKernels(const MaterialPhaseData<number> &material_in);
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;
56
65 inline DEAL_II_ALWAYS_INLINE //
67 calculate_viscous_flux(const ConservedVariables &conserved_variables,
68 const ConservedVariablesGradient &grad_conserved_variables) const;
69
83 inline DEAL_II_ALWAYS_INLINE //
86 const ConservedVariables &u_m,
87 const ConservedVariables &u_p,
88 const ConservedVariablesGradient &grad_u_m,
89 const ConservedVariablesGradient &grad_u_p,
90 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
91 dealii::VectorizedArray<number> penalty_parameter) const;
92
103 inline DEAL_II_ALWAYS_INLINE //
104 std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
106 const ConservedVariables &u_m,
107 const ConservedVariables &u_p,
108 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal) const;
109
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;
133
146 const ConservedVariablesGradient &grad_w_q,
147 const ConservedVariables &delta_w_q,
148 const ConservedVariablesGradient &grad_delta_w_q) const;
149
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;
168
169 private:
172
175 };
176
177 /********************************************************************************************
178 * Inlined function definitions
179 * *************************************************************************************+****/
180 template <int dim, typename number>
182 : material(material_in)
183 {
185 material.thermal_conductivity / material.specific_gas_constant * (material.gamma - 1.0);
186 }
187
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
193 {
194 const dealii::VectorizedArray<number> div_u = 2. / 3. * dealii::trace(grad_u);
195
196 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> out;
197 for (unsigned int d = 0; d < dim; ++d)
198 {
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;
202 }
203
204 return out;
205 }
206
207 template <int dim, typename number>
208 inline DEAL_II_ALWAYS_INLINE //
209 auto
211 const ConservedVariables &conserved_variables,
212 const ConservedVariablesGradient &grad_conserved_variables) const
214 {
215 ValueAndGradientStateView state_view(conserved_variables, grad_conserved_variables, material);
216
217 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity = state_view.velocity();
218
219 const auto grad_u = state_view.grad_velocity();
220
221 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> viscous_stress =
222 calculate_viscous_stress_tensor(grad_u);
223
224 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> neg_heat_flux =
225 state_view.thermal_conductivity() * state_view.grad_temperature();
226
228 for (unsigned int d = 0; d < dim; ++d)
229 {
230 // density
231 flux[0][d] = 0.0;
232
233 // momentum
234 for (unsigned int e = 0; e < dim; ++e)
235 flux[e + 1][d] = viscous_stress[e][d];
236
237 // energy
238 flux[dim + 1][d] = neg_heat_flux[d];
239
240 for (unsigned int e = 0; e < dim; ++e)
241 flux[dim + 1][d] += velocity[e] * viscous_stress[d][e];
242 }
243
244 return flux;
245 }
246
247 template <int dim, typename number>
248 inline DEAL_II_ALWAYS_INLINE //
249 auto
251 const ConservedVariables &u_m,
252 const ConservedVariables &u_p,
253 const ConservedVariablesGradient &grad_u_m,
254 const ConservedVariablesGradient &grad_u_p,
255 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
256 const dealii::VectorizedArray<number> penalty_parameter) const -> ConservedVariables
257 {
258 const auto flux_m = calculate_viscous_flux(u_m, grad_u_m);
259
260 const auto flux_p = calculate_viscous_flux(u_p, grad_u_p);
261
262 return contract_average_tensor_with_vector<n_conserved_variables<dim>,
263 dim,
264 dealii::VectorizedArray<number>>(flux_m,
265 flux_p,
266 normal) -
267 penalty_parameter * material.dynamic_viscosity / material.reference_density *
268 (u_m - u_p);
269 }
270
271 template <int dim, typename number>
272 inline DEAL_II_ALWAYS_INLINE //
273 auto
275 const ConservedVariables &u_m,
276 const ConservedVariables &u_p,
277 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal) const
278 -> std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
279 {
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];
284
285 // use jumps instead of gradients for evaluating the viscous flux
286 const ConservedVariablesGradient flux_m = 0.5 * calculate_viscous_flux(u_m, jump_u);
287 const ConservedVariablesGradient flux_p = 0.5 * calculate_viscous_flux(u_p, jump_u);
288
289 return std::make_pair(flux_m, flux_p);
290 }
291
292 template <int dim, typename number>
293 inline DEAL_II_ALWAYS_INLINE //
294 auto
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,
301 dealii::VectorizedArray<number> penalty_parameter) const -> ConservedVariablesGradient
302 {
304 0.5 * calculate_jacobian_viscous_flux(w_q.second,
305 grad_w_q.second,
306 delta_w_q.second,
307 grad_delta_w_q.second);
308 ConservedVariablesGradient flux_m = 0.5 * calculate_jacobian_viscous_flux(w_q.first,
309 grad_w_q.first,
310 delta_w_q.first,
311 grad_delta_w_q.first);
312
314 for (unsigned int i = 0; i < n_conserved_variables<dim>; ++i)
315 flux[i] = (flux_p[i] + flux_m[i]);
316
317 flux -=
318 calculate_jacobian_viscous_numerical_flux_jump_term(delta_w_q, normal, penalty_parameter);
319 return flux;
320 }
321
322 template <int dim, typename number>
323 inline DEAL_II_ALWAYS_INLINE //
324 auto
326 const ConservedVariables &w_q,
327 const ConservedVariablesGradient &grad_w_q,
328 const ConservedVariables &delta_w_q,
329 const ConservedVariablesGradient &grad_delta_w_q) const -> ConservedVariablesGradient
330 {
331 ConservedVariablesGradient viscous_differential_change;
332 ValueAndGradientStateView state_view(w_q, grad_w_q, material);
333
334 // precompute values
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)
338 m_q[i] = w_q[i + 1];
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];
342
343 /* change in density flux */
344 viscous_differential_change[0] = dealii::Tensor<1, dim, dealii::VectorizedArray<number>>();
345
346 /* change in momentum flux */
347 // density part
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];
354
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];
361
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]);
365 param_a -= rho_inv * dyadic_product(v_q, grad_delta_w_q[0]);
366
367 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_c =
368 param_a;
369 param_c += transpose(param_a);
370 param_c -= 2. / 3. * trace(param_a) * identity<dim, dealii::VectorizedArray<number>>();
371 param_c *= material.dynamic_viscosity;
372
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]);
376
377 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_d =
378 param_b;
379 param_d += transpose(param_b);
380 param_d -= 2. / 3. * trace(param_b) * identity<dim, dealii::VectorizedArray<number>>();
381 param_d *= material.dynamic_viscosity;
382
383
384 for (unsigned int i = 0; i < dim; ++i)
385 {
386 viscous_differential_change[i + 1] = param_c[i] + param_d[i];
387 }
388
389 /* change in energy density flux */
390 const auto tau_temp = calculate_viscous_stress_tensor(grad_v_q_temp);
391
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];
396 // density part
397 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> rho_energy_density;
398 rho_energy_density += matrix_vector_product(param_c, m_q) * rho_inv;
399 rho_energy_density -= rho_inv * rho_inv * matrix_vector_product(tau, m_q) * delta_w_q[0];
400
401
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] +
407 matrix_vector_product(grad_v_q, m_q) * rho_inv * rho_inv * delta_w_q[0]);
408
409 rho_energy_density -=
410 lambda_div_c * rho_inv * rho_inv *
411 (rho_inv * delta_w_q[0] * matrix_vector_product(dyadic_product(v_q, grad_w_q[0]), m_q) -
412 matrix_vector_product(dyadic_product(v_q, grad_delta_w_q[0]), m_q));
413
414
415 rho_energy_density +=
416 lambda_div_c * rho_inv * rho_inv * delta_w_q[0] * matrix_vector_product(grad_v_q, m_q);
417
418
419 // momentum part
420 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> momentum_energy_density;
421 momentum_energy_density += rho_inv * matrix_vector_product(param_d, m_q);
422 momentum_energy_density += rho_inv * matrix_vector_product(tau, delta_m_q);
423 momentum_energy_density -= lambda_div_c * rho_inv * matrix_vector_product(grad_v_q, delta_m_q);
424 momentum_energy_density -=
425 lambda_div_c * rho_inv * rho_inv * matrix_vector_product(grad_delta_m_q, m_q);
426 momentum_energy_density += lambda_div_c * rho_inv * rho_inv * rho_inv *
427 matrix_vector_product(dyadic_product(delta_m_q, grad_w_q[0]), m_q);
428
429
430 // energy density part
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;
435
436 // build the sum
437 viscous_differential_change[dim + 1] =
438 rho_energy_density + momentum_energy_density + energy_energy_density;
439 return viscous_differential_change;
440 }
441
442 template <int dim, typename number>
443 inline DEAL_II_ALWAYS_INLINE //
444 auto
446 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
447 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
448 dealii::VectorizedArray<number> penalty_parameter) const -> ConservedVariablesGradient
449 {
451 penalty_parameter * material.dynamic_viscosity / material.reference_density *
452 identity<n_conserved_variables<dim>, dealii::VectorizedArray<number>>(),
453 dyadic_product(delta_w_q.first - delta_w_q.second, normal));
454 }
455} // namespace MeltPoolDG::CompressibleFlow
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....
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