Learn VASP The Hard Way (Ex-59)吸附能的计算(四)

2018-03-15

Ex-59 吸附能的计算(四)

sortcar.py


丑话说在前头,本节内容有点多,大家慢慢消化。掌握本节的核心思想,对于后面提高你的工作效率,节省时间有着很大的帮助。




前面一节,我们在扩展练习中提到了扩胞后,原子坐标的后面T T T 和 F F F 修改的问题。

因为扩展后原子坐标是按照单胞为顺序排列的,如果想要将表面的原子快速固定或者放开,那么我们就需要知道表面原子所在的行数。



上图中,p(2x2)的POSCAR命名为POSCAR-2x2,最表层原子所在的行数为:13,17, 21, 25,次表层的原子所在的行数为: 12, 16, 20, 24。

仔细分析下,你会发现,表层原子的行数为:9 + 4*n

次表层的行数为:8 + 4 * n,其中n = 1-4,4表示在扩完后的slab模型里面有4个(1x1)的单元。




有了这个关系,我们就可以通过sed命令任意固定这两层的原子了, 命令如下:


for i in {1..4}; do sed -i "$((8+4*$i)), $((9+4*$i))s/T T T/F F F/g" POSCAR

或者:

for i in {1..4}; do sed -i "$((8+4*$i)), $((9+4*$i))s/T/F/g" POSCAR


效果如下图:



通过sed命令快速将表层原子批量固定住。




我们还可以只放开最表层的原子,在前面结果的基础上可以使用命令:


for  i  in {1..4}; do sed -i "$((9+4*$i))s/ F F F/ T T T/g" POSCAR

或者:

for  i  in {1..4}; do sed -i "$((9+4*$i))s/ F/T/g" POSCAR



使用sed命令快速将最表层的原子批量放开!


Soooo Easy!!!再也不用挨行修改T T T 或者F F F 了。




方法二:


什么,原来还有第二种方法? 这种方法是本人常用的。给大伙说实在话,前面的方法是本人在写本书的时候临时想起来的。本来打算主要讲解的是下面的这两个。前面我们提到,在p(2x2)的slab模型中,原子坐标是按照p(1x1)的单元排列的。既然我们想根据层数固定原子,那么我们可以将原子按照层数来排列啊,这样就可以方便的选择同一层的原子了。




那么该怎么将它们按照层数排列呢? 这时候你应该想到,不同层之间的原子,它们的坐标在z方向是不同的。有了这个依据,我们就可以根据z方向坐标的大小来排列原子了。


首先我们先用一个笨方法实现所预想的小目标。(刚刚提到的方法2)


第一步:将坐标复制到excel表格里面。本人用的是libre office(linux下面的Microsoft)。不过功能大同小异,Windows用户按照做就可以了。


第二步:选中所复制的数据,然后根据图中的D列来排序。





排序完的结果, 如下图:



从图中,我们可以看出,原子根据在z方向上的坐标分成了4部分。


注意:这里我们所有原子都是Cu原子,因此全选了。如果你的体系中有好几种不同的原子,你需要按照元素,逐一进行排序。 

比如体系中有C H O,我们先将C原子按照Z方向坐标排序,然后再排H原子的,最后再排O原子的。要保持和POSCAR前面元素顺序一致。




排序完成之后,将POSCAR中的坐标替换为Excel中的数据。



这样的话,我们的模型就搞定了。剩下的就是使用sed命令批量替换T T T和 F F F了


但是,师兄等等,上图看起来坐标很乱啊,结构能用吗? 放心,绝对可以用。




如果不放心的话,可以用p4vasp打开一下,然后重新保存成POSCAR即可。如下图:





最终我们的POSCAR是上面这个样子的




从图中可以看出来,次表层的原子在18-21行,最表层的原子在22-25行。

所以可以这样使用sed命令来快速实现表层原子的固定与弛豫。





方法三: 使用脚本。


师兄,这个问题竟然还可以使用脚本来解决?


当然了,使用鼠标拖拖点点的事情,一般都可以用脚本来实现。脚本是用python写的,本人给它起了一个高大上的响亮名字:sortcar.py。


由于p(2x2)的slab坐标前面已经用过了,下面我们用p(3x3)的slab来演示一下脚本的使用。



新鲜出炉的,等待被sort的p(3x3)slab的POSCAR




被sort过的POSCAR


使用sortcar.py 将坐标按照z方向大小排列。输出文件为XXX_sorted,其中 XXX为我们想要排列的POSCAR或者CONTCAR。

如果你的VASP坐标结构文件名字为:BigBro,那么被sort之后,输出文件就是: BigBro_sorted。




脚本这么神奇,内容如下:





注意:


1) 这里我们用的是Cu(111)的例子,比较简答,脚本的威力展示不出来。

2) 如果你的体系有很多不同的原子,脚本首先会将同一种元素原子的坐标排列,然后依次类推。

3) 有些地方可能有些冗余。但本人一直在用,效果还不错。

4) 本人建议,只针对表面使用这个脚本。也就是吸附前的slab模型。如果你放了吸附物种,不建议使用,因为吸附物种间不同原子之间的连接顺序可能会被打乱。

5) 在放吸附物种之前,最好将表面先排序完,怎么做,前面三种方法任选。

6) 脚本的话已经上传,大家可以点右侧的链接随意下载:(密码:BigBroSci)  sortcar.py

7) 如果发现里面的错误,或者有哪些可以更新改进的地方,也欢迎大家提出来或者把改进的脚本分享出来。

 



总结:


本节讨论的内容与科研关系说大不大,说小也不小,主要是在解决工作效率和时间上。想象一下,如果你的slab中有很多原子(金属氧化物,硫化物等),而且还不是同一种的,你用前两种方法的时候,就得十分小心了,此时脚本的作用就显示出来了。

本网站由阿里云提供云计算及安全服务