OpenSees Cloud
OpenSees AMI
How to Find the Neutral Axis
Original Post - 09 Nov 2022 - Michael H. Scott
Visit Structural Analysis Is Simple on Substack.
There is no recorder option in OpenSees to get the location of the neutral axis in a fiber section. Instead, you have to post-process the section deformations.
The strain at any point in a 2D fiber section is \(\varepsilon=\varepsilon_a - y\kappa_z\) where \(\varepsilon_a\) is the section axial deformation, \(\kappa_z\) is the section curvature (about the z-axis), and y is the point location, measured from the section reference axis.
The neutral axis is the location where the strain is zero. Setting \(\varepsilon=0\) gives \(y=\varepsilon_a/\kappa\).
For example, to find the neutral axis location for section 3 of element 1:
ea,kz = ops.eleResponse(1,'section',3,'deformation')
if kz != 0.0:
y = ea/kz
else:
# Pure axial
pass
For 3D sections, the strain at any point is \(\varepsilon=\varepsilon_a-y\kappa_z+z\kappa_y\), so the neutral axis is described by a line, \(y=mz+b=(\kappa_y/\kappa_z)z + \varepsilon_a/\kappa_z\) where \(\kappa_z\) is the curvature about the section z-axis and \(\kappa_y\) is the curvature about the section y-axis.
If the curvature about the z-axis is zero, then the neutral axis is at \(z=-\varepsilon_a/\kappa_y\).
For example, the neutral axis slope and y-intercept for section 5 of element 2:
ea,kz,ky,phi = ops.eleResponse(2,'section',5,'deformation')
if kz != 0.0:
b = ea/kz
m = ky/kz
elif ky != 0.0:
z = -ea/ky
else:
# Pure axial
pass
The torsional deformation phi
coming from the
3D fiber section
is not used.
I showed the section deformations coming from the eleResponse
command,
but you can do the same calculations using the columns of recorder
output. The order and number of section deformations returned by the
eleResponse
command (and output by a recorder) will vary if you use
aggregated sections,
so pay attention. If you need to know which
deformation is in which column of output,
read this post.