15808f684SSatish Balayfrom petsc4py import PETSc 25808f684SSatish Balayimport unittest 35808f684SSatish Balayimport numpy as np 45808f684SSatish Balay 55808f684SSatish Balay 65808f684SSatish Balayclass TestDMShell(unittest.TestCase): 75808f684SSatish Balay 85808f684SSatish Balay COMM = PETSc.COMM_WORLD 95808f684SSatish Balay 105808f684SSatish Balay def setUp(self): 115808f684SSatish Balay self.dm = PETSc.DMShell().create(comm=self.COMM) 125808f684SSatish Balay 135808f684SSatish Balay def tearDown(self): 14*62e5d2d2SJDBetteridge self.dm.destroy() 155808f684SSatish Balay self.dm = None 16*62e5d2d2SJDBetteridge PETSc.garbage_cleanup() 175808f684SSatish Balay 185808f684SSatish Balay def testSetGlobalVector(self): 195808f684SSatish Balay vec = PETSc.Vec().create(comm=self.COMM) 205808f684SSatish Balay vec.setSizes((10, None)) 215808f684SSatish Balay vec.setUp() 225808f684SSatish Balay self.dm.setGlobalVector(vec) 235808f684SSatish Balay gvec = self.dm.createGlobalVector() 245808f684SSatish Balay self.assertEqual(vec.getSizes(), gvec.getSizes()) 255808f684SSatish Balay self.assertEqual(vec.comm, gvec.comm) 265808f684SSatish Balay 275808f684SSatish Balay def testSetCreateGlobalVector(self): 285808f684SSatish Balay def create_vec(dm): 295808f684SSatish Balay v = PETSc.Vec().create(comm=dm.comm) 305808f684SSatish Balay v.setSizes((10, None)) 315808f684SSatish Balay v.setUp() 325808f684SSatish Balay return v 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 555808f684SSatish Balay self.dm.setCreateLocalVector(create_vec) 565808f684SSatish Balay lvec = self.dm.createLocalVector() 575808f684SSatish Balay lsize, gsize = lvec.getSizes() 585808f684SSatish Balay self.assertEqual(lsize, gsize) 595808f684SSatish Balay self.assertEqual(lsize, 1 + 10*self.dm.comm.rank) 605808f684SSatish Balay self.assertEqual(lvec.comm, PETSc.COMM_SELF) 615808f684SSatish Balay 625808f684SSatish Balay def testSetMatrix(self): 635808f684SSatish Balay mat = PETSc.Mat().create(comm=self.COMM) 645808f684SSatish Balay mat.setSizes(((10, None), (2, None))) 655808f684SSatish Balay mat.setUp() 665808f684SSatish Balay mat.assemble() 675808f684SSatish Balay self.dm.setMatrix(mat) 685808f684SSatish Balay nmat = self.dm.createMatrix() 695808f684SSatish Balay self.assertEqual(nmat.getSizes(), mat.getSizes()) 705808f684SSatish Balay 715808f684SSatish Balay def testSetCreateMatrix(self): 725808f684SSatish Balay def create_mat(dm): 735808f684SSatish Balay mat = PETSc.Mat().create(comm=self.COMM) 745808f684SSatish Balay mat.setSizes(((10, None), (2, None))) 755808f684SSatish Balay mat.setUp() 765808f684SSatish Balay return mat 775808f684SSatish Balay self.dm.setCreateMatrix(create_mat) 785808f684SSatish Balay nmat = self.dm.createMatrix() 795808f684SSatish Balay self.assertEqual(nmat.getSizes(), create_mat(self.dm).getSizes()) 805808f684SSatish Balay 815808f684SSatish Balay def testGlobalToLocal(self): 825808f684SSatish Balay def begin(dm, ivec, mode, ovec): 835808f684SSatish Balay if mode == PETSc.InsertMode.INSERT_VALUES: 845808f684SSatish Balay ovec[...] = ivec[...] 855808f684SSatish Balay elif mode == PETSc.InsertMode.ADD_VALUES: 865808f684SSatish Balay ovec[...] += ivec[...] 875808f684SSatish Balay def end(dm, ivec, mode, ovec): 885808f684SSatish Balay pass 895808f684SSatish Balay vec = PETSc.Vec().create(comm=self.COMM) 905808f684SSatish Balay vec.setSizes((10, None)) 915808f684SSatish Balay vec.setUp() 925808f684SSatish Balay vec[...] = self.dm.comm.rank + 1 935808f684SSatish Balay ovec = PETSc.Vec().create(comm=PETSc.COMM_SELF) 945808f684SSatish Balay ovec.setSizes((10, None)) 955808f684SSatish Balay ovec.setUp() 965808f684SSatish Balay self.dm.setGlobalToLocal(begin, end) 975808f684SSatish Balay self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 985808f684SSatish Balay self.assertTrue(np.allclose(vec.getArray(), ovec.getArray())) 995808f684SSatish Balay self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES) 1005808f684SSatish Balay self.assertTrue(np.allclose(2*vec.getArray(), ovec.getArray())) 1015808f684SSatish Balay 1025808f684SSatish Balay def testLocalToGlobal(self): 1035808f684SSatish Balay def begin(dm, ivec, mode, ovec): 1045808f684SSatish Balay if mode == PETSc.InsertMode.INSERT_VALUES: 1055808f684SSatish Balay ovec[...] = ivec[...] 1065808f684SSatish Balay elif mode == PETSc.InsertMode.ADD_VALUES: 1075808f684SSatish Balay ovec[...] += ivec[...] 1085808f684SSatish Balay def end(dm, ivec, mode, ovec): 1095808f684SSatish Balay pass 1105808f684SSatish Balay vec = PETSc.Vec().create(comm=PETSc.COMM_SELF) 1115808f684SSatish Balay vec.setSizes((10, None)) 1125808f684SSatish Balay vec.setUp() 1135808f684SSatish Balay vec[...] = self.dm.comm.rank + 1 1145808f684SSatish Balay ovec = PETSc.Vec().create(comm=self.COMM) 1155808f684SSatish Balay ovec.setSizes((10, None)) 1165808f684SSatish Balay ovec.setUp() 1175808f684SSatish Balay self.dm.setLocalToGlobal(begin, end) 1185808f684SSatish Balay self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 1195808f684SSatish Balay self.assertTrue(np.allclose(vec.getArray(), ovec.getArray())) 1205808f684SSatish Balay self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES) 1215808f684SSatish Balay self.assertTrue(np.allclose(2*vec.getArray(), ovec.getArray())) 1225808f684SSatish Balay 1235808f684SSatish Balay def testLocalToLocal(self): 1245808f684SSatish Balay def begin(dm, ivec, mode, ovec): 1255808f684SSatish Balay if mode == PETSc.InsertMode.INSERT_VALUES: 1265808f684SSatish Balay ovec[...] = ivec[...] 1275808f684SSatish Balay elif mode == PETSc.InsertMode.ADD_VALUES: 1285808f684SSatish Balay ovec[...] += ivec[...] 1295808f684SSatish Balay def end(dm, ivec, mode, ovec): 1305808f684SSatish Balay pass 1315808f684SSatish Balay vec = PETSc.Vec().create(comm=PETSc.COMM_SELF) 1325808f684SSatish Balay vec.setSizes((10, None)) 1335808f684SSatish Balay vec.setUp() 1345808f684SSatish Balay vec[...] = self.dm.comm.rank + 1 1355808f684SSatish Balay ovec = vec.duplicate() 1365808f684SSatish Balay self.dm.setLocalToLocal(begin, end) 1375808f684SSatish Balay self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 1385808f684SSatish Balay self.assertTrue(np.allclose(vec.getArray(), ovec.getArray())) 1395808f684SSatish Balay self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.ADD_VALUES) 1405808f684SSatish Balay self.assertTrue(np.allclose(2*vec.getArray(), ovec.getArray())) 1415808f684SSatish Balay 1425808f684SSatish Balay def testGlobalToLocalVecScatter(self): 1435808f684SSatish Balay vec = PETSc.Vec().create() 1445808f684SSatish Balay vec.setSizes((10, None)) 1455808f684SSatish Balay vec.setUp() 1465808f684SSatish Balay sct, ovec = PETSc.Scatter.toAll(vec) 1475808f684SSatish Balay self.dm.setGlobalToLocalVecScatter(sct) 1485808f684SSatish Balay 1495808f684SSatish Balay self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 1505808f684SSatish Balay 1515808f684SSatish Balay self.assertTrue(np.allclose(vec.getArray(), ovec.getArray())) 1525808f684SSatish Balay 1535808f684SSatish Balay def testGlobalToLocalVecScatter(self): 1545808f684SSatish Balay vec = PETSc.Vec().create() 1555808f684SSatish Balay vec.setSizes((10, None)) 1565808f684SSatish Balay vec.setUp() 1575808f684SSatish Balay sct, ovec = PETSc.Scatter.toAll(vec) 1585808f684SSatish Balay self.dm.setGlobalToLocalVecScatter(sct) 1595808f684SSatish Balay self.dm.globalToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 1605808f684SSatish Balay 1615808f684SSatish Balay def testLocalToGlobalVecScatter(self): 1625808f684SSatish Balay vec = PETSc.Vec().create() 1635808f684SSatish Balay vec.setSizes((10, None)) 1645808f684SSatish Balay vec.setUp() 1655808f684SSatish Balay sct, ovec = PETSc.Scatter.toAll(vec) 1665808f684SSatish Balay self.dm.setLocalToGlobalVecScatter(sct) 1675808f684SSatish Balay self.dm.localToGlobal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 1685808f684SSatish Balay 1695808f684SSatish Balay def testLocalToLocalVecScatter(self): 1705808f684SSatish Balay vec = PETSc.Vec().create() 1715808f684SSatish Balay vec.setSizes((10, None)) 1725808f684SSatish Balay vec.setUp() 1735808f684SSatish Balay sct, ovec = PETSc.Scatter.toAll(vec) 1745808f684SSatish Balay self.dm.setLocalToLocalVecScatter(sct) 1755808f684SSatish Balay self.dm.localToLocal(vec, ovec, addv=PETSc.InsertMode.INSERT_VALUES) 1765808f684SSatish Balay 1775808f684SSatish Balay def testCoarsenRefine(self): 1785808f684SSatish Balay cdm = PETSc.DMShell().create(comm=self.COMM) 1795808f684SSatish Balay def coarsen(dm, comm): 1805808f684SSatish Balay return cdm 1815808f684SSatish Balay def refine(dm, comm): 1825808f684SSatish Balay return self.dm 1835808f684SSatish Balay cdm.setRefine(refine) 1845808f684SSatish Balay self.dm.setCoarsen(coarsen) 1855808f684SSatish Balay coarsened = self.dm.coarsen() 1865808f684SSatish Balay self.assertEqual(coarsened, cdm) 1875808f684SSatish Balay refined = coarsened.refine() 1885808f684SSatish Balay self.assertEqual(refined, self.dm) 1895808f684SSatish Balay 1905808f684SSatish Balay def testCreateInterpolation(self): 1915808f684SSatish Balay mat = PETSc.Mat().create() 1925808f684SSatish Balay mat.setSizes(((10, None), (10, None))) 1935808f684SSatish Balay mat.setUp() 1945808f684SSatish Balay vec = PETSc.Vec().create() 1955808f684SSatish Balay vec.setSizes((10, None)) 1965808f684SSatish Balay vec.setUp() 1975808f684SSatish Balay def create_interp(dm, dmf): 1985808f684SSatish Balay return mat, vec 1995808f684SSatish Balay self.dm.setCreateInterpolation(create_interp) 2005808f684SSatish Balay m, v = self.dm.createInterpolation(self.dm) 2015808f684SSatish Balay self.assertEqual(m, mat) 2025808f684SSatish Balay self.assertEqual(v, vec) 2035808f684SSatish Balay 2045808f684SSatish Balay def testCreateInjection(self): 2055808f684SSatish Balay mat = PETSc.Mat().create() 2065808f684SSatish Balay mat.setSizes(((10, None), (10, None))) 2075808f684SSatish Balay mat.setUp() 2085808f684SSatish Balay def create_inject(dm, dmf): 2095808f684SSatish Balay return mat 2105808f684SSatish Balay self.dm.setCreateInjection(create_inject) 2115808f684SSatish Balay m = self.dm.createInjection(self.dm) 2125808f684SSatish Balay self.assertEqual(m, mat) 2135808f684SSatish Balay 2145808f684SSatish Balay 2155808f684SSatish Balayif __name__ == '__main__': 2165808f684SSatish Balay unittest.main() 217