~chaffra/fiat/main

« back to all changes in this revision

Viewing changes to test/test.py

  • Committer: Anders Logg
  • Date: 2010-01-31 10:48:39 UTC
  • Revision ID: logg@simula.no-20100131104839-6hegvjnh57x9glhb
Add new (regression) test suite for FIAT, replacing old tests which are
failing. Also moved tests from 'testing' to 'test'. All tests for FIAT
should pass now, but the buildbot needs updating to the new test directory
before it will be happy.

The following tests are included:

            ("Lagrange", 2, 1),
            ("Lagrange", 2, 2),
            ("Lagrange", 2, 3),
            ("Lagrange", 3, 1),
            ("Lagrange", 3, 2),
            ("Lagrange", 3, 3),
            ("Discontinuous Lagrange", 2, 0),
            ("Discontinuous Lagrange", 2, 1),
            ("Discontinuous Lagrange", 2, 2),
            ("Discontinuous Lagrange", 3, 0),
            ("Discontinuous Lagrange", 3, 1),
            ("Discontinuous Lagrange", 3, 2),
            ("Brezzi-Douglas-Marini", 2, 1),
            ("Brezzi-Douglas-Marini", 2, 2),
            ("Brezzi-Douglas-Marini", 2, 3),
            ("Brezzi-Douglas-Marini", 3, 1),
            ("Brezzi-Douglas-Marini", 3, 2),
            ("Brezzi-Douglas-Marini", 3, 3),
            ("Raviart-Thomas", 2, 1),
            ("Raviart-Thomas", 2, 2),
            ("Raviart-Thomas", 2, 3),
            ("Raviart-Thomas", 3, 1),
            ("Raviart-Thomas", 3, 2),
            ("Raviart-Thomas", 3, 3),
            ("Nedelec 1st kind H(curl)", 2, 1),
            ("Nedelec 1st kind H(curl)", 2, 2),
            ("Nedelec 1st kind H(curl)", 2, 3),
            ("Nedelec 1st kind H(curl)", 3, 1),
            ("Nedelec 1st kind H(curl)", 3, 2),
            ("Nedelec 1st kind H(curl)", 3, 3),
            ("Crouzeix-Raviart", 2, 1),
            ("Crouzeix-Raviart", 3, 1)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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"
 
5
 
 
6
import sys, pickle
 
7
from FIAT import element_classes, make_quadrature, ufc_simplex
 
8
from numpy import shape, max, abs
 
9
 
 
10
# Combinations of (family, dim, degree) to test
 
11
test_cases = (("Lagrange", 2, 1),
 
12
              ("Lagrange", 2, 2),
 
13
              ("Lagrange", 2, 3),
 
14
              ("Lagrange", 3, 1),
 
15
              ("Lagrange", 3, 2),
 
16
              ("Lagrange", 3, 3),
 
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))
 
43
 
 
44
# Parameters
 
45
num_points = 3
 
46
max_derivative = 3
 
47
tolerance = 1e-14
 
48
 
 
49
def test():
 
50
    "Regression test all elements."
 
51
 
 
52
    # Try reading reference values
 
53
    try:
 
54
        reference = pickle.load(open("reference.pickle", "r"))
 
55
    except:
 
56
        reference = None
 
57
 
 
58
    # Iterate over test cases
 
59
    values = {}
 
60
    for test_case in test_cases:
 
61
 
 
62
        print "Testing", test_case
 
63
 
 
64
        # Get family, dimension and degree
 
65
        family, dim, degree = test_case
 
66
 
 
67
        # Get domain and element class
 
68
        domain = ufc_simplex(dim)
 
69
        ElementClass = element_classes[family]
 
70
 
 
71
        # Create element
 
72
        element = ElementClass(domain, degree)
 
73
 
 
74
        # Create quadrature points
 
75
        quad_rule = make_quadrature(domain, num_points)
 
76
        points = quad_rule.get_points()
 
77
 
 
78
        # Tabulate at quadrature points
 
79
        table = element.tabulate(max_derivative, points)
 
80
        values[test_case] = table
 
81
 
 
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)
 
88
                    return 1
 
89
                elif shape(table[dtuple]) != shape(reference_table[dtuple]):
 
90
                    print "*** Wrong shape in table for " + str(test_case)
 
91
                    return 1
 
92
                else:
 
93
                    diff = max(abs(table[dtuple] - reference_table[dtuple]))
 
94
                    if diff > tolerance:
 
95
                        print "*** Wrong values in table for %s, difference is %g" % (str(test_case), diff)
 
96
                        return 1
 
97
 
 
98
    # Write new values if reference is missing
 
99
    if reference is None:
 
100
        print "Storing new reference values"
 
101
        pickle.dump(values, open("reference.pickle", "w"))
 
102
 
 
103
    print
 
104
    print "Ran %d tests: OK" % len(test_cases)
 
105
 
 
106
    return 0
 
107
 
 
108
if __name__ == "__main__":
 
109
    sys.exit(test())