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