xref: /petsc/src/binding/petsc4py/test/test_dmshell.py (revision a47f5240f9a566ca3f90453fc02858db57a93a4e)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balayimport numpy as np
45808f684SSatish Balay
55808f684SSatish Balay
65808f684SSatish Balayclass TestDMShell(unittest.TestCase):
75808f684SSatish Balay    COMM = PETSc.COMM_WORLD
85808f684SSatish Balay
95808f684SSatish Balay    def setUp(self):
105808f684SSatish Balay        self.dm = PETSc.DMShell().create(comm=self.COMM)
115808f684SSatish Balay
125808f684SSatish Balay    def tearDown(self):
1362e5d2d2SJDBetteridge        self.dm.destroy()
145808f684SSatish Balay        self.dm = None
1562e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
165808f684SSatish Balay
175808f684SSatish Balay    def testSetGlobalVector(self):
185808f684SSatish Balay        vec = PETSc.Vec().create(comm=self.COMM)
195808f684SSatish Balay        vec.setSizes((10, None))
205808f684SSatish Balay        vec.setUp()
215808f684SSatish Balay        self.dm.setGlobalVector(vec)
225808f684SSatish Balay        gvec = self.dm.createGlobalVector()
235808f684SSatish Balay        self.assertEqual(vec.getSizes(), gvec.getSizes())
245808f684SSatish Balay        self.assertEqual(vec.comm, gvec.comm)
255808f684SSatish Balay
265808f684SSatish Balay    def testSetCreateGlobalVector(self):
275808f684SSatish Balay        def create_vec(dm):
285808f684SSatish Balay            v = PETSc.Vec().create(comm=dm.comm)
295808f684SSatish Balay            v.setSizes((10, None))
305808f684SSatish Balay            v.setUp()
315808f684SSatish Balay            return v
326f336411SStefano Zampini
335808f684SSatish Balay        self.dm.setCreateGlobalVector(create_vec)
345808f684SSatish Balay        gvec = self.dm.createGlobalVector()
355808f684SSatish Balay        self.assertEqual(gvec.comm, self.dm.comm)
365808f684SSatish Balay        self.assertEqual(gvec.getLocalSize(), 10)
375808f684SSatish Balay
385808f684SSatish Balay    def testSetLocalVector(self):
395808f684SSatish Balay        vec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
405808f684SSatish Balay        vec.setSizes((1 + 10 * self.COMM.rank, None))
415808f684SSatish Balay        vec.setUp()
425808f684SSatish Balay        self.dm.setLocalVector(vec)
435808f684SSatish Balay        lvec = self.dm.createLocalVector()
445808f684SSatish Balay        self.assertEqual(vec.getSizes(), lvec.getSizes())
455808f684SSatish Balay        lsize, gsize = lvec.getSizes()
465808f684SSatish Balay        self.assertEqual(lsize, gsize)
475808f684SSatish Balay        self.assertEqual(lvec.comm, PETSc.COMM_SELF)
485808f684SSatish Balay
495808f684SSatish Balay    def testSetCreateLocalVector(self):
505808f684SSatish Balay        def create_vec(dm):
515808f684SSatish Balay            v = PETSc.Vec().create(comm=PETSc.COMM_SELF)
525808f684SSatish Balay            v.setSizes((1 + 10 * dm.comm.rank, None))
535808f684SSatish Balay            v.setUp()
545808f684SSatish Balay            return v
556f336411SStefano Zampini
565808f684SSatish Balay        self.dm.setCreateLocalVector(create_vec)
575808f684SSatish Balay        lvec = self.dm.createLocalVector()
585808f684SSatish Balay        lsize, gsize = lvec.getSizes()
595808f684SSatish Balay        self.assertEqual(lsize, gsize)
605808f684SSatish Balay        self.assertEqual(lsize, 1 + 10 * self.dm.comm.rank)
615808f684SSatish Balay        self.assertEqual(lvec.comm, PETSc.COMM_SELF)
625808f684SSatish Balay
635808f684SSatish Balay    def testSetMatrix(self):
645808f684SSatish Balay        mat = PETSc.Mat().create(comm=self.COMM)
655808f684SSatish Balay        mat.setSizes(((10, None), (2, None)))
665808f684SSatish Balay        mat.setUp()
675808f684SSatish Balay        mat.assemble()
685808f684SSatish Balay        self.dm.setMatrix(mat)
695808f684SSatish Balay        nmat = self.dm.createMatrix()
705808f684SSatish Balay        self.assertEqual(nmat.getSizes(), mat.getSizes())
715808f684SSatish Balay
725808f684SSatish Balay    def testSetCreateMatrix(self):
735808f684SSatish Balay        def create_mat(dm):
745808f684SSatish Balay            mat = PETSc.Mat().create(comm=self.COMM)
755808f684SSatish Balay            mat.setSizes(((10, None), (2, None)))
765808f684SSatish Balay            mat.setUp()
775808f684SSatish Balay            return mat
786f336411SStefano Zampini
795808f684SSatish Balay        self.dm.setCreateMatrix(create_mat)
805808f684SSatish Balay        nmat = self.dm.createMatrix()
815808f684SSatish Balay        self.assertEqual(nmat.getSizes(), create_mat(self.dm).getSizes())
825808f684SSatish Balay
83*35cefcb0SStefano Zampini    def testSetCreateFieldDecomposition(self):
84*35cefcb0SStefano Zampini        def create_field_decomposition_only_is(dm):
85*35cefcb0SStefano Zampini            return None, [PETSc.IS().createStride(1) for _ in range(2)], None
86*35cefcb0SStefano Zampini
87*35cefcb0SStefano Zampini        def create_field_decomposition_only_is_names(dm):
88*35cefcb0SStefano Zampini            _, ises, _ = create_field_decomposition_only_is(dm)
89*35cefcb0SStefano Zampini            names = [f'f_{i}' for i in range(len(ises))]
90*35cefcb0SStefano Zampini            return names, ises, None
91*35cefcb0SStefano Zampini
92*35cefcb0SStefano Zampini        def create_field_decomposition_only_is_dms(dm):
93*35cefcb0SStefano Zampini            _, ises, _ = create_field_decomposition_only_is(dm)
94*35cefcb0SStefano Zampini            dms = [dm.clone() for _ in range(len(ises))]
95*35cefcb0SStefano Zampini            return _, ises, dms
96*35cefcb0SStefano Zampini
97*35cefcb0SStefano Zampini        def create_field_decomposition_only_full(dm):
98*35cefcb0SStefano Zampini            names, ises, _ = create_field_decomposition_only_is_names(dm)
99*35cefcb0SStefano Zampini            dms = [dm.clone() for _ in range(len(ises))]
100*35cefcb0SStefano Zampini            return names, ises, dms
101*35cefcb0SStefano Zampini
102*35cefcb0SStefano Zampini        tests = [
103*35cefcb0SStefano Zampini            (create_field_decomposition_only_is, False, False),
104*35cefcb0SStefano Zampini            (create_field_decomposition_only_is_names, True, False),
105*35cefcb0SStefano Zampini            (create_field_decomposition_only_is_dms, False, True),
106*35cefcb0SStefano Zampini            (create_field_decomposition_only_full, True, True),
107*35cefcb0SStefano Zampini        ]
108*35cefcb0SStefano Zampini        for test_f, has_names, has_dms in tests:
109*35cefcb0SStefano Zampini            self.dm.setCreateFieldDecomposition(test_f)
110*35cefcb0SStefano Zampini            names, ises, dms = self.dm.createFieldDecomposition()
111*35cefcb0SStefano Zampini            self.assertEqual(len(names), len(ises))
112*35cefcb0SStefano Zampini            self.assertEqual(len(dms), len(ises))
113*35cefcb0SStefano Zampini            if has_names:
114*35cefcb0SStefano Zampini                checknames = [f'f_{i}' for i in range(len(ises))]
115*35cefcb0SStefano Zampini                self.assertEqual(names, checknames)
116*35cefcb0SStefano Zampini            else:
117*35cefcb0SStefano Zampini                for n in names:
118*35cefcb0SStefano Zampini                    self.assertTrue(n is None)
119*35cefcb0SStefano Zampini            for dm in dms:
120*35cefcb0SStefano Zampini                if has_dms:
121*35cefcb0SStefano Zampini                    self.assertEqual(type(dm), PETSc.DM)
122*35cefcb0SStefano Zampini                else:
123*35cefcb0SStefano Zampini                    self.assertTrue(dm is None)
124*35cefcb0SStefano Zampini
1255808f684SSatish Balay    def testGlobalToLocal(self):
1265808f684SSatish Balay        def begin(dm, ivec, mode, ovec):
1275808f684SSatish Balay            if mode == PETSc.InsertMode.INSERT_VALUES:
1285808f684SSatish Balay                ovec[...] = ivec[...]
1295808f684SSatish Balay            elif mode == PETSc.InsertMode.ADD_VALUES:
1305808f684SSatish Balay                ovec[...] += ivec[...]
1316f336411SStefano Zampini
1325808f684SSatish Balay        def end(dm, ivec, mode, ovec):
1335808f684SSatish Balay            pass
1346f336411SStefano Zampini
1355808f684SSatish Balay        vec = PETSc.Vec().create(comm=self.COMM)
1365808f684SSatish Balay        vec.setSizes((10, None))
1375808f684SSatish Balay        vec.setUp()
1385808f684SSatish Balay        vec[...] = self.dm.comm.rank + 1
1395808f684SSatish Balay        ovec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
1405808f684SSatish Balay        ovec.setSizes((10, None))
1415808f684SSatish Balay        ovec.setUp()
1425808f684SSatish Balay        self.dm.setGlobalToLocal(begin, end)
1435808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
1445808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
1455808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES)
1465808f684SSatish Balay        self.assertTrue(np.allclose(2 * vec.getArray(), ovec.getArray()))
1475808f684SSatish Balay
1485808f684SSatish Balay    def testLocalToGlobal(self):
1495808f684SSatish Balay        def begin(dm, ivec, mode, ovec):
1505808f684SSatish Balay            if mode == PETSc.InsertMode.INSERT_VALUES:
1515808f684SSatish Balay                ovec[...] = ivec[...]
1525808f684SSatish Balay            elif mode == PETSc.InsertMode.ADD_VALUES:
1535808f684SSatish Balay                ovec[...] += ivec[...]
1546f336411SStefano Zampini
1555808f684SSatish Balay        def end(dm, ivec, mode, ovec):
1565808f684SSatish Balay            pass
1576f336411SStefano Zampini
1585808f684SSatish Balay        vec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
1595808f684SSatish Balay        vec.setSizes((10, None))
1605808f684SSatish Balay        vec.setUp()
1615808f684SSatish Balay        vec[...] = self.dm.comm.rank + 1
1625808f684SSatish Balay        ovec = PETSc.Vec().create(comm=self.COMM)
1635808f684SSatish Balay        ovec.setSizes((10, None))
1645808f684SSatish Balay        ovec.setUp()
1655808f684SSatish Balay        self.dm.setLocalToGlobal(begin, end)
1665808f684SSatish Balay        self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
1675808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
1685808f684SSatish Balay        self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES)
1695808f684SSatish Balay        self.assertTrue(np.allclose(2 * vec.getArray(), ovec.getArray()))
1705808f684SSatish Balay
1715808f684SSatish Balay    def testLocalToLocal(self):
1725808f684SSatish Balay        def begin(dm, ivec, mode, ovec):
1735808f684SSatish Balay            if mode == PETSc.InsertMode.INSERT_VALUES:
1745808f684SSatish Balay                ovec[...] = ivec[...]
1755808f684SSatish Balay            elif mode == PETSc.InsertMode.ADD_VALUES:
1765808f684SSatish Balay                ovec[...] += ivec[...]
1776f336411SStefano Zampini
1785808f684SSatish Balay        def end(dm, ivec, mode, ovec):
1795808f684SSatish Balay            pass
1806f336411SStefano Zampini
1815808f684SSatish Balay        vec = PETSc.Vec().create(comm=PETSc.COMM_SELF)
1825808f684SSatish Balay        vec.setSizes((10, None))
1835808f684SSatish Balay        vec.setUp()
1845808f684SSatish Balay        vec[...] = self.dm.comm.rank + 1
1855808f684SSatish Balay        ovec = vec.duplicate()
1865808f684SSatish Balay        self.dm.setLocalToLocal(begin, end)
1875808f684SSatish Balay        self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
1885808f684SSatish Balay        self.assertTrue(np.allclose(vec.getArray(), ovec.getArray()))
1895808f684SSatish Balay        self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES)
1905808f684SSatish Balay        self.assertTrue(np.allclose(2 * vec.getArray(), ovec.getArray()))
1915808f684SSatish Balay
1925808f684SSatish Balay    def testGlobalToLocalVecScatter(self):
1935808f684SSatish Balay        vec = PETSc.Vec().create()
1945808f684SSatish Balay        vec.setSizes((10, None))
1955808f684SSatish Balay        vec.setUp()
1965808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
1975808f684SSatish Balay        self.dm.setGlobalToLocalVecScatter(sct)
1985808f684SSatish Balay        self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
1995808f684SSatish Balay
2005808f684SSatish Balay    def testLocalToGlobalVecScatter(self):
2015808f684SSatish Balay        vec = PETSc.Vec().create()
2025808f684SSatish Balay        vec.setSizes((10, None))
2035808f684SSatish Balay        vec.setUp()
2045808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
2055808f684SSatish Balay        self.dm.setLocalToGlobalVecScatter(sct)
2065808f684SSatish Balay        self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
2075808f684SSatish Balay
2085808f684SSatish Balay    def testLocalToLocalVecScatter(self):
2095808f684SSatish Balay        vec = PETSc.Vec().create()
2105808f684SSatish Balay        vec.setSizes((10, None))
2115808f684SSatish Balay        vec.setUp()
2125808f684SSatish Balay        sct, ovec = PETSc.Scatter.toAll(vec)
2135808f684SSatish Balay        self.dm.setLocalToLocalVecScatter(sct)
2145808f684SSatish Balay        self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES)
2155808f684SSatish Balay
2165808f684SSatish Balay    def testCoarsenRefine(self):
2175808f684SSatish Balay        cdm = PETSc.DMShell().create(comm=self.COMM)
2186f336411SStefano Zampini
2195808f684SSatish Balay        def coarsen(dm, comm):
2205808f684SSatish Balay            return cdm
2216f336411SStefano Zampini
2225808f684SSatish Balay        def refine(dm, comm):
2235808f684SSatish Balay            return self.dm
2246f336411SStefano Zampini
2255808f684SSatish Balay        cdm.setRefine(refine)
2265808f684SSatish Balay        self.dm.setCoarsen(coarsen)
2275808f684SSatish Balay        coarsened = self.dm.coarsen()
2285808f684SSatish Balay        self.assertEqual(coarsened, cdm)
2295808f684SSatish Balay        refined = coarsened.refine()
2305808f684SSatish Balay        self.assertEqual(refined, self.dm)
2315808f684SSatish Balay
2325808f684SSatish Balay    def testCreateInterpolation(self):
2335808f684SSatish Balay        mat = PETSc.Mat().create()
2345808f684SSatish Balay        mat.setSizes(((10, None), (10, None)))
2355808f684SSatish Balay        mat.setUp()
2365808f684SSatish Balay        vec = PETSc.Vec().create()
2375808f684SSatish Balay        vec.setSizes((10, None))
2385808f684SSatish Balay        vec.setUp()
2396f336411SStefano Zampini
2405808f684SSatish Balay        def create_interp(dm, dmf):
2415808f684SSatish Balay            return mat, vec
2426f336411SStefano Zampini
2435808f684SSatish Balay        self.dm.setCreateInterpolation(create_interp)
2445808f684SSatish Balay        m, v = self.dm.createInterpolation(self.dm)
2455808f684SSatish Balay        self.assertEqual(m, mat)
2465808f684SSatish Balay        self.assertEqual(v, vec)
2475808f684SSatish Balay
2485808f684SSatish Balay    def testCreateInjection(self):
2495808f684SSatish Balay        mat = PETSc.Mat().create()
2505808f684SSatish Balay        mat.setSizes(((10, None), (10, None)))
2515808f684SSatish Balay        mat.setUp()
2526f336411SStefano Zampini
2535808f684SSatish Balay        def create_inject(dm, dmf):
2545808f684SSatish Balay            return mat
2556f336411SStefano Zampini
2565808f684SSatish Balay        self.dm.setCreateInjection(create_inject)
2575808f684SSatish Balay        m = self.dm.createInjection(self.dm)
2585808f684SSatish Balay        self.assertEqual(m, mat)
2595808f684SSatish Balay
2605808f684SSatish Balay
2615808f684SSatish Balayif __name__ == '__main__':
2625808f684SSatish Balay    unittest.main()
263