8 ある古いプログラム (BPmodel) の make の記録

某院生が「金星のスーパーローテーションの数値解析」というテーマで修論を書いた。

ネットで、先行研究のシミュレーション・プログラム (BPmodel) が公開されていて、 院生はそれを元に自分が考えたモデルのシミュレーション・プログラムを作り、 シミュレーションに成功した。修論が書けました。めでたし、めでたし。

…と書くと簡単のようだけれど、 既存のプログラムを利用するのは、難しくなることも珍しくなく、 今回も結構大変だった。

一般論として、難しくなる理由として、次のものがあげられる。

  1. “ドキュメント” が不十分であることが少なくない。
  2. プログラミング言語、ライブラリィ、コンパイラーの仕様が変わっている。 利用できなくなっている場合もある。

今回は、1 については問題がなかった。 プログラム作者の修士論文、博士論文が公開されていて、 その中で詳細に説明されていた。 それなりに複雑な内容であるので、簡単ではなかったが、 そういうものをじっくり読んで理解するというのは、 修士の院生にとっては格好の勉強課題であった。

問題になったのは、もっぱら 2 であった。 そのプログラムは複数のライブラリィに依存していて、 次の問題が発生した。

(a)
現在では保守されていない(?)ライブラリィがあった
(b)
バージョンが変わって仕様が変わっていた
(古いバージョンは現在標準的なコンパイラーでコンパイルできなかった)

正面から問題に対処するならば、それぞれ

(a)
現在利用できないライブラリィは代替物を探し、 それを利用するようにプログラムを書き換える
(b)
現在利用されているバージョンの仕様に合うようにプログラムを書き換える
とするのであろう。

それが理想であるが、今回はそうしなかった。 プログラムが曲がりなりにも make 出来て正しく動作すれば、 プログラムの理解の助けになるのだが、 動作させられないうちは、まず理解するのが難しいからである。

そういうわけで、次の方針を採用した。

プログラムが利用するライブラリィ等を 出来る限り当時 (10年近く前) のものにそろえて(とにかく)動かす。

おそらく、分かってしまえばどの問題点も小さな修正で済む (あるいは、 そもそも修正の必要もない) のであろうが、修正するにしても、 プログラムが動いてからの方が簡単であろう、と考えた。

以下、より具体的に述べる。 プログラム (BPmodel という名前、Fortran 90 で書かれている) は、 以下のライブラリィを利用していた。

  1. ISPACK -- 主にスペクトル法の計算に役立つサブルーチン集
  2. NetCDF -- その内容は、WWW サイトによると
    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.
  3. gtool5 -- その内容は、WWW サイトによると
    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.96
Mkinclude を書き換える。
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/binncdump, ncgen という実行形式が出来る。 PATH を通すか、PATH の通っているところにシンボリック・リンクでも張る。)

gtool5 について。 正しく理解できている自信がなく、以下に書くことは間違いかもしれない。 gtool5 は、 最初使っていた gfortran$ x$ ($ x=5,6,7,8$) では 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

桂田 祐史
2020-04-20