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