OpenSees Cloud

OpenSees AMI

Fibers of Higher Dimensions

Original Post - 18 Nov 2020 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


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.

HSS round steel section

To find the torque-twist relationship for the section, we can define a 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 \(T=\tau_y J/r_o\).

Torque-twist response of tube section

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

Torque-twist response of tube section with applied bending moment

If you get this NDFiber approach to work with AwesomeConcrete, I’d be happy to hear about it.