15808f684SSatish Balayfrom petsc4py import PETSc 25808f684SSatish Balayimport unittest 35808f684SSatish Balay 45808f684SSatish Balayimport numpy as np 55808f684SSatish Balay 6*6f336411SStefano Zampini 75808f684SSatish Balaydef mkdata(comm, m, N, bs): 85808f684SSatish Balay start = m * comm.rank 95808f684SSatish Balay end = start + m 105808f684SSatish Balay idt = PETSc.IntType 115808f684SSatish Balay sdt = PETSc.ScalarType 125808f684SSatish Balay rows = np.array(range(start, end), dtype=idt) 13*6f336411SStefano Zampini cols = np.array(range(N), dtype=idt) 14*6f336411SStefano Zampini vals = np.array(range(m * N * bs * bs), dtype=sdt) 155808f684SSatish Balay vals.shape = (-1, bs, bs) 165808f684SSatish Balay return rows, cols, vals 175808f684SSatish Balay 185808f684SSatish Balay 19*6f336411SStefano Zampiniclass BaseTestMatAnyDense: 205808f684SSatish Balay COMM = PETSc.COMM_NULL 215808f684SSatish Balay GRID = 0, 0 225808f684SSatish Balay BSIZE = None 235808f684SSatish Balay TYPE = PETSc.Mat.Type.DENSE 245808f684SSatish Balay 255808f684SSatish Balay def setUp(self): 265808f684SSatish Balay COMM = self.COMM 275808f684SSatish Balay GM, GN = self.GRID 285808f684SSatish Balay BS = self.BSIZE # or 1 295808f684SSatish Balay # 305808f684SSatish Balay self.A = PETSc.Mat().create(comm=COMM) 31*6f336411SStefano Zampini bs = BS or 1 32*6f336411SStefano Zampini m, N = GM, GN 335808f684SSatish Balay rowsz = (m * bs, None) 345808f684SSatish Balay colsz = (None, N * bs) 355808f684SSatish Balay self.A.setSizes([rowsz, colsz], BS) 365808f684SSatish Balay self.A.setType(self.TYPE) 375808f684SSatish Balay 385808f684SSatish Balay def tearDown(self): 395808f684SSatish Balay self.A.destroy() 405808f684SSatish Balay self.A = None 4162e5d2d2SJDBetteridge PETSc.garbage_cleanup() 425808f684SSatish Balay 435808f684SSatish Balay def testSetValues(self): 445808f684SSatish Balay self._preallocate() 455808f684SSatish Balay r, c, v = self._set_values() 465808f684SSatish Balay self.A.assemble() 475808f684SSatish Balay self._chk_array(self.A, r, c, v) 485808f684SSatish Balay r, c, v = self._set_values() 495808f684SSatish Balay self.A.assemble() 505808f684SSatish Balay self._chk_array(self.A, r, c, v) 515808f684SSatish Balay 525808f684SSatish Balay def testGetDiagonalBlock(self): 535808f684SSatish Balay M, N = self.A.getSize() 545808f684SSatish Balay # only for square matrices 55*6f336411SStefano Zampini if M != N: 56*6f336411SStefano Zampini return 575808f684SSatish Balay self._preallocate() 585808f684SSatish Balay self._set_values() 595808f684SSatish Balay self.A.assemble() 605808f684SSatish Balay B = self.A.getDiagonalBlock() 615808f684SSatish Balay self.assertEqual(self.A.getLocalSize(), B.getSize()) 625808f684SSatish Balay B.destroy() 635808f684SSatish Balay 645808f684SSatish Balay def testCreateTranspose(self): 655808f684SSatish Balay self._preallocate() 665808f684SSatish Balay self._set_values() 675808f684SSatish Balay self.A.assemble() 685808f684SSatish Balay A = self.A 695808f684SSatish Balay AT = PETSc.Mat().createTranspose(A) 705808f684SSatish Balay x, y = A.createVecs() 715808f684SSatish Balay xt, yt = AT.createVecs() 725808f684SSatish Balay # 735808f684SSatish Balay y.setRandom() 745808f684SSatish Balay A.multTranspose(y, x) 755808f684SSatish Balay y.copy(xt) 765808f684SSatish Balay AT.mult(xt, yt) 775808f684SSatish Balay self.assertTrue(yt.equal(x)) 785808f684SSatish Balay # 795808f684SSatish Balay x.setRandom() 805808f684SSatish Balay A.mult(x, y) 815808f684SSatish Balay x.copy(yt) 825808f684SSatish Balay AT.multTranspose(yt, xt) 835808f684SSatish Balay self.assertTrue(xt.equal(y)) 845808f684SSatish Balay 855808f684SSatish Balay def _preallocate(self): 865808f684SSatish Balay self.A.setPreallocationDense(None) 875808f684SSatish Balay 885808f684SSatish Balay def _set_values(self): 895808f684SSatish Balay COMM = self.COMM 905808f684SSatish Balay GM, GN = self.GRID 915808f684SSatish Balay BS = self.BSIZE or 1 925808f684SSatish Balay rows, cols, vals = mkdata(COMM, GM, GN, BS) 935808f684SSatish Balay if not self.BSIZE: 945808f684SSatish Balay setvalues = self.A.setValues 955808f684SSatish Balay else: 965808f684SSatish Balay setvalues = self.A.setValuesBlocked 975808f684SSatish Balay setvalues(rows, cols, vals) 985808f684SSatish Balay return rows, cols, vals 995808f684SSatish Balay 1005808f684SSatish Balay def _chk_bs(self, A, bs): 1015808f684SSatish Balay self.assertEqual(A.getBlockSize(), bs or 1) 1025808f684SSatish Balay 1035808f684SSatish Balay def _chk_array(self, A, r, c, v): 1045808f684SSatish Balay return # XXX 1055808f684SSatish Balay vals = self.A.getValues(r, c) 1065808f684SSatish Balay vals.shape = v.shape 1075808f684SSatish Balay self.assertTrue(np.allclose(vals, v)) 1085808f684SSatish Balay 1095808f684SSatish Balay 1105808f684SSatish Balay# -- Dense --------------------- 1115808f684SSatish Balay 112*6f336411SStefano Zampini 1135808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 1145808f684SSatish Balay COMM = PETSc.COMM_WORLD 1155808f684SSatish Balay GRID = 0, 0 1165808f684SSatish Balay BSIZE = None 1175808f684SSatish Balay 118*6f336411SStefano Zampini 1195808f684SSatish Balay# -- Seq Dense -- 1205808f684SSatish Balay 121*6f336411SStefano Zampini 1225808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense): 1235808f684SSatish Balay COMM = PETSc.COMM_SELF 1245808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 125*6f336411SStefano Zampini 126*6f336411SStefano Zampini 1275808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense): 1285808f684SSatish Balay GRID = 2, 3 129*6f336411SStefano Zampini 130*6f336411SStefano Zampini 1315808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense): 1325808f684SSatish Balay GRID = 4, 5 133*6f336411SStefano Zampini 134*6f336411SStefano Zampini 1355808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense): 1365808f684SSatish Balay GRID = 7, 7 137*6f336411SStefano Zampini 138*6f336411SStefano Zampini 1395808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense): 1405808f684SSatish Balay GRID = 8, 9 1415808f684SSatish Balay 142*6f336411SStefano Zampini 1435808f684SSatish Balay# -- MPI Dense -- 1445808f684SSatish Balay 145*6f336411SStefano Zampini 1465808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense): 1475808f684SSatish Balay COMM = PETSc.COMM_WORLD 1485808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 149*6f336411SStefano Zampini 150*6f336411SStefano Zampini 1515808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense): 1525808f684SSatish Balay GRID = 2, 3 153*6f336411SStefano Zampini 154*6f336411SStefano Zampini 1555808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense): 1565808f684SSatish Balay GRID = 4, 5 157*6f336411SStefano Zampini 158*6f336411SStefano Zampini 1595808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense): 1605808f684SSatish Balay GRID = 7, 7 161*6f336411SStefano Zampini 162*6f336411SStefano Zampini 1635808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense): 1645808f684SSatish Balay GRID = 8, 9 1655808f684SSatish Balay 1665808f684SSatish Balay 1675808f684SSatish Balay# -- Dense + Block --------------- 1685808f684SSatish Balay 169*6f336411SStefano Zampini 1705808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 1715808f684SSatish Balay COMM = PETSc.COMM_WORLD 1725808f684SSatish Balay GRID = 0, 0 1735808f684SSatish Balay BSIZE = 1 174*6f336411SStefano Zampini 1755808f684SSatish Balay def _preallocate(self): 1765808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 1775808f684SSatish Balay self.A.setPreallocationDense(None) 1785808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 1795808f684SSatish Balay self._chk_bs(self.A, self.BSIZE) 1805808f684SSatish Balay 181*6f336411SStefano Zampini 1825808f684SSatish Balay# -- Seq Dense + Block -- 1835808f684SSatish Balay 184*6f336411SStefano Zampini 1855808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B): 1865808f684SSatish Balay COMM = PETSc.COMM_SELF 1875808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 188*6f336411SStefano Zampini 189*6f336411SStefano Zampini 1905808f684SSatish Balay# bs = 1 1915808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B): 1925808f684SSatish Balay GRID = 2, 3 193*6f336411SStefano Zampini 194*6f336411SStefano Zampini 1955808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B): 1965808f684SSatish Balay GRID = 4, 5 197*6f336411SStefano Zampini 198*6f336411SStefano Zampini 1995808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B): 2005808f684SSatish Balay GRID = 8, 9 201*6f336411SStefano Zampini 202*6f336411SStefano Zampini 2035808f684SSatish Balay# bs = 2 2045808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 2055808f684SSatish Balay BSIZE = 2 206*6f336411SStefano Zampini 207*6f336411SStefano Zampini 2085808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 2095808f684SSatish Balay BSIZE = 2 210*6f336411SStefano Zampini 211*6f336411SStefano Zampini 2125808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 2135808f684SSatish Balay BSIZE = 2 214*6f336411SStefano Zampini 215*6f336411SStefano Zampini 2165808f684SSatish Balay# bs = 3 2175808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 2185808f684SSatish Balay BSIZE = 3 219*6f336411SStefano Zampini 220*6f336411SStefano Zampini 2215808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 2225808f684SSatish Balay BSIZE = 3 223*6f336411SStefano Zampini 224*6f336411SStefano Zampini 2255808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 2265808f684SSatish Balay BSIZE = 3 227*6f336411SStefano Zampini 228*6f336411SStefano Zampini 2295808f684SSatish Balay# bs = 4 2305808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 2315808f684SSatish Balay BSIZE = 4 232*6f336411SStefano Zampini 233*6f336411SStefano Zampini 2345808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 2355808f684SSatish Balay BSIZE = 4 236*6f336411SStefano Zampini 237*6f336411SStefano Zampini 2385808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 2395808f684SSatish Balay BSIZE = 4 240*6f336411SStefano Zampini 241*6f336411SStefano Zampini 2425808f684SSatish Balay# bs = 5 2435808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 2445808f684SSatish Balay BSIZE = 5 245*6f336411SStefano Zampini 246*6f336411SStefano Zampini 2475808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 2485808f684SSatish Balay BSIZE = 5 249*6f336411SStefano Zampini 250*6f336411SStefano Zampini 2515808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 2525808f684SSatish Balay BSIZE = 5 2535808f684SSatish Balay 2545808f684SSatish Balay 2555808f684SSatish Balay# -- MPI Dense + Block -- 2565808f684SSatish Balay 257*6f336411SStefano Zampini 2585808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B): 2595808f684SSatish Balay COMM = PETSc.COMM_WORLD 2605808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 261*6f336411SStefano Zampini 262*6f336411SStefano Zampini 2635808f684SSatish Balay# bs = 1 2645808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B): 2655808f684SSatish Balay GRID = 2, 3 266*6f336411SStefano Zampini 267*6f336411SStefano Zampini 2685808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B): 2695808f684SSatish Balay GRID = 4, 5 270*6f336411SStefano Zampini 271*6f336411SStefano Zampini 2725808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B): 2735808f684SSatish Balay GRID = 7, 7 274*6f336411SStefano Zampini 275*6f336411SStefano Zampini 2765808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B): 2775808f684SSatish Balay GRID = 8, 9 278*6f336411SStefano Zampini 279*6f336411SStefano Zampini 2805808f684SSatish Balay# bs = 2 2815808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 2825808f684SSatish Balay BSIZE = 2 283*6f336411SStefano Zampini 284*6f336411SStefano Zampini 2855808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 2865808f684SSatish Balay BSIZE = 2 287*6f336411SStefano Zampini 288*6f336411SStefano Zampini 2895808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 2905808f684SSatish Balay BSIZE = 2 291*6f336411SStefano Zampini 292*6f336411SStefano Zampini 2935808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 2945808f684SSatish Balay BSIZE = 2 295*6f336411SStefano Zampini 296*6f336411SStefano Zampini 2975808f684SSatish Balay# bs = 3 2985808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 2995808f684SSatish Balay BSIZE = 3 300*6f336411SStefano Zampini 301*6f336411SStefano Zampini 3025808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 3035808f684SSatish Balay BSIZE = 3 304*6f336411SStefano Zampini 305*6f336411SStefano Zampini 3065808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 3075808f684SSatish Balay BSIZE = 3 308*6f336411SStefano Zampini 309*6f336411SStefano Zampini 3105808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 3115808f684SSatish Balay BSIZE = 3 312*6f336411SStefano Zampini 313*6f336411SStefano Zampini 3145808f684SSatish Balay# bs = 4 3155808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 3165808f684SSatish Balay BSIZE = 4 317*6f336411SStefano Zampini 318*6f336411SStefano Zampini 3195808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 3205808f684SSatish Balay BSIZE = 4 321*6f336411SStefano Zampini 322*6f336411SStefano Zampini 3235808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 3245808f684SSatish Balay BSIZE = 4 325*6f336411SStefano Zampini 326*6f336411SStefano Zampini 3275808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 3285808f684SSatish Balay BSIZE = 4 329*6f336411SStefano Zampini 330*6f336411SStefano Zampini 3315808f684SSatish Balay# bs = 5 3325808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 3335808f684SSatish Balay BSIZE = 5 334*6f336411SStefano Zampini 335*6f336411SStefano Zampini 3365808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 3375808f684SSatish Balay BSIZE = 5 338*6f336411SStefano Zampini 339*6f336411SStefano Zampini 3405808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 3415808f684SSatish Balay BSIZE = 5 342*6f336411SStefano Zampini 343*6f336411SStefano Zampini 3445808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 3455808f684SSatish Balay BSIZE = 5 3465808f684SSatish Balay 347*6f336411SStefano Zampini 3485808f684SSatish Balay# ----- 3495808f684SSatish Balay 3505808f684SSatish Balayif __name__ == '__main__': 3515808f684SSatish Balay unittest.main() 352