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