VASP结构优化过程中查看能量和力收敛

原作者Pai Li,本文转自一个人就是一个叠加态的博客http://blog.sina.com.cn/s/blog_b364ab230102vxj8.html

注原脚本有一些小bug,在此博文中纠正,未经允许禁止转载。但非常欢迎转发文章链接。

上传两个自己写的shell脚本,是用来查看vasp结构优化过程中能量和力等收敛情况的。
第一个脚本比较简单:

1
2
3
4
5
6
7
8
9
10
11
12
#!/bin/sh
#edit by lipai@USTC
#plot energies of structure in optimization
awk '/E0/{if ( i<=5 ) i++;else print $0 }' OSZICAR >temp.e
gnuplot <<EOF
set term dumb
set title 'Energy of each ion steps'
set xlabel 'Ion steps'
set ylabel 'Energy(eV)'
plot 'temp.e' u 1:5 w l
EOF
#rm temp.e

其过程就是查看OSZICAR文件中每一离子步的能量,然后用gnuplot把数据画出来。
效果如下:

能量

第二个脚本画两个图:

一个图是计算每一步的结构离初始的POSCAR结构有多远(需要用到vtst的脚本dist.pl,输入which dist.pl确定此脚本在系统环境路径里)第二个图是画出每一步中原子所受最大力。第二个图中的力对应于INCAR中的EDIFFG参数,某个离子步中的最大力小于EDIFFG的绝对值,就达到收敛结束计算。

效果如下:

相对于初始结构RMSD 最大原子受力
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
#!/bin/bash
# eliminate forces of fixed atoms
fix=$1
if test -z $1; then
fix=0
fi
# get force form OUTCAR
awk -v fix="$fix" '/POSITION/,/drift/{
if($1~/^[0-9.]+$/&&$3>=fix) print $1,$2,$3,sqrt($4*$4+$5*$5+$6*$6i);
else if($1=="total") print $0
}' OUTCAR >temp.f
awk '{
if($1=="total") {print ++i,a;a=0}
else {if(a<$4) a=$4}
}' temp.f >force.conv
#sed -i '1,9d' force.conv
#rm temp.f
tail -30 force.conv >temp.f
#get dist from XDATCAR
touch p1.conv p2.conv;
touch dist.conv
Num=`awk 'NR==7{for(i=1;i<=NF;i++) a=$i+a;}END{print a}' XDATCAR`
Lnum=`wc XDATCAR|awk '{print $1}'`
((n=(Lnum-7)/(Num+1)))
head -7 XDATCAR >p1.conv
awk -v num="$Num" 'NR==9,NR==(num+1)+7{print $0}' XDATCAR >>p1.conv
for((i=1;i<n;i++))
do
head -7 XDATCAR >p2.conv
((n1=9+(Num+1)*i))
((n2=(i+1)*(Num+1)+7))
#echo $n1
#echo $n2
sed -n "$n1,$n2"'p' XDATCAR >>p2.conv
echo -e $i"\t"`dist.pl p1.conv p2.conv ` >>dist.conv
done
#plot
gnuplot <<EOF
set term dumb
set xlabel 'Ion steps'
set ylabel 'Dist (Angstrom)'
plot 'dist.conv' w l t " Dist "
set xlabel 'Ion steps'
set ylabel 'Force (eV/Angstrom)'
plot 'temp.f' w l t " Force "
EOF
rm force.conv dist.conv p1.conv p2.conv temp.f

需要说明的是:

  1. 因为脚本中涉及到很多距离计算,画图时间会略长。
  2. 这里说所有原子所受最大力,其实不包括固定原子。vasp的力的收敛是忽略固定原子受力情况的。
  3. 脚本中用到了dist.pl脚本,这个脚本详情可参见我的博文
  4. 这里力只画了最后的30步,如需画更多步,更改脚本中的30即可。

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。