OpenSees Cloud
OpenSees AMI
Ways to Analyze This
Original Post - 30 Nov 2025 - Michael H. Scott
Show your support at Buy Me a Coffee.
A previous post challenged readers to analyze a simple frame model subjected to static loads. The model had material nonlinearity via tension-only diagonal cables and geometric nonlinearity via the P-\(\Delta\) effects in the columns.
The Challenge
Despite these rather simple nonlinearities, analysis of the frame for the given vertical and lateral loads will fail using the default analysis options in OpenSees.
If we apply the loads in a Constant time series, the solution will not
converge.
ops.timeSeries('Constant',1)
ops.pattern('Plain',1,1)
ops.load(3,10,-500,0)
ops.load(6, 0,-500,0)
ops.analysis('Static','-noWarnings')
ops.analyze(1)
Try this analysis yourself and confirm that Newton-Raphson will bounce between two trial solutions and not converge.
The problem is the vertical loads put both of the diagonal, tension-only cable elements into compression and the lateral load is not large enough for one of the cables to get into tension. As a result, the frame becomes unstable after the first Newton iteration.
Even if you use a Linear time series and apply the loads in small
increments, you won’t get through the first pseudo-time step. Thus, the
analysis challenge.
Results
The challenge garnered five responses, all of which used non-default analysis settings.
With no identifying participant information, the reported lateral deflections at the point where the lateral load is applied are shown below.

Four out of five participants got the correct lateral deflection, 0.001270 inch. The remaining participant under-predicted the lateral deflection by about 0.00037 inch–not a lot in absolute terms, but enough to note something was off in their analysis.
In terms of reactions, although four participants computed the correct sums of horizontal and vertical reactions, only three obtained the correct distribution of reactions at the supports.
The horizontal reactions should add up to the 10 lb lateral load with 10.0127 lb to the left at node 1 and 0.0127 lb to the right at node 4. Note that the negative values in the plot indicate horizontal reaction “to the left”.

Likewise, the vertical reactions should sum to the total vertical load, 1000 lb. With a little bit of overturning, the vertical reaction is 487.89 lb at the left support and 512.11 lb at the right.

To get the correct results, you can either change the equilibrium solution algorithm or change the loading sequence.
Equilibrium Solution Algorithm
Most of the responders changed the algorithm to KrylovNewton and
easily conquered this challenge.
ops.timeSeries('Constant',1)
ops.pattern('Plain',1,1)
ops.load(3,10,-500,0)
ops.load(6, 0,-500,0)
ops.algorithm('KrylovNewton')
ops.analysis('Static','-noWarnings')
ops.analyze(1)
The analysis with KrylovNewton converges in six iterations to the
default tolerance of 1e-8 on the norm of the residual vector
(NormUnbalance). Using the same criterion, the ModifiedNewton
algorithm will converge in 34 iterations. SecantNewton, Broyden, and
BFGS will also work.
Lateral Load First, Vertical Loads Second
An alternative approach that will work with the default analysis options in OpenSees is to apply the lateral load first, then apply the vertical loads in a second analysis step. After the first analysis step, one of the diagonal members will be in tension and the frame will be stable, ready to take on vertical loads.
ops.timeSeries('Constant',1)
ops.analysis('Static','-noWarnings')
ops.pattern('Plain',1,1)
ops.load(3,10,0,0)
ops.analyze(1)
ops.pattern('Plain',2,1)
ops.load(3,0,-500,0)
ops.load(6,0,-500,0)
ops.analyze(1)
Try this two-step loading sequence yourself and verify you get the same
results as using KrylovNewton when applying all the load at once.