WRF模式Linux编译实战:NetCDF与MPI依赖配置指南
2026/9/19 16:08:54 网站建设 项目流程

简介:本资源是一份面向气象、环境及大气科学领域初学者与科研人员的WRF模式实操指南,聚焦Linux系统下中尺度天气模拟平台的部署与应用。文档详细梳理了WRF(特别是ARW版本)在Red Hat Enterprise Linux 5环境中的完整安装流程,涵盖硬件配置要求、PGI编译器与NetCDF库等关键依赖的安装配置、源码编译要点,以及前处理(WPS)、主模式(WRF)和后处理(ARWpost)三大模块的运行逻辑与结果解析。资源为单个PDF文件,大小226KB,内容源自《宁夏农林科技》期刊论文,结构清晰、步骤翔实,附有凉山州冬季风场与温度剖面的实际模拟案例,可直接用于教学演示、科研复现或本地化调试参考。目前已有633人学习下载,适合具备基础Linux操作能力和Fortran/气象背景的用户快速上手WRF建模实践。

1. WRF模式不是“装完就能跑”的黑盒,而是一套依赖强、路径敏感、需分步验证的气象数值模拟系统

在Linux上安装WRF(Weather Research and Forecasting Model),常被误认为是下载源码、./configure && make两步走完就万事大吉。实际中,90%以上的失败发生在WPS前处理阶段报错、real.exe崩溃、或wrf.exe启动后立即退出——这些根本不是“没装好”,而是编译链、库版本、路径变量、地理数据目录结构等环节存在隐性不匹配。WRF对Fortran编译器(Intel ifort 或 GNU gfortran)、MPI实现(OpenMPI 或 MPICH)、NetCDF-C/NetCDF-Fortran 库的ABI兼容性极为苛刻;一个libnetcdf.so.15libnetcdff.so.7的主版本号错位,就足以让namelist.input读取失败而不报具体错误。本文面向已掌握Linux基础命令(如tar -xzfexport PATHldd查依赖)、能识别make: *** [module_first_guess.o] Error 1类编译日志的IT及气象相关从业者,不讲概念复述,只拆解从零构建可稳定运行WRF 4.4(当前主流稳定版)的完整路径:包括WRF+WPS双模块协同编译、地理数据自动下载与校验、最小化测试用例(CONUS 2D单层)的快速验证方法,以及real.exe卡在Processing domain 1时最该检查的3个配置项。


2. 编译前必须锁定的4类依赖及其Linux系统级准备

WRF不是独立程序,它是一组Fortran/C混合代码,其可执行文件(real.exe,wrf.exe,tc.exe等)在运行时动态链接数十个系统库。若依赖未按WRF官方文档要求的精确版本范围安装,编译可能成功但运行必然失败。以下操作均在Ubuntu 22.04 LTS或CentOS 7.9环境下验证,其他发行版需替换包管理命令(如dnf替代yum)。

2.1 系统基础工具链安装(以Ubuntu为例)

sudo apt update && sudo apt install -y \ build-essential \ gfortran \ g++ \ cmake \ libhdf5-dev \ libhdf5-serial-dev \ libcurl4-openssl-dev \ libpng-dev \ libjpeg-dev \ libnetcdf-dev \ libnetcdff-dev \ libopenmpi-dev \ openmpi-bin \ wget \ unzip \ vim

提示libnetcdf-devlibnetcdff-dev必须同时安装,且版本需为4.8.x或4.9.x(Ubuntu 22.04默认提供4.8.0)。若系统源中版本过低(如CentOS 7默认为4.3.2),必须手动编译NetCDF。此处不展开手动编译,因90%用户应优先尝试系统包——若后续./configurenetcdf not found,再回退到源码编译流程。

2.2 验证Fortran与MPI环境是否可用

WRF编译脚本(configure)会探测mpif90是否存在并调用其封装的gfortran。执行以下命令确认:

# 检查MPI Fortran编译器是否在PATH中 which mpif90 # 输出应为 /usr/bin/mpif90 或类似路径 # 检查其是否能调用底层gfortran mpif90 --version # 应显示GNU Fortran (Ubuntu 12.2.0-1ubuntu1.22.04.1) 12.2.0 # 测试MPI基本功能(非必须但强烈建议) echo "program test; print*, 'MPI OK'; end" > test.f90 mpif90 test.f90 -o test_mpi && ./test_mpi # 屏幕输出 "MPI OK" 即表示MPI+Fortran链路通畅

2.3 NetCDF库版本与符号链接校验

WRF要求NetCDF-C和NetCDF-Fortran库的.so文件主版本号严格匹配。常见错误是libnetcdff.so.7存在,但libnetcdf.so.15缺失,或反之。执行:

# 查看已安装的NetCDF库文件 ls -la /usr/lib/x86_64-linux-gnu/libnetcdf* # 正常应有 libnetcdf.so.15、libnetcdff.so.7 等(数字可能略有差异) # 检查Fortran库是否能正确链接C库 ldd /usr/lib/x86_64-linux-gnu/libnetcdff.so.7 | grep netcdf # 输出应含 "libnetcdf.so.15 => /usr/lib/x86_64-linux-gnu/libnetcdf.so.15"

libnetcdff.so.7找不到libnetcdf.so.15,说明库未正确安装或符号链接损坏。此时执行:

sudo ln -sf /usr/lib/x86_64-linux-gnu/libnetcdf.so.15 /usr/lib/x86_64-linux-gnu/libnetcdf.so sudo ln -sf /usr/lib/x86_64-linux-gnu/libnetcdff.so.7 /usr/lib/x86_64-linux-gnu/libnetcdff.so

2.4 创建专用工作目录并设置环境变量

WRF编译过程会产生大量中间文件,且要求所有路径不含空格和中文。推荐结构如下:

mkdir -p ~/WRF_SRC/{WRFV4,WPS} export WRF_DIR=$HOME/WRF_SRC/WRFV4 export WPS_DIR=$HOME/WRF_SRC/WPS export NETCDF=$HOME/WRF_SRC/NETCDF # 若后续需自编译NetCDF则启用此行 export PATH=$WRF_DIR/run:$PATH

注意WRF_DIRWPS_DIR必须为绝对路径,且不能与源码解压路径混用(即不要把WRFV4源码直接放在$WRF_DIR下,而应先解压到临时目录再mv过去)。环境变量需写入~/.bashrcsource ~/.bashrc生效。


3. WRF与WPS双模块编译:选择正确选项与规避经典陷阱

WRF由WPS(预处理系统)和WRF(主模式)两大部分组成。WPS负责地理数据插值与初始场生成,WRF负责动力核心计算。二者必须使用同一套编译器、MPI、NetCDF库,且WPS必须先于WRF编译。编译顺序错误是初学者最高频失误。

3.1 WPS编译:关键在于arch/configure.wps的选择

进入$WPS_DIR,执行:

./clean -a ./configure

configure脚本会列出可用平台选项。不要选编号1(serial)或2(gcc),因为WPS必须支持MPI才能处理多域网格。正确选项是:

  • Ubuntu/Debian:选3. Linux x86_64 gfortran (serial)→ 错!
  • 正确应选:13. Linux x86_64 gfortran w/ MPI(对应gfortran+mpif90

选择后,脚本生成configure.wps。打开该文件,确认以下三行:

SFC="gfortran" CC="gcc" FC="mpif90"

FC仍为gfortran,手动修改为mpif90。然后执行:

make clean make -j$(nproc)

验证ls -l geogrid.exe ungrib.exe metgrid.exe应全部为可执行文件(权限-rwxr-xr-x)。若metgrid.exe缺失,大概率是NetCDF-Fortran库未被configure探测到,需检查config.logchecking for nf_open... no类错误。

3.2 WRF编译:必须与WPS共享同一NetCDF路径

进入$WRF_DIR,执行:

./clean -a ./configure

在选项列表中,必须选择与WPS完全一致的编译器组合。例如WPS用了gfortran+mpif90,则WRF也必须选:

  • 34. Linux x86_64 gfortran (dmpar)(dmpar = distributed memory parallel)

选择后,脚本会询问NetCDF路径。直接回车使用默认路径(即/usr),因我们已通过系统包安装。若之前手动编译NetCDF在$HOME/WRF_SRC/NETCDF,则此处输入该路径。

随后脚本生成configure.wrf。关键检查点:

# 确认以下变量指向正确位置 NETCDF = /usr WRFIO_NCD_LARGE_FILE_SUPPORT = 1

然后编译:

make -j$(nproc) wrf

典型失败场景module_first_guess.o: undefined reference to 'nf_inq_varid_'
原因:configure.wrfNETCDF路径错误,或libnetcdff.so未被链接。解决:重新运行./configure,确保NETCDF路径正确,并在configure.wrf中添加:

LDFLAGS = -L/usr/lib/x86_64-linux-gnu -lnetcdff -lnetcdf

3.3 编译产物验证与符号依赖检查

编译完成后,检查核心可执行文件:

ls -l $WRF_DIR/main/{real.exe,wrf.exe,ndown.exe} # 应全部存在且大小 > 10MB # 检查wrf.exe是否真正链接了NetCDF和MPI ldd $WRF_DIR/main/wrf.exe | grep -E "(netcdf|mpi| hdf)" # 必须包含 libnetcdff.so.7、libnetcdf.so.15、libmpi.so.40 等

libnetcdff.so.7 => not found,说明编译时未正确链接Fortran库。此时需在$WRF_DIR/external/io_netcdf/Makefile中,将-lnetcdff改为-L/usr/lib/x86_64-linux-gnu -lnetcdff,再make clean && make -j$(nproc) wrf重编。


4. 地理数据下载、WPS运行与namelist生成的最小闭环

WRF无法脱离地理数据运行。WPS的geogrid.exe需要geog目录下的地形、土地利用等静态数据。官方提供自动下载脚本,但需网络通畅且路径配置正确。

4.1 自动下载地理数据(Geog Data)

WRF官方维护的地理数据服务器(https://www2.mmm.ucar.edu/wrf/users/wrfv4.4/geog/)需通过wget下载。进入$WPS_DIR,执行:

./geogrid.csh

该脚本会提示输入geog目录路径。必须输入$WPS_DIR/geog(绝对路径)。脚本将自动创建该目录并下载约12GB数据(含topo_2.5min,nlcd2011,soiltype_bot等子目录)。

注意:若下载中断,再次运行./geogrid.csh会续传。但若geog目录已存在部分文件,脚本可能跳过已下载项。建议首次运行前清空$WPS_DIR/geog

4.2 运行geogrid.exe生成地理网格文件

编辑$WPS_DIR/namelist.wps,设置关键参数:

&share wrf_core = 'ndown' ! 实际用wrf,此处仅示意 max_dom = 1 start_date = '2021-01-01_00:00:00' end_date = '2021-01-01_06:00:00' interval_seconds = 21600 io_form_geogrid = 2 / &geogrid parent_id = 1 parent_grid_ratio = 1 i_parent_start = 1 j_parent_start = 1 e_we = 100 e_sn = 100 geog_data_res = 'default' dx = 30000 dy = 30000 map_proj = 'latlon' ref_lat = 40.0 ref_lon = -97.0 truelat1 = 40.0 truelat2 = 40.0 stand_lon = -97.0 /

关键参数说明

  • max_dom = 1:单域测试,避免嵌套复杂度
  • e_we/e_sn = 100:东西/南北格点数,小值降低计算量
  • dx/dy = 30000:格距30km,适配CONUS区域
  • map_proj = 'latlon':经纬度投影,最易调试

保存后,运行:

./geogrid.exe

成功后生成geo_em.d01.nc(约20MB),位于当前目录。

4.3 运行ungrib与metgrid:从GFS数据生成初始场

WRF需真实大气场驱动。使用免费GFS数据(https://nomads.ncep.noaa.gov/):

# 下载GFS 0.25度数据(示例:2021年1月1日00Z) wget https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.20210101/00/atmos/gfs.t00z.pgrb2.0p25.f000 # 解压并重命名(ungrib要求固定名) mv gfs.t00z.pgrb2.0p25.f000 FILEIN ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable # 运行ungrib ./ungrib.exe # 生成METGRID.TBL.ARW(ARW核心专用表格) cp metgrid/METGRID.TBL.ARW METGRID.TBL # 运行metgrid ./metgrid.exe

成功后生成met_em.d01.2021-01-01_00:00:00.nc

4.4 生成WRF namelist.input并运行real.exe

进入$WRF_DIR/run,复制模板:

cp $WRF_DIR/run/namelist.input .

编辑namelist.input,重点修改:

&time_control run_days = 0, run_hours = 6, run_minutes = 0, run_seconds = 0, start_year = 2021, start_month = 01, start_day = 01, start_hour = 00, start_minute = 00, start_second = 00, end_year = 2021, end_month = 01, end_day = 01, end_hour = 06, end_minute = 00, end_second = 00, interval_seconds = 21600, input_from_file = .true., history_interval = 180, frames_per_outfile = 1000, restart = .false., restart_interval = 5000, io_form_history = 2, io_form_restart = 2, io_form_input = 2, io_form_boundary = 2, / &domains time_step = 180, time_step_fract_num = 0, time_step_fract_den = 1, max_dom = 1, e_we = 100, e_sn = 100, e_vert = 27, p_top_requested = 5000, eta_levels = 1.000, 0.994, 0.984, 0.970, 0.950, 0.925, 0.895, 0.860, 0.820, 0.775, 0.725, 0.670, 0.610, 0.545, 0.475, 0.400, 0.320, 0.235, 0.145, 0.050, 0.000, num_metgrid_levels = 27, num_metgrid_soil_levels = 4, dx = 30000, dy = 30000, grid_id = 1, parent_id = 1, parent_grid_ratio = 1, i_parent_start = 1, j_parent_start = 1, parent_grid_id = 0, / &physics mp_physics = 6, ! Thompson microphysics ra_lw_physics = 4, ! RRTM longwave ra_sw_physics = 4, ! RRTM shortwave radt = 30, sf_sfclay_physics = 1, ! MM5 surface layer sf_surface_physics = 2, ! Noah land-surface bl_pbl_physics = 1, ! YSU PBL cu_physics = 1, ! Kain-Fritsch cumulus cudt = 5, isfflx = 1, ifsnow = 1, icloud = 1, surface_input_source = 1, num_soil_layers = 4, sf_urban_physics = 0, / &fdda / &dynamics w_damping = 0, diff_opt = 1, km_opt = 4, diff_6th_opt = 0, diff_6th_factor = 0.12, base_temp = 290. damp_opt = 3, zdamp = 5000., dampcoef = 0.2, khdif = 0, kvdif = 0, non_hydrostatic = .true., moist_adv_opt = 1, scalar_adv_opt = 1, / &bdy_control spec_bdy_width = 5, spec_zone = 1, relax_zone = 9, specified = .true., nested = .false., / &grib2 / &namelist_quilt nio_tasks_per_group = 0, nio_groups = 1, /

real.exe卡顿排查三要素

  1. start_year/month/day必须与met_em.d01.*.nc文件名中的时间完全一致(如2021-01-01_00:00:00start_year=2021,start_month=01,start_day=01
  2. input_from_file = .true.&bdy_controlspecified = .true.
  3. met_em.d01.*.nc文件必须与namelist.inputstart_*/end_*时间覆盖,且位于$WRF_DIR/run/目录下

运行real:

$WRF_DIR/main/real.exe

成功生成wrfinput_d01,wrfbdy_d01后,即可运行主模式:

$WRF_DIR/main/wrf.exe

5. 运行失败时的三层诊断法:从日志定位到根因修复

WRF运行失败极少报出明确错误,多数表现为进程静默退出、CPU占用率归零、或rsl.error.0000中仅有一行ERROR: ...。必须建立分层诊断习惯。

5.1 第一层:检查rsl.error.0000与rsl.out.0000

所有WRF进程(real.exe,wrf.exe)会生成rsl.error.*rsl.out.*文件。首要动作是tail -n 50 rsl.error.0000

  • 若含ERROR: problem with input file→ 检查wrfinput_d01是否为空(ls -l wrfinput_d01),或namelist.inputinput_from_file设为.false.
  • 若含ERROR: could not open file wrfinput_d01→ 当前目录无该文件,或$WRF_DIR/run/路径错误
  • 若含ERROR: vertical levels do not matcheta_levels数量(27)与met_em.d01.*.ncbottom_top维度不一致(用ncdump -h met_em.d01.*.nc | grep bottom_top确认)

5.2 第二层:用strace捕获系统调用失败点

rsl.error无有效信息时,用strace追踪:

strace -f -e trace=openat,open,stat $WRF_DIR/main/wrf.exe 2>&1 | grep -E "(No such|Permission denied|denied)"

常见输出:

  • openat(AT_FDCWD, "/home/user/WRF_SRC/WRFV4/run/wrfinput_d01", O_RDONLY) = -1 ENOENT→ 文件确实不存在
  • openat(AT_FDCWD, "/usr/lib/x86_64-linux-gnu/libnetcdff.so.7", O_RDONLY) = -1 ENOENT→ NetCDF-Fortran库缺失

5.3 第三层:强制启用NetCDF调试与内存检查

namelist.input&time_control节中添加:

debug_level = 100, nocollect = .true.,

并在运行前设置环境变量:

export NC_DEBUG=3 export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libasan.so.6 $WRF_DIR/main/wrf.exe

NC_DEBUG=3会让NetCDF库输出详细I/O路径;libasan(AddressSanitizer)可捕获内存越界,常暴露wrf.exe因数组越界导致的段错误。

终极验证技巧:用wrf.exe自带的test_wrf.exe验证核心动力模块

cd $WRF_DIR/test/em_real ./compile em_real # 生成test_wrf.exe ./test_wrf.exe

若输出SUCCESS: All tests passed,证明WRF动力内核无编译缺陷,问题必在输入数据或namelist配置。


本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询