【WRF教程第二期】WRF编译全过程:以4.5版本为例
WRF编译全过程:以4.5版本为例
- 预编译依赖项
- 第三方依赖库安装
- 库1:NetCDF
- 库2:MPI
- 库3:GRIB2 Libraries
- zlib库(PNG 库使用的压缩库)
- libpng库(“无损”压缩的压缩库)
- jasper库(JPEG2000 标准的“有损”压缩实现)
- 设置 UNIX 环境变量
- 库4:GRIB1 Output Format
- WRF编译安装(Building the WRF Code)
- WRF配置(Configure WRF)
- WRF编译(Compile WRF)
- WRF编译失败
- WRF目录结构(WRF Directory Structure)
- WRFDA、WRF-Chem、WRF-hydro编译安装
- WRFDA
- WRF-Chem
- WRF-hydro
- WPS编译安装
- WPS配置(Configure WPS)
- WPS编译(Compile WPS)
- WPS 编译失败
- geogrid 和 metgrid 失败
- ungrib 失败
- 使用“clean -a”工具
- 参考
WRF 建模系统由 WRF 预处理系统 (WPS)、WRF 模型、WRFDA、WRF-Chem、WRF-hydro 和一些实用程序组成。WPS 源代码与其他 WRF 组件是分开的,必须针对实际数据情况进行编译。WRF 模型包含 Fortran 接口到 ESMF 的源代码和到 FFTPACK 的源代码。
WRF 模型已成功移植到许多基于 Unix 的机器上。WRF 开发人员无法访问所有这些机器,必须依靠外部用户和供应商提供编译器和加载器选项所需的配置信息。以下是 WRF 建模系统支持的硬件和软件组合列表。
WRF 模型可以构建为在单处理器计算机、共享内存计算机(使用 OpenMP API)、分布式内存计算机(具有适当的 MPI 库)或分布式集群(同时利用 OpenMP 和 MPI)上运行。
预编译依赖项
WRF 建模系统代码大部分是用标准 Fortran 90 编写的(并使用了一些 2003 功能)。位于 WRF 和 WRFDA 以及 MPI 接口之间的软件层 RSL 是用 C 编写的。WPS 直接调用 MPI 库进行分布式内存消息传递。还有一些用 C 编写的辅助程序用于执行文件解析和文件构造,这是 WRF 建模代码的默认构建所必需的。
由于这种构成,必须安装 gfortran 编译器、gcc 和 cpp 来构建 WRF 代码,无论代码是使用 gfortran/GNU 选项构建的还是其他选项。建议使用支持 Fortran2003 标准(版本 4.6+)的 Fortran 编译器。构建机制使用多种脚本语言,包括 perl、Cshell 和 Bourne shell。使用了几种传统的 UNIX 文本/文件处理实用程序,因此以下内容是强制性的。
第三方依赖库安装
库1:NetCDF
netCDF 包 (版本 3.6.1+) 是构建 WRF 建模系统的唯一必需库。NetCDF 源代码、预编译二进制文件和文档可从 Unidata 网站获取。
要利用压缩功能,请使用 netCDF 4.0 或更高版本。请注意,压缩需要使用 HDF5。
如果使用 netCDF-4,请确保在未激活基于 HDF5 的并行 I/O 的情况下安装它。WRF 建模系统可以使用 netCDF-3 中的经典数据模型或 netCDF-4 中支持的压缩选项。从 V4.4 开始,可以并行写入压缩的 netCDF-4 文件。使用此选项,性能比使用 pnetcdf 慢,但比在并行文件系统上使用常规 netCDF 快得多。压缩提供的文件比 pnetcdf 生成的文件小得多。预计文件大小会因压缩而有所不同。
安装 netCDF 后,应设置环境变量 PATH 和 NETCDF,以便模型在构建期间找到必要的库文件。以下是示例,实际路径可能因用户而异。
setenv PATH /usr/local/netcdf/bin:$PATH
setenv NETCDF /usr/local/netcdf
库2:MPI
要运行分布式内存 WRF 作业,需要 MPI 库(例如 MPICH 或 OpenMPI)。大多数多处理器机器都预先配置了 MPI 版本,因此用户不太可能需要自己安装此软件包;但是,在“如何编译 WRF”网站上提供了安装此库的说明。如果出现问题,可能需要让您所在机构的系统管理员安装此库。在使用分布式内存构建 WRF 之前,需要安装 MPI。MPI-1 或 MPI-2 都可以接受。MPI 库可能已经存在。发出以下命令,如果给出了路径,则库已经可用。
which mpif90
which mpicc
which mpirun
确保路径设置为指向 MPI“lib”、“include”和“bin”目录。与 netCDF 库一样,MPI 必须与 WRF 源代码一致地构建。
库3:GRIB2 Libraries
如果计划使用 GRIB Edition 2 输入数据运行真实数据模拟(很有可能),WPS ungrib 程序需要以下库,因此必须在配置 WPS 之前安装这些库。
用户可以获取这些库并将其安装在他们的系统上,或者他们可以使用在编译 WPS 期间构建的库的 WPS 内部副本(适用于 4.4 及以上版本)。
用户安装的压缩库的路径在 configure.wps 文件中由“COMPRESSION_LIBS”和“COMPRESSION_INC”变量处理。确保 WPS 配置能够找到所有库文件的最简单方法是将这三个文件都安装在一个公共目录中。例如,如果库将安装在 /usr/local 中,则在 /usr/local 中创建一个库,名称类似于 grib2。请参阅每个库下方的说明,以确保它们安装在正确的位置。
zlib库(PNG 库使用的压缩库)
1、下载 zlib 包并解压。
2、进入解压后的目录
cd zlib-1.2.7
3、发出以下命令进行安装
(注意:这是按照上述示例将所有库文件放在 grib2 目录中。此路径可能因系统和用户偏好而异)
./configure --prefix=/usr/local/grib2
make
make install
libpng库(“无损”压缩的压缩库)
1、下载 PNG 包并解压。
2、进入解压后的目录
cd libpng-1.2.50
3、执行以下命令进行安装
(注意:这是按照上述示例将所有库文件放在 grib2 目录中。此路径可能因系统和用户偏好而异)
./configure --prefix=/usr/local/grib2
make
make install
jasper库(JPEG2000 标准的“有损”压缩实现)
1、下载 JasPer 包并解压。
2、进入解压后的 JasPer 目录
cd jasper-1.900.1
3、发出以下命令进行安装
(注意:这是按照上述示例将所有库文件放在 grib2 目录中。此路径可能因系统和用户偏好而异)
./configure --prefix=/usr/local/grib2
make
make install
注意:GRIB2 库需要在“jasper/jasper.h”中找到包含文件,因此可能需要在 JasPer 安装创建的“include”目录中手动创建“jasper”子目录,并在那里手动链接头文件。
设置 UNIX 环境变量
为了确保 JasPer、PNG 和 zlib 库能够被 ungrib 构建定位,应该发布一些环境变量设置。
作为手动编辑 configure.wps 文件中的 COMPRESSION_LIBS 和 COMPRESSION_INC 变量的替代方法,用户可以在配置 WPS 之前将环境变量“JASPERLIB”和“JASPERINC”设置为包含 JasPer 库和包含文件的目录;例如,如果 JasPer 库安装在 /usr/local/grib2 中,则可以使用以下命令(在 csh 或 tcsh 中)。
setenv JASPERLIB /usr/local/grib2/lib
setenv JASPERINC /usr/local/grib2/include
如果 zlib 和 PNG 库不在编译器自动检查的标准路径中,则可以将这些库的路径添加到 JasPer 环境变量中;例如,如果 PNG 库安装在 /usr/local/libpng-1.2.29 中,而 zlib 库安装在 /usr/local/zlib-1.2.3 中,则可在先前设置 JASPERLIB 和 JASPERINC(在 csh 或 tcsh 中)后使用以下命令。
setenv JASPERLIB "${JASPERLIB} -L/usr/local/libpng-1.2.29/lib -L/usr/local/zlib-1.2.3/lib"
setenv JASPERINC "${JASPERINC} -I/usr/local/libpng-1.2.29/include -I/usr/local/zlib-1.2.3/include"
可能还需要设置以下内容(例如,在 csh 或 tcsh 中),
setenv LDFLAGS -L/usr/local/grib2/lib
setenv CPPFLAGS -I/usr/local/grib2/include
库4:GRIB1 Output Format
为了以 Grib1 格式输出 WRF 模型数据(wrfout* 文件),软件版本中包含一个完整的源库(由 Todd Hutchinson 提供);但是,在尝试将 WPS、WRF 模型和 WRFDA 数据流链接在一起时,请始终使用 netCDF 格式。
WRF编译安装(Building the WRF Code)
WRF 代码的构建机制会尝试确定计算系统的架构,然后提供选项以选择首选的构建方法。例如,如果使用 Linux 计算机,它会确定计算机是 32 位还是 64 位,然后提示所需的处理器使用情况(例如串行、共享内存或分布式内存)。从构建机制中可用的编译选项中,仅选择系统上安装的编译器的选项。
“如何编译 WRF”网站提供了构建 WRF 和 WPS 代码所需的步骤顺序(尽管这些说明是专门针对 tcsh 和 GNU 编译器给出的)。或者,使用以下步骤编译 WRF。
1、获取 WRF 系统代码(包括 WRFDA、WRF-Chem 和 WRF-hydro)
如果您不继续进行长期项目或重复以前的工作,请始终获取最新版本的代码。请注意,V4.0 之前的版本不再受支持
2、移至 WRF 目录
(请注意,它可能被命名为其他名称,例如 WRFV4.4)。
cd WRF
WRF配置(Configure WRF)
3、在命令行中输入以下内容。
./configure
选择适当的编译器和处理器使用情况。仅选择系统上安装的编译器的选项。
- serial :使用单个处理器进行计算。这仅适用于域大小约为 100x100 网格空间的小型情况。
- smpar :对称多处理/共享内存并行 (OpenMP)。此选项仅推荐给熟悉计算和处理的人使用。它最可靠地适用于 IBM 机器。
- dmpar :分布式内存并行 (MPI)。这是推荐的选项。
- dm+sm :具有共享内存的分布式内存(例如,跨节点的 MPI 和节点内的 OpenMP)。使用 dmpar-only 选项通常性能更好,不建议那些没有丰富计算/处理经验的人使用此选项。
选择所需模拟类型的嵌套选项。
- 0 = 无嵌套
- 1 = 基本嵌套(标准,这是最常见的选择)
- 2 = 使用规定的一组移动进行嵌套
- 3 = 允许域跟随涡旋的嵌套,特定于热带气旋跟踪
可选配置选项包括
- ./configure -d:用于调试。此选项会删除优化,这在运行调试器(例如 gdb 或 dbx)时很有用。
- ./configure -D:用于边界检查和一些额外的异常处理,以及调试,并删除优化。只有 PGI、Intel 和 gfortran (GNU) 编译器已设置为使用此选项。
- ./configure -r8:用于双精度。这仅适用于 PGI、Intel 和 gfortran (GNU) 编译器。
配置后,顶级 WRF 目录中应该有一个名为“configure.wrf”的新文件。
WRF编译(Compile WRF)
4、在命令行中输入以下内容进行编译
(始终使用“&>”语法将标准错误和输出发送到日志文件。如果编译失败,这很有用)。
./compile em_test_case >& compile.log
其中“em_test_case”是要构建的案例类型(真实数据或特定理想情况)。可用选项包括:
编译代码大约需要 10-60 分钟。
注意
1、可以使用多个处理器来加速编译过程。只需在编译命令中添加“-j N”,其中 N 是处理器的数量(例如,./compile em_real -j 4 >& compile.log。2、请注意,测试表明使用超过 6 个处理器是没有必要的。
3、还请注意,如果出现编译错误,建议仅使用单个处理器进行编译。默认使用两个处理器,因此如果出现这种情况,需要指定仅使用单个处理器(例如,./compile em_real -j 1 >& compile.log。
编译完成后,检查编译日志的末尾以确定是否成功。此外,如果成功,wrf/main 目录中应该存在以下可执行文件。输入命令
ls -ls main/*.exe
- 对于真实数据编译:ndown.exe、real.exe、tc.exe、wrf.exe
- 对于理想化编译:ideal.exe、wrf.exe
这些可执行文件链接到两个不同的目录,可以从任一位置运行。
- WRF/run
- WRF/test/em_(其中 是上述编译命令中选择的大小写)
WRF编译失败
如果代码编译失败,请打开日志文件(例如,compile.log)并搜索大写“E”的单词“Error”。通常,文件中列出的第一个错误是失败的罪魁祸首,所有其他错误都是初始问题的结果。
如果使用多个处理器进行编译,情况并非总是如此。如果错误不明显,请尝试使用单个处理器重新编译(例如,./compile em_real -j 1 >& compile.log)以确保列出的第一个错误是根本原因。确保在重新编译之前清理并重新配置代码(请参阅下面有关重新编译的要点。
许多编译查询已在 WRF 和 MPAS-A 用户论坛上找到。如果不确定如何解决错误,请尝试在论坛上搜索错误以获取有用的提示。
为确保所有库和编译器都正确安装,请在重新编译之前按照“如何编译 WRF”网站上的说明和测试进行操作。
如果问题已解决,请在重新编译之前再次清理并配置代码。
./clean -a
./configure
WRF目录结构(WRF Directory Structure)
顶级 WRF 目录由以下文件和子目录组成。
name | Explanation |
---|---|
arch | a directory containing files specific to configuration |
chem | a directory containing files specific to building and running WRF-Chem |
clean | a user-executable script to clean the model code prior to recompiling |
compile | a user-executable script to build the WRF model |
configure | a user-executable script to declare configuration settings prior to compiling |
doc | a directory containing various informational documents of specific applications for WRF |
dyn_em | a directory containing files specific to the dynamical core mediation-layer and model-layer subroutines |
external | a directory containing files and sub-directories for building additional external libraries needed for WRF |
frame | a directory containing files related to the WRF software framework-specifc modules |
hydro | a directory containing files specific to building and running WRF-Hydro |
inc | a directory containing various .h libraries, and include (.inc) files generated by the Registry during the WRF compile |
LICENSE.txt | a text file containing WRF licensing information |
main | a directory containing the ‘main’ WRF programs with symbolic links for executable files in the test/em_* and run/ directories |
Makefile | a file used as input to the UNIX ‘make’ utility during compiling |
phys | a directory containing WRF model layer routines for physics |
README | a text file containing information about the WRF model version, a public domain notice, and information about releases prior to V4.0 - when code repository information is not available |
README.md | a text file necessary for keeping the code in a .git repository system, and containing important information for users. |
Registry | a directory containing files that control many of the compile-time aspects of the WRF code |
run | a directory contining symbolic links for compiled executables, along with all tables and text files that may be necessary during run-time |
share | a directory containing mediation layer routines, including WRF I/O modules that call the I/O API |
test | a directory containing subdirectories for all the real and idealized cases; inside each of those directories are the same files and executables that are in the ‘run’ directory |
tools | a directory containing the program that reads the appropriate Registry.X file (for e.g., Registry.EM for a basic WRF compile) and auto-generates files in the ‘inc’ directory |
var | a directory containing files and subdirectories specific for building and running WRFDA |
wrftladj | a directory containing files specific to building and running WRFPLUS (a program affiliated with WRFDA) |
WRFDA、WRF-Chem、WRF-hydro编译安装
有关 WRFDA、WRF-Chem 和 WRF-hydro 所需库的信息以及编译说明如下:
WRFDA
WRF Data Assimilation (WRFDA)
WRF-Chem
WRF-hydro
WRF-Hydro® Modeling System
WPS编译安装
WRF 预处理系统使用与 WRF 模型类似的构建机制。geogrid 和 metgrid 的外部库仅限于 WRF 模型所需的库,因为 WPS 使用 WRF 模型的 WRF I/O API 实现;因此,必须在安装 WPS 之前编译 WRF,以便 WPS 程序可以使用 WRF 外部目录中的 I/O API 库。
构建 WRF 模型(和 WPS)所需的唯一库是 netCDF;但是,ungrib 程序需要三个压缩库来支持 GRIB Edition 2(如果不需要支持 GRIB2 数据,则可以编译 ungrib 而无需这些压缩库)。
WRF 在模型和通信包之间添加了一个软件层,而 WPS 程序 geogrid 和 metgrid 则直接进行 MPI 调用。大多数多处理器机器都预先配置了 MPI 版本,因此用户不太可能需要自己安装此包。有关更多信息,请参阅必需和可选库。
为了解决可移植性问题,NCEP GRIB 库 w3 和 g2 已包含在 WPS 发行版中。这些库的原始版本可从 NCEP 下载,网址为 http://www.nco.ncep.noaa.gov/pmb/codes/GRIB2/。要下载的具体 tar 文件是 g2lib 和 w3lib。由于 ungrib 程序需要这些文件中的模块,因此它们不适合在构建的链接阶段与传统库选项一起使用。
“如何编译 WRF”网站提供了构建 WRF 和 WPS 代码所需的步骤顺序(尽管这些说明是专门针对 tcsh 和 GNU 编译器给出的)。或者,使用以下步骤编译 WPS。
1、获取 WPS 代码
如果您不继续进行长期项目或重复以前的工作,请始终获取最新版本的代码。请注意,V4.0 之前的版本不再受支持
2、移至 WPS 目录
(请注意,它可能被命名为其他名称,例如 WPSV4.4)。
cd WPS
WPS配置(Configure WPS)
3、设置 WRF_DIR 环境变量。
配置脚本使用此设置链接回 WRF 的编译版本。以下是 Cshell 示例。WRF 目录的路径和名称可能会有所不同。
setenv WRF_DIR ../WRF
4、如果编译 V4.4+ 并希望使用 zlib、libpng 和 JasPer 库的内部副本(有关详细信息,请参阅 GRIB2 库),请发出以下命令。
./configure --build-grib2-libs
注意:若仅编译 ungrib.exe 以运行 MPAS,请使用 configure 命令 ./configure --nowrf
应列出当前系统架构上支持的编译器列表,以及每个编译器的以下选项。
- serial:可执行文件使用单个处理器计算;这是推荐的选项
- serial_NO_GRIB2:与上文相同,但不支持 GRIB2(即未安装压缩库)
- dmpar:可执行文件使用分布式内存并行 (MPI) 计算
- dmpar_NO_GRIB2:与上文相同,但不支持 GRIB2(即未安装压缩库)
注意:除非域大小非常大(1000 x 1000 个网格空间),否则几乎总是建议选择串行选项(即使 WRF 是使用分布式内存或共享内存选项编译的)。WPS 可执行文件运行速度很快,通常不需要并行计算。如果选择了 dmpar 选项,请注意 ungrib 程序仍然需要使用单个处理器运行,因为 ungrib 不支持并行计算。
选择其中一个配置选项。配置完成后,WPS 目录中应该存在“configure.wps”文件。
WPS编译(Compile WPS)
5、在命令行中输入以下内容
(始终使用“&>”语法将标准错误和输出发送到日志文件。如果编译失败,这很有用)。
./compile >& compile.log
与编译 WRF 相比,WPS 编译应该相对较快。如果成功,以下可执行文件应出现在 WPS 目录中,并从其相应的源代码目录链接。
geogrid.exe -> geogrid/src/geogrid.exe
ungrib.exe -> ungrib/src/ungrib.exe
metgrid.exe -> metgrid/src/metgrid.exe
WPS 编译失败
如果代码编译失败,请打开日志文件(例如,compile.log)并搜索大写字母“E”的“Error”一词。通常,文件中列出的第一个错误是失败的罪魁祸首,所有其他错误都是初始问题的结果。
geogrid 和 metgrid 失败
1、确保 WRF 编译成功。
WPS geogrid 和 metgrid 可执行文件使用 WRF/external/ 目录中的外部 I/O 库 - 安装 WRF 时会构建这些库,如果安装不正确,geogrid 和 metgrid 程序将无法编译。
2、检查构建 WPS 时使用的编译器(和版本)是否与构建 WRF 时使用的编译器(和版本)相同。
3、检查构建 WPS 时使用的 netCDF(和版本)是否与构建 WRF 时使用的 netCDF(和版本)相同。
4、WRF_DIR 的路径是否设置正确?
检查 WRF 目录的路径和名称
echo $WRF_DIR
ungrib 失败
1、确保 jasper、zlib 和 libpng 库已正确安装(如果使用 GRIB2 支持进行编译)。
2、确保“configure.wps”中的以下行使用了正确的路径。
COMPRESSION_LIBS = -L/$path-to-ungrib-libraries/lib -ljasper -lpng -lz
COMPRESSION_INC = -I/$path-to-ungrib-libraries/include
使用“clean -a”工具
在重新编译之前,通常需要清理代码,但并非总是如此。
当对 configure.wrf(wps) 文件进行了修改,或对 WRF/Registry/* 文件进行了任何更改时,应清理代码。如果是这样,请在重新编译之前发出 ./clean -a。
对代码中的子例程或 .F 和 .F90 文件的修改需要重新编译,但不需要清理代码,也不需要重新配置代码。只需重新编译,这应该比干净编译快得多。