""" This program illustrates basic use of the SLEPc eigenvalue solver for a standard eigenvalue problem. """ # Copyright (C) 2007 Kristian B. Oelgaard # # This file is part of DOLFIN. # # DOLFIN is free software: you can redistribute it and/or modify # it under the terms of the GNU Lesser General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # DOLFIN is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License # along with DOLFIN. If not, see . # # Modified by Anders Logg, 2008. # Modified by Marie Rognes, 2009. # # First added: 2007-11-28 # Last changed: 2009-10-09 # Begin demo from dolfin import * # Test for PETSc and SLEPc if not has_linear_algebra_backend("PETSc"): print "DOLFIN has not been configured with PETSc. Exiting." exit() if not has_slepc(): print "DOLFIN has not been configured with SLEPc. Exiting." exit() # Define mesh, function space mesh = Mesh("box_with_dent.xml.gz") V = FunctionSpace(mesh, "Lagrange", 1) plot(mesh) # Define basis and bilinear form (Laplace matrix) u = TrialFunction(V) v = TestFunction(V) a = dot(grad(u), grad(v))*dx # Assemble stiffness form A = PETScMatrix() assemble(a, tensor=A) # Create eigensolver eigensolver = SLEPcEigenSolver(A) # Compute all eigenvalues of A x = \lambda x print "Computing eigenvalues. This can take a minute." eigensolver.solve() # Extract largest (first) eigenpair r, c, rx, cx = eigensolver.get_eigenpair(0) print "Largest eigenvalue: ", r # Initialize function and assign eigenvector u = Function(V) u.vector()[:] = rx # Plot eigenfunction plot(u, title="First eigenvector") # How many eigenpairs were found? print eigensolver.get_number_converged(), " converged eigenpairs" prm=eigensolver.parameters info(prm,True) # Extract another eigenpair r, c, rx, cx = eigensolver.get_eigenpair(199) print "another eigenvalue: ", r # Initialize function and assign eigenvector u = Function(V) u.vector()[:] = rx # Plot eigenfunction plot(u, title="200-th eigenvector") interactive()