xref: /petsc/src/binding/petsc4py/test/test_dmda.py (revision 7a46bb6e187b67f5f511cc75f985a3206e2dee53)
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)
150*7a46bb6eSStefano Zampini            self.assertFalse(vg)
151*7a46bb6eSStefano Zampini            self.assertFalse(vl)
152*7a46bb6eSStefano Zampini
153*7a46bb6eSStefano Zampini        name = 'abcd'
154*7a46bb6eSStefano Zampini
155*7a46bb6eSStefano Zampini        vg = self.da.getGlobalVec(name)
156*7a46bb6eSStefano Zampini        vg.set(4.0)
157*7a46bb6eSStefano Zampini        self.da.restoreGlobalVec(vg, name)
158*7a46bb6eSStefano Zampini        self.assertFalse(vg)
159*7a46bb6eSStefano Zampini        vg = self.da.getGlobalVec()
160*7a46bb6eSStefano Zampini        vg.setRandom()
161*7a46bb6eSStefano Zampini        self.da.restoreGlobalVec(vg)
162*7a46bb6eSStefano Zampini        vg = self.da.getGlobalVec(name)
163*7a46bb6eSStefano Zampini        vg.shift(-4.0)
164*7a46bb6eSStefano Zampini        self.assertEqual(vg.max()[1], 0.0)
165*7a46bb6eSStefano Zampini        self.da.restoreGlobalVec(vg, name)
166*7a46bb6eSStefano Zampini
167*7a46bb6eSStefano Zampini        vl = self.da.getLocalVec(name)
168*7a46bb6eSStefano Zampini        vl.set(4.0)
169*7a46bb6eSStefano Zampini        self.da.restoreLocalVec(vl, name)
170*7a46bb6eSStefano Zampini        self.assertFalse(vl)
171*7a46bb6eSStefano Zampini        vl = self.da.getLocalVec()
172*7a46bb6eSStefano Zampini        vl.setRandom()
173*7a46bb6eSStefano Zampini        self.da.restoreLocalVec(vl)
174*7a46bb6eSStefano Zampini        vl = self.da.getLocalVec(name)
175*7a46bb6eSStefano Zampini        vl.shift(-4.0)
176*7a46bb6eSStefano Zampini        self.assertEqual(vl.max()[1], 0.0)
177*7a46bb6eSStefano Zampini        self.da.restoreLocalVec(vl, name)
1785808f684SSatish Balay
1795808f684SSatish Balay    def testGetOther(self):
1806f336411SStefano Zampini        _ = self.da.getAO()
1816f336411SStefano Zampini        _ = self.da.getLGMap()
1826f336411SStefano Zampini        _, _ = self.da.getScatter()
1835808f684SSatish Balay
1845808f684SSatish Balay    def testRefineCoarsen(self):
1855808f684SSatish Balay        da = self.da
1865808f684SSatish Balay        rda = da.refine()
1875808f684SSatish Balay        self.assertEqual(da.getDim(), rda.getDim())
1885808f684SSatish Balay        self.assertEqual(da.getDof(), rda.getDof())
1895808f684SSatish Balay        if da.dim != 1:
1905808f684SSatish Balay            self.assertEqual(da.getStencilType(), rda.getStencilType())
1915808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), rda.getStencilWidth())
1925808f684SSatish Balay        cda = rda.coarsen()
1935808f684SSatish Balay        self.assertEqual(rda.getDim(), cda.getDim())
1945808f684SSatish Balay        self.assertEqual(rda.getDof(), cda.getDof())
1955808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), cda.getSizes()):
1965808f684SSatish Balay            self.assertTrue(abs(n1 - n2) <= 1)
1975808f684SSatish Balay
1985808f684SSatish Balay    def testCoarsenRefine(self):
1996f336411SStefano Zampini        if PETSc.COMM_WORLD.getSize() > 6:
2006f336411SStefano Zampini            return
2015808f684SSatish Balay        da = self.da
2025808f684SSatish Balay        cda = self.da.coarsen()
2035808f684SSatish Balay        self.assertEqual(da.getDim(), cda.getDim())
2045808f684SSatish Balay        self.assertEqual(da.getDof(), cda.getDof())
2055808f684SSatish Balay        if da.dim != 1:
2065808f684SSatish Balay            self.assertEqual(da.getStencilType(), cda.getStencilType())
2075808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), cda.getStencilWidth())
2085808f684SSatish Balay        rda = cda.refine()
2095808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), rda.getSizes()):
2105808f684SSatish Balay            self.assertTrue(abs(n1 - n2) <= 1)
2115808f684SSatish Balay
2125808f684SSatish Balay    def testRefineHierarchy(self):
2135808f684SSatish Balay        levels = self.da.refineHierarchy(2)
2145808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
2155808f684SSatish Balay        self.assertEqual(len(levels), 2)
2165808f684SSatish Balay        for item in levels:
2175808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
2185808f684SSatish Balay
2195808f684SSatish Balay    def testCoarsenHierarchy(self):
2206f336411SStefano Zampini        if PETSc.COMM_WORLD.getSize() > 6:
2216f336411SStefano Zampini            return
2225808f684SSatish Balay        levels = self.da.coarsenHierarchy(2)
2235808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
2245808f684SSatish Balay        self.assertEqual(len(levels), 2)
2255808f684SSatish Balay        for item in levels:
2265808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
2275808f684SSatish Balay
2285808f684SSatish Balay    def testCreateInterpolation(self):
2295808f684SSatish Balay        da = self.da
2306f336411SStefano Zampini        if da.dim == 1:
2316f336411SStefano Zampini            return
2325808f684SSatish Balay        rda = da.refine()
2336f336411SStefano Zampini        _, _ = da.createInterpolation(rda)
2345808f684SSatish Balay
2355808f684SSatish Balay    def testCreateInjection(self):
2366f336411SStefano Zampini        if PETSc.COMM_WORLD.getSize() > 6:
2376f336411SStefano Zampini            return
2385808f684SSatish Balay        da = self.da
2396f336411SStefano Zampini        if da.dim == 1:
2406f336411SStefano Zampini            return
2415808f684SSatish Balay        rda = da.refine()
2426f336411SStefano Zampini        _ = da.createInjection(rda)
2435808f684SSatish Balay
2448c2316a8SJeremy Tillay    def testzeroRowsColumnsStencil(self):
2458c2316a8SJeremy Tillay        da = self.da
2468c2316a8SJeremy Tillay        A = da.createMatrix()
2478c2316a8SJeremy Tillay        x = da.createGlobalVector()
2488c2316a8SJeremy Tillay        x.set(2.0)
2498c2316a8SJeremy Tillay        A.setDiagonal(x)
2508c2316a8SJeremy Tillay        diag1 = x.duplicate()
2518c2316a8SJeremy Tillay        A.getDiagonal(diag1)
2528c2316a8SJeremy Tillay        if self.SIZES != 2:  # only coded test for 2D case
2538c2316a8SJeremy Tillay            return
2548c2316a8SJeremy Tillay        istart, iend, jstart, jend = da.getRanges()
2558c2316a8SJeremy Tillay        self.assertTrue(x.equal(diag1))
2568c2316a8SJeremy Tillay        zeroidx = []
2578c2316a8SJeremy Tillay        for i in range(istart, iend):
2588c2316a8SJeremy Tillay            for j in range(jstart, jend):
2598c2316a8SJeremy Tillay                row = PETSc.Mat.Stencil()
2608c2316a8SJeremy Tillay                row.index = (i, j)
2618c2316a8SJeremy Tillay                zeroidx = zeroidx + [row]
2628c2316a8SJeremy Tillay        diag2 = x.duplicate()
2638c2316a8SJeremy Tillay        diag2.set(1.0)
2648c2316a8SJeremy Tillay        A.zeroRowsColumnsStencil(zeroidx, 1.0, x, diag2)
2658c2316a8SJeremy Tillay        ans = x.duplicate()
2668c2316a8SJeremy Tillay        ans.set(2.0)
2678c2316a8SJeremy Tillay        self.assertTrue(ans.equal(diag2))
2688c2316a8SJeremy Tillay
2695808f684SSatish Balay
2705808f684SSatish BalayMIRROR = PETSc.DMDA.BoundaryType.MIRROR
2715808f684SSatish BalayGHOSTED = PETSc.DMDA.BoundaryType.GHOSTED
2725808f684SSatish BalayPERIODIC = PETSc.DMDA.BoundaryType.PERIODIC
2735808f684SSatish BalayTWIST = PETSc.DMDA.BoundaryType.TWIST
2745808f684SSatish Balay
2755808f684SSatish BalaySCALE = 4
2765808f684SSatish Balay
2776f336411SStefano Zampini
2785808f684SSatish Balayclass BaseTestDA_1D(BaseTestDA):
2795808f684SSatish Balay    SIZES = [100 * SCALE]
2805808f684SSatish Balay
2816f336411SStefano Zampini
2825808f684SSatish Balayclass BaseTestDA_2D(BaseTestDA):
2835808f684SSatish Balay    SIZES = [9 * SCALE, 11 * SCALE]
2845808f684SSatish Balay
2856f336411SStefano Zampini
2865808f684SSatish Balayclass BaseTestDA_3D(BaseTestDA):
2875808f684SSatish Balay    SIZES = [6 * SCALE, 7 * SCALE, 8 * SCALE]
2885808f684SSatish Balay
2896f336411SStefano Zampini
2905808f684SSatish Balay# --------------------------------------------------------------------
2915808f684SSatish Balay
2926f336411SStefano Zampini
2935808f684SSatish Balayclass TestDA_1D(BaseTestDA_1D, unittest.TestCase):
2945808f684SSatish Balay    pass
2956f336411SStefano Zampini
2966f336411SStefano Zampini
2975808f684SSatish Balayclass TestDA_1D_W0(TestDA_1D):
2985808f684SSatish Balay    SWIDTH = 0
2996f336411SStefano Zampini
3006f336411SStefano Zampini
3015808f684SSatish Balayclass TestDA_1D_W2(TestDA_1D):
3025808f684SSatish Balay    SWIDTH = 2
3035808f684SSatish Balay
3046f336411SStefano Zampini
3055808f684SSatish Balayclass TestDA_2D(BaseTestDA_2D, unittest.TestCase):
3065808f684SSatish Balay    pass
3076f336411SStefano Zampini
3086f336411SStefano Zampini
3095808f684SSatish Balayclass TestDA_2D_W0(TestDA_2D):
3105808f684SSatish Balay    SWIDTH = 0
3116f336411SStefano Zampini
3126f336411SStefano Zampini
3135808f684SSatish Balayclass TestDA_2D_W0_N2(TestDA_2D):
3145808f684SSatish Balay    DOF = 2
3155808f684SSatish Balay    SWIDTH = 0
3166f336411SStefano Zampini
3176f336411SStefano Zampini
3185808f684SSatish Balayclass TestDA_2D_W2(TestDA_2D):
3195808f684SSatish Balay    SWIDTH = 2
3206f336411SStefano Zampini
3216f336411SStefano Zampini
3225808f684SSatish Balayclass TestDA_2D_W2_N2(TestDA_2D):
3235808f684SSatish Balay    DOF = 2
3245808f684SSatish Balay    SWIDTH = 2
3256f336411SStefano Zampini
3266f336411SStefano Zampini
3275808f684SSatish Balayclass TestDA_2D_PXY(TestDA_2D):
3285808f684SSatish Balay    SIZES = [13 * SCALE, 17 * SCALE]
3295808f684SSatish Balay    DOF = 2
3305808f684SSatish Balay    SWIDTH = 5
3315808f684SSatish Balay    BOUNDARY = (PERIODIC,) * 2
3326f336411SStefano Zampini
3336f336411SStefano Zampini
3345808f684SSatish Balayclass TestDA_2D_GXY(TestDA_2D):
3355808f684SSatish Balay    SIZES = [13 * SCALE, 17 * SCALE]
3365808f684SSatish Balay    DOF = 2
3375808f684SSatish Balay    SWIDTH = 5
3385808f684SSatish Balay    BOUNDARY = (GHOSTED,) * 2
3396f336411SStefano Zampini
3406f336411SStefano Zampini
3415808f684SSatish Balayclass TestDA_2D_TXY(TestDA_2D):
3425808f684SSatish Balay    SIZES = [13 * SCALE, 17 * SCALE]
3435808f684SSatish Balay    DOF = 2
3445808f684SSatish Balay    SWIDTH = 5
3455808f684SSatish Balay    BOUNDARY = (TWIST,) * 2
3465808f684SSatish Balay
3476f336411SStefano Zampini
3485808f684SSatish Balayclass TestDA_3D(BaseTestDA_3D, unittest.TestCase):
3495808f684SSatish Balay    pass
3506f336411SStefano Zampini
3516f336411SStefano Zampini
3525808f684SSatish Balayclass TestDA_3D_W0(TestDA_3D):
3535808f684SSatish Balay    SWIDTH = 0
3546f336411SStefano Zampini
3556f336411SStefano Zampini
3565808f684SSatish Balayclass TestDA_3D_W0_N2(TestDA_3D):
3575808f684SSatish Balay    DOF = 2
3585808f684SSatish Balay    SWIDTH = 0
3596f336411SStefano Zampini
3606f336411SStefano Zampini
3615808f684SSatish Balayclass TestDA_3D_W2(TestDA_3D):
3625808f684SSatish Balay    SWIDTH = 2
3636f336411SStefano Zampini
3646f336411SStefano Zampini
3655808f684SSatish Balayclass TestDA_3D_W2_N2(TestDA_3D):
3665808f684SSatish Balay    DOF = 2
3675808f684SSatish Balay    SWIDTH = 2
3686f336411SStefano Zampini
3696f336411SStefano Zampini
3705808f684SSatish Balayclass TestDA_3D_PXYZ(TestDA_3D):
3715808f684SSatish Balay    SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE]
3725808f684SSatish Balay    DOF = 2
3735808f684SSatish Balay    SWIDTH = 3
3745808f684SSatish Balay    BOUNDARY = (PERIODIC,) * 3
3756f336411SStefano Zampini
3766f336411SStefano Zampini
3775808f684SSatish Balayclass TestDA_3D_GXYZ(TestDA_3D):
3785808f684SSatish Balay    SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE]
3795808f684SSatish Balay    DOF = 2
3805808f684SSatish Balay    SWIDTH = 3
3815808f684SSatish Balay    BOUNDARY = (GHOSTED,) * 3
3826f336411SStefano Zampini
3836f336411SStefano Zampini
3845808f684SSatish Balayclass TestDA_3D_TXYZ(TestDA_3D):
3855808f684SSatish Balay    SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE]
3865808f684SSatish Balay    DOF = 2
3875808f684SSatish Balay    SWIDTH = 3
3885808f684SSatish Balay    BOUNDARY = (TWIST,) * 3
3895808f684SSatish Balay
3906f336411SStefano Zampini
3915808f684SSatish Balay# --------------------------------------------------------------------
3925808f684SSatish Balay
3936f336411SStefano ZampiniDIM = (
3946f336411SStefano Zampini    1,
3956f336411SStefano Zampini    2,
3966f336411SStefano Zampini    3,
3976f336411SStefano Zampini)
3986f336411SStefano ZampiniDOF = (
3996f336411SStefano Zampini    None,
4006f336411SStefano Zampini    1,
4016f336411SStefano Zampini    2,
4026f336411SStefano Zampini    3,
4036f336411SStefano Zampini    4,
4046f336411SStefano Zampini    5,
4056f336411SStefano Zampini)
4065808f684SSatish BalayBOUNDARY_TYPE = (
4075808f684SSatish Balay    None,
4086f336411SStefano Zampini    'none',
4096f336411SStefano Zampini    (0,) * 3,
4106f336411SStefano Zampini    0,
4116f336411SStefano Zampini    'ghosted',
4126f336411SStefano Zampini    (GHOSTED,) * 3,
4136f336411SStefano Zampini    GHOSTED,
4146f336411SStefano Zampini    'periodic',
4156f336411SStefano Zampini    (PERIODIC,) * 3,
4166f336411SStefano Zampini    PERIODIC,
4176f336411SStefano Zampini    'twist',
4186f336411SStefano Zampini    (TWIST,) * 3,
4196f336411SStefano Zampini    TWIST,
4205808f684SSatish Balay)
4216f336411SStefano ZampiniSTENCIL_TYPE = (None, 'star', 'box')
4225808f684SSatish BalaySTENCIL_WIDTH = (None, 0, 1, 2, 3)
4235808f684SSatish Balay
4245808f684SSatish Balay
4255808f684SSatish BalayDIM = (1, 2, 3)
4265808f684SSatish BalayDOF = (None, 2, 5)
4276f336411SStefano ZampiniBOUNDARY_TYPE = (None, 'none', 'periodic', 'ghosted', 'twist')
4286f336411SStefano ZampiniSTENCIL_TYPE = (None, 'box')
4295808f684SSatish BalaySTENCIL_WIDTH = (None, 1, 2)
4305808f684SSatish Balay
4316f336411SStefano Zampini
4325808f684SSatish Balayclass TestDACreate(unittest.TestCase):
4335808f684SSatish Balay    pass
4346f336411SStefano Zampini
4356f336411SStefano Zampini
4365808f684SSatish Balaycounter = 0
4375808f684SSatish Balayfor dim in DIM:
4385808f684SSatish Balay    for dof in DOF:
4395808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
4405808f684SSatish Balay            if isinstance(boundary, tuple):
4415808f684SSatish Balay                boundary = boundary[:dim]
4425808f684SSatish Balay            for stencil in STENCIL_TYPE:
4435808f684SSatish Balay                for width in STENCIL_WIDTH:
4446f336411SStefano Zampini                    kargs = {
4456f336411SStefano Zampini                        'sizes': [8 * SCALE] * dim,
4466f336411SStefano Zampini                        'dim': dim,
4476f336411SStefano Zampini                        'dof': dof,
4486f336411SStefano Zampini                        'boundary_type': boundary,
4496f336411SStefano Zampini                        'stencil_type': stencil,
4506f336411SStefano Zampini                        'stencil_width': width,
4516f336411SStefano Zampini                    }
4526f336411SStefano Zampini
4535808f684SSatish Balay                    def testCreate(self, kargs=kargs):
4545808f684SSatish Balay                        kargs = dict(kargs)
4555808f684SSatish Balay                        da = PETSc.DMDA().create(**kargs)
4565808f684SSatish Balay                        da.destroy()
4576f336411SStefano Zampini
4586f336411SStefano Zampini                    setattr(TestDACreate, 'testCreate%04d' % counter, testCreate)
4595808f684SSatish Balay                    del testCreate, kargs
4605808f684SSatish Balay                    counter += 1
4615808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
4625808f684SSatish Balay
4636f336411SStefano Zampini
4645808f684SSatish Balayclass TestDADuplicate(unittest.TestCase):
4655808f684SSatish Balay    pass
4666f336411SStefano Zampini
4676f336411SStefano Zampini
4685808f684SSatish Balaycounter = 0
4695808f684SSatish Balayfor dim in DIM:
4705808f684SSatish Balay    for dof in DOF:
4715808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
4725808f684SSatish Balay            if isinstance(boundary, tuple):
4735808f684SSatish Balay                boundary = boundary[:dim]
4745808f684SSatish Balay            for stencil in STENCIL_TYPE:
4755808f684SSatish Balay                for width in STENCIL_WIDTH:
4766f336411SStefano Zampini                    kargs = {
4776f336411SStefano Zampini                        'dim': dim,
4786f336411SStefano Zampini                        'dof': dof,
4796f336411SStefano Zampini                        'boundary_type': boundary,
4806f336411SStefano Zampini                        'stencil_type': stencil,
4816f336411SStefano Zampini                        'stencil_width': width,
4826f336411SStefano Zampini                    }
4836f336411SStefano Zampini
4845808f684SSatish Balay                    def testDuplicate(self, kargs=kargs):
4855808f684SSatish Balay                        kargs = dict(kargs)
4865808f684SSatish Balay                        dim = kargs.pop('dim')
4875808f684SSatish Balay                        dof = kargs['dof']
4885808f684SSatish Balay                        boundary = kargs['boundary_type']
4895808f684SSatish Balay                        stencil = kargs['stencil_type']
4905808f684SSatish Balay                        width = kargs['stencil_width']
4915808f684SSatish Balay                        da = PETSc.DMDA().create([8 * SCALE] * dim)
4925808f684SSatish Balay                        newda = da.duplicate(**kargs)
4935808f684SSatish Balay                        self.assertEqual(newda.dim, da.dim)
4945808f684SSatish Balay                        self.assertEqual(newda.sizes, da.sizes)
4956f336411SStefano Zampini                        self.assertEqual(newda.proc_sizes, da.proc_sizes)
4965808f684SSatish Balay                        self.assertEqual(newda.ranges, da.ranges)
4975808f684SSatish Balay                        self.assertEqual(newda.corners, da.corners)
4986f336411SStefano Zampini                        if (
4996f336411SStefano Zampini                            newda.boundary_type == da.boundary_type
5006f336411SStefano Zampini                            and newda.stencil_width == da.stencil_width
5016f336411SStefano Zampini                        ):
5026f336411SStefano Zampini                            self.assertEqual(newda.ghost_ranges, da.ghost_ranges)
5036f336411SStefano Zampini                            self.assertEqual(newda.ghost_corners, da.ghost_corners)
5045808f684SSatish Balay                        if dof is None:
5055808f684SSatish Balay                            dof = da.dof
5065808f684SSatish Balay                        if boundary is None:
5075808f684SSatish Balay                            boundary = da.boundary_type
5086f336411SStefano Zampini                        elif boundary == 'none':
5095808f684SSatish Balay                            boundary = (0,) * dim
5106f336411SStefano Zampini                        elif boundary == 'mirror':
5115808f684SSatish Balay                            boundary = (MIRROR,) * dim
5126f336411SStefano Zampini                        elif boundary == 'ghosted':
5135808f684SSatish Balay                            boundary = (GHOSTED,) * dim
5146f336411SStefano Zampini                        elif boundary == 'periodic':
5155808f684SSatish Balay                            boundary = (PERIODIC,) * dim
5166f336411SStefano Zampini                        elif boundary == 'twist':
5175808f684SSatish Balay                            boundary = (TWIST,) * dim
5185808f684SSatish Balay                        elif isinstance(boundary, int):
5195808f684SSatish Balay                            boundary = (boundary,) * dim
5205808f684SSatish Balay                        if stencil is None:
5215808f684SSatish Balay                            stencil = da.stencil[0]
5225808f684SSatish Balay                        if width is None:
5235808f684SSatish Balay                            width = da.stencil_width
5245808f684SSatish Balay                        self.assertEqual(newda.dof, dof)
5256f336411SStefano Zampini                        self.assertEqual(newda.boundary_type, boundary)
5265808f684SSatish Balay                        if dim == 1:
5276f336411SStefano Zampini                            self.assertEqual(newda.stencil, (stencil, width))
5285808f684SSatish Balay                        newda.destroy()
5295808f684SSatish Balay                        da.destroy()
5306f336411SStefano Zampini
5316f336411SStefano Zampini                    setattr(
5326f336411SStefano Zampini                        TestDADuplicate, 'testDuplicate%04d' % counter, testDuplicate
5336f336411SStefano Zampini                    )
5345808f684SSatish Balay                    del testDuplicate, kargs
5355808f684SSatish Balay                    counter += 1
5365808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
5375808f684SSatish Balay
5385808f684SSatish Balay# --------------------------------------------------------------------
5395808f684SSatish Balay
5405808f684SSatish Balayif PETSc.COMM_WORLD.getSize() > 1:
5415808f684SSatish Balay    del TestDA_1D_W0
5425808f684SSatish Balay    del TestDA_2D_W0, TestDA_2D_W0_N2
5435808f684SSatish Balay    del TestDA_3D_W0, TestDA_3D_W0_N2
5445808f684SSatish Balay
5455808f684SSatish Balay# --------------------------------------------------------------------
5465808f684SSatish Balay
5475808f684SSatish Balayif __name__ == '__main__':
5485808f684SSatish Balay    unittest.main()
5495808f684SSatish Balay
5505808f684SSatish Balay# --------------------------------------------------------------------
551