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
35 explicit ViscousKernels(const Material<dim, number> &material_in);
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;
50
59 inline DEAL_II_ALWAYS_INLINE //
61 calculate_viscous_flux(const ConservedVariables &conserved_variables,
62 const ConservedVariablesGradient &grad_conserved_variables) const;
63
77 inline DEAL_II_ALWAYS_INLINE //
80 const ConservedVariables &u_m,
81 const ConservedVariables &u_p,
82 const ConservedVariablesGradient &grad_u_m,
83 const ConservedVariablesGradient &grad_u_p,
84 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
85 dealii::VectorizedArray<number> penalty_parameter) const;
86
97 inline DEAL_II_ALWAYS_INLINE //
98 std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
100 const ConservedVariables &u_m,
101 const ConservedVariables &u_p,
102 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal) const;
103
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;
127
140 const ConservedVariablesGradient &grad_w_q,
141 const ConservedVariables &delta_w_q,
142 const ConservedVariablesGradient &grad_delta_w_q) const;
143
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;
162
163 private:
166
169 };
170
171 /********************************************************************************************
172 * Inlined function definitions
173 * *************************************************************************************+****/
174 template <int dim, typename number>
176 : material(material_in)
177 {
178 lambda_div_c = material.data.thermal_conductivity / material.data.specific_gas_constant *
179 (material.data.gamma - 1.0);
180 }
181
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
187 {
188 const dealii::VectorizedArray<number> div_u = 2. / 3. * dealii::trace(grad_u);
189
190 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> out;
191 for (unsigned int d = 0; d < dim; ++d)
192 {
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;
196 }
197
198 return out;
199 }
200
201 template <int dim, typename number>
202 inline DEAL_II_ALWAYS_INLINE //
203 auto
205 const ConservedVariables &conserved_variables,
206 const ConservedVariablesGradient &grad_conserved_variables) const
208 {
209 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity =
210 calculate_velocity<dim, number>(conserved_variables);
211
212 const auto grad_u = calculate_grad_velocity(conserved_variables, grad_conserved_variables);
213
214 const dealii::Tensor<2, dim, dealii::VectorizedArray<number>> viscous_stress =
215 calculate_viscous_stress_tensor(grad_u);
216
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);
220
222 for (unsigned int d = 0; d < dim; ++d)
223 {
224 // density
225 flux[0][d] = 0.0;
226
227 // momentum
228 for (unsigned int e = 0; e < dim; ++e)
229 flux[e + 1][d] = viscous_stress[e][d];
230
231 // energy
232 flux[dim + 1][d] = neg_heat_flux[d];
233
234 for (unsigned int e = 0; e < dim; ++e)
235 flux[dim + 1][d] += velocity[e] * viscous_stress[d][e];
236 }
237
238 return flux;
239 }
240
241 template <int dim, typename number>
242 inline DEAL_II_ALWAYS_INLINE //
243 auto
245 const ConservedVariables &u_m,
246 const ConservedVariables &u_p,
247 const ConservedVariablesGradient &grad_u_m,
248 const ConservedVariablesGradient &grad_u_p,
249 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
250 const dealii::VectorizedArray<number> penalty_parameter) const -> ConservedVariables
251 {
252 const auto flux_m = calculate_viscous_flux(u_m, grad_u_m);
253
254 const auto flux_p = calculate_viscous_flux(u_p, grad_u_p);
255
256 return contract_average_tensor_with_vector<n_conserved_variables<dim>,
257 dim,
258 dealii::VectorizedArray<number>>(flux_m,
259 flux_p,
260 normal) -
261 penalty_parameter * material.data.dynamic_viscosity / material.data.reference_density *
262 (u_m - u_p);
263 }
264
265 template <int dim, typename number>
266 inline DEAL_II_ALWAYS_INLINE //
267 auto
269 const ConservedVariables &u_m,
270 const ConservedVariables &u_p,
271 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal) const
272 -> std::pair<ConservedVariablesGradient, ConservedVariablesGradient>
273 {
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];
278
279 // use jumps instead of gradients for evaluating the viscous flux
280 const ConservedVariablesGradient flux_m = 0.5 * calculate_viscous_flux(u_m, jump_u);
281 const ConservedVariablesGradient flux_p = 0.5 * calculate_viscous_flux(u_p, jump_u);
282
283 return std::make_pair(flux_m, flux_p);
284 }
285
286 template <int dim, typename number>
287 inline DEAL_II_ALWAYS_INLINE //
288 auto
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,
295 dealii::VectorizedArray<number> penalty_parameter) const -> ConservedVariablesGradient
296 {
298 0.5 * calculate_jacobian_viscous_flux(w_q.second,
299 grad_w_q.second,
300 delta_w_q.second,
301 grad_delta_w_q.second);
302 ConservedVariablesGradient flux_m = 0.5 * calculate_jacobian_viscous_flux(w_q.first,
303 grad_w_q.first,
304 delta_w_q.first,
305 grad_delta_w_q.first);
306
308 for (unsigned int i = 0; i < n_conserved_variables<dim>; ++i)
309 flux[i] = (flux_p[i] + flux_m[i]);
310
311 flux -=
312 calculate_jacobian_viscous_numerical_flux_jump_term(delta_w_q, normal, penalty_parameter);
313 return flux;
314 }
315
316 template <int dim, typename number>
317 inline DEAL_II_ALWAYS_INLINE //
318 auto
320 const ConservedVariables &w_q,
321 const ConservedVariablesGradient &grad_w_q,
322 const ConservedVariables &delta_w_q,
323 const ConservedVariablesGradient &grad_delta_w_q) const -> ConservedVariablesGradient
324 {
325 ConservedVariablesGradient viscous_differential_change;
326
327 // precompute values
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)
331 m_q[i] = w_q[i + 1];
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];
335
336 /* change in density flux */
337 viscous_differential_change[0] = dealii::Tensor<1, dim, dealii::VectorizedArray<number>>();
338
339 /* change in momentum flux */
340 // density part
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];
347
348 auto v_q = calculate_velocity<dim, number>(w_q);
349 const auto grad_v_q_temp = calculate_grad_velocity(w_q, grad_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];
354
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]);
358 param_a -= rho_inv * dyadic_product(v_q, grad_delta_w_q[0]);
359
360 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_c =
361 param_a;
362 param_c += transpose(param_a);
363 param_c -= 2. / 3. * trace(param_a) * identity<dim, dealii::VectorizedArray<number>>();
364 param_c *= material.data.dynamic_viscosity;
365
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]);
369
370 dealii::Tensor<1, dim, dealii::Tensor<1, dim, dealii::VectorizedArray<number>>> param_d =
371 param_b;
372 param_d += transpose(param_b);
373 param_d -= 2. / 3. * trace(param_b) * identity<dim, dealii::VectorizedArray<number>>();
374 param_d *= material.data.dynamic_viscosity;
375
376
377 for (unsigned int i = 0; i < dim; ++i)
378 {
379 viscous_differential_change[i + 1] = param_c[i] + param_d[i];
380 }
381
382 /* change in energy density flux */
383 const auto tau_temp = calculate_viscous_stress_tensor(grad_v_q_temp);
384
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];
389 // density part
390 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> rho_energy_density;
391 rho_energy_density += matrix_vector_product(param_c, m_q) * rho_inv;
392 rho_energy_density -= rho_inv * rho_inv * matrix_vector_product(tau, m_q) * delta_w_q[0];
393
394
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] +
400 matrix_vector_product(grad_v_q, m_q) * rho_inv * rho_inv * delta_w_q[0]);
401
402 rho_energy_density -=
403 lambda_div_c * rho_inv * rho_inv *
404 (rho_inv * delta_w_q[0] * matrix_vector_product(dyadic_product(v_q, grad_w_q[0]), m_q) -
405 matrix_vector_product(dyadic_product(v_q, grad_delta_w_q[0]), m_q));
406
407
408 rho_energy_density +=
409 lambda_div_c * rho_inv * rho_inv * delta_w_q[0] * matrix_vector_product(grad_v_q, m_q);
410
411
412 // momentum part
413 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> momentum_energy_density;
414 momentum_energy_density += rho_inv * matrix_vector_product(param_d, m_q);
415 momentum_energy_density += rho_inv * matrix_vector_product(tau, delta_m_q);
416 momentum_energy_density -= lambda_div_c * rho_inv * matrix_vector_product(grad_v_q, delta_m_q);
417 momentum_energy_density -=
418 lambda_div_c * rho_inv * rho_inv * matrix_vector_product(grad_delta_m_q, m_q);
419 momentum_energy_density += lambda_div_c * rho_inv * rho_inv * rho_inv *
420 matrix_vector_product(dyadic_product(delta_m_q, grad_w_q[0]), m_q);
421
422
423 // energy density part
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;
428
429 // build the sum
430 viscous_differential_change[dim + 1] =
431 rho_energy_density + momentum_energy_density + energy_energy_density;
432 return viscous_differential_change;
433 }
434
435 template <int dim, typename number>
436 inline DEAL_II_ALWAYS_INLINE //
437 auto
439 const std::pair<ConservedVariables, ConservedVariables> &delta_w_q,
440 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> &normal,
441 dealii::VectorizedArray<number> penalty_parameter) const -> ConservedVariablesGradient
442 {
444 penalty_parameter * material.data.dynamic_viscosity / material.data.reference_density *
445 identity<n_conserved_variables<dim>, dealii::VectorizedArray<number>>(),
446 dyadic_product(delta_w_q.first - delta_w_q.second, normal));
447 }
448} // namespace MeltPoolDG::CompressibleFlow
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