xref: /petsc/src/binding/petsc4py/test/test_vec.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balayfrom petsc4py import PETSc
2*5808f684SSatish Balayimport unittest
3*5808f684SSatish Balay
4*5808f684SSatish Balay# --------------------------------------------------------------------
5*5808f684SSatish Balay
6*5808f684SSatish Balayclass BaseTestVec(object):
7*5808f684SSatish Balay
8*5808f684SSatish Balay    COMM = None
9*5808f684SSatish Balay    TYPE = None
10*5808f684SSatish Balay
11*5808f684SSatish Balay    def setUp(self):
12*5808f684SSatish Balay        v = PETSc.Vec()
13*5808f684SSatish Balay        v.create(self.COMM)
14*5808f684SSatish Balay        v.setSizes(100)
15*5808f684SSatish Balay        v.setType(self.TYPE)
16*5808f684SSatish Balay        self.vec = v
17*5808f684SSatish Balay
18*5808f684SSatish Balay    def tearDown(self):
19*5808f684SSatish Balay        self.vec.destroy()
20*5808f684SSatish Balay        self.vec = None
21*5808f684SSatish Balay
22*5808f684SSatish Balay    def testDuplicate(self):
23*5808f684SSatish Balay        self.vec.set(1)
24*5808f684SSatish Balay        vec = self.vec.duplicate()
25*5808f684SSatish Balay        self.assertFalse(self.vec.equal(vec))
26*5808f684SSatish Balay        self.assertEqual(self.vec.sizes, vec.sizes)
27*5808f684SSatish Balay        del vec
28*5808f684SSatish Balay
29*5808f684SSatish Balay    def testCopy(self):
30*5808f684SSatish Balay        self.vec.set(1)
31*5808f684SSatish Balay        vec = self.vec.duplicate()
32*5808f684SSatish Balay        self.vec.copy(vec)
33*5808f684SSatish Balay        self.assertTrue(self.vec.equal(vec))
34*5808f684SSatish Balay        del vec
35*5808f684SSatish Balay
36*5808f684SSatish Balay    def testDot(self):
37*5808f684SSatish Balay        self.vec.set(1)
38*5808f684SSatish Balay        d = self.vec.dot(self.vec)
39*5808f684SSatish Balay        self.assertAlmostEqual(abs(d), self.vec.getSize())
40*5808f684SSatish Balay        self.vec.dotBegin(self.vec)
41*5808f684SSatish Balay        d = self.vec.dotEnd(self.vec)
42*5808f684SSatish Balay        self.assertAlmostEqual(abs(d), self.vec.getSize())
43*5808f684SSatish Balay
44*5808f684SSatish Balay    def testNorm(self):
45*5808f684SSatish Balay        from math import sqrt
46*5808f684SSatish Balay        self.vec.set(1)
47*5808f684SSatish Balay        n1 = self.vec.norm(PETSc.NormType.NORM_1)
48*5808f684SSatish Balay        n2 = self.vec.norm(PETSc.NormType.NORM_2)
49*5808f684SSatish Balay        ni = self.vec.norm(PETSc.NormType.NORM_INFINITY)
50*5808f684SSatish Balay        self.assertAlmostEqual(n1, self.vec.getSize())
51*5808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
52*5808f684SSatish Balay        self.assertAlmostEqual(n2, self.vec.norm())
53*5808f684SSatish Balay        self.assertAlmostEqual(ni, 1.0)
54*5808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_1)
55*5808f684SSatish Balay        nn1 = self.vec.normEnd(PETSc.NormType.NORM_1)
56*5808f684SSatish Balay        self.assertAlmostEqual(nn1, n1)
57*5808f684SSatish Balay        self.vec.normBegin()
58*5808f684SSatish Balay        nn2 = self.vec.normEnd()
59*5808f684SSatish Balay        self.assertAlmostEqual(nn2, n2)
60*5808f684SSatish Balay        self.vec.normBegin(PETSc.NormType.NORM_INFINITY)
61*5808f684SSatish Balay        nni = self.vec.normEnd(PETSc.NormType.NORM_INFINITY)
62*5808f684SSatish Balay        self.assertAlmostEqual(nni, ni)
63*5808f684SSatish Balay
64*5808f684SSatish Balay    def testNormalize(self):
65*5808f684SSatish Balay        from math import sqrt
66*5808f684SSatish Balay        self.vec.set(1)
67*5808f684SSatish Balay        n2 = self.vec.normalize()
68*5808f684SSatish Balay        self.assertAlmostEqual(n2, sqrt(self.vec.getSize()))
69*5808f684SSatish Balay        self.assertAlmostEqual(1, self.vec.norm())
70*5808f684SSatish Balay
71*5808f684SSatish Balay    def testSumMinMax(self):
72*5808f684SSatish Balay        self.vec.set(1)
73*5808f684SSatish Balay        self.assertEqual(self.vec.sum(), self.vec.getSize())
74*5808f684SSatish Balay        self.vec.set(-7)
75*5808f684SSatish Balay        self.assertEqual(self.vec.min()[1], -7)
76*5808f684SSatish Balay        self.vec.set(10)
77*5808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 10)
78*5808f684SSatish Balay
79*5808f684SSatish Balay    def testSwap(self):
80*5808f684SSatish Balay        v1 = self.vec
81*5808f684SSatish Balay        v2 = v1.duplicate()
82*5808f684SSatish Balay        v1.set(1)
83*5808f684SSatish Balay        v2.set(2)
84*5808f684SSatish Balay        v1.swap(v2)
85*5808f684SSatish Balay        idx, _ = self.vec.getOwnershipRange()
86*5808f684SSatish Balay        self.assertEqual(v1[idx], 2)
87*5808f684SSatish Balay        self.assertEqual(v2[idx], 1)
88*5808f684SSatish Balay
89*5808f684SSatish Balay    def testBsize(self):
90*5808f684SSatish Balay        self.vec.setBlockSize(1)
91*5808f684SSatish Balay        self.assertEqual(self.vec.getBlockSize(), 1)
92*5808f684SSatish Balay        self.vec.setBlockSize(1)
93*5808f684SSatish Balay
94*5808f684SSatish Balay    def testGetSetVals(self):
95*5808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
96*5808f684SSatish Balay        self.vec[start] = -7
97*5808f684SSatish Balay        self.vec[end-1]   = -7
98*5808f684SSatish Balay        self.assertEqual(self.vec[start], -7)
99*5808f684SSatish Balay        self.assertEqual(self.vec[end-1], -7)
100*5808f684SSatish Balay        for i in range(start, end): self.vec[i] = i
101*5808f684SSatish Balay        values = [self.vec[i] for i in range(start, end)]
102*5808f684SSatish Balay        self.assertEqual(values, list(range(start, end)))
103*5808f684SSatish Balay        sz = self.vec.getSize()
104*5808f684SSatish Balay        self.assertEqual(self.vec.sum(), (sz-1)/2.0*sz)
105*5808f684SSatish Balay
106*5808f684SSatish Balay    def testGetSetValsBlocked(self):
107*5808f684SSatish Balay        return
108*5808f684SSatish Balay        lsize, gsize = self.vec.getSizes()
109*5808f684SSatish Balay        start, end = self.vec.getOwnershipRange()
110*5808f684SSatish Balay        bsizes  = list(range(1, lsize+1))
111*5808f684SSatish Balay        nblocks = list(range(1, lsize+1))
112*5808f684SSatish Balay        compat = [(bs, nb)
113*5808f684SSatish Balay                  for bs in bsizes  if not (gsize%bs or lsize % bs)
114*5808f684SSatish Balay                  for nb in nblocks if bs*nb <= lsize]
115*5808f684SSatish Balay        for bsize, nblock in compat:
116*5808f684SSatish Balay            self.vec.setBlockSize(bsize)
117*5808f684SSatish Balay            bindex = [start//bsize+i  for i in range(nblock)]
118*5808f684SSatish Balay            bvalue = [float(i) for i in range(nblock*bsize)]
119*5808f684SSatish Balay            self.vec.setValuesBlocked(bindex, bvalue)
120*5808f684SSatish Balay            self.vec.assemble()
121*5808f684SSatish Balay            index = [start+i for i in range(nblock*bsize)]
122*5808f684SSatish Balay            value = self.vec.getValues(index)
123*5808f684SSatish Balay            self.assertEqual(bvalue, list(value))
124*5808f684SSatish Balay
125*5808f684SSatish Balay    def testGetSetArray(self):
126*5808f684SSatish Balay        self.vec.set(1)
127*5808f684SSatish Balay        arr0 = self.vec.getArray().copy()
128*5808f684SSatish Balay        self.assertEqual(arr0.sum(), self.vec.getLocalSize())
129*5808f684SSatish Balay        arr0 = self.vec.getArray().copy()
130*5808f684SSatish Balay        self.vec.setRandom()
131*5808f684SSatish Balay        arr1 = self.vec.getArray().copy()
132*5808f684SSatish Balay        self.vec.setArray(arr1)
133*5808f684SSatish Balay        arr1 = self.vec.getArray().copy()
134*5808f684SSatish Balay        arr2 = self.vec.getArray().copy()
135*5808f684SSatish Balay        self.assertTrue((arr1 == arr2).all())
136*5808f684SSatish Balay        import numpy
137*5808f684SSatish Balay        refs = self.vec.getRefCount()
138*5808f684SSatish Balay        arr3 = numpy.asarray(self.vec)
139*5808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs+1)
140*5808f684SSatish Balay        self.assertTrue((arr1 == arr3).all())
141*5808f684SSatish Balay        arr3[:] = 0
142*5808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 0)
143*5808f684SSatish Balay        self.assertEqual(self.vec.max()[1], 0)
144*5808f684SSatish Balay        self.assertEqual(self.vec.min()[1], 0)
145*5808f684SSatish Balay        self.vec.set(1)
146*5808f684SSatish Balay        self.assertAlmostEqual(abs(arr3.sum()), self.vec.getLocalSize())
147*5808f684SSatish Balay        self.assertEqual(arr3.min(), 1)
148*5808f684SSatish Balay        self.assertEqual(arr3.max(), 1)
149*5808f684SSatish Balay        del arr3
150*5808f684SSatish Balay        self.assertEqual(self.vec.getRefCount(), refs)
151*5808f684SSatish Balay
152*5808f684SSatish Balay    def testPlaceArray(self):
153*5808f684SSatish Balay        self.vec.set(1)
154*5808f684SSatish Balay        array = self.vec.getArray().copy()
155*5808f684SSatish Balay        self.vec.placeArray(array)
156*5808f684SSatish Balay        array[:] = 2
157*5808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), 2*self.vec.getSize())
158*5808f684SSatish Balay        self.vec.resetArray()
159*5808f684SSatish Balay        self.assertAlmostEqual(abs(self.vec.sum()), self.vec.getSize())
160*5808f684SSatish Balay
161*5808f684SSatish Balay    def testSetOption(self):
162*5808f684SSatish Balay        opt1 = PETSc.Vec.Option.IGNORE_OFF_PROC_ENTRIES
163*5808f684SSatish Balay        opt2 = PETSc.Vec.Option.IGNORE_NEGATIVE_INDICES
164*5808f684SSatish Balay        for opt in [opt1, opt2]*2:
165*5808f684SSatish Balay            for flag in [True,False]*2:
166*5808f684SSatish Balay                self.vec.setOption(opt,flag)
167*5808f684SSatish Balay
168*5808f684SSatish Balay    def testGetSetItem(self):
169*5808f684SSatish Balay        v = self.vec
170*5808f684SSatish Balay        w = v.duplicate()
171*5808f684SSatish Balay        #
172*5808f684SSatish Balay        v[...] = 7
173*5808f684SSatish Balay        self.assertEqual(v.max()[1], 7)
174*5808f684SSatish Balay        self.assertEqual(v.min()[1], 7)
175*5808f684SSatish Balay        #
176*5808f684SSatish Balay        v.setRandom()
177*5808f684SSatish Balay        w[...] = v
178*5808f684SSatish Balay        self.assertTrue(w.equal(v))
179*5808f684SSatish Balay        #
180*5808f684SSatish Balay        v.setRandom()
181*5808f684SSatish Balay        w[...] = v.getArray()
182*5808f684SSatish Balay        self.assertTrue(w.equal(v))
183*5808f684SSatish Balay        #
184*5808f684SSatish Balay        s, e = v.getOwnershipRange()
185*5808f684SSatish Balay        v.setRandom()
186*5808f684SSatish Balay        w[s:e] = v.getArray().copy()
187*5808f684SSatish Balay        self.assertTrue(w.equal(v))
188*5808f684SSatish Balay        w1, v1 = w[s],   v[s]
189*5808f684SSatish Balay        w2, v2 = w[e-1], v[e-1]
190*5808f684SSatish Balay        self.assertEqual(w1, v1)
191*5808f684SSatish Balay        self.assertEqual(w2, v2)
192*5808f684SSatish Balay
193*5808f684SSatish Balay    def testMAXPY(self):
194*5808f684SSatish Balay        y = self.vec
195*5808f684SSatish Balay        y.set(1)
196*5808f684SSatish Balay        x = [y.copy() for _ in range(3)]
197*5808f684SSatish Balay        a = [1]*len(x)
198*5808f684SSatish Balay        y.maxpy(a, x)
199*5808f684SSatish Balay        z = y.duplicate()
200*5808f684SSatish Balay        z.set(len(x)+1)
201*5808f684SSatish Balay        assert (y.equal(z))
202*5808f684SSatish Balay
203*5808f684SSatish Balay
204*5808f684SSatish Balay# --------------------------------------------------------------------
205*5808f684SSatish Balay
206*5808f684SSatish Balayclass TestVecSeq(BaseTestVec, unittest.TestCase):
207*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
208*5808f684SSatish Balay    TYPE = PETSc.Vec.Type.SEQ
209*5808f684SSatish Balay
210*5808f684SSatish Balayclass TestVecMPI(BaseTestVec, unittest.TestCase):
211*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
212*5808f684SSatish Balay    TYPE = PETSc.Vec.Type.MPI
213*5808f684SSatish Balay
214*5808f684SSatish Balayclass TestVecShared(BaseTestVec, unittest.TestCase):
215*5808f684SSatish Balay    if PETSc.COMM_WORLD.getSize() == 1:
216*5808f684SSatish Balay        TYPE = PETSc.Vec.Type.SHARED
217*5808f684SSatish Balay    else:
218*5808f684SSatish Balay        TYPE = PETSc.Vec.Type.MPI
219*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
220*5808f684SSatish Balay
221*5808f684SSatish Balay#class TestVecSieve(BaseTestVec, unittest.TestCase):
222*5808f684SSatish Balay#    CLASS = PETSc.VecSieve
223*5808f684SSatish Balay#    TARGS = ([],)
224*5808f684SSatish Balay
225*5808f684SSatish Balay#class TestVecGhost(BaseTestVec, unittest.TestCase):
226*5808f684SSatish Balay#    CLASS = PETSc.VecGhost
227*5808f684SSatish Balay#    TARGS = ([],)
228*5808f684SSatish Balay
229*5808f684SSatish Balay# --------------------------------------------------------------------
230*5808f684SSatish Balay
231*5808f684SSatish Balayclass TestVecWithArray(unittest.TestCase):
232*5808f684SSatish Balay
233*5808f684SSatish Balay    def testCreateSeq(self):
234*5808f684SSatish Balay        import numpy
235*5808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
236*5808f684SSatish Balay
237*5808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_SELF)
238*5808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=5, comm=PETSc.COMM_SELF)
239*5808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=3, comm=PETSc.COMM_SELF)
240*5808f684SSatish Balay
241*5808f684SSatish Balay        self.assertTrue(v1.size == 5)
242*5808f684SSatish Balay        self.assertTrue(v2.size == 5)
243*5808f684SSatish Balay        self.assertTrue(v3.size == 3)
244*5808f684SSatish Balay
245*5808f684SSatish Balay        a1 = v1.getDict()['__array__']; self.assertTrue(a is a1)
246*5808f684SSatish Balay        a2 = v2.getDict()['__array__']; self.assertTrue(a is a2)
247*5808f684SSatish Balay        a3 = v3.getDict()['__array__']; self.assertTrue(a is a2)
248*5808f684SSatish Balay
249*5808f684SSatish Balay    def testCreateMPI(self):
250*5808f684SSatish Balay        import numpy
251*5808f684SSatish Balay        a = numpy.zeros(5, dtype=PETSc.ScalarType)
252*5808f684SSatish Balay
253*5808f684SSatish Balay        v1 = PETSc.Vec().createWithArray(a, comm=PETSc.COMM_WORLD)
254*5808f684SSatish Balay        v2 = PETSc.Vec().createWithArray(a, size=(5,None), comm=PETSc.COMM_WORLD)
255*5808f684SSatish Balay        v3 = PETSc.Vec().createWithArray(a, size=(3,None), comm=PETSc.COMM_WORLD)
256*5808f684SSatish Balay
257*5808f684SSatish Balay        self.assertTrue(v1.local_size == 5)
258*5808f684SSatish Balay        self.assertTrue(v2.local_size == 5)
259*5808f684SSatish Balay        self.assertTrue(v3.local_size == 3)
260*5808f684SSatish Balay
261*5808f684SSatish Balay        a1 = v1.getDict()['__array__']; self.assertTrue(a is a1)
262*5808f684SSatish Balay        a2 = v2.getDict()['__array__']; self.assertTrue(a is a2)
263*5808f684SSatish Balay        a3 = v3.getDict()['__array__']; self.assertTrue(a is a2)
264*5808f684SSatish Balay
265*5808f684SSatish Balay    def testSetMPIGhost(self):
266*5808f684SSatish Balay        import numpy
267*5808f684SSatish Balay        v = PETSc.Vec().create()
268*5808f684SSatish Balay        v.setType(PETSc.Vec.Type.MPI)
269*5808f684SSatish Balay        v.setSizes((5,None))
270*5808f684SSatish Balay        ghosts = [i % v.size for i in range(v.owner_range[1],v.owner_range[1]+3)]
271*5808f684SSatish Balay        v.setMPIGhost(ghosts)
272*5808f684SSatish Balay        v.setArray(numpy.array(range(*v.owner_range)))
273*5808f684SSatish Balay        v.ghostUpdate()
274*5808f684SSatish Balay        with v.localForm() as loc:
275*5808f684SSatish Balay            self.assertTrue((loc[0:v.local_size] == range(*v.owner_range)).all())
276*5808f684SSatish Balay            self.assertTrue((loc[v.local_size:] == ghosts).all())
277*5808f684SSatish Balay
278*5808f684SSatish Balay# --------------------------------------------------------------------
279*5808f684SSatish Balay
280*5808f684SSatish Balayif __name__ == '__main__':
281*5808f684SSatish Balay    unittest.main()
282*5808f684SSatish Balay
283*5808f684SSatish Balay# --------------------------------------------------------------------
284