xref: /petsc/src/binding/petsc4py/test/test_vec.py (revision 62e5d2d2208a68fdbd23dac44110783534664de8)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balay# --------------------------------------------------------------------
55808f684SSatish Balay
65808f684SSatish Balayclass BaseTestVec(object):
75808f684SSatish Balay
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
21*62e5d2d2SJDBetteridge        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
475808f684SSatish Balay        self.vec.set(1)
485808f684SSatish Balay        n1 = self.vec.norm(PETSc.NormType.NORM_1)
495808f684SSatish Balay        n2 = self.vec.norm(PETSc.NormType.NORM_2)
505808f684SSatish Balay        ni = self.vec.norm(PETSc.NormType.NORM_INFINITY)
515808f684SSatish Balay        self.assertAlmostEqual(n1, self.vec.getSize())
525808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
535808f684SSatish Balay        self.assertAlmostEqual(n2, self.vec.norm())
545808f684SSatish Balay        self.assertAlmostEqual(ni, 1.0)
555808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_1)
565808f684SSatish Balay        nn1 = self.vec.normEnd(PETSc.NormType.NORM_1)
575808f684SSatish Balay        self.assertAlmostEqual(nn1, n1)
585808f684SSatish Balay        self.vec.normBegin()
595808f684SSatish Balay        nn2 = self.vec.normEnd()
605808f684SSatish Balay        self.assertAlmostEqual(nn2, n2)
615808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_INFINITY)
625808f684SSatish Balay        nni = self.vec.normEnd(PETSc.NormType.NORM_INFINITY)
635808f684SSatish Balay        self.assertAlmostEqual(nni, ni)
645808f684SSatish Balay
655808f684SSatish Balay    def testNormalize(self):
665808f684SSatish Balay        from math import sqrt
675808f684SSatish Balay        self.vec.set(1)
685808f684SSatish Balay        n2 = self.vec.normalize()
695808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
705808f684SSatish Balay        self.assertAlmostEqual(1, self.vec.norm())
715808f684SSatish Balay
725808f684SSatish Balay    def testSumMinMax(self):
735808f684SSatish Balay        self.vec.set(1)
745808f684SSatish Balay        self.assertEqual(self.vec.sum(), self.vec.getSize())
755808f684SSatish Balay        self.vec.set(-7)
765808f684SSatish Balay        self.assertEqual(self.vec.min()[1], -7)
775808f684SSatish Balay        self.vec.set(10)
785808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 10)
795808f684SSatish Balay
805808f684SSatish Balay    def testSwap(self):
815808f684SSatish Balay        v1 = self.vec
825808f684SSatish Balay        v2 = v1.duplicate()
835808f684SSatish Balay        v1.set(1)
845808f684SSatish Balay        v2.set(2)
855808f684SSatish Balay        v1.swap(v2)
865808f684SSatish Balay        idx, _ = self.vec.getOwnershipRange()
875808f684SSatish Balay        self.assertEqual(v1[idx], 2)
885808f684SSatish Balay        self.assertEqual(v2[idx], 1)
895808f684SSatish Balay
905808f684SSatish Balay    def testBsize(self):
915808f684SSatish Balay        self.vec.setBlockSize(1)
925808f684SSatish Balay        self.assertEqual(self.vec.getBlockSize(), 1)
935808f684SSatish Balay        self.vec.setBlockSize(1)
945808f684SSatish Balay
955808f684SSatish Balay    def testGetSetVals(self):
965808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
975808f684SSatish Balay        self.vec[start] = -7
985808f684SSatish Balay        self.vec[end-1]   = -7
995808f684SSatish Balay        self.assertEqual(self.vec[start], -7)
1005808f684SSatish Balay        self.assertEqual(self.vec[end-1], -7)
1015808f684SSatish Balay        for i in range(start, end): self.vec[i] = i
1025808f684SSatish Balay        values = [self.vec[i] for i in range(start, end)]
1035808f684SSatish Balay        self.assertEqual(values, list(range(start, end)))
1045808f684SSatish Balay        sz = self.vec.getSize()
1055808f684SSatish Balay        self.assertEqual(self.vec.sum(), (sz-1)/2.0*sz)
1065808f684SSatish Balay
1075808f684SSatish Balay    def testGetSetValsBlocked(self):
1085808f684SSatish Balay        return
1095808f684SSatish Balay        lsize, gsize = self.vec.getSizes()
1105808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
1115808f684SSatish Balay        bsizes  = list(range(1, lsize+1))
1125808f684SSatish Balay        nblocks = list(range(1, lsize+1))
1135808f684SSatish Balay        compat = [(bs, nb)
1145808f684SSatish Balay                  for bs in bsizes  if not (gsize%bs or lsize % bs)
1155808f684SSatish Balay                  for nb in nblocks if bs*nb <= lsize]
1165808f684SSatish Balay        for bsize, nblock in compat:
1175808f684SSatish Balay            self.vec.setBlockSize(bsize)
1185808f684SSatish Balay            bindex = [start//bsize+i  for i in range(nblock)]
1195808f684SSatish Balay            bvalue = [float(i) for i in range(nblock*bsize)]
1205808f684SSatish Balay            self.vec.setValuesBlocked(bindex, bvalue)
1215808f684SSatish Balay            self.vec.assemble()
1225808f684SSatish Balay            index = [start+i for i in range(nblock*bsize)]
1235808f684SSatish Balay            value = self.vec.getValues(index)
1245808f684SSatish Balay            self.assertEqual(bvalue, list(value))
1255808f684SSatish Balay
1265808f684SSatish Balay    def testGetSetArray(self):
1275808f684SSatish Balay        self.vec.set(1)
1285808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1295808f684SSatish Balay        self.assertEqual(arr0.sum(), self.vec.getLocalSize())
1305808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1315808f684SSatish Balay        self.vec.setRandom()
1325808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1335808f684SSatish Balay        self.vec.setArray(arr1)
1345808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1355808f684SSatish Balay        arr2 = self.vec.getArray().copy()
1365808f684SSatish Balay        self.assertTrue((arr1 == arr2).all())
1375808f684SSatish Balay        import numpy
1385808f684SSatish Balay        refs = self.vec.getRefCount()
1395808f684SSatish Balay        arr3 = numpy.asarray(self.vec)
1405808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs+1)
1415808f684SSatish Balay        self.assertTrue((arr1 == arr3).all())
1425808f684SSatish Balay        arr3[:] = 0
1435808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 0)
1445808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 0)
1455808f684SSatish Balay        self.assertEqual(self.vec.min()[1], 0)
1465808f684SSatish Balay        self.vec.set(1)
1475808f684SSatish Balay        self.assertAlmostEqual(abs(arr3.sum()), self.vec.getLocalSize())
1485808f684SSatish Balay        self.assertEqual(arr3.min(), 1)
1495808f684SSatish Balay        self.assertEqual(arr3.max(), 1)
1505808f684SSatish Balay        del arr3
1515808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs)
1525808f684SSatish Balay
1535808f684SSatish Balay    def testPlaceArray(self):
1545808f684SSatish Balay        self.vec.set(1)
1555808f684SSatish Balay        array = self.vec.getArray().copy()
1565808f684SSatish Balay        self.vec.placeArray(array)
1575808f684SSatish Balay        array[:] = 2
1585808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 2*self.vec.getSize())
1595808f684SSatish Balay        self.vec.resetArray()
1605808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), self.vec.getSize())
1615808f684SSatish Balay
162df341386SStefano Zampini    def testLocalVector(self):
163df341386SStefano Zampini        rank = self.vec.getComm().Get_rank()
164df341386SStefano Zampini        self.vec.getArray()[:] = rank + 1
165df341386SStefano Zampini        ln = self.vec.getLocalSize()
166df341386SStefano Zampini        lvec = self.vec.createLocalVector()
167df341386SStefano Zampini        self.vec.getLocalVector(lvec)
168df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank+1)*ln)
169df341386SStefano Zampini        self.vec.restoreLocalVector(lvec)
170df341386SStefano Zampini        self.vec.getLocalVector(lvec,readonly=True)
171df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank+1)*ln)
172df341386SStefano Zampini        self.vec.restoreLocalVector(lvec,readonly=True)
173df341386SStefano Zampini        lvec.destroy()
174df341386SStefano Zampini
1755808f684SSatish Balay    def testSetOption(self):
1765808f684SSatish Balay        opt1 = PETSc.Vec.Option.IGNORE_OFF_PROC_ENTRIES
1775808f684SSatish Balay        opt2 = PETSc.Vec.Option.IGNORE_NEGATIVE_INDICES
1785808f684SSatish Balay        for opt in [opt1, opt2]*2:
1795808f684SSatish Balay            for flag in [True,False]*2:
1805808f684SSatish Balay                self.vec.setOption(opt,flag)
1815808f684SSatish Balay
1825808f684SSatish Balay    def testGetSetItem(self):
1835808f684SSatish Balay        v = self.vec
1845808f684SSatish Balay        w = v.duplicate()
1855808f684SSatish Balay        #
1865808f684SSatish Balay        v[...] = 7
1875808f684SSatish Balay        self.assertEqual(v.max()[1], 7)
1885808f684SSatish Balay        self.assertEqual(v.min()[1], 7)
1895808f684SSatish Balay        #
1905808f684SSatish Balay        v.setRandom()
1915808f684SSatish Balay        w[...] = v
1925808f684SSatish Balay        self.assertTrue(w.equal(v))
1935808f684SSatish Balay        #
1945808f684SSatish Balay        v.setRandom()
1955808f684SSatish Balay        w[...] = v.getArray()
1965808f684SSatish Balay        self.assertTrue(w.equal(v))
1975808f684SSatish Balay        #
1985808f684SSatish Balay        s, e = v.getOwnershipRange()
1995808f684SSatish Balay        v.setRandom()
2005808f684SSatish Balay        w[s:e] = v.getArray().copy()
2015808f684SSatish Balay        self.assertTrue(w.equal(v))
2025808f684SSatish Balay        w1, v1 = w[s],   v[s]
2035808f684SSatish Balay        w2, v2 = w[e-1], v[e-1]
2045808f684SSatish Balay        self.assertEqual(w1, v1)
2055808f684SSatish Balay        self.assertEqual(w2, v2)
2065808f684SSatish Balay
2075808f684SSatish Balay    def testMAXPY(self):
2085808f684SSatish Balay        y = self.vec
2095808f684SSatish Balay        y.set(1)
2105808f684SSatish Balay        x = [y.copy() for _ in range(3)]
2115808f684SSatish Balay        a = [1]*len(x)
2125808f684SSatish Balay        y.maxpy(a, x)
2135808f684SSatish Balay        z = y.duplicate()
2145808f684SSatish Balay        z.set(len(x)+1)
2155808f684SSatish Balay        assert (y.equal(z))
2165808f684SSatish Balay
2175808f684SSatish Balay
2185808f684SSatish Balay# --------------------------------------------------------------------
2195808f684SSatish Balay
2205808f684SSatish Balayclass TestVecSeq(BaseTestVec, unittest.TestCase):
2215808f684SSatish Balay    COMM = PETSc.COMM_SELF
2225808f684SSatish Balay    TYPE = PETSc.Vec.Type.SEQ
2235808f684SSatish Balay
2245808f684SSatish Balayclass TestVecMPI(BaseTestVec, unittest.TestCase):
2255808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
2265808f684SSatish Balay    TYPE = PETSc.Vec.Type.MPI
2275808f684SSatish Balay
2285808f684SSatish Balayclass TestVecShared(BaseTestVec, unittest.TestCase):
2295808f684SSatish Balay    if PETSc.COMM_WORLD.getSize() == 1:
2305808f684SSatish Balay        TYPE = PETSc.Vec.Type.SHARED
2315808f684SSatish Balay    else:
2325808f684SSatish Balay        TYPE = PETSc.Vec.Type.MPI
2335808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
2345808f684SSatish Balay
2355808f684SSatish Balay#class TestVecSieve(BaseTestVec, unittest.TestCase):
2365808f684SSatish Balay#    CLASS = PETSc.VecSieve
2375808f684SSatish Balay#    TARGS = ([],)
2385808f684SSatish Balay
2395808f684SSatish Balay#class TestVecGhost(BaseTestVec, unittest.TestCase):
2405808f684SSatish Balay#    CLASS = PETSc.VecGhost
2415808f684SSatish Balay#    TARGS = ([],)
2425808f684SSatish Balay
2435808f684SSatish Balay# --------------------------------------------------------------------
2445808f684SSatish Balay
2455808f684SSatish Balayclass TestVecWithArray(unittest.TestCase):
2465808f684SSatish Balay
2475808f684SSatish Balay    def testCreateSeq(self):
2485808f684SSatish Balay        import numpy
2495808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
2505808f684SSatish Balay
2515808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_SELF)
2525808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=5, comm=PETSc.COMM_SELF)
2535808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=3, comm=PETSc.COMM_SELF)
2545808f684SSatish Balay
2555808f684SSatish Balay        self.assertTrue(v1.size == 5)
2565808f684SSatish Balay        self.assertTrue(v2.size == 5)
2575808f684SSatish Balay        self.assertTrue(v3.size == 3)
2585808f684SSatish Balay
2595808f684SSatish Balay        a1 = v1.getDict()['__array__']; self.assertTrue(a is a1)
2605808f684SSatish Balay        a2 = v2.getDict()['__array__']; self.assertTrue(a is a2)
2615808f684SSatish Balay        a3 = v3.getDict()['__array__']; self.assertTrue(a is a2)
2625808f684SSatish Balay
2635808f684SSatish Balay    def testCreateMPI(self):
2645808f684SSatish Balay        import numpy
2655808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
2665808f684SSatish Balay
2675808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_WORLD)
2685808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=(5,None), comm=PETSc.COMM_WORLD)
2695808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=(3,None), comm=PETSc.COMM_WORLD)
2705808f684SSatish Balay
2715808f684SSatish Balay        self.assertTrue(v1.local_size == 5)
2725808f684SSatish Balay        self.assertTrue(v2.local_size == 5)
2735808f684SSatish Balay        self.assertTrue(v3.local_size == 3)
2745808f684SSatish Balay
2755808f684SSatish Balay        a1 = v1.getDict()['__array__']; self.assertTrue(a is a1)
2765808f684SSatish Balay        a2 = v2.getDict()['__array__']; self.assertTrue(a is a2)
2775808f684SSatish Balay        a3 = v3.getDict()['__array__']; self.assertTrue(a is a2)
2785808f684SSatish Balay
2795808f684SSatish Balay    def testSetMPIGhost(self):
2805808f684SSatish Balay        import numpy
2815808f684SSatish Balay        v = PETSc.Vec().create()
2825808f684SSatish Balay        v.setType(PETSc.Vec.Type.MPI)
2835808f684SSatish Balay        v.setSizes((5,None))
2845808f684SSatish Balay        ghosts = [i % v.size for i in range(v.owner_range[1],v.owner_range[1]+3)]
2855808f684SSatish Balay        v.setMPIGhost(ghosts)
286e0aaf7daSStefano Zampini        v.setArray(numpy.array(range(*v.owner_range),dtype=PETSc.ScalarType))
2875808f684SSatish Balay        v.ghostUpdate()
2885808f684SSatish Balay        with v.localForm() as loc:
2895808f684SSatish Balay            self.assertTrue((loc[0:v.local_size] == range(*v.owner_range)).all())
2905808f684SSatish Balay            self.assertTrue((loc[v.local_size:] == ghosts).all())
2915808f684SSatish Balay
2925808f684SSatish Balay# --------------------------------------------------------------------
2935808f684SSatish Balay
2945808f684SSatish Balayif __name__ == '__main__':
2955808f684SSatish Balay    unittest.main()
2965808f684SSatish Balay
2975808f684SSatish Balay# --------------------------------------------------------------------
298