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