10 template <
class Shortcuts>
11 inline void getStiffnessTensor(
const double*Q,
double& c11,
double& c22,
double& c33,
double& c44,
double& c55,
double& c66,
double& c12,
double& c13,
double& c23){
24 template <
class Shortcuts>
44 std::cout <<
"Direction : " << direction <<
" not defined" << std::endl;
68 if (faceIndex < DIMENSIONS) {
82 template <
class Shortcuts,
int order,
int numberOfVariables,
int numberOfParameters>
86 const double*
const QL,
87 const double*
const QR,
94 constexpr
int numberOfData = numberOfVariables + numberOfParameters;
95 constexpr
int basisSize =
order + 1;
98 kernels::idx3 idx_FLR(basisSize, basisSize, numberOfVariables);
100 double FLn, FLm, FLl, FRn, FRm, FRl;
101 double FLx, FLy, FLz, FRx, FRy, FRz;
102 double FL_n, FL_m, FL_l, FR_n, FR_m, FR_l;
103 double FL_x, FL_y, FL_z, FR_x, FR_y, FR_z;
105 for (
int i = 0; i < basisSize; i++) {
106 for (
int j = 0;
j < basisSize;
j++) {
108 const double* Q_p = QR + idx_QLR(i,
j, 0);
109 const double* Q_m = QL + idx_QLR(i,
j, 0);
111 double* F_m = FL + idx_FLR(i,
j, 0);
112 double* F_p = FR + idx_FLR(i,
j, 0);
113 double rho_m, cp_m, cs_m[2], c11_m, c22_m, c33_m, c44_m, c55_m, c66_m, c12_m, c13_m, c23_m;
114 double rho_p, cp_p, cs_p[2], c11_p, c22_p, c33_p, c44_p, c55_p, c66_p, c12_p, c13_p, c23_p;
116 Numerics::getStiffnessTensor<Shortcuts>(Q_m, c11_m, c22_m, c33_m, c44_m, c55_m, c66_m, c12_m, c13_m, c23_m);
117 Numerics::getStiffnessTensor<Shortcuts>(Q_p, c11_p, c22_p, c33_p, c44_p, c55_p, c66_p, c12_p, c13_p, c23_p);
119 computeParameters<Shortcuts>(Q_m, rho_m, cp_m, cs_m, direction);
120 computeParameters<Shortcuts>(Q_p, rho_p, cp_p, cs_p, direction);
122 double n_m[3], m_m[3], l_m[3];
123 double n_p[3], m_p[3], l_p[3];
124 double norm_p, norm_m;
126 getNormals<Shortcuts>(Q_m, direction, norm_m, n_m);
127 getNormals<Shortcuts>(Q_p, direction, norm_p, n_p);
129 double Tx_m, Ty_m, Tz_m;
130 double Tx_p, Ty_p, Tz_p;
131 computeTractions<Shortcuts>(Q_p, n_p, Tx_p, Ty_p, Tz_p);
132 computeTractions<Shortcuts>(Q_m, n_m, Tx_m, Ty_m, Tz_m);
134 double vx_m, vy_m, vz_m;
135 double vx_p, vy_p, vz_p;
136 getVelocities<Shortcuts>(Q_p, vx_p, vy_p, vz_p);
137 getVelocities<Shortcuts>(Q_m, vx_m, vy_m, vz_m);
142 double Tn_m, Tm_m, Tl_m;
143 double Tn_p, Tm_p, Tl_p;
149 double vn_m, vm_m, vl_m;
150 double vn_p, vm_p, vl_p;
158 zs_m[0] = rho_m * cs_m[0];
159 zs_m[1] = rho_m * cs_m[1];
161 zs_p[0] = rho_m * cs_p[0];
162 zs_p[1] = rho_m * cs_p[1];
164 double zp_m = rho_m * cp_m;
165 double zp_p = rho_p * cp_p;
168 assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),
"Impedance must be greater than zero !", zp_p, zs_p);
172 double vn_hat_p, vm_hat_p, vl_hat_p;
173 double Tn_hat_p, Tm_hat_p, Tl_hat_p;
174 double vn_hat_m, vm_hat_m, vl_hat_m;
175 double Tn_hat_m, Tm_hat_m, Tl_hat_m;
177 if (isBoundaryFace) {
179 double r = faceIndex == 2 ? 1 : 0;
218 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);
219 riemannSolverNodal(vm_p, vm_m, Tm_p, Tm_m, zs_p[0], zs_m[0], vm_hat_p, vm_hat_m, Tm_hat_p, Tm_hat_m);
220 riemannSolverNodal(vl_p, vl_m, Tl_p, Tl_m, zs_p[1], zs_m[1], vl_hat_p, vl_hat_m, Tl_hat_p, Tl_hat_m);
235 FL_m = FLm / zs_m[0];
240 FL_l = FLl / zs_m[1];
247 FR_m = FRm / zs_p[0];
253 FR_l = FRl / zs_p[1];
276 F_m[
Shortcuts::sigma + 0] = norm_m * (c11_m * n_m[0] * FL_x + c12_m * n_m[1] * FL_y + c13_m * n_m[2] * FL_z);
277 F_m[
Shortcuts::sigma + 1] = norm_m * (c12_m * n_m[0] * FL_x + c22_m * n_m[1] * FL_y + c23_m * n_m[2] * FL_z);
278 F_m[
Shortcuts::sigma + 2] = norm_m * (c13_m * n_m[0] * FL_x + c23_m * n_m[1] * FL_y + c33_m * n_m[2] * FL_z);
280 F_p[
Shortcuts::sigma + 0] = -norm_p * (c11_p * n_p[0] * FR_x + c12_p * n_p[1] * FR_y + c13_p * n_p[2] * FR_z);
281 F_p[
Shortcuts::sigma + 1] = -norm_p * (c12_p * n_p[0] * FR_x + c22_p * n_p[1] * FR_y + c23_p * n_p[2] * FR_z);
282 F_p[
Shortcuts::sigma + 2] = -norm_p * (c13_p * n_p[0] * FR_x + c23_p * n_p[1] * FR_y + c33_p * n_p[2] * FR_z);
284 F_m[
Shortcuts::sigma + 3] = norm_m * c44_m * (n_m[1] * FL_x + n_m[0] * FL_y);
285 F_m[
Shortcuts::sigma + 4] = norm_m * c55_m * (n_m[2] * FL_x + n_m[0] * FL_z);
286 F_m[
Shortcuts::sigma + 5] = norm_m * c66_m * (n_m[2] * FL_y + n_m[1] * FL_z);
288 F_p[
Shortcuts::sigma + 3] = -norm_p * c44_p * (n_p[1] * FR_x + n_p[0] * FR_y);
289 F_p[
Shortcuts::sigma + 4] = -norm_p * c55_p * (n_p[2] * FR_x + n_p[0] * FR_z);
290 F_p[
Shortcuts::sigma + 5] = -norm_p * c66_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 getStiffnessTensor(const double *Q, double &c11, double &c22, double &c33, double &c44, double &c55, double &c66, double &c12, double &c13, double &c23)
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)