用WRF模型进行气象模拟入门(1)——简介以及代码编译

WRF全称Weather Research and Forecasting Model, 是一个天气研究与预报模型.可以用来进行精细尺度的天气模拟与预报。本文将从一个初学者的角度从零开始介绍WRF的使用方法。打算写一个系列,这篇先写WRF程序的编译安装。

注意:不同版本的WRF之间会有细微差异,本文使用的 WRF 版本是 3.6.1

1.简介

WRF模拟系统主要包含WPS和WRF两部分模块:

WPS模块全称为WRF Pre-processing System,即WRF预处理系统,用来为WRF模型准备输入数据;如果只是做理想实验(idealized modeling),就不需要用WPS处理真实数据。但是理想实验不在本文介绍范围内,本文介绍的是进行真实数据模拟的操作。

WRF模块就是数值求解的模块,它有两个版本:ARW(Advanced Research WRF) 和 NMM(Nonhydrostatic Mesoscale Model)。大多数研究者主要用的都是ARW版本,本文所有的介绍也都基于ARW版本。

除了WPS与WRF两大核心模块外,WRF系统还有很多附加模块:比如用于数据同化的WRF-DA,用于化学传输的WRF-chem,用于林火模拟的WRF-fire。本文不会涉及到这些高级功能。

2.准备工作

2.1准备*nux系统

安装WRF需要在Linux/Unix操作系统中进行,Linux/Unix 操作系统的安装过程不在本文介绍范围内。推荐阅读《鸟哥的Linux私房菜》

安装好 Linux/Unix 操作系统后,就需要安装 WRF 依赖的软件库。

接下来的操作会假设读者具备基本的Linux操作与代码编译安装知识。

(注意:各个WRF版本的依赖库安装不一致,本文介绍的是最新版本 WRF 3.6.1 的安装过程)

2.2 zlib库准备

第一个要安装的是 zlib 库,官网是http://www.zlib.net,当然也可以通过Linux各种发行版的包管理器(pacman, apt-get, yum 等)直接安装

2.3 hdf5库准备

接下来要安装 HDF5 库,官网是 http://www.hdfgroup.org/HDF5, 下载 HDF5-1.8.13 版本的代码即可,

将代码解压,进入代码目录,按照如下命令配置

./configure --prefix=/PATH/TO/HDF5 --with-zlib=/PATH/TO/ZLIB/

其中/PATH/TO/ZLIB/替换成 zlib的安装位置,如果是通过包管理器安装的,就可以不用写 –with-zlib=/PATH/TO/ZLIB/ 选项。

还有 /PATH/TO/HDF5要替换成 hdf5 即将安装的位置。

./configure命令执行完无错误之后,再执行命令

make install

即可顺利编译安装。

2.4 netcdf-c 与 netcdf-fortran 的安装

netcdf 代码下载地址为 http://www.unidata.ucar.edu/downloads/netcdf/index.jsp

最新版的netcdf 把c和fortran的代码拆分出来了,但是WRF的编译依赖于netcdf-fortran,而netcdf-fortran的安装依赖与netcdf-c,因此这两个库都需要安装。

较老版本的WRF安装教程仍然旧版本的netcdf描述操作过程,这些操作在新版本的WRF编译中可能会出错,所以看各个教程时一定要注意教程里使用的WRF和netcdf版本。本文叙述的netcdf版本为 netcdf-4.3.2.tar.gz 和 netcdf-fortran-4.4.1.tar.gz

首先,下载了netcdf-4.3.2.tar.gz (即netcdf-c)的代码后,解压代码,进入代码目录,使用以下命令配置

./configure --prefix=/PATH/TO/NETCDF --enable-netcdf-4 LDFLAGS="-L/PATH/TO/HDF5/lib" CPPFLAGS="-I/PATH/TO/HDF5/include"

其中 /PATH/TO/NETCDF 需要替换为你即将安装netcdf的路径,/PATH/TO/HDF5/ 要替换为刚刚hdf5 的安装路径

然后使用命令

make install

编译安装即可

接下来下载  netcdf-fortran 源代码,解压代码,进入代码目录,使用以下命令配置

./configure --prefix=/PATH/TO/NETCDF LDFLAGS="-L/PATH/TO/NETCDF/lib" CPPFLAGS="-I/PATH/TO/NETCDF/include" FC=gfortran

其中 /PATH/TO/NETCDF 是 netcdf的安装路径,跟上一步的路径一致;FC=gfortran设置了系统的fortran编译器,如果不是gfortran而是 ifort 或者 f90 等,则进行相应的替换。

配置好之后,使用命令

make install

即可安装

3. WRF/ARW的编译安装

首先在 http://www2.mmm.ucar.edu/wrf/src/ 找到 WRF最新版的源代码,文件名通常是 WRFVx.x.x.TAR.gz。当然,数字越大越新

然后解压代码:

tar WRFVx.x.x.TAR.gz

进入代码目录

cd WRFV3

设置环境变量 NETCDF 到刚刚安装好的netcdf目录

export NETCDF=/Path/to/NetCDF/

然后执行命令

./configure

进行配置,会出现很多编译选项供选择。每一个选项的前半部分通常是在描述编译器与运行环境,根据计算机实际情况选择即可。后半部分是并行选项:

serial 表示串行计算;

smpar 表示内存共享并行计算(shared memory option),即使用openMP,大部分多核电脑都支持这项功能;

dmpar 表示分布式并行计算(distributed memory option),即使用MPI 进行并行计算,主要用在计算集群,单个电脑就没必要用了;

dm+sm 表示同时使用openMP与MPI两种并行方式.

根据实际需要选择即可,最保险的方法就是选择 serial,不过这样编译出来的程序运行最慢

选择完编译选项后,会出现提示选择嵌套选项,一般就选 basic 选项即可

执行完./configure 顺利配置后,即可使用 ./compile 命令开始编译。单独执行 ./compile命令会看到各种编译选项。本文只介绍使用WRF进行真实情景模拟的操作,因此只需要使用命令

./compile em_real >& compile.log

就可以开始编译了,编译结果会输出到 compile.log

如果编译正常,在main目录下会看到ndown.exe, nup.exe, real.exe, tc.exe, wrf.exe这5个可执行程序

如果遇到以下错误:

start_em.f90:209.60:
     ALLOCATE( clat_glob(ids:ide,jds:jde), STAT=alloc_status, ERRMSG=alloc_err_
                                                            1
Error: Syntax error in DEALLOCATE statement at (1)

可能是因为使用的fortran编译器不支持ALLOCATE函数的ERRMSG参数,修改源代码文件中的start_em.F中的代码,去掉

, ERRMSG=alloc_err_message

并重新编译即可。

4. WPS(WRF预处理系统)的编译安装

首先在 http://www2.mmm.ucar.edu/wrf/src/ 找到 WPS最新版的源代码,文件名通常是 WPSVx.x.x.TAR.gz。当然,数字越大越新

然后解压代码:

tar xzvf WPSV3.6.1.TAR.gz

进入代码目录

cd WPS

注意:WPS编译时会在相同目录下寻找已经编译好的WRF目录,也就是说,源代码目录 WPS 要跟 WRFV3 放在同一个父目录下

4.1. 准备依赖包

WPS安装依赖 libpng, jasper,libjpeg, zlib 这几个库。所以在编译WPS前,要先确保这些库已经安装在电脑上。

然后设置系统环境变量 JASPERLIB 与 JASPERINC,要确保 $JASPERLIB/路径下有 libjasper.a, libpng.a 和 libz.a 这三个文件,且 $JASPERINC/ 路径下有 jasper/ 目录, png.h 和 zlib.h两个文件

如果这三个库是通过包管理器安装的,那么JASPERLIB 很有可能就是 /usr/local/lib, /usr/lib 或者/lib 之类的目录;对应的,JASPERINC很有可能是 /usr/include 或者 /usr/local/include 之一,如果都找不到,可以用Linux的locate 或者find命令来搜索这些文件在哪。如果这些文件分散在不同目录,则要把它们复制到一起并配置环境变量 JASPERLIB 与 JASPERINC。然后执行 ./configure进行配置

如果觉得上面的设置环境变量 JASPERLIB 与 JASPERINC很麻烦,也可以使用替代方案,即不设置环境变量,直接在WPS目录运行./configure,这时会生成配置文件 congfiure.wps,打开该配置文件,找到COMPRESSION_LIBS 和 COMPRESSION_INC,配置选项,手动修改:

COMPRESSION_LIBS = -L/PATH/TO/jasper/lib/ -L/PATH/TO/libjpeg/lib/ -L/PATH/TO/libpng/lib -ljasper -lpng -lz
COMPRESSION_INC = -I/PATH/TO/jasper/include/ -L/PATH/TO/libjpeg/lib/ -I/PATH/TO/libpng/include/

其中的 /PATH/TO/jasper,/PATH/TO/libjpeg,/PATH/TO/libpng 就是相应的库的路径。

4.2. 编译

./configure 执行成功或者 configure.wps 修改完毕后,即可开始执行命令

./compile

开始编译,如果编译成功,最后会在WPS代码根目录得到以下三个程序链接,

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

如果遇到其他编译错误,可以通过修改 configure.wps 文件的相关内容消除错误

至于如何使用模型,将在下一篇文章中继续讲

Tags:

35 thoughts on “用WRF模型进行气象模拟入门(1)——简介以及代码编译”

  1. 你好!我在安装netcdf-fortran时出错了,不知道什么原因,如下,希望能得到帮助!
    [root@dell netcdf-fortran-4.4.1]# make install
    Making install in fortran
    make[1]: 进入目录“/home/dell/PGI/netcdf-fortran-4.4.1/fortran”
    pgf90 -DHAVE_CONFIG_H -I. -I.. -I../libsrc -I/usr/local/include -g -c -o module_netcdf_nc_data.o module_netcdf_nc_data.F90
    PGF90-S-0081-Illegal selector – KIND value must be non-negative (module_netcdf_nc_data.F90: 175)
    PGF90-S-0081-Illegal selector – KIND value must be non-negative (module_netcdf_nc_data.F90: 175)
    0 inform, 0 warnings, 2 severes, 0 fatal for netcdf_nc_data
    make[1]: *** [module_netcdf_nc_data.o] 错误 2
    make[1]: 离开目录“/home/dell/PGI/netcdf-fortran-4.4.1/fortran”
    make: *** [install-recursive] 错误 1

  2. 老师我是本科纯菜鸟,我想问下您2.3安装hdf5库时执行的 ./configure命令是怎么回事呢?因为解压缩过后的hdf5库里面并没有可配置的文件啊。另外您在2.2zlib库准备中说“直接安装”,但是我直接执行make install,反馈说“no rules to make a target”。。。求助!

      1. 嗯,好的谢谢您给我提供这么完整的学习资源。我刚刚学习了一章。我会继续学习。
        但现在我时间有点紧张,所以还是想问下: 您在2.3hdf5配置中说的:“将代码解压,进入代码目录,按照如下命令配置:./configure 。。。。。” 是怎么回事,因为解压过后的hdf5目录下没有可供配置的文件啊。只有“bin、build、copying、include、lib、README、RELEASE.txt和share”。
        (zlib解压包倒是可以找出可执行的configure。)

        1. “bin、build、copying、include、lib、README、RELEASE.txt和share”……看上去像是已经编译好的二进制文件(bin包),如果系统兼容也没问题;我这里下载的源代码包(src包),比如这个:http://www.hdfgroup.org/ftp/HDF5/current/src/hdf5-1.8.14.tar.gz

        2. 学长你好,我安装了支持包zlib,libpng,jasper,netcdf(4.13版本,还没有分开c和fortran),openmpi,编译环境是GNU gfortran+gcc,但是我在对wrf配置时会有2个warning,之后在./compile em_real时也是报错,有很多,第一部分是
          “/lib/cpp -P -traditional -DEM_CORE=1 -DNMM_CORE=0 -DNMM_MAX_DIM=2600 -DCOAMPS_CORE=0 -DDA_CORE=0 -DEXP_CORE=0 -DIWORDSIZE=4 -DDWORDSIZE=8 -DRWORDSIZE=4 -DLWORDSIZE=4 -DNONSTANDARD_SYSTEM_SUBR -DWRF_USE_CLM -DNO_IEEE_MODULE -DNO_ISO_C_SUPPORT -DDM_PARALLEL -DNETCDF -DUSE_ALLOCATABLES -DGRIB1 -DINTIO -DLIMIT_ARGS -DCONFIG_BUF_LEN=65536 -DMAX_DOMAINS_F=21 -DMAX_HISTORY=25 -DNMM_NEST=0 test_io_idx.F90 > test_io_idx.f
          time mpif90 -w -ffree-form -ffree-line-length-none -fconvert=big-endian -frecord-marker=4 -o module_internal_header_util.o -c module_internal_header_util.f
          mpicc -DFSEEKO64_OK -o io_int_idx.o -c -w io_int_idx.c
          : error #5149: Illegal character in statement label field [M]

          : error #5149: Illegal character in statement label field [O]

          : error #5149: Illegal character in statement label field [D]

          : error #5149: Illegal character in statement label field [U]

          : error #5149: Illegal character in statement label field [L]

          : error #5118: First statement in file must not be continued”
          请问您知道如何解决吗

        3. 4.13版本 的 netcdf 太老了,跟新版本的 wrf 在一起会出现各种奇怪的问题。

          要么全部用最新版本的代码;要么都用旧版本的代码。新旧搭配确实会出问题

        4. 问题解决了,已成功安装。我装了新的intel编译器,不过之前那个问题应该是因为configure。wrf文件中配置有点问题。谢谢

  3. 您好!我 在MIC上平台 ”Linux x86_64 i486 i586 i686, Xeon Phi (MIC architecture) ifort compiler with icc (dm+sm)“编译em_b_wave, 最终编译完后,在main下产生了ideal.exe和wrf.exe,
    然后我切换到 run下,执行:./ideal.exe 但是显示如下信息,这是怎么回事?希望您能不吝赐教!
    ./ideal.exe: cannot execute binary file

  4. 老师你好。wrf已经安装成功,安装wps,./compile后只生成了ungrib.exe,另外两个没有,该怎么解决?

  5. 博主好,你这篇博客对我帮助非常大呀,感谢!
    这里说三个我遇到的问题:
    1. 安装netcdf的时候,–enable-netcdf-4这个选项可以写成–disable-netcdf-4,这样就不需要hdfs5支持了,虽然我不知道这两个东西都是干啥的..
    2. 编译WPS的时候,configure列表里边的编译器看上去都不太接地气,我选了gfortran,因为貌似挺多编译器可以兼容gfortran。mpich里好像就提供,但是configure自动生成的参数不能用,需要删除-f90=gfortran
    也就是把生成的configure.wps里
    DM_FC = mpif90 -f90=gfortran
    那一行修改成
    DM_FC = mpif90
    3. 如果自己用源码升级过glibc,那编译WRF的时候,会提示XDR族的函数支持找不到,这个挺扯蛋的,我还在找原因想办法,简单的做法就是,不要用源码升级glibc..

    1. 欢迎交流 🙂
      1. HDF5也是一种数据格式,用来存储气象数据,有可能会被用到。
      2. 可能因为你安装的gfortran的版本太老,不支持f90?最好从头到尾都统一用最新版编译器
      3. ……系统核心库就不要乱更新了,最好还是让包管理器管理吧

  6. 你好,谢谢你的文章。我是WRF初学者,我有一个很简单的问题:是不是WRF-ARW只能用来做研究而不能做预报,而WRF-NMM是专门用来做预报用的?

    1. 不好意思,我也是初学者。我所理解的是这些模型用来研究或者预报是某种行业惯例,各个模块根据特定的用途进行了相应的优化。具体细节我也不太清楚……

  7. 楼主你好,我按照你的步骤安装HDF5,为什么总出现will never be executed呢? 这样是不是就没装成功,该怎么解决呢?谢谢博主!

  8. 老师您好,
    我刚接触wrf这块,今天安装了一下这个环境 ,centos 6.5 x64的VMware虚拟机
    1. 安装了zlib、hdf5、netcdf-c、 netcdf-fortran 等依赖包
    2. WRF下载的是最新的3.8.1版本,WPS也是3.8.1版本
    3. 编译安装WRF的时候,第一次我1-71选项的时候我选择的是1,因为需要使用PGI (pgf90/gcc)编译,我安装了pgi,编译后mian下没有出现exe文件;我换了32 ,使用 GNU (gfortran/gcc)编译,也是一样,未出现exe文件,日志中也未报错
    4. 编译安装WPS的时候,选择1. Linux x86_64, gfortran (serial)后,compile完成后,目录下只有ungrib.exe,未出现其他的两个exe文件

    请问我目前这个环境是哪里有问题呢,请指点,谢谢!

  9. 老师您好,我刚刚接触wrf,我在编译安装WPS的时候,选择1. Linux x86_64, gfortran (serial)后,basic compile完成后,目录下只有ungrib.exe,不知道具体该怎么解决,configure.wps文件中也都经过了修改。请您不吝指教!另请教您是否安装过wrfda

    1. 环境变量如果设置没问题,wrfda可以一次性装成功,configure完以后,要注意修改configure.wrf里面的FORMAT_FIXED和FORMAT_FREE,分别在后面添加上-cpp
      修改前:
      FORMAT_FIXED = -ffixed-form
      FORMAT_FREE = -ffree-form -ffree-line-length-none
      修改后:
      FORMAT_FIXED = -ffixed-form -cpp
      FORMAT_FREE = -ffree-form -cpp -ffree-line-length-none

  10. 今天又无意中看到当年本科毕业时由于经验不足的我对博主的提问,以及博主的耐心解答,还是感触颇深。
    当年初涉足linux,又碰到转wrf这么个麻烦的毕业课题,还好有博主的帮助才顺利完成了论文内容,虽然研究浅显,有诸多不足,但确确实实是开启了我linux探索之门。
    如今我也有了好几年的深度学习开发经验,一切是基于linux环境开发完成的,一路磕磕绊绊走来,再也不是小白了,欣慰。觉得无论博主现在置身何方,从事何种行业吧,都想再次感谢博主当年伸手相助。

  11. “COMPRESSION_INC = -I/PATH/TO/jasper/include/ -L/PATH/TO/libjpeg/lib/ -I/PATH/TO/libpng/include/”
    这里-L/PATH/TO/libjpeg/lib/是不是写错了?应该是-I/PATH/TO/libjpeg/include/吧

  12. 你好,WRF在运行./compile em_real 命令后,出现了这个错误,
    Makefile:53: recipe for target ‘configcheck’ failed
    make: *** [configcheck] Error 1
    请问这个怎么解决呢?

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.