I’m simulating the hole failure under external stress state via Mohr-Coulomb failure criterion. I remove the mesh cells which cannot withstand the failure criterion. I have written a loop to observe how the failure would propagate after iterative stress redistribution around a newly formed mesh. Here how it looks like below on the first iteration. These “pinchouts“ work as stress concentrators and create enourmously large and unrealistic failure zone. Here how it looks like after first iteration (with color corresponding to failure criterion values) and the consequent second iteration of mesh truncation.
What I suggest here is to smooth the failure zone after truncation with some kind of approximation. Is there a way to do it in FreeFEM++ and how? Maybe there are any examples already? The code is supplied below.
//--------------------------------------------------------------------
// Dimensions
real ySize = 2. ; // y-size of the domain
real xSize = 2. ; // x-size of the domain
real R = 0.1 ; // wellbore radius
// Elastic constants
real E = 1e10 ; // Young's modulus
real nu = 0.3 ; // Poisson's ratio
real G = E/(2*(1+nu)) ; // shear modulus
real lambda = E*nu/((1+nu)*(1-2*nu)) ; // Lame constant
//Stresses
real Sx = -80e6;
real Sy = -40e6;
real Pwell = -25e6;
real phi = 30;
real C = 10e6;
real Pi=pi;
//--------------------------------------------------------------------
// First define boundaries
border Right(t=-ySize/2,ySize/2){x=xSize/2;y=t;}
border Top(t=xSize/2,-xSize/2){x=t;y=ySize/2;}
border Left(t=ySize/2,-ySize/2){x=-xSize/2;y=t;}
border Bottom(t=-xSize/2,xSize/2){x=t;y=-ySize/2;}
border Well(t=0,-2*pi){x=R*cos(t);y=R*sin(t);}
//SHOW DOMAIN
plot(Right(10)+Top(10)+Left(10)+Bottom(10) + Well(40), wait=true);
//--------------------------------------------------------------------
// Create mesh
int n = 20; // number of mesh nodes on the outer borders
int nwell = 200; // number of mesh nodes on wellbore
mesh Omega = buildmesh (Right(n)+Top(n)+Left(n)+Bottom(n)+Well(nwell));
plot(Omega, wait=true);
// FE spaces
fespace Displacement(Omega, P2);
fespace Stress(Omega, P2);
Displacement u1, u2, v1, v2;
Stress sigmaxx, sigmayy, sigmaxy, sigma1, sigma2, tm, sm, criterion;
Stress b=0;
//--------------------------------------------------------------------
// Macro for strain
macro e(u1,u2)
[
dx(u1),
(dy(u1)+dx(u2))/2 ,
(dx(u2)+dy(u1))/2 ,
dy(u2)
]//eps_xx, eps_xy , eps_yx , eps_yy
// macro for stress
macro sigma(u1,u2)
[
(lambda+2.*G)*e(u1,u2)[0]+lambda*e(u1,u2)[3],
2.*G*e(u1,u2)[1],
2.*G*e(u1,u2)[2],
lambda*e(u1,u2)[0]+(lambda+2.*G)*e(u1,u2)[3]
] //stress s_xx, s_xy, s_yx, s_yy
// Define system of equations
problem Elasticity([u1,u2],[v1,v2]) =
int2d(Omega)(sigma(u1,u2)'*e(v1,v2))
// Boundary conditions
+ on(Left,u1=0) // Dirichlet boundary conditions
+ on(Bottom,u2=0)
+ int1d(Omega,Right)(Sx*v1) // Neumann boundary conditions
//- int1d(Omega,Left)(Sx*v1)
+ int1d(Omega,Top)(Sy*v2)
//- int1d(Omega,Bottom)(Sy*v2)
+ int1d(Omega,Well)(Pwell*(N.x*v1+N.y*v2))
//+ int1d(Omega,1)(Pwell*(N.x*v1+N.y*v2))
;
problem Elasticityupd([u1,u2],[v1,v2]) =
int2d(Omega)(sigma(u1,u2)'*e(v1,v2))
// Boundary conditions
+ on(Left,u1=0) // Dirichlet boundary conditions
+ on(Bottom,u2=0)
+ int1d(Omega,Right)(Sx*v1) // Neumann boundary conditions
//- int1d(Omega,Left)(Sx*v1)
+ int1d(Omega,Top)(Sy*v2)
//- int1d(Omega,Bottom)(Sy*v2)
+ int1d(Omega,Well)(Pwell*(N.x*v1+N.y*v2))
+ int1d(Omega,5)(Pwell*(N.x*v1+N.y*v2))
;
//Elasticity;
//--------------------------------------------------------------------
// Solve system
for (int i = 0; i < 10; i++){
Elasticity;
// Stresses
sigmaxx = sigma(u1,u2)[0];
sigmayy = sigma(u1,u2)[3];
sigmaxy = sigma(u1,u2)[1]; // we could use [2] as well
sigma1 = (sigmaxx+sigmayy)/2+sqrt(((sigmaxx-sigmayy)/2)^2+sigmaxy^2);
sigma2 = (sigmaxx+sigmayy)/2-sqrt(((sigmaxx-sigmayy)/2)^2+sigmaxy^2);
tm = (sigma1-sigma2)/2;
sm = (sigma1+sigma2)/2;
criterion = tm-sm*sin(Pi*phi/180)-C*cos(Pi*phi/180);
//--------------------------------------------------------------------
// plot on the deformed surface
mesh Th=movemesh(Omega,[x+10*u1,y+10*u2]);
plot(Th,cmm="Deformed configuration",wait=1);
// plot the deformation field and stress
plot([u1,u2],coef=10,cmm="Displacement field",wait=1,value=true);
plot(sigma1,fill=1, cmm="Stress sigma1",wait=1,value=true);
plot(sigma2,fill=1, cmm="Stress sigma2",wait=1,value=true);
plot(criterion,fill=1, cmm="Mohr-Coulomb",wait=1,value=true);
Omega = adaptmesh(Omega, sigma1);
plot(Omega,cmm="Adapted",wait=1);
Omega = trunc(Omega, criterion<0, label=4);
plot(Omega,cmm="Destructed",wait=1);
}
