一些小脚本来提高工作效率(二)

一些小脚本来提高工作效率(二)

在上一部分中我写了一个批量提交任务的小脚本,现在计算完成了自然需要对计算结果进行处理,所以我又鼓捣了一下,弄一个可以自动批量导出想要数据的脚本。

自动批量提取CONTCAR以及输出结果中能量的脚本

这里就以提取计算的能量为例子,根据之前写的脚本,目录下会有很多以数字命名的文件夹,每一个文件夹里面就是一个模型的计算内容,所以在最开始提取数据的时候可以用数字通配符进行匹配:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

#一个简单的例子验证数字的通配符,提取所有以数字命名的文件夹中OUTCAR所记录的Elapsed time
for i in [[:digit:]]*;
do
cd $i
grep Elapsed OUTCAR
cd ..
done

能够匹配到需要的文件名,接下来就是想办法把文件夹中的的计算结果给提取出来,要提取最后的E0,那么在OUTCAR中,可以用without来定位,直接用grep会输出每一个离子步的能量,所以需要加个管道,限制一下输出最后一个能量。

1
2
3
[jason@cabc1 1]$ grep without OUTCAR | tail -1
energy without entropy= -643.64907689 energy(sigma->0) = -643.649076 89

这里输出得第四列的数据就是我们需要的能量,那么就需要提取第四行的数据,就可以接着加管道,这里用awk指令提取第四列的数据。

1
2
3
[jason@cabc1 1]$ grep without OUTCAR | tail -1 | awk '{print $4}'
-643.64907689

这里就可以直接输出数据了,那么接下来就是将数据与文件夹的名字对应上,再一并写入一个文件中存储下来,这里我想到的就是用echo指令,将其传入一个dat文件中,也方便我以后作图。

这里是第一个版本的脚本,但是它有个问题,我后面会写到,现在先看看它的内容:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

for i in [[:digit:]]*;
do
energy=$(grep without $i/OUTCAR | tail -1 | awk '{print $4}')
user_time=$(grep User $i/OUTCAR | awk '{print $4}')
echo -e $i "\t" $energy "\t" $user_time >> temp.dat
done
cat temp.dat | sort -n -k 1 > energy.dat
rm temp.dat

为了方便观看,而且也为了方便以后提取其它数据,我在这里将要输出的值设置为了变量,然后为了便于更新数据,我这里用来一个临时文件来存储,然后覆盖掉之前可能存在的energy.dat,同时也加了一个管道,方便将数据按照文件夹得ID排序。以下是该脚本的运行后的输出结果,三列数据分别为文件夹ID、能量以及计算所花费得时间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1        -643.64907689   3770.198
2 -648.77401987 18354.893
3 -645.56564862 3639.488
4 -644.62194252 7893.163
5 -644.24128033 5277.247
6 -648.77562926 18630.310
7 -643.25510646 5050.607
8 -643.88796249 4794.712
9 -643.74892600 4198.806
10 -643.26433379 6070.860
11 -644.12074039 4590.720
12 -644.55863296 17621.683
13 -644.16422193 6542.457
14 -644.08878990 5682.525
15 -644.08216501 4474.155
16 -643.63296216 4893.096
17 -644.17025463 4363.964
18 -643.97433524 4194.030
19 -644.22827453 3129.496
20 -647.30847443 13732.272

后面我突然想到,这么多个模型,我怎么能够保证它就都达到了收敛标准了呢,所以我需要验证一下它是否达到了收敛标准,这里我采用的方法就是,先用tail指令获取slrum.out的最后一行数据,如果计算达到了收敛标准,那么最后一行的值应该为reached required accuracy - stopping structural energy minimisation,如果不是,那么就没有达到收敛标准,这里就用来bash的if语句来判断一下。

这里有点坑的是,最后那句reached required accuracy - stopping structural energy minimisation前面是有一个空格的,这个空格的原因让我debug了半天,if语句死活无法得到正确的判断效果。

然后为了方便导出CONTCAR文件,我又添加了一个将所有目录下的CONTCAR文件打包到一个文件夹下的命令,顺便将输出的energy.dat也挪到了那个文件夹下,以下就是最终的脚本:

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
#!/bin/bash

# echo -e "File_name" "\t" "Energy witout entropy" "\t" "User Time(Sec)" >> temp.dat

verification=" reached required accuracy - stopping structural energy minimisation"
wrong_warning="Don't reach the convergence standard"

if [ ! -d "result/" ];then
mkdir result
fi

for i in [[:digit:]]*;
do
energy=$(grep without $i/OUTCAR | tail -1 | awk '{print $4}')
user_time=$(grep User $i/OUTCAR | awk '{print $4}')
calculate_fi=$(tail -1 $i/*.out)

cp $i/CONTCAR ./result/"$i"CONTCAR

if [ "$calculate_fi" = "$verification" ]
then
echo -e $i "\t" $energy "\t" $user_time >> temp.dat
else
echo -e $i "\t" "$wrong_warning" "\t" "$user_time" >> temp_wrong.dat
fi
done
cat temp.dat | sort -n -k 1 > ./result/energy.dat
if [ -e temp_wrong.dat ]
then
cat temp_wrong.dat >> ./result/energy.dat
rm temp_wrong.dat
fi
rm temp.dat

这里我创建了一个临时文件,主要的目的是为了将没有收敛的数据排到后面去,免得后面在作图的时候还要再自己手动挪一遍。以下是这个脚本的运行结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
1        -643.64907689   3770.198
3 -645.56564862 3639.488
4 -644.62194252 7893.163
5 -644.24128033 5277.247
7 -643.25510646 5050.607
8 -643.88796249 4794.712
9 -643.74892600 4198.806
10 -643.26433379 6070.860
11 -644.12074039 4590.720
13 -644.16422193 6542.457
14 -644.08878990 5682.525
15 -644.08216501 4474.155
16 -643.63296216 4893.096
17 -644.17025463 4363.964
18 -643.97433524 4194.030
19 -644.22827453 3129.496
20 -647.30847443 13732.272
12 Don't reach the convergence standard 17621.683
2 Don't reach the convergence standard 18354.893
6 Don't reach the convergence standard 18630.310

可以看到还是有几个模型没能够收敛,后面我去看了一下,普遍是因为达到了离子步上限了,我看了一下CONTCAR文件,结构也已经严重变形,算是可以被舍弃掉的模型了。


一些小脚本来提高工作效率(二)
http://phoenixjason.cn/2023/02/09/20230209一些小脚本来提高工作效率(二)/
作者
Jason
发布于
2023年2月9日
许可协议