aiida-vasp 完全指南及实战案例
摘要:本文系统介绍 AiiDA 生态中的 VASP 插件 aiida-vasp,涵盖其核心功能定位、环境安装与配置、WorkChain 与 CalcJob 的语法结构、关键输入参数说明,并通过 16 个由浅入深的实际应用案例演示从单点能计算到自动化高通量工作流的完整实践路径,最后总结常见报错与使用注意事项。
一、aiida-vasp 是什么
aiida-vasp 是 AiiDA 官方生态中用于驱动 VASP(Vienna Ab initio Simulation Package)的插件包。它把 VASP 这个"命令行黑盒"封装成 AiiDA 的CalcJob,并在其上构建了一整套WorkChain,用于自动化完成结构优化、静态计算、能带、态密度、声子、弹性常数、缺陷形成能等常见第一性原理任务。
它的核心价值不在于"能跑 VASP",而在于把 VASP 计算变成可追溯、可复现、可组合、可并行的数据流节点。每一次计算都会在 AiiDA 数据库中留下完整的输入、输出、代码版本、参数和文件血缘关系。
1.1 主要功能模块
| 模块 | 作用 |
|---|---|
aiida_vasp.calcs.vasp | 基础 VaspCalculation,负责生成 INCAR/POSCAR/KPOINTS/POTCAR 并提交 VASP |
aiida_vasp.parsers | 解析 OUTCAR、vasprun.xml、DOSCAR、EIGENVAL 等输出文件 |
aiida_vasp.workchains | 提供 vasp.relax、vasp.base、vasp.converge 等 WorkChain |
aiida_vasp.data | 定义 VaspPotential、VaspKpointsData 等专用数据类型 |
aiida_vasp.commands | 提供aiida-vasp命令行工具,用于势函数安装、工作流启动等 |
1.2 与 AiiDA 的关系
aiida-vasp 依赖 AiiDA 核心(aiida-core)提供节点存储、进程管理和数据库后端。因此使用前必须先完成 AiiDA 的 profile 初始化,并保证verdi status全部为绿色。
二、安装与环境配置
2.1 前置条件
- Python 3.9 及以上版本
- 已安装并可正常运行的 VASP 可执行文件(
vasp_std、vasp_gam、vasp_ncl) - 已初始化的 AiiDA profile
- 可用的 HPC 调度器(本地运行可跳过)
2.2 安装步骤
# 建议在独立虚拟环境中安装 python -m venv aiida-vasp-env source aiida-vasp-env/bin/activate 安装 AiiDA 核心 pip install aiida-core 安装 aiida-vasp pip install aiida-vasp 初始化 AiiDA profile verdi quicksetup --profile vasp-demo 检查环境 verdi status2.3 注册 VASP 代码
verdi code create core.code.installed \ --label vasp-std \ --computer localhost \ --remote-abs-path /opt/vasp/bin/vasp_std \ --default-calc-job-plugin vasp.vasp2.4 安装赝势
# 从本地 POTCAR 目录导入 aiida-vasp potcar uploadfamily \ --path /path/to/potpaw_PBE \ --name PBE \ --description "PBE PAW potentials"安装完成后可用aiida-vasp potcar listfamilies查看已注册的势函数族。
三、核心语法与参数说明
3.1 基础计算:VaspCalculation
from aiida.engine import submit from aiida.orm import Dict, StructureData, load_code from aiida.plugins import CalculationFactory VaspCalculation = CalculationFactory('vasp.vasp') builder = VaspCalculation.get_builder() builder.code = load_code('vasp-std') builder.structure = StructureData # 已存入数据库的结构节点 builder.parameters = Dict({ 'incar': { 'ENCUT': 520, 'ISMEAR': 0, 'SIGMA': 0.05, 'EDIFF': 1e-6, 'LWAVE': False, 'LCHARG': False, }, 'kpoints': {'mesh': [8, 8, 8], 'offset': [0, 0, 0]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) builder.metadata.options.resources = {'num_machines': 1, 'tot_num_mpiprocs': 16} builder.metadata.options.max_wallclock_seconds = 3600 node = submit(builder)3.2 关键参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
incar | dict | INCAR 标签字典,键为标签名,值为对应设置 |
kpoints.mesh | list | Monkhorst-Pack 网格,如 [8, 8, 8] |
kpoints.offset | list | 网格偏移,通常为 [0, 0, 0] |
kpoints.path | list | 能带计算的高对称路径 |
potential_family | str | 已注册的赝势族名称 |
potential_mapping | dict | 元素符号到赝势文件名的映射 |
settings | dict | 控制解析器行为,如parser_settings |
3.3 常用 WorkChain
- vasp.relax:结构优化,支持
positions、shape、cell三种弛豫模式。 - vasp.base:通用基类,可组合多个计算步骤。
- vasp.converge:自动收敛测试,对 ENCUT 和 K 点进行扫描。
四、16 个实际应用案例
案例 1:硅晶体单点能计算
最基础的入门案例,验证环境是否可用。
from aiida.orm import Dict, load_code, load_node from aiida.engine import run from aiida.plugins import CalculationFactory VaspCalculation = CalculationFactory('vasp.vasp') builder = VaspCalculation.get_builder() builder.code = load_code('vasp-std') builder.structure = load_node(pk=1) # 已导入的 Si 结构 builder.parameters = Dict({ 'incar': {'ENCUT': 400, 'ISMEAR': 0, 'SIGMA': 0.05}, 'kpoints': {'mesh': [6, 6, 6]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) result = run(builder) print(result['output_parameters'].get_dict())案例 2:结构优化(固定体积)
from aiida.plugins import WorkflowFactory RelaxWorkChain = WorkflowFactory('vasp.relax') builder = RelaxWorkChain.get_builder() builder.structure = load_node(pk=1) builder.code = load_code('vasp-std') builder.parameters = Dict({ 'incar': {'ENCUT': 450, 'EDIFFG': -0.01, 'ISIF': 2}, 'kpoints': {'mesh': [6, 6, 6]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) builder.relax = {'perform': True, 'algo': 'cg', 'steps': 100} builder.convergence = {'energy': 1e-4, 'forces': 0.01}案例 3:全晶胞弛豫
设置ISIF=3同时优化原子位置和晶胞形状,适用于未知晶格常数的体系。
builder.parameters = Dict({ 'incar': {'ENCUT': 500, 'EDIFFG': -0.02, 'ISIF': 3, 'NSW': 200}, 'kpoints': {'mesh': [8, 8, 8]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, })案例 4:能带结构计算
# 第一步:自洽计算 scf = VaspCalculation.get_builder() scf.parameters = Dict({ 'incar': {'ENCUT': 500, 'ICHARG': 11, 'ISMEAR': 0}, 'kpoints': {'mesh': [8, 8, 8]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) 第二步:非自洽能带计算 band = VaspCalculation.get_builder() band.parameters = Dict({ 'incar': {'ENCUT': 500, 'ICHARG': 11, 'ISMEAR': 0}, 'kpoints': {'path': [[0, 0, 0], [0.5, 0, 0], [0.5, 0.5, 0]]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, })案例 5:态密度(DOS)计算
builder.parameters = Dict({ 'incar': {'ENCUT': 500, 'ISMEAR': -5, 'LORBIT': 11, 'NEDOS': 2000}, 'kpoints': {'mesh': [12, 12, 12]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) builder.settings = Dict({'parser_settings': {'include': ['dos']}})案例 6:ENCUT 收敛测试
from aiida.plugins import WorkflowFactory ConvergeWorkChain = WorkflowFactory('vasp.converge') builder = ConvergeWorkChain.get_builder() builder.structure = load_node(pk=1) builder.code = load_code('vasp-std') builder.parameters = Dict({ 'incar': {'ISMEAR': 0, 'SIGMA': 0.05}, 'kpoints': {'mesh': [6, 6, 6]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) builder.convergence = {'cutoff': {'start': 300, 'stop': 700, 'step': 50}}案例 7:K 点收敛测试
builder.convergence = {'kpoints': {'start': 4, 'stop': 16, 'step': 2}}案例 8:二维材料真空层设置
from aiida.orm import StructureData import numpy as np 在 c 方向增加 15 Å 真空层 structure = load_node(pk=1).get_structure() new_cell = np.array(structure.cell) new_cell[2][2] += 15.0 new_structure = StructureData(cell=new_cell) for site in structure.sites: new_structure.append_atom(position=site.position, symbols=site.kind_name) builder.structure = new_structure builder.parameters = Dict({ 'incar': {'ENCUT': 500, 'ISMEAR': 0, 'SIGMA': 0.05, 'LVHAR': True}, 'kpoints': {'mesh': [12, 12, 1]}, 'potential_family': 'PBE', 'potential_mapping': {'Mo': 'Mo', 'S': 'S'}, })案例 9:自旋极化计算
builder.parameters = Dict({ 'incar': {'ENCUT': 500, 'ISPIN': 2, 'MAGMOM': [5.0, 5.0], 'ISMEAR': 0}, 'kpoints': {'mesh': [8, 8, 8]}, 'potential_family': 'PBE', 'potential_mapping': {'Fe': 'Fe'}, })案例 10:DFT+U 计算
builder.parameters = Dict({ 'incar': { 'ENCUT': 500, 'LDAU': True, 'LDAUTYPE': 2, 'LDAUL': [2, -1], 'LDAUU': [4.0, 0.0], 'LDAUJ': [0.0, 0.0], 'ISPIN': 2, }, 'kpoints': {'mesh': [6, 6, 6]}, 'potential_family': 'PBE', 'potential_mapping': {'Ni': 'Ni', 'O': 'O'}, })案例 11:弹性常数计算
builder.parameters = Dict({ 'incar': {'ENCUT': 600, 'ISIF': 3, 'IBRION': 6, 'NFREE': 2, 'POTIM': 0.015}, 'kpoints': {'mesh': [10, 10, 10]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, })案例 12:声子计算(有限位移法)
# 先生成 2x2x2 超胞 from aiida.orm import StructureData supercell = load_node(pk=1).get_structure().get_pymatgen().copy() supercell.make_supercell([2, 2, 2]) builder.structure = StructureData(pymatgen=supercell) builder.parameters = Dict({ 'incar': {'ENCUT': 500, 'IBRION': 6, 'NFREE': 2, 'POTIM': 0.015}, 'kpoints': {'mesh': [4, 4, 4]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, })案例 13:缺陷形成能计算
# 构建含空位的超胞 structure = load_node(pk=1).get_structure().get_pymatgen().copy() structure.make_supercell([2, 2, 2]) structure.remove_sites([0]) # 移除第一个原子形成空位 builder.structure = StructureData(pymatgen=structure) builder.parameters = Dict({ 'incar': {'ENCUT': 500, 'ISMEAR': 0, 'SIGMA': 0.05, 'ISPIN': 2}, 'kpoints': {'mesh': [4, 4, 4]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, })案例 14:批量提交多结构计算
from aiida.engine import submit from aiida.orm import QueryBuilder, StructureData qb = QueryBuilder() qb.append(StructureData, filters={'label': {'like': 'candidate-%'}}) nodes = [] for (structure,) in qb.iterall(): builder = VaspCalculation.get_builder() builder.code = load_code('vasp-std') builder.structure = structure builder.parameters = Dict({ 'incar': {'ENCUT': 450, 'ISMEAR': 0}, 'kpoints': {'mesh': [6, 6, 6]}, 'potential_family': 'PBE', 'potential_mapping': {'Si': 'Si'}, }) nodes.append(submit(builder)) print(f'已提交 {len(nodes)} 个计算任务')案例 15:结果查询与数据导出
from aiida.orm import QueryBuilder, Dict from aiida.plugins import CalculationFactory VaspCalculation = CalculationFactory('vasp.vasp') qb = QueryBuilder() qb.append(VaspCalculation, tag='calc', project=['id', 'label']) qb.append(Dict, with_incoming='calc', project=['attributes']) for pk, label, params in qb.iterall(): energy = params.get('final_energy') print(f'PK={pk} label={label} energy={energy}')案例 16:自定义 WorkChain 组合多步流程
from aiida.engine import WorkChain, ToContext from aiida.plugins import CalculationFactory VaspCalculation = CalculationFactory('vasp.vasp') class RelaxThenStaticWorkChain(WorkChain): @classmethod def define(cls, spec): super().define(spec) spec.input('structure') spec.input('code') spec.input('parameters') spec.outline( cls.relax, cls.static, cls.results, ) spec.output('final_energy') def relax(self): builder = VaspCalculation.get_builder() builder.code = self.inputs.code builder.structure = self.inputs.structure builder.parameters = self.inputs.parameters return ToContext(relax_calc=self.submit(builder)) def static(self): builder = VaspCalculation.get_builder() builder.code = self.inputs.code builder.structure = self.ctx.relax_calc.outputs.output_structure builder.parameters = self.inputs.parameters return ToContext(static_calc=self.submit(builder)) def results(self): self.out('final_energy', self.ctx.static_calc.outputs.output_parameters)</code></pre> 五、常见错误与使用注意事项 5.1 常见错误 错误信息 原因 解决方法 No potential found for element 赝势族中缺少对应元素 检查 potential_mapping 与已安装势函数族 VASP exited with error code 1 INCAR 参数冲突或结构不合理 查看 OUTCAR 末尾报错信息 Kpoints mesh not compatible K 点网格与晶格对称性冲突 改用 offset 或降低网格密度 ParserError: vasprun.xml not found VASP 未正常结束 检查 max_wallclock_seconds 是否过短 Profile not loaded AiiDA profile 未初始化 执行 verdi quicksetup Code not found 代码未注册或标签错误 用 verdi code list 确认标签 5.2 使用注意事项 参数一致性:同一批计算务必保持 ENCUT、K 点、赝势族一致,否则结果不可比。 资源规划:tot_num_mpiprocs 应与 VASP 的 NCORE 或 KPAR 设置匹配,避免并行效率低下。 磁盘管理:大体系计算会产生大量 WAVECAR/CHGCAR,建议设置 LWAVE=False、LCHARG=False。 收敛判据:结构优化时 EDIFFG 建议设为负值(力判据),如 -0.02。 数据库备份:AiiDA 数据库是核心资产,定期执行 verdi archive create 备份。 版本锁定:生产环境建议固定 aiida-vasp 与 VASP 版本,避免升级导致结果漂移。 错误重试:对偶发的调度器超时,可在 WorkChain 中配置 max_wallclock_seconds 自动续算。 六、总结 aiida-vasp 把 VASP 从"手工调参的脚本集合"升级为"可追溯的自动化计算平台"。掌握其 CalcJob 与 WorkChain 两层抽象后,可以快速搭建从单点能到高通量筛选的完整工作流。建议从案例 1 开始逐步验证环境,再按需扩展到能带、声子、缺陷等复杂场景。《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能,主要包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。