KPP(Kinetic PreProcessor)是一种自动生成化学机制程序代码的工具,WRF-Chem 通过 WKC(WRF-Chem KPP Coupler)实现与 KPP 的集成,极大简化了添加或修改化学反应机制的过程。
✅ 背景问题
在传统的 WRF-Chem 模拟中:
✅ 解决方案:KPP + WKC
KPP(Kinetic PreProcessor):
WKC(WRF-Chem KPP Coupler):
✅ WKC 的特点
注:WKC 的介绍最早出现在 2006 年 WRF 用户研讨会上(Barth & Lawrence)
相关文档:
为了在系统中使用 KPP,你需要安装以下工具:
工具 | 说明 |
---|---|
flex |
词法分析器 |
yacc |
语法解析器 |
sed |
文本处理工具 |
C 编译器 | 默认由 configure_kpp 自动设置 |
FLEX 库路径设置
/usr/lib
下的 libfl.a
或 libfl.sh
export FLEX_LIB_DIR=/your/path/to/flex/lib
⚠️ 这些工具通常在 Linux 系统中可通过包管理器安装,如 apt
, yum
, brew
等。
编译触发条件
编译 WRF-Chem 时,若设置了环境变量:
setenv WRF_KPP 1 # csh 用户
export WRF_KPP=1 # bash 用户
则 KPP 和 WKC 会自动运行并编译
⚙️ 编译流程概要
.eqn
化学方程文件WRFV3/chem
目录chem/Makefile
kpp
前缀的模块将被集成进模型清理模块
clean
脚本KPP 文件位置
对于已经通过 WKC(WRF-Chem KPP Coupler) 实现的化学机制,其对应的 KPP 输入文件存放在:
WRFV3/chem/KPP/mechanisms/
这些子目录中包含了每种化学机制的定义文件(如 .eqn
, .spc
, .rate
)。
注册机制
Registry/registry.chem
文件中有注册。kpp
,用于标识为通过 KPP 实现的机制。使用方法
若要在 namelist.input
中启用这些机制:
&chem
chem_opt = XXX ! 设置为对应机制的编号(大于 100)
/
化学机制名称 | 作者与特点 |
---|---|
RACM/SORGAM | 区域大气化学机制,适合模拟臭氧与二次有机气溶胶 |
RACM(Stockwell et al. 1997) | 区域性机制,广泛用于城市/区域空气质量研究 |
RACM-MIM(Geiger et al. 2003) | 将 RACM 与 MIM(Mechanism for Isoprene Mechanism)结合 |
RACM/SORGAM(再列) | 与 SORGAM 气溶胶机制配套使用,适合模拟 SOA |
这些机制的
chem_opt
设置值大于 100**,以与非 KPP 机制区分。**
WKC 的核心作用是:
从
.spc
文件和registry.chem
自动生成 WRF-Chem 与 KPP 之间的接口 Fortran 90 代码。
WKC 所在目录结构:
路径:chem/KPP/
该目录包含以下子目录和文件:
1. mechanisms/
.eqn
(反应方程).spc
(物种列表).rate
(反应速率)chem/KPP/mechanisms/racm_kpp/
2. 编译/清理脚本
3. kpp/
子目录(包含 KPP 源码)
.kpp
文件中的 #WRF Conform
指令确保兼容性4. util/wkc/
5. wkpp_constants.F
模块
RTOL
(相对误差容限)ATOL
(绝对误差容限)6. incare/
目录
#include
的代码文件clean
脚本删除目录/文件 | 功能 |
---|---|
KPP/mechanisms/ |
储存每个机制的 KPP 输入文件 |
KPP/kpp/ |
存放 KPP v2.1 源代码 |
KPP/util/wkc/ |
WKC 的核心代码 |
KPP/compile , KPP/clean |
编译/清理脚本 |
wkpp_constants.F |
调整 KPP 解算器误差容限参数 |
incare/ |
存放供用户修改的接口文件 |
自动生成代码的特点
推荐的修改方式:使用 #INCLUDE
WKC 生成的代码中包含大量 #INCLUDE
指令
被包含的 .f
文件位于:
chem/KPP/inc/
这些 .f
文件:
clean
脚本删除修改自动生成文件的其他方法(不推荐)
推荐方法:使用
chem/KPP/inc/
目录下的#include
文件进行插入式修改,既安全又便于维护。
当前支持的积分器类型
WKC 目前仅支持 Rosenbrock 类型积分器
编译后,相应积分器模块保存在:
chem/kpp_my_mechanism_Integrator.f90
其中 my_mechanism
是 namelist 中设置的化学机制名。
后续扩展
在使用 WKC 添加新的化学机制时,除了提供反应机制本身的定义外,通常还需要:
① 编辑注册表文件 Registry.EM_CHEM
添加新物种到化学数组结构(如需)
添加机制项,名称以 _kpp
结尾,例如:
package my_mechanism_kpp
② 提供 KPP 所需的输入文件
将如下文件放入新的机制目录中,例如:
WRFV3/chem/KPP/mechanisms/my_mechanism/
文件名 | 说明 |
---|---|
my_mechanism.eqn |
化学反应方程 |
my_mechanism.spc |
化学物种列表 |
my_mechanism.kpp |
KPP 配置文件 |
my_mechanism_wrfkpp.equiv |
可选映射表(WRF<->KPP 变量名) |
注意:机制目录名应为 my_mechanism
,而不是 my_mechanism_kpp
!
③ 可选:变量名映射文件(equiv 文件)
my_mechanism_wrkfpp.equiv
HO → OH
参考已有机制结构
建议复制一个已实现机制的目录作为模板,例如:
WRFV3/chem/KPP/mechanisms/racm_kpp/
然后修改:
.kpp
文件中的 #Model
名称.def
文件中引用的 .eqn
和 .spc
文件名④ 设置 KPP 文件中的积分器
在你的 .kpp
文件中添加:
#INTEGRATOR WRF conform/rosenbrock
#WRFCONFORM
路径指向:
WRFV3/chem/KPP/kpp/kpp-2.1/int/WRF_conform/
⚠️ 注意事项:
.spc
文件中的注释!步骤 | 操作说明 |
---|---|
1️⃣ 注册机制 | 修改 Registry.EM_CHEM ,添加化学包 |
2️⃣ 准备机制文件 | .eqn , .spc , .kpp , *.equiv |
3️⃣ 配置 KPP | 设置积分器、模型名等 |
4️⃣ 放入指定目录 | chem/KPP/mechanisms/my_mechanism/ |
5️⃣ 编译 WRF-Chem | 设置 WRF_KPP=1 ,自动运行 KPP 与 WKC |
目的: 要将 KPP 化学机制正确集成到 WRF-Chem 中,需要在 KPP 方程文件(.eqn
) 里对某些变量名称进行适配,使其与 WRF-Chem 接口匹配。
下表列出了在 KPP .eqn
文件中使用的变量名及其含义、单位和在 WRF-Chem 注册表中的对应名称:
物理量 | KPP 中变量名 | 单位 | WRF-Chem 注册表中的变量名 |
---|---|---|---|
光解速率 | J(Pj_no2) |
s⁻¹ | ph_no2 |
温度 | TEMP |
K | t_phy |
三体分子浓度 | C_M |
分子/立方厘米(湿空气) | 根据密度计算 |
水汽浓度 | C_H2O |
分子/立方厘米 | 根据 qvapor 计算 |
⚠️ 注意:这些变量在
.eqn
文件中以名称出现,但在运行时由 WRF-Chem 的接口传递具体数值。
示例 .eqn
文件片段(RACM-MIM)
#EQUATIONS { racm-mim }
{001} NO2+hv=O3P+NO : j(Pj_no2) ;
{002} O3+hv=O1D+{O2} : j(Pj_o31d) ;
...
{242} MACP+HO2=MAHP : ARR2(1.82e-13, -1300.0, TEMP) ;
{243} MACP+MACP=HACE+MGLY+... : 2.00e-12 ;
{244} MSACP+NO2=MPAN : TROE(9.70e-29, 5.6, ..., TEMP, C_M) ;
j(Pj_no2)
:读取 NO₂ 光解速率TEMP
:温度C_M
:三体分子浓度内部说明
j(Pj_xxx)
会由 WRF-Chem 接口传入(例如 ph_no2
)chem/KPP/inc
中的 .inc
文件进行传递背景:
rosenbrock.f90
)。积分器文件位置
所有 KPP 积分器文件位于:
chem/KPP/kpp/kpp2.1/int/
已适配 WRF 的积分器存放在:
chem/KPP/kpp/kpp2.1/int/WRF_Conform/
适配新积分器的步骤如下:
步骤 1:复制文件
.f90
和 .def
文件复制到 WRF_Conform/
目录步骤 2:修改子程序名
SUBROUTINE
和 END SUBROUTINE
中的子程序名加上前缀 KPP_ROOT_
SUBROUTINE INTEGRATE(...)
改为 SUBROUTINE MYMECH_INTEGRATE(...)
步骤 3:更改子程序参数
SUBROUTINE
的参数列表,使其与 WRF-Chem 的调用接口一致步骤 4:删除不必要的 USE
语句
USE
模块语句SUBROUTINE
参数传递数据⚠️ 注意事项