OpenSees Cloud
OpenSees AMI
The Three Node Quad
Original Post - 20 Aug 2023 - Michael H. Scott
Show your support at Buy Me a Coffee.
Depending on your experience with finite elements, this post will either be totally obvious or it will blow your mind.
The standard bilinear, isoparametric four node quad element degenerates to a three node constant strain triangle when you assign two consecutive element nodes to the same location.

This fun fact is due to the math, not a bunch of ad-hoc if-statements in the FourNodeQuad class.
import openseespy.opensees as ops
ops.wipe()
ops.model('basic','-ndm',2,'-ndf',2)
ops.node(1,0,0); ops.fix(1,1,1)
ops.node(2,2.4,0);
ops.node(3,2.0,1.8);
ops.node(4,0,2.0); ops.fix(4,1,1)
E = 29000; nu = 0.3
ops.nDMaterial('ElasticIsotropic',5,E,nu)
t = 1.0
ops.element('quad',1, 1,2,3,3, t,'PlaneStress',5)
ops.element('quad',2, 1,1,3,4, t,'PlaneStress',5)
ops.timeSeries('Constant',1)
ops.pattern('Plain',1,1)
ops.load(3,1.0,0.5)
ops.analysis('Static')
ops.analyze(1)
print(ops.nodeDisp(3))
print(ops.eleResponse(1,'stresses'))
print(ops.eleResponse(2,'stresses'))
Run the above script, then compare the results with those obtained after
replacing the two quad elements with two triangle (tri31) elements.
ops.element('tri31',1, 1,2,3, t,'PlaneStress',5)
ops.element('tri31',2, 1,3,4, t,'PlaneStress',5)
The nodal displacement and the stresses are the same (the tri31 element
has one Gauss point while the quad has four Gauss points).
As far as I know, there’s not much use to the three node degeneration of
the quad element in OpenSees. Prior to implementation of the tri31
element, this trick could have been employed for triangulated 2D meshes,
but the state determination would have taken four times longer than
necessary and the storage of material data would have been four times
higher than necessary.
Now, if anyone out there wants an exercise, determine if the four node
shell elements degenerate to three noded formulations. Does ShellMITC4
reduce to ShellMITC3? Does ShellDKGQ reduce to ShellDKGT? Does
ShellNLDKGQ reduce to ShellNLDKGT?
Let me know what you find in the comments section below.