70 typedef dealii::VectorizedArray<Number> scalar;
71 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
72 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
74 typedef dealii::LinearAlgebra::distributed::Vector<Number> VectorType;
76 typedef CellIntegrator<dim, dim, Number> IntegratorCell;
77 typedef FaceIntegrator<dim, dim, Number> IntegratorFace;
81 reinit(dealii::MatrixFree<dim, Number>
const & matrix_free,
83 unsigned int const dof_index,
84 unsigned int const quad_index_linearized,
85 bool const use_own_velocity_storage)
91 std::make_shared<IntegratorCell>(matrix_free, dof_index, quad_index_linearized);
92 integrator_velocity_m =
93 std::make_shared<IntegratorFace>(matrix_free,
true, dof_index, quad_index_linearized);
94 integrator_velocity_p =
95 std::make_shared<IntegratorFace>(matrix_free,
false, dof_index, quad_index_linearized);
99 integrator_grid_velocity =
100 std::make_shared<IntegratorCell>(matrix_free, dof_index, quad_index_linearized);
101 integrator_grid_velocity_face =
102 std::make_shared<IntegratorFace>(matrix_free,
true, dof_index, quad_index_linearized);
105 if(use_own_velocity_storage)
108 matrix_free.initialize_dof_vector(velocity.own(), dof_index);
113 matrix_free.initialize_dof_vector(grid_velocity.own(), dof_index);
115 AssertThrow(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation,
117 "ALE formulation can only be used in combination with ConvectiveFormulation"));
126 flags.cells = dealii::update_JxW_values | dealii::update_gradients;
127 flags.inner_faces = dealii::update_JxW_values | dealii::update_normal_vectors;
128 flags.boundary_faces = dealii::update_JxW_values | dealii::update_normal_vectors;
138 get_integrator_flags()
const
142 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
144 flags.cell_evaluate = dealii::EvaluationFlags::values;
145 flags.cell_integrate = dealii::EvaluationFlags::gradients;
147 flags.face_evaluate = dealii::EvaluationFlags::values;
148 flags.face_integrate = dealii::EvaluationFlags::values;
150 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
152 flags.cell_evaluate = dealii::EvaluationFlags::values | dealii::EvaluationFlags::gradients;
153 flags.cell_integrate = dealii::EvaluationFlags::values;
155 flags.face_evaluate = dealii::EvaluationFlags::values;
156 flags.face_integrate = dealii::EvaluationFlags::values;
160 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
179 set_velocity_copy(VectorType
const & src)
181 velocity.own() = src;
183 velocity->update_ghost_values();
187 set_velocity_ptr(VectorType
const & src)
191 velocity->update_ghost_values();
195 set_grid_velocity_ptr(VectorType
const & src)
197 grid_velocity.reset(src);
199 grid_velocity->update_ghost_values();
203 get_grid_velocity()
const
205 return *grid_velocity;
208 inline DEAL_II_ALWAYS_INLINE
210 get_velocity_cell(
unsigned int const q)
const
212 return integrator_velocity->get_value(q);
215 inline DEAL_II_ALWAYS_INLINE
217 get_velocity_gradient_cell(
unsigned int const q)
const
219 return integrator_velocity->get_gradient(q);
222 inline DEAL_II_ALWAYS_INLINE
224 get_velocity_m(
unsigned int const q)
const
226 return integrator_velocity_m->get_value(q);
229 inline DEAL_II_ALWAYS_INLINE
231 get_velocity_p(
unsigned int const q)
const
233 return integrator_velocity_p->get_value(q);
237 inline DEAL_II_ALWAYS_INLINE
239 get_grid_velocity_cell(
unsigned int const q)
const
241 return integrator_grid_velocity->get_value(q);
247 inline DEAL_II_ALWAYS_INLINE
249 get_grid_velocity_face(
unsigned int const q)
const
251 return integrator_grid_velocity_face->get_value(q);
256 reinit_cell(
unsigned int const cell)
const
258 integrator_velocity->reinit(cell);
261 integrator_grid_velocity->reinit(cell);
263 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
265 integrator_velocity->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
267 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
269 integrator_velocity->gather_evaluate(*velocity,
270 dealii::EvaluationFlags::values |
271 dealii::EvaluationFlags::gradients);
274 integrator_grid_velocity->gather_evaluate(*grid_velocity, dealii::EvaluationFlags::values);
278 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
283 reinit_face(
unsigned int const face)
const
285 integrator_velocity_m->reinit(face);
286 integrator_velocity_m->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
288 integrator_velocity_p->reinit(face);
289 integrator_velocity_p->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
293 integrator_grid_velocity_face->reinit(face);
294 integrator_grid_velocity_face->gather_evaluate(*grid_velocity,
295 dealii::EvaluationFlags::values);
300 reinit_boundary_face(
unsigned int const face)
const
302 integrator_velocity_m->reinit(face);
303 integrator_velocity_m->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
307 integrator_grid_velocity_face->reinit(face);
308 integrator_grid_velocity_face->gather_evaluate(*grid_velocity,
309 dealii::EvaluationFlags::values);
314 reinit_face_cell_based(
unsigned int const cell,
315 unsigned int const face,
316 dealii::types::boundary_id
const boundary_id)
const
318 integrator_velocity_m->reinit(cell, face);
319 integrator_velocity_m->gather_evaluate(*velocity, dealii::EvaluationFlags::values);
323 integrator_grid_velocity_face->reinit(cell, face);
324 integrator_grid_velocity_face->gather_evaluate(*grid_velocity,
325 dealii::EvaluationFlags::values);
328 if(boundary_id == dealii::numbers::internal_face_boundary_id)
344 inline DEAL_II_ALWAYS_INLINE
346 get_volume_flux_divergence_formulation(vector
const & delta_u,
unsigned int const q)
const
350 vector u = get_velocity_cell(q);
355 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
359 F = outer_product(u, delta_u);
360 F = F + transpose(F);
362 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
364 F = outer_product(delta_u, u);
368 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
376 inline DEAL_II_ALWAYS_INLINE
378 get_volume_flux_convective_formulation(vector
const & delta_u,
379 tensor
const & grad_delta_u,
380 unsigned int const q)
const
390 vector w = get_velocity_cell(q);
391 tensor grad_u = get_velocity_gradient_cell(q);
395 w -= get_grid_velocity_cell(q);
400 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
406 F = grad_u * delta_u + grad_delta_u * w;
408 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
412 F = grad_delta_u * w;
416 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
428 inline DEAL_II_ALWAYS_INLINE
429 std::tuple<vector, vector>
430 calculate_flux_nonlinear_interior_and_neighbor(vector
const & uM,
432 vector
const & normalM,
433 vector
const & u_grid)
const
435 vector flux_m, flux_p;
437 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
439 vector flux = calculate_lax_friedrichs_flux(uM, uP, normalM);
444 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
447 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
449 average_u_normal -= u_grid * normalM;
451 flux = calculate_upwind_flux(uM, uP, average_u_normal);
455 flux_m = flux - average_u_normal * uM;
456 flux_p = -flux + average_u_normal * uP;
460 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
463 return std::make_tuple(flux_m, flux_p);
471 inline DEAL_II_ALWAYS_INLINE
473 calculate_flux_nonlinear_boundary(vector
const & uM,
475 vector
const & normalM,
476 vector
const & u_grid,
477 BoundaryTypeU
const & boundary_type)
const
481 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
483 flux = calculate_lax_friedrichs_flux(uM, uP, normalM);
485 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
486 apply_outflow_bc(flux, uM * normalM);
488 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
490 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
492 average_u_normal -= u_grid * normalM;
494 flux = calculate_upwind_flux(uM, uP, average_u_normal);
496 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
497 apply_outflow_bc(flux, average_u_normal);
501 flux = flux - average_u_normal * uM;
505 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
517 inline DEAL_II_ALWAYS_INLINE
518 std::tuple<vector, vector>
519 calculate_flux_linear_operator_interior_and_neighbor(vector
const & uM,
521 vector
const & delta_uM,
522 vector
const & delta_uP,
523 vector
const & normalM,
524 unsigned int const q)
const
528 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
530 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
534 fluxM = calculate_lax_friedrichs_flux_linearized(uM, uP, delta_uM, delta_uP, normalM);
537 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
539 fluxM = calculate_lax_friedrichs_flux_linear_transport(uM, uP, delta_uM, delta_uP, normalM);
544 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
547 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
551 u_grid = get_grid_velocity_face(q);
553 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
557 vector flux = calculate_upwind_flux_linearized(uM, uP, u_grid, delta_uM, delta_uP, normalM);
559 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
561 average_u_normal -= u_grid * normalM;
563 scalar average_delta_u_normal = 0.5 * (delta_uM + delta_uP) * normalM;
567 fluxM = flux - average_u_normal * delta_uM - average_delta_u_normal * uM;
569 fluxP = -flux + average_u_normal * delta_uP + average_delta_u_normal * uP;
571 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
576 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
578 average_u_normal -= u_grid * normalM;
580 flux = calculate_upwind_flux(delta_uM, delta_uP, average_u_normal);
584 fluxM = flux - average_u_normal * delta_uM;
585 fluxP = -flux + average_u_normal * delta_uP;
589 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
594 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
597 return std::make_tuple(fluxM, fluxP);
604 inline DEAL_II_ALWAYS_INLINE
606 calculate_flux_linear_operator_interior(vector
const & uM,
608 vector
const & delta_uM,
609 vector
const & delta_uP,
610 vector
const & normalM,
611 unsigned int const q)
const
615 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
617 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
620 flux = calculate_lax_friedrichs_flux_linearized(uM, uP, delta_uM, delta_uP, normalM);
622 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
624 flux = calculate_lax_friedrichs_flux_linear_transport(uM, uP, delta_uM, delta_uP, normalM);
628 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
631 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
635 u_grid = get_grid_velocity_face(q);
637 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
641 flux = calculate_upwind_flux_linearized(uM, uP, u_grid, delta_uM, delta_uP, normalM);
643 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
646 average_u_normal -= u_grid * normalM;
648 scalar average_delta_u_normal = 0.5 * (delta_uM + delta_uP) * normalM;
652 flux = flux - average_u_normal * delta_uM - average_delta_u_normal * uM;
654 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
659 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
661 average_u_normal -= u_grid * normalM;
663 flux = calculate_upwind_flux(delta_uM, delta_uP, average_u_normal);
667 flux = flux - average_u_normal * delta_uM;
671 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
676 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
688 inline DEAL_II_ALWAYS_INLINE
690 calculate_flux_linear_operator_boundary(vector
const & uM,
692 vector
const & delta_uM,
693 vector
const & delta_uP,
694 vector
const & normalM,
695 BoundaryTypeU
const & boundary_type,
696 unsigned int const q)
const
700 if(data.formulation == FormulationConvectiveTerm::DivergenceFormulation)
702 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
705 flux = calculate_lax_friedrichs_flux_linearized(uM, uP, delta_uM, delta_uP, normalM);
707 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
708 apply_outflow_bc(flux, uM * normalM);
710 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
712 flux = calculate_lax_friedrichs_flux_linear_transport(uM, uP, delta_uM, delta_uP, normalM);
714 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
715 apply_outflow_bc(flux, uM * normalM);
719 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
722 else if(data.formulation == FormulationConvectiveTerm::ConvectiveFormulation)
726 u_grid = get_grid_velocity_face(q);
728 if(data.temporal_treatment == TreatmentOfConvectiveTerm::Implicit)
731 flux = calculate_upwind_flux_linearized(uM, uP, u_grid, delta_uM, delta_uP, normalM);
733 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
735 average_u_normal -= u_grid * normalM;
737 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
738 apply_outflow_bc(flux, average_u_normal);
740 scalar average_delta_u_normal = 0.5 * (delta_uM + delta_uP) * normalM;
744 flux = flux - average_u_normal * delta_uM - average_delta_u_normal * uM;
746 else if(data.temporal_treatment == TreatmentOfConvectiveTerm::LinearlyImplicit)
751 scalar average_u_normal = 0.5 * (uM + uP) * normalM;
753 average_u_normal -= u_grid * normalM;
755 flux = calculate_upwind_flux(delta_uM, delta_uP, average_u_normal);
757 if(boundary_type == BoundaryTypeU::Neumann and data.use_outflow_bc ==
true)
758 apply_outflow_bc(flux, average_u_normal);
762 flux = flux - average_u_normal * delta_uM;
766 AssertThrow(
false, dealii::ExcMessage(
"not implemented"));
771 AssertThrow(
false, dealii::ExcMessage(
"Not implemented."));
784 inline DEAL_II_ALWAYS_INLINE
786 calculate_lambda(scalar
const & uM_n, scalar
const & uP_n)
const
788 return data.upwind_factor * 2.0 * std::max(std::abs(uM_n), std::abs(uP_n));
794 inline DEAL_II_ALWAYS_INLINE
796 calculate_lax_friedrichs_flux(vector
const & uM,
798 vector
const & normalM)
const
800 scalar uM_n = uM * normalM;
801 scalar uP_n = uP * normalM;
803 vector average_normal_flux =
804 dealii::make_vectorized_array<Number>(0.5) * (uM * uM_n + uP * uP_n);
806 vector jump_value = uM - uP;
808 scalar lambda = calculate_lambda(uM_n, uP_n);
810 return (average_normal_flux + 0.5 * lambda * jump_value);
817 inline DEAL_II_ALWAYS_INLINE
819 calculate_lax_friedrichs_flux_linear_transport(vector
const & wM,
823 vector
const & normalM)
const
825 scalar wM_n = wM * normalM;
826 scalar wP_n = wP * normalM;
828 vector average_normal_flux =
829 dealii::make_vectorized_array<Number>(0.5) * (uM * wM_n + uP * wP_n);
831 vector jump_value = uM - uP;
835 scalar lambda = 0.5 * calculate_lambda(wM_n, wP_n);
837 return (average_normal_flux + 0.5 * lambda * jump_value);
843 inline DEAL_II_ALWAYS_INLINE
845 calculate_lax_friedrichs_flux_linearized(vector
const & uM,
847 vector
const & delta_uM,
848 vector
const & delta_uP,
849 vector
const & normalM)
const
851 scalar uM_n = uM * normalM;
852 scalar uP_n = uP * normalM;
854 scalar delta_uM_n = delta_uM * normalM;
855 scalar delta_uP_n = delta_uP * normalM;
857 vector average_normal_flux =
858 dealii::make_vectorized_array<Number>(0.5) *
859 (uM * delta_uM_n + delta_uM * uM_n + uP * delta_uP_n + delta_uP * uP_n);
861 vector jump_value = delta_uM - delta_uP;
863 scalar lambda = calculate_lambda(uM_n, uP_n);
865 return (average_normal_flux + 0.5 * lambda * jump_value);
873 inline DEAL_II_ALWAYS_INLINE
875 calculate_upwind_flux(vector
const & uM,
877 scalar
const & average_normal_velocity)
const
879 vector average_velocity = 0.5 * (uM + uP);
881 vector jump_value = uM - uP;
883 return (average_normal_velocity * average_velocity +
884 data.upwind_factor * 0.5 * std::abs(average_normal_velocity) * jump_value);
890 inline DEAL_II_ALWAYS_INLINE
892 calculate_upwind_flux_linearized(vector
const & uM,
894 vector
const & u_grid,
895 vector
const & delta_uM,
896 vector
const & delta_uP,
897 vector
const & normalM)
const
899 vector average_velocity = 0.5 * (uM + uP);
900 vector delta_average_velocity = 0.5 * (delta_uM + delta_uP);
902 scalar average_normal_velocity = average_velocity * normalM;
904 average_normal_velocity -= u_grid * normalM;
906 scalar delta_average_normal_velocity = delta_average_velocity * normalM;
908 vector jump_value = delta_uM - delta_uP;
910 return (average_normal_velocity * delta_average_velocity +
911 delta_average_normal_velocity * average_velocity +
912 data.upwind_factor * 0.5 * std::abs(average_normal_velocity) * jump_value);
918 inline DEAL_II_ALWAYS_INLINE
920 apply_outflow_bc(vector & flux, scalar
const & normal_velocity)
const
926 scalar outflow_indicator = dealii::make_vectorized_array<Number>(1.0);
928 for(
unsigned int v = 0; v < dealii::VectorizedArray<Number>::size(); ++v)
930 if(normal_velocity[v] < 0.0)
931 outflow_indicator[v] = 0.0;
935 flux = outflow_indicator * flux;
948 std::shared_ptr<IntegratorCell> integrator_velocity;
949 std::shared_ptr<IntegratorFace> integrator_velocity_m;
950 std::shared_ptr<IntegratorFace> integrator_velocity_p;
952 std::shared_ptr<IntegratorCell> integrator_grid_velocity;
953 std::shared_ptr<IntegratorFace> integrator_grid_velocity_face;
986class ConvectiveOperator :
public OperatorBase<dim, Number, dim>
989 typedef dealii::VectorizedArray<Number> scalar;
990 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
991 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
993 typedef ConvectiveOperator<dim, Number> This;
995 typedef OperatorBase<dim, Number, dim> Base;
997 typedef typename Base::VectorType VectorType;
998 typedef typename Base::Range Range;
999 typedef typename Base::IntegratorCell IntegratorCell;
1000 typedef typename Base::IntegratorFace IntegratorFace;
1002 ConvectiveOperator()
1007 set_velocity_copy(VectorType
const & src)
const;
1010 set_velocity_ptr(VectorType
const & src)
const;
1012 dealii::LinearAlgebra::distributed::Vector<Number>
const &
1013 get_velocity()
const;
1016 initialize(dealii::MatrixFree<dim, Number>
const & matrix_free,
1017 dealii::AffineConstraints<Number>
const & affine_constraints,
1025 evaluate_nonlinear_operator(VectorType & dst, VectorType
const & src, Number
const time)
const;
1028 evaluate_nonlinear_operator_add(VectorType & dst,
1029 VectorType
const & src,
1030 Number
const time)
const;
1035 evaluate(VectorType & dst, VectorType
const & src)
const final;
1038 evaluate_add(VectorType & dst, VectorType
const & src)
const final;
1045 cell_loop_nonlinear_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
1047 VectorType
const & src,
1048 Range
const & cell_range)
const;
1051 face_loop_nonlinear_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
1053 VectorType
const & src,
1054 Range
const & face_range)
const;
1057 boundary_face_loop_nonlinear_operator(dealii::MatrixFree<dim, Number>
const & matrix_free,
1059 VectorType
const & src,
1060 Range
const & face_range)
const;
1063 do_cell_integral_nonlinear_operator(IntegratorCell & integrator,
1064 IntegratorCell & integrator_u_grid)
const;
1067 do_face_integral_nonlinear_operator(IntegratorFace & integrator_m,
1068 IntegratorFace & integrator_p,
1069 IntegratorFace & integrator_grid_velocity)
const;
1072 do_boundary_integral_nonlinear_operator(IntegratorFace & integrator,
1073 IntegratorFace & integrator_grid_velocity,
1074 dealii::types::boundary_id
const & boundary_id)
const;
1082 reinit_cell_derived(IntegratorCell & integrator,
unsigned int const cell)
const final;
1086 reinit_face_derived(IntegratorFace & integrator_m,
1087 IntegratorFace & integrator_p,
1088 unsigned int const face)
const final;
1092 reinit_boundary_face_derived(IntegratorFace & integrator_m,
unsigned int const face)
const final;
1096 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
1097 IntegratorFace & integrator_p,
1098 unsigned int const cell,
1099 unsigned int const face,
1100 dealii::types::boundary_id
const boundary_id)
const final;
1104 do_cell_integral(IntegratorCell & integrator)
const final;
1108 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
1112 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
1121 do_face_int_integral_cell_based(IntegratorFace & integrator_m,
1122 IntegratorFace & integrator_p)
const final;
1126 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p)
const final;
1130 do_boundary_integral(IntegratorFace & integrator,
1131 OperatorType
const & operator_type,
1132 dealii::types::boundary_id
const & boundary_id)
const final;
1136 std::shared_ptr<Operators::ConvectiveKernel<dim, Number>> kernel;