在Ubuntu 22.04上用WRF v4.5做一次区域天气模拟:完整流程与关键脚本分享
2026/5/30 22:23:06 网站建设 项目流程

在Ubuntu 22.04上用WRF v4.5做一次区域天气模拟:完整流程与关键脚本分享

当气象研究人员需要高分辨率区域天气模拟时,WRF(Weather Research and Forecasting)模型往往是首选工具。本文将详细介绍在Ubuntu 22.04系统上使用WRF v4.5版本进行区域天气模拟的完整流程,特别关注自动化脚本的实现和关键配置技巧。

1. 环境准备与依赖安装

在开始WRF模拟之前,确保系统环境配置正确至关重要。Ubuntu 22.04提供了稳定的基础,但还需要安装一系列科学计算依赖库。

首先更新系统并安装基础编译工具:

sudo apt update && sudo apt upgrade -y sudo apt install -y build-essential gfortran m4 csh make

接下来安装必要的科学计算库:

sudo apt install -y libjasper-dev libpng-dev libnetcdf-dev \ libhdf5-dev libopenmpi-dev libcurl4-openssl-dev

注意:WRF对编译器版本较为敏感,建议使用gfortran 9或10版本,Ubuntu 22.04默认提供的版本通常可以满足要求。

为WRF创建专用工作目录:

mkdir -p ~/WRF_Build/{WPS,WRF,DATA,ARWpost} export WRF_DIR=~/WRF_Build

2. WRF模型与WPS的编译安装

2.1 下载源代码

获取WRF v4.5和对应版本的WPS(WRF Preprocessing System):

cd $WRF_DIR/WRF wget https://github.com/wrf-model/WRF/archive/v4.5.tar.gz tar -xzf v4.5.tar.gz && mv WRF-4.5 WRF cd $WRF_DIR/WPS wget https://github.com/wrf-model/WPS/archive/v4.5.tar.gz tar -xzf v4.5.tar.gz && mv WPS-4.5 WPS

2.2 编译WRF模型

配置编译环境:

cd $WRF_DIR/WRF export NETCDF=/usr ./configure

选择34(GNU/gfortran)作为编译器选项,1(basic)作为嵌套选项。然后执行:

./compile em_real >& compile.log

检查是否生成主要可执行文件:

ls -l main/*.exe

2.3 编译WPS系统

cd $WRF_DIR/WPS ./clean export WRF_DIR=$WRF_DIR/WRF ./configure

同样选择GNU/gfortran编译器选项,然后:

./compile >& compile_wps.log

验证关键程序是否生成:

ls -l *.exe

3. 自动化数据处理流程

3.1 动态生成namelist文件

创建自动化脚本generate_namelist.sh,根据输入参数动态生成namelist.wps和namelist.input:

#!/bin/bash # 参数检查 if [ $# -ne 6 ]; then echo "用法: $0 开始年份 开始月份 开始日 开始小时 运行小时数 嵌套层数" exit 1 fi # 解析参数 START_YEAR=$1 START_MONTH=$2 START_DAY=$3 START_HOUR=$4 RUN_HOURS=$5 MAX_DOM=$6 # 计算结束时间 END_DATE=$(date -d "${START_YEAR}-${START_MONTH}-${START_DAY} ${START_HOUR}:00:00 UTC + ${RUN_HOURS} hours" +'%Y-%m-%d_%H:%M:%S') # 生成namelist.wps cat > namelist.wps << EOF &share wrf_core = 'ARW', max_dom = ${MAX_DOM}, start_date = '${START_YEAR}-${START_MONTH}-${START_DAY}_${START_HOUR}:00:00', end_date = '${END_DATE}', interval_seconds = 10800 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 = 'lambert', ref_lat = 35.0, ref_lon = -95.0, truelat1 = 30.0, truelat2 = 60.0, stand_lon = -95.0, geog_data_path = '/path/to/geog_data/' / &ungrib out_format = 'WPS', prefix = 'FILE', / &metgrid fg_name = 'FILE', io_form_metgrid = 2, / EOF # 生成namelist.input (简化版) cat > namelist.input << EOF &time_control run_days = 0, run_hours = ${RUN_HOURS}, start_year = ${START_YEAR}, start_month = ${START_MONTH}, start_day = ${START_DAY}, start_hour = ${START_HOUR}, end_year = $(date -d "${END_DATE}" +'%Y'), end_month = $(date -d "${END_DATE}" +'%m'), end_day = $(date -d "${END_DATE}" +'%d'), end_hour = $(date -d "${END_DATE}" +'%H'), interval_seconds = 10800, input_from_file = .true., history_interval = 60, frames_per_outfile = 1000, restart = .false., io_form_history = 2 io_form_restart = 2 io_form_input = 2 io_form_boundary= 2 / &domains time_step = 180, time_step_fract_num = 0, time_step_fract_den = 1, max_dom = ${MAX_DOM}, e_we = 100, e_sn = 100, e_vert = 33, p_top_requested = 5000, num_metgrid_levels= 34, dx = 30000, dy = 30000, grid_id = 1, parent_id = 1, parent_grid_ratio = 1, i_parent_start = 1, j_parent_start = 1, / &physics physics_suite = 'CONUS' mp_physics = 8, cu_physics = 5, ra_lw_physics = 4, ra_sw_physics = 4, bl_pbl_physics = 5, sf_sfclay_physics = 5, sf_surface_physics = 2, radt = 30, bldt = 0, cudt = 5, / &dynamics hybrid_opt = 2, w_damping = 0, diff_opt = 1, km_opt = 4, / &fdda / &bdy_control spec_bdy_width = 5, specified = .true. / EOF

3.2 数据预处理自动化脚本

创建run_wps_automated.sh脚本自动处理GRIB格式的输入数据:

#!/bin/bash # 检查参数 if [ $# -ne 1 ]; then echo "用法: $0 GRIB数据目录" exit 1 fi DATA_DIR=$1 WPS_DIR=$WRF_DIR/WPS # 清理旧文件 cd $WPS_DIR ./clean # 链接GRIB数据 ./link_grib.csh $DATA_DIR/*.grb2 # 链接变量表 ln -sf ungrib/Variable_Tables/Vtable.GFS Vtable # 运行ungrib ./ungrib.exe > ungrib.log 2>&1 # 检查是否成功 if [ $? -ne 0 ]; then echo "ungrib.exe 运行失败,请检查ungrib.log" exit 1 fi # 运行geogrid ./geogrid.exe > geogrid.log 2>&1 # 运行metgrid ./metgrid.exe > metgrid.log 2>&1 # 检查输出文件 ls -lh met_em*

4. WRF模型运行与后处理

4.1 并行运行WRF模型

创建run_wrf_parallel.sh脚本优化WRF运行:

#!/bin/bash # 检查参数 if [ $# -ne 2 ]; then echo "用法: $0 核数 运行目录" exit 1 fi NP=$1 RUN_DIR=$2 cd $RUN_DIR # 清理旧运行 rm -f wrfbdy* wrfinput* wrfout* rsl.* # 链接met文件 ln -sf $WRF_DIR/WPS/met_em* . # 运行real.exe mpirun -np $NP ./real.exe > real.log 2>&1 # 检查边界和输入文件 if [ ! -f wrfbdy_d01 ] || [ ! -f wrfinput_d01 ]; then echo "real.exe 未能生成必要文件" exit 1 fi # 运行wrf.exe mpirun -np $NP ./wrf.exe > wrf.log 2>&1 # 检查输出 ls -lh wrfout*

4.2 结果后处理与可视化

使用NCL(NCAR Command Language)创建自动化绘图脚本plot_wrf_results.ncl

load "$NCARG_ROOT/lib/ncarg/nclscripts/csm/gsn_code.ncl" load "$NCARG_ROOT/lib/ncarg/nclscripts/wrf/WRFUserARW.ncl" begin ; 打开WRF输出文件 a = addfile("wrfout_d01_0001-01-01_00:00:00.nc","r") ; 获取变量 times = wrf_user_getvar(a,"times",-1) tc = wrf_user_getvar(a,"tc",-1) ; 温度(摄氏度) rh = wrf_user_getvar(a,"rh",-1) ; 相对湿度(%) slp = wrf_user_getvar(a,"slp",-1) ; 海平面气压(hPa) ; 创建图形 wks = gsn_open_wks("png","wrf_output") ; 设置绘图选项 opts = True opts@MainTitle = "WRF 模拟结果" opts@InitTime = True opts@ValidTime = True ; 绘制温度场 contour_tc = wrf_contour(a,wks,tc(0,:,:),opts) draw(contour_tc) frame(wks) ; 绘制相对湿度场 opts@FieldTitle = "相对湿度 (%)" contour_rh = wrf_contour(a,wks,rh(0,:,:),opts) draw(contour_rh) frame(wks) ; 绘制海平面气压场 opts@FieldTitle = "海平面气压 (hPa)" contour_slp = wrf_contour(a,wks,slp(0,:,:),opts) draw(contour_slp) frame(wks) end

5. 常见问题排查与性能优化

5.1 常见错误与解决方案

错误现象可能原因解决方案
ungrib.exe失败GRIB数据格式不匹配检查Vtable选择是否正确
geogrid.exe失败地理数据路径错误确认namelist.wps中的geog_data_path
real.exe段错误namelist.input配置错误检查时间步长和网格设置
wrf.exe运行缓慢未使用并行计算增加MPI进程数
输出文件缺失磁盘空间不足清理空间或更改输出目录

5.2 性能优化技巧

  1. 并行计算配置

    • 根据CPU核心数设置合适的MPI进程数
    • 在namelist.input中调整numtiles参数匹配CPU架构
  2. I/O优化

    # 在namelist.input中添加 &namelist_quilt nio_tasks_per_group = 4, nio_groups = 2, /
  3. 内存管理

    • 对于大区域模拟,增加e_vert层数时需注意内存消耗
    • 使用d01等小区域测试配置后再进行正式运行
  4. 编译优化

    • 重新配置WRF时选择34. (dmpar)选项
    • 在configure.wrf中启用优化标志:
      FCOPTIM = -O3 -ftree-vectorize -funroll-loops

在实际项目中,我发现最耗时的步骤通常是metgrid和wrf.exe的运行。通过将GRIB数据预处理为更小的时间片段,可以显著减少metgrid的运行时间。另外,使用SSD存储而非传统硬盘也能带来明显的性能提升。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询