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 underlyingA = AT.getTransposeMat() 86 self.assertTrue(underlyingA.equal(A)) 87 88 def _preallocate(self): 89 self.A.setPreallocationDense(None) 90 91 def _set_values(self): 92 COMM = self.COMM 93 GM, GN = self.GRID 94 BS = self.BSIZE or 1 95 rows, cols, vals = mkdata(COMM, GM, GN, BS) 96 if not self.BSIZE: 97 setvalues = self.A.setValues 98 else: 99 setvalues = self.A.setValuesBlocked 100 setvalues(rows, cols, vals) 101 return rows, cols, vals 102 103 def _chk_bs(self, A, bs): 104 self.assertEqual(A.getBlockSize(), bs or 1) 105 106 def _chk_array(self, A, r, c, v): 107 return # XXX 108 vals = self.A.getValues(r, c) 109 vals.shape = v.shape 110 self.assertTrue(np.allclose(vals, v)) 111 112 113# -- Dense --------------------- 114 115 116class BaseTestMatDense(BaseTestMatAnyDense, unittest.TestCase): 117 COMM = PETSc.COMM_WORLD 118 GRID = 0, 0 119 BSIZE = None 120 121 122# -- Seq Dense -- 123 124 125class TestMatSeqDense(BaseTestMatDense): 126 COMM = PETSc.COMM_SELF 127 TYPE = PETSc.Mat.Type.SEQDENSE 128 129 130class TestMatSeqDense_G23(TestMatSeqDense): 131 GRID = 2, 3 132 133 134class TestMatSeqDense_G45(TestMatSeqDense): 135 GRID = 4, 5 136 137 138class TestMatSeqDense_G77(TestMatSeqDense): 139 GRID = 7, 7 140 141 142class TestMatSeqDense_G89(TestMatSeqDense): 143 GRID = 8, 9 144 145 146# -- MPI Dense -- 147 148 149class TestMatMPIDense(BaseTestMatDense): 150 COMM = PETSc.COMM_WORLD 151 TYPE = PETSc.Mat.Type.MPIDENSE 152 153 154class TestMatMPIDense_G23(TestMatMPIDense): 155 GRID = 2, 3 156 157 158class TestMatMPIDense_G45(TestMatMPIDense): 159 GRID = 4, 5 160 161 162class TestMatMPIDense_G77(TestMatMPIDense): 163 GRID = 7, 7 164 165 166class TestMatMPIDense_G89(TestMatMPIDense): 167 GRID = 8, 9 168 169 170# -- Dense + Block --------------- 171 172 173class BaseTestMatDense_B(BaseTestMatAnyDense, unittest.TestCase): 174 COMM = PETSc.COMM_WORLD 175 GRID = 0, 0 176 BSIZE = 1 177 178 def _preallocate(self): 179 # self.A.setBlockSize(self.BSIZE) 180 self.A.setPreallocationDense(None) 181 # self.A.setBlockSize(self.BSIZE) 182 self._chk_bs(self.A, self.BSIZE) 183 184 185# -- Seq Dense + Block -- 186 187 188class TestMatSeqDense_B(BaseTestMatDense_B): 189 COMM = PETSc.COMM_SELF 190 TYPE = PETSc.Mat.Type.SEQDENSE 191 192 193# bs = 1 194class TestMatSeqDense_B_G23(TestMatSeqDense_B): 195 GRID = 2, 3 196 197 198class TestMatSeqDense_B_G45(TestMatSeqDense_B): 199 GRID = 4, 5 200 201 202class TestMatSeqDense_B_G89(TestMatSeqDense_B): 203 GRID = 8, 9 204 205 206# bs = 2 207class TestMatSeqDense_B_G23_B2(TestMatSeqDense_B_G23): 208 BSIZE = 2 209 210 211class TestMatSeqDense_B_G45_B2(TestMatSeqDense_B_G45): 212 BSIZE = 2 213 214 215class TestMatSeqDense_B_G89_B2(TestMatSeqDense_B_G89): 216 BSIZE = 2 217 218 219# bs = 3 220class TestMatSeqDense_B_G23_B3(TestMatSeqDense_B_G23): 221 BSIZE = 3 222 223 224class TestMatSeqDense_B_G45_B3(TestMatSeqDense_B_G45): 225 BSIZE = 3 226 227 228class TestMatSeqDense_B_G89_B3(TestMatSeqDense_B_G89): 229 BSIZE = 3 230 231 232# bs = 4 233class TestMatSeqDense_B_G23_B4(TestMatSeqDense_B_G23): 234 BSIZE = 4 235 236 237class TestMatSeqDense_B_G45_B4(TestMatSeqDense_B_G45): 238 BSIZE = 4 239 240 241class TestMatSeqDense_B_G89_B4(TestMatSeqDense_B_G89): 242 BSIZE = 4 243 244 245# bs = 5 246class TestMatSeqDense_B_G23_B5(TestMatSeqDense_B_G23): 247 BSIZE = 5 248 249 250class TestMatSeqDense_B_G45_B5(TestMatSeqDense_B_G45): 251 BSIZE = 5 252 253 254class TestMatSeqDense_B_G89_B5(TestMatSeqDense_B_G89): 255 BSIZE = 5 256 257 258# -- MPI Dense + Block -- 259 260 261class TestMatMPIDense_B(BaseTestMatDense_B): 262 COMM = PETSc.COMM_WORLD 263 TYPE = PETSc.Mat.Type.MPIDENSE 264 265 266# bs = 1 267class TestMatMPIDense_B_G23(TestMatMPIDense_B): 268 GRID = 2, 3 269 270 271class TestMatMPIDense_B_G45(TestMatMPIDense_B): 272 GRID = 4, 5 273 274 275class TestMatMPIDense_B_G77(TestMatMPIDense_B): 276 GRID = 7, 7 277 278 279class TestMatMPIDense_B_G89(TestMatMPIDense_B): 280 GRID = 8, 9 281 282 283# bs = 2 284class TestMatMPIDense_B_G23_B2(TestMatMPIDense_B_G23): 285 BSIZE = 2 286 287 288class TestMatMPIDense_B_G45_B2(TestMatMPIDense_B_G45): 289 BSIZE = 2 290 291 292class TestMatMPIDense_B_G77_B2(TestMatMPIDense_B_G77): 293 BSIZE = 2 294 295 296class TestMatMPIDense_B_G89_B2(TestMatMPIDense_B_G89): 297 BSIZE = 2 298 299 300# bs = 3 301class TestMatMPIDense_B_G23_B3(TestMatMPIDense_B_G23): 302 BSIZE = 3 303 304 305class TestMatMPIDense_B_G45_B3(TestMatMPIDense_B_G45): 306 BSIZE = 3 307 308 309class TestMatMPIDense_B_G77_B3(TestMatMPIDense_B_G77): 310 BSIZE = 3 311 312 313class TestMatMPIDense_B_G89_B3(TestMatMPIDense_B_G89): 314 BSIZE = 3 315 316 317# bs = 4 318class TestMatMPIDense_B_G23_B4(TestMatMPIDense_B_G23): 319 BSIZE = 4 320 321 322class TestMatMPIDense_B_G45_B4(TestMatMPIDense_B_G45): 323 BSIZE = 4 324 325 326class TestMatMPIDense_B_G77_B4(TestMatMPIDense_B_G77): 327 BSIZE = 4 328 329 330class TestMatMPIDense_B_G89_B4(TestMatMPIDense_B_G89): 331 BSIZE = 4 332 333 334# bs = 5 335class TestMatMPIDense_B_G23_B5(TestMatMPIDense_B_G23): 336 BSIZE = 5 337 338 339class TestMatMPIDense_B_G45_B5(TestMatMPIDense_B_G45): 340 BSIZE = 5 341 342 343class TestMatMPIDense_B_G77_B5(TestMatMPIDense_B_G77): 344 BSIZE = 5 345 346 347class TestMatMPIDense_B_G89_B5(TestMatMPIDense_B_G89): 348 BSIZE = 5 349 350 351# ----- 352 353if __name__ == '__main__': 354 unittest.main() 355