OpenSees Cloud
OpenSees AMI
Don't Try This at Home
Original Post - 21 Feb 2021 - Michael H. Scott
Visit Structural Analysis Is Simple on Substack.
The central difference method is an explicit integrator that forms a
linear combination of the mass and damping matrices to advance the
solution to the next time step. So, if the mass matrix is lumped and
there’s no damping, or only mass-proportional damping, the left-hand
side matrix is diagonal. Then, you can solve the system of equations in
linear time using the diagonal solver (currently undocumented in
OpenSees, use ops.system('Diagonal')
or system Diagonal
).
But did you know that you can also use the diagonal solver for general static and dynamic analysis with implicit integrators where the stiffness matrix enters the left-hand side matrix?
You probably didn’t know you can use the diagonal solver so broadly–likely because doing so is usually a bad idea. And we rarely hear about bad ideas, only the good ones.
Before showing why the diagonal solver is a bad idea, here’s an easy example from my nonlinear structural analysis course that might lead you to believe using this solver is a good idea. It’s the same example described in this post.
Using standard Newton-Raphson with a regular equation solver, the residual and displacement increment reduce quadratically.
Now, if we switch the solver to diagonal, i.e., ignore all off-diagonal terms when solving for the displacement increments at each iteration, Newton-Raphson will converge linearly.
The diagonal solver works on a simple two DOF spring model, so it will definitely scale up to a real structural model, right? Imagine the speed up, trading extra iterations for fast equation solutions. LPU, here we come!
Unfortunately, the diagonal solver working on a real structural model is
hit or miss–mostly miss. Below is the output of using
ops.system('Diagonal')
for gravity load analysis of a multi-story
linear-elastic frame. Not only is the equilibrium iteration not
converging, it is diverging!
With any other solver in OpenSees, the gravity load analysis converges in one iteration, as expected. You can play a few tricks to get the diagonal solver to converge, but it takes so many iterations that there’s not much point in taking this idea any further.
Like many things in OpenSees, e.g., the linear algorithm, just because you can do it doesn’t mean you should. So, unless you are using central difference with mass-proportional or no damping, add the diagonal solver to the compost pile.
The convergence issues described in this post are similar to those encountered when not using a full matrix solver with modal damping.