xref: /petsc/src/binding/petsc4py/test/test_nsp.py (revision b69d2765e9c8cde17308f61ee677dcd992b8a9cf)
15808f684SSatish Balayimport unittest
25808f684SSatish Balayfrom petsc4py import PETSc
35808f684SSatish Balay
45808f684SSatish Balay# --------------------------------------------------------------------
55808f684SSatish Balay
6*6f336411SStefano Zampini
75808f684SSatish Balaydef allclose(seq1, seq2):
85808f684SSatish Balay    for v1, v2 in zip(seq1, seq2):
95808f684SSatish Balay        if abs(v1 - v2) > 1e-5:
105808f684SSatish Balay            return False
115808f684SSatish Balay    return True
125808f684SSatish Balay
135808f684SSatish Balay
145808f684SSatish Balayclass TestNullSpace(unittest.TestCase):
155808f684SSatish Balay    def setUp(self):
165808f684SSatish Balay        u1 = PETSc.Vec().createSeq(3)
175808f684SSatish Balay        u2 = PETSc.Vec().createSeq(3)
18*6f336411SStefano Zampini        u1[0], u1[1], u1[2] = [1, 2, 0]
19*6f336411SStefano Zampini        u1.normalize()
20*6f336411SStefano Zampini        u2[0], u2[1], u2[2] = [2, -1, 0]
21*6f336411SStefano Zampini        u2.normalize()
225808f684SSatish Balay        basis = [u1, u2]
235808f684SSatish Balay        nullsp = PETSc.NullSpace().create(False, basis, comm=PETSc.COMM_SELF)
245808f684SSatish Balay        self.basis = basis
255808f684SSatish Balay        self.nullsp = nullsp
265808f684SSatish Balay
275808f684SSatish Balay    def tearDown(self):
285808f684SSatish Balay        self.basis = None
295808f684SSatish Balay        self.nullsp = None
3062e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
315808f684SSatish Balay
325808f684SSatish Balay    def _remove(self):
33*6f336411SStefano Zampini        v = PETSc.Vec().createSeq(3)
345808f684SSatish Balay        v[0], v[1], v[2] = [7, 8, 9]
355808f684SSatish Balay        w = v.copy()
365808f684SSatish Balay        self.nullsp.remove(w)
375808f684SSatish Balay        return (v, w)
385808f684SSatish Balay
395808f684SSatish Balay    def testRemove(self):
405808f684SSatish Balay        v, w = self._remove()
415808f684SSatish Balay        self.assertTrue(allclose(v.array, [7, 8, 9]))
425808f684SSatish Balay        self.assertTrue(allclose(w.array, [0, 0, 9]))
435808f684SSatish Balay        del v, w
445808f684SSatish Balay
455808f684SSatish Balay    def testRemoveInplace(self):
465808f684SSatish Balay        v, w = self._remove()
475808f684SSatish Balay        self.nullsp.remove(v)
485808f684SSatish Balay        self.assertTrue(v.equal(w))
495808f684SSatish Balay        del v, w
505808f684SSatish Balay
515808f684SSatish Balay    def testRemoveWithFunction(self):
525808f684SSatish Balay        def myremove(nsp, vec):
535808f684SSatish Balay            vec.setArray([1, 2, 3])
54*6f336411SStefano Zampini
555808f684SSatish Balay        self.nullsp.setFunction(myremove)
565808f684SSatish Balay        v, w = self._remove()
575808f684SSatish Balay        self.assertTrue(allclose(v.array, [7, 8, 9]))
585808f684SSatish Balay        self.assertTrue(allclose(w.array, [1, 2, 3]))
595808f684SSatish Balay        self.nullsp.remove(v)
605808f684SSatish Balay        self.assertTrue(allclose(v.array, [1, 2, 3]))
615808f684SSatish Balay        self.nullsp.setFunction(None)
625808f684SSatish Balay        self.testRemove()
635808f684SSatish Balay
645808f684SSatish Balay    def testGetSetFunction(self):
655808f684SSatish Balay        def rem(nsp, vec):
665808f684SSatish Balay            vec.set(0)
67*6f336411SStefano Zampini
685808f684SSatish Balay        self.nullsp.setFunction(rem)
695808f684SSatish Balay        dct = self.nullsp.getDict()
705808f684SSatish Balay        self.assertTrue(dct is not None)
715808f684SSatish Balay        fun, a, kw = dct['__function__']
725808f684SSatish Balay        self.assertTrue(fun is rem)
735808f684SSatish Balay        self.nullsp.setFunction(None)
745808f684SSatish Balay        fun = dct.get('__function__')
755808f684SSatish Balay        self.assertTrue(fun is None)
765808f684SSatish Balay
77*6f336411SStefano Zampini
785808f684SSatish Balay# --------------------------------------------------------------------
795808f684SSatish Balay
805808f684SSatish Balayif __name__ == '__main__':
815808f684SSatish Balay    unittest.main()
825808f684SSatish Balay
835808f684SSatish Balay# --------------------------------------------------------------------
84