Skip to content

Commit 98dc139

Browse files
yianzengdham
authored andcommitted
Update test_eigensolver.py
Added docstrings, added a line to make sure compared values are sorted
1 parent 3eaee8b commit 98dc139

File tree

1 file changed

+11
-61
lines changed

1 file changed

+11
-61
lines changed

tests/regression/test_eigensolver.py

Lines changed: 11 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@
88

99
cwd = abspath(dirname(__file__))
1010

11-
12-
def poisson_1d(n, quadrilateral=False, degree=1, mesh=None):
11+
def evals(n, quadrilateral=False, degree=1, mesh=None):
12+
'''We base this test on the 1D Poisson problem with Dirichlet boundary conditions,
13+
outlined in part 1 of Daniele Boffi's 'Finite element approximation
14+
of eigenvalue problems' Acta Numerica 2010'''
1315
# Create mesh and define function space
1416
if mesh is None:
1517
mesh = IntervalMesh(n, 0, pi)
@@ -26,7 +28,6 @@ def poisson_1d(n, quadrilateral=False, degree=1, mesh=None):
2628
# Create corresponding eigensolver, looking for n eigenvalues
2729
eigensolver = LinearEigensolver(eigenprob, n)
2830
ncov = eigensolver.solve()
29-
print(ncov)
3031

3132
# boffi solns
3233
h = pi /n
@@ -38,64 +39,13 @@ def poisson_1d(n, quadrilateral=False, degree=1, mesh=None):
3839
true_values[k] = true_val
3940

4041
estimates[k] = 1/eigensolver.eigenvalue(k).real # takes real part
41-
return true_values, estimates
42-
43-
@pytest.mark.parametrize(('n', 'quadrilateral', 'degree', 'tolerance'),
44-
[(5, False, 1, 1e-14),
45-
(10, False, 1, 1e-14),
46-
(20, False, 1, 1e-14),
47-
(30, False, 1, 1e-14)])
48-
def test_poisson_eigenvalue_convergence(n, quadrilateral, degree, tolerance):
49-
true_values, estimates = poisson_1d(n, quadrilateral=quadrilateral, degree=degree)
50-
assert np.allclose(true_values, estimates, rtol=tolerance)
51-
52-
53-
# tests/regression/test_helmholtz.py
54-
55-
from os.path import abspath, dirname, join
56-
import numpy as np
57-
import pytest
58-
59-
from firedrake import *
60-
61-
cwd = abspath(dirname(__file__))
62-
63-
64-
def poisson_2d(n, quadrilateral=False, degree=1, mesh=None):
65-
# Create mesh and define function space
66-
if mesh is None:
67-
mesh = UnitSquareMesh(n, 0, pi)
68-
V = FunctionSpace(mesh, "CG", degree)
69-
# Define variational problem
70-
u = TrialFunction(V)
71-
v = TestFunction(V)
72-
a = (inner(grad(u), grad(v))) * dx
73-
74-
# Create eigenproblem with boundary conditions
75-
bc = DirichletBC(V, 0.0, "on_boundary")
76-
eigenprob = LinearEigenproblem(a, bcs=bc)
77-
78-
# Create corresponding eigensolver, looking for n eigenvalues
79-
eigensolver = LinearEigensolver(eigenprob, n)
80-
ncov = eigensolver.solve()
81-
print(ncov)
82-
83-
# boffi solns
84-
h = pi /n
85-
true_values = np.zeros(ncov-2)
86-
estimates = np.zeros(ncov-2)
87-
for k in range(ncov-2):
88-
true_val = 6 / h**2
89-
true_val *= (1-cos((k+1)*h))/(2+cos((k+1)*h)) # k+1 because we skip the trivial 0 eigenvalue
90-
true_values[k] = true_val
91-
estimates[k] = 1/eigensolver.eigenvalue(k).real # takes real part
92-
return true_values, estimates
42+
return sorted(true_values), sorted(estimates) # sort in case order of evals returned differently
9343

9444
@pytest.mark.parametrize(('n', 'quadrilateral', 'degree', 'tolerance'),
95-
[(5, False, 1, 1e-14),
96-
(10, False, 1, 1e-14),
97-
(20, False, 1, 1e-14),
98-
(30, False, 1, 1e-14)])
99-
def test_poisson_eigenvalue_convergence(n, quadrilateral, degree, tolerance):
100-
true_values, estimates = poisson_1d(n, quadrilateral=quadrilateral, degree=degree)
45+
[(5, False, 1, 1e-13),
46+
(10, False, 1, 1e-13),
47+
(20, False, 1, 1e-13),
48+
(30, False, 1, 1e-13)])
49+
def test_evals_1d(n, quadrilateral, degree, tolerance):
50+
true_values, estimates = evals(n, quadrilateral=quadrilateral, degree=degree)
10151
assert np.allclose(true_values, estimates, rtol=tolerance)

0 commit comments

Comments
 (0)