AiiDA插件,用于基于Python的化学模拟框架(PySCF)。
项目描述
aiida-pyscf
一个 AiiDA 插件,用于基于Python的化学模拟框架(PySCF)。
安装
推荐的安装方法是通过 pip
pip install aiida-pyscf
需求
要使用 aiida-pyscf,需要一个配置好的AiiDA配置文件。请参阅 aiida-core的文档 以获取详细说明。
设置
要通过AiiDA使用 aiida-pyscf 插件运行PySCF计算,需要在计算机上配置PySCF的运行位置。请参阅 aiida-core的文档 以获取详细说明。
然后需要配置PySCF代码。以下YAML配置文件可以作为起点
label: pyscf
description: PySCF
computer: localhost
filepath_executable: python
default_calc_job_plugin: pyscf.base
use_double_quotes: false
with_mpi: false
prepend_text: ''
append_text: ''
将内容写入名为 pyscf.yml 的文件中,确保将 computer 的值更新为上一步配置的计算机标签。要配置代码,请执行
verdi code create core.code.installed --config pyscf.yml -n
现在应该已经创建了一个带有标签 pyscf 的代码,该代码将在下面的示例中使用。
示例
平均场计算
默认的计算是执行平均场计算。至少,应该定义结构和平均场方法。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('H2O'))
builder.parameters = Dict({'mean_field': {'method': 'RHF'}})
results, node = run.get_node(builder)
该代码在水分子的几何结构上运行 Hartree-Fock 计算。
主要结果存储在 parameters 输出中,默认包含计算得到的 total_energy 和 forces,分子轨道的详细信息以及一些计时信息。
print(results['parameters'].get_dict())
{
'mean_field': {
'forces': [
[-6.4898366104394e-16, 3.0329042995656e-15, 2.2269765466236],
[1.122487932593e-14, 0.64803103141326, -1.1134882733107],
[-1.0575895664886e-14, -0.64803103141331, -1.1134882733108]
],
'forces_units': 'eV/Å',
'molecular_orbitals': {
'labels': [
'0 O 1s',
'0 O 2s',
'0 O 2px',
'0 O 2py',
'0 O 2pz',
'1 H 1s',
'2 H 1s'
],
'energies': [
-550.86280025028,
-34.375426862456,
-16.629598134599,
-12.323304634736,
-10.637428057751,
16.200273277782,
19.796075801491
],
'occupations': [2.0, 2.0, 2.0, 2.0, 2.0, 0.0, 0.0]
},
'total_energy': -2039.8853743664,
'total_energy_units': 'eV',
},
'timings': {
'total': 1.3238215579768, 'mean_field': 0.47364449803717
},
}
自定义结构
结构的几何形状通过 structure 输入完全定义,该输入由 StructureData 节点提供。任何其他属性,例如电荷和要使用的基组,都可以通过 parameters 输入中的 structure 字典进行指定。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('H2O'))
builder.parameters = Dict({
'mean_field': {'method': 'RHF'},
'structure': {
'basis ': 'sto-3g',
'charge': 0,
}
})
results, node = run.get_node(builder)
用于定义结构的 pyscf.gto.Mole 类 的任何属性都可以通过 structure 字典设置,除了由插件根据 StructureData 输入自动设置的 atom 和 unit 属性。
优化几何形状
可以通过在输入 parameters 中指定 optimizer 字典来优化几何形状。必须指定 solver,目前支持的求解器有 geometric 和 berny。convergence_parameters 接受所选求解器的参数(有关详细信息,请参阅 PySCF 文档)。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('H2O'))
builder.parameters = Dict({
'mean_field': {'method': 'RHF'},
'optimizer': {
'solver': 'geometric',
'convergence_parameters': {
'convergence_energy': 1e-6, # Eh
'convergence_grms': 3e-4, # Eh/Bohr
'convergence_gmax': 4.5e-4, # Eh/Bohr
'convergence_drms': 1.2e-3, # Angstrom
'convergence_dmax': 1.8e-3, # Angstrom
}
}
})
results, node = run.get_node(builder)
优化后的结构以 StructureData 的形式返回,标签为 structure。几何优化轨迹中每个框架的结构和能量以 TrajectoryData 的形式存储,标签为 trajectory。总能量可以通过以下方式检索:
results['trajectory'].get_array('energies')
定位轨道
要计算定位轨道,请在 parameters.localize_orbitals.method 输入中指定所需的方法。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('H2O'))
builder.parameters = Dict({
'mean_field': {'method': 'RHF'},
'localize_orbitals': {'method': 'ibo'}
})
results, node = run.get_node(builder)
支持以下方法:boys、cholesky、edmiston、iao、ibo、lowdin、nao、orth、pipek、vvo。有关更多信息,请参阅 PySCF 文档。
计算 Hessian
为了计算 Hessian,请在 parameters 输入中将 hessian 键指定为空字典。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('H2O'))
builder.parameters = Dict({
'mean_field': {'method': 'RHF'},
'hessian': {}
})
results, node = run.get_node(builder)
计算得到的 Hessian 将作为带有 hessian 链接标签的 ArrayData 节点附加。使用 node.outputs.hessian.get_array('hessian') 将计算得到的 Hessian 作为 numpy 数组检索以进行进一步处理。
将哈密顿量写入FCIDUMP文件
要指示计算将 Hamiltonian 的表示写入 FCIDUMP 文件,请将 fcidump 字典添加到 parameters 输入中。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('N2'))
builder.parameters = Dict({
'mean_field': {'method': 'RHF'},
'fcidump': {
'active_spaces': [[5, 6, 8, 9]],
'occupations': [[1, 1, 1, 1]]
}
})
results, node = run.get_node(builder)
active_spaces 和 occupations 键是必需的,并且每个都接受一个整数列表的列表。列表中的每个元素都会为相应的活跃空间和轨道的占据生成一个 FCIDUMP 文件。active_spaces 和 occupations 数组的形状必须相同。
生成的 FCIDUMP 文件作为 fcidump 命名空间中的 SinglefileData 输出节点附加,标签由列表中相应活跃空间的索引确定。
print(results['fcidump']['active_space_0'].get_content())
&FCI NORB= 4,NELEC= 4,MS2=0,
ORBSYM=1,1,1,1,
ISYM=1,
&END
0.5832127121682998 1 1 1 1
0.5359642500498074 1 1 2 2
-2.942091015256668e-15 1 1 3 2
0.5381290185905914 1 1 3 3
-3.782672959584676e-15 1 1 4 1
...
生成 CUBE 文件
pyscf.tools.cubegen 模块提供用于计算系统各种属性并将其写入 CUBE 文件的函数。目前,PyscfCalculation 插件支持以下计算:
- 分子轨道
- 电荷密度
- 分子静电势
要指示计算将任何这些量的表示写入 CUBE 文件,请将 cubegen 字典添加到 parameters 输入中。
from ase.build import molecule
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code
builder = load_code('pyscf').get_builder()
builder.structure = StructureData(ase=molecule('N2'))
builder.parameters = Dict({
'mean_field': {'method': 'RHF'},
'cubegen': {
'orbitals: {
'indices': [5, 6],
'parameters': {
'nx': 40,
'ny': 40,
'nz': 40,
}
},
'density': {
'parameters': {
'resolution': 300,
}
},
'mep': {
'parameters': {
'resolution': 300,
}
}
}
})
results, node = run.get_node(builder)
在 orbitals 子字典中必须指定 indices 键,它接受一个整数列表,表示应写入文件的分子轨道的索引。可以在 parameters 子字典中提供其他参数(有关详细信息,请参阅PySCF 文档)。对于 density 和 mep 字典,parameters 子字典是可选的。要计算电荷密度和分子静电势,分别需要为 density 和 mep 键提供一个空字典。
生成的 CUBE 文件作为 SinglefileData 输出节点附加在 cubegen 命名空间中,具有 orbitals、density 和 mep 子命名空间。对于 orbitals 子命名空间,标签由相应的分子轨道索引确定
print(results['cubegen']['orbitals']['mo_5'].get_content())
Orbital value in real space (1/Bohr^3)
PySCF Version: 2.1.1 Date: Sun Apr 2 15:59:19 2023
2 -3.000000 -3.000000 -4.067676
40 0.153846 0.000000 0.000000
40 0.000000 0.153846 0.000000
40 0.000000 0.000000 0.208599
7 0.000000 0.000000 0.000000 1.067676
7 0.000000 0.000000 0.000000 -1.067676
-1.10860E-04 -1.56874E-04 -2.16660E-04 -2.92099E-04 -3.84499E-04 -4.94299E-04
-6.20809E-04 -7.62048E-04 -9.14724E-04 -1.07439E-03 -1.23579E-03 -1.39331E-03
...
警告 已知 PySCF 在使用 DHF、DKS、GHF 和 GKS 引用时计算 MEP 会失败。
重启未收敛的计算
插件将自动指导 PySCF 编写检查点文件。如果计算没有收敛,它将以退出状态 410 结束,并将检查点文件作为 SinglefileData 附加到 checkpoint 输出节点。然后可以将此节点作为输入传递给新的计算,从检查点重新开始
failed_calculation = load_node(IDENTIFIER)
builder = failed_calculation.get_builder_restart()
builder.checkpoint = failed_calculation.outputs.checkpoint
submit(builder)
插件将把失败的计算的检查点文件写入工作目录,以便 PySCF 可以从这里开始。
后处理
PyscfCalculation 插件不支持所有 PySCF 功能;它旨在支持大多数计算密集型的功能,如在此例中,能够将计算作为远程计算资源上的 calcjob 脱载。大多数后处理实用程序计算成本低廉,并且由于 API 是 Python,它们可以直接在 AiiDA 工作流程中以 calcfunction 的形式调用。许多 PySCF 实用程序需要系统的 model 作为参数,其中 model 是 PySCF 中使用的主体对象,即以下代码中分配给 mean_field 变量的对象
from pyscf import scf
mean_field = scf.RHF(..)
mean_field.kernel()
kernel 方法通常计算成本很高,但它的结果(存储在模型对象中)在 PyscfCalculation 结束时丢失,因为 calcjob 的 Python 解释器关闭,并且 mean_field 对象不再存在。这会迫使后处理代码从头开始重建模型并重新运行昂贵的内核。因此,PyscfCalculation 将计算出的 PySCF 模型序列化,并将其存储为带有链接标签 model 的 PickledData 输出节点,在归因图中。这允许在另一个 Python 解释器中重新创建模型,并使其可用于后处理
from pyscf.hessian import thermo
node = load_node() # Load the completed `PyscfCalculation`
mean_field = node.outputs.model.load() # Reconstruct the model by calling the `load()` method
hessian = mean_field.Hessian().kernel()
freq_info = thermo.harmonic_analysis(mean_field.mol, hessian)
自动错误恢复
PySCF 计算可能无法以预期结果结束的原因有很多。例如,自洽场循环无法收敛或作业因调度程序杀死而超出了请求的 walltime。PyscfBaseWorkChain 被设计成在可能的情况下自动从这些错误中恢复。它是围绕 PyscfCalculation 插件的一个简单包装,如果前一次迭代失败,则自动重新启动新的 PyscfCalculation。启动 PyscfBaseWorkChain 几乎与直接启动 PyscfCalculation 一样;输入只需在 pyscf 命名空间内“嵌套”即可
from aiida.engine import run
from aiida.orm import Dict, StructureData, load_code, load_node
from aiida_pyscf.workflows.base import PyscfBaseWorkChain
from ase.build import molecule
builder = PyscfBaseWorkChain.get_builder()
builder.pyscf.code = load_code('pyscf')
builder.pyscf.structure = StructureData(ase=molecule('H2O'))
builder.pyscf.parameters = Dict({
'mean_field': {
'method': 'RHF',
'max_cycle': 3,
}
})
results, node = run.get_node(builder)
在此示例中,我们故意将自洽场循环的最大迭代次数设置为 3(《'mean_field.max_cycle' = 3》),这将导致第一次迭代无法达到收敛。PyscfBaseWorkChain 检测到错误,由 PyscfCalculation 上的退出状态 410 标识,并自动从保存的检查点重新启动计算。经过三次迭代,计算收敛
$ verdi process status IDENTIFIER
PyscfBaseWorkChain<30126> Finished [0] [2:results]
├── PyscfCalculation<30127> Finished [410]
├── PyscfCalculation<30132> Finished [410]
└── PyscfCalculation<30137> Finished [0]
以下错误模式目前由 PyscfBaseWorkChain 处理:
120:超出运行时间:如果可用,计算将从最后一个检查点重新启动,否则工作链将终止140:节点故障:计算将从最后一个检查点重新启动410:电子收敛未实现:计算将从最后一个检查点重新启动500:离子收敛未实现:几何优化未收敛,计算将从最后一个检查点和结构重新启动
序列化的模型
PyscfCalculation 的主要目标是解决给定结构的平均场问题。这一步骤的结果,通常计算成本较高,存储在主脚本中的 mean_field_run 变量中
mean_field = scf.RHF(structure)
density_matrix = mean_field.from_chk('restart.chk')
mean_field_run = mean_field.run(density_matrix)
可以使用 mean_field_run 对象在 PySCF 中实现许多后续后处理操作。为了保持 PyscfCalculation 接口简单,并非所有这些功能都得到支持。然而,一旦计算作业完成,mean_field_run 变量就会丢失,无法再用于进一步处理。
作为解决方案,PyscfCalculation 将 mean_field_run 对象 "pickle" 并将其附加到计算的 model 输出。可以“unpickle” model 输出节点以恢复原始的 mean_field_run 对象,以便用于进一步处理
from aiida.engine import run
inputs = {}
results, node = run.get_node(PyscfCalculation, **inputs)
mean_field = node.outputs.model.load()
print(mean_field.e_tot)
警告 对于某些情况,计算可能无法 pickle 模型并引发异常。在这种情况下,可以将
PyscfCalculation的pickle_model输入设置为False。
贡献
此项目欢迎贡献和建议。大多数贡献需要您同意贡献者许可协议(CLA),声明您有权,并且实际上确实授予我们使用您的贡献的权利。有关详细信息,请访问 https://cla.opensource.microsoft.com。
当您提交拉取请求时,CLA 机器人将自动确定您是否需要提供 CLA,并相应地装饰 PR(例如,状态检查,评论)。只需遵循机器人提供的说明即可。您只需在整个使用我们的 CLA 的所有存储库中执行此操作一次。
此项目已采用 Microsoft 开源行为准则。有关更多信息,请参阅 行为准则常见问题解答 或联系 opencode@microsoft.com 以提出任何额外的问题或评论。
商标
此项目可能包含项目、产品或服务的商标或徽标。Microsoft 商标或徽标的授权使用必须遵守并遵循 Microsoft 的商标和品牌指南。在此项目的修改版本中使用 Microsoft 商标或徽标不得引起混淆或暗示 Microsoft 赞助。第三方商标或徽标的任何使用均受这些第三方政策的约束。
项目详情
下载文件
下载适合您平台的自定义文件。如果您不确定要选择哪个,请了解更多关于 安装软件包 的信息。
源分布
构建分布
aiida_pyscf-0.5.1.tar.gz的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | 38d14e1d4cb8a6152b69a82e8eff682ce61cef07e2028373f251a3462540e572 |
|
| MD5 | e8fa061bb7edcb128a1ec798df7e88e8 |
|
| BLAKE2b-256 | 2cb6dcd9abc0f990c1f8e9803900ea74c3560d282a5777b96e4c3c9c6cdc5d17 |
aiida_pyscf-0.5.1-py3-none-any.whl的哈希值
| 算法 | 哈希摘要 | |
|---|---|---|
| SHA256 | b3134a900f0736943f5ea4d86abbac78e4c320ff5f70794fd7730368e92cc2c9 |
|
| MD5 | 3facbcc443f726e001f30e2ef79c6485 |
|
| BLAKE2b-256 | f754577fa1817285b50f7ab70df0bcac9f83f00c133cf1eb7ee7b792e068e850 |