某院生が「金星のスーパーローテーションの数値解析」というテーマで修論を書いた。
ネットで、先行研究のシミュレーション・プログラム (BPmodel) が公開されていて、 院生はそれを元に自分が考えたモデルのシミュレーション・プログラムを作り、 シミュレーションに成功した。修論が書けました。めでたし、めでたし。
…と書くと簡単のようだけれど、 既存のプログラムを利用するのは、難しくなることも珍しくなく、 今回も結構大変だった。
一般論として、難しくなる理由として、次のものがあげられる。
今回は、1 については問題がなかった。 プログラム作者の修士論文、博士論文が公開されていて、 その中で詳細に説明されていた。 それなりに複雑な内容であるので、簡単ではなかったが、 そういうものをじっくり読んで理解するというのは、 修士の院生にとっては格好の勉強課題であった。
問題になったのは、もっぱら 2 であった。 そのプログラムは複数のライブラリィに依存していて、 次の問題が発生した。
正面から問題に対処するならば、それぞれ
それが理想であるが、今回はそうしなかった。 プログラムが曲がりなりにも make 出来て正しく動作すれば、 プログラムの理解の助けになるのだが、 動作させられないうちは、まず理解するのが難しいからである。
そういうわけで、次の方針を採用した。
おそらく、分かってしまえばどの問題点も小さな修正で済む (あるいは、 そもそも修正の必要もない) のであろうが、修正するにしても、 プログラムが動いてからの方が簡単であろう、と考えた。
以下、より具体的に述べる。 プログラム (BPmodel という名前、Fortran 90 で書かれている) は、 以下のライブラリィを利用していた。
NetCDF (Network Common Data Form) is a set of interfaces for array-oriented data access and a freely distributed collection of data access libraries for C, Fortran, C++, Java, and other languages. The netCDF libraries support a machine-independent format for representing scientific data. Together, the interfaces, libraries, and format support the creation, access, and sharing of scientific data.
gtool5 は, データ入出力をはじめ, 日付および時刻の操作やメッセージ出力, CPU 時間の計測など, Fortran 90/95 で書かれた数値モデルのための様々な機能を提供します. 特にデータ入出力については, 複数の人間が, 数値モデルから得られた計算結果に対する理解・認識を共有することを容易とするために, gtool4 netCDF 規約 に基づくデータの入出力が可能になっています.
以下、個別にコメントする。
(院生のコンピューター環境は、 ハードウェアが MacBook Air (2013) と iMac (2017), macOS が High Sierra である。)
ISPACK は、複数のバージョンが公開されているが、 どのバージョンも、プログラムは無修正できちんと make 出来て動作する (ようであった -- 少なくとも我々は問題は発見できなかった)。 BPmodel で利用されていたバージョンを選ぶだけで、ほぼ解決。 Mkinclude の中で、 SSE の選択肢が fort, sse32, sse64, avx と4つあった。 効率をあげるために、 アセンブリ言語で書かれたプログラムが提供されているわけだが、 fort が用意されていること、 またライブラリィのテスト・プログラムが用意されていることは、 動作チェックに非常に役立った (こういうところに好感を持った)。
curl -O https://www.gfd-dennou.org/arch/ispack/ispack-intelmac-0.96.tar.gz tar xzf ispack-intelmac-0.96.tar.gz cd ispack-intelmac-0.96Mkinclude を書き換える。 nkf -w --overwrite snpack/src/snt.Fpp(これは文字コードを UTF-8 にするというもので、あまり本質的ではない) make >& make.log sudo cp -p libisp.a /usr/local/lib/libisp096.a |
NetCDF は、とてもしっかりしたプロジェクトで開発されているようである。 過去のバージョン (細かくバージョン・アップしているので数が多い) もすべて入手可能である。 動作テストももかなり周到に行われるようである。 現在は version 4 系列が現役らしいが、 BPmodel は version 3 系列を使っていたらしい。 そのうちの最新版 (院生の作業当時) の netcdf-3.6.2 を採用した (古いものを使う必要があるのかは、実のところ良く分からなかった。 version 4系列は、make とチェックに手間がかかるようになっている、 ということはあった。)。 一部のプログラム (cxx/ncvalues.cpp, man/sfc_pres_temp_rd.cpp, examples/CXX/sfc_pres_temp_rd.cpp) に、#include <cstring> という行を入れる修正が必要だった (こんなのはすぐ分かるので、誤差のうち)。 ./configure --prefix=どこか適当な場所; make ですんなり make 出来た。
curl -O https://www.gfd-dennou.org/library/netcdf/unidata-mirror/old/netcdf-3.6.2.tar.gz tar xzf netcdf-3.6.2.tar.gz cd netcdf-3.6.2ここで、上に説明したプログラムの書き換えを行った後、 export CC=gcc export FC=gfortran export CXX=g++ export F90=gfortran ./configure --prefix=/usr/local/netcdf-3.6.2 >& configure.log make>&make.log make check>&make-check.log sudo make install>&make-install.log(こうして make すると、/usr/local/netcdf-3.6.2/bin に ncdump, ncgen という実行形式が出来る。 PATH を通すか、PATH の通っているところにシンボリック・リンクでも張る。) |
gtool5 について。 正しく理解できている自信がなく、以下に書くことは間違いかもしれない。 gtool5 は、 最初使っていた gfortran () では make 出来ないようである。 このあたりは明記されていないので (こちらが発見できないだけ?)、 状況証拠からの想像になるが、もともとは gfortran4 が使われていた? それで gfortran4 を試すべきと考えられたが、 我々が使っていた Mac Ports (macOS は High Sierra とか) では、 gfortran4 はもう使えないようになっていた。 試しに macOS を古いものに戻して gfortran 4 をインストールしたところ、 gtool5 の make と動作 test に成功した。 MacPorts ではなく Homebrew を使えば、 最近の macOS にも、 gfortran4 (Version 4.9.4) がインストール出来ることに気づいて (「High Sierra で gfortran 4.9 を使う」)、 山を超えることが出来た。
curl -O https://www.gfd-dennou.org/library/gtool/gtool5/gtool5-20101228-1.tgz tar xzf gtool5-20101228-1.tgz cd gtool5-20101228-1 export CC=gcc export FC=gfortran export CXX=g++ export F90=gfortran export CPPFLAGS=-I/usr/local/netcdf-3.6.2/include ./configure --prefix=/usr/local/gtool5-20101228-1 --with-netcdf=/usr/local/netcdf-3.6.2/lib/libnetcdf.a>&configure.log make>&make.log nkf -w --overwrite test/*.f90 make test>&make-test.log sudo make install>&make-install.log |
BPmodel のプログラムそのものについて、 院生の環境 (macOS HighSierra, gcc&g++&gfortran 4.94) で make & 実行さ せるために、少し書き換えた (参考までにパッチを http://nalab.mind.meiji.ac.jp/~mk/misc/20190514/bpmodel-20190514.patchに置いておく)。
参考までに Makefile (ライブラリィを上に書いたようにインストールしてある場合のもの) も http://nalab.mind.meiji.ac.jp/~mk/misc/20190514/Makefileに置いておく。
curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/20190514/bpmodel-20190514.patch mkdir bpmodel cd bpmodel for i in BPM2D.f90 BPM2D-stiff.f90 module_BPM2D.f90 wrap_lj.f90 BPM3D_omp.f90 module_BPM3D_omp.f90 wrap_sj.f90 DataConversion-sj.f90 do curl -O http://www.gfd-dennou.org/member/hiroki/file/BPmodel/${i} done patch -p1 < ../bpmodel-20190514.patch curl -O http://nalab.mind.meiji.ac.jp/~mk/misc/20190514/Makefile make |
桂田 祐史