dynamicsoar's log

主に研究関係のメモ

How to install & use VTKFortran (2022-03)

まえがき

リンク

環境

  • 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)を pythonXML 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 にドロップすると開ける。

f:id:dynamicsoar:20220301213218p:plain
visualisation of a vtm test in VTKFortran (as of 2022-03-01)

利用

(かきかけ)

概要

基本的にサンプルコードを改変すればうまくいく。

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 だけで。容量や速度的にバイナリより悪いだろうけど、とりあえずこれでいいかも…

*1:もちろん自分の python スキルが足りないのだろうが、そこは置いておく。