xref: /petsc/src/binding/petsc4py/test/test_dmda.py (revision 5808f68492579297331054bd8ff190489c3b8c20)
1*5808f684SSatish Balayfrom petsc4py import PETSc
2*5808f684SSatish Balayimport unittest
3*5808f684SSatish Balay
4*5808f684SSatish Balay# --------------------------------------------------------------------
5*5808f684SSatish Balay
6*5808f684SSatish Balayclass BaseTestDA(object):
7*5808f684SSatish Balay
8*5808f684SSatish Balay    COMM = PETSc.COMM_WORLD
9*5808f684SSatish Balay    SIZES = None
10*5808f684SSatish Balay    BOUNDARY = None
11*5808f684SSatish Balay    DOF = 1
12*5808f684SSatish Balay    STENCIL = PETSc.DMDA.StencilType.STAR
13*5808f684SSatish Balay    SWIDTH = 1
14*5808f684SSatish Balay
15*5808f684SSatish Balay    def setUp(self):
16*5808f684SSatish Balay        self.da = PETSc.DMDA().create(dim=len(self.SIZES),
17*5808f684SSatish Balay                                      dof=self.DOF,
18*5808f684SSatish Balay                                      sizes=self.SIZES,
19*5808f684SSatish Balay                                      boundary_type=self.BOUNDARY,
20*5808f684SSatish Balay                                      stencil_type=self.STENCIL,
21*5808f684SSatish Balay                                      stencil_width=self.SWIDTH,
22*5808f684SSatish Balay                                      comm=self.COMM)
23*5808f684SSatish Balay
24*5808f684SSatish Balay    def tearDown(self):
25*5808f684SSatish Balay        self.da = None
26*5808f684SSatish Balay
27*5808f684SSatish Balay    def testGetInfo(self):
28*5808f684SSatish Balay        dim = self.da.getDim()
29*5808f684SSatish Balay        dof = self.da.getDof()
30*5808f684SSatish Balay        sizes = self.da.getSizes()
31*5808f684SSatish Balay        psizes = self.da.getProcSizes()
32*5808f684SSatish Balay        boundary = self.da.getBoundaryType()
33*5808f684SSatish Balay        stencil_type = self.da.getStencilType()
34*5808f684SSatish Balay        stencil_width = self.da.getStencilWidth()
35*5808f684SSatish Balay        self.assertEqual(dim, len(self.SIZES))
36*5808f684SSatish Balay        self.assertEqual(dof, self.DOF)
37*5808f684SSatish Balay        self.assertEqual(sizes, tuple(self.SIZES))
38*5808f684SSatish Balay        self.assertEqual(boundary, self.BOUNDARY or (0,)*dim)
39*5808f684SSatish Balay        self.assertEqual(stencil_type, self.STENCIL)
40*5808f684SSatish Balay        self.assertEqual(stencil_width, self.SWIDTH)
41*5808f684SSatish Balay
42*5808f684SSatish Balay    def testRangesCorners(self):
43*5808f684SSatish Balay        dim = self.da.getDim()
44*5808f684SSatish Balay        ranges = self.da.getRanges()
45*5808f684SSatish Balay        starts, lsizes  = self.da.getCorners()
46*5808f684SSatish Balay        self.assertEqual(dim, len(ranges))
47*5808f684SSatish Balay        self.assertEqual(dim, len(starts))
48*5808f684SSatish Balay        self.assertEqual(dim, len(lsizes))
49*5808f684SSatish Balay        for i in range(dim):
50*5808f684SSatish Balay            s, e = ranges[i]
51*5808f684SSatish Balay            self.assertEqual(s, starts[i])
52*5808f684SSatish Balay            self.assertEqual(e-s, lsizes[i])
53*5808f684SSatish Balay
54*5808f684SSatish Balay    def testGhostRangesCorners(self):
55*5808f684SSatish Balay        dim = self.da.getDim()
56*5808f684SSatish Balay        ranges = self.da.getGhostRanges()
57*5808f684SSatish Balay        starts, lsizes  = self.da.getGhostCorners()
58*5808f684SSatish Balay        self.assertEqual(dim, len(ranges))
59*5808f684SSatish Balay        self.assertEqual(dim, len(starts))
60*5808f684SSatish Balay        self.assertEqual(dim, len(lsizes))
61*5808f684SSatish Balay        for i in range(dim):
62*5808f684SSatish Balay            s, e = ranges[i]
63*5808f684SSatish Balay            self.assertEqual(s, starts[i])
64*5808f684SSatish Balay            self.assertEqual(e-s, lsizes[i])
65*5808f684SSatish Balay
66*5808f684SSatish Balay    def testOwnershipRanges(self):
67*5808f684SSatish Balay        dim = self.da.getDim()
68*5808f684SSatish Balay        ownership_ranges = self.da.getOwnershipRanges()
69*5808f684SSatish Balay        procsizes = self.da.getProcSizes()
70*5808f684SSatish Balay        self.assertEqual(len(procsizes), len(ownership_ranges))
71*5808f684SSatish Balay        for i,m in enumerate(procsizes):
72*5808f684SSatish Balay            self.assertEqual(m, len(ownership_ranges[i]))
73*5808f684SSatish Balay
74*5808f684SSatish Balay    def testFieldName(self):
75*5808f684SSatish Balay        for i in range(self.da.getDof()):
76*5808f684SSatish Balay            self.da.setFieldName(i, "field%d" % i)
77*5808f684SSatish Balay        for i in range(self.da.getDof()):
78*5808f684SSatish Balay            name = self.da.getFieldName(i)
79*5808f684SSatish Balay            self.assertEqual(name, "field%d" % i)
80*5808f684SSatish Balay
81*5808f684SSatish Balay    def testCoordinates(self):
82*5808f684SSatish Balay        self.da.setUniformCoordinates(0,1,0,1,0,1)
83*5808f684SSatish Balay        #
84*5808f684SSatish Balay        c = self.da.getCoordinates()
85*5808f684SSatish Balay        self.da.setCoordinates(c)
86*5808f684SSatish Balay        c.destroy()
87*5808f684SSatish Balay        cda = self.da.getCoordinateDM()
88*5808f684SSatish Balay        cda.destroy()
89*5808f684SSatish Balay        #
90*5808f684SSatish Balay        c = self.da.getCoordinates()
91*5808f684SSatish Balay        self.da.setCoordinates(c)
92*5808f684SSatish Balay        c.destroy()
93*5808f684SSatish Balay        gc = self.da.getCoordinatesLocal()
94*5808f684SSatish Balay        gc.destroy()
95*5808f684SSatish Balay
96*5808f684SSatish Balay    def testCreateVecMat(self):
97*5808f684SSatish Balay        vn = self.da.createNaturalVec()
98*5808f684SSatish Balay        vg = self.da.createGlobalVec()
99*5808f684SSatish Balay        vl = self.da.createLocalVec()
100*5808f684SSatish Balay        mat = self.da.createMat()
101*5808f684SSatish Balay        self.assertTrue(mat.getType() in ('aij', 'seqaij', 'mpiaij'))
102*5808f684SSatish Balay        vn.set(1.0)
103*5808f684SSatish Balay        self.da.naturalToGlobal(vn,vg)
104*5808f684SSatish Balay        self.assertEqual(vg.max()[1], 1.0)
105*5808f684SSatish Balay        self.assertEqual(vg.min()[1], 1.0)
106*5808f684SSatish Balay        self.da.globalToLocal(vg,vl)
107*5808f684SSatish Balay        self.assertEqual(vl.max()[1], 1.0)
108*5808f684SSatish Balay        self.assertTrue (vl.min()[1] in (1.0, 0.0))
109*5808f684SSatish Balay        vn.set(0.0)
110*5808f684SSatish Balay        self.da.globalToNatural(vg,vn)
111*5808f684SSatish Balay        self.assertEqual(vn.max()[1], 1.0)
112*5808f684SSatish Balay        self.assertEqual(vn.min()[1], 1.0)
113*5808f684SSatish Balay        vl2 = self.da.createLocalVec()
114*5808f684SSatish Balay        self.da.localToLocal(vl,vl2)
115*5808f684SSatish Balay        self.assertEqual(vl2.max()[1], 1.0)
116*5808f684SSatish Balay        self.assertTrue (vl2.min()[1] in (1.0, 0.0))
117*5808f684SSatish Balay        NONE = PETSc.DM.BoundaryType.NONE
118*5808f684SSatish Balay        s = self.da.stencil_width
119*5808f684SSatish Balay        btype = self.da.boundary_type
120*5808f684SSatish Balay        psize = self.da.proc_sizes
121*5808f684SSatish Balay        for b, p in zip(btype, psize):
122*5808f684SSatish Balay            if b != NONE and p == 1: return
123*5808f684SSatish Balay        vg2 = self.da.createGlobalVec()
124*5808f684SSatish Balay        self.da.localToGlobal(vl2,vg2)
125*5808f684SSatish Balay
126*5808f684SSatish Balay    def testGetVec(self):
127*5808f684SSatish Balay        vg = self.da.getGlobalVec()
128*5808f684SSatish Balay        vl = self.da.getLocalVec()
129*5808f684SSatish Balay        try:
130*5808f684SSatish Balay            vg.set(1.0)
131*5808f684SSatish Balay            self.assertEqual(vg.max()[1], 1.0)
132*5808f684SSatish Balay            self.assertEqual(vg.min()[1], 1.0)
133*5808f684SSatish Balay            self.da.globalToLocal(vg,vl)
134*5808f684SSatish Balay            self.assertEqual(vl.max()[1], 1.0)
135*5808f684SSatish Balay            self.assertTrue (vl.min()[1] in (1.0, 0.0))
136*5808f684SSatish Balay            vl.set(2.0)
137*5808f684SSatish Balay            NONE = PETSc.DM.BoundaryType.NONE
138*5808f684SSatish Balay            s = self.da.stencil_width
139*5808f684SSatish Balay            btype = self.da.boundary_type
140*5808f684SSatish Balay            psize = self.da.proc_sizes
141*5808f684SSatish Balay            for b, p in zip(btype, psize):
142*5808f684SSatish Balay                if b != NONE and p == 1: return
143*5808f684SSatish Balay            self.da.localToGlobal(vl,vg)
144*5808f684SSatish Balay            self.assertEqual(vg.max()[1], 2.0)
145*5808f684SSatish Balay            self.assertTrue (vg.min()[1] in (2.0, 0.0))
146*5808f684SSatish Balay        finally:
147*5808f684SSatish Balay            self.da.restoreGlobalVec(vg)
148*5808f684SSatish Balay            self.da.restoreLocalVec(vl)
149*5808f684SSatish Balay
150*5808f684SSatish Balay    def testGetOther(self):
151*5808f684SSatish Balay        ao = self.da.getAO()
152*5808f684SSatish Balay        lgmap = self.da.getLGMap()
153*5808f684SSatish Balay        l2g, g2l = self.da.getScatter()
154*5808f684SSatish Balay
155*5808f684SSatish Balay    def testRefineCoarsen(self):
156*5808f684SSatish Balay        da = self.da
157*5808f684SSatish Balay        rda = da.refine()
158*5808f684SSatish Balay        self.assertEqual(da.getDim(), rda.getDim())
159*5808f684SSatish Balay        self.assertEqual(da.getDof(), rda.getDof())
160*5808f684SSatish Balay        if da.dim != 1:
161*5808f684SSatish Balay            self.assertEqual(da.getStencilType(),  rda.getStencilType())
162*5808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), rda.getStencilWidth())
163*5808f684SSatish Balay        cda = rda.coarsen()
164*5808f684SSatish Balay        self.assertEqual(rda.getDim(), cda.getDim())
165*5808f684SSatish Balay        self.assertEqual(rda.getDof(), cda.getDof())
166*5808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), cda.getSizes()):
167*5808f684SSatish Balay            self.assertTrue(abs(n1-n2)<=1)
168*5808f684SSatish Balay
169*5808f684SSatish Balay    def testCoarsenRefine(self):
170*5808f684SSatish Balay        da = self.da
171*5808f684SSatish Balay        cda = self.da.coarsen()
172*5808f684SSatish Balay        self.assertEqual(da.getDim(), cda.getDim())
173*5808f684SSatish Balay        self.assertEqual(da.getDof(), cda.getDof())
174*5808f684SSatish Balay        if da.dim != 1:
175*5808f684SSatish Balay            self.assertEqual(da.getStencilType(),  cda.getStencilType())
176*5808f684SSatish Balay        self.assertEqual(da.getStencilWidth(), cda.getStencilWidth())
177*5808f684SSatish Balay        rda = cda.refine()
178*5808f684SSatish Balay        for n1, n2 in zip(self.da.getSizes(), rda.getSizes()):
179*5808f684SSatish Balay            self.assertTrue(abs(n1-n2)<=1)
180*5808f684SSatish Balay
181*5808f684SSatish Balay    def testRefineHierarchy(self):
182*5808f684SSatish Balay        levels = self.da.refineHierarchy(2)
183*5808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
184*5808f684SSatish Balay        self.assertEqual(len(levels), 2)
185*5808f684SSatish Balay        for item in levels:
186*5808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
187*5808f684SSatish Balay
188*5808f684SSatish Balay    def testCoarsenHierarchy(self):
189*5808f684SSatish Balay        levels = self.da.coarsenHierarchy(2)
190*5808f684SSatish Balay        self.assertTrue(isinstance(levels, list))
191*5808f684SSatish Balay        self.assertEqual(len(levels), 2)
192*5808f684SSatish Balay        for item in levels:
193*5808f684SSatish Balay            self.assertTrue(isinstance(item, PETSc.DM))
194*5808f684SSatish Balay
195*5808f684SSatish Balay    def testCreateInterpolation(self):
196*5808f684SSatish Balay        da = self.da
197*5808f684SSatish Balay        if da.dim == 1: return
198*5808f684SSatish Balay        rda = da.refine()
199*5808f684SSatish Balay        mat, vec = da.createInterpolation(rda)
200*5808f684SSatish Balay
201*5808f684SSatish Balay    def testCreateInjection(self):
202*5808f684SSatish Balay        da = self.da
203*5808f684SSatish Balay        if da.dim == 1: return
204*5808f684SSatish Balay        rda = da.refine()
205*5808f684SSatish Balay        scatter = da.createInjection(rda)
206*5808f684SSatish Balay
207*5808f684SSatish Balay
208*5808f684SSatish BalayMIRROR   = PETSc.DMDA.BoundaryType.MIRROR
209*5808f684SSatish BalayGHOSTED  = PETSc.DMDA.BoundaryType.GHOSTED
210*5808f684SSatish BalayPERIODIC = PETSc.DMDA.BoundaryType.PERIODIC
211*5808f684SSatish BalayTWIST    = PETSc.DMDA.BoundaryType.TWIST
212*5808f684SSatish Balay
213*5808f684SSatish BalaySCALE = 4
214*5808f684SSatish Balay
215*5808f684SSatish Balayclass BaseTestDA_1D(BaseTestDA):
216*5808f684SSatish Balay    SIZES = [100*SCALE]
217*5808f684SSatish Balay
218*5808f684SSatish Balayclass BaseTestDA_2D(BaseTestDA):
219*5808f684SSatish Balay    SIZES = [9*SCALE,11*SCALE]
220*5808f684SSatish Balay
221*5808f684SSatish Balayclass BaseTestDA_3D(BaseTestDA):
222*5808f684SSatish Balay    SIZES = [6*SCALE,7*SCALE,8*SCALE]
223*5808f684SSatish Balay
224*5808f684SSatish Balay# --------------------------------------------------------------------
225*5808f684SSatish Balay
226*5808f684SSatish Balayclass TestDA_1D(BaseTestDA_1D, unittest.TestCase):
227*5808f684SSatish Balay    pass
228*5808f684SSatish Balayclass TestDA_1D_W0(TestDA_1D):
229*5808f684SSatish Balay    SWIDTH = 0
230*5808f684SSatish Balayclass TestDA_1D_W2(TestDA_1D):
231*5808f684SSatish Balay    SWIDTH = 2
232*5808f684SSatish Balay
233*5808f684SSatish Balayclass TestDA_2D(BaseTestDA_2D, unittest.TestCase):
234*5808f684SSatish Balay    pass
235*5808f684SSatish Balayclass TestDA_2D_W0(TestDA_2D):
236*5808f684SSatish Balay    SWIDTH = 0
237*5808f684SSatish Balayclass TestDA_2D_W0_N2(TestDA_2D):
238*5808f684SSatish Balay    DOF = 2
239*5808f684SSatish Balay    SWIDTH = 0
240*5808f684SSatish Balayclass TestDA_2D_W2(TestDA_2D):
241*5808f684SSatish Balay    SWIDTH = 2
242*5808f684SSatish Balayclass TestDA_2D_W2_N2(TestDA_2D):
243*5808f684SSatish Balay    DOF = 2
244*5808f684SSatish Balay    SWIDTH = 2
245*5808f684SSatish Balayclass TestDA_2D_PXY(TestDA_2D):
246*5808f684SSatish Balay    SIZES = [13*SCALE,17*SCALE]
247*5808f684SSatish Balay    DOF = 2
248*5808f684SSatish Balay    SWIDTH = 5
249*5808f684SSatish Balay    BOUNDARY = (PERIODIC,)*2
250*5808f684SSatish Balayclass TestDA_2D_GXY(TestDA_2D):
251*5808f684SSatish Balay    SIZES = [13*SCALE,17*SCALE]
252*5808f684SSatish Balay    DOF = 2
253*5808f684SSatish Balay    SWIDTH = 5
254*5808f684SSatish Balay    BOUNDARY = (GHOSTED,)*2
255*5808f684SSatish Balayclass TestDA_2D_TXY(TestDA_2D):
256*5808f684SSatish Balay    SIZES = [13*SCALE,17*SCALE]
257*5808f684SSatish Balay    DOF = 2
258*5808f684SSatish Balay    SWIDTH = 5
259*5808f684SSatish Balay    BOUNDARY = (TWIST,)*2
260*5808f684SSatish Balay
261*5808f684SSatish Balayclass TestDA_3D(BaseTestDA_3D, unittest.TestCase):
262*5808f684SSatish Balay    pass
263*5808f684SSatish Balayclass TestDA_3D_W0(TestDA_3D):
264*5808f684SSatish Balay    SWIDTH = 0
265*5808f684SSatish Balayclass TestDA_3D_W0_N2(TestDA_3D):
266*5808f684SSatish Balay    DOF = 2
267*5808f684SSatish Balay    SWIDTH = 0
268*5808f684SSatish Balayclass TestDA_3D_W2(TestDA_3D):
269*5808f684SSatish Balay    SWIDTH = 2
270*5808f684SSatish Balayclass TestDA_3D_W2_N2(TestDA_3D):
271*5808f684SSatish Balay    DOF = 2
272*5808f684SSatish Balay    SWIDTH = 2
273*5808f684SSatish Balayclass TestDA_3D_PXYZ(TestDA_3D):
274*5808f684SSatish Balay    SIZES = [11*SCALE,13*SCALE,17*SCALE]
275*5808f684SSatish Balay    DOF = 2
276*5808f684SSatish Balay    SWIDTH = 3
277*5808f684SSatish Balay    BOUNDARY = (PERIODIC,)*3
278*5808f684SSatish Balayclass TestDA_3D_GXYZ(TestDA_3D):
279*5808f684SSatish Balay    SIZES = [11*SCALE,13*SCALE,17*SCALE]
280*5808f684SSatish Balay    DOF = 2
281*5808f684SSatish Balay    SWIDTH = 3
282*5808f684SSatish Balay    BOUNDARY = (GHOSTED,)*3
283*5808f684SSatish Balayclass TestDA_3D_TXYZ(TestDA_3D):
284*5808f684SSatish Balay    SIZES = [11*SCALE,13*SCALE,17*SCALE]
285*5808f684SSatish Balay    DOF = 2
286*5808f684SSatish Balay    SWIDTH = 3
287*5808f684SSatish Balay    BOUNDARY = (TWIST,)*3
288*5808f684SSatish Balay
289*5808f684SSatish Balay# --------------------------------------------------------------------
290*5808f684SSatish Balay
291*5808f684SSatish BalayDIM = (1,2,3,)
292*5808f684SSatish BalayDOF = (None,1,2,3,4,5,)
293*5808f684SSatish BalayBOUNDARY_TYPE = (
294*5808f684SSatish Balay    None,
295*5808f684SSatish Balay    "none",     (0,)*3,        0,
296*5808f684SSatish Balay    "ghosted",  (GHOSTED,)*3,  GHOSTED,
297*5808f684SSatish Balay    "periodic", (PERIODIC,)*3, PERIODIC,
298*5808f684SSatish Balay    "twist",    (TWIST,)*3,    TWIST,
299*5808f684SSatish Balay    )
300*5808f684SSatish BalaySTENCIL_TYPE  = (None,"star","box")
301*5808f684SSatish BalaySTENCIL_WIDTH = (None,0,1,2,3)
302*5808f684SSatish Balay
303*5808f684SSatish Balay
304*5808f684SSatish BalayDIM           = (1,2,3)
305*5808f684SSatish BalayDOF           = (None,2,5)
306*5808f684SSatish BalayBOUNDARY_TYPE = (None,"none","periodic","ghosted","twist")
307*5808f684SSatish BalaySTENCIL_TYPE  = (None,"box")
308*5808f684SSatish BalaySTENCIL_WIDTH = (None,1,2)
309*5808f684SSatish Balay
310*5808f684SSatish Balayclass TestDACreate(unittest.TestCase):
311*5808f684SSatish Balay    pass
312*5808f684SSatish Balaycounter = 0
313*5808f684SSatish Balayfor dim in DIM:
314*5808f684SSatish Balay    for dof in DOF:
315*5808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
316*5808f684SSatish Balay            if isinstance(boundary, tuple):
317*5808f684SSatish Balay                boundary = boundary[:dim]
318*5808f684SSatish Balay            for stencil in STENCIL_TYPE:
319*5808f684SSatish Balay                for width in STENCIL_WIDTH:
320*5808f684SSatish Balay                    kargs = dict(sizes=[8*SCALE]*dim,
321*5808f684SSatish Balay                                 dim=dim, dof=dof,
322*5808f684SSatish Balay                                 boundary_type=boundary,
323*5808f684SSatish Balay                                 stencil_type=stencil,
324*5808f684SSatish Balay                                 stencil_width=width)
325*5808f684SSatish Balay                    def testCreate(self, kargs=kargs):
326*5808f684SSatish Balay                        kargs = dict(kargs)
327*5808f684SSatish Balay                        da = PETSc.DMDA().create(**kargs)
328*5808f684SSatish Balay                        da.destroy()
329*5808f684SSatish Balay                    setattr(TestDACreate,
330*5808f684SSatish Balay                            "testCreate%04d"%counter,
331*5808f684SSatish Balay                            testCreate)
332*5808f684SSatish Balay                    del testCreate, kargs
333*5808f684SSatish Balay                    counter += 1
334*5808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
335*5808f684SSatish Balay
336*5808f684SSatish Balayclass TestDADuplicate(unittest.TestCase):
337*5808f684SSatish Balay    pass
338*5808f684SSatish Balaycounter = 0
339*5808f684SSatish Balayfor dim in DIM:
340*5808f684SSatish Balay    for dof in DOF:
341*5808f684SSatish Balay        for boundary in BOUNDARY_TYPE:
342*5808f684SSatish Balay            if isinstance(boundary, tuple):
343*5808f684SSatish Balay                boundary = boundary[:dim]
344*5808f684SSatish Balay            for stencil in STENCIL_TYPE:
345*5808f684SSatish Balay                for width in STENCIL_WIDTH:
346*5808f684SSatish Balay                    kargs = dict(dim=dim, dof=dof,
347*5808f684SSatish Balay                                 boundary_type=boundary,
348*5808f684SSatish Balay                                 stencil_type=stencil,
349*5808f684SSatish Balay                                 stencil_width=width)
350*5808f684SSatish Balay                    def testDuplicate(self, kargs=kargs):
351*5808f684SSatish Balay                        kargs = dict(kargs)
352*5808f684SSatish Balay                        dim = kargs.pop('dim')
353*5808f684SSatish Balay                        dof = kargs['dof']
354*5808f684SSatish Balay                        boundary = kargs['boundary_type']
355*5808f684SSatish Balay                        stencil = kargs['stencil_type']
356*5808f684SSatish Balay                        width = kargs['stencil_width']
357*5808f684SSatish Balay                        da = PETSc.DMDA().create([8*SCALE]*dim)
358*5808f684SSatish Balay                        newda = da.duplicate(**kargs)
359*5808f684SSatish Balay                        self.assertEqual(newda.dim, da.dim)
360*5808f684SSatish Balay                        self.assertEqual(newda.sizes, da.sizes)
361*5808f684SSatish Balay                        self.assertEqual(newda.proc_sizes,
362*5808f684SSatish Balay                                         da.proc_sizes)
363*5808f684SSatish Balay                        self.assertEqual(newda.ranges, da.ranges)
364*5808f684SSatish Balay                        self.assertEqual(newda.corners, da.corners)
365*5808f684SSatish Balay                        if (newda.boundary_type == da.boundary_type
366*5808f684SSatish Balay                            and
367*5808f684SSatish Balay                            newda.stencil_width == da.stencil_width):
368*5808f684SSatish Balay                            self.assertEqual(newda.ghost_ranges,
369*5808f684SSatish Balay                                             da.ghost_ranges)
370*5808f684SSatish Balay                            self.assertEqual(newda.ghost_corners,
371*5808f684SSatish Balay                                             da.ghost_corners)
372*5808f684SSatish Balay                        if dof is None:
373*5808f684SSatish Balay                            dof = da.dof
374*5808f684SSatish Balay                        if boundary is None:
375*5808f684SSatish Balay                            boundary = da.boundary_type
376*5808f684SSatish Balay                        elif boundary == "none":
377*5808f684SSatish Balay                            boundary = (0,) * dim
378*5808f684SSatish Balay                        elif boundary == "mirror":
379*5808f684SSatish Balay                            boundary = (MIRROR,) * dim
380*5808f684SSatish Balay                        elif boundary == "ghosted":
381*5808f684SSatish Balay                            boundary = (GHOSTED,) * dim
382*5808f684SSatish Balay                        elif boundary == "periodic":
383*5808f684SSatish Balay                            boundary = (PERIODIC,) * dim
384*5808f684SSatish Balay                        elif boundary == "twist":
385*5808f684SSatish Balay                            boundary = (TWIST,) * dim
386*5808f684SSatish Balay                        elif isinstance(boundary, int):
387*5808f684SSatish Balay                            boundary = (boundary,) * dim
388*5808f684SSatish Balay                        if stencil is None:
389*5808f684SSatish Balay                            stencil = da.stencil[0]
390*5808f684SSatish Balay                        if width is None:
391*5808f684SSatish Balay                            width = da.stencil_width
392*5808f684SSatish Balay                        self.assertEqual(newda.dof, dof)
393*5808f684SSatish Balay                        self.assertEqual(newda.boundary_type,
394*5808f684SSatish Balay                                         boundary)
395*5808f684SSatish Balay                        if dim == 1:
396*5808f684SSatish Balay                            self.assertEqual(newda.stencil,
397*5808f684SSatish Balay                                             (stencil, width))
398*5808f684SSatish Balay                        newda.destroy()
399*5808f684SSatish Balay                        da.destroy()
400*5808f684SSatish Balay                    setattr(TestDADuplicate,
401*5808f684SSatish Balay                            "testDuplicate%04d"%counter,
402*5808f684SSatish Balay                            testDuplicate)
403*5808f684SSatish Balay                    del testDuplicate, kargs
404*5808f684SSatish Balay                    counter += 1
405*5808f684SSatish Balaydel counter, dim, dof, boundary, stencil, width
406*5808f684SSatish Balay
407*5808f684SSatish Balay# --------------------------------------------------------------------
408*5808f684SSatish Balay
409*5808f684SSatish Balayif PETSc.COMM_WORLD.getSize() > 1:
410*5808f684SSatish Balay    del TestDA_1D_W0
411*5808f684SSatish Balay    del TestDA_2D_W0, TestDA_2D_W0_N2
412*5808f684SSatish Balay    del TestDA_3D_W0, TestDA_3D_W0_N2
413*5808f684SSatish Balay
414*5808f684SSatish Balay# --------------------------------------------------------------------
415*5808f684SSatish Balay
416*5808f684SSatish Balayif __name__ == '__main__':
417*5808f684SSatish Balay    unittest.main()
418*5808f684SSatish Balay
419*5808f684SSatish Balay# --------------------------------------------------------------------
420