66 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
67 typedef dealii::VectorizedArray<Number> scalar;
68 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
69 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
71 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
72 typedef FaceIntegrator<dim, dim, Number> IntegratorFace;
75 ViscousKernel() : quad_index(0), degree(1), tau(dealii::make_vectorized_array<Number>(0.0))
80 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
82 unsigned int const dof_index,
83 unsigned int const quad_index,
84 bool const use_velocity_own_storage)
87 this->quad_index = quad_index;
88 this->use_velocity_own_storage = use_velocity_own_storage;
90 dealii::FiniteElement<dim>
const & fe = matrix_free.get_dof_handler(dof_index).get_fe();
91 this->degree = fe.degree;
93 calculate_penalty_parameter(matrix_free, dof_index);
95 AssertThrow(data.viscosity >= 0.0, dealii::ExcMessage(
"Viscosity is not set!"));
97 if(data.viscosity_is_variable)
100 viscosity_coefficients.initialize(matrix_free, quad_index,
true,
false);
101 viscosity_coefficients.set_coefficients(data.viscosity);
105 if(this->use_velocity_own_storage)
107 matrix_free.initialize_dof_vector(velocity, dof_index);
112 calculate_penalty_parameter(dealii::MatrixFree<dim, Number>
const & matrix_free,
113 unsigned int const dof_index)
115 IP::calculate_penalty_parameter<dim, Number>(array_penalty_parameter, matrix_free, dof_index);
125 get_use_velocity_own_storage()
const
127 return this->use_velocity_own_storage;
133 AssertThrow(this->use_velocity_own_storage,
134 dealii::ExcMessage(
"Velocity vector not stored in the viscous kernel."));
140 set_velocity_copy(VectorType
const & src)
142 AssertThrow(this->use_velocity_own_storage,
143 dealii::ExcMessage(
"Velocity vector not stored in the viscous kernel."));
145 this->velocity = src;
149 get_viscosity_coefficients()
const
151 return &viscosity_coefficients;
155 get_quad_index()
const
157 return this->quad_index;
167 set_constant_coefficient(Number
const & constant_coefficient)
173 set_coefficient_cell(
unsigned int const cell,
unsigned int const q, scalar
const & value)
175 viscosity_coefficients.set_coefficient_cell(cell, q, value);
179 get_coefficient_face(
unsigned int const face,
unsigned int const q)
181 return viscosity_coefficients.get_coefficient_face(face, q);
185 set_coefficient_face(
unsigned int const face,
unsigned int const q, scalar
const & value)
187 viscosity_coefficients.set_coefficient_face(face, q, value);
191 get_coefficient_face_neighbor(
unsigned int const face,
unsigned int const q)
193 return viscosity_coefficients.get_coefficient_face_neighbor(face, q);
197 set_coefficient_face_neighbor(
unsigned int const face,
unsigned int const q, scalar
const & value)
199 viscosity_coefficients.set_coefficient_face_neighbor(face, q, value);
203 get_integrator_flags()
const
207 flags.cell_evaluate = dealii::EvaluationFlags::gradients;
208 flags.cell_integrate = dealii::EvaluationFlags::gradients;
210 flags.face_evaluate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
211 flags.face_integrate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
217 get_mapping_flags(
bool const compute_interior_face_integrals,
218 bool const compute_boundary_face_integrals)
222 flags.cells = dealii::update_JxW_values | dealii::update_gradients;
223 if(compute_interior_face_integrals)
225 dealii::update_JxW_values | dealii::update_gradients | dealii::update_normal_vectors;
226 if(compute_boundary_face_integrals)
227 flags.boundary_faces = dealii::update_JxW_values | dealii::update_gradients |
228 dealii::update_normal_vectors | dealii::update_quadrature_points;
234 reinit_face(IntegratorFace & integrator_m,
235 IntegratorFace & integrator_p,
236 unsigned int const dof_index)
const
238 tau = std::max(integrator_m.read_cell_data(array_penalty_parameter),
239 integrator_p.read_cell_data(array_penalty_parameter)) *
240 IP::get_penalty_factor<dim, Number>(
243 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
248 reinit_boundary_face(IntegratorFace & integrator_m,
unsigned int const dof_index)
const
250 tau = integrator_m.read_cell_data(array_penalty_parameter) *
251 IP::get_penalty_factor<dim, Number>(
254 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
259 reinit_face_cell_based(dealii::types::boundary_id
const boundary_id,
260 IntegratorFace & integrator_m,
261 IntegratorFace & integrator_p,
262 unsigned int const dof_index)
const
264 if(boundary_id == dealii::numbers::internal_face_boundary_id)
266 tau = std::max(integrator_m.read_cell_data(array_penalty_parameter),
267 integrator_p.read_cell_data(array_penalty_parameter)) *
268 IP::get_penalty_factor<dim, Number>(
271 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
276 tau = integrator_m.read_cell_data(array_penalty_parameter) *
277 IP::get_penalty_factor<dim, Number>(
280 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
288 inline DEAL_II_ALWAYS_INLINE
290 get_viscosity_cell(
unsigned int const cell,
unsigned int const q)
const
292 scalar viscosity = dealii::make_vectorized_array<Number>(data.viscosity);
294 if(data.viscosity_is_variable)
296 viscosity = viscosity_coefficients.get_coefficient_cell(cell, q);
305 inline DEAL_II_ALWAYS_INLINE
307 calculate_average_viscosity(
unsigned int const face,
unsigned int const q)
const
309 scalar average_viscosity = dealii::make_vectorized_array<Number>(0.0);
311 scalar coefficient_face = viscosity_coefficients.get_coefficient_face(face, q);
312 scalar coefficient_face_neighbor =
313 viscosity_coefficients.get_coefficient_face_neighbor(face, q);
316 average_viscosity = 2.0 * coefficient_face * coefficient_face_neighbor /
317 (coefficient_face + coefficient_face_neighbor);
325 return average_viscosity;
331 inline DEAL_II_ALWAYS_INLINE
333 get_viscosity_interior_face(
unsigned int const face,
unsigned int const q)
const
335 scalar viscosity = dealii::make_vectorized_array<Number>(data.viscosity);
337 if(data.viscosity_is_variable)
339 viscosity = calculate_average_viscosity(face, q);
348 inline DEAL_II_ALWAYS_INLINE
350 get_viscosity_boundary_face(
unsigned int const face,
unsigned int const q)
const
352 scalar viscosity = dealii::make_vectorized_array<Number>(data.viscosity);
354 if(data.viscosity_is_variable)
356 viscosity = viscosity_coefficients.get_coefficient_face(face, q);
365 inline DEAL_II_ALWAYS_INLINE
367 get_volume_flux(tensor
const & gradient, scalar
const & viscosity)
const
369 if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
371 return viscosity * (gradient + transpose(gradient));
373 else if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
375 return viscosity * gradient;
379 AssertThrow(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation or
380 data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation,
381 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
391 inline DEAL_II_ALWAYS_INLINE
394 vector
const & value_p,
395 vector
const & normal,
396 scalar
const & viscosity)
const
400 vector jump_value = value_m - value_p;
401 tensor jump_tensor = outer_product(jump_value, normal);
403 if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
405 if(data.IP_formulation == InteriorPenaltyFormulation::NIPG)
407 flux = 0.5 * viscosity * jump_tensor;
409 else if(data.IP_formulation == InteriorPenaltyFormulation::SIPG)
411 flux = -0.5 * viscosity * jump_tensor;
416 false, dealii::ExcMessage(
"Specified interior penalty formulation is not implemented."));
419 else if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
421 if(data.IP_formulation == InteriorPenaltyFormulation::NIPG)
423 flux = 0.5 * viscosity * (jump_tensor + transpose(jump_tensor));
425 else if(data.IP_formulation == InteriorPenaltyFormulation::SIPG)
427 flux = -0.5 * viscosity * (jump_tensor + transpose(jump_tensor));
432 false, dealii::ExcMessage(
"Specified interior penalty formulation is not implemented."));
438 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
448 template<
typename Integrator>
449 inline DEAL_II_ALWAYS_INLINE
451 calculate_normal_gradient(
unsigned int const q, Integrator & integrator)
const
455 if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
461 gradient = dealii::make_vectorized_array<Number>(2.0) * integrator.get_symmetric_gradient(q);
463 else if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
468 gradient = integrator.get_gradient(q);
472 AssertThrow(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation or
473 data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation,
474 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
477 vector normal_gradient = gradient * integrator.normal_vector(q);
479 return normal_gradient;
489 inline DEAL_II_ALWAYS_INLINE
492 vector
const & normal_gradient_p,
493 vector
const & value_m,
494 vector
const & value_p,
495 vector
const & normal,
496 scalar
const & viscosity)
const
500 vector jump_value = value_m - value_p;
501 vector average_normal_gradient = 0.5 * (normal_gradient_m + normal_gradient_p);
503 if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
505 if(data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::Symmetrized)
507 flux = viscosity * average_normal_gradient -
508 viscosity * tau * (jump_value + (jump_value * normal) * normal);
510 else if(data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::NotSymmetrized)
512 flux = viscosity * average_normal_gradient - viscosity * tau * jump_value;
517 data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::Symmetrized or
518 data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::NotSymmetrized,
519 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
522 else if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
524 flux = viscosity * average_normal_gradient - viscosity * tau * jump_value;
528 AssertThrow(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation or
529 data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation,
530 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
548 template<
typename Integrator>
549 inline DEAL_II_ALWAYS_INLINE
551 calculate_interior_normal_gradient(
unsigned int const q,
552 Integrator
const & integrator,
553 OperatorType
const & operator_type)
const
555 vector normal_gradient_m;
557 if(operator_type == OperatorType::full or operator_type == OperatorType::homogeneous)
559 normal_gradient_m = calculate_normal_gradient(q, integrator);
561 else if(operator_type == OperatorType::inhomogeneous)
567 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
570 return normal_gradient_m;
574 ViscousKernelData data;
576 unsigned int quad_index;
580 dealii::AlignedVector<scalar> array_penalty_parameter;
584 bool use_velocity_own_storage;
587 VariableCoefficients<dealii::VectorizedArray<Number>> viscosity_coefficients;
608 typedef dealii::VectorizedArray<Number> scalar;
609 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
610 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
612 typedef OperatorBase<dim, Number, dim> Base;
614 typedef typename Base::VectorType VectorType;
615 typedef typename Base::Range Range;
616 typedef typename Base::IntegratorCell IntegratorCell;
617 typedef typename Base::IntegratorFace IntegratorFace;
620 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
621 dealii::AffineConstraints<Number>
const & affine_constraints,
630 reinit_face_derived(IntegratorFace & integrator_m,
631 IntegratorFace & integrator_p,
632 unsigned int const face)
const final;
635 reinit_boundary_face_derived(IntegratorFace & integrator_m,
unsigned int const face)
const final;
638 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
639 IntegratorFace & integrator_p,
640 unsigned int const cell,
641 unsigned int const face,
642 dealii::types::boundary_id
const boundary_id)
const final;
645 do_cell_integral(IntegratorCell & integrator)
const final;
648 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
651 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
654 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
657 do_boundary_integral(IntegratorFace & integrator,
658 OperatorType
const & operator_type,
659 dealii::types::boundary_id
const & boundary_id)
const final;
663 std::shared_ptr<Operators::ViscousKernel<dim, Number>> kernel;