WRF - 安装

本篇随笔将介绍 WRF 和 WPS 的环境配置、编译和安装

什么是 WRF ?

WRF (Weather Research and Forecasting Model) 是中尺度天气预报系统

组成:

  • 2 dynamic cores (ARW and NMM)
    ARW 由 NCAR 开发, NMM 由 NCEP 开发
  • 1 数据同化系统
  • 软件架构

官网:

WRF 下载

参考:
https://www2.mmm.ucar.edu/wrf/users/download/get_sources_new.php

  • 方式一

通过 git clone 从 github 克隆代码库

1
git clone --recurse-submodules git@github.com:wrf-model/WRF.git

复制到软件安装目录

1
sudo cp -pr ~/WRF /usr/lib/
  • 方式二

访问 github.com/wrf-model/WRF/releases 下载对应版本源代码

解压到目标目录

1
sudo tar -zxf WRF-4.4.tar.gz --directory=/usr/lib/

WRF 目录的理解

源代码目录

  • dyn_em :ARW dynamics cores
  • external :外部包,包含 IO ,计时器和 MPI 等
  • frame :包含 WRF 框架的模块
  • inc :包含 'include' 文件
  • main :包含主要的例行程序,如 wrf.F 和所有的可执行文件
  • phys :包含所有的物理模块
  • share :包含用于 WRF 中间层和 WRF I/O 的主要模块
  • tools :存放开发人员的工具包

脚本

  • clean :清理创建的文件和可执行文件的脚本
  • configure :创建 configure.wrf 文件,为编译 WRF 做准备的脚本
  • compile :编译 WRF 的脚本

其他

  • arch :存放编译选项的目录
  • run :用于运行 WRF 的目录
  • test :包含几个测试案例,也可用于运行 WRF
  • Makefile :Top–level makefile
  • Registry :存放 WRF 注册表文件

WRF/WPS 环境测试

参考:
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php#STEP1

检查是否已经安装 gfortrangcccpp

1
2
3
which gfortran
which gcc
which cpp

如果都已安装,以上返回的应该是安装的路径

检查 gcc 的版本是否为4.6或更高版本

1
gcc --version

运行一些简单的测试

通过运行以下的简单测试来验证 fortran 编译器是否正确构建,以及是否与 C 编译器兼容

下载测试文件到 TESTS 目录中
1
2
3
4
mkdir TESTS
cd ./TESTS
wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/Fortran_C_tests.tar Fortran_C_tests.tar
tar -xf Fortran_C_tests.tar
  • 测试 1 :固定格式 Fortran
1
gfortran TEST_1_fortran_only_fixed.f && ./a.out

正确输出为:

1
SUCCESS test 1 fortran only fixed format
  • 测试 2 :自由格式 Fortran
1
gfortran TEST_2_fortran_only_free.f90 && ./a.out

正确输出为:

1
2
Assume Fortran 2003: has FLUSH, ALLOCATABLE derived type, and ISO C Binding  
SUCCESS test 2 fortran only free format
  • 测试 3 :C 编译
1
gcc TEST_3_c_only.c && ./a.out

正确输出为:

1
SUCCESS test 3 C only
  • 测试 4 :Fortran 调用 C
1
2
3
4
gcc -c -m64 TEST_4_fortran+c_c.c
gfortran -c -m64 TEST_4_fortran+c_f.f90
gfortran -m64 TEST_4_fortran+c_f.o TEST_4_fortran+c_c.o
./a.out

正确输出为:

1
2
3
C function called by Fortran
Values are xx = 2.00 and ii = 1
SUCCESS test 4 fortran calling c
  • 测试 5 :csh 脚本
1
./TEST_csh.csh

正确输出为:

1
SUCCESS csh test
  • 测试 6 :perl 脚本
1
./TEST_perl.pl

正确输出为:

1
SUCCESS perl test
  • 测试 7 :sh 脚本
1
./TEST_sh.sh

正确输出为:

1
SUCCESS sh test

安装 WRF/WPS 编译相关软件

参考:
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php#STEP2

下载编译软件

下载网站:
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/

分别下载 netcdf , mpich , zlib , libpngJasper

1
2
3
4
5
6
wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/netcdf-4.1.3.tar.gz netcdf-4.1.3.tar.gz
wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/mpich-3.0.4.tar.gz mpich-3.0.4.tar.gz
wget http://zlib.net/zlib-1.2.12.tar.gz zlib-1.2.12.tar.gz
wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/libpng-1.2.50.tar.gz libpng-1.2.50.tar.gz
wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/jasper-1.900.1.tar.gz jasper-1.900.1.tar.gz

设置环境变量

1
2
3
4
5
6
7
8
9
10
11
12
13
export DIR=/usr/bin
export CC=gcc
export CXX=g++
export FC=gfortran
export FCFLAGS=-m64
export F77=gfortran
export FFLAGS=-m64
export JASPERLIB=$DIR/grib2/lib
export JASPERINC=$DIR/grib2/include
export LDFLAGS=-L$DIR/grib2/lib
export CPPFLAGS=-I$DIR/grib2/include
export NETCDF_classic=1
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$DIR/grib2/lib/

安装 NetCDF4

https://www.unidata.ucar.edu/software/netcdf/

解压 netcdf-4.1.3.tar.gz 到 /usr/bin/netcdf-4.1.3

1
2
3
4
5
6
7
8
sudo tar -xzvf netcdf-4.1.3.tar.gz --directory=/usr/bin/
cd /usr/bin/netcdf-4.1.3
sudo ./configure --prefix=$DIR/netcdf --disable-dap --disable-netcdf-4 --disable-shared
sudo make
sudo make install
export PATH=$DIR/netcdf/bin:$PATH
export NETCDF=$DIR/netcdf
cd -

检查是否安装成功:

1
which ncdump

正确输出为:

1
/usr/bin/netcdf/bin/ncdump

安装 MPICH

https://www.mpich.org/

MPICH 用于 WRF 的并行构建

解压 mpich-3.0.4.tar.gz 到 /usr/bin/mpich-3.0.4

1
2
3
4
5
6
7
sudo tar -xzvf mpich-3.0.4.tar.gz --directory=/usr/bin/
cd /usr/bin/mpich-3.0.4
sudo ./configure --prefix=$DIR/mpich
sudo make
sudo make install
export PATH=$DIR/mpich/bin:$PATH
cd -

安装 zlib

http://www.zlib.net/

zlib 是一个通用的数据压缩库,是 WPS ungrib 解码 GRIB 文件所必需的库

解压 zlib-1.2.12.tar.gz 到 /usr/bin/zlib-1.2.12

1
2
3
4
5
6
7
sudo tar -xzvf zlib-1.2.12.tar.gz --directory=/usr/bin/
cd /usr/bin/zlib-1.2.12
# sudo ./configure --prefix=$DIR/grib2
sudo ./configure
sudo make
sudo make install
cd -

安装 libpng

http://www.libpng.org/pub/png/libpng.html

libpng 支持几乎所有 PNG (Portable Network Graphics) 功能,是 WPS ungrib 解码 GRIB 文件所必需的库,需要 zlib-1.2.5 或更高版本

解压 libpng-1.2.50.tar.gz 到 /usr/bin/libpng-1.2.50

1
2
3
4
5
6
sudo tar -xzvf libpng-1.2.50.tar.gz --directory=/usr/bin/
cd /usr/bin/libpng-1.2.50
sudo ./configure --prefix=$DIR/grib2
sudo make
sudo make install
cd -

安装 JasPer

https://ece.engr.uvic.ca/~frodo/jasper/

JasPer 是图像处理/编码工具包,是 WPS ungrib 解码 GRIB 文件所必需的库

解压 jasper-1.900.1.tar.gz 到 /usr/bin/jasper-1.900.1

1
2
3
4
5
6
sudo tar -xzvf jasper-1.900.1.tar.gz --directory=/usr/bin/
cd /usr/bin/jasper-1.900.1
sudo ./configure --prefix=$DIR/grib2
sudo make
sudo make install
cd -

编译软件兼容性测试

参考:
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php#STEP3

下载测试文件

1
2
3
cd TESTS
wget https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compile_tutorial/tar_files/Fortran_C_NETCDF_MPI_tests.tar Fortran_C_NETCDF_MPI_tests.tar
tar -xf Fortran_C_NETCDF_MPI_tests.tar
  • 测试 1 : Fortran + C + NetCDF
1
2
3
4
5
cp ${NETCDF}/include/netcdf.inc .
gfortran -c 01_fortran+c+netcdf_f.f
gcc -c 01_fortran+c+netcdf_c.c
gfortran 01_fortran+c+netcdf_f.o 01_fortran+c+netcdf_c.o -L${NETCDF}/lib -lnetcdff -lnetcdf
./a.out

正确输出为:

1
2
3
C function called by Fortran
Values are xx = 2.00 and ii = 1
SUCCESS test 1 fortran + c + netcdf
  • 测试 2 : Fortran + C + NetCDF + MPI
1
2
3
4
5
cp ${NETCDF}/include/netcdf.inc .
mpif90 -c 02_fortran+c+netcdf+mpi_f.f
mpicc -c 02_fortran+c+netcdf+mpi_c.c
mpif90 02_fortran+c+netcdf+mpi_f.o 02_fortran+c+netcdf+mpi_c.o -L${NETCDF}/lib -lnetcdff -lnetcdf
mpirun ./a.out

正确输出为:

1
2
3
4
C function called by Fortran
Values are xx = 2.00 and ii = 1
status = 2
SUCCESS test 2 fortran + c + netcdf + mpi

安装和编译 WRF

参考:
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php#STEP4
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/Compile/wrf_compile3.php

安装 WRF

1
2
cd /usr/lib/WRF
./configure # 34 1

编译 WRF

编译,并将输出和错误信息写入到 log.compile

1
2
cd /usr/lib/WRF
./compile [case_name] >& log.compile
case_nameType of casecase_nameType of case
em_real3d real caseem_hill2d_x2d ideal case
em_quarter_ss3d ideal caseem_squall2d_x2d ideal case
em_b_wave3d ideal caseem_squall2d_y2d ideal case
em_les3d ideal caseem_grav2d_x2d ideal case
em_heldsuarez3d ideal caseem_seabreeze2d_x2d ideal case
em_tropical_cyclone3d ideal caseem_scm_xy1d ideal case

编译大约需要 20-30 分钟

编译成功后,会在 /usr/lib/WRF/main 目录下生成可执行文件 *.exe

1
ls -ls ./main/*.exe

如果编译的是 real case ,则生成的可执行文件为

1
2
3
4
wrf.exe (model executable)
real.exe (real data initialization)
ndown.exe (one-way nesting)
tc.exe (for tc bogusing--serial only)

如果编译的是 ideal case ,则生成的可执行文件为

1
2
wrf.exe (model executable)
ideal.exe (ideal case initialization)

安装编译 WPS

WPS (WRF Preprocessing System Source Code)

WPS 是 WRF 预处理系统,用于运行 真实模型 之前 输入预处理 工作,准备好必须的输入数据和模型参数后才能顺利运行模式

WPS 主要做了三件事:

  • 定义模型运行空间(投影、范围、分辨率等)和嵌套关系( geogrid
  • GRIB 文件提取列在 Vtable 气象要素场( ungrib
  • 将地表参数、气象要素插值到模拟区域,将风场旋转到 WRF 网格( metgrid
graph LR;
  A([静态地形数据]) --> B[geogrid]; 
  D([GRIB 格点数据]) --> E[ungrid];
  subgraph WPS;
    B[geogrid] --> C[metgrid];
    E[ungrid] --> C;
  end;
  C --> F([real]);

参考:
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php#STEP5
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/Compile/wps_compile1.php

下载 WPS

  • 方式一

通过 git clone 从 github 克隆代码库:

1
git clone --recurse-submodules git@github.com:wrf-model/WPS.git
  • 方式二

访问 github.com/wrf-model/WPS/releases 下载对应版本源代码

解压到目标目录

1
sudo tar -zxf WPS-4.4.tar.gz --directory=/usr/lib/

WPS 目录的理解

源代码目录

  • geogrid :包含创建静态数据(不随时间变化)的代码
    计算每个格点的经纬度、地图比例尺和科里奥利力参数
    对地形参数(地形、高度、土壤类别、地面反照率等)进行水平插值
  • ungrib :包含解压 GRIB 数据的代码
    GRIB 文件提取列在 Vtable 气象要素场,写成 intermediate 格式
  • metgrid :包含创建 WRF 的输入的代码
    ungrib 解码的气象场水平插值到 geogrid 定义的网格上
    将风场旋转到 WRF 网格,使得 uv 风平行于 x 轴和 y
  • util :包含实用程序

脚本

  • clean :清理创建的文件和可执行文件的脚本
  • configure :创建 configure.wps 文件,配置环境,准备编译 WPS
  • compile :编译 WPS 的脚本
  • link_grib.csh :将 GRIB 文件链接到 WPS 目录的脚本

其他

  • arch :收集编译选项的目录
  • namelist.wps :将用于运行 geogrid.exeungrib.exemetgrid.exe 的 WPS 名称列表
  • namelist.wps-all_options :包含可以在 namelist.wps 文件中使用的所有其他选项的参考

安装 WPS

1
2
3
4
5
cd /usr/lib/WPS
./clean
export JASPERLIB=$DIR/grib2/lib
export JASPERINC=$DIR/grib2/include
./configure # 1

编译 WPS

编译,并将输出和错误信息写入到 log.compile

1
2
cd /usr/lib/WPS
./compile >& log.compile

编译成功后,会在 /usr/lib/WPS 目录下生成可执行文件 *.exe

1
ls -ls ./*.exe
1
2
3
geogrid.exe -> geogrid/src/geogrid.exe
ungrib.exe -> ungrib/src/ungrib.exe
metgrid.exe -> metgrid/src/metgrid.exe

下载地形数据

WRF 模式能够创建理想化的模拟,如果要进行真实数据的案例,必须将模型创建在地球上的物理位置以及该位置的静态信息,这就需要一个包含地形和土地利用类别等信息的数据集

数据下载网址:
http://www2.mmm.ucar.edu/wrf/users/download/get_sources_wps_geog.html

下载静态的地形数据后将数据解压到 /usr/share/WPS_GEOG/

1
2
mkdir /usr/share/WPS_GEOG
sudo tar -xf geog.tar.gz --directory=/usr/share/WPS_GEOG

修改 /usr/lib/WPS/namelist.wps 中的地形数据路径

1
2
3
cd /usr/lib/WPS/
vim namelist.wps
geog_data_path = '/usr/share/WPS_GEOG'

下载好地形数据后,便可执行 geogrid.exe 程序,具体内容将在 运行 WPS 和 WRF 小节展开

1
2
cd /usr/lib/WPS
./geogrid.exe >& log.geogrid

参考链接

https://www2.mmm.ucar.edu/wrf/users/download/get_sources_new.php
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/compilation_tutorial.php
https://www2.mmm.ucar.edu/wrf/OnLineTutorial/Introduction/start.php