多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

WRF前处理WPS安装与静态地理数据配置指南:从依赖库到geogrid.exe跑通

WRF前处理WPS安装与静态地理数据配置指南:从依赖库到geogrid.exe跑通 小白跑WRF第五天安装WPS和静态地理数据。到了这一步说明WRF主程序已经编译成功接下来该解决模型数据从哪来的问题了。WPSWRF Preprocessing System是WRF模型的前处理工具链静态地理数据则是模型给下垫面画像的基础资料。这篇就把WPS从编译到跑通geogrid.exe这条线捋清楚解决掉我当年在这个环节踩过的几个硬坑也让你今天能把这一步稳稳走完。先说结论安装WPS没有想象中那么难但也没有网上教程写的那么轻松。难在依赖库版本匹配难在静态数据动不动几十个GB难在你以为装完了结果运行时报一堆莫名其妙错。但只要理清WPS在WRF流程里到底扮演什么角色再一步步照着做这个环节完全没有玄学。1. 为什么跑WRF要先装WPS预处理三步棋的定位1.1 WRF本人只负责算不负责收拾数据WRF主程序求解的是大气运动方程组它本身并不关心你的模拟区域在哪、地形长什么样、气象数据是从哪个模式或者哪套再分析资料里来的。它只认两类输入一类是描述网格和静态下垫面信息的geo_em文件一类是插值到网格上的气象驱动场met_em文件。这两类文件谁来生产就是WPS。WPS实际上包含三个独立的可执行程序geogrid.exe根据你的模拟区域设置把地形高度、土地覆盖、土壤类型等静态地理数据插值到模型网格上生成geo_em.d0X.nc文件。ungrib.exe把GRIB格式的气象数据解码成WPS的中间格式相当于做一次格式翻译。metgrid.exe把ungrib处理好的气象场水平插值到geogrid生成的网格上输出met_em.d0X.nc。所以整个过程可以这样理解你想用WRF模拟某一天的天气首先得告诉WRF你将在哪张网格上计算以及计算区域的下垫面长什么样这就是geogrid干的活然后得把外部气象场喂进去这就是ungrib和metgrid的活。三兄弟缺一个都不行。如果你暂时只想编译WPS验证环境第一个必须跑通的就是geogrid.exe因为它不依赖外部气象数据只需要静态地理数据就能运行。这也是我今天这篇重点讲安装WPS和静态地理数据的原因——先把地基打好后面ungrib和metgrid的处理才有意义。1.2 为什么这么多人卡在WPS这一关很多新手下载WRF之后主程序编译挺顺利到了WPS就各种翻车。原因不外乎这么几个WPS版本必须与WRF版本匹配WRF 4.x就配WPS 4.x别混用。WPS编译依赖NetCDF、MPICH、Jasper这些基础库任何一个路径不对就编译失败。静态地理数据体积巨大下载解压占用大量时间而且官网偶尔抽风。geogrid运行时对GEOGRID.TBL和数据目录的对应关系非常敏感路径写错一个字母就报错。换句话说WPS本身不复杂但它处在多个编译依赖 大数据存储 严格配置文件的交汇点上任何一个环节断掉都会让你抓狂。这一篇就是专门来把这些环节一个个接上的。2. 编译WPS前先把依赖库的坑填平2.1 WPS真正依赖的基础库清单安装WPS之前我先劝你把依赖库这件事当成一件正经事对待而不是缺什么再说。因为我见过太多人configure的时候就因为NetCDF路径没配对直接退出也见过有人Jasper用了新版API导致ungrib编译失败。以WPS 4.5为例完整依赖大致是NetCDF-C NetCDF-FortranWPS的I/O层靠它读写NetCDF格式文件。MPICH或OpenMPI并行编译运行需要。zlib、libpng、Jasper主要是ungrib解码GRIB1格式气压、风场时要用。gcc/gfortran基础编译器建议和编译WRF时保持一致。如果你在编译WRF的时候已经装好NetCDF和MPICH那这里基本是复用。检查一下环境变量还在不在echo $NETCDF which mpif90 nc-config --all 2/dev/null | head nf-config --all 2/dev/null | head如果$NETCDF有值mpif90也能找到那说明基础环境还可以。万一全空也别慌我下面会给出推荐的编译顺序。我推荐的库安装目录统一放在一个地方比如$HOME/WRF/Libs下这样后期配置路径一目了然mkdir -p $HOME/WRF/Libs cd $HOME/WRF/Libs wget https://downloads.unidata.ucar.edu/netcdf-c/4.9.2/netcdf-c-4.9.2.tar.gz wget https://downloads.unidata.ucar.edu/netcdf-fortran/4.6.1/netcdf-fortran-4.6.1.tar.gz编译NetCDF-C时注意加上--disable-dap可以省去很多乱七八糟的远程数据访问依赖export NETCDF$HOME/WRF/Libs/netcdf cd $HOME/WRF/Libs tar -zxvf netcdf-c-4.9.2.tar.gz cd netcdf-c-4.9.2 ./configure --prefix$NETCDF --disable-dap --disable-netcdf-4 make -j$(nproc) make install这里我先提个醒NetCDF-C装完要设置环境变量再去编译NetCDF-Fortran否则Fortran接口找不到C库。编译NetCDF-Fortranexport LD_LIBRARY_PATH$NETCDF/lib:$LD_LIBRARY_PATH export CPPFLAGS-I$NETCDF/include export LDFLAGS-L$NETCDF/lib cd $HOME/WRF/Libs tar -zxvf netcdf-fortran-4.6.1.tar.gz cd netcdf-fortran-4.6.1 ./configure --prefix$NETCDF make -j$(nproc) make installMPICH如果还没装也一样处理cd $HOME/WRF/Libs tar -zxvf mpich-4.2.0.tar.gz cd mpich-4.2.0 ./configure --prefix$HOME/WRF/Libs/mpich make -j$(nproc) make install装完后把环境变量整理一下写进~/.bashrcexport NETCDF$HOME/WRF/Libs/netcdf export PATH$NETCDF/bin:$HOME/WRF/Libs/mpich/bin:$PATH export LD_LIBRARY_PATH$NETCDF/lib:$HOME/WRF/Libs/mpich/lib:$LD_LIBRARY_PATH2.2 jasper版本这个隐形的雷光有NetCDF和MPICH还不够ungrib解码GRIB数据需要Jasper。这个库特别有意思新版本API改动很大WPS官方代码还是按照老接口写的用Jasper 2.x或3.x去编译ungrib很可能会出现undefined reference to jasper_init这类链接错误。我自己第一次就踩过这个雷后来老老实实换回Jasper 1.900.1版本才通过。所以别纠结直接下载1.900.1cd $HOME/WRF/Libs wget https://www.ece.uvic.ca/~frodo/jasper/software/jasper-1.900.1.zip unzip jasper-1.900.1.zip cd jasper-1.900.1 export JASPERLIB$HOME/WRF/Libs/jasper-1.900.1/lib export JASPERINC$HOME/WRF/Libs/jasper-1.900.1/include ./configure --prefix$HOME/WRF/Libs/jasper-1.900.1 make -j$(nproc) make install如果你网上下载的Jasper压缩包后缀不一样也别慌解压后都能看到configure脚本关键是版本信息确认无误。装完以后把JASPERLIB和JASPERINC也导出到环境变量里后面配置WPS要用。2.3 环境变量为什么要持久化很多人编译完库新开一个终端窗口就又找不到路径了原因就是环境变量没写进配置文件只是临时在终端里执行了。建议把下面这段加到~/.bashrc末尾然后source ~/.bashrcexport NETCDF$HOME/WRF/Libs/netcdf export JASPERLIB$HOME/WRF/Libs/jasper-1.900.1/lib export JASPERINC$HOME/WRF/Libs/jasper-1.900.1/include export PATH$NETCDF/bin:$HOME/WRF/Libs/mpich/bin:$PATH export LD_LIBRARY_PATH$NETCDF/lib:$HOME/WRF/Libs/mpich/lib:$JASPERLIB:$LD_LIBRARY_PATH检查一下是否生效echo $NETCDF echo $JASPERLIB只要输出不是空就可以进入WPS编译环节了。3. 编译WPSconfigure输出一个有个性文件进去改两处再看日志3.1 下载解压与./configure选项选择WPS的源码包和解压方式跟WRF一样直接去官网下载对应版本。我以WPS 4.5为例cd $HOME/WRF 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接下来运行./configure系统会列出一大堆编译选项类似1. Linux x86_64 gfortran (serial) 2. Linux x86_64 gfortran (dmpar) 3. Linux x86_64 gfortran (smpar) ...这里的选择非常重要。如果在编译WRF时用的是dmpar分布式内存并行WPS也建议选同样的并行方式保持网格划分逻辑一致。我一般选2号也就是Linux x86_64 gfortran (dmpar)。选完后目录下会生成configure.wps。这个文件是WPS编译的命根子后面所有路径、校验宏都在里面。3.2 改configure.wps里的关键路径与编译宏打开configure.wps重点看这几处WRF_DIR /path/to/WRF NETCDF /path/to/netcdf JASPERLIB /path/to/jasper/lib JASPERINC /path/to/jasper/include如果configure自动识别对了那可以直接跳过。但如果像我一样系统里有多个NetCDF或Jasper版本configure很容易写错。我遇到过JASPERLIB写成了别的库路径导致编译ungrib时一直undefined reference to jasper_init。推荐直接手动改成绝对路径别用$HOME变量凑合WRF_DIR /home/username/WRF/WRF NETCDF /home/username/WRF/Libs/netcdf JASPERLIB /home/username/WRF/Libs/jasper-1.900.1/lib JASPERINC /home/username/WRF/Libs/jasper-1.900.1/include另外检查DM_FC和DM_CCDM_FC mpif90 DM_CC mpicc如果系统里mpif90不是默认命令需要改成绝对路径。这一步经常被忽略但恰恰是新手最容易两眼一抹黑的地方。3.3 ./compile的常见报错与排错思路改完配置后开始编译./compile 21 | tee log.compile编译过程会输出大量信息最直接的检测方式是看最后是否生成三个可执行文件ls -la geogrid.exe ungrib.exe metgrid.exe如果缺文件打开log.compile搜索Errorgrep -n Error log.compile | head -20我归纳过几个高频报错以及对应的解决思路ERROR: The NetCDF library is not available说明configure时没有识别到$NETCDF回到configure.wps里检查NETCDF路径然后重新./clean再./compile。undefined reference to jasper_initJasper版本或路径不对确认JASPERLIB、JASPERINC指向1.900.1并清理重编译。cannot find -lnetcdffNetCDF-Fortran没装或者路径没指到带libnetcdff.a的目录。在NetCDF安装目录里执行find . -name *netcdff*确认一下。mpif90: command not foundMPICH路径没导入source ~/.bashrc或直接export MPICH路径。提示改完configure.wps或者换了库后尽量执行./clean -a再重来否则旧的目标文件可能继续带着错误配置参与链接。4. 静态地理数据不是下载解压这么简单4.1 WRF静态地理数据到底在描述什么静态地理数据简单说就是模型用来描述下垫面的资料集。WRF的网格虽然是你自己定义的但每个格点上方的地形高度、土地覆盖类型、土壤类型、植被比例等属性必须从外部数据插值过来。想象一下你的模拟区域中心有一座山如果地形数据是平的那模拟出来的气流根本不可能爬坡结果自然全错。所以静态地理数据直接影响模式初始场的可信度尤其在地形复杂区域重要性不亚于气象场本身。常见静态数据包括地形高度数据如GMTED2010、SRTM土地覆盖数据如MODIS 21类、USGS 24类土壤质地与土壤温度深度数据月平均植被比例城市冠层参数WRF官网会提供一套完整的低精度default数据包覆盖全球作为新手快速跑通流程完全够用。如果你要搞高分辨率区域模拟再单独替换对应的高精度数据即可。4.2 低分辨率还是高分辨率怎么选回到实际安装静态地理数据一般分两种下载方式一是下载Geogrid官方打包好的低分辨率完整包geog_complete.tar.gz二是在WPS官网下载单独的高分辨率数据。我的建议第一次跑通流程直接下载geog_complete.tar.gz解压之后就能满足所有默认类别数据需求。虽然体积几十个GB但省心。高分辨率数据等你有明确研究需求再折腾。磁盘规划方面建议给静态数据预留至少70GB空间。我当初就没意识到这个数据包这么大把压缩包和解压后的数据放同一块小硬盘上最后直接爆盘。df -h du -sh geog_complete.tar.gz mkdir -p /data/WPS_GEOG mv geog_complete.tar.gz /data/WPS_GEOG/ cd /data/WPS_GEOG tar -zxvf geog_complete.tar.gz解压完成后应该看到geog_complete目录下有一堆子目录比如modis_landuse_21class、nephelgy30s、soiltype_bot这些。每个子目录里都有README和index文件这两个文件至关重要。index文件记录了数据的网格信息、投影方式、变量名、插值方法等geogrid在运行时就是靠它来决定怎么读取数据。如果数据目录被改名或移动到别处只要路径没有破坏问题不大但如果把index文件弄丢了geogrid就完全没法识别这些数据。4.3 GEOGRID.TBL的匹配逻辑光有数据还不够geogrid读取静态数据时还要查一张表叫GEOGRID.TBL它在WPS目录下的geogrid/TBL里。这张表规定了每个变量比如地形、土地覆盖对应哪个数据目录、该用什么样的分辨率、插值算法是什么。举个例子名词叫geog_data_res的设置。在namelist.wps里你可以写geog_data_res modis_lulc也可以写geog_data_res default这里的字符串其实和GEOGRID.TBL里的插值分辨率描述是关联的。如果你用了高分辨率MODIS数据需要在GEOGRID.TBL里看到对应条目同时在namelist里声明modis_lulc最终geogrid才会去找那个数据目录。统包geog_complete.tar.gz解压后目录名已经和默认的GEOGRID.TBL对得整整齐齐新手阶段完全不需要动表。最忌讳的事是手动改目录名比如把modis_landuse_21class改成landuse一旦改了就很难对上GEOGRID.TBL里的配置报错会让你怀疑人生。5. 用geogrid.exe做第一次冒烟验证5.1 准备一个能跑起来的namelist.wps静态数据就位后真刀真枪验证的时刻到了。进入WPS目录找到namelist.wps示例文件改成你自己的模拟区域。下面是一个最简单的单层网格配置share wrf_core ARW, max_dom 1, start_date 2024-01-01_00:00:00, end_date 2024-01-01_06:00:00, interval_seconds 21600, io_form_geogrid 2, / geogrid parent_grid_ratio 1, i_parent_start 1, j_parent_start 1, e_we 61, e_sn 61, geog_data_res default, dx 30000, dy 30000, map_proj lambert, ref_lat 35.0, ref_lon 105.0, truelat1 30.0, truelat2 60.0, stand_lon 105.0, / ungrib out_format WPS, prefix FILE, / metgrid fg_name FILE, io_form_metgrid 2, /几个关键项解释一下e_we和e_sn是经向和纬向的格点数不是物理距离。61表示这个方向上有61个格点。dx和dy单位是米这里设了30千米也就是做一版区域模式常用的水平分辨率。ref_lat和ref_lon是模拟区域的中心经纬度truelat1、truelat2是兰伯特投影的两个标准纬度stand_lon是投影中央经线。geog_data_res default表示用默认的低分辨率静态数据。第一次跑通目的就是尽快让geogrid出图所以网格不需要设太大61×61个格点足够验证流程也省时间。5.2 运行geogrid.exe与输出检查配置完成后执行./geogrid.exe 21 | tee log.geogrid如果一切正常最后会生成geo_em.d01.nc文件。此时不要急着高兴先确认几个信息ls -lh geo_em.d01.nc ncdump -h geo_em.d01.nc | head -80ncdump -h能看到NetCDF文件的变量结构重点检查里面包含HGT_M、LU_INDEX、SOILTYP等静态变量。如果这些变量都能正常显示说明geogrid确实把地形和土地覆盖插到网格上了。再抬头看log.geogrid末尾应该有类似Successful completion of geogrid的提示。我见过的失败情形里最高频的是ERROR: Could not open /data/WPS_GEOG/geog_complete/modis_landuse_21class这种一看就是namelist里geog_data_res和数据目录对不上或者静态数据根本没解压到那个路径。解决办法很简单先看GEOGRID.TBL里面对应的路径再核对磁盘目录是否存在。永远优先相信日志别瞎猜。5.3 高分辨率静态数据应该什么时候考虑跑通默认数据不代表万事大吉如果你要做1公里甚至更小尺度的模拟默认地形和土地利用的分辨率可能不够地形细节会被抹平土地覆盖类别也太粗糙。这时候可以单独下载高分辨率数据比如地形用GMTED2010或SRTM3土地利用用MODIS 21class或ESA CCI土壤类型用STATSGO或对应区域的精细土壤数据下载后放到静态数据目录下保持解压结构不被破坏然后在namelist.wps里把geog_data_res设置改成对应名称例如modis_lulc再重新运行geogrid。如果数据下载的是高分辨率版本但GEOGRID.TBL里没有对应插值规则geogrid会忽略它甚至报错。所以每次换数据第一步永远是查表、对目录、跑测试三者缺一不可。我在实际项目里还会用一个小技巧跑geogrid之前先ncdump -h看下已有的geo_em文件里变量范围、最小值最大值如果地形变量HGT_M的范围明显不符合区域实际情况那大概率是数据选错或者插值出问题。比如平坦地区突然出现一片珠穆朗玛峰高度那肯定不对。跑完geogrid.exe只是第一步后面还有ungrib解压气象数据、metgrid做网格插值整体链条才算通。但那是接下来几天的任务这一篇你先确保两个东西万无一失WPS编译生成三个可执行文件geogrid能正常生成geo_em.d01.nc。我个人跑WRF这么多年对WPS环节最大的体会是不要试图一步到位先小网格、默认数据、简单区域跑通再逐步上真实算例。这个流程既检验了环境也帮你建立对模式预处理流程的直观感知。等到你真正跑通第一个WRF逐时模拟再回头看今天装的WPS和静态数据就会发现这其实是整套流程里性价比最高的一道工序——它不产出迷惑性的结果但它保证你后面所有计算都不是在沙滩上盖楼。
返回列表