HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
ns-solutions.hpp
Go to the documentation of this file.
1#ifndef NS_SOLUTIONS_HPP
2#define NS_SOLUTIONS_HPP
3
4#include <Eigen/Dense>
5
6#include "MeshBuilder2D.hpp"
7
8namespace HArDCore2D
9{
10 namespace NavierStokesSolutions
11 {
12 //------------------------------------------------------------------------------
13 // Interface for exact solutions
14
15 struct IExactSolution {
16 IExactSolution(std::string name, bool is_stokes, double viscosity);
17 virtual ~IExactSolution();
18
20 inline std::string name() const {
21 return m_name;
22 }
23
26 inline bool isStokes() const {
27 return m_is_stokes;
28 }
29
31 inline double viscosity() const {
32 return m_viscosity;
33 }
34
35 virtual Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const = 0;
36 virtual double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const = 0;
37 virtual Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const = 0;
38 virtual double pressure(const Eigen::Vector2d & x, const double & t = 0) const = 0;
39 virtual Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const = 0;
40 virtual Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const = 0;
41
42 protected:
43 std::string m_name;
44 bool m_is_stokes;
45 double m_viscosity;
46 };
47
48 //------------------------------------------------------------------------------
49 // Linear velocity
50
51 struct LinearVelocity : public IExactSolution {
53
54 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
55 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
56 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
57 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
58 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
59 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
60 };
61
62 //------------------------------------------------------------------------------
63 // Linear pressure
64
65 struct LinearPressure : public IExactSolution {
67
68 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
69 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
70 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
71 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
72 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
73 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
74 };
75
76 //------------------------------------------------------------------------------
77 // Quadratic velocity
78
79 struct QuadraticVelocity : public IExactSolution {
81
82 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
83 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
84 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
85 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
86 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
87 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
88 };
89
90 //------------------------------------------------------------------------------
91 // Trigonometric
92
93 struct Trigonometric : public IExactSolution {
95
96 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
97 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
98 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
99 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
100 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
101 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
102 };
103
104 //------------------------------------------------------------------------------
105 // A viscosity-dependent solution of the Stokes problem to test
106 // pressure-robustness
107
108 struct PressureRobustStokes : public IExactSolution {
110
111 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
112 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
113 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
114 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
115 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
116 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
117 };
118
119 //------------------------------------------------------------------------------
120 // A viscosity-dependent solution of the Navier-Stokes problem to test
121 // pressure-robustness
122
125
126 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
127 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
128 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
129 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
130 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
131 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
132 };
133
134 //------------------------------------------------------------------------------
135 // A solution with zero velocity and non-zero pressure to test
136 // pressure-robustness
137
138 struct OnlyPressure : public IExactSolution {
139 OnlyPressure(const double & viscosity);
140
141 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
142 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
143 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
144 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
145 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
146 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
147 };
148
149 //------------------------------------------------------------------------------
150 // Kovasznay
151
152 struct Kovasznay : public IExactSolution {
154 Kovasznay(const double & viscosity, std::ostream & output = std::cout);
155
157 static inline Mesh2D::MeshBuilder::TransformationType domain_transformation = [](const std::array<double, 2> & x) {
158 return std::array<double, 2>{2. * x[0] - 0.5, 2. * x[1]};
159 };
160
161 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
162 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
163 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
164 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
165 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
166 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
167
168 private:
169 double m_Re;
170 double m_lambda;
171 };
172
173 //------------------------------------------------------------------------------
174 // A time-dependent solution of the Navier-Stokes problem to test
175 // time-stepping routines
176
179
180 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
181 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
182 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
183 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
184 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
185 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
186 };
187
188 //------------------------------------------------------------------------------
189 // A time-dependent solution of the Navier-Stokes problem to test
190 // time-stepping routines
191
192 struct TimeDependentStokes : public IExactSolution {
194
195 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
196 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
197 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
198 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
199 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
200 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
201 };
202
203 //------------------------------------------------------------------------------
204 // A divergence-free sinusoidal solution with time dependence to test timestepping
205 // implementations
206
207 struct TrigTimeDep : public IExactSolution {
208 TrigTimeDep(const double & viscosity);
209
210 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
211 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
212 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
213 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
214 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
215 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
216
217 private:
218 double m_param;
219 };
220
221 //------------------------------------------------------------------------------
222 // A solution with only time-dependence to check time-stepping routine
223
224 struct OnlyTimeDep : public IExactSolution {
225 OnlyTimeDep(const double & viscosity);
226
227 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
228 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
229 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
230 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
231 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
232 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
233
234 private:
235 double m_param;
236 };
237
238 //------------------------------------------------------------------------------
239 // A solution with linear dependence in space and time
240
241 struct LinearTemporal : public IExactSolution {
242 LinearTemporal(const double & viscosity);
243
244 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
245 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
246 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
247 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
248 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
249 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
250
251 private:
252 double m_param;
253 };
254
255 //------------------------------------------------------------------------------
256 // A lid-driven cavity test problem
257 // Note: an exact solution does not exist - this test exists only to set initial
258 // and boundary conditions
259
260 struct LidDrivenCavity : public IExactSolution {
262
263 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
264 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
265 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
266 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
267 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
268 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
269 };
270
271 } // namespace NavierStokesSolutions
272
273} // namespace HArDCore2D
274#endif
std::function< std::array< double, 2 >(const std::array< double, 2 > &)> TransformationType
Definition MeshBuilder2D.hpp:174
Definition ddr-klplate.hpp:27
double viscosity() const
Return the viscosity.
Definition ns-solutions.hpp:33
bool isStokes() const
Definition ns-solutions.hpp:26
bool m_is_stokes
Definition ns-solutions.hpp:64
virtual double pressure(const Eigen::Vector2d &x, const double &t=0) const =0
std::string name() const
Return the solution name.
Definition ns-solutions.hpp:22
virtual Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
virtual double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
double m_viscosity
Definition ns-solutions.hpp:65
std::string m_name
Definition ns-solutions.hpp:63
virtual Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const =0
virtual Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const =0
IExactSolution(std::string name, bool is_stokes, double viscosity, bool isNonNewtonian=false, double flow_index=2.0, double degen_param=0.0)
Definition ns-solutions.cpp:17
virtual Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const =0
Definition ns-solutions.hpp:175
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
static Mesh2D::MeshBuilder::TransformationType domain_transformation
A function to transform the unit domain to .
Definition ns-solutions.hpp:180
Kovasznay(const double &viscosity, std::ostream &output=std::cout)
Construct the class given the Reynolds number.
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.hpp:247
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.hpp:230
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const