1*5808f684SSatish Balayfrom petsc4py import PETSc 2*5808f684SSatish Balayimport unittest 3*5808f684SSatish Balay 4*5808f684SSatish Balayimport numpy as np 5*5808f684SSatish Balay 6*5808f684SSatish Balaydef mkdata(comm, m, N, bs): 7*5808f684SSatish Balay start = m * comm.rank 8*5808f684SSatish Balay end = start + m 9*5808f684SSatish Balay idt = PETSc.IntType 10*5808f684SSatish Balay sdt = PETSc.ScalarType 11*5808f684SSatish Balay rows = np.array(range(start, end), dtype=idt) 12*5808f684SSatish Balay cols = np.array(range(0, N), dtype=idt) 13*5808f684SSatish Balay vals = np.array(range(0, m*N*bs*bs), dtype=sdt) 14*5808f684SSatish Balay vals.shape = (-1, bs, bs) 15*5808f684SSatish Balay return rows, cols, vals 16*5808f684SSatish Balay 17*5808f684SSatish Balay 18*5808f684SSatish Balayclass BaseTestMatAnyDense(object): 19*5808f684SSatish Balay 20*5808f684SSatish Balay COMM = PETSc.COMM_NULL 21*5808f684SSatish Balay GRID = 0, 0 22*5808f684SSatish Balay BSIZE = None 23*5808f684SSatish Balay TYPE = PETSc.Mat.Type.DENSE 24*5808f684SSatish Balay 25*5808f684SSatish Balay def setUp(self): 26*5808f684SSatish Balay COMM = self.COMM 27*5808f684SSatish Balay GM, GN = self.GRID 28*5808f684SSatish Balay BS = self.BSIZE #or 1 29*5808f684SSatish Balay # 30*5808f684SSatish Balay self.A = PETSc.Mat().create(comm=COMM) 31*5808f684SSatish Balay bs = BS or 1; m, N = GM, GN; 32*5808f684SSatish Balay rowsz = (m*bs, None) 33*5808f684SSatish Balay colsz = (None, N*bs) 34*5808f684SSatish Balay self.A.setSizes([rowsz, colsz], BS) 35*5808f684SSatish Balay self.A.setType(self.TYPE) 36*5808f684SSatish Balay 37*5808f684SSatish Balay def tearDown(self): 38*5808f684SSatish Balay self.A.destroy() 39*5808f684SSatish Balay self.A = None 40*5808f684SSatish Balay 41*5808f684SSatish Balay def testSetValues(self): 42*5808f684SSatish Balay self._preallocate() 43*5808f684SSatish Balay r, c, v = self._set_values() 44*5808f684SSatish Balay self.A.assemble() 45*5808f684SSatish Balay self._chk_array(self.A, r, c, v) 46*5808f684SSatish Balay r, c, v = self._set_values() 47*5808f684SSatish Balay self.A.assemble() 48*5808f684SSatish Balay self._chk_array(self.A, r, c, v) 49*5808f684SSatish Balay 50*5808f684SSatish Balay def testGetDiagonalBlock(self): 51*5808f684SSatish Balay M, N = self.A.getSize() 52*5808f684SSatish Balay # only for square matrices 53*5808f684SSatish Balay if M != N: return 54*5808f684SSatish Balay self._preallocate() 55*5808f684SSatish Balay self._set_values() 56*5808f684SSatish Balay self.A.assemble() 57*5808f684SSatish Balay B = self.A.getDiagonalBlock() 58*5808f684SSatish Balay self.assertEqual(self.A.getLocalSize(), B.getSize()) 59*5808f684SSatish Balay B.destroy() 60*5808f684SSatish Balay 61*5808f684SSatish Balay def testCreateTranspose(self): 62*5808f684SSatish Balay self._preallocate() 63*5808f684SSatish Balay self._set_values() 64*5808f684SSatish Balay self.A.assemble() 65*5808f684SSatish Balay A = self.A 66*5808f684SSatish Balay AT = PETSc.Mat().createTranspose(A) 67*5808f684SSatish Balay x, y = A.createVecs() 68*5808f684SSatish Balay xt, yt = AT.createVecs() 69*5808f684SSatish Balay # 70*5808f684SSatish Balay y.setRandom() 71*5808f684SSatish Balay A.multTranspose(y, x) 72*5808f684SSatish Balay y.copy(xt) 73*5808f684SSatish Balay AT.mult(xt, yt) 74*5808f684SSatish Balay self.assertTrue(yt.equal(x)) 75*5808f684SSatish Balay # 76*5808f684SSatish Balay x.setRandom() 77*5808f684SSatish Balay A.mult(x, y) 78*5808f684SSatish Balay x.copy(yt) 79*5808f684SSatish Balay AT.multTranspose(yt, xt) 80*5808f684SSatish Balay self.assertTrue(xt.equal(y)) 81*5808f684SSatish Balay 82*5808f684SSatish Balay def _preallocate(self): 83*5808f684SSatish Balay self.A.setPreallocationDense(None) 84*5808f684SSatish Balay 85*5808f684SSatish Balay def _set_values(self): 86*5808f684SSatish Balay COMM = self.COMM 87*5808f684SSatish Balay GM, GN = self.GRID 88*5808f684SSatish Balay BS = self.BSIZE or 1 89*5808f684SSatish Balay rows, cols, vals = mkdata(COMM, GM, GN, BS) 90*5808f684SSatish Balay if not self.BSIZE: 91*5808f684SSatish Balay setvalues = self.A.setValues 92*5808f684SSatish Balay else: 93*5808f684SSatish Balay setvalues = self.A.setValuesBlocked 94*5808f684SSatish Balay setvalues(rows, cols, vals) 95*5808f684SSatish Balay return rows, cols, vals 96*5808f684SSatish Balay 97*5808f684SSatish Balay def _chk_bs(self, A, bs): 98*5808f684SSatish Balay self.assertEqual(A.getBlockSize(), bs or 1) 99*5808f684SSatish Balay 100*5808f684SSatish Balay def _chk_array(self, A, r, c, v): 101*5808f684SSatish Balay return # XXX 102*5808f684SSatish Balay vals = self.A.getValues(r, c) 103*5808f684SSatish Balay vals.shape = v.shape 104*5808f684SSatish Balay self.assertTrue(np.allclose(vals, v)) 105*5808f684SSatish Balay 106*5808f684SSatish Balay 107*5808f684SSatish Balay# -- Dense --------------------- 108*5808f684SSatish Balay 109*5808f684SSatish Balayclass BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 110*5808f684SSatish Balay COMM = PETSc.COMM_WORLD 111*5808f684SSatish Balay GRID = 0, 0 112*5808f684SSatish Balay BSIZE = None 113*5808f684SSatish Balay 114*5808f684SSatish Balay# -- Seq Dense -- 115*5808f684SSatish Balay 116*5808f684SSatish Balayclass TestMatSeqDense(BaseTestMatDense): 117*5808f684SSatish Balay COMM = PETSc.COMM_SELF 118*5808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 119*5808f684SSatish Balayclass TestMatSeqDense_G23(TestMatSeqDense): 120*5808f684SSatish Balay GRID = 2, 3 121*5808f684SSatish Balayclass TestMatSeqDense_G45(TestMatSeqDense): 122*5808f684SSatish Balay GRID = 4, 5 123*5808f684SSatish Balayclass TestMatSeqDense_G77(TestMatSeqDense): 124*5808f684SSatish Balay GRID = 7, 7 125*5808f684SSatish Balayclass TestMatSeqDense_G89(TestMatSeqDense): 126*5808f684SSatish Balay GRID = 8, 9 127*5808f684SSatish Balay 128*5808f684SSatish Balay# -- MPI Dense -- 129*5808f684SSatish Balay 130*5808f684SSatish Balayclass TestMatMPIDense(BaseTestMatDense): 131*5808f684SSatish Balay COMM = PETSc.COMM_WORLD 132*5808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 133*5808f684SSatish Balayclass TestMatMPIDense_G23(TestMatMPIDense): 134*5808f684SSatish Balay GRID = 2, 3 135*5808f684SSatish Balayclass TestMatMPIDense_G45(TestMatMPIDense): 136*5808f684SSatish Balay GRID = 4, 5 137*5808f684SSatish Balayclass TestMatMPIDense_G77(TestMatMPIDense): 138*5808f684SSatish Balay GRID = 7, 7 139*5808f684SSatish Balayclass TestMatMPIDense_G89(TestMatMPIDense): 140*5808f684SSatish Balay GRID = 8, 9 141*5808f684SSatish Balay 142*5808f684SSatish Balay 143*5808f684SSatish Balay# -- Dense + Block --------------- 144*5808f684SSatish Balay 145*5808f684SSatish Balayclass BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 146*5808f684SSatish Balay COMM = PETSc.COMM_WORLD 147*5808f684SSatish Balay GRID = 0, 0 148*5808f684SSatish Balay BSIZE = 1 149*5808f684SSatish Balay def _preallocate(self): 150*5808f684SSatish Balay #self.A.setBlockSize(self.BSIZE) 151*5808f684SSatish Balay self.A.setPreallocationDense(None) 152*5808f684SSatish Balay #self.A.setBlockSize(self.BSIZE) 153*5808f684SSatish Balay self._chk_bs(self.A, self.BSIZE) 154*5808f684SSatish Balay 155*5808f684SSatish Balay# -- Seq Dense + Block -- 156*5808f684SSatish Balay 157*5808f684SSatish Balayclass TestMatSeqDense_B(BaseTestMatDense_B): 158*5808f684SSatish Balay COMM = PETSc.COMM_SELF 159*5808f684SSatish Balay TYPE = PETSc.Mat.Type.SEQDENSE 160*5808f684SSatish Balay# bs = 1 161*5808f684SSatish Balayclass TestMatSeqDense_B_G23(TestMatSeqDense_B): 162*5808f684SSatish Balay GRID = 2, 3 163*5808f684SSatish Balayclass TestMatSeqDense_B_G45(TestMatSeqDense_B): 164*5808f684SSatish Balay GRID = 4, 5 165*5808f684SSatish Balayclass TestMatSeqDense_B_G89(TestMatSeqDense_B): 166*5808f684SSatish Balay GRID = 8, 9 167*5808f684SSatish Balay# bs = 2 168*5808f684SSatish Balayclass TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 169*5808f684SSatish Balay BSIZE = 2 170*5808f684SSatish Balayclass TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 171*5808f684SSatish Balay BSIZE = 2 172*5808f684SSatish Balayclass TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 173*5808f684SSatish Balay BSIZE = 2 174*5808f684SSatish Balay# bs = 3 175*5808f684SSatish Balayclass TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 176*5808f684SSatish Balay BSIZE = 3 177*5808f684SSatish Balayclass TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 178*5808f684SSatish Balay BSIZE = 3 179*5808f684SSatish Balayclass TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 180*5808f684SSatish Balay BSIZE = 3 181*5808f684SSatish Balay# bs = 4 182*5808f684SSatish Balayclass TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 183*5808f684SSatish Balay BSIZE = 4 184*5808f684SSatish Balayclass TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 185*5808f684SSatish Balay BSIZE = 4 186*5808f684SSatish Balayclass TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 187*5808f684SSatish Balay BSIZE = 4 188*5808f684SSatish Balay# bs = 5 189*5808f684SSatish Balayclass TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 190*5808f684SSatish Balay BSIZE = 5 191*5808f684SSatish Balayclass TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 192*5808f684SSatish Balay BSIZE = 5 193*5808f684SSatish Balayclass TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 194*5808f684SSatish Balay BSIZE = 5 195*5808f684SSatish Balay 196*5808f684SSatish Balay 197*5808f684SSatish Balay# -- MPI Dense + Block -- 198*5808f684SSatish Balay 199*5808f684SSatish Balayclass TestMatMPIDense_B(BaseTestMatDense_B): 200*5808f684SSatish Balay COMM = PETSc.COMM_WORLD 201*5808f684SSatish Balay TYPE = PETSc.Mat.Type.MPIDENSE 202*5808f684SSatish Balay# bs = 1 203*5808f684SSatish Balayclass TestMatMPIDense_B_G23(TestMatMPIDense_B): 204*5808f684SSatish Balay GRID = 2, 3 205*5808f684SSatish Balayclass TestMatMPIDense_B_G45(TestMatMPIDense_B): 206*5808f684SSatish Balay GRID = 4, 5 207*5808f684SSatish Balayclass TestMatMPIDense_B_G77(TestMatMPIDense_B): 208*5808f684SSatish Balay GRID = 7, 7 209*5808f684SSatish Balayclass TestMatMPIDense_B_G89(TestMatMPIDense_B): 210*5808f684SSatish Balay GRID = 8, 9 211*5808f684SSatish Balay# bs = 2 212*5808f684SSatish Balayclass TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 213*5808f684SSatish Balay BSIZE = 2 214*5808f684SSatish Balayclass TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 215*5808f684SSatish Balay BSIZE = 2 216*5808f684SSatish Balayclass TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 217*5808f684SSatish Balay BSIZE = 2 218*5808f684SSatish Balayclass TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 219*5808f684SSatish Balay BSIZE = 2 220*5808f684SSatish Balay# bs = 3 221*5808f684SSatish Balayclass TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 222*5808f684SSatish Balay BSIZE = 3 223*5808f684SSatish Balayclass TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 224*5808f684SSatish Balay BSIZE = 3 225*5808f684SSatish Balayclass TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 226*5808f684SSatish Balay BSIZE = 3 227*5808f684SSatish Balayclass TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 228*5808f684SSatish Balay BSIZE = 3 229*5808f684SSatish Balay# bs = 4 230*5808f684SSatish Balayclass TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 231*5808f684SSatish Balay BSIZE = 4 232*5808f684SSatish Balayclass TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 233*5808f684SSatish Balay BSIZE = 4 234*5808f684SSatish Balayclass TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 235*5808f684SSatish Balay BSIZE = 4 236*5808f684SSatish Balayclass TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 237*5808f684SSatish Balay BSIZE = 4 238*5808f684SSatish Balay# bs = 5 239*5808f684SSatish Balayclass TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 240*5808f684SSatish Balay BSIZE = 5 241*5808f684SSatish Balayclass TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 242*5808f684SSatish Balay BSIZE = 5 243*5808f684SSatish Balayclass TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 244*5808f684SSatish Balay BSIZE = 5 245*5808f684SSatish Balayclass TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 246*5808f684SSatish Balay BSIZE = 5 247*5808f684SSatish Balay 248*5808f684SSatish Balay# ----- 249*5808f684SSatish Balay 250*5808f684SSatish Balayif __name__ == '__main__': 251*5808f684SSatish Balay unittest.main() 252