3 #include "../Curvilinear/ContextDynamicRupture.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,
18 constexpr
int numberOfData = numberOfVariables+numberOfParameters;
25 int level = std::round(log(domainSize[0]/
cellSize[0])/log(3.)) + 1;
27 int elt_z =
int(std::round( (QL[idx_QLR(0,0,Shortcuts::curve_grid+2)] -
28 this->domainOffset[2])/ this->max_dx)) * basisSize;
29 int elt_y =
int(std::round((QL[idx_QLR(0,0,Shortcuts::curve_grid+1)] -
30 this->domainOffset[1])/ this->max_dx)) * basisSize;
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 dmp_pml_x_m = Q_m[Shortcuts::dmp_pml + 0];
66 T dmp_pml_y_m = Q_m[Shortcuts::dmp_pml + 1];
67 T dmp_pml_z_m = Q_m[Shortcuts::dmp_pml + 2];
69 T dmp_pml_x_p = Q_p[Shortcuts::dmp_pml + 0];
70 T dmp_pml_y_p = Q_p[Shortcuts::dmp_pml + 1];
71 T dmp_pml_z_p = Q_p[Shortcuts::dmp_pml + 2];
73 T* F_m = FL + idx_FLR(i,
j,0);
74 T* F_p = FR + idx_FLR(i,
j,0);
75 T rho_m,cp_m,cs_m,mu_m,lam_m;
76 T rho_p,cp_p,cs_p,mu_p,lam_p;
78 ::Numerics::computeParameters<Shortcuts>(Q_m,rho_m,cp_m,cs_m,mu_m,lam_m);
79 ::Numerics::computeParameters<Shortcuts>(Q_p,rho_p,cp_p,cs_p,mu_p,lam_p);
81 T n_m[3],m_m[3],l_m[3];
82 T n_p[3],m_p[3],l_p[3];
85 ::Numerics::getNormals<Shortcuts>(Q_m,direction,norm_m,n_m);
86 ::Numerics::getNormals<Shortcuts>(Q_p,direction,norm_p,n_p);
90 ::Numerics::computeTractions<Shortcuts>(Q_p,n_p,Tx_p,Ty_p,Tz_p);
91 ::Numerics::computeTractions<Shortcuts>(Q_m,n_m,Tx_m,Ty_m,Tz_m);
95 ::Numerics::getVelocities<Shortcuts>(Q_p,vx_p,vy_p,vz_p);
96 ::Numerics::getVelocities<Shortcuts>(Q_m,vx_m,vy_m,vz_m);
122 assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),
"Impedance must be greater than zero !",zp_p,zs_p);
126 T vn_hat_p,vm_hat_p,vl_hat_p;
127 T Tn_hat_p,Tm_hat_p,Tl_hat_p;
128 T vn_hat_m,vm_hat_m,vl_hat_m;
129 T Tn_hat_m,Tm_hat_m,Tl_hat_m;
133 T Sn_m,Sm_m,Sl_m,Sn_p,Sm_p,Sl_p;
134 T Sx_m,Sy_m,Sz_m,Sx_p,Sy_p,Sz_p;
136 double x[3] = {QR[idx_QLR(i,
j,Shortcuts::curve_grid + 0)],
137 QR[idx_QLR(i,
j,Shortcuts::curve_grid + 1)],
138 QR[idx_QLR(i,
j,Shortcuts::curve_grid + 2)]};
150 QL[idx_QLR(i,
j,Shortcuts::curve_grid + 0 )],
151 QL[idx_QLR(i,
j,Shortcuts::curve_grid + 1 )],
152 QL[idx_QLR(i,
j,Shortcuts::curve_grid + 2 )]
158 T S = std::sqrt((Sl_p- Sl_m)*(Sl_p- Sl_m)+(Sm_p- Sm_m)*(Sm_p- Sm_m));
160 slipWeakeningFriction(
161 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,
162 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,
163 zs_m, vl_hat_p , vl_hat_m, Tl_hat_p,Tl_hat_m, l_p, m_p, n_p,
170 else if (isBoundaryFace) {
172 T r= faceIndex == surface ? 1 : 0;
178 vn_hat_m,vm_hat_m,vl_hat_m,
179 Tn_hat_m,Tm_hat_m,Tl_hat_m);
184 vn_hat_p,vm_hat_p,vl_hat_p,
185 Tn_hat_p,Tm_hat_p,Tl_hat_p);
278 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);
279 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);
280 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);
282 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);
283 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);
284 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);
306 F_p[Shortcuts::pml + idx_pml(0,0)] = n_p[0]*dmp_pml_x_p*norm_p*FRx;
307 F_m[Shortcuts::pml + idx_pml(0,0)] = n_m[0]*dmp_pml_x_m*norm_m*FLx;
309 F_p[Shortcuts::pml + idx_pml(0,1)] = n_p[0]*dmp_pml_x_p*norm_p*FRy;
310 F_m[Shortcuts::pml + idx_pml(0,1)] = n_m[0]*dmp_pml_x_m*norm_m*FLy;
312 F_p[Shortcuts::pml + idx_pml(0,2)] = n_p[0]*dmp_pml_x_p*norm_p*FRz;
313 F_m[Shortcuts::pml + idx_pml(0,2)] = n_m[0]*dmp_pml_x_m*norm_m*FLz;
315 F_m[Shortcuts::pml + idx_pml(0,3)] = n_m[0]*dmp_pml_x_m*norm_m*n_m[0]*FL_x;
316 F_m[Shortcuts::pml + idx_pml(0,4)] = n_m[0]*dmp_pml_x_m*norm_m*n_m[1]*FL_y;
317 F_m[Shortcuts::pml + idx_pml(0,5)] = n_m[0]*dmp_pml_x_m*norm_m*n_m[2]*FL_z;
319 F_p[Shortcuts::pml + idx_pml(0,3)] = -n_p[0]*dmp_pml_x_p*norm_p*n_p[0]*FR_x;
320 F_p[Shortcuts::pml + idx_pml(0,4)] = -n_p[0]*dmp_pml_x_p*norm_p*n_p[1]*FR_y;
321 F_p[Shortcuts::pml + idx_pml(0,5)] = -n_p[0]*dmp_pml_x_p*norm_p*n_p[2]*FR_z;
323 F_m[Shortcuts::pml + idx_pml(0,6)] = n_m[0]*dmp_pml_x_m*norm_m*(n_m[1]*FL_x + n_m[0]*FL_y);
324 F_m[Shortcuts::pml + idx_pml(0,7)] = n_m[0]*dmp_pml_x_m*norm_m*(n_m[2]*FL_x + n_m[0]*FL_z);
325 F_m[Shortcuts::pml + idx_pml(0,8)] = n_m[0]*dmp_pml_x_m*norm_m*(n_m[2]*FL_y + n_m[1]*FL_z);
327 F_p[Shortcuts::pml + idx_pml(0,6)] = -n_p[0]*dmp_pml_x_p*norm_p*(n_p[1]*FR_x + n_p[0]*FR_y);
328 F_p[Shortcuts::pml + idx_pml(0,7)] = -n_p[0]*dmp_pml_x_p*norm_p*(n_p[2]*FR_x + n_p[0]*FR_z);
329 F_p[Shortcuts::pml + idx_pml(0,8)] = -n_p[0]*dmp_pml_x_p*norm_p*(n_p[2]*FR_y + n_p[1]*FR_z);
332 F_p[Shortcuts::pml + idx_pml(1,0)] = n_p[1]*dmp_pml_y_p*norm_p*FRx;
333 F_m[Shortcuts::pml + idx_pml(1,0)] = n_m[1]*dmp_pml_y_m*norm_m*FLx;
335 F_p[Shortcuts::pml + idx_pml(1,1)] = n_p[1]*dmp_pml_y_p*norm_p*FRy;
336 F_m[Shortcuts::pml + idx_pml(1,1)] = n_m[1]*dmp_pml_y_m*norm_m*FLy;
338 F_p[Shortcuts::pml + idx_pml(1,2)] = n_p[1]*dmp_pml_y_p*norm_p*FRz;
339 F_m[Shortcuts::pml + idx_pml(1,2)] = n_m[1]*dmp_pml_y_m*norm_m*FLz;
341 F_m[Shortcuts::pml + idx_pml(1,3)] = n_m[1]*dmp_pml_y_m*norm_m*n_m[0]*FL_x;
342 F_m[Shortcuts::pml + idx_pml(1,4)] = n_m[1]*dmp_pml_y_m*norm_m*n_m[1]*FL_y;
343 F_m[Shortcuts::pml + idx_pml(1,5)] = n_m[1]*dmp_pml_y_m*norm_m*n_m[2]*FL_z;
345 F_p[Shortcuts::pml + idx_pml(1,3)] = -n_p[1]*dmp_pml_y_p*norm_p*n_p[0]*FR_x;
346 F_p[Shortcuts::pml + idx_pml(1,4)] = -n_p[1]*dmp_pml_y_p*norm_p*n_p[1]*FR_y;
347 F_p[Shortcuts::pml + idx_pml(1,5)] = -n_p[1]*dmp_pml_y_p*norm_p*n_p[2]*FR_z;
349 F_m[Shortcuts::pml + idx_pml(1,6)] = n_m[1]*dmp_pml_y_m*norm_m*(n_m[1]*FL_x + n_m[0]*FL_y);
350 F_m[Shortcuts::pml + idx_pml(1,7)] = n_m[1]*dmp_pml_y_m*norm_m*(n_m[2]*FL_x + n_m[0]*FL_z);
351 F_m[Shortcuts::pml + idx_pml(1,8)] = n_m[1]*dmp_pml_y_m*norm_m*(n_m[2]*FL_y + n_m[1]*FL_z);
353 F_p[Shortcuts::pml + idx_pml(1,6)] = -n_p[1]*dmp_pml_y_p*norm_p*(n_p[1]*FR_x + n_p[0]*FR_y);
354 F_p[Shortcuts::pml + idx_pml(1,7)] = -n_p[1]*dmp_pml_y_p*norm_p*(n_p[2]*FR_x + n_p[0]*FR_z);
355 F_p[Shortcuts::pml + idx_pml(1,8)] = -n_p[1]*dmp_pml_y_p*norm_p*(n_p[2]*FR_y + n_p[1]*FR_z);
358 F_p[Shortcuts::pml + idx_pml(2,0)] = n_p[2]*dmp_pml_z_p*norm_p*FRx;
359 F_m[Shortcuts::pml + idx_pml(2,0)] = n_m[2]*dmp_pml_z_m*norm_m*FLx;
361 F_p[Shortcuts::pml + idx_pml(2,1)] = n_p[2]*dmp_pml_z_p*norm_p*FRy;
362 F_m[Shortcuts::pml + idx_pml(2,1)] = n_m[2]*dmp_pml_z_m*norm_m*FLy;
364 F_p[Shortcuts::pml + idx_pml(2,2)] = n_p[2]*dmp_pml_z_p*norm_p*FRz;
365 F_m[Shortcuts::pml + idx_pml(2,2)] = n_m[2]*dmp_pml_z_m*norm_m*FLz;
367 F_m[Shortcuts::pml + idx_pml(2,3)] = n_m[2]*dmp_pml_z_m*norm_m*n_m[0]*FL_x;
368 F_m[Shortcuts::pml + idx_pml(2,4)] = n_m[2]*dmp_pml_z_m*norm_m*n_m[1]*FL_y;
369 F_m[Shortcuts::pml + idx_pml(2,5)] = n_m[2]*dmp_pml_z_m*norm_m*n_m[2]*FL_z;
371 F_p[Shortcuts::pml + idx_pml(2,3)] = -n_p[2]*dmp_pml_z_p*norm_p*n_p[0]*FR_x;
372 F_p[Shortcuts::pml + idx_pml(2,4)] = -n_p[2]*dmp_pml_z_p*norm_p*n_p[1]*FR_y;
373 F_p[Shortcuts::pml + idx_pml(2,5)] = -n_p[2]*dmp_pml_z_p*norm_p*n_p[2]*FR_z;
375 F_m[Shortcuts::pml + idx_pml(2,6)] = n_m[2]*dmp_pml_z_m*norm_m*(n_m[1]*FL_x + n_m[0]*FL_y);
376 F_m[Shortcuts::pml + idx_pml(2,7)] = n_m[2]*dmp_pml_z_m*norm_m*(n_m[2]*FL_x + n_m[0]*FL_z);
377 F_m[Shortcuts::pml + idx_pml(2,8)] = n_m[2]*dmp_pml_z_m*norm_m*(n_m[2]*FL_y + n_m[1]*FL_z);
379 F_p[Shortcuts::pml + idx_pml(2,6)] = -n_p[2]*dmp_pml_z_p*norm_p*(n_p[1]*FR_x + n_p[0]*FR_y);
380 F_p[Shortcuts::pml + idx_pml(2,7)] = -n_p[2]*dmp_pml_z_p*norm_p*(n_p[2]*FR_x + n_p[0]*FR_z);
381 F_p[Shortcuts::pml + idx_pml(2,8)] = -n_p[2]*dmp_pml_z_p*norm_p*(n_p[2]*FR_y + n_p[1]*FR_z);
const tarch::la::Vector< DIMENSIONS, double > cellSize
void riemannSolver(T *FL, T *FR, const T *const QL, const T *const QR, const double t, const double dt, const tarch::la::Vector< DIMENSIONS, double > &cellSize, const int direction, bool isBoundaryFace, int faceIndex, int surface=2)
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 createLocalBasis(T *n, T *m, T *l)
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)