注意
最新版のwgrib2 v3.1.1 だとトラブルなくインストールできました。以下の記事を参照ください。
TL;DR
makefile
の123,124行目をコメントアウトを外す。
export CC=gcc
export FC=gfortran
145行目でOpenMPを使わない設定にする。
USE_OPENMP=0
409行目と410行目の間に以下の行を追加
FTN_LEGACY:="-std=legacy -Wno-argument-mismatch"
はじめに
wgrib2とは、GRIB2形式のファイルの情報を見たり、プレーンバイナリやNetCDF等の他の形式に変換するプログラムです。2020年のメジャーアップデートでv3.0.0になったということで、「wgrib2 を macOS Mojave (v10.14) にインストールする」という記事をもとにインストールしようとしたところ、いくつか苦労する点があったので記録を残しておきます。
こちらのOSのバージョンは macOS Catalina v10.15.7 です。
gccとgfortranはHomeBrewでインストールしました:gcc version 10.2.0 (Homebrew GCC 10.2.0)
。
手順
指示通りに実行
はじめに、https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/のページからwgrib2.tgz.v3.0.0をダウンロードします。v2.0.8が25Mなのに対して、v3.0.0が173Mとファイルサイズが大きくなっており、その分ダウンロードに時間がかかります。
ファイルを解凍し、生成したgrib2フォルダに移動します。
$ tar xvf wgrib2.tgz.v3.0.0
$ cd grib2
makefile
を書き換えます。まずgccとgfortranを設定する行(123,124行目)をコメントアウトを外します。
#
# can uncomment following two lines to use gcc/gfortran
export CC=gcc
export FC=gfortran
#
# for OS-X: uncomment line for makefile -f scripts/makefile.darwin
#
v2の場合はこれで良かったのですが、v3の場合はまだ終わりません。下の行になにやらmacOSの場合はコメントを外せとの指示があります。darwin
でファイル内を検索すると773行目に該当する行が見つかるので、これもコメントアウトを外します。
# for OSX
export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CPPFLAGS="${wCPPFLAGS}" && ${MAKE} -f scripts/makefile.darwin
エラー発生その1 (-fopenmp)
いったんこの設定でmake
してみます。
$ make
# (略)
export LDFLAGS="-L/Users/ytakano/Downloads/grib2/lib" && cd "/Users/ytakano/Downloads/grib2/libpng-1.2.57" && export CPPFLAGS=" -I/Users/ytakano/Downloads/grib2/include -Wall -Wmissing-prototypes -Wold-style-definition -Werror=format-security -ffast-math -O3 -DGFORTRAN -fopenmp -fPIC -g -I/Users/ytakano/Downloads/grib2/jasper-1.900.1/src/libjasper/include " && make -f scripts/makefile.darwin
cc -I../zlib -W -Wall -O -funroll-loops -I/Users/ytakano/Downloads/grib2/include -Wall -Wmissing-prototypes -Wold-style-definition -Werror=format-security -ffast-math -O3 -DGFORTRAN -fopenmp -fPIC -g -I/Users/ytakano/Downloads/grib2/jasper-1.900.1/src/libjasper/include -c -o png.o png.c
clang: error: unsupported option '-fopenmp'
make[1]: *** [png.o] Error 1
make: *** [/Users/ytakano/Downloads/grib2/lib/libpng.a] Error 2
-fopenmp
がないというエラーが出ます。よく見るとコンパイラがgcc
ではなくcc
になっています。本来ならコンパイラを正しく設定すべきですが、該当箇所が見つからなかったので、makefile
の145行目でOpenMPを使わないように設定します。wgrib2の処理はIOメインであり、手元のMacbookで使う分にはそこまで影響はないと思っています。
USE_OPENMP=0 # 1
エラー発生その2 (Type mismatch)
もう一度make
します。
$ make clean
$ make
# (略)
gfortran -c -O3 -fPIC -g -fdefault-real-8 -fdefault-double-8 fftpack.f
# (略)
Error: Type mismatch in argument 'ifac' at (1); passed REAL(8) to INTEGER(4)
fftpack.f:22:72:
22 | CALL RFFTB1 (N,R,WSAVE,WSAVE(N+1),WSAVE(2*N+1))
| 1
Error: Type mismatch in argument 'ifac' at (1); passed REAL(8) to INTEGER(4)
fftpack.f:28:72:
28 | CALL RFFTI1 (N,WSAVE(N+1),WSAVE(2*N+1))
| 1
Error: Type mismatch in argument 'ifac' at (1); passed REAL(8) to INTEGER(4)
make[1]: *** [fftpack.o] Error 1
make: *** [/Users/ytakano/Downloads/grib2/lib/libsp_v2.0.2_d.a] Error 2
型のミスマッチでエラーになりました。検索してみるとwgrib2 compile questionsというページに、参考になりそうな記述があります。
Question: Warnings about parameter type mismatch in fftpack.f"?
Answer:
The file fftpack.f is was written to an old fortran standard
before you had an allocatable array and memory was at a premium.
To save space, a real work array was defined and used in some parts
of the code. The same array was used in other parts of the code
which needed an integer work array. You save memory by using the
same array in both places. It was common practice and the old
compilers didn't complain. Ignore the warnings.
fftpack.f
はFORTRAN77で書かれている古いコードなので、警告が出るけど無視してねということだそうです。今回は警告ではなくエラーが出ているので、FORTRAN77用のコンパイルオプションを付ければ動く気がします。sp_v2.0.2_d/Makefile
の中身を見てみるとFTN_LEGACY
というそれっぽいオプションが見当たります。
fftpack.o: fftpack.f
$(FC) $(FFLAGS) ${FTN_REAL8} ${FTN_LEGACY} $<
残念なことに、実行時のログを見ると中身は空のようです。このFTN_LEGACY
は
makefile
の342行目と373行目で見つかります。
FTN_LEGACY:="-std=legacy -Wno-argument-mismatch"
これらの行はifeq
節の中に書かれており、COMP_SYS
がgnu_linux
またはcygwin_win
の場合に実行され、gnu_mac
の場合は実行されません。それでは困るので、409行目と410行目の間にこの文を追記します。
私の環境では、以上の設定でmake
に成功しました。
$ ./wgrib2/wgrib2 -version
v3.0.0 9/2020 Wesley Ebisuzaki, Reinoud Bokhorst, John Howard, Jaakko Hyvätti, Dusan Jovic, Daniel Lee, Kristian Nilssen, Karl Pfeiffer, Pablo Romero, Manfred Schwarb, Gregor Schee, Arlindo da Silva, Niklas Sondell, Sam Trahan, George Trojan, Sergey Varlamov