OpenSees Cloud
OpenSees AMI
The Three Node Quad
Original Post - 20 Aug 2023 - Michael H. Scott
Visit Structural Analysis Is Simple on Substack.
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.