15808f684SSatish Balayimport unittest 25808f684SSatish Balayfrom petsc4py import PETSc 35808f684SSatish Balayfrom sys import getrefcount 45808f684SSatish Balay 55808f684SSatish Balay# -------------------------------------------------------------------- 65808f684SSatish Balay 7*6f336411SStefano Zampini 85808f684SSatish Balaydef allclose(seq1, seq2): 95808f684SSatish Balay for v1, v2 in zip(seq1, seq2): 105808f684SSatish Balay if abs(v1 - v2) > 1e-5: 115808f684SSatish Balay return False 125808f684SSatish Balay return True 135808f684SSatish Balay 145808f684SSatish Balay 155808f684SSatish Balayclass TestNullSpace(unittest.TestCase): 165808f684SSatish Balay def setUp(self): 175808f684SSatish Balay u1 = PETSc.Vec().createSeq(3) 185808f684SSatish Balay u2 = PETSc.Vec().createSeq(3) 19*6f336411SStefano Zampini u1[0], u1[1], u1[2] = [1, 2, 0] 20*6f336411SStefano Zampini u1.normalize() 21*6f336411SStefano Zampini u2[0], u2[1], u2[2] = [2, -1, 0] 22*6f336411SStefano Zampini u2.normalize() 235808f684SSatish Balay basis = [u1, u2] 245808f684SSatish Balay nullsp = PETSc.NullSpace().create(False, basis, comm=PETSc.COMM_SELF) 255808f684SSatish Balay self.basis = basis 265808f684SSatish Balay self.nullsp = nullsp 275808f684SSatish Balay 285808f684SSatish Balay def tearDown(self): 295808f684SSatish Balay self.basis = None 305808f684SSatish Balay self.nullsp = None 3162e5d2d2SJDBetteridge PETSc.garbage_cleanup() 325808f684SSatish Balay 335808f684SSatish Balay def _remove(self): 34*6f336411SStefano Zampini v = PETSc.Vec().createSeq(3) 355808f684SSatish Balay v[0], v[1], v[2] = [7, 8, 9] 365808f684SSatish Balay w = v.copy() 375808f684SSatish Balay self.nullsp.remove(w) 385808f684SSatish Balay return (v, w) 395808f684SSatish Balay 405808f684SSatish Balay def testRemove(self): 415808f684SSatish Balay v, w = self._remove() 425808f684SSatish Balay self.assertTrue(allclose(v.array, [7, 8, 9])) 435808f684SSatish Balay self.assertTrue(allclose(w.array, [0, 0, 9])) 445808f684SSatish Balay del v, w 455808f684SSatish Balay 465808f684SSatish Balay def testRemoveInplace(self): 475808f684SSatish Balay v, w = self._remove() 485808f684SSatish Balay self.nullsp.remove(v) 495808f684SSatish Balay self.assertTrue(v.equal(w)) 505808f684SSatish Balay del v, w 515808f684SSatish Balay 525808f684SSatish Balay def testRemoveWithFunction(self): 535808f684SSatish Balay def myremove(nsp, vec): 545808f684SSatish Balay vec.setArray([1, 2, 3]) 55*6f336411SStefano Zampini 565808f684SSatish Balay self.nullsp.setFunction(myremove) 575808f684SSatish Balay v, w = self._remove() 585808f684SSatish Balay self.assertTrue(allclose(v.array, [7, 8, 9])) 595808f684SSatish Balay self.assertTrue(allclose(w.array, [1, 2, 3])) 605808f684SSatish Balay self.nullsp.remove(v) 615808f684SSatish Balay self.assertTrue(allclose(v.array, [1, 2, 3])) 625808f684SSatish Balay self.nullsp.setFunction(None) 635808f684SSatish Balay self.testRemove() 645808f684SSatish Balay 655808f684SSatish Balay def testGetSetFunction(self): 665808f684SSatish Balay def rem(nsp, vec): 675808f684SSatish Balay vec.set(0) 68*6f336411SStefano Zampini 695808f684SSatish Balay self.nullsp.setFunction(rem) 705808f684SSatish Balay self.assertEqual(getrefcount(rem) - 1, 2) 715808f684SSatish Balay dct = self.nullsp.getDict() 725808f684SSatish Balay self.assertTrue(dct is not None) 735808f684SSatish Balay self.assertEqual(getrefcount(dct) - 1, 2) 745808f684SSatish Balay fun, a, kw = dct['__function__'] 755808f684SSatish Balay self.assertTrue(fun is rem) 765808f684SSatish Balay self.nullsp.setFunction(None) 775808f684SSatish Balay fun = dct.get('__function__') 785808f684SSatish Balay self.assertEqual(getrefcount(rem) - 1, 1) 795808f684SSatish Balay self.assertTrue(fun is None) 805808f684SSatish Balay 81*6f336411SStefano Zampini 825808f684SSatish Balay# -------------------------------------------------------------------- 835808f684SSatish Balay 845808f684SSatish Balayif __name__ == '__main__': 855808f684SSatish Balay unittest.main() 865808f684SSatish Balay 875808f684SSatish Balay# -------------------------------------------------------------------- 88