How to install & use VTKFortran (2022-03)
まえがき
リンク
- https://github.com/szaghi/VTKFortran ←これがVTKFortran
- VTKFortranをWindowsでビルドする - Qiita ← 時間経過でファイル名などが微妙に変わってるけど非常に参考になる
環境
- Ubuntu 20.04 LTS on WSL2 (Windows 10 Pro 21H2)
- Intel Fortran Compiler 2021.5.0(今回メインで使いたい)
- gfortran 9.3.0(今回はほぼ使わず)
モチベーション
Fortran で VTK を保存したい。Legacy は計算工学会の連載( https://www.jsces.org/activity/journal/web_vol26no1_tutorial.pdf など)を参考に自分で書いたけど、これでは結局マルチブロックオーバーセットのための vtm.series を使えないことに気づいて絶望…。XML VTK を吐き出すには結局ライブラリ(公式でもサードでも)使うべきということで探したらこれがあった。
なお、計算工学会の方では其の五で公式ライブラリを C++ でコンパイルしてそこにアクセスしろみたいな感じのことが書いてたけど試してない。もしかしたらそっちの方がいいかも。公式だし…。
ところで python で動くので良ければ他にあるのは知ってて pyevtk を使っての Plot3D から XML VTK の変換は普通にできていた。でも「Fortran の CFD が吐き出したメッシュと流れ場(自分の場合 Plot3D)を python で XML VTK に変換」ってすると python の変換部分が死ぬほど遅くて嫌になった*1。計算中に直接VTK出した方がいいじゃんと。
Download
VTKFortran のドキュメント https://github.com/szaghi/VTKFortran/wiki/Download を信じてそのとおりに、
git clone https://github.com/szaghi/Lib_VTK_IO
とやると、./src/thrid_party/
以下の submodules がインストールされない。git (github?) のこの仕組みをよくわかってないけど同じ作者の他のレポジトリを参照してるようだ。…という話はフォーラムを見ないとわからない→ https://github.com/szaghi/VTKFortran/issues/26#issuecomment-797308540
んで結局のところ、
git clone --recurse-submodules -j8 git://github.com/szaghi/Lib_VTK_IO
でよい(How to "git clone" including submodules? - Stack Overflow を参考にした)。
Installation
FoBiS.py のインストール
まず先に同じ作者が作った依存関係ソルバ?みたいな FoBiS.py というのを入れておくのがいいらしい → GitHub - szaghi/FoBiS: FoBiS.py, Fortran projects Building System for poor people
面倒なので自分は PyPI Installation, the Python Package Index · szaghi/FoBiS Wiki · GitHub にあるように pip で
cd ~
pip install FoBiS.py
と入れた。
さて、この直後に https://github.com/szaghi/VTKFortran/wiki/Compile にあるとおりに動作確認として
FoBiS.py build -lmodes
と打ち込むと、ドキュメントにあるような
The fobos file defines the following modes: - "shared" - "static" - "test-driver" - "shared-debug" - "static-debug" - "test-driver-debug"
ではなく、
The fobos file defines the following modes: - "shared-gnu" - "static-gnu" - "tests-gnu" - "shared-gnu-debug" - "static-gnu-debug" - "tests-gnu-debug" - "shared-intel" - "static-intel" - "tests-intel" - "shared-intel-debug" - "static-intel-debug" - "tests-intel-debug"
が表示される。ここもドキュメントの記述が古い…。
VTKFortran のインストール (compile)
というわけで、
cd Lib_VTK_IO
はいいとして、ドキュメントどおりに
FoBiS.py build -mode static
とかやってもそんなオプションはない、と言われて終わる。ひどい。
FoBiS.py build -mode static-intel
とかやるのが正解。なんだが、Global name too long
とか出てるな…大丈夫なのかこれ…
Test
prep.
インストール後のテストは VTKFortranをWindowsでビルドする - Qiita にだいたい書いてあるけど、この記事時点と微妙に変わってるようなので一応書いておく。
まずそもそもの親ディレクトリ名がデフォルトだと VTKFortran
ではなく Lib_VTK_IO
となっていた。それはいいとして、上記記事のとおりに
Lib_VTK_IO ├── src │ └── main.f90 ├── include │ └── *.mod └── lib └── libvtkfortran.a
と配置する。
また、テストファイルも /src/main.f90
というものはなく、以下のようになっている:
maz@mazSCAN:~/Lib_VTK_IO$ ll ./src/tests/ total 52 drwxr-xr-x 2 maz maz 4096 Mar 1 14:12 ./ drwxr-xr-x 5 maz maz 4096 Mar 1 14:12 ../ -rw-r--r-- 1 maz maz 507 Mar 1 14:12 vtk_fortran_use_module_basic.f90 -rw-r--r-- 1 maz maz 5205 Mar 1 14:12 vtk_fortran_write_pvts.f90 -rw-r--r-- 1 maz maz 8710 Mar 1 14:12 vtk_fortran_write_volatile.f90 -rw-r--r-- 1 maz maz 3654 Mar 1 14:12 vtk_fortran_write_vtm.f90 -rw-r--r-- 1 maz maz 3652 Mar 1 14:12 vtk_fortran_write_vtr.f90 -rw-r--r-- 1 maz maz 3033 Mar 1 14:12 vtk_fortran_write_vts.f90 -rw-r--r-- 1 maz maz 4150 Mar 1 14:12 vtk_fortran_write_vtu.f90
vts (structured grid)
vts(構造格子)用のテストは vtk_fortran_write_vts.f90
だ。自分の場合は ifort を使いたいので、
$ ifort ./src/tests/vtk_fortran_write_vts.f90 -Iinclude -Llib -lvtkfortran $ ./a.out
とすると、XML_STRG-raw.vts
および XML_STRG-binary.vts
が出てきた。どっちかを ParaView にドロップすると開ける。
Qiita と同じような表示をするには、Contour
を出してから Isosurfaces を一旦 Remove して(赤いバツマーク)、Add a range of values(メモリみたいなアイコン)を Generate するとよい。
vtm (multiblock)
同様に、マルチブロック用のテストは vtk_fortran_write_vtm.f90
なので、
$ ifort ./src/tests/vtk_fortran_write_vtm.f90 -Iinclude -Llib -lvtkfortran $ ./a.out
とする。すると、XML_STRG.vtm
および XML_STRG-01.vts
... XML_STRG-04.vts
が出てくる。XML_STRG.vtm
を ParaView にドロップすると開ける。
利用
(かきかけ)
概要
基本的にサンプルコードを改変すればうまくいく。
VTK xml 用のモジュールには以下の4つを作った:
private :: write_data !! サンプルコードを改変 public :: write_vts_xml_multi !! サンプルコードを改変 public :: write_vtm !! 自作 public :: write_vtm_series !! 自作 public :: write_vtm_series_finalise !! 自作
要は vts だけ VTKFortran で書き出して、vtm や vtm.series は自分で書いてみた。 vtm も VTKFortran が提供してるっぽかったけど覚えるのが面倒で…
コンパイルと実行
実際にはちょっと違うけど、概ね、
$ ifort ./src/main.f90 -xHost -qopenmp -Iinclude -Llib -lvtkfortran $ export OMP_NUM_THREADS=6 $ time nohup ./a.out > log.txt 2>&1 &
のような感じで。
ところで XML VTK "ASCII" でよくね?
研究室の計算機が古くて、ライブラリのインストールができなさそうだった。そこでふと、ASCII ならライブラリとかいらなくね?と思っていつものVTK公式PDFと PENGUINITIS - VTK ファイルフォーマット を横目に見ながら書いてみたらアッサリできてしまった。Frotran だけで。容量や速度的にバイナリより悪いだろうけど、とりあえずこれでいいかも…