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>
23#include <meltpooldg/utilities/better_enum.hpp>
30 BETTER_ENUM(Idx2D,
char, density, momentum_x, momentum_y, energy);
31 BETTER_ENUM(Idx3D,
char, density, momentum_x, momentum_y, momentum_z, energy);
43 template <
int dim,
typename Number>
46 dealii::AlignedVector<dealii::VectorizedArray<Number>> &array_penalty_parameter,
47 const dealii::MatrixFree<dim, Number> &matrix_free,
48 const std::string &domain_representation_type,
49 const unsigned int dof_index = 0,
50 const Number scaling_factor = 1.0);
65 template <
int dim,
typename number,
typename ConservedVariablesType>
68 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
69 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
71 const unsigned int dof_idx,
72 const unsigned int quad_idx,
88 inline DEAL_II_ALWAYS_INLINE
91 WritablePrimitiveValueView &primitive);
105 inline DEAL_II_ALWAYS_INLINE
108 WritableConservativeValueView &conservative);
118 template <
typename DofViewType,
typename VectorizedArrayType>
119 inline DEAL_II_ALWAYS_INLINE
137 template <
typename number,
int n_species,
typename PrimitiveVariablesView>
138 inline std::bitset<dealii::VectorizedArray<number>::size()>
140 const PrimitiveVariablesView &w_view,
141 const unsigned int n_active_lanes = dealii::VectorizedArray<number>::size());
158 template <
int dim,
typename number>
159 inline DEAL_II_ALWAYS_INLINE
160 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
162 const dealii::VectorizedArray<number> &pressure,
173 template <
typename number,
int n_species>
185 template <
int dim,
typename number,
int n_species = 1>
206 unsigned int cell_batch_id,
207 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
212 template <
int dim,
typename number,
int n_species = 1>
234 unsigned int cell_batch_id,
235 const dealii::Point<dim, dealii::VectorizedArray<number>> &points,
243 template <
typename number,
int n_species>
247 for (
unsigned int species = 0; species < n_species; ++species)
248 if (material_data.
species_data[species].dynamic_viscosity > 0.0)
253 template <
typename number,
int n_species,
typename PrimitiveVariablesView>
254 inline std::bitset<dealii::VectorizedArray<number>::size()>
256 const unsigned int n_active_lanes)
258 dealii::VectorizedArray<number> is_admissible = 1.;
260 const auto require_greater_than = [&](
const dealii::VectorizedArray<number> &value,
261 const dealii::VectorizedArray<number> &threshold) {
262 is_admissible = dealii::compare_and_apply_mask<dealii::SIMDComparison::greater_than>(
263 value, threshold, is_admissible, dealii::VectorizedArray<number>(0.));
266 const auto require_less_than = [&](
const dealii::VectorizedArray<number> &value,
267 const dealii::VectorizedArray<number> &threshold) {
268 is_admissible = dealii::compare_and_apply_mask<dealii::SIMDComparison::less_than>(
269 value, threshold, is_admissible, dealii::VectorizedArray<number>(0.));
272 require_greater_than(w_view.density(), dealii::VectorizedArray<number>(0.));
273 require_greater_than(w_view.pressure(), dealii::VectorizedArray<number>(0.));
275 if constexpr (n_species > 1)
277 dealii::VectorizedArray<number> tolerance = 1e-12;
278 for (
unsigned int species = 0; species < n_species; ++species)
282 require_greater_than(w_view.mass_fraction(species), -tolerance);
283 require_less_than(w_view.mass_fraction(species),
284 dealii::VectorizedArray<number>(1.) + tolerance);
289 dealii::VectorizedArray<number> mass_fraction_sum = 0.0;
290 for (
unsigned int species = 0; species < n_species; ++species)
291 mass_fraction_sum += w_view.mass_fraction(species);
293 require_greater_than(mass_fraction_sum, dealii::VectorizedArray<number>(1.) - tolerance);
294 require_less_than(mass_fraction_sum, dealii::VectorizedArray<number>(1.) + tolerance);
297 std::bitset<dealii::VectorizedArray<number>::size()> admissibility_mask;
298 for (
unsigned int lane = 0; lane < n_active_lanes; ++lane)
299 admissibility_mask.set(lane, is_admissible[lane] > 0.);
300 return admissibility_mask;
303 template <
int dim,
typename Number>
306 dealii::AlignedVector<dealii::VectorizedArray<Number>> &array_penalty_parameter,
307 const dealii::MatrixFree<dim, Number> &matrix_free,
308 const std::string &domain_representation_type,
309 const unsigned int dof_index,
310 const Number scaling_factor)
312 const unsigned int n_cells = matrix_free.n_cell_batches() + matrix_free.n_ghost_cell_batches();
313 array_penalty_parameter.resize(n_cells);
315 dealii::Mapping<dim>
const &mapping = *matrix_free.get_mapping_info().mapping;
316 dealii::FiniteElement<dim>
const &fe = matrix_free.get_dof_handler(dof_index).get_fe();
317 unsigned int const degree = fe.degree;
322 const Number fac = scaling_factor * (degree + 1.0) * (degree + 1.0);
324 const std::vector<dealii::ReferenceCell<dim>> reference_cells =
325 matrix_free.get_dof_handler(dof_index).get_triangulation().get_reference_cells();
326 AssertThrow(reference_cells.size() == 1, dealii::ExcMessage(
"No mixed meshes allowed."));
329 const dealii::Quadrature<dim> quadrature =
330 reference_cells[0].get_gauss_type_quadrature(degree + 1);
331 dealii::FEValues<dim> fe_values(mapping, fe, quadrature, dealii::update_JxW_values);
333 const dealii::Quadrature<dim - 1> face_quadrature =
334 reference_cells[0].face_reference_cell(0).get_gauss_type_quadrature(degree + 1);
335 dealii::FEFaceValues<dim> fe_face_values(mapping,
338 dealii::update_JxW_values);
340 if (domain_representation_type ==
"fitted")
342 for (
unsigned int i = 0; i < n_cells; ++i)
344 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
346 typename dealii::DoFHandler<dim>::cell_iterator cell =
347 matrix_free.get_cell_iterator(i, v, dof_index);
348 fe_values.reinit(cell);
352 for (
unsigned int q = 0; q < quadrature.size(); ++q)
354 volume += fe_values.JxW(q);
358 Number surface_area = 0;
359 for (
unsigned int const f : cell->face_indices())
361 fe_face_values.reinit(cell, f);
362 Number
const factor =
363 (cell->at_boundary(f) and not(cell->has_periodic_neighbor(f))) ? 1. : 0.5;
364 for (
unsigned int q = 0; q < face_quadrature.size(); ++q)
366 surface_area += fe_face_values.JxW(q) * factor;
370 array_penalty_parameter[i][v] = surface_area / volume * fac;
374 else if (domain_representation_type ==
"cut")
376 for (
unsigned int i = 0; i < n_cells; ++i)
378 for (
unsigned int v = 0; v < matrix_free.n_active_entries_per_cell_batch(i); ++v)
380 typename dealii::DoFHandler<dim>::cell_iterator cell =
381 matrix_free.get_cell_iterator(i, v, dof_index);
384 array_penalty_parameter[i][v] = fac / cell->minimum_vertex_distance();
390 dealii::ExcMessage(
"The domain representation type '" +
391 domain_representation_type +
"' is not supported."));
394 template <
int dim,
typename number,
typename ConservedVariablesType>
397 dealii::LinearAlgebra::distributed::Vector<number> &solution_primitive_variables,
398 const dealii::LinearAlgebra::distributed::Vector<number> &solution,
400 const unsigned int dof_idx,
401 const unsigned int quad_idx,
408 const dealii::MatrixFree<dim, number, dealii::VectorizedArray<number>> &matrix_free =
410 unsigned int n_support_points_per_cell = scratch_data.
get_n_dofs_per_cell(dof_idx) / (dim + 2);
413 unsigned int first_component,
415 const unsigned int cell_batch) {
419 matrix_free, dof_idx, quad_idx, first_component, category);
420 eval.reinit(cell_batch);
421 eval.read_dof_values(solution);
423 for (
unsigned int i = 0; i < n_support_points_per_cell; ++i)
425 const auto &u_cons = eval.get_dof_value(i);
426 StateView u_cons_view(u_cons, *material);
428 PrimitiveValueView u_prim_view(u_prim_data);
429 conservative_to_primitive<dim, StateView, PrimitiveValueView>(u_cons_view, u_prim_view);
430 eval.submit_dof_value(u_prim_view.value(), i);
433 eval.set_dof_values(solution_primitive_variables);
436 if (!matrix_free.get_dof_info(dof_idx).cell_active_fe_index.empty())
439 for (
unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
441 const auto cell_category = matrix_free.get_cell_category(cell_batch);
461 for (
unsigned int cell_batch = 0; cell_batch < matrix_free.n_cell_batches(); ++cell_batch)
471 inline DEAL_II_ALWAYS_INLINE
474 WritablePrimitiveValueView &primitive)
476 primitive.pressure() = conservative.pressure();
478 for (
unsigned int d = 0; d < dim; ++d)
479 primitive.velocity(d) = conservative.velocity(d);
481 primitive.temperature() = conservative.temperature();
487 inline DEAL_II_ALWAYS_INLINE
490 WritableConservativeValueView &conservative)
492 Flow::dispatch_eos<PrimitiveValueView>(primitive.eos_type(), [&](
auto eos) {
493 eos.template conservative_from_primitive<dim>(conservative, primitive, primitive);
497 template <
typename DofViewType,
typename VectorizedArrayType>
498 inline DEAL_II_ALWAYS_INLINE
502 const auto velocity_m = u_m.velocity();
503 const auto velocity_p = u_p.velocity();
505 const auto sound_speed_p = u_p.speed_of_sound();
506 const auto sound_speed_m = u_m.speed_of_sound();
508 const auto sound_speed_p2 = sound_speed_p * sound_speed_p;
509 const auto sound_speed_m2 = sound_speed_m * sound_speed_m;
511 const auto lambda = 0.5 * std::sqrt(std::max(velocity_p.norm_square() + sound_speed_p2,
512 velocity_m.norm_square() + sound_speed_m2));
516 template <
int dim,
typename number>
517 inline DEAL_II_ALWAYS_INLINE
518 dealii::Tensor<2, dim, dealii::VectorizedArray<number>>
520 const dealii::VectorizedArray<number> &pressure,
525 for (
unsigned int d = 0; d < dim; ++d)
526 stress_tensor[d][d] -= pressure;
528 return stress_tensor;
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
Definition equation_of_state.hpp:24
Definition equation_of_state.hpp:41
Definition equation_of_state.hpp:58
Definition equation_of_state.hpp:75
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 void conservative_to_primitive(const ConservativeValueView &conservative, WritablePrimitiveValueView &primitive)
Convert a state from conservative (density, momentum, total energy) to primitive (pressure,...
Definition utils.hpp:473
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 MaterialPhaseData< number > *material_liquid, const MaterialPhaseData< number > *material_gas=nullptr)
Update the primitive variable solution according to the current solution vector.
Definition utils.hpp:396
DEAL_II_ALWAYS_INLINE dealii::Tensor< 1, dim, dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > > viscous_stress_tensor(const dealii::Tensor< 1, dim, dealii::Tensor< 1, dim, dealii::VectorizedArray< number > > > &grad_velocity, const dealii::VectorizedArray< number > dynamic_viscosity)
Definition kernels.hpp:51
DEAL_II_ALWAYS_INLINE VectorizedArrayType maximum_local_wave_speed(const DofViewType &u_m, const DofViewType &u_p)
Calculate the maximum local wave speed between two states on a face.
Definition utils.hpp:500
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:305
bool is_viscous_flow(const MaterialPhaseData< number > &material_data)
Definition utils.hpp:245
dealii::Tensor< 1, n_conserved_variables< dim, n_species >, VectorizedArrayType > ConservedVariablesType
Definition data_types.hpp:45
DEAL_II_ALWAYS_INLINE dealii::Tensor< 2, dim, dealii::VectorizedArray< number > > calculate_cauchy_stress_tensor(const dealii::VectorizedArray< number > &pressure, const dealii::Tensor< 2, dim, dealii::VectorizedArray< number > > &viscous_stress_tensor)
Calculate the total stress tensor (Cauchy stress tensor) from pressure contribution and viscous stres...
Definition utils.hpp:519
DEAL_II_ALWAYS_INLINE void primitive_to_conservative(const PrimitiveValueView &primitive, WritableConservativeValueView &conservative)
Convert a state from primitive (pressure, velocity, temperature) to conservative (density,...
Definition utils.hpp:489
BETTER_ENUM(RampUpType, char, none, linear, exponential, cosine)
Enum for the type of ramp up function used for the velocity at an inflow boundary.
std::bitset< dealii::VectorizedArray< number >::size()> physical_admissibility_mask(const PrimitiveVariablesView &w_view, const unsigned int n_active_lanes=dealii::VectorizedArray< number >::size())
Definition utils.hpp:255
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
This file provides a collection of view types for the compressible Navier–Stokes solver....
Definition state_views.hpp:114
Definition state_views.hpp:186
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:187
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:140
std::array< MaterialSpeciesData< number >, n_max_species > species_data
Definition material.hpp:160