转换实用程序
- [8.1 将中间二进制文件转换为 WRF-Chem 数据文件](#8.1 将中间二进制文件转换为 WRF-Chem 数据文件)
- [8.2 Binary data file format(中间二进制排放数据文件的格式和结构)](#8.2 Binary data file format(中间二进制排放数据文件的格式和结构))
-
- [FORTRAN 示例程序说明](#FORTRAN 示例程序说明)
- [8.3 Building the WRF-Chemistry emissions conversion code](#8.3 Building the WRF-Chemistry emissions conversion code)
- [8.4 Namelist settings for running convert_emiss](#8.4 Namelist settings for running convert_emiss)
-
- namelist.input设置
- [运行 convert_emiss.exe 的操作流程](#运行 convert_emiss.exe 的操作流程)
- 参考
8.1 将中间二进制文件转换为 WRF-Chem 数据文件
目的
这一节讲的是 WRF-Chem 中某些工具的最后一步处理 :
将一个包含完整元数据信息(如地图投影、模拟时间等)的 NetCDF 文件生成出来,用于模拟所需的 人为排放数据(anthropogenic emissions) 输入。
- 如果用户没有提供元数据,则可以从
wrfinput_d01
文件中提取所需信息,并添加到排放 NetCDF 文件中。
文件命名规范与风格
为了规范人为排放文件的命名,决定统一使用 wrfchemi
作为文件名前缀。
- 文件名有两种命名风格,取决于是否包含日期和时间:
-
按小时命名 (适用于
io_style_emissions = 1
):-
文件名格式:
wrfchemi_<hour>z_d<domain_id>
例如:
wrfchemi_00z_d01
wrfchemi_12z_d01
-
每个文件包含 12 小时的逐小时排放数据:
00z
文件:00:00 ~ 11:00 UTC12z
文件:12:00 ~ 23:00 UTC
-
-
包含完整日期和时间 (适用于
io_style_emissions = 2
):-
文件名格式:
wrfchemi_d<domain_id>_<date><time>
-
适用于每日变化的排放数据。
-
注意:如果模拟时间与文件中的时间不匹配,模型运行时会报错。
-
-
🔧 控制方式 :通过 chemistry namelist 中的 io_style_emissions
参数选择使用哪种命名方式。
示例:NEI-05 排放数据集
- NEI-05 是代表美国"典型臭氧季节日"的排放清单。
- 常用于任意日期的 WRF-Chem 模拟。
- 使用此数据集时,通常只需提供两个 NetCDF 4D 排放文件(
00z
和12z
文件),即足以覆盖一整天的模拟。 - 使用
convert_emiss.F
工具可将 NEI-05 数据转化为所需格式。
示例:RETRO/EDGAR 全球排放数据
- RETRO/EDGAR 是按月更新的全球排放数据。
- 虽然这些数据是逐月的,但可以在模拟刚开始时读取一次,并且一直使用到模拟结束。
- 这种情况下,只需要一个
wrfchemi_00z_d01
或wrfchemi_12z_d01
文件,内容包含模拟开始时的排放数据即可。 - 模型会自动将更新间隔设置为比模拟时间更长的时间段,从而避免中途重新读取。
8.2 Binary data file format(中间二进制排放数据文件的格式和结构)
目的
中间的二进制排放文件用于存储三维排放数据(3D emissions) ,包括多个排放物种在不同时间和空间格点上的值。
这个文件最终将被转换为 WRF-Chem 可读取的 NetCDF 输入文件。
应用场景
该文件格式是一些预处理工具(如 convert_emiss.F
)生成的中间格式,最终会被转换成 WRF-Chem 可用的 NetCDF 文件。理解这个结构有助于开发、检查或自行生成排放数据。
FORTRAN 示例程序说明
此程序展示了如何用 FORTRAN 编写一个二进制文件,结构如下:
1、参数定义
fortran
PARAMETER(IX=39,JX=39,KX=19)
PARAMETER(NRADM=30, IHOUR=12)
IX, JX, KX
:表示网格在 x、y、z 三个方向的大小,代表空间维度。NRADM
:排放物种的数量(共 30 个)。IHOUR
:时间维度,表示有 12 个小时的数据(00 ~ 11 UTC)。
2、变量定义
fortran
CHARACTER(len=9), DIMENSION(NRADM) :: ENAME
REAL, DIMENSION(IX2,KX,JX2,NRADM,IHOUR) :: EMISS3D
REAL, DIMENSION(IX2,KX,JX2) :: TMP
ENAME
:字符数组,存储每个排放物种(如e_so2
,e_no
等)的名称。EMISS3D
:存储五维排放数据的主数组(空间 3D + 排放种类 + 时间)。TMP
:临时数组,用于逐个写入每个物种的 3D 数据。
说明:
IX2
,JX2
实际上是IX
,JX
,文档中是简化写法。
3、排放物种名称定义
fortran
DATA ENAME / 'e_so2','e_no','e_ald',...,'e_pm10' /
定义了 30 个排放物种的名称,按顺序写入文件。这些名称会在读取文件时作为关键索引。
写入文件过程
fortran
OPEN(19, FILE='wrfem_00to12Z', FORM='UNFORMATTED')
WRITE(19) NRADM
WRITE(19) ENAME
- 打开一个名为
wrfem_00to12Z
的二进制文件,用于输出排放数据。 - 写入物种数量
NRADM
和物种名称ENAME
作为文件头。
写入每小时每物种的 3D 排放数据
fortran
DO IHR = 1, 12 ! 每小时
WRITE(19) IHR ! 写入当前小时编号
DO N = 1, NRADM ! 每个物种
TMP(:,:,:) = EMISS3D(:,:,:,N,IHR) ! 提取某一小时某一物种的 3D 数据
WRITE(19) TMP ! 写入到文件
ENDDO
ENDDO
- 外层循环:遍历每个小时(共 12 小时)。
- 内层循环:遍历每个排放物种,将该小时该物种的 3D 数据写入文件。
文件结构总结
生成的二进制文件 wrfem_00to12Z
的结构如下:
-
文件头:
NRADM
:物种总数(整数)ENAME
:物种名称数组(字符型)
-
主体数据(12 个小时循环):
- 小时编号(整数)
- 每个物种的 3D 排放数据(
IX × JX × KX
的实数数组)
8.3 Building the WRF-Chemistry emissions conversion code
此部分介绍了如何编译和构建 convert_emiss 程序,该程序用于将中间二进制排放文件转换为 WRF-Chem 可用的排放输入文件(NetCDF 格式)。
convert_emiss 程序的作用
-
convert_emiss
是一个实用程序,主要功能是:将 prep_chem_sources、emiss_v03 等工具生成的中间二进制文件,转换为 WRF-Chem 所需的排放输入文件(NetCDF)。
-
它依赖于 WRF-Chem 的子程序和库文件,因此需要在 WRF-Chem 编译环境下进行构建。
编译步骤
编译过程假设你已经完成了 WRF-Chem 模型的编译。
1. 进入 WRFV3
目录:
bash
cd WRFV3
2. 设置环境变量 (例如 NETCDF
, WRFIO_NCD_LARGE_FILE_SUPPORT
等)以确保编译环境正确。
3. 运行编译命令:
bash
compile emi_conv
-
此命令会调用 WRF-Chem 的编译器和库文件,编译
chem/convert_emiss.F
文件。 -
编译完成后,会生成一个可执行文件:
convert_emiss.exe
可执行文件的位置
-
编译完成后,
convert_emiss.exe
会出现在:bashWRFV3/chem/
-
这个文件并不是 WRF 主程序的一部分,而是一个"混合程序"(hybrid program):
- 它使用了很多 WRF 的子程序和库;
- 但它本身只用于排放数据的转换。
验证编译结果
可以通过以下命令检查可执行文件是否生成:
1. 检查 chemistry 目录下:
bash
ls -ls WRFV3/chem/*.exe
应该能看到:
convert_emiss.exe
2. 检查 test/em_real
目录下:
bash
ls -ls WRFV3/test/em_real/*.exe
应该能看到以下文件:
ndown.exe
:用于嵌套域模拟real.exe
:用于处理初始和边界条件wrf.exe
:WRF 主程序convert_emiss.exe
(链接或复制过去)
8.4 Namelist settings for running convert_emiss
此部分详细介绍在使用 convert_emiss.exe 工具将中间二进制排放数据转换为 NetCDF 排放数据文件之前,如何正确设置 namelist.input 文件。重点包括时间设置、输入文件命名、IO 格式选择、以及如何验证输出文件的正确性。
主要任务
在运行 convert_emiss.exe
之前,需要:
- 正确配置
namelist.input
文件(位于WRFV3/test/em_real
目录); - 编译
convert_emiss.exe
; - 确保输出 NetCDF 文件命名正确;
- 验证生成文件的有效性。
namelist.input设置
namelist.input 时间设置
这些设置指定了转换的时间范围,为 24 小时的逐小时排放数据做准备:
fortran
&time_control
run_days = 1,
run_hours = 0,
run_minutes = 0,
run_seconds = 0,
start_year = 2008,
start_month = 07,
start_day = 14,
start_hour = 00,
start_minute = 00,
start_second = 00,
end_year = 2008,
end_month = 07,
end_day = 15,
end_hour = 00,
end_minute = 00,
end_second = 00,
- 模拟起始时间:2008-07-14 00:00:00 UTC
- 模拟结束时间:2008-07-15 00:00:00 UTC
- 总时长:1 天(24 小时)
排放数据输入文件设置
这些设置定义了输入的排放文件名和更新频率:
fortran
auxinput6_inname = 'wrfbioch...'
auxinput7_inname = 'wrffirech...'
auxinput8_inname = 'wrfchemi_gocart_bg...'
auxinput12_inname = 'wrf_chem_input'
auxinput13_inname = 'wrfchemv_d<domain>'
其中 auxinput13_inname
是你主要生成的人为排放输入(wrfchemi
文件)。
数据更新时间配置
fortran
auxinput5_interval_m = 60, ! 每小时更新(用于 biogenic emissions)
auxinput7_interval_m = 1440, ! 每天更新
auxinput8_interval_m = 1440, ! 每天更新
1440
表示每天更新一次(1440 分钟)60
表示每小时更新一次
输入文件格式设置
fortran
io_form_auxinput5 = 2,
io_form_auxinput6 = 2,
io_form_auxinput7 = 2,
io_form_auxinput8 = 2,
io_form_auxinput13 = 2,
- 这里的
2
表示 NetCDF 格式(WRF 常用格式编号) - 对应的
auxinput
文件将以 NetCDF 格式读取
chemistry 设置
fortran
&chem
chem_opt = 1,
emiss_opt = 3,
chem_in_opt = 0,
bio_emiss_opt = 1,
chem_opt = 1
:选择化学方案(如 RADM2 等)emiss_opt = 3
:使用自定义排放方式bio_emiss_opt = 1
:启用生物源排放
运行 convert_emiss.exe 的操作流程
-
编译前提:
- 必须先用
compile emi_conv
成功编译convert_emiss.exe
,否则缺少模块会报错。
- 必须先用
-
运行转换程序:
-
执行
convert_emiss.exe
,处理时间范围为:从 2008-07-14 00:00:00 到 2008-07-15 00:00:00(共 24 小时)
-
输出的 NetCDF 文件默认为:
wrfchemi_d01
-
-
重命名输出文件(非常重要):
-
WRF-Chem 模块要求文件名包含时间戳,例如:
wrfchemi_d01_2008-07-14_00:00:00
-
文件名需与
WRF/module mediation_integrate.F
中的调用一致。
-
-
移动或链接输出文件:
-
把生成的
wrfchemi_...
文件拷贝或链接到:WRFV3/test/em_real/
-
验证输出文件的正确性
使用如 ncview
等工具检查生成的 NetCDF 文件:
- 检查是否有完整的 24 小时数据;
- 检查空间分布是否合理(如 CO 应显示城市和道路);
- 确保字段与预期一致(空间和时间维度);
- 如果不匹配,可能是
namelist.input
配置错误(如时间维度或网格大小不一致)。