Peano
riemannsolver_slipweakening.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "../Curvilinear/ContextSlipWeakening.h"
4 #include "riemannsolver_pml.h"
5 #include "slipweakening.h"
6 
7 template <class Shortcuts, int basisSize, int numberOfVariables, int numberOfParameters, typename T>
9  T* FL, T* FR,
10  const T* const QL, const T* const QR,
11  const double t, const double dt,
12  const tarch::la::Vector<DIMENSIONS, double>& cellSize,
13  const int direction,
14  bool isBoundaryFace,
15  int faceIndex,
16  int surface
17 ){
18 
19  using s = Shortcuts;
20 
21  constexpr int numberOfData = numberOfVariables+numberOfParameters;
22  // constexpr int basisSize = order+1;
23 
24  ::kernels::idx3 idx_QLR(basisSize,basisSize,numberOfData);
25  ::kernels::idx3 idx_FLR(basisSize,basisSize,numberOfVariables);
26 
27  //Checking whether the face is on a fault
28  int level = std::round(log(domainSize[0]/cellSize[0])/log(3.)) + 1;
29 
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;
34 
35  bool is_fault = (direction == 0);
36 
37  Root* root = this->interface->getRoot();
38  InnerNode* fault_node = static_cast<InnerNode*>(root->getChild());
39 
40  Coordinate fault_coords[2];
41  fault_node->getCoordinates(fault_coords);
42  Coordinate fault_normal = fault_node->getFaceNormal();
43  T position = fault_node->getPosition();
44 
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]))];
50 
51  T per_position = position + fault_node->evalPerturbation(xi,mu);
52 
53  is_fault = is_fault && (std::abs(eta - per_position) < cellSize[2-fault_normal] * 0.5);
54  }
55  }
56 
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;
61 
62  for (int i = 0; i < basisSize; i++) {
63  for (int j = 0; j < basisSize; j++) {
64 
65  const T* Q_m = QL+idx_QLR(i,j,0);
66  const T* Q_p = QR+idx_QLR(i,j,0);
67 
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;
72 
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);
75 
76  T n_m[3],m_m[3],l_m[3];
77  T n_p[3],m_p[3],l_p[3];
78  T norm_p,norm_m;
79 
80  ::Numerics::get_normals<Shortcuts>(Q_m,direction,norm_m,n_m);
81  ::Numerics::get_normals<Shortcuts>(Q_p,direction,norm_p,n_p);
82 
83  T Tx_m,Ty_m,Tz_m;
84  T Tx_p,Ty_p,Tz_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);
87 
88  T vx_m,vy_m,vz_m;
89  T vx_p,vy_p,vz_p;
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);
92 
93  ::Numerics::create_local_basis(n_p, m_p, l_p);
94  ::Numerics::create_local_basis(n_m, m_m, l_m);
95 
96  T Tn_m,Tm_m,Tl_m;
97  T Tn_p,Tm_p,Tl_p;
98 
99  // rotate fields into l, m, n basis
100  ::Numerics::rotate_into_orthogonal_basis(n_m,m_m,l_m,Tx_m,Ty_m,Tz_m,Tn_m,Tm_m,Tl_m);
101  ::Numerics::rotate_into_orthogonal_basis(n_p,m_p,l_p,Tx_p,Ty_p,Tz_p,Tn_p,Tm_p,Tl_p);
102 
103  T vn_m,vm_m,vl_m;
104  T vn_p,vm_p,vl_p;
105  ::Numerics::rotate_into_orthogonal_basis(n_m,m_m,l_m,vx_m,vy_m,vz_m,vn_m,vm_m,vl_m);
106  ::Numerics::rotate_into_orthogonal_basis(n_p,m_p,l_p,vx_p,vy_p,vz_p,vn_p,vm_p,vl_p);
107 
108 
109  // extract local s-wave and p-wave impedances
110  T zs_m=rho_m*cs_m;
111  T zs_p=rho_p*cs_p;
112 
113  T zp_m=rho_m*cp_m;
114  T zp_p=rho_p*cp_p;
115 
116  // impedance must be greater than zero !
117  assertion3(!(zp_p <= 0.0 || zp_m <= 0.0),"Impedance must be greater than zero !",zp_p,zs_p);
118 
119  // generate interface data preserving the amplitude of the outgoing charactertritics
120  // and satisfying interface conditions exactly.
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;
125 
126  if(is_fault){
127 
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;
130 
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)]};
134 
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)];
138 
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)];
142 
143  // tarch::la::Vector<3,double> coords;
144  double coords[3] = {
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 )]
148  };
149 
150  ::Numerics::rotate_into_orthogonal_basis(n_m, m_m, l_m, Sx_m, Sy_m, Sz_m, Sn_m, Sm_m, Sl_m);
151  ::Numerics::rotate_into_orthogonal_basis(n_p, m_p, l_p, Sx_p, Sy_p, Sz_p, Sn_p, Sm_p, Sl_p);
152 
153  T S = std::sqrt((Sl_p- Sl_m)*(Sl_p- Sl_m)+(Sm_p- Sm_m)*(Sm_p- Sm_m));
154 
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,
159  // coords.data(),
160  coords,
161  S, t
162  );
163 
164  }
165  else if (isBoundaryFace) {
166  // 0 absorbing 1 free surface
167  T r= faceIndex == surface ? 1 : 0;
168 
170  vn_m,vm_m,vl_m,
171  Tn_m,Tm_m,Tl_m,
172  zp_m,zs_m,
173  vn_hat_m,vm_hat_m,vl_hat_m,
174  Tn_hat_m,Tm_hat_m,Tl_hat_m);
176  vn_p,vm_p,vl_p,
177  Tn_p,Tm_p,Tl_p,
178  zp_p,zs_p,
179  vn_hat_p,vm_hat_p,vl_hat_p,
180  Tn_hat_p,Tm_hat_p,Tl_hat_p);
181  }
182  else {
184  Tn_p, Tn_m,
185  zp_p , zp_m,
186  vn_hat_p , vn_hat_m,
187  Tn_hat_p, Tn_hat_m);
189  Tm_p, Tm_m,
190  zs_p , zs_m,
191  vm_hat_p , vm_hat_m,
192  Tm_hat_p, Tm_hat_m);
194  Tl_p, Tl_m,
195  zs_p , zs_m,
196  vl_hat_p , vl_hat_m,
197  Tl_hat_p, Tl_hat_m);
198  }
199 
200  //generate fluctuations in the local basis coordinates: n, m, l
201  ::Numerics::compute_fluctuations_left(zp_m,
202  Tn_m,Tn_hat_m,
203  vn_m,vn_hat_m,
204  FLn);
205  ::Numerics::compute_fluctuations_left(zs_m,
206  Tm_m,Tm_hat_m,
207  vm_m,vm_hat_m,
208  FLm);
209  ::Numerics::compute_fluctuations_left(zs_m,
210  Tl_m,Tl_hat_m,
211  vl_m,vl_hat_m,
212  FLl);
213 
214  ::Numerics::compute_fluctuations_right(zp_p,
215  Tn_p,Tn_hat_p,
216  vn_p,vn_hat_p,
217  FRn);
218  ::Numerics::compute_fluctuations_right(zs_p,
219  Tm_p,Tm_hat_p,
220  vm_p,vm_hat_p,
221  FRm);
222  ::Numerics::compute_fluctuations_right(zs_p,
223  Tl_p,Tl_hat_p,
224  vl_p,vl_hat_p,
225  FRl);
226 
227  //Consider acoustic boundary
228  FL_n = FLn/zp_m;
229  if(zs_m > 0){
230  FL_m = FLm/zs_m;
231  FL_l = FLl/zs_m;
232  }else{
233  FL_m=0;
234  FL_l=0;
235  }
236 
237  FR_n = FRn/zp_p;
238  if(zs_p > 0){
239  FR_m = FRm/zs_p;
240  FR_l = FRl/zs_p;
241  }else{
242  FR_m=0;
243  FR_l=0;
244  }
245 
246  // rotate back to the physical coordinates x, y, z
248  FLn,FLm,FLl,
249  FLx,FLy,FLz);
251  FRn,FRm,FRl,
252  FRx,FRy,FRz);
254  FL_n,FL_m,FL_l,
255  FL_x,FL_y,FL_z);
257  FR_n,FR_m,FR_l,
258  FR_x,FR_y,FR_z);
259 
260  // construct flux fluctuation vectors obeying the eigen structure of the PDE
261  // and choose physically motivated penalties such that we can prove
262  // numerical stability.
263 
264  F_p[s::v + 0] = norm_p/rho_p*FRx;
265  F_m[s::v + 0] = norm_m/rho_m*FLx;
266 
267  F_p[s::v + 1] = norm_p/rho_p*FRy;
268  F_m[s::v + 1] = norm_m/rho_m*FLy;
269 
270  F_p[s::v + 2] = norm_p/rho_p*FRz;
271  F_m[s::v + 2] = norm_m/rho_m*FLz;
272 
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);
276 
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);
280 
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);
284 
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);
288 
289  F_m[s::u + 0] = 0;
290  F_m[s::u + 1] = 0;
291  F_m[s::u + 2] = 0;
292 
293  F_p[s::u + 0] = 0;
294  F_p[s::u + 1] = 0;
295  F_p[s::u + 2] = 0;
296 
297  T norm_p_qr=norm_p;
298  T norm_m_qr=norm_m;
299 
300  }
301  }
302 }
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)
u
Definition: euler.py:113
j
Definition: euler.py:95
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)
Definition: RiemannSolver.h:51
void rotate_into_physical_basis(double *n, double *m, double Fn, double Fm, double &Fx, double &Fy)
Definition: RiemannSolver.h:22
void rotate_into_orthogonal_basis(double *n, double *m, double Tx, double Ty, double &Tn, double &Tm)
Definition: RiemannSolver.h:17
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)
Definition: RiemannSolver.h:70
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)