Analyzing cables subject to transverse loads is straightforward in OpenSees. Use a mesh of corotational truss elements with elastic uniaxial material. Of course, you can use any uniaxial material you like.

The only trick is you have to scramble the nodes up a little bit–if you try to analyze a perfectly straight cable, you’ll get a singular stiffness matrix.

Consider a horizontal cable subjected to its self-weight. The cable is L=20 ft long (horizontal projection) with 1 inch diameter and elastic modulus 29,000 ksi. The self-weight of the cable is w=2.705 lb/ft.

The horizontal reaction at the end of the cable should be equal to wL^{2}/(8u) where u is the maixmum deflection of the cable.

For the model, the cable nodes are defined in a loop with a slight downward sag based on the sine function.

import openseespy.opensees as ops
import numpy as np
E = 29000*kip/inch**2
d = 1*inch
A = 3.14159/4*d**2
w = 0.287*lb/inch**3*A
L = 20*ft
N = 20
dX = L/N
Y = 0
ops.wipe()
ops.model('basic','-ndm',2,'-ndf',2)
ops.uniaxialMaterial('Elastic',1,E)
ops.node(0,0,Y); ops.fix(0,1,1)
for i in range(N):
x = dX*(i+1)
ops.node(i+1,x,Y-0.01*np.sin(3.14159*x/L))
ops.element('corotTruss',i+1,i,i+1,A,1)
ops.fix(N,1,1)
ops.timeSeries('Linear',1)
ops.pattern('Plain',1,1)
for i in range(1,N):
ops.load(i,0,-w*dX)
Nsteps = 10
ops.integrator('LoadControl',1/Nsteps)
ops.system('UmfPack')
ops.test('RelativeNormDispIncr',1e-10,100,1)
ops.analysis('Static')
ops.analyze(Nsteps)
ops.reactions()
R = ops.reaction(N,1)
u = ops.nodeDisp(int(N/2),2)
print(R,w*L**2/(8*u))

You can verify that the computed reaction and the closed-form expression based on the deflection are close (1404 lb vs. 1416 lb in this example). These values should converge as more elements are used along the cable.

The deflected shape of the cable (drawn using opsvis) is shown below with a 10x scale factor.

For three-dimensional analysis, you’ll get a singular stiffness matrix if the nodes line in a plane, so you’ll have to jitter or zig-zag the nodes slightly out of plane in addition to giving an initial downward sag.

I have been involved in the development, maintenance, and growth of OpenSees since its early days. I am interested in learning Python and improving my academic writing.
View all posts by Michael H. Scott