上面这个脚本运行后得到的result.txt内容如下,看起来非常清晰
1 Sr index (integral of Sr function): 0.51896 a.u.
2 Sr index (integral of Sr function): 0.64906 a.u.
3 Sr index (integral of Sr function): 0.54538 a.u.
以井号开头的是注释,是给自己或者用户看的,包括用处、版本、用法、作者信息
# A script to calculate RESP charge based on Gaussian and Multiwfn
# Written by Tian Lu (sobereva@sina.com), 2019-Apr-17
# You should properly modify content to use proper calculation level and solvent
# Example:
# Calculating neutral singlet molecule: RESP.sh H2O.xyz
# Calculating anionic singlet molecule: RESP.sh ani.pdb -1 1
下面运行Gaussian做单点任务
echo Running single point task via Gaussian...
$Gaussian < gau.gjf > gau.out
下面语句的意思是如果Gaussian输出文件gau.out里能搜到含有Normal termination的行,判断结果就为真,就显示Done!,否则就提示出错并且退出脚本。exit后面跟的数字含义见https://tldp.org/LDP/abs/html/exitcodes.html
if (grep -Fq "Normal termination" gau.out) ; then
echo Done!
else
echo The task has failed! Exit the script...
exit 1
fi
最后输出任务成功的信息,告诉用户产生的chg文件的名字。括号前面的\是为了避免此符号被转义。
echo Finished! The optimized atomic coordinates with RESP charges \(the last column\) have been exported to $chgname in current folder
#!/bin/bash
icc=0 //初始化累加变量
nfile=`ls *.out|wc -l` //ls *.out获得out文件列表,交由wc -l返回行数,故nfile是out文件的总数
for inf in *.out //循环当前目录下所有out文件
do
((icc++)) //令icc加1。(( ))里可以做这种整数运算。当前的icc是正在被处理的out文件的序号
echo Converting $inf to ${inf//out/gjf} ... \($icc of $nfile\) //其中${inf//out/gjf}是把inf变量对于的文件名的扩展名从out改为gjf后的名字。$icc of $nfile告诉用户正在处理第几个、总共有多少个
Multiwfn $inf << EOF > /dev/null
100 //主功能100
2 //导出文件和产生输入文件
10 //产生Gaussian输入文件
${inf//out/gjf} //新产生的Gaussian输入文件名
0 //返回主菜单
q //优雅地退出
EOF
done
运行这个脚本后,可以看到诸如这样的运行过程提示
...略
Converting B2H6.out to B2H6.gjf ... (5 of 151)
Converting Benzaldehyde.out to Benzaldehyde.gjf ... (6 of 151)
Converting Benzene.out to Benzene.gjf ... (7 of 151)
...略
如《使用Multiwfn观看分子轨道》(http://sobereva.com/269)所述,Multiwfn在载入fch/molden/mwfn/gms这样记录了占据轨道和空轨道的波函数文件后,当进入主功能0时,不仅会蹦出图形窗口用来观看体系结构和轨道等值面,在文本窗口还输出了许多信息,包括HOMO-LUMO gap,如下所示。
Note: Orbital 5 is HOMO, energy: -0.291987 a.u. -7.945379 eV
Orbital 6 is LUMO, energy: 0.065333 a.u. 1.777798 eV
HOMO-LUMO gap: 0.357320 a.u. 9.723178 eV 938.144245 kJ/mol
#!/bin/bash
rm -f gap.txt //删除之前可能残留的gap.txt
avggap=0 //用于记录HOMO-LUMO gap的平均值。先对所有体系累加,最后除以总数
nfile=0 //记录当前正处理的文件序号
for inf in *.fch
do
((nfile++))
echo Processing $inf "..."
Multiwfn $inf -silent << EOF > out.txt //注意这里用了-silent避免蹦出主功能0的图形界面
0
q //优雅地退出
EOF
gapthis=$(grep "HOMO-LUMO gap" out.txt |awk '{print $5}') //从Multiwfn输出信息中找含有HOMO-LUMO gap的行,然后提取以空格分隔时的第5个值,即eV为单位的gap
echo $inf: $gapthis eV >> gap.txt //向gap.txt里输出当前体系文件名和gap值
avggap=$(echo $avggap+$gapthis | bc -l) //把当前体系的gap累加到avggap变量上
rm -f out.txt
if [[ $nfile -eq 1 ]] ; then //处理的是第1个文件的情况,此时nfile等于1。[[ ]]里可以做条件判断
gapmin=$gapthis //暂把第1个文件的HOMO-LUMO gap当做最小值
namemin=$inf //记录HOMO-LUMO gap最小的体系的文件名
else
if [[ $(echo "$gapthis < $gapmin" | bc) -eq 1 ]] ; then //当前HOMO-LUMO gap小于目前最小值的情况
gapmin=$gapthis
namemin=$inf
fi
fi
done
echo | awk '{printf ("\n%s %10.6f %s\n","Average HOMO-LUMO gap:",t1/t2," eV")}' t1=$avggap t2=$nfile >> gap.txt //将avggap变量除以已处理的文件总数nfile,得到平均gap,追加到gap.txt
echo "Done! Result has been outputted to gap.txt in current folder"
echo "Totally" $nfile "files were processed"
echo $namemin has minimal gap of $gapmin eV >> gap.txt
运行这个脚本之后,得到的gap.txt里就是诸如下面的内容
HCN.fch: 18.809098 eV
naphthalene.fch: 4.829532 eV
NH3BF3.fch: 9.803340 eV
pyrazine.fch: 5.411161 eV
waterdimer.fch: 11.407130 eV
Average HOMO-LUMO gap: 10.052052 eV
naphthalene.fch has minimal gap of 4.829532 eV