2017/08/12

JAGURS on Mac

JAGURS(高性能津波計算コード)の作者の馬場さんから,Macで動いたなら手順を公開して欲しいという依頼がありましたので,まとめておきます.
(シリアル版かつ手抜きなので順次更新します)
(追記:シリアル版といいつつ,OpenMPは有効に出来るようでした.というわけで,MacOSな1台のマシンでやるにはOpenMPで十分.)

【試した環境】

【依存ライブラリ】
NetCDF,PROJ4,FFTW3が必要ということなので,MacPorts でお手軽に入れました.なので,インストール先は全て /opt/local になりますので,それに合わせてMakefileを修正して下さい.NetCDFはFortranから使えるようにするため,netcdf-fortranパッケージもインストールして下さい.かつ,FFTW3もFortranから使えるようにするため,gfortran variant などを付けておいて下さい.
(というのを考えるのが面倒なので,コンパイルする手順も別途作成します)
  • NetCDF
    •   netcdf @4.4.1.1_0+dap+netcdf4 (active)
      • sudo port install netcdf +dap +netcdf4
    •   netcdf-fortran @4.4.4_0+gcc6 (active)
      • sudo port install netcdf-fortran +gcc6
  • PROJ4
    • proj @4.9.3_0 (active)
      • sudo port install proj
  • FFTW3
    • fftw-3 @3.3.5_0+gfortran (active)
あと,少なくとも私の環境では, -lsz (szip) が無いと言われたので,
  % port install szip
しました.

【コンパイル】
まずは,シリアル版.Makefile.SC_ICEをベースにするようにマニュアルに書いてあるけど,Makefileと同じ内容なので,Makefileでスタートする.

【罠】
フォートランのプログラムファイルが .f90 で提供されています.一方,gnu系(?)のコンパイラでは,.f90の場合,preprocessorが動いてくれません!

#ifdef MULTI
  1
Warning: Illegal preprocessor directive

とか言われます.これは, .F90 にすることで解決するそうです.まさか...
というわけで,ファイル名を .F90 にしてあげて(厳密には,preprocessorを使うソースだけで良いですが面倒なので全部),Makefileの %.o: %.f90 を  %.o: %.F90 にします.
(gfortran に -cpp オプションを渡してあげれば良いだけでした)

【Makefile修正箇所】

  • gfortran で .F90 なファイル(.f90と区別される)にpreprocessorを適用するには, -cpp オプションを指定する.
  • gfortran で OpenMP を使うには, -fopenmp オプションを指定する.

FC=/usr/local/bin/gfortran
PROJ4_DIR=/opt/local
CC=/usr/local/bin/gcc
CFLAGS=-g -I${PROJ4_DIR}/include
BASE=-cpp
FFTW3_INCLUDE_DIR=/opt/local/include
FFTW3_LIB=-lfftw3
OPT=-O2 -fopenmp
NETCDF=/opt/local
LIBS=-L$(NETCDF)/lib -lnetcdff -lnetcdf -L/opt/local/lib -lhdf5_hl -lhdf5 -lcurl -lsz -lproj $(FFTW3_LIB)
# MPI=ON

修正済Makefileはここに置いておきます

*追加注(2017/10/04)
% make
/usr/local/bin/gcc -c -g -I/opt/local/include mapproject.c
FATAL:/opt/local/bin/../libexec/as/x86_64/as: I don't understand 'm' flag!
make: *** [mapproject.o] Error 1

HPC compilerの /usr/local/bin/gcc を使う場合,as が /opt/local/bin/ になってしまうと,この不具合に当たるようです.PATHの順番を /usr/bin の方が先になっている必要があります.