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
50
51 struct Linear : public IExactSolution {
52 Linear();
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 temporal
64
65 struct LinearTemporal : 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 // Trigonometric
78
79 struct Trigonometric : 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 // Kovasznay
92
93 struct Kovasznay : public IExactSolution {
95 Kovasznay(const double & Re, std::ostream & output = std::cout);
96
98 static inline Mesh2D::MeshBuilder::TransformationType domain_transformation = [](const std::array<double, 2> & x) {
99 return std::array<double, 2>{2. * x[0] - 0.5, 2. * x[1]};
100 };
101
102 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t = 0) const;
103 double compressibilityForcingTerm(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
109 private:
110 double m_Re;
111 double m_lambda;
112 };
113
114 //------------------------------------------------------------------------------
115 // Kim and Moin
116
117 struct KimMoin : public IExactSolution {
119 KimMoin();
120
121 Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d & x, const double & t) const;
122 double compressibilityForcingTerm(const Eigen::Vector2d & x, const double & t) const;
123 Eigen::Vector2d velocity(const Eigen::Vector2d & x, const double & t) const;
124 double pressure(const Eigen::Vector2d & x, const double & t) const;
125 Eigen::Matrix2d velocityGradient(const Eigen::Vector2d & x, const double & t) const;
126 Eigen::Vector2d pressureGradient(const Eigen::Vector2d & x, const double & t) const;
127 };
128
129 } // namespace NavierStokesSolutions
130
131} // namespace HArDCore2D
132#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
virtual Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const =0
IExactSolution(std::string name, bool is_stokes, double viscosity)
Definition ns-solutions.hpp:117
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t) const
Definition ns-solutions.cpp:243
KimMoin()
Construct the class given the Reynolds number.
Definition ns-solutions.cpp:214
double pressure(const Eigen::Vector2d &x, const double &t) const
Definition ns-solutions.cpp:238
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t) const
Definition ns-solutions.cpp:220
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t) const
Definition ns-solutions.cpp:228
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t) const
Definition ns-solutions.cpp:251
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t) const
Definition ns-solutions.cpp:258
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
Kovasznay(const double &Re, std::ostream &output=std::cout)
Construct the class given the Reynolds number.
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
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
LinearTemporal()
Definition ns-solutions.cpp:75
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.hpp:51
double compressibilityForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.cpp:67
Eigen::Vector2d pressureGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.cpp:57
Eigen::Vector2d momentumForcingTerm(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.cpp:62
double pressure(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.cpp:52
Eigen::Matrix2d velocityGradient(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.cpp:45
Eigen::Vector2d velocity(const Eigen::Vector2d &x, const double &t=0) const
Definition ns-solutions.cpp:39
Linear()
Definition ns-solutions.cpp:33
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