Peano
Loading...
Searching...
No Matches
riemannsolver_routines.h
Go to the documentation of this file.
1namespace Numerics {
2
3 template <class Shortcuts>
4 inline void compute_tractions(const double* Q, const double* n, double& Tx, double& Ty, double& Tz) {
5 Shortcuts s;
6 double sigma_xx = Q[s.sigma + 0];
7 double sigma_yy = Q[s.sigma + 1];
8 double sigma_zz = Q[s.sigma + 2];
9 double sigma_xy = Q[s.sigma + 3];
10 double sigma_xz = Q[s.sigma + 4];
11 double sigma_yz = Q[s.sigma + 5];
12
13 Tx = n[0] * sigma_xx + n[1] * sigma_xy + n[2] * sigma_xz;
14 Ty = n[0] * sigma_xy + n[1] * sigma_yy + n[2] * sigma_yz;
15 Tz = n[0] * sigma_xz + n[1] * sigma_yz + n[2] * sigma_zz;
16 }
17
18 template <class Shortcuts>
19 inline void get_velocities(const double* Q, double& vx, double& vy, double& vz) {
20 Shortcuts s;
21 vx = Q[s.v + 0];
22 vy = Q[s.v + 1];
23 vz = Q[s.v + 2];
24 }
25
26 // Transformation routines
27 // Gram Schmidt orthonormalization
28 inline void Gram_Schmidt(double* y, double* z) {
29 double a_yz = y[0] * z[0] + y[1] * z[1] + y[2] * z[2];
30
31 for (int i = 0; i < 3; i++) {
32 z[i] = z[i] - a_yz * y[i];
33 }
34
35 double norm_z = std::sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
36
37 for (int i = 0; i < 3; i++) {
38 z[i] = z[i] / norm_z;
39 }
40 }
41
42 /* inline void create_local_basis(double* n, double * m, double* l){ */
43 /* if(std::abs(n[0]-n[1]) < 1.0e-10 && std::abs(n[1]-n[2]) < 1.0e-10){ */
44 /* const double norm = std::sqrt(2.0/3.0); */
45 /* m[0] = -2.0/3.0 / norm; */
46 /* m[1] = 1.0/3.0 / norm; */
47 /* m[2] = 1.0/3.0 / norm; */
48 /* }else{ */
49 /* const double norm = std::sqrt(2.0*( n[0]*n[0]+n[1]*n[1]+n[2]*n[2] */
50 /* -n[0]*n[1]-n[0]*n[2]-n[1]*n[2])); */
51 /* m[0] = (n[2] - n[1])/norm; */
52 /* m[1] = (n[0] - n[2])/norm; */
53 /* m[2] = (n[1] - n[0])/norm; */
54 /* } */
55
56 /* l[0] = n[1]*m[2]-n[2]*m[1]; */
57 /* l[1] = n[2]*m[0]-n[0]*m[2]; */
58 /* l[2] = n[0]*m[1]-n[1]*m[0]; */
59 /* } */
60
61 inline void create_local_basis(double* n, double* m, double* l) {
62
63#if Dimensions == 2
64 l[0] = 0.;
65 l[1] = 0.;
66 l[2] = 1.0;
67
68 m[0] = n[1] * l[2] - n[2] * l[1];
69 m[1] = -(n[0] * l[2] - n[2] * l[0]);
70 m[2] = n[0] * l[1] - n[1] * l[0];
71#elif Dimensions == 3
72
73 double tol, diff_norm1, diff_norm2;
74 tol = 1e-12;
75 m[0] = 0.;
76 m[1] = 1.;
77 m[2] = 0.;
78
79 diff_norm1 = std::sqrt(pow(n[0] - m[0], 2) + pow(n[1] - m[1], 2) + pow(n[2] - m[2], 2));
80 diff_norm2 = std::sqrt(pow(n[0] + m[0], 2) + pow(n[1] + m[1], 2) + pow(n[2] + m[2], 2));
81
82 if (diff_norm1 >= tol && diff_norm2 >= tol) {
83 Gram_Schmidt(n, m);
84 } else {
85 m[0] = 0.;
86 m[1] = 0.;
87 m[2] = 1.;
88 Gram_Schmidt(n, m);
89 }
90 l[0] = n[1] * m[2] - n[2] * m[1];
91 l[1] = -(n[0] * m[2] - n[2] * m[0]);
92 l[2] = n[0] * m[1] - n[1] * m[0];
93
94#endif
95 }
96
98 double v_p,
99 double v_m,
100 double sigma_p,
101 double sigma_m,
102 double z_p,
103 double z_m,
104 double& v_hat_p,
105 double& v_hat_m,
106 double& sigma_hat_p,
107 double& sigma_hat_m
108 ) {
109
110 double phi = 0;
111 double v_hat = 0;
112 double eta = 0;
113
114 /* v_hat_p=v_m; */
115 /* v_hat_m=v_p; */
116
117 /* sigma_hat_p=sigma_m; */
118 /* sigma_hat_m=sigma_p; */
119
120 double p = z_p * v_p + sigma_p;
121 double q = z_m * v_m - sigma_m;
122
123 if (z_p > 0 && z_m > 0) {
124 eta = (z_p * z_m) / (z_p + z_m);
125
126 phi = eta * (p / z_p - q / z_m);
127
128 sigma_hat_p = phi;
129 sigma_hat_m = phi;
130
131 v_hat_p = (q + phi) / z_m;
132 v_hat_m = (p - phi) / z_p;
133 } else if (z_p > 0) {
134 sigma_hat_p = 0;
135 sigma_hat_m = sigma_m;
136
137 v_hat_p = v_p;
138 v_hat_m = v_m;
139 } else if (z_m > 0) {
140 sigma_hat_p = sigma_p;
141 sigma_hat_m = 0;
142
143 v_hat_p = v_p;
144 v_hat_m = v_m;
145 } else {
146 sigma_hat_p = sigma_p;
147 sigma_hat_m = sigma_m;
148
149 v_hat_p = v_p;
150 v_hat_m = v_m;
151 }
152 }
153
154 inline void riemannSolver_BC0(double v, double sigma, double z, double r, double& v_hat, double& sigma_hat) {
155 double p = 0.5 * (z * v + sigma);
156 if (z > 0) {
157 v_hat = (1 + r) / z * p;
158 sigma_hat = (1 - r) * p;
159 } else {
160 v_hat = v;
161 sigma_hat = sigma;
162 }
163 }
164
165 inline void riemannSolver_BCn(double v, double sigma, double z, double r, double& v_hat, double& sigma_hat) {
166 double q = 0.5 * (z * v - sigma);
167 if (z > 0) {
168 v_hat = (1 + r) / z * q;
169 sigma_hat = -(1 - r) * q;
170 } else {
171 v_hat = v;
172 sigma_hat = sigma;
173 }
174 }
175
177 double* n, double* m, double* l, double Tx, double Ty, double Tz, double& Tn, double& Tm, double& Tl
178 ) {
179 Tn = Tx * n[0] + Ty * n[1] + Tz * n[2];
180 Tm = Tx * m[0] + Ty * m[1] + Tz * m[2];
181 Tl = Tx * l[0] + Ty * l[1] + Tz * l[2];
182 }
183
185 double* n, double* m, double* l, double Fn, double Fm, double Fl, double& Fx, double& Fy, double& Fz
186 ) {
187 Fx = n[0] * Fn + m[0] * Fm + l[0] * Fl;
188 Fy = n[1] * Fn + m[1] * Fm + l[1] * Fl;
189 Fz = n[2] * Fn + m[2] * Fm + l[2] * Fl;
190 }
191
192 // Solver
193 inline void compute_fluctuations_left(double z, double T, double T_hat, double v, double v_hat, double& F) {
194 F = 0.5 * (z * (v - v_hat) + (T - T_hat));
195 }
196
197 inline void compute_fluctuations_right(double z, double T, double T_hat, double v, double v_hat, double& F) {
198 F = 0.5 * (z * (v - v_hat) - (T - T_hat));
199 }
200
201} // namespace Numerics
void compute_fluctuations_left(double z, double T, double T_hat, double v, double v_hat, double &F)
void Gram_Schmidt(double *y, double *z)
void get_velocities(const double *Q, double &vx, double &vy, double &vz)
void rotate_into_orthogonal_basis(double *n, double *m, double *l, double Tx, double Ty, double Tz, double &Tn, double &Tm, double &Tl)
void riemannSolver_BC0(double v, double sigma, double z, double r, double &v_hat, double &sigma_hat)
void riemannSolver_BCn(double v, double sigma, double z, double r, double &v_hat, double &sigma_hat)
void riemannSolver_Nodal(double v_p, double v_m, double sigma_p, double sigma_m, double z_p, double z_m, double &v_hat_p, double &v_hat_m, double &sigma_hat_p, double &sigma_hat_m)
void compute_fluctuations_right(double z, double T, double T_hat, double v, double v_hat, double &F)
void compute_tractions(const double *Q, const double *n, double &Tx, double &Ty, double &Tz)
void create_local_basis(double *n, double *m, double *l)
void rotate_into_physical_basis(double *n, double *m, double *l, double Fn, double Fm, double Fl, double &Fx, double &Fy, double &Fz)