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