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