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>
12#include <deal.II/grid/reference_cell.h>
13#include <deal.II/grid/tria_accessor.h>
14#include <deal.II/grid/tria_iterator.h>
16#include <deal.II/lac/affine_constraints.h>
17#include <deal.II/lac/la_parallel_vector.h>
22#include <meltpooldg/utilities/better_enum.hpp>
28 template <
int dim,
typename number>
33 BETTER_ENUM(Idx2D,
char, density, momentum_x, momentum_y, energy);
34 BETTER_ENUM(Idx3D,
char, density, momentum_x, momentum_y, momentum_z, energy);
43 template <
int dim,
typename number>
44 inline DEAL_II_ALWAYS_INLINE
45 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
59 template <
int dim,
typename number>
60 inline DEAL_II_ALWAYS_INLINE
61 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
76 template <
int dim,
typename Number>
79 dealii::AlignedVector<dealii::VectorizedArray<Number>> &array_penalty_parameter,
80 const dealii::MatrixFree<dim, Number> &matrix_free,
81 const std::string &domain_representation_type,
82 const unsigned int dof_index = 0,
83 const Number scaling_factor = 1.0);
97 template <
int dim,
typename number>
100 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
101 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
103 const unsigned int dof_idx,
104 const unsigned int quad_idx,
117 template <
typename number,
int n_species>
129 template <
int dim,
typename number,
int n_species = 1>
150 unsigned int cell_batch_id,
151 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
156 template <
int dim,
typename number,
int n_species = 1>
178 unsigned int cell_batch_id,
179 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
187 template <
int dim,
typename number>
188 inline DEAL_II_ALWAYS_INLINE
189 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
192 const dealii::VectorizedArray<number> inverse_density =
193 dealii::VectorizedArray<number>(1.) / conserved_variables[0];
195 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity;
196 for (
unsigned int d = 0; d < dim; ++d)
197 velocity[d] = conserved_variables[1 + d] * inverse_density;
202 template <
int dim,
typename number>
203 inline DEAL_II_ALWAYS_INLINE
204 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
209 const dealii::VectorizedArray<number> inverse_density =
210 dealii::VectorizedArray<number>(1.) / conserved_variables[0];
211 const dealii::Tensor<1, dim, dealii::VectorizedArray<number>> velocity =
212 calculate_velocity<dim, number>(conserved_variables);
214 dealii::Tensor<1, dim, dealii::VectorizedArray<number>> grad_rho;
215 for (
unsigned int d = 0; d < dim; ++d)
216 grad_rho[d] = grad_conserved_variables[0][d];
218 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> grad_rho_velocity;
219 for (
unsigned int d = 0; d < dim; ++d)
220 for (
unsigned int e = 0; e < dim; ++e)
221 grad_rho_velocity[d][e] = grad_conserved_variables[1 + d][e];
223 dealii::Tensor<2, dim, dealii::VectorizedArray<number>> grad_velocity;
224 for (
unsigned int d = 0; d < dim; ++d)
225 for (
unsigned int e = 0; e < dim; ++e)
226 grad_velocity[d][e] =
227 inverse_density * (grad_rho_velocity[d][e] - velocity[d] * grad_rho[e]);
229 return grad_velocity;
233 template <
typename number,
int n_species>
237 for (
unsigned int species = 0; species < n_species; ++species)
238 if (material_data.
species_data[species].dynamic_viscosity > 0.0)
243 template <
int dim,
typename Number>
246 dealii::AlignedVector<dealii::VectorizedArray<Number>> &array_penalty_parameter,
247 const dealii::MatrixFree<dim, Number> &matrix_free,
248 const std::string &domain_representation_type,
249 const unsigned int dof_index,
250 const Number scaling_factor)
252 const unsigned int n_cells = matrix_free.n_cell_batches() + matrix_free.n_ghost_cell_batches();
253 array_penalty_parameter.resize(n_cells);
255 dealii::Mapping<dim>
const &mapping = *matrix_free.get_mapping_info().mapping;
256 dealii::FiniteElement<dim>
const &fe = matrix_free.get_dof_handler(dof_index).get_fe();
257 unsigned int const degree = fe.degree;
262 const Number fac = scaling_factor * (degree + 1.0) * (degree + 1.0);
264 const std::vector<dealii::ReferenceCell<dim>> reference_cells =
265 matrix_free.get_dof_handler(dof_index).get_triangulation().get_reference_cells();
266 AssertThrow(reference_cells.size() == 1, dealii::ExcMessage(
"No mixed meshes allowed."));
269 const dealii::Quadrature<dim> quadrature =
270 reference_cells[0].get_gauss_type_quadrature(degree + 1);
271 dealii::FEValues<dim> fe_values(mapping, fe, quadrature, dealii::update_JxW_values);
273 const dealii::Quadrature<dim - 1> face_quadrature =
274 reference_cells[0].face_reference_cell(0).get_gauss_type_quadrature(degree + 1);
275 dealii::FEFaceValues<dim> fe_face_values(mapping,
278 dealii::update_JxW_values);
280 if (domain_representation_type ==
"fitted")
282 for (
unsigned int i = 0; i < n_cells; ++i)
284 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
286 typename dealii::DoFHandler<dim>::cell_iterator cell =
287 matrix_free.get_cell_iterator(i, v, dof_index);
288 fe_values.reinit(cell);
292 for (
unsigned int q = 0; q < quadrature.size(); ++q)
294 volume += fe_values.JxW(q);
298 Number surface_area = 0;
299 for (
unsigned int const f : cell->face_indices())
301 fe_face_values.reinit(cell, f);
302 Number
const factor =
303 (cell->at_boundary(f) and not(cell->has_periodic_neighbor(f))) ? 1. : 0.5;
304 for (
unsigned int q = 0; q < face_quadrature.size(); ++q)
306 surface_area += fe_face_values.JxW(q) * factor;
310 array_penalty_parameter[i][v] = surface_area / volume * fac;
314 else if (domain_representation_type ==
"cut")
316 for (
unsigned int i = 0; i < n_cells; ++i)
318 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
320 typename dealii::DoFHandler<dim>::cell_iterator cell =
321 matrix_free.get_cell_iterator(i, v, dof_index);
324 array_penalty_parameter[i][v] = fac / cell->minimum_vertex_distance();
330 dealii::ExcMessage(
"The domain representation type '" +
331 domain_representation_type +
"' is not supported."));
334 template <
int dim,
typename number>
337 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
338 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
340 const unsigned int dof_idx,
341 const unsigned int quad_idx,
345 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free =
347 unsigned int n_support_points_per_cell = scratch_data.
get_n_dofs_per_cell(dof_idx) / (dim + 2);
350 unsigned int first_component,
352 const unsigned int cell_batch) {
356 matrix_free, dof_idx, quad_idx, first_component, category);
357 eval.reinit(cell_batch);
358 eval.read_dof_values(solution);
360 for (
unsigned int i = 0; i < n_support_points_per_cell; ++i)
362 const auto &u_cons = eval.get_dof_value(i);
363 auto u_prim = material->eos_utils->convert_conservative_into_primitive_variables(u_cons);
364 eval.submit_dof_value(u_prim, i);
367 eval.set_dof_values(solution_primitive_variables);
370 if (!matrix_free.get_dof_info(dof_idx).cell_active_fe_index.empty())
373 for (
unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
375 const auto cell_category = matrix_free.get_cell_category(cell_batch);
395 for (
unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
402 template <
typename DofViewType,
typename VectorizedArrayType>
403 inline DEAL_II_ALWAYS_INLINE
407 const auto velocity_m = u_m.velocity();
408 const auto velocity_p = u_p.velocity();
410 const auto sound_speed_p = u_p.speed_of_sound();
411 const auto sound_speed_m = u_m.speed_of_sound();
413 const auto sound_speed_p2 = sound_speed_p * sound_speed_p;
414 const auto sound_speed_m2 = sound_speed_m * sound_speed_m;
416 const auto lambda = 0.5 * std::sqrt(std::max(velocity_p.norm_square() + sound_speed_p2,
417 velocity_m.norm_square() + sound_speed_m2));
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:205
DEAL_II_ALWAYS_INLINE VectorizedArrayType maximum_local_wave_speed(const DofViewType &u_m, const DofViewType &u_p)
Definition utils.hpp:405
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:245
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:190
bool is_viscous_flow(const MaterialPhaseData< number > &material_data)
Definition utils.hpp:235
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:336
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 ~ExternalFlowForceJacobian()=default
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:131
virtual ~ExternalFlowForce()=default
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
Collection of material parameters for a specific fluid phase.
Definition material.hpp:119
std::array< MaterialSpeciesData< number >, n_max_species > species_data
Definition material.hpp:139