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