When we talk about fiber sections in OpenSees, we often refer to Bernoulli sections where each fiber is in a state of uniaxial stress. This approach captures axial-moment interaction, which is important for reinforced concrete columns, whose cross-sections are defined using patch
and layer
commands.
Those same patch
and layer
commands can be used for NDFiber
sections to simulate the interaction of axial and shear stresses in beams. Two NDMaterial
implementations have a direct formulation of the beam fiber stress condition. One is ElasticIsotropicBeamFiber
and the other is J2BeamFiber
.
E = 29000
v = 0.3
Fy = 60
alpha = 0.005
Hkin = alpha/(1-alpha)*E
ops.nDMaterial('J2BeamFiber',1,E,v,Fy,0.0,Hkin)
ops.section('NDFiber',1)
ops.patch('circ',1,...)
If you want to make axial-shear beam fibers out of other NDMaterial
implementations, you can define the regular three-dimensional (six stress-strain components), then use that material in the patches and layers of your NDFiber
section. The NDFiber
section will wrap that material with a BeamFiberMaterial
object (2D and 3D) that performs static condensation to get down to the axial-shear stress condition.
ops.ndMaterial('AwesomeConcrete',1,fc,...,beta0)
ops.section('NDFiber',1)
ops.patch('rect',1,...)
Beware that this approach with static condensation in each fiber can get pretty time consuming–AwesomeConcrete
probably has a complicated state determination to begin with, so wrapping it in a Newton loop is intense.
Returning to the more simple J2BeamFiber
, let’s do a section analysis of a hollow steel tube section.

To find the torque-twist relationship for the section, we can define zeroLengthSection
element and use displacement control on the twist DOF.
ops.node(1,0,0,0); ops.fix(1,1,1,1,1,1,1)
ops.node(2,0,0,0)
# Same parameter values as above
ops.nDMaterial('J2BeamFiber',1,E,v,Fy,0.0,Hkin)
ri = 2.25 # Inner radius
ro = 2.50 # Outer radius
ops.section('NDFiber',1)
ops.patch('circ',1,8,4,0.0,0.0,ri,ro,0.0,360.0)
ops.element('zeroLengthSection',1,1,2,1)
ops.timeSeries('Linear',1)
ops.pattern('Plain',1,1)
ops.load(2,0.0,0.0,0.0,1.0,0.0,0.0)
Nsteps = 300
dtwist = 0.03/Nsteps
ops.integrator('DisplacementControl',2,4,dtwist)
The torque-twist relationship is shown below, where the simulated results match the expected yield torque .

To show that axial-shear stress interaction is captured, let’s apply a constant bending moment of to the section while it twists. As shown below, the flexural stresses reduce the torque at which the section yields in torsion.

If you get this NDFiber
approach to work with AwesomeConcrete
, I’d be happy to hear about it.
3 thoughts on “Fibers of Higher Dimensions”