1. 引言
aiida-qe-app 是基于 AiiDA 工作流框架、面向 Quantum ESPRESSO(QE)第一性原理计算的高层应用包。它把输入文件准备、任务提交、结果解析、数据归档等繁琐步骤封装成可复用的工作流,让科研人员可以更专注于物理问题本身。本文将从功能、安装、语法、参数、9 个实际应用案例以及常见错误与注意事项六个方面,系统介绍 aiida-qe-app 的使用方法。
2. 核心功能
aiida-qe-app 的核心功能可以概括为以下四类:
- 工作流封装:将 Quantum ESPRESSO 的 pw.x、cp.x、ph.x 等计算任务封装为 AiiDA 工作流,支持结构优化、自洽计算、能带计算、态密度计算等常见场景。
- 数据管理:自动记录输入结构、参数、伪势、输出结果等 provenance 信息,保证计算可追溯、可复现。
- 结果解析:内置解析器自动提取能量、力、应力、能带、态密度等物理量,并存入 AiiDA 数据库。
- 批量与参数扫描:支持对截断能、k 点密度、晶格常数等参数进行批量扫描,便于收敛性测试和相图计算。
3. 安装与环境配置
aiida-qe-app 依赖 AiiDA 核心、Quantum ESPRESSO 可执行文件以及若干 Python 库。推荐使用 conda 或 pip 安装。
# 创建并激活 conda 环境 conda create -n aiida-qe python=3.10 conda activate aiida-qe 安装 AiiDA 核心(推荐使用 2.x 版本) pip install aiida-core==2.5.0 安装 aiida-qe-app pip install aiida-qe-app 初始化 AiiDA 配置文件 aiida-ctl profile init --profile qe-profile 安装 Quantum ESPRESSO 可执行文件(以 Ubuntu 为例) sudo apt install quantum-espresso安装完成后,需要把 QE 可执行文件注册到 AiiDA 中,并配置伪势库。伪势建议使用 SSSP 库,可通过 aiida-pseudo 插件安装。
# 注册 pw.x 可执行文件 aiida-ctl code setup --label pw --computer localhost --remote-abs-path /usr/bin/pw.x 安装 SSSP 伪势库 aiida-pseudo install sssp --version 1.3.0 --family SSSP/1.3/PBE4. 基本语法与工作流调用
aiida-qe-app 的核心入口是QeAppWorkchain及其子类。用户通过构建输入字典并调用工作流即可提交计算。下面是一个最基础的自洽计算示例。
from aiida import load_profile from aiida.orm import StructureData, Dict, KpointsData from aiida.plugins import WorkflowFactory load_profile() 构建结构(以硅为例) import numpy as np cell = np.array([ [0.0, 2.735, 2.735], [2.735, 0.0, 2.735], [2.735, 2.735, 0.0], ]) structure = StructureData(cell=cell) structure.append_atom(position=(0.0, 0.0, 0.0), symbols='Si') structure.append_atom(position=(0.25, 0.25, 0.25), symbols='Si') 构建参数 parameters = Dict(dict={ 'CONTROL': {'calculation': 'scf', 'restart_mode': 'from_scratch'}, 'SYSTEM': {'ecutwfc': 40.0, 'ecutrho': 320.0, 'occupations': 'smearing', 'smearing': 'gaussian', 'degauss': 0.01}, 'ELECTRONS': {'conv_thr': 1e-8, 'mixing_beta': 0.7}, }) 构建 k 点 kpoints = KpointsData() kpoints.set_kpoints_mesh([4, 4, 4]) 提交工作流 QeAppWorkchain = WorkflowFactory('quantum_espresso.app') inputs = { 'structure': structure, 'parameters': parameters, 'kpoints': kpoints, 'pseudos': {'Si': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'metadata': {'label': 'Si-scf-test'}, } result = QeAppWorkchain.submit(inputs) print(f'工作流提交成功,PK = {result.pk}')工作流提交后,可以通过verdi process list查看状态,通过verdi process show <pk>查看详情,通过verdi calcjob output <pk>查看输出文件。
5. 常用参数详解
aiida-qe-app 的参数体系与 Quantum ESPRESSO 的输入卡片一一对应,同时增加了一些 AiiDA 特有的控制参数。下面按类别说明。
5.1 结构相关参数
- structure:AiiDA 的 StructureData 对象,包含晶胞和原子坐标。
- pseudos:字典,键为元素符号,值为伪势家族名或 UUID。
5.2 计算控制参数
- parameters:Dict 对象,对应 QE 的 &CONTROL、&SYSTEM、&ELECTRONS 等卡片。
- kpoints:KpointsData 对象,定义 k 点网格或路径。
- code:字符串或 Code 对象,指定使用的 QE 可执行文件。
5.3 工作流级参数
- relax_type:可选 'none'、'positions'、'cell'、'positions_cell',控制结构优化类型。
- max_iterations:结构优化最大迭代次数。
- convergence_threshold:力与应力的收敛阈值。
- protocol:预置的精度协议,如 'fast'、'moderate'、'precise',可快速设置截断能和 k 点密度。
下表总结了常用参数及其默认值。
| 参数名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| relax_type | str | none | 结构优化类型 |
| protocol | str | moderate | 精度协议 |
| ecutwfc | float | 由 protocol 决定 | 平面波截断能(Ry) |
| ecutrho | float | 由 protocol 决定 | 电荷密度截断能(Ry) |
| kpoints_mesh | list | 由 protocol 决定 | k 点网格 |
| conv_thr | float | 1e-8 | 电子自洽收敛阈值 |
| smearing | str | gaussian | 展宽方法 |
| degauss | float | 0.01 | 展宽宽度(Ry) |
6. 9 个实际应用案例
案例 1:硅的晶格常数优化
通过扫描晶格常数,找到能量最低点,确定平衡晶格常数。这是最基础的收敛性测试。
from aiida.orm import load_node from aiida.plugins import WorkflowFactory QeAppWorkchain = WorkflowFactory('quantum_espresso.app') lattice_constants = [5.40, 5.43, 5.46, 5.49, 5.52] for a in lattice_constants: structure = StructureData(cell=[[0, a/2, a/2], [a/2, 0, a/2], [a/2, a/2, 0]]) structure.append_atom(position=(0, 0, 0), symbols='Si') structure.append_atom(position=(a/4, a/4, a/4), symbols='Si') inputs = { 'structure': structure, 'parameters': Dict(dict={'CONTROL': {'calculation': 'scf'}, 'SYSTEM': {'ecutwfc': 40, 'ecutrho': 320}}), 'kpoints': KpointsData().set_kpoints_mesh([6, 6, 6]), 'pseudos': {'Si': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'metadata': {'label': f'Si-a-{a}'}, } QeAppWorkchain.submit(inputs)案例 2:水的结构优化
对水分子进行结构优化,固定晶胞,只优化原子位置。
# 构建水分子结构 structure = StructureData(cell=[[10, 0, 0], [0, 10, 0], [0, 0, 10]]) structure.append_atom(position=(0, 0, 0), symbols='O') structure.append_atom(position=(0.957, 0, 0), symbols='H') structure.append_atom(position=(-0.240, 0.927, 0), symbols='H') inputs = { 'structure': structure, 'parameters': Dict(dict={ 'CONTROL': {'calculation': 'relax'}, 'SYSTEM': {'ecutwfc': 50, 'ecutrho': 400, 'occupations': 'fixed'}, 'ELECTRONS': {'conv_thr': 1e-8}, }), 'kpoints': KpointsData().set_kpoints_mesh([1, 1, 1]), 'pseudos': {'O': 'SSSP/1.3/PBE', 'H': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'relax_type': 'positions', 'metadata': {'label': 'H2O-relax'}, } QeAppWorkchain.submit(inputs)案例 3:能带结构计算
先做自洽计算,再沿高对称路径计算能带。aiida-qe-app 提供了专门的能带工作流。
from aiida.plugins import WorkflowFactory BandsWorkchain = WorkflowFactory('quantum_espresso.app.bands') inputs = { 'structure': structure, 'parameters': Dict(dict={'CONTROL': {'calculation': 'scf'}, 'SYSTEM': {'ecutwfc': 40}}), 'kpoints': KpointsData().set_kpoints_mesh([6, 6, 6]), 'pseudos': {'Si': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'metadata': {'label': 'Si-bands'}, } BandsWorkchain.submit(inputs)案例 4:态密度(DOS)计算
在自洽计算基础上,用更密的 k 点网格计算态密度。
DosWorkchain = WorkflowFactory('quantum_espresso.app.dos') inputs = { 'structure': structure, 'parameters': Dict(dict={'CONTROL': {'calculation': 'scf'}, 'SYSTEM': {'ecutwfc': 40}}), 'kpoints': KpointsData().set_kpoints_mesh([12, 12, 12]), 'pseudos': {'Si': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'metadata': {'label': 'Si-dos'}, } DosWorkchain.submit(inputs)案例 5:截断能收敛性测试
扫描不同 ecutwfc,观察总能量变化,确定收敛的截断能。
ecutwfc_list = [20, 30, 40, 50, 60] for ecut in ecutwfc_list: inputs = { 'structure': structure, 'parameters': Dict(dict={'CONTROL': {'calculation': 'scf'}, 'SYSTEM': {'ecutwfc': ecut, 'ecutrho': 8*ecut}}), 'kpoints': KpointsData().set_kpoints_mesh([6, 6, 6]), 'pseudos': {'Si': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'metadata': {'label': f'Si-ecut-{ecut}'}, } QeAppWorkchain.submit(inputs)案例 6:k 点密度收敛性测试
扫描不同 k 点网格密度,检查总能和力的收敛情况。
kmesh_list = [[2, 2, 2], [4, 4, 4], [6, 6, 6], [8, 8, 8]] for kmesh in kmesh_list: inputs = { 'structure': structure, 'parameters': Dict(dict={'CONTROL': {'calculation': 'scf'}, 'SYSTEM': {'ecutwfc': 40}}), 'kpoints': KpointsData().set_kpoints_mesh(kmesh), 'pseudos': {'Si': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'metadata': {'label': f'Si-kmesh-{kmesh[0]}'}, } QeAppWorkchain.submit(inputs)案例 7:表面能计算
构建 slab 模型,计算表面能。需要先优化 slab 结构,再计算体相能量。
# 构建 Al(100) 表面 slab structure = StructureData(cell=[[4.05, 0, 0], [0, 4.05, 0], [0, 0, 20]]) # 添加 Al 原子层(此处省略具体坐标) # ... inputs = { 'structure': structure, 'parameters': Dict(dict={'CONTROL': {'calculation': 'relax'}, 'SYSTEM': {'ecutwfc': 40}}), 'kpoints': KpointsData().set_kpoints_mesh([6, 6, 1]), 'pseudos': {'Al': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'relax_type': 'positions', 'metadata': {'label': 'Al-100-slab'}, } QeAppWorkchain.submit(inputs)案例 8:吸附能计算
计算分子在表面的吸附能,需要分别计算吸附体系、干净表面和自由分子的能量。
# 吸附体系 inputs_ads = { 'structure': structure_ads, # 吸附结构 'parameters': Dict(dict={'CONTROL': {'calculation': 'relax'}, 'SYSTEM': {'ecutwfc': 40}}), 'kpoints': KpointsData().set_kpoints_mesh([4, 4, 1]), 'pseudos': {'Al': 'SSSP/1.3/PBE', 'H': 'SSSP/1.3/PBE'}, 'code': 'pw@localhost', 'relax_type': 'positions', 'metadata': {'label': 'H-ads-on-Al'}, } QeAppWorkchain.submit(inputs_ads) # 干净表面和自由分子的计算类似,此处省略《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。