def TestXdmfConversion(dataInput, fileName): global CleanUpGood, timer fileName = OutputDir + fileName xdmfFile = fileName + ".xmf" hdf5File = fileName + ".h5" vtkFile = fileName + ".vtk" xWriter = vtk.vtkXdmf3Writer() xWriter.SetLightDataLimit(LightDataLimit) xWriter.WriteAllTimeStepsOn() xWriter.SetFileName(xdmfFile) xWriter.SetInputData(dataInput) timer.StartTimer() xWriter.Write() timer.StopTimer() print "vtkXdmf3Writer took", timer.GetElapsedTime(), "seconds to write",\ xdmfFile ds = vtk.vtkDataSet.SafeDownCast(dataInput) if ds: dsw = vtk.vtkDataSetWriter() dsw.SetFileName(vtkFile) dsw.SetInputData(ds) dsw.Write() if not DoFilesExist(xdmfFile, None, None, False): message = "Writer did not create " + xdmfFile raiseErrorAndExit(message) xReader = vtk.vtkXdmf3Reader() xReader.SetFileName(xdmfFile) timer.StartTimer() xReader.Update() timer.StopTimer() print "vtkXdmf3Reader took", timer.GetElapsedTime(), "seconds to read",\ xdmfFile rOutput = xReader.GetOutputDataObject(0) fail = DoDataObjectsDiffer(dataInput, rOutput) if fail: raiseErrorAndExit("Xdmf conversion test failed") else: if ds: DoFilesExist(xdmfFile, hdf5File, vtkFile, CleanUpGood) else: DoFilesExist(xdmfFile, hdf5File, None, CleanUpGood)
"Iron/Iron_Protein.ImageData.Collection.xmf", "Iron/Iron_Protein.RectilinearGrid.xmf", "Iron/Iron_Protein.RectilinearGrid.Collection.xmf", "Iron/Iron_Protein.StructuredGrid.xmf", "Iron/Iron_Protein.StructuredGrid.Collection.xmf", "Big/Scenario1_p1.xmf", ] testfilenames = smallFiles import sys if "--do_big_files" in sys.argv: testfilenames = smallFiles + largeFiles if __name__ == "__main__": for fname in testfilenames: xr = vtk.vtkXdmf3Reader() afname = "" + str(VTK_DATA_ROOT) + "/Data/XDMF/" + fname print "Trying ", afname xr.CanReadFile(afname) xr.SetFileName(afname) xr.UpdateInformation() xr.Update() ds = xr.GetOutputDataObject(0) if not ds: print "Got zero output from known good file" sys.exit(vtk.VTK_ERROR) #if res != vtk.VTK_OK: # print "Could not read", afname # sys.exit(vtk.VTK_ERROR)
""" This test verifies that vtk's Xdmf reader will read a polyhedron sample file. """ import os, sys import vtk from vtk.util.misc import vtkGetDataRoot VTK_DATA_ROOT = vtkGetDataRoot() if __name__ == "__main__": fnameIn = "" + str(VTK_DATA_ROOT) + "/Data/XDMF/polyhedron.xmf" xr = vtk.vtkXdmf3Reader() xr.CanReadFile(fnameIn) xr.SetFileName(fnameIn) xr.UpdateInformation() xr.Update() ds = xr.GetOutputDataObject(0) if not ds: print "Got zero output from known good file" sys.exit(vtk.VTK_ERROR) print ds.GetCells() print ds.GetPoints()
def read(filetype, filename): import vtk from vtk.util import numpy_support def _read_data(data): """Extract numpy arrays from a VTK data set. """ # Go through all arrays, fetch data. out = {} for k in range(data.GetNumberOfArrays()): array = data.GetArray(k) if array: array_name = array.GetName() out[array_name] = numpy.copy( vtk.util.numpy_support.vtk_to_numpy(array)) return out def _read_cells(vtk_mesh): data = numpy.copy( vtk.util.numpy_support.vtk_to_numpy(vtk_mesh.GetCells().GetData())) offsets = numpy.copy( vtk.util.numpy_support.vtk_to_numpy( vtk_mesh.GetCellLocationsArray())) types = numpy.copy( vtk.util.numpy_support.vtk_to_numpy(vtk_mesh.GetCellTypesArray())) # `data` is a one-dimensional vector with # (num_points0, p0, p1, ... ,pk, numpoints1, p10, p11, ..., p1k, ... # Translate it into the cells dictionary. cells = {} for vtk_type, meshio_type in vtk_to_meshio_type.items(): # Get all offsets for vtk_type os = offsets[numpy.argwhere(types == vtk_type).transpose()[0]] num_cells = len(os) if num_cells > 0: if meshio_type == "polygon": for idx_cell in range(num_cells): num_pts = data[os[idx_cell]] cell = data[os[idx_cell] + 1:os[idx_cell] + 1 + num_pts] key = meshio_type + str(num_pts) if key in cells: cells[key] = numpy.vstack([cells[key], cell]) else: cells[key] = cell else: num_pts = data[os[0]] # instantiate the array arr = numpy.empty((num_cells, num_pts), dtype=int) # store the num_pts entries after the offsets into the columns # of arr for k in range(num_pts): arr[:, k] = data[os + k + 1] cells[meshio_type] = arr return cells if filetype in ["vtk", "vtk-ascii", "vtk-binary"]: reader = vtk.vtkUnstructuredGridReader() reader.SetFileName(filename) reader.SetReadAllNormals(1) reader.SetReadAllScalars(1) reader.SetReadAllTensors(1) reader.SetReadAllVectors(1) reader.Update() vtk_mesh = reader.GetOutput() elif filetype in ["vtu", "vtu-ascii", "vtu-binary"]: reader = vtk.vtkXMLUnstructuredGridReader() reader.SetFileName(filename) reader.Update() vtk_mesh = reader.GetOutput() elif filetype in ["xdmf", "xdmf2"]: reader = vtk.vtkXdmfReader() reader.SetFileName(filename) reader.SetReadAllColorScalars(1) reader.SetReadAllFields(1) reader.SetReadAllNormals(1) reader.SetReadAllScalars(1) reader.SetReadAllTCoords(1) reader.SetReadAllTensors(1) reader.SetReadAllVectors(1) reader.Update() vtk_mesh = reader.GetOutputDataObject(0) elif filetype == "xdmf3": reader = vtk.vtkXdmf3Reader() reader.SetFileName(filename) reader.SetReadAllColorScalars(1) reader.SetReadAllFields(1) reader.SetReadAllNormals(1) reader.SetReadAllScalars(1) reader.SetReadAllTCoords(1) reader.SetReadAllTensors(1) reader.SetReadAllVectors(1) reader.Update() vtk_mesh = reader.GetOutputDataObject(0) else: assert filetype == "exodus", "Unknown file type '{}'.".format(filename) reader = vtk.vtkExodusIIReader() reader.SetFileName(filename) vtk_mesh = _read_exodusii_mesh(reader) # Explicitly extract points, cells, point data, field data points = numpy.copy( numpy_support.vtk_to_numpy(vtk_mesh.GetPoints().GetData())) cells = _read_cells(vtk_mesh) point_data = _read_data(vtk_mesh.GetPointData()) field_data = _read_data(vtk_mesh.GetFieldData()) cell_data = _read_data(vtk_mesh.GetCellData()) # split cell_data by the cell type cd = {} index = 0 for cell_type in cells: num_cells = len(cells[cell_type]) cd[cell_type] = {} for name, array in cell_data.items(): cd[cell_type][name] = array[index:index + num_cells] index += num_cells cell_data = cd return Mesh(points, cells, point_data=point_data, cell_data=cell_data, field_data=field_data)
def RunTest(): fail = False print "TEST SET 1 - verify reader/writer work for range of canonical datasets" print MemUsage("Before starting TEST SET 1") dog = vtk.vtkDataObjectGenerator() i = 0 for testObject in testObjects: fileName = "xdmfIOtest_" + str(i) print "Test vtk object", testObject dog.SetProgram(testObject) dog.Update() TestXdmfConversion(dog.GetOutput(), fileName) i += 1 print "TEST SET 2 - verify reader/writer work for Graphs" print MemUsage("Before starting TEST SET 2") print "Test Graph data" gsrc = vtk.vtkRandomGraphSource() gsrc.DirectedOn() gsrc.Update() gFilePrefix = "xdmfIOtest_Graph" gFileName = OutputDir + gFilePrefix + ".xdmf" ghFileName = OutputDir + gFilePrefix + ".h5" xWriter = vtk.vtkXdmf3Writer() xWriter.SetLightDataLimit(LightDataLimit) xWriter.SetFileName(gFileName) xWriter.SetInputConnection(0, gsrc.GetOutputPort(0)) timer.StartTimer() xWriter.Write() timer.StopTimer() print "vtkXdmf3Writer took", timer.GetElapsedTime(), "seconds to write",\ gFileName xReader = vtk.vtkXdmf3Reader() xReader.SetFileName(gFileName) xReader.Update() rOutput = xReader.GetOutputDataObject(0) fail = DoDataObjectsDiffer(gsrc.GetOutputDataObject(0), xReader.GetOutputDataObject(0)) if fail: raiseErrorAndExit("Failed graph conversion test") if not DoFilesExist(gFileName, ghFileName, None, CleanUpGood): raiseErrorAndExit("Failed to write Graph file") print "TEST SET 3 - verify reader/writer handle time varying data" print MemUsage("Before starting TEST SET 3") print "Test temporal data" tsrc = vtk.vtkTimeSourceExample() tsrc.GrowingOn() tsrc.SetXAmplitude(2.0) tFilePrefix = "xdmfIOTest_Temporal" tFileName = OutputDir + tFilePrefix + ".xdmf" thFileName = OutputDir + tFilePrefix + ".h5" xWriter = vtk.vtkXdmf3Writer() xWriter.SetLightDataLimit(LightDataLimit) xWriter.WriteAllTimeStepsOn() xWriter.SetFileName(tFileName) xWriter.SetInputConnection(0, tsrc.GetOutputPort(0)) timer.StartTimer() xWriter.Write() timer.StopTimer() print "vtkXdmf3Writer took", timer.GetElapsedTime(), "seconds to write",\ tFileName xReader = vtk.vtkXdmf3Reader() xReader.SetFileName(tFileName) xReader.UpdateInformation() oi = xReader.GetOutputInformation(0) timerange = oi.Get(vtk.vtkCompositeDataPipeline.TIME_STEPS()) ii = tsrc.GetOutputInformation(0) correcttimes = ii.Get(vtk.vtkCompositeDataPipeline.TIME_STEPS()) #compare number of and values for temporal range if len(timerange) != len(correcttimes): print "timesteps failed" print timerange, "!=", correcttimes raiseErrorAndExit("Failed to get same times") for i in xrange(0, len(correcttimes)): if abs(abs(timerange[i]) - abs(correcttimes[i])) > 0.000001: print "time result failed" print timerange, "!=", correcttimes raiseErrorAndExit("Failed to get same times") #exercise temporal processing and compare geometric bounds at each tstep indices = range(0, len(timerange)) + range(len(timerange) - 2, -1, -1) for x in indices: xReader.GetExecutive().SetUpdateTimeStep(0, timerange[x]) xReader.Update() obds = xReader.GetOutputDataObject(0).GetBounds() tsrc.GetExecutive().SetUpdateTimeStep( 0, timerange[x] + 0.0001) #workaround a precision bug in TSE tsrc.Update() ibds = tsrc.GetOutputDataObject(0).GetBounds() print timerange[x], obds for i in (0, 1, 2, 3, 4, 5): if abs(abs(obds[i]) - abs(ibds[i])) > 0.000001: print "time result failed" print obds, "!=", ibds raiseErrorAndExit("Failed to get same data for this timestep") fail = DoFilesExist(tFileName, thFileName, None, CleanUpGood) if not fail: raiseErrorAndExit("Failed Temporal Test") print MemUsage("End of Testing")
def read(filetype, filename): # pylint: disable=import-error import vtk from vtk.util import numpy_support def _read_data(data): '''Extract numpy arrays from a VTK data set. ''' # Go through all arrays, fetch data. out = {} for k in range(data.GetNumberOfArrays()): array = data.GetArray(k) if array: array_name = array.GetName() out[array_name] = numpy.copy( vtk.util.numpy_support.vtk_to_numpy(array) ) return out def _read_cells(vtk_mesh): data = numpy.copy(vtk.util.numpy_support.vtk_to_numpy( vtk_mesh.GetCells().GetData() )) offsets = numpy.copy(vtk.util.numpy_support.vtk_to_numpy( vtk_mesh.GetCellLocationsArray() )) types = numpy.copy(vtk.util.numpy_support.vtk_to_numpy( vtk_mesh.GetCellTypesArray() )) vtk_to_meshio_type = { vtk.VTK_VERTEX: 'vertex', vtk.VTK_LINE: 'line', vtk.VTK_TRIANGLE: 'triangle', vtk.VTK_QUAD: 'quad', vtk.VTK_TETRA: 'tetra', vtk.VTK_HEXAHEDRON: 'hexahedron', vtk.VTK_WEDGE: 'wedge', vtk.VTK_PYRAMID: 'pyramid' } # `data` is a one-dimensional vector with # (num_points0, p0, p1, ... ,pk, numpoints1, p10, p11, ..., p1k, ... # Translate it into the cells dictionary. cells = {} for vtk_type, meshio_type in vtk_to_meshio_type.items(): # Get all offsets for vtk_type os = offsets[numpy.argwhere(types == vtk_type).transpose()[0]] num_cells = len(os) if num_cells > 0: num_pts = data[os[0]] # instantiate the array arr = numpy.empty((num_cells, num_pts), dtype=int) # sort the num_pts entries after the offsets into the columns # of arr for k in range(num_pts): arr[:, k] = data[os+k+1] cells[meshio_type] = arr return cells if filetype in ['vtk', 'vtk-ascii', 'vtk-binary']: reader = vtk.vtkUnstructuredGridReader() reader.SetFileName(filename) reader.Update() vtk_mesh = reader.GetOutput() elif filetype in ['vtu', 'vtu-ascii', 'vtu-binary']: reader = vtk.vtkXMLUnstructuredGridReader() reader.SetFileName(filename) reader.Update() vtk_mesh = reader.GetOutput() elif filetype in ['xdmf', 'xdmf2']: reader = vtk.vtkXdmfReader() reader.SetFileName(filename) reader.Update() vtk_mesh = reader.GetOutputDataObject(0) elif filetype == 'xdmf3': reader = vtk.vtkXdmf3Reader() reader.SetFileName(filename) reader.Update() vtk_mesh = reader.GetOutputDataObject(0) else: assert filetype == 'exodus', \ 'Unknown file type \'{}\'.'.format(filename) reader = vtk.vtkExodusIIReader() reader.SetFileName(filename) vtk_mesh = _read_exodusii_mesh(reader) # Explicitly extract points, cells, point data, field data points = numpy.copy(numpy_support.vtk_to_numpy( vtk_mesh.GetPoints().GetData() )) cells = _read_cells(vtk_mesh) point_data = _read_data(vtk_mesh.GetPointData()) field_data = _read_data(vtk_mesh.GetFieldData()) cell_data = _read_data(vtk_mesh.GetCellData()) # split cell_data by the cell type cd = {} index = 0 for cell_type in cells: num_cells = len(cells[cell_type]) cd[cell_type] = {} for name, array in cell_data.items(): cd[cell_type][name] = array[index:index+num_cells] index += num_cells cell_data = cd return points, cells, point_data, cell_data, field_data
def RunTest(): fail = False print "TEST SET 1 - verify reader/writer work for range of canonical datasets" print MemUsage("Before starting TEST SET 1") dog = vtk.vtkDataObjectGenerator() i = 0 for testObject in testObjects: fileName = "xdmfIOtest_" + str(i) print "Test vtk object", testObject dog.SetProgram(testObject) dog.Update() TestXdmfConversion(dog.GetOutput(), fileName) i += 1 print "TEST SET 2 - verify reader/writer work for Graphs" print MemUsage("Before starting TEST SET 2") print "Test Graph data" gsrc = vtk.vtkRandomGraphSource() gsrc.DirectedOn() gsrc.Update() gFilePrefix = "xdmfIOtest_Graph" gFileName = OutputDir + gFilePrefix + ".xdmf" ghFileName = OutputDir + gFilePrefix + ".h5" xWriter = vtk.vtkXdmf3Writer() xWriter.SetLightDataLimit(LightDataLimit) xWriter.SetFileName(gFileName) xWriter.SetInputConnection(0, gsrc.GetOutputPort(0)) timer.StartTimer() xWriter.Write() timer.StopTimer() print "vtkXdmf3Writer took", timer.GetElapsedTime(), "seconds to write",\ gFileName xReader = vtk.vtkXdmf3Reader() xReader.SetFileName(gFileName) xReader.Update() rOutput = xReader.GetOutputDataObject(0) fail = DoDataObjectsDiffer(gsrc.GetOutputDataObject(0), xReader.GetOutputDataObject(0)) if fail: raiseErrorAndExit("Failed graph conversion test") if not DoFilesExist(gFileName, ghFileName, None, CleanUpGood): raiseErrorAndExit("Failed to write Graph file") print "TEST SET 3 - verify reader/writer handle time varying data" print MemUsage("Before starting TEST SET 3") print "Test temporal data" tsrc = vtk.vtkTimeSourceExample() tsrc.GrowingOn() tsrc.SetXAmplitude(2.0) tFilePrefix = "xdmfIOTest_Temporal" tFileName = OutputDir + tFilePrefix + ".xdmf" thFileName = OutputDir + tFilePrefix + ".h5" xWriter = vtk.vtkXdmf3Writer() xWriter.SetLightDataLimit(LightDataLimit) xWriter.WriteAllTimeStepsOn() xWriter.SetFileName(tFileName) xWriter.SetInputConnection(0, tsrc.GetOutputPort(0)) timer.StartTimer() xWriter.Write() timer.StopTimer() print "vtkXdmf3Writer took", timer.GetElapsedTime(), "seconds to write",\ tFileName xReader = vtk.vtkXdmf3Reader() xReader.SetFileName(tFileName) xReader.UpdateInformation() oi = xReader.GetOutputInformation(0) timerange = oi.Get(vtk.vtkCompositeDataPipeline.TIME_STEPS()) ii = tsrc.GetOutputInformation(0) correcttimes = ii.Get(vtk.vtkCompositeDataPipeline.TIME_STEPS()) #compare number of and values for temporal range if len(timerange) != len(correcttimes): print "timesteps failed" print timerange, "!=", correcttimes raiseErrorAndExit("Failed to get same times") for i in xrange(0, len(correcttimes)): if abs(abs(timerange[i])-abs(correcttimes[i])) > 0.000001: print "time result failed" print timerange, "!=", correcttimes raiseErrorAndExit("Failed to get same times") #exercise temporal processing and compare geometric bounds at each tstep indices = range(0,len(timerange)) + range(len(timerange)-2,-1,-1) for x in indices: xReader.UpdateTimeStep(timerange[x]) obds = xReader.GetOutputDataObject(0).GetBounds() tsrc.Update(timerange[x]+0.0001) #workaround a precision bug in TSE ibds = tsrc.GetOutputDataObject(0).GetBounds() print timerange[x], obds for i in (0,1,2,3,4,5): if abs(abs(obds[i])-abs(ibds[i])) > 0.000001: print "time result failed" print obds, "!=", ibds raiseErrorAndExit("Failed to get same data for this timestep") fail = DoFilesExist(tFileName, thFileName, None, CleanUpGood) if not fail: raiseErrorAndExit("Failed Temporal Test") print MemUsage("End of Testing")