1*5808f684SSatish Balayimport unittest 2*5808f684SSatish Balayfrom petsc4py import PETSc 3*5808f684SSatish Balayimport numpy as N 4*5808f684SSatish Balayfrom sys import getrefcount 5*5808f684SSatish Balay 6*5808f684SSatish Balay# -------------------------------------------------------------------- 7*5808f684SSatish Balay 8*5808f684SSatish Balaydef allclose(seq1, seq2): 9*5808f684SSatish Balay for v1, v2 in zip(seq1, seq2): 10*5808f684SSatish Balay if abs(v1-v2) > 1e-5: 11*5808f684SSatish Balay return False 12*5808f684SSatish Balay return True 13*5808f684SSatish Balay 14*5808f684SSatish Balay 15*5808f684SSatish Balayclass TestNullSpace(unittest.TestCase): 16*5808f684SSatish Balay 17*5808f684SSatish Balay def setUp(self): 18*5808f684SSatish Balay u1 = PETSc.Vec().createSeq(3) 19*5808f684SSatish Balay u2 = PETSc.Vec().createSeq(3) 20*5808f684SSatish Balay u1[0], u1[1], u1[2] = [1, 2, 0]; u1.normalize() 21*5808f684SSatish Balay u2[0], u2[1], u2[2] = [2, -1, 0]; u2.normalize() 22*5808f684SSatish Balay basis = [u1, u2] 23*5808f684SSatish Balay nullsp = PETSc.NullSpace().create(False, basis, comm=PETSc.COMM_SELF) 24*5808f684SSatish Balay self.basis = basis 25*5808f684SSatish Balay self.nullsp = nullsp 26*5808f684SSatish Balay 27*5808f684SSatish Balay def tearDown(self): 28*5808f684SSatish Balay self.basis = None 29*5808f684SSatish Balay self.nullsp = None 30*5808f684SSatish Balay 31*5808f684SSatish Balay def _remove(self): 32*5808f684SSatish Balay v = PETSc.Vec().createSeq(3); 33*5808f684SSatish Balay v[0], v[1], v[2] = [7, 8, 9] 34*5808f684SSatish Balay w = v.copy() 35*5808f684SSatish Balay self.nullsp.remove(w) 36*5808f684SSatish Balay return (v, w) 37*5808f684SSatish Balay 38*5808f684SSatish Balay def testRemove(self): 39*5808f684SSatish Balay v, w = self._remove() 40*5808f684SSatish Balay tols = (0, 1e-5) 41*5808f684SSatish Balay self.assertTrue(allclose(v.array, [7, 8, 9])) 42*5808f684SSatish Balay self.assertTrue(allclose(w.array, [0, 0, 9])) 43*5808f684SSatish Balay del v, w 44*5808f684SSatish Balay 45*5808f684SSatish Balay def testRemoveInplace(self): 46*5808f684SSatish Balay v, w = self._remove() 47*5808f684SSatish Balay self.nullsp.remove(v) 48*5808f684SSatish Balay self.assertTrue(v.equal(w)) 49*5808f684SSatish Balay del v, w 50*5808f684SSatish Balay 51*5808f684SSatish Balay def testRemoveWithFunction(self): 52*5808f684SSatish Balay def myremove(nsp, vec): 53*5808f684SSatish Balay vec.setArray([1,2,3]) 54*5808f684SSatish Balay self.nullsp.setFunction(myremove) 55*5808f684SSatish Balay v, w = self._remove() 56*5808f684SSatish Balay self.assertTrue(allclose(v.array, [7, 8, 9])) 57*5808f684SSatish Balay self.assertTrue(allclose(w.array, [1, 2, 3])) 58*5808f684SSatish Balay self.nullsp.remove(v) 59*5808f684SSatish Balay self.assertTrue(allclose(v.array, [1, 2, 3])) 60*5808f684SSatish Balay self.nullsp.setFunction(None) 61*5808f684SSatish Balay self.testRemove() 62*5808f684SSatish Balay 63*5808f684SSatish Balay def testGetSetFunction(self): 64*5808f684SSatish Balay def rem(nsp, vec): 65*5808f684SSatish Balay vec.set(0) 66*5808f684SSatish Balay self.nullsp.setFunction(rem) 67*5808f684SSatish Balay self.assertEqual(getrefcount(rem)-1, 2) 68*5808f684SSatish Balay dct = self.nullsp.getDict() 69*5808f684SSatish Balay self.assertTrue(dct is not None) 70*5808f684SSatish Balay self.assertEqual(getrefcount(dct)-1, 2) 71*5808f684SSatish Balay fun, a, kw = dct['__function__'] 72*5808f684SSatish Balay self.assertTrue(fun is rem) 73*5808f684SSatish Balay self.nullsp.setFunction(None) 74*5808f684SSatish Balay fun = dct.get('__function__') 75*5808f684SSatish Balay self.assertEqual(getrefcount(rem)-1, 1) 76*5808f684SSatish Balay self.assertTrue(fun is None) 77*5808f684SSatish Balay 78*5808f684SSatish Balay# -------------------------------------------------------------------- 79*5808f684SSatish Balay 80*5808f684SSatish Balayif __name__ == '__main__': 81*5808f684SSatish Balay unittest.main() 82*5808f684SSatish Balay 83*5808f684SSatish Balay# -------------------------------------------------------------------- 84