### how to run code faster

140

views

1

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)

a = dot(grad(u), grad(v))*dx + beta*dot(grad(u)-dot(grad(u),n)*n, grad(v)-dot(grad(v),n)*n)*ds

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

Instead of

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

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)

a = dot(grad(u), grad(v))*dx + beta*dot(grad(u)-dot(grad(u),n)*n, grad(v)-dot(grad(v),n)*n)*ds

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)**Instead of

**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
3 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
3 months ago by
Nate

Please login to add an answer/comment or follow this question.