WRF气象模型
WRF模型介绍
WRF(Weather Research and Forecasting)是一套模块化的中尺度数值天气模式系统。当前最常用的动力核心是 WRF-ARW(Advanced Research WRF),科研与业务都很常见。
它的特点是“平台型”:你既可以把它当作生成气象场的工具(驱动扩散/化学/水文等模型),也可以做机理分析、个例复盘和敏感性试验。
适用场景(你可能为什么要用 WRF)
- 生成高时空分辨率气象场:用于扩散模型、化学传输模型、风资源/光伏评估、洪水/水文等下游模型驱动
- 强天气与局地环流个例:台风、飑线、山谷风、海陆风、城市热岛等
- 敏感性与归因:域设计、物理参数化、下垫面资料、SST/土壤湿度、同化策略对结果的影响
先 建立正确预期
- WRF 很“吃配置”:域设计 + 物理组合 + IC/BC 一致性,通常比“换更高级方案”更影响成败。
- 分辨率决定物理方案的用法:粗分辨率通常需要积云参数化;1-4 km 常进入对流“灰色地带”。
- 高分辨率不等于更准:地形/下垫面误差、观测稀疏导致的不确定性可能被放大;I/O 与算力成本也会急剧上升。
理论基础
WRF-ARW 的工程关注点通常比“方程写法”更重要,可以抓住这几条:
- 非静力、可压缩动力框架:支持从中尺度到对流尺度的模拟;强对流、陡地形、强风切变更容易触发数值不稳定。
- 交错网格与显式时间积分:水平常用 Arakawa C 网格;时间积分方案以显式方案为主,因此时间步长(CFL)对稳定性非常敏感。
- 地形追随垂直坐标(eta):复杂地形下的地形梯度、垂直层分布与扩散/滤波设置,会显著影响稳定性与近地层偏差。
- 物理参数化闭合次网格过程:微物理、积云、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.*:运行日志(并行时每个进程一份)
下载地址
- 官方主页:https://www2.mmm.ucar.edu/wrf/users/
- 源码仓库:
- 下载入口:WRF/WRF-Chem 与 WPS 通常在同一生态中发布(版本要配套)
- 核心文档:WRF Technical Note(动力/物理与数值实现细节)
系统要求(经验值)
- 操作系统: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',
/