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.