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 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)) 84*f08798c4SPaul T. Kühner # 85*f08798c4SPaul T. Kühner underlyingA = AT.getTransposeMat() 86*f08798c4SPaul T. Kühner self.assertTrue(underlyingA.equal(A)) 875808f684SSatish Balay 885808f684SSatish Balay def _preallocate(self): 895808f684SSatish Balay self.A.setPreallocationDense(None) 905808f684SSatish Balay 915808f684SSatish Balay def _set_values(self): 925808f684SSatish Balay COMM = self.COMM 935808f684SSatish Balay GM, GN = self.GRID 945808f684SSatish Balay BS = self.BSIZE or 1 955808f684SSatish Balay rows, cols, vals = mkdata(COMM, GM, GN, BS) 965808f684SSatish Balay if not self.BSIZE: 975808f684SSatish Balay setvalues = self.A.setValues 985808f684SSatish Balay else: 995808f684SSatish Balay setvalues = self.A.setValuesBlocked 1005808f684SSatish Balay setvalues(rows, cols, vals) 1015808f684SSatish Balay return rows, cols, vals 1025808f684SSatish Balay 1035808f684SSatish Balay def _chk_bs(self, A, bs): 1045808f684SSatish Balay self.assertEqual(A.getBlockSize(), bs or 1) 1055808f684SSatish Balay 1065808f684SSatish Balay def _chk_array(self, A, r, c, v): 1075808f684SSatish Balay return # XXX 1085808f684SSatish Balay vals = self.A.getValues(r, c) 1095808f684SSatish Balay vals.shape = v.shape 1105808f684SSatish Balay self.assertTrue(np.allclose(vals, v)) 1115808f684SSatish Balay 1125808f684SSatish Balay 1135808f684SSatish Balay# -- Dense --------------------- 1145808f684SSatish Balay 1156f336411SStefano Zampini 1165808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 1175808f684SSatish Balay COMM = PETSc.COMM_WORLD 1185808f684SSatish Balay GRID = 0, 0 1195808f684SSatish Balay BSIZE = None 1205808f684SSatish Balay 1216f336411SStefano Zampini 1225808f684SSatish Balay# -- Seq Dense -- 1235808f684SSatish Balay 1246f336411SStefano Zampini 1255808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense): 1265808f684SSatish Balay COMM = PETSc.COMM_SELF 1275808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 1286f336411SStefano Zampini 1296f336411SStefano Zampini 1305808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense): 1315808f684SSatish Balay GRID = 2, 3 1326f336411SStefano Zampini 1336f336411SStefano Zampini 1345808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense): 1355808f684SSatish Balay GRID = 4, 5 1366f336411SStefano Zampini 1376f336411SStefano Zampini 1385808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense): 1395808f684SSatish Balay GRID = 7, 7 1406f336411SStefano Zampini 1416f336411SStefano Zampini 1425808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense): 1435808f684SSatish Balay GRID = 8, 9 1445808f684SSatish Balay 1456f336411SStefano Zampini 1465808f684SSatish Balay# -- MPI Dense -- 1475808f684SSatish Balay 1486f336411SStefano Zampini 1495808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense): 1505808f684SSatish Balay COMM = PETSc.COMM_WORLD 1515808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 1526f336411SStefano Zampini 1536f336411SStefano Zampini 1545808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense): 1555808f684SSatish Balay GRID = 2, 3 1566f336411SStefano Zampini 1576f336411SStefano Zampini 1585808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense): 1595808f684SSatish Balay GRID = 4, 5 1606f336411SStefano Zampini 1616f336411SStefano Zampini 1625808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense): 1635808f684SSatish Balay GRID = 7, 7 1646f336411SStefano Zampini 1656f336411SStefano Zampini 1665808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense): 1675808f684SSatish Balay GRID = 8, 9 1685808f684SSatish Balay 1695808f684SSatish Balay 1705808f684SSatish Balay# -- Dense + Block --------------- 1715808f684SSatish Balay 1726f336411SStefano Zampini 1735808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 1745808f684SSatish Balay COMM = PETSc.COMM_WORLD 1755808f684SSatish Balay GRID = 0, 0 1765808f684SSatish Balay BSIZE = 1 1776f336411SStefano Zampini 1785808f684SSatish Balay def _preallocate(self): 1795808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 1805808f684SSatish Balay self.A.setPreallocationDense(None) 1815808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 1825808f684SSatish Balay self._chk_bs(self.A, self.BSIZE) 1835808f684SSatish Balay 1846f336411SStefano Zampini 1855808f684SSatish Balay# -- Seq Dense + Block -- 1865808f684SSatish Balay 1876f336411SStefano Zampini 1885808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B): 1895808f684SSatish Balay COMM = PETSc.COMM_SELF 1905808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 1916f336411SStefano Zampini 1926f336411SStefano Zampini 1935808f684SSatish Balay# bs = 1 1945808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B): 1955808f684SSatish Balay GRID = 2, 3 1966f336411SStefano Zampini 1976f336411SStefano Zampini 1985808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B): 1995808f684SSatish Balay GRID = 4, 5 2006f336411SStefano Zampini 2016f336411SStefano Zampini 2025808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B): 2035808f684SSatish Balay GRID = 8, 9 2046f336411SStefano Zampini 2056f336411SStefano Zampini 2065808f684SSatish Balay# bs = 2 2075808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 2085808f684SSatish Balay BSIZE = 2 2096f336411SStefano Zampini 2106f336411SStefano Zampini 2115808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 2125808f684SSatish Balay BSIZE = 2 2136f336411SStefano Zampini 2146f336411SStefano Zampini 2155808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 2165808f684SSatish Balay BSIZE = 2 2176f336411SStefano Zampini 2186f336411SStefano Zampini 2195808f684SSatish Balay# bs = 3 2205808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 2215808f684SSatish Balay BSIZE = 3 2226f336411SStefano Zampini 2236f336411SStefano Zampini 2245808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 2255808f684SSatish Balay BSIZE = 3 2266f336411SStefano Zampini 2276f336411SStefano Zampini 2285808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 2295808f684SSatish Balay BSIZE = 3 2306f336411SStefano Zampini 2316f336411SStefano Zampini 2325808f684SSatish Balay# bs = 4 2335808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 2345808f684SSatish Balay BSIZE = 4 2356f336411SStefano Zampini 2366f336411SStefano Zampini 2375808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 2385808f684SSatish Balay BSIZE = 4 2396f336411SStefano Zampini 2406f336411SStefano Zampini 2415808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 2425808f684SSatish Balay BSIZE = 4 2436f336411SStefano Zampini 2446f336411SStefano Zampini 2455808f684SSatish Balay# bs = 5 2465808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 2475808f684SSatish Balay BSIZE = 5 2486f336411SStefano Zampini 2496f336411SStefano Zampini 2505808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 2515808f684SSatish Balay BSIZE = 5 2526f336411SStefano Zampini 2536f336411SStefano Zampini 2545808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 2555808f684SSatish Balay BSIZE = 5 2565808f684SSatish Balay 2575808f684SSatish Balay 2585808f684SSatish Balay# -- MPI Dense + Block -- 2595808f684SSatish Balay 2606f336411SStefano Zampini 2615808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B): 2625808f684SSatish Balay COMM = PETSc.COMM_WORLD 2635808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 2646f336411SStefano Zampini 2656f336411SStefano Zampini 2665808f684SSatish Balay# bs = 1 2675808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B): 2685808f684SSatish Balay GRID = 2, 3 2696f336411SStefano Zampini 2706f336411SStefano Zampini 2715808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B): 2725808f684SSatish Balay GRID = 4, 5 2736f336411SStefano Zampini 2746f336411SStefano Zampini 2755808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B): 2765808f684SSatish Balay GRID = 7, 7 2776f336411SStefano Zampini 2786f336411SStefano Zampini 2795808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B): 2805808f684SSatish Balay GRID = 8, 9 2816f336411SStefano Zampini 2826f336411SStefano Zampini 2835808f684SSatish Balay# bs = 2 2845808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 2855808f684SSatish Balay BSIZE = 2 2866f336411SStefano Zampini 2876f336411SStefano Zampini 2885808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 2895808f684SSatish Balay BSIZE = 2 2906f336411SStefano Zampini 2916f336411SStefano Zampini 2925808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 2935808f684SSatish Balay BSIZE = 2 2946f336411SStefano Zampini 2956f336411SStefano Zampini 2965808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 2975808f684SSatish Balay BSIZE = 2 2986f336411SStefano Zampini 2996f336411SStefano Zampini 3005808f684SSatish Balay# bs = 3 3015808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 3025808f684SSatish Balay BSIZE = 3 3036f336411SStefano Zampini 3046f336411SStefano Zampini 3055808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 3065808f684SSatish Balay BSIZE = 3 3076f336411SStefano Zampini 3086f336411SStefano Zampini 3095808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 3105808f684SSatish Balay BSIZE = 3 3116f336411SStefano Zampini 3126f336411SStefano Zampini 3135808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 3145808f684SSatish Balay BSIZE = 3 3156f336411SStefano Zampini 3166f336411SStefano Zampini 3175808f684SSatish Balay# bs = 4 3185808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 3195808f684SSatish Balay BSIZE = 4 3206f336411SStefano Zampini 3216f336411SStefano Zampini 3225808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 3235808f684SSatish Balay BSIZE = 4 3246f336411SStefano Zampini 3256f336411SStefano Zampini 3265808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 3275808f684SSatish Balay BSIZE = 4 3286f336411SStefano Zampini 3296f336411SStefano Zampini 3305808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 3315808f684SSatish Balay BSIZE = 4 3326f336411SStefano Zampini 3336f336411SStefano Zampini 3345808f684SSatish Balay# bs = 5 3355808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 3365808f684SSatish Balay BSIZE = 5 3376f336411SStefano Zampini 3386f336411SStefano Zampini 3395808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 3405808f684SSatish Balay BSIZE = 5 3416f336411SStefano Zampini 3426f336411SStefano Zampini 3435808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 3445808f684SSatish Balay BSIZE = 5 3456f336411SStefano Zampini 3466f336411SStefano Zampini 3475808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 3485808f684SSatish Balay BSIZE = 5 3495808f684SSatish Balay 3506f336411SStefano Zampini 3515808f684SSatish Balay# ----- 3525808f684SSatish Balay 3535808f684SSatish Balayif __name__ == '__main__': 3545808f684SSatish Balay unittest.main() 355