3 #include "../Curvilinear/ContextSlipWeakening.h"
4 #include "riemannsolver_pml.h"
7 template <
class Shortcuts,
int basisSize,
int numberOfVariables,
int numberOfParameters,
typename T>
10 const T*
const QL,
const T*
const QR,
11 const double t,
const double dt,
12 const tarch::la::Vector<DIMENSIONS, double>&
cellSize,
21 constexpr
int numberOfData = numberOfVariables+numberOfParameters;
28 int level = std::round(log(domainSize[0]/
cellSize[0])/log(3.)) + 1;
30 int elt_z =
int(std::round( (QL[idx_QLR(0,0,s::curve_grid+2)] -
31 this->domainOffset[2])/ this->max_dx)) * basisSize;
32 int elt_y =
int(std::round((QL[idx_QLR(0,0,s::curve_grid+1)] -
33 this->domainOffset[1])/ this->max_dx)) * basisSize;
35 bool is_fault = (direction == 0);
37 Root* root = this->interface->getRoot();
38 InnerNode* fault_node =
static_cast<InnerNode*
>(root->getChild());
40 Coordinate fault_coords[2];
41 fault_node->getCoordinates(fault_coords);
42 Coordinate fault_normal = fault_node->getFaceNormal();
43 T position = fault_node->getPosition();
45 for (
int i = 0; i < basisSize; i++) {
46 for (
int j = 0;
j < basisSize;
j++) {
47 T eta = QL[idx_QLR(i,
j,s::curve_grid + (2-fault_normal))];
48 T xi = QL[idx_QLR(i,
j,s::curve_grid + (2-fault_coords[0]))];
49 T
mu = QL[idx_QLR(i,
j,s::curve_grid + (2-fault_coords[1]))];
51 T per_position = position + fault_node->evalPerturbation(xi,
mu);
53 is_fault = is_fault && (std::abs(eta - per_position) <
cellSize[2-fault_normal] * 0.5);
57 T FLn ,FLm ,FLl ,FRn ,FRm ,FRl;
58 T FLx ,FLy ,FLz ,FRx ,FRy ,FRz;
59 T FL_n,FL_m,FL_l,FR_n,FR_m,FR_l;
60 T FL_x,FL_y,FL_z,FR_x,FR_y,FR_z;
62 for (
int i = 0; i < basisSize; i++) {
63 for (
int j = 0;
j < basisSize;
j++) {
65 const T* Q_m = QL+idx_QLR(i,
j,0);
66 const T* Q_p = QR+idx_QLR(i,
j,0);
68 T* F_m = FL + idx_FLR(i,
j,0);
69 T* F_p = FR + idx_FLR(i,
j,0);
70 T rho_m,cp_m,cs_m,mu_m,lam_m;
71 T rho_p,cp_p,cs_p,mu_p,lam_p;
73 ::Numerics::compute_parameters<Shortcuts>(Q_m,rho_m,cp_m,cs_m,mu_m,lam_m);
74 ::Numerics::compute_parameters<Shortcuts>(Q_p,rho_p,cp_p,cs_p,mu_p,lam_p);
76 T n_m[3],m_m[3],l_m[3];
77 T n_p[3],m_p[3],l_p[3];
80 ::Numerics::get_normals<Shortcuts>(Q_m,direction,norm_m,n_m);
81 ::Numerics::get_normals<Shortcuts>(Q_p,direction,norm_p,n_p);
85 ::Numerics::compute_tractions<Shortcuts>(Q_p,n_p,Tx_p,Ty_p,Tz_p);
86 ::Numerics::compute_tractions<Shortcuts>(Q_m,n_m,Tx_m,Ty_m,Tz_m);
90 ::Numerics::get_velocities<Shortcuts>(Q_p,vx_p,vy_p,vz_p);
91 ::Numerics::get_velocities<Shortcuts>(Q_m,vx_m,vy_m,vz_m);
93 ::Numerics::create_local_basis(n_p, m_p, l_p);
94 ::Numerics::create_local_basis(n_m, m_m, l_m);
117 assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),
"Impedance must be greater than zero !",zp_p,zs_p);
121 T vn_hat_p,vm_hat_p,vl_hat_p;
122 T Tn_hat_p,Tm_hat_p,Tl_hat_p;
123 T vn_hat_m,vm_hat_m,vl_hat_m;
124 T Tn_hat_m,Tm_hat_m,Tl_hat_m;
128 T Sn_m,Sm_m,Sl_m,Sn_p,Sm_p,Sl_p;
129 T Sx_m,Sy_m,Sz_m,Sx_p,Sy_p,Sz_p;
131 double x[3] = {QR[idx_QLR(i,
j,s::curve_grid + 0)],
132 QR[idx_QLR(i,
j,s::curve_grid + 1)],
133 QR[idx_QLR(i,
j,s::curve_grid + 2)]};
135 Sx_p = QR[idx_QLR(i,
j,
s::u + 0)];
136 Sy_p = QR[idx_QLR(i,
j,
s::u + 1)];
137 Sz_p = QR[idx_QLR(i,
j,
s::u + 2)];
139 Sx_m = QL[idx_QLR(i,
j,
s::u + 0)];
140 Sy_m = QL[idx_QLR(i,
j,
s::u + 1)];
141 Sz_m = QL[idx_QLR(i,
j,
s::u + 2)];
145 QL[idx_QLR(i,
j,s::curve_grid + 0 )],
146 QL[idx_QLR(i,
j,s::curve_grid + 1 )],
147 QL[idx_QLR(i,
j,s::curve_grid + 2 )]
153 T S = std::sqrt((Sl_p- Sl_m)*(Sl_p- Sl_m)+(Sm_p- Sm_m)*(Sm_p- Sm_m));
156 vn_p,vn_m, Tn_p,Tn_m, zp_p , zp_m, vn_hat_p , vn_hat_m, Tn_hat_p,Tn_hat_m, vm_p,vm_m,
157 Tm_p,Tm_m, zs_p,zs_m, vm_hat_p, vm_hat_m, Tm_hat_p,Tm_hat_m, vl_p,vl_m,Tl_p,Tl_m, zs_p,
158 zs_m, vl_hat_p , vl_hat_m, Tl_hat_p,Tl_hat_m, l_p, m_p, n_p,
165 else if (isBoundaryFace) {
167 T r= faceIndex == surface ? 1 : 0;
173 vn_hat_m,vm_hat_m,vl_hat_m,
174 Tn_hat_m,Tm_hat_m,Tl_hat_m);
179 vn_hat_p,vm_hat_p,vl_hat_p,
180 Tn_hat_p,Tm_hat_p,Tl_hat_p);
201 ::Numerics::compute_fluctuations_left(zp_m,
205 ::Numerics::compute_fluctuations_left(zs_m,
209 ::Numerics::compute_fluctuations_left(zs_m,
214 ::Numerics::compute_fluctuations_right(zp_p,
218 ::Numerics::compute_fluctuations_right(zs_p,
222 ::Numerics::compute_fluctuations_right(zs_p,
264 F_p[
s::v + 0] = norm_p/rho_p*FRx;
265 F_m[
s::v + 0] = norm_m/rho_m*FLx;
267 F_p[
s::v + 1] = norm_p/rho_p*FRy;
268 F_m[
s::v + 1] = norm_m/rho_m*FLy;
270 F_p[
s::v + 2] = norm_p/rho_p*FRz;
271 F_m[
s::v + 2] = norm_m/rho_m*FLz;
273 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);
274 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);
275 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);
277 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);
278 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);
279 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);
281 F_m[
s::sigma + 3] = norm_m*mu_m*(n_m[1]*FL_x + n_m[0]*FL_y);
282 F_m[
s::sigma + 4] = norm_m*mu_m*(n_m[2]*FL_x + n_m[0]*FL_z);
283 F_m[
s::sigma + 5] = norm_m*mu_m*(n_m[2]*FL_y + n_m[1]*FL_z);
285 F_p[
s::sigma + 3] = -norm_p*mu_p*(n_p[1]*FR_x + n_p[0]*FR_y);
286 F_p[
s::sigma + 4] = -norm_p*mu_p*(n_p[2]*FR_x + n_p[0]*FR_z);
287 F_p[
s::sigma + 5] = -norm_p*mu_p*(n_p[2]*FR_y + n_p[1]*FR_z);
const tarch::la::Vector< DIMENSIONS, double > cellSize
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 riemannSolver_boundary(int faceIndex, double r, double vn, double vm, double Tn, double Tm, double zp, double zs, double &vn_hat, double &vm_hat, double &Tn_hat, double &Tm_hat)
void rotate_into_physical_basis(double *n, double *m, double Fn, double Fm, double &Fx, double &Fy)
void rotate_into_orthogonal_basis(double *n, double *m, double Tx, double Ty, double &Tn, double &Tm)
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 SlipWeakeningFriction(double vn_p, double vn_m, double Tn_p, double Tn_m, double zn_p, double zn_m, double &vn_hat_p, double &vn_hat_m, double &Tn_hat_p, double &Tn_hat_m, double vm_p, double vm_m, double Tm_p, double Tm_m, double zm_p, double zm_m, double &vm_hat_p, double &vm_hat_m, double &Tm_hat_p, double &Tm_hat_m, double *m, double *n, double *x, double S)