三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

保姆级教程:在Ubuntu 22.04上从零编译WRF4.3和WPS(附依赖库避坑指南)

保姆级教程:在Ubuntu 22.04上从零编译WRF4.3和WPS(附依赖库避坑指南)

在Ubuntu 22.04上从零构建WRF4.3气象模型的完整指南

当第一次接触WRF(Weather Research and Forecasting)模型时,许多科研新手都会面临一个共同的困境:复杂的依赖关系和繁琐的编译过程。作为目前最流行的中尺度气象数值模型之一,WRF在天气预报、气候研究和大气科学领域有着广泛应用。本文将带你一步步在Ubuntu 22.04系统上完成WRF4.3及其前处理系统WPS的完整安装,特别针对新版Linux系统的特性提供解决方案。

1. 系统准备与环境配置

在开始编译WRF之前,确保你的Ubuntu 22.04系统已经更新到最新状态。打开终端,执行以下命令:

sudo apt update && sudo apt upgrade -y

1.1 基础编译工具链安装

WRF模型需要完整的Fortran和C编译环境。Ubuntu 22.04默认的GCC版本(11.2.0)完全兼容WRF4.3:

sudo apt install -y gfortran gcc cpp make m4 git

验证编译器版本:

gfortran --version gcc --version

1.2 必要依赖库安装

与旧版教程不同,Ubuntu 22.04的软件仓库已经包含了大多数WRF依赖库的最新稳定版本:

sudo apt install -y libpng-dev zlib1g-dev libjasper-dev \ libnetcdf-dev libnetcdff-dev libhdf5-dev libopenmpi-dev

特别注意:新版netCDF库(4.8.1+)将C和Fortran接口分离,需要同时安装libnetcdf-devlibnetcdff-dev

2. 自定义依赖库编译(可选)

虽然系统仓库提供了预编译的库,但某些情况下可能需要特定版本的依赖库。以下是手动编译关键依赖的步骤:

2.1 netCDF-C和netCDF-Fortran独立编译

# 下载源码 wget https://downloads.unidata.ucar.edu/netcdf-c/4.9.0/netcdf-c-4.9.0.tar.gz wget https://downloads.unidata.ucar.edu/netcdf-fortran/4.6.0/netcdf-fortran-4.6.0.tar.gz # 编译netCDF-C tar xzf netcdf-c-4.9.0.tar.gz cd netcdf-c-4.9.0 ./configure --prefix=/usr/local --disable-dap make -j$(nproc) sudo make install # 编译netCDF-Fortran cd .. tar xzf netcdf-fortran-4.6.0.tar.gz cd netcdf-fortran-4.6.0 export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH ./configure --prefix=/usr/local make -j$(nproc) sudo make install

2.2 Jasper和libpng编译

对于需要特定版本的情况:

wget http://www.ijg.org/files/jpegsrc.v9e.tar.gz tar xzf jpegsrc.v9e.tar.gz cd jpeg-9e ./configure --prefix=/usr/local make sudo make install

3. WRF模型编译实战

3.1 获取WRF源代码

推荐直接从官方Git仓库克隆最新代码:

git clone --depth 1 https://github.com/wrf-model/WRF.git cd WRF

3.2 配置编译选项

运行配置脚本:

./configure

选择以下选项:

    1. (dmpar) 分布式内存并行(MPI)
    1. gfortran/gcc(GNU编译器)

3.3 解决Ubuntu 22.04特有编译问题

新版系统可能会遇到以下错误:

  1. 时间函数兼容性问题: 编辑configure.wrf文件,找到:

    -DSPECIAL_FORTRAN

    修改为:

    -DSPECIAL_FORTRAN -DUSE_NETCDF4_FEATURES
  2. HDF5库路径问题: 确保环境变量正确设置:

    export HDF5=/usr/lib/x86_64-linux-gnu/hdf5/serial

3.4 开始编译

./compile em_real 2>&1 | tee compile.log

编译完成后验证:

ls -ls main/*.exe

应看到四个可执行文件:

  • wrf.exe(主程序)
  • real.exe(初始条件处理)
  • ndown.exe(嵌套网格处理)
  • tc.exe(热带气旋模块)

4. WPS系统编译详解

4.1 获取WPS源代码

cd .. git clone --depth 1 https://github.com/wrf-model/WPS.git cd WPS

4.2 环境变量配置

确保设置正确的库路径:

export JASPERLIB=/usr/lib/x86_64-linux-gnu export JASPERINC=/usr/include/jasper export WRF_DIR=../WRF

4.3 配置与编译

运行配置脚本:

./configure

选择选项3(Linux x86_64, gfortran),然后编译:

./compile 2>&1 | tee wps_compile.log

成功编译后应生成三个关键程序:

  • geogrid.exe(地理数据预处理)
  • ungrib.exe(气象数据解压)
  • metgrid.exe(气象数据插值)

5. 常见问题与解决方案

5.1 依赖库版本冲突

症状:编译过程中出现"undefined reference"错误

解决方案

sudo apt remove libnetcdf-dev libnetcdff-dev # 然后按照第2节手动编译特定版本

5.2 MPI相关问题

症状:mpif90命令找不到或运行出错

解决方案

sudo apt install openmpi-bin libopenmpi-dev export PATH=/usr/lib/x86_64-linux-gnu/openmpi/bin:$PATH

5.3 内存不足问题

对于小型云服务器或虚拟机,可能需要在编译时限制线程数:

./compile em_real 2>&1 | tee compile.log

改为:

./compile -j 2 em_real 2>&1 | tee compile.log

6. 性能优化建议

  1. 编译器优化: 编辑configure.wrf中的ARCH_LOCAL部分,添加:

    -O3 -march=native -ftree-vectorize -funroll-loops
  2. 并行配置

    选项说明推荐值
    numtiles计算域分块数CPU核心数
    nproc_xX方向进程数2-4
    nproc_yY方向进程数根据核心数调整
  3. I/O优化: 考虑使用WRF的NetCDF4压缩输出:

    ncd_compression = 1 compression_level = 2

7. 验证安装成功

运行测试案例:

cd WRF/test/em_real ./real.exe mpirun -np 4 ./wrf.exe

检查输出文件:

  • wrfout_d01_*(主输出文件)
  • wrfvar_output(如运行同化)

8. 后续工作流程

完整的WRF模拟流程:

  1. WPS阶段

    ./geogrid.exe ./ungrib.exe ./metgrid.exe
  2. WRF预处理

    ln -sf met_em* . ./real.exe
  3. 主模拟运行

    mpirun -np 8 ./wrf.exe
  4. 后处理: 推荐使用NCL、Python(xarray)或R语言处理输出数据

在实际项目中,我发现将编译过程封装成Shell脚本可以大大提高团队协作效率。特别是环境变量设置部分,建议写入~/.bashrc或单独的环境配置文件中。对于经常需要重新编译的情况,可以考虑使用Docker容器来保持环境一致性。

← 返回列表