Natural frequencies and mode shapes using SLEPcEigenSolver

Hi all, Can we find all the eigen values and eigen vectors associated with a dynamic system using a SLEPcEigenSolver. If we can’t, can we find eigen values and eigen vectors from any range of modes or particular mode number. If so, what parameters do I need to change or add.

image (48)

Please see Read before posting: How do I get my question answered?

It’s difficult to help you debug without a MWE.

Sir,This the code through which I want calculate natural frequencies and mode shapes of all the modes associated with a dynamic system.

from dolfin import *
import numpy as np
import json
import matplotlib.pyplot as plt
import scipy as sp
%matplotlib inline
mesh = Mesh()
with XDMFFile("mesh/tetra.xdmf") as infile:
    infile.read(mesh)
V = VectorFunctionSpace(mesh, 'Lagrange', degree=2)
E, nu = (71e9), (0.33) #N/m**2
rho=2820 #Kg/m**3


mu = E/2./(1+nu)
lmbda = E*nu/(1+nu)/(1-2*nu)
def eps(v):
    return sym(grad(v))
def sigma(v):
    dim = v.geometric_dimension()
    return 2.0*mu*eps(v) + lmbda*tr(eps(v))*Identity(dim)
u_ = TrialFunction(V)
du = TestFunction(V)
support = CompiledSubDomain("x[1] == -0.020")
bc = DirichletBC(V, Constant((0.,0.,0.)), support)
k_form = inner(sigma(du),eps(u_))*dx

m_form = rho*dot(du,u_)*dx
K = PETScMatrix()
assemble(k_form, tensor=K)


M = PETScMatrix()
assemble(m_form, tensor=M)

bc.zero(M)
bc.apply(K)

eigensolver = SLEPcEigenSolver(K, M)
eigensolver.parameters['problem_type'] = 'gen_hermitian'
eigensolver.parameters['spectral_transform'] = 'shift-and-invert'
eigensolver.parameters['spectral_shift'] = 0.

N_eig = 40   # number of eigenvalues
print("Computing {} first eigenvalues...".format(N_eig))
eigensolver.solve(N_eig)

# Set up file for exporting results
file_results = XDMFFile("modal_analysis.xdmf")
file_results.parameters["flush_output"] = True
file_results.parameters["functions_share_mesh"] = True

# Extraction
eig_v = []
eig_l = []
for i in range(N_eig):
    # Extract eigenpair
    r, c, rx, cx = eigensolver.get_eigenpair(i)

    # 3D eigenfrequency
    freq_3D = np.sqrt(r)/2/pi
    print("Mode {}:".format(i + 1))
    print("Solid FE: {0:8.5f} [Hz]".format(freq_3D))
    
    
    # Initialize function and assign eigenvector
    eigenmode = Function(V,name="Eigenvector "+str(i))
    eigenmode.vector()[:] = rx
    file_results.write(eigenmode, 0)
    eig_l.append(freq_3D)
    eig_v.append(eigenmode)

Hi,
use


eigensolver = SLEPcEigenSolver(K, M)
eigensolver.parameters["problem_type"] = "gen_hermitian"
eigensolver.parameters["spectral_transform"] = "shift-and-invert"
eigensolver.parameters["spectrum"] = "target magnitude"
eigensolver.parameters["spectral_shift"] = (2 * np.pi * 25) ** 2

to compute eigenvalues \omega^2 closest to a frequency of 25 Hz