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