xref: /petsc/src/binding/petsc4py/test/test_mat_dense.py (revision 6f33641175f69f1db294cc9ba81c3f4ad4f81d49)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balayimport numpy as np
55808f684SSatish Balay
6*6f336411SStefano 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)
13*6f336411SStefano Zampini    cols = np.array(range(N), dtype=idt)
14*6f336411SStefano 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
19*6f336411SStefano 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)
31*6f336411SStefano Zampini        bs = BS or 1
32*6f336411SStefano 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
55*6f336411SStefano Zampini        if M != N:
56*6f336411SStefano 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))
845808f684SSatish Balay
855808f684SSatish Balay    def _preallocate(self):
865808f684SSatish Balay        self.A.setPreallocationDense(None)
875808f684SSatish Balay
885808f684SSatish Balay    def _set_values(self):
895808f684SSatish Balay        COMM = self.COMM
905808f684SSatish Balay        GM, GN = self.GRID
915808f684SSatish Balay        BS = self.BSIZE or 1
925808f684SSatish Balay        rows, cols, vals = mkdata(COMM, GM, GN, BS)
935808f684SSatish Balay        if not self.BSIZE:
945808f684SSatish Balay            setvalues = self.A.setValues
955808f684SSatish Balay        else:
965808f684SSatish Balay            setvalues = self.A.setValuesBlocked
975808f684SSatish Balay        setvalues(rows, cols, vals)
985808f684SSatish Balay        return rows, cols, vals
995808f684SSatish Balay
1005808f684SSatish Balay    def _chk_bs(self, A, bs):
1015808f684SSatish Balay        self.assertEqual(A.getBlockSize(), bs or 1)
1025808f684SSatish Balay
1035808f684SSatish Balay    def _chk_array(self, A, r, c, v):
1045808f684SSatish Balay        return  # XXX
1055808f684SSatish Balay        vals = self.A.getValues(r, c)
1065808f684SSatish Balay        vals.shape = v.shape
1075808f684SSatish Balay        self.assertTrue(np.allclose(vals, v))
1085808f684SSatish Balay
1095808f684SSatish Balay
1105808f684SSatish Balay# -- Dense ---------------------
1115808f684SSatish Balay
112*6f336411SStefano Zampini
1135808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase):
1145808f684SSatish Balay    COMM = PETSc.COMM_WORLD
1155808f684SSatish Balay    GRID = 0, 0
1165808f684SSatish Balay    BSIZE = None
1175808f684SSatish Balay
118*6f336411SStefano Zampini
1195808f684SSatish Balay# -- Seq Dense --
1205808f684SSatish Balay
121*6f336411SStefano Zampini
1225808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense):
1235808f684SSatish Balay    COMM = PETSc.COMM_SELF
1245808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQDENSE
125*6f336411SStefano Zampini
126*6f336411SStefano Zampini
1275808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense):
1285808f684SSatish Balay    GRID = 2, 3
129*6f336411SStefano Zampini
130*6f336411SStefano Zampini
1315808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense):
1325808f684SSatish Balay    GRID = 4, 5
133*6f336411SStefano Zampini
134*6f336411SStefano Zampini
1355808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense):
1365808f684SSatish Balay    GRID = 7, 7
137*6f336411SStefano Zampini
138*6f336411SStefano Zampini
1395808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense):
1405808f684SSatish Balay    GRID = 8, 9
1415808f684SSatish Balay
142*6f336411SStefano Zampini
1435808f684SSatish Balay# -- MPI Dense --
1445808f684SSatish Balay
145*6f336411SStefano Zampini
1465808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense):
1475808f684SSatish Balay    COMM = PETSc.COMM_WORLD
1485808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIDENSE
149*6f336411SStefano Zampini
150*6f336411SStefano Zampini
1515808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense):
1525808f684SSatish Balay    GRID = 2, 3
153*6f336411SStefano Zampini
154*6f336411SStefano Zampini
1555808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense):
1565808f684SSatish Balay    GRID = 4, 5
157*6f336411SStefano Zampini
158*6f336411SStefano Zampini
1595808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense):
1605808f684SSatish Balay    GRID = 7, 7
161*6f336411SStefano Zampini
162*6f336411SStefano Zampini
1635808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense):
1645808f684SSatish Balay    GRID = 8, 9
1655808f684SSatish Balay
1665808f684SSatish Balay
1675808f684SSatish Balay# -- Dense + Block ---------------
1685808f684SSatish Balay
169*6f336411SStefano Zampini
1705808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase):
1715808f684SSatish Balay    COMM = PETSc.COMM_WORLD
1725808f684SSatish Balay    GRID = 0, 0
1735808f684SSatish Balay    BSIZE = 1
174*6f336411SStefano Zampini
1755808f684SSatish Balay    def _preallocate(self):
1765808f684SSatish Balay        # self.A.setBlockSize(self.BSIZE)
1775808f684SSatish Balay        self.A.setPreallocationDense(None)
1785808f684SSatish Balay        # self.A.setBlockSize(self.BSIZE)
1795808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
1805808f684SSatish Balay
181*6f336411SStefano Zampini
1825808f684SSatish Balay# -- Seq Dense + Block --
1835808f684SSatish Balay
184*6f336411SStefano Zampini
1855808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B):
1865808f684SSatish Balay    COMM = PETSc.COMM_SELF
1875808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQDENSE
188*6f336411SStefano Zampini
189*6f336411SStefano Zampini
1905808f684SSatish Balay# bs = 1
1915808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B):
1925808f684SSatish Balay    GRID = 2, 3
193*6f336411SStefano Zampini
194*6f336411SStefano Zampini
1955808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B):
1965808f684SSatish Balay    GRID = 4, 5
197*6f336411SStefano Zampini
198*6f336411SStefano Zampini
1995808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B):
2005808f684SSatish Balay    GRID = 8, 9
201*6f336411SStefano Zampini
202*6f336411SStefano Zampini
2035808f684SSatish Balay# bs = 2
2045808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23):
2055808f684SSatish Balay    BSIZE = 2
206*6f336411SStefano Zampini
207*6f336411SStefano Zampini
2085808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45):
2095808f684SSatish Balay    BSIZE = 2
210*6f336411SStefano Zampini
211*6f336411SStefano Zampini
2125808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89):
2135808f684SSatish Balay    BSIZE = 2
214*6f336411SStefano Zampini
215*6f336411SStefano Zampini
2165808f684SSatish Balay# bs = 3
2175808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23):
2185808f684SSatish Balay    BSIZE = 3
219*6f336411SStefano Zampini
220*6f336411SStefano Zampini
2215808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45):
2225808f684SSatish Balay    BSIZE = 3
223*6f336411SStefano Zampini
224*6f336411SStefano Zampini
2255808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89):
2265808f684SSatish Balay    BSIZE = 3
227*6f336411SStefano Zampini
228*6f336411SStefano Zampini
2295808f684SSatish Balay# bs = 4
2305808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23):
2315808f684SSatish Balay    BSIZE = 4
232*6f336411SStefano Zampini
233*6f336411SStefano Zampini
2345808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45):
2355808f684SSatish Balay    BSIZE = 4
236*6f336411SStefano Zampini
237*6f336411SStefano Zampini
2385808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89):
2395808f684SSatish Balay    BSIZE = 4
240*6f336411SStefano Zampini
241*6f336411SStefano Zampini
2425808f684SSatish Balay# bs = 5
2435808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23):
2445808f684SSatish Balay    BSIZE = 5
245*6f336411SStefano Zampini
246*6f336411SStefano Zampini
2475808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45):
2485808f684SSatish Balay    BSIZE = 5
249*6f336411SStefano Zampini
250*6f336411SStefano Zampini
2515808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89):
2525808f684SSatish Balay    BSIZE = 5
2535808f684SSatish Balay
2545808f684SSatish Balay
2555808f684SSatish Balay# -- MPI Dense + Block --
2565808f684SSatish Balay
257*6f336411SStefano Zampini
2585808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B):
2595808f684SSatish Balay    COMM = PETSc.COMM_WORLD
2605808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIDENSE
261*6f336411SStefano Zampini
262*6f336411SStefano Zampini
2635808f684SSatish Balay# bs = 1
2645808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B):
2655808f684SSatish Balay    GRID = 2, 3
266*6f336411SStefano Zampini
267*6f336411SStefano Zampini
2685808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B):
2695808f684SSatish Balay    GRID = 4, 5
270*6f336411SStefano Zampini
271*6f336411SStefano Zampini
2725808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B):
2735808f684SSatish Balay    GRID = 7, 7
274*6f336411SStefano Zampini
275*6f336411SStefano Zampini
2765808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B):
2775808f684SSatish Balay    GRID = 8, 9
278*6f336411SStefano Zampini
279*6f336411SStefano Zampini
2805808f684SSatish Balay# bs = 2
2815808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23):
2825808f684SSatish Balay    BSIZE = 2
283*6f336411SStefano Zampini
284*6f336411SStefano Zampini
2855808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45):
2865808f684SSatish Balay    BSIZE = 2
287*6f336411SStefano Zampini
288*6f336411SStefano Zampini
2895808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77):
2905808f684SSatish Balay    BSIZE = 2
291*6f336411SStefano Zampini
292*6f336411SStefano Zampini
2935808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89):
2945808f684SSatish Balay    BSIZE = 2
295*6f336411SStefano Zampini
296*6f336411SStefano Zampini
2975808f684SSatish Balay# bs = 3
2985808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23):
2995808f684SSatish Balay    BSIZE = 3
300*6f336411SStefano Zampini
301*6f336411SStefano Zampini
3025808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45):
3035808f684SSatish Balay    BSIZE = 3
304*6f336411SStefano Zampini
305*6f336411SStefano Zampini
3065808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77):
3075808f684SSatish Balay    BSIZE = 3
308*6f336411SStefano Zampini
309*6f336411SStefano Zampini
3105808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89):
3115808f684SSatish Balay    BSIZE = 3
312*6f336411SStefano Zampini
313*6f336411SStefano Zampini
3145808f684SSatish Balay# bs = 4
3155808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23):
3165808f684SSatish Balay    BSIZE = 4
317*6f336411SStefano Zampini
318*6f336411SStefano Zampini
3195808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45):
3205808f684SSatish Balay    BSIZE = 4
321*6f336411SStefano Zampini
322*6f336411SStefano Zampini
3235808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77):
3245808f684SSatish Balay    BSIZE = 4
325*6f336411SStefano Zampini
326*6f336411SStefano Zampini
3275808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89):
3285808f684SSatish Balay    BSIZE = 4
329*6f336411SStefano Zampini
330*6f336411SStefano Zampini
3315808f684SSatish Balay# bs = 5
3325808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23):
3335808f684SSatish Balay    BSIZE = 5
334*6f336411SStefano Zampini
335*6f336411SStefano Zampini
3365808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45):
3375808f684SSatish Balay    BSIZE = 5
338*6f336411SStefano Zampini
339*6f336411SStefano Zampini
3405808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77):
3415808f684SSatish Balay    BSIZE = 5
342*6f336411SStefano Zampini
343*6f336411SStefano Zampini
3445808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89):
3455808f684SSatish Balay    BSIZE = 5
3465808f684SSatish Balay
347*6f336411SStefano Zampini
3485808f684SSatish Balay# -----
3495808f684SSatish Balay
3505808f684SSatish Balayif __name__ == '__main__':
3515808f684SSatish Balay    unittest.main()
352