xref: /petsc/src/binding/petsc4py/test/test_dmda.py (revision 6f33641175f69f1db294cc9ba81c3f4ad4f81d49)
15808f684SSatish Balayfrom petsc4py import PETSc
25808f684SSatish Balayimport unittest
35808f684SSatish Balay
45808f684SSatish Balay# --------------------------------------------------------------------
55808f684SSatish Balay
65808f684SSatish Balay
7*6f336411SStefano 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):
16*6f336411SStefano Zampini        self.da = PETSc.DMDA().create(
17*6f336411SStefano 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,
23*6f336411SStefano Zampini            comm=self.COMM,
24*6f336411SStefano 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()):
77*6f336411SStefano Zampini            self.da.setFieldName(i, 'field%d' % i)
785808f684SSatish Balay        for i in range(self.da.getDof()):
795808f684SSatish Balay            name = self.da.getFieldName(i)
80*6f336411SStefano 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):
122*6f336411SStefano Zampini            if b != NONE and p == 1:
123*6f336411SStefano 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):
142*6f336411SStefano Zampini                if b != NONE and p == 1:
143*6f336411SStefano 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)
1505808f684SSatish Balay
1515808f684SSatish Balay    def testGetOther(self):
152*6f336411SStefano Zampini        _ = self.da.getAO()
153*6f336411SStefano Zampini        _ = self.da.getLGMap()
154*6f336411SStefano Zampini        _, _ = 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):
171*6f336411SStefano Zampini        if PETSc.COMM_WORLD.getSize() > 6:
172*6f336411SStefano Zampini            return
1735808f684SSatish Balay        da = self.da
1745808f684SSatish Balay        cda = self.da.coarsen()
1755808f684SSatish Balay        self.assertEqual(da.getDim(), cda.getDim())
1765808f684SSatish Balay        self.assertEqual(da.getDof(), cda.getDof())
1775808f684SSatish Balay        if da.dim != 1:
1785808f684SSatish Balay            self.assertEqual(da.getStencilType(), cda.getStencilType())
1795808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), cda.getStencilWidth())
1805808f684SSatish Balay        rda = cda.refine()
1815808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), rda.getSizes()):
1825808f684SSatish Balay            self.assertTrue(abs(n1 - n2) <= 1)
1835808f684SSatish Balay
1845808f684SSatish Balay    def testRefineHierarchy(self):
1855808f684SSatish Balay        levels = self.da.refineHierarchy(2)
1865808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
1875808f684SSatish Balay        self.assertEqual(len(levels), 2)
1885808f684SSatish Balay        for item in levels:
1895808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
1905808f684SSatish Balay
1915808f684SSatish Balay    def testCoarsenHierarchy(self):
192*6f336411SStefano Zampini        if PETSc.COMM_WORLD.getSize() > 6:
193*6f336411SStefano Zampini            return
1945808f684SSatish Balay        levels = self.da.coarsenHierarchy(2)
1955808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
1965808f684SSatish Balay        self.assertEqual(len(levels), 2)
1975808f684SSatish Balay        for item in levels:
1985808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
1995808f684SSatish Balay
2005808f684SSatish Balay    def testCreateInterpolation(self):
2015808f684SSatish Balay        da = self.da
202*6f336411SStefano Zampini        if da.dim == 1:
203*6f336411SStefano Zampini            return
2045808f684SSatish Balay        rda = da.refine()
205*6f336411SStefano Zampini        _, _ = da.createInterpolation(rda)
2065808f684SSatish Balay
2075808f684SSatish Balay    def testCreateInjection(self):
208*6f336411SStefano Zampini        if PETSc.COMM_WORLD.getSize() > 6:
209*6f336411SStefano Zampini            return
2105808f684SSatish Balay        da = self.da
211*6f336411SStefano Zampini        if da.dim == 1:
212*6f336411SStefano Zampini            return
2135808f684SSatish Balay        rda = da.refine()
214*6f336411SStefano Zampini        _ = da.createInjection(rda)
2155808f684SSatish Balay
2168c2316a8SJeremy Tillay    def testzeroRowsColumnsStencil(self):
2178c2316a8SJeremy Tillay        da = self.da
2188c2316a8SJeremy Tillay        A = da.createMatrix()
2198c2316a8SJeremy Tillay        x = da.createGlobalVector()
2208c2316a8SJeremy Tillay        x.set(2.0)
2218c2316a8SJeremy Tillay        A.setDiagonal(x)
2228c2316a8SJeremy Tillay        diag1 = x.duplicate()
2238c2316a8SJeremy Tillay        A.getDiagonal(diag1)
2248c2316a8SJeremy Tillay        if self.SIZES != 2:  # only coded test for 2D case
2258c2316a8SJeremy Tillay            return
2268c2316a8SJeremy Tillay        istart, iend, jstart, jend = da.getRanges()
2278c2316a8SJeremy Tillay        self.assertTrue(x.equal(diag1))
2288c2316a8SJeremy Tillay        zeroidx = []
2298c2316a8SJeremy Tillay        for i in range(istart, iend):
2308c2316a8SJeremy Tillay            for j in range(jstart, jend):
2318c2316a8SJeremy Tillay                row = PETSc.Mat.Stencil()
2328c2316a8SJeremy Tillay                row.index = (i, j)
2338c2316a8SJeremy Tillay                zeroidx = zeroidx + [row]
2348c2316a8SJeremy Tillay        diag2 = x.duplicate()
2358c2316a8SJeremy Tillay        diag2.set(1.0)
2368c2316a8SJeremy Tillay        A.zeroRowsColumnsStencil(zeroidx, 1.0, x, diag2)
2378c2316a8SJeremy Tillay        ans = x.duplicate()
2388c2316a8SJeremy Tillay        ans.set(2.0)
2398c2316a8SJeremy Tillay        self.assertTrue(ans.equal(diag2))
2408c2316a8SJeremy Tillay
2415808f684SSatish Balay
2425808f684SSatish BalayMIRROR = PETSc.DMDA.BoundaryType.MIRROR
2435808f684SSatish BalayGHOSTED = PETSc.DMDA.BoundaryType.GHOSTED
2445808f684SSatish BalayPERIODIC = PETSc.DMDA.BoundaryType.PERIODIC
2455808f684SSatish BalayTWIST = PETSc.DMDA.BoundaryType.TWIST
2465808f684SSatish Balay
2475808f684SSatish BalaySCALE = 4
2485808f684SSatish Balay
249*6f336411SStefano Zampini
2505808f684SSatish Balayclass BaseTestDA_1D(BaseTestDA):
2515808f684SSatish Balay    SIZES = [100 * SCALE]
2525808f684SSatish Balay
253*6f336411SStefano Zampini
2545808f684SSatish Balayclass BaseTestDA_2D(BaseTestDA):
2555808f684SSatish Balay    SIZES = [9 * SCALE, 11 * SCALE]
2565808f684SSatish Balay
257*6f336411SStefano Zampini
2585808f684SSatish Balayclass BaseTestDA_3D(BaseTestDA):
2595808f684SSatish Balay    SIZES = [6 * SCALE, 7 * SCALE, 8 * SCALE]
2605808f684SSatish Balay
261*6f336411SStefano Zampini
2625808f684SSatish Balay# --------------------------------------------------------------------
2635808f684SSatish Balay
264*6f336411SStefano Zampini
2655808f684SSatish Balayclass TestDA_1D(BaseTestDA_1D, unittest.TestCase):
2665808f684SSatish Balay    pass
267*6f336411SStefano Zampini
268*6f336411SStefano Zampini
2695808f684SSatish Balayclass TestDA_1D_W0(TestDA_1D):
2705808f684SSatish Balay    SWIDTH = 0
271*6f336411SStefano Zampini
272*6f336411SStefano Zampini
2735808f684SSatish Balayclass TestDA_1D_W2(TestDA_1D):
2745808f684SSatish Balay    SWIDTH = 2
2755808f684SSatish Balay
276*6f336411SStefano Zampini
2775808f684SSatish Balayclass TestDA_2D(BaseTestDA_2D, unittest.TestCase):
2785808f684SSatish Balay    pass
279*6f336411SStefano Zampini
280*6f336411SStefano Zampini
2815808f684SSatish Balayclass TestDA_2D_W0(TestDA_2D):
2825808f684SSatish Balay    SWIDTH = 0
283*6f336411SStefano Zampini
284*6f336411SStefano Zampini
2855808f684SSatish Balayclass TestDA_2D_W0_N2(TestDA_2D):
2865808f684SSatish Balay    DOF = 2
2875808f684SSatish Balay    SWIDTH = 0
288*6f336411SStefano Zampini
289*6f336411SStefano Zampini
2905808f684SSatish Balayclass TestDA_2D_W2(TestDA_2D):
2915808f684SSatish Balay    SWIDTH = 2
292*6f336411SStefano Zampini
293*6f336411SStefano Zampini
2945808f684SSatish Balayclass TestDA_2D_W2_N2(TestDA_2D):
2955808f684SSatish Balay    DOF = 2
2965808f684SSatish Balay    SWIDTH = 2
297*6f336411SStefano Zampini
298*6f336411SStefano Zampini
2995808f684SSatish Balayclass TestDA_2D_PXY(TestDA_2D):
3005808f684SSatish Balay    SIZES = [13 * SCALE, 17 * SCALE]
3015808f684SSatish Balay    DOF = 2
3025808f684SSatish Balay    SWIDTH = 5
3035808f684SSatish Balay    BOUNDARY = (PERIODIC,) * 2
304*6f336411SStefano Zampini
305*6f336411SStefano Zampini
3065808f684SSatish Balayclass TestDA_2D_GXY(TestDA_2D):
3075808f684SSatish Balay    SIZES = [13 * SCALE, 17 * SCALE]
3085808f684SSatish Balay    DOF = 2
3095808f684SSatish Balay    SWIDTH = 5
3105808f684SSatish Balay    BOUNDARY = (GHOSTED,) * 2
311*6f336411SStefano Zampini
312*6f336411SStefano Zampini
3135808f684SSatish Balayclass TestDA_2D_TXY(TestDA_2D):
3145808f684SSatish Balay    SIZES = [13 * SCALE, 17 * SCALE]
3155808f684SSatish Balay    DOF = 2
3165808f684SSatish Balay    SWIDTH = 5
3175808f684SSatish Balay    BOUNDARY = (TWIST,) * 2
3185808f684SSatish Balay
319*6f336411SStefano Zampini
3205808f684SSatish Balayclass TestDA_3D(BaseTestDA_3D, unittest.TestCase):
3215808f684SSatish Balay    pass
322*6f336411SStefano Zampini
323*6f336411SStefano Zampini
3245808f684SSatish Balayclass TestDA_3D_W0(TestDA_3D):
3255808f684SSatish Balay    SWIDTH = 0
326*6f336411SStefano Zampini
327*6f336411SStefano Zampini
3285808f684SSatish Balayclass TestDA_3D_W0_N2(TestDA_3D):
3295808f684SSatish Balay    DOF = 2
3305808f684SSatish Balay    SWIDTH = 0
331*6f336411SStefano Zampini
332*6f336411SStefano Zampini
3335808f684SSatish Balayclass TestDA_3D_W2(TestDA_3D):
3345808f684SSatish Balay    SWIDTH = 2
335*6f336411SStefano Zampini
336*6f336411SStefano Zampini
3375808f684SSatish Balayclass TestDA_3D_W2_N2(TestDA_3D):
3385808f684SSatish Balay    DOF = 2
3395808f684SSatish Balay    SWIDTH = 2
340*6f336411SStefano Zampini
341*6f336411SStefano Zampini
3425808f684SSatish Balayclass TestDA_3D_PXYZ(TestDA_3D):
3435808f684SSatish Balay    SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE]
3445808f684SSatish Balay    DOF = 2
3455808f684SSatish Balay    SWIDTH = 3
3465808f684SSatish Balay    BOUNDARY = (PERIODIC,) * 3
347*6f336411SStefano Zampini
348*6f336411SStefano Zampini
3495808f684SSatish Balayclass TestDA_3D_GXYZ(TestDA_3D):
3505808f684SSatish Balay    SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE]
3515808f684SSatish Balay    DOF = 2
3525808f684SSatish Balay    SWIDTH = 3
3535808f684SSatish Balay    BOUNDARY = (GHOSTED,) * 3
354*6f336411SStefano Zampini
355*6f336411SStefano Zampini
3565808f684SSatish Balayclass TestDA_3D_TXYZ(TestDA_3D):
3575808f684SSatish Balay    SIZES = [11 * SCALE, 13 * SCALE, 17 * SCALE]
3585808f684SSatish Balay    DOF = 2
3595808f684SSatish Balay    SWIDTH = 3
3605808f684SSatish Balay    BOUNDARY = (TWIST,) * 3
3615808f684SSatish Balay
362*6f336411SStefano Zampini
3635808f684SSatish Balay# --------------------------------------------------------------------
3645808f684SSatish Balay
365*6f336411SStefano ZampiniDIM = (
366*6f336411SStefano Zampini    1,
367*6f336411SStefano Zampini    2,
368*6f336411SStefano Zampini    3,
369*6f336411SStefano Zampini)
370*6f336411SStefano ZampiniDOF = (
371*6f336411SStefano Zampini    None,
372*6f336411SStefano Zampini    1,
373*6f336411SStefano Zampini    2,
374*6f336411SStefano Zampini    3,
375*6f336411SStefano Zampini    4,
376*6f336411SStefano Zampini    5,
377*6f336411SStefano Zampini)
3785808f684SSatish BalayBOUNDARY_TYPE = (
3795808f684SSatish Balay    None,
380*6f336411SStefano Zampini    'none',
381*6f336411SStefano Zampini    (0,) * 3,
382*6f336411SStefano Zampini    0,
383*6f336411SStefano Zampini    'ghosted',
384*6f336411SStefano Zampini    (GHOSTED,) * 3,
385*6f336411SStefano Zampini    GHOSTED,
386*6f336411SStefano Zampini    'periodic',
387*6f336411SStefano Zampini    (PERIODIC,) * 3,
388*6f336411SStefano Zampini    PERIODIC,
389*6f336411SStefano Zampini    'twist',
390*6f336411SStefano Zampini    (TWIST,) * 3,
391*6f336411SStefano Zampini    TWIST,
3925808f684SSatish Balay)
393*6f336411SStefano ZampiniSTENCIL_TYPE = (None, 'star', 'box')
3945808f684SSatish BalaySTENCIL_WIDTH = (None, 0, 1, 2, 3)
3955808f684SSatish Balay
3965808f684SSatish Balay
3975808f684SSatish BalayDIM = (1, 2, 3)
3985808f684SSatish BalayDOF = (None, 2, 5)
399*6f336411SStefano ZampiniBOUNDARY_TYPE = (None, 'none', 'periodic', 'ghosted', 'twist')
400*6f336411SStefano ZampiniSTENCIL_TYPE = (None, 'box')
4015808f684SSatish BalaySTENCIL_WIDTH = (None, 1, 2)
4025808f684SSatish Balay
403*6f336411SStefano Zampini
4045808f684SSatish Balayclass TestDACreate(unittest.TestCase):
4055808f684SSatish Balay    pass
406*6f336411SStefano Zampini
407*6f336411SStefano Zampini
4085808f684SSatish Balaycounter = 0
4095808f684SSatish Balayfor dim in DIM:
4105808f684SSatish Balay    for dof in DOF:
4115808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
4125808f684SSatish Balay            if isinstance(boundary, tuple):
4135808f684SSatish Balay                boundary = boundary[:dim]
4145808f684SSatish Balay            for stencil in STENCIL_TYPE:
4155808f684SSatish Balay                for width in STENCIL_WIDTH:
416*6f336411SStefano Zampini                    kargs = {
417*6f336411SStefano Zampini                        'sizes': [8 * SCALE] * dim,
418*6f336411SStefano Zampini                        'dim': dim,
419*6f336411SStefano Zampini                        'dof': dof,
420*6f336411SStefano Zampini                        'boundary_type': boundary,
421*6f336411SStefano Zampini                        'stencil_type': stencil,
422*6f336411SStefano Zampini                        'stencil_width': width,
423*6f336411SStefano Zampini                    }
424*6f336411SStefano Zampini
4255808f684SSatish Balay                    def testCreate(self, kargs=kargs):
4265808f684SSatish Balay                        kargs = dict(kargs)
4275808f684SSatish Balay                        da = PETSc.DMDA().create(**kargs)
4285808f684SSatish Balay                        da.destroy()
429*6f336411SStefano Zampini
430*6f336411SStefano Zampini                    setattr(TestDACreate, 'testCreate%04d' % counter, testCreate)
4315808f684SSatish Balay                    del testCreate, kargs
4325808f684SSatish Balay                    counter += 1
4335808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
4345808f684SSatish Balay
435*6f336411SStefano Zampini
4365808f684SSatish Balayclass TestDADuplicate(unittest.TestCase):
4375808f684SSatish Balay    pass
438*6f336411SStefano Zampini
439*6f336411SStefano Zampini
4405808f684SSatish Balaycounter = 0
4415808f684SSatish Balayfor dim in DIM:
4425808f684SSatish Balay    for dof in DOF:
4435808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
4445808f684SSatish Balay            if isinstance(boundary, tuple):
4455808f684SSatish Balay                boundary = boundary[:dim]
4465808f684SSatish Balay            for stencil in STENCIL_TYPE:
4475808f684SSatish Balay                for width in STENCIL_WIDTH:
448*6f336411SStefano Zampini                    kargs = {
449*6f336411SStefano Zampini                        'dim': dim,
450*6f336411SStefano Zampini                        'dof': dof,
451*6f336411SStefano Zampini                        'boundary_type': boundary,
452*6f336411SStefano Zampini                        'stencil_type': stencil,
453*6f336411SStefano Zampini                        'stencil_width': width,
454*6f336411SStefano Zampini                    }
455*6f336411SStefano Zampini
4565808f684SSatish Balay                    def testDuplicate(self, kargs=kargs):
4575808f684SSatish Balay                        kargs = dict(kargs)
4585808f684SSatish Balay                        dim = kargs.pop('dim')
4595808f684SSatish Balay                        dof = kargs['dof']
4605808f684SSatish Balay                        boundary = kargs['boundary_type']
4615808f684SSatish Balay                        stencil = kargs['stencil_type']
4625808f684SSatish Balay                        width = kargs['stencil_width']
4635808f684SSatish Balay                        da = PETSc.DMDA().create([8 * SCALE] * dim)
4645808f684SSatish Balay                        newda = da.duplicate(**kargs)
4655808f684SSatish Balay                        self.assertEqual(newda.dim, da.dim)
4665808f684SSatish Balay                        self.assertEqual(newda.sizes, da.sizes)
467*6f336411SStefano Zampini                        self.assertEqual(newda.proc_sizes, da.proc_sizes)
4685808f684SSatish Balay                        self.assertEqual(newda.ranges, da.ranges)
4695808f684SSatish Balay                        self.assertEqual(newda.corners, da.corners)
470*6f336411SStefano Zampini                        if (
471*6f336411SStefano Zampini                            newda.boundary_type == da.boundary_type
472*6f336411SStefano Zampini                            and newda.stencil_width == da.stencil_width
473*6f336411SStefano Zampini                        ):
474*6f336411SStefano Zampini                            self.assertEqual(newda.ghost_ranges, da.ghost_ranges)
475*6f336411SStefano Zampini                            self.assertEqual(newda.ghost_corners, da.ghost_corners)
4765808f684SSatish Balay                        if dof is None:
4775808f684SSatish Balay                            dof = da.dof
4785808f684SSatish Balay                        if boundary is None:
4795808f684SSatish Balay                            boundary = da.boundary_type
480*6f336411SStefano Zampini                        elif boundary == 'none':
4815808f684SSatish Balay                            boundary = (0,) * dim
482*6f336411SStefano Zampini                        elif boundary == 'mirror':
4835808f684SSatish Balay                            boundary = (MIRROR,) * dim
484*6f336411SStefano Zampini                        elif boundary == 'ghosted':
4855808f684SSatish Balay                            boundary = (GHOSTED,) * dim
486*6f336411SStefano Zampini                        elif boundary == 'periodic':
4875808f684SSatish Balay                            boundary = (PERIODIC,) * dim
488*6f336411SStefano Zampini                        elif boundary == 'twist':
4895808f684SSatish Balay                            boundary = (TWIST,) * dim
4905808f684SSatish Balay                        elif isinstance(boundary, int):
4915808f684SSatish Balay                            boundary = (boundary,) * dim
4925808f684SSatish Balay                        if stencil is None:
4935808f684SSatish Balay                            stencil = da.stencil[0]
4945808f684SSatish Balay                        if width is None:
4955808f684SSatish Balay                            width = da.stencil_width
4965808f684SSatish Balay                        self.assertEqual(newda.dof, dof)
497*6f336411SStefano Zampini                        self.assertEqual(newda.boundary_type, boundary)
4985808f684SSatish Balay                        if dim == 1:
499*6f336411SStefano Zampini                            self.assertEqual(newda.stencil, (stencil, width))
5005808f684SSatish Balay                        newda.destroy()
5015808f684SSatish Balay                        da.destroy()
502*6f336411SStefano Zampini
503*6f336411SStefano Zampini                    setattr(
504*6f336411SStefano Zampini                        TestDADuplicate, 'testDuplicate%04d' % counter, testDuplicate
505*6f336411SStefano Zampini                    )
5065808f684SSatish Balay                    del testDuplicate, kargs
5075808f684SSatish Balay                    counter += 1
5085808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
5095808f684SSatish Balay
5105808f684SSatish Balay# --------------------------------------------------------------------
5115808f684SSatish Balay
5125808f684SSatish Balayif PETSc.COMM_WORLD.getSize() > 1:
5135808f684SSatish Balay    del TestDA_1D_W0
5145808f684SSatish Balay    del TestDA_2D_W0, TestDA_2D_W0_N2
5155808f684SSatish Balay    del TestDA_3D_W0, TestDA_3D_W0_N2
5165808f684SSatish Balay
5175808f684SSatish Balay# --------------------------------------------------------------------
5185808f684SSatish Balay
5195808f684SSatish Balayif __name__ == '__main__':
5205808f684SSatish Balay    unittest.main()
5215808f684SSatish Balay
5225808f684SSatish Balay# --------------------------------------------------------------------
523