65 typedef dealii::VectorizedArray<Number> scalar;
66 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
67 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
69 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
70 typedef FaceIntegrator<dim, dim, Number> IntegratorFace;
73 ViscousKernel() : quad_index(0), degree(1), tau(dealii::make_vectorized_array<Number>(0.0))
78 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
80 unsigned int const dof_index,
81 unsigned int const quad_index)
85 this->quad_index = quad_index;
87 dealii::FiniteElement<dim>
const & fe = matrix_free.get_dof_handler(dof_index).get_fe();
88 this->degree = fe.degree;
90 calculate_penalty_parameter(matrix_free, dof_index);
92 AssertThrow(data.viscosity >= 0.0, dealii::ExcMessage(
"Viscosity is not set!"));
94 if(data.viscosity_is_variable)
97 viscosity_coefficients.initialize(matrix_free, quad_index,
true,
false);
98 viscosity_coefficients.set_coefficients(data.viscosity);
103 calculate_penalty_parameter(dealii::MatrixFree<dim, Number>
const & matrix_free,
104 unsigned int const dof_index)
106 IP::calculate_penalty_parameter<dim, Number>(array_penalty_parameter, matrix_free, dof_index);
116 get_quad_index()
const
118 return this->quad_index;
128 set_constant_coefficient(Number
const & constant_coefficient)
130 viscosity_coefficients.set_coefficients(constant_coefficient);
134 set_coefficient_cell(
unsigned int const cell,
unsigned int const q, scalar
const & value)
136 viscosity_coefficients.set_coefficient_cell(cell, q, value);
140 get_coefficient_face(
unsigned int const face,
unsigned int const q)
142 return viscosity_coefficients.get_coefficient_face(face, q);
146 set_coefficient_face(
unsigned int const face,
unsigned int const q, scalar
const & value)
148 viscosity_coefficients.set_coefficient_face(face, q, value);
152 get_coefficient_face_neighbor(
unsigned int const face,
unsigned int const q)
154 return viscosity_coefficients.get_coefficient_face_neighbor(face, q);
158 set_coefficient_face_neighbor(
unsigned int const face,
unsigned int const q, scalar
const & value)
160 viscosity_coefficients.set_coefficient_face_neighbor(face, q, value);
164 get_integrator_flags()
const
168 flags.cell_evaluate = dealii::EvaluationFlags::gradients;
169 flags.cell_integrate = dealii::EvaluationFlags::gradients;
171 flags.face_evaluate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
172 flags.face_integrate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
178 get_mapping_flags(
bool const compute_interior_face_integrals,
179 bool const compute_boundary_face_integrals)
183 flags.cells = dealii::update_JxW_values | dealii::update_gradients;
184 if(compute_interior_face_integrals)
186 dealii::update_JxW_values | dealii::update_gradients | dealii::update_normal_vectors;
187 if(compute_boundary_face_integrals)
188 flags.boundary_faces = dealii::update_JxW_values | dealii::update_gradients |
189 dealii::update_normal_vectors | dealii::update_quadrature_points;
195 reinit_face(IntegratorFace & integrator_m,
196 IntegratorFace & integrator_p,
197 unsigned int const dof_index)
const
199 tau = std::max(integrator_m.read_cell_data(array_penalty_parameter),
200 integrator_p.read_cell_data(array_penalty_parameter)) *
201 IP::get_penalty_factor<dim, Number>(
204 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
209 reinit_boundary_face(IntegratorFace & integrator_m,
unsigned int const dof_index)
const
211 tau = integrator_m.read_cell_data(array_penalty_parameter) *
212 IP::get_penalty_factor<dim, Number>(
215 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
220 reinit_face_cell_based(dealii::types::boundary_id
const boundary_id,
221 IntegratorFace & integrator_m,
222 IntegratorFace & integrator_p,
223 unsigned int const dof_index)
const
225 if(boundary_id == dealii::numbers::internal_face_boundary_id)
227 tau = std::max(integrator_m.read_cell_data(array_penalty_parameter),
228 integrator_p.read_cell_data(array_penalty_parameter)) *
229 IP::get_penalty_factor<dim, Number>(
232 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
237 tau = integrator_m.read_cell_data(array_penalty_parameter) *
238 IP::get_penalty_factor<dim, Number>(
241 integrator_m.get_matrix_free().get_dof_handler(dof_index).get_triangulation()),
249 inline DEAL_II_ALWAYS_INLINE
251 get_viscosity_cell(
unsigned int const cell,
unsigned int const q)
const
253 scalar viscosity = dealii::make_vectorized_array<Number>(data.viscosity);
255 if(data.viscosity_is_variable)
257 viscosity = viscosity_coefficients.get_coefficient_cell(cell, q);
266 inline DEAL_II_ALWAYS_INLINE
268 calculate_average_viscosity(
unsigned int const face,
unsigned int const q)
const
270 scalar average_viscosity = dealii::make_vectorized_array<Number>(0.0);
272 scalar coefficient_face = viscosity_coefficients.get_coefficient_face(face, q);
273 scalar coefficient_face_neighbor =
274 viscosity_coefficients.get_coefficient_face_neighbor(face, q);
277 average_viscosity = 2.0 * coefficient_face * coefficient_face_neighbor /
278 (coefficient_face + coefficient_face_neighbor);
286 return average_viscosity;
292 inline DEAL_II_ALWAYS_INLINE
294 get_viscosity_interior_face(
unsigned int const face,
unsigned int const q)
const
296 scalar viscosity = dealii::make_vectorized_array<Number>(data.viscosity);
298 if(data.viscosity_is_variable)
300 viscosity = calculate_average_viscosity(face, q);
309 inline DEAL_II_ALWAYS_INLINE
311 get_viscosity_boundary_face(
unsigned int const face,
unsigned int const q)
const
313 scalar viscosity = dealii::make_vectorized_array<Number>(data.viscosity);
315 if(data.viscosity_is_variable)
317 viscosity = viscosity_coefficients.get_coefficient_face(face, q);
326 inline DEAL_II_ALWAYS_INLINE
328 get_volume_flux(tensor
const & gradient, scalar
const & viscosity)
const
330 if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
332 return viscosity * (gradient + transpose(gradient));
334 else if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
336 return viscosity * gradient;
340 AssertThrow(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation or
341 data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation,
342 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
352 inline DEAL_II_ALWAYS_INLINE
355 vector
const & value_p,
356 vector
const & normal,
357 scalar
const & viscosity)
const
361 vector jump_value = value_m - value_p;
362 tensor jump_tensor = outer_product(jump_value, normal);
364 if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
366 if(data.IP_formulation == InteriorPenaltyFormulation::NIPG)
368 flux = 0.5 * viscosity * jump_tensor;
370 else if(data.IP_formulation == InteriorPenaltyFormulation::SIPG)
372 flux = -0.5 * viscosity * jump_tensor;
377 false, dealii::ExcMessage(
"Specified interior penalty formulation is not implemented."));
380 else if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
382 if(data.IP_formulation == InteriorPenaltyFormulation::NIPG)
384 flux = 0.5 * viscosity * (jump_tensor + transpose(jump_tensor));
386 else if(data.IP_formulation == InteriorPenaltyFormulation::SIPG)
388 flux = -0.5 * viscosity * (jump_tensor + transpose(jump_tensor));
393 false, dealii::ExcMessage(
"Specified interior penalty formulation is not implemented."));
399 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
409 template<
typename Integrator>
410 inline DEAL_II_ALWAYS_INLINE
412 calculate_normal_gradient(
unsigned int const q, Integrator & integrator)
const
416 if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
422 gradient = dealii::make_vectorized_array<Number>(2.0) * integrator.get_symmetric_gradient(q);
424 else if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
429 gradient = integrator.get_gradient(q);
433 AssertThrow(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation or
434 data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation,
435 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
438 vector normal_gradient = gradient * integrator.get_normal_vector(q);
440 return normal_gradient;
450 inline DEAL_II_ALWAYS_INLINE
453 vector
const & normal_gradient_p,
454 vector
const & value_m,
455 vector
const & value_p,
456 vector
const & normal,
457 scalar
const & viscosity)
const
461 vector jump_value = value_m - value_p;
462 vector average_normal_gradient = 0.5 * (normal_gradient_m + normal_gradient_p);
464 if(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation)
466 if(data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::Symmetrized)
468 flux = viscosity * average_normal_gradient -
469 viscosity * tau * (jump_value + (jump_value * normal) * normal);
471 else if(data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::NotSymmetrized)
473 flux = viscosity * average_normal_gradient - viscosity * tau * jump_value;
478 data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::Symmetrized or
479 data.penalty_term_div_formulation == PenaltyTermDivergenceFormulation::NotSymmetrized,
480 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
483 else if(data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation)
485 flux = viscosity * average_normal_gradient - viscosity * tau * jump_value;
489 AssertThrow(data.formulation_viscous_term == FormulationViscousTerm::DivergenceFormulation or
490 data.formulation_viscous_term == FormulationViscousTerm::LaplaceFormulation,
491 dealii::ExcMessage(
"Specified formulation of viscous term is not implemented."));
509 template<
typename Integrator>
510 inline DEAL_II_ALWAYS_INLINE
512 calculate_interior_normal_gradient(
unsigned int const q,
513 Integrator
const & integrator,
514 OperatorType
const & operator_type)
const
516 vector normal_gradient_m;
518 if(operator_type == OperatorType::full or operator_type == OperatorType::homogeneous)
520 normal_gradient_m = calculate_normal_gradient(q, integrator);
522 else if(operator_type == OperatorType::inhomogeneous)
528 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
531 return normal_gradient_m;
535 ViscousKernelData data;
537 unsigned int quad_index;
541 dealii::AlignedVector<scalar> array_penalty_parameter;
545 VariableCoefficients<dealii::VectorizedArray<Number>> viscosity_coefficients;
566 typedef dealii::VectorizedArray<Number> scalar;
567 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
568 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
570 typedef OperatorBase<dim, Number, dim> Base;
572 typedef typename Base::VectorType VectorType;
573 typedef typename Base::Range Range;
574 typedef typename Base::IntegratorCell IntegratorCell;
575 typedef typename Base::IntegratorFace IntegratorFace;
578 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
579 dealii::AffineConstraints<Number>
const & affine_constraints,
588 reinit_face_derived(IntegratorFace & integrator_m,
589 IntegratorFace & integrator_p,
590 unsigned int const face)
const final;
593 reinit_boundary_face_derived(IntegratorFace & integrator_m,
unsigned int const face)
const final;
596 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
597 IntegratorFace & integrator_p,
598 unsigned int const cell,
599 unsigned int const face,
600 dealii::types::boundary_id
const boundary_id)
const final;
603 do_cell_integral(IntegratorCell & integrator)
const final;
606 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
609 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
612 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
615 do_boundary_integral(IntegratorFace & integrator,
616 OperatorType
const & operator_type,
617 dealii::types::boundary_id
const & boundary_id)
const final;
621 std::shared_ptr<Operators::ViscousKernel<dim, Number>> kernel;