Circular layers of fibers are required for simulating longitudinal reinforcing steel in circular RC columns. Although the
layer circ command accommodates fibers along an arc, I have never seen anyone use this command for anything other than a full circle.
Some years before the extent of OpenSees GitHub history, I added a default constructor to the CircReinfLayer class, making the start and end angles optional, creating a full circle of fibers. This functionality worked fine along with the original constructor that specified start and end angles.
Then, a recent post in the OpenSees Facebook group pointed out that N-1 fibers are generated when the default start and end angles, 0 and 360 degrees, respectively, are specified explicitly. Below are two fiber sections with only a circular layer of fibers. The first section uses the default start and end angles while the second section specifies 0 and 360–same as the defaults.
ops.uniaxialMaterial('Elastic',1,29000) N = 6 # Number of bars Abar = 1.0 # Bar area yc = 0; zc = 0 # Center r = 10 # Radius GJ = 1e5 # Whatever # Section 1 - default start and end angles ops.section('Fiber',1,'-GJ',GJ) # matTag,N,A,y,z,r ops.layer('circ',1,N,Abar,yc,zc,r) # Section 2 - start and end angles = 0, 360 ops.section('Fiber',2,'-GJ',GJ) # matTag,N,A,y,z,r,start,end ops.layer('circ',1,N,Abar,yc,zc,r,0,360)
Sure enough, viewing the fiber locations returned by the
'fiberData' recorder option, we see there’s a difference.
Further inspection of the fiber data reveals six fibers are generated for both sections, but section 2 places the first and last fibers at the same location.
The example scripts in the OpenSees wiki are correct, using 360/N as the start angle and 360 as the end angle. But it would be pretty easy to specify 0 and 360 for a circular layer and think nothing of it, sending years of earthquake engineering bridge research down the drain.