File: test_nsp.py

package info (click to toggle)
petsc4py 3.24.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 3,612 kB
  • sloc: python: 13,569; ansic: 1,768; makefile: 345; f90: 313; sh: 14
file content (83 lines) | stat: -rw-r--r-- 2,305 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
import unittest
from petsc4py import PETSc

# --------------------------------------------------------------------


def allclose(seq1, seq2):
    for v1, v2 in zip(seq1, seq2):
        if abs(v1 - v2) > 1e-5:
            return False
    return True


class TestNullSpace(unittest.TestCase):
    def setUp(self):
        u1 = PETSc.Vec().createSeq(3)
        u2 = PETSc.Vec().createSeq(3)
        u1[0], u1[1], u1[2] = [1, 2, 0]
        u1.normalize()
        u2[0], u2[1], u2[2] = [2, -1, 0]
        u2.normalize()
        basis = [u1, u2]
        nullsp = PETSc.NullSpace().create(False, basis, comm=PETSc.COMM_SELF)
        self.basis = basis
        self.nullsp = nullsp

    def tearDown(self):
        self.basis = None
        self.nullsp = None
        PETSc.garbage_cleanup()

    def _remove(self):
        v = PETSc.Vec().createSeq(3)
        v[0], v[1], v[2] = [7, 8, 9]
        w = v.copy()
        self.nullsp.remove(w)
        return (v, w)

    def testRemove(self):
        v, w = self._remove()
        self.assertTrue(allclose(v.array, [7, 8, 9]))
        self.assertTrue(allclose(w.array, [0, 0, 9]))
        del v, w

    def testRemoveInplace(self):
        v, w = self._remove()
        self.nullsp.remove(v)
        self.assertTrue(v.equal(w))
        del v, w

    def testRemoveWithFunction(self):
        def myremove(nsp, vec):
            vec.setArray([1, 2, 3])

        self.nullsp.setFunction(myremove)
        v, w = self._remove()
        self.assertTrue(allclose(v.array, [7, 8, 9]))
        self.assertTrue(allclose(w.array, [1, 2, 3]))
        self.nullsp.remove(v)
        self.assertTrue(allclose(v.array, [1, 2, 3]))
        self.nullsp.setFunction(None)
        self.testRemove()

    def testGetSetFunction(self):
        def rem(nsp, vec):
            vec.set(0)

        self.nullsp.setFunction(rem)
        dct = self.nullsp.getDict()
        self.assertTrue(dct is not None)
        fun, a, kw = dct['__function__']
        self.assertTrue(fun is rem)
        self.nullsp.setFunction(None)
        fun = dct.get('__function__')
        self.assertTrue(fun is None)


# --------------------------------------------------------------------

if __name__ == '__main__':
    unittest.main()

# --------------------------------------------------------------------