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