include/meltpooldg/compressible_flow/explicit_time_integration_utils.hpp Source File

Developer Documentation: include/meltpooldg/compressible_flow/explicit_time_integration_utils.hpp Source File
Developer Documentation
explicit_time_integration_utils.hpp
Go to the documentation of this file.
1
6#pragma once
7
8#include <deal.II/base/tensor.h>
9#include <deal.II/base/vectorization.h>
10
11#include <deal.II/matrix_free/fe_point_evaluation.h>
12
18
19#include <tuple>
20#include <type_traits>
21#include <utility>
22
24{
41 template <typename evaluator_type,
42 int dim,
43 int n_components,
44 typename number,
45 typename VectorizedArrayType>
47 std::is_base_of_v<FECellIntegrator<dim, n_components, number, VectorizedArrayType>,
48 evaluator_type> or
49 std::is_base_of_v<dealii::FEPointEvaluation<n_components, dim, dim, VectorizedArrayType>,
50 evaluator_type>;
51
68 template <typename evaluator_type,
69 int dim,
70 int n_components,
71 typename number,
72 typename VectorizedArrayType>
74 std::is_base_of_v<FEFaceIntegrator<dim, n_components, number, VectorizedArrayType>,
75 evaluator_type> or
76 std::is_base_of_v<dealii::FEFacePointEvaluation<n_components, dim, dim, VectorizedArrayType>,
77 evaluator_type>;
78
97 template <int dim,
98 typename number,
100 bool is_viscous = true>
101 inline DEAL_II_ALWAYS_INLINE //
102 std::tuple<ConservedVariablesType<dim, number>, ConservedVariablesGradientType<dim, number>>
104 const Integrator &evaluator,
105 const unsigned int q,
106 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> *constant_body_force,
107 const ConvectiveKernels<dim, number> &convective_terms,
108 const ViscousKernels<dim, number> &viscous_terms,
109 const std::unique_ptr<dealii::Function<dim>> &body_force)
110 {
111 const auto w_q = evaluator.get_value(q);
112
113 auto flux = convective_terms.calculate_convective_flux(w_q);
114
115 if (is_viscous)
116 {
117 const auto grad_w_q = evaluator.get_gradient(q);
118 flux -= viscous_terms.calculate_viscous_flux(w_q, grad_w_q);
119 }
120
121 dealii::Tensor<1, dim + 2, dealii::VectorizedArray<number>> forcing;
122
123 if (body_force.get() != nullptr)
124 {
125 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> force =
126 constant_body_force ?
127 *constant_body_force :
129 evaluator.quadrature_point(q));
130 for (unsigned int d = 0; d < dim; ++d)
131 forcing[d + 1] = w_q[0] * force[d];
132 for (unsigned int d = 0; d < dim; ++d)
133 forcing[dim + 1] += force[d] * w_q[d + 1];
134 }
135
136 return {forcing, flux};
137 }
138
160 template <int dim,
161 typename number,
162 FaceEvaluatorType<dim, dim + 2, number, dealii::VectorizedArray<number>> Integrator,
163 bool is_viscous = true>
164 inline DEAL_II_ALWAYS_INLINE //
165 std::tuple<ConservedVariablesType<dim, number>,
166 ConservedVariablesType<dim, number>,
167 ConservedVariablesGradientType<dim, number>,
168 ConservedVariablesGradientType<dim, number>>
169 rhs_face_integral_kernel(const Integrator &evaluator_m,
170 const Integrator &evaluator_p,
171 const unsigned int q,
172 dealii::VectorizedArray<number> penalty_parameter,
173 const ConvectiveKernels<dim, number> &convective_terms,
174 const ViscousKernels<dim, number> &viscous_terms)
175 {
176 auto numerical_flux =
177 convective_terms.calculate_convective_numerical_flux(evaluator_m.get_value(q),
178 evaluator_p.get_value(q),
179 evaluator_m.normal_vector(q));
180
181 if (is_viscous)
182 numerical_flux -= viscous_terms.calculate_viscous_numerical_flux(evaluator_m.get_value(q),
183 evaluator_p.get_value(q),
184 evaluator_m.get_gradient(q),
185 evaluator_p.get_gradient(q),
186 evaluator_m.normal_vector(q),
187 penalty_parameter);
188
189 std::pair<ConservedVariablesGradientType<dim, number>,
191 viscous_numerical_flux;
192
193 // interior penalty
194 if (is_viscous)
195 {
196 viscous_numerical_flux =
197 viscous_terms.calculate_viscous_numerical_flux_gradient(evaluator_m.get_value(q),
198 evaluator_p.get_value(q),
199 evaluator_m.normal_vector(q));
200 }
201
202 return {-numerical_flux,
203 numerical_flux,
204 viscous_numerical_flux.first,
205 viscous_numerical_flux.second};
206 }
207
230 template <int dim,
231 typename number,
232 FaceEvaluatorType<dim, dim + 2, number, dealii::VectorizedArray<number>> Integrator,
233 bool is_viscous = true,
234 bool is_gas_phase = true>
235 inline DEAL_II_ALWAYS_INLINE //
236 std::tuple<ConservedVariablesType<dim, number>, ConservedVariablesGradientType<dim, number>>
237 rhs_boundary_face_integral_kernel(const Integrator &evaluator_m,
238 const unsigned int q,
239 const dealii::types::boundary_id boundary_id,
240 const dealii::VectorizedArray<number> penalty_parameter,
241 const ConvectiveKernels<dim, number> &convective_terms,
242 const ViscousKernels<dim, number> &viscous_terms,
243 const Material<dim, number> &material,
244 const BoundaryConditions<dim, number> &boundary_conditions)
245 {
246 const auto w_m = evaluator_m.get_value(q);
247 const auto normal = evaluator_m.normal_vector(q);
248 const auto grad_w_m = evaluator_m.get_gradient(q);
249
250 const auto [w_p, grad_w_p] = boundary_conditions.get_boundary_face_value_and_gradient(
251 evaluator_m.quadrature_point(q), normal, boundary_id, w_m, grad_w_m, material, is_gas_phase);
252
253 auto flux = convective_terms.calculate_convective_numerical_flux(w_m, w_p, normal);
254
255 if (is_viscous)
256 flux -= viscous_terms.calculate_viscous_numerical_flux(
257 w_m, w_p, grad_w_m, grad_w_p, normal, penalty_parameter);
258
259 ConservedVariablesGradientType<dim, number> numerical_flux_gradient;
260
261 if (is_viscous)
262 {
263 numerical_flux_gradient =
264 viscous_terms.calculate_viscous_numerical_flux_gradient(w_m, w_p, normal).first;
265 }
266
267 return {-flux, numerical_flux_gradient};
268 }
269} // namespace MeltPoolDG::CompressibleFlow
Helper class taking care of all boundary condition related computations for the compressible flow sol...
Definition boundary_conditions.hpp:94
std::tuple< ConservedVariables, ConservedVariablesGradient > get_boundary_face_value_and_gradient(const dealii::Point< dim, dealii::VectorizedArray< number > > &q_point, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal, dealii::types::boundary_id boundary_id, const ConservedVariables &w_m, const ConservedVariablesGradient &grad_w_m, const Material< dim, number > &material, bool is_gas_phase=true) const
This function sets the corresponding values on the fictional outer face if the face is located at a b...
Definition boundary_conditions.cpp:84
A class which provides all relevant material properties for a specific phase.
Definition material_data.hpp:18
Concept to check whether a given type conforms to a valid cell evaluator interface.
Definition explicit_time_integration_utils.hpp:46
Concept to check whether a given type conforms to a valid face evaluator interface.
Definition explicit_time_integration_utils.hpp:73
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 std::tuple< ConservedVariablesType< dim, number >, ConservedVariablesGradientType< dim, number > > rhs_boundary_face_integral_kernel(const Integrator &evaluator_m, const unsigned int q, const dealii::types::boundary_id boundary_id, const dealii::VectorizedArray< number > penalty_parameter, const ConvectiveKernels< dim, number > &convective_terms, const ViscousKernels< dim, number > &viscous_terms, const Material< dim, number > &material, const BoundaryConditions< dim, number > &boundary_conditions)
Computes the right-hand side boundary face integral kernels at a boundary face quadrature point.
Definition explicit_time_integration_utils.hpp:237
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, dealii::Tensor< 1, dim, VectorizedArrayType > > ConservedVariablesGradientType
Definition data_types.hpp:44
DEAL_II_ALWAYS_INLINE std::tuple< ConservedVariablesType< dim, number >, ConservedVariablesType< dim, number >, ConservedVariablesGradientType< dim, number >, ConservedVariablesGradientType< dim, number > > rhs_face_integral_kernel(const Integrator &evaluator_m, const Integrator &evaluator_p, const unsigned int q, dealii::VectorizedArray< number > penalty_parameter, const ConvectiveKernels< dim, number > &convective_terms, const ViscousKernels< dim, number > &viscous_terms)
Computes the right-hand side face integral kernels at a face quadrature point.
Definition explicit_time_integration_utils.hpp:169
DEAL_II_ALWAYS_INLINE std::tuple< ConservedVariablesType< dim, number >, ConservedVariablesGradientType< dim, number > > rhs_cell_integral_kernel(const Integrator &evaluator, const unsigned int q, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > *constant_body_force, const ConvectiveKernels< dim, number > &convective_terms, const ViscousKernels< dim, number > &viscous_terms, const std::unique_ptr< dealii::Function< dim > > &body_force)
Computes the right-hand side cell integral kernels at a quadrature point.
Definition explicit_time_integration_utils.hpp:103
dealii::Tensor< 1, n_components, dealii::VectorizedArray< number > > evaluate_function_at_vectorized_points(const dealii::Function< dim > &func, const dealii::Point< dim, dealii::VectorizedArray< number > > &points)
Definition vector_tools.templates.hpp:39
Convective kernel operations for compressible flow solvers.
Definition convective_kernels.hpp:39
DEAL_II_ALWAYS_INLINE ConservedVariablesGradient calculate_convective_flux(const ConservedVariables &conserved_variables) const
Calculate the convective flux F_c.
Definition convective_kernels.hpp:155
DEAL_II_ALWAYS_INLINE ConservedVariables calculate_convective_numerical_flux(const ConservedVariables &u_m, const ConservedVariables &u_p, const dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > &normal) const
Calculate the convective numerical flux F_c^*.
Definition convective_kernels.hpp:178
Viscous kernel operations for compressible flow solvers.
Definition viscous_kernels.hpp:31
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
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
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