Hi all,
I'm new to OpenSees and have been working through example problems. I'm quite familiar with various commercial FEA packages (Abaqus and ANSYS).
I'm looking to perform a lifting analysis where I model an object (rigid body) that is suspended below a common point using a number of wire ropes. The purpose of the analysis is to determine the tension in each wire rope. I need to use a cable as the wire lengths will be fixed and not necessarily just the theoretical straight line distance between two nodes.
I seem to have trouble getting a static model to solve. Consider the simple 2D problem of a rigid beam suspended using two cables:
1
/ \
2_3
Support at node 1. Vertical Py load at 2 and 3. When I run the analysis using truss elements for the two diagonal components, the analysis runs fine, however when I swap to cable elements, the model gives an error:
WARNING SuperLU::solve(void)- Error 1 returned in factorization dgstrf()
WARNING NewtonRaphson::solveCurrentStep() -the LinearSysOfEqn failed in solve()
Any tips?
Cable Lifting Analysis
Moderators: silvia, selimgunay, Moderators
Re: Cable Lifting Analysis
I think I solved my own problem for now... I needed to add a X support at node 2 (or 3) to prevent rotation, seems to run now. I'll continue but leave this post for others to see.
Re: Cable Lifting Analysis
False alarm... I didn't solve it. I'm now getting a failed to converge. My code:
import openseespy.opensees as ops
import openseespy.postprocessing.Get_Rendering as opp
import math
import numpy as np
import matplotlib.pyplot as plt
# Units = m, k, s
ops.wipe()
ops.model('basic', '-ndm', 2, '-ndf', 2)
wire1_A = (0.0254 / 2)**2 * math.pi * 0.58
print('Wire Area: ', wire1_A)
wire1_E = 77000e6
wire1_rho = wire1_A * 7850.0
wire1_weight = wire1_rho * 9.806
wire1_length = 5.59
wire2_length = 6.0
wire1_alpha = 12.5e-6
wire1_temp = 0.0
wire1_error = 1e-6
wire1_NSub = 10
wire1_masstype = 0
# Load at each end of beam
Py = -50.0
# create nodes
print('Set Nodes')
ops.node(1, 0.0, 0.0)
ops.node(2, 5, 0.0)
ops.node(3, 2.5, 5.0)
# set boundary condition
print('Set Boundary Conditions')
ops.fix(1, 1, 0) # Restrain Global Rotation by Fixing X Direction of Node 1
ops.fix(3, 1, 1) # Fix Top Node
# define materials
print('Set Materials')
ops.uniaxialMaterial("Elastic", 1, wire1_E)
# define elements
print('Set Elements')
# Cable Elements
ops.element("CatenaryCable", 1, 1, 3, wire1_weight, wire1_E, wire1_A,
wire1_length, wire1_alpha, wire1_temp, wire1_rho, wire1_error, wire1_NSub,
0)
ops.element("CatenaryCable", 2, 2, 3, wire1_weight, wire1_E, wire1_A,
wire1_length, wire1_alpha, wire1_temp, wire1_rho, wire1_error, wire1_NSub,
0)
# multipoint constraint
print('Set MPC')
ops.rigidLink('beam', 1, 2)
# create TimeSeries
print('Set Time Series')
ops.timeSeries("Linear", 1)
# create a plain load pattern
print('Set Load Pattern')
ops.pattern("Plain", 1, 1)
# Create the nodal load
print('Set Loads')
ops.load(1, 0.0, Py)
ops.load(2, 0.0, Py)
ModelName = 'CableTruss'
LoadCaseName = 'Static'
opp.createODB(ModelName, LoadCaseName)
ops.test("EnergyIncr", 1.0E-10, 10000, 0)
ops.algorithm("Newton")
ops.numberer("RCM")
ops.constraints("Plain")
ops.system("SparseGeneral", "-piv")
ops.integrator('LoadControl', 1.0, 1, 1.0, 10.0)
ops.analysis("Static")
ops.analyze(10)
print('Node 1 Displacement: ', ops.nodeDisp(1))
print('Node 1 Displacement: ', ops.nodeDisp(2))
import openseespy.opensees as ops
import openseespy.postprocessing.Get_Rendering as opp
import math
import numpy as np
import matplotlib.pyplot as plt
# Units = m, k, s
ops.wipe()
ops.model('basic', '-ndm', 2, '-ndf', 2)
wire1_A = (0.0254 / 2)**2 * math.pi * 0.58
print('Wire Area: ', wire1_A)
wire1_E = 77000e6
wire1_rho = wire1_A * 7850.0
wire1_weight = wire1_rho * 9.806
wire1_length = 5.59
wire2_length = 6.0
wire1_alpha = 12.5e-6
wire1_temp = 0.0
wire1_error = 1e-6
wire1_NSub = 10
wire1_masstype = 0
# Load at each end of beam
Py = -50.0
# create nodes
print('Set Nodes')
ops.node(1, 0.0, 0.0)
ops.node(2, 5, 0.0)
ops.node(3, 2.5, 5.0)
# set boundary condition
print('Set Boundary Conditions')
ops.fix(1, 1, 0) # Restrain Global Rotation by Fixing X Direction of Node 1
ops.fix(3, 1, 1) # Fix Top Node
# define materials
print('Set Materials')
ops.uniaxialMaterial("Elastic", 1, wire1_E)
# define elements
print('Set Elements')
# Cable Elements
ops.element("CatenaryCable", 1, 1, 3, wire1_weight, wire1_E, wire1_A,
wire1_length, wire1_alpha, wire1_temp, wire1_rho, wire1_error, wire1_NSub,
0)
ops.element("CatenaryCable", 2, 2, 3, wire1_weight, wire1_E, wire1_A,
wire1_length, wire1_alpha, wire1_temp, wire1_rho, wire1_error, wire1_NSub,
0)
# multipoint constraint
print('Set MPC')
ops.rigidLink('beam', 1, 2)
# create TimeSeries
print('Set Time Series')
ops.timeSeries("Linear", 1)
# create a plain load pattern
print('Set Load Pattern')
ops.pattern("Plain", 1, 1)
# Create the nodal load
print('Set Loads')
ops.load(1, 0.0, Py)
ops.load(2, 0.0, Py)
ModelName = 'CableTruss'
LoadCaseName = 'Static'
opp.createODB(ModelName, LoadCaseName)
ops.test("EnergyIncr", 1.0E-10, 10000, 0)
ops.algorithm("Newton")
ops.numberer("RCM")
ops.constraints("Plain")
ops.system("SparseGeneral", "-piv")
ops.integrator('LoadControl', 1.0, 1, 1.0, 10.0)
ops.analysis("Static")
ops.analyze(10)
print('Node 1 Displacement: ', ops.nodeDisp(1))
print('Node 1 Displacement: ', ops.nodeDisp(2))
-
- Posts: 916
- Joined: Mon Sep 09, 2013 8:50 pm
- Location: University of California, Berkeley
Re: Cable Lifting Analysis
Could you also post your question on the OpenSeespy forum? You may get more feedback there.
Re: Cable Lifting Analysis
It's a model issue (non-convergence). Not a Tcl/Py issue, Selim