41 FreeFem++ に藤原(PDF)パッチ当てて使う, plotPDF() (MacPorts を導入している Mac で make した記録)

(しばらく工事中。一応 Intel Mac 向けにも M1 Mac 向けにもコンパイルできて、 make check も通ったけれど。まだ良く分かっていないところがある。)

日本応用数理学会の講演で、FreeFem++ の plot() に、 PDF/SVG 出力機能を追加するというパッチの話を聞いた (「FreeFEMにおける2次元数値計算結果のPDFファイル出力の機能拡張」 藤原 宏志(京都大学))。 PDF出力はぜひ欲しかった機能なので早速試してみることにした。

PDF/SVG output by the built-in plot() command

パッチは、 「FreeFEM Programs」 に公開されている。 これはソースプログラムへのパッチなので、 利用するには、FreeFem++ のソースプログラムを入手して、 それにパッチを当ててから make する必要がある。

1. 事前準備     まず必要なコマンドを ”確認&なければインストール” する。
sudo port install gcc12
sudo port select --set gcc mp-gcc12
あるいは
sudo port install gcc-devel
sudo port select --set gcc mp-gcc-devel
(gcc-devel と gcc12 のどちらを選択すべきか良く分からない。 M1 については gcc-devel の方が良いこともある印象があったけれど、 最近は gcc12 で十分で、総合的に見てそちらを選択するのが良いのか? と考えている。)

それから

sudo port install autoconf
sudo port install automake
sudo port install gmake
Fortran コンパイラーが必要なこともあるので、実際上 gcc が必須である (gcc に gfortran が含まれている)。 autoconf と automake がないと configure がうまく行かない (そもそも configure 自体が配布されていない)。 gmake は macOS にあるが (/usr/bin/make)、 それは古いので configure に警告される。

ライブラリィについても色々注意が必要そうである。 私は hdf5 関係でハマった。 hdf5 については、Python 関係でインストールしてあるものが configure に発見され、 そちらを使ってコンパイルするような Makefile が生成され、 Intel Mac では大丈夫だったが、M1 Mac ではCPU 関係の不適合があってエラーになった (これは Intel 用のコードの入っているライブラリィがあったためらしく、 私の環境整備が不十分ということかもしれない)。 (2022/9/11追記 他に gsl も入れておくべきらしい。) こういうのはなかなか悩ましい。 configure に見つからないようにしてから configure を実行するものか。
sudo port install hdf5
sudo port install gsl
mv ~/opt ~/opt2
(/opt をどけるのは安直な対策だ…後で元に戻す。 そのうちもっとスマートな方法を探すつもり。)

2. FreeFem++ のソースプログラムの準備     最近 FreeFem++ のWWWサイトを見ると、GitHub から入手せよ、となっているようだけど… パッチは FreeFem-sources-4.11.tar.gz をターゲットにしているようだ。 入手する場合は
curl -OL https://github.com/FreeFem/FreeFem-sources/archive/refs/tags/v4.11.tar.gz
mv v4.11.tar.gz FreeFem-sources-4.11.tar.gz
tar xzf FreeFem-sources-4.11.tar.gz
cd FreeFem-sources-4.11
一方、GitHub FreeFem/FreeFem-sources から入手する場合は
git clone https://github.com/FreeFem/FreeFem-sources.git
cd FreeFem-sources

3. 小さな準備     後で実行する make petsc-slepc はシステムの領域に書き込もうとするので、 管理者権限が必要になる。 作業全体を管理者権限で実行するのはオススメできないので、 あらかじめディレクトリィを用意して、 コンパイル作業を実行するユーザーをオーナーにしておく。
#sudo rm -rf /usr/local/ff-petsc
sudo mkdir -p /usr/local/ff-petsc/{r,c}
sudo chown -R $USER /usr/local/ff-petsc

4. コンパイル作業     コンパイル作業の大まかな流れは GitHub の README.md に書いてある。 以下はそれに沿っての作業。

/Users/mk/.tex-inputs/knowhow-2022-fig/compile.sh

(2022/11/20追記) 入手できるようにしておく。 https://m-katsurada.sakura.ne.jp/misc/20221120/compile.sh

ログを残すようにしている。進展状況をみるには、別にターミナルを開いて、 例えば make.log の場合
tail -f make.log
とすれば良い。

make check の結果、全て PASS したことを確認する。
grep '^# ' make-check.log
grep '^# ' make-check.log | grep ERROR
grep '^# ' make-check.log | grep -v PASS | grep -v TOTAL|grep -v 0
上に書いた hdf5, gsl 関係の対応をした後は、ERROR 0, SKIP 1 でスッキリ通った。 PARDISO.edp だけはスキップされている (PARDISO はフリーでないから、という理解で正しいか?)。

5. インストール作業    
sudo make install
こうしてインストールすると、 /Applications/FreeFem++.app 以外に、 /usr/local/share/FreeFEM, /usr/local/lib/ff++, /usr/local/ff-petsc というディレクトリィ, さらに /usr/local/bin に以下のプログラムがコピーされる。 ff-pkg-download, FreeFem++, FreeFem++-nw, ff-get-dep, ff-mpirun, cvmsh2, FreeFem++-CoCoa, ffmaster, FreeFem++-mpi, ffglut, ffmedit, bamg, ff-c++.

plotPDF : Save Numerical Solutions/Mesh/Indices to PDF file

plotPDF() という新規関数をダイナミック・モジュールとして実現したものが (上と同じ) http://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/ff++-programs/ で公開されている。色々な情報を PDF として出力してくれる。


(2022/10/16追記) plotPDF はダイナミック・モジュールなので、 FreeFem++ のコンパイルし直しは必要がないかと思っていたが、 試しにやってみたらうまく行かなかった。忙しかったので追求していないけれど、 そのうちまたやってみる。

ソースプログラム入手、コンパイル、インストール
curl -O http://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/ff++-programs/plotPDF-20220907.cpp
ff-c++ -std=c++11 plotPDF-20220907.cpp -lz
sudo cp -p plotPDF-20220907.dylib /usr/local/lib/ff++/4.11/lib/plotPDF.dylib
(plot() の機能拡張と比べて簡単でいいですね。)

(2022/10/16追記) ファイルが更新されていた。 http://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/ff++-programs/plotPDF-20221011.cppこちらでも無事動作した。

サンプル・プログラムの実行
curl -O http://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/ff++-programs/plotPDF-sample.edp
FreeFem++ plotPDF-sample.edp
終了後に LshapeP1.ps, LshapeP1.pdf, LshapeP1contour.pdf, LshapeWithMesh.pdf, LshapeP1op1.pdf, LshapeP1op2.pdf, LshapeP0.pdf, LshapeP1nc.pdf, LshapeP2.pdf, LshapeP2asP1.pdf, vector.pdf というファイルが出力される。 open Lshape*.pdf でプレビューできる。

         
Lshape2.pdf (3ページそれぞれ)

plotPDF() の使い方
  bool plotPDF( mesh Th, PDFFilename [, options] );
  bool plotPDF( Vh u, mesh Th, PDFFilename [, options] );
  bool plotPDF( Vh<complex> u, mesh Th, PDFfilename [, options] );
  bool plotPDF( [Vh u, Vh v], mesh Th, PDFFilename [, options] );
新しく用意された便利な option 群が重要であるが、 それについての説明は http://www-an.acs.i.kyoto-u.ac.jp/~fujiwara/ff++-programs/を見よ。


これらの機能が本家に統合されると良いですね。


それにしても、ff-c++ のドキュメントってないのかな。 シェル・スクリプトだから、中身を読んで理解しろ、と言うことか?


(2022/12/23追記) 2週間ほど前に version 4.12 がリリースされたが、PDF/SVG 出力機能が取り込まれた。 大変めでたいことだけれど、Mac 用のバイナリーが提供されていない。 うーん。Hecht 先生いないと大変だ。

桂田 祐史