1. 引言
aiida-flexpart 是一个基于 AiiDA 工作流框架开发的 Python 包,用于自动化运行、管理和追踪 FLEXPART 大气传输扩散模型的模拟任务。FLEXPART 是挪威大气研究所(NILU)开发的拉格朗日粒子扩散模型,广泛应用于污染物溯源、火山灰扩散、核事故放射性物质扩散等场景。aiida-flexpart 将 FLEXPART 的输入准备、运行、输出解析和结果归档封装为可复现、可追溯的 AiiDA 工作流,极大提升了科研人员管理大规模模拟任务的效率。
本文将从功能特性、安装配置、核心语法、参数体系、9 个实际应用案例以及常见错误与注意事项六个方面,系统介绍 aiida-flexpart 的使用方法。
2. 功能概述
aiida-flexpart 的核心功能围绕 FLEXPART 模型的全生命周期管理展开,主要包括以下几个方面:
- 输入文件自动生成:根据用户提供的参数自动生成 FLEXPART 所需的 namelist 文件(如
COMMAND、RELEASES、OUTGRID等)和路径配置文件pathnames。 - 气象数据管理:支持从 ECMWF、NCEP 等数据源下载或导入气象驱动数据,并自动完成格式转换和路径配置。
- 任务调度与并行:通过 AiiDA 的 daemon 机制实现任务的提交、监控和并行调度,支持本地、集群(SLURM、PBS)等多种计算环境。
- 输出解析与可视化:自动解析 FLEXPART 输出的二进制文件(如
grid_*.bin、partposit_end),提取浓度场、沉降量等关键结果,并可调用 matplotlib 或 cartopy 生成可视化图件。 - 可复现性与追溯:所有输入参数、代码版本、环境依赖均被 AiiDA 记录为 provenance 节点,确保每次模拟可完整复现。
- 批量模拟与参数扫描:支持对释放时间、释放高度、气象场等参数进行批量扫描,自动生成并管理大量模拟任务。
3. 安装与配置
3.1 环境要求
aiida-flexpart 的运行依赖以下核心组件:
- Python 3.8 及以上版本
- AiiDA 2.x(推荐 2.5 及以上)
- FLEXPART 10.4 或 11.x 版本的可执行文件
- PostgreSQL 数据库(AiiDA 存储后端)
- RabbitMQ 消息队列(AiiDA daemon 依赖)
3.2 安装步骤
推荐使用 conda 创建独立环境进行安装,避免依赖冲突:
conda create -n aiida-flexpart python=3.10 conda activate aiida-flexpart pip install aiida-core==2.5.1 pip install aiida-flexpart安装完成后,需要初始化 AiiDA 环境并创建计算配置:
verdi quicksetup verdi computer setup --label flexpart-local --hostname localhost --transport local --scheduler direct --workdir /tmp/flexpart verdi computer configure local flexpart-local verdi code setup --label flexpart --computer flexpart-local --remote-abs-path /path/to/FLEXPART/flexpart --input-plugin flexpart3.3 验证安装
通过以下命令验证 aiida-flexpart 是否正确安装:
verdi plugin list aiida.calculations | grep flexpart verdi plugin list aiida.workflows | grep flexpart如果输出中包含flexpart相关的计算插件和工作流插件,说明安装成功。
4. 核心语法与工作流结构
4.1 基础计算节点
aiida-flexpart 提供了FlexpartCalculation计算节点,用于直接提交单个 FLEXPART 模拟任务。以下是一个最小示例:
from aiida import load_profile from aiida.orm import Dict, SinglefileData, RemoteData from aiida_flexpart.calculations.flexpart import FlexpartCalculation load_profile() 准备输入参数 params = Dict(dict={ 'command': { 'ctl': 1, 'maxdisp': 100000.0, 'lsubgrid': 1, 'lconvection': 1, 'ind_source': 1, 'ind_sink': 1, 'iflux': 0, 'mdomainfill': 0, 'iout': 1, 'ipout': 0, 'loutstep': 3600, 'loutaver': 0, 'loutsample': 0, 'loutend': 1, }, 'releases': { 'numpart': 10000, 'irelease': 1, 'kindz': 0, 'z1': 100.0, 'z2': 500.0, 'kindt': 0, 't1': '2023-01-01 00:00:00', 't2': '2023-01-01 06:00:00', 'x1': 116.4, 'x2': 116.4, 'y1': 39.9, 'y2': 39.9, }, }) 准备气象数据文件 meteo_file = SinglefileData(file='/path/to/metdata_20230101') 提交计算 builder = FlexpartCalculation.get_builder() builder.parameters = params builder.meteo_file = meteo_file builder.code = load_code('flexpart@flexpart-local') builder.metadata.options.resources = {'num_machines': 1, 'num_mpiprocs_per_machine': 1} builder.metadata.options.max_wallclock_seconds = 3600 from aiida.engine import run result = run(builder)4.2 工作流节点
对于更复杂的模拟场景,aiida-flexpart 提供了FlexpartWorkchain工作流,自动处理输入准备、任务提交、输出解析和结果归档:
from aiida_flexpart.workflows.flexpart import FlexpartWorkchain builder = FlexpartWorkchain.get_builder() builder.parameters = params builder.meteo_file = meteo_file builder.code = load_code('flexpart@flexpart-local') builder.workchain_data = Dict(dict={ 'output_dir': '/path/to/output', 'store_outputs': True, 'plot_results': True, }) result = run(builder)4.3 批量参数扫描
aiida-flexpart 支持通过FlexpartParameterScan工作流进行批量模拟,适用于释放高度、释放时间等参数的敏感性分析:
from aiida_flexpart.workflows.scan import FlexpartParameterScan builder = FlexpartParameterScan.get_builder() builder.base_parameters = params builder.meteo_file = meteo_file builder.code = load_code('flexpart@flexpart-local') builder.scan_parameters = Dict(dict={ 'releases.z1': [50.0, 100.0, 200.0, 500.0], 'releases.z2': [100.0, 200.0, 400.0, 1000.0], }) result = run(builder)5. 参数体系详解
5.1 COMMAND 参数
COMMAND namelist 控制 FLEXPART 的核心运行行为,常用参数如下:
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| ctl | integer | 1 | 控制模式:1 为前向模拟,2 为后向模拟 |
| maxdisp | real | 100000.0 | 最大扩散距离(米),超过后粒子被移除 |
| lsubgrid | integer | 1 | 是否启用次网格地形参数化 |
| lconvection | integer | 1 | 是否启用对流参数化 |
| ind_source | integer | 1 | 源项指示器:1 为质量混合比,2 为质量 |
| ind_sink | integer | 1 | 汇项指示器:1 为干沉降,2 为湿沉降 |
| iflux | integer | 0 | 是否输出通量 |
| mdomainfill | integer | 0 | 是否启用域填充模式 |
| iout | integer | 1 | 输出类型:1 为浓度,2 为混合比 |
| ipout | integer | 0 | 粒子位置输出频率 |
| loutstep | integer | 3600 | 输出时间步长(秒) |
| loutaver | integer | 0 | 输出平均时间(秒),0 为瞬时输出 |
| loutsample | integer | 0 | 采样输出间隔(秒) |
| loutend | integer | 1 | 是否在模拟结束时输出 |
5.2 RELEASES 参数
RELEASES namelist 定义释放源的属性,常用参数如下:
| 参数名 | 类型 | 说明 |
|---|---|---|
| numpart | integer | 释放粒子总数 |
| irelease | integer | 释放编号(从 1 开始) |
| kindz | integer | 高度类型:0 为绝对高度(米),1 为相对地面高度 |
| z1, z2 | real | 释放高度范围(米) |
| kindt | integer | 时间类型:0 为绝对时间,1 为相对时间 |
| t1, t2 | string | 释放起止时间(格式:YYYY-MM-DD HH:MM:SS) |
| x1, x2 | real | 释放区域经度范围(度) |
| y1, y2 | real | 释放区域纬度范围(度) |
| npart | integer | 每个释放点的粒子数 |
| nclass | integer | 粒子类别数 |
5.3 OUTGRID 参数
OUTGRID namelist 定义输出网格的范围和分辨率:
| 参数名 | 类型 | 说明 |
|---|---|---|
| outlon0 | real | 输出网格西边界经度(度) |
| outlat0 | real | 输出网格南边界纬度(度) |
| numxgrid | integer | 经度方向网格数 |
| numygrid | integer | 纬度方向网格数 |
| dxout | real | 经度方向网格间距(度) |
| dyout | real | 纬度方向网格间距(度) |
| numzgrid | integer | 垂直层数 |
| outheight | real | 输出网格顶高度(米) |
6. 9 个实际应用案例
案例 1:城市污染物溯源
利用后向模拟模式(ctl=2),对北京地区 PM2.5 污染事件进行溯源分析。通过设置释放点位于北京城区(116.4°E, 39.9°N),释放高度 100-500 米,模拟 72 小时的后向轨迹,识别污染物的潜在来源区域。
params = Dict(dict={ 'command': {'ctl': 2, 'loutstep': 3600, 'iout': 1}, 'releases': { 'numpart': 50000, 'z1': 100.0, 'z2': 500.0, 't1': '2023-01-15 00:00:00', 't2': '2023-01-15 00:00:00', 'x1': 116.4, 'x2': 116.4, 'y1': 39.9, 'y2': 39.9, }, 'outgrid': { 'outlon0': 80.0, 'outlat0': 10.0, 'numxgrid': 200, 'numygrid': 180, 'dxout': 0.5, 'dyout': 0.5, 'numzgrid': 10, 'outheight': 5000.0, }, })案例 2:火山灰扩散模拟
模拟火山喷发后火山灰在大气中的扩散过程。以日本樱岛火山为例,设置释放源位于火山口(130.65°E, 31.58°N),释放高度 3000-10000 米,模拟 48 小时的前向扩散,评估火山灰对周边机场的影响。
params = Dict(dict={ 'command': {'ctl': 1, 'loutstep': 1800, 'iflux': 1}, 'releases': { 'numpart': 100000, 'z1': 3000.0, 'z2': 10000.0, 't1': '2023-07-01 00:00:00', 't2': '2023-07-01 06:00:00', 'x1': 130.65, 'x2': 130.65, 'y1': 31.58, 'y2': 31.58, }, 'outgrid': { 'outlon0': 120.0, 'outlat0': 20.0, 'numxgrid': 160, 'numygrid': 120, 'dxout': 0.25, 'dyout': 0.25, 'numzgrid': 20, 'outheight': 15000.0, }, })《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。