xref: /petsc/src/binding/petsc4py/test/test_dmplex.py (revision 728cfed72174e2f1e67ab49de1b93303368a4ccc)
1*728cfed7Sksagiyamimport petsc4py
25808f684SSatish Balayfrom petsc4py import PETSc
35808f684SSatish Balayimport unittest
4*728cfed7Sksagiyamimport os
5*728cfed7Sksagiyamimport filecmp
65808f684SSatish Balayimport numpy as np
75808f684SSatish Balay
85808f684SSatish Balay# --------------------------------------------------------------------
95808f684SSatish Balay
105808f684SSatish BalayERR_SUP = 56
115808f684SSatish Balay
125808f684SSatish Balayclass BaseTestPlex(object):
135808f684SSatish Balay
145808f684SSatish Balay    COMM = PETSc.COMM_WORLD
155808f684SSatish Balay    DIM = 1
165808f684SSatish Balay    CELLS = [[0, 1], [1, 2]]
175808f684SSatish Balay    COORDS = [[0.], [0.5], [1.]]
185808f684SSatish Balay    COMP = 1
195808f684SSatish Balay    DOFS = [1, 0]
205808f684SSatish Balay
215808f684SSatish Balay    def setUp(self):
225808f684SSatish Balay        self.plex = PETSc.DMPlex().createFromCellList(self.DIM,
235808f684SSatish Balay                                                      self.CELLS,
245808f684SSatish Balay                                                      self.COORDS,
255808f684SSatish Balay                                                      comm=self.COMM)
265808f684SSatish Balay
275808f684SSatish Balay    def tearDown(self):
285808f684SSatish Balay        self.plex.destroy()
295808f684SSatish Balay        self.plex = None
305808f684SSatish Balay
315808f684SSatish Balay    def testTopology(self):
325808f684SSatish Balay        dim = self.plex.getDimension()
335808f684SSatish Balay        pStart, pEnd = self.plex.getChart()
345808f684SSatish Balay        cStart, cEnd = self.plex.getHeightStratum(0)
355808f684SSatish Balay        vStart, vEnd = self.plex.getDepthStratum(0)
365808f684SSatish Balay        numDepths = self.plex.getLabelSize("depth")
375808f684SSatish Balay        coords_raw = self.plex.getCoordinates().getArray()
385808f684SSatish Balay        coords = np.reshape(coords_raw, (vEnd - vStart, dim))
395808f684SSatish Balay        self.assertEqual(dim, self.DIM)
405808f684SSatish Balay        self.assertEqual(numDepths, self.DIM+1)
415808f684SSatish Balay        if self.CELLS is not None:
425808f684SSatish Balay            self.assertEqual(cEnd-cStart, len(self.CELLS))
435808f684SSatish Balay        if self.COORDS is not None:
445808f684SSatish Balay            self.assertEqual(vEnd-vStart, len(self.COORDS))
455808f684SSatish Balay            self.assertTrue((coords == self.COORDS).all())
465808f684SSatish Balay
475808f684SSatish Balay    def testClosure(self):
485808f684SSatish Balay        pStart, pEnd = self.plex.getChart()
495808f684SSatish Balay        for p in range(pStart, pEnd):
505808f684SSatish Balay            closure = self.plex.getTransitiveClosure(p)[0]
515808f684SSatish Balay            for c in closure:
525808f684SSatish Balay                cone = self.plex.getCone(c)
535808f684SSatish Balay                self.assertEqual(self.plex.getConeSize(c), len(cone))
545808f684SSatish Balay                for i in cone:
555808f684SSatish Balay                    self.assertIn(i, closure)
565808f684SSatish Balay            star = self.plex.getTransitiveClosure(p, useCone=False)[0]
575808f684SSatish Balay            for s in star:
585808f684SSatish Balay                support = self.plex.getSupport(s)
595808f684SSatish Balay                self.assertEqual(self.plex.getSupportSize(s), len(support))
605808f684SSatish Balay                for i in support:
615808f684SSatish Balay                    self.assertIn(i, star)
625808f684SSatish Balay
635808f684SSatish Balay    def testAdjacency(self):
645808f684SSatish Balay        PETSc.DMPlex.setAdjacencyUseAnchors(self.plex, False)
655808f684SSatish Balay        flag = PETSc.DMPlex.getAdjacencyUseAnchors(self.plex)
665808f684SSatish Balay        self.assertFalse(flag)
675808f684SSatish Balay        PETSc.DMPlex.setAdjacencyUseAnchors(self.plex, True)
685808f684SSatish Balay        flag = PETSc.DMPlex.getAdjacencyUseAnchors(self.plex)
695808f684SSatish Balay        self.assertTrue(flag)
705808f684SSatish Balay        PETSc.DMPlex.setBasicAdjacency(self.plex, False, False)
715808f684SSatish Balay        flagA, flagB = PETSc.DMPlex.getBasicAdjacency(self.plex)
725808f684SSatish Balay        self.assertFalse(flagA)
735808f684SSatish Balay        self.assertFalse(flagB)
745808f684SSatish Balay        PETSc.DMPlex.setBasicAdjacency(self.plex, True, True)
755808f684SSatish Balay        flagA, flagB = PETSc.DMPlex.getBasicAdjacency(self.plex)
765808f684SSatish Balay        self.assertTrue(flagA)
775808f684SSatish Balay        self.assertTrue(flagB)
785808f684SSatish Balay        pStart, pEnd = self.plex.getChart()
795808f684SSatish Balay        for p in range(pStart, pEnd):
805808f684SSatish Balay            adjacency = self.plex.getAdjacency(p)
815808f684SSatish Balay            self.assertTrue(p in adjacency)
825808f684SSatish Balay            self.assertTrue(len(adjacency) > 1)
835808f684SSatish Balay
845808f684SSatish Balay    def testSectionDofs(self):
855808f684SSatish Balay        self.plex.setNumFields(1)
865808f684SSatish Balay        section = self.plex.createSection([self.COMP], [self.DOFS])
875808f684SSatish Balay        size = section.getStorageSize()
885808f684SSatish Balay        entity_dofs = [self.plex.getStratumSize("depth", d) *
895808f684SSatish Balay                       self.DOFS[d] for d in range(self.DIM+1)]
905808f684SSatish Balay        self.assertEqual(sum(entity_dofs), size)
915808f684SSatish Balay
925808f684SSatish Balay    def testSectionClosure(self):
935808f684SSatish Balay        section = self.plex.createSection([self.COMP], [self.DOFS])
945808f684SSatish Balay        self.plex.setSection(section)
955808f684SSatish Balay        vec = self.plex.createLocalVec()
965808f684SSatish Balay        pStart, pEnd = self.plex.getChart()
975808f684SSatish Balay        for p in range(pStart, pEnd):
985808f684SSatish Balay            for i in range(section.getDof(p)):
995808f684SSatish Balay                off = section.getOffset(p)
1005808f684SSatish Balay                vec.setValue(off+i, p)
1015808f684SSatish Balay
1025808f684SSatish Balay        for p in range(pStart, pEnd):
1035808f684SSatish Balay            point_closure = self.plex.getTransitiveClosure(p)[0]
1045808f684SSatish Balay            dof_closure = self.plex.vecGetClosure(section, vec, p)
1055808f684SSatish Balay            for p in dof_closure:
1065808f684SSatish Balay                self.assertIn(p, point_closure)
1075808f684SSatish Balay
1085808f684SSatish Balay    def testBoundaryLabel(self):
109439f958dSVaclav Hapla        pStart, pEnd = self.plex.getChart()
110439f958dSVaclav Hapla        if (pEnd - pStart == 0): return
111439f958dSVaclav Hapla
1125808f684SSatish Balay        self.assertFalse(self.plex.hasLabel("boundary"))
1135808f684SSatish Balay        self.plex.markBoundaryFaces("boundary")
1145808f684SSatish Balay        self.assertTrue(self.plex.hasLabel("boundary"))
1155808f684SSatish Balay
1165808f684SSatish Balay        faces = self.plex.getStratumIS("boundary", 1)
1175808f684SSatish Balay        for f in faces.getIndices():
1185808f684SSatish Balay            points, orient = self.plex.getTransitiveClosure(f, useCone=True)
1195808f684SSatish Balay            for p in points:
1205808f684SSatish Balay                self.plex.setLabelValue("boundary", p, 1)
1215808f684SSatish Balay
1225808f684SSatish Balay        for p in range(pStart, pEnd):
1235808f684SSatish Balay            if self.plex.getLabelValue("boundary", p) != 1:
1245808f684SSatish Balay                self.plex.setLabelValue("boundary", p, 2)
1255808f684SSatish Balay
1265808f684SSatish Balay        numBoundary = self.plex.getStratumSize("boundary", 1)
1275808f684SSatish Balay        numInterior = self.plex.getStratumSize("boundary", 2)
1285808f684SSatish Balay        self.assertNotEqual(numBoundary, pEnd - pStart)
1295808f684SSatish Balay        self.assertNotEqual(numInterior, pEnd - pStart)
1305808f684SSatish Balay        self.assertEqual(numBoundary + numInterior, pEnd - pStart)
1315808f684SSatish Balay
1325808f684SSatish Balay
1335808f684SSatish Balay    def testAdapt(self):
1345808f684SSatish Balay        dim = self.plex.getDimension()
1355808f684SSatish Balay        if dim == 1: return
1365808f684SSatish Balay        vStart, vEnd = self.plex.getDepthStratum(0)
1375808f684SSatish Balay        numVertices = vEnd-vStart
1385808f684SSatish Balay        metric_array = np.zeros([numVertices,dim,dim])
1395808f684SSatish Balay        for met in metric_array:
1405808f684SSatish Balay            met[:,:] = np.diag([9]*dim)
1415808f684SSatish Balay        metric = PETSc.Vec().createWithArray(metric_array)
1425808f684SSatish Balay        try:
1435808f684SSatish Balay            newplex = self.plex.adaptMetric(metric,"")
1445808f684SSatish Balay        except PETSc.Error as exc:
1455808f684SSatish Balay            if exc.ierr != ERR_SUP: raise
1465808f684SSatish Balay
1475808f684SSatish Balay
1485808f684SSatish Balay# --------------------------------------------------------------------
1495808f684SSatish Balay
1505808f684SSatish Balayclass BaseTestPlex_2D(BaseTestPlex):
1515808f684SSatish Balay    DIM = 2
1525808f684SSatish Balay    CELLS = [[0, 1, 3], [1, 3, 4], [1, 2, 4], [2, 4, 5],
1535808f684SSatish Balay             [3, 4, 6], [4, 6, 7], [4, 5, 7], [5, 7, 8]]
1545808f684SSatish Balay    COORDS = [[0.0, 0.0], [0.5, 0.0], [1.0, 0.0],
1555808f684SSatish Balay              [0.0, 0.5], [0.5, 0.5], [1.0, 0.5],
1565808f684SSatish Balay              [0.0, 1.0], [0.5, 1.0], [1.0, 1.0]]
1575808f684SSatish Balay    DOFS = [1, 0, 0]
1585808f684SSatish Balay
1595808f684SSatish Balayclass BaseTestPlex_3D(BaseTestPlex):
1605808f684SSatish Balay    DIM = 3
1615808f684SSatish Balay    CELLS = [[0, 2, 3, 7], [0, 2, 6, 7], [0, 4, 6, 7],
1625808f684SSatish Balay             [0, 1, 3, 7], [0, 1, 5, 7], [0, 4, 5, 7]]
1635808f684SSatish Balay    COORDS = [[0., 0., 0.], [1., 0., 0.], [0., 1., 0.], [1., 1., 0.],
1645808f684SSatish Balay              [0., 0., 1.], [1., 0., 1.], [0., 1., 1.], [1., 1., 1.]]
1655808f684SSatish Balay    DOFS = [1, 0, 0, 0]
1665808f684SSatish Balay
1675808f684SSatish Balay# --------------------------------------------------------------------
1685808f684SSatish Balay
1695808f684SSatish Balayclass TestPlex_1D(BaseTestPlex, unittest.TestCase):
1705808f684SSatish Balay    pass
1715808f684SSatish Balay
1725808f684SSatish Balayclass TestPlex_2D(BaseTestPlex_2D, unittest.TestCase):
1735808f684SSatish Balay    pass
1745808f684SSatish Balay
1755808f684SSatish Balayclass TestPlex_3D(BaseTestPlex_3D, unittest.TestCase):
1765808f684SSatish Balay    pass
1775808f684SSatish Balay
1785808f684SSatish Balayclass TestPlex_2D_P3(BaseTestPlex_2D, unittest.TestCase):
1795808f684SSatish Balay    DOFS = [1, 2, 1]
1805808f684SSatish Balay
1815808f684SSatish Balayclass TestPlex_3D_P3(BaseTestPlex_3D, unittest.TestCase):
1825808f684SSatish Balay    DOFS = [1, 2, 1, 0]
1835808f684SSatish Balay
1845808f684SSatish Balayclass TestPlex_3D_P4(BaseTestPlex_3D, unittest.TestCase):
1855808f684SSatish Balay    DOFS = [1, 3, 3, 1]
1865808f684SSatish Balay
1875808f684SSatish Balayclass TestPlex_2D_BoxTensor(BaseTestPlex_2D, unittest.TestCase):
1885808f684SSatish Balay    CELLS = None
1895808f684SSatish Balay    COORDS = None
1905808f684SSatish Balay    def setUp(self):
1915808f684SSatish Balay        self.plex = PETSc.DMPlex().createBoxMesh([3,3], simplex=False)
1925808f684SSatish Balay
1935808f684SSatish Balayclass TestPlex_3D_BoxTensor(BaseTestPlex_3D, unittest.TestCase):
1945808f684SSatish Balay    CELLS = None
1955808f684SSatish Balay    COORDS = None
1965808f684SSatish Balay    def setUp(self):
1975808f684SSatish Balay        self.plex = PETSc.DMPlex().createBoxMesh([3,3,3], simplex=False)
1985808f684SSatish Balay
1995808f684SSatish Balaytry:
2005808f684SSatish Balay    raise PETSc.Error
2015808f684SSatish Balay    PETSc.DMPlex().createBoxMesh([2,2], simplex=True, comm=PETSc.COMM_SELF).destroy()
2025808f684SSatish Balayexcept PETSc.Error:
2035808f684SSatish Balay    pass
2045808f684SSatish Balayelse:
2055808f684SSatish Balay    class TestPlex_2D_Box(BaseTestPlex_2D, unittest.TestCase):
2065808f684SSatish Balay        CELLS = None
2075808f684SSatish Balay        COORDS = None
2085808f684SSatish Balay        def setUp(self):
2095808f684SSatish Balay            self.plex = PETSc.DMPlex().createBoxMesh([1,1], simplex=True)
2105808f684SSatish Balay
2115808f684SSatish Balay    class TestPlex_2D_Boundary(BaseTestPlex_2D, unittest.TestCase):
2125808f684SSatish Balay        CELLS = None
2135808f684SSatish Balay        COORDS = None
2145808f684SSatish Balay        def setUp(self):
2155808f684SSatish Balay            boundary = PETSc.DMPlex().create(self.COMM)
2165808f684SSatish Balay            boundary.createSquareBoundary([0., 0.], [1., 1.], [2, 2])
2175808f684SSatish Balay            boundary.setDimension(self.DIM-1)
2185808f684SSatish Balay            self.plex = PETSc.DMPlex().generate(boundary)
2195808f684SSatish Balay
2205808f684SSatish Balay    class TestPlex_3D_Box(BaseTestPlex_3D, unittest.TestCase):
2215808f684SSatish Balay        CELLS = None
2225808f684SSatish Balay        COORDS = None
2235808f684SSatish Balay        def setUp(self):
2245808f684SSatish Balay            self.plex = PETSc.DMPlex().createBoxMesh([1,1,1], simplex=True)
2255808f684SSatish Balay
2265808f684SSatish Balay    class TestPlex_3D_Boundary(BaseTestPlex_3D, unittest.TestCase):
2275808f684SSatish Balay        CELLS = None
2285808f684SSatish Balay        COORDS = None
2295808f684SSatish Balay        def setUp(self):
2305808f684SSatish Balay            boundary = PETSc.DMPlex().create(self.COMM)
2315808f684SSatish Balay            boundary.createCubeBoundary([0., 0., 0.], [1., 1., 1.], [1, 1, 1])
2325808f684SSatish Balay            boundary.setDimension(self.DIM-1)
2335808f684SSatish Balay            self.plex = PETSc.DMPlex().generate(boundary)
2345808f684SSatish Balay
2355808f684SSatish Balay# --------------------------------------------------------------------
2365808f684SSatish Balay
237*728cfed7SksagiyamPETSC_DIR = petsc4py.get_config()['PETSC_DIR']
238*728cfed7Sksagiyam
239*728cfed7Sksagiyamdef check_dtype(method):
240*728cfed7Sksagiyam    def wrapper(self, *args, **kwargs):
241*728cfed7Sksagiyam        if PETSc.ScalarType is PETSc.ComplexType:
242*728cfed7Sksagiyam            return
243*728cfed7Sksagiyam        else:
244*728cfed7Sksagiyam            return method(self, *args, **kwargs)
245*728cfed7Sksagiyam    return wrapper
246*728cfed7Sksagiyam
247*728cfed7Sksagiyamdef check_package(method):
248*728cfed7Sksagiyam    def wrapper(self, *args, **kwargs):
249*728cfed7Sksagiyam        if not PETSc.Sys.hasExternalPackage("hdf5"):
250*728cfed7Sksagiyam            return
251*728cfed7Sksagiyam        elif self.PARTITIONERTYPE != "simple" and \
252*728cfed7Sksagiyam           not PETSc.Sys.hasExternalPackage(self.PARTITIONERTYPE):
253*728cfed7Sksagiyam            return
254*728cfed7Sksagiyam        else:
255*728cfed7Sksagiyam            return method(self, *args, **kwargs)
256*728cfed7Sksagiyam    return wrapper
257*728cfed7Sksagiyam
258*728cfed7Sksagiyamdef check_nsize(method):
259*728cfed7Sksagiyam    def wrapper(self, *args, **kwargs):
260*728cfed7Sksagiyam        if PETSc.COMM_WORLD.size != self.NSIZE:
261*728cfed7Sksagiyam            return
262*728cfed7Sksagiyam        else:
263*728cfed7Sksagiyam            return method(self, *args, **kwargs)
264*728cfed7Sksagiyam    return wrapper
265*728cfed7Sksagiyam
266*728cfed7Sksagiyamclass BaseTestPlexHDF5(object):
267*728cfed7Sksagiyam    NSIZE = 4
268*728cfed7Sksagiyam    NTIMES = 3
269*728cfed7Sksagiyam
270*728cfed7Sksagiyam    def setUp(self):
271*728cfed7Sksagiyam        self.txtvwr = PETSc.Viewer()
272*728cfed7Sksagiyam
273*728cfed7Sksagiyam    def tearDown(self):
274*728cfed7Sksagiyam        if not PETSc.COMM_WORLD.rank:
275*728cfed7Sksagiyam            if os.path.exists(self.outfile()):
276*728cfed7Sksagiyam                os.remove(self.outfile())
277*728cfed7Sksagiyam            if os.path.exists(self.tmp_output_file()):
278*728cfed7Sksagiyam                os.remove(self.tmp_output_file())
279*728cfed7Sksagiyam        self.txtvwr = None
280*728cfed7Sksagiyam
281*728cfed7Sksagiyam    def _name(self):
282*728cfed7Sksagiyam        return "%s_outformat-%s_%s" % (self.SUFFIX,
283*728cfed7Sksagiyam                                       self.OUTFORMAT,
284*728cfed7Sksagiyam                                       self.PARTITIONERTYPE)
285*728cfed7Sksagiyam
286*728cfed7Sksagiyam    def infile(self):
287*728cfed7Sksagiyam        return os.path.join(PETSC_DIR, "share/petsc/datafiles/",
288*728cfed7Sksagiyam                            "meshes/blockcylinder-50.h5")
289*728cfed7Sksagiyam
290*728cfed7Sksagiyam    def outfile(self):
291*728cfed7Sksagiyam        return os.path.join("./temp_test_dmplex_%s.h5" % self._name())
292*728cfed7Sksagiyam
293*728cfed7Sksagiyam    def informat(self):
294*728cfed7Sksagiyam        return PETSc.Viewer.Format.HDF5_XDMF
295*728cfed7Sksagiyam
296*728cfed7Sksagiyam    def outformat(self):
297*728cfed7Sksagiyam        d = {"hdf5_petsc": PETSc.Viewer.Format.HDF5_PETSC,
298*728cfed7Sksagiyam             "hdf5_xdmf": PETSc.Viewer.Format.HDF5_XDMF}
299*728cfed7Sksagiyam        return d[self.OUTFORMAT]
300*728cfed7Sksagiyam
301*728cfed7Sksagiyam    def partitionerType(self):
302*728cfed7Sksagiyam        d = {"simple": PETSc.Partitioner.Type.SIMPLE,
303*728cfed7Sksagiyam             "ptscotch": PETSc.Partitioner.Type.PTSCOTCH,
304*728cfed7Sksagiyam             "parmetis": PETSc.Partitioner.Type.PARMETIS}
305*728cfed7Sksagiyam        return d[self.PARTITIONERTYPE]
306*728cfed7Sksagiyam
307*728cfed7Sksagiyam    def ref_output_file(self):
308*728cfed7Sksagiyam        return os.path.join(PETSC_DIR, "src/dm/impls/plex/tutorials/",
309*728cfed7Sksagiyam                            "output/ex5_%s.out" % self._name())
310*728cfed7Sksagiyam
311*728cfed7Sksagiyam    def tmp_output_file(self):
312*728cfed7Sksagiyam        return os.path.join("./temp_test_dmplex_%s.out" % self._name())
313*728cfed7Sksagiyam
314*728cfed7Sksagiyam    def outputText(self, msg, comm):
315*728cfed7Sksagiyam        if not comm.rank:
316*728cfed7Sksagiyam            with open(self.tmp_output_file(), 'a') as f:
317*728cfed7Sksagiyam                f.write(msg)
318*728cfed7Sksagiyam
319*728cfed7Sksagiyam    def outputPlex(self, plex):
320*728cfed7Sksagiyam        self.txtvwr.createASCII(self.tmp_output_file(),
321*728cfed7Sksagiyam                                mode='a', comm=plex.comm)
322*728cfed7Sksagiyam        plex.view(viewer=self.txtvwr)
323*728cfed7Sksagiyam        self.txtvwr.destroy()
324*728cfed7Sksagiyam
325*728cfed7Sksagiyam    @check_dtype
326*728cfed7Sksagiyam    @check_package
327*728cfed7Sksagiyam    @check_nsize
328*728cfed7Sksagiyam    def testViewLoadCycle(self):
329*728cfed7Sksagiyam        grank = PETSc.COMM_WORLD.rank
330*728cfed7Sksagiyam        for i in range(self.NTIMES):
331*728cfed7Sksagiyam            if i == 0:
332*728cfed7Sksagiyam                infname = self.infile()
333*728cfed7Sksagiyam                informt = self.informat()
334*728cfed7Sksagiyam            else:
335*728cfed7Sksagiyam                infname = self.outfile()
336*728cfed7Sksagiyam                informt = self.outformat()
337*728cfed7Sksagiyam            if self.HETEROGENEOUS:
338*728cfed7Sksagiyam                mycolor = (grank > self.NTIMES - i)
339*728cfed7Sksagiyam            else:
340*728cfed7Sksagiyam                mycolor = 0
341*728cfed7Sksagiyam            mpicomm = PETSc.COMM_WORLD.tompi4py()
342*728cfed7Sksagiyam            comm = PETSc.Comm(comm=mpicomm.Split(color=mycolor, key=grank))
343*728cfed7Sksagiyam            if mycolor == 0:
344*728cfed7Sksagiyam                self.outputText("Begin cycle %d\n" % i, comm)
345*728cfed7Sksagiyam                plex = PETSc.DMPlex()
346*728cfed7Sksagiyam                vwr = PETSc.ViewerHDF5()
347*728cfed7Sksagiyam                # Create plex
348*728cfed7Sksagiyam                plex.create(comm=comm)
349*728cfed7Sksagiyam                plex.setName("DMPlex Object")
350*728cfed7Sksagiyam                # Load data from XDMF into dm in parallel
351*728cfed7Sksagiyam                vwr.create(infname, mode='r', comm=comm)
352*728cfed7Sksagiyam                vwr.pushFormat(format=informt)
353*728cfed7Sksagiyam                plex.load(viewer=vwr)
354*728cfed7Sksagiyam                plex.setOptionsPrefix("loaded_")
355*728cfed7Sksagiyam                plex.setFromOptions()
356*728cfed7Sksagiyam                vwr.popFormat()
357*728cfed7Sksagiyam                vwr.destroy()
358*728cfed7Sksagiyam                self.outputPlex(plex)
359*728cfed7Sksagiyam                # Test DM is indeed distributed
360*728cfed7Sksagiyam                flg = plex.isDistributed()
361*728cfed7Sksagiyam                self.outputText("Loaded mesh distributed? %s\n" %
362*728cfed7Sksagiyam                                str(flg).upper(), comm)
363*728cfed7Sksagiyam                # Interpolate
364*728cfed7Sksagiyam                plex.interpolate()
365*728cfed7Sksagiyam                plex.setOptionsPrefix("interpolated_")
366*728cfed7Sksagiyam                plex.setFromOptions()
367*728cfed7Sksagiyam                self.outputPlex(plex)
368*728cfed7Sksagiyam                # Redistribute
369*728cfed7Sksagiyam                part = plex.getPartitioner()
370*728cfed7Sksagiyam                part.setType(self.partitionerType())
371*728cfed7Sksagiyam                _ = plex.distribute(overlap=0)
372*728cfed7Sksagiyam                plex.setOptionsPrefix("redistributed_")
373*728cfed7Sksagiyam                plex.setFromOptions()
374*728cfed7Sksagiyam                self.outputPlex(plex)
375*728cfed7Sksagiyam                # Save redistributed dm to XDMF in parallel
376*728cfed7Sksagiyam                vwr.create(self.outfile(), mode='w', comm=comm)
377*728cfed7Sksagiyam                vwr.pushFormat(format=self.outformat())
378*728cfed7Sksagiyam                plex.view(viewer=vwr)
379*728cfed7Sksagiyam                vwr.popFormat()
380*728cfed7Sksagiyam                vwr.destroy()
381*728cfed7Sksagiyam                # Destroy plex
382*728cfed7Sksagiyam                plex.destroy()
383*728cfed7Sksagiyam                self.outputText("End   cycle %d\n--------\n" % i, comm)
384*728cfed7Sksagiyam            PETSc.COMM_WORLD.Barrier()
385*728cfed7Sksagiyam        # Check that the output is identical to that of plex/tutorial/ex5.c.
386*728cfed7Sksagiyam        self.assertTrue(filecmp.cmp(self.tmp_output_file(),
387*728cfed7Sksagiyam                                    self.ref_output_file(), shallow=False),
388*728cfed7Sksagiyam                        'Contents of the files not the same.')
389*728cfed7Sksagiyam        PETSc.COMM_WORLD.Barrier()
390*728cfed7Sksagiyam
391*728cfed7Sksagiyamclass BaseTestPlexHDF5Homogeneous(BaseTestPlexHDF5):
392*728cfed7Sksagiyam    """Test save on N / load on N."""
393*728cfed7Sksagiyam    SUFFIX = 0
394*728cfed7Sksagiyam    HETEROGENEOUS = False
395*728cfed7Sksagiyam
396*728cfed7Sksagiyamclass BaseTestPlexHDF5Heterogeneous(BaseTestPlexHDF5):
397*728cfed7Sksagiyam    """Test save on N / load on M."""
398*728cfed7Sksagiyam    SUFFIX = 1
399*728cfed7Sksagiyam    HETEROGENEOUS = True
400*728cfed7Sksagiyam
401*728cfed7Sksagiyamclass TestPlexHDF5PETSCSimpleHomogeneous(BaseTestPlexHDF5Homogeneous,
402*728cfed7Sksagiyam                                         unittest.TestCase):
403*728cfed7Sksagiyam    OUTFORMAT = "hdf5_petsc"
404*728cfed7Sksagiyam    PARTITIONERTYPE = "simple"
405*728cfed7Sksagiyam
406*728cfed7Sksagiyam"""
407*728cfed7SksagiyamSkipping. PTScotch produces different distributions when run
408*728cfed7Sksagiyamin a sequence in a single session.
409*728cfed7Sksagiyam
410*728cfed7Sksagiyamclass TestPlexHDF5PETSCPTScotchHomogeneous(BaseTestPlexHDF5Homogeneous,
411*728cfed7Sksagiyam                                           unittest.TestCase):
412*728cfed7Sksagiyam    OUTFORMAT = "hdf5_petsc"
413*728cfed7Sksagiyam    PARTITIONERTYPE = "ptscotch"
414*728cfed7Sksagiyam"""
415*728cfed7Sksagiyam
416*728cfed7Sksagiyamclass TestPlexHDF5PETSCParmetisHomogeneous(BaseTestPlexHDF5Homogeneous,
417*728cfed7Sksagiyam                                           unittest.TestCase):
418*728cfed7Sksagiyam    OUTFORMAT = "hdf5_petsc"
419*728cfed7Sksagiyam    PARTITIONERTYPE = "parmetis"
420*728cfed7Sksagiyam
421*728cfed7Sksagiyamclass TestPlexHDF5XDMFSimpleHomogeneous(BaseTestPlexHDF5Homogeneous,
422*728cfed7Sksagiyam                                        unittest.TestCase):
423*728cfed7Sksagiyam    OUTFORMAT = "hdf5_xdmf"
424*728cfed7Sksagiyam    PARTITIONERTYPE = "simple"
425*728cfed7Sksagiyam
426*728cfed7Sksagiyam"""
427*728cfed7SksagiyamSkipping. PTScotch produces different distributions when run
428*728cfed7Sksagiyamin a sequence in a single session.
429*728cfed7Sksagiyam
430*728cfed7Sksagiyamclass TestPlexHDF5XDMFPTScotchHomogeneous(BaseTestPlexHDF5Homogeneous,
431*728cfed7Sksagiyam                                          unittest.TestCase):
432*728cfed7Sksagiyam    OUTFORMAT = "hdf5_xdmf"
433*728cfed7Sksagiyam    PARTITIONERTYPE = "ptscotch"
434*728cfed7Sksagiyam"""
435*728cfed7Sksagiyam
436*728cfed7Sksagiyamclass TestPlexHDF5XDMFParmetisHomogeneous(BaseTestPlexHDF5Homogeneous,
437*728cfed7Sksagiyam                                          unittest.TestCase):
438*728cfed7Sksagiyam    OUTFORMAT = "hdf5_xdmf"
439*728cfed7Sksagiyam    PARTITIONERTYPE = "parmetis"
440*728cfed7Sksagiyam
441*728cfed7Sksagiyamclass TestPlexHDF5PETSCSimpleHeterogeneous(BaseTestPlexHDF5Heterogeneous,
442*728cfed7Sksagiyam                                           unittest.TestCase):
443*728cfed7Sksagiyam    OUTFORMAT = "hdf5_petsc"
444*728cfed7Sksagiyam    PARTITIONERTYPE = "simple"
445*728cfed7Sksagiyam
446*728cfed7Sksagiyam"""
447*728cfed7SksagiyamSkipping. PTScotch produces different distributions when run
448*728cfed7Sksagiyamin a sequence in a single session.
449*728cfed7Sksagiyam
450*728cfed7Sksagiyamclass TestPlexHDF5PETSCPTScotchHeterogeneous(BaseTestPlexHDF5Heterogeneous,
451*728cfed7Sksagiyam                                             unittest.TestCase):
452*728cfed7Sksagiyam    OUTFORMAT = "hdf5_petsc"
453*728cfed7Sksagiyam    PARTITIONERTYPE = "ptscotch"
454*728cfed7Sksagiyam"""
455*728cfed7Sksagiyam
456*728cfed7Sksagiyamclass TestPlexHDF5PETSCParmetisHeterogeneous(BaseTestPlexHDF5Heterogeneous,
457*728cfed7Sksagiyam                                             unittest.TestCase):
458*728cfed7Sksagiyam    OUTFORMAT = "hdf5_petsc"
459*728cfed7Sksagiyam    PARTITIONERTYPE = "parmetis"
460*728cfed7Sksagiyam
461*728cfed7Sksagiyamclass TestPlexHDF5XDMFSimpleHeterogeneous(BaseTestPlexHDF5Heterogeneous,
462*728cfed7Sksagiyam                                          unittest.TestCase):
463*728cfed7Sksagiyam    OUTFORMAT = "hdf5_xdmf"
464*728cfed7Sksagiyam    PARTITIONERTYPE = "simple"
465*728cfed7Sksagiyam
466*728cfed7Sksagiyamclass TestPlexHDF5XDMFPTScotchHeterogeneous(BaseTestPlexHDF5Heterogeneous,
467*728cfed7Sksagiyam                                            unittest.TestCase):
468*728cfed7Sksagiyam    OUTFORMAT = "hdf5_xdmf"
469*728cfed7Sksagiyam    PARTITIONERTYPE = "ptscotch"
470*728cfed7Sksagiyam
471*728cfed7Sksagiyamclass TestPlexHDF5XDMFParmetisHeterogeneous(BaseTestPlexHDF5Heterogeneous,
472*728cfed7Sksagiyam                                            unittest.TestCase):
473*728cfed7Sksagiyam    OUTFORMAT = "hdf5_xdmf"
474*728cfed7Sksagiyam    PARTITIONERTYPE = "parmetis"
475*728cfed7Sksagiyam
476*728cfed7Sksagiyam# --------------------------------------------------------------------
477*728cfed7Sksagiyam
4785808f684SSatish Balayif __name__ == '__main__':
4795808f684SSatish Balay    unittest.main()
480