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