ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

WRF前处理实战:从ERA5数据下载到WPS三步走,避开新手常见坑

WRF前处理实战:从ERA5数据下载到WPS三步走,避开新手常见坑 写这篇日记的时候我刚好把一套WRF实例从数据下载跑到了WPS前处理结束整个过程可以用“渐入佳境”来形容。软件装好的兴奋劲过去之后真正让人头大的其实是数据很多朋友私信问我WRF装完了下一步到底干什么为什么照着教程下载数据总是各种报错。说实话我上周也卡在最基础的下载和格式转换上折腾了两天才迈过这个坎。这篇日记就把我这次完整撸过一遍的“数据下载 WPS前处理”流程整理出来每一步都写清楚为什么这么做踩过的坑也原样记录给准备亲自上手跑WRF的人当一份路线图。WRF要跑起来本质是一个“食材加工”的过程。模型本身只是灶台和锅你手里得有处理好的食材——气象驱动数据还得把灶台的火候参数化方案和锅的尺寸模拟区域都定好才能开始炒菜。WPSWeather Preprocessing System就是那个洗菜、切菜、配菜的厨师负责把下载回来的原始气象数据加工成WRF能直接下锅的格式。这一环如果处理不好后面real.exe和wrf.exe跑得再顺结果也是错的。所以我强烈建议每一位新手把WPS这一步当回事耐心走完。1. 这次要解决什么从“装好WRF”到“喂饱WRF”1.1 很多人卡住不是因为模型而是因为数据我翻了不少自学群里的提问发现一个规律大家问得最多的不是物理参数化方案怎么选而是“GRIB文件从哪下”“ERA5下载完是netcdf格式怎么处理”“geogrid一直报错找不到数据”。这些问题看起来散其实都指向同一个环节——前处理。首先是数据源选错。有人拿ERA5下载出来的NetCDF文件直接丢给ungrib结果报错信息根本读不懂以为是自己WRF装坏了。还有人下数据的时候把全球范围都勾上了一个时次就几十个GB硬盘直接告急。这些都是典型的新手坑我在1.2节把WRF的完整运行链路先捋清楚后面就不容易跑偏。1.2 WRF跑通的完整链路从原始数据到模式积分WRF的完整流程是这样的下载原始气象资料再分析资料或预报资料比如GFS、FNL、ERA5准备静态地理数据地形、土地利用、植被覆盖等这是geogrid要用的跑WPS的geogrid.exe把模拟区域网格化并插值地形和土地利用数据跑WPS的ungrib.exe把GRIB格式的气象资料解压成中间格式跑WPS的metgrid.exe把气象场水平插值到geogrid生成的网格上跑real.exe生成初始条件和边界条件跑wrf.exe开始数值积分。很多人以为数据下载完就能直接real.exe完全忽略了中间还有个WPS。WPS的作用就是把“别人的网格数据”变成“你的网格数据”同时把格式统一成WRF能识别的中间格式。用做饭来打比方geogrid相当于确定你家炒锅的形状和大小ungrib相当于把冷冻食材解冻metgrid相当于把食材切成符合锅型的大小。三步缺一不可。我这次用的数据是ERA5再分析资料区域选的是某个局地范围嵌套层数用了两层。接下来就按“数据下载 → geogrid → ungrib → metgrid”的顺序把每个环节的实操过程都摆出来。2. 数据下载选对数据源等于成功一半2.1 再分析资料怎么选GFS、FNL、ERA5到底有什么区别先说结论如果你是新手想尽快跑通流程建议用NCEP FNL再分析资料如果你做科研、需要更高分辨率再考虑ERA5。两者下载方式和支持程度差别很大但FNL数据对WPS极其友好。我在表里整理了一份对比这是我自己选数据源时候的判断依据数据源水平分辨率时间范围下载渠道对WPS的友好程度适用场景GFS预报场约0.25度实时滚动NOMADS等高Vtable.GFS直接支持业务预报、个例实时模拟NCEP FNL再分析1度/0.25度1999年至今NCAR RDA等高Vtable.GFS直接支持科研个例模拟、模式验证ERA5再分析0.25度约31km1950年至今CDSClimate Data Store中下载GRIB格式可直接用高分辨率长时间模拟ERA5-Land0.1度约9km1950年至今CDS低陆面变量通常做离线驱动陆面过程、水文模拟选型逻辑很简单文件格式越接近“WPS能直接吃”的状态越适合入门。FNL数据直接就是GRIB2格式配合Vtable.GFS就能跑几乎没有坑。ERA5的下载方式更现代但很多人习惯性选NetCDF格式结果ungrib根本不认识这个我在下一节细讲。2.2 ERA5数据下载实操CDS API脚本与关键参数如果你已经决定用ERA5那下载这一步建议直接用CDS API的Python脚本。我第一次用网页端勾选下载手动点几十个时次的文件点得手都酸了而且网页端断线之后只能重来。换成脚本之后才算是进入正轨。先安装CDS API库pip install cdsapi然后在CDS官网注册账号拿到个人API Key写到配置文件里。之后写一个下载脚本核心思路是指定变量、区域、时间、格式一次性提交下载请求。下面是我这次用的下载脚本节选区域和时间范围可以根据你自己的模拟区域改import cdsapi c cdsapi.Client() c.retrieve( reanalysis-era5-single-levels, { product_type: reanalysis, variable: [ 10m_u_component_of_wind, 10m_v_component_of_wind, 2m_dewpoint_temperature, 2m_temperature, mean_sea_level_pressure, surface_pressure, sea_surface_temperature, ], year: 2020, month: 07, day: [ 01, 02, 03, 04, 05, 06, 07, 08, 09, 10 ], time: [ 00:00, 06:00, 12:00, 18:00 ], area: [ 40, 115, 30, 125, ], format: grib, }, era5_single_level_202007.grib)压力层数据也要单独下一份因为WRF跑三维模拟需要多层的气压、温度、湿度、风场。通常我会再建一个reanalysis-era5-pressure-levels的请求变量选geopotential、relative_humidity、temperature、u_component_of_wind、v_component_of_wind层级从1000 hPa到100 hPa按自己的模拟顶高设定。有几个细节必须注意area参数的顺序是北、西、南、东写反了会下载到奇怪的位置我犯过这个错第一次下出来的区域跑到了海里浪费了一晚上。时间段要包含模拟开始前的一段spin-up时间以及模拟结束后的边界数据。“只下模拟时段”是新手常犯的错误后面real和wrf会缺边界值报错。format字段下载时务必要选grib不要选netcdf。新版WPS虽然也支持NetCDF输入但配置起来复杂新手阶段直接用GRIB格式最稳妥。2.3 ERA5-Land的蒸发通量符号一个小坑这段时间我在尝试把陆面过程也跑起来所以顺手关注到ERA5-Land的下载和使用。ERA5-Land的分辨率更高约9km主要提供陆面变量比如土壤湿度、土壤温度、蒸发量、径流等。很多人下载完ERA5-Land的蒸发数据发现数值是负的第一反应是数据出错了。其实不是错是ECMWF的通量变量有符号约定向下为正蒸发意味着水分从地表向大气输送所以是负值。类似的情况在感热通量、潜热通量里也存在处理之前先看官方文档的变量说明不要想当然地取绝对值。如果你只用它做离线驱动或者水电模拟负号本身不影响趋势判断但如果你要计算水量平衡就必须搞清楚单位换算。ERA5-Land里很多通量单位是kg m-2 s-1累积量需要乘时间步长我建议写一个独立的处理脚本专门做单位换算和符号判断免得后面分析时被坑。2.4 下载避坑连接中断、硬盘爆满、命名混乱数据下载的坑主要在三点。第一连接中断。ERA5批量下载数据量很大动辄几十GB网络稍微不稳就中断。我的经验是不要一次性提交一个超大的下载任务按月份拆分成多个小任务中断之后重试的成本低。另外下载脚本加一个循环重试逻辑遇到报错就等待几秒继续请求。第二硬盘空间。下载前先确认本地剩余空间至少保留模拟所需数据体积的3倍余量。我这次下载单层压力层加起来约15GB解压和中间格式转换膨胀到30GB以上硬盘差点没扛住。规划要趁早。第三文件命名混乱。下载下来的GRIB文件名往往不直观我习惯按“变量_区域_时间段”的方式重命名比如era5_pl_d02_2020070100.grib。后面WPS链接文件的时候一目了然省去反复确认的时间。3. WPS前处理三步走全拆解3.1 动手之前先把namelist.wps填明白WPS三个可执行程序geogrid.exe、ungrib.exe、metgrid.exe共用同一个配置文件namelist.wps。所以先把配置填对后面三个步骤基本不会出错。这是我这次跑两重嵌套用的模板里面的关键项我逐个解释share wrf_core ARW, max_dom 2, start_date 2020-07-01_00:00:00, end_date 2020-07-10_00:00:00, interval_seconds 21600 / geogrid parent_grid_ratio 1, 3, i_parent_start 1, 60, j_parent_start 1, 40, e_we 120, 151, e_sn 100, 151, geog_data_res default, default, dx 9000, dy 9000, map_proj lambert, ref_lat 35.0, ref_lon 120.0, truelat1 30.0, truelat2 60.0, stand_lon 120.0, / ungrib out_format WPS, prefix ERA5 / metgrid fg_name ERA5 /几个容易理解错的地方interval_seconds是驱动数据的时间间隔我下载数据是6小时间隔所以填21600秒。这个必须和GRIB文件的实际间隔一致否则metgrid会找不到对应时间的文件。e_we和e_sn是网格点数而不是区域经纬度范围。网格点数乘分辨率才是模拟范围。新手想把范围设置成“东经115到125度”时会误把度数填进去这是典型错误。i_parent_start和j_parent_start是从父域左下角开始的起始网格序号。如果嵌套层数大于1第二层起始位置必须落在父域范围内并且要保证嵌套层分辨率是父域的整数倍。geog_data_res一般填defaultWPS会自己在静态数据里查找可用的最高分辨率数据。如果手动指定modis_lc之类的方案必须确认对应数据在geo_em目录里真的存在。3.2 geogrid静态地理数据与地形插值geogrid的职责是在你设定的模式网格上插值地形高度、土地利用、土壤类型、植被覆盖等静态地理数据。这些数据几乎不随时间变化所以只需要处理一次。运行前需要准备静态地理数据。官方数据包geog_complete.tar.gz体积不小我建议下载后解压到WPS/geog目录下然后在namelist.wps里用geog_data_path指定路径。如果是初学者可以直接把路径写进geogridgeogrid geog_data_path /home/xiaozeng/WPS/geog/ /准备好之后运行./geogrid.exe正常情况下会生成geo_em.d01.nc、geo_em.d02.nc等文件。如果没有生成常见的原因有两个geogrid.exe找不到GEOGRID.TBL文件需要把它从geogrid/GEOGRID.TBL复制到当前目录或者设置环境变量GEOGRID_TBL_PATH静态地理数据路径设置错了geogrid会报Geog data not found这时候去检查geog_data_path下面是否真的有对应变量目录。我这次跑的时候还遇到了一个隐蔽的问题嵌套层静态数据里某些变量比如土地利用只下载了粗分辨率的版本geogrid虽然没报错但生成的geo_em.d02.nc里土地利用数据非常模糊。后来我在namelist.wps里把第二层的geog_data_res改成modis_lc重新跑了一遍geogrid效果才正常。3.3 ungrib从GRIB到中间格式ungrib是WPS里最容易被忽略、也最让人困惑的一步。它的作用是把GRIB编码的气象数据解码成一种简单的中间格式让metgrid能统一读取。执行前先确认两件事第一Vtable要链接正确。Vtable本质是一张“字段映射表”告诉ungrib某个GRIB变量对应到WRF中间格式里的哪个字段。GFS和FNL数据用Vtable.GFSERA5数据一般也用Vtable.GFS因为ERA5的变量命名和GFS类似。链接方式ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable第二GRIB文件要链接到当前目录。WPS提供了一键链接脚本./link_grib.csh /path/to/your/data/era5_*.grib链接之后当前目录会生成一堆GRIBFILE.AAA、GRIBFILE.AAB这样的符号链接文件。注意link_grib.csh是按文件名顺序链接的如果时间顺序不对后面metgrid出来的数据顺序也会乱。我建议下载数据时就统一文件名格式确保年份、月、日、时在文件名中的顺序符合字典序。然后运行./ungrib.exe如果namelist.wps里prefix ERA5输出文件会命名为ERA5:2020-07-01_00这样的中间格式文件。ungrib最常见的报错是ERROR: Error opening GRIB file排查思路有两个一是GRIB文件本身损坏重新下载该时次二是文件不是GRIB格式比如有人把NetCDF硬改后缀成.gribungrib当然不认。还有更隐蔽的情况是GRIB2文件缺少索引信息ungrib会尝试读取但最终超时这种建议先检查文件是否完整。3.4 metgrid把气象场插值到模式网格ungrib输出的中间格式仍然是原始数据自带的水平网格和WRF网格不一定重合。metgrid的作用就是把气象场水平插值到geogrid生成的模式网格上。运行前确认namelist.wps里fg_name值要和ungrib的prefix一致。比如我的ungrib输出前缀是ERA5那metgrid部分就要写metgrid fg_name ERA5 /然后直接运行./metgrid.exe成功后会生成met_em.d01.2020-07-01_00:00:00.nc、met_em.d01.2020-07-01_06:00:00.nc等文件。metgrid报错最典型的一类和时间有关例如ERROR: Failed to find input data for time 2020-07-05_00这是GRIB数据里缺了那个时次或者下载时少选了某个时间步。遇到这个报错先回去查原始数据时间范围不要急着改namelist。另外有一个细节metgrid输出的NetCDF文件里纬度坐标叫XLAT_M经度坐标叫XLONG_M初次接触的人容易和XLAT_U、XLONG_V搞混。前者是质量点格点中心坐标后者是风场交错的U/V点坐标后面做后处理时用哪个取决于你读取的变量在哪个网格上。4. 运行中常见的坑与排错实录4.1 WPS运行报错速查表我把这周踩过的坑整理成一张速查表遇到类似报错可以直接对照排查。报错信息可能原因解决办法Geog data not foundgeog_data_path路径错误或者静态数据未解压完整检查路径下是否有HGT、LANDUSE等目录Could not open GEOGRID.TBL找不到GEOGRID.TBL文件将geogrid/GEOGRID.TBL复制到运行目录或设置环境变量Error opening GRIB file文件损坏、不是GRIB格式重新下载确认后缀名与真实格式一致Failed to find input data for time下载数据缺了对应时间步检查原始GRIB文件覆盖范围补下缺失时次metgrid: Symbolic links faillink_grib.csh没有正确执行确认执行了脚本且链接文件指向真实存在的GRIB文件ungrib: Bad vtableVtable链接错误或版本不匹配重新链接对应数据源的Vtable生成的geo_em.nc里地形和实际差很多静态数据路径下分辨率不足或被默认值覆盖将geog_data_res指定为更高分辨率数据集名表格里的问题我基本都遇到过一遍尤其是前两项几乎每次换机器、换环境都会踩一次。关键是一旦理解了每个程序需要什么输入、输出到哪排错很快。4.2 环境与版本带来的隐蔽问题WPS对编译环境非常敏感不同编译器、不同NETCDF版本跑出来的结果可能完全不一样。有一次我换了集群netcdf库是新的但环境变量没有指向新路径结果geogrid能跑metgrid却一直段错误。所以我的建议是跑之前先执行which netcdf nc-config --version确保每个可执行程序编译时的库和运行时用的库是同一个。如果你用的是一键安装脚本比如WPS 4.x的编译脚本更要留意输出日志里有没有警告。另一个隐蔽问题是库文件冲突。机器上可能同时装了Intel编译器版本的netcdf和GNU编译器版本的netcdf如果混用轻则报错重则数据静默出错。我通常习惯在.bashrc里写死一套环境export NETCDF/home/xiaozeng/libs/netcdf export PATH$NETCDF/bin:$PATH export LD_LIBRARY_PATH$NETCDF/lib:$LD_LIBRARY_PATH4.3 验证前处理结果别急着跑real.exe很多人跑完metgrid看到生成了met_em文件就急着进real.exe。我建议先花五分钟检查一下数据质量。用ncdump -h查看met_em文件头确认变量完整ncdump -h met_em.d01.2020-07-01_00:00:00.nc | less重点看有没有PRES气压、GHT位势高度、TT温度、RH相对湿度、U纬向风、V经向风。如果某一层气压变量值全是0说明ungrib阶段对应变量解码失败需要回炉重跑不要带着错误数据往下走。再检查空间范围。把XLAT_M和XLONG_M的最小最大值打印出来和你的模拟区域设定对比。如果区域偏了可能是area或ref_lat/ref_lon写错。还有一个我特别想说的小技巧用Python的netCDF4库读一下温度变量import netCDF4 as nc f nc.Dataset(met_em.d01.2020-07-01_00:00:00.nc) tt f.variables[TT][0, 0, :, :] print(tt.min(), tt.max())温度单位是开尔文夏季7月中午的近地面温度应该在290K左右。如果读出来是几千K或者负值基本可以断定数据解码有问题不用纠结结果对不对了。5. 我这阶段最想分享的三句话第一句话是跑通WRF流程真正的瓶颈不是模型物理而是前处理。很多教程把重点放在参数化方案的选择上对新手来说意义不大先把数据链路跑通你才有资格谈物理过程。第二句话是数据下载和文件名管理要当成正式工程来做。我吃过亏之后现在所有下载脚本都会输出一个download_log.txt记录时间范围、变量列表、区域框后面出问题能快速回溯。第三句话是前处理结果一定要可视化验证一次。哪怕就是简单画出地形高度图、温度分布图都比闷头跑wrf.exe靠谱得多。我每次metgrid完都会快速出一个图确认模拟区域没有落到海上、地形没有异常这一步几乎帮我挡住了80%的“模型跑飞”问题。这周的进度就到这WPS前处理走通之后我准备进入real.exe和wrf.exe的实际积分环节跑完一轮完整模拟再回来更新下一篇日记。
返回列表