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