Atomate文档翻译

Atomate文档

atomate logo

“Civilization advances by extending the number of important operations which we can perform without thinking about them.” - Alfred North Whitehead

atomate

理论和计算是理解和设计材料的强大工具,但是这些常用的计算软件通常难以实现使用,理解以及自动化。通过一些非常简单的操作,atomate将实现复杂的材料科学计算变得简单。atomate的特性如下:

  • 以材料模拟中最新的开源库为基石:pymatgen,custodian和FireWorks。建立这些库以为着atomate不仅仅可以实现简单的计算,对于用户最关心的精确控制和批量计算,也可以应付。
  • 可以轻松获取各种计算材料特性的“标准”工作流程:结构优化,能带结构计算,电子输运计算,介电常数等等。只需提供一种晶体结构,然后交给atomate设置一个完整的计算流程,最终将提供想要的性质。你可以对1,100或者100000个材料使用这套流程。
  • 可以使用非常有表现力的语法,来改变标准的工作流程(不管是改变某些默认参数,或者重组计算流程,添加新计算,移除某些步骤等等)。只需将预先构建的计算步骤连接在一起,即可组成非常复杂的新工作流程。
  • atomate内置了powerups,可以快速对简单的工作流程进行修饰。只需启动该流程,即可实现特性的计算。通过配置文件可以自动设置powerups。
  • 计算的结果保存在大型数据库中,可以检索,分析或者共享数据。
  • 自动保存作业的目录,运行时的参数等详细记录。
  • 作业可以在多种计算系统,各种队列系统和体系架构运行。
  • 为了方便用户使用,atomate定义了标准的接口,用于添加新的计算和工作流程。

注意:Atomate主要是为了与VASP电子结构计算软件一起使用而构建的,但是目的是支持各种软件。比如,FEFF软件集成最近已经添加,其他的计算包也在开发中。

Workflows

img

计算示例:

  • 左边:atomate/VASP 计算GaP能带结构
  • 右边:atomate/FEFF计算$La{0.7}Sr{0.3}MnO_3$ ELNES谱

到2017年六月,可用的标准工作流程:

  • 电子能带结构 (electronic band structures)
  • BoltzTraP
  • 全弹性张量 (full elastic tensor)
  • 状态方程 (equation of state)
  • 压电张量 (piezoelectric tensor)
  • 界电张量 (dielectric tensor)
  • 铁电 (ferroelectricity)
  • NEB (nudged elastic band)
  • 拉曼光谱 (Raman spectroscopy)
  • XAS and EELS 谱 (FEFF 实现)

可以自定义上述任何工作流程。另外,也可通过重复使用上述工作流程中的组件来创建新的工作流程(atomate的接口使这一操作变得简单)。对于VASP软件包,院士的工作流程位于atomate/vasp/workflows/base路径中,而预设的工作流程位于atomate/vasp/workflows/presets. 其他包应具有相应的目录。

基础简介

能带计算的工作流:包含了4个单独的计算(Fireworks),并且每个计算都由多步组成。这个工作流在教程中会详细介绍。

设置和运行计算的基础简介

Atomate自动计算设施的主要功能是帮助用户生成 FireWorks定义的工作流对象。一旦用户有了Workflow对象,他们可以使用Fireworks包以非常通用的方式在各种计算资源上实现存储,管理,组织和执行各种类型的计算。FireWorks文档中提供了Workflow对象机器执行的所有细节。Atomate文档将带您了解如何定义和执行工作流的最重要的点,但要学习所有可能的功能(比如,通过Web界面查看计算状态, 重新分配工作优先级等),需要进一步查看FireWorks文档。

Atomate使用户获取各种计算步骤变得简单。Atomate以极简的方式实现计算,用户只需提供晶体结构,atomate将自动返回整个计算Workflow-甚至对于复杂计算步骤也是如此。因此,atomate将执行模拟和材料分析过程的方法封装到可跨多个计算系统运行的可复用的工作流对象中。此外,atomate还为您提供了多种方法来根据您的需求自定义工作流,从而让您决定自动确定参数还是手动设置参数。这些功能和各种代码的I/O很大程度都依赖于PyMatGen库。

解析计算结果

atomate定义的大多数工作流不仅执行计算,还包含分析输出文件的步骤,还可以选择将结果存储在用户友好的数据库中,以便轻松地索引。Pymatgen提供了许多解析各种文件输出类型的基础设施,其中用于存储数据用的MongoDB。通常,每个计算都由MongoDb的每个文档表示,该文档汇总了重要的输入和输出。Atomate还包含了构建器(builder),这些构建器将来自多个计算的结果组合到更高层次的分析中。一个简单的例子是整合给定晶体结构的所有计算,以提高该结构所有计算特性的报告。atomate中builder包使您可以获取计算结果的高级摘要,在运行大量计算时,这一点尤其重要。注意,数据库中的数据可以通过pymatgen软件包执行画图和其他高级分析。

新特性

可以通过变更日志跟踪atomate的变化。

引用atomate

鼓励应用下面的论文来促进atomate的发展

1
2
3
4
5
6
7
> Mathew, K., Montoya, J. H., Faghaninia, A., Dwarakanath, S., Aykol, M.,
> Tang, H., Chu, I., Smidt, T., Bocklund, B., Horton, M., Dagdelen, J.,
> Wood, B., Liu, Z.-K., Neaton, J., Ong, S. P., Persson, K., Jain, A.,
> Atomate: A high-level interface to generate, execute, and analyze
> computational materials science workflows. Comput. Mater. Sci. 139,
> 140–152 (2017).
>

贡献/联系/支持

略。

安装atomate

下面会引导如何在环境中运行atomate高通量计算流程。atomate基于pymatgen,custodian(调度)和FireWroks来实现材料科学的计算流。简单来说:

  • pymatgen:用来构建输入文件和分析输出
  • custodian:运行模拟代码(VASP),执行错误检查和处理以及实现检查点
  • FireWorks:设计,管理和执行工作流

关于如何atomate如何设计的细节可以参考论文。关于这些不同部分之间相互作用的总数可以参考演示文稿。后面的教程将会介绍如何运行和编写自己的工作流程。首先,将对这些主题进行足够深入的介绍,以帮助您设置并指导您进行故障排除。

假定您已经熟悉Linux Shell和导航。如果还不熟悉,建议您先学习下Linux操作,如果您熟悉Python,这也是极好的,但并不是必须的。

注意,此安装教程是以VASP为中心,并且当前所有的功能都与VASP相关。

目标

  • 在你的计算集群安装和配置atomate
  • 通过一个测试的工作流程(计算能带结构)来验证安装是否成功

安装清单

将下面的清单完成即可实现完整的功能环境。每一项都将深入讲解,这可用于把握全局并对其他系统安装环境也有指导意义。

  1. 先决条件
  2. 创建atomate的目录
  3. 创建一个Python虚拟环境
  4. 安装Python包
  5. 配置FireWorks
  6. 配置pymatgen
  7. 测试WorkFlow

先决条件

在安装之前,你需要确保执行atomate的工作计算机可以(i)运行基本的模拟程序包(例如VASP,LAMMPS,FEFF等),(ii)连接到MongoDB数据库。对于(i),确保具有授权;对于(ii)确保计算中心没有安装防火墙。通常学术计算集群以及具有主节点的架构(比如NERSC)也可以。高安全性的政府超算中心通常需要自定义处理和修改后的执行模式—本教程后续会提供一些详细的安装指南。

VASP

要获得超算上VASP的访问权限,通常需要验证许可证后添加到当前用户组。在开始之前,确保你有权限访问VASP执行文件并确保其功能正常。

MongoDB

MongoDB是一个NoSQL(Not Only SQL)数据库,它将每个数据空调吗作为文档,该文档以JSON格式存储(类似于Python中的字典)。Atomate使用MongoDB来:

  • 存储运行的工作流以及其状态的详细信息(通过FireWorks,必备)
  • 解析输出文件,并生成结算结果的数据库(强烈推荐使用工作流的默认设置,但技术上来说也是可以改的)

注意,可以有多种工具查询信息,包括Mongo数据库中非常有用的工具(比如MongoD命令行,MongoDB的GUI程序)以及pymatgen-db,FireWorks中内置的分析工具以及atomate (通常特定于程序生成的信息)。

不论何时运行工作流程,MongoDB都必须保持可连接状态。因此,强烈建议你使用一台服务器或者使用托管的服务器。以下可作为选择:

  • 使用商业服务来托管MongoDB示例。这是是最容易使用, 并且提供高质量服务,但是是付费的。mLabMongoDB Atlas提供免费的500MB的数据库,如果较大的数据库则需要付费。
  • 联系管理员,了解他们是否提供MongoDB托管(比如NERSC就提供这种服务,Google搜索“request NERSC MongoDB database”)
  • 自建MongoDB服务器

如果是新手,我们建议选择第一或者第二个选项(如果可以的话)。第三个选项可能需要打开网络设置接受外部链接,这有时候会比较麻烦。

下面,创建新的数据库并设置两个用户组:

  • 管理员 (admin)
  • 只读用户 (read-only)

你可能会选择两个单独的数据库,一个用于工作流,一个用于计算结果。我们建议新手将两组数据都保存在一个数据库中,如果遇到特定问题,则仅考虑使用两个数据库。

记下你的配置参数-下面将配置FireWorks以便连接。还有确保记下MongoDB示例的主机名和端口。

注意:执行计算的主机必须可以访问MongoDB服务器。一些计算资源可能有防火墙,这会阻碍访问。尽管对于大部分计算中心这不是问题,可以开发连接端口(尤其是从MOM-style节点,比如NERSC,SDSC等),但有些安全级别高的服务器(比如LLNL,PNNL,ARCHER)可能会遇到问题。如果你连接遇到问题,可以参考:

  • 联系超算中心,了解安全策略,让他们允许连接
  • 将MongoDB数据托管在可以安全连接的计算机上,比如放在超算网络中(需想管理员求助)
  • 使用代理服务来转发MongoDB->登录节点->计算节点(可以试下比如 mongo-proxy工具)
  • 设置ssh隧道来转发允许的计算机连接(允许中, 必须保证该隧道连通)

为atomate创建目录

安装atomate包含代码,配置文件以及各种二进制文件和库文件。因此,创建一个文件来组织这些项目是很高效地。

  1. 登录计算节点,确保相关的Python包安装好。我们墙裂推荐通过rc文件来加载python(比如~/.bashrc 或者 ~/.bashrc.ext NERSC)
  2. 在磁盘某个位置创建一个目录,该目录可以从计算节点快速访问,并且只有你或者写作者可以访问。你的环境和配置文件将放在此处,包括数据库的凭证。我们称其为<>。一个比较好的名字最好是atomate,但是你也可以用其他的名字。
  3. 现在你可以在INSTALL_DIR搭建脚手架,来进一步学习。创建一个名为logs的目录,并进行配置,目录结构应该如下:
1
2
3
atomate
├── config
└── logs

创建Python3的虚拟环境

注意:确保你创建了Python3.6以上的环境,因为最新的atomate仅支持Python3.6+。

我们强烈建议你使用虚拟环境(比如virtualenv或者anaconda)来组织atomate和其他python环境安装。最终,如果你知道自己要做什么,则不一定要使用虚拟环境。虚拟环境允许你爆了Python的安装,并与系统上的python环境隔离。好处是:

  • 不同Python项目的程序包不会冲突
  • 不同Python版本可以共促,并且易于管理(Pyhon2和Python3)
  • 如果你有权限,你可以随时删除包含环境的文件夹并重新安装。在计算集群中,这解决了安装和修改软件包的权限问题。

最简单的方法是使用virtualenv工具,大多数Python发行版本都带有哦virtualenv,但是某些集群可能用的Anaconda,这也是一种不错的版本,他为科学计算而设计,殊途同归。如果服务器使用Anaconda,则遵循相同的步骤,但是需要用conda create创建环境。可以参考anaconda命令行工具以及virtualenv文档。设置虚拟环境:

  1. 进入安装目录,创建虚拟环境。比较好的虚拟环境命名是atomate_env。默认进入虚拟环境的命令行是virtualenv atomate_env,这会在当前目录创建一个atomate_env。
  2. 你可以输入ls查看文件结构:
1
2
3
4
5
6
7
8
9
atomate
├──atomate_env/
├── bin
├── include
├── lib
├── lib64
└── pip-selfcheck.json
├── config
└── logs
  1. 检查下bin文件,会看到几个程序,比如activate,pip,以及Python。lib中包含你需要安装的所有包。如果安装遇到任何问题,只需要删除虚拟环境文件,在重新启动即可。
  2. 通过source <>/atomate_env/bin/activate来激活虚拟环境。这样就会加载虚拟环境的Python版本。如果你有兴趣,可以去详细了解下,激活脚本和改变路径一样神奇。
  3. 考虑将<>/atomate_env/bin/activate 添加到.rc 或者.bash_profile文件中,以便每次登陆时自动运行它。否则,每次登陆必须手动输入命令才能进入环境。

安装python包

你必须在atomate目录安装了Python3环境。厦门,将下载和atomate相关的python包。你可以自动安装或者安装开发模式。开发模式可以方便查看代码,修改代码来满足需求,但是需要更多的设置和维护。使用pip就可以实现自动安装(anaconda则使用conda命令)。安装包,只需执行:

1
pip install atomate

另外,如果你想安装开发模式,参考github

配置数据库连接和计算参数

现在已经安装了必要的一些软件。一切顺利!

下一步是为系统配置一下软件 - 比如,MongoDB配置文件,计算集群以及队列系统等。厦门将设置引导。有关FireWorks的安装和详细信息,参考文档。

注意:所有的路径都必须是绝对路径。比如<>必须是/global/homes/u/username/atomate(请不要使用相对路径 ~/atomate)。

警告:密码必须文本存储!这些文件必须存储在其他未授权用户无法访问的地方。此外,密码最好是随机密码。

在<>/config 创建下面的文件。

db.json

db.json文件告诉atomate MongoDB的路径和密码账号, 该服务器存储工作流程中解析计算结果(即,材料的真实性质输出)。db.json需要输入数据库的基本信息以及保存结果的集合(例如 tasks)和数据库身份验证信息(admin和只读用户)。注意有效的JSON需要在每个字符串条目周围加上双引号,并且所有的条目都应为字符串类型,但“port”对应为整数(不带引号)。

1
2
3
4
5
6
7
8
9
10
11
{
"host": "<<HOSTNAME>>",
"port": <<PORT>>,
"database": "<<DB_NAME>>",
"collection": "tasks",
"admin_user": "<<ADMIN_USERNAME>>",
"admin_password": "<<ADMIN_PASSWORD>>",
"readonly_user": "<<READ_ONLY_PASSWORD>>",
"readonly_password": "<<READ_ONLY_PASSWORD>>",
"aliases": {}
}

my_fworker.yaml

在FireWorks的分布式服务-工人模型中,运行作业的每个计算资源都是一个工作流工人(Worker)。每个工人(比如NERSC或者SDSC或者本地集群)需要一些配置:

  • name参数:来帮助记录-保存计算的路径
  • 两个参数(类别category和队列query):用于控制哪个工人执行计算。默认设置是让所有的计算运行。
  • env参数:用于根据不同的集群配置环境和设置,比如vasp执行文件的路径,临时目录的路径(这取决于你的计算系统)

如果你只计划用一个Worker执行所有计算,那么my_fworker.yaml文件是这样:

1
2
3
4
5
6
7
name: <<WORKER_NAME>>
category: ''
query: '{}'
env:
db_file: <<INSTALL_DIR>>/config/db.json
vasp_cmd: <<VASP_CMD>>
scratch_dir: null

其中,<> 是任意的,用于跟踪运行作业的Worker(比如在NERSC的Edison资源可能叫Edison)。db_file指向db.json文件,用于配置包含连接数据库的参数。<>是并行VASP的命令(比如 srun -n 16 vase, ibrun -n 16 vasp, mpirun -n 16 vase,…)。如果你不知道如何使用或者vasp执行文件是否正确,请检查计算资源的文档或者查看which srun, which vasp_std等输出。可选的是,你可以设置scratch_dir为null意外的其他值,如何存在可以实现快速访问硬盘的特定位置。此项设置’root’为临时目录,将在此根目录中为每个计算创建一个临时目录。临时目录仅在计算时存在。

如果以后要在同一台或者不同计算机上设置多个Worker,则可以使用上面的名称字段或者我们未定义的类别或查询字段,找到有关控制哪个Worker可以运行哪个作业的信息。更多配置多个Worker的形象,请查看FireWorks文档。这些功能运行你对同一台计算机上不同类型的计算使用不同的设置(比如,不同的VASP命令,不同的并行化数量等),或者控制各种计算中心上运行的作业。

my_launchpad.yaml

db.json文件包含了如何连接到不同计算输出数据库的信息。我们必须像FireWorks中server-worker模型中一样使用my_launchpad.yaml配置连接MongoDB的信息。技术上来说,他可以是不同的数据库,但我们将他设置成同一个数据库。

LaunchPad是存储所有FireWorks和工作流的位置。每个Worker都可以在该数据库中查询FireWorks的状态,然后下拉FireWorks将其保留咋队列中并允许作业。下面是my_launchpad.yaml的详细说明(strm_lvl: INFO):

1
2
3
4
5
6
7
8
9
10
host: <<HOSTNAME>>
port: <<PORT>>
name: <<DB_NAME>>
username: <<ADMIN_USERNAME>>
password: <<ADMIN_PASSWORD>>
ssl_ca_file: null
logdir: null
strm_lvl: INFO
user_indices: []
wf_user_indices: []

这里你需要填写:

  • <> MongoDB服务器的host
  • <> MongoDB的端口
  • <> MongoDB数据库的名字
  • <> 和<>有读写权限的用户名和密码

你可以选择设置logdir到你的<>/logs,尽管你不一定需要这个。strm_lvl设置日志的详细程度,如果你的项目变得很大而查询很慢,则可以使用user_indeices 和wf_user_indeices来加快目标数据库的查询速度。

注意:如果你希望对FireWorks和计算输出使用相同的数据库,则这些值很大程度上与db.json一样。如果你使用不同的数据库,则此处信息和db.json不同。

my_qadapter.yaml

为了在一个或多个节点上批量运行VASP作业,通常需要队列系统在计算资源上提交作业。FireWorks可以自动处理某些常见队列系统的通信。与前面一样,这里仅讨论基本配置选项。如果你像本教程那样使用,这基本配置就足够了。

如果确实进行了更改,一个关键的地方就是讲rocket launcher 命令从rapidfire改成singleshot,这将在预定模式中使用。使用qlaunch 和-r参数 (预定模式启动)意味着队列提交和VASP计算之间存在1:1映射。这种模式也比正常启动要复杂一点。可能需要翻一遍FireWorks文档才能了解不同模式的差异,才能做出明智的选择。

SLURM机器中,最简单的my_qadapter.yaml文件如下:

1
2
3
4
5
6
7
8
9
10
11
_fw_name: CommonAdapter
_fw_q_type: SLURM
rocket_launch: rlaunch -c <<INSTALL_DIR>>/config rapidfire
nodes: 2
walltime: 24:00:00
queue: null
account: null
job_name: null
pre_rocket: null
post_rocket: null
logdir: <<INSTALL_DIR>>/logs

_fw_name 设置CommonAdaptor意味着队列是内置的队列系统,_fw_q_type设为SLURM说明使用了SLURM系统。FireWorks支持多个队列系统:

  • PBS/Torque
  • SLURM
  • SGE
  • IBM LoadLeveler

注意: 如果你不确定你的机器使用哪种队列系统,请查看文档。如果队列系统不是上述中的一个,请参考FireWorks文档。FireWorks文档也包含了如何设置在队列中设置作业,以一种交互的方式,这里略过。

nodes,walltime是默认的预定模式参数。queue对于你队列名称。一些计算技巧支持这个,可能是regular,normal,knl等,这取决于计算资源。account根据用户账号来确定。同样,是否需要设置根据计算资源来决定。pre_rocket 和post_rocket是用于在提交脚本作业之前添加几行文字。一个用途是输入指令(比如#SBATCH -C knl,quad,cache),来配置SLURM在knl节点上运行。任何设置为null的参数将不会写入队列文件。

这并不是必须的,但是你想看到队列文件模板,可以在点。所有在my_qadapter.yaml中设置的参数将会填充到模板中。

FW_config.yaml

你可能注意到了,有很多控制FireWorks各方面的配置文件。而主要的配置文件叫FW_config.yaml,他控制了不太的FireWorks的设置,同时也控制了指向其他配置文件的路径。FireWorks更详细的参数设置请参考文档。这边,你只需要简单的告诉FireWorks my_launchpad.yaml, my_qadapter.yaml和my_fworker.yaml的位置,并且并不需要告诉其他文件的位置。

在<>/config文件中建立一个FW_config.yaml:

1
CONFIG_FILE_DIR: <<INSTALL_DIR>>/config

CONFIG_FILE_DIR包含了其他FireWorks的配置文件。

完事

现在目录应该看起来如下:

1
2
3
4
5
6
config
├── db.json
├── FW_config.yaml
├── my_fworker.yaml
├── my_launchpad.yaml
└── my_qadapter.yaml

最后需要做的事情就是将路径加入到RC/bash_profile文件中,来设置一个环节变量,告诉FireWorks.yaml在哪里找到FW_config.yaml。

1
export FW_CONFIG_FILE=<<INSTALL_DIR>>/config/FW_config.yaml

其中<>就是之前的配置文件路径。记住,FW_config.yaml将告诉其他文件的路径。

就这样。你已经完成了FireWorks和atomate的大部分配置。

下面应该检查下确保能连接数据库,可以通过下面命令:

1
lpad reset

返回结果应该如下:

1
2
3
Are you sure? This will RESET 0 workflows and all data. (Y/N) y
2015-12-30 18:00:00,000 INFO Performing db tune-up
2015-12-30 18:00:00,000 INFO LaunchPad was RESET.

配置pymatgen

如果你计划运行VASP,那么最后需要配置一下VASP的赝势文件,可以选择是否配置材料基因的API。

赝势

赝势文件可以在任何地方。为了方便,你可能会拷贝一份到你atomate的路径下(比如 <>/pps),但这并不是必须的。不管赝势文件在哪里,他的目录结构应该如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
pseudopotentials
├── POT_GGA_PAW_PBE
│ ├── POTCAR.Ac.gz
│ ├── POTCAR.Ac_s.gz
│ ├── POTCAR.Ag.gz
│ └── ...
├── POT_GGA_PAW_PW91
│ ├── POTCAR.Ac.gz
│ ├── POTCAR.Ac_s.gz
│ ├── POTCAR.Ag.gz
│ └── ...
└── POT_LDA_PAW
├── POTCAR.Ac.gz
├── POTCAR.Ac_s.gz
├── POTCAR.Ag.gz
└── ...

这个结构是必须的,为了方便pymatgen找到POTCAR文件。进入主目录的隐藏文件(.pmgrc.yaml),可以看到他的内容:

1
PMG_VASP_PSP_DIR: <<INSTALL_DIR>>/pps

如果你使用的非默认泛函,那么需要确认是否支持VASP(比如PBESol),然后在DEFAULT_FUNCTIONAL关键字中设置。

材料基因API

你可以通过登录材料基因获取API Key。并将其加入到.pmgrc.yam文件中:

1
2
PMG_VASP_PSP_DIR: <<INSTALL_DIR>>/pps
PMG_MAPI_KEY: <<YOUR_API_KEY>>

测试Workflow

为了确保所有的都准备好,需要做个测试。有两种办法来构建WorkFlow: (i)通过命令行atwf构建;(ii)通过Python脚本构建。大部分情况,我们推荐使用(ii),因为它更强大,也足够简单。然而,为了不会写代码的用户,我们坚持使用(i)命令行,使用atwf来构建Workflow。注意我们在后续会更多讨论Python来订制的用户的Workflow

理想情况下,你已经设置好了材料基因的API,否则你需要手动导入POSCAR文件来运行。此外,atwf有两中不同的使用方法:1.使用预设函数库atwf来构建Workflow;2.使用文件库来构建。

测试的Workflow将只允许一次优化晶体结构的计算(并不是让人激动)。在后续的教程中,我们将运行更复杂的工作流程。

添加Workflow

下面有四种不同的添加Workflow的方法。你只需在命令行中执行即可;注意不管是从python函数加载或者从文件构建工作流是无关紧要的。

  • 设置了API,从文件加载Workflow

    atwf add -l vasp -s optimize_only.yaml -m mp-149 -c '{"vasp_cmd": ">>vasp_cmd<<", "db_file": ">>db_file<<"}'

  • 设置了API,从python脚本加载

    atwf add -l vasp -p wf_structure_optimization -m mp-149

  • 手动添加POSCAR来加载

    atwf add -l vasp -s optimize_only.yaml POSCAR -c '{"vasp_cmd": ">>vasp_cmd<<", "db_file": ">>db_file<<"}'

  • 手动添加,并用Python函数加载

    atwf add -l vasp -p wf_structure_optimization POSCAR

所有这些功能都能指定(i)Workflow的类型和(ii)输入Workflow的结构。

  • -l vasp参数是说明使用vasp来运行
  • -s optimiza_only.yaml 指定了使用 optimizations_only.yaml文件。其中-p wf_structure_optimization 设置了计算内容。
  • -c 在之前的基于文件的工作流中设置,在my_fworker.yaml使用了vasp_cmd 和db_file。在预设的Workflow中,默认是从my_fworker.yaml中获取这些参数,因此不需要特别设置。

验证Workflow

这些命令将单个结构优化的FireWork添加到LaunchPad。可以使用FireWorks的lpad命令进行验证lpad get_wflows

返回结果的:

1
2
3
4
5
6
7
8
[
{
"state": "READY",
"name": "Si--1",
"created_on": "2015-12-30T18:00:00.000000",
"states_list": "READY"
},
]

注意lpad命令有很多功能。简单的修改上面的命令,你也可试试

lpad get_wflows -d morelpad get_wflows -d all。你可以使用 lpad get_wflows -h 来看看所有可用的功能,使用 lpad -h 看他支持的功能。

如果成功返回,那么恭喜!你已经在FireWorks中添加了一个工作流。

提交作业

为了通过队列提交作业,需要进入工作目录来执行提交作业的命令

1
qlaunch rapidfire -m 1

这里也有很多参数需要注意:

  • -m 1 以为 最多保持一个作业在队列中(防止投太多作业)。在FireWorks命令中,你可以通过 qlaunch rapidfire -h 或者 qlaunch -h 查看详细说明。
  • 上面指定的qlaunch模式是最简单通用的入门方式。最终键创建一个多层的目录,这对于执行多个计算时,是很有帮助的。
  • qlaunch的另一个是 预定模式, 比如 qlaunch -r rapidfire。这种模式有诸多优势-您将获得漂亮的队列作业名称,这些名称将代表你计算组成和任务类型(这非常好,特别是可以看到哪些计算已排队),并且还可以针对不同的工作指定不同的参数。另外,预定模式将根据数据库中作业量自动将最有提交到队列,因此你不需要使用-m 1 参数。先提交到队列中,然后将作业添加到数据库中(预定模式不支持)。但是,预定模式确实会增加服务型,因此不建议从预定模式开始。
  • 如果直接在平台上运行而不使用队列,那么请学习下rlaunch Rapidfire.

如果一切顺利的话,你可以在队列中检查FireWorks (qstat)。当作业运行完毕,你可以通过lpad get_wflows -d more查看Workflow的状态。

分析结果

一旦FireWorks完毕,你可以通过pymatgen-db来检查结果

1
mgdb query -c <<INSTALL_DIR>>/config/db.json --props task_id formula_pretty output.energy_per_atom

这里,<> 可以是相对路径。你应该查看下每个Si原子的能量。

注意,mgdb工具是查看结果的一种方式。你也可以连接MongoDB来检查结果。后面,我们将赝势atomate中各种Python类函数助力检索和分析数据。目前mgdb是最简单基本的方法。

你可以查看Workflow是否完成:

1
lpad get_wflows -d more

将会显示 Workflow状态为COMPLETED。

下一步

现在, 你已经完成了安装教程。参考下面的连接来查看更多的话题:

安装开发者模式

简介

本页记录了以用户身份安装atomate和安装atomate(或其他代码)以开发新功能之间的区别。它仅作为主要安装指南的补充,不能单独使用。

安装

开发模式安装Python代码

您可以在开发模式下安装所需的任何代码。这将使您可以直接对源进行更改,因此您可以贡献回更改或新功能以实现atomate(或pymatgen,FireWorks等)。

请注意,如果您以前使用其他工具(例如pip或conda)安装了atomate,则应在开始此安装之前先将其卸载。否则,可能由于两个不同的代码安装而导致冲突或意外行为。

在开发模式下安装pymatgen和atomate的步骤如下:

  1. 注意:在继续操作之前,您应该已经激活了虚拟环境或conda环境。
  2. 在<< INSTALL_DIR >>中创建代码目录
  3. cd到新创建的<< INSTALL_DIR >> / codes目录。
  4. 使用git克隆要在开发模式下安装的每个软件包。您不必了解如何使用git进行安装的详细信息,但是如果您要使用Python开发代码,则应查看一下这个简单的git简介。大多数Linux发行版都包含git,因此您不必将其安装在群集上。要下载代码,请使用以下命令(每行一个命令):git clone https://github.com/materialsproject/pymatgen.git && git clone https://github.com/hackingmaterials/atomate.git
  5. 对于这些文件夹中的每一个,您都进入cd文件夹并pip install -e。(-e标志安装为可编辑,。只是意味着从当前目录中的setup.py安装)或使用conda等效项。如果您在此过程中遇到问题,则可能需要手动安装或加载某些依赖项(例如,在系统上使用模块加载numpy或pip install numpy或conda install numpy)。请注意,安装后,如果对这些目录中的代码进行更改,则更改将立即生效,而无需重新安装。因此,您可以查看和修改安装在这些目录中的代码。
  6. 如果以后要更新这些代码,请执行git pull,然后执行pip install -e。(或再次是conda等效项)在相关目录中。请注意,您应该按照与上面列出的安装相同的顺序更新代码。

安装后

安装完成后的基本确认

使用命令python打开Python的shell。确认命令import pymatgen和import atomate的执行没有任何问题/错误。请记住,您将仍然需要处于虚拟环境中!

(可选)运行单元测试

如果你对atomate仅限了更改,最好进行一下单元测试。<>/codes/atomate/atomate/common/test_files目录中的db.json 和my_launchedpad.yaml控制数据库来进行单元测试。默认是使用在本地主机上运行的MongoDB。您可以将它们更新为自己喜欢的任何形式,例如,云服务的MongoDB示例。

警告:尽管可以将与生产安装相同的Mongo主机和端口重新用于测试,但是也不要在生产运行时使用相同的数据库!这就是为什么默认配置使用带有_unittest的数据库名称的原因-这样它就不会与任何生产数据库冲突。您将在单元测试中使用的数据库和LaunchPad会经常重置。请勿使用您的生产数据库进行测试,否则您将失去一切!

这些单元测试旨在在不安装VASP或其他代码的情况下运行,因此您可以在本地计算机上运行它们。其中一些从VASP工作流程开始,但应用use_fake_vasp方法替换为“ Faker”来调用VASP可执行文件,该“ Faker”将验证输入的基本属性并将预存储的输出文件复制到当前目录,从而模拟VASP的执行。

请注意,通过将VASP_CMD设置为表示您的VASP命令的字符串,可以修改atomate / vasp / tests / test_vasp_workflows.py中的单元测试以实际运行VASP。这只会在您运行测试的地方直接执行VASP(即不会将作业提交到队列中)。如果您需要稍后进行调试,可以参考一下,例如,通过在超级计算中心上运行交互式作业(使您位于计算节点上)并尝试执行此过程。

许多测试都有一个DEBUG选项,有时可以帮助发现问题。有时,如果要这样做,则需要打开/关闭DEBUG几次,以确保在调试运行之间实际上清除了所有旧数据。

通过导航到<< INSTALL_DIR >> / codes / atomate /并运行python setup.py test或nosetests来运行测试。

运行Workflows教程

简介

在安装好atomic之后,您将想要跳入并开始运行工作流程。存在具有合理设置的预设工作流程,可用于许多计算。本教程将快速指导您完成自定义和运行预设工作流程以计算MgO的能带结构。

目标

  • 使用Python运行预设的workflow
  • 使用pymatgen分析结果

前期准备:

  • 可工作的atomate
  • 文本编辑器

能带结构计算Workflows

DFT的基本和普遍用途是计算材料的能带结构和状态的电子密度。在这里,我们将使用预设的工作流程来计算能带结构。工作流程示意图如下。首先,优化结构,并执行自洽的静态计算。然后用路径上的k点(对于带结构)和k点均匀地采样布里渊区来完成非自洽静态计算。

1569879406585.png

Atomate能带结构计算workflow:通过统一和线性非自洽计算来实现 优化,静态计算。

运行能带计算Workflow

Setup

确保已完成安装教程。接下来,在本教程的HPC资源上创建一个文件夹。它可以位于任何地方。您将在其中保存本教程的所有文件。

如果您在atomate环境中尚未获得重要的先验结果,请运行以下命令重新开始:

1
lpad reset

警告: 这将重置LaunchPad中以前的所有Fireworks和工作流。如果您要保留实际结果,请不要这样做!

如果您不希望重置自己的LaunchPad,则可以设置其他数据库以用于教程,也可以接受将以前的结果和工作流程与数据库中该教程的内容混合使用。

创建结构

如果您不希望重置自己的LaunchPad,则可以设置其他数据库以用于教程,也可以接受将以前的结果和工作流程与数据库中该教程的内容混合使用。

1
2
3
4
5
6
7
8
9
10
Mg1 O1
1.0
2.606553 0.000000 1.504894
0.868851 2.457482 1.504894
0.000000 0.000000 3.009788
O Mg
1 1
direct
0.500000 0.500000 0.500000 O
0.000000 0.000000 0.000000 Mg

请注意,这不必是POSCAR。您还可以提供pymatgen支持的多种格式,包括:晶体学信息文件(CIF),POSCAR / CONTCAR,CHGCAR,vasprun.xml,CSSR,Netcdf和pymatgen的JSON序列化结构。Materials Project提供了数千种结构,这些结构可以直接在atwf中运行,也可以通过使用pymatgen的MPRester创建Structure对象来运行。

定义工作流以在结构上执行的方法有多种。我们将介绍3个选项。

选项1:在Atomate中使用预定义的工作流程

Atomate包含许多预定义的工作流程-一些定义为YAML文件,另一些定义为Python函数。预定义的YAML文件位于atomate.vasp.workflows.base.library中。您可以使用以下命令添加它们:

1
atwf add [[STRUCTURE_FILE]] -l vasp -s [[NAME_OF_FILE]]

其中[[STRUCTURE_FILE]]是您的POSCAR文件(或CIF等),[[NAME_OF_FILE]]是工作流文件的名称。在这里,您将使用bandstructure.yaml。

Python函数预设在atomate.vasp.workflows.presets中定义。您可以使用以下命令添加此类工作流程:

1
atwf add [[STRUCTURE_FILE]] -p [[NAME_OF_PYTHON_FUNCTION]]

wf_bandstructure是atomate.vasp.workflows.presets中有效的Python函数的示例。但是,这并不完全是我们接下来要遵循的过程,因此,继续本示例,我们选择另外两个用于定义工作流程的选项之一,该选项比预设更具自定义性。但是,请注意,可以并且鼓励您在可行的情况下使用预设工作流程,并且存在许多这样的工作流程供您选择。

选项2:创建自己的工作流程文件

您可以使用文本编辑器定义自己的工作流程,该工作流程将原子化中的预定义步骤链接在一起。工作流程及其Fireworks以YAML格式编码。atomate.vasp.workflows.base.library上的预定义YAML文件将成为YAML工作流的良好起点。由于已经为能带结构定义了一个,因此在此不必这样做。

创建自定义YAML工作流的主要好处是能够与非程序员共享它们,并在任何结构文件或材料项目中许多结构中的任何一个上运行它们。

对于大多数非常规的工作流,使用Python构造工作流更好,更省时。

选项3:使用Python生成和添加工作流程

上面的YAML版本比手动设置和运行这些计算的典型Shell脚本更有效,更易于读取和修改。即使这样,该工作流程在键入时也很繁琐,而不是复制粘贴。一定会有更好的办法!输入Python。

在安装教程中,您设置了FW_config.yaml,表示可以在atomate.vasp.fireworks上找到原子化Fireworks。同样,可以从atomate.vasp.workflows.presets.core导入atomate预设工作流程,该工作流程将基本工作流程(atomate.vasp.workflows.base)进行了较薄的包装,从而允许使用配置字典更改常规设置。我们可以设置工作流程并将其添加到LaunchPad中,以使其可以在几行Python中运行。

创建工作流程脚本

在与POSCAR相同的目录中,创建一个名为mgo_bandstructure.py的Python脚本,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# Create a bandstructure from the workflow from the atomate presets
import numpy as np
from pymatgen import Structure
from fireworks import LaunchPad
from atomate.vasp.workflows.presets.core import wf_bandstructure
from atomate.vasp.powerups import add_modify_incar
# load structure from file
struct = Structure.from_file('POSCAR') # note: many file formats supported, see function docs
# create the Workflow
wf = wf_bandstructure(struct)
# finally, instatiate the LaunchPad and add the workflow to it
lpad = LaunchPad.auto_load() # loads this based on the FireWorks configuration
lpad.add_wf(wf)

添加Workflow到LaunchPad

如果您要将工作流程添加到LaunchPad中(例如,您尚未通过选项2添加工作流程):从POSCAR和mgo_bandstructure.py文件夹中,运行Python脚本:

1
python mgo_bandstructure.py

运行工作流程

使用以下命令运行工作流程会将一个作业提交到my_qadapter.yaml中配置的批处理队列。作业将从您的LaunchPad启动Fireworks,直到所有任务都完成或您用完了时间。根据您的集群配置,此工作流程可能大约需要一个小时。

1
qlaunch singleshot

当工作流运行时,您可以使用lpad get_wflows检查状态。一旦所有工作流程完成,您就可以使用lpad get_wflows检查作业是否完成和/或从启动目录中的批处理作业( .out和 .error)转到输出文件,以确保一切顺利。除非有任何错误,否则Fireworks已成功完成启动和运行,应将结果添加到数据库中,然后继续进行。

分析能带结构Workflow

最后,我们将绘制计算结果。只需将以下Python脚本(bs-analysis.py)添加到您的文件夹,将PATH_TO_MY_DB_JSON更改为db.json文件的路径(例如<< INSTALL_DIR >> / config / db.json),然后运行脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
from atomate.vasp.database import VaspCalcDb
from pymatgen.electronic_structure.plotter import DosPlotter, BSPlotter
# create the atomate db from your db.json
PATH_TO_MY_DB_JSON = '/path/to/my/db.json'
atomate_db = VaspCalcDb.from_db_file(PATH_TO_MY_DB_JSON)
# get the uniform bandstructure entry from the database and
# use the get_dos method of the database to get the pymatgen CompleteDOS for that task id
uniform_bs_entry = atomate_db.collection.find_one({'task_label': 'nscf uniform', 'formula_pretty': 'MgO'})
complete_dos = atomate_db.get_dos(uniform_bs_entry['task_id'])
# Instatiate a DosPlotter and plot the DOS.
# Comment out the get_plot and uncomment save_plot if you have no GUI frontend to plot to.
dos_plotter = DosPlotter()
dos_plotter.add_dos_dict(complete_dos.get_element_dos())
dos_plotter.get_plot(xlim=(-10, 10))
#dos_plotter.save_plot('MgO-dos.pdf', img_format='pdf', xlim=(-10, 10))
# print the Fermi energy and bandgap from the DOS:
print('Fermi energy: {} eV'.format(complete_dos.efermi))
print('Bandgap: {} eV'.format(complete_dos.get_gap()))
# get the entry from the database and
# use the get_band_structure method of the database to get the pymatgen BandStructureSymmLine for that task id
line_bs_entry = atomate_db.collection.find_one({'task_label': 'nscf line', 'formula_pretty': 'MgO'})
bandstructure = atomate_db.get_band_structure(line_bs_entry['task_id'])
# Instatiate a bandstructure plotter and plot the bandstructure.
# You can uncomment out the get_plot if you have a GUI frontend to plot to.
bs_plotter = BSPlotter(bandstructure)
bs_plotter.get_plot()
# bs_plotter.save_plot('MgO-bandstructure.pdf', img_format='pdf')

如果你保存了图片,你应该会看到DOS和能带结构的图片。

1569880230468.png

小结

在本教程中,您学习了如何在不编写任何代码的情况下在YAML文件中运行工作流,以及如何在Python中进行工作。

要查看可以运行哪些预设工作流程,请参阅atomate.vasp.workflows.presets中包含这些预设工作流程的文档。可以按照本教程中相同的方式设置它们。

此时,你可能会:

  • 尝试另一个示例:运行Gibbs自由能源工作流程:运行Gibbs工作流程。
  • 跳到探索如何使用构建器来生成元数据:构建器:创建用于数据分析的计算报告。
  • 跳到学习如何创建可以使用和分发的自己的工作流程:创建工作流程。

运行吉布斯Workflows

简介

标准密度泛函理论计算是0 K基态计算,但是大多数材料是在室温及更高温度下使用和建模的。Debye模型和声子计算是获得结构随温度变化的吉布斯自由能($G(p, T)$)的两种常用方法。在原子中支持Debye模型和声子计算,其中Debye模型分析基于Moruzzi等人提出的准谐波技术。(Phys. Rev. B 37,790–799(1988)并以类似于Toher等人的方法实施。(Phys. Rev. B 90,1–14(2014).声子的计算分析是通过声带进行的 (Togo&Tanaka Scr. Mater. 108,1-5(2015)).

本教程将指导您计算含雾化金刚石Si的吉布斯自由能。计算所得的吉布斯自由能将从您的材料数据库中查询,并用NumPy计算热容量,并与实验数据进行比较。

目标

  • 使用Python为Gibbs自由能运行atomate预设工作流程
  • 在数据库的Gibbs集合中查询计算结果
  • 使用matplotlib可视化结果

吉布斯自由能计算Workflows

通过DFT来计算吉布斯自由能:

$G(p, T)=E(V)+pV+F_{vib}(V, T)$

其中,E(V)是DFT计算的总能量是体积的函数,$F_{vib}(V, T)$是对亥姆霍兹能量的震动贡献。该震动能量通过简谐近似(通过Debye模型)来计算。

为了计算吉布斯自由能,需要计算多个体积的总能量,然后在一定温度范围内为每个体积加上振动贡献,从而得出。然后,在每个温度下,针对每组能量和体积拟合一个状态方程。pymatgen中实现了几种不同的状态方程,Shang等人根据Debye模型讨论了其中的几种状态方程。(Comput. Mater. Sci. 47, 1040-1048 (2010))。使用拟合状态方程,可以找到使固定压力下的能量最小化的体积(通常但并非总是如此, p=0)。找到每个温度和固定压力下的最小体积即可得出从$F_{vib}(V, T)$到$G(V, T)$的转换。

从工作流程的角度来看,吉布斯自由能工作流程在程序上类似于弹性张量工作流程。首先优化输入结构,然后变形优化结构的体积并计算能量以产生E-V曲线的点(或声子计算),最后执行与Debye模型或声子形式主义相对应的分析工作流程。

1569880909780.png

Atomate弹性张量工作流程。这使用与Gibbs自由能工作流程相同的模式,但是分析步骤(最终烟花)将计算弹性张量而不是Gibbs自由能。

运行吉布斯自由能计算Workflow

设置

确保已完成安装教程。接下来,在本教程的HPC资源上创建一个文件夹。它可以位于任何地方。您将在其中保存本教程的所有文件。

如果您在atomate环境中尚未获得重要的先验结果,请运行以下命令重新开始:

1
lpad reset

警告 这将重置LaunchPad中以前的所有Fireworks和工作流。如果您要保留实际结果,请不要这样做!

如果您不希望重置自己的LaunchPad,则可以设置其他数据库以用于教程,也可以接受将以前的结果和工作流程与数据库中该教程的内容混合使用。

使用Python生成和添加工作流程

我们将使用金刚石Si作为简单示例,并从材料项目中获取结构。这要求您在.pmgrc.yaml中设置一个API密钥。在安装教程中,您设置了FW_config.yaml,表示可以在atomate.vasp.fireworks上找到原子化Fireworks。同样,可以从atomate.vasp.workflows.presets.core导入atomate预设工作流程,该工作流程将基本工作流程(atomate.vasp.workflows.base)进行了较薄的包装,从而允许使用配置字典更改常规设置。然后,我们可以设置工作流程并将其添加到LaunchPad中,从而可以在几行Python中运行。

创建workflow脚本

在您创建的目录中,创建一个名为gibbs.py的Python脚本,其内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/usr/bin/env python
import numpy as np
from pymatgen import MPRester
from fireworks import LaunchPad
from atomate.vasp.workflows.presets.core import wf_gibbs_free_energy
# Get the structure from the Materials Project
with MPRester() as mpr:
struct = mpr.get_structure_by_material_id('mp-149')
# Set up the deformation matricies, where each deformation is a 3x3 list of strains.
# There will be 7 structures between +/- 10% volume. Note that the 1/3 power is so
# that we scale each direction by (x+1)^(1/3) and the total volume by (x+1).
deformations = [(np.eye(3)*((1+x)**(1.0/3.0))).tolist() for x in np.linspace(-0.1, 0.1, 7)]
# Create the configurations dictionary, defining the temperature range,
# Poisson ratio (from experiments or the Materials Project), turning on consideration
# of anharmonic contributions, and finally the deformation matrix describing points
# on the energy vs. volume curve.
c = {"T_MIN": 10, "T_STEP": 10, "T_MAX": 2000,
"POISSON": 0.20, "ANHARMONIC_CONTRIBUTION": True,
"DEFORMATIONS": deformations}
# Create the workflow
workflow = wf_gibbs_free_energy(struct, c)
# Create the launchpad and add our workflow
launchpad = LaunchPad.auto_load()
launchpad.add_wf(workflow)

请注意,这里我们使用了在材料项目条目中找到的Si的泊松比0.2。在德拜模型中,泊松比控制热容曲线中弯头的形状和大小。典型材料有时会被理想化为具有0.33的泊松比,但具有最精确的比值将在低温极限附近提供更精确的热容。泊松比可以从材料项目的实验参考资料中获得,对于化学上相似的结构,泊松比通常是可比的(或者,它们首先通过弹性张量工作流程进行计算)。

由于我们可能对Si的高温热力学行为感兴趣,因此我们将非谐贡献设置为True,以便我们可以适当地偏离基于Gruneisen参数的3R Debye模型的高温极限, $\gamma$。

建立添加Workflow到LaunchPad

python gibbs.py

运行Workflow

以下命令将单个作业提交到my_qadapter.yaml中配置的批处理队列。假设配置与安装教程中的配置相同,则该作业将从您的LaunchPad启动Fireworks,直到它们全部完成或您用完了walltime。此工作流程仅需几分钟。

1
qlaunch singleshot

您可以转到启动目录中批处理作业的输出文件( .out和 .error),以确保一切正常,或检查LaunchPad(lpad get_wflows)。

分析状态方程的Workflow

最后,我们将分析吉布斯自由能计算的结果。在这里,我们将DFT计算得出的热容量与实验值进行比较。只需将以下Python脚本(gibbs-analysis.py)添加到您的文件夹中并运行它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from atomate.vasp.database import VaspCalcDb
from pymatgen import Structure
import numpy as np
import matplotlib.pyplot as plt
# create the atomate db from your db.json
PATH_TO_MY_DB_JSON = '/path/to/my/db.json'
atomate_db = VaspCalcDb.from_db_file(PATH_TO_MY_DB_JSON)
# use the Gibbs collection
gibbs_coll = atomate_db.db['gibbs_tasks']
# get our task for the formula
gibbs_entry = gibbs_coll.find_one({'formula_pretty': 'Si'})
# set up the pymatgen structure
struct = Structure.from_dict(gibbs_entry['structure'])
eVatom_to_kjmol = 96.485340095*1000/len(struct)
# Gibbs free energy data from Barin for Si:
T_barin = range(300, 1700, 100)
Cp_barin = [20.050, 22.142, 23.330, 24.154, 24.803, 25.359, 25.874,
26.338, 26.778, 27.196, 27.614, 28.033, 28.451, 28.870]
T_calc = np.array(gibbs_entry['temperatures'])
G_calc = np.array(gibbs_entry['gibbs_free_energy'])*eVatom_to_kjmol
# Numerical derivative of the heat capacity, considering a step size of 10
# Note: the truncated last two values are to account for the numerical derivative endpoint error
Cp_calc = -T_calc[:-2]*np.gradient(np.gradient(G_calc, 10), 10)[:-2]
# Plot our calculated Gibbs free energies vs. those from JANAF
plt.scatter(T_barin, Cp_barin, label='JANAF tables (experiment)')
plt.plot(T_calc[:-2], Cp_calc, label='Calculated')
plt.title('Debye model Gibbs free energy of Si')
plt.xlabel('T (K)')
plt.ylabel('Cp (J/K-mol)')
plt.legend()
# save the figure
plt.savefig('Si-heat-capacity.png')

如果打开保存的图形Si-heat-capacity.png,如下图所示:

1569881587300.png

小结

在本教程中,我们进一步演示了使用原子化预设工作流程轻松计算和分析有趣的材料属性的方法。

要查看还可以运行哪些其他预设工作流,请参阅atomate.vasp.workflows.presets中包含它们的文档。通过传入结构和可选的配置字典,可以按照与本教程完全相同的方式来设置和运行它们。

此时,您可能会:

Builders:为数据分析创建计算报告

简介

默认情况下,atomate解析每个计算(“任务”)的结果,并将结果存储在MongoDB中。尽管具有这样一种“以计算为中心”的数据视图通常是有用的,其中数据库中的每个文档都代表一个计算,但是有时拥有一个数据库,其中每个文档都可以汇总一个计算的所有给定材料的属性,这有时甚至更有用。

atomate中的“构建器”通过收集来自多个任务的信息,汇总了单个材料上的所有计算数据。还可以使用构建器进行后处理,例如计算和存储对数据分析有帮助的材料描述符。因此,构建者的主要目标是从一组计算任务中获取一些“原始”信息,并从材料的角度得出摘要和更高级别的信息。

下面显示了构建过程的高级示意图。

1569881847759.png

构建过程图,该过程收集诸如任务之类的较低级别的信息,并将其组织到诸如材料之类的较高级别的集合中。

核心构建器: TasksMaterialsBuilder

atomate的核心构建器是TasksMaterialsBuilder。该构建器将:

  • 使用pymatgen的StructureMatcher自动确定哪些任务在同一材料上
  • 将所有这些任务的基本数据收集到一个文档中,该文档存储在一个称为“材料”的新集合中。

该核心构建器是较复杂的构建器之一,因为它需要确定以下内容:

  • 应该考虑哪种计算方法作为新材料?(例如,通常不希望出于弹性张量计算的目的而进行的小变形计算是不同于其母体的“材料”)
  • 如果有多种计算类型可以为一种材料提供相同属性的不同值,那么应该信任哪种计算?
  • 我们如何确定两个计算是否针对同一材料?

但是,这就是“核心”构建器,因为它开始了从各个计算中收集数据并创建单个以材料为中心的报告的过程。

其他构建器

其他构建器可以在atomate.vasp.builders包中找到。请参阅代码文档以了解其各种用途。

运行builders

运行构建器很简单。请注意,正在运行的构建器不会修改源任务集合。它只会创建新的集合和数据。因此,可以安全地运行构建器。

要尝试运行构建器,请遵循atomate.vasp.builders.examples中的示例。然后,检查您的MongoDB数据库以查找新的集合和数据。

请注意,如果您想重新开始,可以使用构建器的reset()函数。

构建Workflows

简介

“运行工作流程”教程引导您完成了从YAML文件库中自定义和运行预设VASP工作流程的过程。尽管这些预设是进行特定的,简单的计算的有用标准,但通常还是需要创建自己的工作流程。

理想情况下,可以完全使用现有Fireworks构建自定义工作流。一般而言,可以通过现有Fireworks构造只有一系列输入仅更改文件和计算设置的一系列计算工作流。工作流可以具有简单或复杂的依赖关系图。本指南将说明如何在Python中创建此类自定义工作流程。

如果无法使用现有的Fireworks创建所需的工作流程,则必须编写自己的Fireworks。这样做很简单,方法是查看atomate中当前实现的Fireworks,并将其用作编写自己的代码的指南。现在,我们假设您需要的Fireworks已经存在。

目标

  • 熟悉Workflows的内部结构,熟悉FireWorks和Firetasks
  • 学习从已有的FireWorks中使用Python构建atomate Workflows
  • 理解如何实现并如何使用
  • 学习FireWorker的环境如何控制其行为

前提

为了理解该教程,你应该:

  • 已经安装好atomate
  • 理解如何添加Workflows到LaunchPad和如何运行他们
  • 对Python的函数和类感到舒适

FireWorks背景

用于在atomate中构建工作流的所有机器均来自FireWorks,它是用于构建和运行工作流的通用库。Atomate使用FireWorks库构建工作流,这些工作流结合了在pymatgen中实现的材料科学操作和分析,从pymatgen-db中进行的数据库通信以及从托管人处进行的作业。FireWorks文档为使用和了解库的使用提供了许多出色的教程和指南,这可能会很有用。

FireWorks工作流由Fireworks组成,而Fireworks由Firetasks组成。FireWorks文档本身可以最好地描述这些内容:

  • 工作流是一组FireWorks,它们之间具有依赖关系。例如,在运行两个子Fireworks之前,您可能需要父级Firework完成并生成一些输出文件。
  • Firework包含JSON规范,其中包含引导您的工作所需的所有信息。例如,规范包含要按顺序执行的Firetasks数组。规范还包括传递给Firetasks的所有输入参数。通过使用规范中相同的Firetasks但输入参数不同的Fireworks,可以轻松地对不同的输入数据执行相同的功能。您可以根据需要设计规范,只要它是有效的JSON。用于Firework规范的JSON格式非常灵活,易于学习(熟悉字典和数组的Python用户本质上已经知道JSON),并通过MongoDB的JSON文档搜索功能立即为最终用户提供对输入数据的丰富搜索。
  • Firetask是一项原子计算工作。它可以调用单个Shell脚本或执行您定义的单个Python函数(在FireWorks中或在外部程序包中)。

在atomate中,我们尤其涉及了每个FireWork来表示一个计算或者分布步骤。在下面的示例中,典型的能带结构计算首先优化晶体结构,然后执行静态计算,最后在能带路径上均匀地通过结构进行非SCF计算(由于它们不依赖于一个,因此可以并行执行)另一个)。这些计算中的每一个(每次运行VASP时)都对应于一个Firework,因此,这种带结构工作流包含4个Fireworks。可以使用或多或少的Fireworks设计此工作流,但是在我们看来,这是最自然,最有用的映射。例如,请注意,一个Firework最典型地对应于一个超级计算中心上的一个队列提交(尽管根据选择的执行模式,它可能会有所不同)。

每个Firework的Firetask是为每个计算步骤执行的所有单独步骤。在该示例中,结构优化Firework的任务是根据输入结构编写VASP输入文件,运行VASP,解析VASP输出并将输出结构传递给静态计算。出于本教程的目的,您无需过多担心Firetasks的细节,但可以帮助您了解Fireworks只是由依次执行的这些任务中的一些任务组成,这些任务可以使乏味的计算细节抽象化,例如文件IO。同样,存在工作流来抽象出FireWorks中包含的不同计算和分析步骤的细节。

1569905689380.png

带状结构工作流程。优化批量结构Fireworks是一个有子代的父级:静态SCF Firework。静态SCF FireWork有两个子类:分别用于使DOS沿着路径均匀分布的静态非SCF(线性)FireWork和静态非SCF(统一)FireWork。在执行方面,Optimize批量结构Firework将按规范中所述的数据顺序运行四个Firetask。一旦“优化”批量结构Firework和Static SCF Fireworks完成,就可以并行或串行启动和执行生产线和统一SCF Fireworks。由于这些Fireworks彼此不依赖,因此执行顺序无关紧要。与优化结构Firework相似,所有这些Fireworks都会依次运行各自的Firetask。

构建atomate Workflows

绘制workflow

编写任何工作流程的第一步是绘制工作流程的图形。特别是,您要绘制一个有向无环图,这对于atomate来说仅意味着每个计算步骤都是该图中的一个节点,而父级仅指向其子级,因此图中没有循环(循环)。同样,您应该将科学代码(VASP,LAMMPS等)的每个大型调用都视为与一个FireWork相对应。汇总来自多个Fireworks的结果的分析任务,例如分析体积变形的任务也需要自己的Fireworks,并将这些计算作为父项。文档中所有的wokflow示例和atomate论文(已提交)均为有效的工作流程图。

注意: FireWorks软件包中的工作流程编程的高级方法允许工作流程根据执行结果进行更改。例如,Fireworks可以根据获得的结果向工作流添加更多Fireworks。如果您需要高层的某种循环或分支,则必须编写自定义Firetask来动态创建新的Fireworks。在未来的工作流程中可能会更深入地介绍用原子方式编写自定义Firetasks,但这超出了本指南的范围。动态工作流程的Fireworks文档从抽象的角度讨论了这一点。

寻找FireWorks

在将每个计算或分析步骤标识为图形中的Fireworks之后,我们必须确定与图形中的每个节点相对应的Fireworks。可以在atomate.vasp.fireworks模块文档或您要使用的软件的相应文档页面中找到每个atomic Fireworks的完整Python文档。当前支持FEFF,LAMMPS和VASP。一些可用的VASP Fireworks是

  • OptimizeFW
  • StaticFW
  • TransmuterFW
  • HSEBSFW
  • NonSCFFW
  • LepsFW
  • SOCFW
  • MDFW
  • BoltztrapFW
  • NEBRelaxationFW
  • NEBFW

警告: 这些Fireworks的大多数运行起来并不复杂,您可以直接使用它们。有些不那么明显,因此在执行操作之前,应先参考文档以了解每种功能的详细信息以及如何使用它们。例如,HSEBSFW需要先前的计算,以提供VBM / CBM信息或高对称kpoint。

注意: 这些Fireworks中的某些仅在VASP设置或选项上有所不同。例如,原则上可以自定义一个简单的OptimizeFW以实现与其他多个VASP Fireworks相同的功能,其方式是,如果您对每个订单进行了足够的自定义,则快餐店中的两种汉堡可能会等效。

特别是在VASP中,要值得注意的主要设置之一是所使用的输入集,它决定了功能,赝势和收敛性设置。输入集都在pymatgen中定义,例如pymatgen.io.vasp.sets或pymatgen.io.feff.sets。这些工具大多数都非常简单明了,但是TransmuterFW是需要特别注意的一项FireWork。TransmuterFW非常强大,因为它支持通过pymatgen.transformations支持的任何转换来转换结构。pymatgen中有许多受支持的转换,一些更常见的转换包括:

  • 超晶胞转换:根据缩放矩阵创建超晶胞
  • 替换转换:用一种物种替代另一种
  • 结构扰动转换:对每个位点进行指定幅度的扰动
  • 结构形变转换:将变形矩阵用于结构的晶格参数

您会注意到,此列表中没有更通用的Fireworks和用于分析任务的Fireworks。因为它们旨在简化和模块化,所以这些Fireworks实际上是作为普通的Firetask编写的,当构建工作流时,它们将被包装到Fireworks中。在下一部分中,我们将介绍如何将它们用作Fireworks,但要知道它们可以在atomate.common.firetasks模块之类的地方找到,用于与软件无关的任务,例如PassCalcLocs或atomate.vasp.firetasks包<atomate.vasp.firetasks用于某些VASP特定的.firetasks,包括通常在atomate.vasp.firetasks.parse_outputs中找到的分析任务。

创建workflow

在为我们的草图工作流程确定了每个Fireworks之后,他们可以将它们组装成Python中完整的atomate工作流程。为了了解这里发生的情况,您应该习惯于创建类的实例和使用函数。为了演示如何组装和使用工作流程,我们将使用Gibbs自由能源工作流程的稍作修改的版本,并逐步浏览每一行代码以说明正在发生的事情。

就上下文而言,吉布斯自由能工作流为结构计算。有两种方法可以使用Debye模型(参见Blanco et al, Comput. Phys. Commun., 158, (2004)) 或通过原子的振动频率(参见Togo and Tanaka,Scr. Mater., 108(2015))。首先,优化所需的结构,然后对该结构进行体积缩放,然后执行VASP计算,该计算可以是静态计算,也可以是使用密度泛函微扰理论(IBRION = 7或8 INCAR设置)进行的计算,具体取决于在分析中,我们使用Debye模型或声子计算通过谐波近似将0K推算到有限温度,从而给每个结构一个依赖项,然后将这些结构中的每个结构一起考虑并拟合一个状态方程,使我们能够表达该结构,我们可以将其转化为该结构的吉布斯自由能。phonopy网站对亥姆霍兹能量和体积随气温。

修改后的吉布斯自由能工作流的Python实现是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
from __future__ import absolute_import, division, print_function, unicode_literals
from datetime import datetime
from pymatgen.analysis.elasticity.strain import Deformation
from pymatgen.io.vasp.sets import MPRelaxSet, MPStaticSet
from fireworks import Firework, Workflow
from atomate.vasp.fireworks.core import OptimizeFW, TransmuterFW
from atomate.vasp.firetasks.parse_outputs import GibbsFreeEnergyTask
def wf_gibbs_free_energy(
structure, deformations, vasp_input_set_relax=None,
vasp_input_set_static=None, vasp_cmd="vasp", db_file=None,
user_kpoints_settings=None, t_step=10, t_min=0, t_max=1000,
mesh=(20, 20, 20), eos="vinet", qha_type="debye_model",
pressure=0.0, poisson=0.25):
"""
Returns quasi-harmonic gibbs free energy workflow.
Note: phonopy package is required for the final analysis step if qha_type="phonopy"
Args:
structure (Structure): input structure.
deformations (list): list of deformation matrices(list of lists).
vasp_input_set_relax (VaspInputSet)
vasp_input_set_static (VaspInputSet)
vasp_cmd (str): vasp command to run.
db_file (str): path to the db file.
user_kpoints_settings (dict): example: {"grid_density": 7000}
t_step (float): temperature step (in K)
t_min (float): min temperature (in K)
t_max (float): max temperature (in K)
mesh (list/tuple): reciprocal space density
eos (str): equation of state used for fitting the energies and the volumes.
options supported by phonopy: "vinet", "murnaghan", "birch_murnaghan".
Note: pymatgen supports more options than phonopy. see pymatgen.analysis.eos.py
qha_type(str): quasi-harmonic approximation type: "debye_model" or "phonopy",
default is "debye_model"
pressure (float): in GPa
poisson (float): poisson ratio
Returns:
Workflow
"""
tag = datetime.utcnow().strftime('%Y-%m-%d-%H-%M-%S-%f')
# get the input set for the optimization and update it if we passed custom settings
vis_relax = vasp_input_set or MPRelaxSet(structure, force_gamma=True)
if user_kpoints_settings:
v = vis_relax.as_dict()
v.update({"user_kpoints_settings": user_kpoints_settings})
vis_relax = vis_relax.__class__.from_dict(v)
# Structure optimization firework
fws = [OptimizeFW(
structure=structure, vasp_input_set=vis_relax, vasp_cmd=vasp_cmd,
db_file=db_file, name="{} structure optimization".format(tag))]
# get the input set for the static calculations and update it if we passed custom settings
uis_static = {"ISIF": 2, "ISTART":1}
lepsilon = False # use IBRION = -1; don't update the ions
if qha_type not in ['debye model']:
uis_static = {'ISIF'}
lepsilon = True # use IBRION = -8; DFPT
vis_static = MPStaticSet(structure, force_gamma=True, lepsilon=lepsilon,
user_kpoints_settings=user_kpoints_settings,
user_incar_settings=uis_static)
# create each deformation Firework and add them to the Fireworks list
parents = fws[0]
deformations = [Deformation(defo_mat) for defo_mat in deformations]
for n, deformation in enumerate(deformations):
fw = TransmuterFW(
name="{} {} {}".format(tag, 'gibbs deformation', n),
structure=structure,transformations=['DeformStructureTransformation'],
transformation_params=[{"deformation": deformation.tolist()}],
vasp_input_set=vis_static, parents=parents,
vasp_cmd=vasp_cmd, db_file=db_file)
fws.append(fw)
parents = fws[1:] # all of the deformation Fireworks
if qha_type not in ["debye_model"]:
from phonopy import Phonopy
fw_analysis = Firework(GibbsFreeEnergyTask(
tag=tag, db_file=db_file, t_step=t_step, t_min=t_min,
t_max=t_max, mesh=mesh, eos=eos, qha_type=qha_type,
pressure=pressure, poisson=poisson),
name="gibbs free energy", parents=parents)
fws.append(fw_analysis)
# finally, create the workflow
wf_gibbs = Workflow(fws)
wf_gibbs.name = "{}:{}".format(structure.composition.reduced_formula, "gibbs free energy")
return wf_gibbs

注意:实际Gibbs自由能源工作流程的文档和来源可在atomate.vasp.workflows.base.gibbs中找到。在这里,我们简化了一些选项,并显式添加了每个Firework。

在上面的代码示例中,我们首先导入将要使用的类和函数,并使用希望从工作流级别控制的所有参数以及这些参数的文档定义wf_gibbs_free_energy函数。运行该功能将返回FireWorks工作流以添加到LaunchPad。

第41-51行是我们定义优化Firework的地方。首先,我们检查是否通过了vasp_input_set_relax参数,如果没有通过,则默认为MPRelaxSet,如果通过了user_kpoints_settings参数,则更新该设置。在user_incar_settings中通常会看到类似的参数。在第49行,我们使用导入的OptimizeFW创建Fireworks(fws)列表。请注意,这是我们传递给结构的唯一FireWork,它可以提供更大的灵活性。稍后再详细介绍。

在第52-61行中,我们对pymatgen的MPStaticSet做了与对MPRelaxSet所做的类似的操作。然后在第63-71行中,我们遍历传递的每个变形(作为描述变形矩阵的二维列表的列表),并以该变形实例化TransmuterFW作为transform_params。对于此处使用的每种转换类型(DeformStructureTransformation),您将需要查看该类采用的参数,并使用正确的关键字,在这种情况下为变形。另一个示例是SupercellTransformation采用一个称为scale的转换参数。请密切注意,在第69行上,我们为所有这些Fireworks添加了OptimizeFW(来自fws [0])作为父级,以便它们可以并行运行。

接下来在第73-76行,我们执行一个Firetask并将其包装在FireWorks的纯Firework对象中。这证明了FireWorks允许的模块化和可定制性,相比于为每个抽象级别编写自定义对象,它们更倾向于构成现有对象。我们正在向此Firetask传递相同类型的参数,这使您可以正确地推断Fireworks本身会将相关参数推广到其Firetasks。同样,我们将分析FireWork的父级设置为列表中除第一个FireWork(OptimizeFW)之外的所有烟火。这样可以确保在我们所有已转换的结构完成运行之前,不会运行分析。

最后,我们使用普通的FireWorks Workflow对象引入所有Fireworks,更新Workflow的名称并返回该对象。在这里,您可以编写类似于“运行工作流教程”的脚本,并传递正确的变量以获取要添加到LaunchPad的工作流。在此工作流程中,请注意vasp_cmd参数和db_file参数以获得正确的行为。预设工作人员会将它们默认为FireWorker的环境变量,但是您将不得不在此处手动进行处理。要使用环境变量,请分别为每个参数传递’>> vasp_cmd <<’和’>> db_file <<’。有关此行为的更多信息,请参见env_chk部分。

更多帮助
  • 阅读基础工作流(atomate.vasp.workflows.base)的源代码将是查找具有合理参数的功能示例的好地方
  • 也可以在YAML文件中某种程度上创建工作流。您可以改编该示例以及对“工作流YAML参考”的简短说明。
修改workflows

atomate工作流还有其他一些有趣的功能,这些功能使编写动态和可自定义的工作流变得更加容易。

通电

通过Powerups(atomate.vasp.powerups),可以在创建工作流程后对其进行修改。这样做的好处是,您可以有条件地在代码中应用启动功能,也可以将其应用到一大堆工作流中,这些工作流随后将添加到LaunchPad中。有些启动会影响您的计算行为,有些则会简单地添加元数据或更改各个Fireworks在后台与数据库交互的方式。

影响VASP行为的一些有用的功能包括:

  • add_modify_incar:在运行时更新由(部分匹配)名称指定的Fireworks INCAR
  • set_fworker:为工作流指定某些FireWorkers。对于为高内存或高精度作业而调整的FireWorker有用
  • modify_to_soc:使所有与约束匹配的VASP计算都考虑自旋轨道耦合
  • remove_custodian,use_custodian,run_fake_vasp:选择运行带有或不带有托管的VASP(或根本不运行,对于调试很有用)

修改FireWorks运行方式并在工作流运行时与之交互的功能:

  • add_priority:为根作业和子作业添加优先级,以确保启动的计算比未启动的Fireworks优先完成
  • add_namefile:将FW->> fw.name <<文件放在启动目录中,因此轻松在文件系统中搜索特定的Fireworks。
  • add_trackers:Fireworks将报告OUTCAR和OSZICAR文件的最后几行,这些文件可用于跟踪仍在运行的作业
  • add_wf_metadata和add_tags:将元数据添加到工作流中以方便查询
  • add_stability_check和add_bandgap_check:如果计算出的结构的能量比materialsproject.org结构低得多,或者带隙大于或小于某个阈值,则结束工作流程

env_chk

atomate中的工作流具有强大的功能,可让您快速完成科学工作,因为它们旨在轻松地在不同的计算资源上异构运行。env_chk通过让用户指定支持env_chk的参数(例如db_file,vasp_cmd和incar_update)来启用此功能。这些允许不同的资源(或同一计算资源上的不同的my_fworker.yaml文件)具有特定于它们运行的工作流的设置。像这样使用env_chk的一些想法是:

  • 能够在与不同研究项目关联的不同数据库文件之间快速切换
  • 确保更一致,更轻松地使用经常使用的INCAR参数,例如设置较高的NEDOS INCAR参数
  • 将FireWorkers设置为在同一计算资源上进行低精度和高精度作业,或普通和高内存作业

要使用env_chk,你无序进行任何明确地操作,只需将’>> db_file <<’,’>> vasp_cmd <<’,’>> incar_update <<’传递给任何支持env_chk的参数。

目前支持env_chk变量的有:

  • >>scratch_dir<<
  • >>gamma_vasp_cmd<<
  • >>vasp_cmd<<
  • >>db_file<<

如果您认为还有其他可能支持env_chk的有用变量,请在atomate Google网上论坛中提出您的想法(或者更好的是,提交拉取请求)!

PassCalcLocs

为了能够在整个工作流程中更改初始结构时对其进行操作并对其进行修改,需要一种方法可以引用以前的计算方法,而无需对文件路径进行硬编码或通过仔细跟踪整个Firetasks和Fireworks的路径。PassCalcLocs(atomate.common.firetasks.glue_tasks)通过轻松跟踪以前的计算目录并使它们可用于连续的Fireworks(甚至在不同的计算资源之间)来解决此问题。PassCalcLocs使Fireworks能够在运行时动态地从工作流中添加和删除,并在计算期间启用分支等功能。通过使用不同的工作流程步骤处理金属和非金属,可以使用这种分支。

小结

理解本指南使您能够使用Firetask和Fireworks的任意组合创建任意复杂的原子化工作流,但是并非所有示例都能详细介绍。有关定制示例的具体示例,请参见“定制工作流”文档,以适应您的需求。如果其中任何一个不清楚,或者您觉得缺少有用的文档,请给我们有关atomate Google小组的反馈!要查看您可以使用Python控制的所有不同部分,请访问API文档。感兴趣的许多自定义选项和功能并不单独存在,而是在FireWorks,pymatgen和保管人中。掌握FireWorks将使您从执行和管理工作流程中获得最大收益。掌握pymatgen将帮助您编写复杂的材料工作流程并执行复杂的结果分析。

自定义Workflows

简介

《创建工作流程》指南提供了有关构建工作流程的详细信息。这组教程将在创建工作流时提供自定义工作流的特定示例。对于其中一些自定义,无法使用预设工作流程。预设工作流程旨在提供一般合理的选项。通过使用atomate.vasp.workflows.base工作流程而不是预设,可以实现更全面的自定义工作流程访问权限。

目标

  • 提供自定义Workflows的示例

前提

最好知道如何在Python创建workflows。参考

Powerups通电

Powerups都设计为用作函数,您可以在其中传递原始工作流程和其他关键字参数,然后取回修改后的工作流程。下面显示了一个示例,但未显示所有powerups功能。要查看更多功能,请转到您所使用的软件包的功能文档,例如VASP是:py:modatomate.vasp.powerups。添加一个INCAR设置以将不同的力收敛标准用于弹性工作流程中唯一的结构优化的示例是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from atomate.vasp.workflows.presets.core import wf_elastic_constant
from atomate.vasp.powerups import add_modify_incar
from pymatgen import Structure
# load your structure, e.g. from a POSCAR
struct = Structure.from_file('POSCAR')
# create the workflow
orig_wf = wf_elastic_constant(struct)
# use the powerup to change any Fireworks with 'optimization' in the name to use EDIFFG=-0.05
# note: the 'incar_update' is *required* if you want to update
# note: not passing the ``modify_incar_params`` keyword will result in the Firework getting
# the 'incar_update' key and values from your FireWorker's env
modified_wf = add_modify_incar(orig_wf, modify_incar_params={'incar_update': {'EDIFFG': -0.05}},
fw_name_constraint='optimization')
# print if you want to check the tasks. Warning: several lines long.
# print(orig_wf.fws[0].tasks)
# print(modified_wf.fws[0].tasks)

VASP计算设置

大多数VASP计算特定的设置(例如来自INCAR,KPOINTS和POTCAR文件的设置)都由pymatgen的vasp集控制。VASP工作流采用vasp_input_set选项,您可以直接导入和使用它们,也可以在原子化工作流中使用它们之前对其进行自定义。

注意: 在工作流程构造函数中使用vasp_input_set或vis关键字通常仅控制使用该集合的第一个Firework。如果要让多个Fireworks使用自定义输入集(或例如在带结构工作流中不使用第一个输入集),则必须自己制作一个自定义工作流。

要在优化计算中使用其他功能,可以执行以下操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
from fireworks import Workflow
from atomate.vasp.fireworks.core import OptimizeFW
from pymatgen.io.vasp.sets import MPRelaxSet
from pymatgen import Structure
def get_optimize_wf(structure, name="optimization wf", vasp_input_set=None,
vasp_cmd="vasp", db_file=None, user_kpoints_settings=None,
tag="", metadata=None):
"""
Returns a structure optimization workflow.
Args:
structure (Structure): input structure to be optimized and run
name (str): some appropriate name for the transmuter fireworks.
vasp_input_set (DictSet): vasp input set.
vasp_cmd (str): command to run
db_file (str): path to file containing the database credentials.
user_kpoints_settings (dict): example: {"grid_density": 7000}
tag (str): some unique string that will be appended to the names of the fireworks so that
the data from those tagged fireworks can be queried later during the analysis.
metadata (dict): meta data
Returns:
Workflow
"""
# input set for relaxation
vis_relax = vasp_input_set or MPRelaxSet(structure)
if user_kpoints_settings:
v = vis_relax.as_dict()
v.update({"user_kpoints_settings": user_kpoints_settings})
vis_relax = vis_relax.__class__.from_dict(v)
# Structure optimization firework
fws = [OptimizeFW(structure=structure, vasp_input_set=vis_relax, vasp_cmd=vasp_cmd,
db_file=db_file, name="{} structure optimization".format(tag))]
wfname = "{}:{}".format(structure.composition.reduced_formula, name)
return Workflow(fws, name=wfname, metadata=metadata)
# load your structure, e.g. from a POSCAR
struct = Structure.from_file('POSCAR')
# create a custom input set
my_custom_input_set = MPRelaxSet(struct, potcar_functional='LDA')
# create the workflow
my_wf = get_optimize_wf(struct, vasp_input_set=my_custom_input_set)

有关受支持的选项,请参见VASP文档和pymatgen的vasp集文档。在撰写本文时,支持PBE(默认),LDA,PW91,LDA_US。

订制KPOINTS设置

也可以使用上面的示例类似地自定义KPOINTS设置。您可以使用以下关键字(来自pymatgen的vasp集)控制它们:

  • force_gamma:始终使用以gamma为中心的kpoint生成。默认值(False)使用自动密度kpoint方案,它将对六边形单元使用以Gamma为中心的生成方案,否则使用Monkhorst-Pack。
  • user_kpoints_settings:通过提供字典来覆盖kpoints设置。例如{“reciprocal_density”:1000}。其他选项是grid_density或length。
1
2
3
4
5
6
7
8
9
10
11
from pymatgen.io.vasp.sets import MPRelaxSet
from pymatgen import Structure
# load your structure, e.g. from a POSCAR
struct = Structure.from_file('POSCAR')
# create a custom input set
my_custom_input_set = MPRelaxSet(struct, force_gamma=True, {"grid_density": 10} )
# create the workflow
my_wf = get_optimize_wf(struct, vasp_input_set=my_custom_input_set)

如果需要更多控制,请直接使用pymatgen创建Kpoints对象。它很灵活,仅会显示一个简短的示例。有关更多信息,请参见完整的Kpoints文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
from pymatgen.io.vasp.sets import MPRelaxSet
from pymatgen.io.vasp.inputs import Kpoints
from pymatgen import Structure
# load your structure, e.g. from a POSCAR
struct = Structure.from_file('POSCAR')
# the simples way to do this is to create a subclass of the input set you want
# and override the kpoints property to return what you want.
class MyInputSet(MPRelaxSet):
def __init__(self, structure, points=(5,5,5), shift=(0,0,0), **kwargs):
super(MPRelaxSet, self).__init__(structure, MPRelaxSet.CONFIG, **kwargs)
self.points = points
self.shift = shift
@property
def kpoints(self):
# choose either of these
# use Monkhorst-Pack scheme
return Kpoints.monkhorst_automatic(kpts=self.points, shift=self.shift)
# use a Gamma centered scheme
return Kpoints.gamma_automatic(kpts=self.points, shift=self.shift)
# create an instance of the custom input set
my_custom_input_set = MyInputSet(struct, points=(5,5,5), shift=(1,1,1))
# show that the set applied
print(my_custom_input_set.kpoints)
# create the workflow
my_wf = get_optimize_wf(struct, vasp_input_set=my_custom_input_set)
订制INCAR设置

自定义INCAR设置也可以使用VaspInputSet对象来完成,但是使用add_modify_incar Powerup通常更有效

使用不同的POTCAR

您要使用哪个POTCAR文件也由输入集控制。控制它的简便方法是通过更新输入集的config_dict字典。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from pymatgen.io.vasp.sets import MPRelaxSet
from pymatgen import Structure
# load your structure, e.g. from a POSCAR
struct = Structure.from_file('POSCAR')
# create a custom input set
my_custom_input_set = MPRelaxSet(struct)
print('Config dict example: {}\n'.format(my_custom_input_set.config_dict))
print('Before change: {}'.format(my_custom_input_set.config_dict['POTCAR']['Mg']))
my_custom_input_set.config_dict['POTCAR']['Mg'] = 'Mg'
print('After change: {}'.format(my_custom_input_set.config_dict['POTCAR']['Mg']))
# create the workflow
my_wf = get_optimize_wf(struct, vasp_input_set=my_custom_input_set)

警告: 请确保不要尝试嵌套的字典更新(例如my_custom_input_set.config_dict.update({‘POTCAR’:{‘Mg’:’Mg’}}))!它将清除dict中的所有其他POTCAR条目。

Workflow YAML 参考

简介

本文档是您可以在YAML文件中控制的原子化工作流功能的简短参考。它旨在表达可以构成工作流程的所有功能。YAML文件工作流的优点是它们易于理解和共享,尤其是对于非程序员而言。

有关YAML格式的详细信息,请参阅正式的YAML规范。

atomate中的YAML文件

以下示例说明了可以在atwf中使用YAML文件来运行工作流程的示例。除非您要创建的工作流没有现有的YAML工作流,否则必须确定要设置的必需参数和可选参数。每个雾化工作流都必须具有一个结构作为第一个参数。这在所有YAML文件中都暗含,并且不需要包括在内。

常规MP带结构工作流程的YAML格式如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
fireworks:
- fw: atomate.vasp.fireworks.core.OptimizeFW
- fw: atomate.vasp.fireworks.core.StaticFW
params:
parents: 0
- fw: atomate.vasp.fireworks.core.NonSCFUniformFW
params:
parents: 1
- fw: atomate.vasp.fireworks.core.NonSCFLineFW
params:
parents: 1
common_params:
db_file: db.json
$vasp_cmd: $HOME/opt/vasp
name: bandstructure
metadata:
tag: testing_workflow

顶部经常有描述工作流程的注释(标签)(此处未显示)。

fireworks密钥是Fireworks的列表。预计所有此类Fireworks都将“结构”作为第一个参数,并将其后的其他可选参数作为“结构”。每个烟花都是通过“ fw”指定的:

您可以使用特殊关键字params将参数传递给Firework构造函数,这是一个命令。任何以$开头的参数都将使用环境变量进行扩展。如果多个FireWorks共享相同的参数,则可以使用common_params指定传递给所有烟花的一组通用参数。局部参数优先于全局参数。

另一个特殊的关键字是父母,它提供列表中该特定烟花的父母的索引。索引从零开始,即列表中的第一个FireWork为零。因此,如果您希望列表中的第二个FireWork是第一个FireWork的子级,则应为该烟花指定父级0。允许多位父母。这使您可以将Fireworks链接到逻辑工作流程中。

在上面的示例中,我们具有:*第一个FireWork(OptimizeFW)将先于其他事物运行*第二个FireWork(StaticFW)将在OptimizeFW完成后运行*第三和第四个FireWork(NonSCFUniformFW和NonSCFLineFW)将在StaticFW之后运行完成了。请注意,这两个Fireworks可以并行运行。

接下来,使用名称来设置工作流程名称(结构公式+名称),这对保存记录很有帮助。最后,可以将元数据密钥指定为YAML dict /哈希,这将初始化工作流元数据-这纯粹是可选的,并且用于簿记。

EOS Workflow示例

此示例显示使用“运行工作流程教程”中描述的EOS工作流程的YAML版本时,更复杂的工作流程会是什么样子。

为了使用此示例,请使用文本编辑器创建一个名为eos.yaml的文件,然后输入以下文本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# EOS Workflow
# An optimization Firework followed by 7 deformed structures based on the optimized structure
# the deformations are +/- 10% volume of the original cell
fireworks:
- fw: atomate.vasp.fireworks.core.OptimizeFW
user_incar_settings:
SIGMA: 0.2
ISMEAR: 1
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[0.9655, 0, 0], [0, 0.9655, 0], [0, 0, 0.9655]]
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[0.9773, 0, 0], [0, 0.9773, 0], [0, 0, 0.9773]]
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[0.9888, 0, 0], [0, 0.9888, 0], [0, 0, 0.9888]]
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[1.0000, 0, 0], [0, 1.0000, 0], [0, 0, 1.0000]]
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[1.0110, 0, 0], [0, 1.0110, 0], [0, 0, 1.0110]]
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[1.0217, 0, 0], [0, 1.0217, 0], [0, 0, 1.0217]]
- fw: atomate.vasp.fireworks.core.TransmuterFW
params:
parents: 0
transformations:
- DeformStructureTransformation
transformation_params:
- "scaling_matrix": [[1.0323, 0, 0], [0, 1.0323, 0], [0, 0, 1.0323]]
common_params:
vasp_cmd: >>vasp_cmd<<
db_file: >>db_file<<

要将其添加到LaunchPad中,请转到包含POSCAR(或其他结构文件)和eos.yaml的文件夹,运行以下命令将工作流程添加到LaunchPad中:

1
atwf add POSCAR -s eos.yaml

通常认为YAML文件格式易于阅读,但对于更复杂的工作流程则不太实用。EOS工作流的Python实现位于atomate.vasp.workflows.base.bulk_modulus,它使用现有的变形工作流以少于20行的Python代码(包括导入)来表示与上述YAML文件相同的内容。使用Python的另一个优势是能够更好地控制Fireworks,并从工作流中的Firetasks创建它们,例如FitEOSToDb Firetask。

Atomate概念

如果您熟悉(i)VASP,(ii)pymatgen(iii)custodian和(iv)FireWorks,那么大部分atomate操作都非常简单。例如,在atomate / vasp / firetasks中实现的FireTasks应该看起来至少有道理,而在atomate / vasp / fireworks中实现的Fireworks也应该看起来合乎逻辑,而且大多清晰。工作流只是FireWorks的链条(从技术上来说,就是DAG)。通常,它们可以用简单的Python实现,即,请参阅FireWorks代码库,了解如何使用Python组合工作流,但事实证明,它们足够简单,可以将其编写在简单的YAML文本文件中,而不是用Python代码编写。自述文件中有针对atomate / vasp / workflows / base / library文件夹的自定义YAML格式。

实际上,获得预构建的工作流比这容易得多。为此,只需查看atomate / vasp / workflows / presets。该文件夹包含一些功能,使您可以简单地给出晶体结构并返回适当的工作流程。没事!

您可能只需要熟悉几个基本概念,下面将对它们进行描述。

The “env_chk”, e.g. >>db_file<< syntax

编码工作流程中的一个问题是,当不同的机器需要不同的设置时该怎么办。例如,VASP可执行文件的路径或包含数据库凭据的文件的路径可能位于不同计算机上的不同位置。对于希望在多台计算机上运行的用户,此类参数无法进行硬编码。但是,在一台计算机上运行的用户或正在进行测试的用户可能更喜欢对这些参数进行硬编码。

env_chk功能是一种既可以对参数进行硬编码,又可以让计算机(或更具体地说,是FireWorker)设置参数的方法。Atomate中的许多FireTask,例如RunVaspDirect,在文档中都声明它们为vasp_cmd之类的参数“支持env_chk”。这意味着您有两个创建FireTask的选项:

选项1是使用类似my_task = RunVaspDirect(vasp_cmd =“ vasp”)的东西。这的行为与您在常规Python中所期望的完全一样,即,将字符串文字“ vasp”设置为vasp_cmd参数。

选项2使用如下所示的env_chk表示法:my_task = RunVaspDirect(vasp_cmd =“ >> my_vasp_cmd <<”)。如果将>> vasp_cmd`之类的env_chk参数括在>> <<符号中,则说明用户希望从FireWorker的env值中获取值。也就是说,在执行工作流程时,必须使用包{my_vasp_cmd“:” mpirun -n 24 vasp“}的env的FireWorker。在此,字典中的my_vasp_cmd与env_chk中的>> my_vasp_cmd <<字符串匹配。因此,当通过此FireWorker执行VASP时,它将执行命令mpirun -n 24 vasp。例如,位于不同计算中心上的其他FireWorker可能执行不同的VASP命令,并且可以通过设置FireWorker env的不同值来支持此命令。由于工作流仅指向my_vasp_cmd env变量,而没有显式设置VASP命令,因此工作流可以保持完整。在FireWorks教程(尤其是Worker教程)中,有更多有关设置FireWorker env变量的详细信息。单元测试还使用env_chk功能来找到数据库配置文件。例如,请参阅单元测试:atomate.vasp.tests.test_vasp_workflows.TestVaspWorkflows#test_single_Vasp_dbinsertion,您将对它的工作方式有所了解。只要记住,如果您看到类似>> db_file <<的内容,则在运行工作流时,FireWorker将需要这样设置环境:FWorker(env = {“ db_file”:“ path / to / db.json”})并且您将需要在启动作业时使用该FireWorker。

CalcLocs

如果您要运行多个VASP作业,而这些作业依赖于复制以前作业的输出,则一个问题是如何将以前VASP作业的目录信息从Firework传递到Firework。可以手动执行此操作(如在MPWorks代码库中所做的那样),也可以使用Fireworks中内置的pass_job_info关键字来执行此操作,但是在atomate中执行此操作的标准方法是CalcLocs。程序上,您需要做的就是将`PassCalcLocs FireTask添加到每个包含VASP作业的Firework中(有关示例,请参见atomate.vasp.fireworks.core)。诸如CopyVaspOutput之类的下游作业将具有一个calc_loc变量,该变量可以设置为True,并且将自动获取之前解析的先前VASP目录。与VaspToDbTask类似。请注意,此系统的几个优点是:

  • 这是一种可与任何Firework一起使用的传递VASP目录的通用方法,不需要您编码将VASP目录传递到其他函数内部的逻辑(例如,以前在MPWorks中完成的数据库插入任务)。因此,报告和传递VASP作业位置的任务与其他功能完全分开,并且可以很容易地添加。唯一的缺点是您必须记住添加此FireTask。
  • CalcLocs维护正在运行的作业类型到作业位置的字典。如果您需要从多个作业中获取输出(或者说从两个作业中获取输出),那么框架中都支持所有输出。只需阅读例如CopyVaspOutput的文档即可。
  • 作业目录位于不同的机器上,并且需要scp或其他复杂的传输机制由此基础结构自动处理。您不必松开手指!只需告诉父级Firework传递calcloc,然后告诉子级烟花复制vasp输出(支持calcloc框架)。

Workflow “Powerups”

工作流上电旨在像功能装饰器一样,但用于工作流。例如,假设您建立了一个计算带结构的多步骤工作流程。现在,您要确保工作流程一旦开始运行,就优先完成该特定工作流程而不是启动其他工作流程。通过将工作流程进行“加电”,您可以返回经过修饰的工作流程,该工作流程在您的工作流程中设置Fireworks的优先级以赋予此行为(例如,为所有子Fireworks 2X赋予根父级的优先级)。此特定的powerup位于atomate.vasp.vasp_powerups.add_priority中。例如,另一个启动功能可让您在FireWorks数据库中跟踪作业的状态(输出文件中的最后几行)。

注意,另一个计划的“powerup”是赋予工作流重复检查的能力,即确保同一结构不会运行两次。过去,这种重复检查逻辑将与工作流的其余部分(关于设置VASP参数,运行VASP等)混合在一起,最终结果是一个非常混乱的工作流代码。由于所有逻辑都是混合在一起的,因此也很难根据需要关闭和打开重复检查。通过将重复检查移至“加电”,只需将工作流传递给适当的powerup即可简单地启用重复检查。

有关示例,请参见vasp_powerups.py文件。

Tuning performance on different machines

VASP具有某些INCAR参数,例如NCORE,NPAR,KPAR等,可以根据您的计算机进行调整。由于ModifyIncar firetask支持env_chk,因此也可以在fireworker配置文件(my_fworker.yaml)中设置这些值。比如:

1
2
3
env:
incar_update:
NCORE: 24

请注意,NCORE设置可在单个轨道上工作的核心数量。通常,您希望将此值设置为1(较高的内存要求)和每个节点的核心数(较低的内存要求,同时仍在单个轨道上的工作人员之间保持快速通信时间)之间。一个很好的起点可能是按照VASP手册将NCORE设置为等于每个节点的内核数的平方根。在NERSC机器上设置NCORE参数时,以下信息可能会派上用场:

  • Edison - 24 tasks per node
  • Cori - 32 tasks per node
  • Matgen - 16 tasks per node

因此,一个好的起点是为Matgen / Edison设置NCORE = 4,为Cori设置NCORE = 8。如果要尝试提高速度,而降低每个轨道的可用内存的风险,请减少NCORE。

参考

人艰不拆,生活不易