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 "MeshBuilder2D.hpp"
7
8namespace HArDCore2D
9{
10 namespace NSASolutions
11 {
12 //------------------------------------------------------------------------------
13 // Interface for exact solutions
14
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 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const = 0;
38 virtual Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const = 0;
39 virtual double pressure(const Eigen::Vector2d & x, const double & t = 0) const = 0;
40 virtual Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const = 0;
41 virtual Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const = 0;
42 virtual double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const = 0;
43 //virtual Eigen::Vector2d volumicFractionGradient(const Eigen::Vector2d & x, const double t = 0) const = 0;
44
45 protected:
46 std::string m_name;
49 };
50
51 //------------------------------------------------------------------------------
52 // Linear
53
54 struct Linear : public IExactSolution {
55 Linear(const int & stokes);
56
57 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
58 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
59 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
60 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
61 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
62 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
63 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
64 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
65 //Eigen::Vector2d volumicFractionGradient(const Eigen::Vector2d & x, const double & t = 0) const;
66
67 private:
68 int m_stokes;
69 };
70
71 //------------------------------------------------------------------------------
72 // Trigonometric
73
74 struct Trigonometric : public IExactSolution {
75 Trigonometric(const int & stokes);
76
77 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
78 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
79 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
80 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
81 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
82 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
83 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
84 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
85
86 private:
87 int m_stokes;
88 };
89
90 //------------------------------------------------------------------------------
91 // Cai et al.
92
93 struct CaiEtAl : public IExactSolution {
94 CaiEtAl(const int & stokes);
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 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
99 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
100 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
101 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
102 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
103 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
104
105 private:
106 int m_stokes;
107 };
108
109 //------------------------------------------------------------------------------
110 // Guermond and Quartapelle
111
113 GuermondQuartapelle(const int & stokes);
114
115 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
116 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
117 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
118 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
119 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
120 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
121 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
122 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
123
124 private:
125 int m_stokes;
126 };
127
128 //------------------------------------------------------------------------------
129 // Lid-Driven Cavity
130
132 LidDrivenCavity(const int & stokes);
133
134 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
135 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
136 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
137 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
138 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
139 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
140 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
141 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
142
143 private:
144 int m_stokes;
145 };
146
147 //------------------------------------------------------------------------------
148 // Rayleigh-Taylor Instabilities Test Case
149
151 static double s_L;
152
153 RayleighTaylor(const double & rho_min,
154 const double & rho_max,
155 const double & Re,
156 const double & L,
157 const double & a,
158 const double & g);
159
161 static inline Mesh2D::MeshBuilder::TransformationType domain_transformation = [](const std::array<double, 2> & x) {
162 return std::array<double, 2>{s_L * ( x[0] - 0.5 ), s_L * (2. * x[1] - 1)};
163 };
164
165 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
166 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
167 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
168 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
169 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
170 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
171 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
172 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
173
174 private:
175 double m_rho_min;
176 double m_rho_max;
177 double m_Re;
178 double m_L;
179 double m_a;
180 double m_g;
181 };
182
183 //------------------------------------------------------------------------------
184 // Dam Break Test Case
185
186 struct DamBreak : public IExactSolution {
187 DamBreak(const int & stokes);
188
189 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
190 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
191 double densityForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
192 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t = 0) const;
193 double pressure(const Eigen::Vector2d & x, const double & t = 0) const;
194 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t = 0) const;
195 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t = 0) const;
196 double volumicFraction(const Eigen::Vector2d & x, const double & t = 0) const;
197
198 private:
199 int m_stokes;
200 };
201
202 } // namespace NavierStokesSolutions
203
204} // namespace HArDCore2D
205#endif
size_t L
Definition HHO_DiffAdvecReac.hpp:46
std::function< std::array< double, 2 >(const std::array< double, 2 > &)> TransformationType
Definition MeshBuilder2D.hpp:174
Definition ddr-klplate.hpp:27
Definition nsa-solutions.hpp:93
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:218
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:183
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:212
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:236
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:201
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:206
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:191
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:231
Definition nsa-solutions.hpp:186
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:452
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:467
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:457
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:472
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:502
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:497
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:478
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:491
Definition nsa-solutions.hpp:112
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:260
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:289
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:271
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:283
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:294
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:252
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:277
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:299
Definition nsa-solutions.hpp:15
double viscosity() const
Return the viscosity.
Definition nsa-solutions.hpp:31
virtual Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
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:20
virtual ~IExactSolution()
Definition nsa-solutions.cpp:28
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
double m_viscosity
Definition nsa-solutions.hpp:48
std::string m_name
Definition nsa-solutions.hpp:46
bool isStokes() const
Definition nsa-solutions.hpp:26
virtual Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const =0
bool m_is_stokes
Definition nsa-solutions.hpp:47
virtual double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const =0
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 nsa-solutions.hpp:131
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:334
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:324
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:367
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:315
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:357
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:339
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:345
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:362
Definition nsa-solutions.hpp:54
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:89
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:63
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:75
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:58
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:50
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:69
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:94
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:44
Definition nsa-solutions.hpp:150
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:436
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:399
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:414
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:409
static Mesh2D::MeshBuilder::TransformationType domain_transformation
A function to transform the unit domain to .
Definition nsa-solutions.hpp:161
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:431
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:426
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:420
static double s_L
Definition nsa-solutions.hpp:151
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:394
Definition nsa-solutions.hpp:74
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:134
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:110
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:162
double volumicFraction(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:140
double densityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:167
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:129
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:146
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition nsa-solutions.cpp:118