include/meltpooldg/utilities/dg_generic_convection_diffusion_worker.hpp Source File

Developer Documentation: include/meltpooldg/utilities/dg_generic_convection_diffusion_worker.hpp Source File
Developer Documentation
dg_generic_convection_diffusion_worker.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <deal.II/base/tensor.h>
4#include <deal.II/base/vectorization.h>
5
7
33namespace MeltPoolDG::Utils
34{
35
40 template <typename T>
41 concept ConvectionKernelType = requires(const T &kernel) {
42 typename T::ValueType;
43 typename T::PhysicalFluxType;
44
45 {
46 kernel.flux(std::declval<typename T::ValueType>())
47 } -> std::same_as<typename T::PhysicalFluxType>;
48
49 {
50 kernel.local_maximum_wave_speed(std::declval<typename T::ValueType>(),
51 std::declval<typename T::ValueType>())
52 };
53 };
54
62 template <int dim,
63 typename number,
65 typename VectorizedArrayType = dealii::VectorizedArray<number>>
67 {
68 using ValueType = typename Kernel::ValueType;
69 using FluxType = typename Kernel::PhysicalFluxType;
70
76
87 [[nodiscard]] static FluxType
88 cell(const ValueType &u, const Kernel &kernel)
89 {
90 return kernel.flux(u);
91 }
92
106 [[nodiscard]] static FaceFlux
107 face(const ValueType &u_m,
108 const ValueType &u_p,
109 const dealii::Tensor<1, dim, VectorizedArrayType> &normal,
110 const Kernel &kernel)
111 {
112 const FluxType flux_m = kernel.flux(u_m);
113 const FluxType flux_p = kernel.flux(u_p);
114
115 const auto local_maximum_wave_speed = kernel.local_maximum_wave_speed(u_m, u_p);
116
117 const auto lax_friedrichs_flux = contract_average_tensor_with_vector(flux_m, flux_p, normal) +
118 0.5 * local_maximum_wave_speed * (u_m - u_p);
119
120 return FaceFlux{.inner_face_value = -lax_friedrichs_flux,
121 .outer_face_value = lax_friedrichs_flux};
122 }
123 };
124
125 template <typename T>
126 concept DiffusionKernelType = requires(const T &kernel) {
127 typename T::ValueType;
128 typename T::GradientType;
129
130 {
131 kernel.flux(std::declval<typename T::ValueType>(), std::declval<typename T::GradientType>())
132 } -> std::same_as<typename T::GradientType>;
133 };
134
140 template <int dim,
141 typename number,
142 DiffusionKernelType Kernel,
143 typename VectorizedArrayType = dealii::VectorizedArray<number>>
145 {
146 using ValueType = typename Kernel::ValueType;
147 using GradientType = typename Kernel::GradientType;
148
156
168 [[nodiscard]] static GradientType
169 cell(const ValueType &u, const GradientType &grad_u, const Kernel &kernel)
170 {
171 return -1. * kernel.flux(u, grad_u);
172 }
173
191 [[nodiscard]] static FaceFlux
192 face(const ValueType &u_m,
193 const ValueType &u_p,
194 const GradientType &grad_u_m,
195 const GradientType &grad_u_p,
196 const dealii::Tensor<1, dim, VectorizedArrayType> &normal,
197 const VectorizedArrayType penalty_parameter,
198 const Kernel &kernel)
199 {
200 GradientType flux_m = kernel.flux(u_m, grad_u_m);
201 GradientType flux_p = kernel.flux(u_p, grad_u_p);
202
203 const auto value = contract_average_tensor_with_vector(flux_m, flux_p, normal) -
204 penalty_parameter * (u_m - u_p);
205
206
207 GradientType jump_u = jump(u_m, u_p, normal);
208
209 // use jumps instead of gradients for evaluating the diffusive flux
210 const GradientType penalty_flux_m = 0.5 * kernel.flux(u_m, jump_u);
211 const GradientType penalty_flux_p = 0.5 * kernel.flux(u_p, jump_u);
212
213 return FaceFlux{.inner_face_value = value,
214 .outer_face_value = -value,
215 .inner_face_gradient = penalty_flux_m,
216 .outer_face_gradient = penalty_flux_p};
217 }
218 };
219
226 template <int dim,
227 typename number,
228 ConvectionKernelType ConvectiveKernel,
229 DiffusionKernelType DiffusiveKernel,
230 typename VectorizedArrayType = dealii::VectorizedArray<number>>
232 {
237
238 using ValueType = typename DiffusionOperator::ValueType;
239 using GradientType = typename DiffusionOperator::GradientType;
240
248
262 [[nodiscard]] static GradientType
263 cell(const ValueType &u,
264 const GradientType &grad_u,
265 const ConvectiveKernel &convective_kernel,
266 const DiffusiveKernel &diffusion_kernel)
267 {
268 GradientType flux = ConvectionOperator::cell(u, convective_kernel);
269 flux += DiffusionOperator::cell(u, grad_u, diffusion_kernel);
270 return flux;
271 }
272
290 [[nodiscard]] static FaceFlux
291 face(const ValueType &u_m,
292 const ValueType &u_p,
293 const GradientType &grad_u_m,
294 const GradientType &grad_u_p,
295 const dealii::Tensor<1, dim, VectorizedArrayType> &normal,
296 const VectorizedArrayType penalty_parameter,
297 const ConvectiveKernel &convective_kernel,
298 const DiffusiveKernel &diffusion_kernel)
299 {
300 const auto convection_face_value =
301 ConvectionOperator::face(u_m, u_p, normal, convective_kernel);
302 const auto diffusion_face_value = DiffusionOperator::face(
303 u_m, u_p, grad_u_m, grad_u_p, normal, penalty_parameter, diffusion_kernel);
304
305 return FaceFlux{
307 convection_face_value.inner_face_value + diffusion_face_value.inner_face_value,
308 .outer_face_value =
309 convection_face_value.outer_face_value + diffusion_face_value.outer_face_value,
310 .inner_face_gradient = diffusion_face_value.inner_face_gradient,
311 .outer_face_gradient = diffusion_face_value.outer_face_gradient,
312 };
313 }
314 };
315
316} // namespace MeltPoolDG::Utils
Definition dg_generic_convection_diffusion_worker.hpp:41
Definition dg_generic_convection_diffusion_worker.hpp:126
Implementation of functions defined by C++23.
Definition cpp23_functions.h:10
dealii::Tensor< 1, dim_1, number > contract_average_tensor_with_vector(const dealii::Tensor< 1, dim_1, dealii::Tensor< 1, dim_2, number > > &tensor_1, const dealii::Tensor< 1, dim_1, dealii::Tensor< 1, dim_2, number > > &tensor_2, const dealii::Tensor< 1, dim_2, number > &vector)
Definition dealii_tensor.hpp:152
dealii::Tensor< 1, dim1, dealii::Tensor< 1, dim2, number > > jump(const dealii::Tensor< 1, dim1, number > &tensor_m, const dealii::Tensor< 1, dim1, number > &tensor_p, const dealii::Tensor< 1, dim2, number > &normal)
Definition dealii_tensor.hpp:282
Definition dg_generic_convection_diffusion_worker.hpp:242
ValueType outer_face_value
Definition dg_generic_convection_diffusion_worker.hpp:244
GradientType outer_face_gradient
Definition dg_generic_convection_diffusion_worker.hpp:246
GradientType inner_face_gradient
Definition dg_generic_convection_diffusion_worker.hpp:245
ValueType inner_face_value
Definition dg_generic_convection_diffusion_worker.hpp:243
Definition dg_generic_convection_diffusion_worker.hpp:232
static GradientType cell(const ValueType &u, const GradientType &grad_u, const ConvectiveKernel &convective_kernel, const DiffusiveKernel &diffusion_kernel)
Definition dg_generic_convection_diffusion_worker.hpp:263
DGConvectionOperator< dim, number, ConvectiveKernel, VectorizedArrayType > ConvectionOperator
Definition dg_generic_convection_diffusion_worker.hpp:234
typename DiffusionOperator::GradientType GradientType
Definition dg_generic_convection_diffusion_worker.hpp:239
static FaceFlux face(const ValueType &u_m, const ValueType &u_p, const GradientType &grad_u_m, const GradientType &grad_u_p, const dealii::Tensor< 1, dim, VectorizedArrayType > &normal, const VectorizedArrayType penalty_parameter, const ConvectiveKernel &convective_kernel, const DiffusiveKernel &diffusion_kernel)
Definition dg_generic_convection_diffusion_worker.hpp:291
typename DiffusionOperator::ValueType ValueType
Definition dg_generic_convection_diffusion_worker.hpp:238
DGDiffusionOperator< dim, number, DiffusiveKernel, VectorizedArrayType > DiffusionOperator
Definition dg_generic_convection_diffusion_worker.hpp:236
Definition dg_generic_convection_diffusion_worker.hpp:72
ValueType inner_face_value
Definition dg_generic_convection_diffusion_worker.hpp:73
ValueType outer_face_value
Definition dg_generic_convection_diffusion_worker.hpp:74
Definition dg_generic_convection_diffusion_worker.hpp:67
typename Kernel::ValueType ValueType
Definition dg_generic_convection_diffusion_worker.hpp:68
static FaceFlux face(const ValueType &u_m, const ValueType &u_p, const dealii::Tensor< 1, dim, VectorizedArrayType > &normal, const Kernel &kernel)
Definition dg_generic_convection_diffusion_worker.hpp:107
typename Kernel::PhysicalFluxType FluxType
Definition dg_generic_convection_diffusion_worker.hpp:69
static FluxType cell(const ValueType &u, const Kernel &kernel)
Definition dg_generic_convection_diffusion_worker.hpp:88
Definition dg_generic_convection_diffusion_worker.hpp:150
GradientType inner_face_gradient
Definition dg_generic_convection_diffusion_worker.hpp:153
GradientType outer_face_gradient
Definition dg_generic_convection_diffusion_worker.hpp:154
ValueType inner_face_value
Definition dg_generic_convection_diffusion_worker.hpp:151
ValueType outer_face_value
Definition dg_generic_convection_diffusion_worker.hpp:152
Definition dg_generic_convection_diffusion_worker.hpp:145
static FaceFlux face(const ValueType &u_m, const ValueType &u_p, const GradientType &grad_u_m, const GradientType &grad_u_p, const dealii::Tensor< 1, dim, VectorizedArrayType > &normal, const VectorizedArrayType penalty_parameter, const Kernel &kernel)
Definition dg_generic_convection_diffusion_worker.hpp:192
typename Kernel::ValueType ValueType
Definition dg_generic_convection_diffusion_worker.hpp:146
typename Kernel::GradientType GradientType
Definition dg_generic_convection_diffusion_worker.hpp:147
static GradientType cell(const ValueType &u, const GradientType &grad_u, const Kernel &kernel)
Definition dg_generic_convection_diffusion_worker.hpp:169