wgrib2 v3.0.0 を macOS Catalina にインストールする

# 注意
最新版のwgrib2 v3.1.1 だとトラブルなくインストールできました。以下の記事を参照ください。

https://qiita.com/wm-ytakano/items/753c4cb6e1862f2d173b

# TL;DR
`makefile`の123,124行目をコメントアウトを外す。

```Makefile
export CC=gcc
export FC=gfortran
```

145行目でOpenMPを使わない設定にする。

```makefile
USE_OPENMP=0
```

409行目と410行目の間に以下の行を追加

```makefile
FTN_LEGACY:="-std=legacy -Wno-argument-mismatch"
```

# はじめに
[wgrib2](https://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/)とは、GRIB2形式のファイルの情報を見たり、プレーンバイナリやNetCDF等の他の形式に変換するプログラムです。2020年のメジャーアップデートでv3.0.0になったということで、「[wgrib2 を macOS Mojave (v10.14) にインストールする](https://qiita.com/kanaya/items/288f26b359e8e0161ddd)」という記事をもとにインストールしようとしたところ、いくつか苦労する点があったので記録を残しておきます。

こちらの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/](https://www.ftp.cpc.ncep.noaa.gov/wd51we/wgrib2/)のページからwgrib2.tgz.v3.0.0をダウンロードします。v2.0.8が25Mなのに対して、v3.0.0が173Mとファイルサイズが大きくなっており、その分ダウンロードに時間がかかります。

ファイルを解凍し、生成したgrib2フォルダに移動します。

```shell
$ tar xvf wgrib2.tgz.v3.0.0
$ cd grib2
```

`makefile`を書き換えます。まずgccとgfortranを設定する行(123,124行目)をコメントアウトを外します。

```Makefile
#
# 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行目に該当する行が見つかるので、これもコメントアウトを外します。

```Makefile
# for OSX
export LDFLAGS="-L${lib}" && cd "${pngdir}" && export CPPFLAGS="${wCPPFLAGS}" && ${MAKE} -f scripts/makefile.darwin
```
## エラー発生その1 (-fopenmp)

いったんこの設定で`make`してみます。

```shell
$ 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で使う分にはそこまで影響はないと思っています。

```makefile
USE_OPENMP=0 # 1
```

## エラー発生その2 (Type mismatch)

もう一度`make`します。

```shell
$ 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](https://www.cpc.ncep.noaa.gov/products/wesley/wgrib2/compile_questions.html)というページに、参考になりそうな記述があります。


>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`というそれっぽいオプションが見当たります。

```makefile
fftpack.o:      fftpack.f
        $(FC) $(FFLAGS) ${FTN_REAL8} ${FTN_LEGACY} $<
```

残念なことに、実行時のログを見ると中身は空のようです。この`FTN_LEGACY`は
`makefile`の342行目と373行目で見つかります。

```makefile
    FTN_LEGACY:="-std=legacy -Wno-argument-mismatch"
```

これらの行は`ifeq`節の中に書かれており、`COMP_SYS`が`gnu_linux`または`cygwin_win`の場合に実行され、`gnu_mac`の場合は実行されません。それでは困るので、409行目と410行目の間にこの文を追記します。

私の環境では、以上の設定で`make`に成功しました。

```shell
 $ ./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
```