跳到主要内容

WRF气象模型

WRF模型介绍

WRF(Weather Research and Forecasting)是一套模块化的中尺度数值天气模式系统。当前最常用的动力核心是 WRF-ARW(Advanced Research WRF),科研与业务都很常见。

它的特点是“平台型”:你既可以把它当作生成气象场的工具(驱动扩散/化学/水文等模型),也可以做机理分析、个例复盘和敏感性试验。

适用场景(你可能为什么要用 WRF)

  • 生成高时空分辨率气象场:用于扩散模型、化学传输模型、风资源/光伏评估、洪水/水文等下游模型驱动
  • 强天气与局地环流个例:台风、飑线、山谷风、海陆风、城市热岛等
  • 敏感性与归因:域设计、物理参数化、下垫面资料、SST/土壤湿度、同化策略对结果的影响

先建立正确预期

  • WRF 很“吃配置”:域设计 + 物理组合 + IC/BC 一致性,通常比“换更高级方案”更影响成败。
  • 分辨率决定物理方案的用法:粗分辨率通常需要积云参数化;1-4 km 常进入对流“灰色地带”。
  • 高分辨率不等于更准:地形/下垫面误差、观测稀疏导致的不确定性可能被放大;I/O 与算力成本也会急剧上升。

理论基础

WRF-ARW 的工程关注点通常比“方程写法”更重要,可以抓住这几条:

  1. 非静力、可压缩动力框架:支持从中尺度到对流尺度的模拟;强对流、陡地形、强风切变更容易触发数值不稳定。
  2. 交错网格与显式时间积分:水平常用 Arakawa C 网格;时间积分方案以显式方案为主,因此时间步长(CFL)对稳定性非常敏感。
  3. 地形追随垂直坐标(eta):复杂地形下的地形梯度、垂直层分布与扩散/滤波设置,会显著影响稳定性与近地层偏差。
  4. 物理参数化闭合次网格过程:微物理、积云、PBL、陆面、辐射等方案决定了“云怎么来、雨怎么下、近地层怎么混合”,对结果的影响常常不亚于换数据源。

补充两个常被忽略但很关键的点:

  • 投影与球形几何:Lambert / Mercator / Polar 等投影的选择会影响域内距离、角度与风场解释,尤其是大域或高纬。
  • 边界条件的“约束力”:WRF 不是“自由演化”的箱体实验,侧边界持续把大尺度信息灌入;当内域想跑出更强结构时,边界与内域物理/动力的不一致会以噪声或不稳定的形式表现出来。

模型构成和下载

模型系统组成

WRF 常见工作流可以理解为一条流水线:

  • WPS:网格/投影与地理场处理,并把外部资料插值到模式网格
  • real.exe:生成初始场与侧边界场(IC/BC)
  • wrf.exe:积分计算,输出 wrfout*
  • 后处理:诊断、制图、验证(站点/再分析/雷达/卫星/评分)

WPS/WRF 产物文件名有规律,熟悉后排错效率会高很多:

  • geo_em.d0*:地理场(地形/土地利用/土壤等)
  • met_em.d0*:外部资料插值到网格后的气象中间场
  • wrfinput_d0*:WRF 初始场
  • wrfbdy_d01:WRF 侧边界场
  • wrfout_d0*_*:模式输出(history)
  • wrfrst_d0*_*:重启文件(restart)
  • rsl.out.* / rsl.error.*:运行日志(并行时每个进程一份)

下载地址

系统要求(经验值)

  • 操作系统:Linux 最常见;macOS 可用于学习/开发(生产建议 Linux/HPC)
  • 编译依赖:Fortran/C 编译器(gfortran/ifort 等)、MPI(并行)、netCDF(I/O)
  • 算力与存储:随分辨率、嵌套层数、输出频率线性/超线性增长;请把 I/O(history_interval、输出变量裁剪)当作“必调项”
  • 内存与并行:格点数 * 变量数 * 时间层数决定内存占用;并行进程数提高到一定程度后,I/O 往往变成瓶颈

一个实用的“成本控制”策略:先用较粗分辨率跑通全链路与验证,再逐步加嵌套/加分辨率/加物理复杂度。

控制文件介绍(namelist)

WRF 的核心配置不是一个“.inp 控制文件”,而是两份 namelist:

  • namelist.wps:WPS 阶段配置(投影、域、时间、外部资料)
  • namelist.input:WRF 阶段配置(域/步长、物理方案、输出、边界/同化等)

它们决定了“网格怎么建、资料怎么插、模式怎么跑、输出怎么写”。


WRF namelist 的基本结构

namelist 由多个区块(&share&geogrid&time_control&domains&physics 等)组成,每个区块控制一类能力。下面给出一个“对照表”,方便快速定位参数应该写在哪里。

文件区块(示例)主要功能
namelist.wps&share模拟起止时间、数据间隔、嵌套数量等
namelist.wps&geogrid投影、网格尺寸(e_we/e_sn)、分辨率(dx/dy)、嵌套比、地理资料路径
namelist.wps&ungrib外部资料解码与 Vtable 设置(GRIB 类数据常用)
namelist.wps&metgrid插值到网格后的中间气象场生成规则
namelist.input&time_control积分起止、输出间隔、I/O 选项
namelist.input&domains域/嵌套、time_step、垂直层数、parent 关系
namelist.input&physics微物理/积云/PBL/陆面/辐射等物理组合
namelist.input&dynamics数值扩散/阻尼等稳定性相关设置
namelist.input&bdy_control侧边界更新频率与相关选项
namelist.input&namelist_quilt并行 I/O(quilt)与输出写入策略(HPC 常用)

&domains(域与时间步长)——最先把它跑稳

WRF 的稳定性通常优先受 dx/dy、嵌套比、time_step 影响。常见起步经验(不是最优解,只是安全起点):

time_step (s) ≈ 6 * dx(km)

嵌套时同时关注 parent_time_step_ratio,并保证与 parent_grid_ratio 一致或有明确理由。

域设计的几个“高收益原则”:

  • 外域要足够大:让天气系统在进入内域前完成调整;外域太小常见的症状是边界噪声、降水带被“切断”。
  • 嵌套比别太激进:常见 3 或 5;嵌套比越大,内域越容易出现数值噪声或不稳定。
  • 垂直层别只看数量:近地层分辨率(最低若干层厚度)决定 2m/10m、PBLH 与通量的可信度;顶高与阻尼层设置影响重力波反射。

&physics(物理参数化)——用“可解释的基线”起步

物理组合没有通用最优,建议先定一套“稳、保守、可解释”的基线,然后一次只改一类方案做敏感性。

一个便于沟通的分类方式:

  • MP(微物理):云水/冰相与降水形成
  • CU(积云):粗分辨率下补足次网格对流(对流许可尺度是灰色地带)
  • PBL(边界层):湍流混合与近地层结构
  • SFC/LSM(地表层/陆面):地表通量与下垫面状态
  • RA(辐射):短波/长波收支与云-辐射反馈

分辨率与积云参数化(CU)的关系可以用一句话记:

  • dx > 10 km:多数场景 CU 必开
  • 4-10 km:CU/MP/PBL 都敏感,建议做对照试验
  • 1-4 km:灰色地带,CU 开/关都可能带来系统性偏差
  • < 1 km:通常关闭 CU,关注 MP 与 PBL/LES 相关设置

如果你的目标是为下游扩散/空气质量提供气象驱动,建议优先把以下变量的时空连续性与偏差控制住:10m 风、2m 温湿、PBLH、降水(尤其是强降水时段)、稳定度相关量(热通量、摩阻速度等)。


示例片段

下面片段只示意“域/步长字段的组织方式”,便于做自己的模板(不是推荐参数集合)。

&domains
e_we = 160, 280,
e_sn = 130, 250,
e_vert = 45, 45,

dx = 15000, 3000,
dy = 15000, 3000,

parent_grid_ratio = 1, 5,
parent_time_step_ratio = 1, 5,

time_step = 90,
/

一个最小化的 namelist.wps 片段(仅示意结构):

&share
start_date = '2020-07-01_00:00:00','2020-07-01_00:00:00',
end_date = '2020-07-02_00:00:00','2020-07-02_00:00:00',
interval_seconds = 21600,
max_dom = 2,
/

&geogrid
parent_id = 1, 1,
parent_grid_ratio = 1, 5,
i_parent_start = 1, 50,
j_parent_start = 1, 40,
e_we = 160, 280,
e_sn = 130, 250,
dx = 15000,
dy = 15000,
map_proj = 'lambert',
ref_lat = 30.0,
ref_lon = 120.0,
truelat1 = 25.0,
truelat2 = 35.0,
stand_lon = 120.0,
geog_data_path = '/path/to/WPS_GEOG',
/

如何运行

准备工作

  1. 确定模拟设计:起止时间、输出频率、研究区范围、是否需要嵌套
  2. 准备外部资料(IC/BC):分析/再分析/预报场(例如 GFS/ERA5 等),并确认时间间隔与变量完整性
  3. 准备地理资料:地形、土地利用、土壤等地理场(WPS geog 数据集)

运行步骤(典型)

  1. WPSgeogrid.exe -> ungrib.exe -> metgrid.exe
  2. WRF 预处理real.exe
  3. WRF 积分wrf.exe
  4. 检查产物rsl.out.* / rsl.error.*wrfout*

常见命令形式(按你的 MPI 环境调整):

# WPS
./geogrid.exe
./link_grib.csh /path/to/grib/files
./ungrib.exe
./metgrid.exe

# WRF
mpirun -np 16 ./real.exe
mpirun -np 16 ./wrf.exe

结果分析

  • 一致性检查:时间轴、缺测、边界更新是否正常
  • 基础验证:2m 温度/10m 风、降水、PBLH 与站点/再分析对比
  • 客观评分:根据场景选 RMSE/bias、ETS、FSS 等;把流程固化比“临时画图”更重要

常用后处理工具组合(按团队习惯选):

  • Pythonxarray + netCDF4 + wrf-python + cartopy/matplotlib
  • 数据处理:NCO/CDO(重采样、时间合并、变量裁剪)
  • 三维可视化:VAPOR / ParaView

常见问题处理(排错顺序建议)

  1. CFL/NaN/爆点:先减小 time_step,再检查嵌套步长比与强地形区设置
  2. IC/BC 与时间频率:确认边界更新频率、缺测处理、SST/土壤场一致性
  3. 地形/下垫面匹配:投影、分辨率与地理数据路径是否一致,复杂地形优先做平滑/层结检查
  4. 再动物理:一次只改一类方案保留对照,否则很难归因

一些高频“症状 -> 线索”对照:

  • metgrid.exe 缺字段或时间不全:优先检查 interval_seconds、GRIB 时间序列完整性、Vtable 是否匹配数据源
  • real.exe 报缺少三维变量/层:检查外部资料是否包含所需层(例如高空温湿风),以及 met_em* 是否生成完整
  • wrf.exe 早期就 CFL:先减小 time_step,再检查强地形区域(地形过陡、垂直层太粗)、物理组合是否过“激进”
  • 运行正常但近地风偏大/偏小:优先看 PBL/SFC/LSM 组合、粗糙度与土地利用类型是否合理
  • 降水“条纹/棋盘格”:常与对流触发、扩散设置、嵌套反馈、输出间隔/插值有关;先做基线对照再定位

质量保证(建议形成清单)

  • 记录版本(WRF/WPS)、编译选项、namelist 与输入数据来源
  • 固定一个“基线实验”用于对照,避免每次都从头调参
  • 输出变量与频率尽量最小化以降低 I/O 成本与出错率

建议把 QA 做成每次都执行的检查点:

阶段你要确认什么典型检查方式
WPS 前起止时间、数据间隔与外部资料时间轴一致看数据清单与 interval_seconds
geogrid 后投影/域范围/地形是否合理简单制图 HGT_M / LANDUSEF
metgrid 后met_em* 时间连续、关键变量齐全统计文件数量与变量列表
real 后wrfinput*wrfbdy* 生成且无异常rsl.error.* 关键报错
wrf 后输出时间轴正确、无明显爆点、关键诊断量合理rsl.out.*、制图/站点对比

进一步阅读

  1. Skamarock, W. C., et al. (2019). A Description of the Advanced Research WRF Model Version 4. NCAR Technical Note. https://www2.mmm.ucar.edu/wrf/users/docs/technote/v4_technote.pdf
  2. Powers, J. G., et al. (2017). The Weather Research and Forecasting Model: Technical Overview. BAMS. https://journals.ametsoc.org/view/journals/bams/98/8/bams-d-15-00308.1.xml
  3. WRF Users Page (Docs & Tutorials). https://www2.mmm.ucar.edu/wrf/users/
  4. WPS Documentation. https://github.com/wrf-model/WPS