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.