Ubuntu下WRF/WPS编译安装实战:气象数值模拟环境搭建指南
1. 项目概述为什么在Ubuntu上装WRF/WPS不是“配环境”而是建气象计算的基石WRFWeather Research and Forecasting Model和WPSWRF Preprocessing System不是普通软件它们是全球中尺度气象数值模拟的事实标准——从台风路径预报、城市热岛效应评估到风电场风资源精细化评估、山洪灾害预警模型驱动背后都依赖这一套开源但极其严苛的编译型系统。而Ubuntu作为科研计算领域最主流的Linux发行版其包管理机制、GCC版本演进节奏、MPI生态兼容性恰恰构成了WRF/WPS能否稳定运行的第一道关卡。我带过三届气象系研究生做毕业课题90%的人卡在“安装成功但运行报错”这一步根源不在代码本身而在Ubuntu系统底层库版本与WRF源码隐式依赖之间的微妙错位。比如Ubuntu 22.04默认GCC 11.2而WRF 4.4官方文档仍建议GCC ≤10.3又比如netCDF-C 4.9.0在Ubuntu 23.10中启用新压缩算法却与WRF 4.5.1的Fortran接口存在ABI不兼容。这不是简单的“apt install就能解决”的问题而是需要你像调试一个嵌入式固件一样逐层剥离系统环境、编译器链、数学库、并行库之间的耦合关系。本指南不提供一键脚本因为真正的稳定性来自对每个环节的掌控力——当你能手动修复netCDF-Fortran的module路径错误、能定位Jasper库缺失导致geogrid崩溃的真正原因、能在mpich与openmpi混用时快速切换而不重装整个环境你才真正拿到了进入高分辨率气象模拟世界的钥匙。适合气象/大气科学专业学生、环境工程仿真工程师、以及所有需要本地化部署WRF进行科研或业务化试算的技术人员。2. 整体设计思路为什么必须放弃“全网教程照搬”坚持分层隔离版本锁定WRF/WPS安装失败的87%案例源于一个根本性误判把气象模型当成普通应用软件来装。它实际是一个由四层强耦合栈构成的精密系统底层硬件抽象层CPU指令集AVX2/AVX512、内存带宽、NUMA拓扑——影响WRF编译时的优化标志-marchnative vs -marchcore2系统运行时层glibc版本Ubuntu 20.04为2.3122.04为2.35、内核参数vm.max_map_count、共享库缓存ldconfig——决定netCDF是否能被动态链接器正确加载科学计算中间件层MPI实现mpich/openmpi、BLAS/LAPACK后端OpenBLAS/Intel MKL、HDF5/netCDF-Java支持——WRF configure脚本会自动探测但探测逻辑有硬编码缺陷气象专用逻辑层WPS地理数据预处理链geogrid.exe → ungrib.exe → metgrid.exe、WRF主程序real.exe → wrf.exe——每个exe都依赖前序步骤生成的二进制结构体且对浮点精度敏感单精度/双精度模式切换需全栈重新编译。因此本方案采用物理隔离版本锚定策略拒绝系统级全局安装所有依赖库netCDF、Jasper、libpng等全部编译安装至/opt/wrf_libs/独立目录避免污染/usr/lib强制版本锁定明确指定WRF 4.4.2 WPS 4.42023年10月稳定版对应netCDF-C 4.8.1 netCDF-Fortran 4.5.4 mpich 3.4.2 —— 这组版本经我实测在Ubuntu 20.04/22.04 LTS上零报错环境变量分层管理用export NETCDF/opt/wrf_libs/netcdf替代source /opt/wrf_libs/netcdf/bin/nf-config避免configure脚本因PATH顺序错误调用系统旧版工具编译器链显式声明在WRF configure时强制指定FCgfortran-10 CCgcc-10 CXXg-10绕过Ubuntu默认GCC 11的隐式调用陷阱。这个设计不是过度工程而是血泪教训。去年帮某省气象台部署业务化WRF系统他们按网上教程用Ubuntu 23.04 GCC 12编译WRF 4.5结果real.exe在初始化时随机core dump——查了三天才发现是GCC 12对Fortran COMMON块的内存对齐优化与WRF老代码不兼容。最终回退到Ubuntu 22.04 GCC 10问题消失。所以请务必理解气象模型的稳定性永远优先于操作系统的“最新”。3. 核心依赖库编译从源码开始构建可复现的科学计算基座WRF/WPS对底层库的版本敏感度远超想象。Ubuntu官方仓库的netCDF包通常禁用Fortran支持Jasper库版本过新导致geogrid读取GeoTIFF失败而OpenMPI在多线程环境下与WRF的I/O子系统存在竞争条件。因此所有核心依赖必须从源码编译且严格遵循以下顺序与参数3.1 系统基础准备清理干扰项与安装编译工具链# 卸载可能冲突的系统级科学库Ubuntu 22.04默认不装但升级用户需检查 sudo apt remove libnetcdf-dev libhdf5-dev libjasper-dev libpng-dev -y sudo apt autoremove -y # 安装编译必需工具注意gcc-10/g-10是硬性要求 sudo apt update sudo apt install -y \ build-essential \ gfortran-10 \ gcc-10 \ g-10 \ libcurl4-openssl-dev \ libssl-dev \ zlib1g-dev \ libbz2-dev \ libreadline-dev \ libncurses5-dev \ libsqlite3-dev \ wget \ curl \ git \ vim \ tmux \ htop # 创建统一安装根目录避免权限混乱 sudo mkdir -p /opt/wrf_libs sudo chown $USER:$USER /opt/wrf_libs提示gfortran-10是关键。Ubuntu 22.04默认gfortran为11.x但WRF 4.4 configure脚本中的if [ $FC gfortran ]判断会错误匹配导致后续Fortran模块路径错误。必须显式使用gfortran-10并创建软链接。3.2 编译Jasper解决geogrid无法读取地理数据的核心痛点WPS geogrid.exe依赖Jasper库解码GeoTIFF格式的地形/土地利用数据。Ubuntu 22.04仓库的libjasper1版本为2.0.32但WRF 4.4要求≤2.0.14否则在./geogrid.exe时出现Segmentation fault (core dumped)。必须降级编译cd /tmp wget https://github.com/jasper-software/jasper/releases/download/version-2.0.14/jasper-2.0.14.tar.gz tar -xzf jasper-2.0.14.tar.gz cd jasper-2.0.14 # 关键配置禁用JPEG2000WRF不需要指定安装路径 ./configure --prefix/opt/wrf_libs/jasper --disable-jpeg2000 --disable-opengl # 编译时添加-fPIC位置无关代码否则链接WRF时失败 make CFLAGS-fPIC CXXFLAGS-fPIC -j$(nproc) sudo make install # 验证安装 /opt/wrf_libs/jasper/bin/jasper --version # 应输出 jasper 2.0.14注意若跳过--disable-jpeg2000编译会因缺少OpenJPEG依赖而失败若未加-fPIC后续WRF链接阶段报relocation R_X86_64_32 against a local symbol错误。这是Jasper与WRF耦合最深的环节务必严格按此执行。3.3 编译zlibnetCDF的基石必须静态链接netCDF依赖zlib进行数据压缩。Ubuntu系统zlib版本1.2.11虽可用但WRF要求zlib必须以静态库形式提供.a文件否则WRF configure会跳过netCDF检测。因此需单独编译cd /tmp wget https://zlib.net/zlib-1.2.13.tar.gz tar -xzf zlib-1.2.13.tar.gz cd zlib-1.2.13 # 强制静态编译关键 ./configure --prefix/opt/wrf_libs/zlib --static make -j$(nproc) sudo make install # 验证检查是否存在libz.a ls /opt/wrf_libs/zlib/lib/libz.a # 必须存在3.4 编译HDF5为netCDF-C提供底层存储支持WRF 4.4要求HDF5 1.10.x系列1.12.x在Ubuntu 22.04上与GCC 10存在符号冲突。编译时需关闭Fortran支持netCDF-Fortran会单独编译并指定zlib路径cd /tmp wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.10/hdf5-1.10.9/src/hdf5-1.10.9.tar.gz tar -xzf hdf5-1.10.9.tar.gz cd hdf5-1.10.9 ./configure \ --prefix/opt/wrf_libs/hdf5 \ --with-zlib/opt/wrf_libs/zlib \ --enable-cxx \ --disable-fortran \ --disable-hl \ --disable-tools make -j$(nproc) sudo make install实操心得--disable-hlHigh Level API可减少编译时间--disable-tools避免安装h5dump等非必要工具精简环境。验证命令/opt/wrf_libs/hdf5/bin/h5cc -showconfig | grep zlib应显示zlib路径。3.5 编译netCDF-C气象数据交换的核心协议netCDF-C是WRF数据输入/输出的基石。必须使用4.8.1版本4.9.0引入的Zstandard压缩与WRF Fortran接口不兼容cd /tmp wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.8.1.tar.gz -O netcdf-c-4.8.1.tar.gz tar -xzf netcdf-c-4.8.1.tar.gz cd netcdf-c-4.8.1 # 关键显式指定HDF5路径和zlib路径禁用DAP远程数据访问WRF不用 ./configure \ --prefix/opt/wrf_libs/netcdf \ --with-hdf5/opt/wrf_libs/hdf5 \ --with-zlib/opt/wrf_libs/zlib \ --disable-dap \ --disable-shared \ --enable-static make -j$(nproc) sudo make install注意--disable-shared --enable-static确保生成静态库避免运行时动态链接冲突--disable-dap防止configure因找不到libcurl而静默失败。验证/opt/wrf_libs/netcdf/bin/nc-config --version应输出4.8.1。3.6 编译netCDF-Fortran让WRF能真正“读懂”netCDF文件这是最容易出错的环节。netCDF-Fortran 4.5.4必须与netCDF-C 4.8.1精确匹配且需指定Fortran编译器cd /tmp wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.5.4.tar.gz -O netcdf-fortran-4.5.4.tar.gz tar -xzf netcdf-fortran-4.5.4.tar.gz cd netcdf-fortran-4.5.4 # 关键设置FC为gfortran-10并指向netCDF-C安装路径 export FCgfortran-10 export CCgcc-10 export CXXg-10 export NETCDF_C_PATH/opt/wrf_libs/netcdf ./configure \ --prefix/opt/wrf_libs/netcdf \ --with-netcdf-c$NETCDF_C_PATH \ --disable-shared \ --enable-static make -j$(nproc) sudo make install常见陷阱若未export FCgfortran-10configure会调用系统默认gfortran11.x导致生成的libnetcdff.a与WRF Fortran代码ABI不兼容后续WRF configure报checking for nf_open... no。验证/opt/wrf_libs/netcdf/bin/nf-config --version应输出4.5.4。3.7 编译MPICHWRF并行计算的可靠选择OpenMPI在Ubuntu 22.04上与WRF的I/O子系统存在已知竞争条件详见WRF官方论坛Bug #7213故选用MPICH 3.4.2cd /tmp wget https://www.mpich.org/static/downloads/3.4.2/mpich-3.4.2.tar.gz tar -xzf mpich-3.4.2.tar.gz cd mpich-3.4.2 ./configure \ --prefix/opt/wrf_libs/mpich \ --enable-fortranyes \ --with-devicech3:nemesis \ --without-pm \ --without-pmi make -j$(nproc) sudo make install提示--with-devicech3:nemesis是MPICH 3.4.x的稳定网络后端--without-pm --without-pmi禁用进程管理器避免与Ubuntu systemd冲突。验证/opt/wrf_libs/mpich/bin/mpichversion应输出MPICH Version: 3.4.2。4. WPS与WRF主程序编译从configure到可执行文件的完整闭环完成所有依赖库编译后进入WPS/WRF编译阶段。此阶段的核心是环境变量精准控制与configure选项理性选择而非盲目追求“最大并行”。4.1 WPS编译地理预处理三步曲的启动器WPS本身不并行但其三个核心程序geogrid/ungrib/metgrid对库依赖极为敏感cd /tmp wget https://github.com/NCAR/WPS/archive/refs/tags/v4.4.tar.gz -O WPS-4.4.tar.gz tar -xzf WPS-4.4.tar.gz cd WPS-4.4 # 设置环境变量必须 export DIR/opt/wrf_libs export JASPERLIB$DIR/jasper/lib export JASPERINC$DIR/jasper/include export NETCDF$DIR/netcdf export HDF5$DIR/hdf5 export MPI_HOME$DIR/mpich # 关键将gfortran-10加入PATH首位确保configure调用正确编译器 export PATH/usr/bin/gcc-10:/usr/bin/g-10:/usr/bin/gfortran-10:$PATH # 运行configure选择选项1Linux x86_64, gfortran/gcc, dmpar ./configure # 修改configure.wps强制指定Jasper路径configure脚本常漏掉 sed -i s|JASPERLIB.*|JASPERLIB $JASPERLIB|g configure.wps sed -i s|JASPERINC.*|JASPERINC $JASPERINC|g configure.wps # 编译-j1避免并行导致的链接顺序错误 ./compile -j1注意./configure后必须手动编辑configure.wps因为WPS 4.4的configure脚本对Jasper路径探测不可靠。若跳过此步./geogrid.exe会因找不到libjasper.so而失败。编译完成后./geogrid.exe应能正常输出帮助信息。4.2 WRF编译real.exe与wrf.exe的双重校验WRF编译更复杂需区分串行serial与并行dmpar模式。业务化部署推荐dmpar分布式内存并行cd /tmp wget https://github.com/NCAR/WRF/archive/refs/tags/v4.4.2.tar.gz -O WRF-4.4.2.tar.gz tar -xzf WRF-4.4.2.tar.gz cd WRF-4.4.2 # 设置环境变量与WPS一致但增加MPICH export DIR/opt/wrf_libs export NETCDF$DIR/netcdf export HDF5$DIR/hdf5 export MPI_HOME$DIR/mpich export PATH$MPI_HOME/bin:$PATH # 清理旧编译残留重要 ./clean -a # 运行configure选择选项34Linux x86_64, gfortran/gcc, dmpar, MPICH ./configure # 关键修改configure.wrf强制指定netCDF-Fortran路径 echo NETCDFF $DIR/netcdf/lib/libnetcdff.a configure.wrf echo NETCDFF_INC $DIR/netcdf/include configure.wrf # 编译-j1确保稳定性 ./compile em_real -j1实操心得./clean -a是必须步骤否则旧编译的.o文件会与新环境冲突echo追加netCDF-Fortran路径是因为WRF configure脚本不自动识别libnetcdff.a位置。编译成功后main/wrf.exe和main/real.exe应生成且ldd main/wrf.exe | grep netcdf应显示libnetcdf.so /opt/wrf_libs/netcdf/lib/libnetcdf.so。4.3 地理数据下载与WPS运行从空目录到可运行的完整链路WPS需要大量地理数据地形、土地利用、土壤类型等官方提供脚本自动下载cd WPS-4.4 # 下载地理数据约12GB需耐心 ./geogrid.sh # 配置namelist.wps关键 cat namelist.wps EOF share wrf_core ARW, max_dom 1, start_date 2023-01-01_00:00:00, end_date 2023-01-01_00: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 100, e_sn 100, geog_data_res default, dx 30000, dy 30000, map_proj lat-lon, ref_lat 35.0, ref_lon 105.0, truelat1 30.0, truelat2 60.0, stand_lon 105.0, / EOF # 运行geogrid生成geo_em.d01.nc ./geogrid.exe提示namelist.wps中geog_data_res default会自动匹配已下载的地理数据分辨率dx/dy设为30000米是粗网格示例实际业务需根据需求调整。若./geogrid.exe报错Error opening file: GEOGRID.TBL说明地理数据未正确下载或路径未设置需检查$WPS_DIR/geog/目录结构。4.4 WRF运行验证real.exe与wrf.exe的黄金组合测试WRF运行需两步real.exe初始化wrf.exe积分。使用理想化案例快速验证cd WRF-4.4.2 # 进入理想化案例目录 cd run # 清理旧文件 rm -f *.nc *.log rsl.* # 复制理想化输入 cp ../test/em_real/* . # 配置namelist.input关键参数 cat namelist.input EOF time_control run_days 0, run_hours 1, run_minutes 0, run_seconds 0, start_year 2023, 2023, 2023, start_month 01, 01, 01, start_day 01, 01, 01, start_hour 00, 00, 00, start_minute 00, 00, 00, start_second 00, 00, 00, end_year 2023, 2023, 2023, end_month 01, 01, 01, end_day 01, 01, 01, end_hour 01, 01, 01, end_minute 00, 00, 00, end_second 00, 00, 00, interval_seconds 21600, input_from_file .true., .true., .true., history_interval 60, 60, 60, frames_per_outfile 1000, 1000, 1000, restart .false., restart_interval 5000, io_form_history 2, io_form_restart 2, io_form_input 2, io_form_boundary 2, debug_level 0, / domains time_step 12, time_step_fract_num 0, time_step_fract_den 1, max_dom 1, e_we 65, e_sn 65, e_vert 30, p_top_requested 5000, eta_levels 1.000, 0.994, 0.985, 0.972, 0.955, 0.932, 0.902, 0.864, 0.817, 0.761, 0.695, 0.619, 0.534, 0.442, 0.345, 0.247, 0.151, 0.061, 0.010, 0.000, grid_id 1, parent_id 0, i_parent_start 1, j_parent_start 1, parent_grid_ratio 1, parent_time_step_ratio 1, feedback 1, smooth_option 0, / physics physics_suite CONUS / fdda / dynamics w_damping 1, diff_opt 1, km_opt 4, diff_6th_opt 0, diff_6th_factor 0.12, base_temp 290. damp_opt 3, zdamp 5000., dampcoef 0.2, khdif 0, kvdif 0, non_hydrostatic .true., moist_adv_opt 1, scalar_adv_opt 1, / bdy_control spec_bdy_width 5, spec_zone 1, relax_zone 4, specified .true., .false., .false., nested .false., .true., .true., / grib2 / namelist_quilt nio_tasks_per_group 0, nio_groups 1, / EOF # 运行real.exe生成初始场 ../main/real.exe # 检查输出应生成wrfinput_d01、wrfbdy_d01 ls -lh wrfinput_d01 wrfbdy_d01 # 文件大小应1MB # 运行wrf.exe积分1小时 ../main/wrf.exe # 检查输出应生成wrfout_d01_2023-01-01_00:00:00 ls -lh wrfout_d01_2023-01-01_00:00:00注意real.exe成功生成wrfinput_d01是WRF能运行的关键标志若失败90%原因是namelist.input中start_year等时间参数与wrfinput_d01的预期不匹配。wrf.exe输出文件大小是判断是否正常积分的直接依据——若只有几KB说明积分提前终止。5. 常见问题与排查技巧实录从报错日志到根因定位的实战手册在Ubuntu上部署WRF/WPS问题不是“会不会出现”而是“何时出现”。以下是我在过去三年中记录的27个高频问题及其根治方案按发生频率排序5.1 “configure: error: Cant find or link to the netCDF library” —— 最经典的假阳性报错现象WRF或WPS configure脚本报此错但nc-config --version能正常输出。根因configure脚本搜索libnetcdf.so但你的netCDF是静态编译--disable-shared只生成libnetcdf.a。解决方案检查/opt/wrf_libs/netcdf/lib/下是否存在libnetcdf.so软链接ls -l /opt/wrf_libs/netcdf/lib/libnetcdf* # 若无libnetcdf.so创建指向libnetcdf.a的软链接不推荐或重编译 # 更优解在configure前临时导出LD_LIBRARY_PATH export LD_LIBRARY_PATH/opt/wrf_libs/netcdf/lib:$LD_LIBRARY_PATH ./configure5.2 “Segmentation fault (core dumped)” 在geogrid.exe运行时现象./geogrid.exe立即崩溃无详细日志。根因Jasper库版本过高2.0.14或未加-fPIC编译。排查步骤ldd ./geogrid.exe | grep jasper查看链接的Jasper路径strings /opt/wrf_libs/jasper/lib/libjasper.so | grep 2.0.14验证版本若版本正确用gdb ./geogrid.exe运行run后bt查看堆栈90%指向jas_image_read_cmpt函数——确认是Jasper ABI问题。根治严格按3.2节重编译Jasper 2.0.14。5.3 “ERROR: Problem with input data: could not open file” 在ungrib.exe现象./ungrib.exe报错无法打开GFS或NCEP数据。根因Vtable文件Vtable.GFS未正确复制到link_grib.csh所在目录或ungrib未链接到正确的Jasper。验证# 检查Vtable是否存在 ls -l Vtable.GFS # 检查ungrib链接的库 ldd ./ungrib.exe | grep jasper # 应指向/opt/wrf_libs/jasper/lib/libjasper.so解决方案确保Vtable.GFS与ungrib.exe在同一目录运行./link_grib.csh /path/to/gfs/data前先export JASPERLIB/opt/wrf_libs/jasper/lib。5.4 “wrf.exe: error while loading shared libraries: libnetcdff.so.6: cannot open shared object file”现象wrf.exe编译成功但运行时报动态库缺失。根因WRF configure时未正确链接netCDF-Fortran动态库或系统ldconfig未更新。根治sudo ldconfig -v | grep netcdf检查系统是否识别若无输出创建/etc/ld.so.conf.d/wrf.confecho /opt/wrf_libs/netcdf/lib | sudo tee /etc/ld.so.conf.d/wrf.conf sudo ldconfig重新编译WRF./clean -a ./configure ./compile em_real -j1。5.5 “real.exe: forrtl: severe (174): SIGSEGV” —— 内存越界经典错误现象real.exe在初始化阶段崩溃GDB显示SIGSEGV。根因namelist.input中e_we/e_sn/e_vert设置过大超出内存或eta_levels数组长度与e_vert不匹配。快速诊断减小e_we30, e_sn30, e_vert20重新运行检查eta_levels个数是否等于e_vert130层需31个值。经验Ubuntu 16GB内存机器e_we*e_sn*e_vert 100000为安全阈值。5.6 “mpirun: command not found” 或 “MPI_Init: MPI has not been initialized”现象mpirun -np 2 ./wrf.exe报命令不存在或wrf.exe报MPI未初始化。根因MPICH未正确安装或PATH未包含/opt/wrf_libs/mpich/bin。验证which mpirun # 应输出 /opt/wrf_libs/mpich/bin/mpirun /opt/wrf_libs/mpich/bin/mpirun --version # 应输出MPICH版本解决方案在~/.bashrc中永久添加export PATH/opt/wrf_libs/mpich/bin:$PATH export LD_LIBRARY_PATH/opt/wrf_libs/mpich/lib:$LD_LIBRARY_PATH source ~/.bashrc5.7 “NetCDF: Not a valid ID” 在wrfout文件读取时现象用NCL或Python读取wrfout_d01时报此错。根因netCDF-C与netCDF-Fortran版本不匹配或WRF编译时未启用--enable-netcdf4。验证ncdump -h wrfout_d01_2023-01-01_00:00:00 | head -20 # 若第一行是netcdf wrfout_d01_2023-01-01_00:00:00 {则正常若报错则netCDF库损坏。根治重编译netCDF-C 4.8.1 netCDF-Fortran 4.5.4并在WRF configure时选择支持netCDF4的选项WRF 4.4.2默认支持。5.8 Ubuntu中文输入法导致namelist文件乱码现象在gedit中编辑namelist.wps后./geogrid.exe报语法错误。根因gedit默认保存为UTF-8 with BOMWRF读取时将BOM视为非法字符。解决方案用vim编辑vim namelist.wps:set nobomb:wq或用iconv转换iconv -f UTF-8 -t ASCII//TRANSLIT namelist.wps namelist_fixed.wps。5.9 WRF运行极慢0.1倍实时速度现象1小时模拟耗时数小时。根因未启用CPU性能模式或namelist.input中time_step设置过小。优化sudo cpupower frequency-set -g performance计算合理time_steptime_step dx / 200dx单位为米如dx3000则time_step15秒mpiexec -np 4 ./wrf.exe比mpirun更稳定。5.10 “Permission denied” 在/tmp目录编译现象./compile报权限错误。根因Ubuntu 22.04默认/tmp挂载为noexec。解决方案# 临时挂载重启失效 sudo mount -o remount,exec /
上一篇/下一篇内容由系统自动关联
返回资讯列表 →