预存
Document
当前位置:文库百科文章详情
ASE原子模拟环境入门之操作原子
来源: 时间:2022-12-16 16:36:30 浏览:3747次

银吸附在镍板上

我们建立一个由四个Ni原子组成的单层平板和一个Ag吸附原子构成的模型。

定义原子板


>>> from math import sqrt

>>> from ase import Atoms

>>> a = 3.55

>>> atoms = Atoms('Ni4',

...               cell=[sqrt(2) * a, sqrt(2) * a, 1.0, 90, 90, 120],

...               pbc=(1, 1, 0),

...               scaled_positions=[(0, 0, 0),

...                                 (0.5, 0, 0),

...                                 (0, 0.5, 0),

...                                 (0.5, 0.5, 0)])

>>> atoms.center(vacuum=5.0, axis=2)

看看晶胞和原子的位置:


>>> atoms.cell

Cell([[5.020458146424487, 0.0, 0.0], [-2.5102290732122423, 4.347844293440141, 0.0], [0.0, 0.0, 10.0]])

>>> atoms.positions

array([[ 0.        ,  0.        ,  5.        ],

       [ 2.51022907,  0.        ,  5.        ],

       [-1.25511454,  2.17392215,  5.        ],

       [ 1.25511454,  2.17392215,  5.        ]])

>>> atoms[0]

Atom('Ni', [0.0, 0.0, 5.0], index=0)

将这个结构写入一个文件,并通过调用ase.gui来绘制整个系统:

>>> from ase.visualize import view

>>> atoms.write('slab.xyz')

>>> view(atoms)

在查看器(ase  gui)中,可以在所有三个方向上重复单元格(使用Repeat ‣ View window)。从命令行,使用ase  gui -r 3,3,2 slab.xyz

我们现在在一个高度为h=1.9Å的三原子中心位点添加一个吸附原子 :


>>>h = 1.9

>>> relative = (1 / 6, 1 / 6, 0.5)

>>> absolute = np.dot(relative, atoms.cell) + (0, 0, h)

>>> atoms.append('Ag')

>>> atoms.positions[-1] = absolute

现在的结构是这样的:


view(atoms)




构造界面


现在,我们用Ni(111)和水做一个界面。首先我们需要一层水。在这个脚本WL.py中构建了一层水,并保存在文件WL.traj中。

WL.py


import numpy as np

from ase import Atoms

p = np.array(

   [[0.27802511, -0.07732213, 13.46649107],

    [0.91833251, -1.02565868, 13.41456626],

    [0.91865997, 0.87076761, 13.41228287],

    [1.85572027, 2.37336781, 13.56440907],

    [3.13987926, 2.3633134, 13.4327577],

    [1.77566079, 2.37150862, 14.66528237],

    [4.52240322, 2.35264513, 13.37435864],

    [5.16892729, 1.40357034, 13.42661052],

    [5.15567324, 3.30068395, 13.4305779],

    [6.10183518, -0.0738656, 13.27945071],

    [7.3856151, -0.07438536, 13.40814585],

    [6.01881192, -0.08627583, 12.1789428]])

c = np.array([[8.490373, 0., 0.],

             [0., 4.901919, 0.],

             [0., 0., 26.93236]])

W = Atoms('4(OH2)', positions=p, cell=c, pbc=[1, 1, 0])

W.write('WL.traj')

现在运行WL.py脚本,从traj文件中读取原子对象:


from ase.io import read

>>> W = read('WL.traj')

使用视图的看看结构

我们看看这个单位晶胞


W.cell

Cell([8.490373, 4.901919, 26.93236])

我们需要一个镍(111)平板,它与水尽可能接近。一个2 × 4正交的fcc111 超晶胞应该足够好了。


>>> from ase.build import fcc111

>>> slab = fcc111('Ni', size=[2, 4, 3], a=3.55, orthogonal=True)


slab.cell

Cell([5.020458146424487, 8.695688586880282, 0.0])

看看这两个单元晶胞,我们可以看到,如果我们把其中一个单元晶胞在平面上旋转90度,它们的匹配度相差大约2%。让我们旋转单元晶胞:

W.cell = [W.cell[1, 1], W.cell[0, 0], 0.0]

用rotate()旋转分子:

>>> W.rotate(90, 'z', center=(0, 0, 0))

再将原子放回到晶胞里

>>> W.wrap()

wrap()方法仅在启用周期性边界条件时有效。我们在Ni(111)和水之间有2%的晶格失配,所以我们在平面上缩放水的晶胞以匹配平板的晶胞。参数scale_atoms=True表示原子位置应该随单元格缩放。默认值是scale_atoms=False,表示单元格更改时笛卡尔坐标保持不变。


>>> W.set_cell(slab.cell, scale_atoms=True)

>>> zmin = W.positions[:, 2].min()

>>> zmax = slab.positions[:, 2].max()

>>> W.positions += (0, 0, zmax - zmin + 1.5)

最后我们将水复制到平板上:

>>> interface = slab + W

>>> interface.center(vacuum=6, axis=2)

>>> interface.write('NiH2O.traj')

两个atoms对象的求和,会将两个atoms对象的原子位置都包括进来,而使用第一个atoms对象的超晶胞。


计算狗·模拟计算

评论 / 文明上网理性发言
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
第一性原理-声子谱

第一性原理-声子谱

第一性原理-吸附能

第一性原理-吸附能

热门文章/popular

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

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

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

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

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

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

微信扫码分享文章