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。
基本思路
- 安装编译器。编译器是构建一个符合自己口味的操作系统环境最根本的东西,没有编译器所有的源代码就变不成机器码,程序就不会跑。我个人喜欢Intel的编译器,所以本文以安装Intel编译器为例。
- 编译MPI。个人认为在装好编译器之后最先要做的事是安装MPI,因为它同样涉及到编译器。而本文采用的MPI软件是目前主流的MPICH。
- 编译NETCDF。地球科学领域的软件几乎离不开这个库。
- 编译JasPer,LibPNG,Zlib。这三个库是编译WPS时所需的。
- 编译WRFV3。这是WRF的积分模块。这步可以放到第4步之前。
- 编译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 form
和The 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
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.exe
,nup.exe
,real.exe
,tc.exe
,wrf.exe
,则表示编译成功且完整。
如果某几个exe
文件没出来,说明编译不完整,可以察看log文件获取错误信息,你可能会遇到各种各样的问题,google吧~
- 编译WPS
cd WPS
./configure # 同样选择Intel编译器的配置,并且仍然是一般采用dmpar的方式编译
./compile &> log &
编译需要一段时间,不过比WRFV3快很多。此时同样可以
tail -f log
来跟进察看编译的情况。
编译结束以后在WPS主目录下会有geogrid.exe
,ungrib.exe
,metgrid.exe
三个可执行程序的软链接。
如果完整表明编译成功了,如果不完整仍然是察看log并google~
在util
目录下可能会出现exe
程序没有全部编译出来的情况,不过这些附加程序都不是转模式必须的,除非你一定想使用某个程序,不然不必太纠结和折腾。
至此,WRF编译的整个流程全部结束。
最后的话
个人认为编译程序对于非计算机专业的同学来说,并不是一件很有意义的事情。只要能够知道原理、编译成功,并且能够正确运行即可,不必太过深究。应当尽量避免在编译上耗费太多时间。
时间追不上白马呀,有时间还是多做些有意义的事情吧~ 多看点优秀的book和优秀的paper,多和家人在一起,多和朋友在一起,多运动,多睡觉~ : )