Verifying Will Never Be Easy

A previous post compared the natural periods computed by OpenSees for a relatively simple one-story, one-bay, elastic frame to published ETABS results. Many easy to make modeling choices (mass distribution, rigid joint offsets, relative stiffness, etc.) led to “incorrect” periods.

The “correct” modeling choices gave periods from OpenSees that were very close to ETABS–close enough to hit “Publish” and share the post online.

ModeTheoretical (sec)ETABS (sec)OpenSees (sec)
10.13890.13890.1385
20.12540.12540.1254
30.0700.07020.06966

But something was still slightly amiss with the first and third periods, both of which exhibit torsional response. Then Bashar Hariri pointed out on LinkedIn that torsion was neglected in the elements of the ETABS model.

I sat on this one for a while because it’s not very easy to neglect torsion with a 3D beam-column element in OpenSees.

  • The elasticBeamColumn element requires torsional inputs G and J
  • The forceBeamColumn element requires at least one of its sections to have torsional stiffness GJ (so that the element can invert basic flexibility), otherwise the element uses a default torsional stiffness of GJ/L=1e10
  • The dispBeamColumn element does not need torsional stiffness to form its basic stiffness, so this element is the best bet to completely neglect torsion

An elastic section with dispBeamColumn elements should do the trick, but the elastic section requires GJ as well. Aaaccck!

Living in the force-based-element-centric world of OpenSees, I never considered not having torsion in the section when I wrote the elastic section. The force-based element needs torsion, so all frame elements must need it, right?

Fortunately, there’s a way forward that does not require modifying C++ code. Use a sectionAggregator with elastic materials assigned to the P, Mz, and My force-deformation relationships, then put these sections in dispBeamColumn elements.

# Instead of this...
#ops.section('Elastic',3,1000*E,A,Iz,Iy,1000*G,J)

# Do this...
ops.uniaxialMaterial('Elastic',5,1000*E*A)
ops.uniaxialMaterial('Elastic',6,1000*E*Iz)
ops.uniaxialMaterial('Elastic',7,1000*E*Iy)
ops.section('Aggregator',3,5,'P',6,'Mz',7,'My')

# Then use dispBeamColumn instead of forceBeamColumn

With this change applied to all elements in the model (see the original post for the full script), the OpenSees periods move closer to ETABS.

ModeTheoretical (sec)ETABS (sec)OpenSees (sec)
10.13890.13890.1389
20.12540.12540.1254
30.0700.07020.0703

Thank you, Bashar!

2 thoughts on “Verifying Will Never Be Easy

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

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