15808f684SSatish Balayfrom petsc4py import PETSc 25808f684SSatish Balayimport unittest 35808f684SSatish Balay 45808f684SSatish Balayimport numpy as np 55808f684SSatish Balay 65808f684SSatish Balaydef mkdata(comm, m, N, bs): 75808f684SSatish Balay start = m * comm.rank 85808f684SSatish Balay end = start + m 95808f684SSatish Balay idt = PETSc.IntType 105808f684SSatish Balay sdt = PETSc.ScalarType 115808f684SSatish Balay rows = np.array(range(start, end), dtype=idt) 125808f684SSatish Balay cols = np.array(range(0, N), dtype=idt) 135808f684SSatish Balay vals = np.array(range(0, m*N*bs*bs), dtype=sdt) 145808f684SSatish Balay vals.shape = (-1, bs, bs) 155808f684SSatish Balay return rows, cols, vals 165808f684SSatish Balay 175808f684SSatish Balay 185808f684SSatish Balayclass BaseTestMatAnyDense(object): 195808f684SSatish Balay 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) 315808f684SSatish Balay bs = BS or 1; m, N = GM, GN; 325808f684SSatish Balay rowsz = (m*bs, None) 335808f684SSatish Balay colsz = (None, N*bs) 345808f684SSatish Balay self.A.setSizes([rowsz, colsz], BS) 355808f684SSatish Balay self.A.setType(self.TYPE) 365808f684SSatish Balay 375808f684SSatish Balay def tearDown(self): 385808f684SSatish Balay self.A.destroy() 395808f684SSatish Balay self.A = None 40*62e5d2d2SJDBetteridge PETSc.garbage_cleanup() 415808f684SSatish Balay 425808f684SSatish Balay def testSetValues(self): 435808f684SSatish Balay self._preallocate() 445808f684SSatish Balay r, c, v = self._set_values() 455808f684SSatish Balay self.A.assemble() 465808f684SSatish Balay self._chk_array(self.A, r, c, v) 475808f684SSatish Balay r, c, v = self._set_values() 485808f684SSatish Balay self.A.assemble() 495808f684SSatish Balay self._chk_array(self.A, r, c, v) 505808f684SSatish Balay 515808f684SSatish Balay def testGetDiagonalBlock(self): 525808f684SSatish Balay M, N = self.A.getSize() 535808f684SSatish Balay # only for square matrices 545808f684SSatish Balay if M != N: return 555808f684SSatish Balay self._preallocate() 565808f684SSatish Balay self._set_values() 575808f684SSatish Balay self.A.assemble() 585808f684SSatish Balay B = self.A.getDiagonalBlock() 595808f684SSatish Balay self.assertEqual(self.A.getLocalSize(), B.getSize()) 605808f684SSatish Balay B.destroy() 615808f684SSatish Balay 625808f684SSatish Balay def testCreateTranspose(self): 635808f684SSatish Balay self._preallocate() 645808f684SSatish Balay self._set_values() 655808f684SSatish Balay self.A.assemble() 665808f684SSatish Balay A = self.A 675808f684SSatish Balay AT = PETSc.Mat().createTranspose(A) 685808f684SSatish Balay x, y = A.createVecs() 695808f684SSatish Balay xt, yt = AT.createVecs() 705808f684SSatish Balay # 715808f684SSatish Balay y.setRandom() 725808f684SSatish Balay A.multTranspose(y, x) 735808f684SSatish Balay y.copy(xt) 745808f684SSatish Balay AT.mult(xt, yt) 755808f684SSatish Balay self.assertTrue(yt.equal(x)) 765808f684SSatish Balay # 775808f684SSatish Balay x.setRandom() 785808f684SSatish Balay A.mult(x, y) 795808f684SSatish Balay x.copy(yt) 805808f684SSatish Balay AT.multTranspose(yt, xt) 815808f684SSatish Balay self.assertTrue(xt.equal(y)) 825808f684SSatish Balay 835808f684SSatish Balay def _preallocate(self): 845808f684SSatish Balay self.A.setPreallocationDense(None) 855808f684SSatish Balay 865808f684SSatish Balay def _set_values(self): 875808f684SSatish Balay COMM = self.COMM 885808f684SSatish Balay GM, GN = self.GRID 895808f684SSatish Balay BS = self.BSIZE or 1 905808f684SSatish Balay rows, cols, vals = mkdata(COMM, GM, GN, BS) 915808f684SSatish Balay if not self.BSIZE: 925808f684SSatish Balay setvalues = self.A.setValues 935808f684SSatish Balay else: 945808f684SSatish Balay setvalues = self.A.setValuesBlocked 955808f684SSatish Balay setvalues(rows, cols, vals) 965808f684SSatish Balay return rows, cols, vals 975808f684SSatish Balay 985808f684SSatish Balay def _chk_bs(self, A, bs): 995808f684SSatish Balay self.assertEqual(A.getBlockSize(), bs or 1) 1005808f684SSatish Balay 1015808f684SSatish Balay def _chk_array(self, A, r, c, v): 1025808f684SSatish Balay return # XXX 1035808f684SSatish Balay vals = self.A.getValues(r, c) 1045808f684SSatish Balay vals.shape = v.shape 1055808f684SSatish Balay self.assertTrue(np.allclose(vals, v)) 1065808f684SSatish Balay 1075808f684SSatish Balay 1085808f684SSatish Balay# -- Dense --------------------- 1095808f684SSatish Balay 1105808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 1115808f684SSatish Balay COMM = PETSc.COMM_WORLD 1125808f684SSatish Balay GRID = 0, 0 1135808f684SSatish Balay BSIZE = None 1145808f684SSatish Balay 1155808f684SSatish Balay# -- Seq Dense -- 1165808f684SSatish Balay 1175808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense): 1185808f684SSatish Balay COMM = PETSc.COMM_SELF 1195808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 1205808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense): 1215808f684SSatish Balay GRID = 2, 3 1225808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense): 1235808f684SSatish Balay GRID = 4, 5 1245808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense): 1255808f684SSatish Balay GRID = 7, 7 1265808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense): 1275808f684SSatish Balay GRID = 8, 9 1285808f684SSatish Balay 1295808f684SSatish Balay# -- MPI Dense -- 1305808f684SSatish Balay 1315808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense): 1325808f684SSatish Balay COMM = PETSc.COMM_WORLD 1335808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 1345808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense): 1355808f684SSatish Balay GRID = 2, 3 1365808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense): 1375808f684SSatish Balay GRID = 4, 5 1385808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense): 1395808f684SSatish Balay GRID = 7, 7 1405808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense): 1415808f684SSatish Balay GRID = 8, 9 1425808f684SSatish Balay 1435808f684SSatish Balay 1445808f684SSatish Balay# -- Dense + Block --------------- 1455808f684SSatish Balay 1465808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 1475808f684SSatish Balay COMM = PETSc.COMM_WORLD 1485808f684SSatish Balay GRID = 0, 0 1495808f684SSatish Balay BSIZE = 1 1505808f684SSatish Balay def _preallocate(self): 1515808f684SSatish Balay #self.A.setBlockSize(self.BSIZE) 1525808f684SSatish Balay self.A.setPreallocationDense(None) 1535808f684SSatish Balay #self.A.setBlockSize(self.BSIZE) 1545808f684SSatish Balay self._chk_bs(self.A, self.BSIZE) 1555808f684SSatish Balay 1565808f684SSatish Balay# -- Seq Dense + Block -- 1575808f684SSatish Balay 1585808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B): 1595808f684SSatish Balay COMM = PETSc.COMM_SELF 1605808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 1615808f684SSatish Balay# bs = 1 1625808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B): 1635808f684SSatish Balay GRID = 2, 3 1645808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B): 1655808f684SSatish Balay GRID = 4, 5 1665808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B): 1675808f684SSatish Balay GRID = 8, 9 1685808f684SSatish Balay# bs = 2 1695808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 1705808f684SSatish Balay BSIZE = 2 1715808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 1725808f684SSatish Balay BSIZE = 2 1735808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 1745808f684SSatish Balay BSIZE = 2 1755808f684SSatish Balay# bs = 3 1765808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 1775808f684SSatish Balay BSIZE = 3 1785808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 1795808f684SSatish Balay BSIZE = 3 1805808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 1815808f684SSatish Balay BSIZE = 3 1825808f684SSatish Balay# bs = 4 1835808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 1845808f684SSatish Balay BSIZE = 4 1855808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 1865808f684SSatish Balay BSIZE = 4 1875808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 1885808f684SSatish Balay BSIZE = 4 1895808f684SSatish Balay# bs = 5 1905808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 1915808f684SSatish Balay BSIZE = 5 1925808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 1935808f684SSatish Balay BSIZE = 5 1945808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 1955808f684SSatish Balay BSIZE = 5 1965808f684SSatish Balay 1975808f684SSatish Balay 1985808f684SSatish Balay# -- MPI Dense + Block -- 1995808f684SSatish Balay 2005808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B): 2015808f684SSatish Balay COMM = PETSc.COMM_WORLD 2025808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 2035808f684SSatish Balay# bs = 1 2045808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B): 2055808f684SSatish Balay GRID = 2, 3 2065808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B): 2075808f684SSatish Balay GRID = 4, 5 2085808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B): 2095808f684SSatish Balay GRID = 7, 7 2105808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B): 2115808f684SSatish Balay GRID = 8, 9 2125808f684SSatish Balay# bs = 2 2135808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 2145808f684SSatish Balay BSIZE = 2 2155808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 2165808f684SSatish Balay BSIZE = 2 2175808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 2185808f684SSatish Balay BSIZE = 2 2195808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 2205808f684SSatish Balay BSIZE = 2 2215808f684SSatish Balay# bs = 3 2225808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 2235808f684SSatish Balay BSIZE = 3 2245808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 2255808f684SSatish Balay BSIZE = 3 2265808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 2275808f684SSatish Balay BSIZE = 3 2285808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 2295808f684SSatish Balay BSIZE = 3 2305808f684SSatish Balay# bs = 4 2315808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 2325808f684SSatish Balay BSIZE = 4 2335808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 2345808f684SSatish Balay BSIZE = 4 2355808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 2365808f684SSatish Balay BSIZE = 4 2375808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 2385808f684SSatish Balay BSIZE = 4 2395808f684SSatish Balay# bs = 5 2405808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 2415808f684SSatish Balay BSIZE = 5 2425808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 2435808f684SSatish Balay BSIZE = 5 2445808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 2455808f684SSatish Balay BSIZE = 5 2465808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 2475808f684SSatish Balay BSIZE = 5 2485808f684SSatish Balay 2495808f684SSatish Balay# ----- 2505808f684SSatish Balay 2515808f684SSatish Balayif __name__ == '__main__': 2525808f684SSatish Balay unittest.main() 253