xref: /petsc/src/binding/petsc4py/test/test_mat_aij.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balayfrom petsc4py import PETSc
2*5808f684SSatish Balayimport unittest
3*5808f684SSatish Balay
4*5808f684SSatish Balayimport numpy as N
5*5808f684SSatish Balayimport numpy as np
6*5808f684SSatish Balay
7*5808f684SSatish Balaydef mkgraph(comm, m, n):
8*5808f684SSatish Balay    start = m*n * comm.rank
9*5808f684SSatish Balay    end   = start + m*n
10*5808f684SSatish Balay    idt = PETSc.IntType
11*5808f684SSatish Balay    rows = []
12*5808f684SSatish Balay    for I in range(start, end) :
13*5808f684SSatish Balay        rows.append([])
14*5808f684SSatish Balay        adj = rows[-1]
15*5808f684SSatish Balay        i = I//n; j = I - i*n
16*5808f684SSatish Balay        if i> 0  : J = I-n; adj.append(J)
17*5808f684SSatish Balay        if j> 0  : J = I-1; adj.append(J)
18*5808f684SSatish Balay        adj.append(I)
19*5808f684SSatish Balay        if j< n-1: J = I+1; adj.append(J)
20*5808f684SSatish Balay        if i< m-1: J = I+n; adj.append(J)
21*5808f684SSatish Balay    nods = N.array(range(start, end), dtype=idt)
22*5808f684SSatish Balay    xadj = N.array([0]*(len(rows)+1), dtype=idt)
23*5808f684SSatish Balay    xadj[0] = 0
24*5808f684SSatish Balay    xadj[1:] = N.cumsum([len(r) for r in rows], dtype=idt)
25*5808f684SSatish Balay    if not rows: adjy = N.array([],dtype=idt)
26*5808f684SSatish Balay    else:        adjy = N.concatenate(rows).astype(idt)
27*5808f684SSatish Balay    return nods, xadj, adjy
28*5808f684SSatish Balay
29*5808f684SSatish Balay
30*5808f684SSatish Balayclass BaseTestMatAnyAIJ(object):
31*5808f684SSatish Balay
32*5808f684SSatish Balay    COMM  = PETSc.COMM_NULL
33*5808f684SSatish Balay    TYPE  = None
34*5808f684SSatish Balay    GRID  = 0, 0
35*5808f684SSatish Balay    BSIZE = None
36*5808f684SSatish Balay
37*5808f684SSatish Balay    def setUp(self):
38*5808f684SSatish Balay        COMM   = self.COMM
39*5808f684SSatish Balay        GM, GN = self.GRID
40*5808f684SSatish Balay        BS     = self.BSIZE
41*5808f684SSatish Balay        #
42*5808f684SSatish Balay        try:
43*5808f684SSatish Balay            rbs, cbs = BS
44*5808f684SSatish Balay            rbs = rbs or 1
45*5808f684SSatish Balay            cbs = cbs or 1
46*5808f684SSatish Balay        except (TypeError, ValueError):
47*5808f684SSatish Balay            rbs = cbs = BS or 1
48*5808f684SSatish Balay        sdt = dtype = PETSc.ScalarType
49*5808f684SSatish Balay        self.rows, self.xadj, self.adjy = mkgraph(COMM, GM, GN)
50*5808f684SSatish Balay        self.vals = N.array(range(1, 1 + len(self.adjy)* rbs*cbs), dtype=sdt)
51*5808f684SSatish Balay        self.vals.shape = (-1, rbs, cbs)
52*5808f684SSatish Balay        #
53*5808f684SSatish Balay        m, n = GM, GN
54*5808f684SSatish Balay        rowsz = (m*n*rbs, None)
55*5808f684SSatish Balay        colsz = (m*n*cbs, None)
56*5808f684SSatish Balay        A = self.A = PETSc.Mat().create(comm=COMM)
57*5808f684SSatish Balay        A.setType(self.TYPE)
58*5808f684SSatish Balay        A.setSizes([rowsz, colsz], BS)
59*5808f684SSatish Balay
60*5808f684SSatish Balay    def tearDown(self):
61*5808f684SSatish Balay        self.A.destroy()
62*5808f684SSatish Balay        self.A = None
63*5808f684SSatish Balay
64*5808f684SSatish Balay    def testSetPreallocNNZ(self):
65*5808f684SSatish Balay        nnz = [5, 2]
66*5808f684SSatish Balay        self.A.setPreallocationNNZ(nnz)
67*5808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
68*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
69*5808f684SSatish Balay        self.A.setOption(opt, True)
70*5808f684SSatish Balay        ai, aj, av = self._set_values()
71*5808f684SSatish Balay        self.A.assemble()
72*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
73*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
74*5808f684SSatish Balay        self.A.setOption(opt, True)
75*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
76*5808f684SSatish Balay        self.A.assemble()
77*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
78*5808f684SSatish Balay
79*5808f684SSatish Balay    def testSetPreallocNNZ_2(self):
80*5808f684SSatish Balay        _, ai, _, _ =self._get_aijv()
81*5808f684SSatish Balay        d_nnz = N.diff(ai)
82*5808f684SSatish Balay        nnz = [d_nnz, 3]
83*5808f684SSatish Balay        self.A.setPreallocationNNZ(nnz)
84*5808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
85*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
86*5808f684SSatish Balay        self.A.setOption(opt, True)
87*5808f684SSatish Balay        ai, aj, av = self._set_values()
88*5808f684SSatish Balay        self.A.assemble()
89*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
90*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
91*5808f684SSatish Balay        self.A.setOption(opt, True)
92*5808f684SSatish Balay        ai, aj, av =self._set_values_ijv()
93*5808f684SSatish Balay        self.A.assemble()
94*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
95*5808f684SSatish Balay
96*5808f684SSatish Balay    def testSetPreallocCSR(self):
97*5808f684SSatish Balay        _, ai, aj, _ = self._get_aijv()
98*5808f684SSatish Balay        csr = [ai, aj]
99*5808f684SSatish Balay        self.A.setPreallocationCSR(csr)
100*5808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
101*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
102*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
103*5808f684SSatish Balay        self.A.setOption(opt, True)
104*5808f684SSatish Balay        self._set_values()
105*5808f684SSatish Balay        self.A.assemble()
106*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
107*5808f684SSatish Balay        self._set_values_ijv()
108*5808f684SSatish Balay        self.A.assemble()
109*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
110*5808f684SSatish Balay
111*5808f684SSatish Balay    def testSetPreallocCSR_2(self):
112*5808f684SSatish Balay        _, ai, aj, av =self._get_aijv()
113*5808f684SSatish Balay        csr = [ai, aj, av]
114*5808f684SSatish Balay        self.A.setPreallocationCSR(csr)
115*5808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
116*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
117*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
118*5808f684SSatish Balay        self.A.setOption(opt, True)
119*5808f684SSatish Balay        self._set_values()
120*5808f684SSatish Balay        self.A.assemble()
121*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
122*5808f684SSatish Balay        self._set_values_ijv()
123*5808f684SSatish Balay        self.A.assemble()
124*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
125*5808f684SSatish Balay
126*5808f684SSatish Balay    def testSetValues(self):
127*5808f684SSatish Balay        self._preallocate()
128*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
129*5808f684SSatish Balay        self.A.setOption(opt, True)
130*5808f684SSatish Balay        ai, aj, av = self._set_values()
131*5808f684SSatish Balay        self.A.assemble()
132*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
133*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
134*5808f684SSatish Balay        self.A.setOption(opt, True)
135*5808f684SSatish Balay        ai, aj, av = self._set_values()
136*5808f684SSatish Balay        self.A.assemble()
137*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
138*5808f684SSatish Balay
139*5808f684SSatish Balay    def testSetValuesIJV(self):
140*5808f684SSatish Balay        self._preallocate()
141*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
142*5808f684SSatish Balay        self.A.setOption(opt, True)
143*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
144*5808f684SSatish Balay        self.A.assemble()
145*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
146*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
147*5808f684SSatish Balay        self.A.setOption(opt, True)
148*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
149*5808f684SSatish Balay        self.A.assemble()
150*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
151*5808f684SSatish Balay
152*5808f684SSatish Balay    def testGetValuesCSR(self):
153*5808f684SSatish Balay        self._preallocate()
154*5808f684SSatish Balay        self._set_values_ijv()
155*5808f684SSatish Balay        A = self.A
156*5808f684SSatish Balay        A.assemble()
157*5808f684SSatish Balay        if 'sbaij' in A.getType():
158*5808f684SSatish Balay            opt = PETSc.Mat.Option.GETROW_UPPERTRIANGULAR
159*5808f684SSatish Balay            self.A.setOption(opt, True)
160*5808f684SSatish Balay        ai, aj, av = A.getValuesCSR()
161*5808f684SSatish Balay        rstart, rend = A.getOwnershipRange()
162*5808f684SSatish Balay        for row in range(rstart, rend):
163*5808f684SSatish Balay            cols, vals = A.getRow(row)
164*5808f684SSatish Balay            i = row - rstart
165*5808f684SSatish Balay            self.assertTrue(N.allclose(aj[ai[i]:ai[i+1]], cols))
166*5808f684SSatish Balay            self.assertTrue(N.allclose(av[ai[i]:ai[i+1]], vals))
167*5808f684SSatish Balay
168*5808f684SSatish Balay    def testConvertToSAME(self):
169*5808f684SSatish Balay        self._preallocate()
170*5808f684SSatish Balay        self._set_values_ijv()
171*5808f684SSatish Balay        A = self.A
172*5808f684SSatish Balay        A.assemble()
173*5808f684SSatish Balay        A.convert('same')
174*5808f684SSatish Balay
175*5808f684SSatish Balay    def testConvertToDENSE(self):
176*5808f684SSatish Balay        self._preallocate()
177*5808f684SSatish Balay        self._set_values_ijv()
178*5808f684SSatish Balay        A = self.A
179*5808f684SSatish Balay        A.assemble()
180*5808f684SSatish Balay        x, y = A.getVecs()
181*5808f684SSatish Balay        x.setRandom()
182*5808f684SSatish Balay        z = y.duplicate()
183*5808f684SSatish Balay        A.mult(x, y)
184*5808f684SSatish Balay        if A.type.endswith('sbaij'): return
185*5808f684SSatish Balay        B = PETSc.Mat()
186*5808f684SSatish Balay        A.convert('dense', B)  # initial
187*5808f684SSatish Balay        B.mult(x, z)
188*5808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
189*5808f684SSatish Balay        A.convert('dense', B)  # reuse
190*5808f684SSatish Balay        B.mult(x, z)
191*5808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
192*5808f684SSatish Balay        A.convert('dense')     # inplace
193*5808f684SSatish Balay        A.mult(x, z)
194*5808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
195*5808f684SSatish Balay
196*5808f684SSatish Balay    def testConvertToAIJ(self):
197*5808f684SSatish Balay        self._preallocate()
198*5808f684SSatish Balay        self._set_values_ijv()
199*5808f684SSatish Balay        A = self.A
200*5808f684SSatish Balay        A.assemble()
201*5808f684SSatish Balay        x, y = A.getVecs()
202*5808f684SSatish Balay        x.setRandom()
203*5808f684SSatish Balay        z = y.duplicate()
204*5808f684SSatish Balay        A.mult(x, y)
205*5808f684SSatish Balay        if A.type.endswith('sbaij'): return
206*5808f684SSatish Balay        B = PETSc.Mat()
207*5808f684SSatish Balay        A.convert('aij', B)  # initial
208*5808f684SSatish Balay        B.mult(x, z)
209*5808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
210*5808f684SSatish Balay        A.convert('aij', B)  # reuse
211*5808f684SSatish Balay        B.mult(x, z)
212*5808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
213*5808f684SSatish Balay        A.convert('aij')     # inplace
214*5808f684SSatish Balay        A.mult(x, z)
215*5808f684SSatish Balay        self.assertTrue(np.allclose(y.array, z.array))
216*5808f684SSatish Balay
217*5808f684SSatish Balay    def testGetDiagonalBlock(self):
218*5808f684SSatish Balay        self._preallocate()
219*5808f684SSatish Balay        self._set_values_ijv()
220*5808f684SSatish Balay        self.A.assemble()
221*5808f684SSatish Balay        B = self.A.getDiagonalBlock()
222*5808f684SSatish Balay        self.assertEqual(self.A.getLocalSize(), B.getSize())
223*5808f684SSatish Balay        B.destroy()
224*5808f684SSatish Balay
225*5808f684SSatish Balay    def testInvertBlockDiagonal(self):
226*5808f684SSatish Balay        try:
227*5808f684SSatish Balay            _ = len(self.BSIZE)
228*5808f684SSatish Balay            return
229*5808f684SSatish Balay        except (TypeError, ValueError):
230*5808f684SSatish Balay            pass
231*5808f684SSatish Balay        self._preallocate()
232*5808f684SSatish Balay        rbs, cbs = self.A.getBlockSizes()
233*5808f684SSatish Balay        if rbs != cbs: return
234*5808f684SSatish Balay        self._set_values_ijv()
235*5808f684SSatish Balay        self.A.assemble()
236*5808f684SSatish Balay        self.A.shift(1000) # Make nonsingular
237*5808f684SSatish Balay        ibdiag = self.A.invertBlockDiagonal()
238*5808f684SSatish Balay        bs = self.A.getBlockSize()
239*5808f684SSatish Balay        m, _ = self.A.getLocalSize()
240*5808f684SSatish Balay        self.assertEqual(ibdiag.shape, (m//bs, bs, bs))
241*5808f684SSatish Balay        tmp = N.empty((m//bs, bs, bs), dtype=PETSc.ScalarType)
242*5808f684SSatish Balay        rstart, rend = self.A.getOwnershipRange()
243*5808f684SSatish Balay        s, e = rstart//bs, rend//bs
244*5808f684SSatish Balay        for i in range(s, e):
245*5808f684SSatish Balay            rows = cols = N.arange(i*bs,(i+1)*bs, dtype=PETSc.IntType)
246*5808f684SSatish Balay            vals = self.A.getValues(rows,cols)
247*5808f684SSatish Balay            tmp[i-s,:,:] = N.linalg.inv(vals)
248*5808f684SSatish Balay        self.assertTrue(N.allclose(ibdiag, tmp))
249*5808f684SSatish Balay
250*5808f684SSatish Balay    def testCreateSubMatrix(self):
251*5808f684SSatish Balay        if 'baij' in self.A.getType(): return # XXX
252*5808f684SSatish Balay        self._preallocate()
253*5808f684SSatish Balay        self._set_values_ijv()
254*5808f684SSatish Balay        self.A.assemble()
255*5808f684SSatish Balay        #
256*5808f684SSatish Balay        rank = self.A.getComm().getRank()
257*5808f684SSatish Balay        rs, re = self.A.getOwnershipRange()
258*5808f684SSatish Balay        cs, ce = self.A.getOwnershipRangeColumn()
259*5808f684SSatish Balay        rows = N.array(range(rs, re), dtype=PETSc.IntType)
260*5808f684SSatish Balay        cols = N.array(range(cs, ce), dtype=PETSc.IntType)
261*5808f684SSatish Balay        rows = PETSc.IS().createGeneral(rows, comm=self.A.getComm())
262*5808f684SSatish Balay        cols = PETSc.IS().createGeneral(cols, comm=self.A.getComm())
263*5808f684SSatish Balay        #
264*5808f684SSatish Balay        S = self.A.createSubMatrix(rows, None)
265*5808f684SSatish Balay        S.zeroEntries()
266*5808f684SSatish Balay        self.A.createSubMatrix(rows, None, S)
267*5808f684SSatish Balay        S.destroy()
268*5808f684SSatish Balay        #
269*5808f684SSatish Balay        S = self.A.createSubMatrix(rows, cols)
270*5808f684SSatish Balay        S.zeroEntries()
271*5808f684SSatish Balay        self.A.createSubMatrix(rows, cols, S)
272*5808f684SSatish Balay        S.destroy()
273*5808f684SSatish Balay
274*5808f684SSatish Balay    def testCreateSubMatrices(self):
275*5808f684SSatish Balay        if 'baij' in self.A.getType(): return # XXX
276*5808f684SSatish Balay        self._preallocate()
277*5808f684SSatish Balay        self._set_values_ijv()
278*5808f684SSatish Balay        self.A.assemble()
279*5808f684SSatish Balay        #
280*5808f684SSatish Balay        rs, re = self.A.getOwnershipRange()
281*5808f684SSatish Balay        cs, ce = self.A.getOwnershipRangeColumn()
282*5808f684SSatish Balay        rows = N.array(range(rs, re), dtype=PETSc.IntType)
283*5808f684SSatish Balay        cols = N.array(range(cs, ce), dtype=PETSc.IntType)
284*5808f684SSatish Balay        rows = PETSc.IS().createGeneral(rows, comm=self.A.getComm())
285*5808f684SSatish Balay        cols = PETSc.IS().createGeneral(cols, comm=self.A.getComm())
286*5808f684SSatish Balay        #
287*5808f684SSatish Balay        (S,) = self.A.createSubMatrices(rows, cols)
288*5808f684SSatish Balay        S.zeroEntries()
289*5808f684SSatish Balay        self.A.createSubMatrices(rows, cols, submats=[S])
290*5808f684SSatish Balay        S.destroy()
291*5808f684SSatish Balay        #
292*5808f684SSatish Balay        (S1,) = self.A.createSubMatrices([rows], [cols])
293*5808f684SSatish Balay        (S2,) = self.A.createSubMatrices([rows], [cols])
294*5808f684SSatish Balay        self.assertTrue(S1.equal(S2))
295*5808f684SSatish Balay        S2.zeroEntries()
296*5808f684SSatish Balay        self.A.createSubMatrices([rows], [cols], [S2])
297*5808f684SSatish Balay        self.assertTrue(S1.equal(S2))
298*5808f684SSatish Balay        S1.destroy()
299*5808f684SSatish Balay        S2.destroy()
300*5808f684SSatish Balay        #
301*5808f684SSatish Balay        if 'seq' not in self.A.getType(): return # XXX
302*5808f684SSatish Balay        S1, S2 = self.A.createSubMatrices([rows, rows], [cols, cols])
303*5808f684SSatish Balay        self.assertTrue(S1.equal(S2))
304*5808f684SSatish Balay        S1.zeroEntries()
305*5808f684SSatish Balay        S2.zeroEntries()
306*5808f684SSatish Balay        self.A.createSubMatrices([rows, rows], [cols, cols], [S1, S2])
307*5808f684SSatish Balay        self.assertTrue(S1.equal(S2))
308*5808f684SSatish Balay        S1.destroy()
309*5808f684SSatish Balay        S2.destroy()
310*5808f684SSatish Balay
311*5808f684SSatish Balay    def testGetRedundantMatrix(self):
312*5808f684SSatish Balay        if 'aijcrl' in self.A.getType(): return # duplicate not supported
313*5808f684SSatish Balay        if 'mpisbaij' in self.A.getType(): return # not working
314*5808f684SSatish Balay        self._preallocate()
315*5808f684SSatish Balay        self._set_values_ijv()
316*5808f684SSatish Balay        self.A.assemble()
317*5808f684SSatish Balay        #Test the most simple case
318*5808f684SSatish Balay        sizecommA = self.A.getComm().getSize()
319*5808f684SSatish Balay        Ared = self.A.getRedundantMatrix(sizecommA)
320*5808f684SSatish Balay        sizecommAred = Ared.getComm().getSize()
321*5808f684SSatish Balay        self.assertEqual(1, sizecommAred)
322*5808f684SSatish Balay        Ared.destroy()
323*5808f684SSatish Balay
324*5808f684SSatish Balay    def testCreateTranspose(self):
325*5808f684SSatish Balay        self._preallocate()
326*5808f684SSatish Balay        self._set_values_ijv()
327*5808f684SSatish Balay        self.A.assemble()
328*5808f684SSatish Balay        A = self.A
329*5808f684SSatish Balay        AT = PETSc.Mat().createTranspose(A)
330*5808f684SSatish Balay        x, y = A.createVecs()
331*5808f684SSatish Balay        xt, yt = AT.createVecs()
332*5808f684SSatish Balay        #
333*5808f684SSatish Balay        y.setRandom()
334*5808f684SSatish Balay        A.multTranspose(y, x)
335*5808f684SSatish Balay        y.copy(xt)
336*5808f684SSatish Balay        AT.mult(xt, yt)
337*5808f684SSatish Balay        self.assertTrue(yt.equal(x))
338*5808f684SSatish Balay        #
339*5808f684SSatish Balay        x.setRandom()
340*5808f684SSatish Balay        A.mult(x, y)
341*5808f684SSatish Balay        x.copy(yt)
342*5808f684SSatish Balay        AT.multTranspose(yt, xt)
343*5808f684SSatish Balay        self.assertTrue(xt.equal(y))
344*5808f684SSatish Balay
345*5808f684SSatish Balay    def _get_aijv(self):
346*5808f684SSatish Balay        return (self.rows, self.xadj, self.adjy, self.vals,)
347*5808f684SSatish Balay
348*5808f684SSatish Balay    def _preallocate(self):
349*5808f684SSatish Balay        self.A.setPreallocationNNZ([5, 2])
350*5808f684SSatish Balay
351*5808f684SSatish Balay    def _set_values(self):
352*5808f684SSatish Balay        import sys
353*5808f684SSatish Balay        if hasattr(sys, 'gettotalrefcount'):
354*5808f684SSatish Balay            return self._set_values_ijv()
355*5808f684SSatish Balay        # XXX Why the code below leak refs as a beast ???
356*5808f684SSatish Balay        row, ai, aj, av =self._get_aijv()
357*5808f684SSatish Balay        if not self.BSIZE:
358*5808f684SSatish Balay            setvalues = self.A.setValues
359*5808f684SSatish Balay        else:
360*5808f684SSatish Balay            setvalues = self.A.setValuesBlocked
361*5808f684SSatish Balay        for i, r in enumerate(row):
362*5808f684SSatish Balay            s, e = ai[i], ai[i+1]
363*5808f684SSatish Balay            setvalues(r, aj[s:e], av[s:e])
364*5808f684SSatish Balay        return ai, aj, av
365*5808f684SSatish Balay
366*5808f684SSatish Balay    def _set_values_ijv(self):
367*5808f684SSatish Balay        row, ai, aj, av =self._get_aijv()
368*5808f684SSatish Balay        if not self.BSIZE:
369*5808f684SSatish Balay            setvalues = self.A.setValuesIJV
370*5808f684SSatish Balay        else:
371*5808f684SSatish Balay            setvalues = self.A.setValuesBlockedIJV
372*5808f684SSatish Balay        setvalues(ai, aj, av, rowmap=row)
373*5808f684SSatish Balay        setvalues(ai, aj, av, rowmap=None)
374*5808f684SSatish Balay        return ai, aj, av
375*5808f684SSatish Balay
376*5808f684SSatish Balay    def _chk_bs(self, A, bs):
377*5808f684SSatish Balay        self.assertEqual(A.getBlockSize(), bs or 1)
378*5808f684SSatish Balay
379*5808f684SSatish Balay    def _chk_bsizes(self, A, bsizes):
380*5808f684SSatish Balay        try:
381*5808f684SSatish Balay            rbs, cbs = bsizes
382*5808f684SSatish Balay        except (TypeError, ValueError):
383*5808f684SSatish Balay            rbs = cbs = bsizes
384*5808f684SSatish Balay        self.assertEqual(A.getBlockSizes(), (rbs, cbs))
385*5808f684SSatish Balay
386*5808f684SSatish Balay    def _chk_aij(self, A, i, j):
387*5808f684SSatish Balay        compressed = bool(self.BSIZE)
388*5808f684SSatish Balay        ai, aj = A.getRowIJ(compressed=compressed)
389*5808f684SSatish Balay        if ai is not None and aj is not None:
390*5808f684SSatish Balay            self.assertTrue(N.all(i==ai))
391*5808f684SSatish Balay            self.assertTrue(N.all(j==aj))
392*5808f684SSatish Balay        ai, aj = A.getColumnIJ(compressed=compressed)
393*5808f684SSatish Balay        if ai is not None and aj is not None:
394*5808f684SSatish Balay            self.assertTrue(N.all(i==ai))
395*5808f684SSatish Balay            self.assertTrue(N.all(j==aj))
396*5808f684SSatish Balay
397*5808f684SSatish Balay# -- AIJ ---------------------
398*5808f684SSatish Balay
399*5808f684SSatish Balayclass BaseTestMatAIJ(BaseTestMatAnyAIJ, unittest.TestCase):
400*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
401*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJ
402*5808f684SSatish Balay    GRID  = 0, 0
403*5808f684SSatish Balay    BSIZE = None
404*5808f684SSatish Balay
405*5808f684SSatish Balay# -- Seq AIJ --
406*5808f684SSatish Balay
407*5808f684SSatish Balayclass TestMatSeqAIJ(BaseTestMatAIJ):
408*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
409*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJ
410*5808f684SSatish Balayclass TestMatSeqAIJ_G23(TestMatSeqAIJ):
411*5808f684SSatish Balay    GRID  = 2, 3
412*5808f684SSatish Balayclass TestMatSeqAIJ_G45(TestMatSeqAIJ):
413*5808f684SSatish Balay    GRID  = 4, 5
414*5808f684SSatish Balayclass TestMatSeqAIJ_G89(TestMatSeqAIJ):
415*5808f684SSatish Balay    GRID  = 8, 9
416*5808f684SSatish Balay
417*5808f684SSatish Balay# -- MPI AIJ --
418*5808f684SSatish Balay
419*5808f684SSatish Balayclass TestMatMPIAIJ(BaseTestMatAIJ):
420*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
421*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJ
422*5808f684SSatish Balayclass TestMatMPIAIJ_G23(TestMatMPIAIJ):
423*5808f684SSatish Balay    GRID  = 2, 3
424*5808f684SSatish Balayclass TestMatMPIAIJ_G45(TestMatMPIAIJ):
425*5808f684SSatish Balay    GRID  = 4, 5
426*5808f684SSatish Balayclass TestMatMPIAIJ_G89(TestMatMPIAIJ):
427*5808f684SSatish Balay    GRID  = 8, 9
428*5808f684SSatish Balay
429*5808f684SSatish Balay
430*5808f684SSatish Balay# -- Block AIJ ---------------
431*5808f684SSatish Balay
432*5808f684SSatish Balayclass BaseTestMatBAIJ(BaseTestMatAnyAIJ, unittest.TestCase):
433*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
434*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.BAIJ
435*5808f684SSatish Balay    GRID  = 0, 0
436*5808f684SSatish Balay    BSIZE = 1
437*5808f684SSatish Balay
438*5808f684SSatish Balay# -- Seq Block AIJ --
439*5808f684SSatish Balay
440*5808f684SSatish Balayclass TestMatSeqBAIJ(BaseTestMatBAIJ):
441*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
442*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQBAIJ
443*5808f684SSatish Balay# bs = 1
444*5808f684SSatish Balayclass TestMatSeqBAIJ_G23(TestMatSeqBAIJ):
445*5808f684SSatish Balay    GRID  = 2, 3
446*5808f684SSatish Balayclass TestMatSeqBAIJ_G45(TestMatSeqBAIJ):
447*5808f684SSatish Balay    GRID  = 4, 5
448*5808f684SSatish Balayclass TestMatSeqBAIJ_G89(TestMatSeqBAIJ):
449*5808f684SSatish Balay    GRID  = 8, 9
450*5808f684SSatish Balay# bs = 2
451*5808f684SSatish Balayclass TestMatSeqBAIJ_G23_B2(TestMatSeqBAIJ_G23):
452*5808f684SSatish Balay    BSIZE = 2
453*5808f684SSatish Balayclass TestMatSeqBAIJ_G45_B2(TestMatSeqBAIJ_G45):
454*5808f684SSatish Balay    BSIZE = 2
455*5808f684SSatish Balayclass TestMatSeqBAIJ_G89_B2(TestMatSeqBAIJ_G89):
456*5808f684SSatish Balay    BSIZE = 2
457*5808f684SSatish Balay# bs = 3
458*5808f684SSatish Balayclass TestMatSeqBAIJ_G23_B3(TestMatSeqBAIJ_G23):
459*5808f684SSatish Balay    BSIZE = 3
460*5808f684SSatish Balayclass TestMatSeqBAIJ_G45_B3(TestMatSeqBAIJ_G45):
461*5808f684SSatish Balay    BSIZE = 3
462*5808f684SSatish Balayclass TestMatSeqBAIJ_G89_B3(TestMatSeqBAIJ_G89):
463*5808f684SSatish Balay    BSIZE = 3
464*5808f684SSatish Balay# bs = 4
465*5808f684SSatish Balayclass TestMatSeqBAIJ_G23_B4(TestMatSeqBAIJ_G23):
466*5808f684SSatish Balay    BSIZE = 4
467*5808f684SSatish Balayclass TestMatSeqBAIJ_G45_B4(TestMatSeqBAIJ_G45):
468*5808f684SSatish Balay    BSIZE = 4
469*5808f684SSatish Balayclass TestMatSeqBAIJ_G89_B4(TestMatSeqBAIJ_G89):
470*5808f684SSatish Balay    BSIZE = 4
471*5808f684SSatish Balay# bs = 5
472*5808f684SSatish Balayclass TestMatSeqBAIJ_G23_B5(TestMatSeqBAIJ_G23):
473*5808f684SSatish Balay    BSIZE = 5
474*5808f684SSatish Balayclass TestMatSeqBAIJ_G45_B5(TestMatSeqBAIJ_G45):
475*5808f684SSatish Balay    BSIZE = 5
476*5808f684SSatish Balayclass TestMatSeqBAIJ_G89_B5(TestMatSeqBAIJ_G89):
477*5808f684SSatish Balay    BSIZE = 5
478*5808f684SSatish Balay
479*5808f684SSatish Balay
480*5808f684SSatish Balay# -- MPI Block AIJ --
481*5808f684SSatish Balay
482*5808f684SSatish Balayclass TestMatMPIBAIJ(BaseTestMatBAIJ):
483*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
484*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIBAIJ
485*5808f684SSatish Balay# bs = 1
486*5808f684SSatish Balayclass TestMatMPIBAIJ_G23(TestMatMPIBAIJ):
487*5808f684SSatish Balay    GRID  = 2, 3
488*5808f684SSatish Balayclass TestMatMPIBAIJ_G45(TestMatMPIBAIJ):
489*5808f684SSatish Balay    GRID  = 4, 5
490*5808f684SSatish Balayclass TestMatMPIBAIJ_G89(TestMatMPIBAIJ):
491*5808f684SSatish Balay    GRID  = 8, 9
492*5808f684SSatish Balay# bs = 2
493*5808f684SSatish Balayclass TestMatMPIBAIJ_G23_B2(TestMatMPIBAIJ_G23):
494*5808f684SSatish Balay    BSIZE = 2
495*5808f684SSatish Balayclass TestMatMPIBAIJ_G45_B2(TestMatMPIBAIJ_G45):
496*5808f684SSatish Balay    BSIZE = 2
497*5808f684SSatish Balayclass TestMatMPIBAIJ_G89_B2(TestMatMPIBAIJ_G89):
498*5808f684SSatish Balay    BSIZE = 2
499*5808f684SSatish Balay# bs = 3
500*5808f684SSatish Balayclass TestMatMPIBAIJ_G23_B3(TestMatMPIBAIJ_G23):
501*5808f684SSatish Balay    BSIZE = 3
502*5808f684SSatish Balayclass TestMatMPIBAIJ_G45_B3(TestMatMPIBAIJ_G45):
503*5808f684SSatish Balay    BSIZE = 3
504*5808f684SSatish Balayclass TestMatMPIBAIJ_G89_B3(TestMatMPIBAIJ_G89):
505*5808f684SSatish Balay    BSIZE = 3
506*5808f684SSatish Balay# bs = 4
507*5808f684SSatish Balayclass TestMatMPIBAIJ_G23_B4(TestMatMPIBAIJ_G23):
508*5808f684SSatish Balay    BSIZE = 4
509*5808f684SSatish Balayclass TestMatMPIBAIJ_G45_B4(TestMatMPIBAIJ_G45):
510*5808f684SSatish Balay    BSIZE = 4
511*5808f684SSatish Balayclass TestMatMPIBAIJ_G89_B4(TestMatMPIBAIJ_G89):
512*5808f684SSatish Balay    BSIZE = 4
513*5808f684SSatish Balay# bs = 5
514*5808f684SSatish Balayclass TestMatMPIBAIJ_G23_B5(TestMatMPIBAIJ_G23):
515*5808f684SSatish Balay    BSIZE = 5
516*5808f684SSatish Balayclass TestMatMPIBAIJ_G45_B5(TestMatMPIBAIJ_G45):
517*5808f684SSatish Balay    BSIZE = 5
518*5808f684SSatish Balayclass TestMatMPIBAIJ_G89_B5(TestMatMPIBAIJ_G89):
519*5808f684SSatish Balay    BSIZE = 5
520*5808f684SSatish Balay
521*5808f684SSatish Balay# -- SymmBlock AIJ ---------------
522*5808f684SSatish Balay
523*5808f684SSatish Balayclass BaseTestMatSBAIJ(BaseTestMatAnyAIJ, unittest.TestCase):
524*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
525*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.SBAIJ
526*5808f684SSatish Balay    GRID  = 0, 0
527*5808f684SSatish Balay    BSIZE = 1
528*5808f684SSatish Balay    def testInvertBlockDiagonal(self): pass
529*5808f684SSatish Balay    def _chk_aij(self, A, i, j):
530*5808f684SSatish Balay        ai, aj = A.getRowIJ(compressed=True)
531*5808f684SSatish Balay        if ai is not None and aj is not None:
532*5808f684SSatish Balay            if 0: # XXX Implement
533*5808f684SSatish Balay                self.assertTrue(N.all(i==ai))
534*5808f684SSatish Balay                self.assertTrue(N.all(j==aj))
535*5808f684SSatish Balay        ai, aj = A.getColumnIJ(compressed=True)
536*5808f684SSatish Balay        if ai is not None and aj is not None:
537*5808f684SSatish Balay            if 0: # XXX Implement
538*5808f684SSatish Balay                self.assertTrue(N.all(i==ai))
539*5808f684SSatish Balay                self.assertTrue(N.all(j==aj))
540*5808f684SSatish Balay
541*5808f684SSatish Balay# -- Seq SymmBlock AIJ --
542*5808f684SSatish Balay
543*5808f684SSatish Balayclass TestMatSeqSBAIJ(BaseTestMatSBAIJ):
544*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
545*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQSBAIJ
546*5808f684SSatish Balay# bs = 1
547*5808f684SSatish Balayclass TestMatSeqSBAIJ_G23(TestMatSeqSBAIJ):
548*5808f684SSatish Balay    GRID  = 2, 3
549*5808f684SSatish Balayclass TestMatSeqSBAIJ_G45(TestMatSeqSBAIJ):
550*5808f684SSatish Balay    GRID  = 4, 5
551*5808f684SSatish Balayclass TestMatSeqSBAIJ_G89(TestMatSeqSBAIJ):
552*5808f684SSatish Balay    GRID  = 8, 9
553*5808f684SSatish Balay# bs = 2
554*5808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B2(TestMatSeqSBAIJ_G23):
555*5808f684SSatish Balay    BSIZE = 2
556*5808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B2(TestMatSeqSBAIJ_G45):
557*5808f684SSatish Balay    BSIZE = 2
558*5808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B2(TestMatSeqSBAIJ_G89):
559*5808f684SSatish Balay    BSIZE = 2
560*5808f684SSatish Balay# bs = 3
561*5808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B3(TestMatSeqSBAIJ_G23):
562*5808f684SSatish Balay    BSIZE = 3
563*5808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B3(TestMatSeqSBAIJ_G45):
564*5808f684SSatish Balay    BSIZE = 3
565*5808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B3(TestMatSeqSBAIJ_G89):
566*5808f684SSatish Balay    BSIZE = 3
567*5808f684SSatish Balay# bs = 4
568*5808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B4(TestMatSeqSBAIJ_G23):
569*5808f684SSatish Balay    BSIZE = 4
570*5808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B4(TestMatSeqSBAIJ_G45):
571*5808f684SSatish Balay    BSIZE = 4
572*5808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B4(TestMatSeqSBAIJ_G89):
573*5808f684SSatish Balay    BSIZE = 4
574*5808f684SSatish Balay# bs = 5
575*5808f684SSatish Balayclass TestMatSeqSBAIJ_G23_B5(TestMatSeqSBAIJ_G23):
576*5808f684SSatish Balay    BSIZE = 5
577*5808f684SSatish Balayclass TestMatSeqSBAIJ_G45_B5(TestMatSeqSBAIJ_G45):
578*5808f684SSatish Balay    BSIZE = 5
579*5808f684SSatish Balayclass TestMatSeqSBAIJ_G89_B5(TestMatSeqSBAIJ_G89):
580*5808f684SSatish Balay    BSIZE = 5
581*5808f684SSatish Balay
582*5808f684SSatish Balay
583*5808f684SSatish Balay# -- MPI SymmBlock AIJ --
584*5808f684SSatish Balay
585*5808f684SSatish Balayclass TestMatMPISBAIJ(BaseTestMatSBAIJ):
586*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
587*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPISBAIJ
588*5808f684SSatish Balay# bs = 1
589*5808f684SSatish Balayclass TestMatMPISBAIJ_G23(TestMatMPISBAIJ):
590*5808f684SSatish Balay    GRID  = 2, 3
591*5808f684SSatish Balayclass TestMatMPISBAIJ_G45(TestMatMPISBAIJ):
592*5808f684SSatish Balay    GRID  = 4, 5
593*5808f684SSatish Balayclass TestMatMPISBAIJ_G89(TestMatMPISBAIJ):
594*5808f684SSatish Balay    GRID  = 8, 9
595*5808f684SSatish Balay# bs = 2
596*5808f684SSatish Balayclass TestMatMPISBAIJ_G23_B2(TestMatMPISBAIJ_G23):
597*5808f684SSatish Balay    BSIZE = 2
598*5808f684SSatish Balayclass TestMatMPISBAIJ_G45_B2(TestMatMPISBAIJ_G45):
599*5808f684SSatish Balay    BSIZE = 2
600*5808f684SSatish Balayclass TestMatMPISBAIJ_G89_B2(TestMatMPISBAIJ_G89):
601*5808f684SSatish Balay    BSIZE = 2
602*5808f684SSatish Balay# bs = 3
603*5808f684SSatish Balayclass TestMatMPISBAIJ_G23_B3(TestMatMPISBAIJ_G23):
604*5808f684SSatish Balay    BSIZE = 3
605*5808f684SSatish Balayclass TestMatMPISBAIJ_G45_B3(TestMatMPISBAIJ_G45):
606*5808f684SSatish Balay    BSIZE = 3
607*5808f684SSatish Balayclass TestMatMPISBAIJ_G89_B3(TestMatMPISBAIJ_G89):
608*5808f684SSatish Balay    BSIZE = 3
609*5808f684SSatish Balay# bs = 4
610*5808f684SSatish Balayclass TestMatMPISBAIJ_G23_B4(TestMatMPISBAIJ_G23):
611*5808f684SSatish Balay    BSIZE = 4
612*5808f684SSatish Balayclass TestMatMPISBAIJ_G45_B4(TestMatMPISBAIJ_G45):
613*5808f684SSatish Balay    BSIZE = 4
614*5808f684SSatish Balayclass TestMatMPISBAIJ_G89_B4(TestMatMPISBAIJ_G89):
615*5808f684SSatish Balay    BSIZE = 4
616*5808f684SSatish Balay# bs = 5
617*5808f684SSatish Balayclass TestMatMPISBAIJ_G23_B5(TestMatMPISBAIJ_G23):
618*5808f684SSatish Balay    BSIZE = 5
619*5808f684SSatish Balayclass TestMatMPISBAIJ_G45_B5(TestMatMPISBAIJ_G45):
620*5808f684SSatish Balay    BSIZE = 5
621*5808f684SSatish Balayclass TestMatMPISBAIJ_G89_B5(TestMatMPISBAIJ_G89):
622*5808f684SSatish Balay    BSIZE = 5
623*5808f684SSatish Balay
624*5808f684SSatish Balay# -- AIJ + Block ---------------
625*5808f684SSatish Balay
626*5808f684SSatish Balayclass BaseTestMatAIJ_B(BaseTestMatAnyAIJ, unittest.TestCase):
627*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
628*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJ
629*5808f684SSatish Balay    GRID  = 0, 0
630*5808f684SSatish Balay    BSIZE = 1
631*5808f684SSatish Balay
632*5808f684SSatish Balay    def testSetPreallocNNZ(self):pass
633*5808f684SSatish Balay    def testSetPreallocNNZ_2(self):pass
634*5808f684SSatish Balay    def testSetPreallocCSR(self):pass
635*5808f684SSatish Balay    def testSetPreallocCSR_2(self):pass
636*5808f684SSatish Balay    def testSetValues(self):
637*5808f684SSatish Balay        self._preallocate()
638*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
639*5808f684SSatish Balay        self.A.setOption(opt, True)
640*5808f684SSatish Balay        ai, aj, av = self._set_values()
641*5808f684SSatish Balay        self.A.assemble()
642*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
643*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
644*5808f684SSatish Balay        self.A.setOption(opt, True)
645*5808f684SSatish Balay        ai, aj, av = self._set_values()
646*5808f684SSatish Balay        self.A.assemble()
647*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
648*5808f684SSatish Balay    def testSetValuesIJV(self):
649*5808f684SSatish Balay        self._preallocate()
650*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
651*5808f684SSatish Balay        self.A.setOption(opt, True)
652*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
653*5808f684SSatish Balay        self.A.assemble()
654*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
655*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
656*5808f684SSatish Balay        self.A.setOption(opt, True)
657*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
658*5808f684SSatish Balay        self.A.assemble()
659*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
660*5808f684SSatish Balay    def _preallocate(self):
661*5808f684SSatish Balay        self.A.setPreallocationNNZ([5*self.BSIZE, 3*self.BSIZE])
662*5808f684SSatish Balay        self._chk_bs(self.A, self.BSIZE)
663*5808f684SSatish Balay    def _chk_aij(self, A, i, j):
664*5808f684SSatish Balay        bs = self.BSIZE or 1
665*5808f684SSatish Balay        ai, aj = A.getRowIJ()
666*5808f684SSatish Balay        if ai is not None and aj is not None:  ## XXX map and check !!
667*5808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
668*5808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
669*5808f684SSatish Balay            pass
670*5808f684SSatish Balay        ai, aj = A.getColumnIJ(compressed=bool(self.BSIZE))
671*5808f684SSatish Balay        if ai is not None and aj is not None: ## XXX map and check !!
672*5808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
673*5808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
674*5808f684SSatish Balay            pass
675*5808f684SSatish Balay
676*5808f684SSatish Balay# -- Seq AIJ + Block --
677*5808f684SSatish Balay
678*5808f684SSatish Balayclass TestMatSeqAIJ_B(BaseTestMatAIJ_B):
679*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
680*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJ
681*5808f684SSatish Balay# bs = 1
682*5808f684SSatish Balayclass TestMatSeqAIJ_B_G23(TestMatSeqAIJ_B):
683*5808f684SSatish Balay    GRID  = 2, 3
684*5808f684SSatish Balayclass TestMatSeqAIJ_B_G45(TestMatSeqAIJ_B):
685*5808f684SSatish Balay    GRID  = 4, 5
686*5808f684SSatish Balayclass TestMatSeqAIJ_B_G89(TestMatSeqAIJ_B):
687*5808f684SSatish Balay    GRID  = 8, 9
688*5808f684SSatish Balay# bs = 2
689*5808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B2(TestMatSeqAIJ_B_G23):
690*5808f684SSatish Balay    BSIZE = 2
691*5808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B2(TestMatSeqAIJ_B_G45):
692*5808f684SSatish Balay    BSIZE = 2
693*5808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B2(TestMatSeqAIJ_B_G89):
694*5808f684SSatish Balay    BSIZE = 2
695*5808f684SSatish Balay# bs = 3
696*5808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B3(TestMatSeqAIJ_B_G23):
697*5808f684SSatish Balay    BSIZE = 3
698*5808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B3(TestMatSeqAIJ_B_G45):
699*5808f684SSatish Balay    BSIZE = 3
700*5808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B3(TestMatSeqAIJ_B_G89):
701*5808f684SSatish Balay    BSIZE = 3
702*5808f684SSatish Balay# bs = 4
703*5808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B4(TestMatSeqAIJ_B_G23):
704*5808f684SSatish Balay    BSIZE = 4
705*5808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B4(TestMatSeqAIJ_B_G45):
706*5808f684SSatish Balay    BSIZE = 4
707*5808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B4(TestMatSeqAIJ_B_G89):
708*5808f684SSatish Balay    BSIZE = 4
709*5808f684SSatish Balay# bs = 5
710*5808f684SSatish Balayclass TestMatSeqAIJ_B_G23_B5(TestMatSeqAIJ_B_G23):
711*5808f684SSatish Balay    BSIZE = 5
712*5808f684SSatish Balayclass TestMatSeqAIJ_B_G45_B5(TestMatSeqAIJ_B_G45):
713*5808f684SSatish Balay    BSIZE = 5
714*5808f684SSatish Balayclass TestMatSeqAIJ_B_G89_B5(TestMatSeqAIJ_B_G89):
715*5808f684SSatish Balay    BSIZE = 5
716*5808f684SSatish Balay
717*5808f684SSatish Balay
718*5808f684SSatish Balay# -- MPI AIJ + Block --
719*5808f684SSatish Balay
720*5808f684SSatish Balayclass TestMatMPIAIJ_B(BaseTestMatAIJ_B):
721*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
722*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJ
723*5808f684SSatish Balay# bs = 1
724*5808f684SSatish Balayclass TestMatMPIAIJ_B_G23(TestMatMPIAIJ_B):
725*5808f684SSatish Balay    GRID  = 2, 3
726*5808f684SSatish Balayclass TestMatMPIAIJ_B_G45(TestMatMPIAIJ_B):
727*5808f684SSatish Balay    GRID  = 4, 5
728*5808f684SSatish Balayclass TestMatMPIAIJ_B_G89(TestMatMPIAIJ_B):
729*5808f684SSatish Balay    GRID  = 8, 9
730*5808f684SSatish Balay# bs = 2
731*5808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B2(TestMatMPIAIJ_B_G23):
732*5808f684SSatish Balay    BSIZE = 2
733*5808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B2(TestMatMPIAIJ_B_G45):
734*5808f684SSatish Balay    BSIZE = 2
735*5808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B2(TestMatMPIAIJ_B_G89):
736*5808f684SSatish Balay    BSIZE = 2
737*5808f684SSatish Balay# bs = 3
738*5808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B3(TestMatMPIAIJ_B_G23):
739*5808f684SSatish Balay    BSIZE = 3
740*5808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B3(TestMatMPIAIJ_B_G45):
741*5808f684SSatish Balay    BSIZE = 3
742*5808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B3(TestMatMPIAIJ_B_G89):
743*5808f684SSatish Balay    BSIZE = 3
744*5808f684SSatish Balay# bs = 4
745*5808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B4(TestMatMPIAIJ_B_G23):
746*5808f684SSatish Balay    BSIZE = 4
747*5808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B4(TestMatMPIAIJ_B_G45):
748*5808f684SSatish Balay    BSIZE = 4
749*5808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B4(TestMatMPIAIJ_B_G89):
750*5808f684SSatish Balay    BSIZE = 4
751*5808f684SSatish Balay# bs = 5
752*5808f684SSatish Balayclass TestMatMPIAIJ_B_G23_B5(TestMatMPIAIJ_B_G23):
753*5808f684SSatish Balay    BSIZE = 5
754*5808f684SSatish Balayclass TestMatMPIAIJ_B_G45_B5(TestMatMPIAIJ_B_G45):
755*5808f684SSatish Balay    BSIZE = 5
756*5808f684SSatish Balayclass TestMatMPIAIJ_B_G89_B5(TestMatMPIAIJ_B_G89):
757*5808f684SSatish Balay    BSIZE = 5
758*5808f684SSatish Balay
759*5808f684SSatish Balay# -- Non-square blocks --
760*5808f684SSatish Balayclass BaseTestMatAIJ_B(BaseTestMatAnyAIJ, unittest.TestCase):
761*5808f684SSatish Balay    COMM  = PETSc.COMM_WORLD
762*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJ
763*5808f684SSatish Balay    GRID  = 0, 0
764*5808f684SSatish Balay    BSIZE = 4, 2
765*5808f684SSatish Balay
766*5808f684SSatish Balay    def _preallocate(self):
767*5808f684SSatish Balay        try:
768*5808f684SSatish Balay            rbs, cbs = self.BSIZE
769*5808f684SSatish Balay        except (TypeError, ValueError):
770*5808f684SSatish Balay            rbs = cbs = self.BSIZE
771*5808f684SSatish Balay        self.A.setPreallocationNNZ([5*rbs, 3*cbs])
772*5808f684SSatish Balay        self._chk_bsizes(self.A, self.BSIZE)
773*5808f684SSatish Balay    def testSetPreallocNNZ(self):pass
774*5808f684SSatish Balay    def testSetPreallocNNZ_2(self):pass
775*5808f684SSatish Balay    def testSetPreallocCSR(self):pass
776*5808f684SSatish Balay    def testSetPreallocCSR_2(self):pass
777*5808f684SSatish Balay    def testSetValues(self):
778*5808f684SSatish Balay        self._preallocate()
779*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
780*5808f684SSatish Balay        self.A.setOption(opt, True)
781*5808f684SSatish Balay        ai, aj, av = self._set_values()
782*5808f684SSatish Balay        self.A.assemble()
783*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
784*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
785*5808f684SSatish Balay        self.A.setOption(opt, True)
786*5808f684SSatish Balay        ai, aj, av = self._set_values()
787*5808f684SSatish Balay        self.A.assemble()
788*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
789*5808f684SSatish Balay    def testSetValuesIJV(self):
790*5808f684SSatish Balay        self._preallocate()
791*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_ALLOCATION_ERR
792*5808f684SSatish Balay        self.A.setOption(opt, True)
793*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
794*5808f684SSatish Balay        self.A.assemble()
795*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
796*5808f684SSatish Balay        opt = PETSc.Mat.Option.NEW_NONZERO_LOCATION_ERR
797*5808f684SSatish Balay        self.A.setOption(opt, True)
798*5808f684SSatish Balay        ai, aj, av = self._set_values_ijv()
799*5808f684SSatish Balay        self.A.assemble()
800*5808f684SSatish Balay        self._chk_aij(self.A, ai, aj)
801*5808f684SSatish Balay    def _chk_aij(self, A, i, j):
802*5808f684SSatish Balay        bs = self.BSIZE or 1
803*5808f684SSatish Balay        ai, aj = A.getRowIJ()
804*5808f684SSatish Balay        if ai is not None and aj is not None:  ## XXX map and check !!
805*5808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
806*5808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
807*5808f684SSatish Balay            pass
808*5808f684SSatish Balay        ai, aj = A.getColumnIJ()
809*5808f684SSatish Balay        if ai is not None and aj is not None: ## XXX map and check !!
810*5808f684SSatish Balay            #self.assertTrue(N.all(i==ai))
811*5808f684SSatish Balay            #self.assertTrue(N.all(j==aj))
812*5808f684SSatish Balay            pass
813*5808f684SSatish Balay
814*5808f684SSatish Balay# -- AIJCRL ---------------------
815*5808f684SSatish Balay
816*5808f684SSatish Balayclass BaseTestMatAIJCRL(BaseTestMatAIJ, unittest.TestCase):
817*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJCRL
818*5808f684SSatish Balay
819*5808f684SSatish Balay# -- Seq AIJCRL --
820*5808f684SSatish Balay
821*5808f684SSatish Balayclass TestMatSeqAIJCRL(BaseTestMatAIJCRL):
822*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
823*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJCRL
824*5808f684SSatish Balayclass TestMatSeqAIJCRL_G23(TestMatSeqAIJCRL):
825*5808f684SSatish Balay    GRID  = 2, 3
826*5808f684SSatish Balayclass TestMatSeqAIJCRL_G45(TestMatSeqAIJCRL):
827*5808f684SSatish Balay    GRID  = 4, 5
828*5808f684SSatish Balayclass TestMatSeqAIJCRL_G89(TestMatSeqAIJCRL):
829*5808f684SSatish Balay    GRID  = 8, 9
830*5808f684SSatish Balay
831*5808f684SSatish Balay# -- MPI AIJCRL --
832*5808f684SSatish Balay
833*5808f684SSatish Balayclass TestMatMPIAIJCRL(BaseTestMatAIJCRL):
834*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
835*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJCRL
836*5808f684SSatish Balayclass TestMatMPIAIJCRL_G23(TestMatMPIAIJCRL):
837*5808f684SSatish Balay    GRID  = 2, 3
838*5808f684SSatish Balayclass TestMatMPIAIJCRL_G45(TestMatMPIAIJCRL):
839*5808f684SSatish Balay    GRID  = 4, 5
840*5808f684SSatish Balayclass TestMatMPIAIJCRL_G89(TestMatMPIAIJCRL):
841*5808f684SSatish Balay    GRID  = 8, 9
842*5808f684SSatish Balay
843*5808f684SSatish Balay# -- AIJCRL + Block -------------
844*5808f684SSatish Balay
845*5808f684SSatish Balayclass BaseTestMatAIJCRL_B(BaseTestMatAIJ_B, unittest.TestCase):
846*5808f684SSatish Balay    TYPE  = PETSc.Mat.Type.AIJCRL
847*5808f684SSatish Balay
848*5808f684SSatish Balay# -- Seq AIJCRL + Block --
849*5808f684SSatish Balay
850*5808f684SSatish Balayclass TestMatSeqAIJCRL_B(BaseTestMatAIJCRL_B):
851*5808f684SSatish Balay    COMM = PETSc.COMM_SELF
852*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.SEQAIJCRL
853*5808f684SSatish Balay# bs = 1
854*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23(TestMatSeqAIJCRL_B):
855*5808f684SSatish Balay    GRID  = 2, 3
856*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45(TestMatSeqAIJCRL_B):
857*5808f684SSatish Balay    GRID  = 4, 5
858*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89(TestMatSeqAIJCRL_B):
859*5808f684SSatish Balay    GRID  = 8, 9
860*5808f684SSatish Balay# bs = 2
861*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B2(TestMatSeqAIJCRL_B_G23):
862*5808f684SSatish Balay    BSIZE = 2
863*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B2(TestMatSeqAIJCRL_B_G45):
864*5808f684SSatish Balay    BSIZE = 2
865*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B2(TestMatSeqAIJCRL_B_G89):
866*5808f684SSatish Balay    BSIZE = 2
867*5808f684SSatish Balay# bs = 3
868*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B3(TestMatSeqAIJCRL_B_G23):
869*5808f684SSatish Balay    BSIZE = 3
870*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B3(TestMatSeqAIJCRL_B_G45):
871*5808f684SSatish Balay    BSIZE = 3
872*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B3(TestMatSeqAIJCRL_B_G89):
873*5808f684SSatish Balay    BSIZE = 3
874*5808f684SSatish Balay# bs = 4
875*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B4(TestMatSeqAIJCRL_B_G23):
876*5808f684SSatish Balay    BSIZE = 4
877*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B4(TestMatSeqAIJCRL_B_G45):
878*5808f684SSatish Balay    BSIZE = 4
879*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B4(TestMatSeqAIJCRL_B_G89):
880*5808f684SSatish Balay    BSIZE = 4
881*5808f684SSatish Balay# bs = 5
882*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G23_B5(TestMatSeqAIJCRL_B_G23):
883*5808f684SSatish Balay    BSIZE = 5
884*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G45_B5(TestMatSeqAIJCRL_B_G45):
885*5808f684SSatish Balay    BSIZE = 5
886*5808f684SSatish Balayclass TestMatSeqAIJCRL_B_G89_B5(TestMatSeqAIJCRL_B_G89):
887*5808f684SSatish Balay    BSIZE = 5
888*5808f684SSatish Balay
889*5808f684SSatish Balay
890*5808f684SSatish Balay# -- MPI AIJCRL + Block --
891*5808f684SSatish Balay
892*5808f684SSatish Balayclass TestMatMPIAIJCRL_B(BaseTestMatAIJCRL_B):
893*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
894*5808f684SSatish Balay    TYPE = PETSc.Mat.Type.MPIAIJCRL
895*5808f684SSatish Balay# bs = 1
896*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23(TestMatMPIAIJCRL_B):
897*5808f684SSatish Balay    GRID  = 2, 3
898*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45(TestMatMPIAIJCRL_B):
899*5808f684SSatish Balay    GRID  = 4, 5
900*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89(TestMatMPIAIJCRL_B):
901*5808f684SSatish Balay    GRID  = 8, 9
902*5808f684SSatish Balay# bs = 2
903*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B2(TestMatMPIAIJCRL_B_G23):
904*5808f684SSatish Balay    BSIZE = 2
905*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B2(TestMatMPIAIJCRL_B_G45):
906*5808f684SSatish Balay    BSIZE = 2
907*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B2(TestMatMPIAIJCRL_B_G89):
908*5808f684SSatish Balay    BSIZE = 2
909*5808f684SSatish Balay# bs = 3
910*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B3(TestMatMPIAIJCRL_B_G23):
911*5808f684SSatish Balay    BSIZE = 3
912*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B3(TestMatMPIAIJCRL_B_G45):
913*5808f684SSatish Balay    BSIZE = 3
914*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B3(TestMatMPIAIJCRL_B_G89):
915*5808f684SSatish Balay    BSIZE = 3
916*5808f684SSatish Balay# bs = 4
917*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B4(TestMatMPIAIJCRL_B_G23):
918*5808f684SSatish Balay    BSIZE = 4
919*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B4(TestMatMPIAIJCRL_B_G45):
920*5808f684SSatish Balay    BSIZE = 4
921*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B4(TestMatMPIAIJCRL_B_G89):
922*5808f684SSatish Balay    BSIZE = 4
923*5808f684SSatish Balay# bs = 5
924*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G23_B5(TestMatMPIAIJCRL_B_G23):
925*5808f684SSatish Balay    BSIZE = 5
926*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G45_B5(TestMatMPIAIJCRL_B_G45):
927*5808f684SSatish Balay    BSIZE = 5
928*5808f684SSatish Balayclass TestMatMPIAIJCRL_B_G89_B5(TestMatMPIAIJCRL_B_G89):
929*5808f684SSatish Balay    BSIZE = 5
930*5808f684SSatish Balay
931*5808f684SSatish Balay# -----
932*5808f684SSatish Balay
933*5808f684SSatish Balay
934*5808f684SSatish Balay
935*5808f684SSatish Balayif __name__ == '__main__':
936*5808f684SSatish Balay    unittest.main()
937