CMAQ小白福音:在Linux上搞定ISAT.M排放清单转换的保姆级教程
CMAQ零基础实战:Linux环境ISAT.M排放清单转换全流程解析
第一次在Linux环境下操作ISAT.M工具时,我盯着终端里不断跳出的报错信息,深刻理解了"从入门到放弃"的真正含义。作为CMAQ模型预处理的关键环节,排放清单转换本应是空气质量管理研究的起点,却往往成为新手的第一道技术壁垒。本文将彻底拆解ISAT.M在Linux系统中的完整工作流程,从Python 2.7环境配置到最终生成CMAQ可读的NetCDF文件,每个步骤都经过真实项目验证。
1. 环境准备:避开Python 2.7的兼容性陷阱
在Ubuntu 20.04 LTS系统中配置ISAT.M运行环境时,首要挑战是搭建稳定的Python 2.7工作环境。由于现代Linux发行版已默认移除对Python 2的支持,我们需要手动构建隔离环境:
# 安装Python 2.7基础环境 sudo apt-get update sudo apt-get install python2.7 python2.7-dev # 创建虚拟环境(需先安装virtualenv) python2.7 -m pip install virtualenv python2.7 -m virtualenv py2_env source py2_env/bin/activate关键依赖库的安装需要特别注意版本兼容性:
| 库名称 | 推荐版本 | 安装命令 | 兼容性说明 |
|---|---|---|---|
| numpy | 1.16.6 | pip install numpy==1.16.6 | 最后支持Python 2的版本 |
| pandas | 0.24.2 | pip install pandas==0.24.2 | 需配合numpy 1.16使用 |
| netCDF4 | 1.5.8 | pip install netCDF4==1.5.8 | 需要先安装hdf5开发库 |
| pyproj | 1.9.6 | pip install pyproj==1.9.6 | 地理坐标转换核心依赖 |
提示:在Ubuntu系统中需先执行
sudo apt-get install libhdf5-dev确保netCDF4库正常编译
常见环境问题排查:
- ImportError: No module named pandas:检查虚拟环境是否激活
- netCDF4 undefined symbol:尝试重新安装hdf5开发库后编译
- numpy.dtype size changed:强制降级numpy到1.16.6版本
2. 文件结构解析与配置优化
ISAT.M的标准目录结构包含三个核心组件:
ISAT.M/ ├── src/ # 源数据目录 │ ├── emissions/ # 排放量数据(CSV格式) │ ├── speciate/ # 物种分配参数 │ ├── temporary/ # 时间分配参数 │ └── met/ # 气象网格文件 ├── creat_smoke_to_cmaq.ini # 主配置文件 └── ISATM.csh # 自动化运行脚本2.1 配置文件深度定制
creat_smoke_to_cmaq.ini是转换过程的中枢神经,其关键参数组解析:
[model] model = CMAQinline # 在线模式直接耦合气象数据 [inputtype] inputtype = month # 输入排放量为月总量(可选year) [runtime] runtime = 745 # 模拟时长(小时) [gridcro2d] gridcro2d = ./src/met/GRIDCRO2D.nc # 必须与MCIP输出匹配 [speciate] speciate = ./src/speciate/speciate_AR.csv # 居民源物种分配 speciate_groups = ./src/speciate/speciate_IN.csv # 工业源分配 [emissions] emissions = ./src/emissions/area/AR.csv # 面源排放文件路径 stack_groups = ./src/emissions/point/STACK_GROUP_IN.csv # 点源数据实际项目中容易出错的配置项:
- 路径分隔符:Linux下必须使用正斜杠(/)
- 文件编码:所有CSV需保存为UTF-8无BOM格式
- 时间参数:runtime需与CMAQ模拟时长严格一致
2.2 排放数据文件规范
面源CSV文件必须包含以下字段(示例):
LON,LAT,SO2,NOx,VOC,CO,PM25,PM10,NH3 116.4,39.9,12.5,8.7,25.3,4.2,6.8,9.1,2.4 116.5,39.9,10.2,7.1,20.8,3.5,5.2,7.6,1.9注意:NOx字段在文件中需标注为NO2,但实际代表NOx总量
点源数据额外需要烟囱参数:
LON,LAT,STKDM,STKHT,STKTK,STKVE,STKFLW,SO2,NOx 116.4,39.8,2.5,80,400,12,30,45.6,32.13. 脚本调试与自动化运行
ISAT.M的核心转换逻辑通过ISATM.csh脚本驱动,需根据实际环境修改:
#!/bin/csh # 清空历史输出 mv -f *.nc /tmp/ # 创建输出目录 mkdir -p EMISSIONS # 进入处理目录 cd ./processing/ # 并行执行转换(根据CPU核心数调整mpirun参数) mpirun -np 4 /path/to/py2_env/bin/python area_inlinenew.py mpirun -np 4 /path/to/py2_env/bin/python point_em_inline.py # 合并输出文件 /path/to/py2_env/bin/python addnc_v1.py mv -f out.nc ../EMISSIONS/area.nc典型运行错误及解决方案:
Shell兼容性问题:
ERROR: Unable to proceed: no support for sourcing from '[dash|sh]' shell解决方法:确保脚本首行为
#!/bin/csh并使用csh ISATM.csh执行Python路径错误:
ImportError: No module named netCDF4检查虚拟环境路径是否正确,建议使用绝对路径
文件权限不足:
Permission denied: './EMISSIONS'执行
chmod 755 ISATM.csh并确保输出目录可写
4. 结果验证与CMAQ对接
成功运行后,在输出目录将生成以下关键文件:
area.nc:面源排放NetCDFpoint.nc:点源排放数据emis.log:转换过程日志
使用ncdump验证输出文件结构:
ncdump -h area.nc预期输出应包含以下维度变量:
dimensions: TSTEP = UNLIMITED ; DATE-TIME = 2 ; LAY = 1 ; VAR = 10 ; ROW = 网格行数 ; COL = 网格列数 ;最后将生成的NetCDF文件放置于CMAQ的EMIS目录,在CTRL文件中配置:
EMISFILE = 'path/to/area.nc', EMIS_MAP = 'SO2>SO2; NO>NO; NO2>NO2; ...'在测试案例中,某京津冀区域项目从原始排放数据到最终CMAQ可用的NetCDF转换,完整流程耗时约23分钟(Intel Xeon 16核服务器)。期间最大的时间消耗其实不是计算本身,而是反复调试配置文件格式和路径设置——这也正是本文详细列出每个配置细节的原因。
