Ex02 做计算常用的批量处理方法(一)

回顾

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

  • 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的命令操作有很多的小技巧,大家一定要多多去网上搜集,加以练习,这对于提高工作效率非常有帮助。