88
99cwd = 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