Link Search Menu Expand Document

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@DEVPgcc@macintel@nchcintel_MPI@nchc說明
FCgfortrangfortranifortmpiifort 
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.aLinux2_x86_64gfortOSX_x86_gfortranLinux2_x86_64ifortLinux2_x86_64ifortmpi 
openmp-fopenmp-lgomp-qopenmp-qopenmp 

nchc=/work/sinotec2/opt