ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

WRF模拟必备:GFS、FNL与静态地理数据下载指南

2026/10/4 9:03:41 拓冰建站 浏览量
WRF模拟必备:GFS、FNL与静态地理数据下载指南 做WRF模拟的人十个里有八个把时间耗在了数据下载上。模型本身装好了namelist也改完了结果卡在“气象数据下不下来”这一步真的非常影响心态。尤其是刚接触WRF的同学一上来就要面对GFS、FNL、geog静态数据这一堆名词还有动不动几十GB的压缩包很容易被劝退。我当年第一次跑WRF光是把WPS预处理要用的数据凑齐就折腾了快一周。这篇文章就把我这些年反复使用的下载方法整理一遍从实时预报常用的GFS到科研复盘最稳的FNL再到最容易踩坑的静态地理数据一条条说清楚照着做就行。1. WRF跑起来之前先把三样数据准备好WRF本身是个计算核心它不会自己“变”出气象场。你给它什么样的初始场和边界条件它就模拟出什么样的天气过程。所以数据准备其实是WRF流程里最不该马虎的一步——数据选错后面算得再漂亮也是空中楼阁。1.1 驱动数据GFS与FNNL怎么选如果用一句话概括GFS是美国NCEP发布的全球预报数据FNL是同一家机构发布的再分析资料。两者在WRF圈子里几乎成了默认配置绝大多数WRF跑出来的论文和业务预报底层用的都是这两套数据。GFS的特点是“时效性强”每天4个起报时次00、06、12、18 UTC每个时次往后预报到384小时。做实时天气预报、台风临近模拟、短期个例复盘GFS都够用。FNL的特点是“稳”。它融合了更多观测资料经过严格的质量控制不会像GFS那样随着预报时效拉长而误差累积。做长期气候模拟、敏感性试验、需要多年数据支撑的研究首选FNL。1.2 静态地理数据决定模拟区域长什么样WRF不是在一张白纸上算天气的。地形高度、植被类型、土壤类型、土地利用这些下垫面信息都会直接影响边界层过程和陆面过程。这部分数据统称geog静态地理数据由geogrid.exe在预处理阶段读入生成geo_em.d01.nc文件。很多新手有个误区以为装好WRF就能直接跑结果运行geogrid的时候报错找不到GEOGRID.TBL或者生成的geo_em文件全为零。这就是geog数据没下载好或者路径配置错了。1.3 下垫面与海温提升模拟精度的隐藏加分项默认情况下GFS和FNL自带的海温场分辨率较粗如果做台风、海雾这类对海温敏感的模拟建议单独准备高分辨率的实时海温数据比如RTG_SST_HR或OISST。这些数据通常按天提供分辨率能达到0.083度甚至更高。下载方法和GFS类似找到对应日期的文件用wget或者脚本拉取就行后面第4章会说明通用流程。2. GFS实时预报数据从NOMADS直连下载全流程GFS数据的官方发布渠道是NCEP的NOMADS服务器地址是nomads.ncep.noaa.gov。这个服务器对公众完全开放不需要注册账号直接就能用wget拉取这点比FNL友好得多。2.1 先搞懂GFS文件命名规则GFS每一轮起报会生成一套文件命名格式看起来很长但拆开看很规律gfs.t00z.pgrb2.0p25.f000 gfs.t00z.pgrb2.0p25.f003 gfs.t00z.pgrb2.0p25.f006这里t00z表示00 UTC起报0p25表示0.25度分辨率约25公里f000表示起报时刻的分析场f003表示预报第3小时以此类推。如果只需要区域模拟的初始场通常下载f000和f003就够了如果做天气预报会下载到f120甚至更后。NOMADS服务器上每小时、每个起报时次的目录结构是https://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/ gfs.20250601/ 00/ atmos/ gfs.t00z.pgrb2.0p25.f000 gfs.t00z.pgrb2.0p25.f003 ... 06/ atmos/ ...注意gfs.20250601这个日期目录只有当天和过去几天会被保留过期文件会被清理。所以计划跑历史个例时如果NOMADS上已经找不到就要退回FNL或者别的高分辨率数据集。2.2 用wget批量下载一个完整预报周期我常用的方式是用一个简单的shell循环把要的时次拼成URL然后用wget批量拉取。举个例子下载2025年6月1日00 UTC起报、时效从f000到f048、间隔3小时的文件#!/bin/bash date_str20250601 cycle00 mkdir -p gfs_${date_str} cd gfs_${date_str} for fhr in $(seq -w 0 3 48); do urlhttps://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.${date_str}/${cycle}/atmos/gfs.t${cycle}z.pgrb2.0p25.f${fhr} wget -c -t 3 --timeout60 $url done-c支持断点续传下载到一半断了再跑一遍会接着下不用重新开始-t 3表示失败后重试3次。这两个参数在下载大文件时非常关键NOMADS服务器偶尔会抽风没有重试机制很容易卡死。如果只需要特定变量比如只想要风场可以在URL后面加上?varUGRD:VGRD这类参数做子集下载能省不少流量。不过考虑到WRF的ungrib步骤通常需要完整的grib2文件建议直接下全字段文件免得后续处理时发现缺少变量。2.3 下载后的完整性与解压检查GFS原始文件是grib2格式。下载完成后我习惯先用wgrib2或者WPS自带的grib_ls工具快速检查一下变量列表和时间戳确认文件没有损坏wgrib2 gfs.t00z.pgrb2.0p25.f000 | head -20看到类似1:0:d2025060100:UGRD:10 m above ground:anl:这样的输出就说明文件结构正常。另外也可以对比文件大小同一个时次、同一种分辨率大小一般在一个固定范围内波动如果明显偏小说明下载过程丢了字节建议删掉重新拉取。3. FNL再分析资料的获取注册RDA账号后按流程走FNL数据托管在NCAR的Research Data ArchiveRDA平台上需要先注册一个免费账号然后通过网页认证后的链接下载。整个流程比GFS多了一步认证但数据质量和稳定性值回票价。3.1 先弄明白FNL和GFS在实际使用中的差异年份越久远FNL的优势越明显。GFS的预报场在30天后会逐渐偏离真实大气状态而FNL每个时次都融合了卫星、探空、地面站等观测资料是当前时刻对大气状态的最优估计。对做气候分析和多天连续模拟的同学来说FNL是不二选择。FNL的分辨率有两个版本ds083.2是1.0度ds083.3是0.25度。1.0度的文件每个时次大约300MB左右0.25度的大约1GB上下两者都能直接被WRF的ungrib识别。日常跑个例、跑中小尺度过程0.25度足够跑一个月以上的长期模拟用1.0度能省大量磁盘空间和计算时间。3.2 RDA账号注册与数据访问入口RDA的地址是rda.ucar.edu。注册账号后搜索数据集编号ds083.2NCEP FNL Operational Model Global Tropospheric Analyses1.0度ds083.3NCEP FNL Operational Model Global Tropospheric Analyses0.25度进入数据集详情页后选择日期范围系统会列出该日期下所有时次的文件。这里有个很实用的功能RDA提供一个“Download via wget”的选项会自动生成一段带认证信息的wget命令链接里会包含你的账号和token参数。你只需要复制这段命令到终端执行即可。我个人的建议是不要自己去拼FNL的下载链接因为RDA的认证参数有时效性手动拼接容易踩坑。用网页生成的命令最稳妥。3.3 批量下载FNL用Python脚本生成认证URL再下载RDA官方网站生成的命令能解决单次下载但如果你要下载一整年的数据手工点几百次网页显然不现实。更好的办法是用脚本先向RDA的登录接口申请认证然后批量拼接文件名。大致思路是这样的import requests import time date_list [20250601, 20250602, 20250603, 20250604] cycles [00, 06, 12, 18] # 1. 先登录获取认证token login_url https://rda.ucar.edu/cgi-bin/login payload { email: your_emailexample.com, password: your_password, action: login } session requests.Session() session.post(login_url, datapayload) # 2. 批量下载 for date in date_list: for cyc in cycles: file_url fhttps://rda.ucar.edu/data/ds083.2/grib2/{date[:4]}/{date}/fnl_{date}_{cyc}_00.grib2 r session.get(file_url, streamTrue, timeout120) if r.status_code 200: with open(ffnl_{date}_{cyc}_00.grib2, wb) as f: for chunk in r.iter_content(chunk_size1024 * 1024): f.write(chunk) else: print(f{date} {cyc} failed: {r.status_code}) time.sleep(2) # 避免请求过快触发限制需要注意RDA服务器对同一IP的请求频率有限制批量下载时在循环里加sleep给服务器留点缓冲。如果中途断掉脚本重新跑一遍已下载的文件要么跳过要么用断点续传方式补全这里在代码里判断文件是否已存在即可。一个小细节FNL的文件名中日期和时间之间没有多余的字符比如fnl_20250601_00_00.grib2前两位00是起报时次后两位00是预报时效FNL只有分析场所以固定为00别弄混了。4. 静态地理数据WPS_GEOG下载目录组织和磁盘规划静态地理数据的下载量通常比气象驱动数据大得多而且很多新手第一次跑WRF就卡在这。4.1 官方渠道与压缩包选择WPS官方页面www2.mmm.ucar.edu/wrf/users/download/get_sources_wps_geog.html提供了不同版本的静态数据下载。最常用的是geog_complete.tar.gz包含全部默认数据集解压后大约60GB左右。如果你的磁盘空间紧张可以不下载完整包按需下载单独的数据集。比如只跑大陆地区的模拟地形gtopo_30s、土地利用modis_landuse_21class或usgs_lulc这几个是必需的其他像土壤类型、植被比例、城市分类等可以按需下载。4.2 具体的下载命令与目录配置我一般会把所有静态数据放在WRF主目录之外的一个独立目录里避免和源码混在一起方便后续升级mkdir -p /data/wrf_geog cd /data/wrf_geog wget -c https://www2.mmm.ucar.edu/wrf/src/wps_files/geog_complete.tar.gz tar -xzvf geog_complete.tar.gz解压完成后会得到一个WPS_GEOG目录里面是各种子目录。这个时候回到WPS的namelist.wps文件找到geog_data_path这一项改成geog_data_path /data/wrf_geog/WPS_GEOG这里有个容易踩的坑路径最后的WPS_GEOG不能省很多教程写的是/data/wrf_geog结果geogrid找不到地形文件报错信息还是那种“failed to open GEOGRID.TBL”的误导性提示。检查路径时确认你的路径下直接能看到gtopo_30s、modis_landuse_21class这类子目录。4.3 下载提速与断续续传的一些经验geog_complete.tar.gz文件十几个GB起步官方服务器在国外国内网络环境下容易断了重来。除了用wget -c续传之外还有几个实战技巧把下载任务放到夜间带宽空闲时段跑成功率明显比白天高。如果官方服务器速度实在不理想可以试试部分高校和科研机构做的镜像站搜索“WPS_GEOG 镜像”能找到不少下载速度快很多。用镜像前注意核对文件大小和目录结构避免下到残缺版本。用aria2这类支持多线程的下载工具替代wget多开几个连接速度能提升不少。命令大概是aria2c -x 8 -s 8 -c 你的下载链接。下载完不要急着解压先用md5sum和官方提供的校验值比对一下。压缩包在传输过程中很容易损坏解压到一半报错再回头重新下载时间成本翻倍。5. 数据下载的常见问题排查与一条龙思路数据下载看似是体力活但几乎每个人都会遇到几个坑。这里把我遇到过的典型问题按类别列出来方便排查。5.1 时区、日期与文件缺失的坑WRF全程使用UTC时间下载数据时最容易犯的错就是本地时间和UTC没换算导致下载了错误日期或错误起报时次的文件。比如北京时间比UTC快8小时你要模拟北京时间6月1日08时的天气对应的UTC时间是6月1日00时数据文件应该找gfs.20250531的18时次起报不实际上应该看你的模拟起始时间落在哪个起报时次内通常选择最接近模拟起始时间的那个cycle。还有一种情况GFS的f000分析场在当前起报时刻后的大约3-5小时才会在NOMADS上出现刚过起报时间就去下载很可能404。等30分钟到1小时再下载基本就能找到了。5.2 磁盘空间与文件完整性的经验值下面是基于我自己的使用经验整理的磁盘占用参考数据时间范围文件大小一天总量备注GFS 0.25度实时预报每个时次约200-400MB4个时次约1.2GB每个时次含完整变量FNL 1.0度历史再分析每个时次约300MB4个时次约1.2GBds083.2FNL 0.25度历史再分析每个时次约1GB4个时次约4GBds083.3WPS_GEOG静态压缩包约15-20GB解压后约60GB必须预留模式输出模拟结束单日可能数GB视嵌套层数和输出频率强烈建议单独盘跑一个月的1.0度FNL加默认静态数据最少需要准备200GB可用空间。如果跑0.25度数据再加多层嵌套500GB不算夸张。机械硬盘虽然便宜但WRF有大量小文件读写建议至少把数据目录放在SSD上能明显提升ungrib和metgrid的处理速度。5.3 把下载流程固化成脚本数据下载虽然一次性的工作量不大但只要你以后还需要跑新个例、追新台风就一定会重复这个过程。我这些年摸索的最佳实践是把下载逻辑写成一个通用脚本参数只留日期、起报时次、分辨率、时效范围几个剩下的自动拼URL、自动建目录、自动校验。下面这个脚本是我常用的GFS下载模板加了文件存在性检查#!/bin/bash # 用法: ./download_gfs.sh 20250601 00 0 48 3 DATE$1 CYC$2 FHR_START$3 FHR_END$4 FHR_STEP$5 OUTDIRgfs/${DATE}/${CYC} mkdir -p $OUTDIR for fhr in $(seq -w $FHR_START $FHR_STEP $FHR_END); do FILEgfs.t${CYC}z.pgrb2.0p25.f${fhr} # 已存在且大于100MB跳过 if [ -f $OUTDIR/$FILE ] [ $(stat -c%s $OUTDIR/$FILE) -gt 104857600 ]; then echo SKIP $FILE continue fi URLhttps://nomads.ncep.noaa.gov/pub/data/nccf/com/gfs/prod/gfs.${DATE}/${CYC}/atmos/${FILE} wget -c -t 3 --timeout60 -O $OUTDIR/$FILE $URL done同样的逻辑稍加修改就能用于FNL只是URL拼接和认证方式不同。把这类脚本存到自己的工具箱里以后哪怕一年后再跑WRF翻出来改个日期就能用比每次重新查教程高效得多。经过这些年反复下载各种气象数据的操作我最大的体会是与其死记每个数据源的界面和链接不如认真理解文件命名规则和发布规律。GFS的gfs.t00z.pgrb2.0p25.f000FNL的fnl_20250601_00_00.grib2静态数据按变量分类的目录结构说到底都是同一套逻辑——数据源把时间、分辨率、变量信息都编码进了文件名里。你只要掌握了这个解码思路换任何一家数据源都能快速上手。还有一个小经验正式跑模拟之前先下载一个时次的数据跑通WPS全流程确认ungrib和metgrid都能正常出文件再批量下载剩余时段。先小步验证、再全量拉取能帮你避开“下了几百GB数据才发现分辨率选错”这种欲哭无泪的局面。