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