def TetrahedralizePoly(polyFilename, commandLineSwitches=[]): """ Tetrahedralise the given poly using TetGen """ assert (filehandling.FileExtension(polyFilename) == ".poly") tempDir = tempfile.mkdtemp() tempFile = os.path.join(tempDir, os.path.basename(polyFilename)) filehandling.Cp(polyFilename, tempFile) command = ["tetgen", "-p"] if debug.GetDebugLevel() > 1: command.append("-V") stdout = None stderr = None else: stdout = subprocess.PIPE stderr = subprocess.PIPE command += commandLineSwitches command.append(tempFile) debug.dprint("Tetrahedralization command: " + utils.FormLine(command, delimiter=" ", newline=False)) proc = subprocess.Popen(command, stdout=stdout, stderr=stderr) proc.wait() assert (proc.returncode == 0) mesh = triangletools.ReadTriangle(tempFile[:-5] + ".1") filehandling.Rmdir(tempDir, force=True) return mesh
def testPolyIo(self): tempDir = tempfile.mkdtemp() oldMesh = meshes.Mesh(2) oldMesh.AddNodeCoord([0.0, 0.0]) oldMesh.AddNodeCoord([1.0, 0.0]) oldMesh.AddNodeCoord([0.0, 1.0]) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 1])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 2])) oldMesh.AddSurfaceElement(elements.Element(nodes=[1, 2])) oldHoleMesh = meshes.Mesh(2) oldHoleMesh.AddNodeCoord([0.1, 0.1]) oldHoleMesh.AddNodeCoord([0.2, 0.2]) filename = os.path.join(tempDir, "temp.poly") WritePoly(oldMesh, filename, holeMesh=oldHoleMesh) newMesh, newHoleMesh = ReadPoly(filename) self.assertEquals(oldHoleMesh.GetDim(), newHoleMesh.GetDim()) self.assertEquals(oldHoleMesh.NodeCount(), newHoleMesh.NodeCount()) self.assertEquals(oldHoleMesh.SurfaceElementCount(), newHoleMesh.SurfaceElementCount()) self.assertEquals(oldHoleMesh.VolumeElementCount(), newHoleMesh.VolumeElementCount()) self.assertEquals(oldHoleMesh.GetDim(), newHoleMesh.GetDim()) self.assertEquals(oldHoleMesh.NodeCount(), newHoleMesh.NodeCount()) self.assertEquals(oldHoleMesh.SurfaceElementCount(), newHoleMesh.SurfaceElementCount()) self.assertEquals(oldHoleMesh.VolumeElementCount(), newHoleMesh.VolumeElementCount()) oldMesh = meshes.Mesh(3) oldMesh.AddNodeCoord([0.0, 0.0, 0.0]) oldMesh.AddNodeCoord([1.0, 0.0, 0.0]) oldMesh.AddNodeCoord([0.0, 1.0, 0.0]) oldMesh.AddNodeCoord([0.0, 0.0, 1.0]) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 1, 2])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 1, 3])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 2, 3])) oldMesh.AddSurfaceElement(elements.Element(nodes=[1, 2, 3])) oldHoleMesh = meshes.Mesh(3) oldHoleMesh.AddNodeCoord([0.1, 0.1, 0.1]) oldHoleMesh.AddNodeCoord([0.2, 0.2, 0.2]) filename = os.path.join(tempDir, "temp.poly") WritePoly(oldMesh, filename, holeMesh=oldHoleMesh) newMesh, newHoleMesh = ReadPoly(filename) self.assertEquals(oldHoleMesh.GetDim(), newHoleMesh.GetDim()) self.assertEquals(oldHoleMesh.NodeCount(), newHoleMesh.NodeCount()) self.assertEquals(oldHoleMesh.SurfaceElementCount(), newHoleMesh.SurfaceElementCount()) self.assertEquals(oldHoleMesh.VolumeElementCount(), newHoleMesh.VolumeElementCount()) self.assertEquals(oldHoleMesh.GetDim(), newHoleMesh.GetDim()) self.assertEquals(oldHoleMesh.NodeCount(), newHoleMesh.NodeCount()) self.assertEquals(oldHoleMesh.SurfaceElementCount(), newHoleMesh.SurfaceElementCount()) self.assertEquals(oldHoleMesh.VolumeElementCount(), newHoleMesh.VolumeElementCount()) filehandling.Rmdir(tempDir, force=True) return
def testHalosIO(self): halo1 = Halo(process = 0, nProcesses = 1, nOwnedNodes = 3, sends = [[0, 1]], receives = [[3, 4]]) halo2 = Halo(process = 0, nProcesses = 1, nOwnedNodes = 3, sends = [[0, 2, 1]], receives = [[3, 5, 4]]) halos = Halos(process = 0, nProcesses = 1, nodeHalos = [halo1, halo2]) tempDir = tempfile.mkdtemp() filename = os.path.join(tempDir, "halos") WriteHalos(halos, filename) halos = ReadHalos(filename) self.assertEquals(halos.NodeHaloLevels(), [1, 2]) self.assertEquals(halos.ElementHaloLevels(), []) halo1, halo2 = halos.GetNodeHalos() self.assertEquals(halo1.GetProcess(), 0) self.assertEquals(halo2.GetProcess(), 0) self.assertEquals(halo1.GetNProcesses(), 1) self.assertEquals(halo2.GetNProcesses(), 1) self.assertEquals(halo1.GetSends(process = 0), [0, 1]) self.assertEquals(halo2.GetSends(process = 0), [0, 2, 1]) self.assertEquals(halo1.GetReceives(process = 0), [3, 4]) self.assertEquals(halo2.GetReceives(process = 0), [3, 5, 4]) filehandling.Rmdir(tempDir, force = True) return
def testMshIo(self): tempDir = tempfile.mkdtemp() oldMesh = meshes.Mesh(2) oldMesh.AddNodeCoord([0.0, 0.0]) oldMesh.AddNodeCoord([1.0, 0.0]) oldMesh.AddNodeCoord([0.0, 1.0]) oldMesh.AddVolumeElement(elements.Element(nodes=[0, 1, 2])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 1])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 2])) oldMesh.AddSurfaceElement(elements.Element(nodes=[1, 2])) filename = os.path.join(tempDir, "temp") WriteMsh(oldMesh, filename, binary=False) newMesh = ReadMsh(filename) filehandling.Rmdir(tempDir, force=True) self.assertEquals(oldMesh.GetDim(), newMesh.GetDim()) self.assertEquals(oldMesh.NodeCount(), newMesh.NodeCount()) self.assertEquals(oldMesh.SurfaceElementCount(), newMesh.SurfaceElementCount()) self.assertEquals(oldMesh.VolumeElementCount(), newMesh.VolumeElementCount()) tempDir = tempfile.mkdtemp() oldMesh = meshes.Mesh(2) oldMesh.AddNodeCoord([0.0, 0.0]) oldMesh.AddNodeCoord([1.0, 0.0]) oldMesh.AddNodeCoord([0.0, 1.0]) oldMesh.AddVolumeElement(elements.Element(nodes=[0, 1, 2])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 1])) oldMesh.AddSurfaceElement(elements.Element(nodes=[0, 2])) oldMesh.AddSurfaceElement(elements.Element(nodes=[1, 2])) filename = os.path.join(tempDir, "temp") WriteMsh(oldMesh, filename, binary=True) newMesh = ReadMsh(filename) filehandling.Rmdir(tempDir, force=True) self.assertEquals(oldMesh.GetDim(), newMesh.GetDim()) self.assertEquals(oldMesh.NodeCount(), newMesh.NodeCount()) self.assertEquals(oldMesh.SurfaceElementCount(), newMesh.SurfaceElementCount()) self.assertEquals(oldMesh.VolumeElementCount(), newMesh.VolumeElementCount()) return
def TetrahedralizeMesh(mesh, holeMesh=None, commandLineSwitches=[]): """ Tetrahedralise the given mesh using TetGen """ tempDir = tempfile.mkdtemp() polyFilename = os.path.join(tempDir, "temp.poly") WritePoly(mesh, polyFilename, holeMesh=holeMesh) mesh = TetrahedralizePoly(polyFilename, commandLineSwitches=commandLineSwitches) filehandling.Rmdir(tempDir, force=True) return mesh
def TriangulateMesh(mesh, holeMesh=None, commandLineSwitches=[]): """ Triangulate the given mesh file using Triangle """ tempDir = tempfile.mkdtemp() polyFilename = os.path.join(tempDir, "temp.poly") WritePoly(mesh, polyFilename, holeMesh=holeMesh) mesh = TriangulatePoly(polyFilename, commandLineSwitches=commandLineSwitches) filehandling.Rmdir(tempDir, force=True) return mesh
def testFindPvtuVtuFilenames(self): tempDir = tempfile.mkdtemp() project = os.path.join(tempDir, "project") for i in range(2, 4): for j in range(3): filehandling.Touch(project + "_" + str(i) + "_" + str(j) + ".vtu") filehandling.Touch(project + "_" + str(i) + ".pvtu") filenames = FindPvtuVtuFilenames(project, firstId=2, lastId=3) self.assertEquals(len(filenames), 6) filehandling.Rmdir(tempDir, force=True) return
def testScatterPlot(self): plot = ScatterPlot([0.0, 1.0], [1.0, 2.0], xLabel="x", yLabel="y") # Set data again, to test figure close plot.SetData([0.0, 1.0], [1.0, 2.0]) tempDir = tempfile.mkdtemp() plot.Save(os.path.join(tempDir, "temp.png")) plot.Save(os.path.join(tempDir, "temp.svg")) filehandling.Rmdir(tempDir, force=True) self.assertTrue(isinstance(plot.Widget(), gtk.Widget)) return
def testTriangulatePoly(self): tempDir = tempfile.mkdtemp() mesh = meshes.Mesh(2) mesh.AddNodeCoords([[0.0, 0.0], [1.0, 0.0], [0.0, 1.0], [0.1, 0.1]]) mesh.AddSurfaceElement(elements.Element([0, 1])) mesh.AddSurfaceElement(elements.Element([1, 2])) mesh.AddSurfaceElement(elements.Element([2, 0])) filename = os.path.join(tempDir, "test.poly") WritePoly(mesh, filename) mesh = TriangulatePoly(filename, commandLineSwitches=["-YY"]) self.assertEquals(mesh.NodeCount(), 4) self.assertEquals(mesh.VolumeElementCount(), 3) self.assertEquals(mesh.SurfaceElementCount(), 0) filehandling.Rmdir(tempDir, force=True) return
basename = sys.argv[1] debug.dprint("vtu basename: " + basename) nPieces = fluiditytools.FindMaxVtuId(basename) + 1 debug.dprint("Number of pieces: " + str(nPieces)) # Write to a temporary directory so that the first piece isn't overwritten tempDir = tempfile.mkdtemp() # Create the parallel writer writer = vtk.vtkXMLPUnstructuredGridWriter() writer.SetNumberOfPieces(nPieces) writer.WriteSummaryFileOn() pvtuName = basename + ".pvtu" writer.SetFileName(os.path.join(tempDir, pvtuName)) # Load in the first piece, so that the parallel writer has something to do (and # knows which fields we have) pieceName = fluiditytools.VtuFilenames(basename, 0)[0] pieceVtu = vtktools.vtu(pieceName) if vtk.vtkVersion.GetVTKMajorVersion() <= 5: writer.SetInput(0, pieceVtu.ugrid) else: writer.SetInputData(0, pieceVtu.ugrid) # Write writer.Write() # Move the output back and clean up filehandling.Move(os.path.join(tempDir, pvtuName), pvtuName) filehandling.Rmdir(tempDir, force=True)