OpenSees Cloud

OpenSees AMI

More Than You or Eigen Chew

Original Post - 06 Mar 2022 - Michael H. Scott

Visit Structural Analysis Is Simple on Substack.


Software does exactly what you tell it to do. But problems arise when you don’t know–or assume you know–what instructions you’re giving.

For example, many people like to use the fullGenLapack eigenvalue solver in OpenSees because it will compute all N eigenpairs (eigenvalue with corresponding eigenvector) for a model whereas the default eigenvalue solver will only compute up to N-1 eigenpairs.

Nmodes = 3 ;# Or whatever

# Default eigenvalue solver
ops.eigen(Nmodes)

# fullGenLapack eigenvalue solver
ops.eigen('fullGenLapack',Nmodes)

The default eigenvalue solver uses the ARPACK library while fullGenLapack uses the LAPACK dggev subroutine, which assumes the mass and stiffness matrices are full and non-symmetric.

The non-default eigenvalue solver is OK for small OpenSees models from textbooks and blogs (e.g., here), but as Frank described in his response to GitHub issue #804, regardless of how many modes you ask for with the eigen command, even if it’s only one mode, the fullGenLapack eigenvalue solver will compute the eigenpairs for all N modes (as stated in the dggev documentation), making this option a killer for models with more than a few hundred DOFs.

I will demonstrate the long computation times using a 3D solid model with tetrahedral elements. A material mass density of 0.00029 gives all N degrees of freedom mass. Reducing the element mesh size is an easy way to increase the number of DOFs.

For a few mesh sizes, I compute the eigenpairs of the model with the default and fullGenLapack eigenvalue solvers. First, I ask ops.eigen() for 10 modes, then I ask for N-1 modes. The model sizes are not large with N=585, 1200, and 2304.

Compute time for eigenvalue solvers

Whether you ask for 10 modes or N-1 modes, the fullGenLapack option takes essentially the same amount of time whereas the default eigenvalue solver takes relatively no time (under one second for these model sizes) to compute 10 modes and does much better than fullGenLapack for N-1 modes.

For the model with N=2304, a call to ops.eigen() with the fullGenLapack option takes over three minutes (wall time) on my half-way decent laptop. Doing some back of the envelope fitting of a cubic function to the fullGenLapack data points shown in the figure, a call to ops.eigen('fullGenLapack',...) for this model refined to N=10,000 would take about 7.5 hours on my laptop–even if I ask for only one mode. Biting off way more than I can chew…

So, never use fullGenLapack in OpenSees for anything bigger than a textbook problem.

But what should you do if you really want all N eigenpairs for something larger than a toy model, e.g., because you want to show modal damping who’s boss? You should use the default eigenvalue solver after adding a high frequency (high stiffness with low mass) SDF appendage to your model. The appendage gives you N+1 modes, then you can call the default eigenvalue solver to give you the N modes you care about. Just be sure to attach the SDF appendage to a fixed DOF so that there is no interference, or coupling, with your actual model.