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