# Repeated Section Modes

If you use a section with linear-elastic response in the displacement-based, force-based, and mixed beam-column elements in OpenSees, you will get the same response from all three elements.

• True
• False
• It depends

The answer is it depends on the type of “section with elastic response” you use. Also, I wouldn’t include “It depends” as a possible answer if it wasn’t the answer.

Yes, all three elements will give the same response if you use an elastic section, fiber section with elastic stress-strain, or section aggregator with elastic force-deformation.

# Option 1
ops.section('Elastic',1,E,A,I)

# Option 2
ops.uniaxialMaterial('Elastic',1,E)
ops.section('Fiber',2)

# Option 3
ops.uniaxialMaterial('Elastic',2,E*A)
ops.uniaxialMaterial('Elastic',3,E*I)
ops.section('Aggregator',3,2,'P',3,'Mz')

But what if you used a repeated mode of section force-deformation in the section aggregator, e.g., we add another moment-curvature with a flexural stiffness twice as large as the first.

# Option 4
ops.uniaxialMaterial('Elastic',4,2*E*I)
ops.section('Aggregator',4,2,'P',3,'Mz',4,'Mz')

The section response will be linear-elastic with the following section stiffness matrix

${\bf k}_s = \left[ \begin{array}{ccc} EA & 0 & 0 \\ 0 & EI & 0 \\ 0 & 0 & 2EI \end{array} \right]$

How will the elements handle two moment-curvature relationships at each integration point? Let’s look at the computed free end displacement of a cantilever.

Two Gauss points are sufficient for each formulation.

import openseespy.opensees as ops

L = 120
E = 29000
I = 1100
A = 20
P = 50

Uref = P*L**3/(3*E*I)

for eleType in ['dispBeamColumn','forceBeamColumn','mixedBeamColumn']:

ops.wipe()
ops.model('basic','-ndm',2,'-ndf',3)

ops.node(1,0,0); ops.fix(1,1,1,1)
ops.node(2,L,0)

ops.geomTransf('Linear',1)

ops.uniaxialMaterial('Elastic',2,E*A)
ops.uniaxialMaterial('Elastic',3,E*I)
ops.uniaxialMaterial('Elastic',4,2*E*I)
ops.section('Aggregator',4,2,'P',3,'Mz',4,'Mz')

ops.beamIntegration('Legendre',1,4,2)
ops.element(eleType,1,1,2,1,1)

ops.timeSeries('Constant',1)
ops.pattern('Plain',1,1)

ops.analysis('Static')
ops.analyze(1)

U = ops.nodeDisp(2,2)

print(eleType,U,Uref)

The output below shows the elements give three different answers, compared to a reference displacement of $PL^3/(3EI)$.

From the output, we see the following:

• The displacement-based formulation gives a displacement that is exactly one-third the reference displacement. The displacement-based formulation puts the repeated modes of section response into a parallel configuration, making the effective flexural stiffness EI+2EI.
• On the other hand, displacement with the force-based formulation is one-and-a-half times the reference displacement. The force-based formulation puts the repeated modes of section response into a series configuration, leading to a flexural stiffness of 1/(1/EI+1/(2EI)), or 2EI/3.
• The mixed formulation gives a displacement that is one-half the reference displacement. The effective flexural stiffness is 2EI.

Of course, the statements “one-third”, “one-and-a-half”, and “one-half” depend on the relative values of the repeated flexural stiffness.

Both the displacement-based and force-based elements are implemented to accommodate any order of section model and the elements combine repeated modes in parallel or series, while the mixed formulation assumes the section stiffness is 2×2 (2D, 3×3 for 3D) and uses the last flexural stiffness obtained from the section. This is not at all an error in the mixed formulation–more like some complicated coding in the displacement-based and force-based formulations.

Intentionally putting repeated modes of nonlinear section response into parallel or series configurations could lead to interesting modeling capabilities. If you think of anything, I’d love to hear about it.

This site uses Akismet to reduce spam. Learn how your comment data is processed.