OpenSees Shells by the Seashore

Other than state-of-the-art material and geometrically nonlinear frame element formulations, it’s fair to say OpenSees is not known for its breadth of structural finite elements like quads, bricks, and shells. There are solid elements for geotechnical applications and fluid elements for fluid-structure interaction via the PFEM, but what’s the story on shell elements in OpenSees?

You might be surprised to hear that ShellMITC4, a four node shell element with membrane forces and drilling degrees of freedom based on Mixed Interpolation of Tensorial Components (described here), was a relatively early addition to OpenSees. In fact, it was on my Zip disk of OpenSees source code from 2001. Although ShellMITC4 was not the only non-frame element at the time, it was definitely the only shell element.

The ShellMITC4 element was written by Ed “C++” Love, a talented mechanician who wanted to learn C++ by implementing finite elements in OpenSees. In addition to the shell element, Ed wrote a couple bricks and a couple quads, as well as the block2D and block3D meshing commands. You will find a free vibration analysis using ShellMITC4 and block2D in Example7.1.tcl of EXAMPLES/ExampleScripts, the directory of “OG” OpenSees examples.

Ed’s shell implementation was loosely coupled with the constitutive response, i.e., he wrote elastic and fiber-based SectionForceDeformation objects for the element’s constitutive response instead of constructing the element with a thickness and material properties. Unlike the frame elements that also use SectionForceDeformation objects, the section stress resultants have to be in a specific order for ShellMITC4. Not a big deal.

Although Ed’s shell element worked fine, he didn’t write it with efficiency in mind. Around 2011, Leopoldo Tesser and co-contributors modified ShellMITC4 to be more efficient. Formatting and large chunks of source code are identical to the original implementation–only Ed Love would name a helper function LovelyEig. However, Ed’s name disappeared from the ShellMITC4 source code. Pull request #187 shows it’s never too late to balance the history books.

Now there are several more shell elements in the SRC/element/shell directory. Tesser et al wrote ShellMITC9 as an extension of the four node formulation. This is the only nine node shell element in OpenSees.

Xinzheng Lu and co-contributors implemented ShellDKGT and ShellDKGQ, three node and four node, respectively, discrete Kirchhoff thin shells with drilling degrees of freedom. Lu et al also implemented geometrically nonlinear versions ShellNLDKGT and ShellNLDKGQ.

Jose Abell wrote a three node membrane and drilling shell element, ShellANDeS, based on formulations described in a series of papers (starting here) by Carlos Felippa et al. This is the only shell element in OpenSees that doesn’t use SectionForceDeformation objects. Instead the element takes the shell thickness and elastic properties in the constructor.

In the SRC/material/section directory are three section models for shell elements: ElasticMembranePlateSection, MembranePlateFiberSection (MPFS), and LayeredShellFiberSection (LSFS). The former takes elastic properties and a shell thickness while the latter two discretize the section thickness in to fibers or layers, each of which uses an NDMaterial object for its stress-strain response. To integrate stresses through the section thickness, MPFS uses five-point Gauss-Lobatto integration while LSFS uses midpoint integration over a user-specified number of layers–otherwise, MPFS and LSFS are the same.

Over in the SRC/material/nD directory you’ll find several “PlateFiber” material models divided in two categories–direct formulations and wrapper classes. The direct formulations include ElasticIsotropicPlateFiber and J2PlateFiber, which has nonlinear strain hardening. There is also a J2PlateFibre (British spelling) that uses a linear-strain hardening rule.

There are three flavors of wrapper classes. The first, PlateFiberMaterial, uses static condensation of a three-dimensional NDMaterial object to make \sigma_{33}=0, the shell fiber stress condition. The second, PlateFromPlaneStressMaterial, adds elastic shear stresses to a plane stress NDMaterial object to give the shell fiber stress condition and in doing so ignores potential interaction of in-plane stresses with out-of-plane shear stresses. The third wrapper class, PlateRebarMaterial, uses a UniaxialMaterial object and an orientation angle to represent reinforcement in shell elements. In theory, these wrapper classes should work with any material model.

All of the shell elements and constitutive models described in this post have OPS_XYZ functions, so they should be usable in both the Tcl executable and the Python module.

This post was suggested by a reader of the blog. If you would like to suggest a topic, please let me know.

7 thoughts on “OpenSees Shells by the Seashore

  1. I think one of the main reasons people are not using much of the elements in OpenSees is due to rumors that a certain element will not work or make convergence problems–certain tales that a more experienced graduate student will the new ones when they want to start using OpenSees. This can be said about the material section as well. I have not seen many people using anything except for Conc01, Conc02, and Steel02


    1. Hello stostruct,
      I agree with you. There are many reasons for this. A few I can think of off the top of my head:
      – Lack of documentation for the parameters for the advanced models (This is probably the main reason)
      – Users do not take the time to run unit tests and build confidence in the advanced models, expecting them to work right away for a complicated structure (This is an important reason too)
      – Poor programming of the advanced models, e.g., the tangent is inconsistent and users run into problems with global convergence
      – Examples posted online are outdated with respect to the current version of OpenSees
      – Contributors submit a working version of their model and don’t update when bugs are discovered

      Liked by 1 person

    2. Lack of proper documentation is definitely another reason. Not everyone is an expert in coding and can dig into the source codes to find out appropriate element/material for his projects.


  2. Great post! Thanks for sharing! Is it possible in OpenSees to directly specify the moment-curvature relationship of the plate instead of discretizing the plate into layers? What elements and sections can be used to accomplish this?

    Liked by 1 person

  3. Thanks for the clear post – really interesting part about PlateRebarMaterial.
    I think a deeper focus on results is needed, e.g. see questions here about integration:
    Online OS help is missing how to gather output forces and stresses (it seems even PlateRebarMaterial class is missing), and on OS forum board not all samples are working. That’s the eternal issue about reading code, I agree with previous comments


Leave a Reply

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

You are commenting using your 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.