跳转到主要内容

原子模拟代码和工作流程的接口

项目描述

atomistics

Unittest Coverage Status Binder

《atomistics》包包含两个主要组件。一方面,它为原子模拟代码提供接口,这些代码被称为《计算器》。按照字母顺序支持的模拟代码有:

  • Abinit - 平面波密度泛函理论
  • EMT - 有效的介质理论势
  • GPAW - 基于投影增强波方法的密度泛函理论Python代码
  • LAMMPS - 分子动力学
  • Quantum Espresso - 用于电子结构计算的集成开源计算机代码套件
  • Siesta - 电子结构计算和从头分子动力学

对于这些模拟代码中的大多数,atomistics包使用原子模拟环境将底层的C/ C++和Fortran代码与Python编程语言接口连接。尽管如此,这种方法仍然限制了模拟代码的功能,只能计算能量和力,因此通过添加自定义接口,atomistics包可以支持模拟代码的内置功能,如结构优化和分子动力学。

另一方面,atomistics包还提供工作流程来在原子尺度上计算材料属性,这些包括:

  • 状态方程 - 计算平衡性质,如平衡能量、平衡体积、平衡体积模量和其压力导数。
  • 弹性矩阵 - 计算弹性常数和弹性模量。
  • 谐波和准谐波近似 - 根据在phonopy中实现的有限位移方法计算态密度、振动自由能和热膨胀。
  • 分子动力学 - 计算有限温度性质,如热膨胀,包括非谐波贡献。

所有这些工作流程都可以与atomistics包中实现的全部模拟代码相结合。与提供类似功能的原子模拟环境相比,atomistics包的焦点不是重新实现现有功能,而是简化将现有模拟代码与现有工作流程相结合的过程。在这里,phonopy工作流程是一个很好的例子,它能够通过谐波和准谐波近似计算热力学性质。

示例

使用状态方程,利用GPAW模拟代码计算平衡性质,如平衡体积、平衡能量、平衡体积模量和其导数。

from ase.build import bulk
from atomistics.calculators import evaluate_with_ase
from atomistics.workflows import EnergyVolumeCurveWorkflow
from gpaw import GPAW, PW

workflow = EnergyVolumeCurveWorkflow(
    structure=bulk("Al", a=4.05, cubic=True),
    num_points=11,
    fit_type='polynomial',
    fit_order=3,
    vol_range=0.05,
    axes=['x', 'y', 'z'],
    strains=None,
)
task_dict = workflow.generate_structures()
print(task_dict)
>>> {'calc_energy': OrderedDict([
>>>     (0.95, Atoms(symbols='Al4', pbc=True, cell=[3.9813426685908118, 3.9813426685908118, 3.9813426685908118])),
>>>     (0.96, Atoms(symbols='Al4', pbc=True, cell=[3.9952635604153612, 3.9952635604153612, 3.9952635604153612])),
>>>     (0.97, Atoms(symbols='Al4', pbc=True, cell=[4.009088111958974, 4.009088111958974, 4.009088111958974])),
>>>     (0.98, Atoms(symbols='Al4', pbc=True, cell=[4.022817972936038, 4.022817972936038, 4.022817972936038])),
>>>     (0.99, Atoms(symbols='Al4', pbc=True, cell=[4.036454748321015, 4.036454748321015, 4.036454748321015])),
>>>     (1.0, Atoms(symbols='Al4', pbc=True, cell=[4.05, 4.05, 4.05])),
>>>     (1.01, Atoms(symbols='Al4', pbc=True, cell=[4.063455248345461, 4.063455248345461, 4.063455248345461])),
>>>     (1.02, Atoms(symbols='Al4', pbc=True, cell=[4.076821973718458, 4.076821973718458, 4.076821973718458])),
>>>     (1.03, Atoms(symbols='Al4', pbc=True, cell=[4.0901016179023415, 4.0901016179023415, 4.0901016179023415])),
>>>     (1.04, Atoms(symbols='Al4', pbc=True, cell=[4.1032955854717175, 4.1032955854717175, 4.1032955854717175])),
>>>     (1.05, Atoms(symbols='Al4', pbc=True, cell=[4.1164052451001565, 4.1164052451001565, 4.1164052451001565]))
>>> ])}

第一步中初始化了EnergyVolumeCurveWorkflow对象,包括所有生成应变结构的参数以及后续拟合能量体积曲线的参数。这使用户能够在一个地方看到所有相关的参数。初始化后,调用没有额外参数的函数generate_structures()。此函数返回任务字典task_dict,其中包含计算器应执行的任务。在这种情况下,任务是计算11个生成结构的能量calc_energy。每个结构都通过压缩或拉伸的比率进行标记。第二步使用evaluate_with_ase()函数,通过task_dict评估GPAW模拟代码

result_dict = evaluate_with_ase(
    task_dict=task_dict,
    ase_calculator=GPAW(
        xc="PBE",
        mode=PW(300),
        kpts=(3, 3, 3)
    )
)
print(result_dict)
>>> {'energy': {
>>>     0.95: -14.895378072824752,
>>>     0.96: -14.910819737657118,
>>>     0.97: -14.922307241122466,
>>>     0.98: -14.930392279321056,
>>>     0.99: -14.935048569964911,
>>>     1.0: -14.936666396364169,
>>>     1.01: -14.935212782128556,
>>>     1.02: -14.931045138839849,
>>>     1.03: -14.924165445706581,
>>>     1.04: -14.914703574005678,
>>>     1.05: -14.902774559134226
>>> }}

与定义由模拟代码执行的任务的task_dict类似,result_dict总结了计算结果。在这种情况下,计算了特定应变下的能量。通过使用相同的标签对task_dictresult_dict进行排序,EnergyVolumeCurveWorkflow对象能够将计算结果与相应的结构匹配。最后,在第三步中,analyse_structures()函数接收result_dict作为输入,并使用第一步中定义的拟合参数拟合状态方程

fit_dict = workflow.analyse_structures(output_dict=result_dict)
print(fit_dict)
>>> {'poly_fit': array([-9.30297838e-05,  2.19434659e-02, -1.68388816e+00,  2.73605421e+01]),
>>>  'fit_type': 'polynomial',
>>>  'fit_order': 3,
>>>  'volume_eq': 66.44252286131888,
>>>  'energy_eq': -14.93670322204575,
>>>  'bulkmodul_eq': 72.38919826304497,
>>>  'b_prime_eq': 4.45383655040775,
>>>  'least_square_error': 4.432974529908853e-09,
>>>  'volume': [63.10861874999998, 63.77291999999998, ..., 69.75163125000002],
>>>  'energy': [-14.895378072824752, -14.910819737657118, ..., -14.902774559134226]
>>> }

结果返回平衡参数以及多项式参数、拟合这些结果所需的体积和能量集合。在此过程中的重要步骤是,虽然第一步和第二步以及第二步和第三步之间的接口在特定工作流程之外已经明确定义,但初始化EnergyVolumeCurveWorkflow对象的初始参数以及fit_dict的最终输出是特定于工作流程的。

免责声明

尽管我们试图开发一个稳定可靠的软件库,但开发仍然是一个开源项目,根据BSD 3-Clause许可证,不提供任何保证

BSD 3-Clause License

Copyright (c) 2023, Jan Janssen
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:

* Redistributions of source code must retain the above copyright notice, this
  list of conditions and the following disclaimer.

* Redistributions in binary form must reproduce the above copyright notice,
  this list of conditions and the following disclaimer in the documentation
  and/or other materials provided with the distribution.

* Neither the name of the copyright holder nor the names of its
  contributors may be used to endorse or promote products derived from
  this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

文档

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页面