HArD::Core2D
Hybrid Arbitrary Degree::Core 2D - Library to implement 2D schemes with edge and cell polynomials as unknowns
Loading...
Searching...
No Matches
nsa-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 <mesh.hpp>
7
8namespace HArDCore2D
9{
15 namespace NSASolutions
16 {
17 //------------------------------------------------------------------------------
18 // Interface for exact solutions
19
21 IExactSolution(std::string name, bool is_stokes, double viscosity);
22 virtual ~IExactSolution();
23
25 inline std::string name() const {
26 return m_name;
27 }
28
31 inline bool isStokes() const {
32 return m_is_stokes;
33 }
34
36 inline double viscosity() const {
37 return m_viscosity;
38 }
39
40 virtual Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const = 0;
41 virtual double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const = 0;
42 virtual double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const = 0;
43 virtual Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const = 0;
44 virtual double pressure(const Eigen::Vector2d & x, const double & t = 0) const = 0;
45 virtual Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const = 0;
46 virtual Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const = 0;
47 virtual double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const = 0;
48 //virtual Eigen::Vector2d volumicFractionGradient(const Eigen::Vector2d & x, const double t = 0) const = 0;
49
50 protected:
51 std::string m_name;
54 };
55
56 //------------------------------------------------------------------------------
57 // Linear
58
59 struct Linear : public IExactSolution {
60 Linear(const int & stokes);
61
62 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
63 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
64 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
65 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
66 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
67 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
68 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
69 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
70 //Eigen::Vector2d volumicFractionGradient(const Eigen::Vector2d & x, const double & t = 0) const;
71
72 private:
73 int m_stokes;
74 };
75
76 //------------------------------------------------------------------------------
77 // Trigonometric
78
79 struct Trigonometric : public IExactSolution {
80 Trigonometric(const int & stokes);
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 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
85 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
86 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
87 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
88 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
89 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
90
91 private:
92 int m_stokes;
93 };
94
95 //------------------------------------------------------------------------------
96 // Cai et al.
97
98 struct CaiEtAl : public IExactSolution {
99 CaiEtAl(const int & stokes);
100
101 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
102 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
103 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
104 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
105 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
106 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
107 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
108 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
109
110 private:
111 int m_stokes;
112 };
113
114 //------------------------------------------------------------------------------
115 // Guermond and Quartapelle
116
118 GuermondQuartapelle(const int & stokes);
119
120 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
121 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
122 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
123 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
124 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
125 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
126 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
127 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
128
129 private:
130 int m_stokes;
131 };
132
133 //------------------------------------------------------------------------------
134 // Lid-Driven Cavity
135
137 LidDrivenCavity(const int & stokes);
138
139 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
140 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
141 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
142 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
143 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
144 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
145 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
146 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
147
148 private:
149 int m_stokes;
150 };
151
152 //------------------------------------------------------------------------------
153 // Rayleigh-Taylor Instabilities Test Case
154
156 static double s_L;
157
158 RayleighTaylor(const double & rho_min,
159 const double & rho_max,
160 const double & Re,
161 const double & L,
162 const double & a,
163 const double & g);
164
166 /* static inline Mesh2D::MeshBuilder::TransformationType domain_transformation = [](const std::array<double, 2> & x) {
167 return std::array<double, 2>{s_L * ( x[0] - 0.5 ), s_L * (2. * x[1] - 1)};
168 };*/
169
170 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
171 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
172 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
173 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
174 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
175 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
176 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
177 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
178
179 private:
180 double m_rho_min;
181 double m_rho_max;
182 double m_Re;
183 double m_L;
184 double m_a;
185 double m_g;
186 };
187
188 //------------------------------------------------------------------------------
189 // Dam Break Test Case
190
191 struct DamBreak : public IExactSolution {
192
193 DamBreak( const double & rho_min,
194 const double & rho_max,
195 const double & Re,
196 const double & L,
197 const double & H,
198 const double & g);
199
200 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
201 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
202 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
203 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
204 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
205 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
206 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
207 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
208
209 private:
210 double m_rho_min;
211 double m_rho_max;
212 double m_Re;
213 double m_L;
214 double m_H;
215 double m_g;
216 };
217
218 } // namespace NavierStokesSolutions
219
220} // namespace HArDCore2D
221#endif
if t
Definition extract_phi_min_max.m:22
Create grid points x
Definition generate_cartesian_mesh.m:22
size_t L
Definition HHO_DiffAdvecReac.hpp:44
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:464
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:335
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:325
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:90
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:479
double viscosity() const
Return the viscosity.
Definition nsa-solutions.hpp:36
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:438
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:65
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:135
virtual Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:400
virtual Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const =0
std::string name() const
Return the solution name.
Definition nsa-solutions.hpp:25
virtual ~IExactSolution()
Definition nsa-solutions.cpp:30
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:469
virtual double pressure(const Eigen::Vector2d &x, const double &t=0) const =0
virtual Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const =0
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:219
double m_viscosity
Definition nsa-solutions.hpp:53
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:484
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:415
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:111
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:163
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:410
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:513
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:184
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:261
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:368
std::string m_name
Definition nsa-solutions.hpp:51
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:141
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:77
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:316
bool isStokes() const
Definition nsa-solutions.hpp:31
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:290
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:213
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:508
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:272
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:237
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:358
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:340
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:346
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:284
virtual Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const =0
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:168
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:202
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:60
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:295
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:253
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:207
bool m_is_stokes
Definition nsa-solutions.hpp:52
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:192
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:52
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:71
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:130
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:490
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:95
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:46
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:147
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:433
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:278
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:363
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:503
virtual double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
A function to transform the unit domain to .
Definition nsa-solutions.cpp:428
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:421
static double s_L
Definition nsa-solutions.hpp:156
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:119
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:395
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:300
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:232
virtual double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const =0
virtual double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
Definition ddr-klplate.hpp:27
Definition nsa-solutions.hpp:98
Definition nsa-solutions.hpp:191
Definition nsa-solutions.hpp:117
Definition nsa-solutions.hpp:20
Definition nsa-solutions.hpp:136
Definition nsa-solutions.hpp:59
Definition nsa-solutions.hpp:155
Definition nsa-solutions.hpp:79