1
__author__ = "Anders Logg (logg@simula.no)"
2
__date__ = "2010-01-31"
3
__copyright__ = "Copyright (C) 2010 Anders Logg"
4
__license__ = "GNU LGPL version 3 or any later version"
7
from FIAT import element_classes, make_quadrature, ufc_simplex
8
from numpy import shape, max, abs
10
# Combinations of (family, dim, degree) to test
11
test_cases = (("Lagrange", 2, 1),
17
("Discontinuous Lagrange", 2, 0),
18
("Discontinuous Lagrange", 2, 1),
19
("Discontinuous Lagrange", 2, 2),
20
("Discontinuous Lagrange", 3, 0),
21
("Discontinuous Lagrange", 3, 1),
22
("Discontinuous Lagrange", 3, 2),
23
("Brezzi-Douglas-Marini", 2, 1),
24
("Brezzi-Douglas-Marini", 2, 2),
25
("Brezzi-Douglas-Marini", 2, 3),
26
("Brezzi-Douglas-Marini", 3, 1),
27
("Brezzi-Douglas-Marini", 3, 2),
28
("Brezzi-Douglas-Marini", 3, 3),
29
("Raviart-Thomas", 2, 1),
30
("Raviart-Thomas", 2, 2),
31
("Raviart-Thomas", 2, 3),
32
("Raviart-Thomas", 3, 1),
33
("Raviart-Thomas", 3, 2),
34
("Raviart-Thomas", 3, 3),
35
("Nedelec 1st kind H(curl)", 2, 1),
36
("Nedelec 1st kind H(curl)", 2, 2),
37
("Nedelec 1st kind H(curl)", 2, 3),
38
("Nedelec 1st kind H(curl)", 3, 1),
39
("Nedelec 1st kind H(curl)", 3, 2),
40
("Nedelec 1st kind H(curl)", 3, 3),
41
("Crouzeix-Raviart", 2, 1),
42
("Crouzeix-Raviart", 3, 1))
50
"Regression test all elements."
52
# Try reading reference values
54
reference = pickle.load(open("reference.pickle", "r"))
58
# Iterate over test cases
60
for test_case in test_cases:
62
print "Testing", test_case
64
# Get family, dimension and degree
65
family, dim, degree = test_case
67
# Get domain and element class
68
domain = ufc_simplex(dim)
69
ElementClass = element_classes[family]
72
element = ElementClass(domain, degree)
74
# Create quadrature points
75
quad_rule = make_quadrature(domain, num_points)
76
points = quad_rule.get_points()
78
# Tabulate at quadrature points
79
table = element.tabulate(max_derivative, points)
80
values[test_case] = table
82
# Check against reference
83
if reference is not None:
84
reference_table = reference[(family, dim, degree)]
85
for dtuple in reference_table:
86
if dtuple not in table:
87
print "*** Missing dtuple in table for " + str(test_case)
89
elif shape(table[dtuple]) != shape(reference_table[dtuple]):
90
print "*** Wrong shape in table for " + str(test_case)
93
diff = max(abs(table[dtuple] - reference_table[dtuple]))
95
print "*** Wrong values in table for %s, difference is %g" % (str(test_case), diff)
98
# Write new values if reference is missing
100
print "Storing new reference values"
101
pickle.dump(values, open("reference.pickle", "w"))
104
print "Ran %d tests: OK" % len(test_cases)
108
if __name__ == "__main__":