xref: /petsc/src/binding/petsc4py/test/test_nsp.py (revision 6f33641175f69f1db294cc9ba81c3f4ad4f81d49)
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