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.
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\).
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.
If you get this NDFiber approach to work with AwesomeConcrete, I’d be happy to hear about it.