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
98 template <int dim,
99 typename number,
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 const bool is_viscous)
111 {
112 const auto w_q = evaluator.get_value(q);
113
114 auto flux = convective_terms.calculate_convective_flux(w_q);
115
116 if (is_viscous)
117 {
118 const auto grad_w_q = evaluator.get_gradient(q);
119 flux -= viscous_terms.calculate_viscous_flux(w_q, grad_w_q);
120 }
121
122 dealii::Tensor<1, dim + 2, dealii::VectorizedArray<number>> forcing;
123
124 if (body_force.get() != nullptr)
125 {
126 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> force =
127 constant_body_force ?
128 *constant_body_force :
130 evaluator.quadrature_point(q));
131 for (unsigned int d = 0; d < dim; ++d)
132 forcing[d + 1] = w_q[0] * force[d];
133 for (unsigned int d = 0; d < dim; ++d)
134 forcing[dim + 1] += force[d] * w_q[d + 1];
135 }
136
137 return {forcing, flux};
138 }
139
162 template <int dim,
163 typename number,
164 FaceEvaluatorType<dim, dim + 2, number, dealii::VectorizedArray<number>> Integrator>
165 inline DEAL_II_ALWAYS_INLINE //
166 std::tuple<ConservedVariablesType<dim, number>,
167 ConservedVariablesType<dim, number>,
168 ConservedVariablesGradientType<dim, number>,
169 ConservedVariablesGradientType<dim, number>>
170 rhs_face_integral_kernel(const Integrator &evaluator_m,
171 const Integrator &evaluator_p,
172 const unsigned int q,
173 dealii::VectorizedArray<number> penalty_parameter,
174 const ConvectiveKernels<dim, number> &convective_terms,
175 const ViscousKernels<dim, number> &viscous_terms,
176 const bool is_viscous)
177 {
178 auto numerical_flux =
179 convective_terms.calculate_convective_numerical_flux(evaluator_m.get_value(q),
180 evaluator_p.get_value(q),
181 evaluator_m.normal_vector(q));
182
183 if (is_viscous)
184 numerical_flux -= viscous_terms.calculate_viscous_numerical_flux(evaluator_m.get_value(q),
185 evaluator_p.get_value(q),
186 evaluator_m.get_gradient(q),
187 evaluator_p.get_gradient(q),
188 evaluator_m.normal_vector(q),
189 penalty_parameter);
190
191 std::pair<ConservedVariablesGradientType<dim, number>,
193 viscous_numerical_flux;
194
195 // interior penalty
196 if (is_viscous)
197 {
198 viscous_numerical_flux =
199 viscous_terms.calculate_viscous_numerical_flux_gradient(evaluator_m.get_value(q),
200 evaluator_p.get_value(q),
201 evaluator_m.normal_vector(q));
202 }
203
204 return {-numerical_flux,
205 numerical_flux,
206 viscous_numerical_flux.first,
207 viscous_numerical_flux.second};
208 }
209
233 template <int dim,
234 typename number,
235 FaceEvaluatorType<dim, dim + 2, number, dealii::VectorizedArray<number>> Integrator,
236 bool is_gas_phase = true>
237 inline DEAL_II_ALWAYS_INLINE //
238 std::tuple<ConservedVariablesType<dim, number>, ConservedVariablesGradientType<dim, number>>
239 rhs_boundary_face_integral_kernel(const Integrator &evaluator_m,
240 const unsigned int q,
241 const dealii::types::boundary_id boundary_id,
242 const dealii::VectorizedArray<number> penalty_parameter,
243 const ConvectiveKernels<dim, number> &convective_terms,
244 const ViscousKernels<dim, number> &viscous_terms,
245 const Material<dim, number> &material,
246 const BoundaryConditions<dim, number> &boundary_conditions,
247 const bool is_viscous)
248 {
249 const auto w_m = evaluator_m.get_value(q);
250 const auto normal = evaluator_m.normal_vector(q);
251 const auto grad_w_m = evaluator_m.get_gradient(q);
252
253 const auto [w_p, grad_w_p] = boundary_conditions.get_boundary_face_value_and_gradient(
254 evaluator_m.quadrature_point(q), normal, boundary_id, w_m, grad_w_m, material, is_gas_phase);
255
256 auto flux = convective_terms.calculate_convective_numerical_flux(w_m, w_p, normal);
257
258 if (is_viscous)
259 flux -= viscous_terms.calculate_viscous_numerical_flux(
260 w_m, w_p, grad_w_m, grad_w_p, normal, penalty_parameter);
261
262 ConservedVariablesGradientType<dim, number> numerical_flux_gradient;
263
264 if (is_viscous)
265 {
266 numerical_flux_gradient =
267 viscous_terms.calculate_viscous_numerical_flux_gradient(w_m, w_p, normal).first;
268 }
269
270 return {-flux, numerical_flux_gradient};
271 }
272} // 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_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, const bool is_viscous)
Computes the right-hand side cell integral kernels at a quadrature point.
Definition explicit_time_integration_utils.hpp:103
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 >, 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, const bool is_viscous)
Computes the right-hand side boundary face integral kernels at a boundary face quadrature point.
Definition explicit_time_integration_utils.hpp:239
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, const bool is_viscous)
Computes the right-hand side face integral kernels at a face quadrature point.
Definition explicit_time_integration_utils.hpp:170
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