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


也看看

Compiling TensorFlow-GPU on Ubuntu 16.04 with CUDA 9.1(9.2) and Python3

NGINX, MYSQL, PHP INSTALLATION (UBUNTU 16.04)

Cannot Use pip3 in macOS (zlib Dependency Problem)

ZZZ我終於把 MATHJAX 弄進去了

Hexo Syntax Highlighting (Tested Under Tranquilpeak)

Julia isequal() 和 ==

comments powered by Disqus