3 template <
class Shortcuts>
4 inline void compute_tractions(
const double* Q,
const double* n,
double& Tx,
double& Ty,
double& Tz) {
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];
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;
18 template <
class Shortcuts>
19 inline void get_velocities(
const double* Q,
double& vx,
double& vy,
double& vz) {
29 double a_yz = y[0] * z[0] + y[1] * z[1] + y[2] * z[2];
31 for (
int i = 0; i < 3; i++) {
32 z[i] = z[i] - a_yz * y[i];
35 double norm_z = std::sqrt(z[0] * z[0] + z[1] * z[1] + z[2] * z[2]);
37 for (
int i = 0; i < 3; i++) {
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];
73 double tol, diff_norm1, diff_norm2;
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));
82 if (diff_norm1 >= tol && diff_norm2 >= tol) {
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];
120 double p = z_p * v_p + sigma_p;
121 double q = z_m * v_m - sigma_m;
123 if (z_p > 0 && z_m > 0) {
124 eta = (z_p * z_m) / (z_p + z_m);
126 phi = eta * (p / z_p - q / z_m);
131 v_hat_p = (q + phi) / z_m;
132 v_hat_m = (p - phi) / z_p;
133 }
else if (z_p > 0) {
135 sigma_hat_m = sigma_m;
139 }
else if (z_m > 0) {
140 sigma_hat_p = sigma_p;
146 sigma_hat_p = sigma_p;
147 sigma_hat_m = sigma_m;
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);
157 v_hat = (1 + r) / z * p;
158 sigma_hat = (1 - r) * p;
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);
168 v_hat = (1 + r) / z * q;
169 sigma_hat = -(1 - r) * q;
177 double* n,
double* m,
double* l,
double Tx,
double Ty,
double Tz,
double& Tn,
double& Tm,
double& Tl
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];
185 double* n,
double* m,
double* l,
double Fn,
double Fm,
double Fl,
double& Fx,
double& Fy,
double& Fz
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;
194 F = 0.5 * (z * (v - v_hat) + (T - T_hat));
198 F = 0.5 * (z * (v - v_hat) - (T - T_hat));
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)