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