### how to run code faster

333
views
1
11 months ago by
Let me start with the code I have so far (this has been a product of a lot of help from this community so thanks in advance)

from pylab import *
from fenics import *
import dolfin
from mshr import *
import matplotlib.pyplot as plt
import sympy as sp

n = 2
#Define 3D geometry
sphere1 = Sphere(Point(0, 0, 0), 1.0)
sphere2 = Sphere(Point(0, 0, 0), 0.5)
g3d = sphere1 - sphere2
mesh = generate_mesh(g3d,10)

#plot(mesh)
#plt.show()

V = FunctionSpace(mesh,"CG", 3)
n = FacetNormal(mesh)

# Define basis and bilinear form
u = TrialFunction(V)
v = TestFunction(V)

beta=Constant(0)

m = u*v*ds

#Containers for stiffnes and mass matrices
A = PETScMatrix()
M = PETScMatrix()
#L = PETScMatrix()

#Global assembly of Stiffness and mass matrices
A = assemble(a, tensor=A)
M = assemble(m, tensor=M)
#L = assemble(l, tensor=L)

eigensolver = SLEPcEigenSolver(A,M) # create solver for Kx = lambda Mx
eigensolver.parameters['solver'] = 'lapack' # solve with LAPACK
eigensolver.parameters['spectrum']= 'smallest real'
eigensolver.parameters['tolerance'] = 1.e-15

print('computing eigenvalues')
eigensolver.solve(5)
#r,c,rv,cv = eigensolver.get_eigenpair(0,None,None)
#print r,c,rv,cv

for i in range(2):
eval = eigensolver.get_eigenvalue(i)
print eval

print "number of iterations", eigensolver.get_iteration_number()

File("sphericalshell.pvd")<<mesh
plot(mesh, interactive=True)

As the code suggests, I am trying to find the eigevanlues of the Wentzell problem. Anyways, I want to run my code with this line

mesh = generate_mesh(g3d,40)

mesh = generate_mesh(g3d,10)

However, if I use 40 instead of 10 it takes forever to complete the execution is there any way to make the execution more efficient?

Also, Can somebody tell me what that number means?, I searched  documentation for the function generate_mesh() and I didn't find anything.

The reason why I want to increase this value is because it seems that when it is bigger than 10 my eigevanlue converge to the value a I am looking for, so I just want to run some tests to see if that it is the case.

Thanks

Community: FEniCS Project
1
I believe LAPACK uses QR factorization, perhaps you can use one of SLEPc's Krylov solvers?
written 11 months ago by pf4d
2
LAPACK is a dense solver too if I recall correctly. Anything with more than 4,000 DoFs will be horrific to solve. Krylov-schur or Arnoldi iteration via SLEPc is the way to go like pf4d says. Even then, this looks like a nasty problem. At a quick glace, the FEM formulation looks Hermitian, you can make large gains in performance by telling the solver this. You also get the attractive feature that your solutions will be orthonormal with respect to the mass matrix.
written 11 months ago by Nate