
跑城市气候模拟的同行应该都有过这种经历WRF跑完case目录下呼啦一下躺着一排wrfout_d01_2023-07-15_12:00:00这种文件高高兴兴用Python或ncdump打开准备提取结果结果被几十上百个变量看花了眼。更头疼的是明明namelist里开了BEPBEM想在wrfout里找建筑能耗、室内温度这种“感觉应该存在”的变量翻了半天Registry文件也没找到。这个系列前面几期讲了方案原理和参数设置这期专门聚焦输出文件BEPBEM模式下wrfout的结构、维度、变量物理意义以及怎么把想要的数据正确提取出来。内容适合刚接触WRF城市模拟的研究生也适合跑了几轮但还是对变量体系不够熟的同学。我会按“文件结构→变量分类→城市变量→实操提取→常见坑”的顺序来讲尽量把每个变量的单位、维度和背后物理过程说透。1. BEPBEM模式对wrfout的影响逻辑1.1 从城市冠层到网格平均为什么输出变量需要重新理解WRF本身是一个格点平均模型一个网格是1公里也好、333米也好模型默认并不知道这个网格里具体有哪些建筑、街道和植被。早期城市参数化都靠改下垫面等效参数——比如把粗糙度z0调大、反照率调低、热容调高——本质上是“用平均值糊弄过去”。BEPBuilding Effect Parameterization改变了这个逻辑。它在每个网格内显式引入建筑三维几何结构把城市抽象成由屋顶、墙面、道路三种面组成的街谷。每个面分别计算太阳辐射遮蔽、反射、吸收分别做能量平衡再按照城市覆盖比例把这些面的通量聚合回WRF网格。正因为有了这套子网格结构wrfout里很多变量就变成了“经过城市冠层物理过程调制后的网格平均量”而不是简单的地表能量平衡结果。这一点很重要当你看到wrfout里的TSK、HFX时别以为它代表某个具体屋顶或者道路的温度和通量。在BEPBEM下这些是城市冠层各表面通量按比例混合后再经过湍流交换得到的网格平均量。理解不了这一点后面所有变量解读都容易走偏。1.2 BEM把建筑能耗写进能量平衡BEMBuilding Energy Model是BEP的延伸负责建筑内部的能量收支透过窗户进入室内的太阳辐射、室内设备和人员散热、墙体多层结构的导热以及空调系统在维持设定室内温度时消耗的制冷/制热功率。空调消耗的电能以废热形式排入街谷大气这会直接抬升感热通量。所以BEPBEM跑出来的HFX、TSK、T2和不开城市方案的模拟相比差异非常大。尤其夜间空调废热会让城市温度降不下去这正是很多城市热岛研究选择这套方案的原因。换句话说HFX里其实混着两类热量一类是地表自然热收支的结果另一类是人为排热空调废热、交通排热等分析时不要只看数值要想到这层叠加关系。1.3 变量层面的连锁反应由于上述机制wrfout里涉及地表能量平衡和湍流过程的常规变量都会承接BEPBEM的影响。HFX、LH、TSK、PBLH、T2、U10、V10、Q2这些都会变但变化性质不一样直接被影响的HFX加了空调废热、TSK城市表面温度更高、HFX夜间正值。间接响应的PBLH可能因为城市热力抬升而增高U10因为建筑拖曳而减小T2在夜间明显偏高。所以当你在分析wrfout时不要只盯着“城市专用变量”。常规变量的空间分布本身可能已经携带了城市方案的全部信息有时候看T2的夜间热岛强度比翻半天城市变量更直观。2. wrfout文件的基本结构、维度与快速查看2.1 文件命名、格式与输出频率WRF默认输出文件名为wrfout_d01_2023-07-15_12:00:00其中d01表示第1层嵌套域时间是模拟起始时刻不是文件写入时刻。格式是NetCDF本质上是自带维度、变量名和单位描述的自描述二进制格式跨平台可移植。输出频率通过namelist里的io_form_output和interval控制一般用默认的NetCDF格式值为2。实际工作中还会看到wrfinput_d01初始场和静态地形下垫面信息、wrfbdy_d01侧边界、wrfxtrm等但分析的主角是wrfout。2.2 四个基础维度与交错网格wrfout的核心维度是Time、south_north、west_east、bottom_top分别对应时间、南北格点、东西格点、垂直层。初学最容易踩坑的是风场变量U、V、W定义在Arakawa C交错网格上于是会多出带_stag后缀的维度。具体来说U东西向风定义在东西网格面上维度是(Time, bottom_top, south_north, west_east_stag)。V南北向风定义在南北网格面上维度是(Time, bottom_top, south_north_stag, west_east)。W垂直速度定义在垂直层界面上维度是(Time, bottom_top_stag, south_north, west_east)。温度、水汽、气压等标量定义在格点中心维度是(Time, bottom_top, south_north, west_east)。两套数组直接相加或索引时经常对不齐这不是bug是网格设计决定的。2.3 用ncdump一行看懂变量清单命令行查看结构最稳的是ncdump -h wrfout_d01_2023-07-15_12:00:00 | less这条命令会列出所有变量的名字、维度、单位在bash终端里直接看。如果只想看某个变量用ncdump -v T2 wrfout_d01_2023-07-15_12:00:00 | lessPython里我更喜欢用xarray打开之后ds[T2]直接就能用配合.isel()、.mean()做切片和区域平均。不过要提醒一下wrfout里大部分变量都带Time维度所以读出数组后别忘了先isel(Time0)取某一时次否则后面做统计时维度会让你怀疑人生。3. wrfout核心变量逐类拆解3.1 三维状态变量风、温度、气压、水汽这一组是wrfout的“主菜”搞清楚了几乎就理解了整个三维大气状态。变量含义单位说明U东西向风速m/s交错网格实际地面U10由诊断得到V南北向风速m/s交错网格W垂直速度m/s定义在垂直层界面T位温扰动K实际位温 T 300P扰动气压Pa实际气压 P PBPB基准气压Pa随高度变化的参考态气压PH扰动位势m2/s2高度计算用 (PHPHB)/9.81PHB基准位势m2/s2参考态位势MU扰动干空气质量Pa用于质量守恒计算MUB基准干空气质量Pa参考态QVAPOR水汽混合比kg/kg常用值0.002~0.02乘1000是g/kg这里必须强调一个新手极其容易犯的错T不是真实温度它是“扰动位温”。要得到实际位温必须先加300实际位温 θ T 300要得到气压实际气压 P_total P PB如果你想要的是三维实际气温单位K还需要用位温公式反推T_K θ × (P_total / 100000)^(2/7)为什么要专门强调因为我见过不止一个人直接从wrfout里取T的max/min去画图画出来个“-50℃”的荒唐结果。凡是涉及三维温度场的分析必须做这个还原。3.2 二维近地面与湍流通量变量这一组是城市气候研究最常用的也是BEPBEM影响最直观的变量变量含义单位说明T22m气温K已经是实际温度可直接减273.15TH22m位温K比T2更常用于边界层分析Q22m水汽混合比kg/kg常换算成g/kg或比湿PSFC地面气压Pa海平面气压是另一个诊断量U1010m风速u分量m/s站点对比时最好做高度校正V1010m风速v分量m/sTSK地表皮肤温度KBEPBEM下是城市面平均不是单一表面HFX感热通量W/m2正值表示热量由地面向大气输送LH潜热通量W/m2城市里通常偏小因为不透水面蒸发少GRDFLX土壤热通量W/m2城市里受建筑储热影响UST摩擦速度m/s反映近地面动量交换强度PBLH边界层高度m城市热岛常让PBLH抬高特别提醒T2和TSK都是开尔文直接减273.15就是日常气温。HFX在BEPBEM的夜间场景里经常出现正值时段这是空调废热在做贡献看到这个现象不要觉得模型出错了反而是方案起作用的证据。3.3 辐射与降水变量辐射变量在城市模拟里非常重要因为建筑街谷的多次反射和遮蔽会改变辐射分配变量含义单位SWDOWN向下短波辐射W/m2GLW向下长波辐射W/m2OLR出射长波辐射模式顶W/m2SWUPB向上短波辐射W/m2LWUPB向上长波辐射W/m2SWNORM法向太阳辐射W/m2降水变量则相对简单RAINC积云对流参数化方案产生的累计降水单位mm。RAINNC显式云微物理方案产生的累计降水单位mm。网格总降水 RAINC RAINNC。SNOW是累计降雪等效水深SNOWH是积雪深度。城市模拟里降水不一定是重点但如果你跑的是强对流案例记得把RAINC和RAINNC都取出来两个都为零才说明真的没下雨只取一个容易误判。3.4 坐标、时间与下垫面信息这组变量不直接反映物理过程但做空间分析和站点对比时离不开XLAT、XLONG每个格点的纬度、经度二维场维度是(south_north, west_east)。XLAND海陆标识1为陆地2为水体。LU_INDEX下垫面类型索引判断城市网格主要靠它。Times字符型时间戳每个时次对应一个字符串。XTIME从模拟开始算起的分钟数。在BEPBEM模式下如果城市静态数据准备得当wrfout里还会带FRC_URB2D城市覆盖比例和UTYPE_URB2D城市类型这类静态场它们对后处理中对城市格点做mask非常有用。4. BEPBEM模式下的“城市变量”默认有哪些哪些需要额外打开4.1 标准wrfout里与城市相关的静态/动态场先说结论标准wrfout里能看到城市相关变量但绝对没有“空调功率”“室内温度”这种直观名称。真正默认输出的城市相关变量主要是从wrfinput继承来的静态场FRC_URB2D城市覆盖率0到1之间标记每个格点里城市下垫面占多少。UTYPE_URB2D城市类型编号通常分为低密度、高密度、商业区等类别。LU_INDEX土地利用类型判断是否城市网格。这几个变量的作用是帮助你后续做格点筛选。比如你想只分析城市格点的T2可以先卡LU_INDEX或FRC_URB2D0做mask再统计区域平均。这一步不做结果会被周边农田、水体稀释。4.2 建筑能耗、室内温度等过程量到底在哪这是本期核心问题。BEPBEM内部确实计算了建筑能耗、室内温度、屋顶表面温度、墙体各层温度等过程量但默认wrfout里通常不直接输出。为什么因为WRF的注册表Registry设置了哪些变量、在哪些输出流里写出来没注册的输出流不会出现在wrfout里。我的实操经验是分三路找在WRF源码目录下搜Registry相关文件搜URBAN、BEM、BUILDING等关键字看有没有定义io字段。如果有你可以把它加入auxhist输出流重新编译后用auxhist文件读。跑完看运行目录BEP在部分版本里会额外输出一些urban相关的文本或netCDF文件文件名里可能带urban字样别只在wrfout里找。如果实在找不到就退而求其次用默认的网格平均变量来分析。HFX、TSK、T2的时空变化已经能很好地反映建筑能耗对城市大气的反馈。这算是一个“面试级”的技巧很多人以为wrfout就是全部输出实际上WRF的输出流有history、auxhist1、auxhist2、auxinput等多种只有注册对应输出流并设置io_form_auxhist等参数变量才会被写出来。4.3 一个能落地的namelist城市方案配置参考以WRF 4.x系列为例BEPBEM对应的sf_urban_physics通常是3部分老版本用4建议以你安装版本的官方用户指南为准。一个常见的配置片段如下physics sf_urban_physics 3, num_urban_layers 10, ... /num_urban_layers是城市冠层内部垂直层数取10是比较常见的默认做法。开启BEPBEM的另一个前提是下垫面静态数据里有城市类型和建筑形态数据否则模型找不到城市格点方案等于没开。另外BEPBEM建议在内层网格分辨率不超过1km时使用太粗的网格里建筑物信息基本没有意义。跑完以后第一步永远是检查FRC_URB2D空间分布确认城市格点落在了该在的位置再谈变量分析。5. 实操从wrfout里提取变量并做好单位换算5.1 用xarray批量读取关键变量我平时最常用的操作就是打开单个时次把近地面和通量变量一次性取出来转成DataFrame做统计。示例代码如下import xarray as xr ds xr.open_dataset(wrfout_d01_2023-07-15_12:00:00) # 选取关键变量并取第一个时次 sel ds[[T2, TSK, HFX, LH, PBLH, U10, V10, RAINC, RAINNC]] df sel.isel(Time0).to_dataframe().reset_index() print(df.head())这样得到的每一行就是一个格点列名就是变量名。做城市格点筛选时再加一步urban_mask ds[LU_INDEX].isel(Time0).values # 根据你用的下垫面分类代码筛选城市格点5.2 三维温度恢复与高度计算三维场不能直接用必须先还原。我的常用代码是这样的# 实际位温K theta ds[T] 300.0 # 实际气压Pa pressure ds[P] ds[PB] # 实际温度K temp_k theta * (pressure / 100000.0) ** (2.0 / 7.0) # 海拔高度m height (ds[PH] ds[PHB]) / 9.81这里的2/7是干空气的R/cp约等于0.286。pressure单位是Pa基准气压p0取100000Pa即1000hPa。做完这一步temp_k才是能拿来画垂直剖面和计算温度梯度的数据。5.3 常见问题与排查速查表问题可能原因排查方法找不到BEM能耗变量默认输出流不写过程量查Registry改auxhist输出流T数值看起来像负几十度没做位温还原实际位温 T 300U比T多一格交错网格定义用U的west_east_stag维度索引RAINC有值但总降水为0只看了RAINC或RAINNC之一两者相加才是总降水wrfout里没有FRC_URB2D版本/Registry配置不同去wrfinput里查静态场T2画出来300多K开尔文没换算减273.15转摄氏度夜间HFX还是负值城市方案没生效检查sf_urban_physics和FRC_URB2D这个表基本涵盖了我自己踩过和帮别人排查过的大部分情况。核心思路只有一个不要凭直觉判断“变量错了”先看单位、维度和namelist配置。6. 一点个人经验这几期WRF理论写下来最大的体会是不要试图背下wrfout里所有变量名关键是理解每个变量背后的物理过程和输出逻辑。BEPBEM这套方案真正能让你感知到它存在的往往不是某个“城市专用变量”而是HFX的夜间正值、T2的热岛强度、PBLH的抬升幅度。我建议第一次跑BEPBEM的同学先把一个简单案例跑通输出时间间隔设短一点然后拉一条穿过城市核心区的剖面对比T2、HFX、PBLH在城区和郊区的差异。不需要复杂后处理基本就能建立起对这套方案和wrfout变量的直觉。城市模拟的水很深但wrfout这关过了后面很多分析就顺了。