xref: /petsc/src/binding/petsc4py/test/test_dmshell.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balayfrom petsc4py import PETSc
2*5808f684SSatish Balayimport unittest
3*5808f684SSatish Balayimport numpy as np
4*5808f684SSatish Balay
5*5808f684SSatish Balay
6*5808f684SSatish Balayclass TestDMShell(unittest.TestCase):
7*5808f684SSatish Balay
8*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
9*5808f684SSatish Balay
10*5808f684SSatish Balay    def setUp(self):
11*5808f684SSatish Balay        self.dm = PETSc.DMShell().create(comm=self.COMM)
12*5808f684SSatish Balay
13*5808f684SSatish Balay    def tearDown(self):
14*5808f684SSatish Balay        self.dm = None
15*5808f684SSatish Balay
16*5808f684SSatish Balay    def testSetGlobalVector(self):
17*5808f684SSatish Balay        vec = PETSc.Vec().create(comm=self.COMM)
18*5808f684SSatish Balay        vec.setSizes((10, None))
19*5808f684SSatish Balay        vec.setUp()
20*5808f684SSatish Balay        self.dm.setGlobalVector(vec)
21*5808f684SSatish Balay        gvec = self.dm.createGlobalVector()
22*5808f684SSatish Balay        self.assertEqual(vec.getSizes(), gvec.getSizes())
23*5808f684SSatish Balay        self.assertEqual(vec.comm, gvec.comm)
24*5808f684SSatish Balay
25*5808f684SSatish Balay    def testSetCreateGlobalVector(self):
26*5808f684SSatish Balay        def create_vec(dm):
27*5808f684SSatish Balay            v = PETSc.Vec().create(comm=dm.comm)
28*5808f684SSatish Balay            v.setSizes((10, None))
29*5808f684SSatish Balay            v.setUp()
30*5808f684SSatish Balay            return v
31*5808f684SSatish Balay        self.dm.setCreateGlobalVector(create_vec)
32*5808f684SSatish Balay        gvec = self.dm.createGlobalVector()
33*5808f684SSatish Balay        self.assertEqual(gvec.comm, self.dm.comm)
34*5808f684SSatish Balay        self.assertEqual(gvec.getLocalSize(), 10)
35*5808f684SSatish Balay
36*5808f684SSatish Balay    def testSetLocalVector(self):
37*5808f684SSatish Balay        vec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
38*5808f684SSatish Balay        vec.setSizes((1 + 10*self.COMM.rank, None))
39*5808f684SSatish Balay        vec.setUp()
40*5808f684SSatish Balay        self.dm.setLocalVector(vec)
41*5808f684SSatish Balay        lvec = self.dm.createLocalVector()
42*5808f684SSatish Balay        self.assertEqual(vec.getSizes(), lvec.getSizes())
43*5808f684SSatish Balay        lsize, gsize = lvec.getSizes()
44*5808f684SSatish Balay        self.assertEqual(lsize, gsize)
45*5808f684SSatish Balay        self.assertEqual(lvec.comm, PETSc.COMM_SELF)
46*5808f684SSatish Balay
47*5808f684SSatish Balay    def testSetCreateLocalVector(self):
48*5808f684SSatish Balay        def create_vec(dm):
49*5808f684SSatish Balay            v = PETSc.Vec().create(comm=PETSc.COMM_SELF)
50*5808f684SSatish Balay            v.setSizes((1 + 10*dm.comm.rank, None))
51*5808f684SSatish Balay            v.setUp()
52*5808f684SSatish Balay            return v
53*5808f684SSatish Balay        self.dm.setCreateLocalVector(create_vec)
54*5808f684SSatish Balay        lvec = self.dm.createLocalVector()
55*5808f684SSatish Balay        lsize, gsize = lvec.getSizes()
56*5808f684SSatish Balay        self.assertEqual(lsize, gsize)
57*5808f684SSatish Balay        self.assertEqual(lsize, 1 + 10*self.dm.comm.rank)
58*5808f684SSatish Balay        self.assertEqual(lvec.comm, PETSc.COMM_SELF)
59*5808f684SSatish Balay
60*5808f684SSatish Balay    def testSetMatrix(self):
61*5808f684SSatish Balay        mat = PETSc.Mat().create(comm=self.COMM)
62*5808f684SSatish Balay        mat.setSizes(((10, None), (2, None)))
63*5808f684SSatish Balay        mat.setUp()
64*5808f684SSatish Balay        mat.assemble()
65*5808f684SSatish Balay        self.dm.setMatrix(mat)
66*5808f684SSatish Balay        nmat = self.dm.createMatrix()
67*5808f684SSatish Balay        self.assertEqual(nmat.getSizes(), mat.getSizes())
68*5808f684SSatish Balay
69*5808f684SSatish Balay    def testSetCreateMatrix(self):
70*5808f684SSatish Balay        def create_mat(dm):
71*5808f684SSatish Balay            mat = PETSc.Mat().create(comm=self.COMM)
72*5808f684SSatish Balay            mat.setSizes(((10, None), (2, None)))
73*5808f684SSatish Balay            mat.setUp()
74*5808f684SSatish Balay            return mat
75*5808f684SSatish Balay        self.dm.setCreateMatrix(create_mat)
76*5808f684SSatish Balay        nmat = self.dm.createMatrix()
77*5808f684SSatish Balay        self.assertEqual(nmat.getSizes(), create_mat(self.dm).getSizes())
78*5808f684SSatish Balay
79*5808f684SSatish Balay    def testGlobalToLocal(self):
80*5808f684SSatish Balay        def begin(dm, ivec, mode, ovec):
81*5808f684SSatish Balay            if mode == PETSc.InsertMode.INSERT_VALUES:
82*5808f684SSatish Balay                ovec[...] = ivec[...]
83*5808f684SSatish Balay            elif mode == PETSc.InsertMode.ADD_VALUES:
84*5808f684SSatish Balay                ovec[...] += ivec[...]
85*5808f684SSatish Balay        def end(dm, ivec, mode, ovec):
86*5808f684SSatish Balay            pass
87*5808f684SSatish Balay        vec = PETSc.Vec().create(comm=self.COMM)
88*5808f684SSatish Balay        vec.setSizes((10, None))
89*5808f684SSatish Balay        vec.setUp()
90*5808f684SSatish Balay        vec[...] = self.dm.comm.rank + 1
91*5808f684SSatish Balay        ovec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
92*5808f684SSatish Balay        ovec.setSizes((10, None))
93*5808f684SSatish Balay        ovec.setUp()
94*5808f684SSatish Balay        self.dm.setGlobalToLocal(begin, end)
95*5808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
96*5808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
97*5808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES)
98*5808f684SSatish Balay        self.assertTrue(np.allclose(2*vec.getArray(), ovec.getArray()))
99*5808f684SSatish Balay
100*5808f684SSatish Balay    def testLocalToGlobal(self):
101*5808f684SSatish Balay        def begin(dm, ivec, mode, ovec):
102*5808f684SSatish Balay            if mode == PETSc.InsertMode.INSERT_VALUES:
103*5808f684SSatish Balay                ovec[...] = ivec[...]
104*5808f684SSatish Balay            elif mode == PETSc.InsertMode.ADD_VALUES:
105*5808f684SSatish Balay                ovec[...] += ivec[...]
106*5808f684SSatish Balay        def end(dm, ivec, mode, ovec):
107*5808f684SSatish Balay            pass
108*5808f684SSatish Balay        vec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
109*5808f684SSatish Balay        vec.setSizes((10, None))
110*5808f684SSatish Balay        vec.setUp()
111*5808f684SSatish Balay        vec[...] = self.dm.comm.rank + 1
112*5808f684SSatish Balay        ovec = PETSc.Vec().create(comm=self.COMM)
113*5808f684SSatish Balay        ovec.setSizes((10, None))
114*5808f684SSatish Balay        ovec.setUp()
115*5808f684SSatish Balay        self.dm.setLocalToGlobal(begin, end)
116*5808f684SSatish Balay        self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
117*5808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
118*5808f684SSatish Balay        self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES)
119*5808f684SSatish Balay        self.assertTrue(np.allclose(2*vec.getArray(), ovec.getArray()))
120*5808f684SSatish Balay
121*5808f684SSatish Balay    def testLocalToLocal(self):
122*5808f684SSatish Balay        def begin(dm, ivec, mode, ovec):
123*5808f684SSatish Balay            if mode == PETSc.InsertMode.INSERT_VALUES:
124*5808f684SSatish Balay                ovec[...] = ivec[...]
125*5808f684SSatish Balay            elif mode == PETSc.InsertMode.ADD_VALUES:
126*5808f684SSatish Balay                ovec[...] += ivec[...]
127*5808f684SSatish Balay        def end(dm, ivec, mode, ovec):
128*5808f684SSatish Balay            pass
129*5808f684SSatish Balay        vec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
130*5808f684SSatish Balay        vec.setSizes((10, None))
131*5808f684SSatish Balay        vec.setUp()
132*5808f684SSatish Balay        vec[...] = self.dm.comm.rank + 1
133*5808f684SSatish Balay        ovec = vec.duplicate()
134*5808f684SSatish Balay        self.dm.setLocalToLocal(begin, end)
135*5808f684SSatish Balay        self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
136*5808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
137*5808f684SSatish Balay        self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES)
138*5808f684SSatish Balay        self.assertTrue(np.allclose(2*vec.getArray(), ovec.getArray()))
139*5808f684SSatish Balay
140*5808f684SSatish Balay    def testGlobalToLocalVecScatter(self):
141*5808f684SSatish Balay        vec = PETSc.Vec().create()
142*5808f684SSatish Balay        vec.setSizes((10, None))
143*5808f684SSatish Balay        vec.setUp()
144*5808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
145*5808f684SSatish Balay        self.dm.setGlobalToLocalVecScatter(sct)
146*5808f684SSatish Balay
147*5808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
148*5808f684SSatish Balay
149*5808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
150*5808f684SSatish Balay
151*5808f684SSatish Balay    def testGlobalToLocalVecScatter(self):
152*5808f684SSatish Balay        vec = PETSc.Vec().create()
153*5808f684SSatish Balay        vec.setSizes((10, None))
154*5808f684SSatish Balay        vec.setUp()
155*5808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
156*5808f684SSatish Balay        self.dm.setGlobalToLocalVecScatter(sct)
157*5808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
158*5808f684SSatish Balay
159*5808f684SSatish Balay    def testLocalToGlobalVecScatter(self):
160*5808f684SSatish Balay        vec = PETSc.Vec().create()
161*5808f684SSatish Balay        vec.setSizes((10, None))
162*5808f684SSatish Balay        vec.setUp()
163*5808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
164*5808f684SSatish Balay        self.dm.setLocalToGlobalVecScatter(sct)
165*5808f684SSatish Balay        self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
166*5808f684SSatish Balay
167*5808f684SSatish Balay    def testLocalToLocalVecScatter(self):
168*5808f684SSatish Balay        vec = PETSc.Vec().create()
169*5808f684SSatish Balay        vec.setSizes((10, None))
170*5808f684SSatish Balay        vec.setUp()
171*5808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
172*5808f684SSatish Balay        self.dm.setLocalToLocalVecScatter(sct)
173*5808f684SSatish Balay        self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
174*5808f684SSatish Balay
175*5808f684SSatish Balay    def testCoarsenRefine(self):
176*5808f684SSatish Balay        cdm = PETSc.DMShell().create(comm=self.COMM)
177*5808f684SSatish Balay        def coarsen(dm, comm):
178*5808f684SSatish Balay            return cdm
179*5808f684SSatish Balay        def refine(dm, comm):
180*5808f684SSatish Balay            return self.dm
181*5808f684SSatish Balay        cdm.setRefine(refine)
182*5808f684SSatish Balay        self.dm.setCoarsen(coarsen)
183*5808f684SSatish Balay        coarsened = self.dm.coarsen()
184*5808f684SSatish Balay        self.assertEqual(coarsened, cdm)
185*5808f684SSatish Balay        refined = coarsened.refine()
186*5808f684SSatish Balay        self.assertEqual(refined, self.dm)
187*5808f684SSatish Balay
188*5808f684SSatish Balay    def testCreateInterpolation(self):
189*5808f684SSatish Balay        mat = PETSc.Mat().create()
190*5808f684SSatish Balay        mat.setSizes(((10, None), (10, None)))
191*5808f684SSatish Balay        mat.setUp()
192*5808f684SSatish Balay        vec = PETSc.Vec().create()
193*5808f684SSatish Balay        vec.setSizes((10, None))
194*5808f684SSatish Balay        vec.setUp()
195*5808f684SSatish Balay        def create_interp(dm, dmf):
196*5808f684SSatish Balay            return mat, vec
197*5808f684SSatish Balay        self.dm.setCreateInterpolation(create_interp)
198*5808f684SSatish Balay        m, v = self.dm.createInterpolation(self.dm)
199*5808f684SSatish Balay        self.assertEqual(m, mat)
200*5808f684SSatish Balay        self.assertEqual(v, vec)
201*5808f684SSatish Balay
202*5808f684SSatish Balay    def testCreateInjection(self):
203*5808f684SSatish Balay        mat = PETSc.Mat().create()
204*5808f684SSatish Balay        mat.setSizes(((10, None), (10, None)))
205*5808f684SSatish Balay        mat.setUp()
206*5808f684SSatish Balay        def create_inject(dm, dmf):
207*5808f684SSatish Balay            return mat
208*5808f684SSatish Balay        self.dm.setCreateInjection(create_inject)
209*5808f684SSatish Balay        m = self.dm.createInjection(self.dm)
210*5808f684SSatish Balay        self.assertEqual(m, mat)
211*5808f684SSatish Balay
212*5808f684SSatish Balay
213*5808f684SSatish Balayif __name__ == '__main__':
214*5808f684SSatish Balay    unittest.main()
215