xref: /petsc/src/binding/petsc4py/test/test_mat_dense.py (revision dbb0007b940a1b26670b8b6f28bdc72b8ef8ca02)
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