预存
Document
当前位置:文库百科文章详情
ASE原子模拟环境入门之结构优化: H2O
来源: 时间:2022-12-16 16:40:21 浏览:4205次

我们来计算一下H2O分子的结构

练习:创立一个Atoms对象来代表一个水分子,提供分子的化学符号,猜测没各原子的位置。将它可视化,保证分子呈V字形。

练习:使用GPAW给这个猜测的H2O分子运行一个自洽计算。




优化器


我们接下来要优化几何构型。ASE提供了几种优化算法,可以在配备求解器的atom上运行:


from ase.optimize import BFGS

opt = BFGS(atoms, trajectory='opt.traj', logfile='opt.log')

opt.run(fmax=0.05)

练习:运行一个结构优化,计算H2O的平衡几何构型。

上面的trajectory关键字确保中间几何构型的轨迹被写入opt.traj。

练习:将输出的轨迹可视化,并动态地播放。用鼠标拖动选框选择水分子的三个原子——这将显示它们的夹角。H2O的H-O-H夹角是多少?

在ASE中,如果我们知道正确的语法,我们也可以通过编程来做事情:


from ase.io import read

atoms = read('opt.traj')

print(atoms.get_angle(0, 1, 2))

print(atoms.get_angle(2, 0, 1))

print(atoms.get_angle(1, 2, 0))

有关Atoms对象的文档提供了一个很长的方法列表。



G2分子数据集


ASE知道许多常见的分子,所以我们实际上不需要自己输入所有的分子坐标。就是这么幸运,ase.build.molecule()函数做的正是我们需要的:


from ase.build import molecule

atoms = molecule('H2O', vacuum=3.0)

这个函数从G2测试集返回一个分子,如果我们能记住分子的确切名称,这就很好了。如果我们没有记住所有的分子名,我们使用G2测试集的更通用的模块ase.collections.g2:

from ase.collections import g2

print(g2.names)  # These are the molecule name

satoms = g2['CH3CH2OH']

view(atoms)

view(g2)  # View all 162 systems




使用其它计算软件


我们同样可以使用其它计算软件,通常是通过接口(sockets)来访问的,比如form  ase.calculators.emt import EMTfrom  ase.calculators.aims import Aims。有关列表,请参见ase.calculators或运行:


$ ase info --calculators

我们以计算软件FHI-Aims为例。用户自行安装FHI-Aims。然后我们使用FHI-Aims来进行同样的弛豫计算。但在上面的列表中,Aims(可能)并不是可用的。我们首先需要告诉ASE如何运行Aims。这意味着: 1)用于运行Aims的命令;

2)在哪里可以找到有关的信息。 我们可以通过在shell中设置环境变量来实现:

$ export ASE_AIMS_COMMAND=aims.x

$ export AIMS_SPECIES_DIR=/home/alumne/software/FHIaims/species_defaults/light

ase info --calculators命令可以告诉我们,它认为Aims可执行文件名为aims.x

然而,如果我们打开一个新的shell,它会忘记这一点。如果我们又不想在这些电脑上修改.bashrc文件,那么我们可以在Python脚本中设置这些变量:


import os

os.environ['ASE_AIMS_COMMAND'] = 'aims.x'

os.environ['AIMS_SPECIES_DIR'] = '/home/alumne/software/FHIaims/species_defaults/light'

练习:使用ASE调用FHI-Aims计算软件运行一个H2O结构优化计算

要启用力的计算,需要compute_forces=True。Aims需要一个明确给定的XC泛函,所以我们将xc='LDA'。xc关键字由几个ASE计算器支持,可以更容易地指定常用的xc泛函。

运行之后,会出现一下新的文件。ASE会先建立control.ingeometry.in,然后在这两个输入文件的基础上运行FHI-Aims,产生aims.out。一定要检查一下这些文件。作为完美主义者和偏执狂,我们当然期望保证ASE设置的每一个参数都是我们所设想的。

大多数ASE计算器可以使用calc.write_input_file(atoms)生成一个文件,而不触发计算。例如,如果您希望现在生成文件,但是以后运行它们(无论是否使用ASE),这是非常有用的。

ASE知道许多文件格式。ase.io.read()可以读取输入文件和输出文件,并返回Atoms。这些文件也可以用ASE  GUI直接打开。

注意,默认情况下,后续的计算将相互覆盖。因此Aims输入和输出文件对应于结构弛豫的最后一步。ase.optimize的文档会告诉我们,我们可以通过添加一个“观察者”(observer)来阻止这种覆盖的行为,或者使用更灵活的ase.optimize.Dynamics.irun()方法来强制将不同的步骤放到不同的目录中。




附录:计算器与代码之间的通信


下面的知识对于正常使用ASE不是必要的。除非您对如何优化ASE和外部计算器之间的通信感兴趣,否则您可以跳过。

不同的计算器以不同的方式与计算代码通信。GPAW是用Python编写的,因此ASE和GPAW运行在同一个进程中。然而,FHI-aims是一个单独的程序。Aims计算器为我们所做的是生成一个输入文件,运行FHI-aims,读取输出,并返回结果。

我们刚做了一个涉及多个几何步骤的弛豫。每一步都启动一个新的Aims流程,然后停止。这是低效的,因为一个步骤的基态电荷密度和波函数将是下一个步骤的一个很好的初始猜测,降低了收敛所需的步骤数。但是当程序终止时,这些量就丢失了。为了在结构优化和动力学方面获得最佳性能,我们需要避免这种效率损失。

许多ASE计算器支持更高级的通信方式。这些计算器可以通过管道(pipes)(Lammps, CP2K)或接口(sockets)(Siesta, Aims,  Espresso)与持久外部进程通信,或者它们可以通过直接库调用(Lammpslib, GPAW)在同一进程中工作。

ASE可以使用i-PI协议通过接口(sockets)与FHI-aims 通信(http://ipi-code.org/)。这是通过将计算器包装在ase.calculators.socketio.SocketIOCalculator中来实现的。接口(sockets)计算器将使用它包装的计算器来启动一个计算,然后运行它。

关于接口(sockets)I/O计算器的文档已经提供了完整的示例,因此我们只需要稍作调整就可以在本地机器上运行它们。

选做练习:给予我们刚才使用FHO-aim进行弛豫计算的例子,写一段代码使用ase.calculators.socketio.SocketIOCalculator运行同样的计算

你可以运行python3  myscript.py来查看计算总共花了多长时间。在接口(sockets)上运行弛豫能得到多大的加速?INET接口(sockets)通常具有高延迟。如果你没有看到太多的加速,这可能是原因。在这种情况下,尝试切换到UNIX接口(sockets)。

接口(sockets)I/O计算器自动生成一个输入文件,并立即启动计算。因为它只启动流程一次,所以后续步骤不会相互覆盖,我们可以在aims.out中找到所有的中间步骤。

练习答案

GPAW优化


from ase import Atoms

from ase.optimize import BFGS

from gpaw import GPAW

atoms = Atoms('HOH',positions=[[0, 0, -1], [0, 1, 0], [0, 0, 1]])

atoms.center(vacuum=3.0)

calc = GPAW(mode='lcao', basis='dzp', txt='gpaw.txt')

atoms.calc = calc

opt = BFGS(atoms, trajectory='opt.traj')

opt.run(fmax=0.05)

FHI-aims优化


import os

from ase import Atoms

from ase.optimize import BFGS

from ase.calculators.aims import Aims

os.environ['ASE_AIMS_COMMAND'] = 'aims.x'

os.environ['AIMS_SPECIES_DIR'] = '/home/alumne/software/FHIaims/species_defaults/light'

atoms = Atoms('HOH',positions=[[0, 0, -1], [0, 1, 0], [0, 0, 1]])

calc = Aims(xc='LDA', compute_forces=True)

atoms.calc = calc

opt = BFGS(atoms, trajectory='opt-aims.traj')

opt.run(fmax=0.05)

FHI-aims/socket-io优化

import os

from ase import Atoms

from ase.optimize import BFGS

from ase.calculators.aims import Aims

from ase.calculators.socketio import SocketIOCalculator

os.environ['ASE_AIMS_COMMAND'] = 'aims.x'

os.environ['AIMS_SPECIES_DIR'] = '/home/alumne/software/FHIaims/species_defaults/light'

atoms = Atoms('HOH',positions=[[0, 0, -1], [0, 1, 0], [0, 0, 1]])

opt = BFGS(atoms, trajectory='opt-aims-socketio.traj')

aims = Aims(xc='LDA',compute_forces=True,use_pimd_wrapper=('UNIX:mysocket', 31415))

with SocketIOCalculator(aims, unixsocket='mysocket') as calc:

   atoms.calc = calc

   opt.run(fmax=0.05)


计算狗·模拟计算

评论 / 文明上网理性发言
12条评论
全部评论 / 我的评论
最热 /  最新
全部 3小时前 四川
文字是人类用符号记录表达信息以传之久远的方式和工具。现代文字大多是记录语言的工具。人类往往先有口头的语言后产生书面文字,很多小语种,有语言但没有文字。文字的不同体现了国家和民族的书面表达的方式和思维不同。文字使人类进入有历史记录的文明社会。
点赞12
回复
全部
查看更多评论
相关文章

基础理论丨一文了解XPS(概念、定性定量分析、分析方法、谱线结构)

2020-05-03

晶体结构可视化软件 VESTA使用教程(下篇)

2021-01-22

手把手教你用ChemDraw 画化学结构式:基础篇

2021-06-19

【科研干货】电化学表征:循环伏安法详解(上)

2019-10-25

【科研干货】电化学表征:循环伏安法详解(下)

2019-10-25

Zeta电位的基本理论、测试方法和应用

2020-08-24

项目推荐/Project
第一性原理-NO3RR

第一性原理-NO3RR

第一性原理-AIMD

第一性原理-AIMD

热门文章/popular

基础理论丨一文了解XPS(概念、定性定量分析、分析方法、谱线结构)

晶体结构可视化软件 VESTA使用教程(下篇)

手把手教你用ChemDraw 画化学结构式:基础篇

【科研干货】电化学表征:循环伏安法详解(上)

电化学实验基础之电化学工作站篇 (二)三电极和两电极体系的搭建 和测试

【科研干货】电化学表征:循环伏安法详解(下)

微信扫码分享文章