Professional Documents
Culture Documents
C10 PDF
C10 PDF
Chapter 10
We then wish to find a displacement field ui satisfying the usual field equations and boundary conditions (see
Sect 5.1.1). The procedure is based on the principle of minimum potential energy discussed in Section 5.7.
There are four steps:
1. A finite element mesh is constructed to interpolate the displacement field
2. The strain energy in each element is calculated in terms of the displacements of each node;
3. The potential energy of tractions acting on the solid’s boundary is added
4. The displacement field is calculated by minimizing the potential energy.
For simplicity, we will assume that the elements are 3 noded triangles, as
shown in the picture. The nodes are numbered 1,2,3…N, while the elements
are numbered 1,2…L. Element numbers are shown in parentheses.
(a)
The position of the ath node is specified by its coordinates xi
We will approximate the displacement field by interpolating between values at the nodes, as follows. Let
(a)
ui denote the unknown displacement vector at nodes a = 1, 2, ....N . In a finite element code, the
displacements for a plane stress or plane strain problem are normally stored as a column vector like the one
shown below:
T
u = [ u(1)
− 1 u2 u1 u2 u1 u2 … ]
(1) (2) (2) (3) (3)
The unknown displacement components will be determined by minimizing the potential energy of the solid.
10.3 Element interpolation functions
To calculate the potential energy, we need to be able to compute the
displacements within each element. This is done by interpolation. Consider a
(a) (b) (c)
triangular element, with nodes a, b, c at its corners. Let xi , xi , xi denote
the coordinates of the corners. Define the element interpolation functions (also
known as shape functions) as follows
(x2 −x2 )(x1 −x1 )−(x1 −x1 )(x2 −x2 )
(b) (c) (b) (b) (c) (b)
Na (x1 , x2 ) =
(x2 −x2 )(x1 −x1 )−(x1 −x1 )(x2 −x2 )
(a) (b) (c) (b) (a) (b) (c) (b)
Nb (x1 , x2 ) =
(x2 −x2 )(x1 −x1 )−(x1 −x1 )(x2 −x2 )
(b) (c) (a) (c) (b) (c) (a) (c)
Nc (x1 , x2 ) =
(x2 −x2 )(x1 −x1 )−(x1 −x1 )(x2 −x2 )
(c) (a) (b) (a) (c) (a) (b) (a)
Of course, the shape functions given are valid only for 3 noded triangular elements – other elements have
more complicated interpolation functions.
We can now compute the strain distribution within the element and hence determine the strain energy density.
Since we are solving a plane strain problem, the only nonzero strains are ε11 , ε22 , ε12 . It is convenient to
express the results in matrix form, as follows
⎡ u1 ⎤
(a)
⎢ (a) ⎥
⎢ u2 ⎥
⎡ ∂x 0 ⎤⎢ ⎢ (b) ⎥
⎥
∂Na ∂Nb ∂Nc
0 0
⎡ ε11 ⎤ ⎢ 1 ⎥ ⎢ ⎥
∂Nc ⎥ ⎢ 1 ⎥
∂x1 ∂x1
⎢ ε22 ⎥ = ⎢ ⎢ ⎥
u
⎢ 0 ∂x2 ⎥ ⎢ (b) ⎥
∂Na ∂Nb
u element
⎣ 2ε ⎦ ⎢ ∂N ⎥⎢u ⎥
–ε = [B] − ≡ ∂x2
0 ∂x2
0
⎣ a ⎦⎢⎢ (c) ⎥
⎥
∂Na ∂Nb ∂Nb ∂Nc ∂Nc 2
⎢ u1 ⎥
12
⎢ ⎥
∂x2 ∂x1 ∂x2 ∂x1 ∂x2 ∂x1
⎣ u(c) ⎦
2
The factor of 2 multiplying the shear strains in the strain vector has been introduced for convenience. Note
that, for linear triangular elements, the matrix of shape function derivatives [B] is constant. It depends only on
the coordinates of the corners of the element, and does not vary with position within the element. This is not
the case for most elements.
Now, we can compute the strain energy density within the element. Begin by computing the stresses within
the element. For plane strain deformation, have that
⎡ σ11 ⎤ ⎡1 − ν ν 0 ⎤ ε11
⎡ ⎤
⎢ σ22 ⎥ = ⎢ 0 ⎥ ⎥ ⎢ ε22 ⎥
(1+ν)(1−2ν) ⎢
E ν 1−ν
⎣σ ⎦ ⎣ 0 0 1−2ν ⎦ ⎣
2ε ⎦
12 2 12
For plane stress, the result is
⎡ σ11 ⎤ ⎡1 ν 0 ⎤ ⎡ ε11 ⎤
⎢ σ22 ⎥ = E
⎢ν 1 0 ⎥ ⎢ ε22 ⎥
⎣σ ⎦ ⎣ 0 0 (1 − ν)/2 ⎦ ⎣ 2ε ⎦
(1−ν 2 )
12 12
Recall (see Sect 3.1.7) that the strain energy density is related to the stresses and strains by U = σij εij /2.
This can be written in matrix form as
U = 12 –εT −
σ = 12 –εT [D] –ε
where
⎧
⎪ ⎡1 − ν ⎤
⎪
0
⎪
ν
⎪
⎪ ⎢ ⎥ Plane strain
⎪
⎪
⎪
E
ν 1−ν 0
⎡ σ11 ⎤ ⎡ ε11 ⎤ ⎪ ⎣ 0 (1 − 2ν)/2 ⎦
(1+ν)(1−2ν)
Now, express these results in terms of the nodal displacements for the element
u element T ([B]T [D] [B]) −
U element = 12 − u element
We can now compute the total strain energy stored within the element. Because [B] is constant, we merely
need to multiply the strain energy density by the area of the element, which can be computed from the
coordinates of its corners as follows
A = 12 ∣(xb1 − xa1 ) (xc2 − xa2 ) − (xc1 − xa1 ) (xb2 − xa2 )∣
Hence, the total strain energy of the element is
u element T (Aelement [B]T [D] [B]) −
W element = 12 − u element
The strain energy can be simplified by defining the element stiffness matrix
K element = Aelement [B]T [D] [B]
so that
W element = 12 −
u element T K element−
u element
Observe that, because the material property matrix [D] is symmetric, the element stiffness matrix is also
symmetric. To see this, note that
T
K element T = Aelement ([B]T [D] [B]) = Aelement [B]T [D]T [B] = Aelement [B]T [D] [B] = K element
The total strain energy of the solid may be computed by adding together the
strain energy of each element:
W = ∑ W element = 1
2
∑ −
u element T K element−
u element
elements elements
It is more convenient to express W in terms of the vector which contains all the
nodal displacements, rather than using u element for each element to describe the
−
displacements. For example, the strain energy for the simple 2 element mesh
shown is
⎡ u1 ⎤
(1)
⎢ ⋮ ⎥⎢ 2 ⎥
1 u2 u1 u2 u1
⎢ ⎥⎢ ⎥
(1) ⎦ ⎢ (3) ⎥
⋱
⎣ k(1) k66 ⎢ 1 ⎥
⎢ u ⎥
⎣ u(3) ⎦
61
⎡ u1 ⎤
(2)
⎡ k11 ⎤⎢⎢ u2
⎥
⎥
(2) (2) (2)
⎢ ⎥
k12 ⋯ k16 (2)
⎢ (2) ⎥ ⎢ (3) ⎥
⎢ k21 ⎥⎢u ⎥
⎢ ⎥⎢ 1 ⎥
(2)
u2 u1 u2 u1 u2 ] ⎢ ⎥ ⎢ (3) ⎥
k22
+ 12 [ u(2)
⎢ ⎥⎢u ⎥
(2) (3) (3) (4) (4)
⎢ ⋮ ⎥⎢ 2 ⎥
1
⎢ ⎥⎢ ⎥
⎢ ⎥
⋱
⎣ k(2) ⎦ ⎢ u(4) ⎥
⎢ 1 ⎥
(2)
k66
⎣ u(4) ⎦
61
2
If we wanted to, we could add the missing terms to each element displacement vector:
1
W= 2
[ u(1)
1
(1) (2) (2) (3)
u2 u1 u2 u1 u2
(3)
u1
(4)
u2 ]
(4)
⎥⎢ (2) ⎥
k32
⎢ ⎢
⎢
⎢
(1) (1)
0 0⎥
⎥⎢ u1 ⎥ ⎥
⎢ ⎥⎢ (2) ⎥
k33 k34
⎢ 0 0⎥ ⎢ u2 ⎥
⎢ ⎥⎢ ⎥
(1) (1)
⎢ ⎥⎢ ⎥
k43 k44
⎢ ⎥⎢ u1 ⎥
⎢ 0 0⎥ ⎢ ⎥
(3)
⎢ ⎥⎢ ⎥
(1)
⎢ ⎥⎢ (3) ⎥
k53
⎢ ⎥⎢ u2 ⎥
⎢ ⋱ 0 0⎥
⎢ ⎥⎢ ⎥
⎢ ⎥⎢ (4) ⎥
⋮
⎢ 0 ⎢ u1 ⎥
0 0 0 0 0 0 0⎥⎢ ⎥
⎣ 0 0 0 0 0 0 0 0⎦⎣ u2 ⎦
(4)
+ [ u(1)
1
(1) (2) (2) (3)
u2 u1 u2 u1 u2
(3)
u1
(4)
u2 ]
(4)
⎡0 0 0 0 0 ⋯ 0 0 ⎤ ⎡ u(1) ⎤
⎢0 0 ⎥ ⎢ (1) ⎥
1
⎢ ⎥ ⎢ u2 ⎥
0 0 0 0 0
⎢0 ⎥⎢ ⎥
⎢ ⎥ ⎢ (2) ⎥
⎢ ⎥ ⎢ u1 ⎥
(2) (2)
0 k11 k12
⎢ ⎥⎢ ⎥
⎢0 ⎥ ⎢ (2) ⎥
⎢ ⎥⎢ u ⎥
(2) (2)
0 k21
⎢ ⎥⎢ 2 ⎥
k22
⎢0 ⎥ ⎢ (3) ⎥
⎢ ⎥⎢ u ⎥
(2)
⎢ ⎥⎢ 1 ⎥
0 k31
⎢ ⎥⎢ ⎥
⎢0 ⎥ ⎢ (3) ⎥
⎢ ⎥ ⎢ u2 ⎥
⎢ ⎥⎢ ⎥
0 ⋱
⎢ (2) ⎥ ⎢ (4) ⎥
⎢0 k56 ⎥ ⎢ ⎥
⎢ 0 ⋮ ⎥ ⎢ u1 ⎥
⎣0 0 k65
(2) (2) ⎦ ⎣ (4)
k66 u2 ⎦
We can now collect together corresponding terms in the two element stiffness matrices to express this as
W = 12 [ u(1)
1
(1) (2) (2) (3)
u2 u1 u2 u1 u2
(3) (4)
u1 u2 ]
(4)
⎡ k11 k12 ⎤⎡ u1 ⎤
(1) (1) (1) (1)
k13 k14 ⋯ (1)
⎢ (1) (1) ⎥⎢
⎢ k21 k22 ⎥⎢ u2 ⎥ ⎥
(1)
⎢ ⎥⎢ ⎥
k32 (1)
⎢ ⎥⎢ (2) ⎥
⎢ ⎥⎢ u1 ⎥
⎢ ⎥⎢
(1) (2) (1) (2)
⎥
k33 + k11 k34 + k12
⎢ ⎥⎢
⎢ ⎥⎢ (2) ⎥
⎢ ⎥⎢ u2 ⎥
(1) (2) (1) (2)
⎥
k43 + k21 k44 + k22
⎢ ⎥⎢ ⎥
⎢ ⎥⎢ (3) ⎥
⎢ ⎥⎢ u1 ⎥
(1) (2)
⎢ ⎥⎢
k53 + k31
⎢ ⎥⎢ ⎥
⎢ ⎥⎢ (3) ⎥
⎢ ⎥⎢ u2 ⎥
⎢
⋱
⎥⎢ ⎥
⎢ (2) ⎥ ⎢ (4) ⎥
⎢ k56 ⎥ u1 ⎥
⎢ ⋮ ⎥⎢ ⎥
⎣ (2) (2) ⎦ ⎣ u ⎦
(4)
k65 k66 2
We can therefore write
W = 12 −
u T [K] −
u
where [K] is known as the Global stiffness matrix. It is the sum of all the element stiffness matrices.
Because the element stiffness matrix is symmetric, the global stiffness matrix must also be symmetric.
To assemble the global stiffness matrix for a plane strain or plane stress mesh with N nodes, we use the
following procedure.
1. Note that for N nodes, there will be 2N unknown displacement components (2 at each node).
Therefore, we start by setting up storage for a (2N × 2N) global stiffness matrix, and set each
term in the matrix to zero.
2. Next, begin a loop over the elements.
3. For the current element, assemble the element stiffness matrix
K element = Aelement [B]T [D] [B]
4. Add the element stiffness matrix to the global stiffness matrix, using the following procedure.
Let a, b, c denote the numbers of the nodes on the 3 corners of the element. Let kelement
ij for
i=1…6, j=1…6 denote the terms in the the element stiffness matrix. Let Knm for n=1…2N,
m=1…2N denote the terms in the global stiffness matrix. Then,
K2a−1,2a−1 + = kelement
11 , K2a−1,2a + = kelement
12
K2a−1,2b−1 + = kelement
13 K2a−1,2b + = kelement
14
K2a−1,2c−1 + = kelement
15 K2a−1,2c + = kelement
16
K2a,2a−1 + = kelement
21 , K2a,2a + = kelement
22
K2a,2b−1 + = kelement
23 K2a,2b + = kelement
24
K2a,2c−1 + = kelement
25 K2a,2c + = kelement
26
K2b−1,2a−1 + = kelement
31 , K2b−1,2a + = kelement
32
K2b−1,2b−1 + = kelement
33 K2b−1,2b + = kelement
34
K2b−1,2c−1 + = kelement
35 K2b−1,2c + = kelement
36
⋮
K2c,2a−1 + = kelement
61 , K2c,2a + = kelement
62
K2c,2b−1 + = kelement
63 K2c,2b + = kelement
64
K2c,2c−1 + = kelement
65 K2c,2c + = kelement
66
Here, the symbol += means that the term on the left is incremented by the term on the right,
following standard C syntax.
We have now found a way to compute the strain energy for a finite
element mesh. Next, we need to compute the boundary term in the
potential energy.
Now, we compute the contribution to the potential energy due to the traction acting on the face of one
element.
For the element shown, the contribution to the potential energy would be
L
P = − ∫ ti ui ds
0
Recall that the displacements vary linearly within a 3 noded triangle.
Therefore, we can write
(a) s (c) s
ui = ui L
+ ui (1 − L
)
So, since the tractions are uniform
L L
s s
∫ ds − ti ui ∫ (1 − ) ds
element (a) (c)
P = −ti ui
L L
0 0
(a) L (c) L
= − t i ui 2
− t i ui 2
= − [ t1 L2 t2 L2 t1 L2 t2 L2 ] ⋅ [ u(a)
1 u2 u1 u2 ]
(a) (c) (c)
Abbreviate this as
P element = −–rface ⋅ −
u face
The total contribution to the potential energy due to boundary loading on all element faces is
P = − ∑ –rfaces ⋅ −
u faces
faces
It is more convenient to express this in terms of the global displacement vector u
−
P = −–r ⋅ −
u
where is the global residual force vector.
The global residual force vector for a mesh with N nodes is assembled as follows.
1. The residual force vector has length 2N (2 entries per node). Reserve storage for a vector of length
2N and initialize to zero
2. Loop over elements
3. Determine which face of the element is loaded. Let a, b denote the node numbers attached to this
face. Determine the residual force vector for the element face. Let ri face , i=1…4 denote the terms
in the element face residual vector. Let rn , n=1…2N denote the terms in the global residual force
vector. Then
r2a−1 + = rface
1 r2a + = rface
2
r2b−1 + = rface
3 r2b + = rface
4
We have set up the following expression for the potential energy of a finite element mesh
V = 12 −
u T [K] −
u − –r ⋅ −
u
2N 2N 2N
≡ 1
2
∑ uj ∑ Kji ui − ∑ rj uj
j=1 i=1 j=1
Now, minimize V
2N 2N
∂V
∂uk
= 1
2
∑ Kki ui + 1
2
∑ uj Kjk − rk = 0
i=1 j=1
where we have noted that
1, j=k
={
∂uj
∂uk 0, j≠k
Simplify this by noting that [K] is symmetric
2N 2N
∂V
∂uk
= 1
2
∑ Kki ui + 1
2
∑ uj Kkj − rk
i=1 j=1
2N
= ∑ Kki ui − rk = 0
i=1
⇒ [K] −
u = –r
This is a system of 2N simultaneous linear equations for the 2N unknown nodal displacements. Standard
computational techniques such as Gaussian elimination, Cholesky factorization or conjugate gradient
methods may be used to solve the system of equations.
So far, we have seen how to calculate displacements in a finite element mesh which is subjected to prescribed
loading. What if displacements are prescribed instead?
If this is the case, the stiffness matrix and residual are first assembled exactly as described in the preceding
section. They are then modified to enforce the constraint. The procedure is best illustrated using an example.
Suppose that the finite element equations after assembly have the form
⎡ k11 k12N ⎤ ⎡ u1 ⎤ ⎡ r1 ⎤
(1)
k12 ⋯
⎢ k21 k22N ⎥ ⎢ u2 ⎥ ⎥ ⎢ r2 ⎥
⎢ ⎥⎢
(1)
⎥⎢ ⎥=⎢ ⎥
k22
⎢ ⎢ ⎥ ⎢ ⎥
⎢ ⎥⎢
⎢ ⋮ ⋱ ⎥⎢ ⋮ ⎥ ⎥
⎢ ⋮ ⎥
⎣k ⎦ ⎣r ⎦
2N1 k2N2 k2N2N ⎣ u(N) ⎦ 4
2
To prescribe displacements for any node, we simply replace the equation for the appropriate degrees of
(1)
freedom with the constraint. For example, to force u2 = Δ , we could modify the finite element equations to
⎡ k11 k1 2N ⎤ ⎡ u1 ⎤ ⎡ r1 ⎤
(1)
k12 ⋯
⎢ 0 0 ⎥⎢ u2 ⎥ ⎥ ⎢Δ⎥
⎢ ⎥⎢
(1)
⎢ ⎥=⎢ ⎥
1
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢ ⎥⎢
⎢ ⋮ ⋱ ⎥⎢ ⋮ ⎥ ⎥
⎢ ⋮ ⎥
⎣k ⎣r ⎦
2N 1 k2N 2 k2N 2N ⎦ ⎣ u(N) ⎦ 4
2
(1) (1)
Thus, the equation for u2 has been replaced with the constraint u2 = Δ .
This procedure works, but has the disadvantage that the modified stiffness matrix is no longer symmetric. It is
preferable to modify the stiffness and residual further, to retain symmetry. To do so, we eliminate the
constrained degrees of freedom from all rows of the stiffness matrix. This is best illustrated by example.
Suppose our modified stiffness matrix has the form
⎡ k11 k1 2N ⎤ ⎡ u1 ⎤ ⎡ r1 ⎤
(1)
k12 ⋯
⎢ 0 0 ⎥⎢ u2 ⎥ ⎥ ⎢Δ⎥
⎢ ⎥⎢
(1)
⎢ ⎥=⎢ ⎥
1
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢ ⎥⎢
⎢ ⋮ ⋱ ⎥⎢ ⋮ ⎥ ⎥
⎢ ⋮ ⎥
⎣k ⎦ ⎣r ⎦
2N 1 k2N 2 k2N 2N ⎣ u ⎦(N) 4
2
Now, we wish to set each entry in the second column (apart from the diagonal) to zero, so that the stiffness is
symmetric. Recall that we can add and subtract equations in the system from one another without affecting
the solution. Therefore, to symmetrize the stiffness matrix in our example, we can subtract appropriate
multiples of the second row so as to set each entry in the second column to zero.
⎡ k11 ⎤ ⎡ 1 ⎤ ⎡ r1 − k12 Δ ⎤
(1)
0 ⋯ k1 u
⎢ ⎥
2N
⎢ 0 ⎥ ⎢ u(1) ⎢ ⎥
⎢ ⎥⎢ 2 ⎥ ⎥=⎢ ⎥
1 0
⎢ ⎥⎢
Δ
⎢ ⎥⎢ ⎥ ⎢ ⎥
⎢ ⋮ ⋱ ⎥⎢ ⋮ ⎥ ⎥
⎢ ⋮ ⎥
⎣k 0 k2N ⎦ ⎣ (N) ⎦ ⎣ r4 − k2N 2 Δ ⎦
2N 1 2N u 2
10.11 Solution
The result of Sections 10.1-10.10 is a set of simultaneous linear equations of the form
[K mod ] −
u = –r
These can be solved for the unknown displacements u using standard techniques (e.g. Gaussian elimination
−
or iterative techniques). An important feature of the FEM equations is that the stiffness matrix is sparse – that
is to say, only a small number of entries in the matrix are non-zero. Consequently, special schemes are used to
store and factor the equations, which avoid having to store large numbers of zeros.
10.12 Post-processing
Once the displacements have been computed, the strain in each element can be computed, and so the stress
distribution can be deduced. The procedure is as follows
1. For the element of interest, extract the displacement of each node from the global displacement vector
2. Calculate the strains using the procedure in 7.2.4
⎡ u1 ⎤
(a)
⎢ (a) ⎥
⎢ u2 ⎥
⎡ ∂x 0 ⎤⎢ ⎢ (b) ⎥
⎥
∂Na ∂Nb ∂Nc
0 0
⎡ ε11 ⎤ ⎢ 1 ⎥ ⎢ ⎥
∂Nc ⎥ ⎢ 1 ⎥
∂x1 ∂x1
⎢ ε22 ⎥ = ⎢ ⎢ ⎥
u
⎢ 0 ∂x2 ⎥ ⎢ (b) ⎥
∂Na ∂Nb
u element
⎣ 2ε ⎦ ⎢ ∂N ⎥⎢u ⎥
–ε = [B] − ≡ ∂x2
0 ∂x2
0
⎣ a ⎦⎢⎢ (c) ⎥
⎥
∂Na ∂Nb ∂Nb ∂Nc ∂Nc 2
⎢ u1 ⎥
12
⎢ ⎥
∂x2 ∂x1 ∂x2 ∂x1 ∂x2 ∂x1
⎣ u(c) ⎦
2
3. The stresses can then be determined from the stress-strain equations
σ = [D] –ε
−
where [D] is defined in 7.2.4.
Note that
1. Nodes are numbered sequentially – thus node (1) has coordinates (0,0); node (2) has coordinates (1,0),
etc.
2. The element connectivity specifies the node numbers attached to each element, using a
counterclockwise numbering convention. It doesn’t matter which node you use for the first one, as
long as all the others are ordered in a counterclockwise sense around the element. For example, you
could use (2,4,1) instead of (1,2,4) for the connectivity of the first element.
3. To fix motion of a node, you need to enter the node number, the degree of freedom that is being
constrained, (1 for horizontal, 2 for vertical), and a value for the prescribed displacement.
4. To specify tractions acting on an element face, you need to enter (a) the element number; (b) the face
number of the element, and (c,d) the horizontal and vertical components of traction acting on the face.
The face numbering scheme is determined by the element connectivity, as follows. Face (1) has the
first and second nodes as end points; face (2) has the second and third nodes; and face (3) has the
third and first nodes as end points. Since connectivity for element (2) was entered as (2,3,4), face 1 of
this element has nodes numbered 2 and 3; face 2 connects nodes numbered 3 and 4, while face 3
connects nodes numbered 4 and 1.
and enter a name for the output file.
1. Return to the top of the file, and press <enter> to execute each MAPLE
block. If all goes well, you should see that, after reading the input data,
MAPLE plots the mesh (just as a check).
2. If you continue to the end, you should see a plot of the displaced mesh
(red) superimposed on the original mesh (green), as shown on the right.
3. Finally, open the output file. It should contain the results shown below