Skip to content

基于Atomate2工作流计算材料弹性矩阵并自动后处理输出弹性模量

Atomate2 是由 Materials Project 团队开发的开源材料科学工作流管理系统,旨在通过简单的 Python 函数实现复杂的第一性原理计算自动化。它基于 pymatgen、custodian、jobflow 和 FireWorks 等开源库构建,支持高通量计算和材料属性预测,广泛应用在电池材料、半导体、催化等领域。

本次实操,我们将介绍如何在超算互联网使用Atomate2工作流计算材料弹性矩阵并自动后处理输出弹性模量。以Si单质为例,展示从到结构文件读取到工作流执行、自动化数据后处理的完整流程,并提供完整的 Python 脚本代码,为进一步研究不同材料的弹性特性构建了标准化、可复现的工作流框架。

一、超算互联网环境配置

1. conda新建一个atomate2环境

采用conda进行环境管理以免与其他python环境依赖冲突

shell
    conda create -n atomate2 python

2. pip一键安装

切换到atomate2环境后直接pip一键安装即可

shell
   conda activate atomate2

   pip install atomate2

3. 配置pymatgen环境

实际计算的输入文件自动生成和数据后处理需要使用pymatgen,安装Atomate会一起安装pymatgen,因此只需要配置势函数即可:https://pymatgen.org/installation.html

4. 配置Atomate2环境

  • 在超算用户家目录下新建一个atomate2文件夹,并新建config、log两个字文件夹:

    atomate2
    ├── config
    └── logs

  • 在config文件夹中新建jobflow.yaml文件

    jobflow.yaml文件定义工作流的信息以及任务的输入和输出路径数据库。官网介绍了怎么通过云端数据库进行连接。受限于网络等限制,该方法国内用户可能会有连接问题。

    因此,这里主要介绍如何通过本地json文件进行配置,只需要安装jobflow.yaml文件:

    shell
        JOB_STORE:
          docs_store:
            type: JSONStore
            paths: CURRENT_DIR.json
            read_only: False
          additional_stores:
            data:
              type: JSONStore
              paths: CURRENT_DIR.json
              read_only: False

    计算路径可以在jobflow.yaml中指定,也可以在每次计算的python脚本中指定。

  • 在config文件夹中新建atomate2.yaml文件

    atomate2.yaml文件用于记录软件运行中各种的命令,这里需要定义一下VASP的运行命令:

    下面是一个超算互联网上vasp任务的提交脚本:

    text
      #!/bin/bash
      #SBATCH -J vasp
      #SBATCH -N 1
      #SBATCH --ntasks-per-node=32
      #SBATCH -p wzhctest
    
      module purge
      source /work/home/andyhox/apprepo/vasp/6.4.2-ioptcell_intelmpi2017_hdf5_libxc/scripts/env.sh
    
      export MKL_DEBUG_CPU_TYPE=5 #加速代码
      export MKL_CBWR=AVX2 #使cpu默认支持avx2
      export I_MPI_PIN_DOMAIN=numa #内存位置与cpu位置绑定,加速内存读取。对于内存带宽要求高的计算提速明显
    
      srun --mpi=pmi2 vasp_std

    在atomate2.yaml文件中只需要加入下面的命令即可:

    text
      VASP_CMD: srun --mpi=pmi2 vasp_std
  • 在环境变量中加入atomate2配置文件

    在.bashrc中加入:

    text
      export ATOMATE2_CONFIG_FILE="/work/home/andyhox/atomate2/config/atomate2.yaml"
      export JOBFLOW_CONFIG_FILE="/work/home/andyhox/atomate2/config/jobflow.yaml"

    文件的路径换成你的atomate2文件夹路径即可。

Si单质弹性模型计算案例

第二步,我们以Si单质弹性模型计算为例,展示从到结构文件读取到工作流执行的完整流程。

Si单质原胞的结构如下:

1.png

代码实现

指定JSON文件路径

python
# 导入包
from jobflow import run_locally, SETTINGS
import os

# 工作路径
work_dir = os.getcwd()

# 定义数据数据库
docs_path = os.path.join(work_dir,'docs')
data_path = os.path.join(work_dir,'data')
os.makedirs(docs_path,exist_ok=True)
os.makedirs(data_path,exist_ok=True)

SETTINGS.JOB_STORE.docs_store.paths = [os.path.join(docs_path,'doc.json')]
SETTINGS.JOB_STORE.additional_stores['data'].paths = [os.path.join(data_path,'data.json')]

代码解释:

python
# 定义数据数据库
docs_path = os.path.join(work_dir,'docs')
data_path = os.path.join(work_dir,'data')
os.makedirs(docs_path,exist_ok=True)
os.makedirs(data_path,exist_ok=True)

上述代码在当前文件夹下新建docs、data两个文件夹用来储存数据。

python
SETTINGS.JOB_STORE.docs_store.paths = [os.path.join(docs_path,'doc.json')]
SETTINGS.JOB_STORE.additional_stores['data'].paths = [os.path.join(data_path,'data.json')]

上述代码将jobflow.yaml文件中的路径重定向为当前路径下的docs和data两个文件夹路径。

其中docs文件夹储存doc.json文件,该文件用于储存数据量较小的数据,例如结构,计算参数,计算过程的离子比和电子步;

data文件夹储存data.json文件,该文件用于储存数据量大的数据,例如能带、态密度的计算结果。

调用弹性计算工作流

python
# 导入包
from pymatgen.core.structure import Structure
from atomate2.vasp.flows.elastic import ElasticMaker
import os

# 读取结构
struct = Structure.from_file(os.path.join(work_dir,'Si.cif'))

# 直接调用工作流
elastic_flow = ElasticMaker().make(struct)

# 运行工作流
run_locally(elastic_flow, create_folders=True)

代码解释:

python
from atomate2.vasp.flows.elastic import ElasticMaker

ElasticMaker是Atomate2内置的工作流,可以直接使用。弹性常数的计算方法为能量--应变方法。

完整代码

python
from atomate2.vasp.flows.elastic import ElasticMaker
from jobflow import run_locally, SETTINGS
from pymatgen.core.structure import Structure
import os

work_dir = os.getcwd()

# 定义数据数据库
docs_path = os.path.join(work_dir,'docs')
data_path = os.path.join(work_dir,'data')
os.makedirs(docs_path,exist_ok=True)
os.makedirs(data_path,exist_ok=True)

SETTINGS.JOB_STORE.docs_store.paths = [os.path.join(docs_path,'doc.json')]
SETTINGS.JOB_STORE.additional_stores['data'].paths = [os.path.join(data_path,'data.json')]

# 读取结构
struct = Structure.from_file(os.path.join(work_dir,'Si.cif'))

# 直接调用工作流
elastic_flow = ElasticMaker().make(struct)

# 运行工作流
run_locally(elastic_flow, create_folders=True)

提交计算

如果是在本地进行计算,可直接运行上述代码。如果需要提交到超算集群上进行计算,则需要修改一下提交脚本:

text
#!/bin/bash
#SBATCH -J vasp
#SBATCH -N 1
#SBATCH --ntasks-per-node=16
#SBATCH -p wzhctest

module purge
source /work/home/andyhox/apprepo/vasp/6.4.2-ioptcell_intelmpi2017_hdf5_libxc/scripts/env.sh

export MKL_DEBUG_CPU_TYPE=5 #加速代码
export MKL_CBWR=AVX2 #使cpu默认支持avx2
export I_MPI_PIN_DOMAIN=numa #内存位置与cpu位置绑定,加速内存读取。对于内存带宽要求高的计算提速明显

source activate atomate2
python elastic_workflow.py &> log

需要修改的只有最后两行,即进入atomate2的环境,然后运行对应的python脚本即可。

提交脚本中不需要填写vasp的运行命令,因为在之前的atomate2.yaml文件中已经指定。

此时工作目下只需要有三个文件即可:

  • 结构文件:Si.cif
  • 工作流脚本:elastic_workflow.py
  • 任务提交脚本:vasp.slurm

2.png

然后正常提交任务即可:sbatch vasp.slurm

数据后处理与分析

计算完成后,工作目录下会生成一系列job_开头的文件夹,每一个文件夹都表示工作流中的一个子任务。

3.png

我们需要处理的数据全部在docs文件夹里面的doc.json文件里面:

4.png

可以看到doc.json文件的内容不是非常好读,当然了,我们分析数据也不是直接去查找文件,同样也是通过代码去查询。

查询代码

写一个query.py脚本查询数据

python
# 导入包
from jobflow import SETTINGS
from pprint import pprint
import pandas as pd
import os

# 工作目录
work_dir = os.getcwd()

# 数据库路径
docs_path = os.path.join(work_dir,'docs')
data_path = os.path.join(work_dir,'data')
SETTINGS.JOB_STORE.docs_store.paths = [os.path.join(docs_path,'doc.json')]
SETTINGS.JOB_STORE.additional_stores['data'].paths = [os.path.join(data_path,'data.json')]

# 连接到数据库
store = SETTINGS.JOB_STORE
store.connect()

# 查询弹性矩阵
elastic_tensor = store.query_one(
    {'name':'fit_elastic_tensor'},
    properties=['output.elastic_tensor']
)
data = pd.DataFrame(elastic_tensor['output']['elastic_tensor']['raw'], index=None)
print(data)

# 查询弹性性质
derived_properties = store.query_one(
    {'name':'fit_elastic_tensor'},
    properties=['output.derived_properties']
)

elastic_properties = derived_properties['output']['derived_properties']
df = pd.DataFrame(list(elastic_properties.items()), columns=["Property", "Value"])
print(df)

此时结果可输出6X6的弹性矩阵:

5.png

以及处理好的体模量、弹性模量、德拜温度、泊松比等性质:

6.png

每个property​对应的意思如下:

k_voigt​:Voigt average of the bulk modulus.

k_reuss​: Reuss average of the bulk modulus.

k_vrh​: Voigt-Reuss-Hill average of the bulk modulus.

g_voigt​: Voigt average of the shear modulus.

g_reuss​: Reuss average of the shear modulus.

g_vrh​: Voigt-Reuss-Hill average of the shear modulus.

universal_anisotropy​: Universal elastic anisotropy.

homogeneous_poisson​: Homogeneous poisson ratio.

y_mod​: Young’s modulus (SI units) from the Voight-Reuss-Hill averages of the bulk and shear moduli.

trans_v​: Transverse sound velocity (SI units) obtained from the Voigt-Reuss-Hill average bulk modulus.

long_v​: Longitudinal sound velocity (SI units) obtained from the Voigt-Reuss-Hill average bulk modulus.

snyder_ac​: Synder’s acoustic sound velocity (SI units).

snyder_opt​: Synder’s optical sound velocity (SI units).

snyder_total​: Synder’s total sound velocity (SI units).

clark_thermalcond​: Clarke’s thermal conductivity (SI units).

cahill_thermalcond​: Cahill’s thermal conductivity (SI units).

debye_temperature​: Debye temperature from longitudinal and transverse sound velocities (SI units).

总结

通过上述步骤,可以形成两个固定的计算弹性常数的脚本:

  • elastic_workflow.py:弹性常数计算工作流
  • query.py:一键查询数据

针对不同的结构,只需要在elastic_workflow.py中替换一下读取的结构即可,其余的操作不变。

以上,我们就完成了如何在超算互联网使用Atomate2工作流计算材料弹性矩阵并自动后处理输出弹性模量的实践详解。

希望本篇最佳实践为您提供一些有价值的信息和实践技巧。