3
__author__ = "Kristian B. Oelgaard (k.b.oelgaard@gmail.com)"
4
__date__ = "2010-01-06"
5
__copyright__ = "Copyright (C) 2010 Kristian B. Oelgaard"
6
__license__ = "GNU GPL version 3 or any later version"
8
# Last changed: 2010-02-01
15
from ffc.quadrature.reduce_operations import operation_count, expand_operations, reduce_operations
16
from ffc.quadrature.symbolics import *
17
from ffc.cpp import format, set_float_formatting
18
from ffc.parameters import FFC_PARAMETERS
19
set_float_formatting(FFC_PARAMETERS['precision'])
20
class TestElasticity2D(unittest.TestCase):
22
def testElasticity2D(self):
23
elasticity = """(((Jinv_00*FE0_C0_D10_ip_j + Jinv_10*FE0_C0_D01_ip_j)*2*(Jinv_00*FE0_C0_D10_ip_k + Jinv_10*FE0_C0_D01_ip_k)*2 + ((Jinv_00*FE0_C1_D10_ip_j + Jinv_10*FE0_C1_D01_ip_j) + (Jinv_01*FE0_C0_D10_ip_j + Jinv_11*FE0_C0_D01_ip_j))*((Jinv_00*FE0_C1_D10_ip_k + Jinv_10*FE0_C1_D01_ip_k) + (Jinv_01*FE0_C0_D10_ip_k + Jinv_11*FE0_C0_D01_ip_k))) + ((Jinv_01*FE0_C1_D10_ip_j + Jinv_11*FE0_C1_D01_ip_j)*2*(Jinv_01*FE0_C1_D10_ip_k + Jinv_11*FE0_C1_D01_ip_k)*2 + ((Jinv_01*FE0_C0_D10_ip_j + Jinv_11*FE0_C0_D01_ip_j) + (Jinv_00*FE0_C1_D10_ip_j + Jinv_10*FE0_C1_D01_ip_j))*((Jinv_01*FE0_C0_D10_ip_k + Jinv_11*FE0_C0_D01_ip_k) + (Jinv_00*FE0_C1_D10_ip_k + Jinv_10*FE0_C1_D01_ip_k))))*0.25*W4_ip*det"""
30
Product([Symbol("Jinv_00", GEO), Symbol("FE0_C0_D10_ip_j", BASIS)])
32
Product([Symbol("Jinv_10", GEO), Symbol("FE0_C0_D01_ip_j", BASIS)])
38
Product([Symbol("Jinv_00", GEO), Symbol("FE0_C0_D10_ip_k", BASIS)])
40
Product([Symbol("Jinv_10", GEO), Symbol("FE0_C0_D01_ip_k", BASIS)])
49
Product([Symbol("Jinv_00", GEO), Symbol("FE0_C1_D10_ip_j", BASIS)])
51
Product([Symbol("Jinv_10", GEO), Symbol("FE0_C1_D01_ip_j", BASIS)])
55
Product([Symbol("Jinv_01", GEO), Symbol("FE0_C0_D10_ip_j", BASIS)])
57
Product([Symbol("Jinv_11", GEO), Symbol("FE0_C0_D01_ip_j", BASIS)])
63
Product([Symbol("Jinv_00", GEO), Symbol("FE0_C1_D10_ip_k", BASIS)])
65
Product([Symbol("Jinv_10", GEO), Symbol("FE0_C1_D01_ip_k", BASIS)])
69
Product([Symbol("Jinv_01", GEO), Symbol("FE0_C0_D10_ip_k", BASIS)])
71
Product([Symbol("Jinv_11", GEO), Symbol("FE0_C0_D01_ip_k", BASIS)])
80
Product([Symbol("Jinv_01", GEO), Symbol("FE0_C1_D10_ip_j", BASIS)])
82
Product([Symbol("Jinv_11", GEO), Symbol("FE0_C1_D01_ip_j", BASIS)])
88
Product([Symbol("Jinv_01", GEO), Symbol("FE0_C1_D10_ip_k", BASIS)])
90
Product([Symbol("Jinv_11", GEO), Symbol("FE0_C1_D01_ip_k", BASIS)])
99
Product([Symbol("Jinv_01", GEO), Symbol("FE0_C0_D10_ip_j", BASIS)])
101
Product([Symbol("Jinv_11", GEO), Symbol("FE0_C0_D01_ip_j", BASIS)])
105
Product([Symbol("Jinv_00", GEO), Symbol("FE0_C1_D10_ip_j", BASIS)])
107
Product([Symbol("Jinv_10", GEO), Symbol("FE0_C1_D01_ip_j", BASIS)])
113
Product([Symbol("Jinv_01", GEO), Symbol("FE0_C0_D10_ip_k", BASIS)])
115
Product([Symbol("Jinv_11", GEO), Symbol("FE0_C0_D01_ip_k", BASIS)])
119
Product([Symbol("Jinv_00", GEO), Symbol("FE0_C1_D10_ip_k", BASIS)])
121
Product([Symbol("Jinv_10", GEO), Symbol("FE0_C1_D01_ip_k", BASIS)])
135
# print "\nElasticity2D"
136
# start = time.time()
137
expr_exp = expr.expand()
138
# print "Elasticity2D: time, expand(): ", time.time() - start
140
# start = time.time()
141
elasticity_exp = expand_operations(elasticity, get_format())
142
# print "Elasticity2D: time, old expand(): ", time.time() - start
144
# start = time.time()
145
expr_red = expr_exp.reduce_ops()
146
# print "Elasticity2D: time, reduce_ops(): ", time.time() - start
148
# start = time.time()
149
elasticity_red = reduce_operations(elasticity, get_format())
150
# print "Elasticity2D: time, old reduce(): ", time.time() - start
152
elasticity_exp_ops = operation_count(elasticity_exp, get_format())
153
elasticity_red_ops = operation_count(elasticity_red, get_format())
154
# print "expr.ops(): ", expr.ops()
155
# print "Elasticity2D old exp: ops: ", elasticity_exp_ops
156
# print "expr_exp.ops(): ", expr_exp.ops()
157
# print "Elasticity2D old red: ops: ", elasticity_red_ops
158
# print "expr_red.ops(): ", expr_red.ops()
160
# print "expr:\n", expr
161
# print "exp:\n", expr_exp
162
# print "red:\n", expr_red
163
# print "old red:\n", elasticity_red
165
Jinv_00, Jinv_01, Jinv_10, Jinv_11, W4_ip, det = (1.1, 1.5, -4.3, 1.7, 11, 52.3)
166
FE0_C0_D01_ip_j, FE0_C0_D10_ip_j, FE0_C0_D01_ip_k, FE0_C0_D10_ip_k = (1.12, 5.7, -9.3, 7.4)
167
FE0_C1_D01_ip_j, FE0_C1_D10_ip_j, FE0_C1_D01_ip_k, FE0_C1_D10_ip_k = (3.12, -8.1, -45.3, 17.5)
169
self.assertAlmostEqual(eval(str(expr)), eval(str(expr_exp)))
170
self.assertAlmostEqual(eval(str(expr)), eval(str(expr_red)))
171
self.assertAlmostEqual(eval(str(expr)), eval(str(elasticity)))
172
self.assertAlmostEqual(eval(str(expr)), eval(str(elasticity_exp)))
173
self.assertAlmostEqual(eval(str(expr)), eval(str(elasticity_red)))
174
self.assertEqual(expr.ops(), 52)
175
self.assertEqual(elasticity_exp_ops, 159)
176
self.assertEqual(expr_exp.ops(), 159)
177
self.assertEqual(elasticity_red_ops, 71)
178
self.assertEqual(expr_red.ops(), 71)
180
if __name__ == "__main__":
182
# Run all returned tests
183
runner = unittest.TextTestRunner()
184
runner.run(TestElasticity2D('testElasticity2D'))