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

在Ubuntu 22.04上用WRF v4.5做一次区域天气模拟:完整流程与关键脚本分享 在Ubuntu 22.04上用WRF v4.5做一次区域天气模拟完整流程与关键脚本分享当气象研究人员需要高分辨率区域天气模拟时WRFWeather 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_Build2. WRF模型与WPS的编译安装2.1 下载源代码获取WRF v4.5和对应版本的WPSWRF Preprocessing Systemcd $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 WPS2.2 编译WRF模型配置编译环境cd $WRF_DIR/WRF export NETCDF/usr ./configure选择34GNU/gfortran作为编译器选项1basic作为嵌套选项。然后执行./compile em_real compile.log检查是否生成主要可执行文件ls -l main/*.exe2.3 编译WPS系统cd $WRF_DIR/WPS ./clean export WRF_DIR$WRF_DIR/WRF ./configure同样选择GNU/gfortran编译器选项然后./compile compile_wps.log验证关键程序是否生成ls -l *.exe3. 自动化数据处理流程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. / EOF3.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 21 # 检查是否成功 if [ $? -ne 0 ]; then echo ungrib.exe 运行失败请检查ungrib.log exit 1 fi # 运行geogrid ./geogrid.exe geogrid.log 21 # 运行metgrid ./metgrid.exe metgrid.log 21 # 检查输出文件 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 21 # 检查边界和输入文件 if [ ! -f wrfbdy_d01 ] || [ ! -f wrfinput_d01 ]; then echo real.exe 未能生成必要文件 exit 1 fi # 运行wrf.exe mpirun -np $NP ./wrf.exe wrf.log 21 # 检查输出 ls -lh wrfout*4.2 结果后处理与可视化使用NCLNCAR Command Language创建自动化绘图脚本plot_wrf_results.nclload $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 optsMainTitle WRF 模拟结果 optsInitTime True optsValidTime True ; 绘制温度场 contour_tc wrf_contour(a,wks,tc(0,:,:),opts) draw(contour_tc) frame(wks) ; 绘制相对湿度场 optsFieldTitle 相对湿度 (%) contour_rh wrf_contour(a,wks,rh(0,:,:),opts) draw(contour_rh) frame(wks) ; 绘制海平面气压场 optsFieldTitle 海平面气压 (hPa) contour_slp wrf_contour(a,wks,slp(0,:,:),opts) draw(contour_slp) frame(wks) end5. 常见问题排查与性能优化5.1 常见错误与解决方案错误现象可能原因解决方案ungrib.exe失败GRIB数据格式不匹配检查Vtable选择是否正确geogrid.exe失败地理数据路径错误确认namelist.wps中的geog_data_pathreal.exe段错误namelist.input配置错误检查时间步长和网格设置wrf.exe运行缓慢未使用并行计算增加MPI进程数输出文件缺失磁盘空间不足清理空间或更改输出目录5.2 性能优化技巧并行计算配置根据CPU核心数设置合适的MPI进程数在namelist.input中调整numtiles参数匹配CPU架构I/O优化# 在namelist.input中添加 namelist_quilt nio_tasks_per_group 4, nio_groups 2, /内存管理对于大区域模拟增加e_vert层数时需注意内存消耗使用d01等小区域测试配置后再进行正式运行编译优化重新配置WRF时选择34. (dmpar)选项在configure.wrf中启用优化标志FCOPTIM -O3 -ftree-vectorize -funroll-loops在实际项目中我发现最耗时的步骤通常是metgrid和wrf.exe的运行。通过将GRIB数据预处理为更小的时间片段可以显著减少metgrid的运行时间。另外使用SSD存储而非传统硬盘也能带来明显的性能提升。