摘要:aiida-tbmodels 是 AiiDA 生态中用于处理紧束缚(Tight-Binding,TB)模型数据的插件包,它把 TB 模型参数、哈密顿量、能带与态密度等计算结果纳入 AiiDA 的可追溯数据图谱。本文系统梳理该包的核心功能、安装步骤、数据节点语法与参数含义,并通过 16 个由浅入深的实际案例演示建模、计算、查询与复用流程,最后总结常见错误与使用注意事项。
一、aiida-tbmodels 是什么
AiiDA 是一个面向计算材料科学的可追溯工作流框架,它通过「数据节点(Data Node)」和「计算节点(CalcJob / WorkChain)」记录每一次计算的输入、输出与代码环境,从而保证结果可复现、可查询、可共享。aiida-tbmodels 则是 AiiDA 插件体系中的一个领域扩展包,专注于紧束缚模型这一类轻量级电子结构方法。
与基于第一性原理的 DFT 计算相比,紧束缚模型以原子轨道为基组,用少量参数描述电子在格点之间的跃迁与在位能量,计算成本极低,适合处理大体系、做参数扫描、构建机器学习训练集,或作为理解能带拓扑与化学成键的直观工具。aiida-tbmodels 的价值在于:把这些「参数化模型」变成 AiiDA 图谱中一等公民的数据对象,让模型参数、结构、计算结果之间形成可查询的关联。
二、核心功能概览
2.1 数据节点封装
该包提供了一组自定义的 AiiDA 数据节点,用于存储紧束缚模型所需的各类信息,典型包括:
- 模型参数节点:保存跃迁积分、在位能量、轨道类型、自旋极化设置等。
- 结构节点:复用 AiiDA 内置的
StructureData,描述晶格、原子位置与周期性边界。 - 结果节点:保存能带、态密度、本征值、占据数等输出数组。
2.2 计算插件与工作流
包内通常包含若干CalcJob与WorkChain实现,把外部紧束缚求解器(如基于 Python 的 TB 求解脚本、Wannier90 接口或自定义哈密顿量构造器)包装成 AiiDA 可调度的计算过程,并自动解析输出文件为结构化数据。
2.3 查询与复用
借助 AiiDA 的 QueryBuilder,用户可以按模型参数、结构化学式、计算状态等条件检索历史计算,快速复用已有参数集,避免重复劳动。
三、安装与环境准备
3.1 前置条件
- Python 3.8 及以上版本(建议 3.9 或 3.10)。
- 已安装并初始化 AiiDA 核心(
aiida-core),且verdi status显示 profile、daemon、数据库均正常。 - 建议使用虚拟环境(venv 或 conda)隔离依赖。
3.2 安装步骤
# 创建并激活虚拟环境 python -m venv aiida-env source aiida-env/bin/activate 安装 AiiDA 核心 pip install aiida-core 安装 aiida-tbmodels pip install aiida-tbmodels 注册插件入口点 verdi plugin list aiida.data | grep tbmodels verdi plugin list aiida.calculations | grep tbmodels3.3 验证安装
python -c "import aiida_tbmodels; print(aiida_tbmodels.__version__)" verdi status若插件列表中出现tbmodels.*相关条目,说明安装成功。若未出现,通常是入口点未刷新,可尝试重新安装:pip install --force-reinstall aiida-tbmodels。
四、核心语法与参数说明
4.1 导入与基础对象
from aiida import load_profile from aiida.orm import StructureData, Dict, List from aiida_tbmodels.data import TbModelData load_profile()4.2 模型参数节点
模型参数通常以字典形式组织,常见键值如下:
| 参数名 | 类型 | 含义 |
|---|---|---|
orbitals | list[str] | 每个格点的轨道标签,如["s"]、["p_x","p_y","p_z"] |
onsite_energies | list[float] | 各轨道在位能量,单位 eV |
hoppings | dict | 跃迁积分,键为 (i, j, R) 形式 |
spin | str | None、"up"、"down"或"polarized" |
lattice | list[list[float]] | 3×3 晶格矢量矩阵,单位 Å |
positions | list[list[float]] | 分数坐标下的原子位置 |
4.3 构造与存储
params = { "orbitals": ["s"], "onsite_energies": [0.0], "hoppings": {(0, 0, (1, 0, 0)): -2.7}, "spin": None, "lattice": [[3.16, 0.0, 0.0], [0.0, 3.16, 0.0], [0.0, 0.0, 3.16]], "positions": [[0.0, 0.0, 0.0]], } model = TbModelData(params) model.store() print(model.pk)4.4 运行计算
from aiida.engine import run from aiida.plugins import CalculationFactory TbCalculation = CalculationFactory("tbmodels.band") inputs = { "model": model, "kpoints": List(list=[[0.0, 0.0, 0.0], [0.5, 0.0, 0.0]]), "metadata": {"options": {"resources": {"num_machines": 1}}}, } results = run(TbCalculation, **inputs) print(results["bands"].get_array("eigenvalues"))五、16 个实际应用案例
案例 1:一维单轨道链的能带
最简模型:一维链,最近邻跃迁 t = -2.7 eV。构造模型后沿 Γ–X 路径取 50 个 k 点,得到余弦型色散,验证插件链路是否打通。
params = { "orbitals": ["s"], "onsite_energies": [0.0], "hoppings": {(0, 0, (1, 0, 0)): -2.7}, "lattice": [[3.0, 0.0, 0.0], [0.0, 10.0, 0.0], [0.0, 0.0, 10.0]], "positions": [[0.0, 0.0, 0.0]], } model = TbModelData(params); model.store()案例 2:二维方格晶格的紧束缚能带
在 x、y 两个方向同时设置最近邻跃迁,得到E(k) = -2t(cos kx + cos ky)的经典结果,可用于教学演示与代码回归测试。
案例 3:石墨烯蜂窝晶格的狄拉克锥
用两个子晶格 A、B 与最近邻跃迁构造蜂窝模型,沿 Γ–K–M 路径计算能带,观察 K 点处的线性交叉,验证模型对拓扑特征的描述能力。
案例 4:多轨道模型与在位能量劈裂
为同一格点设置 s、p 多轨道,并给出不同的在位能量,观察轨道劈裂对能带的影响,演示orbitals与onsite_energies的配合使用。
案例 5:自旋极化计算
设置spin="polarized",分别给出自旋向上与向下的跃迁参数,输出两套本征值,用于研究自旋分裂与磁性趋势。
案例 6:参数扫描与批量提交
from aiida.engine import submit for t in [-1.0, -2.0, -2.7, -3.5]: p = dict(params); p["hoppings"] = {(0, 0, (1, 0, 0)): t} m = TbModelData(p); m.store() submit(TbCalculation, model=m, kpoints=kpoints)通过循环批量提交,把不同跃迁强度下的能带结果统一存入图谱,便于后续对比。
案例 7:态密度计算
在布里渊区均匀撒点,统计本征值分布并做高斯展宽,得到态密度曲线,用于判断带隙与范霍夫奇点位置。
案例 8:带隙自动提取
从能带结果中读取价带顶与导带底,计算最小直接带隙与间接带隙,并把结果写入Dict节点,供后续筛选使用。
案例 9:与 AiiDA 结构节点联动
从StructureData读取晶格与原子位置,自动生成模型参数,避免手工输入坐标导致的不一致。
案例 10:查询历史计算并复用参数
from aiida.orm import QueryBuilder qb = QueryBuilder() qb.append(TbModelData, filters={"attributes.spin": "polarized"}) for (node,) in qb.iterall(): print(node.pk, node.get_description())案例 11:工作流串联——模型构建到能带分析
把「参数生成 → 能带计算 → 带隙提取」封装为WorkChain,一次提交完成全流程,并在失败时自动重试。
案例 12:导出数据用于机器学习训练集
批量导出结构、模型参数与能带特征为 JSON 或 NumPy 数组,构建「结构—电子结构」配对数据集,用于代理模型训练。
案例 13:与 Wannier90 结果对照
把第一性原理拟合得到的 Wannier 跃迁参数导入模型节点,与解析紧束缚结果对比,检验拟合质量。
案例 14:缺陷或掺杂的近似处理
通过修改特定格点的在位能量模拟掺杂效应,快速评估能带移动趋势,为后续 DFT 计算提供初筛。
案例 15:可视化与结果导出
把能带数组导出为 CSV,配合 Matplotlib 绘制能带图;也可将结果节点挂到 AiiDA 的 provenance 图谱中,在浏览器中查看依赖关系。
案例 16:可复现性验证与归档
使用verdi archive create打包整个计算图谱,在另一台机器上导入后重跑,验证结果一致,完成科研数据的归档与共享。
六、常见错误与排查
| 错误现象 | 可能原因 | 解决办法 |
|---|---|---|
ModuleNotFoundError: aiida_tbmodels | 未安装或虚拟环境不一致 | 确认pip list中存在该包,检查 Python 解释器路径 |
| 插件未注册 | 入口点缓存未刷新 | 重新安装包,或执行verdi plugin list检查 |
ProfileNotLoaded | 未调用load_profile() | 在脚本开头加载 profile |
| 节点未存储即使用 | 忘记调用.store() | 所有数据节点在使用前必须存储 |
| k 点格式错误 | 传入的是元组而非列表 | 统一使用List(list=...)包装 |
| 跃迁键格式不匹配 | 键顺序或类型不一致 | 严格使用(i, j, (Rx, Ry, Rz))元组 |
| 计算长时间挂起 | daemon 未启动或资源不足 | 执行verdi daemon start,检查 metadata.options |
七、使用注意事项
- 单位统一:能量统一使用 eV,长度统一使用 Å,避免混用导致结果偏差。
- 版本锁定:AiiDA 与插件版本需匹配,建议在
requirements.txt中固定版本号。 - 参数可追溯:尽量把模型参数存为独立节点而非硬编码在脚本中,保证 provenance 完整。
- k 点收敛测试:态密度与带隙对 k 点密度敏感,正式计算前应做收敛性检查。
- 数据备份:定期使用
verdi archive备份 profile,防止数据库损坏导致数据丢失。 - 文档优先:插件 API 可能随版本演进,使用前查阅对应版本的官方文档与示例仓库。
八、总结
aiida-tbmodels 把紧束缚模型这一轻量级方法接入了 AiiDA 的可追溯体系,使参数化模型也能像第一性原理计算一样被记录、查询与复用。掌握其数据节点结构、参数含义与计算流程后,可以快速构建从模型搭建、批量扫描到结果分析的完整链路,为教学演示、方法预筛和机器学习数据集构建提供高效支撑。
《AI提示工程必知必会》为读者提供了丰富的AI提示工程知识与实战技能,主要包括各类提示词的应用,如问答式、指令式、状态类、建议式、安全类和感谢类提示词,以及如何通过实战演练掌握提示词的使用技巧;使用提示词进行文本摘要、改写重述、语法纠错、机器翻译等语言处理任务,以及在数据挖掘、程序开发等领域的应用;AI在绘画创作上的应用,百度文心一言和阿里通义大模型这两大智能平台的特性与功能,以及市场调研中提示词的实战应用。通过阅读《AI提示工程必知必会》,读者可掌握如何有效利用AI提示工程提升工作效率,创新工作流程,并在职场中脱颖而出。