This document is a draft. Find hand written notes here: https://github.com/dnicolasespinoza/GeomechanicsJupyter/tree/master/ClassNotes.
VTI compliance matrix (3 - vertical direction perpendicular to bedding):
where and and is not related to the other parameters.
In terms of stiffness coefficients:
VTI stiffness matrix (3 - vertical direction perpendicular to bedding):
or in terms of Young moduli and Poisson ratios
The parameter is independent of all other parameters.
Download the file LostHills.xls. We would like to know the state of stress in the subsurface and its influence on a hydraulic fracture completion. At every depth (and data-point) along the vertical well:
Generic constitutive model:
Linear elasticity:
Definition of strain:
The corresponding variationnal form is:
where : denotes the tensor scalar product, i.e. , is a Neumann boundary, is the boundary force vector, and is the outward normal vector (perpendicular to the infinitesimal surface ).In the case of plane strain linear elasticity, the variational form look like this:
One problem of interest is to find stress component around a wellbore. Mathematically, this problem implicates solving Eq. 2.3 in an infinite domain with a pressurized circular opening with radius and can be written as follows:
The analytical solution for this problem reads:
Define problem parameters:
% Start your code-block // Dimensions real ySize = 10.; // y-size of the domain real xSize = 10.; // 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 |
Then we calculate Lame constant and shear modulus that are used in the formulation:
% Start your code-block real G = E/(2*(1+nu)); // shear modulus real lambda = E*nu/((1+nu)*(1-2*nu)); // Lame constant |
Finally, we specify values for stress boundary conditions:
% Start your code-block // Stresses real Sx = 10e6; real Sy = 10e6; real Pwell = 0.0; |
Next we proceed to the definition of the domain. We first define all the domain boundaries and then create mesh:
% Start your code-block // 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);} // Create mesh int n = 20; // number of mesh nodes on the outer borders int nwell = 50; // number of mesh nodes on wellobre mesh Omega = buildmesh(Right(n)+Top(n)+Left(n)+Bottom(n)+Well(nwell)); |
The next step is to define Finite Element spaces. These object designate the type of shape functions used to solve the problem. In this example we will be using “P1” elements for displacement: continuous Galerkin polynomials of the first degree defined on triangles. To approximate stresses we will use “P0” elements - piecewise constants.
% Start your code-block // FE spaces fespace Displacement(Omega, P1); // linear shape functions fespace Stress(Omega, P0); // piecewise constants |
Next, we will tell the interpreter to allocate several objects to store displacement components (objects of type Displacement) and stresse components (objects of type Stress). and denote x and y components of the displacement vector. and are the components of the virtual displacement vector; we do not need those vectors per se, but we use these objects to code up the system of equations. We also define objects , , and to store stress components. Note that we only need 3 components of the stress tensor because it is symmetric.
% Start your code-block Displacement u1, u2, v1, v2; Stress sigmaxx, sigmayy, sigmaxy; |
Next we define macros. Macros are special compiler instructions that are inserted into the part of code where they are called during compilation (as opposed to runtime). In this code we use macros in order to make the system of equation look neat later on. The following code defines two macros for strain and stress “vectors”.
% Start your code-block // definition of 2 macros: // 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 sxx,sxy,syx,syy |
Now, we can finally define the system to be solved corresponding to the Formulation (ref).
// Define system of equations problem Elasticity([u1,u2], [v1,v2]) = int2d(Omega) ( sigma(u1,u2)'*e(v1,v2) ) // Boundary conditions + int1d(Omega, Right) (Sx*v1) - 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)) ; |
In order to solve the problem, we simply need to call this subroutine:
% Start your code-block // Solve system Elasticity; |
Finally, in order to calculate stresses, we use previously define macros again:
// Stresses sigmaxx = sigma(u1, u2)[0]; sigmayy = sigma(u1, u2)[3]; sigmaxy = sigma(u1, u2)[1]; // we could use [2] as well |
The changes in the code are minor. Instead of a wellbore we need to define a fracture:
% Start your code-block real xf = 40; // fracture half-length real fw = 0.1; // fracture half-width border Frac(t = 0, -2*pi) {x = fw*cos(t); y = xf*sin(t);} |
The bondary condition on the fracture boundary are also a little bit different:
// Define system of equations problem Elasticity([u1,u2], [v1,v2]) = int2d(Omega) ( sigma(u1,u2)'*e(v1,v2) ) // Boundary conditions + int1d(Omega, Right) (Sx*v1) - int1d(Omega, Left) (Sx*v1) + int1d(Omega, Top) (Sy*v2) - int1d(Omega, Bottom) (Sy*v2) // condition only on one component + int1d(Omega, Frac) (Pfrac*(N.x*v1)) ; |
[To be developed]
[To be developed]
Consider a 2D problem of a circular cavity subjected to far field effective stresses = 12 MPa and = 3 MPa. The diameter of the cavity is 0.2 m. Rock properties: = 10 GPa, = 0.20, unconfined compression strength = 30 MPa, tensile strength = 2 MPa.
Hint: An example code for 2D elasticity in FreeFEM++ and the corresponding explanation are available at https://github.com/dnicolasespinoza/GeomechanicsJupyter/: Kirsch_Shovkun.edp and FreeFEM_Tutorial_Shovkun.pdf. You can also try FreeFEM++ online here: https://freefem.org/tryit.
Consider a 2D problem of an elliptical fracture (half-length = 10 m). Solve the problem using just half of the domain. Set the fracture along the left boundary of a domain: = [0 m, 100 m] and = [-50 m, 50 m], with fracture center at (0,0) m. This boundary will have a pressure boundary condition. All other boundaries will have zero displacement. Rock properties: = 30 GPa, = 0.20.