Peano
riemannsolverRoutines.h
Go to the documentation of this file.
1 #pragma once
2 
3 namespace 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)