WRF BEP+BEM城市冠层方案输出变量详解与后处理指南

发布时间:2026/10/10 9:40:47
WRF BEP+BEM城市冠层方案输出变量详解与后处理指南
第一次跑完带 BEPBEMBuilding Effect Parameterization Building Energy Model的 WRF 模拟兴冲冲打开wrfout文件时我盯着变量列表愣了半天——熟悉的 T、U、V、P 都在但突然冒出来一堆URB_FLAG2D、T_URB_01、ACM_T_01、URB_AC_Q这种没见过的东西一时根本分不清哪些该用来画图、哪些该用来算能量平衡、哪些其实只是中间诊断量。这不是你操作有问题而是 BEPBEM 这个城市冠层方案确实会往输出文件里塞一批专属变量。这篇就把wrfout里 BEPBEM 相关的输出变量彻底捋一遍哪些是方案新增的、变量名怎么拆开读、单位是什么、做后处理时怎么用以及最容易翻车的几个默认变量坑。内容主要面向刚切到 BEPBEM 做城市气候模拟的同学也适合从 SLUCM单层城市冠层转过来的老手毕竟两套方案的输出逻辑差别非常大。1. 先搞懂 BEPBEM 往 WRF 里“塞”了哪些物理过程拿到变量清单之前最好先把物理过程在脑子里过一遍。否则你看着那一串ACM_*、UTM_*、URB_AC_*只会觉得是乱码。BEPBEM 和传统 SLUCM 最大的区别有两个一是把城市从“平板”变成了“多层盒子”二是把“室内”卷进了模拟。理解了这两点后面看变量名基本就能猜个八九不离十。1.1 从“平板城市”到“多层盒子城市”BEP 改变了什么默认的 WRF 陆面过程里城市下垫面在绝大多数方案里是被简化成一块“粗糙平板”来处理的代表性的就是 SLUCM 这种单层方案它把城市浓缩成一个有屋顶、有墙体、有道路的几何抽象层但垂直方向上只做一层整体处理。而 BEP 的思路完全不同——它把城市描述成若干栋“盒子”建筑每个盒子有四个朝向的立面加一个屋顶建筑之间有街道峡谷整个冠层内部再垂直划分成多层。这意味着模式在一个城市网格点上要同时对屋顶、迎风墙、背风墙、道路分别做能量平衡求解。每一个面的辐射收支、感热、潜热、蓄热都是独立的不能混在一起。对应到wrfout里最直观的变化就是带后缀的数字——那些T_URB_01、ACM_Q_03里的01、03其实就是 BEP 冠层内部的垂直层序号默认是 5 层具体看 namelist 里的num_urban_layer。你在城市格点上看到三维气象变量不再只是一层“地面值”而是冠层内不同高度的多层值这就是“多层盒子”的直接体现。另外BEP 对辐射的处理也复杂得多建筑之间会互相遮挡、反射街道峡谷里的阴影位置随太阳高度角变化。所以wrfout里会多出一些辐射相关的过程量。这类变量在 SLUCM 里根本不存在因为平板城市不需要考虑“影子”。1.2 BEM 把“室内”也卷了进来BEP 负责描述建筑外壳和街道峡谷的能量过程BEM 则解决建筑内部的问题墙体传热、窗户的短波和长波辐射透过、自然通风、空调设定温度、空调运行状态、室内设备产热等等。一句话概括BEM 输出的是“建筑对大气的影响”——通过空调排放到室外的感热和潜热以及“建筑自身的能源需求”——空调耗电负荷。为什么这个对做城市气候模拟的人特别重要因为城市人为热的很大一部分来自空调排放。你模拟夏季热浪时如果只算交通和工业的人为热忽略空调的显热和潜热排放城市边界层和地表温度的模拟结果会有明显偏差。BEM 把这个过程直接耦合进了 WRF所以wrfout里必然会出现跟空调能耗、空调排放直接相关的变量。天气热的时候建筑往外喷热量晚上红外面里的城市热岛很大一部分就得靠这些变量来解释。1.3 输出变量种类与物理过程的对应关系把上面两个机制跟变量体系对照着看规律就很清晰了物理过程输出变量类别前缀/后缀特征城市格点标识哪些格点是城市、属于哪类城市URB_FLAG2D、URB_PCT类冠层内状态温度、湿度、位温、密度T_URB_##、Q_URB_##、THETA_URB冠层内通量动量、热量、水汽、示踪物的累积通量ACM_U##、ACM_T##、ACM_Q##建筑能耗空调显热、潜热、电耗URB_AC_Q、URB_AC_H、URB_AC_EL人为热建筑排放到大气中的总热通量HEATRATE相关辐射过程量阴影系数、立面吸收的短波辐射等SHA_F、S_A类后面所有变量解释本质上都是这张表的展开。先有这张表打底你再看具体变量就不会懵了。2. wrfout 新增变量逐组拆解从格点标识到空调能耗这节按功能分组把 BEPBEM 跑出来后wrfout里常见的专属变量逐个说清楚。先说一句通用的不同 WRF 版本之间变量命名可能会有细微差异比如有的版本叫URB_FLAG2D有的叫URB_FLAG但物理含义基本一致。最稳妥的办法始终是打开自己那份输出直接ncdump -h看定义我在第 4 节会讲具体操作。2.1 城市格点标识与分类变量这一类变量的作用是告诉你模拟域里哪些格点是城市以及城市格点上用的是哪类城市形态参数。重点看这几个URB_FLAG2D/URB_FLAG城市格点标识。一般是 1 表示该格点启用 BEPBEM 城市参数化0 表示非城市格点。做城市和非城市对比实验时这个变量就是你的“选区工具”。LU_INDEX这个虽然是默认变量但要注意在 BEPBEM 的下它决定了格点使用哪一组城市形态参数低密度居民区、高密度居民区、商业区等。同一个城市格点LU_INDEX不同后面的建筑高度、街道宽度、墙体材质参数全都不一样。部分版本会输出城市比例相关变量如城市覆盖比例用于描述一个格点内城市所占的面积权重。这个量对后处理能量平衡计算很重要——因为一个格点的通量是城市部分和自然部分加权平均的结果。实操建议先画一张URB_FLAG2D的空间分布图确认你的城市格点位置和你预设的研究区一致。这一步能快速排除“城市没激活”“格点选错”这类低级问题。经常有人费半天劲分析一个点回头发现那个格点根本就不是城市痛啊。2.2 多层冠层内的状态变量温度、湿度、位温这是 BEPBEM 下城市格点独有的一组变量直接描述冠层内部街道峡谷和建筑之间的空气层的气象状态。T_URB_01~T_URB_05冠层内各层空气温度单位 K。01是最底层贴近街道地面05是最顶层接近建筑屋顶高度。这个变量是理解城市街谷热环境的直接依据画城市冠层内温度廓线就靠它。Q_URB_01~Q_URB_05冠层内各层比湿单位 kg/kg。THETA_URB冠层内的位温有些版本按层输出具体看版本用于热力结构的分析更合适因为位温可以直接做层结稳定性判断。RHO_URB_01~RHO_URB_05冠层内各层空气密度单位 kg/m³。有些通量换算时要用它比如把质量通量转体积通量。这组变量的关键价值在于默认的T2、Q2只是“诊断层”的温湿度代表的是模式最底层到 2m 之间的插值估计在城市冠层的复杂环境下参考意义有限。想真实反映街谷里的气温应优先用T_URB_01这类冠层内变量。我在算城市热岛强度时基本都以T_URB_01作为“街谷气温”的代理比T2稳定得多。2.3 多层冠层内的通量变量细说ACM_*这一组是 BEP 的核心输出也是最容易用错的变量因为它们是累积量不是瞬时通量。ACM_U01~ACM_U05冠层内各层的累积动量通量单位是 N·s/m² 或 kg·m/s 的累积形式。简单理解就是这一层的湍流动量交换在输出时段内积累了多少钱。ACM_T01~ACM_T05冠层内各层的累积热量通量感热单位 J/m²。ACM_Q01~ACM_Q05冠层内各层的累积水汽通量潜热单位 J/m²以汽化潜热折算或 kg/m²取决于版本定义。ACM_TRA_URB01~ACM_TRA_URB05冠层内各层的累积示踪物通量。如果你开了化学模块或者示踪物模拟这组就有意义否则可以不看。UTM_URB01~UTM_URB05冠层内各层的城市动量通量瞬时项部分版本输出。为什么 BEP 要输出“累积”而不是“瞬时”因为城市冠层内的湍流通量波动剧烈瞬时值的取样噪声大反过来WRF 在全球/区域尺度积分时累积量能直接用于能量收支计算。所以模式默认把这些通量按时间累积起来后处理时你再根据自己的需要做差分换算成平均通量。举个例子我们想拿到城市格点冠层第一层的平均感热通量W/m²假设wrfout输出间隔是 1 小时那么F_sensible (ACM_T01(t1h) - ACM_T01(t)) / 3600 # 单位 W/m²如果直接拿来用ACM_T01的原始数值画图画的其实是累积热量J/m²单位都错了数据翻了不知道多少倍。这个坑我见很多人踩过。2.4 建筑能耗与空调排放变量BEM 引入后wrfout里会出现一整套跟建筑能耗相关的变量做城市热岛和能源气象交叉研究的人会特别关注这组。URB_AC_Q空调系统排放到大气中的感热通量单位 W/m²。数值越大说明空调把室内热量“搬”到室外的越多。这也是夏季城市傍晚高峰时段热岛增强的重要来源之一。URB_AC_H空调排放的潜热通量与湿气相关单位 W/m²。做湿热环境分析时不能只看感热空调的潜热排放会增加街谷内的湿度影响体感温度和露点。URB_AC_EL空调用电负荷相关的输出部分版本有通常与URB_AC_Q伴生。做城市能源需求模拟时这个变量可以直接转化为电力负荷曲线跟实际电网负荷做对比验证。HEATRATE人为热通量综合量单位 W/m²。在 BEPBEM 下它包含了建筑空调排放和部分其他城市人为热源。做城市能量平衡方程时这项往往作为“anthropogenic heat flux”直接进方程。这里有个实际经验空调排放变量的“峰值”和“滞后性”非常值得琢磨。你在画URB_AC_Q日变化曲线时会发现它跟着太阳辐射走但峰值往往落后于太阳辐射峰值 1-3 小时。这个滞后来自建筑的蓄热和空调温控的反馈。如果模拟结果里空调排放峰值和太阳辐射峰值完全同步反而要怀疑墙体热容参数设置是不是有问题。2.5 辐射处理相关变量因为 BEP 要考虑建筑之间的遮挡和反射wrfout里还会出现一些辐射角度相关的辅助变量。SHA_F阴影系数或类似名称的变量描述建筑和街道某一面被阴影覆盖的比例。日出和日落时街道峡谷里阴影分布变化剧烈这个变量是理解街谷内辐射非对称性的关键。S_A类变量冠层立面或屋顶吸收的短波辐射。不同朝向的立面吸收的太阳辐射差异很大南墙和北墙在冬季可以差出好几倍这些都体现在这组变量里。这类变量虽然不像温度和通量那样常用但在做街谷辐射收支、验证能量闭合时是绕不开的中间量。如果你只是做常规的城市热岛模拟可以不用太深入至少知道它们存在就行。2.6 可选输出CO2 与示踪物如果你在编译 WRF 和配置 BEPBEM 时开了 CO2 或示踪物选项还会看到CO2_URB这类变量表示城市 CO2 直接排放。它的量级和城市能源消耗直接相关做城市碳循环、CO2 浓度模拟的人会用到。没开的话这部分在wrfout里就不存在不用纠结。3. 默认变量含义被改写城市网格上的 T2、SH、坐标全要小心到了这节我要带你绕开最容易翻车的四个坑。BEPBEM 不只是往wrfout里加了新变量它还会让一批默认输出的含义在城市格点上发生微妙变化。你不改用法直接按普通格点的逻辑去解释结果基本是错的。3.1 城市格点上的 T2 和 Q2别拿它们当“街谷气温”普通格点上T2是 2m 气温大家用得得心应手。但到了 BEPBEM 的多层冠层方案里城市格点的近地层已经不是一个简单的“地表以上 2m”的概念了。街道峡谷内部的空气温度和主模式最低层之间的连接方式和均匀下垫面相比发生了本质改变。T2在城市格点上更多是模式最低层状态和地面状态之间的某种诊断插值结果并不严格代表真实街谷里 2m 高度处的气温。我自己的习惯是城市格点一律用T_URB_01代替T2建筑高度较高时甚至要参考T_URB_02。做城市热岛强度时城区取T_URB_01郊区取T2这样对比的物理含义才相对自洽。强行拿城区的T2跟观测站对比误差可以达到两三度而且没有规律可循极其难受。3.2 SH、QFX、HFX 在城市格点上怎么解读HFX地表感热通量、QFX地表潜热通量、SH、LH这些默认输出在普通格点代表陆面过程计算的地表湍流交换。但在 BEPBEM 的城市格点上地表过程已经换成了城市冠层参数化方案在管默认的HFX、QFX要么不输出、要么不代表城市通量。城市格点上真正有物理意义的湍流热通量应当从ACM_T01和ACM_Q01做时间差分得到。做城市能量平衡时如果拿默认HFX去凑Rnet ≈ HFX QFX G ...你会发现在城市格点上这个等式两端对不上而且对不上的量级可能非常大。原因就是你用了错误的通量源。城市格点的能量收支里湍流项要用冠层通量蓄热项要考虑建筑墙体和室内空气的热容量人为热项要计入URB_AC_Q和HEATRATE这和均匀下垫面的方程结构完全不同。3.3 垂直坐标系里的“阴谋”T_URB_01不是模式层的 T这是最容易迷惑的地方。WRF 默认的三维变量T、U、V、Q是跟着模式 terrain-following 坐标走的。而 BEP 冠层内部的T_URB_01~T_URB_05对应的是冠层内以建筑几何定义的高度分层两者不是一回事。举个例子如果你想把城市冠层气温廓线和郊区气温廓线画在同一张图上对比直接把T_URB_01到T_URB_05和模式高度对应的T往一起放是完全错误的。前者是街谷内的空气温度后者是模式网格层的“体平均”温度。正确的做法是把冠层内多层温度和高度关系单独画一条廓线再把它放到模式最低几层的数据之前形成一个“从街谷到边界层”的组合廓线。中间的分层要自己做处理模式不会自动帮你拼接。3.4 累积量变量别当瞬时量用这个问题我在第 2.3 节已经提过但值得再强调一遍因为它影响到的变量范围很广。ACM_U*、ACM_T*、ACM_Q*、ACM_TRA_URB*全部是累积量。后处理时常见的处理方式有三种差分法把相邻两个输出时刻的累积量相减再除以时间间隔得到该时段平均通量单位换算为 W/m²。这是最推荐的做法。回归法如果输出时间序列很长可以对累积量做线性回归斜率就是平均通量。适合看长周期趋势。直接当瞬时值用只适合某些版本里明确标注为瞬时输出的变量。对累积量千万别这么干。我通常的做法是在 WRF 输出设置里把频率和计算公式提前想好。比如要算逐小时平均感热就把输出间隔设成 1 小时然后用ACM_T01逐时差分。如果输出间隔太稀疏比如 6 小时一次时间分辨率会损失很多细节空调排放的峰值就捕捉不到了。4. 读文件和后处理的实操心得差分、廓线、能量闭合与版本核对变量都认识之后说说实际操作。这节我把自己跑通的处理流程和几个经验直接放出来你照着做基本一次就能跑通。4.1 先列出你的 wrfout 到底有哪些变量拿到一份wrfout第一步永远是检查变量清单而不是直接套脚本。命令很简单ncdump -h wrfout_d02_2023-07-15_12:00:00 | less重点看有没有URB_*、ACM_*、T_URB_*这批变量。如果城市格点已经激活但变量清单里一个URB都没有大概率是编译时选的urban1选项没生效或者 namelist 里的bep_bem设置不对。此时直接回 namelist 检查别在数据里白找。想快速可视化定位可以用ncviewncview wrfout_d02_2023-07-15_12:00:00先看URB_FLAG2D再对比T_URB_01和T2的空间分布基本能确认城市格点范围和方案运行状态。4.2 提取城市格点垂直廓线的标准操作拿到城市格点时建议先做好一个“城市点位置表”把格点坐标i、j和对应的LU_INDEX、URB_FLAG2D一起记录下来。然后配合 NCO 工具提取单点时间序列# 假设城市格点在 i30, j20 ncks -d west_east,30 -d south_north,20 wrfout_d02_2023-07-15_12:00:00 out_urban_point.nc这样提取出来的文件里所有变量的空间维度都被削减成一个点方便后续做时间序列分析和日变化计算。做垂直廓线时先确认 num_urban_layer 是多少层。默认 5 层但很多人在 namelist 里改成 10 层。每层的代表高度并不等间距需要从wrfout输出的相关辅助变量或直接读 BEP 的几何参数换算出来。我这里给一个通用思路把冠层内各层温度画成“阶梯状”廓线横轴温度纵轴高度从街谷地面到建筑屋顶然后再拼接模式的最低几层。千万别直接把T_URB_01~T_URB_05的序号当成等间距高度。4.3 用能量闭合检验模拟可信度判断 BEPBEM 跑出来的数据是不是靠谱我推荐一个很实用的检测公式做日平均能量闭合检查。对一个城市格子Rnet ≈ H_urb LE_urb G_building G_road Q_anthropogenic其中Rnet城市净辐射用模式输出的向下/向上短波、长波计算注意城市格点上要考虑建筑立面反射。H_urb冠层感热通量用ACM_T01差分得到。LE_urb冠层潜热通量用ACM_Q01差分得到。G_building建筑蓄热项可以从墙体温度变化和室内空气温度变化估算部分版本直接输出墙体温度相关变量。G_road道路蓄热项与道路表面温度和下层温度有关。Q_anthropogenic人为热主要看HEATRATE和URB_AC_Q的量级。一般来说日平均尺度上能量闭合误差能控制在 10%-20% 以内就算不错。如果差值显著偏大优先检查累积量差分是否正确、净辐射是否用了城市专属变量。另外BEM 有很明显的 spin-up 问题。室内空气温度、墙体内部温度、建筑蓄热量的初始状态需要时间调整通常建议至少跑 5-10 天再做正式分析。我在做夏季案例时经常发现前两天的URB_AC_EL明显偏高那就是室内初始温度设得比实际高导致的空调“疯狂运行”。这种情况直接丢前几天的数据否则你的平均结果会被高估。4.4 不同版本的变量名差异怎么核对最后提一句版本问题。WRF 4.x 和老的 3.x 在 BEPBEM 相关输出变量命名上有不少差异比如有的版本用URB_FLAG2D有的用URB_FLAG空调排放变量有时叫URB_AC_Q有时拆得更细。遇到变量名对不上时去你 WRF 安装目录的 Registry 相关文件里搜URB字段直接看该版本注册的 IO 变量名和单位比在网上翻教程靠谱得多grep -i URB Registry.* # 在你 WRF 源码 Registry 目录下执行这个方法非常笨但永远不会过时。版本更新后教程里的变量名很可能已经改了但 Registry 里的定义永远和你编译的源码是一致的。我自己在跑 BEPBEM 时还有一个习惯每次实验做完把ncdump -h的输出文件存一份旁边备注本次实验的 namelist 关键选项num_urban_layer、bep_bem、输出频率等。这样过几个月回来看数据不会对着变量名发呆。最后再分享一个实用小技巧做城市热岛日变化分析时把URB_AC_Q、T_URB_01、URB_FLAG2D三个变量一起画成时间序列你会很直观地看到空调排放峰值、街谷气温峰值之间的相位差。这个相位差是 BEPBEM 模拟里最有意思的信号之一也是验证 BEM 参数是否合理的快速手段。跑完一批实验后我经常先看这个图再决定要不要深挖数据。