Distributed Mass Beam Vibration

Most beam-column elements in OpenSees take mass density, \rho (mass per unit length), as an input. The elements then return lumped mass \rho L/2 for the translational DOFs at the element ends.

The elasticBeamColumn element can also return a consistent mass matrix with the -cMass input option.

ops.element('elasticBeamColumn',tag,...,'-mass',rho,'-cMass')

The dispBeamColumn and forceBeamColumn elements take the -cMass option as well, but the consistent mass is based on element-level mass density when the mass should be integrated from section mass density and shape functions. That’s a subject for another day, so this post will focus on the elasticBeamColumn element.

Consider a simply-supported steel pipe. The fundamental frequency (Hz) considering distributed mass density is \pi/(2L^2) \sqrt{EI/\rho}.

For the analysis I’m going to show, you can choose whatever \rho, E, I, and L you want, but I used a pipe to make the example somewhat realistic.

Discretizing the pipe into multiple elements, the fundamental frequency of the model should converge to the exact solution as the number of elements increases and the discrete masses approach distributed mass. Furthermore, using consistent element mass should give a better approximation than lumped element mass.

Both element mass formulations (lumped and consistent) give very good approximations (within 1%) for two elements and converge to the exact solution as more elements are used. Note that for one element, there are no dynamic DOFs with lumped mass. And with one element, the consistent mass approach gives a ratio of computed to exact frequency of 1.11.

Now, let’s change the boundary conditions on the pipe from simple supports to cantilever. In this case, the fundamental period of vibration is (3.5156/\pi)/(2 L^2) \sqrt{EI/\rho}.

Repeating the eigenvalue analysis for increasing number of elements and comparing lumped and consistent element mass, we get the results shown below.

Although both approaches converge to the exact solution, the consistent mass approach converges more quickly. The error for the lumped mass approach reduces to less than 5% when using three or more elements.

2 thoughts on “Distributed Mass Beam Vibration

  1. Hi Prof. Scott,

    I had a question about recreating the results above for the cantilever beam. Below is the exact code I ran (I promise it’s not meant to be a debugging session) and I was able to get an exact frequency of ~12Hz for a beam with D = 10 and t = 1 with L = 100 for a steel member.

    The problem is that as the number of elements increased, the frequency continued to decrease exponentially. It seems to be converging but I think it’s reaching a natural frequency of 0Hz. Wondering if there’s any reason why as the number of elements increase, the natural frequency would become lower.

    import openseespy.opensees as ops
    from math import pi as pi
    import matplotlib.pyplot as plt

    Set Model parameters

    E = 2 * 106 # N/mm
    R_out = 5 # mm
    R_in = 4 # mm
    I = pi/4*(R_out
    4 – R_in4) # mm^4
    L = 100 #mm
    A = pi*(R_out
    2 – R_in2) # mm^2
    rho = 7.85 * 10
    -3 # g/mm^3

    Calculated Exact

    f1 = (3.5156/pi) / (2*L2) * (E*I/rho)0.5
    print(f”Exact: {freq1_exact:.3f} Hz”)
    print(“—-“)
    data = []

    Define the segments

    for num_segments in range(2,50,2):
    # Starts Analysis
    ops.wipe()
    ops.model(‘basic’,’-ndm’,2,’-ndf’,3)
    ops.node(1,0,0)
    ops.fix(1,1,1,1) # Fixes it
    ops.geomTransf(‘Linear’,1)
    for ii in range(1, num_segments+1):
    ops.node((ii + 1), L * ii/(num_segments),0);
    ops.element(‘elasticBeamColumn’, ii, ii, (ii+1), A,E,I,1,’-mass’,rho * A)

    lam = ops.eigen('standard','symmBandLapack',num_segments)
    freq = [x**0.5/(2*pi) for x in lam[0:3]]
    data.append(freq[0])
    print(f"NumSeg: {num_segments} \t F1: {freq[0]:.3f} Hz")
    

    plt.plot(data,’-o’)

    Like

Leave a comment

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