Peano
RiemannSolver.h
Go to the documentation of this file.
1 namespace riemannSolver{
2 
3 void extract_tractions_and_particle_velocity(double* n,const double* Q, double& Tx,double& Ty,double& vx,double& vy){
4 
5  double sigma_xx = Q[2];
6  double sigma_yy = Q[3];
7  double sigma_xy = Q[4];
8 
9 
10  Tx = n[0]*sigma_xx + n[1]*sigma_xy;
11  Ty = n[0]*sigma_xy + n[1]*sigma_yy;
12 
13  vx = Q[0];
14  vy = Q[1];
15 }
16 
17 void rotate_into_orthogonal_basis(double* n,double* m, double Tx,double Ty, double& Tn, double& Tm){
18  Tn= Tx*n[0] + Ty*n[1];
19  Tm= Tx*m[0] + Ty*m[1];
20 }
21 
22 void rotate_into_physical_basis(double* n,double* m, double Fn,double Fm, double& Fx, double& Fy){
23 
24  Fx = n[0]*Fn + m[0]*Fm;
25  Fy = n[1]*Fn + m[1]*Fm;
26 
27 }
28 
29 void generate_fluctuations_left(double z, double T,double T_hat,double v, double v_hat, double& F){
30  F = 0.5*(z*(v-v_hat) + (T-T_hat));
31 }
32 
33 void generate_fluctuations_right(double z, double T,double T_hat,double v, double v_hat, double& F){
34  F = 0.5*(z*(v-v_hat) - (T-T_hat));
35 }
36 
37 void riemannSolver_BC0(double v, double sigma, double z, double r, double& v_hat, double& sigma_hat){
38  double p = 0.5*(z*v + sigma);
39 
40  v_hat = (1+r)/z*p;
41  sigma_hat = (1-r)*p;
42 }
43 
44 void riemannSolver_BCn(double v,double sigma, double z, double r, double& v_hat, double& sigma_hat){
45  double q = 0.5*(z*v - sigma);
46 
47  v_hat = (1+r)/z*q;
48  sigma_hat = -(1-r)*q;
49 }
50 
51 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)
52 {
53 
54  if (faceIndex < DIMENSIONS) { //left face
55 
56  riemannSolver_BC0(vn, Tn, zp, r, vn_hat, Tn_hat);
57  riemannSolver_BC0(vm, Tm, zs, r, vm_hat, Tm_hat);
58  }
59 
60 
61  else { //right face
62 
63  riemannSolver_BCn(vn, Tn, zp, r, vn_hat, Tn_hat);
64  riemannSolver_BCn(vm, Tm, zs, r, vm_hat, Tm_hat);
65  }
66 
67 }
68 
69 
70 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){
71  double p=0;
72  double q=0;
73  double phi=0;
74  double v_hat=0;
75  double eta=0;
76 
77  p=z_m*v_p + sigma_p;
78  q=z_p*v_m - sigma_m;
79 
80  if(z_p > 0 && z_m > 0){
81  eta=(z_p*z_m)/(z_p+z_m);
82 
83  phi= eta*(p/z_p - q/z_m);
84 
85  sigma_hat_p=phi;
86  sigma_hat_m=phi;
87 
88  v_hat_p=(q+phi)/z_m;
89  v_hat_m=(p-phi)/z_p;
90  }else if(z_p > 0){
91  sigma_hat_p=0;
92  sigma_hat_m=sigma_m;
93 
94  v_hat_p=v_p;
95  v_hat_m=v_m;
96  }else if(z_m > 0){
97  sigma_hat_p=sigma_p;
98  sigma_hat_m=0;
99 
100  v_hat_p=v_p;
101  v_hat_m=v_m;
102 
103  }else{
104  sigma_hat_p=sigma_p;
105  sigma_hat_m=sigma_m;
106 
107  v_hat_p=v_p;
108  v_hat_m=v_m;
109  }
110 }
111 
112 
113 void localBasis(double* n, double * m){
114  m[0] = n[1];
115  m[1] = n[0];
116 }
117 
118 void extractTransformation(const double* const Q, double& q_x,double& q_y,double& r_x,double& r_y) {
119 
120  constexpr int numberOfVariables = ::exahype2::elastic::ElasticSolver::NumberOfUnknowns;
121 
122  q_x =Q[numberOfVariables+4];
123  q_y =Q[numberOfVariables+5];
124  r_x =Q[numberOfVariables+6];
125  r_y =Q[numberOfVariables+7];
126 }
127 
128 void get_normals(int normalNonZeroIndex,double& norm, double* n,const double* Q){
129  double q_x;
130  double q_y;
131  double r_x;
132  double r_y;
133 
134  extractTransformation(Q,q_x,q_y,r_x,r_y);
135  if (normalNonZeroIndex == 0){
136  norm = std::sqrt(q_x*q_x + q_y*q_y);
137  n[0] = q_x/norm;
138  n[1] = q_y/norm;
139  }
140  if (normalNonZeroIndex == 1){
141  norm = std::sqrt(r_x*r_x + r_y*r_y);
142  n[0] = r_x/norm;
143  n[1] = r_y/norm;
144  }
145 }
146 
147  // solve for slip-rate (vv):
148 void slip_weakening(double& v1, double& Vel, double& tau1,
149  double phi_1, double eta, double tau_str, double sigma_n){
150 
151  double Phi = std::abs(phi_1); // stress-transfer functional
152  Vel = (Phi - tau_str)/eta; // slip-rate
153 
154  //compute slip velocities
155  v1 = phi_1/(eta+tau_str/Vel);
156 
157  //compute shear stress on the fault
158  tau1 = phi_1 - eta*v1;
159 
160  //std::cout << tau_str << " " << Phi << " " << tau1 << " " << v1 << std::endl;
161 
162 }
163 
164 double boxcar(double& f, double x, double w)
165 {
166  // f(x) is boxcar of unit amplitude in (x-w,x+w)
167  double tol = 1e-8;
168 
169  if ((-w+tol)<x && x< (w-tol)){ // inside
170  f = 1.0;
171  //std::cout<< x << " " << w <<std::endl;
172  }
173  else if (std::abs(-w-x)<=tol || std::abs(x-w)<=tol){ // boundary
174  f = 0.5;
175  }
176  else{ // outside
177  f = 0.0;
178  }
179  return f;
180 }
181 
182 void TauStrength(double& tau_str, double sigma_n, double S, double* x, double t)
183 {
184  // TPV5
185  double mu_s = 0.677; // stastic friction
186  double mu_d = 0.525; // dynamic friction
187  double sigma0 = 120.0; // normal stress
188  double S_c = 0.40; // critical slip
189 
190  double fy;
191  double fz;
192 
193  boxcar(fy, x[1],15.0);
194 
195  mu_s = mu_s + 1e10*(1.0-fy);
196  double fric_coeff = mu_s - (mu_s-mu_d) * std::min(S,S_c)/S_c; // friction coefficient
197  tau_str = fric_coeff*sigma_n;
198 
199 
200  // // TPV28:
201  // double mu_s = 0.677; // stastic friction
202  // double mu_d = 0.373; // dynamic friction
203  // double S_c = 0.40;
204  // critical slip
205 
206  // double fy;
207  // double fz;
208 
209  // boxcar(fy, x[1]-7.5,15.0);
210  // boxcar(fz, x[2]-15.0,15.0);
211 
212  // mu_s = mu_s + 1e10*(1.0-fy*fz);
213  // double fric_coeff = mu_s - (mu_s-mu_d) * std::min(S,S_c)/S_c; // friction coefficient
214  // tau_str = fric_coeff*sigma_n;
215 
216 }
217 
218 
219 void extract_tractions(double sxx, double syy, double sxy, double* n, double& Tx,double& Ty){
220 
221  Tx = n[0]*sxx + n[1]*sxy;
222  Ty = n[0]*sxy + n[1]*syy;
223 
224 }
225 void initialstresstensor(double& sxx, double& syy, double& sxy, double* x)
226 {
227  // TPV5:
228  sxx = -120.0;
229  syy = 0.0;
230 
231  sxy = 70.0;
232 
233  // // TPV28:
234  // sxx = -60;
235  // syy = 0.0;
236  // szz = 60.0;
237 
238  // sxy = 0.0;
239  // sxz = 29.380;
240  // syz = 0.00;
241 
242 }
243 
244 
245 void prestress(double& T0_n, double& T0_m, double* x, double t, double* m, double* n)
246 {
247 
248  double sxx,syy,szz,sxy,sxz, syz;
249  double Tx,Ty,Tz;
250 
251  // initial stress tensor
252  initialstresstensor(sxx,syy,sxy, x);
253 
254  // extract tractions in xyz coordinates
255  extract_tractions(sxx, syy, sxy, n, Tx,Ty);
256 
257  // rotate tractions into local orthogonal coordinates
258  rotate_into_orthogonal_basis(n,m,Tx,Ty,T0_n,T0_m);
259 
260  //TPV5:
261  double fy;
262 
263  boxcar(fy, x[1]-7.5, 1.5);
264 
265  T0_m = T0_m+11.6 *fy;
266 
267 
268 
269  // //====================================
270  // //TPV28:
271  // //====================================
272 
273  // // initial stress tensor
274  // initialstresstensor(sxx,syy,szz,sxy,sxz, syz, x);
275 
276 
277  // // extract tractions in xyz coordinates
278  // extract_tractions(sxx, syy, szz, sxy, sxz, syz, n, Tx,Ty,Tz);
279 
280  // // rotate tractions into local orthogonal coordinates
281  // rotate_into_orthogonal_basis(n,m,l,Tx,Ty,Tz,T0_n,T0_m,T0_l);
282 
283  // double r;
284  // double tau_nuke;
285  // double pi = 3.14159265359;
286 
287  // r = std::sqrt((x[1]-7.5)*(x[1]-7.5) + (x[2]-15)*(x[2]-15));
288 
289  // if (r <= 1.4){
290  // tau_nuke = 11.60;
291  // }
292  // else if(r >= 1.4 && r<=2.0) {
293  // tau_nuke = 5.8*(1.0 + std::cos(pi*(r-1.4)/0.6));
294  // }
295  // else{
296  // tau_nuke = 0.0;
297  // }
298 
299  // T0_l = T0_l + tau_nuke;
300 
301 }
302 
303 
304 
305 // Rupture Dynamics
306 void SlipWeakeningFriction(double vn_p,double vn_m, double Tn_p, double Tn_m, double zn_p , double zn_m,
307  double& vn_hat_p, double& vn_hat_m, double& Tn_hat_p, double& Tn_hat_m,
308  double vm_p,double vm_m, double Tm_p, double Tm_m, double zm_p , double zm_m,
309  double& vm_hat_p, double& vm_hat_m, double& Tm_hat_p, double& Tm_hat_m,
310  double* m, double* n, double* x, double S)
311 {
312  // compute characteristics
313  double p_m = zm_p*vm_p + Tm_p;
314  double p_n = zn_p*vn_p + Tn_p;
315 
316 
317  double q_m = zm_m*vm_m - Tm_m;
318  double q_n = zn_m*vn_m - Tn_m;
319 
320  // half of the harmonic mean of Z1_s, Z2_s
321  double eta_s=(zm_p*zm_m)/(zm_p+zm_m);
322  double eta_n=(zn_p*zn_m)/(zn_p+zn_m);
323 
324  double phi_m= eta_s*(p_m/zm_p - q_m/zm_m);
325  double phi_n= eta_n*(p_n/zn_p - q_n/zn_m);
326 
327  double T0_m=0;
328  double T0_n=0;
329 
330  // get prestress (where normal traction is effective normal traction)
331  prestress(T0_n, T0_m, x, 0.0, m, n);
332 
333  vn_hat_m = (p_n - phi_n)/zn_p;
334  Tn_hat_m = phi_n;
335  vn_hat_p = (q_n + phi_n)/zn_m;
336  Tn_hat_p = phi_n;
337 
338  double tau_lock = std::sqrt(std::pow(T0_m + phi_m, 2));
339  double sigma_n = std::max(0.0, -(T0_n + phi_n)); // including prestress
340  double tau_str;
341  double Vel = 0.0;
342  double Tl, Tm, vv_l, vv_m;
343 
344  TauStrength(tau_str, sigma_n, S, x, 0.0);
345 
346  double fault_position= 40.0/27*(27-1)*0.5;
347 
348  double r = std::sqrt((x[0]-fault_position)*(x[0]-fault_position) + (x[1]-7.5)*(x[1]-7.5));
349 
350  if (tau_lock >= tau_str){
351  slip_weakening(vv_m, Vel, Tm, phi_m+T0_m, eta_s, tau_str, sigma_n);
352 
353  Tm_hat_m = Tm - T0_m;
354 
355  Tm_hat_p = Tm - T0_m;
356 
357  }else{
358  Tm_hat_m = phi_m;
359 
360  Tm_hat_p = phi_m;
361 
362  vv_m = 0.0;
363 
364  Vel = 0.0;
365  }
366 
367  vm_hat_p = (Tm_hat_m + q_m)/zm_m + vv_m;
368 
369  vm_hat_m = (p_m - Tm_hat_p)/zm_p - vv_m;
370 
371 
372 }
373 
374 
375 
376 
377 
378 } //end of namespace
float zs
Definition: ModeCalc.py:147
tuple w
Definition: ModeCalc.py:195
static double min(double const x, double const y)
void localBasis(double *n, double *m)
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 initialstresstensor(double &sxx, double &syy, double &sxy, double *x)
void TauStrength(double &tau_str, double sigma_n, double S, double *x, double t)
void slip_weakening(double &v1, double &Vel, double &tau1, double phi_1, double eta, double tau_str, double sigma_n)
void extractTransformation(const double *const Q, double &q_x, double &q_y, double &r_x, double &r_y)
void generate_fluctuations_left(double z, double T, double T_hat, double v, double v_hat, double &F)
Definition: RiemannSolver.h:29
void extract_tractions_and_particle_velocity(double *n, const double *Q, double &Tx, double &Ty, double &vx, double &vy)
Definition: RiemannSolver.h:3
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 get_normals(int normalNonZeroIndex, double &norm, double *n, const double *Q)
void generate_fluctuations_right(double z, double T, double T_hat, double v, double v_hat, double &F)
Definition: RiemannSolver.h:33
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)
void prestress(double &T0_n, double &T0_m, double *x, double t, double *m, double *n)
void riemannSolver_BC0(double v, double sigma, double z, double r, double &v_hat, double &sigma_hat)
Definition: RiemannSolver.h:37
void extract_tractions(double sxx, double syy, double sxy, double *n, double &Tx, double &Ty)
void riemannSolver_BCn(double v, double sigma, double z, double r, double &v_hat, double &sigma_hat)
Definition: RiemannSolver.h:44
double boxcar(double &f, double x, double w)