15808f684SSatish Balayfrom petsc4py import PETSc 25808f684SSatish Balayimport unittest 35808f684SSatish Balay 45808f684SSatish Balay# -------------------------------------------------------------------- 55808f684SSatish Balay 65808f684SSatish Balay 76f336411SStefano Zampiniclass BaseTestDA: 85808f684SSatish Balay COMM = PETSc.COMM_WORLD 95808f684SSatish Balay SIZES = None 105808f684SSatish Balay BOUNDARY = None 115808f684SSatish Balay DOF = 1 125808f684SSatish Balay STENCIL = PETSc.DMDA.StencilType.STAR 135808f684SSatish Balay SWIDTH = 1 145808f684SSatish Balay 155808f684SSatish Balay def setUp(self): 166f336411SStefano Zampini self.da = PETSc.DMDA().create( 176f336411SStefano Zampini dim=len(self.SIZES), 185808f684SSatish Balay dof=self.DOF, 195808f684SSatish Balay sizes=self.SIZES, 205808f684SSatish Balay boundary_type=self.BOUNDARY, 215808f684SSatish Balay stencil_type=self.STENCIL, 225808f684SSatish Balay stencil_width=self.SWIDTH, 236f336411SStefano Zampini comm=self.COMM, 246f336411SStefano Zampini ) 255808f684SSatish Balay 265808f684SSatish Balay def tearDown(self): 275808f684SSatish Balay self.da = None 2862e5d2d2SJDBetteridge PETSc.garbage_cleanup() 295808f684SSatish Balay 305808f684SSatish Balay def testGetInfo(self): 315808f684SSatish Balay dim = self.da.getDim() 325808f684SSatish Balay dof = self.da.getDof() 335808f684SSatish Balay sizes = self.da.getSizes() 345808f684SSatish Balay boundary = self.da.getBoundaryType() 355808f684SSatish Balay stencil_type = self.da.getStencilType() 365808f684SSatish Balay stencil_width = self.da.getStencilWidth() 375808f684SSatish Balay self.assertEqual(dim, len(self.SIZES)) 385808f684SSatish Balay self.assertEqual(dof, self.DOF) 395808f684SSatish Balay self.assertEqual(sizes, tuple(self.SIZES)) 405808f684SSatish Balay self.assertEqual(boundary, self.BOUNDARY or (0,) * dim) 415808f684SSatish Balay self.assertEqual(stencil_type, self.STENCIL) 425808f684SSatish Balay self.assertEqual(stencil_width, self.SWIDTH) 435808f684SSatish Balay 445808f684SSatish Balay def testRangesCorners(self): 455808f684SSatish Balay dim = self.da.getDim() 465808f684SSatish Balay ranges = self.da.getRanges() 475808f684SSatish Balay starts, lsizes = self.da.getCorners() 485808f684SSatish Balay self.assertEqual(dim, len(ranges)) 495808f684SSatish Balay self.assertEqual(dim, len(starts)) 505808f684SSatish Balay self.assertEqual(dim, len(lsizes)) 515808f684SSatish Balay for i in range(dim): 525808f684SSatish Balay s, e = ranges[i] 535808f684SSatish Balay self.assertEqual(s, starts[i]) 545808f684SSatish Balay self.assertEqual(e - s, lsizes[i]) 555808f684SSatish Balay 565808f684SSatish Balay def testGhostRangesCorners(self): 575808f684SSatish Balay dim = self.da.getDim() 585808f684SSatish Balay ranges = self.da.getGhostRanges() 595808f684SSatish Balay starts, lsizes = self.da.getGhostCorners() 605808f684SSatish Balay self.assertEqual(dim, len(ranges)) 615808f684SSatish Balay self.assertEqual(dim, len(starts)) 625808f684SSatish Balay self.assertEqual(dim, len(lsizes)) 635808f684SSatish Balay for i in range(dim): 645808f684SSatish Balay s, e = ranges[i] 655808f684SSatish Balay self.assertEqual(s, starts[i]) 665808f684SSatish Balay self.assertEqual(e - s, lsizes[i]) 675808f684SSatish Balay 685808f684SSatish Balay def testOwnershipRanges(self): 695808f684SSatish Balay ownership_ranges = self.da.getOwnershipRanges() 705808f684SSatish Balay procsizes = self.da.getProcSizes() 715808f684SSatish Balay self.assertEqual(len(procsizes), len(ownership_ranges)) 725808f684SSatish Balay for i, m in enumerate(procsizes): 735808f684SSatish Balay self.assertEqual(m, len(ownership_ranges[i])) 745808f684SSatish Balay 755808f684SSatish Balay def testFieldName(self): 765808f684SSatish Balay for i in range(self.da.getDof()): 776f336411SStefano Zampini self.da.setFieldName(i, 'field%d' % i) 785808f684SSatish Balay for i in range(self.da.getDof()): 795808f684SSatish Balay name = self.da.getFieldName(i) 806f336411SStefano Zampini self.assertEqual(name, 'field%d' % i) 815808f684SSatish Balay 825808f684SSatish Balay def testCoordinates(self): 835808f684SSatish Balay self.da.setUniformCoordinates(0, 1, 0, 1, 0, 1) 845808f684SSatish Balay # 855808f684SSatish Balay c = self.da.getCoordinates() 865808f684SSatish Balay self.da.setCoordinates(c) 875808f684SSatish Balay c.destroy() 885808f684SSatish Balay cda = self.da.getCoordinateDM() 895808f684SSatish Balay cda.destroy() 905808f684SSatish Balay # 915808f684SSatish Balay c = self.da.getCoordinates() 925808f684SSatish Balay self.da.setCoordinates(c) 935808f684SSatish Balay c.destroy() 945808f684SSatish Balay gc = self.da.getCoordinatesLocal() 955808f684SSatish Balay gc.destroy() 965808f684SSatish Balay 975808f684SSatish Balay def testCreateVecMat(self): 985808f684SSatish Balay vn = self.da.createNaturalVec() 995808f684SSatish Balay vg = self.da.createGlobalVec() 1005808f684SSatish Balay vl = self.da.createLocalVec() 1015808f684SSatish Balay mat = self.da.createMat() 1025808f684SSatish Balay self.assertTrue(mat.getType() in ('aij', 'seqaij', 'mpiaij')) 1035808f684SSatish Balay vn.set(1.0) 1045808f684SSatish Balay self.da.naturalToGlobal(vn, vg) 1055808f684SSatish Balay self.assertEqual(vg.max()[1], 1.0) 1065808f684SSatish Balay self.assertEqual(vg.min()[1], 1.0) 1075808f684SSatish Balay self.da.globalToLocal(vg, vl) 1085808f684SSatish Balay self.assertEqual(vl.max()[1], 1.0) 1095808f684SSatish Balay self.assertTrue(vl.min()[1] in (1.0, 0.0)) 1105808f684SSatish Balay vn.set(0.0) 1115808f684SSatish Balay self.da.globalToNatural(vg, vn) 1125808f684SSatish Balay self.assertEqual(vn.max()[1], 1.0) 1135808f684SSatish Balay self.assertEqual(vn.min()[1], 1.0) 1145808f684SSatish Balay vl2 = self.da.createLocalVec() 1155808f684SSatish Balay self.da.localToLocal(vl, vl2) 1165808f684SSatish Balay self.assertEqual(vl2.max()[1], 1.0) 1175808f684SSatish Balay self.assertTrue(vl2.min()[1] in (1.0, 0.0)) 1185808f684SSatish Balay NONE = PETSc.DM.BoundaryType.NONE 1195808f684SSatish Balay btype = self.da.boundary_type 1205808f684SSatish Balay psize = self.da.proc_sizes 1215808f684SSatish Balay for b, p in zip(btype, psize): 1226f336411SStefano Zampini if b != NONE and p == 1: 1236f336411SStefano Zampini return 1245808f684SSatish Balay vg2 = self.da.createGlobalVec() 1255808f684SSatish Balay self.da.localToGlobal(vl2, vg2) 1265808f684SSatish Balay 1275808f684SSatish Balay def testGetVec(self): 1285808f684SSatish Balay vg = self.da.getGlobalVec() 1295808f684SSatish Balay vl = self.da.getLocalVec() 1305808f684SSatish Balay try: 1315808f684SSatish Balay vg.set(1.0) 1325808f684SSatish Balay self.assertEqual(vg.max()[1], 1.0) 1335808f684SSatish Balay self.assertEqual(vg.min()[1], 1.0) 1345808f684SSatish Balay self.da.globalToLocal(vg, vl) 1355808f684SSatish Balay self.assertEqual(vl.max()[1], 1.0) 1365808f684SSatish Balay self.assertTrue(vl.min()[1] in (1.0, 0.0)) 1375808f684SSatish Balay vl.set(2.0) 1385808f684SSatish Balay NONE = PETSc.DM.BoundaryType.NONE 1395808f684SSatish Balay btype = self.da.boundary_type 1405808f684SSatish Balay psize = self.da.proc_sizes 1415808f684SSatish Balay for b, p in zip(btype, psize): 1426f336411SStefano Zampini if b != NONE and p == 1: 1436f336411SStefano Zampini return 1445808f684SSatish Balay self.da.localToGlobal(vl, vg) 1455808f684SSatish Balay self.assertEqual(vg.max()[1], 2.0) 1465808f684SSatish Balay self.assertTrue(vg.min()[1] in (2.0, 0.0)) 1475808f684SSatish Balay finally: 1485808f684SSatish Balay self.da.restoreGlobalVec(vg) 1495808f684SSatish Balay self.da.restoreLocalVec(vl) 1507a46bb6eSStefano Zampini self.assertFalse(vg) 1517a46bb6eSStefano Zampini self.assertFalse(vl) 1527a46bb6eSStefano Zampini 1537a46bb6eSStefano Zampini name = 'abcd' 1547a46bb6eSStefano Zampini 1557a46bb6eSStefano Zampini vg = self.da.getGlobalVec(name) 1567a46bb6eSStefano Zampini vg.set(4.0) 1577a46bb6eSStefano Zampini self.da.restoreGlobalVec(vg, name) 1587a46bb6eSStefano Zampini self.assertFalse(vg) 1597a46bb6eSStefano Zampini vg = self.da.getGlobalVec() 1607a46bb6eSStefano Zampini vg.setRandom() 1617a46bb6eSStefano Zampini self.da.restoreGlobalVec(vg) 1627a46bb6eSStefano Zampini vg = self.da.getGlobalVec(name) 1637a46bb6eSStefano Zampini vg.shift(-4.0) 1647a46bb6eSStefano Zampini self.assertEqual(vg.max()[1], 0.0) 1657a46bb6eSStefano Zampini self.da.restoreGlobalVec(vg, name) 1667a46bb6eSStefano Zampini 1677a46bb6eSStefano Zampini vl = self.da.getLocalVec(name) 1687a46bb6eSStefano Zampini vl.set(4.0) 1697a46bb6eSStefano Zampini self.da.restoreLocalVec(vl, name) 1707a46bb6eSStefano Zampini self.assertFalse(vl) 1717a46bb6eSStefano Zampini vl = self.da.getLocalVec() 1727a46bb6eSStefano Zampini vl.setRandom() 1737a46bb6eSStefano Zampini self.da.restoreLocalVec(vl) 1747a46bb6eSStefano Zampini vl = self.da.getLocalVec(name) 1757a46bb6eSStefano Zampini vl.shift(-4.0) 1767a46bb6eSStefano Zampini self.assertEqual(vl.max()[1], 0.0) 1777a46bb6eSStefano Zampini self.da.restoreLocalVec(vl, name) 1785808f684SSatish Balay 179*24391761SStefano Zampini def testGetArray(self): 180*24391761SStefano Zampini for r in [True, False]: 181*24391761SStefano Zampini vg = self.da.getGlobalVec() 182*24391761SStefano Zampini vl = self.da.getLocalVec() 183*24391761SStefano Zampini 184*24391761SStefano Zampini ag = self.da.getVecArray(vg, readonly=r) 185*24391761SStefano Zampini al = self.da.getVecArray(vl, readonly=r) 186*24391761SStefano Zampini 187*24391761SStefano Zampini # test reading lower-left and upper-right corners 188*24391761SStefano Zampini ranges = self.da.getRanges() 189*24391761SStefano Zampini ranges = list(zip(*ranges)) 190*24391761SStefano Zampini dim = len(ranges[0]) 191*24391761SStefano Zampini if dim == 1: 192*24391761SStefano Zampini _ = ag[ranges[0][0] : ranges[1][0]] 193*24391761SStefano Zampini _ = al[ranges[0][0] : ranges[1][0]] 194*24391761SStefano Zampini elif dim == 2: 195*24391761SStefano Zampini _ = ag[ranges[0][0] : ranges[1][0], ranges[0][1] : ranges[1][1]] 196*24391761SStefano Zampini _ = al[ranges[0][0] : ranges[1][0], ranges[0][1] : ranges[1][1]] 197*24391761SStefano Zampini elif dim == 3: 198*24391761SStefano Zampini _ = ag[ 199*24391761SStefano Zampini ranges[0][0] : ranges[1][0], 200*24391761SStefano Zampini ranges[0][1] : ranges[1][1], 201*24391761SStefano Zampini ranges[0][2] : ranges[1][2], 202*24391761SStefano Zampini ] 203*24391761SStefano Zampini _ = al[ 204*24391761SStefano Zampini ranges[0][0] : ranges[1][0], 205*24391761SStefano Zampini ranges[0][1] : ranges[1][1], 206*24391761SStefano Zampini ranges[0][2] : ranges[1][2], 207*24391761SStefano Zampini ] 208*24391761SStefano Zampini 209*24391761SStefano Zampini # test writing 210*24391761SStefano Zampini if not r: 211*24391761SStefano Zampini ag[:] = 1.0 212*24391761SStefano Zampini al[:] = 1.0 213*24391761SStefano Zampini else: 214*24391761SStefano Zampini with self.assertRaises(ValueError): 215*24391761SStefano Zampini ag[:] = 1.0 216*24391761SStefano Zampini with self.assertRaises(ValueError): 217*24391761SStefano Zampini al[:] = 1.0 218*24391761SStefano Zampini 219*24391761SStefano Zampini self.da.restoreGlobalVec(vg) 220*24391761SStefano Zampini self.da.restoreLocalVec(vl) 221*24391761SStefano Zampini 2225808f684SSatish Balay def testGetOther(self): 2236f336411SStefano Zampini _ = self.da.getAO() 2246f336411SStefano Zampini _ = self.da.getLGMap() 2256f336411SStefano Zampini _, _ = self.da.getScatter() 2265808f684SSatish Balay 2275808f684SSatish Balay def testRefineCoarsen(self): 2285808f684SSatish Balay da = self.da 2295808f684SSatish Balay rda = da.refine() 2305808f684SSatish Balay self.assertEqual(da.getDim(), rda.getDim()) 2315808f684SSatish Balay self.assertEqual(da.getDof(), rda.getDof()) 2325808f684SSatish Balay if da.dim != 1: 2335808f684SSatish Balay self.assertEqual(da.getStencilType(), rda.getStencilType()) 2345808f684SSatish Balay self.assertEqual(da.getStencilWidth(), rda.getStencilWidth()) 2355808f684SSatish Balay cda = rda.coarsen() 2365808f684SSatish Balay self.assertEqual(rda.getDim(), cda.getDim()) 2375808f684SSatish Balay self.assertEqual(rda.getDof(), cda.getDof()) 2385808f684SSatish Balay for n1, n2 in zip(self.da.getSizes(), cda.getSizes()): 2395808f684SSatish Balay self.assertTrue(abs(n1 - n2) <= 1) 2405808f684SSatish Balay 2415808f684SSatish Balay def testCoarsenRefine(self): 2426f336411SStefano Zampini if PETSc.COMM_WORLD.getSize() > 6: 2436f336411SStefano Zampini return 2445808f684SSatish Balay da = self.da 2455808f684SSatish Balay cda = self.da.coarsen() 2465808f684SSatish Balay self.assertEqual(da.getDim(), cda.getDim()) 2475808f684SSatish Balay self.assertEqual(da.getDof(), cda.getDof()) 2485808f684SSatish Balay if da.dim != 1: 2495808f684SSatish Balay self.assertEqual(da.getStencilType(), cda.getStencilType()) 2505808f684SSatish Balay self.assertEqual(da.getStencilWidth(), cda.getStencilWidth()) 2515808f684SSatish Balay rda = cda.refine() 2525808f684SSatish Balay for n1, n2 in zip(self.da.getSizes(), rda.getSizes()): 2535808f684SSatish Balay self.assertTrue(abs(n1 - n2) <= 1) 2545808f684SSatish Balay 2555808f684SSatish Balay def testRefineHierarchy(self): 2565808f684SSatish Balay levels = self.da.refineHierarchy(2) 2575808f684SSatish Balay self.assertTrue(isinstance(levels, list)) 2585808f684SSatish Balay self.assertEqual(len(levels), 2) 2595808f684SSatish Balay for item in levels: 2605808f684SSatish Balay self.assertTrue(isinstance(item, PETSc.DM)) 2615808f684SSatish Balay 2625808f684SSatish Balay def testCoarsenHierarchy(self): 2636f336411SStefano Zampini if PETSc.COMM_WORLD.getSize() > 6: 2646f336411SStefano Zampini return 2655808f684SSatish Balay levels = self.da.coarsenHierarchy(2) 2665808f684SSatish Balay self.assertTrue(isinstance(levels, list)) 2675808f684SSatish Balay self.assertEqual(len(levels), 2) 2685808f684SSatish Balay for item in levels: 2695808f684SSatish Balay self.assertTrue(isinstance(item, PETSc.DM)) 2705808f684SSatish Balay 2715808f684SSatish Balay def testCreateInterpolation(self): 2725808f684SSatish Balay da = self.da 2736f336411SStefano Zampini if da.dim == 1: 2746f336411SStefano Zampini return 2755808f684SSatish Balay rda = da.refine() 2766f336411SStefano Zampini _, _ = da.createInterpolation(rda) 2775808f684SSatish Balay 2785808f684SSatish Balay def testCreateInjection(self): 2796f336411SStefano Zampini if PETSc.COMM_WORLD.getSize() > 6: 2806f336411SStefano Zampini return 2815808f684SSatish Balay da = self.da 2826f336411SStefano Zampini if da.dim == 1: 2836f336411SStefano Zampini return 2845808f684SSatish Balay rda = da.refine() 2856f336411SStefano Zampini _ = da.createInjection(rda) 2865808f684SSatish Balay 2878c2316a8SJeremy Tillay def testzeroRowsColumnsStencil(self): 2888c2316a8SJeremy Tillay da = self.da 2898c2316a8SJeremy Tillay A = da.createMatrix() 2908c2316a8SJeremy Tillay x = da.createGlobalVector() 2918c2316a8SJeremy Tillay x.set(2.0) 2928c2316a8SJeremy Tillay A.setDiagonal(x) 2938c2316a8SJeremy Tillay diag1 = x.duplicate() 2948c2316a8SJeremy Tillay A.getDiagonal(diag1) 2958c2316a8SJeremy Tillay if self.SIZES != 2: # only coded test for 2D case 2968c2316a8SJeremy Tillay return 2978c2316a8SJeremy Tillay istart, iend, jstart, jend = da.getRanges() 2988c2316a8SJeremy Tillay self.assertTrue(x.equal(diag1)) 2998c2316a8SJeremy Tillay zeroidx = [] 3008c2316a8SJeremy Tillay for i in range(istart, iend): 3018c2316a8SJeremy Tillay for j in range(jstart, jend): 3028c2316a8SJeremy Tillay row = PETSc.Mat.Stencil() 3038c2316a8SJeremy Tillay row.index = (i, j) 3048c2316a8SJeremy Tillay zeroidx = zeroidx + [row] 3058c2316a8SJeremy Tillay diag2 = x.duplicate() 3068c2316a8SJeremy Tillay diag2.set(1.0) 3078c2316a8SJeremy Tillay A.zeroRowsColumnsStencil(zeroidx, 1.0, x, diag2) 3088c2316a8SJeremy Tillay ans = x.duplicate() 3098c2316a8SJeremy Tillay ans.set(2.0) 3108c2316a8SJeremy Tillay self.assertTrue(ans.equal(diag2)) 3118c2316a8SJeremy Tillay 3125808f684SSatish Balay 3135808f684SSatish BalayMIRROR = PETSc.DMDA.BoundaryType.MIRROR 3145808f684SSatish BalayGHOSTED = PETSc.DMDA.BoundaryType.GHOSTED 3155808f684SSatish BalayPERIODIC = PETSc.DMDA.BoundaryType.PERIODIC 3165808f684SSatish BalayTWIST = PETSc.DMDA.BoundaryType.TWIST 3175808f684SSatish Balay 3185808f684SSatish BalaySCALE = 4 3195808f684SSatish Balay 3206f336411SStefano Zampini 3215808f684SSatish Balayclass BaseTestDA_1D(BaseTestDA): 3225808f684SSatish Balay SIZES = [100 * SCALE] 3235808f684SSatish Balay 3246f336411SStefano Zampini 3255808f684SSatish Balayclass BaseTestDA_2D(BaseTestDA): 3265808f684SSatish Balay SIZES = [9 * SCALE, 11 * SCALE] 3275808f684SSatish Balay 3286f336411SStefano Zampini 3295808f684SSatish Balayclass BaseTestDA_3D(BaseTestDA): 3305808f684SSatish Balay SIZES = [6 * SCALE, 7 * SCALE, 8 * SCALE] 3315808f684SSatish Balay 3326f336411SStefano Zampini 3335808f684SSatish Balay# -------------------------------------------------------------------- 3345808f684SSatish Balay 3356f336411SStefano Zampini 3365808f684SSatish Balayclass TestDA_1D(BaseTestDA_1D, unittest.TestCase): 3375808f684SSatish Balay pass 3386f336411SStefano Zampini 3396f336411SStefano Zampini 3405808f684SSatish Balayclass TestDA_1D_W0(TestDA_1D): 3415808f684SSatish Balay SWIDTH = 0 3426f336411SStefano Zampini 3436f336411SStefano Zampini 3445808f684SSatish Balayclass TestDA_1D_W2(TestDA_1D): 3455808f684SSatish Balay SWIDTH = 2 3465808f684SSatish Balay 3476f336411SStefano Zampini 3485808f684SSatish Balayclass TestDA_2D(BaseTestDA_2D, unittest.TestCase): 3495808f684SSatish Balay pass 3506f336411SStefano Zampini 3516f336411SStefano Zampini 3525808f684SSatish Balayclass TestDA_2D_W0(TestDA_2D): 3535808f684SSatish Balay SWIDTH = 0 3546f336411SStefano Zampini 3556f336411SStefano Zampini 3565808f684SSatish Balayclass TestDA_2D_W0_N2(TestDA_2D): 3575808f684SSatish Balay DOF = 2 3585808f684SSatish Balay SWIDTH = 0 3596f336411SStefano Zampini 3606f336411SStefano Zampini 3615808f684SSatish Balayclass TestDA_2D_W2(TestDA_2D): 3625808f684SSatish Balay SWIDTH = 2 3636f336411SStefano Zampini 3646f336411SStefano Zampini 3655808f684SSatish Balayclass TestDA_2D_W2_N2(TestDA_2D): 3665808f684SSatish Balay DOF = 2 3675808f684SSatish Balay SWIDTH = 2 3686f336411SStefano Zampini 3696f336411SStefano Zampini 3705808f684SSatish Balayclass TestDA_2D_PXY(TestDA_2D): 3715808f684SSatish Balay SIZES = [13 * SCALE, 17 * SCALE] 3725808f684SSatish Balay DOF = 2 3735808f684SSatish Balay SWIDTH = 5 3745808f684SSatish Balay BOUNDARY = (PERIODIC,) * 2 3756f336411SStefano Zampini 3766f336411SStefano Zampini 3775808f684SSatish Balayclass TestDA_2D_GXY(TestDA_2D): 3785808f684SSatish Balay SIZES = [13 * SCALE, 17 * SCALE] 3795808f684SSatish Balay DOF = 2 3805808f684SSatish Balay SWIDTH = 5 3815808f684SSatish Balay BOUNDARY = (GHOSTED,) * 2 3826f336411SStefano Zampini 3836f336411SStefano Zampini 3845808f684SSatish Balayclass TestDA_2D_TXY(TestDA_2D): 3855808f684SSatish Balay SIZES = [13 * SCALE, 17 * SCALE] 3865808f684SSatish Balay DOF = 2 3875808f684SSatish Balay SWIDTH = 5 3885808f684SSatish Balay BOUNDARY = (TWIST,) * 2 3895808f684SSatish Balay 3906f336411SStefano Zampini 3915808f684SSatish Balayclass TestDA_3D(BaseTestDA_3D, unittest.TestCase): 3925808f684SSatish Balay pass 3936f336411SStefano Zampini 3946f336411SStefano Zampini 3955808f684SSatish Balayclass TestDA_3D_W0(TestDA_3D): 3965808f684SSatish Balay SWIDTH = 0 3976f336411SStefano Zampini 3986f336411SStefano Zampini 3995808f684SSatish Balayclass TestDA_3D_W0_N2(TestDA_3D): 4005808f684SSatish Balay DOF = 2 4015808f684SSatish Balay SWIDTH = 0 4026f336411SStefano Zampini 4036f336411SStefano Zampini 4045808f684SSatish Balayclass TestDA_3D_W2(TestDA_3D): 4055808f684SSatish Balay SWIDTH = 2 4066f336411SStefano Zampini 4076f336411SStefano Zampini 4085808f684SSatish Balayclass TestDA_3D_W2_N2(TestDA_3D): 4095808f684SSatish Balay DOF = 2 4105808f684SSatish Balay SWIDTH = 2 4116f336411SStefano Zampini 4126f336411SStefano Zampini 4135808f684SSatish Balayclass TestDA_3D_PXYZ(TestDA_3D): 4145808f684SSatish Balay SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE] 4155808f684SSatish Balay DOF = 2 4165808f684SSatish Balay SWIDTH = 3 4175808f684SSatish Balay BOUNDARY = (PERIODIC,) * 3 4186f336411SStefano Zampini 4196f336411SStefano Zampini 4205808f684SSatish Balayclass TestDA_3D_GXYZ(TestDA_3D): 4215808f684SSatish Balay SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE] 4225808f684SSatish Balay DOF = 2 4235808f684SSatish Balay SWIDTH = 3 4245808f684SSatish Balay BOUNDARY = (GHOSTED,) * 3 4256f336411SStefano Zampini 4266f336411SStefano Zampini 4275808f684SSatish Balayclass TestDA_3D_TXYZ(TestDA_3D): 4285808f684SSatish Balay SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE] 4295808f684SSatish Balay DOF = 2 4305808f684SSatish Balay SWIDTH = 3 4315808f684SSatish Balay BOUNDARY = (TWIST,) * 3 4325808f684SSatish Balay 4336f336411SStefano Zampini 4345808f684SSatish Balay# -------------------------------------------------------------------- 4355808f684SSatish Balay 4366f336411SStefano ZampiniDIM = ( 4376f336411SStefano Zampini 1, 4386f336411SStefano Zampini 2, 4396f336411SStefano Zampini 3, 4406f336411SStefano Zampini) 4416f336411SStefano ZampiniDOF = ( 4426f336411SStefano Zampini None, 4436f336411SStefano Zampini 1, 4446f336411SStefano Zampini 2, 4456f336411SStefano Zampini 3, 4466f336411SStefano Zampini 4, 4476f336411SStefano Zampini 5, 4486f336411SStefano Zampini) 4495808f684SSatish BalayBOUNDARY_TYPE = ( 4505808f684SSatish Balay None, 4516f336411SStefano Zampini 'none', 4526f336411SStefano Zampini (0,) * 3, 4536f336411SStefano Zampini 0, 4546f336411SStefano Zampini 'ghosted', 4556f336411SStefano Zampini (GHOSTED,) * 3, 4566f336411SStefano Zampini GHOSTED, 4576f336411SStefano Zampini 'periodic', 4586f336411SStefano Zampini (PERIODIC,) * 3, 4596f336411SStefano Zampini PERIODIC, 4606f336411SStefano Zampini 'twist', 4616f336411SStefano Zampini (TWIST,) * 3, 4626f336411SStefano Zampini TWIST, 4635808f684SSatish Balay) 4646f336411SStefano ZampiniSTENCIL_TYPE = (None, 'star', 'box') 4655808f684SSatish BalaySTENCIL_WIDTH = (None, 0, 1, 2, 3) 4665808f684SSatish Balay 4675808f684SSatish Balay 4685808f684SSatish BalayDIM = (1, 2, 3) 4695808f684SSatish BalayDOF = (None, 2, 5) 4706f336411SStefano ZampiniBOUNDARY_TYPE = (None, 'none', 'periodic', 'ghosted', 'twist') 4716f336411SStefano ZampiniSTENCIL_TYPE = (None, 'box') 4725808f684SSatish BalaySTENCIL_WIDTH = (None, 1, 2) 4735808f684SSatish Balay 4746f336411SStefano Zampini 4755808f684SSatish Balayclass TestDACreate(unittest.TestCase): 4765808f684SSatish Balay pass 4776f336411SStefano Zampini 4786f336411SStefano Zampini 4795808f684SSatish Balaycounter = 0 4805808f684SSatish Balayfor dim in DIM: 4815808f684SSatish Balay for dof in DOF: 4825808f684SSatish Balay for boundary in BOUNDARY_TYPE: 4835808f684SSatish Balay if isinstance(boundary, tuple): 4845808f684SSatish Balay boundary = boundary[:dim] 4855808f684SSatish Balay for stencil in STENCIL_TYPE: 4865808f684SSatish Balay for width in STENCIL_WIDTH: 4876f336411SStefano Zampini kargs = { 4886f336411SStefano Zampini 'sizes': [8 * SCALE] * dim, 4896f336411SStefano Zampini 'dim': dim, 4906f336411SStefano Zampini 'dof': dof, 4916f336411SStefano Zampini 'boundary_type': boundary, 4926f336411SStefano Zampini 'stencil_type': stencil, 4936f336411SStefano Zampini 'stencil_width': width, 4946f336411SStefano Zampini } 4956f336411SStefano Zampini 4965808f684SSatish Balay def testCreate(self, kargs=kargs): 4975808f684SSatish Balay kargs = dict(kargs) 4985808f684SSatish Balay da = PETSc.DMDA().create(**kargs) 4995808f684SSatish Balay da.destroy() 5006f336411SStefano Zampini 5016f336411SStefano Zampini setattr(TestDACreate, 'testCreate%04d' % counter, testCreate) 5025808f684SSatish Balay del testCreate, kargs 5035808f684SSatish Balay counter += 1 5045808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width 5055808f684SSatish Balay 5066f336411SStefano Zampini 5075808f684SSatish Balayclass TestDADuplicate(unittest.TestCase): 5085808f684SSatish Balay pass 5096f336411SStefano Zampini 5106f336411SStefano Zampini 5115808f684SSatish Balaycounter = 0 5125808f684SSatish Balayfor dim in DIM: 5135808f684SSatish Balay for dof in DOF: 5145808f684SSatish Balay for boundary in BOUNDARY_TYPE: 5155808f684SSatish Balay if isinstance(boundary, tuple): 5165808f684SSatish Balay boundary = boundary[:dim] 5175808f684SSatish Balay for stencil in STENCIL_TYPE: 5185808f684SSatish Balay for width in STENCIL_WIDTH: 5196f336411SStefano Zampini kargs = { 5206f336411SStefano Zampini 'dim': dim, 5216f336411SStefano Zampini 'dof': dof, 5226f336411SStefano Zampini 'boundary_type': boundary, 5236f336411SStefano Zampini 'stencil_type': stencil, 5246f336411SStefano Zampini 'stencil_width': width, 5256f336411SStefano Zampini } 5266f336411SStefano Zampini 5275808f684SSatish Balay def testDuplicate(self, kargs=kargs): 5285808f684SSatish Balay kargs = dict(kargs) 5295808f684SSatish Balay dim = kargs.pop('dim') 5305808f684SSatish Balay dof = kargs['dof'] 5315808f684SSatish Balay boundary = kargs['boundary_type'] 5325808f684SSatish Balay stencil = kargs['stencil_type'] 5335808f684SSatish Balay width = kargs['stencil_width'] 5345808f684SSatish Balay da = PETSc.DMDA().create([8 * SCALE] * dim) 5355808f684SSatish Balay newda = da.duplicate(**kargs) 5365808f684SSatish Balay self.assertEqual(newda.dim, da.dim) 5375808f684SSatish Balay self.assertEqual(newda.sizes, da.sizes) 5386f336411SStefano Zampini self.assertEqual(newda.proc_sizes, da.proc_sizes) 5395808f684SSatish Balay self.assertEqual(newda.ranges, da.ranges) 5405808f684SSatish Balay self.assertEqual(newda.corners, da.corners) 5416f336411SStefano Zampini if ( 5426f336411SStefano Zampini newda.boundary_type == da.boundary_type 5436f336411SStefano Zampini and newda.stencil_width == da.stencil_width 5446f336411SStefano Zampini ): 5456f336411SStefano Zampini self.assertEqual(newda.ghost_ranges, da.ghost_ranges) 5466f336411SStefano Zampini self.assertEqual(newda.ghost_corners, da.ghost_corners) 5475808f684SSatish Balay if dof is None: 5485808f684SSatish Balay dof = da.dof 5495808f684SSatish Balay if boundary is None: 5505808f684SSatish Balay boundary = da.boundary_type 5516f336411SStefano Zampini elif boundary == 'none': 5525808f684SSatish Balay boundary = (0,) * dim 5536f336411SStefano Zampini elif boundary == 'mirror': 5545808f684SSatish Balay boundary = (MIRROR,) * dim 5556f336411SStefano Zampini elif boundary == 'ghosted': 5565808f684SSatish Balay boundary = (GHOSTED,) * dim 5576f336411SStefano Zampini elif boundary == 'periodic': 5585808f684SSatish Balay boundary = (PERIODIC,) * dim 5596f336411SStefano Zampini elif boundary == 'twist': 5605808f684SSatish Balay boundary = (TWIST,) * dim 5615808f684SSatish Balay elif isinstance(boundary, int): 5625808f684SSatish Balay boundary = (boundary,) * dim 5635808f684SSatish Balay if stencil is None: 5645808f684SSatish Balay stencil = da.stencil[0] 5655808f684SSatish Balay if width is None: 5665808f684SSatish Balay width = da.stencil_width 5675808f684SSatish Balay self.assertEqual(newda.dof, dof) 5686f336411SStefano Zampini self.assertEqual(newda.boundary_type, boundary) 5695808f684SSatish Balay if dim == 1: 5706f336411SStefano Zampini self.assertEqual(newda.stencil, (stencil, width)) 5715808f684SSatish Balay newda.destroy() 5725808f684SSatish Balay da.destroy() 5736f336411SStefano Zampini 5746f336411SStefano Zampini setattr( 5756f336411SStefano Zampini TestDADuplicate, 'testDuplicate%04d' % counter, testDuplicate 5766f336411SStefano Zampini ) 5775808f684SSatish Balay del testDuplicate, kargs 5785808f684SSatish Balay counter += 1 5795808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width 5805808f684SSatish Balay 5815808f684SSatish Balay# -------------------------------------------------------------------- 5825808f684SSatish Balay 5835808f684SSatish Balayif PETSc.COMM_WORLD.getSize() > 1: 5845808f684SSatish Balay del TestDA_1D_W0 5855808f684SSatish Balay del TestDA_2D_W0, TestDA_2D_W0_N2 5865808f684SSatish Balay del TestDA_3D_W0, TestDA_3D_W0_N2 5875808f684SSatish Balay 5885808f684SSatish Balay# -------------------------------------------------------------------- 5895808f684SSatish Balay 5905808f684SSatish Balayif __name__ == '__main__': 5915808f684SSatish Balay unittest.main() 5925808f684SSatish Balay 5935808f684SSatish Balay# -------------------------------------------------------------------- 594