OpenSees Cloud

OpenSees AMI

Nonlinear Sections, Elastic Elements

Original Post - 24 Jul 2022 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


I often make seemingly minor tweaks to OpenSees–tweaks that don’t usually make it into the documentation, but that in some cases could be quite useful.

For example, did you know that you can create an elasticBeamColumn element by passing a section tag instead of directly specifying material and section properties–E, A, and Iz for 2D, plus Iy, G, and J for 3D? Basically, a corollary to passing an elastic section to a nonlinear beam-column element.

And the section doesn’t have to be elastic. In fact, the section can be fiber-discretized and the materials don’t even have to be elastic.

ops.uniaxialMaterial('Steel08',steelTag,...)
ops.uniaxialMaterial('Concrete23',concreteTag,...)

ops.section('Fiber',18)
ops.patch('rect',concreteTag,...)
ops.patch('layer',steelTag,...)

ops.geomTransf('Linear',1,0,0,1)

#                              tag I J secTag transfTag
ops.element('elasticBeamColumn',1, 1,2,  18,      1)

How does this work? In the constructor, the element assumes E=1 and G=1, then obtains the initial stiffness matrix from the section, i.e., in the sample code above, the initial stiffness integrated over the section area from the initial tangents of Steel08 and Concrete23. Values for A, Iz, Iy, and J are then extracted from the diagonal entries of the initial stiffness matrix. For this approach to work, you need the section coordinate axes to coincide with the geometric centroid of the section, in which case the initial section stiffness is

\[{\bf k}_s \left[ \begin{array}{cccc} EA & 0 & 0 & 0 \\ 0 & EI_z & 0 & 0 \\ 0 & 0 & EI_y & 0 \\ 0 & 0 & 0 & GJ \end{array} \right]\]

My best guess is I overloaded the constructor in 2009, give or take a year. But, I only recently found out (the hard way) that, because the element constructor assumes E=1 and G=1, you have to be careful if you update the parameters of elasticBeamColumn elements constructed with a section. You can easily end up with axial stiffness E2A and flexural stiffnesses E2Iz and E2Iy, if you update E to a realistic value, or super low stiffnesses if you update A, Iz, or Iy instead.

Also, if you are using this approach with an RC section, you can’t get the section stiffness based on an axial load or some cracked, transformed, effective, or whatever flexural stiffness.

Despite its limitations, this approach to creating an elasticBeamColumn could come in pretty handy for you somewhere down the road. I even updated the documentation on the wiki, OpenSeesPy, and GitHub. Make a minimal working example and convince yourself it works.