物理量の空間分布を VTK ファイルに出力する [Julia]

数値計算で得られる結果は数値の列でしかないので,何かしらの方法で可視化しないといけないことが多い.2次元の簡単なものなら Excel でもいいが,3次元のデータとなると結構厄介である.幸いなことに ParaView という非常に高機能な可視化ソフトウェアがフリーで公開されており,たいていの可視化は ParaView ひとつで事足りる. www.paraview.org

ParaView が扱うファイルは VTK というフォーマットだが,これにはテキストベースの単純なもの(レガシーフォーマット)と XML ベースのフォーマットがある.自分でレガシーフォーマットを出力するプログラムを書くのも手だが,PythonC++ のライブラリが整備されているのでこれを使うとよい.Julia でも WriteVTK というパッケージがあるので,これを使うと比較的簡単に XML ベースの VTK ファイルを出力できる. github.com

WriteVTK の使い方は上のサイトに書いてあるとおりだが,ひとつ引っかかったのは何らかの(スカラー・ベクトル)量を座標を指定して出力する場合である.VTK ファイルではこのような場合,データセットのフォーマットとして Unstructured Grid(非構造格子)を指定する必要があるが,単に物理量の空間分布を可視化したい場合は構造要素(VTK ではセルという)の設定は不要である.ところが,WriteVTK では必ずセルの設定をしないといけないことになっている(Python, C++ のライブラリではどうだろう).調べてみると VTK_EMPTY_CELL という型があったので,結局以下のようにすれば通った.

vtkfile = vtk_grid(filename, x, y, z, [MeshCell(VTKCellTypes.VTK_EMPTY_CELL, Vector{Integer}(undef, 0))]);

あとは vtkfile["Velocity", VTKPointData()] = v などとして出力するデータを追加していけばよい.他に気をつけるところとしては,PointData としてベクトルを設定する場合,各ベクトルは各列に入れておく必要がある点だろうか.