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.