include/meltpooldg/compressible_flow/utils.hpp Source File

Developer Documentation: include/meltpooldg/compressible_flow/utils.hpp Source File
Developer Documentation
utils.hpp
Go to the documentation of this file.
1
5#pragma once
6
7#include <deal.II/base/aligned_vector.h>
8#include <deal.II/base/quadrature.h>
9#include <deal.II/base/tensor.h>
10#include <deal.II/base/vectorization.h>
11
12#include <deal.II/grid/reference_cell.h>
13#include <deal.II/grid/tria_accessor.h>
14#include <deal.II/grid/tria_iterator.h>
15
16#include <deal.II/lac/affine_constraints.h>
17#include <deal.II/lac/la_parallel_vector.h>
18
21#include <meltpooldg/utilities/better_enum.hpp>
23
25{
26 // Forward declaration
27 template <int dim, typename number>
28 class Material;
29
31 BETTER_ENUM(Idx1D, char, density, momentum_x, energy);
32 BETTER_ENUM(Idx2D, char, density, momentum_x, momentum_y, energy);
33 BETTER_ENUM(Idx3D, char, density, momentum_x, momentum_y, momentum_z, energy);
34
42 template <int dim, typename number>
43 inline DEAL_II_ALWAYS_INLINE //
44 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
46
58 template <int dim, typename number>
59 inline DEAL_II_ALWAYS_INLINE //
60 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
62 const ConservedVariablesType<dim, number> &conserved_variables,
63 const ConservedVariablesGradientType<dim, number> &grad_conserved_variables);
64
75 template <int dim, typename Number>
76 void
78 dealii::AlignedVector<dealii::VectorizedArray<Number>> &array_penalty_parameter,
79 const dealii::MatrixFree<dim, Number> &matrix_free,
80 const std::string &domain_representation_type,
81 const unsigned int dof_index = 0,
82 const Number scaling_factor = 1.0);
83
96 template <int dim, typename number>
97 void
99 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
100 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
101 const ScratchData<dim, dim, number> &scratch_data,
102 const unsigned int dof_idx,
103 const unsigned int quad_idx,
104 const Material<dim, number> *material_liquid,
105 const Material<dim, number> *material_gas = nullptr);
106
115 template <int dim, typename number, int n_species = 1>
117 {
118 virtual ~ExternalFlowForce() = default;
119
135 value(number time_step_size,
136 unsigned int cell_batch_id,
137 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
139 };
140
141
142 template <int dim, typename number, int n_species = 1>
144 {
145 virtual ~ExternalFlowForceJacobian() = default;
146
163 value(number time_step_size,
164 unsigned int cell_batch_id,
165 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
168 };
169
170 /********************************************************************************************
171 * Inlined function definitions
172 * *************************************************************************************+****/
173 template <int dim, typename number>
174 inline DEAL_II_ALWAYS_INLINE //
175 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
177 {
178 const dealii::VectorizedArray<number> inverse_density =
179 dealii::VectorizedArray<number>(1.) / conserved_variables[0];
180
181 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity;
182 for (unsigned int d = 0; d < dim; ++d)
183 velocity[d] = conserved_variables[1 + d] * inverse_density;
184
185 return velocity;
186 }
187
188 template <int dim, typename number>
189 inline DEAL_II_ALWAYS_INLINE //
190 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
192 const ConservedVariablesType<dim, number> &conserved_variables,
193 const ConservedVariablesGradientType<dim, number> &grad_conserved_variables)
194 {
195 const dealii::VectorizedArray<number> inverse_density =
196 dealii::VectorizedArray<number>(1.) / conserved_variables[0];
197 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity =
198 calculate_velocity<dim, number>(conserved_variables);
199
200 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> grad_rho;
201 for (unsigned int d = 0; d < dim; ++d)
202 grad_rho[d] = grad_conserved_variables[0][d];
203
204 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> grad_rho_velocity;
205 for (unsigned int d = 0; d < dim; ++d)
206 for (unsigned int e = 0; e < dim; ++e)
207 grad_rho_velocity[d][e] = grad_conserved_variables[1 + d][e];
208
209 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> grad_velocity;
210 for (unsigned int d = 0; d < dim; ++d)
211 for (unsigned int e = 0; e < dim; ++e)
212 grad_velocity[d][e] =
213 inverse_density * (grad_rho_velocity[d][e] - velocity[d] * grad_rho[e]);
214
215 return grad_velocity;
216 }
217
218 template <int dim, typename Number>
219 void
221 dealii::AlignedVector<dealii::VectorizedArray<Number>> &array_penalty_parameter,
222 const dealii::MatrixFree<dim, Number> &matrix_free,
223 const std::string &domain_representation_type,
224 const unsigned int dof_index,
225 const Number scaling_factor)
226 {
227 const unsigned int n_cells = matrix_free.n_cell_batches() + matrix_free.n_ghost_cell_batches();
228 array_penalty_parameter.resize(n_cells);
229
230 dealii::Mapping<dim> const &mapping = *matrix_free.get_mapping_info().mapping;
231 dealii::FiniteElement<dim> const &fe = matrix_free.get_dof_handler(dof_index).get_fe();
232 unsigned int const degree = fe.degree;
233
234 // use penalty factor for hypercube elements according to K. Hillewaert, Development of the
235 // discontinuous Galerkin method for high-resolution, large scale CFD and acoustics in
236 // industrial geometries, PhD thesis, Univ. de Louvain, 2013.
237 const Number fac = scaling_factor * (degree + 1.0) * (degree + 1.0);
238
239 const std::vector<dealii::ReferenceCell<dim>> reference_cells =
240 matrix_free.get_dof_handler(dof_index).get_triangulation().get_reference_cells();
241 AssertThrow(reference_cells.size() == 1, dealii::ExcMessage("No mixed meshes allowed."));
242
243
244 const dealii::Quadrature<dim> quadrature =
245 reference_cells[0].get_gauss_type_quadrature(degree + 1);
246 dealii::FEValues<dim> fe_values(mapping, fe, quadrature, dealii::update_JxW_values);
247
248 const dealii::Quadrature<dim - 1> face_quadrature =
249 reference_cells[0].face_reference_cell(0).get_gauss_type_quadrature(degree + 1);
250 dealii::FEFaceValues<dim> fe_face_values(mapping,
251 fe,
252 face_quadrature,
253 dealii::update_JxW_values);
254
255 if (domain_representation_type == "fitted")
256 {
257 for (unsigned int i = 0; i < n_cells; ++i)
258 {
259 for (unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
260 {
261 typename dealii::DoFHandler<dim>::cell_iterator cell =
262 matrix_free.get_cell_iterator(i, v, dof_index);
263 fe_values.reinit(cell);
264
265 // calculate cell volume
266 Number volume = 0;
267 for (unsigned int q = 0; q < quadrature.size(); ++q)
268 {
269 volume += fe_values.JxW(q);
270 }
271
272 // calculate surface area
273 Number surface_area = 0;
274 for (unsigned int const f : cell->face_indices())
275 {
276 fe_face_values.reinit(cell, f);
277 Number const factor =
278 (cell->at_boundary(f) and not(cell->has_periodic_neighbor(f))) ? 1. : 0.5;
279 for (unsigned int q = 0; q < face_quadrature.size(); ++q)
280 {
281 surface_area += fe_face_values.JxW(q) * factor;
282 }
283 }
284
285 array_penalty_parameter[i][v] = surface_area / volume * fac;
286 }
287 }
288 }
289 else if (domain_representation_type == "cut")
290 {
291 for (unsigned int i = 0; i < n_cells; ++i)
292 {
293 for (unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
294 {
295 typename dealii::DoFHandler<dim>::cell_iterator cell =
296 matrix_free.get_cell_iterator(i, v, dof_index);
297
298 // simplified computation for hypercube elements
299 array_penalty_parameter[i][v] = fac / cell->minimum_vertex_distance();
300 }
301 }
302 }
303 else
304 AssertThrow(false,
305 dealii::ExcMessage("The domain representation type '" +
306 domain_representation_type + "' is not supported."));
307 }
308
309 template <int dim, typename number>
310 void
312 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
313 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
314 const ScratchData<dim, dim, number> &scratch_data,
315 const unsigned int dof_idx,
316 const unsigned int quad_idx,
317 const Material<dim, number> *material_liquid,
318 const Material<dim, number> *material_gas)
319 {
320 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free =
321 scratch_data.get_matrix_free();
322 unsigned int n_support_points_per_cell = scratch_data.get_n_dofs_per_cell(dof_idx) / (dim + 2);
323
324 auto process_cell = [&](CutUtil::CellCategory category,
325 unsigned int first_component,
326 const Material<dim, number> *material,
327 const unsigned int cell_batch) {
328 if (!material)
329 return;
331 matrix_free, dof_idx, quad_idx, first_component, category);
332 eval.reinit(cell_batch);
333 eval.read_dof_values(solution);
334
335 for (unsigned int i = 0; i < n_support_points_per_cell; ++i)
336 {
337 const auto &u_cons = eval.get_dof_value(i);
338 auto u_prim = material->eos_utils->convert_conservative_into_primitive_variables(u_cons);
339 eval.submit_dof_value(u_prim, i);
340 }
341
342 eval.set_dof_values(solution_primitive_variables);
343 };
344
345 if (!matrix_free.get_dof_info(dof_idx).cell_active_fe_index.empty())
346 {
347 // using hp::FECollection (cutFEM/DG)
348 for (unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
349 {
350 const auto cell_category = matrix_free.get_cell_category(cell_batch);
351
352 if (cell_category == CutUtil::CellCategory::liquid)
353 {
354 process_cell(CutUtil::CellCategory::liquid, 0, material_liquid, cell_batch);
355 }
356 else if (cell_category == CutUtil::CellCategory::gas)
357 {
358 process_cell(CutUtil::CellCategory::gas, dim + 2, material_gas, cell_batch);
359 }
360 else if (cell_category == CutUtil::CellCategory::intersected)
361 {
362 process_cell(CutUtil::CellCategory::intersected, 0, material_liquid, cell_batch);
363 process_cell(CutUtil::CellCategory::intersected, dim + 2, material_gas, cell_batch);
364 }
365 }
366 }
367 else
368 {
369 // not using hp::FECollection (fitted mesh)
370 for (unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
371 {
372 process_cell(CutUtil::CellCategory::liquid, 0, material_liquid, cell_batch);
373 }
374 }
375 }
376
377 template <typename DofViewType, typename VectorizedArrayType>
378 inline DEAL_II_ALWAYS_INLINE //
379 VectorizedArrayType
380 maximum_local_wave_speed(const DofViewType &u_m, const DofViewType &u_p)
381 {
382 const auto velocity_m = u_m.velocity();
383 const auto velocity_p = u_p.velocity();
384
385 const auto sound_speed_p = u_p.speed_of_sound();
386 const auto sound_speed_m = u_m.speed_of_sound();
387
388 const auto sound_speed_p2 = sound_speed_p * sound_speed_p;
389 const auto sound_speed_m2 = sound_speed_m * sound_speed_m;
390
391 const auto lambda = 0.5 * std::sqrt(std::max(velocity_p.norm_square() + sound_speed_p2,
392 velocity_m.norm_square() + sound_speed_m2));
393 return lambda;
394 }
395} // namespace MeltPoolDG::CompressibleFlow
A class which provides all relevant material properties for a specific phase.
Definition material_data.hpp:18
Container for shared scratch data between operations/operators.
Definition scratch_data.hpp:61
unsigned int get_n_dofs_per_cell(const unsigned int dof_idx) const
Get the number of DoFs per cell for a given DoFHandler index.
Definition scratch_data.cpp:466
dealii::MatrixFree< dim, number, VectorizedArrayType > & get_matrix_free()
Access the internal MatrixFree object (non-const).
Definition scratch_data.cpp:424
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
DEAL_II_ALWAYS_INLINE VectorizedArrayType maximum_local_wave_speed(const DofViewType &u_m, const DofViewType &u_p)
Definition utils.hpp:380
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, dealii::Tensor< 1, dim, VectorizedArrayType > > ConservedVariablesGradientType
Definition data_types.hpp:44
void calculate_penalty_parameter(dealii::AlignedVector< dealii::VectorizedArray< Number > > &array_penalty_parameter, const dealii::MatrixFree< dim, Number > &matrix_free, const std::string &domain_representation_type, const unsigned int dof_index=0, const Number scaling_factor=1.0)
This function computes the local values of the internal penalty parameter used in the viscous numeric...
Definition utils.hpp:220
DEAL_II_ALWAYS_INLINE dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > calculate_velocity(const ConservedVariablesType< dim, number > &conserved_variables)
Calculate the velocity from the conserved variables by computing u = (ρu)/ρ.
Definition utils.hpp:176
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, VectorizedArrayType > ConservedVariablesType
Definition data_types.hpp:35
void update_primitive_variables_solution(dealii::LinearAlgebra::distributed::Vector< number > &solution_primitive_variables, const dealii::LinearAlgebra::distributed::Vector< number > &solution, const ScratchData< dim, dim, number > &scratch_data, const unsigned int dof_idx, const unsigned int quad_idx, const Material< dim, number > *material_liquid, const Material< dim, number > *material_gas=nullptr)
Update the primitive variable solution according to the current solution vector.
Definition utils.hpp:311
BETTER_ENUM(RampUpType, char, none, linear, exponential, cosine)
Enum for the type of ramp up function used for the velocity at an inflow boundary.
CellCategory
Definition of the cell category numbering (active FE index).
Definition util.hpp:62
@ liquid
Definition util.hpp:63
@ intersected
Definition util.hpp:64
@ gas
Definition util.hpp:65
dealii::FEEvaluation< dim, -1, 0, n_components, number, VectorizedArrayType > FECellIntegrator
Definition fe_integrator.hpp:14
virtual ConservedVariablesType< dim, number, n_species > value(number time_step_size, unsigned int cell_batch_id, const dealii::Point< dim, dealii::VectorizedArray< number > > &points, const ConservedVariablesType< dim, number, n_species > &w, const ConservedVariablesType< dim, number, n_species > &delta_w)=0
An abstract interface for defining external forces acting on the fluid that must be evaluated and inc...
Definition utils.hpp:117
virtual ConservedVariablesType< dim, number, n_species > value(number time_step_size, unsigned int cell_batch_id, const dealii::Point< dim, dealii::VectorizedArray< number > > &points, const ConservedVariablesType< dim, number, n_species > &w)=0