ParaViewは, 科学技術各方面で利用されるデータ可視化ソフトです. 詳細はここにガッツリ書いてあるので,ここではさわりだけね.
ファイル形式
ParaViewはさまざまなデータ形式を読み込むことができます.が,まあ正式はVTKデータというものです.
の説明がリンク先に書いてあります.ま,初めてなんでLEGACY-VTKでいきましょう.XML-VTKは, もう少しC++に慣れてからの方が良いのでは?
とりあえず初めてということで,一番単純なのでいきましょう. main()で時々データを保存するように計画:
jacobi Solver(101,"jacobi_100.dat"); double e=1.0; int n=0; while ((e=Solver.step())>1e-10) { if (++n%100==0) { std::cout << "Step:Diff= " << n << " " << e << std::endl; Solver.vtk(n); } }
となると, jacobi.vtk(n)の仕様が確定したわけですね:
- 与えられた n でファイル名を作成する. 例えば data_0001200.vtk とか,そういう連番がつくようにする
- そのファイルに,現在のデータを書き出す
では実装:
#include <sstream> ... void vtk(int nstep) { //ファイル名を作成 std::ostringstream oss; oss << "vtk_" << std::setfill('0') << std::right << std::setw(6) << nstep << ".vtk"; //ファイルを作成 std::ofstream vout(oss.str()); vout << "# vtk DataFile Version 2.0" << std::endl << "ひゃっほう" << std::endl << "ASCII" << std::endl; //VTKファイルを書き出す.書き方は素人感満載のLEGACY-VTKファイルを参照 //Geometry指定 vout << "DATASET STRUCTURED_POINTS" << std::endl; vout << "DIMENSIONS " << U.size(0) << " " << U.size(1) << " " << 1 << std::endl; vout << "ORIGIN 0 0 0" << std::endl; vout << "SPACING " << 1.0/(U.size(0)-1) << " " << 1.0/(U.size(1)-1) << " " << 1.0 << std::endl; //DataSet指定 vout << "POINT_DATA " << U.size(0)*U.size(1) << std::endl; vout << "SCALARS U double" << std::endl; vout << "LOOKUP_TABLE default" << std::endl; for(int j=0;j<U.size(1);j++) for(int i=0;i<U.size(0);i++) vout << U(i,j) <<std::endl; }
これを実行すると, データフォルダーに
vtk_000100.vtk
vtk_000200.vtk
vtk_000300.vtk
...
という無数のファイルができるわけです.
ソフトウェアの使い方
ParaViewをインストールしたら,起動してファイルを読み込みます:
まあ色々クリックして遊ぶと覚えます.クリックしない場合・・・絶対覚えられませんね.一度も転倒しないで自転車に乗れた人は,もしかしたら頭で覚えられるのかもしれませんが.
例えば【ファイル】【アニメーションの保存】を選ぶと,
保存が完了したら,フォルダーに今度は my_video_0数字羅列.png が山盛りできているでしょう.これを連結してビデオにしてみましょう.
これは, FFMPEG が一番便利です.MacなのでiMovieも使えます.FFMPEGの場合は
ffmpeg -r 5 -i my_video.0%3d.png -pix_fmt yuv420p out.mp4
ここが数字の桁数で違う場合があるかもですが・・・まあ,こんな感じでまずOK. これで動画ファイル out.mp4 ができます.
open out.mp4
で,動画ファイルが開きます:
適当にトリムして保存してしまえばOKってわけです.