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>
21#include <meltpooldg/utilities/better_enum.hpp>
27 template <
int dim,
typename number>
32 BETTER_ENUM(Idx2D,
char, density, momentum_x, momentum_y, energy);
33 BETTER_ENUM(Idx3D,
char, density, momentum_x, momentum_y, momentum_z, energy);
42 template <
int dim,
typename number>
43 inline DEAL_II_ALWAYS_INLINE
44 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
58 template <
int dim,
typename number>
59 inline DEAL_II_ALWAYS_INLINE
60 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
75 template <
int dim,
typename Number>
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);
96 template <
int dim,
typename number>
99 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
100 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
102 const unsigned int dof_idx,
103 const unsigned int quad_idx,
115 template <
int dim,
typename number,
int n_species = 1>
136 unsigned int cell_batch_id,
137 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
142 template <
int dim,
typename number,
int n_species = 1>
164 unsigned int cell_batch_id,
165 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
173 template <
int dim,
typename number>
174 inline DEAL_II_ALWAYS_INLINE
175 dealii::Tensor<1, dim, dealii::VectorizedArray<number>>
178 const dealii::VectorizedArray<number> inverse_density =
179 dealii::VectorizedArray<number>(1.) / conserved_variables[0];
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;
188 template <
int dim,
typename number>
189 inline DEAL_II_ALWAYS_INLINE
190 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
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);
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];
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];
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]);
215 return grad_velocity;
218 template <
int dim,
typename Number>
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)
227 const unsigned int n_cells = matrix_free.n_cell_batches() + matrix_free.n_ghost_cell_batches();
228 array_penalty_parameter.resize(n_cells);
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;
237 const Number fac = scaling_factor * (degree + 1.0) * (degree + 1.0);
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."));
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);
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,
253 dealii::update_JxW_values);
255 if (domain_representation_type ==
"fitted")
257 for (
unsigned int i = 0; i < n_cells; ++i)
259 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
261 typename dealii::DoFHandler<dim>::cell_iterator cell =
262 matrix_free.get_cell_iterator(i, v, dof_index);
263 fe_values.reinit(cell);
267 for (
unsigned int q = 0; q < quadrature.size(); ++q)
269 volume += fe_values.JxW(q);
273 Number surface_area = 0;
274 for (
unsigned int const f : cell->face_indices())
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)
281 surface_area += fe_face_values.JxW(q) * factor;
285 array_penalty_parameter[i][v] = surface_area / volume * fac;
289 else if (domain_representation_type ==
"cut")
291 for (
unsigned int i = 0; i < n_cells; ++i)
293 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
295 typename dealii::DoFHandler<dim>::cell_iterator cell =
296 matrix_free.get_cell_iterator(i, v, dof_index);
299 array_penalty_parameter[i][v] = fac / cell->minimum_vertex_distance();
305 dealii::ExcMessage(
"The domain representation type '" +
306 domain_representation_type +
"' is not supported."));
309 template <
int dim,
typename number>
312 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
313 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
315 const unsigned int dof_idx,
316 const unsigned int quad_idx,
320 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free =
322 unsigned int n_support_points_per_cell = scratch_data.
get_n_dofs_per_cell(dof_idx) / (dim + 2);
325 unsigned int first_component,
327 const unsigned int cell_batch) {
331 matrix_free, dof_idx, quad_idx, first_component, category);
332 eval.reinit(cell_batch);
333 eval.read_dof_values(solution);
335 for (
unsigned int i = 0; i < n_support_points_per_cell; ++i)
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);
342 eval.set_dof_values(solution_primitive_variables);
345 if (!matrix_free.get_dof_info(dof_idx).cell_active_fe_index.empty())
348 for (
unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
350 const auto cell_category = matrix_free.get_cell_category(cell_batch);
370 for (
unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
377 template <
typename DofViewType,
typename VectorizedArrayType>
378 inline DEAL_II_ALWAYS_INLINE
382 const auto velocity_m = u_m.velocity();
383 const auto velocity_p = u_p.velocity();
385 const auto sound_speed_p = u_p.speed_of_sound();
386 const auto sound_speed_m = u_m.speed_of_sound();
388 const auto sound_speed_p2 = sound_speed_p * sound_speed_p;
389 const auto sound_speed_m2 = sound_speed_m * sound_speed_m;
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));
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 ~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:117
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