9 template <
class Shortcuts,
typename T>
38 if (faceIndex < DIMENSIONS) {
52 template <
class Shortcuts,
typename T,
int basisSize,
int numberOfVariables,
int numberOfData,
int surface = 2>
65 kernels::idx3 idx_FLR(basisSize, basisSize, numberOfVariables);
67 T FLn, FLm, FLl, FRn, FRm, FRl;
68 T FLx, FLy, FLz, FRx, FRy, FRz;
69 T FL_n, FL_m, FL_l, FR_n, FR_m, FR_l;
70 T FL_x, FL_y, FL_z, FR_x, FR_y, FR_z;
72 for (
int i = 0; i < basisSize; i++) {
74 for (
int j = 0;
j < basisSize;
j++) {
76 const T* Q_p = QR + idx_QLR(i,
j, 0);
77 const T* Q_m = QL + idx_QLR(i,
j, 0);
79 T* F_m = FL + idx_FLR(i,
j, 0);
80 T* F_p = FR + idx_FLR(i,
j, 0);
81 T rho_m, cp_m, cs_m, mu_m, lam_m;
82 T rho_p, cp_p, cs_p, mu_p, lam_p;
84 computeParameters<Shortcuts>(Q_m, rho_m, cp_m, cs_m, mu_m, lam_m);
85 computeParameters<Shortcuts>(Q_p, rho_p, cp_p, cs_p, mu_p, lam_p);
87 T n_m[3], m_m[3], l_m[3];
88 T n_p[3], m_p[3], l_p[3];
91 getNormals<Shortcuts>(Q_m, direction, norm_m, n_m);
92 getNormals<Shortcuts>(Q_p, direction, norm_p, n_p);
96 computeTractions<Shortcuts>(Q_p, n_p, Tx_p, Ty_p, Tz_p);
97 computeTractions<Shortcuts>(Q_m, n_m, Tx_m, Ty_m, Tz_m);
101 getVelocities<Shortcuts>(Q_p, vx_p, vy_p, vz_p);
102 getVelocities<Shortcuts>(Q_m, vx_m, vy_m, vz_m);
120 T zs_m = rho_m * cs_m;
121 T zs_p = rho_p * cs_p;
123 T zp_m = rho_m * cp_m;
124 T zp_p = rho_p * cp_p;
127 assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),
"Impedance must be greater than zero !", zp_p, zp_m);
131 T vn_hat_p, vm_hat_p, vl_hat_p;
132 T Tn_hat_p, Tm_hat_p, Tl_hat_p;
133 T vn_hat_m, vm_hat_m, vl_hat_m;
134 T Tn_hat_m, Tm_hat_m, Tl_hat_m;
136 if (isBoundaryFace) {
138 T r = faceIndex == surface ? 1 : 0;
177 riemannSolverNodal(vn_p, vn_m, Tn_p, Tn_m, zp_p, zp_m, vn_hat_p, vn_hat_m, Tn_hat_p, Tn_hat_m);
178 riemannSolverNodal(vm_p, vm_m, Tm_p, Tm_m, zs_p, zs_m, vm_hat_p, vm_hat_m, Tm_hat_p, Tm_hat_m);
179 riemannSolverNodal(vl_p, vl_m, Tl_p, Tl_m, zs_p, zs_m, vl_hat_p, vl_hat_m, Tl_hat_p, Tl_hat_m);
228 F_m[
Shortcuts::sigma + 0] = norm_m * ((2 * mu_m + lam_m) * n_m[0] * FL_x + lam_m * n_m[1] * FL_y + lam_m * n_m[2] * FL_z);
229 F_m[
Shortcuts::sigma + 1] = norm_m * ((2 * mu_m + lam_m) * n_m[1] * FL_y + lam_m * n_m[0] * FL_x + lam_m * n_m[2] * FL_z);
230 F_m[
Shortcuts::sigma + 2] = norm_m * ((2 * mu_m + lam_m) * n_m[2] * FL_z + lam_m * n_m[0] * FL_x + lam_m * n_m[1] * FL_y);
233 * ((2 * mu_p + lam_p) * n_p[0] * FR_x + lam_p * n_p[1] * FR_y + lam_p * n_p[2] * FR_z);
235 * ((2 * mu_p + lam_p) * n_p[1] * FR_y + lam_p * n_p[0] * FR_x + lam_p * n_p[2] * FR_z);
237 * ((2 * mu_p + lam_p) * n_p[2] * FR_z + lam_p * n_p[0] * FR_x + lam_p * n_p[1] * FR_y);
239 F_m[
Shortcuts::sigma + 3] = norm_m * mu_m * (n_m[1] * FL_x + n_m[0] * FL_y);
240 F_m[
Shortcuts::sigma + 4] = norm_m * mu_m * (n_m[2] * FL_x + n_m[0] * FL_z);
241 F_m[
Shortcuts::sigma + 5] = norm_m * mu_m * (n_m[2] * FL_y + n_m[1] * FL_z);
243 F_p[
Shortcuts::sigma + 3] = -norm_p * mu_p * (n_p[1] * FR_x + n_p[0] * FR_y);
244 F_p[
Shortcuts::sigma + 4] = -norm_p * mu_p * (n_p[2] * FR_x + n_p[0] * FR_z);
245 F_p[
Shortcuts::sigma + 5] = -norm_p * mu_p * (n_p[2] * FR_y + n_p[1] * FR_z);
void computeFluctuationsLeft(T z, T myT, T T_hat, T v, T v_hat, T &F)
void riemannSolverBoundary(int faceIndex, double r, double vn, double vm, double vl, double Tn, double Tm, double Tl, double zp, double zs[2], double &vn_hat, double &vm_hat, double &vl_hat, double &Tn_hat, double &Tm_hat, double &Tl_hat)
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 computeParameters(const double *Q, double &rho, double &cp, double cs[], int direction)
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 riemannSolver(double *FL, double *FR, const double *const QL, const double *const QR, const double dt, const int direction, bool isBoundaryFace, int faceIndex)
void riemannSolverBC0(T v, T sigma, T z, T r, T &v_hat, T &sigma_hat)