69 typedef dealii::VectorizedArray<Number> scalar;
70 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
71 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
73 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
75 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
76 typedef FaceIntegrator<dim, dim, Number> IntegratorFace;
80 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
82 unsigned int const dof_index,
83 unsigned int const quad_index_linearized,
84 bool const use_own_velocity_storage)
90 std::make_shared<IntegratorCell>(matrix_free, dof_index, quad_index_linearized);
91 integrator_velocity_m =
92 std::make_shared<IntegratorFace>(matrix_free,
true, dof_index, quad_index_linearized);
93 integrator_velocity_p =
94 std::make_shared<IntegratorFace>(matrix_free,
false, dof_index, quad_index_linearized);
98 integrator_grid_velocity =
99 std::make_shared<IntegratorCell>(matrix_free, dof_index, quad_index_linearized);
100 integrator_grid_velocity_face =
101 std::make_shared<IntegratorFace>(matrix_free,
true, dof_index, quad_index_linearized);
104 if(use_own_velocity_storage)
107 matrix_free.initialize_dof_vector(velocity.own(), dof_index);
112 matrix_free.initialize_dof_vector(grid_velocity.own(), dof_index);
114 AssertThrow(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation,
116 "ALE formulation can only be used in combination with ConvectiveFormulation"));
125 flags.cells = dealii::update_JxW_values | dealii::update_gradients;
126 flags.inner_faces = dealii::update_JxW_values | dealii::update_normal_vectors;
127 flags.boundary_faces = dealii::update_JxW_values | dealii::update_normal_vectors;
137 get_integrator_flags()
const
141 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
143 flags.cell_evaluate = dealii::EvaluationFlags::values;
144 flags.cell_integrate = dealii::EvaluationFlags::gradients;
146 flags.face_evaluate = dealii::EvaluationFlags::values;
147 flags.face_integrate = dealii::EvaluationFlags::values;
149 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
151 flags.cell_evaluate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
152 flags.cell_integrate = dealii::EvaluationFlags::values;
154 flags.face_evaluate = dealii::EvaluationFlags::values;
155 flags.face_integrate = dealii::EvaluationFlags::values;
159 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
178 set_velocity_copy(VectorType
const & src)
180 velocity.own() = src;
182 velocity->update_ghost_values();
186 set_velocity_ptr(VectorType
const & src)
190 velocity->update_ghost_values();
194 set_grid_velocity_ptr(VectorType
const & src)
196 grid_velocity.reset(src);
198 grid_velocity->update_ghost_values();
202 get_grid_velocity()
const
204 return *grid_velocity;
207 inline DEAL_II_ALWAYS_INLINE
209 get_velocity_cell(
unsigned int const q)
const
211 return integrator_velocity->get_value(q);
214 inline DEAL_II_ALWAYS_INLINE
216 get_velocity_gradient_cell(
unsigned int const q)
const
218 return integrator_velocity->get_gradient(q);
221 inline DEAL_II_ALWAYS_INLINE
223 get_velocity_m(
unsigned int const q)
const
225 return integrator_velocity_m->get_value(q);
228 inline DEAL_II_ALWAYS_INLINE
230 get_velocity_p(
unsigned int const q)
const
232 return integrator_velocity_p->get_value(q);
236 inline DEAL_II_ALWAYS_INLINE
238 get_grid_velocity_cell(
unsigned int const q)
const
240 return integrator_grid_velocity->get_value(q);
246 inline DEAL_II_ALWAYS_INLINE
248 get_grid_velocity_face(
unsigned int const q)
const
250 return integrator_grid_velocity_face->get_value(q);
255 reinit_cell(
unsigned int const cell)
const
257 integrator_velocity->reinit(cell);
260 integrator_grid_velocity->reinit(cell);
262 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
264 integrator_velocity->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
266 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
268 integrator_velocity->gather_evaluate(*velocity,
269 dealii::EvaluationFlags::values |
270 dealii::EvaluationFlags::gradients);
273 integrator_grid_velocity->gather_evaluate(*grid_velocity, dealii::EvaluationFlags::values);
277 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
282 reinit_face(
unsigned int const face)
const
284 integrator_velocity_m->reinit(face);
285 integrator_velocity_m->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
287 integrator_velocity_p->reinit(face);
288 integrator_velocity_p->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
292 integrator_grid_velocity_face->reinit(face);
293 integrator_grid_velocity_face->gather_evaluate(*grid_velocity,
294 dealii::EvaluationFlags::values);
299 reinit_boundary_face(
unsigned int const face)
const
301 integrator_velocity_m->reinit(face);
302 integrator_velocity_m->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
306 integrator_grid_velocity_face->reinit(face);
307 integrator_grid_velocity_face->gather_evaluate(*grid_velocity,
308 dealii::EvaluationFlags::values);
313 reinit_face_cell_based(
unsigned int const cell,
314 unsigned int const face,
315 dealii::types::boundary_id
const boundary_id)
const
317 integrator_velocity_m->reinit(cell, face);
318 integrator_velocity_m->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
322 integrator_grid_velocity_face->reinit(cell, face);
323 integrator_grid_velocity_face->gather_evaluate(*grid_velocity,
324 dealii::EvaluationFlags::values);
327 if(boundary_id == dealii::numbers::internal_face_boundary_id)
343 inline DEAL_II_ALWAYS_INLINE
345 get_volume_flux_divergence_formulation(vector
const & delta_u,
unsigned int const q)
const
349 vector u = get_velocity_cell(q);
354 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
358 F = outer_product(u, delta_u);
359 F = F + transpose(F);
361 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
363 F = outer_product(delta_u, u);
367 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
375 inline DEAL_II_ALWAYS_INLINE
377 get_volume_flux_convective_formulation(vector
const & delta_u,
378 tensor
const & grad_delta_u,
379 unsigned int const q)
const
389 vector w = get_velocity_cell(q);
390 tensor grad_u = get_velocity_gradient_cell(q);
394 w -= get_grid_velocity_cell(q);
399 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
405 F = grad_u * delta_u + grad_delta_u * w;
407 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
411 F = grad_delta_u * w;
415 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
427 inline DEAL_II_ALWAYS_INLINE
428 std::tuple<vector, vector>
429 calculate_flux_nonlinear_interior_and_neighbor(vector
const & uM,
431 vector
const & normalM,
432 vector
const & u_grid)
const
434 vector flux_m, flux_p;
436 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
438 vector flux = calculate_lax_friedrichs_flux(uM, uP, normalM);
443 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
446 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
448 average_u_normal -= u_grid * normalM;
450 flux = calculate_upwind_flux(uM, uP, average_u_normal);
454 flux_m = flux - average_u_normal * uM;
455 flux_p = -flux + average_u_normal * uP;
459 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
462 return std::make_tuple(flux_m, flux_p);
470 inline DEAL_II_ALWAYS_INLINE
472 calculate_flux_nonlinear_boundary(vector
const & uM,
474 vector
const & normalM,
475 vector
const & u_grid,
476 BoundaryTypeU
const & boundary_type)
const
480 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
482 flux = calculate_lax_friedrichs_flux(uM, uP, normalM);
484 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
485 apply_outflow_bc(flux, uM * normalM);
487 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
489 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
491 average_u_normal -= u_grid * normalM;
493 flux = calculate_upwind_flux(uM, uP, average_u_normal);
495 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
496 apply_outflow_bc(flux, average_u_normal);
500 flux = flux - average_u_normal * uM;
504 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
516 inline DEAL_II_ALWAYS_INLINE
517 std::tuple<vector, vector>
518 calculate_flux_linear_operator_interior_and_neighbor(vector
const & uM,
520 vector
const & delta_uM,
521 vector
const & delta_uP,
522 vector
const & normalM,
523 unsigned int const q)
const
527 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
529 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
533 fluxM = calculate_lax_friedrichs_flux_linearized(uM, uP, delta_uM, delta_uP, normalM);
536 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
538 fluxM = calculate_lax_friedrichs_flux_linear_transport(uM, uP, delta_uM, delta_uP, normalM);
543 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
546 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
550 u_grid = get_grid_velocity_face(q);
552 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
556 vector flux = calculate_upwind_flux_linearized(uM, uP, u_grid, delta_uM, delta_uP, normalM);
558 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
560 average_u_normal -= u_grid * normalM;
562 scalar average_delta_u_normal = 0.5 * (delta_uM + delta_uP) * normalM;
566 fluxM = flux - average_u_normal * delta_uM - average_delta_u_normal * uM;
568 fluxP = -flux + average_u_normal * delta_uP + average_delta_u_normal * uP;
570 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
575 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
577 average_u_normal -= u_grid * normalM;
579 flux = calculate_upwind_flux(delta_uM, delta_uP, average_u_normal);
583 fluxM = flux - average_u_normal * delta_uM;
584 fluxP = -flux + average_u_normal * delta_uP;
588 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
593 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
596 return std::make_tuple(fluxM, fluxP);
603 inline DEAL_II_ALWAYS_INLINE
605 calculate_flux_linear_operator_interior(vector
const & uM,
607 vector
const & delta_uM,
608 vector
const & delta_uP,
609 vector
const & normalM,
610 unsigned int const q)
const
614 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
616 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
619 flux = calculate_lax_friedrichs_flux_linearized(uM, uP, delta_uM, delta_uP, normalM);
621 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
623 flux = calculate_lax_friedrichs_flux_linear_transport(uM, uP, delta_uM, delta_uP, normalM);
627 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
630 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
634 u_grid = get_grid_velocity_face(q);
636 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
640 flux = calculate_upwind_flux_linearized(uM, uP, u_grid, delta_uM, delta_uP, normalM);
642 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
645 average_u_normal -= u_grid * normalM;
647 scalar average_delta_u_normal = 0.5 * (delta_uM + delta_uP) * normalM;
651 flux = flux - average_u_normal * delta_uM - average_delta_u_normal * uM;
653 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
658 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
660 average_u_normal -= u_grid * normalM;
662 flux = calculate_upwind_flux(delta_uM, delta_uP, average_u_normal);
666 flux = flux - average_u_normal * delta_uM;
670 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
675 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
687 inline DEAL_II_ALWAYS_INLINE
689 calculate_flux_linear_operator_boundary(vector
const & uM,
691 vector
const & delta_uM,
692 vector
const & delta_uP,
693 vector
const & normalM,
694 BoundaryTypeU
const & boundary_type,
695 unsigned int const q)
const
699 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
701 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
704 flux = calculate_lax_friedrichs_flux_linearized(uM, uP, delta_uM, delta_uP, normalM);
706 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
707 apply_outflow_bc(flux, uM * normalM);
709 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
711 flux = calculate_lax_friedrichs_flux_linear_transport(uM, uP, delta_uM, delta_uP, normalM);
713 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
714 apply_outflow_bc(flux, uM * normalM);
718 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
721 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
725 u_grid = get_grid_velocity_face(q);
727 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
730 flux = calculate_upwind_flux_linearized(uM, uP, u_grid, delta_uM, delta_uP, normalM);
732 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
734 average_u_normal -= u_grid * normalM;
736 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
737 apply_outflow_bc(flux, average_u_normal);
739 scalar average_delta_u_normal = 0.5 * (delta_uM + delta_uP) * normalM;
743 flux = flux - average_u_normal * delta_uM - average_delta_u_normal * uM;
745 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
750 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
752 average_u_normal -= u_grid * normalM;
754 flux = calculate_upwind_flux(delta_uM, delta_uP, average_u_normal);
756 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
757 apply_outflow_bc(flux, average_u_normal);
761 flux = flux - average_u_normal * delta_uM;
765 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
770 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
783 inline DEAL_II_ALWAYS_INLINE
785 calculate_lambda(scalar
const & uM_n, scalar
const & uP_n)
const
787 return data.upwind_factor * 2.0 * std::max(std::abs(uM_n), std::abs(uP_n));
793 inline DEAL_II_ALWAYS_INLINE
795 calculate_lax_friedrichs_flux(vector
const & uM,
797 vector
const & normalM)
const
799 scalar uM_n = uM * normalM;
800 scalar uP_n = uP * normalM;
802 vector average_normal_flux =
803 dealii::make_vectorized_array<Number>(0.5) * (uM * uM_n + uP * uP_n);
805 vector jump_value = uM - uP;
807 scalar lambda = calculate_lambda(uM_n, uP_n);
809 return (average_normal_flux + 0.5 * lambda * jump_value);
816 inline DEAL_II_ALWAYS_INLINE
818 calculate_lax_friedrichs_flux_linear_transport(vector
const & wM,
822 vector
const & normalM)
const
824 scalar wM_n = wM * normalM;
825 scalar wP_n = wP * normalM;
827 vector average_normal_flux =
828 dealii::make_vectorized_array<Number>(0.5) * (uM * wM_n + uP * wP_n);
830 vector jump_value = uM - uP;
834 scalar lambda = 0.5 * calculate_lambda(wM_n, wP_n);
836 return (average_normal_flux + 0.5 * lambda * jump_value);
842 inline DEAL_II_ALWAYS_INLINE
844 calculate_lax_friedrichs_flux_linearized(vector
const & uM,
846 vector
const & delta_uM,
847 vector
const & delta_uP,
848 vector
const & normalM)
const
850 scalar uM_n = uM * normalM;
851 scalar uP_n = uP * normalM;
853 scalar delta_uM_n = delta_uM * normalM;
854 scalar delta_uP_n = delta_uP * normalM;
856 vector average_normal_flux =
857 dealii::make_vectorized_array<Number>(0.5) *
858 (uM * delta_uM_n + delta_uM * uM_n + uP * delta_uP_n + delta_uP * uP_n);
860 vector jump_value = delta_uM - delta_uP;
862 scalar lambda = calculate_lambda(uM_n, uP_n);
864 return (average_normal_flux + 0.5 * lambda * jump_value);
872 inline DEAL_II_ALWAYS_INLINE
874 calculate_upwind_flux(vector
const & uM,
876 scalar
const & average_normal_velocity)
const
878 vector average_velocity = 0.5 * (uM + uP);
880 vector jump_value = uM - uP;
882 return (average_normal_velocity * average_velocity +
883 data.upwind_factor * 0.5 * std::abs(average_normal_velocity) * jump_value);
889 inline DEAL_II_ALWAYS_INLINE
891 calculate_upwind_flux_linearized(vector
const & uM,
893 vector
const & u_grid,
894 vector
const & delta_uM,
895 vector
const & delta_uP,
896 vector
const & normalM)
const
898 vector average_velocity = 0.5 * (uM + uP);
899 vector delta_average_velocity = 0.5 * (delta_uM + delta_uP);
901 scalar average_normal_velocity = average_velocity * normalM;
903 average_normal_velocity -= u_grid * normalM;
905 scalar delta_average_normal_velocity = delta_average_velocity * normalM;
907 vector jump_value = delta_uM - delta_uP;
909 return (average_normal_velocity * delta_average_velocity +
910 delta_average_normal_velocity * average_velocity +
911 data.upwind_factor * 0.5 * std::abs(average_normal_velocity) * jump_value);
917 inline DEAL_II_ALWAYS_INLINE
919 apply_outflow_bc(vector & flux, scalar
const & normal_velocity)
const
925 scalar outflow_indicator = dealii::make_vectorized_array<Number>(1.0);
927 for(
unsigned int v = 0; v < dealii::VectorizedArray<Number>::size(); ++v)
929 if(normal_velocity[v] < 0.0)
930 outflow_indicator[v] = 0.0;
934 flux = outflow_indicator * flux;
947 std::shared_ptr<IntegratorCell> integrator_velocity;
948 std::shared_ptr<IntegratorFace> integrator_velocity_m;
949 std::shared_ptr<IntegratorFace> integrator_velocity_p;
951 std::shared_ptr<IntegratorCell> integrator_grid_velocity;
952 std::shared_ptr<IntegratorFace> integrator_grid_velocity_face;
985class ConvectiveOperator :
public OperatorBase<dim, Number, dim>
988 typedef dealii::VectorizedArray<Number> scalar;
989 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
990 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
992 typedef ConvectiveOperator<dim, Number> This;
994 typedef OperatorBase<dim, Number, dim> Base;
996 typedef typename Base::VectorType VectorType;
997 typedef typename Base::Range Range;
998 typedef typename Base::IntegratorCell IntegratorCell;
999 typedef typename Base::IntegratorFace IntegratorFace;
1001 ConvectiveOperator()
1006 set_velocity_copy(VectorType
const & src)
const;
1009 set_velocity_ptr(VectorType
const & src)
const;
1011 dealii::LinearAlgebra::distributed::Vector<Number>
const &
1012 get_velocity()
const;
1015 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
1016 dealii::AffineConstraints<Number>
const & affine_constraints,
1024 evaluate_nonlinear_operator(VectorType & dst, VectorType
const & src, Number
const time)
const;
1027 evaluate_nonlinear_operator_add(VectorType & dst,
1028 VectorType
const & src,
1029 Number
const time)
const;
1034 evaluate(VectorType & dst, VectorType
const & src)
const final;
1037 evaluate_add(VectorType & dst, VectorType
const & src)
const final;
1044 cell_loop_nonlinear_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
1046 VectorType
const & src,
1047 Range
const & cell_range)
const;
1050 face_loop_nonlinear_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
1052 VectorType
const & src,
1053 Range
const & face_range)
const;
1056 boundary_face_loop_nonlinear_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
1058 VectorType
const & src,
1059 Range
const & face_range)
const;
1062 do_cell_integral_nonlinear_operator(IntegratorCell & integrator,
1063 IntegratorCell & integrator_u_grid)
const;
1066 do_face_integral_nonlinear_operator(IntegratorFace & integrator_m,
1067 IntegratorFace & integrator_p,
1068 IntegratorFace & integrator_grid_velocity)
const;
1071 do_boundary_integral_nonlinear_operator(IntegratorFace & integrator,
1072 IntegratorFace & integrator_grid_velocity,
1073 dealii::types::boundary_id
const & boundary_id)
const;
1081 reinit_cell_derived(IntegratorCell & integrator,
unsigned int const cell)
const final;
1085 reinit_face_derived(IntegratorFace & integrator_m,
1086 IntegratorFace & integrator_p,
1087 unsigned int const face)
const final;
1091 reinit_boundary_face_derived(IntegratorFace & integrator_m,
unsigned int const face)
const final;
1095 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
1096 IntegratorFace & integrator_p,
1097 unsigned int const cell,
1098 unsigned int const face,
1099 dealii::types::boundary_id
const boundary_id)
const final;
1103 do_cell_integral(IntegratorCell & integrator)
const final;
1107 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
1111 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
1120 do_face_int_integral_cell_based(IntegratorFace & integrator_m,
1121 IntegratorFace & integrator_p)
const final;
1125 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
1129 do_boundary_integral(IntegratorFace & integrator,
1130 OperatorType
const & operator_type,
1131 dealii::types::boundary_id
const & boundary_id)
const final;
1135 std::shared_ptr<Operators::ConvectiveKernel<dim, Number>> kernel;