レガシー形式の vtk ファイル (構造化されていないグリッドだと思います) が与えられました。それを処理する方法を知っているので、代わりに Python で読み込んで .npy ファイルを出力したいと思います。
このファイルは ATHENA からのダンプであり、座標とともに密度、速度、磁場が含まれています。
私は非常に手続き型のプログラマーなので、これらのオブジェクトはすべて混乱しています...
これが私が思いついた解決策です。トリックは 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')
VTK Python SDK を使用して、VTK ファイルからポリゴン データを numpy 配列に読み取るスクリプトを次に示します。
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
Paraviewを使用してみましたか?(http://www.paraview.org/)舞台裏で何が起こっているかを視覚的に把握し、さまざまな方法でファイルを出力できます。私はあなたのデータがどのようなものか見当がつかないので、これを提案します。http://www.vtk.org/Wiki/VTK/Examples/Pythonにも、あなたにぴったりの例があるかもしれません。個人的には、paraviewで遊んで、そこから行きます。
最新のリリースでは、yt プロジェクトhttp://yt-project.org/に ATHENA のサポートが含まれていることに注意してください。これは、python を使用してシミュレーション データを分析する方法であることを意味します。