ARTICLE DETAIL

资讯详情

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

WRF模式从零搭建:WPS编译与静态地理数据配置全流程指南

WRF模式从零搭建:WPS编译与静态地理数据配置全流程指南 1. 开工前先搞清楚WPS到底在WRF里扮演什么角色小白跑WRF第五天我总算和WPS、静态地理数据正式交上手了。先说一个最容易懵的点这里的WPS全称是WRF Preprocessing System是WRF模式的前处理系统不是办公软件WPS Office更不是什么破解版会员版。搜索资料的时候你会发现网上90%的“WPS安装教程”都是文档编辑软件的和我们要装的东西完全是两个宇宙。这篇内容就是给同样正在跑WRF的“第五天战友”准备的重点讲清楚WPS为什么难装、静态地理数据为什么要下载一大堆、以及怎样一次性把这两个坑都踩平。WPS说到底是WRF的“后勤部门”。WRF模式本身再牛也需要先回答三个问题模拟区域长什么样地形和地表覆盖是什么样的气象强迫场从哪里来前两个问题归geogrid管第三个问题由ungrib和metgrid协作完成。安装WPS的本质就是把这三个工具编译出来再把它们需要的数据准备好。静态地理数据就是geogrid的“材料库”没有它你连模拟区域的地形图都画不出来。1.1 三个可执行文件一图流看明白各个环节WPS编译完成后会得到三个可执行文件geogrid.exe、ungrib.exe、metgrid.exe。三者之间是流水线关系理解清楚这条流水线后面配置才不容易糊涂。geogrid.exe负责定义模拟网格并把地形高程、土地利用类型、土壤类型、植被覆盖等静态地理数据插值到网格上最终生成geo_em.d01.nc文件。你可以把它理解成“铺地砖”的过程先把地板打好格子再把砖一块块铺上去砖就是那些静态地理数据。ungrib.exe负责把气象强迫场数据从GRIB格式解压成WRF能读的“中间格式”。简单说它是翻译官把ECMWF、NCEP等气象中心的二进制资料翻译成模式社区的通用语言。metgrid.exe负责把翻译好的气象数据水平插值到geogrid定义的网格点上输出met_em.d0X文件。它相当于“分货员”把气象要素按时按点送到每个格点手里。这三个环节一环扣一环任何一个没编译好后面都白搭。我见过不少人geogrid跑通了以为万事大吉结果到ungrib一步报错回头找原因才发现编译WPS时少链接了Jasper库或者Vtable没选对。所以安装阶段多花点时间检查后面能省一天。1.2 静态地理数据为什么这么重要很多人不理解模拟天气为什么要下载那个动辄几个GB到十几GB的静态地理数据。我举一个直观的例子同样是午后热对流山区和平原的对流触发机制完全不一样。WRF的地形高度如果被抹平山谷风环流就出不来降水落区能偏出去几十上百公里。静态地理数据主要包含几类关键信息地形高度、土地利用类型、土壤类型、月平均植被绿度、反照率、城市场强等。这些下垫面信息直接决定地表能量收支和边界层过程。以土地利用类型为例MODIS 21类分类和USGS 24类分类对同一块地的定义不同会直接影响感热通量和潜热通量的分配进而影响边界层温度、湿度和云的发展。所以静态数据不是随便用一套就行。你在namelist.wps里配的geog_data_res以及GEOGRID.TBL.ARW里指向的数据集共同决定了下垫面的精细程度。跑中尺度9km网格用2m约4km分辨率的数据够用跑到3km甚至1km嵌套最好上30s约1km的地形和土地利用数据。这也是为什么官方一直建议下载最新完整版数据的原因。1.3 版本对应关系先看README再动手安装WPS前一定要看WPS源码根目录下的README文件里面写清楚了当前版本需要的NetCDF版本、编译器要求、以及对应的静态地理数据版本。比如WPS 4.x新版本对geog数据的要求就已经更新到4.0版本旧版数据虽然也能跑但某些字段可能匹配不上报出“GEOGRID.TBL里找不到某种数据”这种莫名其妙的问题。另外编译器的选择也要统一。WPS、WRF、以及所有依赖库建议用同一套编译器链。最常见的是gfortran加mpich或者Intel Fortran加impi。混用编译器是新手最容易踩的雷netCDF用gcc编译的WPS却用Intel编译链接的时候报一堆undefined reference根本不知道问题出在哪。所以前期就老老实实统一用gfortran。2. 依赖库安装编译WPS前先摆平这几样WPS不是独立存在的程序它依赖一连串第三方库。很多“安装失败”的截图其实都是在依赖库里先翻了车。第五天的重点之一就是把netCDF、Jasper、libpng、zlib这些底层依赖在编译WPS之前全部就位。2.1 netCDF双件套是读写数据的地基netCDF是WRF整个体系中最重要的文件格式geogrid输出的geo_em、metgrid输出的met_em都是netCDF格式。WPS源代码有大量Fortran和C代码直接调用NetCDF API所以必须同时安装netCDF-C和netCDF-Fortran两个包缺一个都不行。最稳妥的安装方式是选择固定前缀比如都装到/usr/local/netcdf方便后面配置环境变量。拿到源码包后依次执行# netCDF-C ./configure --prefix/usr/local/netcdf --disable-dap make -j4 make install # netCDF-Fortran export CPPFLAGS-I/usr/local/netcdf/include export LDFLAGS-L/usr/local/netcdf/lib ./configure --prefix/usr/local/netcdf make -j4 make install注意netCDF-Fortran的configure依赖netCDF-C已经安装成功所以顺序不要搞反。另外如果你的netCDF-C需要HDF5支持就得先装HDF5。判断标准很简单如果configure报错提示找不到HDF5或者hdf5.h那就老老实实先编译安装HDF5再回头装netCDF。2.2 Jacob库和压缩库决定ungrib能不能解GRIB2ungrib要处理的GRIB2数据是压缩格式需要调用Jasper库来处理GRIB2的压缩算法。别小看这个库很多教程根本没提它结果到了编译WPS阶段报错信息里出现“libjasper not found”人直接傻眼。Jasper依赖libpng和zlib安装顺序是zlib到libpng再到jasper。我用的版本组合是zlib 1.2.13、libpng 1.6.40、jasper 2.0.33亲测稳定。编译时设置好JASPERLIB和JASPERINC环境变量export JASPERLIB/usr/local/jasper/lib export JASPERINC/usr/local/jasper/include export LD_LIBRARY_PATH$JASPERLIB:$LD_LIBRARY_PATH除了这些并行库mpich或OpenMPI也建议提前装好。WPS的metgrid是可以并行的后续模拟时次多、网格大的情况下单核跑metgrid能把你熬到怀疑人生。我建议编译dmpar版本的WPS后面用mpirun跑metgrid会舒服很多。2.3 环境变量统一管理别让路径打架依赖库多了之后最忌讳的就是各装各的路径、各写各的环境变量最后系统里出现两三个netCDF版本编译时链接到错误的那份。我的做法是把所有WRF相关路径统一配置在~/.bashrc里集中管理export NETCDF/usr/local/netcdf export PATH$NETCDF/bin:$PATH export LD_LIBRARY_PATH$NETCDF/lib:$LD_LIBRARY_PATH export JASPERLIB/usr/local/jasper/lib export JASPERINC/usr/local/jasper/include export LD_LIBRARY_PATH$JASPERLIB:$LD_LIBRARY_PATH配置完记得source ~/.bashrc然后用which nc-config确认路径是否生效。这里有个小经验不要在服务器上频繁重装依赖库如果某一次版本出了问题优先检查LD_LIBRARY_PATH里是否混杂了旧库的路径这是Linux常见病。3. 编译WPS的实录从configure到三个exe依赖库就位之后编译WPS本身反而没那么难关键是configure选项要选对。这一节把我实际操作过程完整记录下来包括我怎么排查问题、怎么确认编译结果。3.1 源码下载与目录规划WPS源码可以从WRF官网下载压缩包也可以直接git clone GitHub上的仓库。我习惯用git方式因为后续想看更新日志方便。git clone https://github.com/wrf-model/WPS.git cd WPS解压或克隆完成之后不要急着configure先检查一下目录里是否有旧的configure.wps文件。如果有而你又换了编译器或库版本建议直接删掉不然configure会沿用旧配置白白踩坑。这一点尤其适合从别人电脑拷贝过来的WPS目录。3.2 configure的交互选项怎么选执行./configure之后脚本会自动检测环境并列出可用的编译选项。不同版本菜单不一样但大致分两种serial和dmpar并且针对不同编译器有一堆组合。我用的gfortran环境选择的选项是“Linux x86_64, gfortran (dmpar)”如果你装的是Intel编译器就对应选Intel的dmpar选项。选完后WPS会生成一个configure.wps文件。很多教程到这一步就直接让compile我建议多花两分钟检查configure.wps里的关键路径COMPRESSION_LIBS -L$(JASPERLIB) -ljasper -lpng -lz COMPRESSION_INC -I$(JASPERINC)如果这两行是空的或者路径不对说明configure没有识别到Jasper库。别急着compile先回去查JASPERLIB和JASPERINC环境变量是不是导出失败了或者Jasper是不是真的装成功了。这个环节多花两分钟能省后面两小时的排查时间。3.3 compile完成后必须检查的三件事configure没问题后就可以编译了./compile 21 | tee compile.log编译过程会输出一大段日志不要只看最后的“Success”字样就完事我见过编译报错但脚本继续执行完的情况最后根本没生成exe。正确姿势是等编译结束后逐个检查下面三件事第一确认当前目录下生成了三个可执行文件geogrid.exe、ungrib.exe、metgrid.exe一个都不能少。第二查看compile.log里有没有“Error”或者“undefined reference”。第三把三个exe用file命令看一眼确认是64位ELF可执行文件而不是什么异常文本。如果发现缺文件最常见的原因是NetCDF-Fortran没装或者configure.wps里的NetCDF路径指错了。解决方法是重新检查环境变量删掉configure.wps后重新configure再compile。3.4 Vtable和配置表软链接编译成果的“接线”编译出三个exe之后需要把它们要用的“配置表”链接到当前运行目录。这一步容易被忽略但漏掉之后geogrid或metgrid会直接报错找不到文件。在WPS根目录下按需执行ln -sf geogrid/GEOGRID.TBL.ARW GEOGRID.TBL ln -sf metgrid/METGRID.TBL.ARW METGRID.TBL这两条是把geogrid和metgrid的默认控制表软链接到当前目录。至于Vtable要根据你的气象数据源来选。比如跑ERA5数据就链接ERA5的Vtable跑FNL数据就链接GFS的Vtableln -sf ungrib/Variable_Tables/Vtable.ERA5 Vtable链接完成后在WPS根目录用ls -l看一眼确认软链接没有指向不存在的文件。红色闪烁的链接就是失效的需要换一个正确的源文件。4. 静态地理数据下载与部署最磨人的一关安装WPS本身半天能搞定静态地理数据才是真考验。数据量大、下载容易中断、解压时间长、目录结构容易搞错每一个环节都能劝退一批人。这节把下载和下放的完整流程梳理一遍能避不少坑。4.1 下载前先搞清版本和用途WPS源码根目录的README里或者WRF官方页面的“Static Geography Data”栏目会说明当前WPS版本匹配的静态数据版本。我记得WPS 4.5之后官方主推的是geog 4.0版本下载页一般提供完整版和低分辨率版两种。完整版解压后接近20GB包含各分辨率的地形、土地利用、土壤类型等全套数据适合需要做高分辨率嵌套的用户。低分辨率版小很多只有默认分辨率的数据跑教学案例或者粗网格试验够用。我的建议是如果你的磁盘空间足够直接下载完整版。因为后续你肯定想尝试不同分辨率的数据组合缺一个子目录就可能让geogrid报错。别为了省几个GB空间把宝贵的排查时间都搭进去。4.2 下载、解压、校验一气呵成下载静态数据需要用到断点续传因为文件实在太大网络一抖就断没有-c参数就得从头再来wget -c https://www2.mmm.ucar.edu/wrf/src/wps_files/geog_complete.tar.gz下载完成后官方一般会提供MD5校验值在解压前先用md5sum核对一遍。我见过数据包下了一半被wget误判完成的情况解压到一半直接报CRC错误这时候回头重新下载浪费的时间才叫冤枉。解压是一个漫长的过程建议放在后台跑tar -zxf geog_complete.tar.gz注意解压出来的目录通常叫geog这个目录就是后面namelist.wps里geog_data_path要指向的路径。我习惯把它放到自定义路径下比如/home/models/WPS_GEOG/geog然后把父目录记为geog_data_path。4.3 GEOGRID.TBL的机制geogrid去哪里取数据很多人以为namelist.wps里写了geog_data_pathgeogrid就会自动找数据其实真正决定“找什么数据、用什么插值方法”的是GEOGRID.TBL.ARW这个文件。它就像一份菜谱告诉geogrid每个变量应该从哪个子目录读、用哪种插值算法、优先级怎样。比如地形高度这一项GEOGRID.TBL.ARW里会写多个候选路径包括hgt_30s、hgt_2m、hgt_5m等geogrid按顺序尝试读取找到哪个就用哪个找不到就跳到下一个。土地利用也是类似MODIS和USGS两套体系都有对应目录。这就解释了为什么完整版数据好用目录齐全GEOGRID.TBL里写到的数据都能找到不需要手动改配置表。如果你只下载了部分数据可能就得自己去编辑GEOGRID.TBL.ARW把缺少的候选路径删掉。新手不建议这么做容易改坏。5. namelist.wps配置与第一个geo_em.d01.nc依赖库装好、WPS编译通过、静态数据解压完毕接下来就到了配置namelist.wps的时刻。这一步是把你的模拟区域从“想法”变成“网格”的桥。5.1 关键参数把你的模拟区域翻译给geogridnamelist.wps用Fortran namelist格式里面划分了share、geogrid、ungrib、metgrid四个部分。对一个只用geogrid的新手来说重点是share和geogrid两块。拿我最近跑的一个长三角区域举例share wrf_core ARW, max_dom 1, start_date 2023-07-01_00:00:00, end_date 2023-07-01_12:00:00, interval_seconds 21600, io_form_geogrid 2, / geogrid parent_id 1, parent_grid_ratio 1, i_parent_start 1, j_parent_start 1, e_we 150, e_sn 100, geog_data_res default, dx 9000, dy 9000, map_proj lambert, ref_lat 31.5, ref_lon 121.0, truelat1 30.0, truelat2 33.0, stand_lon 121.0, geog_data_path /home/models/WPS_GEOG/geog /这里e_we和e_sn是格点数dx和dy是网格距单位是米。9km网格、150x100格点覆盖范围大约1350km x 900km跑华东区域足够。map_proj用lambert中纬度区域标准选择。ref_lat和ref_lon是区域中心点truelat1和truelat2是两条标准纬线stand_lon是投影中心经线。这些参数直接影响模拟区域的变形程度不建议乱改。geog_data_res这里写了default意思是让geogrid按GEOGRID.TBL里的默认优先级去选数据。如果你明确想用更细的地形和更高分辨率的土地利用可以显式写成30s但要确保数据目录里有对应的30s数据集。5.2 跑通geogrid并检查输出配置完namelist.wps之后就可以运行第一个WPS程序了./geogrid.exe如果一切正常屏幕上会滚动大量消息最后生成geo_em.d01.nc。判断是否成功一个是看是否有“Success”标志另一个是确认geo_em.d01.nc文件存在且体积不是0。强烈建议跑完后用ncdump查看一下关键变量确认你的网格确实定义正确ncdump -h geo_em.d01.nc | head -60这时你会看到HGT_M地形高度、LU_INDEX土地利用类别、LANDMASK陆海掩膜等变量。如果HGT_M里全是0说明地形数据没被正确读取回头检查geog_data_path路径和GEOGRID.TBL里的hgt_30s目录。另一个更直观的检查方法是用Python的xarray和cartopy画一张地形图看模拟区域是否对准了你想要的位置。这一步虽然要写点绘图代码但比看一堆数字有用得多。5.3 顺手走一遍ungrib和metgrid流程geogrid跑通后整条WPS链路就算走了一半。如果想完整验证WPS安装没有问题建议再走一遍ungrib和metgrid。先把你的GRIB2文件准备好然后链接./link_grib.csh /path/to/your/data/*.grb2link_grib.csh在ungrib目录下面执行完会生成一串GRIBFILE.AAA、GRIBFILE.AAB这样的符号链接。接着在namelist.wps里配置好fg_name比如fg_nameFILE然后./ungrib.exe成功后生成FILE:2023-07-01_00这表示中间格式文件已经产出。紧接着运行./metgrid.exe这步会读取geo_em.d01.nc和FILE中间文件最终生成met_em.d01.2023-07-01_00:00:00.nc等文件。看到met_em文件生成就说明WPS的三大件全部安装成功、可以正式进入WRF预处理环节了。我建议每个新手至少完整跑通一次ungrib和metgrid因为很多老手也经常在Vtable和fg_name配置上卡壳提前走一遍能对这些环节有个直观概念。6. 常见问题排查与避坑实录第五天的安装过程中我前前后后踩了十几个坑有的坑当时翻遍网络都没搜到最后还是逐行看日志才定位出来。这里整理成速查表送给后来人。6.1 安装和静态数据阶段的高频报错报错现象可能原因解决方法configure时找不到gfortran编译器没安装或不在PATH安装gfortran确认which gfortran有输出configure.wps里COMPRESSION_LIBS为空JASPERLIB或JASPERINC没导出检查环境变量后重新configure编译时报NetCDF相关undefined referencenetCDF-C或netCDF-Fortran没装好重新安装netCDF-Fortran确认configure.wps中NetCDF路径运行时提示GEOGRID.TBL not found当前目录没有软链接GEOGRID.TBL执行ln -sf geogrid/GEOGRID.TBL.ARW GEOGRID.TBLungrib提示libjasper.so找不到Jasper动态库路径不在LD_LIBRARY_PATH把$JASPERLIB加入LD_LIBRARY_PATH并更新geogrid生成了geo_em但HGT_M全0geog_data_path指向错误或数据子目录不完整检查geog_data_path和hgt_30s目录内容metgrid报日期不匹配namelist.wps里的start_date/end_date和时间间隔与气象数据不一致统一使用UTC时间检查interval_seconds是否匹配数据输出频率这些报错有一个共同特点日志信息都比较长新手容易慌。我的经验是只看Error之后五行以内的关键信息再上网搜很快就能定位。6.2 来自第五天的几点经验装到第五天最大的感悟是“顺序”太重要了。安装WPS的正确顺序是先装依赖库再配环境变量再编译WPS最后放静态数据。只要顺序对了每一步都能顺着走下来顺序乱了后面全是连锁报错。另外强烈建议在WPS根目录外单独建一个工作目录比如run_case_01把namelist.wps和三个exe的软链接都放进去每次跑案例都在新工作目录操作。这样多个案例之间不会互相污染配置文件出了问题也方便回溯。关于静态数据还有个小技巧运行geogrid之前先用du -sh检查一下geog数据目录的大小和子目录数量。如果你的geog目录下载不全很多子目录是空的geogrid运行到那个变量时会直接跳过导致变量全是默认填充值。这个坑特别隐蔽不看数据目录根本发现不了。第四点是ulimit。如果你的模拟区域较大geogrid运行到一半直接报段错误很可能不是代码问题而是栈空间不够。执行一下ulimit -s unlimited再重跑很多莫名奇妙的崩溃都能解决。这个细节绝大多数教程都不会提但实际遇到的人非常多。还有一点经验要给跑嵌套区域的朋友如果plan到了max_dom2或3的情况namelist.wps里会多出一堆parent_grid_ratio、i_parent_start这类参数。建议第一次先只跑单域确认单域的逻辑完全跑通了再研究嵌套参数。嵌套的父子网格关系一旦配错生成的geo_em文件会互相不匹配到WRF的real.exe阶段才能发现返工成本极高。最后装上WPS和静态数据只是第五天的一个节点接下来还有real.exe、WRF主模式编译、运行参数配置等一堆硬仗等着。但只要你把WPS这条流水线跑通了后续很多内容其实就是不断地“配参数、跑程序、查日志”的循环不再需要和编译器和依赖库死磕。这个坎跨过去后面会顺畅很多。
返回列表