mcip程式的編譯
Table of contents
背景
- mcip程式的編譯方式有別於CMAQ其他程式,buildit腳本並不會幫忙mcip的編譯,必須自行修改makefile
- 雖然mcip也可以編譯成mpi平行版本,但不論是在工作站或國網,平行版本的運作都不理想。網友也普遍看淡這事。還好mcip的主要功能不是浮點運算,只是在整併與轉(分)檔,這也是社群不會計較的理由之一。
需要程式庫
- ioapi (Input/Output Applications Programming Interface),詳見IOAPI的編譯
- 一般ioapi是不需要平行化的,但在intel-MPI因使用了pnetcdf,必須準備平行化的ioapi。
- netcdf,詳參NC相關程式庫之編譯
Makefile
- Makefile放在${CMAQ_PROJ}/PREP/mcip/src,原始設定(範例檔)有些問題,需要手動修改
FC = ifort
NETCDF = /usr/local/apps/netcdf-4.6.3/intel-18.0
IOAPI_ROOT = /usr/local/apps/ioapi-3.2/intel-18.0
###FFLAGS = -g -O0 -check all -C -traceback -FR -I$(NETCDF)/include \
### -I$(IOAPI_ROOT)/Linux2_x86_64ifort
FFLAGS = -FR -O3 -traceback -I$(NETCDF)/include -I$(IOAPI_ROOT)/Linux2_x86_64ifort
LIBS = -L$(IOAPI_ROOT)/lib -lioapi \
-L$(NETCDF)/lib -lnetcdff -lnetcdf
- 問題1:一般ioapi會被包括到的檔案,是放在$(IOAPI_ROOT)/ioapi,範例是指向$(IOAPI_ROOT)/Linux2_x86_64ifort,應該是直接使用編譯好的.mod檔案。這點視需要使用軟連結即可。
- 問題2:$(IOAPI_ROOT)底下並沒有lib目錄,範例的意思應該是指含有libioapi.a的目錄
修正:除了檔案位置,新版的mcip一定要連結到openmp相關的函數,必須開啟相對應選項:在ifort是-qopenmp
FC = ifort
NETCDF = /work/sinotec2/opt/netcdf-4.7.1
IOAPI_ROOT = /work/sinotec2/opt/cmaq_recommend/ioapi-3.2
###FFLAGS = -g -O0 -check all -C -traceback -FR -I$(NETCDF)/include \
### -I$(IOAPI_ROOT)/Linux2_x86_64ifort
FFLAGS = -FR -O3 -traceback -I$(NETCDF)/include -I$(IOAPI_ROOT)/ioapi -qopenmp
LIBS = -L$(IOAPI_ROOT)/Linux2_x86_64ifort -lioapi \
-L$(NETCDF)/lib -lnetcdff -lnetcdf
不同機器上的編譯設定
項目 | gcc@DEVP | gcc@mac | intel@nchc | intel_MPI@nchc | 說明 |
---|---|---|---|---|---|
FC | gfortran | gfortran | ifort | mpiifort | |
NETCDF | /opt/netcdf4 | /usr/local/NetCDF4 | ${nchc}/netcdf-4.7.1 | (module load) | |
IOAPI_ROOT | /opt/ioapi-3.2 | /Users/IOAPI/ioapi-3.2/ioapi | ${nchc}/cmaq_recommend/ioapi-3.2 | (same) | |
libioapi.a | Linux2_x86_64gfort | OSX_x86_gfortran | Linux2_x86_64ifort | Linux2_x86_64ifortmpi | |
openmp | -fopenmp | -lgomp | -qopenmp | -qopenmp |
nchc=/work/sinotec2/opt