ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Python aiida-flexpart 包概述与实战案例详解

Python aiida-flexpart 包概述与实战案例详解

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 flexpart

3.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 的核心运行行为,常用参数如下:

参数名类型默认值说明
ctlinteger1控制模式:1 为前向模拟,2 为后向模拟
maxdispreal100000.0最大扩散距离(米),超过后粒子被移除
lsubgridinteger1是否启用次网格地形参数化
lconvectioninteger1是否启用对流参数化
ind_sourceinteger1源项指示器:1 为质量混合比,2 为质量
ind_sinkinteger1汇项指示器:1 为干沉降,2 为湿沉降
ifluxinteger0是否输出通量
mdomainfillinteger0是否启用域填充模式
ioutinteger1输出类型:1 为浓度,2 为混合比
ipoutinteger0粒子位置输出频率
loutstepinteger3600输出时间步长(秒)
loutaverinteger0输出平均时间(秒),0 为瞬时输出
loutsampleinteger0采样输出间隔(秒)
loutendinteger1是否在模拟结束时输出

5.2 RELEASES 参数

RELEASES namelist 定义释放源的属性,常用参数如下:

参数名类型说明
numpartinteger释放粒子总数
ireleaseinteger释放编号(从 1 开始)
kindzinteger高度类型:0 为绝对高度(米),1 为相对地面高度
z1, z2real释放高度范围(米)
kindtinteger时间类型:0 为绝对时间,1 为相对时间
t1, t2string释放起止时间(格式:YYYY-MM-DD HH:MM:SS)
x1, x2real释放区域经度范围(度)
y1, y2real释放区域纬度范围(度)
npartinteger每个释放点的粒子数
nclassinteger粒子类别数

5.3 OUTGRID 参数

OUTGRID namelist 定义输出网格的范围和分辨率:

参数名类型说明
outlon0real输出网格西边界经度(度)
outlat0real输出网格南边界纬度(度)
numxgridinteger经度方向网格数
numygridinteger纬度方向网格数
dxoutreal经度方向网格间距(度)
dyoutreal纬度方向网格间距(度)
numzgridinteger垂直层数
outheightreal输出网格顶高度(米)

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框架最新技术发展趋势。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进