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