Gary Gong

4 minute read

By NOAA / Satellite and Information Service [Public domain], via Wikimedia Commons

前言

WRF,對於天氣預報研究從業人員來說一定是一個非常熟悉的詞彙,WRF 是一個天氣數值預報(Numerical Weather Prediction, NWP)模型,大體上使用 Fortran 撰寫,因為涉及多個數值求解(例如 Runge-Kutta 法求常微分方程),費力耗時,實務上使用超級電腦運算;隨著 GPU 運算興起,WRF 也一度改寫為 CUDA 版本加速運算。

安裝前言

安裝真的非常非常的麻煩,有些東西不可以裝太新,有些東西不可以裝太舊(很生氣),看到網路上也沒什麼太多的教學,而我又常常忘記,就來寫這一篇 Guide。

此次使用的系統為 Ubuntu 16.04;CPU 為何,RAM 多少,其實都不會妨害安裝,但是會妨礙你算資料;你會發現為了預報下三個小時的資料花了半天去算,預報都不預報了,而且事後校驗還不準,真的想哭。

安裝

申請 WRF 官網的帳號

說是申請帳號,也只是讓你填填 E-mail 一些資料驗驗證,就行的

WRF Download Page

進入到 Download Page,若是新使用者,點按 New Users;若是先前已申請過,填寫先前的 E-mail 即可驗證進入到下載頁面。

下載頁面

他有提到如果你是第一次使用 WRF 的使用者的話,可以看看他的線上教學(If you are a first-time WRF user, learn how to run the programs via the online tutorial.)根據官網所述,自 WRF 4.0 開始,WRF 安裝包裡面就含有 ARW、NMM、Chemistry、WRFDA 和 WRFPLUS 的原始碼了。我們這次以 WRF 4.0 為主。

官方其實有提供手把手的教學文件以及(我覺得寫的比較好的)教學文件之 2,奈何是我資質不夠還是如何,在編譯上總是會出現一些相依性等等的錯誤。

要裝什麼?

為了方便我們編譯以及環境變數的設置,我們先在這裡新建一個資料夾,名叫Build_WRF

mkdir Build_WRF

我們這次要裝的是具備分析實際案例(Real Cases)的 WRF 程式,他比起理想化(Idealized)案例的 WRF 程式還需要一個資料前處理程式(WRF Preprocessing System, WPS),所以請確認你已經具備兩個程式而且放置在我們剛剛新建的資料夾Build_WRF裡頭:

WRFV4.0.TAR.gz
WPSV4.0.TAR.gz

接下來請將這兩個檔案解壓縮,*.tar.gz的解壓縮方法如下:

tar zxvf <your_filename>.tar.gz

理論上,解壓縮完WRFV4.0.TAR.gzWPSV4.0.TAR.gz你會得出兩個資料夾:

WRF/
WPS/

基本上,我們其實可以進行編譯了,但是編譯之前必須要檢視系統環境是否符合 WRF 的需求,這也是我這邊常常碰壁的地方:

系統環境

我們這邊一律採用 Ubuntu 16.04 LTS 的版本

Shell 環境

由於 WRF 編譯指令是由csh組成,若單純使用sh系列的,會導致編譯失敗;為了讓我們編譯順利方便,我們需要安裝csh,安裝及啟用方法如下:

安裝 csh

sudo apt-get install csh

裝完就好,就可以讓 WRF 自己取用來編譯。

編譯程式

先檢查是否有以下三項編譯程式:

which gfortran
which cpp
which gcc

任何一項必須要有相對回應該程式的存放位置才算通過,回應範例如下:

~ $ which gfortran
/usr/bin/gfortran

若是返回結果如下,則表示未安裝(可能性較大)或是未設定環境變數妥當:

~ $ which gfortran
~ $

相依套件

先在我們剛剛開的資料夾Build_WRF內再開一個新資料夾名叫LIBRARIES,以備編譯時存取 Library 用:

mkdir LIBRARIES

請下載下列程式至上述資料夾,並解壓縮:

mpich-3.0.4
netcdf-4.1.3
Jasper-1.900.1
libpng-1.2.50
zlib-1.2.7
hdf5-1.8.13

下載點為:

mpich-3.0.4

netcdf-4.1.3

Jasper-1.900.1

libpng-1.2.50

zlib-1.2.7

hdf5-1.8.13

安裝 HDF5

環境變數設置

在教學文件中,此環境變數限定使用在csh

setenv HDF5 /usr/local

若是使用sh請改為:

export HDF5=/usr/local

編譯安裝

請確認你的 hdf5 已經解壓縮完畢,並進入到 hdf5 資料夾內:

cd hdf5-1.8.13

開始進行組態(Configure):

./configure --prefix=$HDF5 --enable-fortran --enable-fortran2003

Configure 後,若沒有錯誤,請接續:

make

Make 後,若沒有錯誤,請接續:

make install

安裝 NETCDF

環境變數設置

在教學文件中,此環境變數限定使用在csh

setenv DIR path_to_directory/Build_WRF/LIBRARIES
setenv CC gcc
setenv CXX g++
setenv FC gfortran
setenv FCFLAGS -m64
setenv F77 gfortran
setenv FFLAGS -m64

若是使用sh請改為:

export DIR=path_to_directory/Build_WRF/LIBRARIES
export CC=gcc
export CXX=g++
export FC=gfortran
export FCFLAGS=-m64
export F77=gfortran
export FFLAGS=-m64

編譯安裝

請確認你的 netcdf 已經解壓縮完畢,並進入到 netcdf 資料夾內:

cd netcdf-4.1.3

開始進行組態(Configure):

./configure --prefix=$DIR/netcdf --disable-dap \
     --disable-netcdf-4 --disable-shared

Configure 後,若沒有錯誤,請接續:

make

Make 後,若沒有錯誤,請接續:

make install

編譯後,請確認是否成功;若成功,設置環境變數(csh):

setenv PATH $DIR/netcdf/bin:$PATH
setenv NETCDF $DIR/netcdf

bash版本環境變數:

export PATH=$DIR/netcdf/bin:$PATH
export NETCDF=$DIR/netcdf

安裝 MPICH

請確認你的 mpich 已經解壓縮完畢,並進入到 mpich 資料夾內:

cd mpich-3.0.4

開始進行組態(Configure):

./configure --prefix=$DIR/mpich

Configure 後,若沒有錯誤,請接續:

make

Make 後,若沒有錯誤,請接續:

make install

編譯後,請確認是否成功;若成功,設置環境變數(csh):

setenv PATH $DIR/mpich/bin:$PATH

bash版本環境變數:

export PATH=$DIR/mpich/bin:$PATH

安裝 zlib

環境變數設置

在教學文件中,此環境變數限定使用在csh

setenv LDFLAGS -L$DIR/grib2/lib 
setenv CPPFLAGS -I$DIR/grib2/include 

若是使用bash請改為:

export LDFLAGS=-L$DIR/grib2/lib 
export CPPFLAGS=-I$DIR/grib2/include 

編譯安裝

請確認你的 zlib 已經解壓縮完畢,並進入到 zlib 資料夾內:

cd zlib-1.2.7

開始進行組態(Configure):

./configure --prefix=$DIR/grib2

Configure 後,若沒有錯誤,請接續:

make

Make 後,若沒有錯誤,請接續:

make install

退出該資料夾:

cd ..

安裝 libpng

請確認你的 mpich 已經解壓縮完畢,並進入到 mpich 資料夾內:

cd libpng-1.2.50

開始進行組態(Configure):

./configure --prefix=$DIR/grib2

Configure 後,若沒有錯誤,請接續:

make

Make 後,若沒有錯誤,請接續:

make install

退出該資料夾:

cd ..

安裝 JasPer

請確認你的 jasper 已經解壓縮完畢,並進入到 jasper 資料夾內:

cd jasper-1.900.1

開始進行組態(Configure):

./configure --prefix=$DIR/grib2

Configure 後,若沒有錯誤,請接續:

make

Make 後,若沒有錯誤,請接續:

make install

退出該資料夾:

cd ..

開裝 WRF

感動的時候來了,我們即將開裝 WRF,我們先離開資料家LIBRARIES退回到資料夾Build_WRF中。

請進入到WRF資料夾:

cd WRF

由於 NETCDF 在版本 4 以上的時候就預設不支援 IO 功能,導致無法順利產出configure.wrf檔案導致接下來編譯失敗,所以請大家加上一個環境變數使其能順利產生該檔案:

setenv NETCDF_classic 1

sh版本

export NETCDF_classic=1

並執行:

./configure

若無意外,一開始我們會看到大約 75 種選項,大致分四大類:serial、smpar、dmpar、dm+sm,官網敘述如下:

serial : single processor
smpar : shared memory option (OpenMP)
dmpar : distributed memory option (MPI)
dm+sm : Distributed Memory with Shared Memory (for example, MPI across nodes with OpenMP within a node) - usually better performance is through dmpar only

wrf-install-wrf-configure

在此我們是 smpar 較為妥適,再看第五個 column,列出許多編譯器的選項;在此,我們是gfortran/gcc的編譯器,所以交叉比對我們選擇33

接下來,會詢問是否要編譯nesting的選項,一共有四種:

Compile for nesting? (0=no nesting, 1=basic, 2=preset moves, 3=vortex following) [default 0]:

官網表示 1 是最為普遍的選項,而 3 主要是用來追蹤氣旋用;在此我們選擇1

接下來我們要開始編譯了,編譯選項有這些:

em_real (3d real case)
em_quarter_ss (3d ideal case)
em_b_wave (3d ideal case)
em_les (3d ideal case)
em_heldsuarez (3d ideal case)
em_tropical_cyclone (3d ideal case)
em_hill2d_x (2d ideal case)
em_squall2d_x (2d ideal case)
em_squall2d_y (2d ideal case)
em_grav2d_x (2d ideal case)
em_seabreeze2d_x (2d ideal case)
em_scm_xy (1d ideal case)

由於我們要分析實際資料,所以我們選用em_real,所以請鍵入以下指令:

./compile em_real >& log.compile

編譯時較久,取決於你電腦的速度;編譯完後,在WRF/main資料夾下,你應該要能看到這幾個檔案:

ndown.exe
real.exe
tc.exe
wrf.exe

開裝 WPS

請進入到WPS資料夾:

cd WPS

官網建議先執行./clean指令,確保無先前編譯內容,再來執行:

./configure

會出現一堆列表,但是我們剛剛選了smpar但是這裡卻沒有類似的選項;在此,請選擇1. Linux x86_64, gfortran (serial)

請確保你不是選到NO_GRIB2後綴的選項,沒有GRIB2就是自廢武功。

按理,這樣就可以執行編譯,但是實際上因為我們這次選的是serial而非smpar會導致錯誤,所以我們必須更改configure.wps內的指令,請先打開configure.wps,在此我們使用vim的文字編輯器:

vim configure.wps

以下是指令稿的內容,請找到此片段(約略於第 52 行左右):

WRF_LIB         =       -L$(WRF_DIR)/external/io_grib1 -lio_grib1 \
                        -L$(WRF_DIR)/external/io_grib_share -lio_grib_share \
                        -L$(WRF_DIR)/external/io_int -lwrfio_int \
                        -L$(WRF_DIR)/external/io_netcdf -lwrfio_nf \
                        -L$(NETCDF)/lib -lnetcdff -lnetcdf

請在-lnetcdf後方加上-lgomp,改完之後應該像這樣:

WRF_LIB         =       -L$(WRF_DIR)/external/io_grib1 -lio_grib1 \
                        -L$(WRF_DIR)/external/io_grib_share -lio_grib_share \
                        -L$(WRF_DIR)/external/io_int -lwrfio_int \
                        -L$(WRF_DIR)/external/io_netcdf -lwrfio_nf \
                        -L$(NETCDF)/lib -lnetcdff -lnetcdf -lgomp

存檔後離開,此舉可避免 WPS 在編譯時找不到 GOMP 的函式庫導致失敗。由於 WPS 編譯需要 WRF,故預設 WRF 應該與 WPS 在同級資料夾,請你先行確認 WPS 與 WRF 是否存在同一個、同一層的資料夾內,再接下來進行編譯:

./compile

編譯完後,在WPS資料夾下,你應該要能看到這幾個檔案:

geogrid.exe
ungrib.exe
metgrid.exe

由於這些只是 Symbolic Link 不是一個真正的程式檔案(像捷徑),請確認這些檔案大小是否為非零:

ls -ls geogrid/src/geogrid.exe
ls -ls ungrib/src/ungrib.exe
ls -ls metgrid/src/metgrid.exe

08/24 待續,遠端電腦掛掉沒辦法裝。

08/27 終於寫完,好累;會再確認一次安裝說明是不是有問題。

Some References:

编译WRF时报错ld: cannot find -lhdf5_fortran

How to install csh in Ubuntu?

How to Compile WRF?

WRF ARW OnLine Tutorial

Compiling and Testing WRF Model

comments powered by Disqus