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