SyFi 0.3
|
00001 #!/usr/bin/env python 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()