1from petsc4py import PETSc 2import unittest 3 4import numpy as np 5 6 7def mkdata(comm, m, N, bs): 8 start = m * comm.rank 9 end = start + m 10 idt = PETSc.IntType 11 sdt = PETSc.ScalarType 12 rows = np.array(range(start, end), dtype=idt) 13 cols = np.array(range(N), dtype=idt) 14 vals = np.array(range(m * N * bs * bs), dtype=sdt) 15 vals.shape = (-1, bs, bs) 16 return rows, cols, vals 17 18 19class BaseTestMatAnyDense: 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 32 m, N = GM, GN 33 rowsz = (m * bs, None) 34 colsz = (None, N * bs) 35 self.A.setSizes([rowsz, colsz], BS) 36 self.A.setType(self.TYPE) 37 38 def tearDown(self): 39 self.A.destroy() 40 self.A = None 41 PETSc.garbage_cleanup() 42 43 def testSetValues(self): 44 self._preallocate() 45 r, c, v = self._set_values() 46 self.A.assemble() 47 self._chk_array(self.A, r, c, v) 48 r, c, v = self._set_values() 49 self.A.assemble() 50 self._chk_array(self.A, r, c, v) 51 52 def testGetDiagonalBlock(self): 53 M, N = self.A.getSize() 54 # only for square matrices 55 if M != N: 56 return 57 self._preallocate() 58 self._set_values() 59 self.A.assemble() 60 B = self.A.getDiagonalBlock() 61 self.assertEqual(self.A.getLocalSize(), B.getSize()) 62 B.destroy() 63 64 def testCreateTranspose(self): 65 self._preallocate() 66 self._set_values() 67 self.A.assemble() 68 A = self.A 69 AT = PETSc.Mat().createTranspose(A) 70 x, y = A.createVecs() 71 xt, yt = AT.createVecs() 72 # 73 y.setRandom() 74 A.multTranspose(y, x) 75 y.copy(xt) 76 AT.mult(xt, yt) 77 self.assertTrue(yt.equal(x)) 78 # 79 x.setRandom() 80 A.mult(x, y) 81 x.copy(yt) 82 AT.multTranspose(yt, xt) 83 self.assertTrue(xt.equal(y)) 84 85 def _preallocate(self): 86 self.A.setPreallocationDense(None) 87 88 def _set_values(self): 89 COMM = self.COMM 90 GM, GN = self.GRID 91 BS = self.BSIZE or 1 92 rows, cols, vals = mkdata(COMM, GM, GN, BS) 93 if not self.BSIZE: 94 setvalues = self.A.setValues 95 else: 96 setvalues = self.A.setValuesBlocked 97 setvalues(rows, cols, vals) 98 return rows, cols, vals 99 100 def _chk_bs(self, A, bs): 101 self.assertEqual(A.getBlockSize(), bs or 1) 102 103 def _chk_array(self, A, r, c, v): 104 return # XXX 105 vals = self.A.getValues(r, c) 106 vals.shape = v.shape 107 self.assertTrue(np.allclose(vals, v)) 108 109 110# -- Dense --------------------- 111 112 113class BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 114 COMM = PETSc.COMM_WORLD 115 GRID = 0, 0 116 BSIZE = None 117 118 119# -- Seq Dense -- 120 121 122class TestMatSeqDense(BaseTestMatDense): 123 COMM = PETSc.COMM_SELF 124 TYPE = PETSc.Mat.Type.SEQDENSE 125 126 127class TestMatSeqDense_G23(TestMatSeqDense): 128 GRID = 2, 3 129 130 131class TestMatSeqDense_G45(TestMatSeqDense): 132 GRID = 4, 5 133 134 135class TestMatSeqDense_G77(TestMatSeqDense): 136 GRID = 7, 7 137 138 139class TestMatSeqDense_G89(TestMatSeqDense): 140 GRID = 8, 9 141 142 143# -- MPI Dense -- 144 145 146class TestMatMPIDense(BaseTestMatDense): 147 COMM = PETSc.COMM_WORLD 148 TYPE = PETSc.Mat.Type.MPIDENSE 149 150 151class TestMatMPIDense_G23(TestMatMPIDense): 152 GRID = 2, 3 153 154 155class TestMatMPIDense_G45(TestMatMPIDense): 156 GRID = 4, 5 157 158 159class TestMatMPIDense_G77(TestMatMPIDense): 160 GRID = 7, 7 161 162 163class TestMatMPIDense_G89(TestMatMPIDense): 164 GRID = 8, 9 165 166 167# -- Dense + Block --------------- 168 169 170class BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 171 COMM = PETSc.COMM_WORLD 172 GRID = 0, 0 173 BSIZE = 1 174 175 def _preallocate(self): 176 # self.A.setBlockSize(self.BSIZE) 177 self.A.setPreallocationDense(None) 178 # self.A.setBlockSize(self.BSIZE) 179 self._chk_bs(self.A, self.BSIZE) 180 181 182# -- Seq Dense + Block -- 183 184 185class TestMatSeqDense_B(BaseTestMatDense_B): 186 COMM = PETSc.COMM_SELF 187 TYPE = PETSc.Mat.Type.SEQDENSE 188 189 190# bs = 1 191class TestMatSeqDense_B_G23(TestMatSeqDense_B): 192 GRID = 2, 3 193 194 195class TestMatSeqDense_B_G45(TestMatSeqDense_B): 196 GRID = 4, 5 197 198 199class TestMatSeqDense_B_G89(TestMatSeqDense_B): 200 GRID = 8, 9 201 202 203# bs = 2 204class TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 205 BSIZE = 2 206 207 208class TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 209 BSIZE = 2 210 211 212class TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 213 BSIZE = 2 214 215 216# bs = 3 217class TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 218 BSIZE = 3 219 220 221class TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 222 BSIZE = 3 223 224 225class TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 226 BSIZE = 3 227 228 229# bs = 4 230class TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 231 BSIZE = 4 232 233 234class TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 235 BSIZE = 4 236 237 238class TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 239 BSIZE = 4 240 241 242# bs = 5 243class TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 244 BSIZE = 5 245 246 247class TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 248 BSIZE = 5 249 250 251class TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 252 BSIZE = 5 253 254 255# -- MPI Dense + Block -- 256 257 258class TestMatMPIDense_B(BaseTestMatDense_B): 259 COMM = PETSc.COMM_WORLD 260 TYPE = PETSc.Mat.Type.MPIDENSE 261 262 263# bs = 1 264class TestMatMPIDense_B_G23(TestMatMPIDense_B): 265 GRID = 2, 3 266 267 268class TestMatMPIDense_B_G45(TestMatMPIDense_B): 269 GRID = 4, 5 270 271 272class TestMatMPIDense_B_G77(TestMatMPIDense_B): 273 GRID = 7, 7 274 275 276class TestMatMPIDense_B_G89(TestMatMPIDense_B): 277 GRID = 8, 9 278 279 280# bs = 2 281class TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 282 BSIZE = 2 283 284 285class TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 286 BSIZE = 2 287 288 289class TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 290 BSIZE = 2 291 292 293class TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 294 BSIZE = 2 295 296 297# bs = 3 298class TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 299 BSIZE = 3 300 301 302class TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 303 BSIZE = 3 304 305 306class TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 307 BSIZE = 3 308 309 310class TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 311 BSIZE = 3 312 313 314# bs = 4 315class TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 316 BSIZE = 4 317 318 319class TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 320 BSIZE = 4 321 322 323class TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 324 BSIZE = 4 325 326 327class TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 328 BSIZE = 4 329 330 331# bs = 5 332class TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 333 BSIZE = 5 334 335 336class TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 337 BSIZE = 5 338 339 340class TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 341 BSIZE = 5 342 343 344class TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 345 BSIZE = 5 346 347 348# ----- 349 350if __name__ == '__main__': 351 unittest.main() 352