OpenSees Cloud

OpenSees AMI

Constraint Matrix Not Identity

Original Post - 07 Nov 2023 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


The equalDOF, rigidLink, and rigidDiaphragm commands constrain one or more nodes to move in direct proportion to the motion of another node.

In the case of the equalDOF command, the constraint is of the form us = up, where us is the displacement of the secondary node and up is the displacement of the primary node. The constraint is typically based on the initial position of the nodes. The constraint matrix that is formed internally is the identity.

However, for the rigidDiaphragm constraint, the relationship between the displacements of the primary node and the secondary nodes is based on the initial locations of the nodes within the plane of the diaphragm, e.g., us = up + X rp, where rp is the rotation of the primary node and X is the distance between the primary and secondary nodes. As a result, the constraint matrix that is formed internally is not the identity matrix. Same goes for the rigidLink -beam constraint.

The Plain constraint handler–the default constraint handler–cannot handle constraints whose constraint matrix is not the identity. So, if you do an analysis with rigid diaphragm constraints with the Plain constraint handler, you will get a warning message from OpenSees.

Consider the following simple example of a rigid diaphragm.

import openseespy.opensees as ops

ops.wipe()
ops.model('basic','-ndm',3,'-ndf',6)

L = 10
k = 200

ops.node(0,L/2,L/2,0); ops.fix(0,1,1,1,1,1,1)
ops.node(1,L/2,L/2,0); ops.fix(1,0,0,1,1,1,0)

ops.uniaxialMaterial('Elastic',1,k)

ops.element('zeroLength',1,0,1,'-mat',1,1,1,'-dir',1,2,6)

ops.node(2,L,0,0)
ops.node(3,L,L,0)
ops.node(4,0,L,0)
ops.node(5,0,0,0)

for nd in [2,3,4,5]:
    ops.fix(nd,0,0,1,1,1,0)

ops.rigidDiaphragm(3, 1, 2,3,4,5) # dir, primary, secondaries

ops.analysis('Static')

ops.analyze(1)

Running this script, you will get the following output with warning messages about the constraint matrix not being identity and, for this simple model, the analysis failing because of floating nodes with the unenforced constraints.

Constraint matrix not identity warning

The solution to this issue is to use the Transformation constraint handler, which uses the transformation method (essentially static condensation) to handle constraints.

ops.constraints('Transformation')
ops.analysis('Static')

Re-run the script and you should get no errors.