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 64dbb0007bSStefano Zampini def testSubMatrix(self): 65dbb0007bSStefano Zampini self._preallocate() 66dbb0007bSStefano Zampini self._set_values() 67dbb0007bSStefano Zampini self.A.assemble() 68dbb0007bSStefano Zampini B = self.A.getDenseSubMatrix() 69dbb0007bSStefano Zampini X = B.copy() 70dbb0007bSStefano Zampini self.A.restoreDenseSubMatrix(B) 71dbb0007bSStefano Zampini self.assertTrue(self.A.equal(X)) 72dbb0007bSStefano Zampini X.destroy() 73dbb0007bSStefano Zampini M, N = self.A.getSize() 74dbb0007bSStefano Zampini rst = min(1,M) 75dbb0007bSStefano Zampini cst = min(2,N) 76dbb0007bSStefano Zampini ren = min(3,M) 77dbb0007bSStefano Zampini cen = min(5,N) 78dbb0007bSStefano Zampini B = self.A.getDenseSubMatrix(rst, ren, cst, cen) 79dbb0007bSStefano Zampini self.assertTrue(B.getSize(), (ren - rst, cen - cst)) 80dbb0007bSStefano Zampini self.A.restoreDenseSubMatrix(B) 81dbb0007bSStefano Zampini self.assertFalse(B) 82dbb0007bSStefano Zampini B = self.A.getDenseSubMatrix(cbegin=cst, rbegin=rst, cend=cen, rend=ren) 83dbb0007bSStefano Zampini self.assertTrue(B.getSize(), (ren - rst, cen - cst)) 84dbb0007bSStefano Zampini self.A.restoreDenseSubMatrix(B) 85dbb0007bSStefano Zampini self.assertFalse(B) 86dbb0007bSStefano Zampini 87*2f3678a4SStefano Zampini def testColumnVec(self): 88*2f3678a4SStefano Zampini self._preallocate() 89*2f3678a4SStefano Zampini self._set_values() 90*2f3678a4SStefano Zampini self.A.assemble() 91*2f3678a4SStefano Zampini x = self.A.createVecLeft() 92*2f3678a4SStefano Zampini x.setRandom() 93*2f3678a4SStefano Zampini for i in range(self.A.getSize()[1]): 94*2f3678a4SStefano Zampini c = self.A.getDenseColumnVec(i) 95*2f3678a4SStefano Zampini x.copy(c) 96*2f3678a4SStefano Zampini self.A.restoreDenseColumnVec(i, V=c) 97*2f3678a4SStefano Zampini self.assertFalse(c) 98*2f3678a4SStefano Zampini c = self.A.getDenseColumnVec(i,'r') 99*2f3678a4SStefano Zampini self.assertTrue(x.equal(c)) 100*2f3678a4SStefano Zampini self.A.restoreDenseColumnVec(i,'r', c) 101*2f3678a4SStefano Zampini self.assertFalse(c) 102*2f3678a4SStefano Zampini c = self.A.getDenseColumnVec(i,'w') 103*2f3678a4SStefano Zampini c.set(0) 104*2f3678a4SStefano Zampini self.A.restoreDenseColumnVec(i,'w', c) 105*2f3678a4SStefano Zampini self.assertFalse(c) 106*2f3678a4SStefano Zampini if i > 0: 107*2f3678a4SStefano Zampini c = self.A.getDenseColumnVec(i-1, mode='r') 108*2f3678a4SStefano Zampini self.assertEqual(c.norm(), 0) 109*2f3678a4SStefano Zampini self.A.restoreDenseColumnVec(i-1, V=c, mode='r') 110*2f3678a4SStefano Zampini self.assertFalse(c) 111*2f3678a4SStefano Zampini x.destroy() 112*2f3678a4SStefano Zampini 1135808f684SSatish Balay def testCreateTranspose(self): 1145808f684SSatish Balay self._preallocate() 1155808f684SSatish Balay self._set_values() 1165808f684SSatish Balay self.A.assemble() 1175808f684SSatish Balay A = self.A 1185808f684SSatish Balay AT = PETSc.Mat().createTranspose(A) 1195808f684SSatish Balay x, y = A.createVecs() 1205808f684SSatish Balay xt, yt = AT.createVecs() 1215808f684SSatish Balay # 1225808f684SSatish Balay y.setRandom() 1235808f684SSatish Balay A.multTranspose(y, x) 1245808f684SSatish Balay y.copy(xt) 1255808f684SSatish Balay AT.mult(xt, yt) 1265808f684SSatish Balay self.assertTrue(yt.equal(x)) 1275808f684SSatish Balay # 1285808f684SSatish Balay x.setRandom() 1295808f684SSatish Balay A.mult(x, y) 1305808f684SSatish Balay x.copy(yt) 1315808f684SSatish Balay AT.multTranspose(yt, xt) 1325808f684SSatish Balay self.assertTrue(xt.equal(y)) 133f08798c4SPaul T. Kühner # 134f08798c4SPaul T. Kühner underlyingA = AT.getTransposeMat() 135f08798c4SPaul T. Kühner self.assertTrue(underlyingA.equal(A)) 1365808f684SSatish Balay 1375808f684SSatish Balay def _preallocate(self): 1385808f684SSatish Balay self.A.setPreallocationDense(None) 1395808f684SSatish Balay 1405808f684SSatish Balay def _set_values(self): 1415808f684SSatish Balay COMM = self.COMM 1425808f684SSatish Balay GM, GN = self.GRID 1435808f684SSatish Balay BS = self.BSIZE or 1 1445808f684SSatish Balay rows, cols, vals = mkdata(COMM, GM, GN, BS) 1455808f684SSatish Balay if not self.BSIZE: 1465808f684SSatish Balay setvalues = self.A.setValues 1475808f684SSatish Balay else: 1485808f684SSatish Balay setvalues = self.A.setValuesBlocked 1495808f684SSatish Balay setvalues(rows, cols, vals) 1505808f684SSatish Balay return rows, cols, vals 1515808f684SSatish Balay 1525808f684SSatish Balay def _chk_bs(self, A, bs): 1535808f684SSatish Balay self.assertEqual(A.getBlockSize(), bs or 1) 1545808f684SSatish Balay 1555808f684SSatish Balay def _chk_array(self, A, r, c, v): 1565808f684SSatish Balay return # XXX 1575808f684SSatish Balay vals = self.A.getValues(r, c) 1585808f684SSatish Balay vals.shape = v.shape 1595808f684SSatish Balay self.assertTrue(np.allclose(vals, v)) 1605808f684SSatish Balay 1615808f684SSatish Balay 1625808f684SSatish Balay# -- Dense --------------------- 1635808f684SSatish Balay 1646f336411SStefano Zampini 1655808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 1665808f684SSatish Balay COMM = PETSc.COMM_WORLD 1675808f684SSatish Balay GRID = 0, 0 1685808f684SSatish Balay BSIZE = None 1695808f684SSatish Balay 1706f336411SStefano Zampini 1715808f684SSatish Balay# -- Seq Dense -- 1725808f684SSatish Balay 1736f336411SStefano Zampini 1745808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense): 1755808f684SSatish Balay COMM = PETSc.COMM_SELF 1765808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 1776f336411SStefano Zampini 1786f336411SStefano Zampini 1795808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense): 1805808f684SSatish Balay GRID = 2, 3 1816f336411SStefano Zampini 1826f336411SStefano Zampini 1835808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense): 1845808f684SSatish Balay GRID = 4, 5 1856f336411SStefano Zampini 1866f336411SStefano Zampini 1875808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense): 1885808f684SSatish Balay GRID = 7, 7 1896f336411SStefano Zampini 1906f336411SStefano Zampini 1915808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense): 1925808f684SSatish Balay GRID = 8, 9 1935808f684SSatish Balay 1946f336411SStefano Zampini 1955808f684SSatish Balay# -- MPI Dense -- 1965808f684SSatish Balay 1976f336411SStefano Zampini 1985808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense): 1995808f684SSatish Balay COMM = PETSc.COMM_WORLD 2005808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 2016f336411SStefano Zampini 2026f336411SStefano Zampini 2035808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense): 2045808f684SSatish Balay GRID = 2, 3 2056f336411SStefano Zampini 2066f336411SStefano Zampini 2075808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense): 2085808f684SSatish Balay GRID = 4, 5 2096f336411SStefano Zampini 2106f336411SStefano Zampini 2115808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense): 2125808f684SSatish Balay GRID = 7, 7 2136f336411SStefano Zampini 2146f336411SStefano Zampini 2155808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense): 2165808f684SSatish Balay GRID = 8, 9 2175808f684SSatish Balay 2185808f684SSatish Balay 2195808f684SSatish Balay# -- Dense + Block --------------- 2205808f684SSatish Balay 2216f336411SStefano Zampini 2225808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 2235808f684SSatish Balay COMM = PETSc.COMM_WORLD 2245808f684SSatish Balay GRID = 0, 0 2255808f684SSatish Balay BSIZE = 1 2266f336411SStefano Zampini 2275808f684SSatish Balay def _preallocate(self): 2285808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 2295808f684SSatish Balay self.A.setPreallocationDense(None) 2305808f684SSatish Balay # self.A.setBlockSize(self.BSIZE) 2315808f684SSatish Balay self._chk_bs(self.A, self.BSIZE) 2325808f684SSatish Balay 2336f336411SStefano Zampini 2345808f684SSatish Balay# -- Seq Dense + Block -- 2355808f684SSatish Balay 2366f336411SStefano Zampini 2375808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B): 2385808f684SSatish Balay COMM = PETSc.COMM_SELF 2395808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 2406f336411SStefano Zampini 2416f336411SStefano Zampini 2425808f684SSatish Balay# bs = 1 2435808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B): 2445808f684SSatish Balay GRID = 2, 3 2456f336411SStefano Zampini 2466f336411SStefano Zampini 2475808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B): 2485808f684SSatish Balay GRID = 4, 5 2496f336411SStefano Zampini 2506f336411SStefano Zampini 2515808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B): 2525808f684SSatish Balay GRID = 8, 9 2536f336411SStefano Zampini 2546f336411SStefano Zampini 2555808f684SSatish Balay# bs = 2 2565808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 2575808f684SSatish Balay BSIZE = 2 2586f336411SStefano Zampini 2596f336411SStefano Zampini 2605808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 2615808f684SSatish Balay BSIZE = 2 2626f336411SStefano Zampini 2636f336411SStefano Zampini 2645808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 2655808f684SSatish Balay BSIZE = 2 2666f336411SStefano Zampini 2676f336411SStefano Zampini 2685808f684SSatish Balay# bs = 3 2695808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 2705808f684SSatish Balay BSIZE = 3 2716f336411SStefano Zampini 2726f336411SStefano Zampini 2735808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 2745808f684SSatish Balay BSIZE = 3 2756f336411SStefano Zampini 2766f336411SStefano Zampini 2775808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 2785808f684SSatish Balay BSIZE = 3 2796f336411SStefano Zampini 2806f336411SStefano Zampini 2815808f684SSatish Balay# bs = 4 2825808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 2835808f684SSatish Balay BSIZE = 4 2846f336411SStefano Zampini 2856f336411SStefano Zampini 2865808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 2875808f684SSatish Balay BSIZE = 4 2886f336411SStefano Zampini 2896f336411SStefano Zampini 2905808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 2915808f684SSatish Balay BSIZE = 4 2926f336411SStefano Zampini 2936f336411SStefano Zampini 2945808f684SSatish Balay# bs = 5 2955808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 2965808f684SSatish Balay BSIZE = 5 2976f336411SStefano Zampini 2986f336411SStefano Zampini 2995808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 3005808f684SSatish Balay BSIZE = 5 3016f336411SStefano Zampini 3026f336411SStefano Zampini 3035808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 3045808f684SSatish Balay BSIZE = 5 3055808f684SSatish Balay 3065808f684SSatish Balay 3075808f684SSatish Balay# -- MPI Dense + Block -- 3085808f684SSatish Balay 3096f336411SStefano Zampini 3105808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B): 3115808f684SSatish Balay COMM = PETSc.COMM_WORLD 3125808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 3136f336411SStefano Zampini 3146f336411SStefano Zampini 3155808f684SSatish Balay# bs = 1 3165808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B): 3175808f684SSatish Balay GRID = 2, 3 3186f336411SStefano Zampini 3196f336411SStefano Zampini 3205808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B): 3215808f684SSatish Balay GRID = 4, 5 3226f336411SStefano Zampini 3236f336411SStefano Zampini 3245808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B): 3255808f684SSatish Balay GRID = 7, 7 3266f336411SStefano Zampini 3276f336411SStefano Zampini 3285808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B): 3295808f684SSatish Balay GRID = 8, 9 3306f336411SStefano Zampini 3316f336411SStefano Zampini 3325808f684SSatish Balay# bs = 2 3335808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 3345808f684SSatish Balay BSIZE = 2 3356f336411SStefano Zampini 3366f336411SStefano Zampini 3375808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 3385808f684SSatish Balay BSIZE = 2 3396f336411SStefano Zampini 3406f336411SStefano Zampini 3415808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 3425808f684SSatish Balay BSIZE = 2 3436f336411SStefano Zampini 3446f336411SStefano Zampini 3455808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 3465808f684SSatish Balay BSIZE = 2 3476f336411SStefano Zampini 3486f336411SStefano Zampini 3495808f684SSatish Balay# bs = 3 3505808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 3515808f684SSatish Balay BSIZE = 3 3526f336411SStefano Zampini 3536f336411SStefano Zampini 3545808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 3555808f684SSatish Balay BSIZE = 3 3566f336411SStefano Zampini 3576f336411SStefano Zampini 3585808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 3595808f684SSatish Balay BSIZE = 3 3606f336411SStefano Zampini 3616f336411SStefano Zampini 3625808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 3635808f684SSatish Balay BSIZE = 3 3646f336411SStefano Zampini 3656f336411SStefano Zampini 3665808f684SSatish Balay# bs = 4 3675808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 3685808f684SSatish Balay BSIZE = 4 3696f336411SStefano Zampini 3706f336411SStefano Zampini 3715808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 3725808f684SSatish Balay BSIZE = 4 3736f336411SStefano Zampini 3746f336411SStefano Zampini 3755808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 3765808f684SSatish Balay BSIZE = 4 3776f336411SStefano Zampini 3786f336411SStefano Zampini 3795808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 3805808f684SSatish Balay BSIZE = 4 3816f336411SStefano Zampini 3826f336411SStefano Zampini 3835808f684SSatish Balay# bs = 5 3845808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 3855808f684SSatish Balay BSIZE = 5 3866f336411SStefano Zampini 3876f336411SStefano Zampini 3885808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 3895808f684SSatish Balay BSIZE = 5 3906f336411SStefano Zampini 3916f336411SStefano Zampini 3925808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 3935808f684SSatish Balay BSIZE = 5 3946f336411SStefano Zampini 3956f336411SStefano Zampini 3965808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 3975808f684SSatish Balay BSIZE = 5 3985808f684SSatish Balay 3996f336411SStefano Zampini 4005808f684SSatish Balay# ----- 4015808f684SSatish Balay 4025808f684SSatish Balayif __name__ == '__main__': 4035808f684SSatish Balay unittest.main() 404