OpenSees Cloud

OpenSees AMI

Plane Sections Do Remain Plane

Original Post - 15 May 2022 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


Here’s another conversation I’ve had with a concerned user (CU) of OpenSees, not necessarily the same CU that was worried about OpenSees crashing due to non-convergence:

CU: “Do plane sections remain plane in the material nonlinear range of response?”

PD: “Yes.”

CU: “What about with force-based frame elements?”

PD: “Yes.”

CU: “How is that possible?”

PD: “Because there’s no other way to do it.”

This post isn’t about the details of how force-based elements enforce plane sections during state determination. You can read about those details here.

Instead, this post shows stress-strain output over a section in a force-based element and that the strain distribution is in fact linear.

Consider the 8 ft (96 inch) tall reinforced concrete column shown below. The model is 3D with the section z-axis oriented along the global Z-axis. Four Gauss-Lobatto points are used in a single force-based element. The concrete is unconfined with 4 ksi compressive strength while the steel is EPP with yield stress 60 ksi.

RC column

The axial load is constant at 20% of the gross axial capacity while equal lateral loads are applied in the X and Z directions. Displacement control imposes a 1 inch displacement in the Z direction at the free end of the column. The load-displacement response is shown below.

Load-displacement response of RC column

The column response passes peak capacity and goes into localization land. But what are the stress and strain profiles at the base of the column at the final step of the analysis? To plot these profiles, we can use the fiberData response option, which returns a list of coordinates, area, stress, and strain for the fibers in a section.

#                    eleTag      secNum
data = ops.eleResponse(1,'section',1,'fiberData')
Ndata = len(data)
Nfibers = int(Ndata/5)

y = data[0:Ndata:5]
z = data[1:Ndata:5]
# A = data[2:Ndata:5] # If you want fiber areas
sig = data[3:Ndata:5]
eps = data[4:Ndata:5]

The funny looking Python indices grab every fifth list entry.

The resulting strain and stress in each fiber at the base of the column are shown below.

Strain and stress profiles in column

Although the stresses in the steel and concrete fibers are out of line, the corresponding strains do line up on a plane. I hope this is enough to convince you that plane sections remain plane throughout a nonlinear analysis. You will get the same planar strain distribution using the displacement-based and mixed formulations.