ParaViewによるデータ可視化(簡易)


科学技術計算に携わっていると、計算結果の三次元情報を可視化したい場面に出くわすことがあります。その際に利用できる汎用オープンソースソフトウェアとしてParaViewが有名ですが、豊富な機能に対応していることもあってか「ちょっと触ってみる」ことが容易でない印象です。
ここでは、私が触ってみた時に必要だったことを簡潔にまとめました。

参考資料:XMLベースのvtk形式に関する覚書

非構造格子用XMLフォーマット:拡張子 .vtu

データ点が等間隔一様メッシュ上にない場合が非構造格子です。

sample.vtu
<?xml version='1.0' encoding='UTF-8'?>
<VTKFile xmlns='VTK' byte_order='LittleEndian' version='0.1' type='UnstructuredGrid'>
<UnstructuredGrid>
<Piece NumberOfCells='6' NumberOfPoints='7'>
<Points>
<DataArray NumberOfComponents='3' type='Float32' Name='points' format='ascii'>
  0   0   0
  1.0 0   0
  0   0.9 0
  0   0   0.93
  0.7 0   1
  1   1   1
  0.6 0.5 0.8
</DataArray>
</Points>
<PointData>
<DataArray NumberOfComponents='1' type='Float32' Name='temperature' format='ascii'>
  100.0 200.0 350.0 800.0 140.0 750.0 100.0
</DataArray>
<DataArray NumberOfComponents='1' type='Float32' Name='density' format='ascii'>
  40.0 90.0 55.0 10.0 99.0 3.0 70.0
</DataArray>
<DataArray NumberOfComponents='1' type='Float32' Name='density_bin' format='binary'>
HAAAAAAAIEIAALRCAABcQgAAIEEAAMZCAABAQAAAjEIcAAAA
</DataArray>
</PointData>
<Cells>
<DataArray type='Int32' Name='connectivity' format='ascii'>
  0    1
  0    2
  0    3
  1    2    3
  4    5
  6
</DataArray>
<DataArray type='Int32' Name='offsets' format='ascii'>
  2 4 6 9 11 12
</DataArray>
<DataArray type='UInt8' Name='types' format='ascii'>
  3 3 3 5 3 1
</DataArray>
</Cells>
</Piece>
</UnstructuredGrid>
</VTKFile>

NumberOfPointsでデータ点の数を、NumberOfCellsで表示要素の総数(点、線、面等の数の和)を指定します。

<Points><DataArray>...</DataArray></Points>の中でデータ点の座標を指定し、<PointData><DataArray>...</DataArray></PointData>では、各データ点での物理量を与えます。どちらもNumberOfPoints個のデータを指定します。
バイナリ形式でのデータ記述もできます<DataArray ... format='binary'>。Fortranのバイナリ出力はデータの前後にデータサイズ(バイト単位)を付加するので、その形式をそのままBase64に変換した結果を記述します。densitydensity_binには同一データをそれぞれasciibinary形式で格納しました。バイナリ形式を利用する利点の一つはファイルサイズの削減です。この例では、データの(10進数表記での)桁数が少ないのでバイナリの方がサイズが大きくなってしまいましたが、精度を一杯に利用した数値では、バイナリ形式の方がコンパクトです。それ以上に重要な利点は、データの解釈(パース)に要する時間が短くなることです。テキストデータは記述の自由度が高いので、それら値をParaViewが解釈する必要があり、特にデータ量が多くなるとこの負荷を無視できません。バイナリ形式はパースする必要がないので読み込み負荷が軽く、特に動画再生時の表示速度に良い影響を及ぼします。

<Cells>...</Cells>内で、上記のデータ点を使って表示要素(点、線、面等)を指定します。
<DataArray Name='connectivity'>...</DataArray>では、表示要素を構成するための点の並びを指定します。点の場合はその点の番号を、線分の場合は両端の二点、三角形の場合は三つの頂点を指定します。点の番号は0始まりです。この例では要素毎に改行していますが、改行は区切りではありません。区切りを指定するのは次の<DataArray Name='offset'>...</DataArray>です。最後の<DataArray Name='types'>...</DataArray>で表示要素を選択します。点は1、線分は3、三角形は5です。offsettypesNumberOfCells個ずつ並びます。

connectivityの列からoffset番目(1始まり)までの並びをとってきて、typesで指定された要素を表示する動作を、データがなくなるまで繰り返します。