xref: /petsc/src/binding/petsc4py/test/test_mat_aij.py (revision 62e5d2d2208a68fdbd23dac44110783534664de8)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balayimport numpy as N
55808f684SSatish Balayimport numpy as np
65808f684SSatish Balay
75808f684SSatish Balaydef mkgraph(comm, m, n):
85808f684SSatish Balay    start = m*n * comm.rank
95808f684SSatish Balay    end   = start + m*n
105808f684SSatish Balay    idt = PETSc.IntType
115808f684SSatish Balay    rows = []
125808f684SSatish Balay    for I in range(start, end) :
135808f684SSatish Balay        rows.append([])
145808f684SSatish Balay        adj = rows[-1]
155808f684SSatish Balay        i = I//n; j = I - i*n
165808f684SSatish Balay        if i> 0  : J = I-n; adj.append(J)
175808f684SSatish Balay        if j> 0  : J = I-1; adj.append(J)
185808f684SSatish Balay        adj.append(I)
195808f684SSatish Balay        if j< n-1: J = I+1; adj.append(J)
205808f684SSatish Balay        if i< m-1: J = I+n; adj.append(J)
215808f684SSatish Balay    nods = N.array(range(start, end), dtype=idt)
225808f684SSatish Balay    xadj = N.array([0]*(len(rows)+1), dtype=idt)
235808f684SSatish Balay    xadj[0] = 0
245808f684SSatish Balay    xadj[1:] = N.cumsum([len(r) for r in rows], dtype=idt)
255808f684SSatish Balay    if not rows: adjy = N.array([],dtype=idt)
265808f684SSatish Balay    else:        adjy = N.concatenate(rows).astype(idt)
275808f684SSatish Balay    return nods, xadj, adjy
285808f684SSatish Balay
295808f684SSatish Balay
305808f684SSatish Balayclass BaseTestMatAnyAIJ(object):
315808f684SSatish Balay
325808f684SSatish Balay    COMM  = PETSc.COMM_NULL
335808f684SSatish Balay    TYPE  = None
345808f684SSatish Balay    GRID  = 0, 0
355808f684SSatish Balay    BSIZE = None
365808f684SSatish Balay
375808f684SSatish Balay    def setUp(self):
385808f684SSatish Balay        COMM   = self.COMM
395808f684SSatish Balay        GM, GN = self.GRID
405808f684SSatish Balay        BS     = self.BSIZE
415808f684SSatish Balay        #
425808f684SSatish Balay        try:
435808f684SSatish Balay            rbs, cbs = BS
445808f684SSatish Balay            rbs = rbs or 1
455808f684SSatish Balay            cbs = cbs or 1
465808f684SSatish Balay        except (TypeError, ValueError):
475808f684SSatish Balay            rbs = cbs = BS or 1
485808f684SSatish Balay        sdt = dtype = PETSc.ScalarType
495808f684SSatish Balay        self.rows, self.xadj, self.adjy = mkgraph(COMM, GM, GN)
505808f684SSatish Balay        self.vals = N.array(range(1, 1 + len(self.adjy)*rbs*cbs), dtype=sdt)
515808f684SSatish Balay        self.vals.shape = (-1, rbs, cbs)
525808f684SSatish Balay        #
535808f684SSatish Balay        m, n = GM, GN
545808f684SSatish Balay        rowsz = (m*n*rbs, None)
555808f684SSatish Balay        colsz = (m*n*cbs, None)
565808f684SSatish Balay        A = self.A = PETSc.Mat().create(comm=COMM)
575808f684SSatish Balay        A.setType(self.TYPE)
585808f684SSatish Balay        A.setSizes([rowsz, colsz], BS)
595808f684SSatish Balay
605808f684SSatish Balay    def tearDown(self):
615808f684SSatish Balay        self.A.destroy()
625808f684SSatish Balay        self.A = None
63*62e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
645808f684SSatish Balay
655808f684SSatish Balay    def testSetPreallocNNZ(self):
665808f684SSatish Balay        nnz = [5, 2]
675808f684SSatish Balay        self.A.setPreallocationNNZ(nnz)
685808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
695808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
705808f684SSatish Balay        self.A.setOption(opt, True)
715808f684SSatish Balay        ai, aj, av = self._set_values()
725808f684SSatish Balay        self.A.assemble()
735808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
745808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
755808f684SSatish Balay        self.A.setOption(opt, True)
765808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
775808f684SSatish Balay        self.A.assemble()
785808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
795808f684SSatish Balay
805808f684SSatish Balay    def testSetPreallocNNZ_2(self):
815808f684SSatish Balay        _, ai, _, _ =self._get_aijv()
825808f684SSatish Balay        d_nnz = N.diff(ai)
835808f684SSatish Balay        nnz = [d_nnz, 3]
845808f684SSatish Balay        self.A.setPreallocationNNZ(nnz)
855808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
865808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
875808f684SSatish Balay        self.A.setOption(opt, True)
885808f684SSatish Balay        ai, aj, av = self._set_values()
895808f684SSatish Balay        self.A.assemble()
905808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
915808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
925808f684SSatish Balay        self.A.setOption(opt, True)
935808f684SSatish Balay        ai, aj, av =self._set_values_ijv()
945808f684SSatish Balay        self.A.assemble()
955808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
965808f684SSatish Balay
975808f684SSatish Balay    def testSetPreallocCSR(self):
98fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
995808f684SSatish Balay        _, ai, aj, _ = self._get_aijv()
1005808f684SSatish Balay        csr = [ai, aj]
1015808f684SSatish Balay        self.A.setPreallocationCSR(csr)
1025808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
1035808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1045808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
1055808f684SSatish Balay        self.A.setOption(opt, True)
1065808f684SSatish Balay        self._set_values()
1075808f684SSatish Balay        self.A.assemble()
1085808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1095808f684SSatish Balay        self._set_values_ijv()
1105808f684SSatish Balay        self.A.assemble()
1115808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1125808f684SSatish Balay
1135808f684SSatish Balay    def testSetPreallocCSR_2(self):
114fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
1155808f684SSatish Balay        _, ai, aj, av =self._get_aijv()
1165808f684SSatish Balay        csr = [ai, aj, av]
1175808f684SSatish Balay        self.A.setPreallocationCSR(csr)
1185808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
1195808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1205808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
1215808f684SSatish Balay        self.A.setOption(opt, True)
1225808f684SSatish Balay        self._set_values()
1235808f684SSatish Balay        self.A.assemble()
1245808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1255808f684SSatish Balay        self._set_values_ijv()
1265808f684SSatish Balay        self.A.assemble()
1275808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1285808f684SSatish Balay
1295808f684SSatish Balay    def testSetValues(self):
1305808f684SSatish Balay        self._preallocate()
1315808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
1325808f684SSatish Balay        self.A.setOption(opt, True)
1335808f684SSatish Balay        ai, aj, av = self._set_values()
1345808f684SSatish Balay        self.A.assemble()
1355808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1365808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
1375808f684SSatish Balay        self.A.setOption(opt, True)
1385808f684SSatish Balay        ai, aj, av = self._set_values()
1395808f684SSatish Balay        self.A.assemble()
1405808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1415808f684SSatish Balay
1425808f684SSatish Balay    def testSetValuesIJV(self):
1435808f684SSatish Balay        self._preallocate()
1445808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
1455808f684SSatish Balay        self.A.setOption(opt, True)
1465808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
1475808f684SSatish Balay        self.A.assemble()
1485808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1495808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
1505808f684SSatish Balay        self.A.setOption(opt, True)
1515808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
1525808f684SSatish Balay        self.A.assemble()
1535808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
1545808f684SSatish Balay
1555808f684SSatish Balay    def testGetValuesCSR(self):
156fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
1575808f684SSatish Balay        self._preallocate()
1585808f684SSatish Balay        self._set_values_ijv()
1595808f684SSatish Balay        A = self.A
1605808f684SSatish Balay        A.assemble()
1615808f684SSatish Balay        if 'sbaij' in A.getType():
1625808f684SSatish Balay            opt = PETSc.Mat.Option.GETROW_UPPERTRIANGULAR
1635808f684SSatish Balay            self.A.setOption(opt, True)
1645808f684SSatish Balay        ai, aj, av = A.getValuesCSR()
1655808f684SSatish Balay        rstart, rend = A.getOwnershipRange()
1665808f684SSatish Balay        for row in range(rstart, rend):
1675808f684SSatish Balay            cols, vals = A.getRow(row)
1685808f684SSatish Balay            i = row - rstart
1695808f684SSatish Balay            self.assertTrue(N.allclose(aj[ai[i]:ai[i+1]], cols))
1705808f684SSatish Balay            self.assertTrue(N.allclose(av[ai[i]:ai[i+1]], vals))
1715808f684SSatish Balay
1725808f684SSatish Balay    def testConvertToSAME(self):
1735808f684SSatish Balay        self._preallocate()
1745808f684SSatish Balay        self._set_values_ijv()
1755808f684SSatish Balay        A = self.A
1765808f684SSatish Balay        A.assemble()
1775808f684SSatish Balay        A.convert('same')
1785808f684SSatish Balay
1795808f684SSatish Balay    def testConvertToDENSE(self):
1805808f684SSatish Balay        self._preallocate()
1815808f684SSatish Balay        self._set_values_ijv()
1825808f684SSatish Balay        A = self.A
1835808f684SSatish Balay        A.assemble()
1845808f684SSatish Balay        x, y = A.getVecs()
1855808f684SSatish Balay        x.setRandom()
1865808f684SSatish Balay        z = y.duplicate()
1875808f684SSatish Balay        A.mult(x, y)
1885808f684SSatish Balay        if A.type.endswith('sbaij'): return
1895808f684SSatish Balay        B = PETSc.Mat()
1905808f684SSatish Balay        A.convert('dense', B)  # initial
1915808f684SSatish Balay        B.mult(x, z)
1925808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
1935808f684SSatish Balay        A.convert('dense', B)  # reuse
1945808f684SSatish Balay        B.mult(x, z)
1955808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
1965808f684SSatish Balay        A.convert('dense')     # inplace
1975808f684SSatish Balay        A.mult(x, z)
1985808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
1995808f684SSatish Balay
2005808f684SSatish Balay    def testConvertToAIJ(self):
2015808f684SSatish Balay        self._preallocate()
2025808f684SSatish Balay        self._set_values_ijv()
2035808f684SSatish Balay        A = self.A
2045808f684SSatish Balay        A.assemble()
2055808f684SSatish Balay        x, y = A.getVecs()
2065808f684SSatish Balay        x.setRandom()
2075808f684SSatish Balay        z = y.duplicate()
2085808f684SSatish Balay        A.mult(x, y)
2095808f684SSatish Balay        if A.type.endswith('sbaij'): return
2105808f684SSatish Balay        B = PETSc.Mat()
2115808f684SSatish Balay        A.convert('aij', B)  # initial
2125808f684SSatish Balay        B.mult(x, z)
2135808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
2145808f684SSatish Balay        A.convert('aij', B)  # reuse
2155808f684SSatish Balay        B.mult(x, z)
2165808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
2175808f684SSatish Balay        A.convert('aij')     # inplace
2185808f684SSatish Balay        A.mult(x, z)
2195808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
2205808f684SSatish Balay
2215808f684SSatish Balay    def testGetDiagonalBlock(self):
222fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
2235808f684SSatish Balay        self._preallocate()
2245808f684SSatish Balay        self._set_values_ijv()
2255808f684SSatish Balay        self.A.assemble()
2265808f684SSatish Balay        B = self.A.getDiagonalBlock()
2275808f684SSatish Balay        self.assertEqual(self.A.getLocalSize(), B.getSize())
2285808f684SSatish Balay        B.destroy()
2295808f684SSatish Balay
2305808f684SSatish Balay    def testInvertBlockDiagonal(self):
231fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
2325808f684SSatish Balay        try:
2335808f684SSatish Balay            _ = len(self.BSIZE)
2345808f684SSatish Balay            return
2355808f684SSatish Balay        except (TypeError, ValueError):
2365808f684SSatish Balay            pass
2375808f684SSatish Balay        self._preallocate()
2385808f684SSatish Balay        rbs, cbs = self.A.getBlockSizes()
2395808f684SSatish Balay        if rbs != cbs: return
2405808f684SSatish Balay        self._set_values_ijv()
2415808f684SSatish Balay        self.A.assemble()
2425808f684SSatish Balay        self.A.shift(1000) # Make nonsingular
2435808f684SSatish Balay        ibdiag = self.A.invertBlockDiagonal()
2445808f684SSatish Balay        bs = self.A.getBlockSize()
2455808f684SSatish Balay        m, _ = self.A.getLocalSize()
2465808f684SSatish Balay        self.assertEqual(ibdiag.shape, (m//bs, bs, bs))
2475808f684SSatish Balay        tmp = N.empty((m//bs, bs, bs), dtype=PETSc.ScalarType)
2485808f684SSatish Balay        rstart, rend = self.A.getOwnershipRange()
2495808f684SSatish Balay        s, e = rstart//bs, rend//bs
2505808f684SSatish Balay        for i in range(s, e):
2515808f684SSatish Balay            rows = cols = N.arange(i*bs,(i+1)*bs, dtype=PETSc.IntType)
2525808f684SSatish Balay            vals = self.A.getValues(rows,cols)
2535808f684SSatish Balay            tmp[i-s,:,:] = N.linalg.inv(vals)
2545808f684SSatish Balay        self.assertTrue(N.allclose(ibdiag, tmp))
2555808f684SSatish Balay
2565808f684SSatish Balay    def testCreateSubMatrix(self):
2575808f684SSatish Balay        if 'baij' in self.A.getType(): return # XXX
2585808f684SSatish Balay        self._preallocate()
2595808f684SSatish Balay        self._set_values_ijv()
2605808f684SSatish Balay        self.A.assemble()
2615808f684SSatish Balay        #
2625808f684SSatish Balay        rank = self.A.getComm().getRank()
2635808f684SSatish Balay        rs, re = self.A.getOwnershipRange()
2645808f684SSatish Balay        cs, ce = self.A.getOwnershipRangeColumn()
2655808f684SSatish Balay        rows = N.array(range(rs, re), dtype=PETSc.IntType)
2665808f684SSatish Balay        cols = N.array(range(cs, ce), dtype=PETSc.IntType)
2675808f684SSatish Balay        rows = PETSc.IS().createGeneral(rows, comm=self.A.getComm())
2685808f684SSatish Balay        cols = PETSc.IS().createGeneral(cols, comm=self.A.getComm())
2695808f684SSatish Balay        #
2705808f684SSatish Balay        S = self.A.createSubMatrix(rows, None)
2715808f684SSatish Balay        S.zeroEntries()
2725808f684SSatish Balay        self.A.createSubMatrix(rows, None, S)
2735808f684SSatish Balay        S.destroy()
2745808f684SSatish Balay        #
2755808f684SSatish Balay        S = self.A.createSubMatrix(rows, cols)
2765808f684SSatish Balay        S.zeroEntries()
2775808f684SSatish Balay        self.A.createSubMatrix(rows, cols, S)
2785808f684SSatish Balay        S.destroy()
2795808f684SSatish Balay
2805808f684SSatish Balay    def testCreateSubMatrices(self):
2815808f684SSatish Balay        if 'baij' in self.A.getType(): return # XXX
282fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
2835808f684SSatish Balay        self._preallocate()
2845808f684SSatish Balay        self._set_values_ijv()
2855808f684SSatish Balay        self.A.assemble()
2865808f684SSatish Balay        #
2875808f684SSatish Balay        rs, re = self.A.getOwnershipRange()
2885808f684SSatish Balay        cs, ce = self.A.getOwnershipRangeColumn()
2895808f684SSatish Balay        rows = N.array(range(rs, re), dtype=PETSc.IntType)
2905808f684SSatish Balay        cols = N.array(range(cs, ce), dtype=PETSc.IntType)
2915808f684SSatish Balay        rows = PETSc.IS().createGeneral(rows, comm=self.A.getComm())
2925808f684SSatish Balay        cols = PETSc.IS().createGeneral(cols, comm=self.A.getComm())
2935808f684SSatish Balay        #
2945808f684SSatish Balay        (S,) = self.A.createSubMatrices(rows, cols)
2955808f684SSatish Balay        S.zeroEntries()
2965808f684SSatish Balay        self.A.createSubMatrices(rows, cols, submats=[S])
2975808f684SSatish Balay        S.destroy()
2985808f684SSatish Balay        #
2995808f684SSatish Balay        (S1,) = self.A.createSubMatrices([rows], [cols])
3005808f684SSatish Balay        (S2,) = self.A.createSubMatrices([rows], [cols])
3015808f684SSatish Balay        self.assertTrue(S1.equal(S2))
3025808f684SSatish Balay        S2.zeroEntries()
3035808f684SSatish Balay        self.A.createSubMatrices([rows], [cols], [S2])
3045808f684SSatish Balay        self.assertTrue(S1.equal(S2))
3055808f684SSatish Balay        S1.destroy()
3065808f684SSatish Balay        S2.destroy()
3075808f684SSatish Balay        #
3085808f684SSatish Balay        if 'seq' not in self.A.getType(): return # XXX
3095808f684SSatish Balay        S1, S2 = self.A.createSubMatrices([rows, rows], [cols, cols])
3105808f684SSatish Balay        self.assertTrue(S1.equal(S2))
3115808f684SSatish Balay        S1.zeroEntries()
3125808f684SSatish Balay        S2.zeroEntries()
3135808f684SSatish Balay        self.A.createSubMatrices([rows, rows], [cols, cols], [S1, S2])
3145808f684SSatish Balay        self.assertTrue(S1.equal(S2))
3155808f684SSatish Balay        S1.destroy()
3165808f684SSatish Balay        S2.destroy()
3175808f684SSatish Balay
3185808f684SSatish Balay    def testGetRedundantMatrix(self):
3195808f684SSatish Balay        if 'aijcrl' in self.A.getType(): return # duplicate not supported
3205808f684SSatish Balay        if 'mpisbaij' in self.A.getType(): return # not working
321fc989267SStefano Zampini        if 'is' in self.A.getType(): return # XXX
3225808f684SSatish Balay        self._preallocate()
3235808f684SSatish Balay        self._set_values_ijv()
3245808f684SSatish Balay        self.A.assemble()
3255808f684SSatish Balay        #Test the most simple case
3265808f684SSatish Balay        sizecommA = self.A.getComm().getSize()
3275808f684SSatish Balay        Ared = self.A.getRedundantMatrix(sizecommA)
3285808f684SSatish Balay        sizecommAred = Ared.getComm().getSize()
3295808f684SSatish Balay        self.assertEqual(1, sizecommAred)
3305808f684SSatish Balay        Ared.destroy()
3315808f684SSatish Balay
3325808f684SSatish Balay    def testCreateTranspose(self):
3335808f684SSatish Balay        self._preallocate()
3345808f684SSatish Balay        self._set_values_ijv()
3355808f684SSatish Balay        self.A.assemble()
3365808f684SSatish Balay        A = self.A
3375808f684SSatish Balay        AT = PETSc.Mat().createTranspose(A)
3385808f684SSatish Balay        x, y = A.createVecs()
3395808f684SSatish Balay        xt, yt = AT.createVecs()
3405808f684SSatish Balay        #
3415808f684SSatish Balay        y.setRandom()
3425808f684SSatish Balay        A.multTranspose(y, x)
3435808f684SSatish Balay        y.copy(xt)
3445808f684SSatish Balay        AT.mult(xt, yt)
3455808f684SSatish Balay        self.assertTrue(yt.equal(x))
3465808f684SSatish Balay        #
3475808f684SSatish Balay        x.setRandom()
3485808f684SSatish Balay        A.mult(x, y)
3495808f684SSatish Balay        x.copy(yt)
3505808f684SSatish Balay        AT.multTranspose(yt, xt)
3515808f684SSatish Balay        self.assertTrue(xt.equal(y))
3525808f684SSatish Balay
3535808f684SSatish Balay    def _get_aijv(self):
3545808f684SSatish Balay        return (self.rows, self.xadj, self.adjy, self.vals,)
3555808f684SSatish Balay
3565808f684SSatish Balay    def _preallocate(self):
3575808f684SSatish Balay        self.A.setPreallocationNNZ([5, 2])
3585808f684SSatish Balay
3595808f684SSatish Balay    def _set_values(self):
3605808f684SSatish Balay        import sys
3615808f684SSatish Balay        if hasattr(sys, 'gettotalrefcount'):
3625808f684SSatish Balay            return self._set_values_ijv()
3635808f684SSatish Balay        # XXX Why the code below leak refs as a beast ???
3645808f684SSatish Balay        row, ai, aj, av =self._get_aijv()
3655808f684SSatish Balay        if not self.BSIZE:
3665808f684SSatish Balay            setvalues = self.A.setValues
3675808f684SSatish Balay        else:
3685808f684SSatish Balay            setvalues = self.A.setValuesBlocked
3695808f684SSatish Balay        for i, r in enumerate(row):
3705808f684SSatish Balay            s, e = ai[i], ai[i+1]
3715808f684SSatish Balay            setvalues(r, aj[s:e], av[s:e])
3725808f684SSatish Balay        return ai, aj, av
3735808f684SSatish Balay
3745808f684SSatish Balay    def _set_values_ijv(self):
3755808f684SSatish Balay        row, ai, aj, av =self._get_aijv()
3765808f684SSatish Balay        if not self.BSIZE:
3775808f684SSatish Balay            setvalues = self.A.setValuesIJV
3785808f684SSatish Balay        else:
3795808f684SSatish Balay            setvalues = self.A.setValuesBlockedIJV
3805808f684SSatish Balay        setvalues(ai, aj, av, rowmap=row)
3815808f684SSatish Balay        setvalues(ai, aj, av, rowmap=None)
3825808f684SSatish Balay        return ai, aj, av
3835808f684SSatish Balay
3845808f684SSatish Balay    def _chk_bs(self, A, bs):
3855808f684SSatish Balay        self.assertEqual(A.getBlockSize(), bs or 1)
3865808f684SSatish Balay
3875808f684SSatish Balay    def _chk_bsizes(self, A, bsizes):
3885808f684SSatish Balay        try:
3895808f684SSatish Balay            rbs, cbs = bsizes
3905808f684SSatish Balay        except (TypeError, ValueError):
3915808f684SSatish Balay            rbs = cbs = bsizes
3925808f684SSatish Balay        self.assertEqual(A.getBlockSizes(), (rbs, cbs))
3935808f684SSatish Balay
3945808f684SSatish Balay    def _chk_aij(self, A, i, j):
3955808f684SSatish Balay        compressed = bool(self.BSIZE)
3965808f684SSatish Balay        ai, aj = A.getRowIJ(compressed=compressed)
3975808f684SSatish Balay        if ai is not None and aj is not None:
3985808f684SSatish Balay            self.assertTrue(N.all(i==ai))
3995808f684SSatish Balay            self.assertTrue(N.all(j==aj))
4005808f684SSatish Balay        ai, aj = A.getColumnIJ(compressed=compressed)
4015808f684SSatish Balay        if ai is not None and aj is not None:
4025808f684SSatish Balay            self.assertTrue(N.all(i==ai))
4035808f684SSatish Balay            self.assertTrue(N.all(j==aj))
4045808f684SSatish Balay
4055808f684SSatish Balay# -- AIJ ---------------------
4065808f684SSatish Balay
4075808f684SSatish Balayclass BaseTestMatAIJ(BaseTestMatAnyAIJ, unittest.TestCase):
4085808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
4095808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJ
4105808f684SSatish Balay    GRID  = 0, 0
4115808f684SSatish Balay    BSIZE = None
4125808f684SSatish Balay
4135808f684SSatish Balay# -- Seq AIJ --
4145808f684SSatish Balay
4155808f684SSatish Balayclass TestMatSeqAIJ(BaseTestMatAIJ):
4165808f684SSatish Balay    COMM = PETSc.COMM_SELF
4175808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJ
4185808f684SSatish Balayclass TestMatSeqAIJ_G23(TestMatSeqAIJ):
4195808f684SSatish Balay    GRID  = 2, 3
4205808f684SSatish Balayclass TestMatSeqAIJ_G45(TestMatSeqAIJ):
4215808f684SSatish Balay    GRID  = 4, 5
4225808f684SSatish Balayclass TestMatSeqAIJ_G89(TestMatSeqAIJ):
4235808f684SSatish Balay    GRID  = 8, 9
4245808f684SSatish Balay
4255808f684SSatish Balay# -- MPI AIJ --
4265808f684SSatish Balay
4275808f684SSatish Balayclass TestMatMPIAIJ(BaseTestMatAIJ):
4285808f684SSatish Balay    COMM = PETSc.COMM_WORLD
4295808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJ
4305808f684SSatish Balayclass TestMatMPIAIJ_G23(TestMatMPIAIJ):
4315808f684SSatish Balay    GRID  = 2, 3
4325808f684SSatish Balayclass TestMatMPIAIJ_G45(TestMatMPIAIJ):
4335808f684SSatish Balay    GRID  = 4, 5
4345808f684SSatish Balayclass TestMatMPIAIJ_G89(TestMatMPIAIJ):
4355808f684SSatish Balay    GRID  = 8, 9
4365808f684SSatish Balay
4375808f684SSatish Balay
4385808f684SSatish Balay# -- Block AIJ ---------------
4395808f684SSatish Balay
4405808f684SSatish Balayclass BaseTestMatBAIJ(BaseTestMatAnyAIJ, unittest.TestCase):
4415808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
4425808f684SSatish Balay    TYPE  = PETSc.Mat.Type.BAIJ
4435808f684SSatish Balay    GRID  = 0, 0
4445808f684SSatish Balay    BSIZE = 1
4455808f684SSatish Balay
4465808f684SSatish Balay# -- Seq Block AIJ --
4475808f684SSatish Balay
4485808f684SSatish Balayclass TestMatSeqBAIJ(BaseTestMatBAIJ):
4495808f684SSatish Balay    COMM = PETSc.COMM_SELF
4505808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQBAIJ
4515808f684SSatish Balay# bs = 1
4525808f684SSatish Balayclass TestMatSeqBAIJ_G23(TestMatSeqBAIJ):
4535808f684SSatish Balay    GRID  = 2, 3
4545808f684SSatish Balayclass TestMatSeqBAIJ_G45(TestMatSeqBAIJ):
4555808f684SSatish Balay    GRID  = 4, 5
4565808f684SSatish Balayclass TestMatSeqBAIJ_G89(TestMatSeqBAIJ):
4575808f684SSatish Balay    GRID  = 8, 9
4585808f684SSatish Balay# bs = 2
4595808f684SSatish Balayclass TestMatSeqBAIJ_G23_B2(TestMatSeqBAIJ_G23):
4605808f684SSatish Balay    BSIZE = 2
4615808f684SSatish Balayclass TestMatSeqBAIJ_G45_B2(TestMatSeqBAIJ_G45):
4625808f684SSatish Balay    BSIZE = 2
4635808f684SSatish Balayclass TestMatSeqBAIJ_G89_B2(TestMatSeqBAIJ_G89):
4645808f684SSatish Balay    BSIZE = 2
4655808f684SSatish Balay# bs = 3
4665808f684SSatish Balayclass TestMatSeqBAIJ_G23_B3(TestMatSeqBAIJ_G23):
4675808f684SSatish Balay    BSIZE = 3
4685808f684SSatish Balayclass TestMatSeqBAIJ_G45_B3(TestMatSeqBAIJ_G45):
4695808f684SSatish Balay    BSIZE = 3
4705808f684SSatish Balayclass TestMatSeqBAIJ_G89_B3(TestMatSeqBAIJ_G89):
4715808f684SSatish Balay    BSIZE = 3
4725808f684SSatish Balay# bs = 4
4735808f684SSatish Balayclass TestMatSeqBAIJ_G23_B4(TestMatSeqBAIJ_G23):
4745808f684SSatish Balay    BSIZE = 4
4755808f684SSatish Balayclass TestMatSeqBAIJ_G45_B4(TestMatSeqBAIJ_G45):
4765808f684SSatish Balay    BSIZE = 4
4775808f684SSatish Balayclass TestMatSeqBAIJ_G89_B4(TestMatSeqBAIJ_G89):
4785808f684SSatish Balay    BSIZE = 4
4795808f684SSatish Balay# bs = 5
4805808f684SSatish Balayclass TestMatSeqBAIJ_G23_B5(TestMatSeqBAIJ_G23):
4815808f684SSatish Balay    BSIZE = 5
4825808f684SSatish Balayclass TestMatSeqBAIJ_G45_B5(TestMatSeqBAIJ_G45):
4835808f684SSatish Balay    BSIZE = 5
4845808f684SSatish Balayclass TestMatSeqBAIJ_G89_B5(TestMatSeqBAIJ_G89):
4855808f684SSatish Balay    BSIZE = 5
4865808f684SSatish Balay
4875808f684SSatish Balay
4885808f684SSatish Balay# -- MPI Block AIJ --
4895808f684SSatish Balay
4905808f684SSatish Balayclass TestMatMPIBAIJ(BaseTestMatBAIJ):
4915808f684SSatish Balay    COMM = PETSc.COMM_WORLD
4925808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIBAIJ
4935808f684SSatish Balay# bs = 1
4945808f684SSatish Balayclass TestMatMPIBAIJ_G23(TestMatMPIBAIJ):
4955808f684SSatish Balay    GRID  = 2, 3
4965808f684SSatish Balayclass TestMatMPIBAIJ_G45(TestMatMPIBAIJ):
4975808f684SSatish Balay    GRID  = 4, 5
4985808f684SSatish Balayclass TestMatMPIBAIJ_G89(TestMatMPIBAIJ):
4995808f684SSatish Balay    GRID  = 8, 9
5005808f684SSatish Balay# bs = 2
5015808f684SSatish Balayclass TestMatMPIBAIJ_G23_B2(TestMatMPIBAIJ_G23):
5025808f684SSatish Balay    BSIZE = 2
5035808f684SSatish Balayclass TestMatMPIBAIJ_G45_B2(TestMatMPIBAIJ_G45):
5045808f684SSatish Balay    BSIZE = 2
5055808f684SSatish Balayclass TestMatMPIBAIJ_G89_B2(TestMatMPIBAIJ_G89):
5065808f684SSatish Balay    BSIZE = 2
5075808f684SSatish Balay# bs = 3
5085808f684SSatish Balayclass TestMatMPIBAIJ_G23_B3(TestMatMPIBAIJ_G23):
5095808f684SSatish Balay    BSIZE = 3
5105808f684SSatish Balayclass TestMatMPIBAIJ_G45_B3(TestMatMPIBAIJ_G45):
5115808f684SSatish Balay    BSIZE = 3
5125808f684SSatish Balayclass TestMatMPIBAIJ_G89_B3(TestMatMPIBAIJ_G89):
5135808f684SSatish Balay    BSIZE = 3
5145808f684SSatish Balay# bs = 4
5155808f684SSatish Balayclass TestMatMPIBAIJ_G23_B4(TestMatMPIBAIJ_G23):
5165808f684SSatish Balay    BSIZE = 4
5175808f684SSatish Balayclass TestMatMPIBAIJ_G45_B4(TestMatMPIBAIJ_G45):
5185808f684SSatish Balay    BSIZE = 4
5195808f684SSatish Balayclass TestMatMPIBAIJ_G89_B4(TestMatMPIBAIJ_G89):
5205808f684SSatish Balay    BSIZE = 4
5215808f684SSatish Balay# bs = 5
5225808f684SSatish Balayclass TestMatMPIBAIJ_G23_B5(TestMatMPIBAIJ_G23):
5235808f684SSatish Balay    BSIZE = 5
5245808f684SSatish Balayclass TestMatMPIBAIJ_G45_B5(TestMatMPIBAIJ_G45):
5255808f684SSatish Balay    BSIZE = 5
5265808f684SSatish Balayclass TestMatMPIBAIJ_G89_B5(TestMatMPIBAIJ_G89):
5275808f684SSatish Balay    BSIZE = 5
5285808f684SSatish Balay
5295808f684SSatish Balay# -- SymmBlock AIJ ---------------
5305808f684SSatish Balay
5315808f684SSatish Balayclass BaseTestMatSBAIJ(BaseTestMatAnyAIJ, unittest.TestCase):
5325808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
5335808f684SSatish Balay    TYPE  = PETSc.Mat.Type.SBAIJ
5345808f684SSatish Balay    GRID  = 0, 0
5355808f684SSatish Balay    BSIZE = 1
5365808f684SSatish Balay    def testInvertBlockDiagonal(self): pass
5375808f684SSatish Balay    def _chk_aij(self, A, i, j):
5385808f684SSatish Balay        ai, aj = A.getRowIJ(compressed=True)
5395808f684SSatish Balay        if ai is not None and aj is not None:
5405808f684SSatish Balay            if 0: # XXX Implement
5415808f684SSatish Balay                self.assertTrue(N.all(i==ai))
5425808f684SSatish Balay                self.assertTrue(N.all(j==aj))
5435808f684SSatish Balay        ai, aj = A.getColumnIJ(compressed=True)
5445808f684SSatish Balay        if ai is not None and aj is not None:
5455808f684SSatish Balay            if 0: # XXX Implement
5465808f684SSatish Balay                self.assertTrue(N.all(i==ai))
5475808f684SSatish Balay                self.assertTrue(N.all(j==aj))
5485808f684SSatish Balay
5495808f684SSatish Balay# -- Seq SymmBlock AIJ --
5505808f684SSatish Balay
5515808f684SSatish Balayclass TestMatSeqSBAIJ(BaseTestMatSBAIJ):
5525808f684SSatish Balay    COMM = PETSc.COMM_SELF
5535808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQSBAIJ
5545808f684SSatish Balay# bs = 1
5555808f684SSatish Balayclass TestMatSeqSBAIJ_G23(TestMatSeqSBAIJ):
5565808f684SSatish Balay    GRID  = 2, 3
5575808f684SSatish Balayclass TestMatSeqSBAIJ_G45(TestMatSeqSBAIJ):
5585808f684SSatish Balay    GRID  = 4, 5
5595808f684SSatish Balayclass TestMatSeqSBAIJ_G89(TestMatSeqSBAIJ):
5605808f684SSatish Balay    GRID  = 8, 9
5615808f684SSatish Balay# bs = 2
5625808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B2(TestMatSeqSBAIJ_G23):
5635808f684SSatish Balay    BSIZE = 2
5645808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B2(TestMatSeqSBAIJ_G45):
5655808f684SSatish Balay    BSIZE = 2
5665808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B2(TestMatSeqSBAIJ_G89):
5675808f684SSatish Balay    BSIZE = 2
5685808f684SSatish Balay# bs = 3
5695808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B3(TestMatSeqSBAIJ_G23):
5705808f684SSatish Balay    BSIZE = 3
5715808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B3(TestMatSeqSBAIJ_G45):
5725808f684SSatish Balay    BSIZE = 3
5735808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B3(TestMatSeqSBAIJ_G89):
5745808f684SSatish Balay    BSIZE = 3
5755808f684SSatish Balay# bs = 4
5765808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B4(TestMatSeqSBAIJ_G23):
5775808f684SSatish Balay    BSIZE = 4
5785808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B4(TestMatSeqSBAIJ_G45):
5795808f684SSatish Balay    BSIZE = 4
5805808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B4(TestMatSeqSBAIJ_G89):
5815808f684SSatish Balay    BSIZE = 4
5825808f684SSatish Balay# bs = 5
5835808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B5(TestMatSeqSBAIJ_G23):
5845808f684SSatish Balay    BSIZE = 5
5855808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B5(TestMatSeqSBAIJ_G45):
5865808f684SSatish Balay    BSIZE = 5
5875808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B5(TestMatSeqSBAIJ_G89):
5885808f684SSatish Balay    BSIZE = 5
5895808f684SSatish Balay
5905808f684SSatish Balay
5915808f684SSatish Balay# -- MPI SymmBlock AIJ --
5925808f684SSatish Balay
5935808f684SSatish Balayclass TestMatMPISBAIJ(BaseTestMatSBAIJ):
5945808f684SSatish Balay    COMM = PETSc.COMM_WORLD
5955808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPISBAIJ
5965808f684SSatish Balay# bs = 1
5975808f684SSatish Balayclass TestMatMPISBAIJ_G23(TestMatMPISBAIJ):
5985808f684SSatish Balay    GRID  = 2, 3
5995808f684SSatish Balayclass TestMatMPISBAIJ_G45(TestMatMPISBAIJ):
6005808f684SSatish Balay    GRID  = 4, 5
6015808f684SSatish Balayclass TestMatMPISBAIJ_G89(TestMatMPISBAIJ):
6025808f684SSatish Balay    GRID  = 8, 9
6035808f684SSatish Balay# bs = 2
6045808f684SSatish Balayclass TestMatMPISBAIJ_G23_B2(TestMatMPISBAIJ_G23):
6055808f684SSatish Balay    BSIZE = 2
6065808f684SSatish Balayclass TestMatMPISBAIJ_G45_B2(TestMatMPISBAIJ_G45):
6075808f684SSatish Balay    BSIZE = 2
6085808f684SSatish Balayclass TestMatMPISBAIJ_G89_B2(TestMatMPISBAIJ_G89):
6095808f684SSatish Balay    BSIZE = 2
6105808f684SSatish Balay# bs = 3
6115808f684SSatish Balayclass TestMatMPISBAIJ_G23_B3(TestMatMPISBAIJ_G23):
6125808f684SSatish Balay    BSIZE = 3
6135808f684SSatish Balayclass TestMatMPISBAIJ_G45_B3(TestMatMPISBAIJ_G45):
6145808f684SSatish Balay    BSIZE = 3
6155808f684SSatish Balayclass TestMatMPISBAIJ_G89_B3(TestMatMPISBAIJ_G89):
6165808f684SSatish Balay    BSIZE = 3
6175808f684SSatish Balay# bs = 4
6185808f684SSatish Balayclass TestMatMPISBAIJ_G23_B4(TestMatMPISBAIJ_G23):
6195808f684SSatish Balay    BSIZE = 4
6205808f684SSatish Balayclass TestMatMPISBAIJ_G45_B4(TestMatMPISBAIJ_G45):
6215808f684SSatish Balay    BSIZE = 4
6225808f684SSatish Balayclass TestMatMPISBAIJ_G89_B4(TestMatMPISBAIJ_G89):
6235808f684SSatish Balay    BSIZE = 4
6245808f684SSatish Balay# bs = 5
6255808f684SSatish Balayclass TestMatMPISBAIJ_G23_B5(TestMatMPISBAIJ_G23):
6265808f684SSatish Balay    BSIZE = 5
6275808f684SSatish Balayclass TestMatMPISBAIJ_G45_B5(TestMatMPISBAIJ_G45):
6285808f684SSatish Balay    BSIZE = 5
6295808f684SSatish Balayclass TestMatMPISBAIJ_G89_B5(TestMatMPISBAIJ_G89):
6305808f684SSatish Balay    BSIZE = 5
6315808f684SSatish Balay
6325808f684SSatish Balay# -- AIJ + Block ---------------
6335808f684SSatish Balay
6345808f684SSatish Balayclass BaseTestMatAIJ_B(BaseTestMatAnyAIJ, unittest.TestCase):
6355808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
6365808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJ
6375808f684SSatish Balay    GRID  = 0, 0
6385808f684SSatish Balay    BSIZE = 1
6395808f684SSatish Balay
6405808f684SSatish Balay    def testSetPreallocNNZ(self):pass
6415808f684SSatish Balay    def testSetPreallocNNZ_2(self):pass
6425808f684SSatish Balay    def testSetPreallocCSR(self):pass
6435808f684SSatish Balay    def testSetPreallocCSR_2(self):pass
6445808f684SSatish Balay    def testSetValues(self):
6455808f684SSatish Balay        self._preallocate()
6465808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
6475808f684SSatish Balay        self.A.setOption(opt, True)
6485808f684SSatish Balay        ai, aj, av = self._set_values()
6495808f684SSatish Balay        self.A.assemble()
6505808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
6515808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
6525808f684SSatish Balay        self.A.setOption(opt, True)
6535808f684SSatish Balay        ai, aj, av = self._set_values()
6545808f684SSatish Balay        self.A.assemble()
6555808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
6565808f684SSatish Balay    def testSetValuesIJV(self):
6575808f684SSatish Balay        self._preallocate()
6585808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
6595808f684SSatish Balay        self.A.setOption(opt, True)
6605808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
6615808f684SSatish Balay        self.A.assemble()
6625808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
6635808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
6645808f684SSatish Balay        self.A.setOption(opt, True)
6655808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
6665808f684SSatish Balay        self.A.assemble()
6675808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
6685808f684SSatish Balay    def _preallocate(self):
6695808f684SSatish Balay        self.A.setPreallocationNNZ([5*self.BSIZE, 3*self.BSIZE])
6705808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
6715808f684SSatish Balay    def _chk_aij(self, A, i, j):
6725808f684SSatish Balay        bs = self.BSIZE or 1
6735808f684SSatish Balay        ai, aj = A.getRowIJ()
6745808f684SSatish Balay        if ai is not None and aj is not None:  ## XXX map and check !!
6755808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
6765808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
6775808f684SSatish Balay            pass
6785808f684SSatish Balay        ai, aj = A.getColumnIJ(compressed=bool(self.BSIZE))
6795808f684SSatish Balay        if ai is not None and aj is not None: ## XXX map and check !!
6805808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
6815808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
6825808f684SSatish Balay            pass
6835808f684SSatish Balay
6845808f684SSatish Balay# -- Seq AIJ + Block --
6855808f684SSatish Balay
6865808f684SSatish Balayclass TestMatSeqAIJ_B(BaseTestMatAIJ_B):
6875808f684SSatish Balay    COMM = PETSc.COMM_SELF
6885808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJ
6895808f684SSatish Balay# bs = 1
6905808f684SSatish Balayclass TestMatSeqAIJ_B_G23(TestMatSeqAIJ_B):
6915808f684SSatish Balay    GRID  = 2, 3
6925808f684SSatish Balayclass TestMatSeqAIJ_B_G45(TestMatSeqAIJ_B):
6935808f684SSatish Balay    GRID  = 4, 5
6945808f684SSatish Balayclass TestMatSeqAIJ_B_G89(TestMatSeqAIJ_B):
6955808f684SSatish Balay    GRID  = 8, 9
6965808f684SSatish Balay# bs = 2
6975808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B2(TestMatSeqAIJ_B_G23):
6985808f684SSatish Balay    BSIZE = 2
6995808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B2(TestMatSeqAIJ_B_G45):
7005808f684SSatish Balay    BSIZE = 2
7015808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B2(TestMatSeqAIJ_B_G89):
7025808f684SSatish Balay    BSIZE = 2
7035808f684SSatish Balay# bs = 3
7045808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B3(TestMatSeqAIJ_B_G23):
7055808f684SSatish Balay    BSIZE = 3
7065808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B3(TestMatSeqAIJ_B_G45):
7075808f684SSatish Balay    BSIZE = 3
7085808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B3(TestMatSeqAIJ_B_G89):
7095808f684SSatish Balay    BSIZE = 3
7105808f684SSatish Balay# bs = 4
7115808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B4(TestMatSeqAIJ_B_G23):
7125808f684SSatish Balay    BSIZE = 4
7135808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B4(TestMatSeqAIJ_B_G45):
7145808f684SSatish Balay    BSIZE = 4
7155808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B4(TestMatSeqAIJ_B_G89):
7165808f684SSatish Balay    BSIZE = 4
7175808f684SSatish Balay# bs = 5
7185808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B5(TestMatSeqAIJ_B_G23):
7195808f684SSatish Balay    BSIZE = 5
7205808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B5(TestMatSeqAIJ_B_G45):
7215808f684SSatish Balay    BSIZE = 5
7225808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B5(TestMatSeqAIJ_B_G89):
7235808f684SSatish Balay    BSIZE = 5
7245808f684SSatish Balay
7255808f684SSatish Balay
7265808f684SSatish Balay# -- MPI AIJ + Block --
7275808f684SSatish Balay
7285808f684SSatish Balayclass TestMatMPIAIJ_B(BaseTestMatAIJ_B):
7295808f684SSatish Balay    COMM = PETSc.COMM_WORLD
7305808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJ
7315808f684SSatish Balay# bs = 1
7325808f684SSatish Balayclass TestMatMPIAIJ_B_G23(TestMatMPIAIJ_B):
7335808f684SSatish Balay    GRID  = 2, 3
7345808f684SSatish Balayclass TestMatMPIAIJ_B_G45(TestMatMPIAIJ_B):
7355808f684SSatish Balay    GRID  = 4, 5
7365808f684SSatish Balayclass TestMatMPIAIJ_B_G89(TestMatMPIAIJ_B):
7375808f684SSatish Balay    GRID  = 8, 9
7385808f684SSatish Balay# bs = 2
7395808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B2(TestMatMPIAIJ_B_G23):
7405808f684SSatish Balay    BSIZE = 2
7415808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B2(TestMatMPIAIJ_B_G45):
7425808f684SSatish Balay    BSIZE = 2
7435808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B2(TestMatMPIAIJ_B_G89):
7445808f684SSatish Balay    BSIZE = 2
7455808f684SSatish Balay# bs = 3
7465808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B3(TestMatMPIAIJ_B_G23):
7475808f684SSatish Balay    BSIZE = 3
7485808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B3(TestMatMPIAIJ_B_G45):
7495808f684SSatish Balay    BSIZE = 3
7505808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B3(TestMatMPIAIJ_B_G89):
7515808f684SSatish Balay    BSIZE = 3
7525808f684SSatish Balay# bs = 4
7535808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B4(TestMatMPIAIJ_B_G23):
7545808f684SSatish Balay    BSIZE = 4
7555808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B4(TestMatMPIAIJ_B_G45):
7565808f684SSatish Balay    BSIZE = 4
7575808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B4(TestMatMPIAIJ_B_G89):
7585808f684SSatish Balay    BSIZE = 4
7595808f684SSatish Balay# bs = 5
7605808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B5(TestMatMPIAIJ_B_G23):
7615808f684SSatish Balay    BSIZE = 5
7625808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B5(TestMatMPIAIJ_B_G45):
7635808f684SSatish Balay    BSIZE = 5
7645808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B5(TestMatMPIAIJ_B_G89):
7655808f684SSatish Balay    BSIZE = 5
7665808f684SSatish Balay
7675808f684SSatish Balay# -- Non-square blocks --
7685808f684SSatish Balayclass BaseTestMatAIJ_B(BaseTestMatAnyAIJ, unittest.TestCase):
7695808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
7705808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJ
7715808f684SSatish Balay    GRID  = 0, 0
7725808f684SSatish Balay    BSIZE = 4, 2
7735808f684SSatish Balay
7745808f684SSatish Balay    def _preallocate(self):
7755808f684SSatish Balay        try:
7765808f684SSatish Balay            rbs, cbs = self.BSIZE
7775808f684SSatish Balay        except (TypeError, ValueError):
7785808f684SSatish Balay            rbs = cbs = self.BSIZE
7795808f684SSatish Balay        self.A.setPreallocationNNZ([5*rbs, 3*cbs])
7805808f684SSatish Balay        self._chk_bsizes(self.A, self.BSIZE)
7815808f684SSatish Balay    def testSetPreallocNNZ(self):pass
7825808f684SSatish Balay    def testSetPreallocNNZ_2(self):pass
7835808f684SSatish Balay    def testSetPreallocCSR(self):pass
7845808f684SSatish Balay    def testSetPreallocCSR_2(self):pass
7855808f684SSatish Balay    def testSetValues(self):
7865808f684SSatish Balay        self._preallocate()
7875808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
7885808f684SSatish Balay        self.A.setOption(opt, True)
7895808f684SSatish Balay        ai, aj, av = self._set_values()
7905808f684SSatish Balay        self.A.assemble()
7915808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
7925808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
7935808f684SSatish Balay        self.A.setOption(opt, True)
7945808f684SSatish Balay        ai, aj, av = self._set_values()
7955808f684SSatish Balay        self.A.assemble()
7965808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
7975808f684SSatish Balay    def testSetValuesIJV(self):
7985808f684SSatish Balay        self._preallocate()
7995808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
8005808f684SSatish Balay        self.A.setOption(opt, True)
8015808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
8025808f684SSatish Balay        self.A.assemble()
8035808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
8045808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
8055808f684SSatish Balay        self.A.setOption(opt, True)
8065808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
8075808f684SSatish Balay        self.A.assemble()
8085808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
8095808f684SSatish Balay    def _chk_aij(self, A, i, j):
8105808f684SSatish Balay        bs = self.BSIZE or 1
8115808f684SSatish Balay        ai, aj = A.getRowIJ()
8125808f684SSatish Balay        if ai is not None and aj is not None:  ## XXX map and check !!
8135808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
8145808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
8155808f684SSatish Balay            pass
8165808f684SSatish Balay        ai, aj = A.getColumnIJ()
8175808f684SSatish Balay        if ai is not None and aj is not None: ## XXX map and check !!
8185808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
8195808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
8205808f684SSatish Balay            pass
8215808f684SSatish Balay
8225808f684SSatish Balay# -- AIJCRL ---------------------
8235808f684SSatish Balay
8245808f684SSatish Balayclass BaseTestMatAIJCRL(BaseTestMatAIJ, unittest.TestCase):
8255808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJCRL
8265808f684SSatish Balay
8275808f684SSatish Balay# -- Seq AIJCRL --
8285808f684SSatish Balay
8295808f684SSatish Balayclass TestMatSeqAIJCRL(BaseTestMatAIJCRL):
8305808f684SSatish Balay    COMM = PETSc.COMM_SELF
8315808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJCRL
8325808f684SSatish Balayclass TestMatSeqAIJCRL_G23(TestMatSeqAIJCRL):
8335808f684SSatish Balay    GRID  = 2, 3
8345808f684SSatish Balayclass TestMatSeqAIJCRL_G45(TestMatSeqAIJCRL):
8355808f684SSatish Balay    GRID  = 4, 5
8365808f684SSatish Balayclass TestMatSeqAIJCRL_G89(TestMatSeqAIJCRL):
8375808f684SSatish Balay    GRID  = 8, 9
8385808f684SSatish Balay
8395808f684SSatish Balay# -- MPI AIJCRL --
8405808f684SSatish Balay
8415808f684SSatish Balayclass TestMatMPIAIJCRL(BaseTestMatAIJCRL):
8425808f684SSatish Balay    COMM = PETSc.COMM_WORLD
8435808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJCRL
8445808f684SSatish Balayclass TestMatMPIAIJCRL_G23(TestMatMPIAIJCRL):
8455808f684SSatish Balay    GRID  = 2, 3
8465808f684SSatish Balayclass TestMatMPIAIJCRL_G45(TestMatMPIAIJCRL):
8475808f684SSatish Balay    GRID  = 4, 5
8485808f684SSatish Balayclass TestMatMPIAIJCRL_G89(TestMatMPIAIJCRL):
8495808f684SSatish Balay    GRID  = 8, 9
8505808f684SSatish Balay
8515808f684SSatish Balay# -- AIJCRL + Block -------------
8525808f684SSatish Balay
8535808f684SSatish Balayclass BaseTestMatAIJCRL_B(BaseTestMatAIJ_B, unittest.TestCase):
8545808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJCRL
8555808f684SSatish Balay
8565808f684SSatish Balay# -- Seq AIJCRL + Block --
8575808f684SSatish Balay
8585808f684SSatish Balayclass TestMatSeqAIJCRL_B(BaseTestMatAIJCRL_B):
8595808f684SSatish Balay    COMM = PETSc.COMM_SELF
8605808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJCRL
8615808f684SSatish Balay# bs = 1
8625808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23(TestMatSeqAIJCRL_B):
8635808f684SSatish Balay    GRID  = 2, 3
8645808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45(TestMatSeqAIJCRL_B):
8655808f684SSatish Balay    GRID  = 4, 5
8665808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89(TestMatSeqAIJCRL_B):
8675808f684SSatish Balay    GRID  = 8, 9
8685808f684SSatish Balay# bs = 2
8695808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B2(TestMatSeqAIJCRL_B_G23):
8705808f684SSatish Balay    BSIZE = 2
8715808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B2(TestMatSeqAIJCRL_B_G45):
8725808f684SSatish Balay    BSIZE = 2
8735808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B2(TestMatSeqAIJCRL_B_G89):
8745808f684SSatish Balay    BSIZE = 2
8755808f684SSatish Balay# bs = 3
8765808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B3(TestMatSeqAIJCRL_B_G23):
8775808f684SSatish Balay    BSIZE = 3
8785808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B3(TestMatSeqAIJCRL_B_G45):
8795808f684SSatish Balay    BSIZE = 3
8805808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B3(TestMatSeqAIJCRL_B_G89):
8815808f684SSatish Balay    BSIZE = 3
8825808f684SSatish Balay# bs = 4
8835808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B4(TestMatSeqAIJCRL_B_G23):
8845808f684SSatish Balay    BSIZE = 4
8855808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B4(TestMatSeqAIJCRL_B_G45):
8865808f684SSatish Balay    BSIZE = 4
8875808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B4(TestMatSeqAIJCRL_B_G89):
8885808f684SSatish Balay    BSIZE = 4
8895808f684SSatish Balay# bs = 5
8905808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B5(TestMatSeqAIJCRL_B_G23):
8915808f684SSatish Balay    BSIZE = 5
8925808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B5(TestMatSeqAIJCRL_B_G45):
8935808f684SSatish Balay    BSIZE = 5
8945808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B5(TestMatSeqAIJCRL_B_G89):
8955808f684SSatish Balay    BSIZE = 5
8965808f684SSatish Balay
8975808f684SSatish Balay
8985808f684SSatish Balay# -- MPI AIJCRL + Block --
8995808f684SSatish Balay
9005808f684SSatish Balayclass TestMatMPIAIJCRL_B(BaseTestMatAIJCRL_B):
9015808f684SSatish Balay    COMM = PETSc.COMM_WORLD
9025808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJCRL
9035808f684SSatish Balay# bs = 1
9045808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23(TestMatMPIAIJCRL_B):
9055808f684SSatish Balay    GRID  = 2, 3
9065808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45(TestMatMPIAIJCRL_B):
9075808f684SSatish Balay    GRID  = 4, 5
9085808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89(TestMatMPIAIJCRL_B):
9095808f684SSatish Balay    GRID  = 8, 9
9105808f684SSatish Balay# bs = 2
9115808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B2(TestMatMPIAIJCRL_B_G23):
9125808f684SSatish Balay    BSIZE = 2
9135808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B2(TestMatMPIAIJCRL_B_G45):
9145808f684SSatish Balay    BSIZE = 2
9155808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B2(TestMatMPIAIJCRL_B_G89):
9165808f684SSatish Balay    BSIZE = 2
9175808f684SSatish Balay# bs = 3
9185808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B3(TestMatMPIAIJCRL_B_G23):
9195808f684SSatish Balay    BSIZE = 3
9205808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B3(TestMatMPIAIJCRL_B_G45):
9215808f684SSatish Balay    BSIZE = 3
9225808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B3(TestMatMPIAIJCRL_B_G89):
9235808f684SSatish Balay    BSIZE = 3
9245808f684SSatish Balay# bs = 4
9255808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B4(TestMatMPIAIJCRL_B_G23):
9265808f684SSatish Balay    BSIZE = 4
9275808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B4(TestMatMPIAIJCRL_B_G45):
9285808f684SSatish Balay    BSIZE = 4
9295808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B4(TestMatMPIAIJCRL_B_G89):
9305808f684SSatish Balay    BSIZE = 4
9315808f684SSatish Balay# bs = 5
9325808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B5(TestMatMPIAIJCRL_B_G23):
9335808f684SSatish Balay    BSIZE = 5
9345808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B5(TestMatMPIAIJCRL_B_G45):
9355808f684SSatish Balay    BSIZE = 5
9365808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B5(TestMatMPIAIJCRL_B_G89):
9375808f684SSatish Balay    BSIZE = 5
9385808f684SSatish Balay
939fc989267SStefano Zampini# -- MATIS --
940fc989267SStefano Zampini
941fc989267SStefano Zampiniclass TestMatIS(BaseTestMatAIJ):
942fc989267SStefano Zampini    COMM = PETSc.COMM_WORLD
943fc989267SStefano Zampini    TYPE = PETSc.Mat.Type.IS
944fc989267SStefano Zampiniclass TestMatIS_G23(TestMatIS):
945fc989267SStefano Zampini    GRID  = 2, 3
946fc989267SStefano Zampiniclass TestMatIS_G45(TestMatIS):
947fc989267SStefano Zampini    GRID  = 4, 5
948fc989267SStefano Zampiniclass TestMatIS_G89(TestMatIS):
949fc989267SStefano Zampini    GRID  = 8, 9
950fc989267SStefano Zampini
9515808f684SSatish Balay# -----
9525808f684SSatish Balay
9535808f684SSatish Balay
9545808f684SSatish Balay
9555808f684SSatish Balayif __name__ == '__main__':
9565808f684SSatish Balay    unittest.main()
957