
小白跑WRF第五天安装WPS和静态地理数据前四天折腾下来WRF主程序总算编译通过了GRIB2格式的数据也准备好了正摩拳擦掌准备跑第一个案例结果发现光有WRF还不顶事真正把气象数据“喂”给模式的活儿全都得靠WPS。很多第一次接触WRF的朋友都会在这儿卡壳老教程里的命令敲进去全是错新版WPS的configure选项跟网上截图对不上静态地理数据下载慢到怀疑人生。今天这篇就把WPS安装和静态地理数据配置这一整套流程掰开揉碎讲清楚尤其是那些文档里不会明说、但实操中几乎人人踩坑的细节。先介绍一下这套东西到底是干嘛的。WPS全称是WRF Preprocessing System负责把全球预报中心下发的粗网格气象资料比如GFS、FNL通常间隔0.25度到1度转换并插值到我们自己设定的模拟区域网格上同时把地形、土地利用这类静态地理数据一并处理出来。WPS装好了WRF才能拿到它认得的输入文件met_em开头的那批。如果你打算跑公众号里满天飞的WRF入门案例那WPS和下面要说的静态地理数据也叫geog数据就是你绕不开的两座山。适合读这篇的人有两类一类是跟我一样从零开始、操作系统都是现查现学的小白另一类是已经装好WRF但WPS折腾半天没成、想找一份能照着敲的完整流程的朋友。两者我都能帮到因为今天的内容基本就是一个可以“抄作业”的操作清单附带每个关键步骤背后的原因解释。1. 装WPS之前必须想明白的事1.1 WPS和WRF的版本对应关系别一上来就下最新的先泼一盆冷水别打开官网就下最新版。WRF、WPS的版本更新频率不算特别快但它们之间的版本搭配是有讲究的。WPS 4.5需要配WRF 4.5.xWPS 4.4对应WRF 4.4.x以此类推。原则上主版本号要一致小版本号可以稍微灵活但如果你拿WPS 4.6去配WRF 4.3很大概率会在geogrid生成geo_em文件或metgrid处理中间格式时冒出莫名其妙的报错。我自己用的是WRF 4.5.2配WPS 4.5这套组合跑了半年没出过兼容性问题。你在装之前建议先确认一下自己WRF的版本然后去WPS官网下载对应版本。官网地址记不住没关系搜索引擎直接搜“WPS download UCAR”认准域名带“wrf-model”的官方入口就行。1.2 依赖库检查比装WRF更挑剔的环节WPS编译配置时会检查一堆环境变量和依赖库包括但不限于netCDFFortran和C两套、HDF5、libpng、Jasper、MPI。别看构建WRF的时候它们都装好了WPS的configure对某些库的位置要求更严格——比如Jasper库如果你当时不是装在系统默认路径WPS的配置脚本很容易找不到头文件或链接库。我的建议是在编译WPS之前重新确认一遍环境变量把这四行加到~/.bashrc里然后source ~/.bashrcexport NETCDF/usr/local/netcdf export HDF5/usr/local/hdf5 export PATH$NETCDF/bin:$PATH export LD_LIBRARY_PATH$NETCDF/lib:$HDF5/lib:$LD_LIBRARY_PATH如果你跟我一样不确定自己的安装路径先用which nc-config和which h5dump查看一下再根据输出把目录调整过来。这一步做好了后面configure基本能一次过。1.3 环境变量和编译器类型要跟WRF保持一致编译WRF时你选了哪种编译器组合gfortrandmpar是绝大多数新手的首选WPS也必须用同一套否则后面运行ungrib和metgrid时会出现浮点异常SIGFPE或段错误segmentation fault。我遇到过最典型的例子WRF用gfortrandmpar编译成功WPS configure时手滑选了7号选项gfortran serial结果metgrid读取数据时直接崩掉排查了一晚上才发现是编译器并行库不一致。打开WPS的configure脚本后它会在屏幕上列出类似“1. Linux x86_64, gfortran (dmpar)”这样的选项。除非你很清楚自己在干什么否则就选跟WRF对应编译方式完全一致的那一项。比如WRF编译时显示的是gfortran (dmpar)那WPS就选带dmpar的那行不记得的话去WRF主目录下的configure.wrf文件里搜“DM_FC”字段里面写得明明白白。2. 编译WPS的完整实操流程2.1 下载、解压与configure的每一步下载好WPS安装包后我习惯把它放在跟WRF同级的目录下。比如我的/home/user/models目录里同时有WRFV4.5.2和WPS4.5两个文件夹这样后面处理数据时路径比较清晰。cd /home/user/models wget https://github.com/wrf-model/WPS/archive/refs/tags/v4.5.tar.gz tar -zxvf v4.5.tar.gz mv WPS-4.5 WPS cd WPS然后进行配置。这里有个和WRF类似但更反直觉的地方WPS不需要你事先清空某个目录但如果你之前configure过别的平台选项最好先执行一次./clean把旧的configure.wps和编译残留清掉再重新configure。export WRF_DIR/home/user/models/WRFV4.5.2 ./clean ./configureconfigure结束之后终端会显示一段总结重点看三行平台、编译器类型、有没有自动识别出NETCDF路径。如果这一段里出现“ERROR”字样或者NETCDF是unknown别继续了先把环境变量重新弄好再回来。确认无误后开始编译./compile编译过程会输出大量日志不要求全看懂但结尾处一定要确认三个可执行文件都生成了一个都不能少geogrid.exe处理静态地理数据生成geo_em文件ungrib.exe将GRIB格式气象资料解码成中间格式metgrid.exe将气象数据水平插值到模拟网格生成met_em文件检查方法ls -l *.exe如果三个都在恭喜你WPS编译这关过了。如果少了某个最常见的原因是链接库路径缺失把上面那段LD_LIBRARY_PATH重新export一下再./clean ./configure ./compile七成情况能解决。2.2 编译失败的返工顺序按这个排查最省时间WPS编译失败时屏幕输出可能几十上百行别眉毛胡子一把抓。我总结了一套从最可能到最不可能的排查顺序环境变量没生效先检查env | grep NETCDF有没有输出没有就重新source.bashrc。编译器类型不匹配确认configure时选的选项是否与WRF一致。Fortran与C的NetCDF版本冲突有时会报libnetcdff.a找不到这通常是netcdf-c和netcdf-fortran没装全用包管理器重新安装即可。Linux系统缺少基础库csh、m4、perl虽然WPS不依赖csh运行但configure脚本某些后台命令会用到。这套顺序我照着排查过三次均在三十分钟内定位问题。2.3 静态地理数据的下载策略静态地理数据的官方推荐入口是NCAR的数据库文件名是geog_complete.tar.gz解压之后接近30GB而且因为是境外服务器国内直连经常卡到只有几十KB/s。我第一天下载时挂了一整晚第二天一看才下了12%心态当场裂开。后来发现的可行办法是找国内高校的镜像源很多搞大气科学的实验室会镜像这套数据速度能到几MB/s。具体网址我不直接贴了搜索“geog_complete 网盘”或“WPS静态地理数据 镜像”就能找到。下载时要注意核对压缩包大小官方包是约16GB、解压后约30GB如果某个源的压缩包只有几百MB大概率是高程数据和土地利用数据被精简过跑教学案例可能凑合但正规研究就别省这个事。解压静态地理数据mkdir /home/user/models/WPS_GEOG tar -zxvf geog_complete.tar.gz -C /home/user/models/WPS_GEOG解压结束后检查一下目录内容正常情况下应该有至少50个左右的子目录包括landuse、topo_30s、soiltype_top、albedo这些。如果你的解压结果看起来数量不对八成是下载不完整重新下载压缩包再解压一次。3. 静态地理数据和namelist.wps的配合3.1 geogrid.exe是如何“读取”静态地理数据的静态地理数据解压出来之后不是直接丢进WPS就完事了它的目录位置必须在namelist.wps里明确告诉geogrid。geogrid这个程序所做的核心工作是把全球范围的静态地形和土地利用数据裁剪并插值到你设定的模拟区域也就是嵌套网格范围上输出成geo_em.d01.nc这类文件。WRF在初始化时读取这个文件来设定模式的下垫面特征比如地形高度、植被类型、土壤类型等。所以这里有个很容易犯的低级错误有人直接下载完数据不解压就配路径或者解压到了别的目录没在namelist里改导致geogrid运行时报错PROBLEM IN GEOGRID或者找不到某个字段。运行时照着报错信息里给出的路径去看一眼有没有对应的.nc或.tif文件就能定位。3.2 修改namelist.wps的关键字段WPS目录下有个默认的namelist.wps文件是整个前处理流程的总配置。照着下面的示例修改重点看注释share wrf_core ARW, max_dom 2, start_date 2023-06-01_00:00:00, end_date 2023-06-01_12:00:00, interval_seconds 21600, io_form_geogrid 2, / geogrid parent_grid_ratio 1, 3, i_parent_start 1, 40, j_parent_start 1, 40, e_we 100, 151, e_sn 100, 151, geog_data_res default,default, dx 30000, dy 30000, map_proj lambert, ref_lat 30.0, ref_lon 105.0, truelat1 30.0, truelat2 60.0, stand_lon 105.0, geog_data_path /home/user/models/WPS_GEOG, / ungrib out_format WPS, prefix FILE, /逐项解释几个关键参数max_dom嵌套层数设2就是模拟区域带一层嵌套。新手建议先用单层跑通把max_dom设为1、删掉第二个域相关行否则后续ungrib或metgrid出错时容易分不清是哪个域的问题。dx/dy水平网格间距单位米30000表示30公里。模拟区域越小、分辨率越高这个值就越小但计算量会成倍增加入门案例从30km开始比较稳妥。geog_data_path必须指向前面解压静态地理数据的目录/home/user/models/WPS_GEOG程序会在这个目录下按字段名找子目录。interval_seconds气象数据的时间间隔FNL再分析资料一般是6小时一次填21600秒如果用的是3小时间隔的GFS预报场就填10800。改完保存后运行geogrid./geogrid.exe正常情况下屏幕会滚动输出进度。结束后用ls geo_em*查看出现geo_em.d01.nc如果设了嵌套还会有geo_em.d02.nc就说明geogrid这步完成了。3.3 静态地理数据处理进阶两个容易考倒新手的问题第一个问题很多人会发现geo_em.d01.nc里土地利用数据是20多年前那个版本黑体地、水体的分类比较粗。这是因为default分辨率默认调用了modis_landuse和usgs_lakes这类老版本数据集。如果你想要新一些的MODIS数据需要先下载MODIS 2020版本的土地利用数据然后在namelist.wps的geogrid里显式指定geog_data_res modis_landuse。不过这个操作比较进阶新手入门阶段可以先不管等模拟结果开始用在论文里再回头升级不迟。第二个问题嵌套区域与d01的边界不交叠。很多新手看着教程模板直接填i_parent_start、j_parent_start和e_we、e_sn一不小心就让d02跑到了模拟区域外面。此时geogrid不会报错但后续metgrid阶段很可能出现大量“interpolation failed”警告。建议第一次跑之前调用ncl ndown.ncl或是直接到 网站 上去可视化一下geo_em.d01.nc的边界确认两个域的位置正确后再往后走。4. ungrib和metgrid从气象资料到met_em文件4.1 链接GRIB数据和Vtable这步的操作逻辑geogrid完成后接下来要把下载的GRIB气象资料处理成中间格式负责这个任务的是ungrib。在WPS目录下有一个link_grib.csh脚本专门用于将气象数据在WPS目录下做一个符号链接这样ungrib可以直接找到它们。以FNL数据为例下载完成后数据可能是fnl_20230601_00_00.grib2这样的文件名。在WPS目录下执行./link_grib.csh /home/user/data/fnl_20230601_00_00.grib2 /home/user/data/fnl_20230601_06_00.grib2有多个文件时可以把文件名全列在后面脚本会自动生成GRIBFILE.AB、GRIBFILE.AC这样的短链接。如果你的文件名长长短短的不统一建议先统一重命名成带日期和时次的短名字再链接后面查看日志时少受点罪。链接好数据后需要选择Vtable它是一个文本文件告诉ungrib每种气象变量在GRIB文件中的编码编号是什么。对于FNL和GFS数据标准做法是ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable注意这里ln -sf后面的目标路径是相对于WPS目录的。如果你忘记链接Vtableungrib运行时会直接报Vtable not found走人不会给你任何“体贴”的提示。4.2 运行ungrib的常见报错与修复运行ungrib很简单./ungrib.exe它的正确运行结果是在WPS目录下生成FILE:2023-06-01_00这样的中间格式文件文件名前缀由namelist里的prefix字段决定。如果中途报错最常见的原因就三种GRIB2 data not found或unable to read GRIB data多半是链接数据时没完成检查ls GRIBFILE.*看有没有文件。At line xxx of file met_data.F90再附带一堆数字这通常是Vtable种类不对比如用GFS的Vtable去读ECMWF的GRIB数据内部变量对照不上。grib2 code 4 not found in VtableGRIB文件里有某种Vtable不认识的变量多见于新版本GFS添加了额外的字段。这种一般无伤大雅可以忽略继续运行。ungrib完成后ls FILE*应该能看到按时间排列的中间格式文件。打开任意一个文件头部看看如果显示一堆“Field”信息和变量名就说明解码成功了。4.3 metgrid插值最后一步别放松ungrib完成后metgrid.exe负责将中间格式的气象数据水平插值和垂直插值到geogrid生成的网格上最终输出WRF初始化用的met_em文件。运行之前确保namelist.wps里的share部分时间设置正确。然后./metgrid.exe结束后检查ls met_em*应该能看到met_em.d01.2023-06-01_00:00:00.nc、met_em.d01.2023-06-01_06:00:00.nc等文件。如果d02也存在对应文件假设设了嵌套那整个WPS的数据处理链路就算全部打通了。到这一步WRF主程序已经能够读取这些met_em文件进行模式积分计算剩下的就是real.exe和wrf.exe的事了。这里也必须提醒一句metgrid运行日志中出现Warning: missing fields并不一定代表失败。有时是某些变量在GRIB源数据里本身就不存在比如土壤温度的多层数据。只要最终met_em文件成功生成且大小不为0就可以继续往下走。5. 安装和配置过程中的高频问题速查表我把这五天来亲自踩过、以及在学习群里看别人踩过的坑整理成了一张速查表你遇到问题时对着查就行。问题现象常见原因解决办法configure时提示netcdf路径找不到环境变量未设置或设置路径不对检查~/.bashrc里的NETCDF路径确保指向netcdf安装根目录重新source后再configure编译完成后只有geogrid.exe缺ungrib或metgrid缺少Jasper或libpng库支持安装libpng和jasper后重新设置LD_LIBRARY_PATH再clean、configure、compile./geogrid.exe运行时报ERROR: The mandatory geogrid table file GEOGRID.TBL was not foundGEOGRID.TBL路径未找到WPS的geogrid目录下自带GEOGRID.TBL确认当前工作目录在WPS主目录中或exportGEOGrid_TBL_PATH环境变量指向含GEOGRID.TBL的目录ungrib运行后生成的FILE文件只有几十字节Vtable没链接成功或链接到了错误的Vtablels -l Vtable确认符号链接存在并指向正确的Vtablemetgrid运行时报Interpolation failedgeogrid的嵌套域设置与ungrib处理的气象数据范围不匹配比如插值点超出气象数据范围检查namelist.wps中d02起始坐标和范围是否正确或用更大的气象数据范围重新下载运行metgrid时被杀掉Killed系统内存不足尤其是高分辨率大模式降低e_we、e_sn网格规模或嵌套层数关闭不必要的后台程序检查交换空间运行wrf.exe前real.exe报错提示找不到met_em文件metgrid输出路径不对或时间命名与namelist.input不一致确认met_em文件与namelist.input里的start/end日期、run_hours一致注意链接或移动met_em到WRF运行目录静态数据解压后磁盘空间不够WPS_GEOG超过30GB换大分区存放别把静态数据和系统盘挤在一起至少预留35GB剩余空间geogrid.exe结束后geo_em文件存在但ncdump -h打开报错某些系统的netCDF工具版本与WRF库版本不一致尽量用与WPS库相同版本的工具查看或用Python的netCDF4库打开验证6. 跑通之后的一些心得体会这五天里最耗时间的其实不是敲那几条命令而是反复地在“看教程、找版本、试错、看报错日志、再试”之间循环。你如果也是一个人闷头装我建议加一两个活跃的WRF交流群但提问前一定先把configure.wps或namelist.wps里涉及的报错原文贴全别只发一句“我的WPS装不上”同时把环境变量内容和操作步骤贴上。这样别人一眼能看出问题愿意帮你的人也更多。关于版本选择再多说一句真没必要追新WRF和WPS都用两年前发布的稳定版本就够了论文和业务模拟讲的是可重复性不是软件版本号最新。等你这套流程完全跑通、还能顺手改改嵌套域和分辨率之后再考虑升级版本那时当然可以随便折腾。最后分享一个小技巧在整个WPS运行过程中WPS目录里会堆积大量临时文件和中间文件每次跑新模式案例前最好把GRIBFILE.*、FILE*、met_em*这些旧文件清掉或挪到别的备份目录。否则你下一次跑新案例时ungrib可能读到旧的中间格式数据而metgrid也可能因为旧的met_em文件存在而输出一堆莫名奇妙的合并结果。我当时就是没留意这个细节浪费了大半天去追查一个其实早被旧数据污染的模拟结果。