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)
ops.patch('quadr',1,...)
# 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

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.load(2,0,P,0)
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 .

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*+2*EI*. - 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/(2*EI*)), or 2EI/3. - The mixed formulation gives a displacement that is one-half the reference displacement. The effective flexural stiffness is 2
*EI*.

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.