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
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, Diego Talledo, and Véronique Le Corvec 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 right 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.
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 into 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 , 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.