You are on page 1of 22

See discussions, stats, and author profiles for this publication at: https://www.researchgate.

net/publication/281444684

Corotational formulation for beams.

Research · September 2015


DOI: 10.13140/RG.2.1.1074.6081

CITATIONS READS

0 2,582

1 author:

Aashish Ahuja
Becton, Dickinson and Company (BD)
12 PUBLICATIONS   59 CITATIONS   

SEE PROFILE

Some of the authors of this publication are also working on these related projects:

Biomechanics of Aortic Dissection View project

All content following this page was uploaded by Aashish Ahuja on 03 September 2015.

The user has requested enhancement of the downloaded file.


COROTATIONAL FORMULATION FOR BEAMS
Aashish Ahuja

Abstract
The corotational beam formulation considers a beam element with reference to the local, element-based coor-
dinate system. Using this approach, any frame structure undergoing arbitrarily large displacements and rotations
at the global level can be solved by decomposing the motion of its beam elements into their corresponding rigid
body and pure deformational motions. The current paper tries to model two different corotational formulations
based on Kirchhoff and Timoshenko beam theories. The difference in the formulations arises from the assump-
tions incorporated to represent local deformations. In the first case, the results for a linearly elastic cantilever
beam with an end point vertical load undergoing large deformation is computed. In the second case, another
linearly elastic cantilever beam is loaded by an end moment such that it is rolled into a circle.

INTRODUCTION
The corotational method formulates beam elements with reference to a local, element-based, coordinate system.
The local beam strains are considered to be small in this frame of reference and all beam elements are assumed
to be linearly elastic. Furthermore, the deformation of beam within this local frame of reference can be modeled
by ‘approximate beam theory’. As with any corotational method, three ingredients are required: 1) the relations
between the global and local variables, 2) the angle of rotation of the corotating frame and 3) a variationally
consistent tangential stiffness matrix.
The codes for formulations based on both, Kirchhoff and Timoshenko beam theories, have been implemented in
PyFEM and are included in the Appendix.

COROTATIONAL CONCEPT
Consider the corotational concept in terms of beam elements. As a frame structure is loaded, the entire frame
deforms from its original configuration. During this process an individual beam element potentially does three
things: it rotates, translates and deforms. The global displacements of the end nodes of the beam element include
information about how the beam element has rotated, translated and deformed. The rotation and translation are
rigid body motions, which may be removed from the motion of the beam. If this is done, all that remains are the
strain causing deformations of the beam element. The strain causing local deformations are related to the forces
induced in the beam element. This is achieved by attaching a corotating frame with the beam element such that
the X` -axis is always directed along the element. The Y` -axis is perpendicular to the X` -axis so that the resultant
frame is a right handed orthogonal coordinate system. With respect to this local corotating coordinate frame, the
rigid body rotations and translations are zero and only local strain producing deformations remain.

KIRCHHOFF THEORY
The following derivation is closely based on the theory given by (Crisfield 1991) and (Yaw 2009). The formulation
assumes that there is no shear deformation in the beam and thus, the cross-section of the beam is always normal
to the centerline.

Axial strain
For the beam in its initial configuration, the the global nodal coordinates are defined as (X1 , Y1 ) for node 1 and
(X2 , Y2 ) for node 2. The original length of the beam is
p
`0 = (x2 − x1 )2 + (y2 − y1 )2 (1)

1
For the beam element in its current configuration the global nodal coordinates are (X1 + u1 , Y1 + w1 ) for node
1 and (X2 + u2 , Y2 + w2 ) for node 2, where for example, u1 is the global nodal displacement of node 1 in the
X-direction and w1 is the global nodal displacement of node 1 in the Y-direction [Fig.1].

Figure 1: Initial and current configuration of the beam element.

The current length of the beam element is:


p
` = ((x2 − x1 + u2 − u1 )2 + (y2 − y1 + w2 − w1 )2 (2)

The local axial displacement of the beam element is calculated as:

u` = ` − `0 (3)

There is a possibility that [Eq.(3)] is badly conditioned for use in a numerical setting. Therefore, it is suggested
that u` be multiplied by (`+` 0)
(`+`0 ) for better conditioning

`2 − `20
u` = (4)
` + `0
[Eq.(4)] essentially provides the relationship between global displacements and the local axial deformation (rela-
tion between global and local variables). The axial strain is assumed constant and is calculated as εxl = u` /`o .
The axial force in the beam is then
EAu`
N= (5)
`o

Angle of rotation of the corotating frame


The global coordinates remain fixed throughout the corotational formulation. However, a local co-rotating coor-
dinate frame is attached to each beam element as shown in [Fig.1]. This co-rotating coordinate frame rotates with
the beam element as the beam structure deforms. The current angle of the co-rotating frame with respect to the
global coordinate system is denoted as β. The current sine and cosine values of β are calculated using global
variables.
(X2 + u2 ) − (X1 + u1 ) (Y2 + w2 ) − (Y1 + w1 )
cos β = , sin β = (6)
` `

2
Flexural deformations

Figure 2: Initial and current configuration, due to flexural deformations

Consider the beam element in its initial and current configurations as shown in [Fig.2]. The beam undergoes
translation, rotation and has local flexural deformations. In the initial and current configurations, a line is drawn
from node 1 to node 2 which is used as a reference line and is the local x-axis. The angles θ1 and θ2 are the global
nodal rotations calculated from the global matrix equations and are measured from lines parallel to the initial
configuration of the beam element. If the initial and final angles of the bar, βo and β, are known, then the local
nodal rotations are
θ1` = θ1 + β0 − β, θ2` = θ2 + β0 − β (7)
The initial angle of the bar is computed and stored as
 
−1 Y2 − Y1
βo = tan (8)
X2 − X1

and the current angle of the bar is computed as


 
−1 (Y2 + w2 ) − (Y1 + w1 )
β = tan (9)
(X2 + u2 ) − (X1 + u1 )

The value of β computed using [Eq.(9)] is only valid for |β| < π/2 due to the use of tan−1 function. However,
it is preferable to avoid any limitation on the range of rotation of the element. To achieve this, the approach of
(De Souza 2000) is given as follows. Assuming that the local rotations are moderate, [Eq.(7)] is modified to

sin θ1` = sin(θ1 + βo − β) = sin(β1 − β) = cos β sin β1 − sin β cos β1 (10)

where β1 = θ1 + βo .
Also,
cos θ1` = cos(θ1 + βo − β) = cos(β1 − β) = cos β cos β1 + sin β sin β1 (11)
For node 1, using [Eq.(10)] and [Eq.(11)]
 
cos β sin β1 − sin β cos β1
θ1` = tan−1 (12)
cos β cos β1 + sin β sin β1

Similarly, for node 2 we compute θ2`


 
−1 cos β sin β2 − sin β cos β2
θ2` = tan (13)
cos β cos β2 + sin β sin β2

3
where β2 = θ2 + βo .
Using standard structural analysis, it is shown that the local end moments of the beam are related to the arbitrary
local nodal rotations as follows:     
M1 2EI 2 1 θ1`
= (14)
M2 `o 1 2 θ2`
Since the only local displacement is due to axial strain and local transverse displacements are zero, the local
transverse shear forces are calculated based on simple statics once the end moments are known in the local system.
Assuming no forces are applied between the nodes of a beam element, and summing moments around node 2, the
shear force at node 1 is
M1 + M2
V1 = (15)
`
Summing forces vertically in the local system gives V2 = −V1 .

Relation between global and local variables


Consider a small movement (variation) δd21 from the current configuration shown in [Fig.3]. Using the dot
product gives the component of δd21 projected along e1 . Therefore, the small movement in the axial direction in
local coordinates is

Figure 3: A small movement from the current configuration

 T  T  
cos β cos β δu2 − δu1
δu` = e1 T δd21 = δd21 = (16)
sin β sin β δw2 − δw1
where, e1 is the unit vector lying along the line drawn between the beam nodes in the current configuration. The
right hand side of [Eq.16] is rewritten as:

δu` = cos βδu2 − cos βδu1 + sin βδw2 − sin βδw1


= − cos βδu1 − sin βδw1 + 0δθ1 + cos βδu2 + sin βδw2 + 0δθ2 (17)
T
= [− cos β − sin β 0 cos β sin β 0]δp = r δp

where δp is the variation of the global displacement vector pT = [u1 w1 θ1 u2 w2 θ2 ]. The above equation gives
the relationship between the infinitesimal local axial deformation and the infinitesimal global nodal displacements.
Next, a relationship is calculated between local infinitesimal nodal rotations and the global nodal displacements.
An infinitesimal rigid rotation from the current configuration along the unit vector e2 T = [− sin β cos β], gives
for an infinitesimal angle change, an arc length change of `δβ = e2 T δd21 , such that
1 T
δβ = e2 δd21 (18)
`

4
The above equation is expressed in terms of the variation of global displacement and can be rewritten as
 T  
1 − sin β δu2 − δu1
δβ =
` cos β δw2 − δw1
1 (19)
= (sin βδu1 − cos βδw1 + 0δθ1 − sin βδu2 + cos βδw2 + 0δθ2 )
`
1
= [ sin β − cos β 0 − sin β cos β 0 ]δp
`
We can define [Eq.(19)] in a compact form by introducing z such that
1 T
δβ = z δp (20)
`
From [Eq.(7)], the variation of δθ` is given as
     
θ1 + βo − β δθ1 + δβo − δβ δθ1 − δβ
δθ` = δ = = (21)
θ2 + βo − β δθ2 + δβo − δβ δθ2 − δβ

where it is recognized δβo = 0. Now, substituting for [Eq.(19)] in the above expression.
      T  
δθ1` 0 0 1 0 0 0 z
δθ` = = δp − 1` δp = AT δp (22)
δθ2` 0 0 0 0 0 1 zT

The complete vector of infinitesimal local strain producing deformations is formulated using the result of [Eq.(22)]
and [Eq.(17)]  
δu`  T 
r
δp` = δθ1` = δp = Bδp (23)
AT
 
δθ2`
and the final matrix form for B is
 
− cos β − sin β 0 cos β sin β 0
B =  − sin β/` cos β/` 1 sin β/` − cos β/` 0  (24)
− sin β/` cos β/` 0 sin β/` − cos β/` 1

Equivalence of virtual work in the local and global systems


Virtual work is equivalent in the local and global systems. Hence,

δpv T qi = N δu`v + M1 δθ1`v + M2 δθ2`v = δpT


`v q`i (25)

where qi is the vector of global internal forces for element i, qli = [N M1 M2 ] and a subscript v implies a
virtual quantity. Then using [Eq.(23)] in the above equation gives

δpv T qi = (Bδpv )T q`i = δpv T B T q`i (26)

Realizing that the δpv are arbitrary virtual displacements, it follows

qi = B T q`i (27)

Tangential stiffness matrix


The variation of force in [Eq.(27)] leads to variationally consistent tangent stiffness matrix that is

δqi = B T δq`i + δB T q`i = B T δq`i + N δB 1 + M 1 δB 2 + M 1 δB 2 (28)

where δB 1 , for example. is the variation of the first column of B. The terms on the R.H.S. of [Eq.(28)] are
analyzed one-by-one starting with the variation of q`i and using [Eq.(5)] and [Eq.(14)] we get
   EA 
δN `o 0 0
δq`i =  δM 1  =  0 4 EI
`o 2 EI
`o
 δp` = C` δp` (29)
δM 2 0 2 EI
`o
EI
4 `o

5
Substituting [Eq.(29)] in [Eq.(28)] and using the result in [Eq.(23)] yields

B T δq`i = B T C` δp` = B T C` Bδp (30)

Therefore,
K1 = B T C` B (31)
which is the standard transformed global tangent stiffness (material stiffness) matrix for a 2D beam element. The
last three terms on the R.H.S. of [Eq.(28)] contribute to the geometric stiffness. Taking the variation of the first
column of B T
δB 1 = δr = δ[− cos β − sin β 0 cos β sin β 0]T
(32)
= [sin β − cos β 0 − sin β cos β 0]T δβ = zδβ

Since, δβ = 1` z T δp, the above equation becomes

1 T
δB 1 = zz δp (33)
`
Next, taking the variation of second column of B T gives
     
1 1 1
δB 2 = δ − z = δ − z+ − δz (34)
` ` `
The value of z was calculated in [Eq.(32)] which is used to calculate the value of δz
   
sin β cos β
 − cos β   sin β 
   
 0   0  1 T
δz = δ   =  − cos β  δα = −rδα = − ` rz δp (35)
   
 − sin β   
 cos β   − sin β 
0 0

The second term in [Eq.(34)] is δ − 1` which is rewritten as




1 δu` 1
δ − = (−1)(−`−2 )δ` = 2 = 2 r T δp (36)
` ` `
where δ` = δ`o + δu` = δu` .
Finally, δB 2 becomes
1
δB 2 = (rz T + zr T )δp (37)
`2
By inspection of B T , it is evident that δB 3 = δB 2 . Using [Eq.(37)] and [Eq.(33)] in [Eq.(28)]

N T M1 + M2
K2 = zz + (rz T + zr T ) (38)
` `2
The resultant variationally consistent tangent stiffness matrix is the sum of K1 + K2 . Therefore

N T M1 + M2
K = K1 + K2 = B T C ` B + zz + (rz T + zr T ) (39)
` `2

Algorithm for Corotational Beam Analysis


The following is a load control algorithm for performing a corotational beam analysis. This is an implicit formu-
lation which uses Newton-Raphson iterations at the global level to achieve equilibrium during each incremental
load step. Material nonlinearities are not presently included in the algorithm.
1. Define and initialize variables
• β o = the vector of initial angles of beam elements, measured with respect to the global X-axis [Eq.(8)]
• A = the vector of element cross-sectional areas, area for element i is Ai
• E = the vector of element moduli of elasticity, modulus for element i is Ei

6
• I = the vector of element 2nd area moments of inertia, moment of inertia for element i is Ii
• F = the total vector of externally applied global nodal forces
• F n+1 = the current externally applied global nodal force vector
• q ` = the storage vector of local forces (N , M 1 and M 2 ).
• u = the vector of global nodal displacements, initially u = 0
• x = the vector of nodal x coordinates in the undeformed configuration
• y = the vector of nodal y coordinates in the undeformed configuration
• ` = the vector of beam element lengths based on current u using [Eq.(2)], ` for beam i is `i .
• cos β and sin β = the vectors of cosines and sines for each beam element angle, β, based on the current
u [Eq.(6)]
• K = the resultant tangential stiffness matrix for an element. The assembled global tangential stiffness
matrix, Ka is obtained from the assembly of element tangential stiffness matrices.
2. Start loop over the equal load increments (for n = 0 to (# of increments, ninc)-1 ) using the Newton-
Raphson procedure.
• Calculate load factor λ = 1/ninc and incremental force vector dF = λF
• Calculate global stiffness matrix Ka based on current values of cos β, sin β, `, `o , A, E, I and q` .
• Modify Ka by accounting for displacement constraints.
• Solve for the incremental global nodal displacements du = K−1
a dF
• Update global nodal displacements, un+1 = un + du
• Update the global nodal forces, F n+1 = F n + dF
• Update element data using ucurrent = un+1
• Construct the vector of internal global forces F n+1 n+1
int based on q ` . Steps include:
1.) q` is an assembly of q`i . For a frame structure with nm elements, the vector q` is 3nm × 1 in
size. q`i is a three term vector which is extracted from q` for beam element i.
2.) Use [Eq.(27)], to calculate qi from q`i

qi = B T q`i (40)

3.) Assemble qi to give the global internal force vector, F int


nm
F int = A qi (41)
i=1

where A is the assembly operator.


• Construct the residual R = F n+1
int − F
n+1

• Calculate the norm of the residual R = R · R
• Iterate while R > tolerance
(a) Calculate the new global stiffness matrix Ka based on current values of cos β, sin β, `, `o , A, E,
I and q` .
(b) Modify the global stiffness to account for constraints.
(c) Calculate the correction to un+1 , which is δuk+1 = δuk − K−1 a R
n+1 k+1
(d) Update element data using ucurrent = u + δu
(e) Construct the vector of internal global forces F n+1 k+1
int based on q ` .
n+1 n+1
(f) Calculate the residual R = F int − F

(g) R = R · R
(h) Update iterations counter k = k + 1
3. Update displacements to their final value for the current increment

un+1 n+1
f inal = u(0) + δu(k) (42)

4. End loop over load increments.

7
TIMOSHENKO BEAM THEORY
The preceding derivation for corotational beam element based on Kirchhoff’s assumptions can be modified to
incorporate shear deformation resulting in Timoshenko beam theory. The present paper expands on the procedure
and calculations described in (Krenk 2009) and (Crisfield 1991). The following method largely remains similar to
the description in the section on Kirchhoff’s theory. The differences lies in the definitions of element deformation
modes or local strains and the consequent formulation of global tangential stiffness matrix.

Deformation modes of beam elements


The beam element is located in a plane defined by a fixed frame of reference {x1 , x2 }. The beam itself is described
with respect to a local frame of reference {x, y}, which follows the motion of the beam. The local frame of
reference is defined by the position of the end points 1 and 2 of the beam elements: the x-axis passes through the
points 1 and 2, and the origin is located with equal distance from 1 and 2 [Fig.4].

Figure 4: Motion of the beam element in local co-rotating frame of reference

As stated earlier, the idea of the corotating formulation is to separate the motion into two parts: a rigid body
motion associated with the motion of the local frame of reference, and motion describing the deformation of the
beam within this frame.

Figure 5: Deformation modes

The three element deformation modes or local strains are illustrated in [Fig.5]. The extension mode in [Fig.5a]
consists of an axial translation of magnitude 21 du of the nodes 1 and 2, increasing their distance by du. This value,

8
du is calculated from the difference between current beam element length, ` (calculated in [Eq.(2)]) and original
length, `o (calculated in [Eq.(1)]). The extension deformation mode of the beam element is calculated as:

u` = ` − `0 (43)

The symmetric bending mode shown in [Fig.5b] is defined by a rotation 12 dφs of the node points, clockwise at 1
and counterclockwise at 2. Finally, the anti-symmetric bending mode shown in [Fig.5c] is defined by a counter-
clockwise rotation 12 dφa at both end-points. Three generalized force components [Fig.6] are defined conjugate to
the displacement components of the deformation modes.

Figure 6: Equilibrium force system

The extension mode corresponds to a normal force N , shown in [Fig.6a]. The symmetric bending mode corre-
sponds to a moment Ms at the end nodes, clockwise at node 1 and counterclockwise at node 2 [Fig.6b]. The
anti-symmetric bending mode corresponds to a counterclockwise moment Ma at both end nodes. While gen-
eralized forces N and Ms are equilibrium systems, moment Ma in the anti-symmetric bending mode must be
complemented by shear forces Q = −2Ma /` as shown in [Fig.6c]. The following notations are used to represent
the components of the deformation modes and the corresponding equilibrium force systems:

dv T = [du dφs dφa ], tT = [N Ms Ma ] (44)

The terms v and t described in [Eq.(44)] are analogous to p` and q `i , respectively, defined in the preceding
section on Kirchhoff theory. Also, p and q i have been used for global displacements and global internal forces,
respectively, defined in the fixed frame of reference.

Corotation form of the tangent stiffness


The corotating formulation involves two transformations: one from the reduced set of internal variables dv and t to
a complete set of variables dpe and q e in a coordinate system aligned with the element, and then a transformation
of these components to the fixed frame of reference by rotation to give p and q i . The rotation of components q e
in a local frame of reference to the fixed frame of reference is given by the rotation matrix
 
cos φ − sin φ 0 0 0 0
 sin φ cos φ 0 0 0 0 
 
 0 0 1 0 0 0 
Re =    (45)
 0 0 0 cos φ − sin φ 0  
 0 0 0 sin φ cos φ 0 
0 0 0 0 0 1

Thus,
q i = Re q e (46)
The first transformation, giving the full set of generalized forces in a local frame, is expressed as

q e = St (47)

9
where the 6 × 3 transformation matrix S is
 
−1 0 0 1 0 0
ST =  0 0 −1 0 0 1  (48)
2 −2
0 ` 1 0 ` 1

Substituting [Eq.(47)] in [Eq.(46)], the resulting equation transforms the local generalized forces into global in-
ternal force vector.
q i = Re St (49)

Tangential stiffness matrix


The tangential stiffness matrix can be derived directly from increment of q i

dq = Re Sdt + Re dSt + dRe St (50)

[Eq.(50)] has derivatives of Re , S and t which are expressed as


 
− sin φ − cos φ 0 0 0 0
 cos φ − sin φ 0 0 0 0 
 
 0 0 0 0 0 0 
dRe =   dφ (51)

 0 0 0 − sin φ − cos φ 0 

 0 0 0 cos φ − sin φ 0 
0 0 0 0 0 0

where dφ = (duB A
y − duy )/`.  
0 0 0
−2

 0 0 `2


 0 0 0 
dS =   d` (52)
 0 0 0 
−2 
 
 0 0 `2
0 0 0
where d` = [duB A
x − dux ].

Before dt can be defined, the terms {dN, dMs , dMa } need to calculated:
1. From the extension mode:
EA EA
N= u, dN = du (53)
` `
2. Symmetric bending mode for linear elastic beam
Z `  
Ms EI
Ms ds = Ms φs ⇒ Ms = φs (54)
0 EI `
EI
dMs = dφs (55)
`
3. Antisymmetric bending mode with shear forces
Z ` −1
(Ma + Qs)2 Q2
 
EI 12EI
+ ds = Ma φa ⇒ Ma = 3 1+ 2 φa (56)
0 EI GA ` ` GA
where G is the shear modulus.
EI
dMa = 3ψa dφa (57)
`
Using [Eq.(53)], [Eq.(55)] and [Eq.(57)], one can express dt as:
    
dN   EA 0 0 du
 dMs  = 1  0 EI 0   dφs  (58)
`
dMa 0 0 3ψa EI dφa
| {z } | {z } | {z }
dt Kd dv

10
or,
dt = Kd dv (59)
The ingredients required to calculate the terms in the R.H.S of [Eq.(50)] have been computed before. Each term in
the R.H.S of [Eq.(50)] is expanded and the final tangential stiffness matrix is derived by adding all the expanded
expressions together.
The first term in the R.H.S of [Eq.(50)] is given as

Re Sdt = Re SKd dv = Re SKd S T Re T dp (60)

The second term gives the change in shear force due to change in `
 
0 0 0
 0 0 −2  !
 `2  N
A  0 0 0 
Re dSt = Re [duB
 
x − du ]
x  0 0 Ms  (61)
0 

 0 0 −2 
 M a
`2
0 0 0
 
0 0 0 0 0 0

 −Q 0 0 Q 0 0 

1 0 0 0 0 0 0  Re T dp, Q = −2Ma
 
⇒ Re  (62)
` 
 0 0 0 0 0 0 
 `
 Q 0 0 −Q 0 0 
0 0 0 0 0 0
The third term in RHS represents stiffness due to corotating frame of reference.

dRe St = Re Re T dRe St (63)


 
− sin φ − cos φ 0 0 0 0
 cos φ − sin φ 0 0 0 0   !
duB A N
y − duy
 
T 
 0 0 1 0 0 0 
⇒ Re [ ]Re   S  Ms  (64)
` 0 0 0 − sin φ − cos φ 0 
  Ma
 0 0 0 cos φ − sin φ 0 
0 0 0 0 0 1
 
0 −Q 0 0 Q 0
 0 N
 0 0 −N 0 

1  Re T dp, Q = −2Ma
 0 0 0 0 0 0 
dRe St = Re  (65)
`  0 Q
 0 0 −Q 0 
 `
 0 N 0 0 N 0 
0 0 0 0 0 0
The total global stiffness matrix for an element, K is given as the sum of [Eq.(60)], [Eq.(62)] and [Eq.(65)].

dq i
K= (66)
dp
 
0 −Q 0 0 Q 0

 −Q N 0 Q −N 0 

1 0 0 0 0 0 0
K = Re SKd S T Re T  Re T
 
+ Re  (67)
` 
 0 Q 0 0 −Q 0 

 Q N 0 −Q N 0 
0 0 0 0 0 0

Algorithm for Corotational Beam Analysis


The current state of the beam element is illustrated in [Fig.7], showing the current coordinate vectors xA and xB
and rotation angles φA , φB at the element end-points.

11
Figure 7: Deformed beam element in 2D problem

In the corotation format the element properties are first obtained in a local element-based frame of reference and
are subsequently transformed into the global frame. For two-dimensional co-rotating beam element problems the
formation of element forces and stiffness matrix can be arranged as described in the following algorithm.

Figure 8: Algorithm to define two dimensional beam elements based on Timoshenko beam theory

The beam element tangential stiffness matrix and element force vector are assembled for all the elements that are
present in the frame. An implicit formulation which uses Newton-Raphson iterations at the global level is used to
achieve equilibrium during each incremental load step.

EXAMPLE PROBLEMS
Cantilever Beam with Tip Load solved
A cantilever beam is loaded by a point load at its free end [Fig.9]. The load displacement results for the tip from
Kirchhoff beam theory are compared to the solution obtained from Timoshenko beam theory in [Fig.10]. The
load displacement is linear for small loads, but as the load increases the curve is clearly nonlinear. As the load
increases further the structure becomes stiffer, which is caused by tension stiffening of the beam in its deformed
configuration. The analysis is completed in 20 load increments. An additional vertical load of 0.5kips is applied
to the tip with every increment. For this example, all beam members have a cross-sectional area, A = 4.0in2 ,
second area moment of inertia, I = 1.3333in4 , polar moment of inertia, J = 2.6666in4 , modulus of elasticity,
E = 100ksi and shear modulus, 38.5ksi. The beam is 10 inches long and is discretized with 7 equal length beam
elements and 8 nodes. The tolerance used for equilibrium iterations is 10−3 .
It is observed that the solutions obtained from the two theories match only for small values of tip loads. They
diverge as the force being applied becomes larger in value.

12
Figure 9: Initial and final configuration of a cantilever beam loaded with end point load

Figure 10: Comparison between solution obtained from the two beam theories

Cantilever Beam Loaded By End Moment solved using Kirchhoff theory


A cantilever beam is loaded by a moment at its free end. Initial and intermediate configurations of the beam are
shown in [Fig.11]. The load versus vertical tip displacement results are shown in [Fig.12]. The load displacement
is linear for small loads, but as the load increases the curve is clearly nonlinear. The analysis is completed in
100 load increments. For this example, all beam members have a cross-sectional area, A = 4.0in2 , second area
moment of inertia, I = 1.3333in4 and modulus of elasticity, E = 100ksi. The beam is 10 inches long and
is discretized with 17 equal length beam elements and 18 nodes. The end of cantilever is loaded in moment
increments of 0.83kips − in. The tolerance used for equilibrium iterations is 10−3 .

13
Figure 11: Initial, intermediate and final configuration of a cantilever beam loaded with end moment

Figure 12: Moment versus vertical displacement plot

CONCLUSION
The paper contains derivations and explanation of the ingredients of a 2D corotational beam formulation. The
corotational formulation for both beam theories, Kirchhoff and Timoshenko, are given and proved in great detail.
The algorithms and the codes for the formulations are also provided. The flexibility of PyFEM allows carefree
integration of cororotational method with the rest of the package. Numerical results for examples are provided
using both beam theories. The corotational method is an effective scheme for including large displacements and
large rotations in a common 2D frame analysis program.

References
Crisfield, M. (1991). “Nonlinear finite element analysis of solids and structures.” volume 1.John Wiley and Sons
Ltd., Chichester, England.
De Souza, R. M. (2000). Force-based finite element for large displacement inelastic analysis of frames. Ph.D.
thesis, University of California, Berkeley.
Krenk, S. (2009). “Non-linear modeling and analysis of solids and structures.” pages 100–144.Cambridge Uni-
versity Press, Cambridge, London.
Yaw, L. (2009). “2D Corotational Beam Formulation.”

APPENDIX

14
Code for formulating Kirchhoff Beam Element

##############################################
# Corotational Kirchoff beam element. No #
# shear stress calculations for this element #
##############################################

from .Element import Element


from pyfem.util.transformations import getRotationMatrix

from numpy import zeros, dot, array, eye, outer, mat, empty,sqrt
from scipy.linalg import norm
from math import atan2, sin, cos, tan
import time
import inspect

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------

class CorotKirchhoffBeam ( Element ):

#dofs per element


dofTypes = [ 'u' , 'v' , 'rz' ]

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------

def __init__ ( self, elnodes , props ):


Element.__init__( self, elnodes , props )

self.EA = self.E * self.A


self.EI = self.E * self.I

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------

def __type__ ( self ):


return name

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
# There are 9 degrees of freedom in an element. 6 translations for the 3 nodes
# and 3 rotations for the 3 nodes.
def getTangentStiffness ( self, elemdat ):
"""The tangent stiffness matrix is easily found by exact integration
since all the terms are simply constants. Depends on local forces of the
different element members that make up the beam"""

15
Code for formulating Kirchhoff Beam Element

stiff = zeros( elemdat.stiff.shape );

B,qli,lc,l0,cbeta,sbeta = self.getMemberData( elemdat )

# First term : B'DB


D = array( [[self.EA/l0,0,0],\
[0,4*self.EI/l0,2*self.EI/l0],\
[0,2*self.EI/l0,4*self.EI/l0]] )
stiff += dot( B.transpose(),dot(D,B) )

# 2nd term:
z = array( [sbeta,-cbeta,0,-sbeta,cbeta,0] )
stiff += ( qli[0]/lc )*outer(z,z)

# 3rd term
v = array( [-cbeta,-sbeta,0,cbeta,sbeta,0] )
r = outer(v,z)
stiff += ( ( qli[1] + qli[2] )/(lc**2 ) )*( r + r.transpose() )

elemdat.fint = dot(B.transpose(),qli)
elemdat.stiff = stiff

elemdat.outlabel.append("forces")
elemdat.outdata = zeros( shape=(len(elemdat.nodes),3) )
elemdat.outdata[0,:] = elemdat.fint[0:3]
elemdat.outdata[1,:] = elemdat.fint[3:6]

#------------------------------------------------------------------------------

def getInternalForce ( self, elemdat ):


"""Calculates the internal force in the global coordinates"""

B,qli,lc,l0,cbeta,sbeta = self.getMemberData( elemdat )


elemdat.fint = dot(B.transpose(),qli)

#------------------------------------------------------------------------------

def getMemberData(self,elemdat ):
"""The objective of this section is to include updated data about
each member in the beam."""

# Initial angle made by the beam member


# beta0 = atan( y2-y1 / x2-x1 )
beta0 = atan2( ( elemdat.coords[1][1] - elemdat.coords[0][1] ),\
( elemdat.coords[1][0] - elemdat.coords[0][0] ) )

# Original length of beam, l0


l0 = norm( elemdat.coords[1]-elemdat.coords[0] )

# Calculate X and Y distances between nodes 1 and 2

16
Code for formulating Kirchhoff Beam Element

dX = elemdat.coords[1][0] + elemdat.state[3] - \
( elemdat.coords[0][0] + elemdat.state[0] )
dY = elemdat.coords[1][1] + elemdat.state[4] - \
( elemdat.coords[0][1] + elemdat.state[1] )

# Calculate current length of member


lc = sqrt( dX**2 + dY**2 )

# Calculate the cosine and sine of the current angle 'beta'


cbeta = dX/lc
sbeta = dY/lc

# Calculate the axial displacement of member i


ul = ( lc**2 - l0**2 )/( lc + l0 )

# Axial force
Nf = self.EA*ul/l0

# Calculate beta
beta = atan2( dY,dX )

# beta1 and beta2 are calculated using the theta(1 and 2) values that
# are solved from the global set of equations. For each element, the
# values for the dofs at the nodes are saved in elemdat.state
beta1 = elemdat.state[2] + beta0
beta2 = elemdat.state[5] + beta0

# Find the value of theta(1l) and theta(2l)


theta1l = atan2( cbeta*sin(beta1) - sbeta*cos(beta1), \
cbeta*cos(beta1) + sbeta*sin(beta1) )
theta2l = atan2( cbeta*sin(beta2) - sbeta*cos(beta2), \
cbeta*cos(beta2) + sbeta*sin(beta2) )

# Find \overbar{M1} and \overbar{M2}. These are the local moments


vec_theta = array([theta1l,theta2l])
mom_matrix = (2/l0)*self.EI*array( [[2,1],[1,2]] )
local_mom = dot( mom_matrix, vec_theta )

# Local force vector [N,\overbar{M1},\overbar{M2}]


qli = array( [ Nf,local_mom[0],local_mom[1] ] )

# Rotation from the element coordinate space to global space


B = array( [[-cbeta,-sbeta,0,cbeta,sbeta,0],\
[-sbeta/lc,cbeta/lc,1,sbeta/lc,-cbeta/lc,0],\
[-sbeta/lc,cbeta/lc,0,sbeta/lc,-cbeta/lc,1] ])

return B, qli,lc,l0,cbeta,sbeta

#------------------------------------------------------------------------------

17
Code for formulating Timoshenko Beam Element

##############################################
# Corotational Timoshenko beam element. #
# Shear deformation is calculated for #
# this element #
##############################################

from .Element import Element

from numpy import zeros, dot, array, eye, outer, mat, empty,sqrt
from scipy.linalg import norm
from math import atan2, sin, cos, tan,pi
import time
import inspect

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------

class CorotTimoshenkoBeam( Element ):

#dofs per element


dofTypes = [ 'u' , 'v' , 'rz']

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------

def __init__ ( self, elnodes , props ):


Element.__init__( self, elnodes , props )

self.EA = self.E * self.A


self.EI = self.E * self.I
self.GA = self.G * self.A

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------

def __type__ ( self ):


return name

#------------------------------------------------------------------------------
#
#------------------------------------------------------------------------------
# There are 9 degrees of freedom in an element. 6 translations for the 3 nodes
# and 3 rotations for the 3 nodes.
def getTangentStiffness ( self, elemdat ):
"""The tangent stiffness matrix is easily found by exact integration
since all the terms are simply constants. Depends on local forces of the
different element members that make up the beam"""

18
Code for formulating Timoshenko Beam Element

# Stiffness matrix in global coordinates. Should be a 6x6 matrix


stiff = zeros( elemdat.stiff.shape );

# Calculates the internal stresses(t) and transformation matrices(S and R)


R,S,t,lc,lo,psi = self.getMemberData( elemdat )

# Generalized constituitve stiffness matrix


# Local Constituitive stiffness
Kd1 = ( 1/lc )*array( [[self.EA,0.,0.],
[0.,self.EI,0.0],
[0.,0.,3*psi*self.EI]] )

# Local Geometric stiffness


Kd2 = (lc)*array( [[0.,0.,0.],
[0.,t[0]/12.,0.],
[0.,0.,t[0]/20.]] )

# Constituitive transformation
KD = Kd1 + Kd2
KD = dot( S,dot( KD,S.transpose() ) )

# Member Geometric stiffness


Kr = zeros( elemdat.stiff.shape )
# Kr(1,1) block matrix
Kr[0:3,0:3] += ( 1/lc )*array( [ [ 0.,2.*t[2]/lc,0. ],
[ 2.*t[2]/lc,(6./5.)*t[0],(1./10.)*t[0]*lc ],
[ 0.,(1./10.)*t[0]*lc,(2./15.)*t[0]*(lc**2) ] ] )
# Kr(2,2) block matrix
Kr[3:6,3:6] += ( 1/lc )*array( [ [ 0.,2.*t[2]/lc,0. ],
[ 2.*t[2]/lc,(6./5.)*t[0],-(1./10.)*t[0]*lc ],
[ 0.,-(1./10.)*t[0]*lc,(2./15.)*t[0]*(lc**2) ] ] )

# Kr(1,2) block matrix


Kr[0:3,3:6] += ( 1/lc )*array( [ [ 0.,-2.*t[2]/lc,0. ],
[ -2.*t[2]/lc,-(6./5.)*t[0],(1./10.)*t[0]*lc ],
[ 0.,-(1./10.)*t[0]*lc,-(1./30.)*t[0]*(lc**2) ] ] )

# Kr(2,1) block matrix


Kr[3:6,0:3] += Kr[0:3,3:6].transpose()

# Element stiffness in global frame


stiff = dot( R, dot( (KD + Kr),R.transpose() ) )

elemdat.outlabel.append("forces")
elemdat.outdata = zeros( shape=(len(elemdat.nodes),3) )

elemdat.fint = dot( R,dot(S,t) )


elemdat.outdata[0,:] = elemdat.fint[0:3]
elemdat.outdata[1,:] = elemdat.fint[3:6]

19
Code for formulating Timoshenko Beam Element

elemdat.stiff = stiff

#------------------------------------------------------------------------------

def getInternalForce ( self, elemdat ):


"""Calculates the internal force in the global coordinates"""

# Calculates the internal stresses(t) and transformation matrices(S and R)


R,S,t,lc,lo,psi = self.getMemberData( elemdat )
elemdat.fint = dot( R,dot(S,t) )

#------------------------------------------------------------------------------

def getMemberData(self,elemdat ):
"""The objective of this section is to include updated data about
each member in the beam."""
# Initial angle made by the beam member
# beta0 = atan( y2-y1 / x2-x1 )
beta0 = atan2( ( elemdat.coords[1][1] - elemdat.coords[0][1] ),\
( elemdat.coords[1][0] - elemdat.coords[0][0] ) )

# Original length of beam, l0


l0 = norm( elemdat.coords[1,0:2]-elemdat.coords[0,0:2] )

# Calculate X and Y distances between nodes 1 and 2 wrt fixed frame


dX = elemdat.coords[1][0] + elemdat.state[3] - \
( elemdat.coords[0][0] + elemdat.state[0] )
dY = elemdat.coords[1][1] + elemdat.state[4] - \
( elemdat.coords[0][1] + elemdat.state[1] )

# The angle made by beam member for the current time step with the
# fixed frame of reference.
beta1 = elemdat.state[2] + beta0
beta2 = elemdat.state[5] + beta0

# Member i angle wrt the global frame of reference


beta = atan2( dY,dX )

# Calculate current length of member i


lc = sqrt( dX**2. + dY**2. )

# Deformation modes v for member i


# Extension mode
ul = ( lc**2 - l0**2 )/( lc + l0 )
# Symmetric bending mode
phi_s = beta2 - beta1
# Anti-symmetric bending mode
phi_a = beta2 + beta1 - 2*( beta - beta0 )
# phi should lie between only [-pi,pi)
if phi_a < -1*pi:

20
Code for formulating Timoshenko Beam Element

phi_a = phi_a + 2.*pi


elif phi_a >= pi:
phi_a = phi_a - 2.*pi

# Internal stresses, {N,Ms,Ma} in corotational frame of reference


# Axial force
Nf = self.EA*ul/lc
# Symmetric moment
Ms = self.EI*phi_s/lc
# Anti-symmetruc moment
psi = 12*self.EI/( (lc**2)*self.GA )
# psi = 1.
Ma = 3.0*psi*phi_a*self.EI/lc

t = array( [Nf,Ms,Ma] )

# Rotation from the corotated frame to global space


rot_matrix = array( [ [cos(beta),-sin(beta),0.,0.,0.,0.],
[sin(beta),cos(beta),0.,0.,0.,0.],
[0.,0.,1.,0.,0.,0.],
[0.,0.,0.,cos(beta),-sin(beta),0.],
[0.,0.,0.,sin(beta),cos(beta),0.],
[0.,0.,0.,0.,0.,1.] ] )

# Transformation matrix to get full set of generalized forces


S = array( [ [-1.,0.,0.],
[0.,0.,2./lc],
[0.,-1.,1.],
[1.,0.,0.],
[0.,0.,-2./lc],
[0.,1.,1.] ] )

return rot_matrix,S,t,lc,l0,psi

#------------------------------------------------------------------------------

21

View publication stats

You might also like