如果你是一名大气环境、气象或相关领域的研究者、工程师,当你需要模拟一个区域内污染物如何随气象条件扩散、转化时,你可能会立刻想到一个名字:WRF-Chem。然而,从“知道这个名字”到“真正在自己的服务器上跑通一个模拟案例”,这中间的距离,可能比想象中要远得多。
这不是一个简单的“安装-运行”软件。它是一套复杂的在线耦合模式系统,意味着气象过程和化学过程在每一个计算步长内都实时交互。你面临的挑战是环环相扣的:需要一个稳定可靠的Linux环境,需要处理数十个相互依赖的库和编译器,需要理解如何从源代码编译这个庞大的模式,需要准备描述污染源排放的复杂数据,最后才能让模式真正转起来并得到有意义的输出。任何一个环节的疏漏,都可能导致数天甚至数周的调试。
本文的目的,就是为你系统性地拆解这个“全流程”。我们不只告诉你每一步“是什么”,更会解释“为什么这一步不可或缺”以及“最容易在哪里踩坑”。我们将从WRF-Chem的核心设计思想讲起,一步步带你完成从零开始的Linux环境配置、依赖库安装、模式编译、排放源数据制作,直到最终运行一个简单的案例。文章将提供详细的命令、配置文件示例和排错思路,目标是让你在阅读和实践后,能够独立搭建起自己的WRF-Chem模拟环境,并理解其背后的技术逻辑。
1. WRF-Chem:为什么它既是利器也是门槛?
在深入技术细节之前,我们必须先理解WRF-Chem的核心价值与独特挑战。传统的大气污染模拟往往采用“离线”方式:先用气象模式(如WRF)模拟出风、温、湿、压等场,再将结果输入到另一个化学传输模式(如CMAQ)中计算污染物浓度。这种方式效率高,但存在根本缺陷——它假设污染物不会反过来影响气象。实际上,气溶胶可以通过散射和吸收太阳辐射影响温度(辐射效应),也能作为云凝结核改变云和降水(云微物理效应),这些效应又会进一步改变风场和湍流,从而影响污染物自身的扩散。
WRF-Chem的“在线耦合”正是为了解决这个问题。它将WRF的气象模块与一套完整的大气化学机制(包括气相化学、气溶胶、排放、干湿沉降等)紧密集成在同一个框架内,共享相同的网格、物理参数化和时间步长。这使得模拟气溶胶-云-辐射-气象的双向反馈成为可能,对于研究雾霾形成机制、沙尘暴气候效应、生物源排放影响等前沿科学问题至关重要。
然而,这种强大能力也带来了极高的技术门槛:
- 系统复杂性 :它不是一个可执行文件,而是一个需要从源码编译的庞大系统,依赖NetCDF、HDF5、MPI等数十个科学计算库。
- 环境依赖性 :它主要在Linux/Unix系统上运行,对编译器(如GCC, Intel)和并行环境(如OpenMPI, MPICH)有特定要求。
- 数据驱动 :模拟的准确性极度依赖于输入的排放源清单、化学机理、初始边界条件等数据的质量。
- 学习曲线陡峭 :用户需要同时理解气象模式配置、化学选项、数据预处理工具(如WPS, anthro_emis)和后期分析方法。
因此,掌握WRF-Chem不仅意味着学会使用一个工具,更是构建一套涵盖系统管理、科学编译、数据工程和领域知识的综合能力。下面的章节,我们将把这座高山分解为可攀爬的阶梯。
2. 基础概念与核心原理:理解“在线耦合”
在动手之前,厘清几个关键概念,能让你在后续配置时知其所以然。
2.1 WRF 与 WRF-Chem 的关系
你可以把WRF看作一个功能强大的“地球系统模拟引擎”基础版,它主要计算大气动力学和物理学。WRF-Chem则是在这个引擎上,加装了一套精密的“大气化学反应与传输模块”。它们共用核心的动力框架、网格系统、并行计算结构和物理参数化方案(如边界层、微物理过程)。化学模块在每个物理时间步长内被调用,计算数百种化学物质的反应和输送。
2.2 核心组件与工作流
一次完整的WRF-Chem模拟,通常涉及三个主要组件和一个数据准备流程:
- WPS (WRF Preprocessing System) : 前处理 。负责将全球再分析资料(如GFS, ERA5)插值到WRF模式定义的自定义区域网格上,生成WRF模式可读的初始条件和边界条件文件。它不直接处理化学数据。
- WRF-Chem 主模式 : 核心模拟器 。这是编译后的可执行程序,读取WPS的输出和排放源数据,在指定的区域内,结合选定的物理和化学方案,进行数值积分运算。
-
排放源处理工具
:
化学数据准备
。这是一个独立但至关重要的环节。WRF-Chem需要时空分辨率的排放通量数据。通常使用官方提供的预处理程序(如
anthro_emis,fire_emis,bio_emiss等),将原始的排放清单(如MEIC, EDGAR)或模型(如MEGAN)输出,处理成模式可识别的NetCDF格式。 - 后处理与可视化 :使用NCL、Python(xarray, cartopy)、GrADS等工具对输出的NetCDF文件进行分析和绘图。
2.3 化学机制与气溶胶方案选择
这是配置中的关键决策点,直接影响模拟结果的科学性和计算成本。
-
化学机制
:定义了模拟哪些气相化学反应。常见的有:
-
RADM2、RACM:适用于区域尺度,物种数适中。 -
MOZART:适用于全球或半球尺度,更复杂。 -
SAPRC99、CB05:常用于空气质量研究。
-
-
气溶胶方案
:定义了气溶胶(如硫酸盐、硝酸盐、有机碳、黑碳、沙尘、海盐)的模拟方式。主流方案是
MADE/SORGAM和更先进的MOSAIC。MOSAIC方案将气溶胶按粒径分档,能更真实地模拟其微物理和光学特性。
你的研究目标将决定选择哪种组合。例如,研究中国东部雾霾,可能选择
RACM/MADE/SORGAM
机制;研究气溶胶辐射效应,则可能需用
RACM/MOSAIC
。
3. 环境准备:构建稳定的Linux计算平台
WRF-Chem几乎只在Linux环境下运行。我们将在一个全新的Linux系统(以Ubuntu 20.04 LTS为例)上,从零开始配置所有依赖。 请确保你拥有系统的root权限或sudo权限。
3.1 操作系统与基础开发环境
首先,更新系统并安装编译所需的基础工具链。
# 更新软件包列表
sudo apt update
sudo apt upgrade -y
# 安装编译工具、库管理工具和必要的软件
sudo apt install -y build-essential gfortran csh m4 curl wget git \
libcurl4-openssl-dev libssl-dev cmake \
tcsh flex bison perl libperl-dev \
zip unzip zlib1g-dev
build-essential
包含了GCC, G++, make等核心编译工具。
gfortran
是Fortran编译器,WRF核心代码由Fortran编写。
csh/tcsh
是某些脚本需要的shell环境。
3.2 关键依赖库的安装
WRF-Chem严重依赖以下几个科学数据格式和并行计算库。我们将采用手动编译安装,以确保版本兼容性和最佳性能。
(1) 创建统一的安装目录
建议将所有库安装在同一个目录下,便于管理。我们使用
/opt/wrf_libs
。
sudo mkdir -p /opt/wrf_libs
sudo chown $USER:$USER /opt/wrf_libs
export DIR=/opt/wrf_libs
cd $DIR
(2) 安装 zlib (数据压缩)
wget https://zlib.net/zlib-1.2.13.tar.gz
tar -xzvf zlib-1.2.13.tar.gz
cd zlib-1.2.13
./configure --prefix=$DIR/grib2
make
make install
cd ..
(3) 安装 libpng (图像库)
wget https://download.sourceforge.net/libpng/libpng-1.6.39.tar.gz
tar -xzvf libpng-1.6.39.tar.gz
cd libpng-1.6.39
./configure --prefix=$DIR/grib2
make
make install
cd ..
(4) 安装 Jasper (GRIB2数据解码)
wget https://www.ece.uvic.ca/~frodo/jasper/software/jasper-2.0.14.tar.gz
tar -xzvf jasper-2.0.14.tar.gz
cd jasper-2.0.14
./configure --prefix=$DIR/grib2
make
make install
cd ..
(5) 安装 HDF5 (层次数据格式)
wget https://support.hdfgroup.org/ftp/HDF5/releases/hdf5-1.12/hdf5-1.12.2/src/hdf5-1.12.2.tar.gz
tar -xzvf hdf5-1.12.2.tar.gz
cd hdf5-1.12.2
./configure --prefix=$DIR --enable-fortran --enable-hl --enable-parallel
make -j 4 # 使用4个核心并行编译,根据你的CPU调整
make install
cd ..
(6) 安装 NetCDF-C 和 NetCDF-Fortran (最重要的数据I/O库) NetCDF必须分开安装C和Fortran接口。
# 安装 NetCDF-C
wget https://github.com/Unidata/netcdf-c/archive/refs/tags/v4.9.0.tar.gz -O netcdf-c-4.9.0.tar.gz
tar -xzvf netcdf-c-4.9.0.tar.gz
cd netcdf-c-4.9.0
CPPFLAGS=-I$DIR/include LDFLAGS=-L$DIR/lib ./configure --prefix=$DIR --disable-dap
make -j 4
make install
cd ..
# 安装 NetCDF-Fortran
wget https://github.com/Unidata/netcdf-fortran/archive/refs/tags/v4.6.0.tar.gz -O netcdf-fortran-4.6.0.tar.gz
tar -xzvf netcdf-fortran-4.6.0.tar.gz
cd netcdf-fortran-4.6.0
LD_LIBRARY_PATH=$DIR/lib:$LD_LIBRARY_PATH CPPFLAGS=-I$DIR/include LDFLAGS=-L$DIR/lib ./configure --prefix=$DIR
make -j 4
make install
cd ..
(7) 安装 MPI (并行计算支持,可选但推荐) WRF-Chem支持MPI并行以加速计算。这里安装OpenMPI。
wget https://download.open-mpi.org/release/open-mpi/v4.1/openmpi-4.1.5.tar.gz
tar -xzvf openmpi-4.1.5.tar.gz
cd openmpi-4.1.5
./configure --prefix=$DIR
make -j 4
make install
cd ..
3.3 配置环境变量
将上述库的路径添加到系统的环境变量中,使编译器和链接器能够找到它们。将以下内容添加到你的
~/.bashrc
文件末尾。
# WRF-Chem 依赖库环境变量
export DIR=/opt/wrf_libs
export PATH=$DIR/bin:$PATH
export LD_LIBRARY_PATH=$DIR/lib:$LD_LIBRARY_PATH
export CPPFLAGS="-I$DIR/include"
export LDFLAGS="-L$DIR/lib"
export NETCDF=$DIR
export JASPERLIB=$DIR/grib2/lib
export JASPERINC=$DIR/grib2/include
保存后,执行
source ~/.bashrc
使配置生效。可以通过
which mpicc
和
nc-config --all
等命令验证库是否安装成功。
4. WRF-Chem 模式编译:从源代码到可执行文件
环境就绪后,进入核心环节——编译WRF-Chem。这个过程对网络稳定性要求较高,因为需要下载大量代码。
4.1 获取源代码
从官方GitHub仓库克隆代码是推荐方式。
# 创建一个工作目录
mkdir -p ~/WRF-Chem
cd ~/WRF-Chem
# 克隆 WRF 和 WPS 代码 (WRF-Chem 包含在 WRF 中)
git clone https://github.com/wrf-model/WRF.git
git clone https://github.com/wrf-model/WPS.git
WRF
目录下已经包含了化学模块。
WPS
是独立的前处理系统。
4.2 编译 WRF-Chem 主模式
编译WRF是一个交互式配置过程。
cd WRF
# 清理之前可能的编译残留
./clean -a
# 启动配置脚本
./configure
运行
./configure
后,终端会列出多个选项。对于WRF-Chem,通常选择:
-
选择编译器组合:例如,
34. (dmpar) GNU (gcc/gfortran/g++)表示使用GNU编译器进行分布式内存并行(MPI)编译。如果你安装了Intel编译器,也可以选择对应的选项。 -
选择编译类型:通常选择
1. Basic即可。
选择后,脚本会生成一个
configure.wrf
文件。接下来,你需要编辑这个文件,确保它指向我们自定义的库路径。检查以下几行:
# 在 configure.wrf 中查找并确认
NETCDF = /opt/wrf_libs
NETCDFPATH= /opt/wrf_libs
然后开始编译。这是一个耗时很长的过程(可能数小时)。
./compile em_real 2>&1 | tee compile.log
em_real
代表“真实数据的中尺度模拟”。
2>&1 | tee compile.log
将屏幕输出同时保存到日志文件,便于排查错误。
关键验证
:编译成功后,在
WRF/main/
目录下应生成
wrf.exe
(主程序)和
real.exe
(理想案例初始化程序)。在
WRF/run/
目录下也会有一份拷贝。
ls -lah main/*.exe
# 应该能看到 wrf.exe 和 real.exe
4.3 编译 WPS (前处理系统)
WPS编译相对简单,但依赖WRF编译生成的库。
cd ../WPS
./clean -a
# 设置环境变量,指向WRF目录
export WRF_DIR=~/WRF-Chem/WRF
./configure
为WPS选择与WRF相同的编译器选项。然后编译:
./compile 2>&1 | tee wps_compile.log
编译成功后,在
WPS/
目录下应生成三个核心可执行文件:
geogrid.exe
(定义模拟区域和静态地理数据)、
ungrib.exe
(解压气象数据)、
metgrid.exe
(将气象数据插值到模拟网格)。
5. 排放源数据制作:为化学模式注入“灵魂”
没有排放源,WRF-Chem只是一个纯气象模式。制作排放源数据是化学模拟中最具挑战性的数据准备工作之一。我们以制作人为源排放(
anthro_emis
)为例。
5.1 获取排放源预处理工具
WRF-Chem官网提供了预处理工具源码,通常需要单独下载。假设我们已获得
PREP-CHEM-SRC-1.5
工具包。
cd ~/WRF-Chem
tar -xzvf PREP-CHEM-SRC-1.5.tar.gz
cd PREP-CHEM-SRC-1.5
5.2 配置与编译预处理工具
这些工具也需要编译,并且需要知道NetCDF库的路径。
# 编辑 Makefile,确保 NETCDF 路径正确指向 /opt/wrf_libs
# 通常需要修改类似 NETCDF=/opt/wrf_libs 的行
vi Makefile
# 然后编译所有工具
make
编译后,会生成
anthro_emis
,
fire_emis
,
bio_emiss
等多个可执行文件。
5.3 准备输入数据与运行
你需要准备原始的排放清单数据(如NetCDF格式的MEIC数据)和对应的空间映射文件。以下是一个简化的
anthro_emis
运行示例流程:
-
编辑配置文件
:
anthro_emis通常由一个namelist文件控制。# 示例 anthro_emis.inp (部分关键参数) &control data_dir = '/path/to/your/MEIC_data/' ! 原始排放数据目录 out_dir = './output/' ! 输出目录 start_date = '2023-01-01_00:00:00' ! 模拟开始时间 end_date = '2023-01-02_00:00:00' ! 模拟结束时间 domain = 1 ! 对应WRF的domain编号 emiss_opt = 5 ! 排放选项,对应MOZART等化学机制 / -
运行程序
:
./anthro_emis < anthro_emis.inp -
检查输出
:程序会生成名为
wrfchemi_00z_d01,wrfchemi_12z_d01等文件,代表不同时次的排放输入文件。这些文件需要被链接到WRF的run目录。
5.4 链接排放文件到WRF工作目录
cd ~/WRF-Chem/WRF/run
# 假设你的排放文件在 /path/to/emission/output/
ln -sf /path/to/emission/output/wrfchemi_* .
6. 完整实战:运行一个理想案例
在尝试复杂的真实案例前,运行一个理想案例(如热带气旋、超级单体)是验证模式编译是否成功的有效方法。它不需要外部气象和排放数据。
6.1 运行理想案例
cd ~/WRF-Chem/WRF/test/em_hill2d_x # 以2D小山地形测试为例
./ideal.exe # 生成初始条件文件
mpirun -np 4 ./wrf.exe # 使用4个MPI进程运行模式
-np 4
指定使用的处理器核心数,请根据你的机器配置调整。
6.2 监控运行与验证输出
运行过程中,屏幕会输出积分步数和时间信息。运行结束后,检查目录下是否生成了系列输出文件:
-
wrfout_d01_*:主要的模式输出文件(NetCDF格式)。 -
rsl.error.0000,rsl.out.0000:运行日志和错误日志。 这是排查问题的首要位置 。
使用简单的
ncdump
命令可以查看输出文件的基本信息:
ncdump -h wrfout_d01_0001-01-01_00:00:00
7. 常见问题与排查思路
在WRF-Chem的搭建和运行过程中,90%的问题集中在编译和环境配置阶段。下表总结了典型问题及解决方法。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
./configure
时提示找不到编译器
| 基础开发包未安装 |
which gfortran
,
which gcc
|
运行
sudo apt install build-essential gfortran
|
编译 WRF 时大量
undefined reference
错误
| 库路径不正确或库缺失 |
检查
configure.wrf
中
NETCDF
,
JASPERLIB
等路径;检查
compile.log
末尾错误
|
确认环境变量
$DIR
设置正确,并
source ~/.bashrc
;重新按顺序安装缺失的库
|
编译 WRF 时
fatal error: netcdf.inc: No such file
| NetCDF-Fortran 未安装或路径不对 |
ls $DIR/include/netcdf.inc
|
重新安装 NetCDF-Fortran,并确保
NETCDF
环境变量指向包含
lib
和
include
的父目录
|
mpirun
命令未找到
| MPI 未安装或环境变量未生效 |
which mpicc
|
确认已安装OpenMPI并正确设置
PATH
;执行
source ~/.bashrc
|
| WPS 编译失败,提示与WRF链接错误 |
WRF_DIR
环境变量未设置或指向错误
|
echo $WRF_DIR
|
在WPS目录下执行
export WRF_DIR=/path/to/your/WRF
|
geogrid.exe
运行成功但
ungrib
或
metgrid
失败
| 气象输入数据格式不匹配或损坏 |
检查
ungrib.log
和
metgrid.log
文件
|
确认使用的Vtable(变量表)与下载的气象数据(GFS, ERA5等)版本匹配;使用
wgrib2
工具检查数据文件
|
WRF 运行时在开头立即崩溃,
rsl.error
中有
forrtl: severe (174)
|
排放源文件时间或格式与
namelist.input
不匹配
|
对比
wrfchemi
文件的时间戳和
namelist.input
中的
start_date
|
确保排放文件的时间覆盖了模拟时段;检查
namelist.input
中
chem_opt
和
emiss_opt
与排放文件生成时使用的选项一致
|
| 模拟结果中污染物浓度全为0或异常低 | 排放源未成功读入或单位换算错误 |
用
ncview
或
ncdump
查看
wrfchemi
文件是否有数据;检查
namelist.input
中
emiss_inpt_opt
参数
|
确保
wrfchemi
文件已正确链接到
run
目录;确认
emiss_inpt_opt=1
(表示读入预处理的排放文件)
|
首要排查原则:永远首先查看日志文件!
compile.log
,
wps_compile.log
,
rsl.error.0000
是定位问题的金钥匙。
8. 最佳实践与工程建议
- 环境隔离 :考虑使用 Conda 环境或 Docker 容器来管理复杂的依赖。虽然WRF-Chem官方未提供容器镜像,但自建Dockerfile可以完美复现编译环境,避免污染主机系统,也便于团队共享。
- 版本控制 :记录下所有库的版本号(zlib, HDF5, NetCDF, OpenMPI, WRF-Chem代码版本)。不同版本间可能存在兼容性问题。建立一个安装脚本(Bash或Python),实现环境的一键重建。
- 模块化编译 :在服务器集群上,利用环境模块(Environment Modules)工具来管理不同版本的编译器、MPI和库,方便用户切换。
- 数据管理 :气象输入数据(如GFS)、地理静态数据(非常庞大,可达数十GB)和排放清单数据应存放在高速、大容量的存储设备上,并通过符号链接或配置文件灵活指向。
-
namelist 管理
:
namelist.input(WRF)和namelist.wps(WPS)是模拟的“大脑”。为不同实验创建独立的目录,并拷贝对应的namelist文件。使用版本控制(如Git)或至少是备份来管理这些关键的配置文件。 -
性能调优
:在
namelist.input中调整time_step、num_metgrid_levels等参数以平衡精度与速度。使用mpirun绑定CPU核心(如--bind-to core)或利用作业调度系统(如Slurm, PBS)来高效利用计算节点。 -
输出策略
:WRF-Chem输出文件巨大。在
namelist.input的&time_control部分合理设置history_interval(输出频率)和frames_per_outfile(每个文件包含的时段),避免生成单个超大的文件,影响后续分析和存储。
从理解在线耦合的核心优势,到在Linux系统上搭建起一整套编译环境,再到亲手编译模式、制作排放源并成功运行一个案例——这个过程本身就是对计算地球科学工作流的深度体验。WRF-Chem作为一个强大的研究工具,其价值在于将复杂的物理化学过程封装起来,让研究者能更专注于科学问题的设计。然而,驾驭它的前提,正是跨越我们今天所详细拆解的这一系列技术关卡。
掌握这个全流程,意味着你不仅能够复现他人的研究,更具备了根据自己科学问题定制模拟实验的能力。下一步,你可以尝试更换不同的化学机制和气溶胶方案,耦合更复杂的排放清单(如生物源、海盐、沙尘),或者利用Python生态(如wrf-python, xarray)进行更高效、更美观的数据分析和可视化。



2万+

被折叠的 条评论
为什么被折叠?



