0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

バイナリ形式VTKファイルの出力

Posted at

はじめに

バイナリ形式で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で読み込むと、次のように可視化することができます。
output.png

参考

  1. vtkファイルフォーマット(バイナリ形式)

  2. XMLベースのvtk形式に関する覚書

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?