shell脚本之提取频率计算结果

VASP频率计算完成后,每次都需要调用vaspkit,依次输入命令代码来产生零点能校正、焓变与熵变校正,较为繁琐。本文基于shell脚本语法编写了批处理频率分析脚本。

提取VASP频率计算结果

运行命令:脚本+温度参数

1
./freq_vaspkit0.73.sh 298.15

freq_vaspkit0.73.sh脚本内容如下:

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

touch run.sh # 创建vaspkit命令输入文件run.sh
chmod +x run.sh # 修改为可执行文件


# 找到当前目录下包含freq目录的所有子目录,并以绝对路径输出
# 遍历所有的freq目录,调用vaspkit,依次5,501,Temperature,得到频率分析结果
for dir in `find ./ -type d | grep 'freq'`; do
if [ ! -f "$dir/OUTCAR" ];then # 判断freq目录下是否有OUTCAR文件
continue
else # 若freq目录下有OUTCAR文件,执行以下代码
cat > run.sh <<EOR
#!/bin/sh
cd $dir
vaspkit <<!
5
501
$1
!
EOR

echo $dir # 打印对应的freq路径
./run.sh | tee out.log # 执行run.sh文件,并将输出结果保存到out.log文件中

# 依次提取文件名、电子能E0、零点能Ezpe、 焓变校正H、熵变校正TS、自由能校正G,单位:eV
echo $dir | sed 's/freq//' | sed 's/^..//' | awk '{printf "%-30s\n",$1}' >> name
grep entropy $dir/OUTCAR | tail -1 | awk '{printf "%.6f\n",$7}' >> E0
grep "Zero-point energy E_ZPE" out.log | awk '{printf "%.6f\n",$5}' >> Ezpe
grep "Enthalpy contribution E_H" out.log | awk '{printf "%.6f\n",$5}' >> H
grep "Entropy contribution T*S" out.log | awk '{printf "%.6f\n",$5}' >> TS
grep "Thermal correction to G(T)" out.log | awk '{printf "%.6f\n",$6}' >> G

fi
done


# 将所有的提取信息整合到一个文本中
index="name\t\t\t\tE0\t\tEzpe\t\tH(T)\t\tG(T)"
paste name E0 Ezpe H TS G | sed -r "1i$index" > energy.out
rm name E0 Ezpe H TS G out.log run.sh

energy.out输出文件格式示例如下:
energy

点击下载代码freq_vaspkit0.73.sh

因新版vaspkit对输出做了修改,使用vaspkit1.00的用户可下载下面的脚本:
点击下载代码freq_vaspkit1.00.sh

提取Gaussian频率计算结果

前提条件:频率计算的结果需放在freq目录下,不能有其他以log为后缀的文件

运行命令:

1
./freq_Gaussian.sh

freq_Gaussian.sh脚本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/sh

# 找到当前目录下包含freq目录的所有子目录,并以绝对路径输出
for dir in `find ./ -type d | grep 'freq'`; do
if [ ! -f $dir/*.log ];then 判断freq目录下是否有*.log文件
continue
else # 若freq目录下有*.log文件,执行以下代码

echo "file in $dir is processing"
# 依次提取文件名、电子能E0、零点能Ezpe、 焓变校正H、自由能校正G,单位:a.u.
echo $dir | sed 's/freq//' | sed 's/^..//' | awk '{printf "%-30s\n",$1}' >> name
cat $dir/*.log | grep "SCF Done" | awk '{printf "%.6f\n",$5}' >> E0
cat $dir/*.log | grep "Zero-point correction" | awk '{printf "%.6f\n",$3}' >> Ezpe
cat $dir/*.log | grep "Thermal correction to Enthalpy" | awk '{printf "%.6f\n",$5}' >> Hcorr
cat $dir/*.log | grep "Thermal correction to Gibbs Free Energy" | awk '{printf "%.6f\n",$7}' >> Gcorr

fi
done

# 将所有的提取信息整合到一个文本中
index="name\t\t\t\tE0\t\tEzpe\t\tHcorr\t\tGcorr"
paste name E0 Ezpe Hcorr Gcorr | sed -r "1i$index" > energy.out
rm name E0 Ezpe Hcorr Gcorr

点击下载代码freq_Gaussian.sh