Peano
Loading...
Searching...
No Matches
RiemannSolver.h
Go to the documentation of this file.
1namespace riemannSolver{
2
3void 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
17void 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
22void 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
29void 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
33void 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
37void 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
44void 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
51void 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
70void 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
113void localBasis(double* n, double * m){
114 m[0] = n[1];
115 m[1] = n[0];
116}
117
118void 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
128void 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):
148void 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
164double 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
182void 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
219void 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}
225void 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
245void 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
306void 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
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)
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)
void extract_tractions_and_particle_velocity(double *n, const double *Q, double &Tx, double &Ty, double &vx, double &vy)
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 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)
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)
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)
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)
double boxcar(double &f, double x, double w)