1. 引言
aiida-siesta 是 AiiDA(Automated Interactive Infrastructure and Database for Computational Science)生态中用于管理 SIESTA 第一性原理计算的工作流插件。它把 SIESTA 的输入准备、任务提交、结果解析和数据结构化存储整合到 AiiDA 的图数据库中,让科研人员可以用 Python 脚本声明式地描述计算流程,并自动追踪每一步计算的数据血缘关系。
本文将从功能特性、安装方法、核心语法与参数、9 个实际应用案例,以及常见错误与使用注意事项五个方面,系统介绍 aiida-siesta 包的使用方法。
2. 功能概述
aiida-siesta 的核心价值在于把 SIESTA 计算纳入 AiiDA 的可复现工作流体系。它主要提供以下能力:
- 输入结构化:将 SIESTA 的 .fdf 输入文件解析为 AiiDA 数据类型,支持结构、基组、赝势、k 点网格等参数的显式声明。
- 任务提交与监控:通过 AiiDA 的 daemon 机制提交 SIESTA 计算,自动轮询任务状态并收集输出。
- 结果解析:从 .out 文件和 XML 输出中提取能量、力、应力、态密度、能带等物理量,存入数据库。
- 工作流编排:支持构建多步工作流,例如结构优化后自动计算态密度、能带或输运性质。
- 数据可追溯:每个计算结果都记录完整的输入参数、代码版本和环境信息,便于复现与共享。
3. 安装方法
3.1 环境准备
aiida-siesta 依赖 Python 3.8 及以上版本,并需要先安装 AiiDA 核心包。推荐使用 conda 或 venv 创建独立环境,避免与系统 Python 冲突。
conda create -n aiida-siesta python=3.9 conda activate aiida-siesta3.2 安装 AiiDA 核心
pip install aiida-core3.3 安装 aiida-siesta 插件
pip install aiida-siesta安装完成后,需要初始化 AiiDA 配置文件并启动 daemon:
verdi setup verdi daemon start3.4 注册 SIESTA 可执行文件
在 AiiDA 中注册本机安装的 siesta 可执行文件,作为计算代码(Code)节点:
verdi code create core.code.installed --label siesta --description "SIESTA DFT code" --on-computer --computer=localhost --filepath=/path/to/siesta --prepend-text='module load siesta'其中--filepath指向 siesta 可执行文件的绝对路径,--prepend-text用于加载必要的环境模块。
4. 核心语法与参数
4.1 构建输入结构
aiida-siesta 使用 AiiDA 的StructureData描述晶体结构,可以通过 ASE 或直接指定晶格矢量和原子坐标构建:
from aiida.orm import StructureData from ase.build import bulk atoms = bulk('Si', 'diamond', a=5.43) structure = StructureData(ase=atoms) structure.store()4.2 设置 SIESTA 输入参数
SIESTA 的输入参数通过Dict节点传递,键值对与 .fdf 文件中的参数一一对应:
from aiida.orm import Dict params = Dict({ 'SystemName': 'Silicon bulk', 'SystemLabel': 'Si', 'NumberOfAtoms': 2, 'NumberOfSpecies': 1, 'MeshCutoff': '200 Ry', 'kgrid_Monkhorst_Pack': [[4, 4, 4, 0, 0, 0]], 'xc_functional': 'LDA', 'SolutionMethod': 'diagon', 'ElectronicTemperature': '100 K', 'MaxSCFIterations': 200, 'DM.MixingWeight': 0.1, }) params.store()4.3 指定基组与赝势
基组和赝势分别通过BasisSet和PseudoFamily管理。aiida-siesta 内置了对常见赝势库的支持:
from aiida_siesta.data.psml import PsmlData from aiida_siesta.data.basis import BasisSet pseudo = PsmlData(file='/path/to/Si.psml') basis = BasisSet(file='/path/to/Si.basis') pseudo.store() basis.store()4.4 组装并提交计算
from aiida_siesta.calculations.siesta import SiestaCalculation from aiida.engine import run builder = SiestaCalculation.get_builder() builder.structure = structure builder.parameters = params builder.code = code_siesta builder.pseudos = {'Si': pseudo} builder.basis = basis builder.metadata.options.resources = {'num_machines': 1, 'num_mpiprocs': 4} builder.metadata.options.max_wallclock_seconds = 3600 result = run(builder)4.5 常用参数速查表
| 参数名 | 类型 | 说明 | 示例值 |
|---|---|---|---|
| MeshCutoff | str | 实空间网格截断能 | 200 Ry |
| kgrid_Monkhorst_Pack | list | k 点网格及偏移 | [[4,4,4,0,0,0]] |
| xc_functional | str | 交换关联泛函 | LDA / GGA |
| SolutionMethod | str | 电子求解方法 | diagon / OMM |
| ElectronicTemperature | str | 电子温度(展宽) | 100 K |
| MaxSCFIterations | int | 最大 SCF 迭代次数 | 200 |
| DM.MixingWeight | float | 密度矩阵混合权重 | 0.1 |
| NumberOfAtoms | int | 原子数目 | 2 |
| NumberOfSpecies | int | 元素种类数 | 1 |
5. 9 个实际应用案例
案例 1:硅晶体的单点能计算
最基础的场景是计算周期性体系的单点能。以金刚石结构硅为例,只需提供结构、基组、赝势和 k 点网格即可:
from aiida.orm import load_code, Dict, StructureData from ase.build import bulk from aiida_siesta.calculations.siesta import SiestaCalculation from aiida.engine import run code = load_code('siesta@localhost') atoms = bulk('Si', 'diamond', a=5.43) structure = StructureData(ase=atoms) params = Dict({ 'MeshCutoff': '200 Ry', 'kgrid_Monkhorst_Pack': [[6, 6, 6, 0, 0, 0]], 'xc_functional': 'LDA', 'SolutionMethod': 'diagon', }) builder = SiestaCalculation.get_builder() builder.structure = structure builder.parameters = params builder.code = code builder.metadata.options.resources = {'num_machines': 1, 'num_mpiprocs': 2} result = run(builder) print(result['output_parameters'].dict.total_energy)案例 2:结构优化与晶格常数确定
通过设置MD.TypeOfRun和MD.VariableCell参数,可以执行晶胞和原子坐标的联合弛豫,从而确定平衡晶格常数:
params = Dict({ 'MeshCutoff': '250 Ry', 'kgrid_Monkhorst_Pack': [[8, 8, 8, 0, 0, 0]], 'xc_functional': 'GGA', 'MD.TypeOfRun': 'cg', 'MD.VariableCell': True, 'MD.MaxCGDispl': '0.1 Bohr', 'MD.MaxForceTol': '0.01 eV/Ang', }) builder.parameters = params result = run(builder) optimized = result['structure'] print(optimized.cell)案例 3:态密度(DOS)计算
在自洽计算收敛后,通过Denchar或直接解析输出文件获取态密度。aiida-siesta 提供了DosWorkchain简化流程:
from aiida_siesta.workflows.dos import DosWorkchain builder = DosWorkchain.get_builder() builder.scf_structure = structure builder.scf_parameters = params builder.scf_code = code result = run(builder) dos_data = result['dos'] print(dos_data.get_x(), dos_data.get_y())案例 4:能带结构计算
能带计算需要先做自洽计算,再沿高对称路径进行非自洽计算。aiida-siesta 的BandWorkchain封装了这一流程:
from aiida_siesta.workflows.band import BandWorkchain builder = BandWorkchain.get_builder() builder.scf_structure = structure builder.scf_parameters = params builder.scf_code = code builder.bands_parameters = Dict({'BandLinesScale': 'ReciprocalLatticeVectors'}) result = run(builder) bands = result['band_structure'] print(bands.get_bands())案例 5:分子动力学模拟
aiida-siesta 支持 NVE 和 NVT 系综的分子动力学模拟,适合研究有限温度下的结构演化:
params = Dict({ 'MeshCutoff': '200 Ry', 'kgrid_Monkhorst_Pack': [[1, 1, 1, 0, 0, 0]], 'MD.TypeOfRun': 'NVT', 'MD.InitialTemperature': '300 K', 'MD.TargetTemperature': '300 K', 'MD.NoseThermostat': True, 'MD.NumMDsteps': 500, 'MD.LengthTimeStep': '1 fs', }) builder.parameters = params result = run(builder) trajectory = result['trajectory'] print(trajectory.get_step_data(step=100))案例 6:弹性常数计算
通过对晶胞施加一系列有限应变并计算应力-应变关系,可以提取弹性常数张量。该案例常结合Workchain批量提交不同应变下的计算:
from aiida.engine import WorkChain, if_, while_ from aiida.orm import Dict class ElasticConstantWorkChain(WorkChain): @classmethod def define(cls, spec): super().define(spec) spec.input('structure', valid_type=StructureData) spec.input('code', valid_type=Code) spec.outline( cls.run_strains, cls.collect_results, ) def run_strains(self): strains = [0.99, 1.00, 1.01] for strain in strains: params = Dict({ 'MeshCutoff': '250 Ry', 'MD.TypeOfRun': 'cg', 'MD.VariableCell': True, 'strain': strain, }) builder = SiestaCalculation.get_builder() builder.structure = self.inputs.structure builder.parameters = params builder.code = self.inputs.code self.submit(builder) def collect_results(self): self.out('done', Dict({'status': 'completed'}))案例 7:表面吸附能计算
研究分子在表面的吸附时,需要分别计算干净表面、自由分子和吸附体系的总能,再求吸附能。aiida-siesta 的数据追踪能力让这一对比变得非常方便:
def adsorption_energy(clean_surface, free_molecule, adsorbed): E_ads = adsorbed - clean_surface - free_molecule return E_ads 三个计算分别提交后,从结果节点读取能量 E_clean = result_clean['output_parameters'].dict.total_energy E_mol = result_mol['output_parameters'].dict.total_energy E_ads = result_ads['output_parameters'].dict.total_energy print('Adsorption energy (eV):', adsorption_energy(E_clean, E_mol, E_ads))案例 8:过渡态搜索(NEB)
aiida-siesta 可以结合 NEB(Nudged Elastic Band)方法搜索化学反应路径的过渡态。通过构建初末态结构并设置 NEB 相关参数实现:
params = Dict({ 'MeshCutoff': '200 Ry', 'kgrid_Monkhorst_Pack': [[1, 1, 1, 0, 0, 0]], 'MD.TypeOfRun': 'NEB', 'NEB.NumImages': 7, 'NEB.SpringConstant': '1.0 eV/Ang^2', 'NEB.ClimbingImage': True, }) builder.parameters = params builder.initial_structure = initial_structure builder.final_structure = final_structure result = run(builder) barrier = result['neb_energy_barrier'] print('Energy barrier (eV):', barrier)案例 9:输运性质计算(结合 TranSIESTA)
aiida-siesta 支持与 TranSIESTA 结合计算量子输运性质,例如纳米器件的电导。该案例需要额外配置 TranSIESTA 代码节点:
from aiida_siesta.calculations.transiesta import TransiestaCalculation builder = TransiestaCalculation.get_builder() builder.structure = device_structure builder.parameters = Dict({ 'MeshCutoff': '200 Ry', 'kgrid_Monkhorst_Pack': [[3, 3, 1, 0, 0, 0]], 'TS.TBT.NumBlocks': 3, 'TS.TBT.Electrodes': ['L', 'R'], }) builder.code = transiesta_code result = run(builder) conductance = result['transmission'] print('Conductance (G0):', conductance.get_conductance())《动手学PyTorch建模与应用:从深度学习到大模型》是一本从零基础上手深度学习和大模型的PyTorch实战指南。全书共11章,前6章涵盖深度学习基础,包括张量运算、神经网络原理、数据预处理及卷积神经网络等;后5章进阶探讨图像、文本、音频建模技术,并结合Transformer架构解析大语言模型的开发实践。书中通过房价预测、图像分类等案例讲解模型构建方法,每章附有动手练习题,帮助读者巩固实战能力。内容兼顾数学原理与工程实现,适配PyTorch框架最新技术发展趋势。