xref: /petsc/src/binding/petsc4py/test/test_dmda.py (revision 53816756e427c124080c8f5cc7a265eb836b0b02)
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