OpenSees Cloud

OpenSees AMI

Verification Can Feel Dirty

21 Jul 2026 - Michael H. Scott


OpenSeesing through the SeismoStruct Verification Report (v2025), Example 12, Eigenvalue Analysis of a Three-Dimensional Frame with Rigid Floor Diaphragm, caused some headaches in what should have been a straightforward analysis.

The model is a three-dimensional, two-bay, two-story frame with rigid diapragm constraints on each floor.

The beams and girders have elastic modulus E=500,000 ksf and the following geometric properties:

The columns have elastic modulus E=350,000 ksf and the following geometric properties:

Each floor’s center of mass is offset by ΔX=3 ft and ΔY=2 ft from the center of rigidity (the interior column). A concentrated mass of 6.2112 kip-sec2/ft is defined at each center of mass using additional nodes.

#
# Define model
# Units: kip, ft, sec
#
# Nodes 1-9 at base
# Nodes 10-18 second floor
# Nodes 19-27 roof
#

m = 6.2112 # Floor mass

# Second floor center of mass and rigid diaphragm
ops.node(28, 38,27,13)
ops.mass(28, m,m,0,0,0,0)
ops.fix(28, 0,0,1,1,1,0)
ops.rigidDiaphragm(3, 28, 10,11,12,13,14,15,16,17,18)

# Roof center of mass and rigid diaphragm
ops.node(29, 38,27,26)
ops.mass(29, m,m,0,0,0,0)
ops.fix(29, 0,0,1,1,1,0)
ops.rigidDiaphragm(3, 29, 19,20,21,22,23,24,25,26,27)

The natural periods for the first four modes of vibration are listed below for the published SeismoStruct analysis and the OpenSees model I built.

Mode SeismoStruct OpenSees
1 0.2271 0.2267
2 0.2156 0.2149
3 0.0733 0.0732
4 0.0720 0.0718

Close, but not close enough to declare victory.

I first turned my attention to the rigid diaphragm constraints. Surely I made a mistake with the eccentric mass and missed some torsion or something. But swapping nodes for the center of mass and the center of rigidity as “primary” and “secondary” in the constraint command, and other permutations, did not make a difference.

I dwelled on the rigid diaphragm for a while, then took inspiration from Bono in that if I throw a rock in the air, I’ll hit someone guilty. After a few throws, I hit the elements’ torsional stiffness, GJ.

If I set GJ equal to zero in the OpenSees model (input J=0 for elasticBeamColumn elements), the exact opposite of the high torsional stiffness GJ=1e10 kip-ft2 listed in the SeismoStruct manual, the natural periods from OpenSees matched SeismoStruct exactly.

Mode SeismoStruct OpenSees
1 0.2271 0.2271
2 0.2156 0.2156
3 0.0733 0.0733
4 0.0720 0.0720

I don’t know why the SeismoStruct analysis appears to ignore element torsion. Perhaps SeismoStruct uses an internal release on torsion. Or I got the OpenSees results to match for the wrong reason. Verification can sometimes leave you with unresolved questions when you get the what, but not the why.



It was a dirty day.

U2 - Dirty Day