6 template <
class Shortcuts>
7 inline void compute_parameters(
const double*Q,
double& rho,
double& cp,
double& cs,
double& mu,
double& lam){
13 lam =
rho* cp * cp - 2.0 * mu;
17 inline void riemannSolver_boundary(
int faceIndex,
double r,
double vn ,
double vm ,
double vl,
double Tn ,
double Tm ,
double Tl ,
double zp,
double zs ,
double& vn_hat ,
double& vm_hat ,
double& vl_hat ,
double& Tn_hat ,
double& Tm_hat ,
double& Tl_hat)
20 if (faceIndex < Dimensions) {
35 template<
class Shortcuts,
int order,
int numberOfVariables,
int numberOfParameters ,
int surface = 2>
36 void riemannSolver(
double* FL,
double* FR,
const double*
const QL,
const double*
const QR,
const double dt,
const int direction,
bool isBoundaryFace,
int faceIndex){
38 constexpr int numberOfData = numberOfVariables+numberOfParameters;
39 constexpr int basisSize =
order+1;
44 double FLn ,FLm ,FLl ,FRn ,FRm ,FRl;
45 double FLx ,FLy ,FLz ,FRx ,FRy ,FRz;
46 double FL_n,FL_m,FL_l,FR_n,FR_m,FR_l;
47 double FL_x,FL_y,FL_z,FR_x,FR_y,FR_z;
51 for (
int i = 0;
i < basisSize;
i++) {
52 for (
int j = 0; j < basisSize; j++) {
54 const double* Q_m = QL+idx_QLR(i,j,0);
55 const double* Q_p = QR+idx_QLR(i,j,0);
57 double dmp_pml_x_m = Q_m[
s.dmp_pml + 0];
58 double dmp_pml_y_m = Q_m[
s.dmp_pml + 1];
59 double dmp_pml_z_m = Q_m[
s.dmp_pml + 2];
61 double dmp_pml_x_p = Q_p[
s.dmp_pml + 0];
62 double dmp_pml_y_p = Q_p[
s.dmp_pml + 1];
63 double dmp_pml_z_p = Q_p[
s.dmp_pml + 2];
65 double* F_m = FL+idx_FLR(i,j,0);
66 double* F_p = FR+idx_FLR(i,j,0);
67 double rho_m,cp_m,cs_m,mu_m,lam_m;
68 double rho_p,cp_p,cs_p,mu_p,lam_p;
70 compute_parameters<Shortcuts>(Q_m,rho_m,cp_m,cs_m,mu_m,lam_m);
71 compute_parameters<Shortcuts>(Q_p,rho_p,cp_p,cs_p,mu_p,lam_p);
73 double n_m[3],m_m[3],l_m[3];
74 double n_p[3],m_p[3],l_p[3];
77 get_normals<Shortcuts>(Q_m,direction,norm_m,n_m);
78 get_normals<Shortcuts>(Q_p,direction,norm_p,n_p);
81 double Tx_m,Ty_m,Tz_m;
82 double Tx_p,Ty_p,Tz_p;
83 compute_tractions<Shortcuts>(Q_p,n_p,Tx_p,Ty_p,Tz_p);
84 compute_tractions<Shortcuts>(Q_m,n_m,Tx_m,Ty_m,Tz_m);
86 double vx_m,vy_m,vz_m;
87 double vx_p,vy_p,vz_p;
88 get_velocities<Shortcuts>(Q_p,vx_p,vy_p,vz_p);
89 get_velocities<Shortcuts>(Q_m,vx_m,vy_m,vz_m);
94 double Tn_m,Tm_m,Tl_m;
95 double Tn_p,Tm_p,Tl_p;
101 double vn_m,vm_m,vl_m;
102 double vn_p,vm_p,vl_p;
108 double zs_m=rho_m*cs_m;
109 double zs_p=rho_p*cs_p;
111 double zp_m=rho_m*cp_m;
112 double zp_p=rho_p*cp_p;
115 assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),
"Impedance must be greater than zero !",zp_p,zs_p);
119 double vn_hat_p,vm_hat_p,vl_hat_p;
120 double Tn_hat_p,Tm_hat_p,Tl_hat_p;
121 double vn_hat_m,vm_hat_m,vl_hat_m;
122 double Tn_hat_m,Tm_hat_m,Tl_hat_m;
124 if (isBoundaryFace) {
126 double r= faceIndex == surface ? 1 : 0;
132 vn_hat_m,vm_hat_m,vl_hat_m,
133 Tn_hat_m,Tm_hat_m,Tl_hat_m);
138 vn_hat_p,vm_hat_p,vl_hat_p,
139 Tn_hat_p,Tm_hat_p,Tl_hat_p);
223 F_p[
s.v + 0] = norm_p/rho_p*FRx;
224 F_m[
s.v + 0] = norm_m/rho_m*FLx;
226 F_p[
s.v + 1] = norm_p/rho_p*FRy;
227 F_m[
s.v + 1] = norm_m/rho_m*FLy;
229 F_p[
s.v + 2] = norm_p/rho_p*FRz;
230 F_m[
s.v + 2] = norm_m/rho_m*FLz;
232 F_m[
s.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);
233 F_m[
s.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);
234 F_m[
s.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);
236 F_p[
s.sigma + 0] = -norm_p*((2*mu_p+lam_p)*n_p[0]*FR_x+lam_p*n_p[1]*FR_y+lam_p*n_p[2]*FR_z);
237 F_p[
s.sigma + 1] = -norm_p*((2*mu_p+lam_p)*n_p[1]*FR_y+lam_p*n_p[0]*FR_x+lam_p*n_p[2]*FR_z);
238 F_p[
s.sigma + 2] = -norm_p*((2*mu_p+lam_p)*n_p[2]*FR_z+lam_p*n_p[0]*FR_x+lam_p*n_p[1]*FR_y);
240 F_m[
s.sigma + 3] = norm_m*mu_m*(n_m[1]*FL_x + n_m[0]*FL_y);
241 F_m[
s.sigma + 4] = norm_m*mu_m*(n_m[2]*FL_x + n_m[0]*FL_z);
242 F_m[
s.sigma + 5] = norm_m*mu_m*(n_m[2]*FL_y + n_m[1]*FL_z);
244 F_p[
s.sigma + 3] = -norm_p*mu_p*(n_p[1]*FR_x + n_p[0]*FR_y);
245 F_p[
s.sigma + 4] = -norm_p*mu_p*(n_p[2]*FR_x + n_p[0]*FR_z);
246 F_p[
s.sigma + 5] = -norm_p*mu_p*(n_p[2]*FR_y + n_p[1]*FR_z);
248 double norm_p_qr=norm_p;
249 double norm_m_qr=norm_m;
252 F_p[
s.pml + idx_pml(0,0)] = n_p[0]*dmp_pml_x_p*norm_p*FRx;
253 F_m[
s.pml + idx_pml(0,0)] = n_m[0]*dmp_pml_x_m*norm_m*FLx;
255 F_p[
s.pml + idx_pml(0,1)] = n_p[0]*dmp_pml_x_p*norm_p*FRy;
256 F_m[
s.pml + idx_pml(0,1)] = n_m[0]*dmp_pml_x_m*norm_m*FLy;
258 F_p[
s.pml + idx_pml(0,2)] = n_p[0]*dmp_pml_x_p*norm_p*FRz;
259 F_m[
s.pml + idx_pml(0,2)] = n_m[0]*dmp_pml_x_m*norm_m*FLz;
261 F_m[
s.pml + idx_pml(0,3)] = n_m[0]*dmp_pml_x_m*norm_m*n_m[0]*FL_x;
262 F_m[
s.pml + idx_pml(0,4)] = n_m[0]*dmp_pml_x_m*norm_m*n_m[1]*FL_y;
263 F_m[
s.pml + idx_pml(0,5)] = n_m[0]*dmp_pml_x_m*norm_m*n_m[2]*FL_z;
265 F_p[
s.pml + idx_pml(0,3)] = -n_p[0]*dmp_pml_x_p*norm_p*n_p[0]*FR_x;
266 F_p[
s.pml + idx_pml(0,4)] = -n_p[0]*dmp_pml_x_p*norm_p*n_p[1]*FR_y;
267 F_p[
s.pml + idx_pml(0,5)] = -n_p[0]*dmp_pml_x_p*norm_p*n_p[2]*FR_z;
269 F_m[
s.pml + idx_pml(0,6)] = n_m[0]*dmp_pml_x_m*norm_m*(n_m[1]*FL_x + n_m[0]*FL_y);
270 F_m[
s.pml + idx_pml(0,7)] = n_m[0]*dmp_pml_x_m*norm_m*(n_m[2]*FL_x + n_m[0]*FL_z);
271 F_m[
s.pml + idx_pml(0,8)] = n_m[0]*dmp_pml_x_m*norm_m*(n_m[2]*FL_y + n_m[1]*FL_z);
273 F_p[
s.pml + idx_pml(0,6)] = -n_p[0]*dmp_pml_x_p*norm_p*(n_p[1]*FR_x + n_p[0]*FR_y);
274 F_p[
s.pml + idx_pml(0,7)] = -n_p[0]*dmp_pml_x_p*norm_p*(n_p[2]*FR_x + n_p[0]*FR_z);
275 F_p[
s.pml + idx_pml(0,8)] = -n_p[0]*dmp_pml_x_p*norm_p*(n_p[2]*FR_y + n_p[1]*FR_z);
278 F_p[
s.pml + idx_pml(1,0)] = n_p[1]*dmp_pml_y_p*norm_p*FRx;
279 F_m[
s.pml + idx_pml(1,0)] = n_m[1]*dmp_pml_y_m*norm_m*FLx;
281 F_p[
s.pml + idx_pml(1,1)] = n_p[1]*dmp_pml_y_p*norm_p*FRy;
282 F_m[
s.pml + idx_pml(1,1)] = n_m[1]*dmp_pml_y_m*norm_m*FLy;
284 F_p[
s.pml + idx_pml(1,2)] = n_p[1]*dmp_pml_y_p*norm_p*FRz;
285 F_m[
s.pml + idx_pml(1,2)] = n_m[1]*dmp_pml_y_m*norm_m*FLz;
287 F_m[
s.pml + idx_pml(1,3)] = n_m[1]*dmp_pml_y_m*norm_m*n_m[0]*FL_x;
288 F_m[
s.pml + idx_pml(1,4)] = n_m[1]*dmp_pml_y_m*norm_m*n_m[1]*FL_y;
289 F_m[
s.pml + idx_pml(1,5)] = n_m[1]*dmp_pml_y_m*norm_m*n_m[2]*FL_z;
291 F_p[
s.pml + idx_pml(1,3)] = -n_p[1]*dmp_pml_y_p*norm_p*n_p[0]*FR_x;
292 F_p[
s.pml + idx_pml(1,4)] = -n_p[1]*dmp_pml_y_p*norm_p*n_p[1]*FR_y;
293 F_p[
s.pml + idx_pml(1,5)] = -n_p[1]*dmp_pml_y_p*norm_p*n_p[2]*FR_z;
295 F_m[
s.pml + idx_pml(1,6)] = n_m[1]*dmp_pml_y_m*norm_m*(n_m[1]*FL_x + n_m[0]*FL_y);
296 F_m[
s.pml + idx_pml(1,7)] = n_m[1]*dmp_pml_y_m*norm_m*(n_m[2]*FL_x + n_m[0]*FL_z);
297 F_m[
s.pml + idx_pml(1,8)] = n_m[1]*dmp_pml_y_m*norm_m*(n_m[2]*FL_y + n_m[1]*FL_z);
299 F_p[
s.pml + idx_pml(1,6)] = -n_p[1]*dmp_pml_y_p*norm_p*(n_p[1]*FR_x + n_p[0]*FR_y);
300 F_p[
s.pml + idx_pml(1,7)] = -n_p[1]*dmp_pml_y_p*norm_p*(n_p[2]*FR_x + n_p[0]*FR_z);
301 F_p[
s.pml + idx_pml(1,8)] = -n_p[1]*dmp_pml_y_p*norm_p*(n_p[2]*FR_y + n_p[1]*FR_z);
304 F_p[
s.pml + idx_pml(2,0)] = n_p[2]*dmp_pml_z_p*norm_p*FRx;
305 F_m[
s.pml + idx_pml(2,0)] = n_m[2]*dmp_pml_z_m*norm_m*FLx;
307 F_p[
s.pml + idx_pml(2,1)] = n_p[2]*dmp_pml_z_p*norm_p*FRy;
308 F_m[
s.pml + idx_pml(2,1)] = n_m[2]*dmp_pml_z_m*norm_m*FLy;
310 F_p[
s.pml + idx_pml(2,2)] = n_p[2]*dmp_pml_z_p*norm_p*FRz;
311 F_m[
s.pml + idx_pml(2,2)] = n_m[2]*dmp_pml_z_m*norm_m*FLz;
313 F_m[
s.pml + idx_pml(2,3)] = n_m[2]*dmp_pml_z_m*norm_m*n_m[0]*FL_x;
314 F_m[
s.pml + idx_pml(2,4)] = n_m[2]*dmp_pml_z_m*norm_m*n_m[1]*FL_y;
315 F_m[
s.pml + idx_pml(2,5)] = n_m[2]*dmp_pml_z_m*norm_m*n_m[2]*FL_z;
317 F_p[
s.pml + idx_pml(2,3)] = -n_p[2]*dmp_pml_z_p*norm_p*n_p[0]*FR_x;
318 F_p[
s.pml + idx_pml(2,4)] = -n_p[2]*dmp_pml_z_p*norm_p*n_p[1]*FR_y;
319 F_p[
s.pml + idx_pml(2,5)] = -n_p[2]*dmp_pml_z_p*norm_p*n_p[2]*FR_z;
321 F_m[
s.pml + idx_pml(2,6)] = n_m[2]*dmp_pml_z_m*norm_m*(n_m[1]*FL_x + n_m[0]*FL_y);
322 F_m[
s.pml + idx_pml(2,7)] = n_m[2]*dmp_pml_z_m*norm_m*(n_m[2]*FL_x + n_m[0]*FL_z);
323 F_m[
s.pml + idx_pml(2,8)] = n_m[2]*dmp_pml_z_m*norm_m*(n_m[2]*FL_y + n_m[1]*FL_z);
325 F_p[
s.pml + idx_pml(2,6)] = -n_p[2]*dmp_pml_z_p*norm_p*(n_p[1]*FR_x + n_p[0]*FR_y);
326 F_p[
s.pml + idx_pml(2,7)] = -n_p[2]*dmp_pml_z_p*norm_p*(n_p[2]*FR_x + n_p[0]*FR_z);
327 F_p[
s.pml + idx_pml(2,8)] = -n_p[2]*dmp_pml_z_p*norm_p*(n_p[2]*FR_y + n_p[1]*FR_z);
#define assertion3(expr, param0, param1, param2)
void compute_fluctuations_left(double z, double T, double T_hat, double v, double v_hat, double &F)
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_boundary(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 compute_parameters(const double *Q, double &rho, double &cp, double cs[], int direction)
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 riemannSolver(double *FL, double *FR, const double *const QL, const double *const QR, const double dt, const int direction, bool isBoundaryFace, int faceIndex)
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)