はじめに
バイナリ形式でvtkファイルを出力する方法をまとめています。
アスキー形式よりもバイナリ形式のほうが読み込みが速いので、大規模計算結果の可視化の際にはバイナリ形式の使用を検討してみても良いかもしれません。
バイナリ形式VTKファイルの一例
バイナリ形式VTKファイルのサンプルコード(4x4x4の直方体メッシュを可視化するファイル)を次に示します1。
ここでは、バイナリ形式のデータをファイル末尾に記述するappend方式を採用しています。
<VTKFile type="UnstructuredGrid" version="0.1" byte_order="LittleEndian">
<UnstructuredGrid>
<Piece NumberOfPoints="125" NumberOfCells="64">
<Cells>
<DataArray type="Int32" Name="connectivity" format="appended" RangeMin="" RangeMax="" offset="0" />
<DataArray type="Int32" Name="offsets" format="appended" RangeMin="" RangeMax="" offset="2052" />
<DataArray type="UInt8" Name="types" format="appended" RangeMin="" RangeMax="" offset="2312" />
</Cells>
<Points>
<DataArray type="Float32" NumberOfComponents="3" format="appended" RangeMin="0" RangeMax="1e10" offset="2380" />;
</Points>
</Piece>
</UnstructuredGrid>
<AppendedData encoding="raw">
_NNNN????????????????????????????????????NNNN?????????????????????????????....
</AppendedData>
</VTKFile>
サンプルコードを観察すると、ヘッダ部分(UnstructuredGrid要素で囲まれた領域)とデータ部分(AppendedData要素で囲まれた部分)の2つに分かれていることがわかります。以下でそれぞれの役割について記載します。
ヘッダ部分について
ヘッダ部分では、可視化に必要な変数のデータサイズや名前を定義します。今回はappend方式を採用していることから、format属性でのappendタグの指定、offset属性でのオフセット値の指定が必要となります。
ここで、データ部分では変数ごとに総バイト数およびデータの中身をセットで記述することから、オフセット値は「4バイト+総バイト数」のように計算する必要があります。サンプルコードではconnectivity、offsets、types、pointsの4変数を定義していますが、各変数のオフセットは下記の表のように計算することができます。pointsの後に別変数を定義する場合にも、同様の方法でオフセット値を計算します。
変数名 | オフセット | データサイズ | 総バイト数(4バイト分含む) | 次変数のオフセット |
---|---|---|---|---|
connectivity | 0byte | 4bytes | 2052bytes(=4bytes+512x4bytes) | 2052bytes |
offsets | 2052bytes | 4bytes | 260bytes(=4bytes+64x4bytes) | 2312bytes |
types | 2312bytes | 1byte | 68bytes(=4bytes+64x1byte) | 2380bytes |
points | 2380bytes | 4bytes | 1504bytes(=4bytes+375x4bytes) | 3884bytes |
データ部分について
データ部分では、ヘッダ部分で定義した変数の値をバイナリ形式で記述します。encoding属性ではrawタグを指定します2。
続けてデータをバイナリ形式で記述しますが、下記の2点に注意する必要があります。
(1) 全データの先頭に「_(アンダーバー)」を記述すること(ただしアンダーバー分のバイト数はオフセット計算時に考慮しなくてよい)
(2) 各変数の先頭に総バイト数を4バイトで記述すること(サンプルコード中の「NNNN」がこれに相当)
サンプルコードを例にとると、下記のようになります。
_NNNN????????????????????????????????????NNNN?????????????????????????????....
↑ ↑ ↑ ↑ ↑
| | | | └ offsetsのデータ中身(バイナリ、256バイト)
| | | └ offsetsの総バイト数(バイナリ、4バイト)
| | └ connectivityのデータ中身(バイナリ、2048バイト)
| └ connectivityの総バイト数(バイナリ、4バイト)
└ アンダーバー
可視化
サンプルコードをparaviewで読み込むと、次のように可視化することができます。