0%

CONTCAROSZICAR我们已经大体了解了一下,这一节我们我们学习VASP的另一个极其重要的输出文件:OUTCAR。前面我们介绍到OSZICAR中包含了体系结构优化,电子结构迭代收敛的简单信息。OUTCAR中也包含这些信息,而且比OSZICAR的内容更加详细。此外,计算的参数设置(INCAR中有的,以及默认的),K点的设置,赝势的基本信息,VASP的版本,体系的几何结构以及电子性质相关的内容,计算的时间等,也都包含在OUTCAR中。所以说,OUTCAR是关于我们当前计算的一个非常全面的,多方位的信息汇总。

信息太多,VASP官网也没有对OUTCAR一个很详细地描述,大部分都是穿插在INCAR的计算参数中介绍的。这是因为(本人自己瞎猜的):

  • VASP可以计算的性质很多,每一个特定的任务都有其对应的输出内容,这就导致了OUTCAR的复杂多样性,比如说优化结构、频率、声子谱,能带、DOS等计算等,这些都会有特定的输出,需要用户根据自己的计算内容去学习;
  • 另外一个原因就是里面的条目太多了,每一项单独解释都需要花费大量的时间。

信息多,就会容易让人眼花缭乱,不知所措。本节,我们就理一理思路,揭开OUTCAR神秘的面纱,让大家心里不至于那么恐慌。之前我们说过,VASP有很多输出文件,日常用的也就那么几个,有些估计等你文章发表了都不一定能用上。这也同样适用于OUTCAR中的信息,虽然多,但大部分基本用不到。

首先要告诉大家的是,VASP各个输出部分之间用很长的横杠分割(——————————-),当你看到横杠的时候,就知道要进入结果的下一个部分内容了。举个OUTCAR开头的例子。

1
2
3
4
5
6
7
8
9
 vasp.5.4.4.18Apr17-6-g9f103f2a35 (build Sep 22 2017 10:53:27) complex

executed on LinuxIFC date 2018.11.12 03:58:57
running on 24 total cores
distrk: each k-point on 24 cores, 1 groups
distr: one band on NCORES_PER_BAND= 1 cores, 24 groups


--------------------------------------------------------------------------------------------------------

VASP的版本信息,在多少个核上运行。所以,如果你不知道,自己的任务是VASP哪个版本计算的,也不知道如何去VASP的安装目录查找版本信息,可以运行一下,然后在OUTCAR的开头去找。可以看到,后跟着一堆-,说明要进入下一部分内容(计算体系,参数)的描述了。分别是:POTCARPOSCARKPOINTS,以及INCAR的信息。

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
 -----------------------------------------------------------------------------
| |
| W W AA RRRRR N N II N N GGGG !!! |
| W W A A R R NN N II NN N G G !!! |
| W W A A R R N N N II N N N G !!! |
| W WW W AAAAAA RRRRR N N N II N N N G GGG ! |
| WW WW A A R R N NN II N NN G G |
| W W A A R R N N II N N GGGG !!! |
| |
| For optimal performance we recommend to set |
| NCORE= 4 - approx SQRT( number of cores) |
| NCORE specifies how many cores store one orbital (NPAR=cpu/NCORE). |
| This setting can greatly improve the performance of VASP for DFT. |
| The default, NCORE=1 might be grossly inefficient |
| on modern multi-core architectures or massively parallel machines. |
| Do your own testing !!!! |
| Unfortunately you need to use the default for GW and RPA calculations. |
| (for HF NCORE is supported but not extensively tested yet) |
| |
-----------------------------------------------------------------------------

POTCAR: PAW_PBE O 08Apr2002
VRHFIN =O: s2p4
LEXCH = PE
EATOM = 432.3788 eV, 31.7789 Ry

TITEL = PAW_PBE O 08Apr2002
LULTRA = F use ultrasoft PP ?
IUNSCR = 1 unscreen: 0-lin 1-nonlin 2-no
RPACOR = 1.200 partial core radius
POMASS = 16.000; ZVAL = 6.000 mass and valenz
RCORE = 1.520 outmost cutoff radius
RWIGS = 1.550; RWIGS = 0.820 wigner-seitz radius (au A)
ENMAX = 400.000; ENMIN = 300.000 eV
ICORE = 2 local potential
LCOR = T correct aug charges
LPAW = T paw PP
EAUG = 605.392
DEXC = 0.000
RMAX = 1.553 core radius for proj-oper
RAUG = 1.300 factor for augmentation sphere
RDEP = 1.550 radius for radial grids
RDEPT = 1.329 core radius for aug-charge

基本上每次运行的时候,(即使你的输入是正确的),VASP都会输出一个大大的WARNING来吓唬你,不用担心,无视即可。但如果你的计算失败了,这个警告信息或许(个人感觉基本没用)对你排查错误可能会有所帮助。 WARNING下面是POTCAR的基本信息,如果你想通过OUTCAR查看POTCAR中的元素时,可以使用下面的命令:

1
2
3
4
grep POTCAR OUTCAR
grep TIT OUTCAR
grep ENMAX OUTCAR
grep ZVAL OUTCAR #

ZVAL是该POTCAR中对应元素的价电子,这里氧原子含有6个外层价电子。你可以自行对比下POTCAR中的内容。再往下,就是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
--------------------------------------------------------------------------------------------------------


ion position nearest neighbor table
1 0.000 0.000 0.000-

LATTYP: Found a simple cubic cell.
ALAT = 8.0000000000

Lattice vectors:

A1 = ( 8.0000000000, 0.0000000000, 0.0000000000)
A2 = ( 0.0000000000, 8.0000000000, 0.0000000000)
A3 = ( 0.0000000000, 0.0000000000, 8.0000000000)


Analysis of symmetry for initial positions (statically):
=====================================================================
Subroutine PRICEL returns:
Original cell was already a primitive cell.


Routine SETGRP: Setting up the symmetry group for a
simple cubic supercell.


Subroutine GETGRP returns: Found 48 space group operations
(whereof 48 operations were pure point group operations)
out of a pool of 48 trial point group operations.


The static configuration has the point symmetry O_h .


Analysis of symmetry for dynamics (positions and initial velocities):

体系的对称性以及点群操作相关的信息,在这里我们的体系是立方体,为O_h的点群,有48个对称操作。群论的知识大师兄早已原封不动地还给老师了,在这里就不再详细介绍了…

K点信息:想查看K点个数:grep irreducible OUTCAR 或者 grep irre OUTCAR

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 Subroutine IBZKPT returns following result:
===========================================

Found 1 irreducible k-points:

Following reciprocal coordinates:
Coordinates Weight
0.000000 0.000000 0.000000 1.000000

Following cartesian coordinates:
Coordinates Weight
0.000000 0.000000 0.000000 1.000000



--------------------------------------------------------------------------------------------------------

下一部分就是INCAR的参数:

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
SYSTEM =  O atom
POSCAR = O atom in a box

Startparameter for this run:
NWRITE = 2 write-flag & timer
PREC = normal normal or accurate (medium, high low for compatibility)
ISTART = 0 job : 0-new 1-cont 2-samecut
ICHARG = 2 charge: 1-file 2-atom 10-const
ISPIN = 1 spin polarized calculation?
LNONCOLLINEAR = F non collinear calculations
LSORBIT = F spin-orbit coupling
INIWAV = 1 electr: 0-lowe 1-rand 2-diag
LASPH = F aspherical Exc in radial PAW
METAGGA= F non-selfconsistent MetaGGA calc.

Electronic Relaxation 1
ENCUT = 400.0 eV 29.40 Ry 5.42 a.u. 13.05 13.05 13.05*2*pi/ulx,y,z
ENINI = 400.0 initial cutoff
ENAUG = 605.4 eV augmentation charge cutoff
NELM = 60; NELMIN= 2; NELMDL= -5 # of ELM steps
EDIFF = 0.1E-03 stopping-criterion for ELM
LREAL = F real-space projection
NLSPLINE = F spline interpolate recip. space projectors
LCOMPAT= F compatible to vasp.4.4
GGA_COMPAT = T GGA compatible to vasp.4.4-vasp.4.6
LMAXPAW = -100 max onsite density
LMAXMIX = 2 max onsite mixed and CHGCAR
VOSKOWN= 0 Vosko Wilk Nusair interpolation
ROPT = 0.00000

计算参数详情(默认的参数值以及代表的意义也列出来了,这个地方大家仔细看下, 一些不常见的参数,VASP会自动采用默认值。上面给我们的启示就是:不懂就不要写,默认就可,很多默认的参数也没必要在INCAR里面再额外写一遍!强调一下,不知道的参数,不要瞎往INCAR里面放!新手的话经常会加一些乱七八糟的参数,导致计算错误。)

在统计完任务的基本输入后,VASP会总结一下本计算的文字描述,任务类型,体系大小,K点数目,计算所需的内存等信息。然后开始进入正式的计算部分:

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
--------------------------------------------------------------------------------------------------------


Static calculation
charge density and potential will be updated during run
non-spin polarized calculation
Variant of blocked Davidson
Davidson routine will perform the subspace rotation
perform sub-space diagonalisation
after iterative eigenvector-optimisation
modified Broyden-mixing scheme, WC = 100.0
initial mixing is a Kerker type mixing with AMIX = 0.4000 and BMIX = 1.0000
Hartree-type preconditioning will be used
using additional bands 21
reciprocal scheme for non local part
use partial core corrections
calculate Harris-corrections to forces
(improved forces if not selfconsistent)
use gradient corrections
use of overlap-Matrix (Vanderbilt PP)
Gauss-broadening in eV SIGMA = 0.01


--------------------------------------------------------------------------------------------------------


energy-cutoff : 400.00
volume of cell : 512.00
direct lattice vectors reciprocal lattice vectors
8.000000000 0.000000000 0.000000000 0.125000000 0.000000000 0.000000000
0.000000000 8.000000000 0.000000000 0.000000000 0.125000000 0.000000000
0.000000000 0.000000000 8.000000000 0.000000000 0.000000000 0.125000000

length of vectors
8.000000000 8.000000000 8.000000000 0.125000000 0.125000000 0.125000000



k-points in units of 2pi/SCALE and weight: K-POINTS
0.00000000 0.00000000 0.00000000 1.000

k-points in reciprocal lattice and weights: K-POINTS
0.00000000 0.00000000 0.00000000 1.000

position of ions in fractional coordinates (direct lattice)
0.00000000 0.00000000 0.00000000

.
.
.

total amount of memory used by VASP MPI-rank0 35846. kBytes
=======================================================================

base : 30000. kBytes
nonl-proj : 746. kBytes
fftplans : 1114. kBytes
grid : 3834. kBytes
one-center: 3. kBytes
wavefun : 149. kBytes

对于O原子的计算来说,就是一个离子步内,电子步的迭代。这里我们只展示一个电子步的迭代信息即可,剩下的格式是一样的。大家在自己查看的时候注意能量在不同迭代步数中的变化。

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
--------------------------------------- Iteration      1(   1)  ---------------------------------------


POTLOK: cpu time 0.0240: real time 0.0324
SETDIJ: cpu time 0.0030: real time 0.0040
EDDAV: cpu time 0.0320: real time 0.0397
DOS: cpu time 0.0020: real time 0.0020
--------------------------------------------
LOOP: cpu time 0.0610: real time 0.0781

eigenvalue-minimisations : 48
total energy-change (2. order) : 0.3249700E+02 (-0.1026971E+03)
number of electron 6.0000000 magnetization
augmentation part 6.0000000 magnetization

Free energy of the ion-electron system (eV)
---------------------------------------------------
alpha Z PSCENC = 0.27139542
Ewald energy TEWEN = -91.92708002
-Hartree energ DENC = -281.84385743
-exchange EXHF = 0.00000000
-V(xc)+E(xc) XCENC = 26.06853627
PAW double counting = 346.54947689 -348.34814756
entropy T*S EENTRO = -0.00000000
eigenvalues EBANDS = -50.53652309
atomic energy EATOM = 432.26319604
Solvation Ediel_sol = 0.00000000
---------------------------------------------------
free energy TOTEN = 32.49699652 eV

energy without entropy = 32.49699652 energy(sigma->0) = 32.49699652


--------------------------------------------------------------------------------------------------------

每一电子步完成后,输出结果同时在OSZICAR中更新一行。

其中各项的具体含义:

alpha Z and the Ewald energy define the electrostatic interaction of the ions in a compensating electron gas. The alpha Z component deals with the divergent parts (G=0). The following parts are the Hartree and exchange correlation energy as defined in the Kohn-Sham Hamiltonian. The entropy part stems from the smearing (using the free energy as variational parameter, electronic entropy), EBANDS from Kohn-Sham eigenvalues, and EATOM is the reference energy for the potential (which is defined in the POTCAR file).

(摘自:https://cms.mpi.univie.ac.at/vasp-forum/viewtopic.php?t=273)

迭代结束,输出主要的结果:费米能级以及能带信息。

Band 1 对应的是2个 2s 电子,

Band 2-4 对应的是4个2p电子。固体物理中,费米能级对应的是最高电子占据轨道的能量,也就是HOMO,大家可以对比下band 2-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
--------------------------------------------------------------------------------------------------------




average (electrostatic) potential at core
the test charge radii are 0.7215
(the norm of the test charge is 1.0000)
1 -83.5438



E-fermi : -8.9011 XC(G=0): -0.8049 alpha+bet : -0.1463


k-point 1 : 0.0000 0.0000 0.0000
band No. band energies occupation
1 -23.8440 2.00000
2 -8.9041 1.33333
3 -8.9041 1.33333
4 -8.9041 1.33333
5 -0.4682 0.00000
6 1.8628 0.00000
7 1.8628 0.00000
8 1.8628 0.00000
9 1.9954 0.00000
10 2.0322 0.00000
11 2.0322 0.00000
12 4.0245 0.00000
13 4.0245 0.00000
14 4.0245 0.00000
15 4.1983 0.00000
16 4.1983 0.00000
17 4.1983 0.00000
18 4.4039 0.00000
19 4.4039 0.00000
20 4.4555 0.00000
21 4.4555 0.00000
22 4.4555 0.00000
23 4.7550 0.00000
24 6.4902 0.00000


--------------------------------------------------------------------------------------------------------

费米能级的获取:grep E-fermi OUTCAR

各个方向力的大小,体系的坐标(和CONTCAR是一样的),以及体系的能量。下面第一行的意思是达到了我们设置的收敛标准,迭代停止了。(后面我们会详细介绍收敛相关的事项,大家先有个印象。)

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
------------------------ aborting loop because EDIFF is reached ----------------------------------------
.
.
.

FORCE on cell =-STRESS in cart. coord. units (eV):
Direction XX YY ZZ XY YZ ZX
--------------------------------------------------------------------------------------
Alpha Z 0.27140 0.27140 0.27140
Ewald -30.64236 -30.64236 -30.64236 0.00000 0.00000 0.00000
Hartree 93.90340 93.90340 93.90340 -0.00000 -0.00000 -0.00000
E(xc) -27.94710 -27.94710 -27.94710 0.00000 0.00000 0.00000
Local -147.84573 -147.84573 -147.84573 0.00000 -0.00000 0.00000
n-local -20.54959 -20.54959 -20.54959 -0.00000 -0.00000 -0.00000
augment 5.55385 5.55385 5.55385 -0.00000 0.00000 -0.00000
Kinetic 126.51138 126.51138 126.51138 0.00000 0.00000 0.00000
Fock 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
-------------------------------------------------------------------------------------
Total -0.74475 -0.74475 -0.74475 0.00000 -0.00000 0.00000
in kB -2.33051 -2.33051 -2.33051 0.00000 -0.00000 0.00000
external pressure = -2.33 kB Pullay stress = 0.00 kB

VOLUME and BASIS-vectors are now :
-----------------------------------------------------------------------------
energy-cutoff : 400.00
volume of cell : 512.00
direct lattice vectors reciprocal lattice vectors
8.000000000 0.000000000 0.000000000 0.125000000 0.000000000 0.000000000
0.000000000 8.000000000 0.000000000 0.000000000 0.125000000 0.000000000
0.000000000 0.000000000 8.000000000 0.000000000 0.000000000 0.125000000

length of vectors
8.000000000 8.000000000 8.000000000 0.125000000 0.125000000 0.125000000


.
.
.


FREE ENERGIE OF THE ION-ELECTRON SYSTEM (eV)
---------------------------------------------------
free energy TOTEN = -0.02147084 eV

energy without entropy= -0.00604461 energy(sigma->0) = -0.01375772

上面的能能量有好几个,很多人不知道该用哪一个。前面我们讲解OSZICAR的时候,告诉大家要使用E0后面的那个数值,那么在OUTCAR中与E0对应(相同)的是energy(sigma->0) = 后面的那个。所以,在今后的学习中,我们不要再提问使用OUTCAR中的哪个能量的问题了。提取能量的命令:

1
2
3
grep  without OUTCAR | tail -n 1
grep ' without' OUTCAR | tail -n 1 # 本人常用的是这个
grep sigma OUTCAR | tail -n 1

之所以用tail -n 1是为了保证我们取的是最后一步的能量。O原子肯定就一步,但以后优化结构的时候,就有很多步了。这里有一点需要注意的是:前面出现了一个entropy,也就是熵。但这个Entropy是采用ISMEAR方法而导致的,与物理化学中的熵这个概念不一样,如果你要计算熵,则需要通过计算频率,然后通过公式求解。看不懂不要紧:记住这里的Entropy不是物化书中的就OK。

再往下是实际计算的内存和时间等信息,看到下面,说明计算正常结束了。

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
--------------------------------------------------------------------------------------------------------


writing wavefunctions
LOOP+: cpu time 2.0037: real time 2.1098
4ORBIT: cpu time 0.0000: real time 0.0000

total amount of memory used by VASP MPI-rank0 35846. kBytes
=======================================================================

base : 30000. kBytes
nonl-proj : 746. kBytes
fftplans : 1114. kBytes
grid : 3834. kBytes
one-center: 3. kBytes
wavefun : 149. kBytes



General timing and accounting informations for this job:
========================================================

Total CPU time used (sec): 5.492
User time (sec): 1.991
System time (sec): 3.501
Elapsed time (sec): 5.931

Maximum memory used (kb): 104300.
Average memory used (kb): 0.

Minor page faults: 8571
Major page faults: 0
Voluntary context switches: 3090

分析完前面的内容,大家会发现:具体到里面各项的含义以及各个细节上,还有很多值得讨论的地方,比如群论,薛定谔方程求解过程,POTCAR的相关信息等。对于新手来说,看完本节,能大体浏览下来,知道各个部分包含什么内容就很不错了。

总结

本练习中,带领大家粗略浏览了一遍OUTCAR各部分的信息。大家在浏览的时候时刻要思考:

  • 这部分包含的什么内容,具有什么物理或者化学意义?
  • 怎么用grep 关键词获取有用的信息等。
  • 怎么获取体系的能量;知道用众多能量中的哪一个。
  • 如何将OUTCAR的内容与计算的输入和输出文件关联起来。
  • 由于计算内容的多样性,对于OUTCAR的详细解释,需要很多的时间和精力去完成补充。一次性解释清楚是不可能的事情,所以在后续的计算过程中,我们还会结合具体的例子进行讲解。

一般来说,等你计算上手之后,OUTCAR里面的很多内容,可能等课题结束或者毕业了,都不会用到。更进一步说,你可能都不需要打开OUTCAR了。因此,完全不用担心里面的很多内容不理解。但,这不是我们偷懒的理由,如果你想把VASP学好,学精,这些都需要自己下功夫去琢磨,理解。

上一节,我们在天河II号顺利提交了VASP的计算,并看到了一堆的输出文件。我们就从简单的开始,一步一步给大家介绍VASP的输出文件,以及里面的细节部分。由于大家还处在一个刚刚接触VASP的阶段。我们先根据目前的计算,挑容易的,重要的进行介绍。最简单的非CONTCAR莫属了。

CONTCARPOSCAR的区别

在VASP的输入文件中,我们用POSCAR来存储模型的结构信息。当我们使用VASP优化完成之后,就会得到一个新的结构,而CONTCAR就是用来存储新结构的文件。当然啦,我们这里只有一个O原子,不存在优化这一说法,但VASP只要算上了,就会有CONTCAR出现,不优化的的结果就是:CONTCARPOSCAR的结构是一模一样的。但CONTCARPOSCAR里面的内容可以一样,也可以不一样。在这里,大师兄把自己的个人经验都写在里面,新手看不懂的话不要紧,先记住这里有CONTCAR的相关注意信息,以后用的时候过来直接看即可。如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ cat -n POSCAR 
1 O atom in a box
2 1.0
3 8.0 0.0 0.0
4 0.0 8.0 0.0
5 0.0 0.0 8.0
6 O
7 1
8 Cartesian
9 0 0 0 #
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ cat -n CONTCAR
1 O atom in a box
2 1.00000000000000
3 8.0000000000000000 0.0000000000000000 0.0000000000000000
4 0.0000000000000000 8.0000000000000000 0.0000000000000000
5 0.0000000000000000 0.0000000000000000 8.0000000000000000
6 O
7 1
8 Direct
9 0.0000000000000000 0.0000000000000000 0.0000000000000000
10
11 0.00000000E+00 0.00000000E+00 0.00000000E+00

对于当前的这个例子来说,主要的不同点在于:

  • 坐标的小数点位数。对比POSCARCONTCAR中:第1-5、9行的内容。
  • 缩进部分:
    • POSCAR中,我们每一行都是顶格写的。
    • CONTCAR中,从第二行开始,每一行的开头部分都是以空格开始的。此时,就必须要给大家强调一点:CONTCAR中开头的是空格,不是tab。第3-5行,你别看前面都空了那么多,都是一个个的空格,而不是tab。
    • 这个一定要死死记住:CONTCAR或者POSCAR中,每一行中只有空格可以用来分割不同的内容或者开头,绝对不要用tab。否则你任务出错,花很多天都不一定能检查出来这个原因。
  • 体系的坐标系也发生了变化: 第8行。POSCAR中,我们使用的是笛卡尔坐标系,也就是Cartesian或者任何以大写的C,小写的c开头。但CONTCAR中则变成了分数坐标系,也就是Direct。 这个给我们的启示就是:
    • 如果想把体系从Cartesian转化为Direct,我们可以算一个单点。(单点的意思不明白,不要紧,后面我们会介绍)
    • 我们的POSCAR可以使用Cartesian, 也可以使用Direct,这个看大家自己的习惯。本人喜欢用Cartesian,看起来更加直观一些。
    • 由于我们的O原子在坐标系的原点(0,0,0)的位置,所以DirectCartesian看不出来区别。
  • CONTCAR中,还多了一行内容(第11行),这一行主要描述的是体系中原子在xyz三个方向移动相关的信息。因为我们体系只有一个原子,所以也就只多了一行。
    • 以后当你在优化结构的时候,体系中有多少原子,就会多出多少行出来,但全部都是0。
    • 如果你跑的是分子动力学,那么这些行中就不是0了,代表的是分子移动的速度
    • 如果你用dimer方法算过渡态的时候,那么这些行中是与过渡态结构相关的振动方式。
    • 总结下:如果你不跑分子动力学,不用dimer方法算过渡态, 那么多出来的这些行都会是0,是可有可无的,对计算无任何影响。看着不爽,直接删掉即可。

CONTCAR 的作用

这里新手暂时不要求,大师兄可能会将其移到其他的章节,只需要记住本书里面有CONTCAR的用法,以后再找下即可。通过上面的学习,我们知道,CONTCARPOSCAR一样,就是用来保存优化结构的。可能有些地方与我们自己手动写的POSCAR有些不同(比如每行开始的空格),但只要你不用tab,这都是无关痛痒的事情。下面我们介绍一下CONTCAR的2个用法。

1) 计算完成之后,CONTCAR中是最后一步优化的结果。我们可以通过一些可视化的软件打开CONTCAR,检查计算的对不对。这个也是大家以后做计算最基本的工作。

2) 如果你的计算半路由于各种各样的原因给停掉了,服务器不稳定,断电,自己手欠误删任务或者将计算的文件夹位置移动了,都会导致计算失败。这个时候,我们就需要续算CONTCAR的作用就展示出来了。续算又分为三种情况:

A)第一个离子步没有算完,任务就挂掉了。这种情况,CONTCAR是不会更新的,我们再次用原来的输入文件提交一次就行了。

B)我们的计算已经完成了大于或者等于1的离子步,但小于INCAR中设置的NSW的数值。这个时候CONTCAR的内容已经是离任务死掉最近的结构了。我们只需要将其复制成POSCAR,然后再次提交任务即可。具体操作如下:

1
2
3
mv POSCAR POSCAR_0
mv OUTCAR OUTCAR_0
cp CONTCAR POSCAR

师兄,你不是说只把CONTCAR复制成POSCAR就可以了吗? 为什么前面还多了一个mv的命令?

在这里,大师兄要教给你做计算一个超级重要的原则:时时刻刻都要努力提高或者保证计算可重复性。

因为我们的任务是从之前的POSCAR(标记为A)开始的,中途断掉了,直接把CONTCAR(标记为C_A)复制成POSCAR(标记为B)的话,我们就会损失掉前面优化的过程。相当于我们直接搭建了这个B这个结构进行优化计算。而实际上,我们后面的计算的性质是续算,而不是从头直接计算。虽然结果大部分情况都是一样的。所以在将CONTCAR复制成POSCAR计算之前,我们要尽可能把任务停掉前的计算过程保存记录下来。这就类似于写实验记录本,我们要从开始搭建设备到开展反应一系列的详细信息都记录在上面。而不能从半路直接跳着写。这也是很多人在做计算的时候,任务死掉后续算所忽略的一个很严肃的问题。

下面是大师兄本人在续算的时候所用到的一个保存前面计算的小脚本:

1
2
3
4
5
6
7
#!/usr/bin/env bash

mv POSCAR POSCAR-$1
mv OUTCAR OUTCAR-$1
mv OSZICAR OSZICAR-$1
mv vasprun.xml vasprun.xml-$1
mv CONTCAR POSCAR

通过这个脚本,我们扩展到第三种情况。

C)我们的计算达到的INCAR中所设置的NSW的数值。比如设置的NSW = 1000,实际上跑了1000步,任务停下来了,也就是所谓的结构优化没有收敛。这种情况我们需要做的又有2个步骤:

I)首先,要检查CONTCAR中的结构是不是正确的,如果结构跑乱了,体系中原子乱飞,有很大可能会导致不收敛的情况。如果是结构乱了,我们就要找原因去解决。主要还是在以下三个方向下功夫:

  • 初始结构是否合理
  • POSCAR中的元素顺序与POTCAR中的是不是一致
  • 是不是用的gamma点,然后把体系放开了。

II)如果前面检查的结构没问题,这种情况,可能是因为你设置的NSW值太小导致的,或者体系是在是太难收敛,比如过渡态优化的情况。那么我们就需要继续算了。此时,为了保证计算的可重复性,我们必须要将上一步的计算保存记录下来。比如下面,大师兄本人的一个过渡态的优化:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
qli@tekla2:~/test$ ls
CONTCAR DOSCAR EIGENVAL INCAR OSZICAR OSZICAR-2 OUTCAR OUTCAR-2 PCDAT POSCAR-1 POSCAR-3 REPORT sub16 vasprun.xml
CONTCAR-1 DOSCAR-1 IBZKPT KPOINTS OSZICAR-1 OSZICAR-3 OUTCAR-1 OUTCAR-3 POSCAR POSCAR-2 POTCAR sub12 sub28
qli@tekla2:~/test$ grep NSW INCAR
NSW = 800
qli@tekla2:~/test$ tail OSZICAR -n 3
RMM: 8 -0.339073663363E+03 0.17227E-04 -0.45367E-05 3703 0.126E-02 0.104E-02
RMM: 9 -0.339073663179E+03 0.18447E-06 -0.78164E-06 2696 0.541E-03
800 F= -.34272018E+03 E0= -.34270858E+03 d E =0.159932E-02
qli@tekla2:~/test$ ls
CONTCAR DOSCAR EIGENVAL INCAR OSZICAR OSZICAR-2 OUTCAR OUTCAR-2 PCDAT POSCAR-1 POSCAR-3 REPORT sub16 vasprun.xml
CONTCAR-1 DOSCAR-1 IBZKPT KPOINTS OSZICAR-1 OSZICAR-3 OUTCAR-1 OUTCAR-3 POSCAR POSCAR-2 POTCAR sub12 sub28
qli@tekla2:~/test$ save_calculations.sh 4
qli@tekla2:~/$ ls
CONTCAR-1 DOSCAR-1 IBZKPT KPOINTS OSZICAR-2 OSZICAR-4 OUTCAR-2 OUTCAR-4 POSCAR POSCAR-2 POSCAR-4 REPORT sub16 vasprun.xml-4
DOSCAR EIGENVAL INCAR OSZICAR-1 OSZICAR-3 OUTCAR-1 OUTCAR-3 PCDAT POSCAR-1 POSCAR-3 POTCAR sub12 sub28
qli@tekla2:~/test$ vi INCAR
qli@tekla2:~/ru_chbr/ads/high_coverage_br/1Br/ch3br/ts_c-br/test$ qsub sub12
Your job 215093 ("freq-4B2") has been submitted

详解:

  • 前面的脚本名字为: save_calculations.sh
  • 在使用这个脚本前,大师兄已经算过3次了,每次都跑到了800步,没有收敛,而第四次依然没有收敛,就需要用脚本将当前第四次的计算记录下来下来;
  • 脚本使用方法:save_calculation.sh N N为第几次算,这里用了4,然后就会得到相应的POSCAR-4OSZICAR-4OUTCAR-4等文件,记录第四次计算的细节;
  • 保存之后,我们就可以提交任务继续苦苦等待了。

总结

到这里,CONTCAR的基本介绍以及作用差不多就讲完了。新手们看到后可能会很困惑,因为里面很多内容是大师兄临时加进去给有经验的人写的。只要记住一句话就完成本节的学习任务:CONTCAR的作用跟POSCAR一样,存储的是模型被优化过的结构信息。

上一节,我们学习了CONTCAR的一些基本内容。本着从简到易,从最常用到最不常用的原则,这一节,我们学习VASP的另外一个简单,但又很重要的的输出文件:OSZICAR

首先,推荐一个QE学习的视频:https://www.bilibili.com/video/av36194036 (用良心带人入坑)

OSZICAR 的含义

师兄,OSZICAR是什么的缩写?为什么起这么一个名字?

不好意思,这个我真不知道。也没有认真去考证过。目前只能告诉大家先把这个名字记住。

什么是优化?

在介绍OSZICAR的内容和功能之前,有必要先给大家澄清一个计算中常见的词:优化。

计算一个体系,我们有2个优化过程:

  • 电子结构的优化: 可以理解为对某一固定的几何结构,迭代求解薛定谔方程来获得体系能量极小值的一个过程。这个迭代过程,每一次迭代求解都可以认为是电子结构的一个优化。(通常被大伙称为:电子步)
  • 几何结构的优化:可以理解为在电子结构优化的结果上,获取原子的受力情况,然后根据受力情况,调节原子的位置,再进行电子结构优化,获取新的受力情况,然后再调节原子位置,一直重复这样的过程,直至找到体系势能面上一个极小值的过程。(通常被大伙称为:离子步)

思考一下,我们的O原子,我们只可能对它进行电子结构的优化,因为它的几何结构不会发生变化。

OSZICAR是干什么的?

当VASP迭代求解O原子电子结构的时候,整个过程就会记录在OSZICAR中。下面我们就看一下VASP官网对OSZICAR的解释说明:https://cms.mpi.univie.ac.at/wiki/index.php/OSZICAR

1
Information about convergence speed and about the current step is written to stdout and to the **OSZICAR** file. Always keep a copy of the **OSZICAR** file, it might give important information.

也就是说:OSZICAR是用来记录优化过程一些信息的文件。这里的优化过程既包括电子结构,又包括几何结构。

OSZICAR长什么样子?

在Linux的终端中,使用Vim打开OSZICAR,你会得到类似下面的信息:

1
2
3
4
5
6
7
8
9
       N       E                     dE             d eps       ncg     rms          rms(c)
DAV: 1 0.324969965196E+02 0.32497E+02 -0.10270E+03 48 0.977E+01
DAV: 2 0.501749892771E+00 -0.31995E+02 -0.31995E+02 72 0.202E+01
DAV: 3 -0.182605770767E-01 -0.52001E+00 -0.50521E+00 48 0.521E+00
DAV: 4 -0.203547758465E-01 -0.20942E-02 -0.20860E-02 96 0.333E-01
DAV: 5 -0.203547873947E-01 -0.11548E-07 -0.11210E-07 48 0.844E-04 0.307E-01
DAV: 6 -0.213726161828E-01 -0.10178E-02 -0.17884E-03 48 0.111E-01 0.155E-01
DAV: 7 -0.214708381542E-01 -0.98222E-04 -0.23522E-04 48 0.459E-02
1 F= -.21470838E-01 E0= -.13757722E-01 d E =-.154262E-01
  • 第一行中各项的含义:(没汉语解释的,大师兄也翻译不出来)

    1) N 代表电子结构的迭代步数,通常被大家称为电子步。

    2) E 代表当前电子步的体系能量;

    3) dE当前电子步和上一步体系能量的差值;

    4) d eps the change in the band structure energy;

    5)ncg the number of evaluations of the Hamiltonian acting onto a wavefunction;

    6) rms the norm of the residuum of the trialwavefunctions (i.e. their approximate error)

    7) rms (c) the difference between input and output charge density.

  • 第二行中DAV的含义:

    1) Blocked Davidson algorithm的缩写。看不懂不要紧,简单点:就是一个电子迭代求解的自洽算法。在对电子结构迭代求解的过程,前人们发展出了很多不同的算法。就好比是,从北京到南京,有很多种出行选择一样,可以坐火车,汽车,乘飞机,也可以步行,骑马,骑驴,骑自行车,等等。每一种出行方式都是一种算法。大家可以根据自己的情况,选择适合自己的出行方式。所以,对自己的研究方向,也需要找一个适合自己体系的合适的算法。

    2) 除了DAV,今后你还会看到RMM (residual minimization scheme) 和 CG (conjugate-gradient algorithm)等等。选择不同的算法,第二行以及后面显示的也会有所区别。这点大家掌握即可。具体到每个算法怎么回事,当你计算算起来了,有余力,慢慢开始学习量化基础知识的时候再仔细琢磨。

    3) 前面我们说了,要找一个适合自己体系的算法,是选DAVRMM还是CG,亦或是其他的呢? 这个可以在INCAR中通过参数ALGO设置,参考链接: https://cms.mpi.univie.ac.at/wiki/index.php/ALGO 。一般来说,使用ALGO = Fast可以满足大部分的需求。可以理解为北京到南京出行,大家最常用的火车。

    4) 师兄:这个氧原子的计算中,我们没有在INCAR中设置DAV这个算法相关的参数啊,为什么OSZICAR中还会出现DAV呢?

    原因在于:同很多软件一样,VASP也有很多默认的参数,这就避免了当你不设置某个参数的时候进行不下去的尴尬局面,当然,有些相关的参数,你不设置的时候VASP也会罢工,这个我们以后再说。此时的计算,对于电子结构收敛的算法来说,默认的是DAV这个方法,也就是INCAR中: ALGO = N

    5)划重点:

    我们知道VASPINCAR设置中,有很多相应的参数。而新手恰恰在学习的过程中,由于不能在短时间了解这些参数的具体含义,使用方法,从而导致了不知道怎么去选择的情况。而就是在这种情况下,选择了胡搞。也就是INCAR中参数,认识的写上去,不认识的也写上去。这也恰恰是新手在计算过程中容易出错的一个主要原因。前面我们说了VASP有很多默认的参数,而新手在学习的时候,不能图快,要一步一个脚印地走。看见一个参数,就好好琢磨琢磨,争取理解透了,或者知道这个参数大体上怎么回事。如果你不认识的参数,千万不要写上去,使用默认的就可以。

  • 最后一行:

    1) F前面的 1 代表几何结构优化的次数(也称为离子步的步数),本练习只有1步。

    2) F = 是体系的总能量, 与OUTCARfree energy TOTEN 后面的值相等;(OUTCAR还没讲,暂且记住)

    3) E0 后面的能量对应OUTCARenergy (sigma->0)后面的能量(下图到数第一行)。

OSZICAR 的作用

Always keep a copy of the OSZICAR file, it might give important information. 官网既然这么说,这表明OSZICAR确实很重要,重要在哪里呢?

  • 整个体系的优化过程都记录下来了。(当然后面我们要讲的OUTCAR也以更加详细的方式将优化过程记下来了)但OSZICAR可以更加直观地观测我们体系优化过程中能量的变化过程。

  • 通过OSZICAR获取体系的能量,也就是E0后面的那一项。很多人在使用VASP的时候,不知道该选择哪个能量,这里大师兄就告诉你:选择E0后面的即可。不管你有什么疑问,不管别人怎么跟你争论,都不要管,先老老实实记住:我们选E0后面的这个能量。随着你的学习,很多疑问自己就解开了。命令使用方式:

    1
    2
    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ grep E0 OSZICAR  
    1 F= -.21470838E-01 E0= -.13757722E-01 d E =-.154262E-01
  • 后面的学习中,我们会经常讲解OSZICAR相关的内容,由于时间的原因,也主要是因为新手才刚刚接触计算,就不做过多的解释。

总结

这一节,我们需要了解和学习的内容主要有以下几个方面:

1) VASP计算中的优化:几何和电子结构优化大体有个了解

2)OSZICAR中各项的含义,争取多理解几个;

3)DAV对应的INCARALGO是怎么设置的;一般来说ALGO=FAST可以满足大部分人的计算需求;

4)知道VASP有默认的参数,自己不要画蛇填足。保持INCAR干净整洁,不知道的,模糊不清的参数坚决不往INCAR里面写。

5)知道怎么从OSZICAR中获取体系的能量。

前面我们已经准备好了VASP的四个输入文件,学习了一系列的批量操作,那么该如何让vasp 算起来呢?每个课题组都会有自己不同的任务提交系统,大家可以向自己的师兄师姐学习提交任务的方法。此外,超算中心也是大家经常接触到的,本节通过吕梁超算中心资源(天河二号)的计算平台,介绍下具体的提交方法,任务的查看等基本操作。

任务提交

首先通过下面的命令,浏览一下具体的提交流程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ ls
ex01 ex02 ex03 ex04
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cp ex03/0.01 ex05
cp: omitting directory `ex03/0.01'
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cp ex03/0.01 ex05 -r
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cd ex05/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ ls
INCAR KPOINTS POSCAR POTCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ cp ~/bin/job_check/job_sub .
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ cat job_sub
#!/bin/bash
export LD_LIBRARY_PATH=/THFS/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64:$LD_LIBRARY_PATH
yhrun -p gsc -n 24 /THFS/opt/vasp/5.4.4/vasp.5.4.4/bin/vasp_std
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ yhbatch -p gsc -N 1 -J test job_sub
Submitted batch job 983800

解释:

  • 提交任务的脚本,为~/bin/job_check目录下的job_sub文件。 脚本名字大家随便起,目录可以随便放,只要用的时候能保证找到即可。

    • 脚本里面指定了一些库的位置
    • 使用的队列:这里是gsc,具体以自己购买的为准
    • -n 24 是指定每个节点的核数
  • 提交任务的命令为:

    1
    yhbatch -p gsc -N 1 -J test job_sub 

    这里大家需要修改的主要有下面几个地方:

    • gsc 是你计算的队列,这个在购买机时的时候,超算管理员会告诉你用哪个队列;对应的写上就可;
    • -N 后面的1是我们所用节点的个数,一个节点24个核(脚本里面已经指定了)
    • test是计算的任务名字,这个大家随便起;以第一眼能通过这个名字能辨别出是什么任务为佳;
    • job_sub就是脚本名,如果你把job_sub改成bigbro了,那么上面的命令行中,job_sub就需要改成bigbro了。
  • 网上也有很多实用的教程,大家可以多多浏览,比如: 天河二号简明使用手册;也可以在超算的使用QQ群中交流,比如:国防科大吕梁超算中心QQ群:204521798

任务查看

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ ls
CHG CHGCAR CONTCAR DOSCAR EIGENVAL IBZKPT INCAR job_sub KPOINTS OSZICAR OUTCAR PCDAT POSCAR POTCAR REPORT slurm-983800.out vasprun.xml WAVECAR XDATCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ yhq
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ tail OUTCAR
User time (sec): 1.991
System time (sec): 3.501
Elapsed time (sec): 5.931

Maximum memory used (kb): 104300.
Average memory used (kb): 0.

Minor page faults: 8571
Major page faults: 0
Voluntary context switches: 3090
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$

  • 在上面的操作中,我们使用ls命令,发现目录下多了一堆文件出来,这说明任务运行了。前面已经给大家提了个醒,这些文件大部分都没用,所以不用被它们所吓倒,我们后面会一一解释。

  • 由于只有一个O原子,任务很快就算完了。所以使用yhq这个命令查看运行状态时,也就得不到结果了。

  • 判断一个任务是否算完,通过一个tail命令就可以完成。如果你发现和上面命令类似的结果,就说明任务算完了。

  • 这里tail的命令用来输出某个文件最后的几行,如果想输出文件最前面的几行(通过-n 来实现),可以使用head文件,简单的操作实例如下,自己百度学习下其他相关的用法,熟练掌握。大师兄就不再啰嗦了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ tail -n 5 OUTCAR
    Average memory used (kb): 0.

    Minor page faults: 8571
    Major page faults: 0
    Voluntary context switches: 3090
    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ head -n 6 OUTCAR
    vasp.5.4.4.18Apr17-6-g9f103f2a35 (build Sep 22 2017 10:53:27) complex

    executed on LinuxIFC date 2018.11.12 03:58:57
    running on 24 total cores
    distrk: each k-point on 24 cores, 1 groups
    distr: one band on NCORES_PER_BAND= 1 cores, 24 groups
    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$ tail -n 5 OUTCAR | head -n 2
    Average memory used (kb): 0.

    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex05$

总结

本节我们通过超算中心简单展示了VASP任务的提交过程,本节需要掌握的内容主要有:

  • 会提交任务;
  • 会查看任务;
  • 知道VASP任务结束后,怎么通过tail命令判断。
  • 学会使用:tail 和 head 这2个命令。

前面2节,我们学习了使用sed命令结合for循环,来对INCAR进行批量操作。同样,我们也可以对KPOINTS文件进行类似的批处理操作。本节,我们借对KPOINTS文件的操作,一方面,学习几个小窍门,另一方面回顾上一节的学习内容以及KPOINTS文件。

KPOINTS文件

前面我们学习到,KPOINTS文件只有简单的几行,如下:

1
2
3
4
5
K-POINTS  
0
Gamma
1 1 1
0 0 0

目前,对于大家来说,需要掌握的有以下点:

  • 会自己闭着眼把这几行写出来;

  • 第三行的gamma代表的是gamma centered的意思;

  • 第四行中的1 1 1 俗称gamma点。很多时候,在QQ群里面提问题,别人说用gamma点算一下,指的就是1 1 1;
  • 除了使用gamma点,我们还可以使用其他的数值,比如2 2 2,3 3 3, 1 2 3 等,数值越大,计算量也就越大。具体的要根据你自己的体系以及组里的计算能力来确定,这个我们后面会介绍;

  • 对于气体分子或者原子的计算来说,也就是把它们放到一个格子的体系,使用gamma点就足够了。

本节,我们主要对KPOINTS的文件的第四行进行批量操作,将1 1 1改成 2 2 2, 3 3 3 等。首先浏览下面的命令:

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
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ ls
ex01 ex02 ex03
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ mkdir ex04 && cd ex04
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do cp ../ex03/0.01/ ${i}${i}${i} -r ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ ls
111 222 333 444 555 666
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cat 333/KPOINTS -n
1 K-POINTS
2 0
3 Gamma
4 1 1 1
5 0 0 0
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do sed -i '4s/1 1 1/$i $i $i/g' $i/KPOINTS ; done
sed: can't read 1/KPOINTS: No such file or directory
sed: can't read 2/KPOINTS: No such file or directory
sed: can't read 3/KPOINTS: No such file or directory
sed: can't read 4/KPOINTS: No such file or directory
sed: can't read 5/KPOINTS: No such file or directory
sed: can't read 6/KPOINTS: No such file or directory
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cat 333/KPOINTS -n
1 K-POINTS
2 0
3 Gamma
4 1 1 1
5 0 0 0
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do sed -i '4s/1 1 1/$i $i $i/g' ${i}${i}${i}/KPOINTS ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cat 333/KPOINTS -n
1 K-POINTS
2 0
3 Gamma
4 $i $i $i
5 0 0 0
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$

详解:

  • 第三行:我们使用了 mkdir ex04 && cd ex04 这个命令。 && 的作用是将两个命令连起来运行,如果&&前面的命令运行成功,则继续后面的命令。这里我们先运行了mkdir ex04的命令,然后通过cd进入新建的ex04这个文件夹目录下。但如果前面的命令运行不成功,我们还想运行第二个命令,那么可以用 ||这个将两个命令联系起来。百度自己搜索:&& 和 ||的使用,多多练习,可以提高你敲命令的工作效率。

  • 我们使用for循环,将ex03中的0.01文件夹复制成111, 222, 333等。这里我们在调用for 循环中的变量i的时候,使用的是${i}。为什么要加花括号呢? 这是为了避免$i和后面的连在一起,从而导致调用失败。比如下面的命令:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do echo $iA; done 






    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do echo ${i}A; done
    1A
    2A
    3A
    4A
    5A
    6A
    iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$
  • 后面的命令中,我们得到了这样的错误:sed: can’t read 1/KPOINTS: No such file or directory。原因是我们的问价夹中有3个数字,我们需要调用$i三次,但写$i/KPOINTS就会引用一次,导致sed的命令对象不正确。

  • 改正之后,我们发现INCAR中的1 1 1 全部被替换成$i $i $i了。这里是大师兄故意犯了的错误:将双引号变成了单引号。到现在,单引号和双引号的区别,相信大家在练习完之后能大体知道个所以然了。

上面的练习中,我们没有成功将 1 1 1改成文件夹对应的数字,那么改怎么做呢? 有下面2个方法:

方法1: 将ex04的文件夹全部删掉,然后从新来过,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ ls
111 222 333 444 555 666
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ rm * -fr
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ ls
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do cp ../ex03/0.01/ ${i}${i}${i} -r ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ ls
111 222 333 444 555 666
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6}; do sed -i "4s/1 1 1/$i $i $i/g" ${i}${i}${i}/KPOINTS ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cat 333/KPOINTS -n
1 K-POINTS
2 0
3 Gamma
4 3 3 3
5 0 0 0
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$

方法2:将错就错,在错误的基础上,把$i $i $i 批量替换成文件夹对应的数字:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ ls
111 222 333 444 555 666
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cat 222/KPOINTS
K-POINTS
0
Gamma
$i $i $i
0 0 0
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ for i in {1..6} ; do sed -i "s/\$i \$i \$i/$i $i $i/g" $i$i$i/KPOINTS ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cat 222/KPOINTS
K-POINTS
0
Gamma
2 2 2
0 0 0
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$
  • 这里我们没有用${i},而是直接$i$i$i连在一起用了。说明这个时候,花括号有或者没有,对命令行影响不大。

  • sed 操作的难点在于区别$i是调用的参数还是要被替换的字符上。例子中我们用一个反斜杠 \ 将$i转义成字符,进而避免将其按照变量来处理。说白了,就是让$ 这个符号变成一个纯文字符号,而不再发挥调用变量的作用。这一部分的知识,大家自行百度搜索:Linux 转义符 进行学习。

再举个例子:如果被替换的内容中含有 / , 直接输入则会被认为是分隔符,因此我们需要将其作为分隔符的作用去掉。怎么做呢? 输入\/ (一个反斜杠加单斜杠,中间没有空格),这样的话 / 就会被当成字符来处理啦! 大家好好琢磨下面的这个命令,我们要把big/bro中的/替换为\。如果你能理解了,转义符就基本入门了。

1
2
3
4
5
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ echo big/bro 
big/bro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ echo big/bro | sed 's/\//\\/g'
big\bro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$
  • 这里我们用了一个|,中文名字叫管道符,它的作用是将前面命令的输出结果传递给后面的命令,用作操作对象。百度自行搜索:Linux 管道符

总结

在本节的操作中,我们可以学到很多知识,私以为对于一个新手来说,这一节的内容难度有些大,需要认真操作,思考,查阅相关的资料。简单总结一下,本节需要掌握的内容有:

  • &&,|| 和 | 的用法

  • ${i} 中什么时候用花括号,什么时候不用

  • sed 中的单引号,双引号的区别;

  • 转义符在字符处理中的作用。

  • 如何避免命令出错,以及出错后改怎么改正。

前面的四点都是死死的基本Linux操作,而最后一点则是考验大家智商的时候。做计算,肯定避免不了会敲错命令,犯各种各样的错误。在避免出错方面,我们要认真掌握命令操作的关键点以及总结前面错误的经验;在错误的改正方面,我们要多多动脑子,及时想办法补救。众多补救的办法中,提前将操作的对象进行备份是最为有效的。比如,在前面例子中,由于在ex03中有备份的文件,即使在ex04目录犯错后,我们大不了全部删除,重新再来一遍。所以,在大家没有进行计算前,先提个醒:一定要时刻牢记备份自己的文件

$\require{mediawiki-texvc}$

前面我们对INCAR,KPOINTS进行了批量操作,这一节,我们介绍对输入文件进行批量操作的最后一部分:POSCAR。 在这里,大师兄需要指出的是,批量操作的方式有很多种,大家千万不要仅仅局限在本书的例子里面,自己主动去思考这些命令的运行方式,将其运行的范围扩展,最后才能做到随心所欲,达到无招胜有招的境界。如果只跟着大师兄的教程去练习而不主动思考的话,时间长了思维就会被限制了。

此外,大师兄给的例子是都可以正确执行的,虽然易错的地方已经指出来了,但更希望大家主动去尝试自己理解不清楚的参数,主动去犯错,得到错误的结果时,印象会更加深刻些。有句古话说的好:纸上学来终觉浅,绝知此事要躬行。所以,行动是很有必要的。大家在此基础上多加尝试,尽可能多的犯错误,知道什么样的输入对应什么样的错误。

POSCAR 批处理练习:

前面我们将O原子放到了一个8$\times$ 8$\times$8 $\AA{^3}$ 的格子里。现在我们要创建不同大小的正方形格子,每个格子边长分别为8,10,12,14,16$\AA$。重复下面的操作,完成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
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ mkdir poscar
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cd poscar/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/poscar$ for i in $(seq 8 2 16); do cp -r ../../ex03/0.01 ${i}${i}${i} ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/poscar$ ls
101010 121212 141414 161616 888
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/poscar$ cat -n 888/POSCAR
1 O atom in a box
2 1.0
3 8.0 0.0 0.0
4 0.0 8.0 0.0
5 0.0 0.0 8.0
6 O
7 1
8 Cartesian
9 0 0 0 #
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/poscar$ for i in $(seq 8 2 16); do sed -i "3,5s/8/$i/g" ${i}${i}${i}/POSCAR ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/poscar$ cat -n 888/POSCAR
1 O atom in a box
2 1.0
3 8.0 0.0 0.0
4 0.0 8.0 0.0
5 0.0 0.0 8.0
6 O
7 1
8 Cartesian
9 0 0 0 #
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/poscar$ cat -n 101010/POSCAR
1 O atom in a box
2 1.0
3 10.0 0.0 0.0
4 0.0 10.0 0.0
5 0.0 0.0 10.0
6 O
7 1
8 Cartesian
9 0 0 0 #

命令详解:

  • seq 命令用来打印一系列的数字, 在这个例子中 seq 8 2 16 获取8到16之间的数字,间隔为2; 其中, 8 2 16 三个数字间需要用空格分开;看到这里你会想到之前我们使用的花括号 {},对的,如果间隔是1的话, {1..9} 和 seq 1 1 9 以及 seq 1 9 是一样的; seq 1 9 中省略的是 seq 1 1 9 中间的 1, 因为它是默认值。但是这里我们数字的间隔是2,使用花括号则不能实现我们的目的。

  • for 循环的精髓: for i in $(seq 8 2 16);

    提醒1):for循环这部分结束后,要跟一个是分号,不是冒号!!!

    提醒2): $ 和 后面的括号之间没有空格!!!

    大家可以主动把分号改成冒号或者在$后面加个空格,看看会出什么错。

    在这里,调用seq 8 2 16这个命令的输出,我们用 到了$() 这个组合。它的作用是: 调用一个命令或者函数的输出,进而转化为for循环的对象集合。for i in $(seq 8 2 6) 等于for i in 8 10 12 14 16 。

  • 此外,你还会见到一些人使用 ` ` 这个符号(反单引号); `seq 8 2 16` 的效果等于 $(seq 8 2 16)。所以,当你见到 ` ` 时,不要害怕,因为你知道里面是在调用一个命令或者函数,和 $() 效果是一样的。Linux下面有很多奇奇怪怪的字符,当你知道他们的意思时就见怪不怪了。

  • sed 命令,这里我们使用了 sed –i “3,5s/8/$i/g”

    3,5s 的意思是:选择第三行到第五行中所有的8;然后将它们替换成$i;

有很多筒子不知道怎么一次性选择三行中的内容,便运行了这和循环命令三次:

1
2
3
sed –i “3s/8.0/$i/g”
sed –i “4s/8.0/$i/g”
sed –i “5s/8.0/$i/g”

效果是一样的,但3,5s这样更简洁,优美。希望大家可以认真学习sed的使用,达到炉火纯青的地步。后面我们也会在计算过程中继续介绍sed是如何发挥作用的。

为什么说这是 for 循环的精髓呢?

从for循环的语法上看,有两个主要部分:

1)第一个是选取对象,也就是for i in XXX 语句中的 XXX 部分;

2)另一个是去执行的动作, do YYY ;

对于do YYY 我们根据自己的要求或者要现实的目的,把命令填到YYY这一块就可以了。但是,对于前面的集合选取,这就需要大家脑洞大开了。最简单的是根据自己的任务要求选取合适的范围直接输入,比如 for i in 1 2 3 4 5 ;

再复杂些,我们使用一个函数,命令或者更高级的命令操作来得到所需范围,如本例中 for i in $(seq 8 2 16)。这个随着计算的进行,你的体会也就越来越深刻。

当我们准备计算输入文件,查看计算亦或者整理计算结果时,首先要对这些文件或者文件夹进行选择,即把需要处理的对象放在一起。为了保证for循环变量范围的高效选择,养成一个良好的计算习惯非常重要:那就是保持计算在不同目录下的一致性;也就是目录要规范,文件系统有序而整齐,根据不同的计算等级或者类型进行创建。如果文件夹一个套一个,随意创建,毫无规则可言,那么在用for循环的时候,工作效率就会大大地打折扣。

在这里教给大家另外一个linux 命令:tree 来查看当前目录下的文件夹级别信息,用以给for循环提供合适的变量; (tree 和 tree -d, 尝试下有什么不同)

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
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ ls
kpoints poscar
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ tree -d
.
├── kpoints
│   ├── 111
│   ├── 222
│   ├── 333
│   ├── 444
│   ├── 555
│   └── 666
└── poscar
├── 101010
├── 121212
├── 141414
├── 161616
└── 888

13 directories
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04$ cd kpoints/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/kpoints$ ls
111 222 333 444 555 666
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/kpoints$ tree
.
├── 111
│   ├── INCAR
│   ├── KPOINTS
│   ├── POSCAR
│   └── POTCAR
├── 222
│   ├── INCAR
│   ├── KPOINTS
│   ├── POSCAR
│   └── POTCAR
├── 333
│   ├── INCAR
│   ├── KPOINTS
│   ├── POSCAR
│   └── POTCAR
├── 444
│   ├── INCAR
│   ├── KPOINTS
│   ├── POSCAR
│   └── POTCAR
├── 555
│   ├── INCAR
│   ├── KPOINTS
│   ├── POSCAR
│   └── POTCAR
└── 666
├── INCAR
├── KPOINTS
├── POSCAR
└── POTCAR

6 directories, 24 files
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex04/kpoints$

上面例子给出了一个非常清晰的文件目录结构。如果你在服务器上运行,发现下面的错误。且自己没有root权限安装tree这个命令,那么自动跳过这个练习或者在自己电脑的Linux系统上进行操作。

1
2
 tree
-bash: tree: command not found

总结

本节我们学习了:

1) seq 命令获取数字序列的方法;

2) 使用 $() 将括号里面命令的输出转为for循环变量的方法;

3) sed 一次性选择多行的方法。

4) 保持文件系统有序而整齐,提高for 循环处理任务的效率。

前面这几节没有直接进入计算部分,是因为我们的一句古话:工欲善其事必先利其器。进行理论计算,学会最基本的相关操作知识非常重要。从前面这几节的学习,你会发现:懂得使用一个命令,可以节省很多时间; 但如果你懂得如何进一步发挥这个命令的作用,那么它会更加节省你的时间。省下来的时间你可以去看书,运动,谈恋爱…等等。想想都是很美好的事情。记得本人刚读博士的时候,组里的一个博后给我说:如果你想偷懒,那么就必须多动脑! 大家可以在运行完命令后,仔细体会下这句话的思想。而大家主动学习怎么去偷懒是最重要的。当然基本的命令操作只是科研中的一个小利器而已,真正的利器在于你扎实的理论化学基本功。

前面练习中我们在0.01的文件夹基础上,通过一个命令,复制得到了从0.02到0.09的文件夹。但是, 所有文件夹中的输入文件都是一样的,我们还需要把INCAR中的SIGMA参数值 SIGMA = 0.01 改成与文件夹对应的数值。 首先我们可以逐个进行编辑,但太浪费时间,这也不是大师兄的风格。Ex03练习分为2小节:

  • 新命令 sed 的学习
  • for + sed 组合

最终我们会结合for循环和sed命令,来学会批量处理输入文本的另一个方法。还是要强调一下:大家要主动,多去网上找资料,并系统性的学习linux下面的基本命令。光指望着本书中的这么一点,是很难提高的。

复习上一节的功课

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ ls
ex01 ex02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ mkdir ex03
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cp ex02/0.01 ex03 -r
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cd ex03/0.01/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR -n
1 SYSTEM = O atom
2 ISMEAR = 0
3 SIGMA = 0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$

上面的操作依次为:

  • 新建ex03文件夹

  • 将ex02中的0.01 复制到ex03中

  • 进入ex03/0.01的目录中
  • 使用cat 查看0.01中INCAR的内容
  • 使用cat -n 查看INCAR中的内容,该选项在输出中给每一行标出了行数,方便我们查看。

注意:

1)Linux 下面的命令都有很多的选项,用以丰富我们的不同需求,比如上面的 cat -n,可以使用 man cat 这个命令查看 cat 的其他选项。使用这个命令后,如果想退出,敲 q 键即可;

2)另外,我们也可以使用 cat –help 来查看,效果与man cat 一样。

sed 命令修改INCAR

前面我们提到,可以使用vim打开INCAR然后修改SIGMA的参数。除了vim当然还有文本编辑器等其他的工具。但这些工具都有个缺点,就是得把文件打开后才能修改。下面我们使用sed命令,不打开文本,直接对里面的内容进行替换操作。

1
2
3
4
5
6
7
8
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ sed '3s/0.01/0.02/g' INCAR 
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.01

精解:

1) 单引号中是我们的操作, 3s 表示的是选择第三行,因为我们知道 0.01 在第三行中出现,s 是substitute 的缩写
2) 3s 后面跟一个斜杠 / 用来和后面被替换的内容分开,这里0.01 表示选择第三行的0.01;

3) 0.01后面再用一个斜杠,将其和替换后的数字分开(0.01 0.02 0.03 等),表示将0.01替换为斜杠后面的内容;

4) 再加一个斜杠,后面的g 代表 global ,意思是全部替换。

5) 输入完毕后,我们选择要执行该命令的对象(要替换的文件),也就是当前目录下INCAR 文件。

6) 命令的意思就是:我们用sed命令,将INCAR中的第三行的0.01全部替换成0.02。

从上面实例中最后的cat INCAR命令结果不难发现,实际上我们并没有将INCAR文件中的0.01替换成0.02。也就是说这个命令只是输出了替换后的结果,但没有更新INCAR文件。那怎么样才可以更新INCAR文件呢? 我们可以这样做:

1
2
3
4
5
6
7
8
9
10
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ sed '3s/0.01/0.02/g' INCAR > INCAR_new
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR_new
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ mv INCAR_new INCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.02

箭头(>)的意思是:我们将命令的输出存到一个新的文件INCAR_new中,

通过mv命令之前的INCAR替换掉。

但,这样做也太麻烦了,更简单一点,如下:

前面例子的INCAR中SIGMA的值已经不是0.01了,我们先从ex02/0.01中复制一个过来。

1
2
3
4
5
6
7
8
9
10
11
12
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cp ../../ex02/0.01/INCAR  .
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR -n
1 SYSTEM = O atom
2 ISMEAR = 0
3 SIGMA = 0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ sed -i '3s/0.01/0.02/g' INCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR -n
1 SYSTEM = O atom
2 ISMEAR = 0
3 SIGMA = 0.02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$

详解:

sed –i 是sed 的命令和其附加选项, -i 表示直接对源文件进行编辑,也就是说编辑之后源文件被新文件替换掉。因此,使用这个参数的时候要小心,小心,再小心。要格外小心!!!

  • 最保险的做法就是运行前,先对操作的对象进行备份:如下:
1
2
3
4
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cp INCAR  INCAR_back
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ sed -i '3s/0.01/0.02/g' INCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ ls
INCAR INCAR_back KPOINTS POSCAR POTCAR
  • 其次是,先不加 -i 运行下sed命令,确保输出的是正确结果后,然后再加上 -i 运行.
1
2
3
4
5
6
7
8
9
10
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cp INCAR_back  INCAR 
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ sed '3s/0.01/0.02/g' INCAR
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ sed -i '3s/0.01/0.02/g' INCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03/0.01$ cat INCAR -n
1 SYSTEM = O atom
2 ISMEAR = 0
3 SIGMA = 0.02

小结:

sed 是一个非常强大的命令,对于做计算的我们来说,熟练正确地使用sed可以极大的提高我们的工作效率,大家务必硬着头皮掌握这个命令。这个网站列举了一些基本的用法:

http://man.linuxde.net/sed

大家参照着进行练习,也可以百度里面搜索一些其他的 sed 使用技巧,如果你有认为很好的sed 技巧,也可以发邮件分享给大师兄(lqcata@gmail.com)。

本节我们学习2个批量操作:

  • 通过sed单个命令进行批量操作
  • 以及sed + for循环的批量操作

1 sed 批量将0.01到0.09中所有INCAR中的0.01替换成0.05。到现在为止,相信大家都可以看懂下面的命令操作。就不再啰嗦解释了。有一点需要注意的是grep 命令中的星号,检查输入输出的时候用*非常方便。

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
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ ls
0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ for i in {2..9}; do cp 0.01 0.0$i -r ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ ls
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ grep SIGMA */INCAR
0.01/INCAR:SIGMA = 0.01
0.02/INCAR:SIGMA = 0.01
0.03/INCAR:SIGMA = 0.01
0.04/INCAR:SIGMA = 0.01
0.05/INCAR:SIGMA = 0.01
0.06/INCAR:SIGMA = 0.01
0.07/INCAR:SIGMA = 0.01
0.08/INCAR:SIGMA = 0.01
0.09/INCAR:SIGMA = 0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ sed -i '3s/0.01/0.05/g' */INCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ grep SIGMA */INCAR
0.01/INCAR:SIGMA = 0.05
0.02/INCAR:SIGMA = 0.05
0.03/INCAR:SIGMA = 0.05
0.04/INCAR:SIGMA = 0.05
0.05/INCAR:SIGMA = 0.05
0.06/INCAR:SIGMA = 0.05
0.07/INCAR:SIGMA = 0.05
0.08/INCAR:SIGMA = 0.05
0.09/INCAR:SIGMA = 0.05

2 for 循环结合sed

前面我们使用sed命令,将文件夹中所有的0.01替换成了0.05。但我们的目标是,每个文件夹中的SIGMA值与文件夹相同。既然我们知道了sed可以对单个文件进行操作,那么我们也可以结合for循环,来实现一个批量操作的目的。命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ ls
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ for i in *; do sed -i "3s/0.05/$i/g" $i/INCAR ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ grep SIGMA */INCAR
0.01/INCAR:SIGMA = 0.01
0.02/INCAR:SIGMA = 0.02
0.03/INCAR:SIGMA = 0.03
0.04/INCAR:SIGMA = 0.04
0.05/INCAR:SIGMA = 0.05
0.06/INCAR:SIGMA = 0.06
0.07/INCAR:SIGMA = 0.07
0.08/INCAR:SIGMA = 0.08
0.09/INCAR:SIGMA = 0.09

注意:

  • 这里我们用的是双引号 “ “ ,sed 命令中你会见到大部分都用单引号 ‘ ‘ 。但如果这里使用单引号,则所有的 0.01 都会被替换成 $i (单引号中的$i 是纯字符),因为单引号中的所有内容都会被当做字符来处理,也就是里面是什么就输出什么。使用双引号,则可以读取变量 $i 的值,下面的例子大家一看就知道怎么回事了:
1
2
3
4
5
6
7
8
9
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ abc=bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ echo abc
abc
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ echo '$abc'
$abc
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ echo $abc
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex03$ echo "$abc"
bigbro

这里单引号中的内容被原封不动地打印出来了。而双引号的话,则可以顺利地把变量调用起来。

  • for i in ; 这里的 指的是当前目录下所有的文件以及文件夹,本例中没有文件,只有从0.01, 0.02, 0.03 到 0.09 的文件夹;所以: for i in * = for i in 0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09

1.5.2 使用sed 命令将INCAR中的 0.05 (所有文件夹中的都是0.05)替换成文件夹的数字;

1
sed -i "3s/0.05/$i/g" $i/INCAR 

当$i的值为0.01的时候,我们就把0.01/INCAR中的0.05替换为0.01;为0.02的时候,就把0.02/INCAR中的0.05替换为0.02,依次类推,直至for循环完成。

1.6 该命令瞬间运行完成,我们使用grep SIGMA 来查看下这些文件夹中的INCAR参数 ,圆满完成任务!


总结

在ex03的练习中,我们并不着急去提交任务,反正已经走了计算的路,以后提交任务的机会还多着呢,也不差这一两天的学习时间。先从简单到复杂些,逐渐掌握Linux的一节操作命令,对以后的学习帮助很大。

1) 学会 man command 或者 command –help 查看命令的具体参数;

2) 大量使用sed 命令进行操作练习;

3) 知道 * 在for循环中代表的含义

3) 熟知单引号和双引号的使用,以及区别

4) 主动搜索相关的Linux命令的相关知识,积极操练。

5) 学会从单一操作,通过for循环转化成批量操作的思路。

  • for i in XXX; do YYY; done
  • XXX就是我们要操作的范围或者对象
  • YYY就是单一的一个操作。

回顾

前面一节大家已经学习了怎么制作文本格式的输入文件。回顾一下我们所学的东西:

  • VASP必须有的输入文件都有哪些? INCAR、KPOINTS、POSCAR、POTCAR

  • 这些文件用什么编辑器修改或者制作?

  • 文本内部格式都有哪些需要的注意事项?
  • 目前学到的INCAR中各个参数代表的含义?
  • KPOINTS, POSCAR文本中每一行所代表的含义?
  • POTCAR中几个参数的含义。

批量处理

在提交VASP任务之前,我们先学习一下在Linux系统中常用的批量处理任务文件的办法。本书的宗旨是:稳中求快,欲速则不达。因此,不是所谓的速成教材,更不是10分钟学会XXX的理想手册。每一节的内容,都需要认真阅读,亲自上手操作练习。如果耐不住性子,请放弃本书的学习。而大师兄VASP多年的经验告诉我,批量处理在新手学习上有着非常重要的作用,因为很多参数他们不知道怎么去选择,但是,这种情况其实很好处理,只需要测试下就可以了。

大家常用的测试方法

在VASP官网上,亦或者百度里面搜索的VASP教程里面,你可以找到很多个测试参数的小脚本,大部分都是这样的:参考链接:https://cms.mpi.univie.ac.at/wiki/index.php/Cd_Si

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#! /bin/bash
BIN=/path/to/your/vasp/executable
rm WAVECAR SUMMARY.dia
for i in 5.1 5.2 5.3 5.4 5.5 5.6 5.7 ; do
cat >POSCAR <<!
cubic diamond
$i
0.0 0.5 0.5
0.5 0.0 0.5
0.5 0.5 0.0
2
Direct
-0.125 -0.125 -0.125
0.125 0.125 0.125
!
echo "a= $i" ; mpirun -n 2 $BIN
E=`awk '/F=/ {print $0}' OSZICAR` ; echo $i $E >>SUMMARY.dia
done
cat SUMMARY.dia

然而,很多新手对linux的基本命令还不是很熟悉,更不用说脚本了。由于对于本书所默认的Linux基础为0的读者来说,上面的脚本会有些难度。因此,本节需要学习在linux系统下(确切点是在一个Terminal,终端里),一些基本的命令以及大师兄本人常用的批量处理任务文件的一个办法。

这时候你要问了,师兄,你的这个方法和VASP官网中的那个比起来,哪个更好啊?

其实本质是一样的。只是操作思路稍微有些区别。这个没有最好的,要根据你所要达到的目标,目前对程序的理解水平来定的。但是,你必须要学会一种,一个好的开始对于大家的后程发力和高效解决日常任务非常重要。

Linux里面的一些基本命令

首先:教给大家常用的查看(进入)目录,查看文件的几个相关的命令: ls, cat,和 grep。

通过这几个命令复习并查看上一节我们制作的输入文件: INCAR, KPOINTS, POSCAR 和POTCAR。

大师兄在超算中心的一些具体的基本操作。大家可以照着命令自己练习下面的几个命令。先敲一遍,看下输出结果。(老司机自动跳过)

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
[iciq-lq@ln3%th2 ~]$ ls
bin LVASPTHW
[iciq-lq@ln3%th2 ~]$ cd LVASPTHW/
[iciq-lq@ln3%th2 LVASPTHW]$ ls
ex01
[iciq-lq@ln3%th2 LVASPTHW]$ cd ex01/
[iciq-lq@ln3%th2 ex01]$ ls
INCAR KPOINTS POSCAR POTCAR
[iciq-lq@ln3%th2 ex01]$ pwd
/THFS/home/iciq-lq/LVASPTHW/ex01
[iciq-lq@ln3%th2 ex01]$
[iciq-lq@ln3%th2 ex01]$ cat INCAR
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.01
[iciq-lq@ln3%th2 ex01]$ cat KPOINTS
K-POINTS
0
Gamma
1 1 1
0 0 0
[iciq-lq@ln3%th2 ex01]$ cat POSCAR
O atom in a box
1.0
8.0 0.0 0.0
0.0 8.0 0.0
0.0 0.0 8.0
O
1
Cartesian
0 0 0 #
[iciq-lq@ln3%th2 ex01]$
[iciq-lq@ln3%th2 ex01]$ grep TIT POTCAR
TITEL = PAW_PBE O 08Apr2002
[iciq-lq@ln3%th2 ex01]$
[iciq-lq@ln3%th2 ex01]$ grep EMAX POTCAR
[iciq-lq@ln3%th2 ex01]$ grep ENMAX POTCAR
ENMAX = 400.000; ENMIN = 300.000 eV
[iciq-lq@ln3%th2 ex01]$

详解:

1) ls 命令:列出来当前目录下的所有文件和文件夹;

2) cd: 进入文件夹所在的目录;

3) pwd:显示当前所在的绝对目录。

4) cat 后面加上文件名,就可以在输出里面查看该文件的内容:cat 和文件名之间有空格, 可以是一个,也可以是N个。(上一节,我们也提到使用cat命令来生成VASP的POTCAR)

5) 对于一个大文件来说,里面有很多行, 用cat就不方便查看了, 我们可以用grep这个命令提取出来所需要的信息,比如上一节的POTCAR文件,复习下上节的操作:

  • 例子1:我们想知道POTCAR中包含的元素,可以用: grep TIT POTCAR ,

TIT就是POTCAR中的一个固定的字符,通过提取这个字符,获取我们需要的结果,这里我们知道了 POTCAR中含有O元素;

  • 例子2:通过使用:grep ENMAX POTCAR 可以获取POTCAR中O元素的截断能是400 eV;

  • 注意:grep 后面提取的字符,最好在文件中是唯一存在的或者只出现几次。否则我们不容易得到期望的结果; 大家可以运行下面这两个命令,感受下结果;

1
2
3
grep EMAX POTCAR
grep PBE POTCAR
grep 0 POTCAR (可以是0,也可以是字母O)

6) 查看文件的命令还有 more,例如下面的操作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[iciq-lq@ln3%th2 ex01]$ ls
INCAR KPOINTS POSCAR POTCAR
[iciq-lq@ln3%th2 ex01]$
[iciq-lq@ln3%th2 ex01]$ more INCAR
SYSTEM = O atom
ISMEAR = 0
SIGMA = 0.01
[iciq-lq@ln3%th2 ex01]$ more POSCAR
O atom in a box
1.0
8.0 0.0 0.0
0.0 8.0 0.0
0.0 0.0 8.0
O
1
Cartesian
0 0 0 #
[iciq-lq@ln3%th2 ex01]$

7) 或者less, 运行less 命令 后,会显示文件的内容,

  • 如果要退出 敲一下 q 键即可;

  • 如果想编辑文件,再敲一下键盘上的v键,则可以直接进入vim 的编辑界面。退出时和vim的退出方法是一样的。

总结

本节的内容虽名为详解,实为简介!如果想学的更加深入还要靠自己百度查找相关的Linux命令学习手册,ppt等,平时多加操练。但,请不要让我推荐参考书给你。百度搜索关键词: Linux命令 即可。到现在,我们讲到的Linux基本命令有: ls,cd,pwd,cat,grep,more,less 以及vim 这个编辑器。如何才能圆满达到本节的要求呢?

1) 熟练操作使用这些命令;

2) 搜索百度,尝试一些教程相关的学习;

3) 养成遇到不会的命令,就自己主动认真搜索学习的习惯。

上一小节,我们学习了一些基本的linux操作,今天我们学习下文件以及文件夹的操作命令:mkdir, cp,mv以及一个简单的for循环。

文件(夹)的操作命令:

1 mkdir 是创建文件夹的一个命令,后面紧跟着你要创建的文件夹的名字。mkdir的使用,有很多敲门。大家可以百度关键词查找: mkdir 窍门,小诀窍 等等。创建一个名字为:ex02的文件夹,然后进入,再创建一个birbro的文件夹:

1
2
3
4
5
6
7
8
9
10
11
12
13
iciq-lq@ln3:/THFS/home/iciq-lq$ ls
bin LVASPTHW
iciq-lq@ln3:/THFS/home/iciq-lq$
iciq-lq@ln3:/THFS/home/iciq-lq$ cd LVASPTHW/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ ls
ex01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ mkdir ex02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW$ cd ex02
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ mkdir bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$

2 cp这个命令适用于文件以及文件夹的复制。比如:

2.1) 将bigbro 这个文件夹复制名为: bigbra

1
2
3
4
5
6
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp bigbro bigbra 
cp: omitting directory `bigbro'
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp bigbro bigbra -r
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbra bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$
  • 如果复制文件夹的时候,如上图,出现cp: omitting directory这个错误,在cp命令后,或者前面命令的结尾加上-r即可。

  • 复制文件的时候,不用加 -r。

    1
    2
    cp -r  bigbro bigbra
    cp bigbro bigbra -r

2.2) 将ex01中的四个输入文件复制到bigbra这个文件夹中:

1
2
3
4
5
6
7
8
9
10
11
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp ../ex01/
INCAR KPOINTS POSCAR POTCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp ../ex01/* bigbr
bigbra/ bigbro/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cp ../ex01/* bigbra/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls *
bigbra:
INCAR KPOINTS POSCAR POTCAR

bigbro:

  • 学会用tab键来提高自己在终端输入的速度,最上面2个cp的命令都是tab的结果。
    • 第一次使用tab,可以列出来ex01中所有的文件;
    • 第二次使用tab,可以列出来当前目录下所有以b开头的文件夹;
  • 学会用*来查看某个目录下所有的内容。

3 mv 是Linux中: 转移、重命名文件(夹)的一个命令,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ mv bigbra bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ cd bigbro/
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ ls
bigbra
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ mv bigbra/ 0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ ls
0.01
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02/bigbro$ cd ../
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ mv bigbro/0.01/ .
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$
  • 把bigbra 文件移动到bigbro里面;
  • 进入bigbro文件夹;

  • 将bigbra文件夹重命名为: 0.01

  • 返回上一层的目录;
  • 将bigbro中的0.01移动到当前的目录下(当前的目录,命令中用点.来代替。);

问题来了:

现在我们需要完成下面的任务:

1)创建从0.02,0.03到0.10,共9个文件夹,

2)每个文件夹中都有与0.01文件夹中相同KPONTS, POSCAR,POTCAR

3)每个文件夹中都有INCAR,但INCAR中SIGMA这个参数的取值和文件夹的名字一样,其他参数和0.01的相同。

为实现这个小目标,我们可以这样做:将0.01复制成0.02,0.03…0.10,然后挨个修改里面的INCAR文件。如下:

1
2
3
4
5
6
7
cp 0.01 0.02
cp 0.01 0.03
......
cp 0.01 0.10
vi 0.02/INCAR
vi 0.03/INCAR
......
  • 小窍门:运行完第一个命令后,敲一下键盘的向上箭头,就会出现刚刚运行的命令,直接修改最后一个数字即可。

神奇的for循环

但大师兄不想挨个创建这9个文件夹,也不想挨个编辑修改INCAR文件中的SIGMA数值。想必大家都不想这么做,因此,在这里教给大家使用一个for循环来快速实现我们的小目标。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
0.01 bigbro
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ rm bigbro/ -fr
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ for i in {2..9}; do cp 0.01 0.0$i ; done
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
cp: omitting directory `0.01'
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ for i in {2..9}; do cp 0.01 0.0$i -r ; done
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$ ls
0.01 0.02 0.03 0.04 0.05 0.06 0.07 0.08 0.09
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex02$

上面我们先删掉了bigbro文件夹;

然后使用for循环,发现没有加-r,复制的时候出错了

加上-r之后,for循环顺利的完成了小目标

for循环详解:

1) {2..9} 是为了获取从2到9的所有数字, 有以下几点需要注意:

  • for i in {2..9} 和 for i in 2 3 4 5 6 7 8 9 效果是一样的

  • 用的是花括号

  • 2和9中间有两个点 ..

  • 两个点之间没有空格, 2,9 与两个点之间也没有空格。

  • 不要用中文输入法敲命令。

2)大家还可以练习下面这几个命令来看一下效果: echo是打印输出的命令。

1
2
3
4
echo {1..100} 
echo {A..Z}
echo {a..z}
echo {a..z}{1..10}{A..Z}

3) for i in {2..9} : 翻译过来就是:对于从2到9的任意数字 i, i在这里是一个变量;我们给 i 赋值,值的范围是 从2到9 ; 两点需要注意:

  • i 只是个人喜好而已, 你也可以用 for a in XXX ; for b in XXX;

  • in 后面是一个 集合; 怎么选取这个集合决定了for循环的威力;

4) for i in XXX 这个句字后面跟着一个分号,如果没有便会出错。分号前后可以有空格,也可以没有,为了让自己写的东西更加直观,建议加上空格;

5) do 翻译过来就是: 我们要实现什么任务,目的; do 后面跟一个空格, 或者几个空格

6) cp 0.01 0.0$i -r

  • cp 0.01 把 0.01 这个文件夹复制成 0.0$i 文件夹;

  • $i 被替换成for后面变量 i 的值;

7) 复制完成后,后面跟着一个分号;

8) done 完成任务。

9)大家可以尝试着其他类似的命令: for i in XXX; do XXX ; done 比如:

1
for bigbro in {A..Z}; do echo bigbro is $bigbro ; done

这个例子只是为了说明:

  • for 后面的变量如果你用 i 表示,那么后面就用$i 来引用;
  • 如果用bigbro 来表示,后面则用$bigbro;
  • $和后面的变量之间(bigbro)没有空格。(你可以加上空格,看看有什么错误出现!)

思考下:

对于一个文件A,我们的目的是将A重命名为B。有下面2种操作可供选择:

第一种) mv A B

第二种) cp A B 然后 rm A

从结果上来说,这两种做法都是可以的。这里大师兄想告诉你的是:

i) 尽量找最简单的方法(第一种)实现所期望的目的;

ii) 如果不知道最简单的方法, 那么可以尝试其他方式来解决(第二种)。

小结:

通过本小节的学习:一方面我们熟悉文件(夹)创建,复制,移动以及重命名的linux命令:mkdir, mv, cp。另一方面,初步掌握for循环来实现批量处理的效果。请大家务必多加操练,以及完成扩展练习。至少图中的例子要练习一遍,能看懂什么意思。本节的for循环,我们只完成了一半的任务,每个文件夹中的INCAR还没有修改,下一节我们介绍另一个批量处理的方法来实现这个目的。

此外, linux的命令操作有很多的小技巧,大家一定要多多去网上搜集,加以练习,这对于提高工作效率非常有帮助。

基本的输入文件,指的是VASP计算必不可少的输入文件,对新手来说先记住这四个文件的名字:INCAR,KPOINTS,POSCAR,POTCAR。具体是干嘛用的?不懂的话不要紧,后面我们会结合例子,慢慢介绍这几个文件的准备工作。

基本概念

准备输入文件, 脑子里要有下面几个概念:

  • Rubbish in,Rubbish out! 程序只负责算,对错由你决定!错误主要有3类:

    • 模型错误:也就是建模这一块出错了,主要对应的是POSCAR;
    • 计算参数:INCAR,KPOINTS,POTCAR
    • 提交任务的脚本或者命令出错。
  • 遇到不懂的参数: (思考 + 看官网)! (思考 + 看官网)! (思考 + 看官网)!

  • 重要的话说三遍,尽量不要去看网上那些乱七八糟的教程。如果英语不好,那么这是一个锻炼你阅读能力的好机会。通过查阅官网解决问题,可以保证你的血统纯正,进而提高你的杀伤力。
  • 所有的输入文件都只是文本而已。这句话的意思是:所有的输入文件都可以通过文本编辑器打开,比如:
    • Linux下面可以用Vim
    • Windows下用Notepad++
    • 杜绝使用Windows自带的文本编辑器:记事本,写字板。
  • 所有的输入文本没有尾缀,Windows用户可能习惯了带各种各样尾缀的文件,但是vasp里面的输入文件,没有尾缀且都是文本。 比如你使用Notepad++这个文本编辑器写了一个输入文件,直接并保存成 INCAR就可以了。如果不小心保存成了 INCAR.txt,那么直接将尾缀.txt删除即可。
  • 再次强调:对于Windows用户,本书中指的文本编辑器是:Notepad++。免费的软件,大家自己下载并安装。 请不要用写字板,记事本等编辑VASP的输入文件。如果你不听话,还是喜欢用它们,那么:
    • 出错,自己负责,有时候你会死的很惨,折腾很久可能都找不到哪里出错了;
    • 出错,自己检查有没有在提交任务前运行:dos2linux 这个命令转换下格式
  • 一步一步按照本书的练习进行操作,有问题,先记下来,如果后面没有得到解答,去《序言》找联系方式咨询大师兄。

VASP输入和输出文件

  • 有了上面的概念,我们就可以准备输入文件了。下面是官网列出VASP的输入和输出文件,in 代表输入,out代表输出。先声明一下:大家不要被下面这么多文件吓傻了,脑子里有个印象就行,很多文件可能穷奇你一生的计算都用不到,而且你以后会花很多时间在删这些乱七八糟的文件上面。对于新手的话,大家先简单过目一下即可。可以理解为,从未开过车的你,一下子钻到车里,首先要做的就是熟悉车内部的环境,具体什么功能、怎么回事,后面慢慢摸索。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    INCAR      in    **
    STOPCAR in
    stout out
    POTCAR in **
    KPOINTS in **
    IBZKPT out
    POSCAR in **
    CONTCAR out
    CHGCAR in/out
    CHG out
    WAVECAR in/out
    TMPCAR in/out
    EIGENVAL out
    DOSCAR out
    PROCAR out
    OSZICAR out
    PCDAT out
    XDATCAR out
    LOCPOT out
    ELFCAR out
    PROOUT out
  • 对于VASP计算来说,前面这一大堆中的 INCAR , KPOINTS, POSCAR 和POTCAR 是必不可少的输入文件,必须有!

    • INCAR 告诉VASP算什么,怎么算。
    • KPOINTS 包含计算的K点信息(K点是什么,这个问题很抽象,脑子里先记住,计算的时候必须有这个东西)。
    • POSCAR是计算模型结构的文字描述,也就是各个原子在xyz方向的坐标信息。
    • POTCAR对应的是计算过程中每个原子的平面波基组,描述体系中对应的原子核和电子的相关信息。
    • 提交任务的脚本或者命令,需要你自己准备,没有在列表里面。

注意

最新版的VASP中可以在INCAR中设置KPOINTS。但在涉及到计算能带的特殊K点时候,INCAR中就不可以直接设置了。所以,在本书中,KPOINTS是认为必须有的。请不要再纠结这个问题,也不要专门找我争论这个问题。如果你认为可以没有,那就是可以没有。至少本书中,我们会介绍KPOINTS文件的准备工作。

这一节,我们主要通过VASP官网中O原子的计算实例,来学习INCAR的文件准备工作。记住前面我们说的话,INCAR是纯文本。Windows用户,不要用记事本或者写字板打开。推荐使用Notepad++

简单说明

INCAR主要是告诉VASP我们要算什么以及计算的细节,INCAR准备的原则是:越简单越好不知道的,不理解的就不往里面放。 下面是给新手们的一些建议:

  • INCAR 中有很多参数,改变参数来控制计算细节,从而得到我们期望的结果。所以,记住:Rubbish in, Rubbish out。自己算什么,心里要有数。

  • 网上很多人发INCAR的教程,列了一堆参数进去,甚至长达两页,有些连默认值也放在里面了,恨不得把所有参数全部放进去。不过,请记住:那些令人眼花缭乱的只是唬人装逼用的,在实际计算中会严重拖你的后腿,占了那么多行,修改起来也费劲。

  • 熟知各个参数的数值意义,以及在不同计算任务中的设置至关重要。

  • 有人会说,那么多参数,怎么能记得过来? 放心,完全可以的。

    • 一方面,对于特定的体系,所需要的参数不同。如果你的课题比较稳定,那么你应该不会接触太多的参数。比如你专注于体系的能带结构,那么算过渡态的参数你就不会需要。

    • 另一方面,这些计算参数又不是一天两天能记住的,是一个长期积累的过程。随着时间的增长和个人经验的增加,自然而然地就记住了。

INCAR 的输入工作

打开编辑器,把下面几行挨个输入进去: (#以及后面的就不要输入了)

1
2
3
SYSTEM = O atom       # 氧元素符号,不是零!
ISMEAR = 0 # 是零,不是氧元素符号,对于分子或者原子,用0.
SIGMA = 0.01 # 对于分子或者原子,用0.01

INCAR的注意事项:

  • #后面写的是汉语,是给大家展示用的。 大家在写INCAR的时候,最好不要把汉语写进去,有可能会出错!
  • #号后面的内容对计算不会造成影响,主要作为注释用,解释这个参数干嘛用的,可以不用输入;

  • 每个参数后面跟着等号 =

  • 等号(=)前后可以有空格,也可以没有。ISMEAR=0ISMEAR = 0 是一样的,

  • 写INCAR的时候,不要使用 tab,用空格替换tab;

  • 官网有些旧的文件可能用的不是 # 号,而是 !, ! 可能会出错。最好的办法就是记住参数是干嘛用的,# 和 ! 都不写。

INCAR的详解

SYSTEM

SYSTEM 后面是该计算的说明。你的这个任务算的是什么,目的是什么,体系是什么?等等,这些都可以随便写在里面,随便的意思就是可以任意写。

  • SYSTEM = O atom 和 SYSTEM = I LOVE BigBro 和 SYSTEM = VASP, 除了多出几个字符外,对计算没有什么影响。
  • 情诗,骂人的话也可以写在 = 后面。但不建议大家在这一行里写一堆乱七八糟的东西,另外还是得避免把中文写在这里;
  • 当然,这一行有或者没有,对计算结果不会有任何影响,看着不爽也可以直接删除。

ISMEAR

ISMEAR这一项,目前需要记住的是:

  • 1)不同的值对应的是不同的展宽方法
  • 2)对于分子,原子的计算用0

下面是VASP官网的一些解释,新手暂时看不懂不要紧,把需要记住的这两条死死记住就可以了。

  • 对于半导体和绝缘体体系,ISMEAR的值取绝对不能大于0, 一般用0;
  • 对所有体系,如果想获取更加精确能量的时候用-5,但这时候如果K点数目小于3,程序则会罢工;
  • K 点少,半导体或者绝缘体,那么只能用 ISMEAR = 0;
  • 在DOS能带计算中,使用ISMEAR= -5 用于获取精确的信息。
  • 对于金属来说,ISMEAR的取值一般为>=0 的数值(0,1,2);
  • 保守地说,ISMEAR = 0 (Gaussian Smearing) 可以满足大部分的体系(金属,导体,半导体,分子);
  • 如果不知道怎么取ISMEAR,直接用0是一个很保险的做法。也可以测试不同的值对计算的影响,但是新手的话,即使测试完了,也不知道根据什么去判断对结果的影响。

SIGMA:

SIGMA的取值和ISMEAR息息相关,也就是和ISMEAR这个参数同时出现,设定。下面是一些基本的介绍:

  • 如果用了ISMEAR = -5; SIGMA的值可以忽略,也可以不管。(对于所有体系都适用);

  • 对于金属: ISMEAR = 1 或者0,非金属: ISMEAR= 0 的时候,一般取 SIGMA = 0.10 即可,默认值是0.20。不放心的话,用0.05。

  • 对于气体分子,原子体系(也就是你把分子或者原子放到一个box里面):死死记住下面组合就可以了, ISMEAR = 0; SIGMA = 0.01。

不过很多人都不放心,为了保险想测试一番。标准是: SIGMA的取值要保证OUTCAR 中的 entropy T*S 这一项,平均到每个原子上,要小于 1-2 meV。检查的时候可以用这个命令:

1
grep 'entropy T'  OUTCAR 

注意1:这里有两个单引号,不要输入的时候漏掉。

用这个命令,得出的能量除以体系中原子的数目(也就是平均到每个原子上),然后再和 0.001 eV 比较。如果小于,SIGMA取值OK,如果大于,再换个小点的数值进行测试。

注意2:这里的说的entropy,是因为ISMEAR展宽这个计算方法引入的,跟我们物理化学书里面的entropy完全是两码事。后面我们会介绍如何通过频率分析计算物理化学里面的Entropy。千万别把这个数值当成频率所对应的entropy。

INCAR的保存

输入完上面的几行,我们就可以保存INCAR文件了。这里需要注意的是:INCAR后面没有尾缀,所以:INCAR.txt是错误的。为避免这个问题:

  • Notepad++ 保存的时候,文件名为: INCAR,保存类型选择 Alltypes (.)。

  • 用Vim的筒子们直接将前面的内容保存成INCAR即可。

  • 将INCAR.txt 通过mv命令重命名为INCAR。

    1
    mv INCAR.txt INCAR -f

前面说了很多,对新手,可能会犯晕。不过不用担心,只要记住关键三点,我们就圆满完成本节的任务

  • INCAR是纯文本没有尾缀;

  • 算原子或者分子时:ISMEAR = 0, SIGMA = 0.01

  • Windows用户请使用Notepad++作为文本编辑器,不要使用自带的记事本或者写字板,如果使用了,计算前务必要通过dos2unix转换一下格式:

    1
    dos2unix INCAR 

上一节,我们学习了INCAR的简单准备工作。这一节,我们学习另外一个输入文件的写法:KPOINTS

简单说明

KPOINTS文件在计算中的作用,一方面决定了计算的精度,同时也影响计算所需要的时间。精度高,时间长,精度低,时间短。所以:合理设置KPOINTS文件,可以保证我们使用最少的时间,来获取准确可靠的结果。

KPOINTS的输入和保存

打开编辑器,把下面几行输入进去:

1
2
3
4
5
K-POINTS      #  第一行随便写都行,但不能没有
0 # 零,格子自动生成
Gamma # gamma点centered
1 1 1 # 1*1*1格子
0 0 0 # S1 S2 S3, 一般保持 0 0 0 不变。

详解:

  • 该KPOINTS 文件里面,共有5行,#号以及后面的不用输入;

  • 同INCAR的注释一样,不要在每一行后面使用 ! 来进行注释,要使用 #,且最好不要写中文。

  • 第一行:可以随便写内容,但不能没有;

  • 第二行:数字0,不是字母O,0 在这里表示的是自动生成K点。你可能注意到了,0前面有个空格,不过没关系,对计算不影响,可以删掉,也可以再加一个空格,后面的同样如此。 但是避免用tab输入,VASP有时候不识别tab键输入的空白部分,导致计算出错;

  • 第三行:VASP只认第一个字母,大小写均可。在这里Gamma和gamma,Gorge,gorge效果是一样的,当然这一行也可以直接写字母G或者g。

    • G表示的是以gamma点为中心生成网格。
    • 另外一种是原始的Monkhorst-Pack 网格,两者的区别是 M 或者 m 在 G的基础上在三个方向上平移了1/(2N)个单位。
    • G,也叫 gamma centered Monkhorst-Pack Grid;所以,gamma centered 只是MP网格的一种特殊情况。
  • 第四行,在xyz三个方向上生成对应数目的K点,本例是111;

    • 对于原子或者分子的计算,K点取一个gamma点就够了(1 1 1),也就是这个KPOINTS文件可以用于绝大多数的原子或者分子计算,不用再修改;
    • 但如果你要用ISMEAR = -5 来计算能量,那么就需要把 1 1 1 改成 2 2 2或者3 3 3。
  • 第五行,一般都写成 0 0 0 ,不用动即可;

  • 按照前面INCAR的方式保存文件,名字为KPOINTS。

KPOINTS的建议

K点在VASP计算中非常重要,大师兄给的一个建议是:

  • 一直用gamma centered,也就是第三行保持G不变。因为M平移之后,网格的对称性和晶胞的对称性会出现不匹配的情况,从而导致计算出错,尤其是对于六角晶系hexagonal的结构,必须用gamma centered!这一点,vasp官网说的很明确;其他的建议后续慢慢展开讨论。

  • 如非六角晶系的计算,如果已经设置的M算起来了,继续用M算就行,没必要改成G再重新算一遍;

  • 前面看不懂,没事。记住这一点,本节就圆满完成任务:气体分子,原子计算的时候,使用gamma点即可。

这一节,我们学习VASP计算中模型的文件:POSCAR

简单说明

POSCAR 里面包含了你要进行计算的模型结构信息。也就是你要研究的对象。POSCAR有自己固定的格式,每一行都有特定的含义,认真掌握这些,对于搭建模型非常有帮助。对于本节的例子:O原子的计算中,我们要把O原子放到一个格子里面,格子大小为:8 $\times$ 8 $\times$ 8 $\AA{^3}$。那么POSCAR应该这样写。

POSCAR的输入

1
2
3
4
5
6
7
8
9
O atom in a box 
1.0 # universal scaling parameters
8.0 0.0 0.0 # lattice vector a(1)
0.0 8.0 0.0 # lattice vector a(2)
0.0 0.0 8.0 # lattice vector a(3)
O # O element, not zero
1 # number of atoms
Cartesian # positions in cartesian coordinates
0 0 0 #

详解:

  • 第一行:同样随便写,但不能不写;

  • 第二行:Scale factor,称为缩放系数,这里是1.0;

  • 第三到五行:是组成格子的三条边的坐标信息;从原点出发,在xyz轴上分别取8$\AA$。这个很容易理解;

  • 第六行:体系中的元素,这里我们算的是氧原子,所以写:O,即氧的元素符号。需要注意的有以下几点:

    • vasp4.xx版本里面没有这一行,不过现在几乎没人用4.X的版本了;
    • O的符号和数字0容易混淆,一定要注意;
    • 第一个元素符号要顶格写,前面不要有空格,有可能会出错;
    • 如果计算文件夹里面,已经有与结构相一致的POTCAR,那么POSCAR里面即使删了这一行有不会影响计算,VASP会读取POTCAR中的元素信息,但输出文件CONTCAR中会把该行自动加上。(新手跳过)
  • 第七行:与第六行中元素相对应的原子数目,这里我们只有1个氧原子,所以写成1;

  • 第八行:体系中原子的坐标系,可以为笛卡尔坐标,也可以为分数坐标系。注意的有以下几点:

    • 这一行同KPOINTS的第三行一样,即只认第一个字母;
    • C或者c代表笛卡尔坐标, D或者d代表分数坐标系;
    • VASP输出文件CONTCAR里面采用的是分数坐标系。
  • 第九行:体系中原子的坐标信息。这里我们把O原子放到了原点(0.0 0.0 0.0)的位置,大家也可以随便放一个位置,比如:(4.0 5.0 6.0),(1.1 2.5 6.5)都是可以的。由于周期性的存在,不管你怎么放,相邻两个格子之间氧原子的距离都是一样的。

  • 写完之后,和INCAR,KPOINTS文件一样,直接保存成POSCAR即可。
两点说明
  • 第二行中的Scale factor还可以写成其他的数字,例如:写成2.0,则后面的格子以及原子坐标相关的数值都要除以2。一般来说,写成1.0即可,这样比较直观,清晰;

  • 笛卡尔和分数坐标系的区别是从原子的坐标行开始的(这个例子里面是第8行),即坐标前面的都保持完全一致。 也就是说,如果想从笛卡尔转换成分数坐标,我们只需将Cartesian改成Direct,然后修改后面的原子坐标,而Cartesian行前面的部分保持不变。

本节重点:

  • 学会写O原子在格子里面这个模型的POSCAR;
  • 知道每一行所代表的含义。

这一节,我们学习VASP计算中的赝势文件:POTCAR

简单说明

如果组里安装了VASP,则在某个目录下,一定会有对应的一套对应的赝势文件,本书默认大家已经知道去哪里找,不讨论从哪里下载POTCAR(小窍门:一般各个VASP相关的QQ群中,都会有打包的POTCAR文件)。在该目录下, 一般来说,会有LDA,PBE,和PW91这三个文件夹,主流的计算一般都是用PBE。当你进入PBE的文件夹后,就会找到各个元素所对应的POTCAR文件了。

POTCAR中各项的含义

POTCAR中有很多信息,对于大部分的参数,本人也是只认识字母,不知具体含义,所以只能介绍一下在实际计算中会用到的一些参数。我们用Fe的POTCAR中前面的几行作为一个例子,简单介绍一下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
PAW_PBE Fe 06Sep2000
8.00000000000000000
parameters from PSCTR are:
VRHFIN =Fe: d7 s1
LEXCH = PE
EATOM = 594.4687 eV, 43.6922 Ry

TITEL = PAW_PBE Fe 06Sep2000
LULTRA = F use ultrasoft PP ?
IUNSCR = 1 unscreen: 0-lin 1-nonlin 2-no
RPACOR = 2.000 partial core radius
POMASS = 55.847; ZVAL = 8.000 mass and valenz
RCORE = 2.300 outmost cutoff radius
RWIGS = 2.460; RWIGS = 1.302 wigner-seitz radius (au A)
ENMAX = 267.883; ENMIN = 200.912 eV
RCLOC = 1.701 cutoff for local pot
LCOR = T correct aug charges
LPAW = T paw PP
EAUG = 511.368
DEXC = -.022
RMAX = 2.817 core radius for proj-oper
RAUG = 1.300 factor for augmentation sphere
RDEP = 2.442 radius for radial grids
QCUT = -4.437; QGAM = 8.874 optimization parameters

依个人的学习经验,VRHFIN, LEXCH,TITEL,ZVAL,ENMAX是用到最多的几个参数。

  • VRHFIN 用来看元素的价电子排布,如果你元素周期表倒背如流,可以忽略这个参数;
  • LEXCH 表示这个POTCAR对应的是GGA-PBE泛函;如果INCAR中不设定泛函,则默认通过这个参数来设定。
  • TITEL 就不用说了,指的是哪个元素,以及POTCAR发布的时间;
  • ZVAL 指的是实际上POTCAR中价电子的数目,尤其是做Bader电荷分析的时候,极其重要。
  • ENMAX 代表默认的截断能。与INCAR中的ENCUT这个参数相关。

当然,如果你进入文件夹,使用ls命令后,会发现:即使对于同一个元素来说,也可能会有很多不同的情况。比如:

  • 与GW 计算的对应的POTCAR,则标注为:Fe_GW 这样。(GW计算本人没接触过,这里就没有办法继续下去了);
  • 根据价电子的处理方式,分成了诸如:Fe,Fe_pv,Fe_sv的这样的情况。v是valence的缩写。pv代表把内层的p电子作为价电子来处理。sv代表则是把更内层的s电子也作为价电子来处理。具体到自己体系中的元素,可以结合元素周期表,以及ZVAL关键词所对应的价电子数目,来进行推断。
  • 此时,我们就需要学习一个非常有用的Linux命令了: grep。 下面是我们使用grep命令,来获取所有与Fe相关POTCAR的价电子信息。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ ls Fe*
Fe:
POTCAR PSCTR

Fe_GW:
POTCAR PSCTR

Fe_pv:
POTCAR PSCTR

Fe_sv:
POTCAR PSCTR

Fe_sv_GW:
POTCAR PSCTR

$ grep ZVAL Fe*/POTCAR
Fe/POTCAR: POMASS = 55.847; ZVAL = 8.000 mass and valenz
Fe_GW/POTCAR: POMASS = 55.847; ZVAL = 8.000 mass and valenz
Fe_pv/POTCAR: POMASS = 55.847; ZVAL = 14.000 mass and valenz
Fe_sv/POTCAR: POMASS = 55.847; ZVAL = 16.000 mass and valenz
Fe_sv_GW/POTCAR: POMASS = 55.847; ZVAL = 16.000 mass and valenz
  • 还有把内层d轨道考虑到价电子层里面去的,比如:Ge_d。
  • 某些元素,还有一些以 _h, _s 结尾的,应该是 hard和soft的缩写。带h的POTCAR中截断能比普通的要高出很多。带s的截断能要小很多。这里我们就可以通过grep 结合 ENMAX来查看一下:
1
2
3
4
5
6
7
$ grep ENMAX Ge*/POTCAR
Ge/POTCAR: ENMAX = 173.807; ENMIN = 130.355 eV
Ge_d/POTCAR: ENMAX = 310.294; ENMIN = 232.720 eV
Ge_d_GW/POTCAR: ENMAX = 375.434; ENMIN = 281.576 eV
Ge_GW/POTCAR: ENMAX = 173.807; ENMIN = 130.355 eV
Ge_h/POTCAR: ENMAX = 410.425; ENMIN = 307.818 eV
Ge_sv_GW/POTCAR: ENMAX = 410.425; ENMIN = 307.818 eV

POTCAR的选择

既然对于同一个元素,存在那么多的POTCAR类型,计算的时候我们改怎么选择呢?这里大师兄只能给的建议是:如果没有特别的需求,直接采用VASP官网推荐的即可。参考链接:

https://cms.mpi.univie.ac.at/vasp/vasp/Recommended_PAW_potentials_DFT_calculations_using_vasp_5_2.html

我们在计算的时候,根据体系中的元素,将这些元素的POTCAR结合起来,组成一个新的POTCAR,这个结合的步骤,我们需要用到Linux的另一个命令:cat。比如VASP官网的例子,体系中含有Al, C,H三种元素。

1
cat ~/pot/Al/POTCAR ~/pot/C/POTCAR ~/pot/H/POTCAR >POTCAR

通过这一行命令就可以把Al,C,H各自的POTCAR结合在一起。OUTCAR中的元素顺序一定要和POSCAR保持一致,否则计算会出错,为了避免计算出错,还有一些高级的方法,这个在后面会慢慢讲解。

本节讲的是O原子的计算,官网推荐的氧原子POTCAR,默认的截断能是400,价层有6个原子。直接把O这个文件夹中的POTCAR直接复制到INCAR所在的目录即可。

POTCAR检查常用的Linux命令:

查看POTCAR中的元素:

1
grep  TIT POTCAR

查看POTCAR的截断能:

1
grep  ENMAX POTCAR

查看POTCAR中元素的价电子数目:

1
grep  ZVAL POTCAR

举一反三,只要找到了关键词,我们就可以通过grep命令来进行查看。

总结:

这一节,我们简单介绍了一下POTCAR中的内容,选取规则,以及通过grep命令和关键词进行查看。如果你能独立完成下面的几点,就圆满完成了本节的学习:

  • VRHFIN, LEXCH,TITEL,ZVAL,ENMAX 这几个参数的大体意思;
  • 初步了解:Fe_sv,Fe_pv, Ge_d, Ge_gw,C_s, C_h 这些标记的含义;
  • 查看VASP官网,了解VASP推荐的POTCAR;
  • 使用grep来获取POTCAR中有价值的信息。

通过本节(Ex01)的学习,大家初步了解VASP四个主要输入文件的是怎么制作的,一些简单参数的含义,以及每个文件所对应的格式和细节。本节我们分成了很多小节,每节内容都很多,但对新手来说,信息量可能有些大。但不需要一次性全部掌握,因为在后面的学习中,我们会逐渐深入。自己在课题进行的过程中,也会加深自己的理解。但书中要求掌握的部分,必须要牢牢记住。

本书的名字为:The Hard Way。意思是,学习VASP并不是一蹴而就的,需要一个长时间的积累过程。所以,新手切勿急躁,很多内容看不懂不要紧,务必要静下心来浏览一遍,自己跟着说明亲自去实践,切不可复制粘贴。 本节所讲解的东西,都务必去VASP官网找对应的说明,认真阅读,反复思考。养成潜心学习官网教程的良好习惯,从而远离网络上那些错误的信息。尤其是对于新手来说,很多都不懂的时候,没有自己的主见,别人一说就被牵着鼻子走了。

相关的参考资料:

  1. Vim使用练习:自己搜资料学习,百度里面很多,学会怎么输入,保存。
  2. VASP文件: http://cms.mpi.univie.ac.at/vasp/guide/node50.html

  3. INCAR: http://cms.mpi.univie.ac.at/vasp/guide/node91.html

  4. KPOINTS1: http://cms.mpi.univie.ac.at/vasp/guide/node55.html

  5. KPOINTS2: https://cms.mpi.univie.ac.at/vasp/vasp/Automatic_k_mesh_generation.html

  6. POSCAR1: http://cms.mpi.univie.ac.at/vasp/guide/node59.html
  7. POSCAR2: https://cms.mpi.univie.ac.at/vasp/vasp/POSCAR_file.html
  8. POTCAR1: http://cms.mpi.univie.ac.at/vasp/guide/node54.html
  9. POTCAR2: https://cms.mpi.univie.ac.at/vasp/vasp/Recommended_PAW_potentials_DFT_calculations_using_vasp_5_2.html
  10. ISMEAR1: http://cms.mpi.univie.ac.at/vasp/guide/node124.html
  11. ISMEAR2: http://cms.mpi.univie.ac.at/vasp/vasp/Number_k_points_method_smearing.html

大师兄网站不能登录的这几天时间,经过一番思考,下定决心给大家一个界面更简洁,阅读体验更好,内容更丰富的大师兄网。
虽然感觉时间上压力很大,但得到了很多筒子们的支持和帮助,这给了我继续写下去的动力。当然,最重要的还是老婆的支持。
在这里,向她(他)们表示深深的感谢。

为什么写本书?

使用人群

  • 此书主要针对于0-6个月的VASP初学者,VASP小白,或者刚刚转换计算方向(从VASP计算一个性质到另外一个性质时),以及某一部分计算细节生疏需要复习的科研工作者。直接列出来一堆求解薛定谔方程中的各个公式定理等,肯定会对初学者造成一定的误导,因此本书不讨论过多量子力学的基本原理。

  • 很多时候,由于对计算细节的不了解,且无人指导(导师啪啪啪打脸),不少人在计算了一个多月,或者更长时间后发现自己的参数设置错了,但是也不知道该怎么补救,从而走上了重算的这一条极其浪费时间,机时和精力的路。大师兄遇到过很多种类似的情况,周围的朋友遇到这种情况的也不在少数。更有甚者,课题做完了才发现是错的。 出现错误并不可怕,可怕的是我们不知道怎么补救,不长教训,后面还继续犯错。这也是本书的一个出发点,首先保证大家提交的任务准确无误,可以尽最大可能避免遇到前面类似的问题,进而起到间接节约时间的作用。在正确计算的同时,大家可以从头学习密度泛函理论,阅读相关课题的参考文献等。所以,本书旨在为初学者提供一个快速进入计算而又避免过多新手错误的方法。

不适宜人群

  • 导师是不做计算,让你独辟蹊径,单独挑起组里做计算的大梁;

国内做量化计算的人如雨后春笋般涌现出来,一批又一批,好多高校,学院都有老师开始主动尝试计算这个方向,很多做实验的老师也安排自己的学生”算一下”, 但这一部分人之前没有任何的计算功底或者经验,但仍然抱有一颗非常乐观的心态:计算无非就是操作软件的活,花几万块钱买台电脑,美其名曰计算!而到了真正计算的时候,乱七八糟的问题如瓢泼大雨般从天而降,从软件的安装,模型的搭建,计算参数的设置,计算结果的分析等等…..却又不知道如何解决,一来浪费了自己的时间和精力,二来浪费了计算资源(至少很多电费是白交了,服务器白磨损了….)。

出发点(一)

本书的一个出发点就是,本人在很多计算的QQ群里面,但是群里面很多问题都非常低级,令人费解,或者说是匪夷所思的,从最基本的建模都做不到,到计算结果不会分析等等。这些人简单而又低级的问题充斥在各个QQ群里。暂且不说这些人的导师有多么地不负责任。很多热心的人却在群里整天忙着应付这些问题,而对于自身,除了得到个活雷锋的标签外,对理论功底的提高,帮助甚微。可以说是花自己的时间替别人指导学生。不论群主给自己的群定位有多高,高级群,中级群,精英群等等,都避免不了这样的问题出现。本书主要通过实例引导大家主动思考去解决这些最基本的常见问题,进而避免因自己的低级问题浪费他人的时间。我说希望的是,对于求助或者应助的人,大家尽可能地讨论一些更高级,更深层次的科研问题,而不是浪费在这些低级的问题上。即使在新的计算中遇到了之前没有碰到过的小细节,自己也知道怎么去动脑子,主动解决。

出发点(二)

本人博士已经毕业,目前正在做博士后,早晚有一天会回到国内继续自己的研究生涯,也会有自己的学生,通过这本书把自己学到的东西保存下来,以便后面学生可以借此快速入门,虽然说磕磕碰碰是最好的学习方向,但我更希望自己的学生能从本书中领悟到解决问题的一些基本思维方式。学习计算化学的人,对解决科研问题都有着一种执着的态度,通过构建模型来阐明已知或者预测未知的结果。相对于做计算的科研工作者们,虽然我们没有实验技巧的提高,但我们可以通过训练自己的大脑来弥补。懂得思考的人永远站在社会发展的最前端。

出发点(三)

There are kinds of questions you will find yoursel asking and not knowing where to get quick answers from.

That’s what BigBro(a)s are trying to fix.

你会发现自己在问各种各样的问题,但不知道从哪里可以得到快速解答。这正是大师兄(姐)们正在尝试解决的问题:结合最基本的化学常识和软件计算细节,写一本最好的快速基本入门书。

如何学习本书(一)

如何学习本书,大师兄在学习程序时,受到learn_python_the_hard_way这本书的启发:务实是这本书的一大特色,开始学习语言,乱七八糟的先统统闭嘴,照着代码练习一番,然后再自己思考琢磨,出现问题拿自己的代码和作者代码比较找出原因。
通过系统地学习,随着水平的提高,再逐步解释前面未讲解的内容。这一种学习方法非常适合零基础的菜鸟,因为一开始太多的概念根本不可能一股脑儿全部接受。从简单入手,指导着循序渐进,最后达到精通。打算学Python的(推荐python3),强烈建议此书,当然也有很多其他极好的书籍,这里就不再过多介绍。

如何学习本书(二)

对于量化计算,本书也采用这样的思路,手把手先教会大家如何计算,如何避免错误。从最基本的计算开始,通过示例讲解,结合一些脚本的使用,引导大家思考解决自己的问题。因此,在这本书的学习过程里,每一章节会对应一个例子,大家务必手动搭建模型,输入文件(切忌复制粘贴),然后进行计算,得到和大师兄一致的结果。为了引导大家主动浏览官网解决问题,很多都会采用VASP官网的例子,大师兄会重新计算后放到章节里面,供大家对比参照。

  • VASP 官网目前国内不能直接打开,大家
  • 可以浏览pdf版本
  • 自行解决被墙的办法。

推荐参考书

  • Density functional theory:A practical introduction, by David Sholl.点击本文链接就可以跳转到百度网盘下载,不要从网上随便下载,很多都是阉割版的。
  • Vasp 官网
  • 其他参考书会在文中慢慢推荐,对新手来说,这本书+VASP手册完全足够了,不要贪多。

对读者的话

如果你感觉本书对你有所帮助,欢迎随意转发转载如,果你有自己的科研经验和心得,也欢迎分享给大家!
为保证本书的简洁性,一些与本书无关的东西,QQ群号,公众号,留言联系方式等只在序言里面出现:

  • 微信公众号: BigBroScience (大师兄科研网)
  • 大师兄QQ群:2674006510 进群1)看群公告,了解群里的基本要求 2)修改自己的群名片。
  • 微信群: 满100人了,所以加大师兄微信(BigBroSci)后才可应邀加入微信讨论群。
  • 咨询邮箱: lqcata@gmail.com

QQ群专注于科研思维的碰撞与科研生活的分享,本书中已经详细解释或者指明的易出错部分,不建议在群中继续咨询,请大家认真学习并主动积极地去思考和练习。此外,论坛或者QQ群里,有很多无知或者stupid的回复,处在迷糊之际的菜鸟由于对自己的不自信,会一股脑儿去相信别人错误的观点,进而一路错下去,这是最可怕的。所以,如果有疑问,可以先酝酿一两天,多多查阅资料,主动思考。然后再大胆提出来,改正就是进步。

title: Learn VASP The Hard Way (序言2)
categories:

  • LVASPTHW
    tags:
  • 序言
  • 如何学习VASP
    date: 2017-10-10 16:30:16

序言2: 如何学习VASP?

写在前头的话,虽然本书会教给你怎么样一步一步从单个原子,到气相分子,再到表面,以及后面的分子吸附,过渡态相关的计算。但为了避免很多小迷弟迷妹们过于依赖本书,偏离了大师兄写书的初衷。先强调一下VASP的学习方法:老板+1本参考书 + 2个网址

老板

当然指的是有自己的老板指导喽,大师兄刚读博士的时候,老板并没有直接给我课题组,也没有让我自学或者跟组里的其他人学习VASP,而是花了一个月的时间让我读完此书和亲自指导我练习,这种的传授方式,是国内很多不负责任的导师需要学习的。虽然我老板每天都很忙,所有刚刚加入我们组的博士,都是老师亲手指导出来的。如果你的老板没有时间,至少要给你个师姐或者师兄,这都没有的话,那么老板要喜欢给你出钱让你去交流学习。老板又不教你,又不给师兄师姐带你,又舍不得在你身上花钱,不出意外,你会活得很惨。

一本参考书:

Density Functional Theory: A Practical Introduction (David Sholl)

书的作者简历,有兴趣的可以去搜一搜。这本书对于初学者来说,很容易掌握计算的要领。而对于老手们来说,此书经常翻阅,定会不断提升你的计算水平和对计算的理解。我们举两个例子,请认真阅读里面的内容,并理解。

第一章开始,为了缓解大家对DFT的恐惧,举了一个理论计算与开车的关系:

(此开车非彼开车,老司机闭嘴,认真看,不许笑!)

你需要做的是如何正确地驾驶汽车,定期维护它,但你并不知道怎么去造一辆车; 类似地,你需要做的是如何正确地理论计算,避免常见的错误,但你不知道VASP程序是怎么写出来的。

例子2:关于收敛的解释:

第三章开始的部分,介绍了收敛在计算中的意义。Numerical Convergence 和Physical reality的联系: DFT计算收敛了不等于薛定谔方程求解了。而体系的性质是由薛定谔方程的解来确定的!所以DFT计算结果的物理或者化学意义才是最终要的。

DFT的求解的结果一定等于薛定谔方程的求解结果吗?VASP算出来的结果就一定是对的吗?其中的含义,大家自己去慢慢琢磨。

此外,网上的免费版本里面,很多公式符号不全。大师兄学习的时候深受其害:如图:

图中阉割版的箭头处都是空白,你不知道是正,是负,是乘还是除。所以,为避免这种情况对阅读造成理解上的困难,建议:

一个网址: VASP官网

学习VASP,最权威和丰富的资料参考就是官网啦。对于很多新手,手上的教程有一堆,从网上找的,师兄师姐传下来的。但那些都不如官网的例子和说明准确和直接。

1 VASP在线手册: http://cms.mpi.univie.ac.at/vasp/vasp/vasp.html

2 VASP Pdf 手册: http://cms.mpi.univie.ac.at/vasp/vasp.pdf

3 VASP wiki 入口: http://cms.mpi.univie.ac.at/wiki/index.php/The_VASP_Manual

4 VASP官网中实用的教程和参考文档。

老板亲自指导我学习VASP的时候,教程就是官网中的Handonsession 系列。(图中蓝色圈出来的部分)。每天让我重复教程里面的练习,提醒里面的易错部分,算什么性质需要注意什么参数,以及让我主动思考里面各个计算的含义。这一些东西在Learn-VASP-The-Hard-Way本书中都会讲到。在建议大家下载里面的内容,认真练习,学习。

注意:

新手也好,老司机也罢,不再建议去学习handonsession的例子,因为那是老掉牙的ppt了,最新的VASP官方workshop的ppt见下面链接:

http://cms.mpi.univie.ac.at/wiki/index.php/NERSC_Berkeley_2016

http://www.nersc.gov/users/training/events/3-day-vasp-workshop/ (另一个参考网址,里面附带了Youtube的workshop视频)

除了VASP官网的这些参考资料外,使用说明书是我们需要经常翻阅的。遇到不会的,不懂的,有疑问的参数,请尽情的翻阅VASP官网吧。这里推荐VASP的Wiki网址。(请务必收藏本网址)

https://cms.mpi.univie.ac.at/wiki/index.php/The_VASP_Manual

如图:

1:查询参数含义,设置的时候,进行搜索;

2:新手们从这里点击开始;

3:VASP的计算实例,大家可以参考里面的说明计算自己的体系性质;

4:INCAR的参数列表,大家没事多多点击里面的各个参数;查看含义;

5:再下面就是一些理论背景知识了,建议系统学习DFT的相关书籍,Wiki中的内容有限,只能作为参考。

第二个网址

VASP的官方论坛。http://cms.mpi.univie.ac.at/vasp-forum/forum.php

如果你在计算中,遇到什么错误的信息,99%都可以在这里找到答案。

总结

本书的初衷是引导大家去主动学习VASP,而不是教会大家VASP,而本节提到的参考书和官网则是新手们学习VASP最简单有效的途径。当然,还有很多有宝贵的参考书籍供大家阅读。如果你是新手的话,能把本节推荐的书啃完,再结合官网的计算一些示例练习,就足够了。如果你能坚持认认真真练习,主动重复网站的例子,认真思考,那么你的计算水平会得到极大的提升。

天河二号(吕梁超算)提交VASP作业的脚本和命令


上一节我们讲了怎么连接天河2号超算中心。这一节,我们主要讲一下VASP提交任务的脚本和命令。在天河2号提交任务非常简单,大家只要记住:一个脚本一个命令就可以了。首先我们看一下提交任务的实例:

1
2
3
4
5
6
7
8
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex_a09$ ls
INCAR job_sub KPOINTS POSCAR POTCAR
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex_a09$ yhbatch -p gsc -N 1 -J test job_sub
Submitted batch job 1028912
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex_a09$ yhq
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
1028912 gsc test iciq-lq PD 0:00 1 (None)

上图中:

1) job_sub 是提交任务的脚本,内容如下:

1
2
3
#!/bin/bash
export LD_LIBRARY_PATH=/THFS/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64:$LD_LIBRARY_PATH
yhrun -p gsc -n 24 /THFS/opt/vasp/5.4.4/vasp.5.4.4/bin/vasp_std

2) 提交任务的命令:

1
yhbatch -p gsc -N 1 -J test job_sub

-p gsc 是指定提交任务的队列

-N 1 是提交任务的节点数(每个节点24核)

-J test 是提交任务的名字,这里我们给任务起的名字是:test。

4)如果你想用2个节点,提交一个名为 bigbro的任务,可以使用下面的命令:

1
yhbatch -p gsc -N 2 -J bigbro job_sub

不同版本的任务提交

当然,超算中心上上面也安装了不同的VASP版本,5.3,5.4以及用于过渡态计算的VTST系列版本。如果我们使用编译了VTST的5.4.4版本提交一个过渡态的任务。需要做的有2点:

1) 找到编译了VTST的5.4.4版本的VASP安装目录。在天河2号,所有的软件都装在 /THFS/opt 这个目录下。Vasp也不例外,如果你进入这个目录,就会发现它。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
iciq-lq@ln3:/THFS/home/iciq-lq/LVASPTHW/ex78/step2$ cd /THFS/opt/
iciq-lq@ln3:/THFS/opt$ cd vasp/
iciq-lq@ln3:/THFS/opt/vasp$ ls
5.2 5.3.5 5.3.5_neb 5.3.5-wannier90-2.0 5.4.1_neb .... 5.4.1_sol_vtst 5.4.4_neb ....
iciq-lq@ln3:/THFS/opt/vasp$ cd 5.4.4_neb/
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb$ ls
vasp.5.4.4 vasp.5.lib vtstcode-174 vtstcode.gz vtstscripts-933 vtstscripts.gz
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb$ cd vasp.5.4.4/
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb/vasp.5.4.4$ ls
arch bin build makefile makefile.include README src
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb/vasp.5.4.4$ cd bin/
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb/vasp.5.4.4/bin$ ls
vasp_gam vasp_ncl vasp_std
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb/vasp.5.4.4/bin$ pwd
/THFS/opt/vasp/5.4.4_neb/vasp.5.4.4/bin
iciq-lq@ln3:/THFS/opt/vasp/5.4.4_neb/vasp.5.4.4/bin$

一路追踪,直至找到安装目录中bin文件夹下面的vasp_std可执行程序(一般是绿色的)。使用pwd命令得到当前的路径。

2) 修改提交任务脚本的最后一行:

1
2
3
4
#!/bin/bash
export LD_LIBRARY_PATH=/THFS/opt/intel/composer_xe_2013_sp1.3.174/mkl/lib/intel64:$LD_LIBRARY_PATH
yhrun -p gsc -n 24 /THFS/opt/vasp/5.4.4_neb/vasp.5.4.4/bin/vasp_std

将之前的目录,替换成刚刚通过pwd命令输出的内容。记得在目录后面加上vasp_std 表示你要运行这个目录下的vasp_std文件。

小结

到此为止,连接VPN,天河2号,挂载服务器到本地电脑,互传文件,以及使用脚本提交vasp任务。你已经都掌握了。后面的就是好好利用超算中心,得到自己所期望的数据,好好搞科研了。如果想试用超算中心,加下方的QQ群,或者直接联系超算中心即可。


超算中心试用联系方式:lvlianghpc01@163.com

联系电话(微信):15383480556 18903588277

感谢吕梁超算中心的支持,以后VASP的学习系列练习,都将在天河二号上面进行展示操作。一方面帮助大家继续学习VASP知识,另一方面也帮助大家快速掌握使用超算中心计算的技巧,进而避免一些焦头烂额的琐事。今天我们先讲解一下怎么在Ubuntu系统上,1)安装VPN, 2)连接天河二号超算中心,3)以及将超算中心挂载到本地电脑上,进行文件互传。

如果你是Windows用户,管理员在发送账号的时候,已经将使用说明一起发给你了。相信大家都可以顺利链接。那么请跳过本节内容。

但是Linux系统在计算具有的独特优势是Windows所不能比的,建议Windows用户继续看下去,对以后使用Linux系统做计算会有帮助。下一节,我们介绍如何使用脚本运行VASP软件,由于本人还在摸索,需要和管理沟通学习,大家再耐心等待一天。如果你想要试用或者申请超算中心的机时,请加QQ群:国防科大吕梁超算中心(204521798)了解更多的信息。


1 下载Linux版的VPN软件:

链接:https://www.hillstonenet.com/our-products/next-gen-firewalls-e-series/

直接跳到网页最底部,右侧点击 Linux OS 下载。注意:这个VPN不支持Ubuntu17 和 18的版本。


2 安装Linux 版VPN

Hillstone 官网已经给出了详细的安装说明, 链接如下:

http://docs.hillstonenet.com/en/Content/7_VPN/SSL_VPN_Client_L.htm#Starting

大家可以参考链接,也可以根据下面的步骤进行。本人直接将官网的照片复制过来了。

找到刚才下载的vpn软件: 右击 —> 点击最底部的Properties


在弹出的窗口中,将Execute的那个框选中,然后点击左上角的叉号直接关闭。、

双击这个软件的图标,一步一步点下去,这样就完成安装啦,同时桌面上会生成VPN的快捷方式图标。


3 连接VPN

1) 打开VPN:双击桌面的VPN图标,会弹出让你输入电脑密码的对话框,输入密码,点击Authenticate按钮。

2) 点击下图中的New 对应的加号,会弹出对话框,让你输入IP,账号密码

注意:

  • Name, Description 这两项随便填。

  • Host的IP超算中心给了三个,大家根据自己的网进行选择,如果一个不行,换另一个试试即可。

  • Port 就是 4433

  • User name和Password是VPN的账号和密码!!!

  • 一定要选中Remember Password. 因为管理员给的密码实在是太安全了,Linux的VPN不能修改密码。如果嫌密码麻烦,可以在Windows连接成功后,修改VPN的密码。

4) 点击OK就开始连接了

5) vpn的官网的填写说明,大家把网页中的第三条展开就可以看到了

6) 连接过程以及成功是这个样子:


4 通过ssh连接超算中心服务器:

VPN登录成功后,后面我们就可以通过Terminal连接超算中心了。为了方便,提高效率,强烈建议大家按照下面的步骤进行:

1) 安装sshfs

这个用于把超算中心挂载到你的本地电脑上,后面再细说,先安装好。可以命令行一键搞定。

1
sudo apt-get install sshfs

2) 在home目录下建一个文件夹,名字为: lvliang

1
mkdir ~/lvliang

3) 将下面的内容加入到 .bashrc 文件中,将下面代码中的172.16.20.XX 换成超算管理员发给你的IP地址。

1
2
3
4
####lvliang###
alias lvliang='ssh iciq-lq@172.16.20.XX'
alias mlvliang='sshfs iciq-lq@172.16.20.XX: ~/lvliang/'
alias ulvliang="sudo umount ~/lvliang -l"
  • lvliang 这个命令用来连接超算中心,提交任务,运行命令处理任务等
  • mlvliang 用来挂载超算中心到你的电脑上,相当于把超算中心看作成一个移动硬盘
  • ulvliang 用来卸载超算中心。

4) 保存后,更新下 .bashrc 文件,然后直接敲命令: lvliang 即可连接超算中心。

第一次连接,可能会出来一堆提示东西,输入Yes ,回车即可。

输入自己的超算中心账号密码,就可以登录啦。

1
2
3
4
qli@bigbro:~$ . .bashrc 
qli@bigbro:~$ lvliang
iciq-lq@172.16.20.10's password:
Last login: Tue Dec 4 18:22:59 2018 from 172.16.31.135

5)新用户刚开始的时候主目录下面什么都没有,强烈建议大家建一个 bin 文件夹,用来存放脚本。直接 mkdir ~/bin 即可。


5 上传或者下载数据(sshfs的使用)

1) 挂载超算中心到自己的本地电脑。

打开一个新的终端,

  • 输入前面我们写进.bashrc文件中的命令: mlvliang (m是mount的缩写)。
  • 输入超算中心的密码:
1
2
3
4
5
6
qli@bigbro:~$ mlvliang 
iciq-lq@172.16.20.10's password:
qli@bigbro:~$ cd lvliang/
qli@bigbro:~/lvliang$ ls
bin LVASPTHW POTCAR test_jobs
qli@bigbro:~/lvliang$

现在超算中心就成功被挂载到我们电脑上了,我们可以随时进入并访问超算中的文件夹,通过cp、mv、rsync等命令往里面传数据,或者下载数据到本地的电脑。


2) 例子1 :

挂载超算中心登录后,我们将Ex01的文件下载(通过cp命令)到本地电脑桌面上。

1
2
3
4
5
6
7
8
qli@bigbro:~/lvliang$ ls
bin LVASPTHW POTCAR test_jobs
qli@bigbro:~/lvliang$ cd LVASPTHW/
qli@bigbro:~/lvliang/LVASPTHW$ ls
ex01 ex02 ex03 ex04 ex05 ex06 ex07 ex08 ex09 ex10 ex11 ex12 ex13 ex14 ex15 ex74 ex77 ex78 potcar
qli@bigbro:~/lvliang/LVASPTHW$ cp ex01 ~/Desktop/
qli@bigbro:~/lvliang/LVASPTHW$ ls ~/Desktop/ex01/
INCAR KPOINTS POSCAR POTCAR

3) 例子2 :

我们将电脑桌面的ex16文件夹上传(通过cp命令)到超算中。

1
2
3
4
5
6
qli@bigbro:~/lvliang/LVASPTHW$ ls
ex01 ex02 ex03 ex04 ex05 ex06 ex07 ex08 ex09 ex10 ex11 ex12 ex13 ex14 ex15 ex74 ex77 ex78 potcar
qli@bigbro:~/lvliang/LVASPTHW$ cp ~/Desktop/ex16 .
qli@bigbro:~/lvliang/LVASPTHW$ ls
ex01 ex02 ex03 ex04 ex05 ex06 ex07 ex08 ex09 ex10 ex11 ex12 ex13 ex14 ex15 ex16 ex74 ex77 ex78 potcar
qli@bigbro:~/lvliang/LVASPTHW$

4) 注意事项:

1) 必须通过mlvliang这个命令将超算中心挂载到本地电脑上之后,我们才可以互传文件。

2) 如果还没有挂载,就将电脑的内容复制到lvliang这个文件夹中,那么挂载之后,服务器中不会显示刚刚复制的内容

3) 不要用鼠标点击电脑里面的文件夹查看文件,这样会很慢,只能使用命令!!!切记!!

4) 卸载的时候,使用mlvliang 这个命令,然后输入自己的电脑密码(不是超算中心的了。)

5) 我们这样做,相当于把超算中心当做一个移动硬盘来使用,非常方便。

6 异常问题的处理

1)挂载超算中心到本地电脑上的时候,有时候因为网络连接,会出现下图中的错误。这时候我们先使用ulvliang命令把超算中心卸载掉,然后再重新挂载就可以了。

2) 如果上面还解决不了的话,可以尝试着先关机,出去溜达一会儿,然后回来再弄。或者找超算管理员解决。他们一般都很上心,服务响应很快。

小结

本节就先介绍到这里,大家可以通过这样的方式,安装VPN,连接以及挂载超算中心,并将自己的文件上传到超算中心(比如VASP的那一堆POTCAR文件,自己的脚本,任务文件等等)。先把准备工作做好,下一节我们就可以提交任务进行计算了。

本节我们Bader电荷分析的常见问题做个总结。

VTST的网站

Henkelman 课题组主页:

http://theory.cm.utexas.edu/henkelman/

Bader计算的链接:

http://theory.cm.utexas.edu/henkelman/code/bader/

VTST脚本链接:

http://theory.cm.utexas.edu/vtsttools/

常见问题:

电荷数字保留位数:

Bader电荷分析只是定性的辅助工具,得到的结果肯定也是定性的。大致分析原子上的带电情况即可,不要去较真小数点后多少位,一般来说小数点后两位就足够了。

ACF.dat 文件怎么看?

ACF.dat 中的CHARGE那一列,对应的是每个原子上总的价电子数目。

划重点: 1)总的 2)价电子数目

如何判断原子的带电情况?

你需要用CHARGE那列的数值去减去该原子对应的POTCAR中的价电子数目。

怎么才能得到POTCAR中原子的价电子数目呢?

打开POTCAR,查找关键词:ZVAL,后面对应的就是价电子数目,更方便点:

grep ZVAL POTCAR

划重点:不要以为自己元素周期表倒背如流就可以随便设定原子的价电子数目。

POTCAR中原子的价电子数目有些和周期表是一样的,比如H。

有些差别是很大的。比如:Europium [Xe]4f76s2, Lanshipunvboshanyougatedihuoerdiuyilu 中的you。

You有9个价电子,但POTCAR中有17个。

减完之后怎么分析?

如果一个原子POTCAR中的电子数为5.

1) ACF.dat中该原子对应的CHARGE为6.2,6.2 - 5 = 1.2, 这说明该原子得到了1.2个电子。虽然是+1.2,但它的化合价是-1.2价。

2) ACF.dat中该原子对应的CHARGE 为 4.3, 4.3 – 5 = -0.7, 说明该原子失去了0.7个电子,虽然是负值,但它的化合价是 + 0.7 价。

注意:这里我们说的化合价,是基于Bader电荷分析得到的。由于Bader电荷分析是一个经验性的定性分析工具,这些化合价的值只能用来参考判断体系中电子的转移情况。

大家千万不要把这里的化合价跟我们中学所学到的化合价的概念混淆了。因为大部分的情况下,Bader电荷分析出来的化合价与我们在教科书里面所学到的化合价还是有区别的。


师兄,前面扯了那多么,直接用POTCAR中的价电子数减去CHARGE对应的不就更直接了?

是的,你很聪明:对应前面的例子:

  • 1) 5 –6.2 = -1.2 说明该原子是-1.2价,得到了1.2个电子,

  • 2) 5 - 4.3 = 0.7 说明该原子是 +0.7 价,失去了0.7个电子。

所以得失电子和化学价是反着的。这点你能把握住,就会分析了。

总结:

Bader电荷分析并不神秘,你需要做的有两点:

1) 去看VTST的官网,知道怎么去算;
2) 怎么通过得失电子判断原子的带电情况。ACF.dat中的CHARGE列,以及POTCAR中的价电子数。

最近,群里有人在问Bader电荷分析的问题,在这里,将Bader分析的基本流程,以及本人写的一个后处理的脚本分享一下,希望大家不要再纠缠这个问题了。大家务必认真浏览参考网址的内容。http://theory.cm.utexas.edu/henkelman/code/bader/

计算流程

优化自己的体系结构:

使用VASP计算,获得稳定的结构,过程略过。

Bader电荷分析的计算部分:

1) 将前面优化完的CONTCAR 重命名为POSCAR

2) 设置INCAR:

1
2
3
4
LAECHG=.TRUE. 
LCHARG = .TRUE.
NSW = 0
IBRION = -1 ## 前面有了NSW = 0, 这个也可以不设置

3) KPOINTS可以用之前优化计算的,也可设置的稍微大些。

4) WAVECARCHGCAR等有的话就读一下(在第二步加上读它们的相关参数)。没有的话就不读了,这个无关紧要,不要纠结。但是,如果你的体系很难收敛的时候,建议保留上一步的WAVECAR以便节省计算时间,如果没有的话电子步数适当增加(NELM=200) 。

获取VTST的脚本

1)下载网址:

2)将前面下载的内容解压,然后复制到~/bin 文件夹中。

3)如果后面运行的时候遇到权限问题:执行:

chmod u+x ~/bin/chgsum.pl

chmod u+x ~/bin/bader

使用VTST的脚本处理结果

1) 进入计算的目录下面

2) chgsum.pl AECCAR0 AECCAR2

注意: AECCAR0AECCAR2 是由LAECHG=.TRUE.这个参数控制输出的。如果你计算没有得到这两个文件,仔细检查一下这个参数。

运行这个命令:你会得到类似这样的输出结果:

结束后,你会得到 CHGCAR_sum 这个文件。

3) bader CHGCAR -ref CHGCAR_sum

注意:

i) 图中大师兄不小心把CHGCAR删掉了…所以没办法呈现完整的流程。放图上去只是想告诉大家,命令是正确的。ii) 如果你在服务器上运行,得到了这样的错误。

1
2
FATAL:kernel too old
Segmentationfault

那么,你需要将计算复制到本地电脑上(由于CHGCAR等文件很大,该过程比较蛋疼,需要忍一会儿),然后用自己的电脑运行这个命令。(前提是电脑有Linux系统,没有的话,我也没办法。)

iii) 命令结束后,你会得到一些相应输出的文件:ACF.dat, BCF.dat, AVF.dat…

iv) 本人一般查看的是ACF.dat文件:(以SiH$_4$为例)

如下图:

ACF.dat文件中,第一列的数字对应的是POSCAR中的原子顺序。

每个原子的电荷对应的是CHARGE那一列。注意,该列中的电荷是该原子价层电子中的电子总数。如果你想要知道这个原子是带正电或者负电荷,需要减去POTCAR中的电子数目。

图中Si为第一个原子:有1.58个电子 ,减去POTCAR中的4,为 -2.42。

这表明Si失去了电子。2.42个电子分别转移到了4个H上面。

每个H有 个电子。(对比下4个H中的电子)

得到任意原子的电荷信息

如果你对自己体系中的某一个或者某些特定的原子感兴趣,又不想每次打开ACF.dat文件或者已经导出来的excel文件。那么可以通过使用下面这个脚本提取相关的电荷信息。

1) 脚本运行命令如下图:get-charge.py Natom Natom 是你感兴趣的原子序数

注意:

A) 目前只支持一个,如果想查看多个,可以运行该命令若干次,或者使用一个for 循环即可:

1
for i in 1 2 3 4 5 ; do get-charge.py $i ; done 

B) 使用该命令前,请务必确认自己所关注的原子在POSCAR中的序数,如果不知道,可以通过p4vasp查看。

2) 脚本内容如下:

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
#!/usr/bin/env python
import sys

script, Natom = sys.argv

# Natom is the atom number when run ths script
# Convert Natom into integer

Natom = int(Natom)

# Creat an empty list
charge_list = []

# read ACF.dat file and add all lines with charges into the charge_list
# These lines are started with atom numbers: line.rstrip().split()[0]
# line.rstrip() : ' 19 -1.2426 6.3529 5.9723 9.9947 1.0601 10.4547'
# line.rstrip().split(): '19', '-1.2426', '6.3529', '5.9723', '9.9947', '1.0601', '10.4547'

with open ('ACF.dat', 'r') as infile:
lines = infile.readlines()
for line in lines:
if line.rstrip().split()[0].isdigit(): # == True: # escape the first 2 and last 4 lines
charge_list.append(line.rstrip())

# Print the charge information of Natom
for i in charge_list:
# i.split() is used to split the whole line into different columns
if Natom == int(i.split()[0]):
# The 5th data in each line is the charge value, so we print i.split()[4]
print Natom, i.split()[4]

原理:

ACF.dat中的信息以行的形式保存到一个列表里面。

然后根据用户输入的原子序数,调出来对应行中的电荷信息。

扩展练习

1) 浏览VTST官网Bader电荷分析的有关内容。

2) 找几个简单的气相分子或者自己的体系练练手。

总结

本节简单介绍了一下Bader电荷分析的计算流程,电荷分析的过程,以及本人自己写的一个小脚本。大家如果还有其他遇到的问题,可以在本文后面留言。我会持续更新相关的问题解答。