15808f684SSatish Balayfrom petsc4py import PETSc 25808f684SSatish Balayimport unittest 35808f684SSatish Balay 45808f684SSatish Balayimport numpy as np 55808f684SSatish Balay 66f336411SStefano 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) 136f336411SStefano Zampini cols = np.array(range(N), dtype=idt) 146f336411SStefano 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 196f336411SStefano 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) 316f336411SStefano Zampini bs = BS or 1 326f336411SStefano 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 556f336411SStefano Zampini if M != N: 566f336411SStefano 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 64*dbb0007bSStefano Zampini def testSubMatrix(self): 65*dbb0007bSStefano Zampini self._preallocate() 66*dbb0007bSStefano Zampini self._set_values() 67*dbb0007bSStefano Zampini self.A.assemble() 68*dbb0007bSStefano Zampini B = self.A.getDenseSubMatrix() 69*dbb0007bSStefano Zampini X = B.copy() 70*dbb0007bSStefano Zampini self.A.restoreDenseSubMatrix(B) 71*dbb0007bSStefano Zampini self.assertTrue(self.A.equal(X)) 72*dbb0007bSStefano Zampini X.destroy() 73*dbb0007bSStefano Zampini M, N = self.A.getSize() 74*dbb0007bSStefano Zampini rst = min(1,M) 75*dbb0007bSStefano Zampini cst = min(2,N) 76*dbb0007bSStefano Zampini ren = min(3,M) 77*dbb0007bSStefano Zampini cen = min(5,N) 78*dbb0007bSStefano Zampini B = self.A.getDenseSubMatrix(rst, ren, cst, cen) 79*dbb0007bSStefano Zampini self.assertTrue(B.getSize(), (ren - rst, cen - cst)) 80*dbb0007bSStefano Zampini self.A.restoreDenseSubMatrix(B) 81*dbb0007bSStefano Zampini self.assertFalse(B) 82*dbb0007bSStefano Zampini B = self.A.getDenseSubMatrix(cbegin=cst, rbegin=rst, cend=cen, rend=ren) 83*dbb0007bSStefano Zampini self.assertTrue(B.getSize(), (ren - rst, cen - cst)) 84*dbb0007bSStefano Zampini self.A.restoreDenseSubMatrix(B) 85*dbb0007bSStefano Zampini self.assertFalse(B) 86*dbb0007bSStefano Zampini 875808f684SSatish Balay def testCreateTranspose(self): 885808f684SSatish Balay self._preallocate() 895808f684SSatish Balay self._set_values() 905808f684SSatish Balay self.A.assemble() 915808f684SSatish Balay A = self.A 925808f684SSatish Balay AT = PETSc.Mat().createTranspose(A) 935808f684SSatish Balay x, y = A.createVecs() 945808f684SSatish Balay xt, yt = AT.createVecs() 955808f684SSatish Balay # 965808f684SSatish Balay y.setRandom() 975808f684SSatish Balay A.multTranspose(y, x) 985808f684SSatish Balay y.copy(xt) 995808f684SSatish Balay AT.mult(xt, yt) 1005808f684SSatish Balay self.assertTrue(yt.equal(x)) 1015808f684SSatish Balay # 1025808f684SSatish Balay x.setRandom() 1035808f684SSatish Balay A.mult(x, y) 1045808f684SSatish Balay x.copy(yt) 1055808f684SSatish Balay AT.multTranspose(yt, xt) 1065808f684SSatish Balay self.assertTrue(xt.equal(y)) 107f08798c4SPaul T. Kühner # 108f08798c4SPaul T. Kühner underlyingA = AT.getTransposeMat() 109f08798c4SPaul T. Kühner self.assertTrue(underlyingA.equal(A)) 1105808f684SSatish Balay 1115808f684SSatish Balay def _preallocate(self): 1125808f684SSatish Balay self.A.setPreallocationDense(None) 1135808f684SSatish Balay 1145808f684SSatish Balay def _set_values(self): 1155808f684SSatish Balay COMM = self.COMM 1165808f684SSatish Balay GM, GN = self.GRID 1175808f684SSatish Balay BS = self.BSIZE or 1 1185808f684SSatish Balay rows, cols, vals = mkdata(COMM, GM, GN, BS) 1195808f684SSatish Balay if not self.BSIZE: 1205808f684SSatish Balay setvalues = self.A.setValues 1215808f684SSatish Balay else: 1225808f684SSatish Balay setvalues = self.A.setValuesBlocked 1235808f684SSatish Balay setvalues(rows, cols, vals) 1245808f684SSatish Balay return rows, cols, vals 1255808f684SSatish Balay 1265808f684SSatish Balay def _chk_bs(self, A, bs): 1275808f684SSatish Balay self.assertEqual(A.getBlockSize(), bs or 1) 1285808f684SSatish Balay 1295808f684SSatish Balay def _chk_array(self, A, r, c, v): 1305808f684SSatish Balay return # XXX 1315808f684SSatish Balay vals = self.A.getValues(r, c) 1325808f684SSatish Balay vals.shape = v.shape 1335808f684SSatish Balay self.assertTrue(np.allclose(vals, v)) 1345808f684SSatish Balay 1355808f684SSatish Balay 1365808f684SSatish Balay# -- Dense --------------------- 1375808f684SSatish Balay 1386f336411SStefano Zampini 1395808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 1405808f684SSatish Balay COMM = PETSc.COMM_WORLD 1415808f684SSatish Balay GRID = 0, 0 1425808f684SSatish Balay BSIZE = None 1435808f684SSatish Balay 1446f336411SStefano Zampini 1455808f684SSatish Balay# -- Seq Dense -- 1465808f684SSatish Balay 1476f336411SStefano Zampini 1485808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense): 1495808f684SSatish Balay COMM = PETSc.COMM_SELF 1505808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 1516f336411SStefano Zampini 1526f336411SStefano Zampini 1535808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense): 1545808f684SSatish Balay GRID = 2, 3 1556f336411SStefano Zampini 1566f336411SStefano Zampini 1575808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense): 1585808f684SSatish Balay GRID = 4, 5 1596f336411SStefano Zampini 1606f336411SStefano Zampini 1615808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense): 1625808f684SSatish Balay GRID = 7, 7 1636f336411SStefano Zampini 1646f336411SStefano Zampini 1655808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense): 1665808f684SSatish Balay GRID = 8, 9 1675808f684SSatish Balay 1686f336411SStefano Zampini 1695808f684SSatish Balay# -- MPI Dense -- 1705808f684SSatish Balay 1716f336411SStefano Zampini 1725808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense): 1735808f684SSatish Balay COMM = PETSc.COMM_WORLD 1745808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 1756f336411SStefano Zampini 1766f336411SStefano Zampini 1775808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense): 1785808f684SSatish Balay GRID = 2, 3 1796f336411SStefano Zampini 1806f336411SStefano Zampini 1815808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense): 1825808f684SSatish Balay GRID = 4, 5 1836f336411SStefano Zampini 1846f336411SStefano Zampini 1855808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense): 1865808f684SSatish Balay GRID = 7, 7 1876f336411SStefano Zampini 1886f336411SStefano Zampini 1895808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense): 1905808f684SSatish Balay GRID = 8, 9 1915808f684SSatish Balay 1925808f684SSatish Balay 1935808f684SSatish Balay# -- Dense + Block --------------- 1945808f684SSatish Balay 1956f336411SStefano Zampini 1965808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 1975808f684SSatish Balay COMM = PETSc.COMM_WORLD 1985808f684SSatish Balay GRID = 0, 0 1995808f684SSatish Balay BSIZE = 1 2006f336411SStefano Zampini 2015808f684SSatish Balay def _preallocate(self): 2025808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 2035808f684SSatish Balay self.A.setPreallocationDense(None) 2045808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 2055808f684SSatish Balay self._chk_bs(self.A, self.BSIZE) 2065808f684SSatish Balay 2076f336411SStefano Zampini 2085808f684SSatish Balay# -- Seq Dense + Block -- 2095808f684SSatish Balay 2106f336411SStefano Zampini 2115808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B): 2125808f684SSatish Balay COMM = PETSc.COMM_SELF 2135808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 2146f336411SStefano Zampini 2156f336411SStefano Zampini 2165808f684SSatish Balay# bs = 1 2175808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B): 2185808f684SSatish Balay GRID = 2, 3 2196f336411SStefano Zampini 2206f336411SStefano Zampini 2215808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B): 2225808f684SSatish Balay GRID = 4, 5 2236f336411SStefano Zampini 2246f336411SStefano Zampini 2255808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B): 2265808f684SSatish Balay GRID = 8, 9 2276f336411SStefano Zampini 2286f336411SStefano Zampini 2295808f684SSatish Balay# bs = 2 2305808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 2315808f684SSatish Balay BSIZE = 2 2326f336411SStefano Zampini 2336f336411SStefano Zampini 2345808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 2355808f684SSatish Balay BSIZE = 2 2366f336411SStefano Zampini 2376f336411SStefano Zampini 2385808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 2395808f684SSatish Balay BSIZE = 2 2406f336411SStefano Zampini 2416f336411SStefano Zampini 2425808f684SSatish Balay# bs = 3 2435808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 2445808f684SSatish Balay BSIZE = 3 2456f336411SStefano Zampini 2466f336411SStefano Zampini 2475808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 2485808f684SSatish Balay BSIZE = 3 2496f336411SStefano Zampini 2506f336411SStefano Zampini 2515808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 2525808f684SSatish Balay BSIZE = 3 2536f336411SStefano Zampini 2546f336411SStefano Zampini 2555808f684SSatish Balay# bs = 4 2565808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 2575808f684SSatish Balay BSIZE = 4 2586f336411SStefano Zampini 2596f336411SStefano Zampini 2605808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 2615808f684SSatish Balay BSIZE = 4 2626f336411SStefano Zampini 2636f336411SStefano Zampini 2645808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 2655808f684SSatish Balay BSIZE = 4 2666f336411SStefano Zampini 2676f336411SStefano Zampini 2685808f684SSatish Balay# bs = 5 2695808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 2705808f684SSatish Balay BSIZE = 5 2716f336411SStefano Zampini 2726f336411SStefano Zampini 2735808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 2745808f684SSatish Balay BSIZE = 5 2756f336411SStefano Zampini 2766f336411SStefano Zampini 2775808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 2785808f684SSatish Balay BSIZE = 5 2795808f684SSatish Balay 2805808f684SSatish Balay 2815808f684SSatish Balay# -- MPI Dense + Block -- 2825808f684SSatish Balay 2836f336411SStefano Zampini 2845808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B): 2855808f684SSatish Balay COMM = PETSc.COMM_WORLD 2865808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 2876f336411SStefano Zampini 2886f336411SStefano Zampini 2895808f684SSatish Balay# bs = 1 2905808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B): 2915808f684SSatish Balay GRID = 2, 3 2926f336411SStefano Zampini 2936f336411SStefano Zampini 2945808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B): 2955808f684SSatish Balay GRID = 4, 5 2966f336411SStefano Zampini 2976f336411SStefano Zampini 2985808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B): 2995808f684SSatish Balay GRID = 7, 7 3006f336411SStefano Zampini 3016f336411SStefano Zampini 3025808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B): 3035808f684SSatish Balay GRID = 8, 9 3046f336411SStefano Zampini 3056f336411SStefano Zampini 3065808f684SSatish Balay# bs = 2 3075808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 3085808f684SSatish Balay BSIZE = 2 3096f336411SStefano Zampini 3106f336411SStefano Zampini 3115808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 3125808f684SSatish Balay BSIZE = 2 3136f336411SStefano Zampini 3146f336411SStefano Zampini 3155808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 3165808f684SSatish Balay BSIZE = 2 3176f336411SStefano Zampini 3186f336411SStefano Zampini 3195808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 3205808f684SSatish Balay BSIZE = 2 3216f336411SStefano Zampini 3226f336411SStefano Zampini 3235808f684SSatish Balay# bs = 3 3245808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 3255808f684SSatish Balay BSIZE = 3 3266f336411SStefano Zampini 3276f336411SStefano Zampini 3285808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 3295808f684SSatish Balay BSIZE = 3 3306f336411SStefano Zampini 3316f336411SStefano Zampini 3325808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 3335808f684SSatish Balay BSIZE = 3 3346f336411SStefano Zampini 3356f336411SStefano Zampini 3365808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 3375808f684SSatish Balay BSIZE = 3 3386f336411SStefano Zampini 3396f336411SStefano Zampini 3405808f684SSatish Balay# bs = 4 3415808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 3425808f684SSatish Balay BSIZE = 4 3436f336411SStefano Zampini 3446f336411SStefano Zampini 3455808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 3465808f684SSatish Balay BSIZE = 4 3476f336411SStefano Zampini 3486f336411SStefano Zampini 3495808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 3505808f684SSatish Balay BSIZE = 4 3516f336411SStefano Zampini 3526f336411SStefano Zampini 3535808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 3545808f684SSatish Balay BSIZE = 4 3556f336411SStefano Zampini 3566f336411SStefano Zampini 3575808f684SSatish Balay# bs = 5 3585808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 3595808f684SSatish Balay BSIZE = 5 3606f336411SStefano Zampini 3616f336411SStefano Zampini 3625808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 3635808f684SSatish Balay BSIZE = 5 3646f336411SStefano Zampini 3656f336411SStefano Zampini 3665808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 3675808f684SSatish Balay BSIZE = 5 3686f336411SStefano Zampini 3696f336411SStefano Zampini 3705808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 3715808f684SSatish Balay BSIZE = 5 3725808f684SSatish Balay 3736f336411SStefano Zampini 3745808f684SSatish Balay# ----- 3755808f684SSatish Balay 3765808f684SSatish Balayif __name__ == '__main__': 3775808f684SSatish Balay unittest.main() 378