xref: /petsc/src/binding/petsc4py/test/test_dmda.py (revision 62e5d2d2208a68fdbd23dac44110783534664de8)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balay# --------------------------------------------------------------------
55808f684SSatish Balay
65808f684SSatish Balayclass BaseTestDA(object):
75808f684SSatish Balay
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):
165808f684SSatish Balay        self.da = PETSc.DMDA().create(dim=len(self.SIZES),
175808f684SSatish Balay                                      dof=self.DOF,
185808f684SSatish Balay                                      sizes=self.SIZES,
195808f684SSatish Balay                                      boundary_type=self.BOUNDARY,
205808f684SSatish Balay                                      stencil_type=self.STENCIL,
215808f684SSatish Balay                                      stencil_width=self.SWIDTH,
225808f684SSatish Balay                                      comm=self.COMM)
235808f684SSatish Balay
245808f684SSatish Balay    def tearDown(self):
255808f684SSatish Balay        self.da = None
26*62e5d2d2SJDBetteridge        PETSc.garbage_cleanup()
275808f684SSatish Balay
285808f684SSatish Balay    def testGetInfo(self):
295808f684SSatish Balay        dim = self.da.getDim()
305808f684SSatish Balay        dof = self.da.getDof()
315808f684SSatish Balay        sizes = self.da.getSizes()
325808f684SSatish Balay        psizes = self.da.getProcSizes()
335808f684SSatish Balay        boundary = self.da.getBoundaryType()
345808f684SSatish Balay        stencil_type = self.da.getStencilType()
355808f684SSatish Balay        stencil_width = self.da.getStencilWidth()
365808f684SSatish Balay        self.assertEqual(dim, len(self.SIZES))
375808f684SSatish Balay        self.assertEqual(dof, self.DOF)
385808f684SSatish Balay        self.assertEqual(sizes, tuple(self.SIZES))
395808f684SSatish Balay        self.assertEqual(boundary, self.BOUNDARY or (0,)*dim)
405808f684SSatish Balay        self.assertEqual(stencil_type, self.STENCIL)
415808f684SSatish Balay        self.assertEqual(stencil_width, self.SWIDTH)
425808f684SSatish Balay
435808f684SSatish Balay    def testRangesCorners(self):
445808f684SSatish Balay        dim = self.da.getDim()
455808f684SSatish Balay        ranges = self.da.getRanges()
465808f684SSatish Balay        starts, lsizes  = self.da.getCorners()
475808f684SSatish Balay        self.assertEqual(dim, len(ranges))
485808f684SSatish Balay        self.assertEqual(dim, len(starts))
495808f684SSatish Balay        self.assertEqual(dim, len(lsizes))
505808f684SSatish Balay        for i in range(dim):
515808f684SSatish Balay            s, e = ranges[i]
525808f684SSatish Balay            self.assertEqual(s, starts[i])
535808f684SSatish Balay            self.assertEqual(e-s, lsizes[i])
545808f684SSatish Balay
555808f684SSatish Balay    def testGhostRangesCorners(self):
565808f684SSatish Balay        dim = self.da.getDim()
575808f684SSatish Balay        ranges = self.da.getGhostRanges()
585808f684SSatish Balay        starts, lsizes  = self.da.getGhostCorners()
595808f684SSatish Balay        self.assertEqual(dim, len(ranges))
605808f684SSatish Balay        self.assertEqual(dim, len(starts))
615808f684SSatish Balay        self.assertEqual(dim, len(lsizes))
625808f684SSatish Balay        for i in range(dim):
635808f684SSatish Balay            s, e = ranges[i]
645808f684SSatish Balay            self.assertEqual(s, starts[i])
655808f684SSatish Balay            self.assertEqual(e-s, lsizes[i])
665808f684SSatish Balay
675808f684SSatish Balay    def testOwnershipRanges(self):
685808f684SSatish Balay        dim = self.da.getDim()
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()):
775808f684SSatish Balay            self.da.setFieldName(i, "field%d" % i)
785808f684SSatish Balay        for i in range(self.da.getDof()):
795808f684SSatish Balay            name = self.da.getFieldName(i)
805808f684SSatish Balay            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        s = self.da.stencil_width
1205808f684SSatish Balay        btype = self.da.boundary_type
1215808f684SSatish Balay        psize = self.da.proc_sizes
1225808f684SSatish Balay        for b, p in zip(btype, psize):
1235808f684SSatish Balay            if b != NONE and p == 1: 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            s = self.da.stencil_width
1405808f684SSatish Balay            btype = self.da.boundary_type
1415808f684SSatish Balay            psize = self.da.proc_sizes
1425808f684SSatish Balay            for b, p in zip(btype, psize):
1435808f684SSatish Balay                if b != NONE and p == 1: 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)
1505808f684SSatish Balay
1515808f684SSatish Balay    def testGetOther(self):
1525808f684SSatish Balay        ao = self.da.getAO()
1535808f684SSatish Balay        lgmap = self.da.getLGMap()
1545808f684SSatish Balay        l2g, g2l = self.da.getScatter()
1555808f684SSatish Balay
1565808f684SSatish Balay    def testRefineCoarsen(self):
1575808f684SSatish Balay        da = self.da
1585808f684SSatish Balay        rda = da.refine()
1595808f684SSatish Balay        self.assertEqual(da.getDim(), rda.getDim())
1605808f684SSatish Balay        self.assertEqual(da.getDof(), rda.getDof())
1615808f684SSatish Balay        if da.dim != 1:
1625808f684SSatish Balay            self.assertEqual(da.getStencilType(),  rda.getStencilType())
1635808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), rda.getStencilWidth())
1645808f684SSatish Balay        cda = rda.coarsen()
1655808f684SSatish Balay        self.assertEqual(rda.getDim(), cda.getDim())
1665808f684SSatish Balay        self.assertEqual(rda.getDof(), cda.getDof())
1675808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), cda.getSizes()):
1685808f684SSatish Balay            self.assertTrue(abs(n1-n2)<=1)
1695808f684SSatish Balay
1705808f684SSatish Balay    def testCoarsenRefine(self):
1715808f684SSatish Balay        da = self.da
1725808f684SSatish Balay        cda = self.da.coarsen()
1735808f684SSatish Balay        self.assertEqual(da.getDim(), cda.getDim())
1745808f684SSatish Balay        self.assertEqual(da.getDof(), cda.getDof())
1755808f684SSatish Balay        if da.dim != 1:
1765808f684SSatish Balay            self.assertEqual(da.getStencilType(),  cda.getStencilType())
1775808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), cda.getStencilWidth())
1785808f684SSatish Balay        rda = cda.refine()
1795808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), rda.getSizes()):
1805808f684SSatish Balay            self.assertTrue(abs(n1-n2)<=1)
1815808f684SSatish Balay
1825808f684SSatish Balay    def testRefineHierarchy(self):
1835808f684SSatish Balay        levels = self.da.refineHierarchy(2)
1845808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
1855808f684SSatish Balay        self.assertEqual(len(levels), 2)
1865808f684SSatish Balay        for item in levels:
1875808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
1885808f684SSatish Balay
1895808f684SSatish Balay    def testCoarsenHierarchy(self):
1905808f684SSatish Balay        levels = self.da.coarsenHierarchy(2)
1915808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
1925808f684SSatish Balay        self.assertEqual(len(levels), 2)
1935808f684SSatish Balay        for item in levels:
1945808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
1955808f684SSatish Balay
1965808f684SSatish Balay    def testCreateInterpolation(self):
1975808f684SSatish Balay        da = self.da
1985808f684SSatish Balay        if da.dim == 1: return
1995808f684SSatish Balay        rda = da.refine()
2005808f684SSatish Balay        mat, vec = da.createInterpolation(rda)
2015808f684SSatish Balay
2025808f684SSatish Balay    def testCreateInjection(self):
2035808f684SSatish Balay        da = self.da
2045808f684SSatish Balay        if da.dim == 1: return
2055808f684SSatish Balay        rda = da.refine()
2065808f684SSatish Balay        scatter = da.createInjection(rda)
2075808f684SSatish Balay
2088c2316a8SJeremy Tillay    def testzeroRowsColumnsStencil(self):
2098c2316a8SJeremy Tillay        da = self.da
2108c2316a8SJeremy Tillay        A = da.createMatrix()
2118c2316a8SJeremy Tillay        x = da.createGlobalVector()
2128c2316a8SJeremy Tillay        x.set(2.0)
2138c2316a8SJeremy Tillay        A.setDiagonal(x)
2148c2316a8SJeremy Tillay        diag1 = x.duplicate()
2158c2316a8SJeremy Tillay        A.getDiagonal(diag1)
2168c2316a8SJeremy Tillay        if self.SIZES != 2: #only coded test for 2D case
2178c2316a8SJeremy Tillay        	return
2188c2316a8SJeremy Tillay        istart,iend, jstart, jend = da.getRanges()
2198c2316a8SJeremy Tillay        self.assertTrue(x.equal(diag1))
2208c2316a8SJeremy Tillay        zeroidx = []
2218c2316a8SJeremy Tillay        for i in range(istart,iend):
2228c2316a8SJeremy Tillay            for j in range(jstart,jend):
2238c2316a8SJeremy Tillay                row = PETSc.Mat.Stencil()
2248c2316a8SJeremy Tillay                row.index = (i,j)
2258c2316a8SJeremy Tillay                zeroidx = zeroidx + [row]
2268c2316a8SJeremy Tillay        diag2 = x.duplicate()
2278c2316a8SJeremy Tillay        diag2.set(1.0)
2288c2316a8SJeremy Tillay        A.zeroRowsColumnsStencil(zeroidx, 1.0, x, diag2)
2298c2316a8SJeremy Tillay        ans = x.duplicate()
2308c2316a8SJeremy Tillay        ans.set(2.0)
2318c2316a8SJeremy Tillay        self.assertTrue(ans.equal(diag2))
2328c2316a8SJeremy Tillay
2335808f684SSatish Balay
2345808f684SSatish BalayMIRROR   = PETSc.DMDA.BoundaryType.MIRROR
2355808f684SSatish BalayGHOSTED  = PETSc.DMDA.BoundaryType.GHOSTED
2365808f684SSatish BalayPERIODIC = PETSc.DMDA.BoundaryType.PERIODIC
2375808f684SSatish BalayTWIST    = PETSc.DMDA.BoundaryType.TWIST
2385808f684SSatish Balay
2395808f684SSatish BalaySCALE = 4
2405808f684SSatish Balay
2415808f684SSatish Balayclass BaseTestDA_1D(BaseTestDA):
2425808f684SSatish Balay    SIZES = [100*SCALE]
2435808f684SSatish Balay
2445808f684SSatish Balayclass BaseTestDA_2D(BaseTestDA):
2455808f684SSatish Balay    SIZES = [9*SCALE,11*SCALE]
2465808f684SSatish Balay
2475808f684SSatish Balayclass BaseTestDA_3D(BaseTestDA):
2485808f684SSatish Balay    SIZES = [6*SCALE,7*SCALE,8*SCALE]
2495808f684SSatish Balay
2505808f684SSatish Balay# --------------------------------------------------------------------
2515808f684SSatish Balay
2525808f684SSatish Balayclass TestDA_1D(BaseTestDA_1D, unittest.TestCase):
2535808f684SSatish Balay    pass
2545808f684SSatish Balayclass TestDA_1D_W0(TestDA_1D):
2555808f684SSatish Balay    SWIDTH = 0
2565808f684SSatish Balayclass TestDA_1D_W2(TestDA_1D):
2575808f684SSatish Balay    SWIDTH = 2
2585808f684SSatish Balay
2595808f684SSatish Balayclass TestDA_2D(BaseTestDA_2D, unittest.TestCase):
2605808f684SSatish Balay    pass
2615808f684SSatish Balayclass TestDA_2D_W0(TestDA_2D):
2625808f684SSatish Balay    SWIDTH = 0
2635808f684SSatish Balayclass TestDA_2D_W0_N2(TestDA_2D):
2645808f684SSatish Balay    DOF = 2
2655808f684SSatish Balay    SWIDTH = 0
2665808f684SSatish Balayclass TestDA_2D_W2(TestDA_2D):
2675808f684SSatish Balay    SWIDTH = 2
2685808f684SSatish Balayclass TestDA_2D_W2_N2(TestDA_2D):
2695808f684SSatish Balay    DOF = 2
2705808f684SSatish Balay    SWIDTH = 2
2715808f684SSatish Balayclass TestDA_2D_PXY(TestDA_2D):
2725808f684SSatish Balay    SIZES = [13*SCALE,17*SCALE]
2735808f684SSatish Balay    DOF = 2
2745808f684SSatish Balay    SWIDTH = 5
2755808f684SSatish Balay    BOUNDARY = (PERIODIC,)*2
2765808f684SSatish Balayclass TestDA_2D_GXY(TestDA_2D):
2775808f684SSatish Balay    SIZES = [13*SCALE,17*SCALE]
2785808f684SSatish Balay    DOF = 2
2795808f684SSatish Balay    SWIDTH = 5
2805808f684SSatish Balay    BOUNDARY = (GHOSTED,)*2
2815808f684SSatish Balayclass TestDA_2D_TXY(TestDA_2D):
2825808f684SSatish Balay    SIZES = [13*SCALE,17*SCALE]
2835808f684SSatish Balay    DOF = 2
2845808f684SSatish Balay    SWIDTH = 5
2855808f684SSatish Balay    BOUNDARY = (TWIST,)*2
2865808f684SSatish Balay
2875808f684SSatish Balayclass TestDA_3D(BaseTestDA_3D, unittest.TestCase):
2885808f684SSatish Balay    pass
2895808f684SSatish Balayclass TestDA_3D_W0(TestDA_3D):
2905808f684SSatish Balay    SWIDTH = 0
2915808f684SSatish Balayclass TestDA_3D_W0_N2(TestDA_3D):
2925808f684SSatish Balay    DOF = 2
2935808f684SSatish Balay    SWIDTH = 0
2945808f684SSatish Balayclass TestDA_3D_W2(TestDA_3D):
2955808f684SSatish Balay    SWIDTH = 2
2965808f684SSatish Balayclass TestDA_3D_W2_N2(TestDA_3D):
2975808f684SSatish Balay    DOF = 2
2985808f684SSatish Balay    SWIDTH = 2
2995808f684SSatish Balayclass TestDA_3D_PXYZ(TestDA_3D):
3005808f684SSatish Balay    SIZES = [11*SCALE,13*SCALE,17*SCALE]
3015808f684SSatish Balay    DOF = 2
3025808f684SSatish Balay    SWIDTH = 3
3035808f684SSatish Balay    BOUNDARY = (PERIODIC,)*3
3045808f684SSatish Balayclass TestDA_3D_GXYZ(TestDA_3D):
3055808f684SSatish Balay    SIZES = [11*SCALE,13*SCALE,17*SCALE]
3065808f684SSatish Balay    DOF = 2
3075808f684SSatish Balay    SWIDTH = 3
3085808f684SSatish Balay    BOUNDARY = (GHOSTED,)*3
3095808f684SSatish Balayclass TestDA_3D_TXYZ(TestDA_3D):
3105808f684SSatish Balay    SIZES = [11*SCALE,13*SCALE,17*SCALE]
3115808f684SSatish Balay    DOF = 2
3125808f684SSatish Balay    SWIDTH = 3
3135808f684SSatish Balay    BOUNDARY = (TWIST,)*3
3145808f684SSatish Balay
3155808f684SSatish Balay# --------------------------------------------------------------------
3165808f684SSatish Balay
3175808f684SSatish BalayDIM = (1,2,3,)
3185808f684SSatish BalayDOF = (None,1,2,3,4,5,)
3195808f684SSatish BalayBOUNDARY_TYPE = (
3205808f684SSatish Balay    None,
3215808f684SSatish Balay    "none",     (0,)*3,        0,
3225808f684SSatish Balay    "ghosted",  (GHOSTED,)*3,  GHOSTED,
3235808f684SSatish Balay    "periodic", (PERIODIC,)*3, PERIODIC,
3245808f684SSatish Balay    "twist",    (TWIST,)*3,    TWIST,
3255808f684SSatish Balay    )
3265808f684SSatish BalaySTENCIL_TYPE  = (None,"star","box")
3275808f684SSatish BalaySTENCIL_WIDTH = (None,0,1,2,3)
3285808f684SSatish Balay
3295808f684SSatish Balay
3305808f684SSatish BalayDIM           = (1,2,3)
3315808f684SSatish BalayDOF           = (None,2,5)
3325808f684SSatish BalayBOUNDARY_TYPE = (None,"none","periodic","ghosted","twist")
3335808f684SSatish BalaySTENCIL_TYPE  = (None,"box")
3345808f684SSatish BalaySTENCIL_WIDTH = (None,1,2)
3355808f684SSatish Balay
3365808f684SSatish Balayclass TestDACreate(unittest.TestCase):
3375808f684SSatish Balay    pass
3385808f684SSatish Balaycounter = 0
3395808f684SSatish Balayfor dim in DIM:
3405808f684SSatish Balay    for dof in DOF:
3415808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
3425808f684SSatish Balay            if isinstance(boundary, tuple):
3435808f684SSatish Balay                boundary = boundary[:dim]
3445808f684SSatish Balay            for stencil in STENCIL_TYPE:
3455808f684SSatish Balay                for width in STENCIL_WIDTH:
3465808f684SSatish Balay                    kargs = dict(sizes=[8*SCALE]*dim,
3475808f684SSatish Balay                                 dim=dim, dof=dof,
3485808f684SSatish Balay                                 boundary_type=boundary,
3495808f684SSatish Balay                                 stencil_type=stencil,
3505808f684SSatish Balay                                 stencil_width=width)
3515808f684SSatish Balay                    def testCreate(self, kargs=kargs):
3525808f684SSatish Balay                        kargs = dict(kargs)
3535808f684SSatish Balay                        da = PETSc.DMDA().create(**kargs)
3545808f684SSatish Balay                        da.destroy()
3555808f684SSatish Balay                    setattr(TestDACreate,
3565808f684SSatish Balay                            "testCreate%04d"%counter,
3575808f684SSatish Balay                            testCreate)
3585808f684SSatish Balay                    del testCreate, kargs
3595808f684SSatish Balay                    counter += 1
3605808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
3615808f684SSatish Balay
3625808f684SSatish Balayclass TestDADuplicate(unittest.TestCase):
3635808f684SSatish Balay    pass
3645808f684SSatish Balaycounter = 0
3655808f684SSatish Balayfor dim in DIM:
3665808f684SSatish Balay    for dof in DOF:
3675808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
3685808f684SSatish Balay            if isinstance(boundary, tuple):
3695808f684SSatish Balay                boundary = boundary[:dim]
3705808f684SSatish Balay            for stencil in STENCIL_TYPE:
3715808f684SSatish Balay                for width in STENCIL_WIDTH:
3725808f684SSatish Balay                    kargs = dict(dim=dim, dof=dof,
3735808f684SSatish Balay                                 boundary_type=boundary,
3745808f684SSatish Balay                                 stencil_type=stencil,
3755808f684SSatish Balay                                 stencil_width=width)
3765808f684SSatish Balay                    def testDuplicate(self, kargs=kargs):
3775808f684SSatish Balay                        kargs = dict(kargs)
3785808f684SSatish Balay                        dim = kargs.pop('dim')
3795808f684SSatish Balay                        dof = kargs['dof']
3805808f684SSatish Balay                        boundary = kargs['boundary_type']
3815808f684SSatish Balay                        stencil = kargs['stencil_type']
3825808f684SSatish Balay                        width = kargs['stencil_width']
3835808f684SSatish Balay                        da = PETSc.DMDA().create([8*SCALE]*dim)
3845808f684SSatish Balay                        newda = da.duplicate(**kargs)
3855808f684SSatish Balay                        self.assertEqual(newda.dim, da.dim)
3865808f684SSatish Balay                        self.assertEqual(newda.sizes, da.sizes)
3875808f684SSatish Balay                        self.assertEqual(newda.proc_sizes,
3885808f684SSatish Balay                                         da.proc_sizes)
3895808f684SSatish Balay                        self.assertEqual(newda.ranges, da.ranges)
3905808f684SSatish Balay                        self.assertEqual(newda.corners, da.corners)
3915808f684SSatish Balay                        if (newda.boundary_type == da.boundary_type
3925808f684SSatish Balay                            and
3935808f684SSatish Balay                            newda.stencil_width == da.stencil_width):
3945808f684SSatish Balay                            self.assertEqual(newda.ghost_ranges,
3955808f684SSatish Balay                                             da.ghost_ranges)
3965808f684SSatish Balay                            self.assertEqual(newda.ghost_corners,
3975808f684SSatish Balay                                             da.ghost_corners)
3985808f684SSatish Balay                        if dof is None:
3995808f684SSatish Balay                            dof = da.dof
4005808f684SSatish Balay                        if boundary is None:
4015808f684SSatish Balay                            boundary = da.boundary_type
4025808f684SSatish Balay                        elif boundary == "none":
4035808f684SSatish Balay                            boundary = (0,) * dim
4045808f684SSatish Balay                        elif boundary == "mirror":
4055808f684SSatish Balay                            boundary = (MIRROR,) * dim
4065808f684SSatish Balay                        elif boundary == "ghosted":
4075808f684SSatish Balay                            boundary = (GHOSTED,) * dim
4085808f684SSatish Balay                        elif boundary == "periodic":
4095808f684SSatish Balay                            boundary = (PERIODIC,) * dim
4105808f684SSatish Balay                        elif boundary == "twist":
4115808f684SSatish Balay                            boundary = (TWIST,) * dim
4125808f684SSatish Balay                        elif isinstance(boundary, int):
4135808f684SSatish Balay                            boundary = (boundary,) * dim
4145808f684SSatish Balay                        if stencil is None:
4155808f684SSatish Balay                            stencil = da.stencil[0]
4165808f684SSatish Balay                        if width is None:
4175808f684SSatish Balay                            width = da.stencil_width
4185808f684SSatish Balay                        self.assertEqual(newda.dof, dof)
4195808f684SSatish Balay                        self.assertEqual(newda.boundary_type,
4205808f684SSatish Balay                                         boundary)
4215808f684SSatish Balay                        if dim == 1:
4225808f684SSatish Balay                            self.assertEqual(newda.stencil,
4235808f684SSatish Balay                                             (stencil, width))
4245808f684SSatish Balay                        newda.destroy()
4255808f684SSatish Balay                        da.destroy()
4265808f684SSatish Balay                    setattr(TestDADuplicate,
4275808f684SSatish Balay                            "testDuplicate%04d"%counter,
4285808f684SSatish Balay                            testDuplicate)
4295808f684SSatish Balay                    del testDuplicate, kargs
4305808f684SSatish Balay                    counter += 1
4315808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
4325808f684SSatish Balay
4335808f684SSatish Balay# --------------------------------------------------------------------
4345808f684SSatish Balay
4355808f684SSatish Balayif PETSc.COMM_WORLD.getSize() > 1:
4365808f684SSatish Balay    del TestDA_1D_W0
4375808f684SSatish Balay    del TestDA_2D_W0, TestDA_2D_W0_N2
4385808f684SSatish Balay    del TestDA_3D_W0, TestDA_3D_W0_N2
4395808f684SSatish Balay
4405808f684SSatish Balay# --------------------------------------------------------------------
4415808f684SSatish Balay
4425808f684SSatish Balayif __name__ == '__main__':
4435808f684SSatish Balay    unittest.main()
4445808f684SSatish Balay
4455808f684SSatish Balay# --------------------------------------------------------------------
446