예제 #1
0
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
예제 #2
0
    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
예제 #4
0
    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
예제 #5
0
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
예제 #6
0
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
예제 #7
0
    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
예제 #8
0
    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
예제 #9
0
    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
예제 #10
0
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)