xref: /petsc/src/binding/petsc4py/test/test_mat_dense.py (revision 62e5d2d2208a68fdbd23dac44110783534664de8)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balayimport numpy as np
55808f684SSatish Balay
65808f684SSatish Balaydef mkdata(comm, m, N, bs):
75808f684SSatish Balay    start = m * comm.rank
85808f684SSatish Balay    end   = start + m
95808f684SSatish Balay    idt = PETSc.IntType
105808f684SSatish Balay    sdt = PETSc.ScalarType
115808f684SSatish Balay    rows = np.array(range(start, end), dtype=idt)
125808f684SSatish Balay    cols = np.array(range(0, N), dtype=idt)
135808f684SSatish Balay    vals = np.array(range(0, m*N*bs*bs), dtype=sdt)
145808f684SSatish Balay    vals.shape = (-1, bs, bs)
155808f684SSatish Balay    return rows, cols, vals
165808f684SSatish Balay
175808f684SSatish Balay
185808f684SSatish Balayclass BaseTestMatAnyDense(object):
195808f684SSatish Balay
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)
315808f684SSatish Balay        bs = BS or 1; m, N = GM, GN;
325808f684SSatish Balay        rowsz = (m*bs, None)
335808f684SSatish Balay        colsz = (None, N*bs)
345808f684SSatish Balay        self.A.setSizes([rowsz, colsz], BS)
355808f684SSatish Balay        self.A.setType(self.TYPE)
365808f684SSatish Balay
375808f684SSatish Balay    def tearDown(self):
385808f684SSatish Balay        self.A.destroy()
395808f684SSatish Balay        self.A = None
40*62e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
415808f684SSatish Balay
425808f684SSatish Balay    def testSetValues(self):
435808f684SSatish Balay        self._preallocate()
445808f684SSatish Balay        r, c, v = self._set_values()
455808f684SSatish Balay        self.A.assemble()
465808f684SSatish Balay        self._chk_array(self.A, r, c, v)
475808f684SSatish Balay        r, c, v = self._set_values()
485808f684SSatish Balay        self.A.assemble()
495808f684SSatish Balay        self._chk_array(self.A, r, c, v)
505808f684SSatish Balay
515808f684SSatish Balay    def testGetDiagonalBlock(self):
525808f684SSatish Balay        M, N = self.A.getSize()
535808f684SSatish Balay        # only for square matrices
545808f684SSatish Balay        if M != N: return
555808f684SSatish Balay        self._preallocate()
565808f684SSatish Balay        self._set_values()
575808f684SSatish Balay        self.A.assemble()
585808f684SSatish Balay        B = self.A.getDiagonalBlock()
595808f684SSatish Balay        self.assertEqual(self.A.getLocalSize(), B.getSize())
605808f684SSatish Balay        B.destroy()
615808f684SSatish Balay
625808f684SSatish Balay    def testCreateTranspose(self):
635808f684SSatish Balay        self._preallocate()
645808f684SSatish Balay        self._set_values()
655808f684SSatish Balay        self.A.assemble()
665808f684SSatish Balay        A = self.A
675808f684SSatish Balay        AT = PETSc.Mat().createTranspose(A)
685808f684SSatish Balay        x, y = A.createVecs()
695808f684SSatish Balay        xt, yt = AT.createVecs()
705808f684SSatish Balay        #
715808f684SSatish Balay        y.setRandom()
725808f684SSatish Balay        A.multTranspose(y, x)
735808f684SSatish Balay        y.copy(xt)
745808f684SSatish Balay        AT.mult(xt, yt)
755808f684SSatish Balay        self.assertTrue(yt.equal(x))
765808f684SSatish Balay        #
775808f684SSatish Balay        x.setRandom()
785808f684SSatish Balay        A.mult(x, y)
795808f684SSatish Balay        x.copy(yt)
805808f684SSatish Balay        AT.multTranspose(yt, xt)
815808f684SSatish Balay        self.assertTrue(xt.equal(y))
825808f684SSatish Balay
835808f684SSatish Balay    def _preallocate(self):
845808f684SSatish Balay        self.A.setPreallocationDense(None)
855808f684SSatish Balay
865808f684SSatish Balay    def _set_values(self):
875808f684SSatish Balay        COMM   = self.COMM
885808f684SSatish Balay        GM, GN = self.GRID
895808f684SSatish Balay        BS     = self.BSIZE or 1
905808f684SSatish Balay        rows, cols, vals = mkdata(COMM, GM, GN, BS)
915808f684SSatish Balay        if not self.BSIZE:
925808f684SSatish Balay            setvalues = self.A.setValues
935808f684SSatish Balay        else:
945808f684SSatish Balay            setvalues = self.A.setValuesBlocked
955808f684SSatish Balay        setvalues(rows, cols, vals)
965808f684SSatish Balay        return rows, cols, vals
975808f684SSatish Balay
985808f684SSatish Balay    def _chk_bs(self, A, bs):
995808f684SSatish Balay        self.assertEqual(A.getBlockSize(), bs or 1)
1005808f684SSatish Balay
1015808f684SSatish Balay    def _chk_array(self, A, r, c, v):
1025808f684SSatish Balay        return # XXX
1035808f684SSatish Balay        vals = self.A.getValues(r, c)
1045808f684SSatish Balay        vals.shape = v.shape
1055808f684SSatish Balay        self.assertTrue(np.allclose(vals, v))
1065808f684SSatish Balay
1075808f684SSatish Balay
1085808f684SSatish Balay# -- Dense ---------------------
1095808f684SSatish Balay
1105808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase):
1115808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
1125808f684SSatish Balay    GRID  = 0, 0
1135808f684SSatish Balay    BSIZE = None
1145808f684SSatish Balay
1155808f684SSatish Balay# -- Seq Dense --
1165808f684SSatish Balay
1175808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense):
1185808f684SSatish Balay    COMM = PETSc.COMM_SELF
1195808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQDENSE
1205808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense):
1215808f684SSatish Balay    GRID  = 2, 3
1225808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense):
1235808f684SSatish Balay    GRID  = 4, 5
1245808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense):
1255808f684SSatish Balay    GRID  = 7, 7
1265808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense):
1275808f684SSatish Balay    GRID  = 8, 9
1285808f684SSatish Balay
1295808f684SSatish Balay# -- MPI Dense --
1305808f684SSatish Balay
1315808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense):
1325808f684SSatish Balay    COMM = PETSc.COMM_WORLD
1335808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIDENSE
1345808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense):
1355808f684SSatish Balay    GRID  = 2, 3
1365808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense):
1375808f684SSatish Balay    GRID  = 4, 5
1385808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense):
1395808f684SSatish Balay    GRID  = 7, 7
1405808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense):
1415808f684SSatish Balay    GRID  = 8, 9
1425808f684SSatish Balay
1435808f684SSatish Balay
1445808f684SSatish Balay# -- Dense + Block ---------------
1455808f684SSatish Balay
1465808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase):
1475808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
1485808f684SSatish Balay    GRID  = 0, 0
1495808f684SSatish Balay    BSIZE = 1
1505808f684SSatish Balay    def _preallocate(self):
1515808f684SSatish Balay        #self.A.setBlockSize(self.BSIZE)
1525808f684SSatish Balay        self.A.setPreallocationDense(None)
1535808f684SSatish Balay        #self.A.setBlockSize(self.BSIZE)
1545808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
1555808f684SSatish Balay
1565808f684SSatish Balay# -- Seq Dense + Block --
1575808f684SSatish Balay
1585808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B):
1595808f684SSatish Balay    COMM = PETSc.COMM_SELF
1605808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQDENSE
1615808f684SSatish Balay# bs = 1
1625808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B):
1635808f684SSatish Balay    GRID  = 2, 3
1645808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B):
1655808f684SSatish Balay    GRID  = 4, 5
1665808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B):
1675808f684SSatish Balay    GRID  = 8, 9
1685808f684SSatish Balay# bs = 2
1695808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23):
1705808f684SSatish Balay    BSIZE = 2
1715808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45):
1725808f684SSatish Balay    BSIZE = 2
1735808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89):
1745808f684SSatish Balay    BSIZE = 2
1755808f684SSatish Balay# bs = 3
1765808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23):
1775808f684SSatish Balay    BSIZE = 3
1785808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45):
1795808f684SSatish Balay    BSIZE = 3
1805808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89):
1815808f684SSatish Balay    BSIZE = 3
1825808f684SSatish Balay# bs = 4
1835808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23):
1845808f684SSatish Balay    BSIZE = 4
1855808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45):
1865808f684SSatish Balay    BSIZE = 4
1875808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89):
1885808f684SSatish Balay    BSIZE = 4
1895808f684SSatish Balay# bs = 5
1905808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23):
1915808f684SSatish Balay    BSIZE = 5
1925808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45):
1935808f684SSatish Balay    BSIZE = 5
1945808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89):
1955808f684SSatish Balay    BSIZE = 5
1965808f684SSatish Balay
1975808f684SSatish Balay
1985808f684SSatish Balay# -- MPI Dense + Block --
1995808f684SSatish Balay
2005808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B):
2015808f684SSatish Balay    COMM = PETSc.COMM_WORLD
2025808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIDENSE
2035808f684SSatish Balay# bs = 1
2045808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B):
2055808f684SSatish Balay    GRID  = 2, 3
2065808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B):
2075808f684SSatish Balay    GRID  = 4, 5
2085808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B):
2095808f684SSatish Balay    GRID  = 7, 7
2105808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B):
2115808f684SSatish Balay    GRID  = 8, 9
2125808f684SSatish Balay# bs = 2
2135808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23):
2145808f684SSatish Balay    BSIZE = 2
2155808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45):
2165808f684SSatish Balay    BSIZE = 2
2175808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77):
2185808f684SSatish Balay    BSIZE = 2
2195808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89):
2205808f684SSatish Balay    BSIZE = 2
2215808f684SSatish Balay# bs = 3
2225808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23):
2235808f684SSatish Balay    BSIZE = 3
2245808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45):
2255808f684SSatish Balay    BSIZE = 3
2265808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77):
2275808f684SSatish Balay    BSIZE = 3
2285808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89):
2295808f684SSatish Balay    BSIZE = 3
2305808f684SSatish Balay# bs = 4
2315808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23):
2325808f684SSatish Balay    BSIZE = 4
2335808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45):
2345808f684SSatish Balay    BSIZE = 4
2355808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77):
2365808f684SSatish Balay    BSIZE = 4
2375808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89):
2385808f684SSatish Balay    BSIZE = 4
2395808f684SSatish Balay# bs = 5
2405808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23):
2415808f684SSatish Balay    BSIZE = 5
2425808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45):
2435808f684SSatish Balay    BSIZE = 5
2445808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77):
2455808f684SSatish Balay    BSIZE = 5
2465808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89):
2475808f684SSatish Balay    BSIZE = 5
2485808f684SSatish Balay
2495808f684SSatish Balay# -----
2505808f684SSatish Balay
2515808f684SSatish Balayif __name__ == '__main__':
2525808f684SSatish Balay    unittest.main()
253