22

I've been given a legacy format vtk file (I think its an unstructured grid) and I'd like to read it in with python and output a .npy file instead, since I know how to deal with that.

The file is a dump from ATHENA and so has density, velocity, magnetic field along with the coordinates.

I'm very much a procedural programmer, so all these objects are confusing...

4
  • 3
    Could you post a sample of this file's data? Commented Jul 30, 2012 at 19:04
  • There's PyEVTK for writing, but it doesn't support reading Commented Jul 30, 2012 at 19:07
  • Oh, from jterrace's link I see that it's a binary format. Bleh. Commented Jul 30, 2012 at 19:23
  • You may be able to read it with vtk.vtkPolyDataReader(), but writing to .npy, I have no clue. Commented Aug 8, 2012 at 18:58

6 Answers 6

22

Here is the solution that I came up with, the trick was turning on ReadAllVectorsOn().

import numpy
from vtk import vtkStructuredPointsReader
from vtk.util import numpy_support as VN

reader = vtkStructuredPointsReader()
reader.SetFileName(filename)
reader.ReadAllVectorsOn()
reader.ReadAllScalarsOn()
reader.Update()

data = reader.GetOutput()

dim = data.GetDimensions()
vec = list(dim)
vec = [i-1 for i in dim]
vec.append(3)

u = VN.vtk_to_numpy(data.GetCellData().GetArray('velocity'))
b = VN.vtk_to_numpy(data.GetCellData().GetArray('cell_centered_B'))

u = u.reshape(vec,order='F')
b = b.reshape(vec,order='F')

x = zeros(data.GetNumberOfPoints())
y = zeros(data.GetNumberOfPoints())
z = zeros(data.GetNumberOfPoints())

for i in range(data.GetNumberOfPoints()):
        x[i],y[i],z[i] = data.GetPoint(i)

x = x.reshape(dim,order='F')
y = y.reshape(dim,order='F')
z = z.reshape(dim,order='F')
Sign up to request clarification or add additional context in comments.

Comments

13

meshio (a project of mine) knows the VTK format, so you could simply

pip install meshio

and then

import meshio
mesh = meshio.read('file.vtk')
# mesh.points, mesh.cells, ...

3 Comments

can we save to .csv or .txt using meshio?
csv and txt are no mesh formats, so no, not out of the box. You can always read the data in and just dump it though.
@npm The coordinates and field data can be readily determined from the mesh: coords, data = mesh.points, mesh.point_data['<variable_name>']. It is then easy to write these to file in whatever format you wish
10

Here's a script that reads polygon data into numpy arrays from a VTK file using the VTK Python SDK:

import sys

import numpy
import vtk

reader = vtk.vtkPolyDataReader()
reader.SetFileName(sys.argv[1])
reader.Update()

polydata = reader.GetOutput()

for i in range(polydata.GetNumberOfCells()):
   pts = polydata.GetCell(i).GetPoints()    
   np_pts = numpy.array([pts.GetPoint(i) for i in range(pts.GetNumberOfPoints())])
   print np_pts

4 Comments

I have been able to get to the GetOutput() stage using vtkDataSetReader() instead of vtkPolyDataReader, but I am still confused about how to get the information out. GetNumberOfPoints and GetNumberOfCells seems to give me sensible numbers for how big I think the arrays should be, but I still don't know how to pull all the variables out. Is there a way to get information on what exactly the vtk has in it, and in what form? In an understandable way?
If you pick one of the files here people.sc.fsu.edu/~jburkardt/data/vtk/vtk.html I can try and help extract the format. There are so many different formats.
reader.IsFileStructuredPoints() returns 1, the other options return 0, so I'm going out on a limb and saying its a legacy vtk of Structured Points.
You probably want to use vtkStructuredPointsReader then?
6

Here's a short snippet for reading points from legacy VTK files:

import numpy as np
import vtk

filename = 'model.vtk'

reader = vtk.vtkGenericDataObjectReader()
reader.SetFileName(filename)
reader.Update()

points = np.array( reader.GetOutput().GetPoints().GetData() )

The variable points is an (N,2) or (N,3) array, where N is the number of points.

Comments

4

Have you tried using paraview? (http://www.paraview.org/) It can give you a visual idea of what is going on behind the scenes and can output the file in a number of different ways. I would suggest this as I don't have a clue what your data is like. http://www.vtk.org/Wiki/VTK/Examples/Python may also have an example that may fit the bill for you. Personally, I'd have a play with paraview and go from there.

1 Comment

I've used paraview before, or rather an add on to it called VISIT. However, I need to analyse what's in the file and do things like fft etc. and so simply visualizing it is not enough.
4

It should be mentioned that in its latest release, the yt project http://yt-project.org/ includes support for ATHENA, meaning that by all means this is way to analyze the simulation data using python.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.