00001
00002
00003 __authors__ = "Martin Sandve Alnes"
00004 __date__ = "2008-10-15 -- 2008-10-15"
00005
00006 import unittest
00007
00008 import ufl
00009 from ufl import *
00010 from ufl.algorithms import expand_compounds
00011
00012 import sfc as sfc
00013 from sfc.representation.swiginac_eval import SwiginacEvaluator
00014
00015 from sfc.symbolic_utils import symbolic_matrix, symbolic_vector
00016
00017 class MockFormRep:
00018 def __init__(self, nsd):
00019 self.rank = 0
00020 self.nsd = nsd
00021
00022 class MockVariables:
00023 def __init__(self, nsd):
00024 self.x = symbolic_vector(nsd, "x")
00025 self.Ginv_sym = symbolic_matrix(nsd, nsd, "Ginv")
00026
00027 def ufl2swiginac(expression, nsd):
00028 formrep = MockFormRep(nsd)
00029 variables = MockVariables(nsd)
00030 use_symbols = False
00031 s = SwiginacEvaluator(formrep, variables, use_symbols)
00032 return s.transform(expression)
00033
00034 class Ufl2SwiginacTest(unittest.TestCase):
00035 def __init__(self, *args, **kwargs):
00036 unittest.TestCase.__init__(self, *args, **kwargs)
00037
00038 def setUp(self):
00039 pass
00040
00041 def tearDown(self):
00042 pass
00043
00044 def testSetup(self):
00045 pass
00046
00047 def testIndexed1(self):
00048 A = as_vector((1,2,3))
00049 a = A[0] + A[1] +A[2]
00050 b = ufl2swiginac(a, 3)
00051 c = 1 + 2 + 3
00052 self.assertEqual(c, b)
00053
00054 def testIndexed2(self):
00055 A = as_matrix(((1,2),(3,4)))
00056 a = sum(A[i,j] for i in (0,1) for j in (0,1))
00057 b = ufl2swiginac(a, 2)
00058 c = 1 + 2 + 3 + 4
00059 self.assertEqual(c, b)
00060
00061 def testIndexed3(self):
00062 A = as_tensor(((1,2,3), (4,5,6), (7,8,9)))
00063 a = A[i,i]
00064 b = ufl2swiginac(a, 3)
00065 c = 1+5+9
00066 self.assertEqual(c, b)
00067
00068 def testProduct1(self):
00069 A = as_vector((1,2,3))
00070 a = A[0]*A[1]*A[2]
00071 b = ufl2swiginac(a, 3)
00072 c = 1 * 2 * 3
00073 self.assertEqual(c, b)
00074
00075 def testProduct2(self):
00076 u = as_vector((2,3,5))
00077 v = as_vector((7,11,13))
00078 a = u[i]*v[i]
00079 b = ufl2swiginac(a, 3)
00080 c = 2*7 + 3*11 + 5*13
00081 self.assertEqual(c, b)
00082
00083 def testProduct3(self):
00084 u = as_tensor(((1,2,3), (4,5,6), (7,8,9)))
00085 v = as_tensor(((4,5,6), (1,2,3), (4,5,6)))
00086 a = u[i,j]*v[i,j]
00087 b = ufl2swiginac(a, 3)
00088 c = (4+10+18)*2 + 7*4+8*5+9*6
00089 self.assertEqual(c, b)
00090
00091 def testProduct4(self):
00092 u = as_tensor(((1,2,3), (4,5,6), (7,8,9)))
00093 v = as_tensor(u[i,j], (j,i))
00094 a = inner(u, v.T)
00095 a = expand_compounds(a, 3)
00096 b = ufl2swiginac(a, 3)
00097 c = sum(ii**2 for ii in range(10))
00098 self.assertEqual(c, b)
00099
00100 def testSpatialDiff1(self):
00101 "Test a single constant dx"
00102 A = as_vector((2,3))
00103 a = A[0].dx(0)
00104 b = ufl2swiginac(a, 2)
00105 c = 0
00106 self.assertEqual(c, b)
00107
00108 def testSpatialDiff2(self):
00109 "Test a single div-type df_i/dx_i"
00110 A = as_vector((2,3))
00111 a = A[i].dx(i)
00112 b = ufl2swiginac(a, 2)
00113 c = 0
00114 self.assertEqual(c, b)
00115
00116 def testSpatialDiff3(self):
00117 "Test a double div-type df_ij/dx_ij"
00118 A = as_vector(((2,3),(4,5)))
00119 a = A[i,j].dx(j,i)
00120 b = ufl2swiginac(a, 2)
00121 c = 0
00122 self.assertEqual(c, b)
00123
00124
00125 tests = [Ufl2SwiginacTest]
00126
00127 if __name__ == "__main__":
00128 unittest.main()