xref: /petsc/src/binding/petsc4py/test/test_vec.py (revision dda1fc5685d49b41e9220fbfbd490f082712efdf)
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
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
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
9960211e57SBarry Smith        self.vec.assemble()
1005808f684SSatish Balay        self.assertEqual(self.vec[start], -7)
1015808f684SSatish Balay        self.assertEqual(self.vec[end-1], -7)
1025808f684SSatish Balay        for i in range(start, end): self.vec[i] = i
10360211e57SBarry Smith        self.vec.assemble()
1045808f684SSatish Balay        values = [self.vec[i] for i in range(start, end)]
1055808f684SSatish Balay        self.assertEqual(values, list(range(start, end)))
1065808f684SSatish Balay        sz = self.vec.getSize()
1075808f684SSatish Balay        self.assertEqual(self.vec.sum(), (sz-1)/2.0*sz)
1085808f684SSatish Balay
1095808f684SSatish Balay    def testGetSetValsBlocked(self):
1105808f684SSatish Balay        return
1115808f684SSatish Balay        lsize, gsize = self.vec.getSizes()
1125808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
1135808f684SSatish Balay        bsizes  = list(range(1, lsize+1))
1145808f684SSatish Balay        nblocks = list(range(1, lsize+1))
1155808f684SSatish Balay        compat = [(bs, nb)
1165808f684SSatish Balay                  for bs in bsizes  if not (gsize%bs or lsize % bs)
1175808f684SSatish Balay                  for nb in nblocks if bs*nb <= lsize]
1185808f684SSatish Balay        for bsize, nblock in compat:
1195808f684SSatish Balay            self.vec.setBlockSize(bsize)
1205808f684SSatish Balay            bindex = [start//bsize+i  for i in range(nblock)]
1215808f684SSatish Balay            bvalue = [float(i) for i in range(nblock*bsize)]
1225808f684SSatish Balay            self.vec.setValuesBlocked(bindex, bvalue)
1235808f684SSatish Balay            self.vec.assemble()
1245808f684SSatish Balay            index = [start+i for i in range(nblock*bsize)]
1255808f684SSatish Balay            value = self.vec.getValues(index)
1265808f684SSatish Balay            self.assertEqual(bvalue, list(value))
1275808f684SSatish Balay
1285808f684SSatish Balay    def testGetSetArray(self):
1295808f684SSatish Balay        self.vec.set(1)
1305808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1315808f684SSatish Balay        self.assertEqual(arr0.sum(), self.vec.getLocalSize())
1325808f684SSatish Balay        arr0 = self.vec.getArray().copy()
1335808f684SSatish Balay        self.vec.setRandom()
1345808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1355808f684SSatish Balay        self.vec.setArray(arr1)
1365808f684SSatish Balay        arr1 = self.vec.getArray().copy()
1375808f684SSatish Balay        arr2 = self.vec.getArray().copy()
1385808f684SSatish Balay        self.assertTrue((arr1 == arr2).all())
1395808f684SSatish Balay        import numpy
1405808f684SSatish Balay        refs = self.vec.getRefCount()
1415808f684SSatish Balay        arr3 = numpy.asarray(self.vec)
1425808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs+1)
1435808f684SSatish Balay        self.assertTrue((arr1 == arr3).all())
1445808f684SSatish Balay        arr3[:] = 0
1455808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 0)
1465808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 0)
1475808f684SSatish Balay        self.assertEqual(self.vec.min()[1], 0)
1485808f684SSatish Balay        self.vec.set(1)
1495808f684SSatish Balay        self.assertAlmostEqual(abs(arr3.sum()), self.vec.getLocalSize())
1505808f684SSatish Balay        self.assertEqual(arr3.min(), 1)
1515808f684SSatish Balay        self.assertEqual(arr3.max(), 1)
1525808f684SSatish Balay        del arr3
1535808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs)
1545808f684SSatish Balay
1555808f684SSatish Balay    def testPlaceArray(self):
1565808f684SSatish Balay        self.vec.set(1)
1575808f684SSatish Balay        array = self.vec.getArray().copy()
1585808f684SSatish Balay        self.vec.placeArray(array)
1595808f684SSatish Balay        array[:] = 2
1605808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 2*self.vec.getSize())
1615808f684SSatish Balay        self.vec.resetArray()
1625808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), self.vec.getSize())
1635808f684SSatish Balay
164df341386SStefano Zampini    def testLocalVector(self):
165df341386SStefano Zampini        rank = self.vec.getComm().Get_rank()
166df341386SStefano Zampini        self.vec.getArray()[:] = rank + 1
167df341386SStefano Zampini        ln = self.vec.getLocalSize()
168df341386SStefano Zampini        lvec = self.vec.createLocalVector()
169df341386SStefano Zampini        self.vec.getLocalVector(lvec)
170df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank+1)*ln)
171df341386SStefano Zampini        self.vec.restoreLocalVector(lvec)
172df341386SStefano Zampini        self.vec.getLocalVector(lvec,readonly=True)
173df341386SStefano Zampini        self.assertEqual(abs(lvec.sum()), (rank+1)*ln)
174df341386SStefano Zampini        self.vec.restoreLocalVector(lvec,readonly=True)
175df341386SStefano Zampini        lvec.destroy()
176df341386SStefano Zampini
1775808f684SSatish Balay    def testSetOption(self):
1785808f684SSatish Balay        opt1 = PETSc.Vec.Option.IGNORE_OFF_PROC_ENTRIES
1795808f684SSatish Balay        opt2 = PETSc.Vec.Option.IGNORE_NEGATIVE_INDICES
1805808f684SSatish Balay        for opt in [opt1, opt2]*2:
1815808f684SSatish Balay            for flag in [True,False]*2:
1825808f684SSatish Balay                self.vec.setOption(opt,flag)
1835808f684SSatish Balay
1845808f684SSatish Balay    def testGetSetItem(self):
1855808f684SSatish Balay        v = self.vec
1865808f684SSatish Balay        w = v.duplicate()
1875808f684SSatish Balay        #
1885808f684SSatish Balay        v[...] = 7
1895808f684SSatish Balay        self.assertEqual(v.max()[1], 7)
1905808f684SSatish Balay        self.assertEqual(v.min()[1], 7)
1915808f684SSatish Balay        #
1925808f684SSatish Balay        v.setRandom()
1935808f684SSatish Balay        w[...] = v
1945808f684SSatish Balay        self.assertTrue(w.equal(v))
1955808f684SSatish Balay        #
1965808f684SSatish Balay        v.setRandom()
1975808f684SSatish Balay        w[...] = v.getArray()
1985808f684SSatish Balay        self.assertTrue(w.equal(v))
1995808f684SSatish Balay        #
2005808f684SSatish Balay        s, e = v.getOwnershipRange()
2015808f684SSatish Balay        v.setRandom()
2025808f684SSatish Balay        w[s:e] = v.getArray().copy()
20360211e57SBarry Smith        w.assemble()
2045808f684SSatish Balay        self.assertTrue(w.equal(v))
2055808f684SSatish Balay        w1, v1 = w[s],   v[s]
2065808f684SSatish Balay        w2, v2 = w[e-1], v[e-1]
2075808f684SSatish Balay        self.assertEqual(w1, v1)
2085808f684SSatish Balay        self.assertEqual(w2, v2)
2095808f684SSatish Balay
2105808f684SSatish Balay    def testMAXPY(self):
2115808f684SSatish Balay        y = self.vec
2125808f684SSatish Balay        y.set(1)
2135808f684SSatish Balay        x = [y.copy() for _ in range(3)]
2145808f684SSatish Balay        a = [1]*len(x)
2155808f684SSatish Balay        y.maxpy(a, x)
2165808f684SSatish Balay        z = y.duplicate()
2175808f684SSatish Balay        z.set(len(x)+1)
2185808f684SSatish Balay        assert (y.equal(z))
2195808f684SSatish Balay
220*dda1fc56SLisandro Dalcin    def testBinOp(self):
221*dda1fc56SLisandro Dalcin        x = self.vec
222*dda1fc56SLisandro Dalcin        x.set(1)
223*dda1fc56SLisandro Dalcin        n = x.getSize()
224*dda1fc56SLisandro Dalcin        y = 2 + 2*x + 1 - x*3 - 1
225*dda1fc56SLisandro Dalcin        self.assertEqual(y.min()[1], 1)
226*dda1fc56SLisandro Dalcin        self.assertEqual(y.max()[1], 1)
227*dda1fc56SLisandro Dalcin        z = (4*x)/(2*y)
228*dda1fc56SLisandro Dalcin        self.assertEqual(z.min()[1], 2)
229*dda1fc56SLisandro Dalcin        self.assertEqual(z.max()[1], 2)
230*dda1fc56SLisandro Dalcin        z = z/2
231*dda1fc56SLisandro Dalcin        self.assertEqual(z.min()[1], 1)
232*dda1fc56SLisandro Dalcin        self.assertEqual(z.max()[1], 1)
233*dda1fc56SLisandro Dalcin        s = (+x) @ (-y)
234*dda1fc56SLisandro Dalcin        self.assertEqual(s, -n)
235*dda1fc56SLisandro Dalcin        #
236*dda1fc56SLisandro Dalcin        M, N = n, 2*n
237*dda1fc56SLisandro Dalcin        A = PETSc.Mat().createDense((M, N), comm=self.COMM)
238*dda1fc56SLisandro Dalcin        A.setUp()
239*dda1fc56SLisandro Dalcin        rs, re = A.getOwnershipRange()
240*dda1fc56SLisandro Dalcin        cs, ce = A.getOwnershipRangeColumn()
241*dda1fc56SLisandro Dalcin        a, b = 3, 5
242*dda1fc56SLisandro Dalcin        for i in range(rs, re):
243*dda1fc56SLisandro Dalcin            for j in range(N):
244*dda1fc56SLisandro Dalcin                A[i, j] = a*i + b*j
245*dda1fc56SLisandro Dalcin        A.assemble()
246*dda1fc56SLisandro Dalcin        y = x @ A
247*dda1fc56SLisandro Dalcin        self.assertEqual(y.getSize(), N)
248*dda1fc56SLisandro Dalcin        for i in range(cs, ce):
249*dda1fc56SLisandro Dalcin            self.assertEqual(y[i], a*M*(M-1)/2 + b*i*M)
250*dda1fc56SLisandro Dalcin        y.set(1)
251*dda1fc56SLisandro Dalcin        z = A @ y
252*dda1fc56SLisandro Dalcin        self.assertEqual(z.getSize(), M)
253*dda1fc56SLisandro Dalcin        for i in range(rs, re):
254*dda1fc56SLisandro Dalcin            self.assertEqual(z[i], b*N*(N-1)/2 + a*i*N)
2555808f684SSatish Balay
2565808f684SSatish Balay# --------------------------------------------------------------------
2575808f684SSatish Balay
2585808f684SSatish Balayclass TestVecSeq(BaseTestVec, unittest.TestCase):
2595808f684SSatish Balay    COMM = PETSc.COMM_SELF
2605808f684SSatish Balay    TYPE = PETSc.Vec.Type.SEQ
2615808f684SSatish Balay
2625808f684SSatish Balayclass TestVecMPI(BaseTestVec, unittest.TestCase):
2635808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
2645808f684SSatish Balay    TYPE = PETSc.Vec.Type.MPI
2655808f684SSatish Balay
2665808f684SSatish Balayclass TestVecShared(BaseTestVec, unittest.TestCase):
2675808f684SSatish Balay    if PETSc.COMM_WORLD.getSize() == 1:
2685808f684SSatish Balay        TYPE = PETSc.Vec.Type.SHARED
2695808f684SSatish Balay    else:
2705808f684SSatish Balay        TYPE = PETSc.Vec.Type.MPI
2715808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
2725808f684SSatish Balay
2735808f684SSatish Balay#class TestVecSieve(BaseTestVec, unittest.TestCase):
2745808f684SSatish Balay#    CLASS = PETSc.VecSieve
2755808f684SSatish Balay#    TARGS = ([],)
2765808f684SSatish Balay
2775808f684SSatish Balay#class TestVecGhost(BaseTestVec, unittest.TestCase):
2785808f684SSatish Balay#    CLASS = PETSc.VecGhost
2795808f684SSatish Balay#    TARGS = ([],)
2805808f684SSatish Balay
2815808f684SSatish Balay# --------------------------------------------------------------------
2825808f684SSatish Balay
2835808f684SSatish Balayclass TestVecWithArray(unittest.TestCase):
2845808f684SSatish Balay
2855808f684SSatish Balay    def testCreateSeq(self):
2865808f684SSatish Balay        import numpy
2875808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
2885808f684SSatish Balay
2895808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_SELF)
2905808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=5, comm=PETSc.COMM_SELF)
2915808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=3, comm=PETSc.COMM_SELF)
2925808f684SSatish Balay
2935808f684SSatish Balay        self.assertTrue(v1.size == 5)
2945808f684SSatish Balay        self.assertTrue(v2.size == 5)
2955808f684SSatish Balay        self.assertTrue(v3.size == 3)
2965808f684SSatish Balay
2975808f684SSatish Balay        a1 = v1.getDict()['__array__']; self.assertTrue(a is a1)
2985808f684SSatish Balay        a2 = v2.getDict()['__array__']; self.assertTrue(a is a2)
2995808f684SSatish Balay        a3 = v3.getDict()['__array__']; self.assertTrue(a is a2)
3005808f684SSatish Balay
3015808f684SSatish Balay    def testCreateMPI(self):
3025808f684SSatish Balay        import numpy
3035808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
3045808f684SSatish Balay
3055808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_WORLD)
3065808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=(5,None), comm=PETSc.COMM_WORLD)
3075808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=(3,None), comm=PETSc.COMM_WORLD)
3085808f684SSatish Balay
3095808f684SSatish Balay        self.assertTrue(v1.local_size == 5)
3105808f684SSatish Balay        self.assertTrue(v2.local_size == 5)
3115808f684SSatish Balay        self.assertTrue(v3.local_size == 3)
3125808f684SSatish Balay
3135808f684SSatish Balay        a1 = v1.getDict()['__array__']; self.assertTrue(a is a1)
3145808f684SSatish Balay        a2 = v2.getDict()['__array__']; self.assertTrue(a is a2)
3155808f684SSatish Balay        a3 = v3.getDict()['__array__']; self.assertTrue(a is a2)
3165808f684SSatish Balay
3175808f684SSatish Balay    def testSetMPIGhost(self):
3185808f684SSatish Balay        import numpy
3195808f684SSatish Balay        v = PETSc.Vec().create()
3205808f684SSatish Balay        v.setType(PETSc.Vec.Type.MPI)
3215808f684SSatish Balay        v.setSizes((5,None))
3225808f684SSatish Balay        ghosts = [i % v.size for i in range(v.owner_range[1],v.owner_range[1]+3)]
3235808f684SSatish Balay        v.setMPIGhost(ghosts)
324e0aaf7daSStefano Zampini        v.setArray(numpy.array(range(*v.owner_range),dtype=PETSc.ScalarType))
3255808f684SSatish Balay        v.ghostUpdate()
3265808f684SSatish Balay        with v.localForm() as loc:
3275808f684SSatish Balay            self.assertTrue((loc[0:v.local_size] == range(*v.owner_range)).all())
3285808f684SSatish Balay            self.assertTrue((loc[v.local_size:] == ghosts).all())
3295808f684SSatish Balay
3305808f684SSatish Balay# --------------------------------------------------------------------
3315808f684SSatish Balay
3325808f684SSatish Balayif __name__ == '__main__':
3335808f684SSatish Balay    unittest.main()
3345808f684SSatish Balay
3355808f684SSatish Balay# --------------------------------------------------------------------
336