M3GNet机器学习势,支持GPU加速,安装该势函数的时候,就需要选择相应的版本(当然前提是机器本身有用于GPU计算的显卡)。安装过程参考:机器学习力场的安装
因为 M3GNET 是针对这类锂电池材料结构的能量而训练得到的力场,因此能够很好地、符合预期地再现这些材料中的 Li 嵌入势。下图是 M3GNET 与 DFT 或实验结果的对比:
因此 M3GNET 可以用于筛选未知材料,或快速评估给定成分的 Li 嵌入势。不过 M3GNET 无法很好地描述脱锂前后体积的变化,因为它是基于 PBE(+U) 训练的,并且一些相关材料的结构没有用该理论水平很好地描述(理想情况下,结构应使用 BAND 和SCAN泛函进行计算)。
本文提供了一个基于 PLAMS 的 Python 脚本,可以调用 M3GNET 力场或者基于DFT的 BAND 模块进行计算,对不同材料的Li嵌入势进行筛选。其中 Li 嵌入势的定义,例如对 Li$_n$O$_6$Ti$_3$:
V$_{Li}$ = [E(Li$_n$O$_6$Ti$_3$) -E(O$_6$Ti$_3$)-E(Li)*n]/n
脚本还计算了晶胞体积变化:V(O$_6$Ti$_3$) - V(Li$_n$O$_6$Ti$_3$)
下载压缩文件并解压,得到一个 cif 文件夹以及一个 Python 脚本名为 Li_potential.py。其中 cif 文件夹存放的是样本结构,可以存放多个。筛选时,用户可以基于这些样本结构,分别替换其中的过渡金属和氧元素,然后计算上述两种数据。
用户可以通过如下2行修改过渡元素和替换氧元素的元素列表:
tm_list = ['Ti','V','Cr','Co','Mn','Fe','Ni'] anion_list = ['O','S']
其中
运行作业:AMSJobs 进入该脚本所在文件夹(注意该文件夹所在路径不能包含中文、空格),菜单栏 Help → Command-line 打开命令行,输入 sh 回车,输入 amspython Li_potential.py 回车,屏幕上将输出需要信息:
Microsoft Windows [版本 10.0.22621.1702] (c) Microsoft Corporation。保留所有权利。 D:\ADF_DATA\Task\Li_potential>sh sh-4.4$ amspython Li_potential.py cif/ plams_workdir.002/ plams_workdir.004/ Li_potential.rar plams_workdir/ plams_workdir.003/ plams_workdir.005/ sh-4.4$ amspython Li_potential.py PLAMS working folder: D:\ADF_DATA\Task\Li_potential\plams_workdir.006 [16.05|11:30:22] JOB Li3O6Ti3 STARTED [16.05|11:30:22] JOB Li3O6Ti3 RUNNING [16.05|11:30:35] JOB Li3O6Ti3 FINISHED [16.05|11:30:36] JOB Li3O6Ti3 SUCCESSFUL Li3O6Ti3 was done, with 3 Li atoms in lattice, Volume of Cell: 103.70216 Angstrom^3 [16.05|11:30:36] JOB O6Ti3 STARTED [16.05|11:30:36] JOB O6Ti3 RUNNING [16.05|11:30:51] JOB O6Ti3 FINISHED [16.05|11:30:51] JOB O6Ti3 SUCCESSFUL O6Ti3 was done, with 0 Li atoms in lattice, Volume of Cell: 102.69002 Angstrom^3 Li3O6Ti3 → O6Ti3 Cell Volume Change: -0.33738000000000073 Angstrom^3 Li intercallation potential of Li3O6Ti3 : 2.3401228462519685 Volts >>> Li3O6Ti3 -0.337 2.340 以下省略
即:
脚本中如下一行
model = 'm3gnet' # m3gnet, band
改为
model = 'band' # m3gnet, band
即调用 AMS 中的 BAND 模块进行计算,默认使用 TZP 基组、SCAN-D3 泛函,当然用户可以改为小一些的基组例如 DZP:
s.input.band.Basis.Type = 'TZP'
改为
s.input.band.Basis.Type = 'DZP'
即可。