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