22#ifndef EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_OPERATORS_WEAK_BOUNDARY_CONDITIONS_H_
23#define EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_OPERATORS_WEAK_BOUNDARY_CONDITIONS_H_
26#include <exadg/functions_and_boundary_conditions/evaluate_functions.h>
27#include <exadg/incompressible_navier_stokes/user_interface/boundary_descriptor.h>
28#include <exadg/incompressible_navier_stokes/user_interface/enum_types.h>
29#include <exadg/matrix_free/integrators.h>
30#include <exadg/operators/operator_type.h>
55template<
int dim,
typename Number>
56inline DEAL_II_ALWAYS_INLINE
57 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
58 calculate_interior_value(
unsigned int const q,
59 FaceIntegrator<dim, dim, Number>
const & integrator,
60 OperatorType
const & operator_type)
63 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> value_m;
65 if(operator_type == OperatorType::full or operator_type == OperatorType::homogeneous)
67 value_m = integrator.get_value(q);
69 else if(operator_type == OperatorType::inhomogeneous)
75 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
81template<
int dim,
typename Number>
82inline DEAL_II_ALWAYS_INLINE
83 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
84 calculate_exterior_value(dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
const & value_m,
86 FaceIntegrator<dim, dim, Number>
const & integrator,
87 OperatorType
const & operator_type,
88 BoundaryTypeU
const & boundary_type,
89 dealii::types::boundary_id
const boundary_id,
94 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> value_p;
96 if(boundary_type == BoundaryTypeU::Dirichlet or boundary_type == BoundaryTypeU::DirichletCached)
98 if(operator_type == OperatorType::full or operator_type == OperatorType::inhomogeneous)
100 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> g;
102 if(boundary_type == BoundaryTypeU::Dirichlet)
104 auto bc = boundary_descriptor->dirichlet_bc.find(boundary_id)->second;
105 auto q_points = integrator.quadrature_point(q);
107 g = FunctionEvaluator<1, dim, Number>::value(*bc, q_points, time);
109 else if(boundary_type == BoundaryTypeU::DirichletCached)
111 auto bc = boundary_descriptor->get_dirichlet_cached_data();
112 g = FunctionEvaluator<1, dim, Number>::value(*bc,
113 integrator.get_current_cell_index(),
115 integrator.get_quadrature_index());
119 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
122 value_p = -value_m + dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>(2.0 * g);
124 else if(operator_type == OperatorType::homogeneous)
130 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
133 else if(boundary_type == BoundaryTypeU::Neumann)
137 else if(boundary_type == BoundaryTypeU::Symmetry)
139 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> normal_m = integrator.normal_vector(q);
141 value_p = value_m - 2.0 * (value_m * normal_m) * normal_m;
145 AssertThrow(
false, dealii::ExcMessage(
"Boundary type of face is invalid or not implemented."));
168template<
int dim,
typename Number>
169inline DEAL_II_ALWAYS_INLINE
170 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
171 calculate_exterior_value_convective(
172 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
const & u_m,
173 unsigned int const q,
174 FaceIntegrator<dim, dim, Number> & integrator,
175 OperatorType
const & operator_type,
176 BoundaryTypeU
const & boundary_type,
177 TypeDirichletBCs
const & type_dirichlet_bc,
178 dealii::types::boundary_id
const boundary_id,
182 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> u_p;
184 if(boundary_type == BoundaryTypeU::Dirichlet or boundary_type == BoundaryTypeU::DirichletCached)
186 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> g;
188 if(operator_type == OperatorType::full or operator_type == OperatorType::inhomogeneous)
190 if(boundary_type == BoundaryTypeU::Dirichlet)
192 auto bc = boundary_descriptor->dirichlet_bc.find(boundary_id)->second;
193 auto q_points = integrator.quadrature_point(q);
195 g = FunctionEvaluator<1, dim, Number>::value(*bc, q_points, time);
197 else if(boundary_type == BoundaryTypeU::DirichletCached)
199 auto bc = boundary_descriptor->get_dirichlet_cached_data();
200 g = FunctionEvaluator<1, dim, Number>::value(*bc,
201 integrator.get_current_cell_index(),
203 integrator.get_quadrature_index());
207 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
211 if(type_dirichlet_bc == TypeDirichletBCs::Mirror)
213 u_p = -u_m + dealii::make_vectorized_array<Number>(2.0) * g;
215 else if(type_dirichlet_bc == TypeDirichletBCs::Direct)
221 AssertThrow(
false, dealii::ExcMessage(
"TypeDirichletBCs is not implemented."));
224 else if(boundary_type == BoundaryTypeU::Neumann)
228 else if(boundary_type == BoundaryTypeU::Symmetry)
230 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> normal_m = integrator.normal_vector(q);
232 u_p = u_m - 2. * (u_m * normal_m) * normal_m;
236 AssertThrow(
false, dealii::ExcMessage(
"Boundary type of face is invalid or not implemented."));
242template<
int dim,
typename Number>
243inline DEAL_II_ALWAYS_INLINE
244 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
245 calculate_exterior_value_from_dof_vector(
246 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
const & value_m,
247 unsigned int const q,
248 FaceIntegrator<dim, dim, Number>
const & integrator_bc,
249 OperatorType
const & operator_type,
250 BoundaryTypeU
const & boundary_type)
253 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> value_p;
255 if(boundary_type == BoundaryTypeU::Dirichlet or boundary_type == BoundaryTypeU::DirichletCached)
257 if(operator_type == OperatorType::full or operator_type == OperatorType::inhomogeneous)
259 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> g = integrator_bc.get_value(q);
261 value_p = -value_m + dealii::make_vectorized_array<Number>(2.0) * g;
263 else if(operator_type == OperatorType::homogeneous)
269 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
272 else if(boundary_type == BoundaryTypeU::Neumann)
276 else if(boundary_type == BoundaryTypeU::Symmetry)
278 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> normal_m =
279 integrator_bc.normal_vector(q);
281 value_p = value_m - 2.0 * (value_m * normal_m) * normal_m;
285 AssertThrow(
false, dealii::ExcMessage(
"Boundary type of face is invalid or not implemented."));
308template<
int dim,
typename Number>
309inline DEAL_II_ALWAYS_INLINE
310 dealii::VectorizedArray<Number>
311 calculate_interior_value(
unsigned int const q,
312 FaceIntegrator<dim, 1, Number>
const & integrator,
313 OperatorType
const & operator_type)
316 dealii::VectorizedArray<Number> value_m = dealii::make_vectorized_array<Number>(0.0);
318 if(operator_type == OperatorType::full or operator_type == OperatorType::homogeneous)
320 value_m = integrator.get_value(q);
322 else if(operator_type == OperatorType::inhomogeneous)
328 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
335template<
int dim,
typename Number>
336inline DEAL_II_ALWAYS_INLINE
337 dealii::VectorizedArray<Number>
338 calculate_exterior_value(dealii::VectorizedArray<Number>
const & value_m,
339 unsigned int const q,
340 FaceIntegrator<dim, 1, Number>
const & integrator,
341 OperatorType
const & operator_type,
342 BoundaryTypeP
const & boundary_type,
343 dealii::types::boundary_id
const boundary_id,
346 double const & inverse_scaling_factor)
348 dealii::VectorizedArray<Number> value_p = dealii::make_vectorized_array<Number>(0.0);
350 if(boundary_type == BoundaryTypeP::Dirichlet)
352 if(operator_type == OperatorType::full or operator_type == OperatorType::inhomogeneous)
354 auto bc = boundary_descriptor->dirichlet_bc.find(boundary_id)->second;
355 auto q_points = integrator.quadrature_point(q);
357 dealii::VectorizedArray<Number> g =
358 FunctionEvaluator<0, dim, Number>::value(*bc, q_points, time);
360 value_p = -value_m + 2.0 * inverse_scaling_factor * g;
362 else if(operator_type == OperatorType::homogeneous)
368 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
371 else if(boundary_type == BoundaryTypeP::Neumann)
377 AssertThrow(
false, dealii::ExcMessage(
"Boundary type of face is invalid or not implemented."));
383template<
int dim,
typename Number>
384inline DEAL_II_ALWAYS_INLINE
385 dealii::VectorizedArray<Number>
386 calculate_exterior_value_from_dof_vector(dealii::VectorizedArray<Number>
const & value_m,
387 unsigned int const q,
388 FaceIntegrator<dim, 1, Number>
const & integrator_bc,
389 OperatorType
const & operator_type,
390 BoundaryTypeP
const & boundary_type,
391 double const & inverse_scaling_factor)
393 dealii::VectorizedArray<Number> value_p = dealii::make_vectorized_array<Number>(0.0);
395 if(boundary_type == BoundaryTypeP::Dirichlet)
397 if(operator_type == OperatorType::full or operator_type == OperatorType::inhomogeneous)
399 dealii::VectorizedArray<Number> g = integrator_bc.get_value(q);
401 value_p = -value_m + 2.0 * inverse_scaling_factor * g;
403 else if(operator_type == OperatorType::homogeneous)
409 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
412 else if(boundary_type == BoundaryTypeP::Neumann)
418 AssertThrow(
false, dealii::ExcMessage(
"Boundary type of face is invalid or not implemented."));
456template<
int dim,
typename Number>
457inline DEAL_II_ALWAYS_INLINE
458 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
459 calculate_exterior_normal_gradient(
460 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>>
const & normal_gradient_m,
461 unsigned int const q,
462 FaceIntegrator<dim, dim, Number>
const & integrator,
463 OperatorType
const & operator_type,
464 BoundaryTypeU
const & boundary_type,
465 dealii::types::boundary_id
const boundary_id,
468 bool const variable_normal_vector)
470 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> normal_gradient_p;
472 if(boundary_type == BoundaryTypeU::Dirichlet or boundary_type == BoundaryTypeU::DirichletCached)
474 normal_gradient_p = normal_gradient_m;
476 else if(boundary_type == BoundaryTypeU::Neumann)
478 if(operator_type == OperatorType::full or operator_type == OperatorType::inhomogeneous)
480 auto bc = boundary_descriptor->neumann_bc.find(boundary_id)->second;
481 auto q_points = integrator.quadrature_point(q);
483 dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> h;
484 if(variable_normal_vector ==
false)
486 h = FunctionEvaluator<1, dim, Number>::value(*bc, q_points, time);
490 auto normals_m = integrator.normal_vector(q);
491 h = FunctionEvaluator<1, dim, Number>::value(
492 *(std::dynamic_pointer_cast<FunctionWithNormal<dim>>(bc)), q_points, normals_m, time);
495 normal_gradient_p = -normal_gradient_m + 2.0 * h;
497 else if(operator_type == OperatorType::homogeneous)
499 normal_gradient_p = -normal_gradient_m;
503 AssertThrow(
false, dealii::ExcMessage(
"Specified OperatorType is not implemented!"));
506 else if(boundary_type == BoundaryTypeU::Symmetry)
508 auto normal_m = integrator.normal_vector(q);
509 normal_gradient_p = -normal_gradient_m + 2.0 * (normal_gradient_m * normal_m) * normal_m;
513 AssertThrow(
false, dealii::ExcMessage(
"Boundary type of face is invalid or not implemented."));
516 return normal_gradient_p;
Definition boundary_descriptor.h:191
Definition boundary_descriptor.h:81