Elastic Shear Beams in OpenSees

Shear deformations in slender beams are generally not significant compared to flexural deformations. But shear deformation are important in deep beams and short walls, and flexure-shear interaction may be important in the material nonlinear range of response, regardless of aspect ratio.

Enough of the perfunctory, non-committal language–you can find that in the latest issue of <insert journal name>.

Instead, this post will show how to model linear-elastic shear beam response in OpenSees. The simplicity of this post rivals that of a previous post. In a future post, I will discuss material nonlinear flexure-shear response.

OpenSees has three options for shear deformable elastic beams: an elastic formulation and two material nonlinear formulations (displacement-based and force-based). These three options will be shown for a simple W21x62 steel beam.

The exact solution for the rotation at the loaded end is \theta=ML/(3EI)+M/(LGA_v), where A_v is the section shear area. For the given numerical values, the end rotation is 0.0046229 rad with shear deformation and 0.0037335 rad without.

First, similar to elasticBeamColumn, where you input material and section properties as scalars, you can use the elasticTimoshenkoBeam element. This element takes the section shear area as input in addition to axial and flexural properties (and torsional properties in 3D). As far as I can tell, this is the closest you will get to the beam element available in SAP2000.

# Steel material
E = 29000*ksi
nu = 0.3
G = 0.5*E/(1+nu)

# W21x62
A = 18.3*inch**2
I = 1330*inch**4
d = 21.0*inch
tw = 0.400*inch
Av = d*tw


An interesting feature of the OpenSees elasticTimoshenkoBeam element is that it can account for geometric nonlinearity (P-\delta, or “P-little-delta”) inside the basic system.

The next two options use elastic sections in material nonlinear element formulations. You can pass additional arguments to the standard flexure-only elastic section in order to include shear force-deformation.

# Steel material
E = 29000*ksi
nu = 0.3
G = 0.5*E/(1+nu)

# W21x62
A = 18.3*inch**2
I = 1330*inch**4
d = 21.0*inch
tw = 0.400*inch
Av = d*tw
alpha = Av/A # Or just specify alpha directly

secTag = 1

Note that the input for section shear is based on a shear shape factor, \alpha, where A_v=\alpha A.

Despite what anyone may tell you, including shear force-deformation within force-based elements is nothing new. Using force-based elements is probably the most widely known approach to modeling shear in beam-columns with OpenSees. Simply define a beam integration built on shear sections, then pass the beam integration to the element.

Np = 3


You can also use the same elastic shear sections in a timoshenkoBeamColumn element. The element formulation is the same as dispBeamColumn, but interpolates constant shear deformation along the element length in addition to constant axial deformation and linear curvature. The input format for timoshenkoBeamColumn is also identical to that for dispBeamColumn and forceBeamColumn. Note that if you use a section with shear force-deformation in dispBeamColumn, there will be no error and shear effects will be ignored.

Np = 2

# Include shear
# Shear will be ignored

According to the logs, I added the TimoshenkoBeamColumn2d class to GitHub in April 2019. However, some files on a server in Eastchester tell me I wrote this element some time before 2007. Why did it take me so long to get this element into source control? Most likely, I never used the element. Put your stuff in GitHub ASAP before you forget.

For now, there is only a 2D version of the timoshenkoBeamColumn element. When the 3D version is implemented, this formulation should replace the dispBeamColumn element so that the displacement-based and force-based formulations are on equal footing when it comes to shear.

Building on the model described in a previous post, verify you get the expected end rotation when using the elasticTimoshenkoBeam element and forceBeamColumn and timoshenkoBeamColumn elements with elastic shear sections. Also verify you get the expected flexure-only end rotation when passing the elastic shear section to a dispBeamColumn element.

6 thoughts on “Elastic Shear Beams in OpenSees

  1. Sir, elasticBeamColumn with shear shape factors is same as Sap2000’s frame element, not Timoshenko. In elasticBeamColumn with shear deformations, plane sections perpendicular to the axis do not remain perpendicular because of shear deformation. It also gives same result with http://edwilson.org/BOOK-Wilson/F-beam.pdf beam element (Wilson Frame). Also, Timoshenko beam performs poor. Please look http://edwilson.org/BOOK-Wilson/08-bend.pdf It is the frame version of PQ2 element at page 8-11. If you make 2/3 coefficient zero at 8.20 (or deltateta=0) you get Timoshenko Beam from Wilson Frame. Also his shear plate is similar to elasticBeamColumn with shear deformations. It is also same as his frame element (appendix) in terms of resulting displacements. if you set shear to zero like 8.21, you obtain Discrete Kirchhoff element which is the plate version of elasticBeamCoulmn with no shear deformation. It is the Bernoulli beam without shear deformations. By the way, in my calculations I used reduced integration version of Timoshenko Beam


  2. Dear Prof. Scott, thank you for all the information in your blog, it is very useful.
    I would like to ask you the following:
    In the opsvis example “demo_cantilever_3el_3d.py” I tried to replace the elasticBeamColumn elements with the 3D ElasticTimoshenkoBeam element just for check it, but the command opsv.plot_model() did not work for this 3D element:

    ops.element(‘ElasticTimoshenkoBeam’, 1, 1, 2, E, G, A, J, Iy, Iz, A, A, gTTagz)
    ops.element(‘ElasticTimoshenkoBeam’, 2, 2, 3, E, G, A, J, Iy, Iz, A, A, gTTagx)
    ops.element(‘ElasticTimoshenkoBeam’, 3, 3, 4, E, G, A, J, Iy, Iz, A, A, gTTagy)


    I used a shear shape factor equal to one, just for simplicity. No opsvis graphs were obtained with these modifications to the original example (maintaining unchanged the rest of the code). Instead, I got an error related to the command opsv.plot_model():
    “line 617, in _plot_model_3d
    ax.quiver(xt, yt, zt, g[0, 0], g[0, 1], g[0, 2], color=’g’,
    IndexError: index 0 is out of bounds for axis 1 with size 0”
    I appreciate your attention to this query.


Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.