xref: /petsc/src/binding/petsc4py/test/test_vec.py (revision 6f33641175f69f1db294cc9ba81c3f4ad4f81d49)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balay# --------------------------------------------------------------------
55808f684SSatish Balay
65808f684SSatish Balay
7*6f336411SStefano Zampiniclass BaseTestVec:
85808f684SSatish Balay    COMM = None
95808f684SSatish Balay    TYPE = None
105808f684SSatish Balay
115808f684SSatish Balay    def setUp(self):
125808f684SSatish Balay        v = PETSc.Vec()
135808f684SSatish Balay        v.create(self.COMM)
145808f684SSatish Balay        v.setSizes(100)
155808f684SSatish Balay        v.setType(self.TYPE)
165808f684SSatish Balay        self.vec = v
175808f684SSatish Balay
185808f684SSatish Balay    def tearDown(self):
195808f684SSatish Balay        self.vec.destroy()
205808f684SSatish Balay        self.vec = None
2162e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
225808f684SSatish Balay
235808f684SSatish Balay    def testDuplicate(self):
245808f684SSatish Balay        self.vec.set(1)
255808f684SSatish Balay        vec = self.vec.duplicate()
265808f684SSatish Balay        self.assertFalse(self.vec.equal(vec))
275808f684SSatish Balay        self.assertEqual(self.vec.sizes, vec.sizes)
285808f684SSatish Balay        del vec
295808f684SSatish Balay
305808f684SSatish Balay    def testCopy(self):
315808f684SSatish Balay        self.vec.set(1)
325808f684SSatish Balay        vec = self.vec.duplicate()
335808f684SSatish Balay        self.vec.copy(vec)
345808f684SSatish Balay        self.assertTrue(self.vec.equal(vec))
355808f684SSatish Balay        del vec
365808f684SSatish Balay
375808f684SSatish Balay    def testDot(self):
385808f684SSatish Balay        self.vec.set(1)
395808f684SSatish Balay        d = self.vec.dot(self.vec)
405808f684SSatish Balay        self.assertAlmostEqual(abs(d), self.vec.getSize())
415808f684SSatish Balay        self.vec.dotBegin(self.vec)
425808f684SSatish Balay        d = self.vec.dotEnd(self.vec)
435808f684SSatish Balay        self.assertAlmostEqual(abs(d), self.vec.getSize())
445808f684SSatish Balay
455808f684SSatish Balay    def testNorm(self):
465808f684SSatish Balay        from math import sqrt
47*6f336411SStefano Zampini
485808f684SSatish Balay        self.vec.set(1)
495808f684SSatish Balay        n1 = self.vec.norm(PETSc.NormType.NORM_1)
505808f684SSatish Balay        n2 = self.vec.norm(PETSc.NormType.NORM_2)
515808f684SSatish Balay        ni = self.vec.norm(PETSc.NormType.NORM_INFINITY)
525808f684SSatish Balay        self.assertAlmostEqual(n1, self.vec.getSize())
535808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
545808f684SSatish Balay        self.assertAlmostEqual(n2, self.vec.norm())
555808f684SSatish Balay        self.assertAlmostEqual(ni, 1.0)
565808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_1)
575808f684SSatish Balay        nn1 = self.vec.normEnd(PETSc.NormType.NORM_1)
585808f684SSatish Balay        self.assertAlmostEqual(nn1, n1)
595808f684SSatish Balay        self.vec.normBegin()
605808f684SSatish Balay        nn2 = self.vec.normEnd()
615808f684SSatish Balay        self.assertAlmostEqual(nn2, n2)
625808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_INFINITY)
635808f684SSatish Balay        nni = self.vec.normEnd(PETSc.NormType.NORM_INFINITY)
645808f684SSatish Balay        self.assertAlmostEqual(nni, ni)
655808f684SSatish Balay
665808f684SSatish Balay    def testNormalize(self):
675808f684SSatish Balay        from math import sqrt
68*6f336411SStefano Zampini
695808f684SSatish Balay        self.vec.set(1)
705808f684SSatish Balay        n2 = self.vec.normalize()
715808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
725808f684SSatish Balay        self.assertAlmostEqual(1, self.vec.norm())
735808f684SSatish Balay
745808f684SSatish Balay    def testSumMinMax(self):
755808f684SSatish Balay        self.vec.set(1)
765808f684SSatish Balay        self.assertEqual(self.vec.sum(), self.vec.getSize())
775808f684SSatish Balay        self.vec.set(-7)
785808f684SSatish Balay        self.assertEqual(self.vec.min()[1], -7)
795808f684SSatish Balay        self.vec.set(10)
805808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 10)
815808f684SSatish Balay
825808f684SSatish Balay    def testSwap(self):
835808f684SSatish Balay        v1 = self.vec
845808f684SSatish Balay        v2 = v1.duplicate()
855808f684SSatish Balay        v1.set(1)
865808f684SSatish Balay        v2.set(2)
875808f684SSatish Balay        v1.swap(v2)
885808f684SSatish Balay        idx, _ = self.vec.getOwnershipRange()
895808f684SSatish Balay        self.assertEqual(v1[idx], 2)
905808f684SSatish Balay        self.assertEqual(v2[idx], 1)
915808f684SSatish Balay
925808f684SSatish Balay    def testBsize(self):
935808f684SSatish Balay        self.vec.setBlockSize(1)
945808f684SSatish Balay        self.assertEqual(self.vec.getBlockSize(), 1)
955808f684SSatish Balay        self.vec.setBlockSize(1)
965808f684SSatish Balay
975808f684SSatish Balay    def testGetSetVals(self):
985808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
995808f684SSatish Balay        self.vec[start] = -7
1005808f684SSatish Balay        self.vec[end - 1] = -7
10160211e57SBarry Smith        self.vec.assemble()
1025808f684SSatish Balay        self.assertEqual(self.vec[start], -7)
1035808f684SSatish Balay        self.assertEqual(self.vec[end - 1], -7)
104*6f336411SStefano Zampini        for i in range(start, end):
105*6f336411SStefano Zampini            self.vec[i] = i
10660211e57SBarry Smith        self.vec.assemble()
1075808f684SSatish Balay        values = [self.vec[i] for i in range(start, end)]
1085808f684SSatish Balay        self.assertEqual(values, list(range(start, end)))
1095808f684SSatish Balay        sz = self.vec.getSize()
1105808f684SSatish Balay        self.assertEqual(self.vec.sum(), (sz - 1) / 2.0 * sz)
1115808f684SSatish Balay
1125808f684SSatish Balay    def testGetSetValsBlocked(self):
1135808f684SSatish Balay        return
1145808f684SSatish Balay        lsize, gsize = self.vec.getSizes()
1155808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
1165808f684SSatish Balay        bsizes = list(range(1, lsize + 1))
1175808f684SSatish Balay        nblocks = list(range(1, lsize + 1))
118*6f336411SStefano Zampini        compat = [
119*6f336411SStefano Zampini            (bs, nb)
120*6f336411SStefano Zampini            for bs in bsizes
121*6f336411SStefano Zampini            if not (gsize % bs or lsize % bs)
122*6f336411SStefano Zampini            for nb in nblocks
123*6f336411SStefano Zampini            if bs * nb <= lsize
124*6f336411SStefano Zampini        ]
1255808f684SSatish Balay        for bsize, nblock in compat:
1265808f684SSatish Balay            self.vec.setBlockSize(bsize)
1275808f684SSatish Balay            bindex = [start // bsize + i for i in range(nblock)]
1285808f684SSatish Balay            bvalue = [float(i) for i in range(nblock * bsize)]
1295808f684SSatish Balay            self.vec.setValuesBlocked(bindex, bvalue)
1305808f684SSatish Balay            self.vec.assemble()
1315808f684SSatish Balay            index = [start + i for i in range(nblock * bsize)]
1325808f684SSatish Balay            value = self.vec.getValues(index)
1335808f684SSatish Balay            self.assertEqual(bvalue, list(value))
1345808f684SSatish Balay
1355808f684SSatish Balay    def testGetSetArray(self):
1365808f684SSatish Balay        self.vec.set(1)
1375808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1385808f684SSatish Balay        self.assertEqual(arr0.sum(), self.vec.getLocalSize())
1395808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1405808f684SSatish Balay        self.vec.setRandom()
1415808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1425808f684SSatish Balay        self.vec.setArray(arr1)
1435808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1445808f684SSatish Balay        arr2 = self.vec.getArray().copy()
1455808f684SSatish Balay        self.assertTrue((arr1 == arr2).all())
1465808f684SSatish Balay        import numpy
147*6f336411SStefano Zampini
1485808f684SSatish Balay        refs = self.vec.getRefCount()
1495808f684SSatish Balay        arr3 = numpy.asarray(self.vec)
1505808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs + 1)
1515808f684SSatish Balay        self.assertTrue((arr1 == arr3).all())
1525808f684SSatish Balay        arr3[:] = 0
1535808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 0)
1545808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 0)
1555808f684SSatish Balay        self.assertEqual(self.vec.min()[1], 0)
1565808f684SSatish Balay        self.vec.set(1)
1575808f684SSatish Balay        self.assertAlmostEqual(abs(arr3.sum()), self.vec.getLocalSize())
1585808f684SSatish Balay        self.assertEqual(arr3.min(), 1)
1595808f684SSatish Balay        self.assertEqual(arr3.max(), 1)
1605808f684SSatish Balay        del arr3
1615808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs)
1625808f684SSatish Balay
1635808f684SSatish Balay    def testPlaceArray(self):
1645808f684SSatish Balay        self.vec.set(1)
1655808f684SSatish Balay        array = self.vec.getArray().copy()
1665808f684SSatish Balay        self.vec.placeArray(array)
1675808f684SSatish Balay        array[:] = 2
1685808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 2 * self.vec.getSize())
1695808f684SSatish Balay        self.vec.resetArray()
1705808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), self.vec.getSize())
1715808f684SSatish Balay
172df341386SStefano Zampini    def testLocalVector(self):
173df341386SStefano Zampini        rank = self.vec.getComm().Get_rank()
174df341386SStefano Zampini        self.vec.getArray()[:] = rank + 1
175df341386SStefano Zampini        ln = self.vec.getLocalSize()
176df341386SStefano Zampini        lvec = self.vec.createLocalVector()
177df341386SStefano Zampini        self.vec.getLocalVector(lvec)
178df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank + 1) * ln)
179df341386SStefano Zampini        self.vec.restoreLocalVector(lvec)
180df341386SStefano Zampini        self.vec.getLocalVector(lvec, readonly=True)
181df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank + 1) * ln)
182df341386SStefano Zampini        self.vec.restoreLocalVector(lvec, readonly=True)
183df341386SStefano Zampini        lvec.destroy()
184df341386SStefano Zampini
1855808f684SSatish Balay    def testSetOption(self):
1865808f684SSatish Balay        opt1 = PETSc.Vec.Option.IGNORE_OFF_PROC_ENTRIES
1875808f684SSatish Balay        opt2 = PETSc.Vec.Option.IGNORE_NEGATIVE_INDICES
1885808f684SSatish Balay        for opt in [opt1, opt2] * 2:
1895808f684SSatish Balay            for flag in [True, False] * 2:
1905808f684SSatish Balay                self.vec.setOption(opt, flag)
1915808f684SSatish Balay
1925808f684SSatish Balay    def testGetSetItem(self):
1935808f684SSatish Balay        v = self.vec
1945808f684SSatish Balay        w = v.duplicate()
1955808f684SSatish Balay        #
1965808f684SSatish Balay        v[...] = 7
1975808f684SSatish Balay        self.assertEqual(v.max()[1], 7)
1985808f684SSatish Balay        self.assertEqual(v.min()[1], 7)
1995808f684SSatish Balay        #
2005808f684SSatish Balay        v.setRandom()
2015808f684SSatish Balay        w[...] = v
2025808f684SSatish Balay        self.assertTrue(w.equal(v))
2035808f684SSatish Balay        #
2045808f684SSatish Balay        v.setRandom()
2055808f684SSatish Balay        w[...] = v.getArray()
2065808f684SSatish Balay        self.assertTrue(w.equal(v))
2075808f684SSatish Balay        #
2085808f684SSatish Balay        s, e = v.getOwnershipRange()
2095808f684SSatish Balay        v.setRandom()
2105808f684SSatish Balay        w[s:e] = v.getArray().copy()
21160211e57SBarry Smith        w.assemble()
2125808f684SSatish Balay        self.assertTrue(w.equal(v))
2135808f684SSatish Balay        w1, v1 = w[s], v[s]
2145808f684SSatish Balay        w2, v2 = w[e - 1], v[e - 1]
2155808f684SSatish Balay        self.assertEqual(w1, v1)
2165808f684SSatish Balay        self.assertEqual(w2, v2)
2175808f684SSatish Balay
2185808f684SSatish Balay    def testMAXPY(self):
2195808f684SSatish Balay        y = self.vec
2205808f684SSatish Balay        y.set(1)
2215808f684SSatish Balay        x = [y.copy() for _ in range(3)]
2225808f684SSatish Balay        a = [1] * len(x)
2235808f684SSatish Balay        y.maxpy(a, x)
2245808f684SSatish Balay        z = y.duplicate()
2255808f684SSatish Balay        z.set(len(x) + 1)
226*6f336411SStefano Zampini        self.assertTrue(y.equal(z))
2275808f684SSatish Balay
228dda1fc56SLisandro Dalcin    def testBinOp(self):
229dda1fc56SLisandro Dalcin        x = self.vec
230dda1fc56SLisandro Dalcin        x.set(1)
231dda1fc56SLisandro Dalcin        n = x.getSize()
232dda1fc56SLisandro Dalcin        y = 2 + 2 * x + 1 - x * 3 - 1
233dda1fc56SLisandro Dalcin        self.assertEqual(y.min()[1], 1)
234dda1fc56SLisandro Dalcin        self.assertEqual(y.max()[1], 1)
235dda1fc56SLisandro Dalcin        z = (4 * x) / (2 * y)
236dda1fc56SLisandro Dalcin        self.assertEqual(z.min()[1], 2)
237dda1fc56SLisandro Dalcin        self.assertEqual(z.max()[1], 2)
238dda1fc56SLisandro Dalcin        z = z / 2
239dda1fc56SLisandro Dalcin        self.assertEqual(z.min()[1], 1)
240dda1fc56SLisandro Dalcin        self.assertEqual(z.max()[1], 1)
241dda1fc56SLisandro Dalcin        s = (+x) @ (-y)
242dda1fc56SLisandro Dalcin        self.assertEqual(s, -n)
243dda1fc56SLisandro Dalcin        #
244dda1fc56SLisandro Dalcin        M, N = n, 2 * n
245dda1fc56SLisandro Dalcin        A = PETSc.Mat().createDense((M, N), comm=self.COMM)
246dda1fc56SLisandro Dalcin        A.setUp()
247dda1fc56SLisandro Dalcin        rs, re = A.getOwnershipRange()
248dda1fc56SLisandro Dalcin        cs, ce = A.getOwnershipRangeColumn()
249dda1fc56SLisandro Dalcin        a, b = 3, 5
250dda1fc56SLisandro Dalcin        for i in range(rs, re):
251dda1fc56SLisandro Dalcin            for j in range(N):
252dda1fc56SLisandro Dalcin                A[i, j] = a * i + b * j
253dda1fc56SLisandro Dalcin        A.assemble()
254dda1fc56SLisandro Dalcin        y = x @ A
255dda1fc56SLisandro Dalcin        self.assertEqual(y.getSize(), N)
256dda1fc56SLisandro Dalcin        for i in range(cs, ce):
257dda1fc56SLisandro Dalcin            self.assertEqual(y[i], a * M * (M - 1) / 2 + b * i * M)
258dda1fc56SLisandro Dalcin        y.set(1)
259dda1fc56SLisandro Dalcin        z = A @ y
260dda1fc56SLisandro Dalcin        self.assertEqual(z.getSize(), M)
261dda1fc56SLisandro Dalcin        for i in range(rs, re):
262dda1fc56SLisandro Dalcin            self.assertEqual(z[i], b * N * (N - 1) / 2 + a * i * N)
2635808f684SSatish Balay
264*6f336411SStefano Zampini
2655808f684SSatish Balay# --------------------------------------------------------------------
2665808f684SSatish Balay
267*6f336411SStefano Zampini
2685808f684SSatish Balayclass TestVecSeq(BaseTestVec, unittest.TestCase):
2695808f684SSatish Balay    COMM = PETSc.COMM_SELF
2705808f684SSatish Balay    TYPE = PETSc.Vec.Type.SEQ
2715808f684SSatish Balay
272*6f336411SStefano Zampini
2735808f684SSatish Balayclass TestVecMPI(BaseTestVec, unittest.TestCase):
2745808f684SSatish Balay    COMM = PETSc.COMM_WORLD
2755808f684SSatish Balay    TYPE = PETSc.Vec.Type.MPI
2765808f684SSatish Balay
277*6f336411SStefano Zampini
2785808f684SSatish Balayclass TestVecShared(BaseTestVec, unittest.TestCase):
2795808f684SSatish Balay    if PETSc.COMM_WORLD.getSize() == 1:
2805808f684SSatish Balay        TYPE = PETSc.Vec.Type.SHARED
2815808f684SSatish Balay    else:
2825808f684SSatish Balay        TYPE = PETSc.Vec.Type.MPI
2835808f684SSatish Balay    COMM = PETSc.COMM_WORLD
2845808f684SSatish Balay
285*6f336411SStefano Zampini
2865808f684SSatish Balay# class TestVecSieve(BaseTestVec, unittest.TestCase):
2875808f684SSatish Balay#    CLASS = PETSc.VecSieve
2885808f684SSatish Balay#    TARGS = ([],)
2895808f684SSatish Balay
2905808f684SSatish Balay# class TestVecGhost(BaseTestVec, unittest.TestCase):
2915808f684SSatish Balay#    CLASS = PETSc.VecGhost
2925808f684SSatish Balay#    TARGS = ([],)
2935808f684SSatish Balay
2945808f684SSatish Balay# --------------------------------------------------------------------
2955808f684SSatish Balay
2965808f684SSatish Balay
297*6f336411SStefano Zampiniclass TestVecWithArray(unittest.TestCase):
2985808f684SSatish Balay    def testCreateSeq(self):
2995808f684SSatish Balay        import numpy
300*6f336411SStefano Zampini
3015808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
3025808f684SSatish Balay
3035808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_SELF)
3045808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=5, comm=PETSc.COMM_SELF)
3055808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=3, comm=PETSc.COMM_SELF)
3065808f684SSatish Balay
3075808f684SSatish Balay        self.assertTrue(v1.size == 5)
3085808f684SSatish Balay        self.assertTrue(v2.size == 5)
3095808f684SSatish Balay        self.assertTrue(v3.size == 3)
3105808f684SSatish Balay
311*6f336411SStefano Zampini        a1 = v1.getDict()['__array__']
312*6f336411SStefano Zampini        self.assertTrue(a is a1)
313*6f336411SStefano Zampini        a2 = v2.getDict()['__array__']
314*6f336411SStefano Zampini        self.assertTrue(a is a2)
315*6f336411SStefano Zampini        a3 = v3.getDict()['__array__']
316*6f336411SStefano Zampini        self.assertTrue(a is a3)
3175808f684SSatish Balay
3185808f684SSatish Balay    def testCreateMPI(self):
3195808f684SSatish Balay        import numpy
320*6f336411SStefano Zampini
3215808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
3225808f684SSatish Balay
3235808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_WORLD)
3245808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=(5, None), comm=PETSc.COMM_WORLD)
3255808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=(3, None), comm=PETSc.COMM_WORLD)
3265808f684SSatish Balay
3275808f684SSatish Balay        self.assertTrue(v1.local_size == 5)
3285808f684SSatish Balay        self.assertTrue(v2.local_size == 5)
3295808f684SSatish Balay        self.assertTrue(v3.local_size == 3)
3305808f684SSatish Balay
331*6f336411SStefano Zampini        a1 = v1.getDict()['__array__']
332*6f336411SStefano Zampini        self.assertTrue(a is a1)
333*6f336411SStefano Zampini        a2 = v2.getDict()['__array__']
334*6f336411SStefano Zampini        self.assertTrue(a is a2)
335*6f336411SStefano Zampini        a3 = v3.getDict()['__array__']
336*6f336411SStefano Zampini        self.assertTrue(a is a3)
3375808f684SSatish Balay
3385808f684SSatish Balay    def testSetMPIGhost(self):
3395808f684SSatish Balay        import numpy
340*6f336411SStefano Zampini
3415808f684SSatish Balay        v = PETSc.Vec().create()
3425808f684SSatish Balay        v.setType(PETSc.Vec.Type.MPI)
3435808f684SSatish Balay        v.setSizes((5, None))
3445808f684SSatish Balay        ghosts = [i % v.size for i in range(v.owner_range[1], v.owner_range[1] + 3)]
3455808f684SSatish Balay        v.setMPIGhost(ghosts)
346e0aaf7daSStefano Zampini        v.setArray(numpy.array(range(*v.owner_range), dtype=PETSc.ScalarType))
3475808f684SSatish Balay        v.ghostUpdate()
3485808f684SSatish Balay        with v.localForm() as loc:
3495808f684SSatish Balay            self.assertTrue((loc[0 : v.local_size] == range(*v.owner_range)).all())
3505808f684SSatish Balay            self.assertTrue((loc[v.local_size :] == ghosts).all())
3515808f684SSatish Balay
352*6f336411SStefano Zampini
3535808f684SSatish Balay# --------------------------------------------------------------------
3545808f684SSatish Balay
3555808f684SSatish Balayif __name__ == '__main__':
3565808f684SSatish Balay    unittest.main()
3575808f684SSatish Balay
3585808f684SSatish Balay# --------------------------------------------------------------------
359