Eigenvalues During an Analysis

How to compute the eigenvalues (natural periods) of a structural model during an analysis, as the stiffness changes due to yielding, unloading, reloading, large displacement, etc., is a common question. In general, periods elongate during yielding events, then shorten again upon unloading. The extent and duration of period change depends on the constitutive models and loading.

Model behavior aside, the idea is quite simple. Perform your analysis in a loop and call the eigen() command inside the loop. Then do what you need to do with the eigenvalues–either record them for plotting or update your loading in an adaptive analysis.

import openseespy.opensees as ops

#
# Build your model, perform gravity load analysis
#

Nmodes = 4 # Or whatever for your purposes
Tf = 40
dt = 0.01
Nsteps = int(Tf/dt)

for i in range(Nsteps):
    ok = ops.analyze(1,dt)
    if ok < 0:
        break
    w2 = ops.eigen(Nmodes)
    #
    # Do what you want with w2
    #

OpenSees will assemble the current tangent stiffness into the eigenvalue solver each time eigen() is called. However, this can be a heavy computational burden for large models. And do you really need to see the change in eigenvalues at every time step?

Following the advice of Dr. Silvia Mazzoni, it’s better to call eigen() periodically, e.g., every 10 time steps, instead of at every step. In general, you can use an extra variable in your script along with the modulo, or remainder, operator (%).

# Same as above

NstepsEigen = 10 # Or whatever
for i in range(Nsteps):
    ok = ops.analyze(1,dt)
    if ok < 0:
        break
    if i % NstepsEigen == 0:
        w2 = ops.eigen(Nmodes)
        #
        # Do what you want with w2
        #

This procedure will also work in a static pushover analysis, just be sure to define mass.

2 thoughts on “Eigenvalues During an Analysis

  1. An interesting application would be to study the stability of the system over time as the eigenvalues impart some of that data (negative vs positive real parts!)

    I’ve always wonder what’s the best way of outputting data like this ~ in terms of storing the eigen values within a np.array or outputting it to .txt file. I know you’re leaving it up to the reader, but need this expert opinion for other applications too haha.

    Liked by 1 person

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.