paraviewにファイルを読み込ませる際に、VTKファイルがよく使用されます。VTKファイルとは、paraviewのもととなっているライブラリに読み込ませるためのファイル形式です。
ちなみに、VTK以外の拡張子もあります。例えば、.vtuや.vtiなどがあります。.vtuは非構造格子を表し、.vtiは構造格子を表します。
ここでは、構造を理解して読み書きできるようになるために、VTKのファイルの中身を解説します。
VTKファイルの種類
VTKファイルには種類があります。レガシーフォーマットとXMLフォーマットです。
レガシーフォーマット
レガシーフォーマットとは、その名の通り古いフォーマットです。直感的に書ける一方で、拡張性が低いという問題があります。例えば、必ずシリアル形式になる、つまり並列化ができない等です。それを対処したのがXMLフォーマットになります。
XMLフォーマット
XML形式は、HTMLに似た構造をとったファイル形式です。XML自体が拡張可能なマーク付け言語と呼ばれており、VTKに限らず様々なファイルのデータ形式として使用されます。
VTKファイルの構造
まずはファイル構造の大枠を見ていきます。今回はレガシーフォーマットの例を見てみましょう。
# vtk DataFile Version 2.0
DataTitle
ASCII
DATASET UNSTRUCTURED_GRID
POINTS 3 float
0 0 0
1 0 0
1 1 0
CELLS 1 4
3 0 1 2
CELL_TYPES 1
5
POINT_DATA 3
SCALARS point_data float
LOOKUP_TABLE default
0.0
1.0
2.0
CELL_DATA 1
SCALARS cell_data float
LOOKUP_TABLE default
1.0
出力結果は下記のような三角形になります。
XMLも形式に違いはあれど、大枠は変わりません。よって、まずは読みやすいレガシーフォーマットで全体像を掴んでいきましょう。
VTKファイルは、大きく分けて5つの要素で構成されています。
1.ファイルバージョンと識別子
# vtk DataFile Version 2.0
まずは、ファイルバージョンを指定します。基本的には、ここは手を付けなくても大丈夫です。私が知っている限り、バージョン4.1までは出ているようなので、古いバージョンなのが不安であれば、4.1に書き換えても大丈夫です。
2.ヘッダー
DataTitle
2行目は、ヘッダーなので自由記述です。ファイル名に書ききれなかった情報をここにメモしておくことができます。
3.ファイル形式
ASCII
3行目は、ファイルがアスキー形式かバイナリー形式で書かれたものか判別する部分です。バイナリー形式の場合は、BINARY
と書いてください。今回は、手入力でデータを入力しているのでアスキー形式です。もしプログラムから出力する場合は、バイナリー形式のほうがデータ容量の関係で都合が良かったりします。
4.データ構造
DATASET UNSTRUCTURED_GRID
POINTS 3 float
0 0 0
1 0 0
1 1 0
CELLS 1 4
3 0 1 2
CELL_TYPES 1
5
4行目はデータ構造に関する情報を入力します。構造格子の場合はSTRUCTURED_GRID
もしくはSTRUCTURED_POINTS
を使用します。構造格子の中でもSTRUCTURED_GRID
はセルの間隔が均一でない場合に使用します。よって、全ての節点の位置データが必要になります。一方でSTRUCTURED_POINTS
はセルの間隔が均一なので、格子幅だけ決めてやれば作成できます。
POINTS以降は節点位置の情報です。今回は非構造格子を指定したため、全ての節点とセルの情報を記入する必要があります。
POINTS 3 float
0 0 0
1 0 0
1 1 0
ここでは、節点位置を指定しています。1行目ではPOINTSの後に、節点の合計数、型を記入します。そして、2行目以降に各接点座標を追加していきます。
注意点として、一般的には反時計回りで節点を指定していくので、ここでも反時計回りになるように節点を指定しています。今回は関係ありませんが、面の表裏の情報が必要な場合は、反時計回りに節点を指定することで、手前の面を表とすることができます。
CELLS 1 4
3 0 1 2
ここではセルを指定します。1行目ではCELLSの後に、セルの合計数、各要素のデータ数を記入します。各要素のデータ数は、三角形なら4、四角形なら5、四面体なら5というように節点+1の数が与えられます。
2行目に各セルの情報を記入します。今回はセルは一つだけなので、1行しかありません。1つ目のデータは接点数を示しており、セルが3つの節点で構成されていることを示しています。残りはただの採番なので、0から順に反時計周りで番号を与えます。
CELL_TYPES 1
5
最後にセルタイプを記入します。1行目ではCELL_TYPESの後に、セルの数を記入します。今回はセルは一つしかないので、1となります。2行目では、セルタイプを三角形(5)に指定しています。よく使うメッシュのセルタイプは下記のとおりです。
- 点:1
- 三角:5
- 四角:9
- 四面体:10
- 六面体:12
5.データ属性
POINT_DATA 3
SCALARS point_data float
LOOKUP_TABLE default
0.0
1.0
2.0
CELL_DATA 1
SCALARS cell_data float
LOOKUP_TABLE default
1.0
5行目移行はデータ情報を記入します。今回は、節点データとセルデータを入力します。
POINT_DATA 3
SCALARS point_data float
LOOKUP_TABLE default
0.0
1.0
2.0
まずは節点データを指定します。1行目ではPOINT_DATAの後に、節点データ数を入力します。今回は、3つの点があるので、3を入力します。
2行目はスカラー、ベクトルデータを指定します。ベクトルデータの場合は、SCALARSの部分をVECTORSに変更します。その後のpoint_dataは好きな名前をつけられます。例えば、pressureやvelocityなどの名前をつけておくとわかりやすいです。最後のfloatは型を表します。
3行目はデータの指定方法です。デフォルトだと採番通りに上から順番に値を与えます。基本的にはこのままでOKです。
4行目以降に節点データを与えます。0番目の節点データ、1番目の節点データ、、と順番にデータが与えられます。今回は、0番目の節点には0を、1番目の節点には1を、2番目の節点には2を与えています。また、今回はスカラーデータなので各節点に対してデータが一つですが、ベクトルだと各接点に対してxyzの3つのデータを与える必要があります。
CELL_DATA 1
SCALARS cell_data float
LOOKUP_TABLE default
1.0
セルデータに関しては、ポイントデータと形式はほとんど同じなので、説明は省略します。
違いとしては、今回はセル数が一つなので1行目のセル数合計が1となっていることだけです。ちなみに今回はセルデータとして1を与えています。
おわりに
今回はレガシーフォーマットを例にVTKのファイル構造について解説しました。長くなったので、XMLフォーマットに関しては別で解説します。
youtubeもやってます。どうぞ。
参考:
https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf
http://penguinitis.g1.xrea.com/study/ParaView/VTK/VTK.html