ExaDG
Loading...
Searching...
No Matches
momentum_operator.h
1/*
2 * momentum_operator.h
3 *
4 * Created on: Aug 8, 2016
5 * Author: fehn
6 */
7
8#ifndef INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_OPERATORS_MOMENTUM_OPERATOR_H_
9#define INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_OPERATORS_MOMENTUM_OPERATOR_H_
10
11#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/convective_operator.h>
12#include <exadg/incompressible_navier_stokes/spatial_discretization/operators/viscous_operator.h>
13#include <exadg/operators/mass_kernel.h>
14#include <exadg/operators/operator_base.h>
15
16namespace ExaDG
17{
18namespace IncNS
19{
20template<int dim>
22{
24 : OperatorBaseData(), unsteady_problem(false), convective_problem(false), viscous_problem(false)
25 {
26 }
27
28 bool unsteady_problem;
29 bool convective_problem;
30 bool viscous_problem;
31
32 Operators::ConvectiveKernelData convective_kernel_data;
33 Operators::ViscousKernelData viscous_kernel_data;
34
35 std::shared_ptr<BoundaryDescriptorU<dim> const> bc;
36};
37
38template<int dim, typename Number>
39class MomentumOperator : public OperatorBase<dim, Number, dim>
40{
41private:
42 typedef dealii::VectorizedArray<Number> scalar;
43 typedef dealii::Tensor<1, dim, dealii::VectorizedArray<Number>> vector;
44 typedef dealii::Tensor<2, dim, dealii::VectorizedArray<Number>> tensor;
45
47
48 typedef typename Base::VectorType VectorType;
49 typedef typename Base::IntegratorCell IntegratorCell;
50 typedef typename Base::IntegratorFace IntegratorFace;
51
52public:
53 // required by preconditioner interfaces
54 typedef Number value_type;
55
57
62 void
63 initialize(dealii::MatrixFree<dim, Number> const & matrix_free,
64 dealii::AffineConstraints<Number> const & affine_constraints,
65 MomentumOperatorData<dim> const & data);
66
67 void
68 initialize(dealii::MatrixFree<dim, Number> const & matrix_free,
69 dealii::AffineConstraints<Number> const & affine_constraints,
70 MomentumOperatorData<dim> const & data,
71 std::shared_ptr<Operators::ViscousKernel<dim, Number>> viscous_kernel,
72 std::shared_ptr<Operators::ConvectiveKernel<dim, Number>> convective_kernel);
73
75 get_data() const;
76
78 get_convective_kernel_data() const;
79
81 get_viscous_kernel_data() const;
82
83 dealii::LinearAlgebra::distributed::Vector<Number> const &
84 get_velocity() const;
85
86 /*
87 * Interface required by Newton solver.
88 */
89 void
90 set_solution_linearization(VectorType const & velocity);
91
92 /*
93 * Update of operator (required, e.g., for multigrid).
94 */
95 void
96 update_after_grid_motion();
97
98 void
99 set_velocity_copy(VectorType const & velocity) const;
100
101 void
102 set_velocity_ptr(VectorType const & velocity) const;
103
104 Number
105 get_scaling_factor_mass_operator() const;
106
107 void
108 set_scaling_factor_mass_operator(Number const & number);
109
110 /*
111 * Interfaces of OperatorBase.
112 */
113 void
114 rhs(VectorType & dst) const final;
115
116 void
117 rhs_add(VectorType & dst) const final;
118
119 void
120 evaluate(VectorType & dst, VectorType const & src) const final;
121
122 void
123 evaluate_add(VectorType & dst, VectorType const & src) const final;
124
125private:
126 void
127 reinit_cell_derived(IntegratorCell & integrator, unsigned int const cell) const final;
128
129 void
130 reinit_face_derived(IntegratorFace & integrator_m,
131 IntegratorFace & integrator_p,
132 unsigned int const face) const final;
133
134 void
135 reinit_boundary_face_derived(IntegratorFace & integrator_m, unsigned int const face) const final;
136
137 void
138 reinit_face_cell_based_derived(IntegratorFace & integrator_m,
139 IntegratorFace & integrator_p,
140 unsigned int const cell,
141 unsigned int const face,
142 dealii::types::boundary_id const boundary_id) const final;
143
144 // linearized operator
145 void
146 do_cell_integral(IntegratorCell & integrator) const final;
147
148 // linearized operator
149 void
150 do_face_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p) const final;
151
152 // linearized operator
153 void
154 do_face_int_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p) const final;
155
156 // linearized operator
157
158 // TODO
159 // This function is currently only needed due to limitations of deal.II which do
160 // currently not allow to access neighboring data in case of cell-based face loops.
161 // Once this functionality is available, this function should be removed again.
162 void
163 do_face_int_integral_cell_based(IntegratorFace & integrator_m,
164 IntegratorFace & integrator_p) const final;
165
166 // linearized operator
167 void
168 do_face_ext_integral(IntegratorFace & integrator_m, IntegratorFace & integrator_p) const final;
169
170 // linearized operator
171 void
172 do_boundary_integral(IntegratorFace & integrator,
173 OperatorType const & operator_type,
174 dealii::types::boundary_id const & boundary_id) const final;
175
176 MomentumOperatorData<dim> operator_data;
177
178 std::shared_ptr<MassKernel<dim, Number>> mass_kernel;
179 std::shared_ptr<Operators::ConvectiveKernel<dim, Number>> convective_kernel;
180 std::shared_ptr<Operators::ViscousKernel<dim, Number>> viscous_kernel;
181
182 double scaling_factor_mass;
183};
184
185} // namespace IncNS
186} // namespace ExaDG
187
188#endif /* INCLUDE_EXADG_INCOMPRESSIBLE_NAVIER_STOKES_SPATIAL_DISCRETIZATION_OPERATORS_MOMENTUM_OPERATOR_H_ \
189 */
Definition momentum_operator.h:40
void initialize(dealii::MatrixFree< dim, Number > const &matrix_free, dealii::AffineConstraints< Number > const &affine_constraints, MomentumOperatorData< dim > const &data)
Definition momentum_operator.cpp:14
Definition convective_operator.h:46
Definition viscous_operator.h:49
Definition operator_base.h:98
Definition driver.cpp:33
Definition momentum_operator.h:22
Definition convective_operator.h:23
Definition viscous_operator.h:26
Definition operator_base.h:59