0%

服务器相关

VASP的计算就跟开车一样,设计到很多的内容,比如大街上的路怎么铺的?桥怎么建的?发动机怎么工作的?方向盘怎么工作的,刹车片什么材料做的?车身颜色怎么喷的? 没有人会懂所有相关的知识。但是怎么打开车门,坐车里,启动发动机,踩油门,打方向盘,这是本教程所关心的,也就是类似驾校教练指导你学会如何开车,而不是关系如何去造车,去铺路。这里的车就是VASP。要开车,必须手头上有车,没车我瞎BB再多也是白搭。

1) 知道怎么连接自己组内或者租赁的服务器

后面大师兄会介绍一些挂载服务器的方法,但这些基本的连接服务器操作是基础。一般来说通过终端(terminal)来实现,Windows下有很多软件可以参考,比如:

  • Winscp + Putty
  • MobaXterm

当然还有其他的软件,大师兄平时很少用Windows,推荐的就这两个。尤其是MobaXterm。 对于Ubuntu和Mac,则可以直接打开Terminal进行连接。

2) 初步学习使用基本的linux命令:

  • 进入目录 : cd

  • 移动文件(夹): mv

  • 复制文件: cp
  • 复制文件夹用: cp -r ; 注意 cp 和 -r 之间有个或者N个空格
  • 创建文件夹:mkdir
  • 删除文件: rm ;
  • 删除文件夹: rm -r
  • 强制删除文件夹: rm -fr 或者 rm -rf (f 和 r 的顺序可以颠倒 )
  • 显示目录下文件: ls 等命令;
  • 这里大师兄就不再啰嗦了,后面教程里会介绍一些命令的使用,老司机们自动略过,新手自行百度:linux 命令,你会得到铺天盖地的信息。

3) 手上有可以正常运行的VASP程序

  • 组里面已经安装好vasp程序,或者使用超算中心的VASP程序,只要手上有可以正常运行的VASP即可。因为我们在本书里,不讨论

    • 去哪里下载VASP? 怎么安装VASP? 去哪里下载VASP的pseudo potentials?
    • 前面的问题可以在QQ群里面讨论,也可以付费求助别人解决。
    • 对于VASP的pseudo potentials,也就是POTCAR。
      • 你老板买了VASP的版权,就直接问他要。
      • 用的盗版VASP,找其他人要一份,但是发文章的时候会很麻烦。国内很多人都是找有版权的老师挂名,其实这是非常学术不道德的事情。一方面涉及到版权,一方面涉及到瞎几把挂名。
      • 免费的可以用QE,CP2K,GPAW等开源的软件,没必要非得在VASP上面死磕。
  • 知道怎么提交VASP任务?

    • 自己组里都有提交任务的脚本,如果没有的话只能自行动手解决咯,可以
      • 找组里的师兄师姐帮忙;
      • 第一个啃螃蟹的人,找老师解决,求助服务器商,求助超算管理员;

程序语言学习

建议大家学习两个语言: bash 和 python。主要是为了辅助计算,节省时间,并拓展自己的思维方式。现在机器学习,人工智能越来越热,学会使用Python或者其他语言,或许可以上升到以后能否生存的高度了。

  • bash语言:日常terminal里面常用的基本命令,比如cd,ls这些,以及结合基本的逻辑语法,可以让你写出一些简单的小脚本。极大提高自己的工作效率;极大的意思就是别人一天或者N天的活,你可能几秒就完事。
  • Python 语言:python是一款语法简单,很容易上手的程序,有着丰富的数据库支持,目前深受科研人员的喜爱。注意,这里我们不讨论类似:python是一门高级语言,运行的时候跟机器交互性差,需要时间比C++长这样的问题。因为这是专业程序员的事。不出意外,看这本书的大部分人,能够用python写个小脚本,方便地处理自己的任务和数据,就已经非常棒了,快和慢,对于我们来说,顶死了也就几秒的问题,完全可以接受。
  • 学习程序语言,一方面可以极大地提高自己的工作效率,另一方面也可以改变自己看待事物的思维方式。
  • 如果不喜欢Python,当然也可以学习其他的程序语言,C++,R,Java等。

总结

1)学习VASP前,先保证自己能顺利连接到服务器,然后运行VASP。这个大师兄没法帮忙,可以求助自己课题组中的师兄师姐,老板,或者群里咨询。

2)新手有大把的时间,建议系统性学习bash,python语言。Python可以换成其他你自己感兴趣的。

简单说明:

ASE提供的热力学模块可以很方便地获取气体分子的热力学数据比如吉布斯自由能,熵等。具体参见:https://wiki.fysik.dtu.dk/ase/ase/thermochemistry/thermochemistry.html。本节介绍下气体分子熵的计算,用到的是**IdealGasThermo**这一个模块,例子为氨气分子(NH3)。**IdealGasThermo**计算气体分子的热力学自由能,除了VASP计算之外,要注意的有4点注意的,这些都要输入到对应的参数之中。

1) 分子的对称数;

2)分子的结构:线性或者非线性;

3)分子中未成对的电子数目,或者多重度。

4)温度,压强

这些具体的输入,网站上都有相应的说明,自己根据分子的特性改下即可。比如对称数不会算的话,可以参考下面的这个表格。

脚本部分:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Tue Jul 12 18:38:35 2022
https://janaf.nist.gov/tables/H-083.html #Database
Symmetry Number: Table 10.1 and Appendix B of C. Cramer “Essentials of Computational Chemistry”, 2nd Ed.
spin: 0 for molecules in which all electrons are paired, 0.5 for a free radical with a single unpaired electron, 1.0 for a triplet with two unpaired electrons, such as O_2.
@author: qli
"""
import numpy as np
from ase.io import read, write
from ase.thermochemistry import IdealGasThermo
from scipy import constants as con

atoms = read('./freq/POSCAR')
sym = 3 # symmetry number of NH3
spin = 0 # spin of NH3.
tem = 298.15 # Temperature
out = read('./OUTCAR', format='vasp-out')
potentialenergy = out.get_potential_energy()

model = read('./freq/POSCAR')
# model_positions = model.get_positions()

vib_energies = []
with open('./freq/OUTCAR') as f_in:
lines = f_in.readlines()
for num, line in enumerate(lines):
if 'cm-1' in line:
vib_e = float(line.rstrip().split()[-2])
vib_energies.append(vib_e)

vib_energies = np.array(vib_energies[:-6])/1000 # For Gas, the last six are translation and rotation
# zpe = sum(vib_energies)/2

thermo = IdealGasThermo(vib_energies=vib_energies,
potentialenergy=potentialenergy,
atoms=atoms,
geometry='nonlinear',
symmetrynumber=3, spin=spin)

zpe = thermo.get_ZPE_correction()
entropy = thermo.get_entropy(temperature=tem, pressure=101325,verbose=True) # Unit eV/K
TS = tem * entropy
G = potentialenergy + zpe - TS

print('G', G)
print('S', con.Avogadro * con.electron_volt * entropy, 'J/K/mol')

运行实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
qli@bigbro test_nh3 % ls
CONTCAR INCAR OUTCAR freq/
H-083.txt KPOINTS POSCAR get_gas_entropy.py*
qli@bigbro test_nh3 % python3 get_gas_entropy.py
Entropy components at T = 298.15 K and P = 101325.0 Pa:
=================================================
S T*S
S_trans (1 bar) 0.0014947 eV/K 0.446 eV
S_rot 0.0004981 eV/K 0.149 eV
S_elec 0.0000000 eV/K 0.000 eV
S_vib 0.0000047 eV/K 0.001 eV
S (1 bar -> P) -0.0000011 eV/K -0.000 eV
-------------------------------------------------
S 0.0019964 eV/K 0.595 eV
=================================================
G -19.220631915628093
S 192.6230402411749 J/K/mol

简单说明:

1)目录里面H-083.txt是NIST-JANAF的热力学数据库的值。自己可以测试对比下。

2)脚本所在目录是NH3分子优化的计算,脚本读取当前的OUTCAR获取能量,

3)目录里面还有个freq/,对应的是NH3分子的频率计算,读取其中的POSCAR和OUTCAR获取分子结构和频率信息。对分子来说,VASP频率计算结果中的后面6个对应的是平动和转动部分,不能作为振动计算熵。平动和转动的熵是通过IdealGasThermo模块和分子结构来计算的,具体计算公式参考统计热力学、物理化学等。

4)计算表面吸附物种的可以使用Harmonic limit这个模块。

示例下载:

关注公众号:大师兄科研网, 后台回复关键词: NH3

在学习本书时,大师兄们会默认读者掌握了一些基本的电脑操作技能,以及化学的基本常识(结构化学,物理化学等)。本章列举出一些常用的计算工具和软件,以及假设大家掌握的一些技能。如果没有达到基本的要求,那么请在学习前面几章的同时,抓紧提升自己的能力。 化学的基本知识如果没有掌握,不建议学习本书。

1 操作系统

做计算,有三个操作系统可以选择:

  • Windows 系统:会使用Windows系统:会开机,打字,安装软件;
  • Linux 系统,强烈推荐,大师兄本人一直用的是Ubuntu,但不局限于Ubuntu系统,自己喜欢什么就用什么。

  • Mac系统,兼顾Windows和Linux,一般比较贵,经济条件允许,也可以。

给重点照顾对象:Windows用户的第一个提醒:

Windows用户在进行计算的时候,只要计算出错了,就要本能地记起第一个解决的办法: dos2unix 。 这个命令干什么的不要紧,先死死记住即可。

2 文本编辑工具

文本编辑工具主要用来编辑,查看VASP的输入(出)文件,要求会打开文件,打字,保存文件。

1)vim

这个必须要学会,linux下面自带。原因是绝大多数的计算都是在linux下面进行的,学会vim的基本操作可以极大提高你的文字处理能力和工作效率。关于VIM的使用介绍,自己百度下或者搜一搜相关的视频,学习下。

2) notepad++

  • 这个是对于Windows用户来说的,要求会创建文件,输入内容并保存文件,这个软件或者类似的必须学会使用!

原因在于:Windows下面自带的记事本保存的文件与linux下的文件格式不匹配,提交任务的时候经常出问题,用notepad++则不会出现这个问题。

因此,Windows的记事本杜绝使用。为了安全,即使用了notepad++,Windows用户在进行计算的时候,也需要注意下面两点:

  • Windows下面编辑的输入文件,如果想在linux服务器上运行,最好先执行: dos2unix 这个命令。

    1
    dos2unix  INCAR
  • Windows用户计算出错了,一定要首先想到 dos2linux 这个命令来解决问题!!!

3) Atom

这个Atom是文本编辑工具,不是原子的意思。Windows,Linux,Mac系统均可使用。

3 常用建模相关软件:

本书默认大家已经在自己的电脑里安装了下面三个软件:

1) Material Studio

  • 这个软件,百度里面一大堆下载链接,安装教程,大家自行下载安装即可。
  • 本书默认大家已经安装成功,会不会使用暂且不要求;
  • 不要问我从哪里下载,安装出现问题也不要找我解决。
  • 另外,MS很贵,国内大部分人都是用的盗版软件,没有版权,不建议使用。

2)VESTA

来自日本的良心软件,Linux,Windows,Mac系统均可使用。链接:http://jp-minerals.org/vesta/en/。无版权困扰,发文章的时候要注明下图是用VESTA做的,引用下对应的文章。

  • Windows下面安装就不再介绍了,下载程序,解压,双击图标即可运行,相信大家都能搞定。

  • Linux下安装:

    • 下载binary程序文件,本人解压后放到了/opt/VESTA-x86_64目录

    • 编辑 ~/.bashrc 文件,在文件最后,添加下面2行。

    1
    2
    export VESTA=/opt/VESTA-x86_64 
    export PATH="$PATH:$VESTA"
    • 在终端里面进行的操作如下:第一行打开~/.bashrc文件, 自己添加上面提到的两行即可,第二行更新下~/bashrc文件,第三行运行VESTA。
    1
    2
    3
    $ vim ~/.bashrc
    $ . ~/.bashrc
    $ VESTA

3)p4vasp

p4vasp主要有建模,可视化以及后处理的一些功能。

  • Windows版本,很久没有更新了,点击此处下载,解压,双击图标即可运行。也可以在大师兄QQ群或者其他QQ群文件中下载。

  • Linux版本功能更加强大。也很久没更新了。 Ubuntu(18以及更老的版本)用户使用命令一键安装: sudo apt-get install p4vasp

    Ubuntu 20以及后续的安装有些麻烦。p4vasp已经不更新了,很多功能可以用其他的软件替代。如果坚持使用p4vasp,可以联系大师兄付费安装(50块钱)。

4) ASE

ASE 是Atomic Simulation Environment的缩写,可以实现搭建结构,读取VASP的输入和输出,以及一些后处理功能。如果p4vasp没办法安装,那么ASE必须要安装在你的电脑上。

5)其他软件

这里说的软件主要是针对VASP计算的模型搭建这一方面,有兴趣的也可以试试Avogadro. 值得一提的是,我们自己的国产建模软件那是相当得少,更别提计算软件了。而我们比较擅长的是写教程和后处理,然后发公众号割韭菜。

总结:

  • 初学者学习本书,所必须具有的技能:
    • 熟练使用一个操作系统;
    • 会编辑文本,写入和保存文件;
      • Windows 用户Notepad++必须掌握,
      • linux用户可以vim或者其他编辑器,比如Atom
    • 安装好或者会初步使用一款建模软件。-
      • p4vasp ASE安装在Windows和Ubuntu系统上;
      • VESTA 安装在Windows,Ubuntu,Mac系统上;
      • Materials Studio 安装在Windows上(没版权就别安装了)
    • 会连接服务器,使用的vasp程序并且会提交任务
      • 这个大师兄帮不了你,找师兄师姐,到时、自行找服务器商或者其他售后人员解决。

1)为什么Hard?

现如今浮躁的科研圈,社会风气下,速成思想,快餐文化害死人,图快的读者中,就有很多来自做实验的。现在大家普遍认为:实验+计算很好发文章。两者结合可以更深入地理解你的研究体系,发现并解决科研中有价值的科学问题。但很多老师却感觉计算就是动动鼠标,操作个软件的活,是个人就能做计算似的。在这种错误的理解,对计算难度过分低估,在高IF文章的诱惑下,安(suan)排(ji)自己的学生去搞计算。写到这里,很多脏话硬生生从嗓子眼憋回去了。骂是解决不了问题的。那么我们就理一理,一个实验的课题组,在没有任何计算背景的条件下,安(Po)排(Hai)一个学生做计算所遇到的问题吧:

  • 计算软件的选择:大千世界无奇不有,计算的软件也是多得数不过来,每个软件都有自己适用的体系,哪个更适合你的体系,你不会选择;
  • 软件的购买:比如你决定了使用VASP,你需要找代理商购买软件(有些还很贵,舍不得买,用盗版的,发文章的时候还担心版权问题);
  • 服务器的购买:买了软件我们要安装啊。你可能说,这个容易,直接买几台电脑装上就可以了。这里的问题在于:用台电脑就可以算,就可以发文章的时代造就过去了,你可能被淘汰十几年了。所以,

    • 要买服务器,但服务器价格不菲,怎么选你也不知道;
    • 不买服务器,可以买超算中心的机时啊。好吧,就当这一关也过了。
  • 软件安装:这也是个麻烦事。计算软件不是QQ,也不是360安全卫士,不是你下载个exe文件双击选择d盘就可以傻瓜式安装成功的。各种环境变量,依赖的库都是需要自己安装的。要不然那么多培训班上来就先给大家介绍软件是怎么安装的呢。

  • 熟悉Linux系统:计算软件大部分都是在Linux系统下安装的,所以Linux系统的一些常用命令操作你得学会;而Linux的桌面之所以不如Windows,用户习惯是个难以突破的瓶颈,在没人陪伴的情况下,自己熟练Linux系统也是非常不易;

  • 软件学习:这也是本书的重点,纯做计算的菜鸟,每天屁活都不干,就看本书,Linux系统下操练,有人指导的情况下差不多2个月能入门。对号入座,你一个做实验的,每天捣鼓设备,转转反应,就快累的嗝屁了,恨不得回到家或者宿舍就躺着歇会,还要跟朋友出去嗨,陪对象逛,当然还要玩把王者农药。真的能抽出时间来认真学习么?
  • 有些体系对软件参数依赖性很强,没人指导,你不会设置,软件出错不会解决,计算结果不会分析,算对算错都不知道,迷迷糊糊就这样得到了一些结果。
  • 计算的目的,肯定要跟实验对比啊?怎么对比,从哪方面下手,又没头绪,很多时候都是硬凑,结论反了也傻呵呵地跟别人说实验和理论吻合地很好,可以冲个大文章。
  • 折腾完了,要投文章了。因为计算太烂,XJB乱扯结论而被直接拒掉的又有一批;
  • 好不容易送审了, 最好去烧烧香,祈求不要落到做计算的人手里。真落到计算的人手里,算的太烂,也是很有可能因此丧命或者大修。
  • 就当你运气好,大修了。审稿人抛出来的专业计算问题你可能又答不上来,怎么补数据都无从下手。
  • 让你再幸运一把,补上数据,文章接受了。
  • 那下一篇还这样弄么? 可以,但经过上面的折腾,小硕士估计要毕业了,小博士也要滚蛋了。又得找下一个垫背的,也就是因为这样,上一批的不知对和错的经验就传授给了下一代。
  • 总结:一个做实验的老师,不把自己在实验方面的专长传授给自己的学生,硬让人家自己去琢磨你什么都不懂的领域,最后造就了一个四不像的怪物出来,何为师道?

这种情况到底怎么办? 很多人在的课题组都是做实验的,老板头脑发热的时候,就安排做起了计算。但老板除了一颗乐观的心,屁都不懂啊。这时候的你,除非脑子很好用,否则就会陷入一种叫天天不应,叫地地不灵的境界。在这里,大师兄建议你:

  • 说服老板,找个计算靠谱的组,合作一下,避免自己直接算,自己专心做实验,计算可以跟国内相关领域的老师合作一下,各取所长。
  • 说服不了,找个计算靠谱的组,让老板派你去交流学习一段时间,别自己在那里瞎捣鼓。
  • 认真学习本书,看VASP的手册,以及各种网站上的教程,先摸索一阵子再算老板给你的体系。
  • 总之,时间和精力的成本,自己心里要有个数。

在这里还要吐槽2点:

  • 有些做实验的跟计算合作,挂名的时候把计算放到不起眼位置的人,随意挪动计算作者的顺序,甚至是放到了通讯位置上,但没加*。生活不易,给做计算的留条活口,也给自己留个好名声。
  • 有些跟实验合作的计算工作者,随随便便优化个结构,做个漂亮的图就完事。只做锦上添花工作,而不深入研究课题机理。做计算的日子本来就难,请不要因为自己的不专业坏了计算的名声。
  • 如果想合作,就双方正儿八经地合作,真正意义的合作至少是通过计算解决了课题中的难点,机理,有助于组里课题的下一步进行,更高级点是实验验证了计算的假设,不过能做到这种程度的也没多少课题组。而对于这种良性的合作,实验和计算都给挂个一作,双方老板都挂个通讯,也无可厚非。
  • 不想合作,非让自己的学生做计算。这种情况就不要怕花钱,派学生到做计算的课题组学习上一两个月,然后再回来继续搞。如果有需要,也可以派出去参加参加一些高质量的培训班,暑期学校等,来弥补自己在学生指导方面的不足。

虽然书名叫The hard Way,这本书还是给了很多人一种DFT极品快餐的感觉;更会越来越”毁了”专业做计算的,让各种做实验的做计算的扰乱市场。虽然有这种负面的作用,但我还是想尽自己可能,稍微提高我们做计算的平均水平。因此,认真声明一下:本教程的初衷是给专门做计算菜鸟准备的。对于那些以为靠本书就可以快速入门的筒子们(不管是做计算还是做实验的),劝你们还是趁早放弃本书的学习,科研的路上,从来就没有速成二字。

在BB了这么多废话之后,感觉时候再强调下本书的重点了:The Hard Way。The Hard Way 在本人的眼里,类似于书山有路勤为径,学海无涯苦作舟的感觉,类似于经过无数瞎折腾终于尝到一点点小胜利甜头的感觉,类似于苦尽甘来,柳暗花明又一村的感觉。所以:Hard Way是本书的重点,也是痛苦学习的一个过程。别人耗费精力和时间开发出来的软件,短时间就精通是不可能的事情。所以,也别指望着一口气吃成个胖子,耐住寂寞。

本人学习和使用VASP已经快10年了,该教程差不多也5岁了。我进入课题组之前,不会用Ubuntu系统,也不会用脚本,也不会用python写脚本,也没用过VASP。我的VASP入门,是花了一个月看了Davide Sholl的书后,老板又手把手花了一个多月的时间学会的,学习的资料是老版本的Hand on Session系列。每天做的是系列中的练习,准备老板布置的作业,思考老板预留的问题,然后第二天听老板解释每个参数的含义,里面的关键点。而真正操作起来进入课题的时候,又有组里细心的博后专门帮忙指导答疑,也有很多人可以进行讨论学习。写这么多并不是在秀自己遇到了一个多好的老板,多好的课题组。在这样的环境中,经过了四年的学习,好几个课题的实战,才变成你们感觉很牛逼的大师兄(其实我只是经验比你们多一点点而已)。而这本书,也是本人这四年来学习到的精华,每一节都要花费差不多4个小时的样子才能完成,或者更多。而这四年的精华,岂能让你把这本书看一遍就掌握了? 到现在为止,瞎BB了76节。每节你花一天的时间去学习,加上其他参考书的学习,也需要2个月的时间。而2个月,对一个新手来说,完全在承受范围之内,请相信时间的力量。这里,我们澄清下对新手的定义:全职搞计算的菜鸟。所以,Hard Way 就是需要你花掉每一个整天的时间,一点点认真琢磨,反复操练,绝对不是什么速成。而现在我们搞科研都很浮躁,什么都喜欢图快,我们也有句古话:欲速则不达。因此,打算朝夕之内就学会VASP的读者,本书可能真的不适合你。

2) 计算 = 转行?

  • 很多人吐槽计算化学是个坑告诉你,既然选择了这条路,就准备改行吧。请避开这些负能量的说法,拿出自己的主见。无论放弃或者坚持,都要拿出你自己的判断力出来,请不要再听别人在你耳边瞎磨。也就是我的人生我做主。
  • 每一行的人都会说自己这一行是个坑,不管你怎么跳,都是坑。引用我老婆的原话:之前带两个孩子的时候,感觉自己每天都很累,现在孩子父母帮忙看着,自己工作了,但每天还是很累。美好的生活,累总是一路同行。
  • 个人的理解是,学习理论计算可以使你的视野更加开阔,思维方式更加灵活,对事物本质的把握和理解上,比别人要更胜一筹。也就是一眼就能找到问题的关键所在。不论是否继续相关的研究,转行与否,对今后的发展总会有所帮助。当然,我这个穷酸书生说的话,大家也可以一笑了之。

3 心态

主动行动、思考

前面说的都没有阻挡你继续学习vasp的脚步,那么首先要注意的就是自己的心态:学习过程中要时刻抱着主动的心态去解决问题。

  • 遇到不会的问题,主动去查找解决方法;
  • 遇到不懂的基础知识,主动去找教科书;
  • 遇到什么好的资源,书籍,课件等,主动去网上搜索,下载;
  • 本书中的练习,看到别人有意思的计算,主动去重复重复。
  • 没事就主动去官网溜达,
  • VASP计算出错,主动去google或者官网的论坛找答案!

注意

  • 上面说的主动是对于你自己来说的,别碰到不会的就主动求助别人,这样你很难得到提升。

  • 去google搜索遇到的问题,也就意味着你要学会科学上网。

  • 如果遇到热心帮你解决问题的人,好好准备你的问题,千万不要一个劲的追问,因为这样显得你不动脑子,非常惹人烦。

总结:

  • 学习VASP所具有的心态:

    • 主动去面对遇到的问题和困难,冰冻三尺,非一日之寒,遇到问题,主动解决,日积月累就会收获良多;
    • 对自己要有自信,即使自己是彻头彻底的小白,也不必要担心。相对于那些积累了很多错误经验的人来说,什么都不知道则具有更好的可塑性。
    • 不要盲目相信他人,有自己的理解。如果你在网上搜索问题的答案,会找到很多人的回答,但实际熵很多人水平都可能没有你高,而你却把他们的话当成真理一般去相信,这是致命的。
  • 大师兄的要求:

    • 新手认真阅读序言里面推荐的那本参考书;

    • 尽可能多地浏览VASP官网,对某些参数有疑惑,认真查阅手册;

    • 最重要的是不要偷懒,遇到不会的东西或者困难,立刻记下来或者去解决,否则明天你就会忘掉;

    • 好东西要学会分享,可以在QQ群里分享自己的心得,帮助其他正在入门的小师弟,妹们。

致谢:

本教程在写作的过程中,得到了很多人的支持。 有些地方可能描述不清,当然书里面也肯定避免不了错误的出现,也收到了很多人的建议和批评指正。在这里,向他们表示诚挚的谢意。很多人认为,通过这个教程,学到了很多东西,但请不要过分把功劳归在我身上。引用佛系的观点:因果,完全是自作自受。你自己学习了,自己认真练习了,水平的提高完全是你自己辛苦付出的结果。教程就在这里,你学或者不学,都跟我没有关系。私以为,收获最大的还是本人。一方面把自己多年的学习的经验整理总结出来,另一方面,很多当时一知半解的地方,在写作的过程中,通过查阅资料,认真分析得到了解决。

教程的宗旨在于快速带领大家入门VASP的使用,这里大师兄想起了金庸笔下的打狗棒法, 本书传授的只是招式,而心法口诀则是你扎实的科研基础功,是自己这些年(高中,大学,硕士,博士)通过坚持不懈学习来积累获得的,对次,本人确实无能为力,而这一点也恰恰是我们最欠缺的部分,希望可以引起大家的重视,在等待任务结束的时候,多多补习自己的基础知识。

在学习本书时,大师兄们会默认读者掌握了一些基本的电脑操作技能,以及化学的基本常识(结构化学,物理化学等)。本章列举出一些常用的计算工具和软件,以及假设大家掌握的一些技能。如果没有达到基本的要求,那么请在学习前面几章的同时,抓紧提升自己的能力。 化学的基本知识如果没有掌握,不建议学习本书。

1 心态

主动行动、思考

学习过程中要时刻抱着主动的心态去解决问题。

  • 遇到不会的问题,主动去查找解决方法;
  • 遇到不懂的基础知识,主动去找教科书;
  • 遇到什么好的资源,书籍,课件等,主动去网上搜索,下载;
  • 本书中的练习,看到别人有意思的计算,主动去重复重复。
  • 没事就主动去官网溜达,
  • VASP计算出错,主动去google或者官网的论坛找答案!

注意

  • 上面说的主动是对于你自己来说的,别碰到不会的就主动求助别人,这样你很难得到提升。
  • 去google搜索遇到的问题,也就意味着你要学会科学上网。
  • 如果遇到热心帮你解决问题的人,好好准备你的问题,千万不要一个劲的追问,因为这样显得你不动脑子,非常惹人烦。

2 操作系统

做计算,有三个操作系统可以选择:

  • Windows 系统:会使用Windows系统:会开机,打字,安装软件;

  • Linux 系统,强烈推荐,大师兄本人一直用的是Ubuntu,但不局限于Ubuntu系统,自己喜欢什么就用什么。

  • Mac系统,兼顾Windows和Linux,一般比较贵,经济条件允许,也可以。

给重点照顾对象:Windows用户的第一个提醒:

Windows用户在进行计算的时候,只要计算出错了,就要本能地记起第一个解决的办法: dos2unix 。 这个命令干什么的不要紧,先死死记住即可。

3 文本编辑工具

文本编辑工具主要用来编辑,查看VASP的输入(出)文件,要求会打开文件,打字,保存文件。

1)vim

这个必须要学会,linux下面自带。原因是绝大多数的计算都是在linux下面进行的,学会vim的基本操作可以极大提高你的文字处理能力和工作效率。关于VIM的使用介绍,自己百度下或者搜一搜相关的视频,学习下。

2) notepad++

  • 这个是对于Windows用户来说的,要求会创建文件,输入内容并保存文件,这个软件或者类似的必须学会使用!

原因在于:Windows下面自带的记事本保存的文件与linux下的文件格式不匹配,提交任务的时候经常出问题,用notepad++则不会出现这个问题。

因此,Windows的记事本杜绝使用。为了安全,即使用了notepad++,Windows用户在进行计算的时候,也需要注意下面两点:

  • Windows下面编辑的输入文件,如果想在linux服务器上运行,最好先执行: dos2unix 这个命令。

    1
    dos2unix  INCAR
  • Windows用户计算出错了,一定要首先想到 dos2linux 这个命令来解决问题!!!

3) Atom

这个Atom是文本编辑工具,不是原子的意思。Windows,Linux,Mac系统均可使用。

4 常用建模相关软件:

本书默认大家已经在自己的电脑里安装了下面三个软件:

1) Material Studio

  • 这个软件,百度里面一大堆下载链接,安装教程,大家自行下载安装即可。
  • 本书默认大家已经安装成功,会不会使用暂且不要求;
  • 不要问我从哪里下载,安装出现问题也不要找我解决。

2)**VESTA**

来自日本的良心软件,Linux,Windows,Mac系统均可使用。链接:http://jp-minerals.org/vesta/en/

  • Windows下面安装就不再介绍了,下载程序,解压,双击图标即可运行,相信大家都能搞定。

  • Linux下安装:

    • 下载binary程序文件,本人解压后放到了/opt/VESTA-x86_64目录

    • 编辑 ~/.bashrc 文件,在文件最后,添加下面2行。

    1
    2
    export VESTA=/opt/VESTA-x86_64 
    export PATH="$PATH:$VESTA"
    • 在终端里面进行的操作如下:第一行打开/.bashrc文件, 自己添加上面提到的两行即可,第二行更新下/bashrc文件,第三行运行VESTA。
    1
    2
    3
    $ vim ~/.bashrc
    $ . ~/.bashrc
    $ VESTA

3)p4vasp

  • Windows版本,好像很久没有更新了,点击此处下载,解压,双击图标即可运行。也可以在大师兄QQ群或者其他QQ群文件中下载。

  • Linux版本功能更加强大。可以

    Ubuntu(18以及更老的版本)用户使用命令一键安装: sudo apt-get install p4vasp

    Ubuntu 20以及后续的安装有些麻烦。p4vasp已经不更新了,很多功能可以用其他的软件替代。如果坚持使用p4vasp,可以联系大师兄付费安装(50块钱)。

4) ASE

ASE 是Atomic Simulation Environment的缩写,可以实现搭建结构,读取VASP的输入和输出,以及一些后处理功能。如果p4vasp没办法安装,那么ASE必须要安装在你的电脑上。

5)其他软件

这里说的软件主要是针对VASP计算的模型搭建这一方面,有兴趣的也可以试试Avogadro. 值得一提的是,我们自己的国产建模软件那是相当得少,更别提计算软件了。而我们比较擅长的是写教程和后处理,然后发公众号割韭菜。

5 服务器相关

VASP的计算就跟开车一样,设计到很多的内容,比如大街上的路怎么铺的?桥怎么建的?发动机怎么工作的?方向盘怎么工作的,刹车片什么材料做的?车身颜色怎么喷的? 没有人会懂所有相关的知识。但是怎么打开车门,坐车里,启动发动机,踩油门,打方向盘,这是本教程所关心的,也就是类似驾校教练指导你学会如何开车,而不是关系如何去造车,去铺路。这里的车就是VASP。其他相关的不做详细介绍。

1) 知道怎么连接自己组内或者租赁的服务器;

2) 初步学习使用基本的linux命令:

  • 进入目录 : cd

  • 移动文件(夹): mv

  • 复制文件: cp

  • 复制文件夹用: cp -r ; 注意 cp 和 -r 之间有个或者N个空格

  • 创建文件夹:mkdir

  • 删除文件: rm ;

  • 删除文件夹: rm -r

  • 强制删除文件夹: rm -fr 或者 rm -rf (f 和 r 的顺序可以颠倒 )

  • 显示目录下文件: ls 等命令;

  • 这里大师兄就不再啰嗦了,后面教程里会介绍一些命令的使用,老司机们自动略过,新手自行百度:linux 命令,你会得到铺天盖地的信息。

3) 手上有可以正常运行的VASP程序

  • 组里面已经安装好vasp程序,或者使用超算中心的VASP程序,只要手上有可以正常运行的VASP即可。因为我们在本书里,不讨论

    • 去哪里下载VASP? 怎么安装VASP? 去哪里下载VASP的pseudo potentials?
    • 前面的问题可以在QQ群里面讨论,也可以付费求助别人解决。
    • 对于VASP的pseudo potentials,也就是POTCAR。
      • 你老板买了VASP的版权,就直接问他要。
      • 用的盗版VASP,找其他人要一份,但是发文章的时候会很麻烦。国内很多人都是找有版权的老师挂名,其实这是非常学术不道德的事情。一方面涉及到版权,一方面涉及到瞎几把挂名。
      • 免费的可以用QE,CP2K,GPAW等开源的软件,没必要非得在VASP上面死磕。
  • 知道怎么提交VASP任务?

    • 自己组里都有提交任务的脚本,如果没有的话,
        1. 找组里的师兄师姐帮忙;
      1. 第一个啃螃蟹的人,找老师解决,求助服务器商,求助超算管理员;
      2. 自行动手解决。

6 程序语言学习

建议大家学习两个语言: bash 和 python。主要是为了辅助计算,节省时间,并拓展自己的思维方式。

  • bash语言:日常terminal里面常用的基本命令,比如cd,ls这些,以及结合基本的逻辑语法,可以让你写出一些简单的小脚本,提高自己的工作效率;
  • Python 语言:python是一款语法简单,很容易上手的程序,有着丰富的数据库支持,目前深受科研人员的喜爱。注意,这里我们不讨论类似:python是一门高级语言,运行的时候跟机器交互性差,需要时间比C++长这样的问题。因为这是专业程序员的事。不出意外,看这本书的大部分人,能够用python写个小脚本,方便地处理自己的任务和数据,就已经非常棒了,快和慢,对于我们来说,顶死了也就几秒的问题,完全可以接受。
  • 学习程序语言,一方面可以极大地提高自己的工作效率,另一方面也可以改变自己看待事物的思维方式。
  • 如果不喜欢Python,当然也可以学习其他的程序语言,C++,R等。

7 吐槽

速成思想,快餐文化害死人,图快的读者中,就有很多来自做实验的。现在大家普遍认为:实验+计算很好发文章。两者结合可以更深入地理解你的研究体系,发现并解决科研中有价值的科学问题。但很多老师却感觉计算就是动动鼠标,操作个软件的活,是个人就能做计算似的。在这种错误的理解,对计算难度过分低估,在高IF文章的诱惑下,安(suan)排(ji)自己的学生去搞计算。写到这里,很多脏话硬生生从嗓子眼憋回去了。骂是解决不了问题的。那么我们就理一理,一个实验的课题组,在没有任何计算背景的条件下,安(Po)排(Hai)一个学生做计算所遇到的问题吧:

  • 计算软件的选择:大千世界无奇不有,计算的软件也是多得数不过来,每个软件都有自己适用的体系,哪个更适合你的体系,你不会选择;

  • 软件的购买:比如你决定了使用VASP,你需要找代理商购买软件(有些还很贵,舍不得买,用盗版的,发文章的时候还担心版权问题);

  • 服务器的购买:买了软件我们要安装啊。你可能说,这个容易,直接买几台电脑装上就可以了。这里的问题在于:用台电脑就可以算,就可以发文章的时代造就过去了,你可能被淘汰十几年了。所以,

    • 要买服务器,但服务器价格不菲,怎么选你也不知道;
    • 不买服务器,可以买超算中心的机时啊。好吧,就当这一关也过了。
  • 软件安装:这也是个麻烦事。计算软件不是QQ,也不是360安全卫士,不是你下载个exe文件双击选择d盘就可以傻瓜式安装成功的。各种环境变量,依赖的库都是需要自己安装的。要不然那么多培训班上来就先给大家介绍软件是怎么安装的呢。

  • 熟悉Linux系统:计算软件大部分都是在Linux系统下安装的,所以Linux系统的一些常用命令操作你得学会;而Linux的桌面之所以不如Windows,用户习惯是个难以突破的瓶颈,在没人陪伴的情况下,自己熟练Linux系统也是非常不易;

  • 软件学习:这也是本书的重点,纯做计算的菜鸟,每天屁活都不干,就看本书,Linux系统下操练,有人指导的情况下差不多2个月能入门。对号入座,你一个做实验的,每天捣鼓设备,转转反应,就快累的嗝屁了,恨不得回到家或者宿舍就躺着歇会,还要跟朋友出去嗨,陪对象逛,当然还要玩把王者农药。真的能抽出时间来认真学习么?

  • 有些体系对软件参数依赖性很强,没人指导,你不会设置,软件出错不会解决,计算结果不会分析,算对算错都不知道,迷迷糊糊就这样得到了一些结果。

  • 计算的目的,肯定要跟实验对比啊?怎么对比,从哪方面下手,又没头绪,很多时候都是硬凑,结论反了也傻呵呵地跟别人说实验和理论吻合地很好,可以冲个大文章。

  • 折腾完了,要投文章了。因为计算太烂,XJB乱扯结论而被直接拒掉的又有一批;

  • 好不容易送审了, 最好去烧烧香,祈求不要落到做计算的人手里。真落到计算的人手里,算的太烂,也是很有可能因此丧命或者大修。

  • 就当你运气好,大修了。审稿人抛出来的专业计算问题你可能又答不上来,怎么补数据都无从下手。

  • 让你再幸运一把,补上数据,文章接受了。

  • 那下一篇还这样弄么? 可以,但经过上面的折腾,小硕士估计要毕业了,小博士也要滚蛋了。又得找下一个垫背的,也就是因为这样,上一批的不知对和错的经验就传授给了下一代。

  • 总结:一个做实验的老师,不把自己在实验方面的专长传授给自己的学生,硬让人家自己去琢磨你什么都不懂的领域,最后造就了一个四不像的怪物出来,何为师道?

这种情况到底怎么办? 很多人在的课题组都是做实验的,老板头脑发热的时候,就安排做起了计算。但老板除了一颗乐观的心,屁都不懂啊。这时候的你,除非脑子很好用,否则就会陷入一种叫天天不应,叫地地不灵的境界。在这里,大师兄建议你:

  • 说服老板,找个计算靠谱的组,合作一下,避免自己直接算,自己专心做实验,计算可以跟国内相关领域的老师合作一下,各取所长。
  • 说服不了,找个计算靠谱的组,让老板派你去交流学习一段时间,别自己在那里瞎捣鼓。
  • 认真学习本书,看VASP的手册,以及各种网站上的教程,先摸索一阵子再算老板给你的体系。
  • 总之,时间和精力的成本,自己心里要有个数。

在这里还要吐槽2点:

  • 有些做实验的跟计算合作,挂名的时候把计算放到不起眼位置的人,随意挪动计算作者的顺序,甚至是放到了通讯位置上,但没加*。生活不易,给做计算的留条活口,也给自己留个好名声。
  • 有些跟实验合作的计算工作者,随随便便优化个结构,做个漂亮的图就完事。只做锦上添花工作,而不深入研究课题机理。做计算的日子本来就难,请不要因为自己的不专业坏了计算的名声。
  • 如果想合作,就双方正儿八经地合作,真正意义的合作至少是通过计算解决了课题中的难点,机理,有助于组里课题的下一步进行,更高级点是实验验证了计算的假设,不过能做到这种程度的也没多少课题组。而对于这种良性的合作,实验和计算都给挂个一作,双方老板都挂个通讯,也无可厚非。
  • 不想合作,非让自己的学生做计算。这种情况就不要怕花钱,派学生到做计算的课题组学习上一两个月,然后再回来继续搞。如果有需要,也可以派出去参加参加一些高质量的培训班,暑期学校等,来弥补自己在学生指导方面的不足。

虽然书名叫The hard Way,这本书还是给了很多人一种DFT极品快餐的感觉;更会越来越”毁了”专业做计算的,让各种做实验的做计算的扰乱市场。虽然有这种负面的作用,但我还是想尽自己可能,稍微提高我们做计算的平均水平。因此,认真声明一下:本教程的初衷是给专门做计算菜鸟准备的。对于那些以为靠本书就可以快速入门的筒子们(不管是做计算还是做实验的),劝你们还是趁早放弃本书的学习,科研的路上,从来就没有速成二字。

8 计算 = 转行?

  • 很多人吐槽计算化学是个坑告诉你,既然选择了这条路,就准备改行吧。请避开这些负能量的说法,拿出自己的主见。无论放弃或者坚持,都要拿出你自己的判断力出来,请不要再听别人在你耳边瞎磨。也就是我的人生我做主。
  • 每一行的人都会说自己这一行是个坑,不管你怎么跳,都是坑。引用我老婆的原话:之前带两个孩子的时候,感觉自己每天都很累,现在孩子父母帮忙看着,自己工作了,但每天还是很累。美好的生活,累总是一路同行。
  • 个人的理解是,学习理论计算可以使你的视野更加开阔,思维方式更加灵活,对事物本质的把握和理解上,比别人要更胜一筹。也就是一眼就能找到问题的关键所在。不论是否继续相关的研究,转行与否,对今后的发展总会有所帮助。当然,我这个穷酸书生说的话,大家也可以一笑了之。

总结:

  • 初学者学习本书,所必须具有的技能:

    • 熟练使用一个操作系统;
    • 会编辑文本,写入和保存文件;
      • Windows 用户Notepad++必须掌握,
      • linux用户可以vim或者其他编辑器,比如Atom
    • 安装好或者会初步使用一款建模软件。-
      • **p4vasp **安装在Windows和Ubuntu系统上;
      • VESTA 安装在Windows,Ubuntu,Mac系统上;
      • Materials Studio 安装在Windows上。
    • 会连接服务器,使用的vasp程序并且会提交任务
      • 这个大师兄帮不了你,自行找服务器商或者其他售后人员解决。
  • 所具有的心态:

    • 主动去面对遇到的问题和困难,冰冻三尺,非一日之寒,遇到问题,主动解决,日积月累就会收获良多;
    • 对自己要有自信,即使自己是彻头彻底的小白,也不必要担心。相对于那些积累了很多错误经验的人来说,什么都不知道则具有更好的可塑性。
    • 不要盲目相信他人,有自己的理解。如果你在网上搜索问题的答案,会找到很多人的回答,但实际熵很多人水平都可能没有你高,而你却把他们的话当成真理一般去相信,这是致命的。
  • 大师兄的要求:

    • 新手认真阅读序言里面推荐的那本参考书;

    • 尽可能多地浏览VASP官网,对某些参数有疑惑,认真查阅手册;

    • 最重要的是不要偷懒,遇到不会的东西或者困难,立刻记下来或者去解决,否则明天你就会忘掉;

    • 好东西要学会分享,可以在QQ群里分享自己的心得,帮助其他正在入门的小师弟,妹们。

在BB了这么多废话之后,感觉时候再强调下本书的重点了:The Hard Way. The Hard Way 在本人的眼里,类似于书山有路勤为径,学海无涯苦作舟的感觉,类似于经过无数瞎折腾终于尝到一点点小胜利甜头的感觉,类似于苦尽甘来,柳暗花明又一村的感觉。所以:Hard Way是本书的重点,也是痛苦学习的一个过程。别人耗费精力和时间开发出来的软件,短时间就精通是不可能的事情。所以,也别指望着一口气吃成个胖子,耐住寂寞。

本人学习和使用VASP已经快10年了,该教程差不多也5岁了。我进入课题组之前,不会用Ubuntu系统,也不会用脚本,也不会用python写脚本,也没用过VASP。我的VASP入门,是花了一个月看了Davide Sholl的书后,老板又手把手花了一个多月的时间学会的,学习的资料是老版本的Hand on Session系列。每天做的是系列中的练习,准备老板布置的作业,思考老板预留的问题,然后第二天听老板解释每个参数的含义,里面的关键点。而真正操作起来进入课题的时候,又有组里细心的博后专门帮忙指导答疑,也有很多人可以进行讨论学习。写这么多并不是在秀自己遇到了一个多好的老板,多好的课题组。在这样的环境中,经过了四年的学习,好几个课题的实战,才变成你们感觉很牛逼的大师兄(其实我只是经验比你们多一点点而已)。而这本书,也是本人这四年来学习到的精华,每一节都要花费差不多4个小时的样子才能完成,或者更多。而这四年的精华,岂能让你把这本书看一遍就掌握了? 到现在为止,瞎BB了76节。每节你花一天的时间去学习,加上其他参考书的学习,也需要2个月的时间。而2个月,对一个新手来说,完全在承受范围之内,请相信时间的力量。这里,我们澄清下对新手的定义:全职搞计算的菜鸟。所以,Hard Way 就是需要你花掉每一个整天的时间,一点点认真琢磨,反复操练,绝对不是什么速成。而现在我们搞科研都很浮躁,什么都喜欢图快,我们也有句古话:欲速则不达。因此,打算朝夕之内就学会VASP的读者,本书可能真的不适合你。

致谢:

本教程在写作的过程中,得到了很多人的支持。 有些地方可能描述不清,当然书里面也肯定避免不了错误的出现,也收到了很多人的建议和批评指正。在这里,向他们表示诚挚的谢意。很多人认为,通过这个教程,学到了很多东西,但请不要过分把功劳归在我身上。引用佛系的观点:因果,完全是自作自受。你自己学习了,自己认真练习了,水平的提高完全是你自己辛苦付出的结果。教程就在这里,你学或者不学,都跟我没有关系。私以为,收获最大的还是本人。一方面把自己多年的学习的经验整理总结出来,另一方面,很多当时一知半解的地方,在写作的过程中,通过查阅资料,认真分析得到了解决。

教程的宗旨在于快速带领大家入门VASP的使用,这里大师兄想起了金庸笔下的打狗棒法, 本书传授的只是招式,而心法口诀则是你扎实的科研基础功,是自己这些年(高中,大学,硕士,博士)通过坚持不懈学习来积累获得的,对次,本人确实无能为力,而这一点也恰恰是我们最欠缺的部分,希望可以引起大家的重视,在等待任务结束的时候,多多补习自己的基础知识。

首先导入模块

from matminer.data_retrieval.retrieve_MP import MPDataRetrieval

实例化 MPDataRetrieval 这个类

mpdr = MPDataRetrieval(api_key=’qIAww9QnUnXQJO41’) # 自行查阅自己的api_key

在实例化 MPDataRetrieval 时需要输入用户在 Material Project 网站的“” API Key.

df = mpdr.get_dataframe(criteria={“nelements”: 1,
“elements”: {“$in”: [“Cu”]}},
properties=[‘pretty_formula’,’cif’])
print(“There are {} entries on MP with 2 element”.format(df[‘pretty_formula’].count())) # 计算有多少材料
#请自行关注 df[‘density’].count() 语句,获取Cu金属的各种结构

导入pymatgen.ext.matproj下的MPRester模块

from pymatgen.ext.matproj import MPRester

实例化 MPRester 这个类

mpr = MPRester(api_key=”XXX”) # 自行查阅自己的api_key,替换XXX。

获取Cu金属某一结构文件

data_structure=mpr.get_structure_by_material_id(‘mp-1009018’)

利用pymatgen.io.cif下的CifWriter模块导出Cu.cif文件

from pymatgen.io.cif import CifWriter
w = CifWriter(data_structure)
w.write_file(‘Cu.cif’)

今天分享一个Improved Dimer Method (IDM)的小脚本。IDM和传统的Dimer方法,NEB一样,都用于优化过渡态。Dimer方法的话,VTST(https://theory.cm.utexas.edu/vtsttools/)已经包含很多相关的脚本,咱们就不重复造车了。NEB结合IDM优化过渡态也很高效,成功率非常高,有兴趣的可以尝试下。分享脚本前主要介绍以下几点:

1) IDM已经编译在VASP里面了,不需要额外编译。

2) IDM跟平时的优化计算差不多,主要修改IBRION = 44即可。

3) IDM计算主要包括5步:

3.1: 生成初始的过渡态结构:可以有以下三种做法:

3.1.1 经验多的,可以直接手动初步搭一个,保存成POSCAR

3.1.2 胆儿不大不小小的,可以借助NEB的方法,先准备初末态的结构,然后用VTST的nebmake.pl插点,挑出来接近过渡态结构的POSCAR;

3.1.3 胆儿最小的,可以先NEB跑上30步左右,把能量最高的结构检查下,感觉过渡态结构合理的话,把CONTCAR保存成POSCAR。

3.2:用3.1步中获得的POSCAR做一个频率计算;主要有以下几个注意事项:

3.2.1: NWRITE = 3 一定要注意,必须是3。

3.2.2: 这一步频率计算用不着那么高的精度,差不多就OK。比如我主要做表面催化反应,这一步计算的时候,

i) slab的原子都直接固定住,

ii) 分子大的话只放开对应键断开、生成的原子,分子其他部分都固定住。

iii) gamma点直接算。

这样的话,可以在很快的时间内完成频率计算,得到键断开、生成时过渡态所对应的虚频振动方向。如果有好几个小虚频,不用尝试着去消虚频,因为过渡态结构本来就是一个粗糙的,这里消虚频也没必要;不过一定要有过渡态对应的虚频,如果没有的话,重新搭一个过渡态结构,继续算频率。

3.3 读取频率计算的结果,生成IDM计算的POSCAR。这也是本节中脚本的作用;

3.4 准备IDM计算的INCAR, KPOINTS, POTCAR, 提交任务,等待结束。

3.5 精度稍微高点的频率计算,验证IDM优化出来的过渡态结构。

3.6 以上是正常计算的一个流程,具体细节,大家根据自己情况随机应变,官网的介绍只有一页,很短,一定要认真读一下:https://www.vasp.at/wiki/index.php/Improved_Dimer_Method

脚本部分:

脚本get_dimer.py可以在我的Github页面下载: https://github.com/bigbrosci/q-robot/tree/main/actions。 q-robot是本人这些年来计算常用的一些小脚本,有兴趣的也可以全部下载下来。根据自己需求酌情修改使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
@author: qli
Created on Thu Jun 2 22:09:18 2022
Creat POSCAR for improved dimer calculations from frequency calculations.
1) run frequency calculation:
IBRION = 5
POTIM = 0.015
NFREE = 2
NWRITE = 3 ### Must be 3
2) run this script:
get_dimer.py
3) use the POSCAR for IDM calc.
NSW = 100
Prec=Normal
IBRION=44 ! use the dimer method as optimization engine
EDIFFG=-0.05
POTIM = 0.05

"""

import numpy as np
from ase.io import read, write
import os
from sys import exit

model = read('POSCAR_relax') ### POSCAR_relax is the POSCAR before freq calculations, that means some atoms are not fixed.
#model_positions = model.get_positions()
model.write('POSCAR_dimer', vasp5=True)

# print(model_positions)
# print(len(model))

l_start = 0 # the number of line which contains 'Eigenvectors after division by SQRT(mass)'
with open('OUTCAR') as f_in:
lines = f_in.readlines()
for num, line in enumerate(lines):
if 'Eigenvectors after division by SQRT(mass)' in line:
l_start = num

if l_start == 0:
print('''Check Frequency results and then rerun this script.\n**Remember**: NWRITE must be 3. BYEBYE! ''' )
exit()

freq_infor_block = lines[l_start:]
l_position = 0
wave_num = 0.0
for num, line in enumerate(freq_infor_block):
if 'f/i' in line:
wave_tem = float(line.rstrip().split()[6])
if wave_tem > wave_num:
wave_num = wave_tem
l_position = num+2

pos_dimer = open('POSCAR_dimer', 'a')
pos_dimer.write(' ! Dimer Axis Block\n')

vib_lines = freq_infor_block[l_position:l_position+len(model)]
for line in vib_lines:
infor = line.rstrip().split()[3:]
pos_dimer.write(' '.join(infor)+'\n')

pos_dimer.close()
print('''
DONE!
Output file is named as: POSCAR_dimer and can be used for dimer calculations.
Don't forget to rename POSCAR_dimer to POSCAR before you run the dimer jobs.
''')

需要注意的有以下几点:

1) 前面介绍了,频率计算为了图快,我们固定了一些原子。脚本会读取一个POSCAR_relax,也就是没有固定这些原子的结构。用ASE读取,输出一下,保证POSCAR里面的结构干净,避免出错。

2)脚本会读取最大的虚频,然后把它所对应的振动方向附到POSCAR_relax的后面,然后IDM的POSCAR就准备好了。

3)输出为POSCAR_dimer, 计算的时候记得把它改成POSCAR。

4)IDM任务的INCAR在脚本里面有说明,改下IBRION = 44。 剩下的基本跟平时优化是一样的。

5)直接在频率计算的目录里面运行:get_dimer.py 即可。

IDM结合NEB的成功率很高,非常推荐。另外,计算出的结果极少出现多个虚频的情况。因此,这个方法也可以用来消虚频。差不多就这些了,剩下的就是多操作练习,熟能生巧的事情了。欢迎大家分享自己的经验,放到自己的网站,公众号等平台,帮助更多的人解决VASP计算相关的问题,有兴趣的也可以把自己的经验心得放到大师兄网站上,直接给我发邮件即可(lqcata@gmail.com)。

VTST的编译并不难,关键主要有2点:

1)VASP能顺利编译

2)VTST编译的时候,严格按照官网的说明一步一步来即可。

为什么要编译VTST,说白了还是VASP自带的功能不强大,没法解决我们的实际计算问题,主要是过渡态结构的搜索。因此,我们需要把VTST的一些功能添加到VASP中。网上可以搜到很多相关的编译教程,这里主要简单介绍下编译的几点注意事项,理清编译的思路,增加成功率。

首先,在编译VTST之前,要确定你顺利编译了VASP。如果这一步你还没搞定,就打算直接编译VTST,会导致你不知道问题从哪里来?是VASP编译的原因呢?还是VTST的原因?另外,VTST编译命令跟VASP是一样的,都是make,只要按照VTST官网的说明,复制文件到指定目录, 修改特定的文件内容,其他的和VASP编译设置一致即可。

其次,一定要看官网。记住,官网永远是学习的第一手资料,很多人喜欢看各种各样的教程,大部分教程都是官网的阉割版。或多或少会丢失些重要的信息,导致出错了不知道怎么解决。

最后,我们介绍下官网的编译说明 (https://theory.cm.utexas.edu/vtsttools/installation.html),大家编译好VASP之后,按照说明一步一步走,基本都能顺利编译VTST到VASP中:

  1. 第一步当然是下载并解压VTST的程序包喽:(https://theory.cm.utexas.edu/vtsttools/download.html)

解压后,发现压缩包里的文件有些令人犯迷糊,简单说明下: VTST提供了对应三种VASP版本编译的文件。

i) vtstcode5 文件夹里面对应的是VASP5 版本的

ii) vtstcode6.1 文件夹里面对应的是VASP6.1和6.2版本的

iii) vtstcode5 和 vtstcode6.1两个文件夹外面的文件对应的是VASP6.3版本的。

iv) VASP5升级到VASP6不管是6.1还是6.3)要额外花钱,如果你有VASP5的版权,那么就用vtstcode5的文件,VASP5也有很多的子版本,尽量用最新的5.4.4。

v) VASP6.1/2升级到VASP6.3不花钱,6.3还支持机器学习,所以vtst6.1这个文件夹,直接删掉就OK了,暂不用它,直接搞6.3。

2) 编译前的准备:

i) cp 5.4.4 5.4.4_vtst && cd 5.4.4_vtst

5.4.4 为已经编译好的VASP目录,这样的话,我们可以用原生的VASP,亦可以用VTST强化过的。另外,这也是对VASP的一个备份;

ii) 将下载的文件复制到 src文件中:

ii) 编辑src文件中的main.F 文件

按照官网的说明,VIM打开src/main.F 文件,找到对应的部分,直接替换即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
In VTST v2.04 and later, a modification is required in main.F for the solid-state NEB.

Find and replace:

CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &
LATT_CUR%A,LATT_CUR%B,IO%IU6)
with

CALL CHAIN_FORCE(T_INFO%NIONS,DYN%POSION,TOTEN,TIFOR, &
TSIF,LATT_CUR%A,LATT_CUR%B,IO%IU6)
For vasp.6.2 also find and replace:

IF (LCHAIN) CALL chain_init( T_INFO, IO)
with

CALL chain_init( T_INFO, IO)
For vasp.6.2.1 you will need vtstcode 4.1 (revision 182). A version of the vtstcode that will work with vasp.6.1.x - vasp.6.2.0 has been saved in the vtstcode6.1 directory.

注意:VASP6.2还需要额外替换一行,至于6.3是不是跟6.2一样? 可以编译2个版本,一个替换,一个不替换,然后对比下。本人测试的结果是,如果不替换,编译会失败。

iii) 编辑 src/.objects文件

先看下官网的说明:

1
2
3
4
5
To build the code, the VASP makefile needs to be changed. Find the variable SOURCE, which defines which objects will be built, and add the following objects before chain.o:

bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o \
fire.o lanczos.o neb.o qm.o opt.o
The objects dynmat.o, neb.o, dimer.o, lanczos.o, and instanton.o must be in the SOURCE list before chain.o appears. The optimizer objects, sd.o, cg.o, qm.o, lbfgs.o, bfgs.o, and fire.o must appear before the optimizer driver opt.o. Nothing else needs to be done.

官网里面有句话:Find the variable SOURCE, which defines which objects will be built, and add the following objects before chain.o。

这里的variable SOURCE指的就是src目录里面的.objects文件,这个文件前面带.,是隐藏的。用VIM或者其他文本编辑软件直接打开编辑就行。

主要有2点,加粗的Before告诉你怎么改.objects文件:

1: The objects dynmat.o, neb.o, dimer.o, lanczos.o, and instanton.o must be in the SOURCE list before chain.o appears.

2: The optimizer objects, sd.o, cg.o, qm.o, lbfgs.o, bfgs.o, and fire.o must appear before the optimizer driver opt.o.

1
2
3
4
5
70         tetweight.o \
71 hamil_rot.o \
72 bfgs.o dynmat.o instanton.o lbfgs.o sd.o cg.o dimer.o bbm.o \
73 fire.o lanczos.o neb.o qm.o opt.o \
74 chain.o \

直接复制官网的文本,将72,73行内容放到指定的位置即可(chain.o前面),不要随便改顺序。

3) 回顾下,1)将VTST的文件复制到src目录里面,2) 修改main.F,3) 修改 .object文件。没有遗漏的话,就可以直接编译了。直接make命令,喝杯咖啡等着即可,下面是本人编译的一些具体命令:5.4.4 是已经编译好的VASP5的目录,VTST(5.4.4_vtst)编译时环境变量的设置跟5.4.4完全一样。

1
2
3
4
5
6
cp 5.4.4   5.4.4_vtst  
cd 5.4.4_vtst
cp ~/Downloads/vtstcode-184/vtstcode5/* src/
vi src/main.F
vi src/.objects
make
  1. 确认是否顺利编译,直接运行个例子看看就知道了。
1
grep VTST -A 10 02/OUTCAR

没问题的话则会出现下面的内容:

1
2
3
4
5
6
7
8
9
10
11
VTST: version 3.2, (02/03/18)

CHAIN: initializing optimizer

OPT: Using Conjugate-Gradient optimizer
OPT: CG, Init
OPT: CG, FDSTEP 0.005000
OPT: CG, MAXMOVE 0.200000

CHAIN: Read ICHAIN 0
CHAIN: Running the NEB
  1. 简单总结下:编译VTST主要有以下4个小细节:

    i) 前提是顺利编译完成了VASP,这也是最关键的地方。

    ii) 下载VTST的code,找到对应VASP版本的文件,并复制到src目录中

    iii) 修改src/main.F 文件

    iv) 修改src/.objects 文件

  2. 欢迎大家分享自己的经验,放到自己的网站,公众号等平台,帮助更多的人解决VTST编译的问题,也可以添加到本文章中 (lqcata@gmail.com)。此外,VTST的Code怎么下载?有没有具体运行的案例?提交任务的命令怎么写?按照这个说明编译失败了,怎么办?这些问题就不要找我了。我相当圣母,可俺是男的。实在没办法,放弃也是个很好的选择。

VASP官方在Youtube上开了自己的channel,虽然只有寥寥300多人关注,但也分析了9个视频。下载下来后大约是1G左右。1G只是个嚼头而已。主要内容如下:

1 Advanced_methods_of_molecular_dynamics_VASP_Lecture

2 Basics_of_machine_learning_force_fields_VASP_Lecture

3 Electronic_Convergence_VASP_Lecture

4 Hybrid_functionals_VASP_Lecture

5 Introduction_to_ab_initio_simulation_in_VASP_VASP_Lecture

6 Introduction_to_molecular_dynamics_VASP_Lecture

7 py4vasp_04_release

8 Symmetry_and_sampling_in_reciprocal_space_VASP_Lecture

9 VASP_6.3_release

从图1里面文件大小可以看出来,除了7和9介绍新的后处理工具py4vasp和vasp6.3新版本之外,其他的7个视频都干货满满。不信的话再看看视频的时间,都在1个小时以上,相信对大家学习VASP肯定有帮助。

建议大家关注下VASP的Youtube频道,这么牛逼的软件,才300多号人关注。哈哈。不过得科学上网,没有条件可以通过大师兄分享的网盘链接下载,

下载方式:关注公众号:大师兄科研网,后台回复: youtube 即可。

ASE消虚频的小脚本

做计算,虚频是令我们又爱又恨的一个东西。结构优化的时候,出现虚频,往往需要我们花费大量的时间和精力去消掉它们,最后搞得精疲力尽。算过渡态的时候,它又不出来,又得折腾个半死才出现。再不幸一些,除了过渡态对应的虚频外,还出现了一个伴生的姐弟虚频,我们又得继续消下去。本节简单介绍一个结构优化时消虚频的小脚本。主要是根据虚频的振动方向将体系中对应原子的坐标进行微调,然后用于重新优化。

简单介绍下原理,先看下VASP的OUTCAR中虚频对应的部分,

1)7220行带有f/i说明有虚频存在,

2) X, Y, Z为体系中原子的坐标,也就是POSCAR中的内容。

3) dx, dy,dz为虚频对应的原子振动方向上的位移。

4)我们将(dx, dy,dz)这个位移乘以一个介于0-1之间的校正因子,然后跟POSCAR中的坐标加起来即可。

5)以z方向为例,校正因子设为0.1,微调后的z方向坐标为: 10.709980 + (-0.676634) $\times$ 0.1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
7219
7220 3 f/i= 9.313471 THz 58.518262 2PiTHz 310.663930 cm-1 38.517432 meV
7221 X Y Z dx dy dz
7222 6.003159 11.629641 6.067545 0 0 0
7223 7.651085 3.894943 9.628260 0 0 0
7224 2.424442 5.785382 9.658882 0 0 0
7225 5.384679 7.755200 0.000000 0 0 0
7226 0.004928 9.643165 0.000000 0 0 0
7227 8.286347 7.755200 0.877073 0 0 0
7228 2.944132 9.643165 0.971480 0 0 0
7229 6.823299 9.643165 1.459420 0 0 0
7230 1.481083 7.755200 1.553827 0 0 0
7231 4.619917 7.755200 2.336493 0 0 0
7232 9.762503 9.643165 2.430900 0 0 0
7233 6.756153 7.724844 3.627352 0 0 0
7234 1.491401 9.684490 3.647528 0 0 0
7235 8.239374 9.666853 5.136018 0 0 0
7236 3.012611 7.740104 5.091365 0 0 0
7237 6.016826 7.737975 6.049788 0 0 0
7238 0.788563 9.668849 6.080188 0 0 0
7239 8.321833 7.730633 7.184644 0 0 0
7240 3.081015 9.671865 7.187374 0 0 0
7241 0.815711 7.728916 8.180983 0 0 0
7242 6.063762 9.648841 8.115270 0 0 0
7243 9.839838 9.660462 8.962566 0 0 0
7244 4.631258 7.730218 9.011537 0 0 0
7245 7.668770 7.725888 9.623941 0 0 0
7246 2.424191 9.657803 9.623832 0 0 0
7247 2.095436 3.874640 10.694551 0 0 0
7248 0.099192 11.590822 10.709980 -0.736317 0.002031 -0.676634

脚本内容 (命名为: vib_correct.py )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- coding: utf-8 -*-
"""
Qiang Li
Command: python3 vib_correct.py
This is a temporary script file.
"""
import numpy as np
from ase.io import read, write
import os

#获取虚频开始行
l_position = 0 #虚频振动方向部分在OUTCAR中的起始行数
with open('OUTCAR') as f_in:
lines = f_in.readlines()
wave_num = 0.0
for num, line in enumerate(lines):
if 'f/i' in line:
wave_tem = float(line.rstrip().split()[6])
if wave_tem > wave_num: #获取最大的虚频
wave_num = wave_tem
l_position = num+2
# ASE读POSCAR
model = read('POSCAR')
model_positions = model.get_positions()
num_atoms = len(model)
#print(model_positions)

# 获取虚频对应的OUTCAR部分
vib_lines = lines[l_position:l_position + num_atoms] #振动部分 7222到7248行
#print(vib_lines)
vib_dis = []
for line in vib_lines:
#model_positions = [float(i) for i in line.rstrip().split()[:3]]
vib_infor = [float(i) for i in line.rstrip().split()[3:]] # dx, dy, dz对应的那三列
vib_dis.append(vib_infor)
vib_dis = np.array(vib_dis) #将振动部分写到一个array中。

# 微调结构
new_positions = model_positions + vib_dis * 0.4 # 0.4是微调的校正因子,即虚频对应振动位移的0.4,具体多大自己根据经验调。
model.positions = new_positions

###保存结构
write('POSCAR_new', model, vasp5=True) # POSCAR_new是微调后的结构,用于下一步的计算(别忘了把POSCAR_new改成POSCAR)。

脚本使用:

  1. 脚本跟计算文件在同一个目录下:python3 vib_correct.py
  1. 如果赋予了脚本可执行权限,并放到了~/bin目录下,直接运行: vib_correct.py 命令即可得到校正后的结构文件:POSCAR_new
  2. 重新计算的时候,新建一个文件夹,把POSCAR_new 复制到文件夹里面,记得把名字改成POSCAR
  3. 这个脚本只适用于普通结构优化时候的虚频。如果过渡态计算的时候出现好几个虚频,不要使用这个脚本,因为脚本默认使用最大虚频对应的位移进行校正。
  4. 不用ASE,自己直接写个python脚本也能实现。不过使用ASE可以很方便地获取POSCAR中原子数目,保存原子固定的信息。参考如下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Qiang Li
Command: python3 vib_correct.py
This is a temporary script file.
"""
import numpy as np
import os

#获取虚频开始行
l_position = 0 #虚频振动方向部分在OUTCAR中的起始行数
with open('OUTCAR') as f_in:
lines = f_in.readlines()
wave_num = 0.0
for num, line in enumerate(lines):
if 'f/i' in line:
wave_tem = float(line.rstrip().split()[6])
if wave_tem > wave_num: #获取最大的虚频
wave_num = wave_tem
l_position = num+2
# 读POSCAR
with open('POSCAR') as f_pos:
lines_pos = f_pos.readlines()

# 获取虚频对应的OUTCAR部分
num_atoms = sum([int(i) for i in lines_pos[6].rstrip().split()])
vib_lines = lines[l_position:l_position + num_atoms] #振动部分 7222到7248行

model_positions = []
vib_dis = []
for line in vib_lines:
position = [float(i) for i in line.rstrip().split()[:3]]
vib_infor = [float(i) for i in line.rstrip().split()[3:]] # dx, dy, dz对应的那三列
model_positions.append(position)
vib_dis.append(vib_infor)

# 微调结构
model_positions = np.array(model_positions)
vib_dis = np.array(vib_dis) #将振动部分写到一个array中。
new_positions = model_positions + vib_dis * 0.4 # 0.4是微调的校正因子,即虚频对应振动位移的0.4,具体多大自己根据经验调。

###保存结构
f_out = open('POSCAR_new','w')
f_out.writelines(lines_pos[:8])
f_out.write('Cartesian\n')
for i in new_positions:
f_out.write(' '.join([str(coord) for coord in i]) + ' F F F\n')
f_out.close()

通过ASE获取原子之间的距离

原子之间的距离是计算化学中模型搭建,结果分析中经常需要分析的部分。而计算原子的之间的距离也非常简单,通过可视化软件直接点两个原子就可以直接显示出来,可以通过自写的一些小脚本来实现。跟均相的体系不同,周期性体系由于周期性边界的存在,有时候模型中两个原子之间的距离需要将周期性边界条件考虑进去才能正确得到。今天简单介绍一个通过ASE获取原子之间的距离,并且考虑周期性边界条件的影响的小脚本。

具体例子展示一下:

图里面是$TiO{_2}(101)$表面上吸附的一个Pt单原子模型,如果直接计算Pt和Ti之间距离的话(图1),测量一下为 7.461 $\AA$。实际上我们把slab模型沿着y轴重复下就会发现,还有一个更短的Pt-Ti距离。

图1: Pt-Ti原子之间的距离

测量下,距离为:3.818 $\AA$。在周期性计算中,如果刚开始模型搭建的时候没有考虑到这一点,或者分子比较大,亦或者AIMD过程中分子到处跑,都会出现类似这样的情形。所以在测量距离时候,要注意周期性边界对数值的影响。当然最理想的情况就是模型搭建的时候将这一情况考虑进来,尽可能将分子放在slab的中间部分。如果出现这种情况,测量的时候加上周期性边界条件的校正即可,这也是本节要介绍的内容。

图2:考虑周期性边界条件后Pt-Ti之间的距离

首先我们看下体系的坐标,在p4vasp的界面中,POSCAR中每个原子对应着不同的序号(序号是从1开始的),比如:Pt在POSCAR中是第109号原子,前面测量的Pt-Ti距离就是109号和23号原子之间的距离。计算两点之间的距离公式相信大家初高中的时候已经学过了。过程很简单(参考下面脚本中注释掉的部分。):1)获取两个原子之间的坐标; 2)套公式得到距离。本节介绍通过ASE写个小脚本获取两个原子之间的距离。

图3:p4vasp中原子的序号

脚本内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Fri Apr 22 10:06:51 2022
@author: qli
Command: python3 get_dis_AB.py atom_A_index atom_B_index
"""

import numpy as np
from ase.io import read, write
import os, sys

'''
Important Note: Atoms are indexed from 0.
'''
atom_A, atom_B = [int(i) for i in sys.argv[1:3]]
model = read('POSCAR')
positions = model.get_positions()
dis_AB_1 = model.get_distance(atom_A, atom_B, mic=True)
dis_AB_2 = model.get_distance(atom_A, atom_B, mic=False)

print(round(dis_AB_1, 4), '\t',round(dis_AB_2,4))

## Not Used
#coord_A = positions[atom_A]
#coord_B = positions[atom_B]
#dis_AB = np.linalg.norm(coord_A-coord_B)
#print(round(dis_AB,4))
  1. atom_A,和 atom_B 是要测量的2个原子,注意:ASE中原子的序号是从0开始的,所以上面的例子中,Ti和Pt在ASE中则是22和108号原子。
  2. 脚本里面读的是POSCAR,根据自己的需求改成CONTCAR或者其他的带有坐标的文件。
  3. mic=True 考虑周期性边界的影响。mic=False 则是直接测量两个原子的距离。
  4. 最后面注释的几行是获取原子坐标,通过numpy计算距离的例子,效果等于前面mic=False.
  5. 脚本使用的命令:python3 get_dis_AB.py 22 108

脚本效果:

1
2
qli@bigbro:~/Desktop/example$ python3 get_dis_AB.py  22 108
3.8175 7.4611

改进下输出格式

将前面脚本中print的一行删掉,换成下面的即可,反正数值已经在这里了,怎么输出根据自己爱好,把print对应的效果改改即可。

1
2
print('Atom_A\tAtom_B\tdis_A-B')
print('%s\t%s\t%.4f' %(atom_A, atom_B, dis_AB_1))
1
2
3
qli@bigbro:~/Desktop/example$ python3 get_dis_AB.py  22 108
Atom_A Atom_B dis_A-B
22 108 3.8175

放到~/bin目录下,随时可以使用:

1
2
3
4
5
6
7
qli@bigbro:~/Desktop/example$ chmod u+x get_dis_AB.py 
qli@bigbro:~/Desktop/example$ mv get_dis_AB.py ~/bin/
qli@bigbro:~/Desktop/example$ ls
POSCAR
qli@bigbro:~/Desktop/example$ get_dis_AB.py 22 108
Atom_A Atom_B dis_A-B
22 108 3.8175

没有~/bin的话,自己创建一个即可:mkdir ~/bin

有兴趣的也可以自己尝试着解决周期性边界条件对计算两原子之间距离的影响,GitHub上也有很多类似的代码。也欢迎大家分享自己的代码或者链接;可以发送到我的邮箱:lqcata@gmail.com或者直接Q:122103465,微信:BigBroSci 联系。

在ipad,手机上运行终端,连接服务器可以让我们随时随地查看,提交任务。在这里推荐一款ipad和iphone上的终端APP: SSHaking。如果你用的安卓系统,一些推荐的APP可以直接到文章底部去找。
先依照个人使用的经验,列出来以下SSHaking的优点:

1) 界面简洁,没广告;

2) 可以同时打开好几个terminal界面;

3)连接服务器设置也很简单;

4) 支持连接多个Hosts; (平时常用的terminus只支持一个,连多个的话要花钱,服务器如果只有一个,也推荐terminus)

5) 免费!!!!

6)APP的开发者很牛,可能也很帅!

7)希望大家多多下载这款APP,有什么bug及时给作者提出来,而且作者看到后修复的也很及时。

如果你用的是安卓系统,可以有以下几个选择:

1) juiceSSH (轻和浅吟🐳)
2) Admin hands (HeyTamas)

括号里是提供APP名字的好心人。如果你也有推荐的其他好用的APP(免费的),可以在微信公众号留言。

https://mp.weixin.qq.com/s/jvghzIlV6NOsNFjUa445xQ

Citrine 也是一个材料学数据库,自带了机器学习工具,大家也可以研究琢磨一下。官网是 https://citrination.com/search/simple?searchMatchOption=fuzzyMatch。这里,我们将通过几个例子了解如何在这个数据库中获取数据。在Citrine中获取数据需要用到 matminer.data_retrieval.retrieve_Citrine.CitrineDataRetrieval 这个工具,其跟materials project类似,也学要一个API_key。大家可以在官网注册,并记录下API_Key。

1
2
3
#请先在终端中输入: pip install citrination_client ; 否则会报错
#然后我们回到代码,导入 CitrineDataRetrieval 这个模块
from matminer.data_retrieval.retrieve_Citrine import CitrineDataRetrieval

示例1:获取化学式为 Si 的所有材料的实验测得的能带

1
2
# 先实例化这个工具,需要提供你的API_Key
cdr = CitrineDataRetrieval(api_key='')
1
2
3
4
# 接下来,类似从materials project获取数据,我们需要用get_dataframe函数
df = cdr.get_dataframe(criteria={'formula':'Si', 'data_type': 'EXPERIMENTAL'},
properties=['Band gap'],
secondary_fields=True)
1
2
3
4
5
6
7
8
9
10
11
  0%|                                                                                            | 0/7 [00:00<?, ?it/s]d:\programs\anaconda3\envs\py36\lib\site-packages\matminer\data_retrieval\retrieve_Citrine.py:103: FutureWarning:

pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead

100%|████████████████████████████████████████████████████████████████████████████████████| 7/7 [00:00<00:00, 87.33it/s]

all available fields:
['Band gap', 'uid', 'Band gap-units', 'category', 'references', 'chemicalFormula', 'Crystallinity', 'Band gap-conditions', 'Band gap-methods', 'Band gap-dataType']

suggested common fields:
['references', 'chemicalFormula', 'Crystallinity', 'Band gap', 'Band gap-units', 'Band gap-conditions', 'Band gap-methods', 'Band gap-dataType']
1
df #查看表格

从上面结果可以看出,数据库里有化学式为Si的材料共7中实验测得的能带数据。这些数据来源的文献,带隙的值,实验方法都被记录了下来。

示例2:获取材料对 OH 和 O物种的吸附能

想不到citrine数据库还有各种材料对OH 和 O 物种的吸附能,一起来看看怎么获取把。要查询更多的数据库,请探索官网https://citrination.com/datasets

1
2
3
# 我们发现这里不需要指定筛选条件,只需要返回所需要的性质即可。
df_OH = cdr.get_dataframe(criteria={}, properties=['adsorption energy of OH'], secondary_fields=True)
df_O = cdr.get_dataframe(criteria={}, properties=['adsorption energy of O'], secondary_fields=True)
  0%|                                                                                            | 0/9 [00:00<?, ?it/s]d:\programs\anaconda3\envs\py36\lib\site-packages\matminer\data_retrieval\retrieve_Citrine.py:103: FutureWarning:

pandas.io.json.json_normalize is deprecated, use pandas.json_normalize instead

100%|███████████████████████████████████████████████████████████████████████████████████| 9/9 [00:00<00:00, 128.63it/s]


all available fields:
['uid', 'Adsorption energy of OH', 'Adsorption energy of OH-units', 'Morphology', 'Surface facet', 'category', 'references', 'chemicalFormula', 'Adsorption energy of OH-conditions', 'Adsorption energy of OH-dataType']

suggested common fields:
['references', 'chemicalFormula', 'Surface facet', 'Adsorption energy of OH', 'Adsorption energy of OH-units', 'Adsorption energy of OH-dataType', 'Morphology', 'Adsorption energy of OH-conditions']


100%|█████████████████████████████████████████████████████████████████████████████████| 21/21 [00:00<00:00, 140.70it/s]

all available fields:
['uid', 'Surface facet', 'Adsorption energy of O', 'category', 'references', 'chemicalFormula', 'Reconstruction', 'Adsorption energy of O-units', 'Adsorption energy of O-conditions']

suggested common fields:
['references', 'chemicalFormula', 'Surface facet', 'Adsorption energy of O', 'Adsorption energy of O-units', 'Adsorption energy of O-conditions', 'Reconstruction']
1
df_OH.head()

1
df_O.head()

大家可以看到,这些数据库里面的数据还不够丰富。大家也可以把自己计算得到的数据上传到citrine数据库中,促进科学知识的开放获取。

  • 实际上 citrine 数据库包含了很多实验数据,下次的分享中,我们会把citrine数据库中的实验数据和materials project中的计算数据做个对比。
  • 强烈推荐大家在学习的时候使用jupyter notebook。
  • 附上jupyter notebook文件共大家参考:【链接:https://pan.baidu.com/s/1W1XKj-Fnjmx1yIe2QB7_MQ 提取码:jvoi 】

本次分享到此结束。

https://nbviewer.jupyter.org/github/hackingmaterials/matminer_examples/blob/master/matminer_examples/data_retrieval-nb/data_retrieval_basics.ipynb

从Materials Project 数据库获取

从Materials Project数据库获取数据得用到 matminer.data_retrieval.retrieve_MP.MPDataRetrieval 功能。

1
2
3
4
5
# 首先导入模块
from matminer.data_retrieval.retrieve_MP import MPDataRetrieval
# 实例化 MPDataRetrieval 这个类
mpdr = MPDataRetrieval(api_key='your_own_api_key')
# 在实例化 MPDataRetrieval 时需要输入用户在 Material Project 网站的 API Key.

示例1:获取所有单元素材料的密度

上一次的介绍说到,matminer 处理的数据跟 pandas 库一样,是 dataframe,所以我们要用 get_dataframe 方法获取数据; dataframe 看起来就像excel 表格一样。

1
2
3
df = mpdr.get_dataframe(criteria={"nelements": 1}, properties=['density', 'pretty_formula'])
print("There are {} entries on MP with 1 element".format(df['density'].count())) # 计算有多少材料
#请自行关注 df['density'].count() 语句

criteria 是搜索条件,它是一个字典,字典里面可以有多个键值对; properties 是想要获取的材料性质,它是个列表,里面可以有多个性质。其实criteria 也是材料的性质。想知道所有可用的性质,请参考 https://github.com/materialsproject/pymatgen/blob/master/pymatgen/ext/matproj.py

上述代码意味着 我们想在数据库中搜索材料,这些材料元素种类为1,对于这些材料,我们想得到它们的密度和化学式信息。

结果如下:

让我们看一下这个 dataframe 表格长什么样

1
2
df.head()  # 这个语句会显示 df 这个表格的前几行,可以看到,我们获得了 716 个单元素材料。
# 表格里记录了我们需要的密度 和 化学式的性质,以及它们的ID

结果如下:

示例2:获取所有带隙大于 4.0 eV的材料

方法挺简单的,就是在上个例子的 get_dataframe 方法中设置新的搜索条件: 带隙大于4.0 eV.

1
2
3
4
5
# 带隙是 band_gap,大于4怎么写呢? 是 greater than, 缩写成 gt. 在 matminer中要写成 $gt 
# 大家注意体会 criteria 的字典形式。criteria=, properties= 可以省略不写。
df = mpdr.get_dataframe({"band_gap": {"$gt": 4.0}}, ['pretty_formula', 'band_gap'])

print("There are {} entries on MP with a band gap larger than 4.0".format(df['band_gap'].count()))

结果如下:

再看一下表格长什么样子

1
df.head()

结果如下:

如果想把表格保存成excel可读写的格式,可以用下面的语句:

1
df.to_csv('materials_bg_gt_4.csv')

示例3:获取 VRH 剪切模量和体积模量

首先得要求这些材料存在弹性的性质,其次,我们还想要求这些弹性数据没有警告信息

1
2
3
4
5
6
# 存在弹性常数信息用 "elasticity": {"$exists": True} 表示,没有警告信息用 一个空列表表示:"elasticity.warnings": []

df = mpdr.get_dataframe({"elasticity": {"$exists": True}, "elasticity.warnings": []},
['pretty_formula', 'elasticity.K_VRH', 'elasticity.G_VRH'])

print("There are {} elastic entries on MP with no warnings".format(df['elasticity.K_VRH'].count()))

搜索结果如下:

我们想统计一下这些数据

1
df.describe() # 该语句可以很方便地对表格中的每一列数据进行统计,给出数量,平均数,方差,最小、最大值等信息

得到:

接下来看一个更复杂的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
'''
除了上次的搜索条件外,我们想搜索包含 Pb 和 Te 的材料:"elements": {"$all": ["Pb", "Te"]}
材料的稳定性也在考虑之中,energy above hull 必须在1e-6以下:"e_above_hull": {"$lt": 1e-6}
'''
df = mpdr.get_dataframe(criteria={"elasticity": {"$exists": True},
"elasticity.warnings": [],
"elements": {"$all": ["Pb", "Te"]},
"e_above_hull": {"$lt": 1e-6}}, # to limit the number of hits for the sake of time
properties = ["elasticity.K_VRH", "elasticity.G_VRH", "pretty_formula",
"e_above_hull", "bandstructure", "dos"])

print("There are {} elastic entries on MP with no warnings that contain "
"Pb and Te with energy above hull ~ 0.0 eV".format(df['elasticity.K_VRH'].count()))

结果是:

There are 3 elastic entries on MP with no warnings that contain Pb and Te with energy above hull ~ 0.0 eV

1
df.head()

下面来查看一下其中一个材料的能带和DOS图

1
2
3
4
5
6
from pymatgen.electronic_structure.plotter import BSDOSPlotter # 调用 Pymatgen 作图

mpid = 'mp-20740'
idx = df.index[df.index==mpid][0] # 获取 mp-20740 这个材料所在的行数
plt = BSDOSPlotter().get_plot(bs=df.loc[idx, 'bandstructure'], dos=df.loc[idx, 'dos']);
plt.show()

结尾

  • matminer获得的数据(本教程保存在 df 变量中)可以可视化,也可以直接用来做机器学习。有兴趣的同学请自学 pandas 这个 python 库,学习 dataframe 数据的处理方法。

  • Pymatgen 做的能带和DOS图不够美观。大家可以留言,我有机会可以跟大家分享修改pymatgen代码来美化这些图。

  • 官网的教程是基于 jupyter notebook的。jupyter notebook 的好处是既能运行代码,又能自由地给代码加注释,公式,图片。所得到的文档便于阅读和理解。希望大家也能学会这个python 库。

  • 如果想调用 jupyter notebook来运行上述代码,建议大家在具有图形界面的终端上试验。以windows 系统为例,再按照上篇教程创建好 py36 虚拟环境后,需要

    1
    pip install jupyter # 具体的使用方法请参考其它网络教程
  • 本文还附带jupyter notebook 版本的文档供大家阅读和使用 【链接:https://pan.baidu.com/s/153PcfiM3vaAG71MCCTFuCQ
    提取码:w4us 】

本次的教程到这就结束了。

今天向大家隆重介绍一款材料类的机器学习开源软件:Matminer!机器学习预测材料性质,乃至逆向设计材料是材料领域的热门研究话题。很多同学有心做机器学习方面的研究,奈何不知道有哪些实用的代码,从而使项目一拖再拖。材料类的机器学习软件有很多,我比较喜欢Matminer这一款,因为它是由Pymatgen开发者开发的,非常易于使用。现在就向大家介绍一下这款软件(本教程根据Matminer官网https://hackingmaterials.lbl.gov/matminer/#installing-matminer撰写)

简介

Matminer是用于材料数据挖掘的基于Python的开源软件。它可以从各种数据库获取材料属性数据,将复杂材料属性(如成分、晶体结构、能带结构)表征为与物理相关的特征量,训练机器学习模型,并分析数据挖掘的结果。

Matminer使用pandas数据格式。它还有一个进阶的自动化版本叫Automatminer,可以自动化的训练机器学习模型并得到结果。

Matminer 可以生产可交互的图像。下面的流程图生动展示了matminer的工作内容。Matminer 可以访问Citrine,Materials Project,MDF等数据库,获得材料结构、能带、力学性能等多种性质。这些性质可以被转换成数值化的、可视化的特征量,该特征量可以被用于训练机器学习模型。

安装

Matminer的安装过程非常简单,大家只要安装好Anaconda3 (Python 3.6) 后,在终端输入 pip install matminer 就行了。建议大家一并安装Pymatgen。

下面以天河超算为例,展示matminer的安装过程:

1
2
# 创建基于python 3.6 的虚拟环境,名字叫 py36
(base) [test@ln0%tianhe2 ~]$ conda create -n py36 python=3.6

安装好环境后,激活该环境,并安装pymatgen 和 matminer

1
2
3
4
5
6
7
8
9
# 激活环境用conda activate 命令
(base) [test@ln0%tianhe2 ~]$ conda activate py36

# 括号里的 base 就会变成 py36
(py36) [test@ln0%tianhe2 ~]$ conda install -c conda-forge pymatgen

# 下面这个命令为安装 matminer
(py36) [test@ln0%tianhe2 ~]$ pip install matminer

下面测试安装结果,输入下列命令,如果不出错,就是安装成功了。

1
2
3
4
5
6
7
(py36) [test@ln0%tianhe2 ~]$ python
Python 3.6.12 |Anaconda, Inc.| (default, Sep 8 2020, 23:10:56)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymatgen
>>> import matminer
>>>

现在可以尽情地去测试啦!后续教程将陆续分享。

大师兄在9月8日的文章中讲了如何用 Pymatgen 计算离子的电导率(该方法可以用来研究固态电解质等问题),本次,大师兄介绍一下如何使用 Pymatgen 可视化离子的迁移概率密度。

先举个例子,

在“Design principles for solid-state lithium superionic conductors”一文中(Wang et al., Nature Materials 2015, 14 , 1026–1031. ),作者用Ab Initio Molecular Dynamic (AIMD)计算了Li 离子在Li$\mathrm{_1}\mathrm{_2}$, Li$\mathrm{_7}$P$\mathrm{_3}$S$\mathrm{_1}$$\mathrm{_1}$,Li$\mathrm{_2}$S,和 Li$\mathrm{_4}$GeS$\mathrm{_4}$ 四种材料中的迁移概率密度(Probability Density),结果如下图所示:

  • 从图中可以看出Li离子在图a所示材料中主要沿c轴方向的通道迁移,而且由于这个通道连通得比较好,Li离子的迁移势垒会比较低(0.22~0.25 eV)。
  • Li离子在图b所示的材料的迁移路径形成了一个三维网格,而且由于这个概率密度比图b中的概率密度分布得更加均匀,Li离子的迁移势垒更低(0.18~0.19 eV)。
  • 图b所示的材料就完全不行了,因为Li离子的概率密度仅分布在特定的位点附近,说明离子不能有效地移动。
  • Li离子在图d所示材料中也存在迁移局域化的行为。
  • 作者总结说 “A general principle for the design of Li-ion conductors with low activation energy can be distilled from the above findings: all of the sites within the diffusion network should be energetically close to equivalent, with large channels connecting them.”

那么我们如何在自己的计算中画出这样的图呢?Pymatgen 举手说,它可以帮忙!

但是在开始之前,我们要安装Pymatgen的插件:Pymatgen-diffusionhttps://github.com/materialsvirtuallab/pymatgen-diffusion)。

安装 Pymatgen-diffusion

推荐大家使用最新版的Anaconda安装Pymatgen及其插件。点击上面的链接,进入官网后,点击最新版本链接,

我们可以下载.zip文件,

下载完成后,大家可以解压这个文件,得到 pymatgen-diffusion-2019.8.18文件夹。

我们把其中的 pymatgen_diffusion 文件夹放到 Anaconda的site-packages文件夹下,路径是 Windows 系统:……\Anaconda\Lib\site-packages;Linux系统:……/anaconda3/lib/pythonx.x/site-packages,就算安装好了。

接下来我们可以启动python,导入这个模块,如果不报错就没有问题了。

1
2
3
4
5
6
[test@ln0%tianhe2 li_sn_s]$ python
Python 3.8.3 (default, Jul 2 2020, 16:21:59)
[GCC 7.3.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymatgen_diffusion
>>>

学习用法

我们可以在其github网站上通过例子学习这个模块的用法。

点击打开 probbility_analysis.ipynb 文件。

其内容如下(有所删减):如果不想看的话可直接查看 开始作图 部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from pymatgen.analysis.diffusion_analyzer import DiffusionAnalyzer
from pymatgen_diffusion.aimd.pathway import ProbabilityDensityAnalysis
import json

#ProbabilityDensityAnalysis object
filename="/Users/iekhengchu/repos/pymatgen-diffusion/pymatgen_diffusion/aimd/tests/cNa3PS4_pda.json"

data = json.load(open("../pymatgen_diffusion/aimd/tests/cNa3PS4_pda.json", "r"))
diff_analyzer = DiffusionAnalyzer.from_dict(data) # 初始化DiffusionAnalyzer类

pda = ProbabilityDensityAnalysis.from_diffusion_analyzer(diff_analyzer, interval=0.5,
species=("Na", "Li")) #可以指定离子
#Save probability distribution to a CHGCAR-like file
pda.to_chgcar(filename="CHGCAR_new2.vasp") #保存概率密度文件

开始作图

代码(test.py)如下:

1
2
3
4
5
6
7
8
9
from pymatgen_diffusion.aimd.pathway import ProbabilityDensityAnalysis
from pymatgen.core.trajectory import Trajectory
from pymatgen.io.vasp.outputs import Xdatcar
from pymatgen.analysis.diffusion_analyzer import DiffusionAnalyzer

traj = Trajectory.from_file('XDATCAR')
diff = DiffusionAnalyzer.from_structures(traj,'Li',900,2,1)
pda = ProbabilityDensityAnalysis.from_diffusion_analyzer(diff,interval=0.5,species=("Li"))
pda.to_chgcar(filename="pda.vasp") #保存概率密度文件

此处理过程大概耗时8分钟,因机器而异。

在VESTA中可视化如下:

前面一节我们介绍了Ubuntu虚拟机的安装,今天就介绍一些Ubuntu常用软件的软装。大部分极其简单,敲个命令,输入下密码就能解决。少部分非常简单,设置下环境变量就可以解决。有些安装比较蛋疼的可以借助第三方平台比如Anaconda等来安装,也可以归纳到非常简单的行列中。所以,So easy!!!

1 第一件事:

打开终端(CONTROL + ALT + T),创建~/bin 文件夹。

1
qli@bigbrosci:~$ mkdir ~/bin

这个文件夹用于存储一些日常的脚本文件,可执行的小程序。 平时勤备份也不会占用太大空间。

2 命令安装程序

复制下面的sudo apt-get命令,输入到Terminal中,回车,输入密码即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sudo apt-get update
sudo apt-get install python3-pip
sudo apt-get install curl
curl https://bootstrap.pypa.io/get-pip.py --output get-pip.py
sudo python get-pip.py

sudo apt-get install vim
sudo apt-get install vim-gtk
sudo apt-get install sshfs
sudo apt-get install rename
sudo apt-get install xclip
sudo apt-get install git
sudo apt-get install gnuplot
sudo apt-get install xcrysden
sudo apt-get tree
sudo apt-get install inkscape

sudo apt-get install fish
sudo apt-get install tmux
sudo apt-get install texlive-full
sudo apt-get install kile

pip 用来安装python程序;

vim就不介绍了;

sshfs 用来把服务器挂载到本地电脑,方便传输数据;

rename 可以很方便批量命名;

xclip 可以把命令的输出复制到剪切板里面,方便鼠标粘贴;

git 用来从git-hub下载,上传,管理一些脚本程序等,

gnuplot 画图用的

xcrysden 可视化软件

tree 方便显示文件目录

inkscape 一款非常好用的做图软件

fish,tmux 装逼效果明显,没对象的重点关注下,好好学习一番,当然功能没的说,很强大。

Latex 写文章的可以使用最后两个命令安装。

其他的暂时也想不起来,如果你有推荐的,可以发邮件给我,后面再添上去。(lqcata@gmail.com)

3 安装Anaconda

它可以帮助你节省很多时间和精力去安装软件。下载后,按照下面命令,然后一路狂摁回车或者输入yes即可,官网也有安装教程,这里就不累赘了。通过Anaconda安装其他软件,可以参考前面的教程:https://www.bigbrosci.com/2020/09/19/A20/

1
2
3
4
5
6
7
8
9
10
qli@bigbrosci:~/Downloads$ ls
Anaconda3-2020.07-Linux-x86_64.sh p4vasp-0.3.30.tgz
qli@bigbrosci:~/Downloads$ bash Anaconda3-2020.07-Linux-x86_64.sh
Welcome to Anaconda3 2020.07

In order to continue the installation process, please review the license
agreement.
Please, press ENTER to continue

>>>

Anaconda安装的软件可以通过https://anaconda.org 来查询,都会列出来安装的命令,比如RDkit:

1
conda install -c rdkit rdkit

另一个需要注意的是,Anaconda安装后,最喜爱的p4vasp不能正常使用了。解决办法如下:

1) 找到p4v的目录,一般在/usr/bin/

2)将p4v中的python 全部改为python2

3) 将p4v.py 第一行中的python改为python2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(base) qli@bigbrosci:~$ p4v 
File "/usr/bin/p4v.py", line 9
print """You need to get version 2.0 (or later) of PyGTK for this to work. You
can get source code from http://www.pygtk.org """
^
SyntaxError: invalid syntax
(base) qli@bigbrosci:~$ which p4v
/usr/bin/p4v
(base) qli@bigbrosci:~$ sudo vi /usr/bin/p4v
[sudo] password for qli:
(base) qli@bigbrosci:~$ sudo vi /usr/bin/p4v.py
(base) qli@bigbrosci:~$ grep python /usr/bin/p4v
export PYTHONPATH=$PYTHONPATH:/usr/lib/python2.7/dist-packages
exec python2 /usr/bin/p4v.py "$@"
(base) qli@bigbrosci:~$ grep python /usr/bin/p4v.py
#!/usr/bin/env python2
4 其他可执行的程序

这里我们以VESTA为例,这种方法非常简单实用。

4.1) 下载解压VESTA程序包。(https://jp-minerals.org/vesta/en/) 直接通过官网下载即可,没必要去群里面求助,也没必要往群里面上传。

4.2) 本人习惯性地将其解压到/home/qli/Documents/VESTA-gtk3

4.3) 设置环境变量,将下面的export 两行复制到~/.bashrc 文件中, source.bashrc 文件,然后直接敲命令VESTA即可打开可视化界面。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
qli@bigbrosci:~/Documents/VESTA-gtk3$ ls
asfdc Library_License RIETAN.sh style VESTA-core
bvparm2016.cif libVESTA.so spgra.dat style.ini VESTA_def.ini
elements LICENSE spgro.dat template.ins VESTA-gui
elements.ini mspgr.dat STRUCTURE_TIDY tmp VESTA.ini
img PowderPlot STRUCTURE_TIDY.sh VESTA wyckoff.dat
qli@bigbrosci:~/Documents/VESTA-gtk3$ pwd
/home/qli/Documents/VESTA-gtk3
qli@bigbrosci:~/Documents/VESTA-gtk3$ cd
qli@bigbrosci:~$ vi .bashrc
export VESTA='/home/qli/Documents/VESTA-gtk3'
export PATH=$PATH:$VESTA
qli@bigbrosci:~$ source .bashrc
qli@bigbrosci:~$ VESTA

注意 上面VESTA的路径记得换成你自己电脑里面的。

5 Ubuntu的备份

本人喜欢瞎折腾,也经常会把电脑搞崩溃,备份就显得尤其重要。对于Ubuntu来说,前面我们在虚拟机的安装中提到存储Ubuntu系统的vdi文件,如果你有足够大的硬盘,可以定期将一个稳定版本的vdi保存起来,万一系统崩溃,删掉坏的,导入最新的备份即可。

如果没有用虚拟机,直接装的Ubuntu系统,或者双系统,可以尝试定期保存~/bin~/.bashrc 文件,本人之前就是这样做的(现在懒得折腾,系统不坏了),它们不怎么占空间,打包压缩下,邮件基本就可以上传。如果系统坏掉了,非得安装一个新的才能解决的时候,只需要重复本教程,下载一些常用的软件,以及用备份的~/bin~/.bashrc 文件还原一下设置即可。数据一般来说都直接存储在服务器中,相关备份不在本教程讨论范围之内。

当然还有其他的办法备份和恢复虚拟机,比如创建当前Ubuntu版本的iso文件,定期备份当前整个系统以便引导修复等等,精力有限,不再累赘。有兴趣的可以尝试。

6 打赏

如果感觉本文对你的相关研究有帮助,欢迎打赏,支持作者的热心付出。如果你也有自己擅长的操作等,热烈欢迎无私分享,可以通过QQ(122103465)或者邮件(lqcata@gmail.com)联系。

打赏码

为方便新手入坑,这里我们先介绍一下Ubuntu虚拟机的安装细节。VMWARE和VirtualBox是两个主要的选择,前者收费,后者免费。当然介绍免费的喽。 本节主要把安装的过程展示一遍,然后把需要注意的细节强调一下。安装虚拟机要量力而行,优先在台式机上安装虚拟机。如果你的电脑配置很普通的话,运行起来可能不会很流畅。

第一步: 准备工作

1 下载Ubuntu的安装包

https://ubuntu.com/download/desktop

2 下载Virtual Box,并安装

https://www.virtualbox.org/wiki/Downloads

3 下载Virtual Box的扩展包并安装(Extension Pack)

第二步:安装虚拟机(初始化)

2.1) 创建新的虚拟机

 9.38.59

2.2)设置虚拟机的名字,名字里面只要你输入Ubuntu字样,后面的Type和Version会自动更新,Machine Folder 最好选择一个硬盘比较大的盘。

2

2.3) 设置虚拟机的内存,本人喜欢设置为host的一半。

2_1

2.4)创建虚拟机,按照图片选择即可。

2_2

3

4

2.5) 设置虚拟机的vdi文件的目录,如果前面选择好了,这个采用默认即可。虚拟机的大小:如果使用Ubuntu比较频繁,安装的软件、数据处理等比较多的话,根据自己的情况酌情增加下。但是尽量别太小,到时候存储不够容易导致死机崩溃。

另外一个需要注意的是:Ubuntu的系统以及后面你安装的软件,下载的东西,写的脚本等都会存在这个vdi文件里面,如果你换了一台电脑,还想继续使用虚拟机,大可不用再重复本教程的操作,直接导入vdi即可(前面2.4步骤的第一个图片)。

5

2.6) 经过前面步骤,虚拟机初始化基本完成了(界面上可以看到),按照箭头,点Settings

2.7) System设置处理器的数目,同样也是host的一半。太小Ubuntu容易卡死,太大host容易卡死。

7

2.8)指定Ubuntu安装iso文件的目录,点Storage —> 光盘 Empty —> 右侧光盘图标

9

2.9) 在弹出的对话框,选择前面下载好的Ubuntu安装文件。

8

11

12

3 安装虚拟机 (Ubuntu的安装)

3.1) 点击下方图片的Start绿色图表,开始启动安装

11

3.2) 选择Install Ubuntu,后面的一路Continue

14

3.3) 设置键盘类型

15

3.4)按照下面的选择,Continue

16

17

3.5) 设置用户名,计算机名,以及密码。

18

3.6) Ubuntu 终于开始安装了,电脑配置好的别走开,配置不好的一边凉快等着去。(PS:配置不好不建议虚拟机,卡的你怀疑人生)

19

3.7) 安装完成后,会提示让你先移除安装的ISO文件,然后再点ENTER

3.8) 这里本人把安装包改了下名字,然后点ENTER

 10.04.45

3.9) Ubuntu 初步安装完成。

4 后续设置

前面只是顺利安装成功,但距离真正可以使用,还有几个设置需要继续操作下。

4.1)安装增强扩展包。(前面准备工作中,我们在host中安装了扩展包,Ubuntu里面也需要安装一下)

21_1

22

23

最明显的效果:

安装增强包前,不管你怎么拖放VirtualBox的界面,Ubuntu的界面总是那么一点。

24

安装后:Ubuntu的界面可以随意调整。(重启后才会更新效果)

25

4.2)设置虚拟机的网络。

Setting —> Network,然后按照下面的设置即可。

26

4.2) 设置剪切板共享:host复制的文字可以直接粘贴在Ubuntu里,反之亦然。(重启后生效)

27_1

4.3) 设置共享文件夹。

共享文件夹可以让你在host和Ubuntu之间及其方便地进行数据分享。

4.3.1 Virtual Box界面,点Settings —> Shared Folders,然后按照下面图中设置即可。

27

Folder Path为host的文件夹目录

Mount Point 为虚拟机中所挂在的位置。

点OK, 然后我们进入到虚拟机中,会发现一个类似硬盘的图标,名为:Shared,点一下,发现没有权限。

28

解决办法

在Ubuntu中,打开终端Terminal,输入命令。

1
2
3
4
5
qli@bigbro:~/Desktop$ sudo adduser $USER vboxsf 
[sudo] password for qli:
Adding user 'qli' to group 'vboxsf' ...
Adding user qli to group vboxsf
Done.

完事后,重启虚拟机。如果不能启动,显示USB相关的报错信息。取消USB的选项,再次启动即可。

28

到这里,虚拟机的安装,设置基本就完成了,剩下的就是在Ubuntu里面安装一些常用的软件程序了。这个会在后续教程里面简单介绍。

打赏

如果感觉本文对你的相关研究有帮助,欢迎打赏,支持作者的热心付出。如果你遇到相关的问题,或者也有自己擅长的操作,热烈欢迎无私分享,可以通过QQ(122103465)或者邮件(lqcata@gmail.com)联系。

P4vasp是一款基于Python2的,用于可视化,搭建结构的软件。由于Python2已经被时代所淘汰,p4vasp官网也不见任何的针对python3的更新改进,这个软件估计要凉,跟我们再见了。但Ubuntu20安装也不是很难,能撑到博士毕业应该问题不大。经过多次的测试,下面是p4vasp的安装过程,非常简单。

下载并解压

下载链接:http://www.p4vasp.at/#/download

这里本人把安装包解压缩到了~/Documents/ 目录下。

安装步骤-1
1
2
3
4
5
6
7
8
9
10
11
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ ls
BUGS install odpdom setenvironment.sh
ChangeLog install-local.sh p4v src
data install.sh p4vasp-0.3.30-1.spec test
diagnostic.py lib p4vasp.log uninstall.sh
doc LICENSE p4v.py utils
ext Makefile README vinfo.py
FAQS Makefile.MacOS README.MacOS vinfo.pyc
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ sudo apt-get install gcc make
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ sudo apt-get install make
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ sudo apt-get install python2-dev
安装步骤-2:

http://archive.ubuntu.com/ubuntu/pool/universe/p/pygtk/

从这个网站下载:python-gtk2 和 python-glade2的deb文件,下载后,双击即可安装。

注意:先安装gtk2,再安装glade2。

安装步骤-3:
1
2
3
4
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ sudo apt-get install libxft-dev
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ sudo apt-get install libglfw3-dev libgl1-mesa-dev libglu1-mesa-dev
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ bash install/install-ubuntu-dependencies.sh
qli@bigbrosci:~/Documents/p4vasp-0.3.30$ bash install.sh
注意:

bash install/install-ubuntu-dependencies.sh 这一步最后可能会出python-epydoc的报错,可以忽略。

反馈:

上面的命令是Ubuntu20里面安装用的,如果安装过程出现问题,或者有更好的安装方法,欢迎交流讨论:

QQ:122103465

E-mail:lqcata@gmail.com

至于其他的Linux系统,本人没有测试,如果你有比较好的安装方法,也欢迎分享讨论。

打赏

如果感觉本文对你的相关研究有帮助,欢迎打赏,支持作者的热心付出。如果你也有自己的骚操作,热烈欢迎无私分享,可以通过QQ(122103465)或者邮件(lqcata@gmail.com)联系。

今天我们介绍ASE的另一个骚操作:结合Openbabel自动搭分子结构。与其说是ASE的骚操作,不如把这个骚字放在Openbabel头上。Openbabel是一款功能极其强大的结构转化工具。如果你在用它,我就不在这里啰嗦了。如果你没听过,可以通过这个链接来初步了解一下。(http://openbabel.org/wiki/Main_Page)

鉴于Openbabel的安装比较蛋疼,先送一波福利(Mac,Linux用户)。下面是本人通过Anaconda(已经路转粉)创建虚拟环境,并且安装这些软件的一些命令。通过它们可以让你安全顺利,麻溜滴地安装Openbabel, RDkit, Ase,和pymatgen。

1
2
3
4
5
6
conda create --name qrobot
conda activate qrobot
conda install -c conda-forge openbabel
conda install -c conda-forge rdkit
conda install -c conda-forge ase
conda install --channel conda-forge pymatgen

RDkit也是一款功能及其强大地软件,尤其是化学信息学,生物化学相关的领域。如果不了解,点击这个官网学习。(https://www.rdkit.org/)顺便吐槽一下,百度里面你搜索一堆RDkit的使用,大部分都是把官网例子复制过来,然后贴个二维码要钱的。交不交智商税决定权在你手上,如果手痒,请跳到文末最后,把钱打赏给我。

废话不多说,转到我们今天的主题: SMILES to XYZ。又是一个新知识,什么是SMILES?

SMILES是simplified molecular-input line-entry system 的缩写,旨在用ASCII字符串来标识,描述分子的结构。如果你不了解,可以通过下面两个链接初步了解一下:

https://en.wikipedia.org/wiki/Simplified_molecular-input_line-entry_system

https://www.daylight.com/dayhtml/doc/theory/theory.smiles.html

通过SMILES我们可以将一个分子用字符串来标识出来,比如我们后面练习中的:

乙醇(CCO),甲烷(C),甲基([CH3]), 苯(c1ccccc1)。

所以,在操作之前,你需要知道所搭结构的SMILES字符串。通过上面两个链接,耐心钻研一下,应该不到1天就可以搞定大部分的分子。将SMILES转化为3D的结构,可以通过Openbabel,也可以通过RDkit。今天我们就介绍前者。下面是脚本内容(smiles_to_xyz.py)以及使用的效果。最后,我们再详细解释这个脚本是怎么工作的。

脚本内容

下载链接:https://github.com/BigBroSci-LVTHW/LVTHW/tree/master/source/_posts/A20

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env python3 
# -*- coding: utf-8 -*-
"""
convert SMILES to xyz
"""
import sys
from openbabel import pybel
import numpy as np
import ase
import ase.io
from ase import Atoms
from ase.constraints import FixAtoms

smiles, out_name = sys.argv[1:3]

'''
Introduction to SMILES:
https://en.wikipedia.org/wiki/Simplified_molecular-input_line-entry_system
https://www.daylight.com/dayhtml/doc/theory/theory.smiles.html
'''

## Use openbabel to convert SMILES to xyz.
mol = pybel.readstring("smi", smiles)
mol.make3D(forcefield='mmff94', steps=100)
# mol.write("xyz", filename=out_name+'_pybel.xyz', overwrite=True)

# USE ase to make POSCAR
''' https://wiki.fysik.dtu.dk/ase/ase/atoms.html'''
geo = Atoms()
geo.set_cell(np.array([[16.0, 0.0, 0.0],[0.0, 17.0, 0.0],[0.0, 0.0, 18.0]]))
geo.set_pbc((True,True,True))
for atom in mol:
atom_type = atom.atomicnum
atom_position = np.array([float(i) for i in atom.coords])
geo.append(atom_type)
geo.positions[-1] = atom_position
geo.center()

'''https://wiki.fysik.dtu.dk/ase/ase/constraints.html'''
c = FixAtoms(indices=[atom.index for atom in geo if atom.symbol == 'XX'])
geo.set_constraint(c)

ase.io.write(out_name + '_ase.xyz', geo, format='xyz')
ase.io.write(out_name + '_POSCAR', geo, format='vasp', vasp5='True')

脚本运行
1
2
3
4
5
6
 (qrobot) qli@MacBook-Pro test_openbabel % python3 smiles_to_xyz.py '[CH3]' Methyl
(qrobot) qli@MacBook-Pro test_openbabel % python3 smiles_to_xyz.py 'CCO' ET
(qrobot) qli@MacBook-Pro test_openbabel % python3 smiles_to_xyz.py 'C' Methane
(qrobot) qli@MacBook-Pro test_openbabel % python3 smiles_to_xyz.py 'c1ccccc1' BZ
(qrobot) qli@MacBook-Pro test_openbabel % ls
BZ_POSCAR BZ_ase.xyz ET_POSCAR ET_ase.xyz Methane_POSCAR Methane_ase.xyz Methyl_POSCAR Methyl_ase.xyz smiles_to_xyz.py
结果展示

ET

Methane

Methyl

内容详解
  1. Openbabel部分其实就三行代码,非常简单。
1
2
3
1 mol = pybel.readstring("smi", smiles)
2 mol.make3D(forcefield='mmff94', steps=100)
3 # mol.write("xyz", filename=out_name+'_pybel.xyz', overwrite=True)

1) 读取SMILES,并创建一个mol的对象(object)。

2) make3D 通过MMFF94力场对生成的3D结构优化了100步。

3) 保存结构,这里我把它注释掉了,因为后面我们要通过ASE来生成xyz和POSCAR。

  1. ASE部分,代码多一些,可能本人水平有限吧。不管怎么样,这里主要告诉大家的一点就是:我们可以将Openbabel和ASE无缝连接起来。同样,你也可以把ASE与你自己写的一些东西关联,这样就可以调用ASE的功能来快速实现一些小目标了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1 geo = Atoms()
2 geo.set_cell(np.array([[16.0, 0.0, 0.0],[0.0, 17.0, 0.0],[0.0, 0.0, 18.0]]))
3 geo.set_pbc((True,True,True))
4 for atom in mol:
5 atom_type = atom.atomicnum
6 atom_position = np.array([float(i) for i in atom.coords])
7 geo.append(atom_type)
8 geo.positions[-1] = atom_position
9 geo.center()

'''https://wiki.fysik.dtu.dk/ase/ase/constraints.html'''
10 c = FixAtoms(indices=[atom.index for atom in geo if atom.symbol == 'XX'])
11 geo.set_constraint(c)

12 ase.io.write(out_name + '_ase.xyz', geo, format='xyz')
13 ase.io.write(out_name + '_POSCAR', geo, format='vasp', vasp5='True')

1)创建一个ASE的Atom空对象;

2)设置放分子的格子大小,这里我们用的是16x17x18 $\AA^3$的。如果嫌小,自己改大一下就可以了。

3)设置周期性;

4-8)将Openbabelmol对象中的原子添加到ASEAtom对象里面。

9)将分子放到格子的中心。

10-11)固定或者放开原子,这里我们打算放开所有的原子,所以用到了一个XX 。如果原子符号是XX,那么就固定住。其实世界上根本就没有XX原子,因此所有的原子就会被放开了。

12-13) 保存xyz和VASP的POSCAR。

小结

通过SMILES来搭建结构非常方便,当然也可以通过数据库下载,可视化程序例如GaussianView等自己手动搭建。

值得注意的是,不管通过什么方式搭建的结构,提交任务之前,都要尽可能保证结构的合理性。所以不要搭建完结构就立刻提交任务,先认真检查一遍,没有任何问题之后再提交。

打赏

如果感觉本文对你的相关研究有帮助,欢迎打赏,支持作者的热心付出。如果你也有自己的骚操作,热烈欢迎无私分享,可以通过QQ(122103465)或者邮件(lqcata@gmail.com)联系。