xref: /petsc/src/binding/petsc4py/test/test_mat_dense.py (revision 6dd63270497ad23dcf16ae500a87ff2b2a0b7474)
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