Link Search Menu Expand Document

WRF-chem 的配置及編譯

Table of contents

背景

  • 基本上WRF-chem的配置與WRF沒有差異,需要netCDF、HD5、JASPER、Z等程式庫及內含文件。
  • 唯一差異是必須開啟chem相關的環境變數
setenv EM_CORE 1
setenv WRF_CHEM 1

WRF-chem程式碼之下載

  • 雖然WRF4.3REPO目錄下也有chem,然其檔案並非最新、個數也不夠,還是由官網下載重做為宜。
  • WRF進版時也搭配新版的WPS(由3版進到4版),因此也要下載、裝置同一版本的WPS
  • 注意
    • 編譯過程如有失敗,使用clean並不能完全清乾淨,還是需要重新解壓縮比較妥當,所以如未完成編譯,不要在目錄下存放任何重要檔案。
    • 雖然WRF-chem包含有WRF,但畢竟為不同領域的專家同時發展,因此有可能發生版本上先後的差異,建議不要在原來的WRF目錄下發展,以避免混淆,即使很多工具是一樣、是可以互通的。

centos上的裝置

  • 目前centos上的gfortran雖然編譯成功,但wrf.exe無法執行,原因未明、還待偵錯。(版本為gcc (GCC) 4.8.5 20150623)
  • ifort可以成功編譯、執行,路徑及環境變數設定如下(csh)
source /opt/intel/bin/compilervars.csh intel64
source /opt/intel_f/bin/compilervars.csh intel64
setenv PATH /opt/mpich/mpich-3.4.2-icc/bin:$PATH
setenv NETCDF /opt/netcdf/netcdf4_intel
setenv HDF5 /opt/hdf/hdf5_intel
JASPERLIB=/nas1/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/lib
JASPERINC=/nas1/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/include

setenv WRF_DIR /nas1/WRF4.0/WRF_chem
setenv EM_CORE 1
setenv WRF_CHEM 1

set LD_LIBRARY_PATH=/opt/netcdf/netcdf4_intel/lib:/opt/hdf/hdf5_intel/lib:/nas1/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/lib:/opt/intel/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel64_lin
  • 支援軟體的版本
    • 多工使用mpich-3.4.2
    • netCDF使用netcdf-c-4.7.1 netcdf-fortran-4.5.2
    • HDF5使用hdf5-1.10.5
    • 執行時必須設定LD_LIBRARY_PATH
      LD_LIBRARY_PATH=/nas1/WRF4.0/WRFv4.3/WRFV4/LIBRARIES/lib:/opt/intel_f/compilers_and_libraries_2020.0.166/linux/compiler/lib/intel64_lin /opt/mpich/mpich-3.4.2-icc/bin/mpirun -np 90 wrf.exe
      

HDF5編譯

cat ~/MyPrograms/hdf5-1.10.5/cfg.kng
source /opt/intel/bin/compilervars.sh intel64
source /opt/intel_f/bin/compilervars.sh intel64
FC=ifort ./configure --enable-fortran --with-zlib=/usr/lib64 --prefix=/opt/hdf/hdf5_intel

netCDF編譯

  • WRF程式會需要libnetcdf.alibnetcdff.a2個檔案
  • netcdf-c環境設定如下
cat ~/MyPrograms/netCDF/netcdf-c-4.7.1/build_intel/cfg.kng
source /opt/intel/bin/compilervars.sh intel64
source /opt/intel_f/bin/compilervars.sh intel64

CC=icc CPPFLAGS=-I/opt/hdf/hdf5_intel/include LDFLAGS=-L/opt/hdf/hdf5_intel/lib ../configure --prefix=/opt/netcdf/netcdf4_intel  --disable-dap --with-zlib=/usr/lib64 --enable-netcdf4
kuang@DEVP ~/MyPrograms/netCDF/netcdf-fortran-4.5.2/build_intel
$ cat ~/MyPrograms/netCDF/netcdf-fortran-4.5.2/build_intel/cfg.kng
source /opt/intel/bin/compilervars.sh intel64
source /opt/intel_f/bin/compilervars.sh intel64
export NCDIR=/opt/netcdf/netcdf4_intel
export NFDIR=/opt/netcdf/netcdf4_intel
FC=ifort CC=icc CPPFLAGS=-I${NCDIR}/include LDFLAGS=-L${NCDIR}/lib FCFLAG=' -auto -warn notruncated_source -Bstatic -static-intel -O3 -unroll -stack_temps -safe_cray_ptr -convert big_endian -assume byterecl -traceback -xHost -qopenmp' ../configure --prefix=${NFDIR} --enable-netcdf4

macOS上的裝置

  • 因為macOS上可以接受brew建置的netcdf4hdf5程式庫,不必重新編譯,相對單純些。
  • 但因macOS上的gcc版本更新很快,須留意版本的一致性。

支援軟體版本管理

  • 因為brew建置的軟體都會放在/usr/local/Cellar/下按照名稱及版本存放,因此引用較為方便
  • 路徑是呼叫到編譯程式的關鍵,要控制編譯程式的版本就要先行設定好程式路徑。
setenv NETCDF /usr/local/Cellar/netcdf/4.8.1
setenv HDF5 /usr/local/Cellar/hdf5/1.12.1
setenv JASPERLIB /usr/local/Cellar/jasper/2.0.33/lib
setenv JASPERINC /usr/local/Cellar/jasper/2.0.33/include
setenv WRF_DIR /Users/WRF4.3/WRF-CHEM

setenv PATH /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/X11/bin:/usr/local/opt/coreutils/libexec/gnubin:.:/Users/kuang/bin:/opt/local/bin:/opt/local/sbin:/opt/grads-2.2.1/bin
setenv EM_CORE 1
setenv WRF_CHEM 1
  • 編譯與執行軟體版本
/usr/local/bin/mpirun --version
mpirun (Open MPI) 4.1.2

$ /usr/local/bin/gcc --version
gcc (Homebrew GCC 11.2.0_3) 11.2.0

$ /usr/local/bin/gfortran --version
GNU Fortran (Homebrew GCC 11.2.0_3) 11.2.0

編譯軟體的版本管理

  • 因為macOS上的gcc升級很快,要特別注意gccgfortranmpiccmpif90等程式其間版本的一致性。
    • 如不一致將出現錯誤:implicit declaration of function 'sym_forget' [-werror,-wimplicit-function-declaration] sym_forget()
    • 即使增加CCFLAG-std=c89-std=gnu99等,皆無法過關。
  • 10版以上的gfortran對副程式呼叫的引數個數、形態等檢查較為嚴格,因此編譯時要增加選項
kuang@MiniWei /Users/WRF4.3/WRF-chem
$ grep allow configure.wrf
FCBASEOPTS      =       $(FCBASEOPTS_NO_G) $(FCDEBUG)  -fallow-argument-mismatch -fallow-invalid-boz
  • 注意:
    • 錯誤訊息為Error: Rank mismatch between actual argument at (1) and ...
    • 要注意加在configure.wrf檔案內適當位置,並確認會對FC產生作用。
    • configure.wrf檔案會在./configure動作後被覆蓋。

輸出變數項目之管理

Modification of Registry/registry.chem file

  • 除了輸出濃度之外,WRF-chem亦能輸出逐時之揚沙量。修改設定如下:
    1. clean -a、configure
    2. 在Registry/registry.chem檔案內,將EDUST1~5的IO形式增加h (means: history file output)、存檔
    3. 其單位WRFV4.0為μgm-2s-1(./chem/module_uoc_dust.F:243: emis_dust(i,1,j,p_edust5)=bems(5)*converi ![kg/m2/s] -> [ug/m2/s])、WRFV4.3.2為kg/m2。
    4. compile >& compile.log
    5. 結果wrfout檔案中就會增加EDUST1~5之排放量

Reusults

$ ncdump -h $nc|grep float|grep DUST
        float EDUST1(Time, klevs_for_dust, south_north, west_east) ;
        float EDUST2(Time, klevs_for_dust, south_north, west_east) ;
        float EDUST3(Time, klevs_for_dust, south_north, west_east) ;
        float EDUST4(Time, klevs_for_dust, south_north, west_east) ;
        float EDUST5(Time, klevs_for_dust, south_north, west_east) ;
        float DUST_FLUX(Time, south_north, west_east) ;
        float DUST_1(Time, bottom_top, south_north, west_east) ;
        float DUST_2(Time, bottom_top, south_north, west_east) ;
        float DUST_3(Time, bottom_top, south_north, west_east) ;
        float DUST_4(Time, bottom_top, south_north, west_east) ;
        float DUST_5(Time, bottom_top, south_north, west_east) ;
  • 注意
    • DUST_FLUX無數值、全為0
    • 第1軸klevs_for_dust不為VERDI所解析,需使用ncrename將其更名為bottom_top

程式編譯

  • 目前沒有centos平台上WRFWRF-chem的執行檔可供下載。
  • macOS上雖然有較早先的WRF4.1版執行檔,但因為搭配的gcc較舊,新的OS上已經無法順利進行brew,必須自行編譯。
  • 編譯步驟
    1. 解壓縮、進入全新的程式碼目錄
    2. 進入csh環境
    3. 設定路徑及環境變數(見前)
    4. 執行./configure,選定編譯方式。(選擇dmp方式以便後續執行時能指定恰當的核心數量、單機或跨機)
    5. 確認configure的結果,如發現任何支援軟體不能使用,系統會報錯,需確實準備好再開始編譯。
    6. 如有需要修改configure.wrf內容,可以在此階段進行(macOS)
    7. 如無錯誤,繼續執行compile em_real >& em_real.log &、確認./main目錄下會產生real.exe等執行檔
    8. 如無錯誤,繼續執行compile wrf >& wrf.log &、確認./main目錄下會產生wrf.exe執行檔

WRF-chem的測試

  • 在沒有啟動化學(&chem) 設定情況下,WRF-chem的表現理論上是與傳統編譯的WRF完全一樣,因此可以使用一既有個案,以WRF-chem程式來執行,看結果是否相同。
  • 以最簡單的揚塵個案進行模擬

Reference

  • GCC team, Options controlling Fortran dialect, gnu.org