WRF模式安装指南:从Linux环境配置到依赖库编译的完整实践
简介《WRF模式学习——从Linux安装开始》是一份面向气象与大气科学初学者、以零基础搭建预报模式环境为目标的中文图解教程。它围绕CentOS 5.2操作系统从启动安装光盘开始详细演示语言选择、磁盘分区规划、交换分区大小设置、引导程序配置、网络与域名服务器参数填写、时区选择、管理员密码设定、软件包定制以及首次启动后的防火墙、安全增强、崩溃转储、日期时间、普通用户创建等环节教程还延伸到编译器安装为后续运行气象模型做好准备。步骤配有大量截图按操作顺序推进适合高校学生和科研人员对照学习。这份PDF共有1个文件类型为PDF电子书压缩包大小约8.53兆字节便于下载后离线查看。当前已有116人浏览学习。通过跟随教程读者既能掌握从空白硬盘到可用系统的完整流程也能理解分区、网络、安全策略等系统管理概念为之后在Linux上完成气象模型的编译、运算与结果处理奠定扎实基础。1. 为什么 WRF 学习的第一道门槛是 Linux气象圈有个共识WRF 模式跑不通八成不是模式本身的问题而是编译环境和依赖库没配对。网上大量报错集中在undefined reference、netcdf路径找不到、cpp预处理失败追根溯源全是 Linux 环境变量和库版本错位。WRF 从代码到可执行文件要经过 configure、compile 两步每一步都在跟编译器、MPI、netCDF、HDF5 打交道这套工具链天然生长在 Linux 上。Windows 用户想绕开 Linux 直接玩 WRF要么用 WSL 要么上虚拟机本质还是 Linux。所以《wrf模式学习_从linux安装开始.pdf》这个标题抓得很准——这不是一本入门书的章节顺序而是踩过坑的人总结出的正确路径先建环境再谈模式。这篇博文就按环境→依赖→WPS→WRF→验证这条线把每一步的为什么和怎么做讲透。2. 安装前的 Linux 环境规划与选型2.1 虚拟机、WSL 还是双系统先想清楚用途再选WRF 编译对 CPU 核数和内存有硬性要求——mpirun -np 4跑一个 30 公里分辨率的区域模拟单次 24 小时预报大约需要 4~6 GB 内存编译阶段也吃 2~4 GB。如果你的笔记本只有 8 GB 内存虚拟机里跑 WRF 会非常吃力swap 一旦顶上来编译一晚上都完不成。常见做法是分三种情况纯学习、跑理想案例用 VMware Workstation 或 VirtualBox 装 Ubuntu Server不带桌面分配 4 核 8 GB磁盘 60 GB 足够。Server 版没有图形界面省内存而且后续所有操作都在终端正好把 Linux 基础补上。跑真实数据、业务化模拟建议双系统或者直接上服务器。真实数据模拟的 GEOG 静态地理数据解压后约 20~30 GB一个月的模拟实验数据轻松超过 100 GB看输出频率。双系统直通硬件不让虚拟化层吃掉 10%~15% 的性能。只做前处理或后处理WSL2 就够了。但注意 WSL2 的跨文件系统 I/O 很慢WRF 编译会产生大量小文件放在/mnt/c/下会慢到怀疑人生。把整个 WRF 目录树放到 WSL 自己的文件系统里~/下编译时间能差 3 倍以上。安装 Ubuntu 时有一个很多人忽略的选项——软件更新。Ubuntu Desktop 默认让你联网下载更新这一步在虚拟机里经常卡半小时。装 Server 版不会问这个装完再手动apt update。系统装完后第一件事是换源用清华或阿里镜像否则apt install的速度会让人放弃学习。2.2 系统级依赖编译器、MPI、Python 分步装齐WRF 4.x 支持 gfortran 和 Intel ifort 两套编译器。如果只是学习用 gfortran 就够了——Intel 编译器需要申请免费许可证学生/研究人员可申请License 文件配置本身又是一道坎。下面是一套经过验证的系统依赖安装流程# 更新系统并安装编译基础套件 sudo apt update sudo apt install -y build-essential gfortran cpp m4 curl wget git # MPI 并行环境OpenMPI 或 MPICH二选一 sudo apt install -y libopenmpi-dev openmpi-bin # WPS 解 GRIB 格式所需的 JPEG 库缺少它 ungrib 无法读取 GFS 数据 sudo apt install -y libjpeg-dev zlib1g-dev # Python 环境后处理用不影响 WRF 编译 sudo apt install -y python3 python3-pip检查一下各组件是否装好版本号以实际输出为准gfortran --version mpirun --version python3 --version提示OpenMPI 和 MPICH 都是 WRF 支持的 MPI 实现但混用会出问题。如果你的系统里已经装了 MPICH就不要再用 OpenMPI反之亦然。检查方法which mpirun看路径指向哪个实现。Ubuntu 22.04 以上系统的默认 gfortran 是 11/12 版编译 WRF 4.4 及以下版本可能要加-fallow-argument-mismatch编译选项因为模式代码里存在 Fortran 77 时代遗留下来的实参-形参类型不一致调用新版 gfortran 默认把这当作报错。这个参数加到 WRF configure 生成的configure.wrf里具体位置在FCOWNFLAGS那行第 2 章会详细讲。3. 依赖库编译netCDF、HDF5、libpng 的版本兼容链3.1 库的编译顺序为什么是 zlib → hdf5 → netcdf-c → netcdf-fortranWRF 的数据 I/O 依赖 netCDF而 netCDF 4.x 底层依赖 HDF5 做压缩存储HDF5 又依赖 zlib 做压缩算法。这个依赖链决定了编译顺序只能从底往上。另一个关键点是 netCDF-C 和 netCDF-Fortran 是两套独立的库——WRF 用 Fortran 写主程序但读写 netCDF 文件走 C 接口所以两套都得装且 Fortran 版本的编译必须能看到 C 版本的安装路径。WPS 还需要 libpng 和 jasper或 libjpeg-turbo用于压缩/解压 GRIB2 格式的卫星和雷达数据。NCEP 的 GFS 业务数据从 2015 年起全面转向 GRIB2没有 jasper 库ungrib 碰到.t00z.master.grb2这类文件会直接报ERROR: Error in GRIB2 library。下面是一套无 sudo 权限的安装方式全部装到$HOME/WRF_LIB下这样不会污染系统目录也方便多版本切换export WRF_LIB$HOME/WRF_LIB export CCgcc export CXXg export FCgfortran export FCFLAGS-m64 export CFLAGS-m64 export PATH$WRF_LIB/bin:$PATH export LD_LIBRARY_PATH$WRF_LIB/lib:$LD_LIBRARY_PATH # 1. zlib基础压缩库 cd $WRF_LIB wget https://zlib.net/zlib-1.3.1.tar.gz tar -xzvf zlib-1.3.1.tar.gz cd zlib-1.3.1 ./configure --prefix$WRF_LIB make -j4 make install # 2. hdf5netCDF4 的底层存储格式 wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.14.0/src/hdf5-1.14.0.tar.gz tar -xzvf hdf5-1.14.0.tar.gz cd hdf5-1.14.0 ./configure --prefix$WRF_LIB --enable-fortran --enable-hl make -j4 make install # 3. netcdf-c必须有 --enable-netcdf-4 但默认已开 wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.9.2.tar.gz tar -xzvf v4.9.2.tar.gz cd netcdf-c-4.9.2 ./configure --prefix$WRF_LIB --enable-shared make -j4 make install # 4. netcdf-fortran必须在前三者装好之后 wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.6.1.tar.gz tar -xzvf v4.6.1.tar.gz cd netcdf-fortran-4.6.1 ./configure --prefix$WRF_LIB --enable-shared make -j4 make install这段脚本的要点--enable-fortran是 HDF5 的关键选项不启用的话 netCDF-Fortran 编译时找不到 HDF5 的 Fortran 模块--enable-hl提供高层 APINCO 工具和部分后处理脚本依赖它。netCDF-C 和 netCDF-Fortran 的版本要匹配比如 4.9.2 对应 4.6.1具体匹配关系在 netCDF 官网的版本兼容表里装完记得用nc-config --all和nf-config --all检查。编译完成后如果不打算长期保留源码目录至少保留一个build_log文件把每个库的配置参数记下来。WRF 编译出问题时排查依赖库版本有 log 可以快速对照。3.2 环境变量写进 .bashrc 的 3 个关键路径库装好后不写环境变量等于白装。WRF 编译脚本找 netCDF 靠的就是环境变量NETCDF它必须指向 netCDF-C 的安装前缀目录不能指到 netcdf-fortran也不能只指到/usr。WPS 需要JASPERLIB和JASPERINC两个独立变量分别指示库文件和头文件位置。# 编辑 ~/.bashrc追加以下内容 export WRF_LIB$HOME/WRF_LIB export PATH$WRF_LIB/bin:$PATH export LD_LIBRARY_PATH$WRF_LIB/lib:$LD_LIBRARY_PATH export NETCDF$WRF_LIB export JASPERLIB$WRF_LIB/lib export JASPERINC$WRF_LIB/include export HDF5$WRF_LIB # 让配置立即生效 source ~/.bashrc一个容易翻车的细节NETCDF指向的目录下必须同时有lib/libnetcdf.a或.so和include/netcdf.inc。Fortran 代码里用的是include netcdf.inc不是netcdf.mod所以如果只装了 netcdf-fortran 而没装 netcdf-c编译会报找不到netcdf.inc但实际缺失的是 C 库的头文件。验证环境的方式不是echo $NETCDF看一遍而是直接写个最小 Fortran 程序调用 netCDF API。WRF 自带了验证脚本在 WRF 源码目录执行./configure后编译test/em_real前可以先做一次更简单的检查# 验证 netCDF-Fortran 编译器能正常工作 cd $HOME cat test_nc.f90 EOF program test_nc use netcdf integer :: ncid, status status nf90_create(test.nc, NF90_CLOBBER, ncid) status nf90_close(ncid) print *, netCDF test passed end program EOF gfortran test_nc.f90 -o test_nc $(nf-config --fflags) $(nf-config --flibs) ./test_nc如果输出的不是netCDF test passed问题基本在LD_LIBRARY_PATH或nf-config路径不对。优先检查$WRF_LIB/lib下的.so文件是否真实存在以及source ~/.bashrc是否真的执行过——很多人在新终端里测试但后台任务比如 nohup 启动的编译继承的是旧环境变量。4. WPS 编译geogrid、ungrib、metgrid 的前处理分工4.1 WPS 三个模块各管什么编译顺序怎么排WPSWRF Preprocessing System是 WRF 的数据前处理套件包含三个可执行文件geogrid.exe、ungrib.exe、metgrid.exe。它们的职责划分很清晰geogrid把静态地理数据地形高度、土地利用、土壤类型插值到你的模拟网格上。它需要一份 GEOG 静态数据目录通过namelist.wps里的geog_data_path指定。ungrib把 GRIB 格式的气象场来自 GFS/FNL/ERA5解码成 WRF 能读的中间格式。核心依赖是 jasper/libpng。metgrid把 ungrib 处理好的气象场水平插值到 geogrid 定义的网格上输出met_em*文件供 WRF 的real.exe使用。编译顺序是 WRF 源码和 WPS 源码按WRF 先编译、WPS 后编译来。原因在于 WPS 的配置脚本会检查 WRF 安装目录下的external/io_netcdf等库文件WRF 没编译完WPS 就会在 configure 阶段报WRF_DIR not found。所以标准操作是先编译 WRF 的em_real模式不需要全部编译完再进入 WPS 源码目录编译。WPS 的 configure 命令和 WRF 类似# 确保 WRF 主目录的环境变量指向已编译好的 WRF 源码根目录 export WRF_DIR$HOME/WRF-4.5 cd $HOME/WPS-4.5 ./configure # 选 3Linux x86_64 gfortran串行版选 1并行版选 3 ./compile 21 | tee compile_wps.log./compile结束后的验证ls -l *.exe如果只有geogrid.exe而没有ungrib.exe和metgrid.exe说明 jasper 库配置有问题。这时候回到 configure.wps 文件看COMPRESSION_LIBS和COMPRESSION_INC两行的路径是否准确指向$JASPERLIB和$JASPERINC。4.2 namelist.wps 的关键参数和多层嵌套网格设置WPS 的运行靠namelist.wps驱动核心参数集中在geogrid和metgrid两个节。新手最容易错的是e_we、e_sn这两个维度参数——它们定义网格格点数不是区域经纬度范围。格点数和区域范围的关系是e_we减s_we加 1 等于东西向格点数ref_lat和ref_lon指定模拟区域中心。嵌套网格的e_we、e_sn需要满足父网格格点数减 1 能被parent_grid_ratio整除否则报错tile decomp error。一个典型的两层嵌套配置如下geogrid parent_id 1, 1, parent_grid_ratio 1, 3, i_parent_start 1, 50, j_parent_start 1, 40, e_we 100, 100, e_sn 100, 100, geog_data_res modis_lulc,modis_lulc, dx 27000, dy 27000, map_proj lambert, ref_lat 35.0, ref_lon 105.0, geog_data_path /home/yourname/WPS_GEOG/ /逐项拆解外层dx27000表示 27 km 分辨率内层 9 km27 除以parent_grid_ratio3。i_parent_start和j_parent_start表示内层左下角在外层网格里的起始格点位置这个值必须先跑一次geogrid.exe看输出再微调——因为嵌套层可能在边界处错开半个格点导致地形插值有偏差。geog_data_res建议用modis_lulc它对应 MODIS 土地利用数据比旧的usgs精度更好但下载的 GEOG 数据包需要对应版本。geog_data_path指向的目录要在运行geogrid.exe前准备好。官方 GEOG 数据分两个版本完整版geog_complete.tar.gz约 20 GB和解压后按模块存放的目录树。下载后最好检查一下目录里有没有HGT、LU_INDEX等子目录名带大写字母缺少任何一个geogrid 都会在日志里报Tile: 1后退出没有任何其他提示。4.3 ungrib 的 Vtable 选择和 GRIB 数据时次处理ungrib 处理数据前必须选 Vtable——它告诉 ungrib 如何从 GRIB 码中提取变量。不同的数据源GFS、FNL、ERA5对应不同的 Vtable 文件存放在 WPS 的ungrib/Variable_Tables目录下。常见对应关系数据源Vtable 文件说明NCEP GFS0.25 度Vtable.GFS最常用日常预报NCEP FNL1 度Vtable.GFS再分析数据做研究用ERA50.25 度Vtable.ERA5ECMWF 再分析需要额外装 ecCodesGFS 预报场的 GRIB2Vtable.GFS新版 GFS 已全 GRIB2选好 Vtable 后需要先链接到 WPS 根目录再创建指向 GRIB 数据文件的软链接文件命名必须带时次比如GFS_2019100100。然后用link_grib.csh脚本批量链接# 链接当前目录下所有 GFS 前缀的 GRIB 文件 ./link_grib.csh /data/input/GFS_20191001* # 查看链接结果是否正确剥离了路径 ls -l GRIBFILE.* # 链接 Vtable 并运行 ungrib ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable ./ungrib.exeungrib 运行成功的标志是当前目录生成FILE:2019-10-01_00这类前缀为FILE:的中间文件。生成不了的原因十有八九是 jasper 库版本不对——它要求libjasper.a存在且能被链接到libjpeg不能替代。如果报GRIB2: unable to open GRIB2 message先检查namelist.wps里ungrib节的out_format是否设为WPSprefix是否为FILE。5. WRF 核心编译configure 选项和 em_real 的完整流程5.1 configure 选项编号背后的平台识别逻辑进入 WRF 源码目录执行./configure它会先做平台探测操作系统、编译器、MPI 类型然后列出一长串选项。4.5 版本通常显示 34~40 个选项其中 Linux 平台对应几个关键项选项 1/3/4 等串行或 OpenMPI 并行编译选项 15 附近Intel 编译器ifort对应项选项 34 附近gfortran OpenMPI 的标准组合选择完编译器后系统还会问嵌套网格的并行方式1basic, 2presets, 3large。这个选项影响dmpar并行模式下的网格分区策略学习阶段选 basic 就行等跑出真实实验再考虑 presets。configure 完成后会生成configure.wrf文件里面记录了编译器路径、编译选项和库路径。任何环境变量在 configure 之前没设好这里都是错的。最常见的问题是NETCDF路径没导出configure 会提示NetCDF not found。这时候不要急着重新 configure先执行echo $NETCDF看返回值再决定是否修正后重跑。5.2 compile em_real 和 em_b_wave 的取舍WRF 源码的compile脚本接受模式参数./compile em_real编译真实数据案例所需的全部程序./compile em_b_wave编译理想化算例理想化热带风暴。两者的区别在于em_real需要 real.exe、wrf.exe、ndown.exe 三个程序编译时间长单核约 60~90 分钟4 核并行约 20~30 分钟。em_b_wave只需 wrf.exe 一个程序且不依赖外部数据编译完直接跑就能验证安装是否正确。学习阶段建议两个都编译先用em_b_wave快速验证编译链没问题再编em_real用于真实数据模拟。命令如下cd $HOME/WRF-4.5 ./compile em_b_wave 21 | tee compile_em_b_wave.log # 查看主程序是否生成 ls -l main/*.exemain/wrf.exe是核心可执行文件如果没生成往下看日志末尾的 ERROR 行。常见错误分三类netcdf.inc not foundNETCDF环境变量指错了或者 netcdf-c 没装。undefined reference to e_conv这是一个经典错误原因是 WRF 源码里的某个 Fortran 模块被编译器优化掉了或者 gfortran 版本太新需要给 configure.wrf 里的FCOWNFLAGS加-fallow-argument-mismatch。4.5 版本默认不含这个选项但 gfortran 10 必须加。Error: Type mismatch报错指向某个 .f90 文件同样是新编译器和老代码不兼容的问题除了上述参数外有些情况需要把FFLAGS里的-O2降为-O1尝试。对于真实数据模拟编译命令换成./clean -a # 重要换编译选项前先完全清理 ./configure # 重新 configure ./compile em_real 21 | tee compile_em_real.log ls -l main/real.exe main/wrf.exe main/ndown.exe./clean -a是切换编译器或修改编译选项后必做的操作。很多人直接重跑./compile导致新配置不生效因为旧的目标文件残留。-a表示完全清理包括移除所有.o文件、*.mod文件以及生成的externals库。这步不执行改 configure.wrf 基本等于白改。5.3 namelist.input 的必备参数和分层设置真实数据模拟的namelist.input是 WPS 的 namelist.wps 的延续。它必须和 WPS 里的网格设置严格对应否则 real.exe 阶段会报错。关键区别在于 WPS 的e_we、e_sn对应的是整个模拟区域的格点数而 WRF 的e_we、e_sn必须加 1——因为 WRF 网格的边界需要多一个虚点。一个可用的单层 27 km 模拟配置片段time_control run_days 0, run_hours 24, start_year 2024, 2024, start_month 01, 01, start_day 01, 01, start_hour 00, 00, end_year 2024, 2024, end_month 01, 01, end_day 02, 01, end_hour 00, 00, interval_seconds 21600, input_from_file .true., .true., history_interval 360, 360, frames_per_outfile 1, 1, restart .false., io_form_history 2, io_form_restart 2, io_form_inputdata 2, io_form_boundary 2, / physics mp_physics 8, 8, ra_lw_physics 4, 4, ra_sw_physics 4, 4, radt 10, 10, sf_sfclay_physics 2, 2, sf_surface_physics 2, 2, bl_pbl_physics 2, 2, bldt 0, 0, cu_physics 5, 5, cudt 0, 0, num_soil_layers 4, / domains time_step 162, max_dom 1, e_we 101, 101, e_sn 101, 101, dx 27000, dy 27000, parent_grid_ratio 1, 3, i_parent_start 1, 50, j_parent_start 1, 40, p_top_requested 5000, num_metgrid_levels 34, /time_step的选取遵循一个经验法则时间步长秒约等于网格分辨率km乘以 6即time_step dx * 6。27 km 网格取 162 秒9 km 网格取 54 秒。取的太大超过 10 倍会导致 CFL 条件不满足模型发散报错信息通常是Floating point exception或者cfl exceeded。num_metgrid_levels要和 WPS 里 metgrid 输出的垂直层数一致GFS 数据通常 34 层不一致会报Mismatch between namelist and met_em file。运行流程按顺序执行# 1. 链接 WPS 输出的 met_em 文件 ln -sf /home/user/WPS-4.5/met_em.d01.2024-01-01_00.nc . # 2. real.exe 生成初始场和边界场 ./real.exe # 3. 检查 rsl.error.0000没有 ERROR 字段 # 4. 运行主程序并行 mpirun -np 4 ./wrf.exereal.exe跑完一定要看rsl.error.0000文件的末尾。见到SUCCESS COMPLETE REAL_EM_INIT才是真正成功。WRF 的报错不显示在终端全在rsl.*文件里这是新手最不适应的点。6. 用 em_b_wave 花半小时验证整条工具链很多文章推荐编译完em_real就急着找 GFS 数据跑真实案例这是绕远路——真实数据的下载、预处理、数据格式问题容易把新手劝退。更稳妥的路径是先跑通 WRF 自带的em_b_wave理想化成涡baroclinic wave案例它不依赖 WPS不依赖外部数据直接在 WRF 目录下就能跑整个流程只需要 20~30 分钟。在已经编译过em_b_wave的前提下从test/em_b_wave目录启动cd $HOME/WRF-4.5/test/em_b_wave ln -sf ../../main/wrf.exe . ./wrf.exe运行结束后检查输出终端不报错rsl.error.0000中无ERROR或FATAL字样。wrfout_d01_0001-01-01_00:00:00文件生成。用 Python 简单验证输出文件的变量维度from netCDF4 import Dataset nc Dataset(wrfout_d01_0001-01-01_00:00:00) print(nc.variables[T2][:].shape) # 期望输出 (1, 1, 1, 1) print(nc.variables[U][:].min(), nc.variables[U][:].max())这个案例的价值在于它把编译器、MPI、netCDF、HDF5 一整条链全部跑通了任何一环有问题都会在这里暴露。等这一步顺利再去找 GFS 数据走 WPS 流程心理负担小很多。关于time_step的调试这里有一个判断发散的小技巧跑真实案例出现数值发散时先看rsl.out.0000里输出的最大风场值——如果风速到了几百米每秒说明时间步长太大或地形格距太小。此时不是急着调小time_step到 30 秒那么极端而是先用dt\dx的单倍值跑 10 分钟看是否稳定再逐步加大到 6 倍经验值。类似地wrfout文件里的变量可以用ncdump -h快速查看全部变量列表确认输出频率和变量是否按 namelist 写入了。至此从 Linux 安装、依赖库编译、WPS 前处理到 WRF 编译验证一套完整流程已经走通。这套方法不挑数据源GFS、FNL、ERA5 都会走同一个流程只是 Vtable 和下载地址不同。把基础打牢后任何模式实验的推进都只是换数据、换参数的问题而不是和编译环境纠缠。本文还有配套的精品资源点击获取