Peano
Loading...
Searching...
No Matches
TestUtils.cpp
Go to the documentation of this file.
1#include "TestUtils.h"
2
4 [[maybe_unused]] const double * __restrict__ Q,
5 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
6 [[maybe_unused]] double t,
7 [[maybe_unused]] double dt,
8 [[maybe_unused]] int normal,
9 [[maybe_unused]] double * __restrict__ F
10) {
11 constexpr double gamma = 1.4;
12 const double irho = 1./Q[0];
13 const double p = (gamma-1) * (Q[4] - 0.5*irho*(Q[1]*Q[1]+Q[2]*Q[2]+Q[3]*Q[3]));
14
15 const double velocity = irho*Q[normal+1];
16 F[0] = velocity*Q[0];
17 F[1] = velocity*Q[1];
18 F[2] = velocity*Q[2];
19 F[3] = velocity*Q[3];
20 F[normal+1] += p;
21 F[4] = velocity*(Q[4]+p);
22}
23
25 [[maybe_unused]] const double * __restrict__ Q,
26 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
27 [[maybe_unused]] double t,
28 [[maybe_unused]] double dt,
29 [[maybe_unused]] double * __restrict__ S
30) {
31 S[0] = 0.0;
32 S[1] = 0.0;
33 S[2] = 0.0;
34 S[3] = 0.0;
35 S[4] = 0.0;
36}
37
39 [[maybe_unused]] const double * __restrict__ Q,
40 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
41 [[maybe_unused]] double t,
42 [[maybe_unused]] double dt,
43 [[maybe_unused]] int normal
44) {
45 assertion8( Q[0]>0.0, Q[0], Q[1], Q[2], Q[3], Q[4], x, t, normal );
46 const double irho = 1.0/Q[0];
47
48 // based on the assumption that the fluid is an ideal gas, gamma chosen for dry air
49 const double gamma = 1.4;
50 const double p = (gamma-1) * (Q[4] - 0.5*irho*(Q[1]*Q[1]+Q[2]*Q[2]+Q[3]*Q[3]));
51
52 assertion8( p>=0.0, Q[0], Q[1], Q[2], Q[3], Q[4], x, t, normal );
53 const double c = std::sqrt(gamma * p * irho);
54
55 double result = 1.0;
56 switch(normal){
57 case 0: //x
58 result = std::max( std::abs(Q[1] * irho - c), std::abs(Q[1] * irho + c) );
59 break;
60 case 1: //y
61 result = std::max( std::abs(Q[2] * irho - c), std::abs(Q[2] * irho + c) );
62 break;
63 case 2: //z
64 result = std::max( std::abs(Q[3] * irho - c), std::abs(Q[3] * irho + c) );
65 }
66 return result;
67}
68
70 [[maybe_unused]] const double * __restrict__ Qinside,
71 [[maybe_unused]] double * __restrict__ Qoutside,
72 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
73 [[maybe_unused]] double t,
74 [[maybe_unused]] double dt,
75 [[maybe_unused]] int normal
76) {
77 Qoutside[0] = Qinside[0];
78 Qoutside[1] = Qinside[1];
79 Qoutside[2] = Qinside[2];
80 Qoutside[3] = Qinside[3];
81 Qoutside[4] = Qinside[4];
82}
83
85 [[maybe_unused]] double* __restrict__ Q,
86 [[maybe_unused]] int node
87) {
88 Q[0] = 1.00000000000000;
89 Q[1] = 0.100000000000000;
90 Q[2] = 0.200000000000000;
91 Q[3] = 0.300000000000000;
92 Q[4] = 2.57000000000000;
93}
94
95void exahype2::dg::tests::elasticInitial(double * __restrict__ Q) {
96 for(int i=0; i<9; i++){
97 Q[i] = 1.0; //6 stresses, 3 velocities
98 }
99 //auxiliary variables
100 Q[9] = 4.0; //rho
101 Q[10] = 2.0; //cp
102 Q[11] = 2.6; //cs
103}
104
106 [[maybe_unused]] const double * __restrict__ Q,
107 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
108 [[maybe_unused]] double t,
109 [[maybe_unused]] double dt,
110 [[maybe_unused]] int normal,
111 [[maybe_unused]] double * __restrict__ F
112) {
113 //stresses
114 for(int i=0; i<6; i++){
115 F[i] = 0;
116 }
117
118 //velocities
119 switch(normal){
120 case 0: //x
121 F[6] = Q[0]; //xx
122 F[7] = Q[3]; //xy
123 F[8] = Q[4]; //xz
124 break;
125 case 1: //y
126 F[6] = Q[3]; //xy
127 F[7] = Q[1]; //yy
128 F[8] = Q[5]; //yz
129 break;
130 case 2: //z
131 F[6] = Q[4]; //xz
132 F[7] = Q[5]; //yz
133 F[8] = Q[2]; //zz
134 break;
135 }
136}
137
139 [[maybe_unused]] const double * __restrict__ Q,
140 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
141 [[maybe_unused]] double t,
142 [[maybe_unused]] double dt,
143 [[maybe_unused]] double * __restrict__ S
144) {
145 S[0] = 1.0;
146 S[1] = 1.0;
147 S[2] = 1.0;
148 S[3] = 1.0;
149 S[4] = 1.0;
150 S[5] = 1.0;
151 S[6] = 1.0;
152 S[7] = 1.0;
153 S[8] = 1.0;
154}
155
157 [[maybe_unused]] const double * __restrict__ Q,
158 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
159 [[maybe_unused]] double t,
160 [[maybe_unused]] double dt,
161 [[maybe_unused]] int normal
162) {
163 double result = std::max(std::abs(Q[10]), std::abs(Q[11]));
164 return result;
165}
166
168 [[maybe_unused]] const double * __restrict__ Qinside,
169 [[maybe_unused]] double * __restrict__ Qoutside,
170 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
171 [[maybe_unused]] double t,
172 [[maybe_unused]] double dt,
173 [[maybe_unused]] int normal
174) {
175 Qoutside[0] = Qinside[0];
176 Qoutside[1] = Qinside[1];
177 Qoutside[2] = Qinside[2];
178 Qoutside[3] = Qinside[3];
179 Qoutside[4] = Qinside[4];
180 Qoutside[5] = Qinside[5];
181 Qoutside[6] = Qinside[6];
182 Qoutside[7] = Qinside[7];
183 Qoutside[8] = Qinside[8];
184 Qoutside[9] = Qinside[9];
185 Qoutside[10] = Qinside[10];
186 Qoutside[11] = Qinside[11];
187}
188
190 [[maybe_unused]] const double * __restrict__ Q,
191 [[maybe_unused]] const double * __restrict__ deltaQ,
192 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& faceCentre,
193 [[maybe_unused]] double t,
194 [[maybe_unused]] double dt,
195 [[maybe_unused]] int normal,
196 [[maybe_unused]] double * __restrict__ BgradQ // BgradQ[9]
197) {
198 //Lamé parameters
199 double mu = Q[9] * Q[11] * Q[11]; //rho*cs^2
200 double lambda = Q[9] * Q[10] * Q[10] - 2 * mu; //rho*cp^2 - 2 mu
201
202 //stresses
203 switch(normal){
204 case 0: //x
205 BgradQ[0] = (lambda + 2*mu) * deltaQ[6]; //xx
206 BgradQ[1] = lambda * deltaQ[6]; //yy
207 BgradQ[2] = lambda * deltaQ[6]; //zz
208 BgradQ[3] = mu * deltaQ[7]; //xy
209 BgradQ[4] = mu * deltaQ[8]; //xz
210 BgradQ[5] = 0; //yz
211 break;
212 case 1: //y
213 BgradQ[0] = lambda * deltaQ[7]; //xx
214 BgradQ[1] = (lambda + 2*mu) * deltaQ[7]; //yy
215 BgradQ[2] = lambda * deltaQ[7]; //zz
216 BgradQ[3] = mu * deltaQ[6]; //xy
217 BgradQ[4] = 0; //xz
218 BgradQ[5] = mu * deltaQ[8]; //yz
219 break;
220 case 2:
221 BgradQ[0] = lambda * deltaQ[8]; //xx
222 BgradQ[1] = lambda * deltaQ[8]; //yy
223 BgradQ[2] = (lambda + 2*mu) * deltaQ[8]; //zz
224 BgradQ[3] = 0; //xy
225 BgradQ[4] = mu * deltaQ[6]; //xz
226 BgradQ[5] = mu * deltaQ[7]; //yz
227 break;
228 }
229
230 //velocities
231 BgradQ[6] = 0;
232 BgradQ[7] = 0;
233 BgradQ[8] = 0;
234}
235
237 [[maybe_unused]] const double * __restrict__ Qinside,
238 [[maybe_unused]] double * __restrict__ Qoutside,
239 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
240 [[maybe_unused]] double t,
241 [[maybe_unused]] double dt,
242 [[maybe_unused]] int normal
243) {
244 Qoutside[0] = Qinside[0];
245 Qoutside[1] = x[0];
246 Qoutside[2] = t;
247 Qoutside[3] = normal;
248}
249
251 [[maybe_unused]] const double * __restrict__ Q,
252 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
253 [[maybe_unused]] double t,
254 [[maybe_unused]] double dt,
255 [[maybe_unused]] int normal
256) {
257 double result = Q[0]*normal;
258 return result;
259}
260
262 [[maybe_unused]] const double * __restrict__ Qinside,
263 [[maybe_unused]] double * __restrict__ Qoutside,
264 [[maybe_unused]] const tarch::la::Vector<Dimensions,double>& x,
265 [[maybe_unused]] double t,
266 [[maybe_unused]] double dt,
267 [[maybe_unused]] int normal
268) {
269 Qoutside[0] = 1.0;
270 Qoutside[1] = 2.0;
271 Qoutside[2] = 3.0;
272 Qoutside[3] = 4.0;
273}
#define assertion8(expr, param0, param1, param2, param3, param4, param5, param6, param7)
void elasticInitial(double *__restrict__ Q)
Definition TestUtils.cpp:95
double eulerEigenvalue(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
Definition TestUtils.cpp:38
void elasticFlux(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal, double *__restrict__ F)
double elasticEigenvalue(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
void secondTestBoundaryConditions(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
void elasticSource(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, double *__restrict__ S)
void eulerBoundaryConditions(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
Definition TestUtils.cpp:69
void eulerFlux(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal, double *__restrict__ F)
Definition TestUtils.cpp:3
void elasticBoundaryConditions(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
void testBoundaryConditions(const double *__restrict__ Qinside, double *__restrict__ Qoutside, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
double testEigenvalue(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, int normal)
void eulerInitial(double *__restrict__ Q, int node=0)
Definition TestUtils.cpp:84
void elasticNonConservativeProduct(const double *__restrict__ Q, const double *__restrict__ deltaQ, const tarch::la::Vector< Dimensions, double > &faceCentre, double t, double dt, int normal, double *__restrict__ BgradQ)
void eulerSource(const double *__restrict__ Q, const tarch::la::Vector< Dimensions, double > &x, double t, double dt, double *__restrict__ S)
Definition TestUtils.cpp:24
CF abs(const CF &cf)
Simple vector class.
Definition Vector.h:134