10 const T*
const QL,
const T*
const QR,
11 const double t,
const double dt,
12 const tarch::la::Vector<DIMENSIONS, double>&
cellSize,
18 constexpr int numberOfData = numberOfVariables+numberOfParameters;
27 int elt_z = int(std::round( (QL[idx_QLR(0,0,Shortcuts::curve_grid+2)] -
29 int elt_y = int(std::round((QL[idx_QLR(0,0,Shortcuts::curve_grid+1)] -
32 bool is_fault = (direction == 0);
34 toolbox::curvi::Root* root = this->
interface->getRoot();
35 toolbox::curvi::InnerNode* fault_node =
static_cast<toolbox::curvi::InnerNode*
>(root->getChild());
37 toolbox::curvi::Coordinate fault_coords[2];
38 fault_node->getCoordinates(fault_coords);
39 toolbox::curvi::Coordinate fault_normal = fault_node->getFaceNormal();
40 T position = fault_node->getPosition();
42 for (
int i = 0; i < basisSize; i++) {
43 for (
int j = 0; j < basisSize; j++) {
44 T eta = QL[idx_QLR(i,j,Shortcuts::curve_grid + (2-fault_normal))];
45 T xi = QL[idx_QLR(i,j,Shortcuts::curve_grid + (2-fault_coords[0]))];
46 T mu = QL[idx_QLR(i,j,Shortcuts::curve_grid + (2-fault_coords[1]))];
48 T per_position = position + fault_node->evalPerturbation(xi,mu);
50 is_fault = is_fault && (std::abs(eta - per_position) <
cellSize[2-fault_normal] * 0.5);
54 T FLn ,FLm ,FLl ,FRn ,FRm ,FRl;
55 T FLx ,FLy ,FLz ,FRx ,FRy ,FRz;
56 T FL_n,FL_m,FL_l,FR_n,FR_m,FR_l;
57 T FL_x,FL_y,FL_z,FR_x,FR_y,FR_z;
59 for (
int i = 0; i < basisSize; i++) {
60 for (
int j = 0; j < basisSize; j++) {
62 const T* Q_m = QL+idx_QLR(i,j,0);
63 const T* Q_p = QR+idx_QLR(i,j,0);
65 T* F_m = FL + idx_FLR(i,j,0);
66 T* F_p = FR + idx_FLR(i,j,0);
67 T rho_m,cp_m,cs_m,mu_m,lam_m;
68 T rho_p,cp_p,cs_p,mu_p,lam_p;
73 T n_m[3],m_m[3],l_m[3];
74 T n_p[3],m_p[3],l_p[3];
114 assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),
"Impedance must be greater than zero !",zp_p,zs_p);
118 T vn_hat_p,vm_hat_p,vl_hat_p;
119 T Tn_hat_p,Tm_hat_p,Tl_hat_p;
120 T vn_hat_m,vm_hat_m,vl_hat_m;
121 T Tn_hat_m,Tm_hat_m,Tl_hat_m;
125 T Sn_m,Sm_m,Sl_m,Sn_p,Sm_p,Sl_p;
126 T Sx_m,Sy_m,Sz_m,Sx_p,Sy_p,Sz_p;
128 double x[3] = {QR[idx_QLR(i,j,Shortcuts::curve_grid + 0)],
129 QR[idx_QLR(i,j,Shortcuts::curve_grid + 1)],
130 QR[idx_QLR(i,j,Shortcuts::curve_grid + 2)]};
132 Sx_p = QR[idx_QLR(i,j,Shortcuts::u + 0)];
133 Sy_p = QR[idx_QLR(i,j,Shortcuts::u + 1)];
134 Sz_p = QR[idx_QLR(i,j,Shortcuts::u + 2)];
136 Sx_m = QL[idx_QLR(i,j,Shortcuts::u + 0)];
137 Sy_m = QL[idx_QLR(i,j,Shortcuts::u + 1)];
138 Sz_m = QL[idx_QLR(i,j,Shortcuts::u + 2)];
142 QL[idx_QLR(i,j,Shortcuts::curve_grid + 0 )],
143 QL[idx_QLR(i,j,Shortcuts::curve_grid + 1 )],
144 QL[idx_QLR(i,j,Shortcuts::curve_grid + 2 )]
150 T S = std::sqrt((Sl_p- Sl_m)*(Sl_p- Sl_m)+(Sm_p- Sm_m)*(Sm_p- Sm_m));
153 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,
154 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,
155 zs_m, vl_hat_p , vl_hat_m, Tl_hat_p,Tl_hat_m, l_p, m_p, n_p,
162 else if (isBoundaryFace) {
164 T r= faceIndex == surface ? 1 : 0;
170 vn_hat_m,vm_hat_m,vl_hat_m,
171 Tn_hat_m,Tm_hat_m,Tl_hat_m);
176 vn_hat_p,vm_hat_p,vl_hat_p,
177 Tn_hat_p,Tm_hat_p,Tl_hat_p);
261 F_p[Shortcuts::v + 0] = norm_p/rho_p*FRx;
262 F_m[Shortcuts::v + 0] = norm_m/rho_m*FLx;
264 F_p[Shortcuts::v + 1] = norm_p/rho_p*FRy;
265 F_m[Shortcuts::v + 1] = norm_m/rho_m*FLy;
267 F_p[Shortcuts::v + 2] = norm_p/rho_p*FRz;
268 F_m[Shortcuts::v + 2] = norm_m/rho_m*FLz;
270 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);
271 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);
272 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);
274 F_p[Shortcuts::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);
275 F_p[Shortcuts::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);
276 F_p[Shortcuts::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);
278 F_m[Shortcuts::sigma + 3] = norm_m*mu_m*(n_m[1]*FL_x + n_m[0]*FL_y);
279 F_m[Shortcuts::sigma + 4] = norm_m*mu_m*(n_m[2]*FL_x + n_m[0]*FL_z);
280 F_m[Shortcuts::sigma + 5] = norm_m*mu_m*(n_m[2]*FL_y + n_m[1]*FL_z);
282 F_p[Shortcuts::sigma + 3] = -norm_p*mu_p*(n_p[1]*FR_x + n_p[0]*FR_y);
283 F_p[Shortcuts::sigma + 4] = -norm_p*mu_p*(n_p[2]*FR_x + n_p[0]*FR_z);
284 F_p[Shortcuts::sigma + 5] = -norm_p*mu_p*(n_p[2]*FR_y + n_p[1]*FR_z);
286 F_m[Shortcuts::u + 0] = 0;
287 F_m[Shortcuts::u + 1] = 0;
288 F_m[Shortcuts::u + 2] = 0;
290 F_p[Shortcuts::u + 0] = 0;
291 F_p[Shortcuts::u + 1] = 0;
292 F_p[Shortcuts::u + 2] = 0;
void slipWeakeningFriction(T vn_p, T vn_m, T Tn_p, T Tn_m, T zn_p, T zn_m, T &vn_hat_p, T &vn_hat_m, T &Tn_hat_p, T &Tn_hat_m, T vm_p, T vm_m, T Tm_p, T Tm_m, T zl_p, T zl_m, T &vm_hat_p, T &vm_hat_m, T &Tm_hat_p, T &Tm_hat_m, T vl_p, T vl_m, T Tl_p, T Tl_m, T zm_p, T zm_m, T &vl_hat_p, T &vl_hat_m, T &Tl_hat_p, T &Tl_hat_m, T *const l, T *const m, T *const n, double *const x, T S, double t)