PyAmesp——Amesp与ASE的联姻

PyAmesp——Amesp与ASE的联姻为了进一步降低程序使用的门槛并弥补一些功能上的短板 我们尝试为 Amesp 增加一个接口程序 PyAmesp 通过 ASE 调用 Amesp 进行理论计算 实现 Amesp 与 ASE 的集成与 联姻

大家好,欢迎来到IT知识分享网。

最近,张英峰博士发布了国产量子化学程序
Amesp
。为了进一步降低程序使用的门槛并弥补一些功能上的短板,我们尝试为
Amesp
增加一个接口程序
——PyAmesp
,通过
ASE (Atomic Simulation Environment)
调用
Amesp
进行理论计算,实现
Amesp

ASE
的集成与

联姻

。本文将给出
PyAmesp
的安装过程,并对
ASE
做简要介绍,随后展示利用
ASE
调用
Amesp
进行结构的优化与过渡态的计算。(注:本文适合具备一定
Python

ASE
基础的读者,如果您对
ASE
及其使用方法不熟悉,可以登录
ASE
官网
https://wiki.fysik.dtu.dk/ase/
获取更多信息。





. ASE
介绍


1. ASE
简介


ASE
是一个旨在原子和电子尺度上建立、控制、可视化和分析计算结果的
Python
模块。
ASE
提供了大量的基础类(
Class
),例如
“Atoms”
存储了与原子相关的属性与位置的信息,可以通过
ASE

io
模块实现不同结构文件之间的格式转换。同时
ASE
也提供了大量电子结构计算程序代码的接口,可将能量、能级、力、应力等诸多信息导入
ASE
,从而实现以
ASE
作为优化器进行结构优化、分子动力学、过渡态搜索,以及预览分子
/
晶体结构、绘制声子谱和能带等结果的分析工具。在
Python
语言强大的语法和生态加持下,通过
ASE
可以轻松定义和控制分子或晶体结构和计算参数,实现复杂的计算化学工作流,大大提升研究者的工作效率,并在一定程度上避免重复造轮子。




2.
为什么让
ASE

Amesp
联姻?



ASE

Amesp
进行联姻,可以利用
ASE
转换
Amesp
的输入输出文件,并调用
Amesp
使用更多的优化算法进行结构优化以及
CI-NEB

Dimer
实现过渡态搜索,即
Amesp
变为一个
Calculator
,由此达到从建模到格式转换,再到计算、分析与可视化计算结果,实现
Amesp
计算的

一条龙

服务。





. PyAmesp
安装


我们假设已经安装好了
Python

ASE

Python
版本
≥3.6

NumPy
版本
≥1.11.3

ASE
版本
≥3.20.0

Python
安装完成后,可通过
pip install ase
自动安装
ASE
)。
PyAmesp
可在
github
进行下载:
https://github.com/DYang90/PyAmesp
再按照如下方式进行安装(注:“$”表示Linux中的命令提示符,安装时不用输入)



$ tar -zxvf PyAmesp.tar.gz$ cd PyAmesp$ pip install -e


注意:用户应按照
Amesp
手册正确设置相关环境变量。





. PyAmesp
包的使用方法


我们以经典的有机化学
Diels–Alder
反应为例,通过
PyAmesp
实现
ASE
调用
Amesp
完成结构优化和搜索过渡态的过程。在本例中我们的计算参数是:
12
核心处理器且每核心内存最大占用为
1 GB
,计算的方法基组为
M06-2X/6-31G
,积分格点使用
grid5
级别,其余选项采用
Amesp
中的默认设置。




  1. 1.
    反应物及产物结构优化

我们先通过分子结构的建模程序构建反应物乙烯和
1,3-
丁二烯以及产物环己烯,将这些结构保存为
xyz
或者
Gaussian

gjf
等一系列格式。然后我们编写
Python
程序,通过
ASE

io
模块将结构按照
Atoms
类格式读入:(注:
>>>

Python
交互式解释器的提示符,不用输入)



>>> from ase import io>>> label = 'product'>>> atoms = io.read('%s.xyz' % label)


按照前文提到的计算参数设置
Amesp
并将其指定为
atoms
的计算引擎:



>>> from PyAmesp import Amesp>>> amesp = Amesp(atoms=atoms, label=label, maxcore=1024, npara=12, charge=0, mult=1, keywords=['m06-2x', '6-31g','grid5', 'force'] )>>> atoms.calc = amesp


注意:进行结构优化以及过渡态计算需要计算原子受力,在
keywords
必须手动指定关键字
force
。接下来使用
optimize
模块的
BFGSLineSearch
优化器对结构进行优化直至力收敛到
0.02 eV/Å
,并保存优化轨迹:



>>> from ase.optimize import BFGSLineSearch>>> dyn = BFGSLineSearch(atoms)>>> traj = io.Trajectory('%s.traj' % label, 'w', atoms)>>> dyn.attach(traj)>>> dyn.run(fmax=0.02)


上述完整程序可以参考
PyAmesp/Examples/Ex1/RunAmesp.py
。最终程序经过
8

BFGS
步骤达到收敛,并将优化过程中结构及相应的能量与受力等信息保存到
product.traj
中。通过以下命令:


$ ase gui product.traj


利用
ASE
自带的预览器查看结果,程序将会默认显示优化后的分子结构以及能量相对变化,如图
1
所示。在菜单栏中的【视图】

【简要信息】,或是用快捷键
Ctrl+I
来查看当前结构的能量和受力。在菜单栏中的【文件】

【保存】或者通过快捷键
Ctrl+S
可以将整个轨迹或者当前结构导出为其他格式。


PyAmesp——Amesp与ASE的联姻1. 利用ASE预览器查看优化的几何结构和相对能量

关于优化器的选择,除了
BFGSLineSearch

ASE
还提供了如
FIRE

GPMin
等优化器,可参考
https://wiki.fysik.dtu.dk/ase/ase/optimize.html
,此处不再赘述。除了
ASE
所提供的优化器,
PyAmesp
也支持使用
Gaussian
作为优化器通过
External
关键字对
Amesp
进行调用,例如对反应物结构
reactant.xyz
进行优化,与读取
Amesp
参数类似,但从指定计算引擎和设置优化器开始,将会与上面
BFGSLineSearch
优化产物的例子有些许差别,需要从
PyAmesp
模块导入
GaussianExternal
类来根据
Amesp
设置的参数自动产生调用脚本
gaussian_amesp.py



>>> from PyAmesp import GaussianExternal>>> gext = GaussianExternal(label=label, parameters=amesp.parameters)>>> gext.write_script()


再通过
ASE

Gaussian
的接口指定
Gaussian
使用
External
关键字调用
gaussian_amesp.py
脚本进行优化:



>>> from ase.calculators.gaussian import Gaussian, GaussianOptimizer>>> gau = Gaussian(label=label, external='\'python3 gaussian_amesp.py\'')>>> opt = GaussianOptimizer(atoms, gau)>>> opt.run(fmax='tight', steps=100, opt='nomicro,gdiis')


查看结果时,与使用
ASE

optimize
模块不同,优化过程的相关信息将会记录在
Gaussian
的输出文件
reactant.log
中,也可以通过
ASE
的预览器查看
log
文件,本例经过
30
步优化达到收敛。上述案例的完整程序可以参考
PyAmesp/Examples/Ex2/RunAmesp.py
,但需要注意的是这种使用方法还处于测试阶段,暂不确定这种调用形式是否为最终设计。




2.
过渡态搜索


在获得反应物与产物的结构之后,可以通过
ASE
调用
Amesp
进行
CI-NEB
或者
Dimer
计算,从而得到
Diels–Alder
的反应过渡态。下面的案例将使用
CI-NEB
搜索该反应的过渡态(该案例参考了
ASE
官网
NEB
的例子
https://wiki.fysik.dtu.dk/ase/ase/neb.html
)。先将前面优化得到的
traj
进行读取,然后建立一个
6
帧的轨迹,首尾分别为反应物和产物:



>>> from ase import io>>> ini = io.read('reactant.traj')>>> fin = io.read('product.traj')>>> images = [ini.copy() for i in range(6)]>>> from PyAmesp import Amesp>>> label = 'neb'>>> for i,img in enumerate(images): amesp = Amesp(…) #这里参数与上面相同,作为示例只是省略了没写 img.calc = amesp>>> images[-1] = fin


然后建立
NEB
类并进行
idpp
插值获取初始的
chain



>>> from ase.neb import NEB>>> neb = NEB(images, climb=True)>>> neb.interpolate(method='idpp')


最终通过
LBFGS
优化直至受力收敛到
0.02 eV/Å
并保存最终的
chain
轨迹:



>>> dyn = LBFGS(neb, trajectory='%s.traj' % label)>>> dyn.run(fmax=0.02)>>> io.write('%s.json' % label, images)


最终经过
58

LBFGS
优化找到过渡态,其结构如图
2
所示。


PyAmesp——Amesp与ASE的联姻2. ASE预览器查看过渡态结构以及轨迹的相对能量

经过频率计算验证,得到一个非低频的虚频,完整案例可以参考
PyAmesp/Examples/Ex3/RunAmesp.py
。为了更高效获得这个过渡态的结构,可以先以受力收敛
0.5 eV/Å
为标准使用
CI-NEB
优化,然后用
Dimer
方法做更细致的优化。
Dimer
计算的具体过程这里不再详述,可以参考
PyAmesp/Examples/Ex4/RunAmesp.py
,频率分析相关的功能目前我们还并没有集成在
PyAmesp
当中。





.
总结


本文主要介绍了
PyAmesp
的功能、安装以及使用方法。通过使用
Python
编写
PyAmesp
,使得
ASE
能够调用
Amesp
完成优化以及过渡态等计算任务。通过
ASE

Amesp
的联姻可以为量子化学计算提供更多的选择性与更高的灵活性,进而更加高效地进行理论计算,探索物质的特性和反应机制。




随着
Amesp
的发展逐渐成熟,其作为
Calculator
的功能将会进一步扩展。同时
Amesp
还可以与其他程序进行联合,实现更复杂的计算任务。相信随着时间的推移,我们将能够利用
Amesp
的强大功能,以及与其他程序的联合使用,开展更深入和复杂的探索与研究。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/159087.html

(0)
上一篇 2024-11-28 19:26
下一篇 2024-11-28 19:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信