OpenSees Cloud
OpenSees AMI
Non-Prismatic Frame Elements
Original Post - 17 Oct 2021 - Michael H. Scott
Visit Structural Analysis Is Simple on Substack.
Long before the BeamIntegration abstraction, there was only Gauss-Lobatto integration for force-based elements, with a single section model copied to each integration point. This made it impossible to use a single element to simulate the response of an RC member with different reinforcing details along its length, or any member that was inherently non-prismatic.
While I was in graduate school, one, possibly two, Italians recognized
this limitation and talked me into allowing different section tags to be
passed to the force-based element–known as nonlinearBeamColumn
at the
time.
You can see this input option in
TclElmtBuilder.cpp,
the original file
for parsing the nonlinearBeamColumn
command. Search for -sections
and
you’ll see you can input as many section tags as there are Np
and the
tags will be mapped onto the Lobatto point locations. The command, which
should still work in OpenSees.exe, is shown below.
element nonlinearBeamColumn $tag $ndI $ndJ $Np -sections 1 2 ... 1 $transfTag
As far as I can tell, this option was never documented for the
nonlinearBeamColumn
command. Nor was the option documented for the
forceBeamColumn
command. Take a look at
TclForceBeamColumnCommand.cpp
and you’ll see the option, along with a lot of other messy coding,
carried over for backward compatibility.
For the conspiracy theorists, no, the OpenSees team was not hiding
special features from the community. The truth is the BeamIntegration
abstraction and all the ensuing
integration approaches
made the
-sections
option obsolete. For example, you can use FixedLocation
integration or one of its cousins, or one of the plastic hinge
integration methods to get different sections along the element length.
But it’s still difficult to map section tags onto the Lobatto point locations. Sure, you can use FixedLocation, but you have to know the Lobatto locations a priori. Besides x=0 and x=L, and x=L/2 for odd Np, can you recall the other Lobatto locations when Np>3? Yeah, me neither. Same mystery if you want to map section tags onto other distributed plasticity integrations such as Legendre. However, there is a workaround, but its explanation gets down in the weeds.
So, to restore the easy approach to make force-based elements non-prismatic when using Gauss-Lobatto integration, PR #683 added a second option for section input in the beamIntegration command.
# Prismatic (current option)
ops.beamIntegration('Lobatto',tag,secTag,Np)
# -or- Non-prismatic (new option)
secTagList = [1,2,...,1] # or whatever
Np = len(secTagList)
ops.beamIntegration('Lobatto',tag,Np,*secTagList)
Similar options were added for Legendre, Radau (not the HingeRadau options), NewtonCotes, Chebyshev, Trapezoidal, Simpson, and CompositeSimpson distributed plasticity. Also, because they are instances of BeamIntegration, you can use these options in other frame element formulations, not just force-based.
These new options will be available in the next release of OpenSees, which should be version 3.4.0.