Blog

Learning by doing.


How to Compile WRF?

Sep 30, 2013 • WRF • Tags: WRF Compiling

如何编译WRF在WRF用户手册中有比较到位的介绍,实际操作也比较容易,很少出现问题,所以一直觉得没有必要写相关的日志来记录编译的流程。 但是,自从读研以来,总有朋友过来问我如何编译WRF,每次我都是口头作一些解释或者直接上手帮忙编译,次数多了实在是一件效率低下的事呀。。。 一年过去,还是会有人来问编译WRF的事情,现在又有师弟师妹想学,干脆还是写一个完整的流程记录,方便大家吧。

其实网上也流传着很多WRF安装笔记,大家可以多google参考参考。本文的特点是尽可能讲述一个完整的WRF编译流程,从编译器到WRF所需的各种库,我们都自己编译。也就是说,我介绍的是如何在一个软件包几乎全默认的系统中编译WRF,这样即使系统管理员没有给你安装好你喜欢的编译器,没有给你安装好某些库,我们仍然可以自行解决。

个人总结不免疏漏,如有错误还请各位朋友指出~

先说环境

下面介绍的编译流程基于中国气象局的神威超级计算机,系统是Red Hat Linux。其实就是Linux,只要你是在Linux环境下,不论是什么发行版本,下面的内容应该都适用。 BTW,本文所述Shell命令采用常见的Bash,而不是WRF用户手册中的Csh。

基本思路

  1. 安装编译器。编译器是构建一个符合自己口味的操作系统环境最根本的东西,没有编译器所有的源代码就变不成机器码,程序就不会跑。我个人喜欢Intel的编译器,所以本文以安装Intel编译器为例。
  2. 编译MPI。个人认为在装好编译器之后最先要做的事是安装MPI,因为它同样涉及到编译器。而本文采用的MPI软件是目前主流的MPICH。
  3. 编译NETCDF。地球科学领域的软件几乎离不开这个库。
  4. 编译JasPer,LibPNG,Zlib。这三个库是编译WPS时所需的。
  5. 编译WRFV3。这是WRF的积分模块。这步可以放到第4步之前。
  6. 编译WPS。这是WRF的预处理模块。这步必须放到第4步和第5步之后。

安装Intel编译器

  • 申请软件 登陆到Intel的非商业软件开发页面,申请下载使用。 我们可以分别申请C和FORTRAN的编译器,我这里申请的是Parallel Studio XE 2013套件,这样安装的时候能一次安装上C和FORTRAN编译器,比较省事。

  • 下载并安装 填写好申请信息后,Intel会给你的邮箱发送一封邮件,给你软件的下载地址和序列号。整个套件的压缩包3个多G,下载好后上传到Linux服务器中,准备安装。

安装过程很傻瓜:解压并执行安装脚本

tar -xvf parallel_studio_xe_2013_sp1.tgz
cd parallel_studio_xe_2013_sp1
./install.sh

中间需要设置一下安装到哪个目录,并根据提示到Intel网站上获取一下解锁码,然后很顺利地完成安装。 安装好以后,需要设置一下环境变量。 编辑~/.bashrc,在里面添加

source <install-directory>/bin/compilervars.sh intel64

上面<install-directory>表示你之前设置的安装目录,然后重新加载~/.bashrc

source ~/.bashrc

执行

which ifort
which icc

如果返回的是<install-direcotry>的子路径,说明配置成功。

至此,Intel编译器安装完毕。

编译MPICH

  • 获取源代码 MPICH官网点击RELEASES栏目中的Source Code的download链接,下载最新版本的源代码。

  • 编译 将压缩包上传到Linux服务器,然后解压并编译

tar -xvf mpich-3.0.4.tgz
cd mpich-3.0.4
./configure --prefix=<mpi-directory>
make
make install

上面<mpi-dirctory>表示你想把MPICH安装到的目标目录。 然后配置环境变量,依旧编辑~/.bashrc,添加如下内容:

export PATH=<mpi-directory>/bin:$PATH

然后还是重新加载一下~/.bashrc

source ~/.bashrc

执行

which mpif90
which mpicc

如果返回的是你安装MPICH的路径,也就是<mpi-directory>/bin,说明配置成功。

这样MPICH就编译并配置好了,很简单吧~

编译NETCDF

  • 获取源代码 进入NETCDF下载页面,我们需要C和FORTRAN版本的库,所以点击The Latest Stable netCDF-C Release, tar.gz formThe Latest Stable netCDF-Fortran Release, tar.gz form下载相应的最新版本。

  • 编译 将两个压缩包上传到Linux服务器,然后解压

tar -xvf netcdf-4.3.0.tar.gz
tar -xvf netcdf-fortran-4.2.tar.gz

首先要先编译C版本的库

cd netcdf-4.3.0
./configure --prefix=<netcdf-directory> CC=icc
make
make install

BTW,这里可以make check一下看看有没有安装完整。

在编译FORTRAN本本的库之前需要先配置一下环境变量并把C版NETCDF库添加到动态库路径,仍然编辑~/.bashrc

export NETCDF=<netcdf-dirctory>
export LD_LIBRARY_PATH=$NETCDF/lib:$LD_LIBRARY_PATH

然后,不要忘记source ~/.bashrc

下面编译FORTRAN版本的库

cd netcdf-fortran-4.2
./configure --prefix=<netcdf-directory> CC=icc FC=ifort CPPFLAGS=-I/$NETCDF/include LDFLAGS=-L/$NETCDF/lib
make
make install

这里同样可以make check一下看看有没有安装完整。然后,FORTRAN版本的库就这样被我们编译好了。

至此,NETCDF编译完成。

编译JasPer,LibPNG,Zlib

  • 获取源代码 到各自网站下载源代码包: JasPer LibPNG Zlib 然后上传到你的Linux服务器中。

  • 编译 设置一下临时的环境变量

CC=icc

表示采用icc作为C语言编译器。

解压各源码包

unzip jasper-1.900.1.zip
tar -xvf libpng-1.6.6.tar.gz
tar -xvf zlib-1.2.8.tar.gz

编译JasPer,LibPNG,Zlib时都可以采用相同的操作,到各自目录下并执行

./configure --prefix=<jasper-directory>
make
make install

<jasper-directory>表示安装的目标目录,推荐三个库都安装到同一个目录下。

然后配置环境变量,编辑~/.bashrc,添加

export JASPER=<jasper-directory>
export JASPERLIB=$JASPER/lib
export JASPERINC=$JASPER/include
export LD_LIBRARY_PATH=$JASPERLIB:$LD_LIBRARY_PATH

记得source ~/.bashrc哦~

编译WRFV3和WPS

终于到了真正编译WRF的时候了!

  • WRF下载页面下载WRFV3和WPS的源代码包,然后上传到你的Linux服务器中。

  • 解压

tar -xvf WRFV3.5.TAR.gz
tar -xvf WPSV3.5.TAR.gz
  • 编译WRFV3
cd WRFV3
./configure # 选择ifor + icc的编译器配置,并且一般采用dmpar的方式编译
./compile em_real &> log & # 如果你是进行real模拟的话

编译需要一段时间,可以

tail -f log

来跟进察看编译的情况。

等到提示编译结束后

ls main/*.exe

如果有ndown.exenup.exereal.exetc.exewrf.exe,则表示编译成功且完整。 如果某几个exe文件没出来,说明编译不完整,可以察看log文件获取错误信息,你可能会遇到各种各样的问题,google吧~

  • 编译WPS
cd WPS
./configure # 同样选择Intel编译器的配置,并且仍然是一般采用dmpar的方式编译
./compile &> log &

编译需要一段时间,不过比WRFV3快很多。此时同样可以

tail -f log

来跟进察看编译的情况。

编译结束以后在WPS主目录下会有geogrid.exeungrib.exemetgrid.exe三个可执行程序的软链接。 如果完整表明编译成功了,如果不完整仍然是察看log并google~

util目录下可能会出现exe程序没有全部编译出来的情况,不过这些附加程序都不是转模式必须的,除非你一定想使用某个程序,不然不必太纠结和折腾。

至此,WRF编译的整个流程全部结束。

最后的话

个人认为编译程序对于非计算机专业的同学来说,并不是一件很有意义的事情。只要能够知道原理、编译成功,并且能够正确运行即可,不必太过深究。应当尽量避免在编译上耗费太多时间。

时间追不上白马呀,有时间还是多做些有意义的事情吧~ 多看点优秀的book和优秀的paper,多和家人在一起,多和朋友在一起,多运动,多睡觉~ : )

Tags: WRF Compiling