|
本帖最后由 exity 于 2021-3-30 22:47 编辑
2021.03.30 更新了脚本,实现如下功能1 更清楚的屏幕输出
2 批量处理多个fchk文件并将生成的cub文件移入同名文件夹
3 输出的cub文件按照分子轨道顺序编号并对homo lumo轨道进行额外标记
4 改变屏幕输出的字体和背景颜色.......没什么用的功能
===================================================
#!/bin/bash
abovelumo=2
belowhomo=2
frontcolor=36 #字体颜色 30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色
backgroundcolor=40 #背景颜色 40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
for inf in *.fchk
do (
echo 0 > tmp.mf #建立内容为0的mf文件,供multiwfn使用输出含有HOMO LUMO编号内容的txt
Multiwfn ${inf} < tmp.mf > ${inf//.fchk}.tmp
h=$(grep "is HOMO" ${inf//.fchk}.tmp | awk '{print $3}') #抓取含有is HOMO字段的行并提取第3列数据
l=$(grep "is LUMO" ${inf//.fchk}.tmp | awk '{print $2}') #抓取含有is LUMO字段的行并提取第2列数据
range=$[$h-$belowhomo]'-'$[$l+$abovelumo]
echo -e "\033[1;${frontcolor};${backgroundcolor}mThe file being processed is ${inf}, all cube files will be moved into the folder with same name.\033[0m"
printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your highest is $[$l+$abovelumo]
printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your lumo is $l
printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your homo is $h
printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your lowest is $[$h-$belowhomo]
printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-5s %-2s \033[0m%-8s %-2s %-5s\n" Your range is $range, $[$abovelumo+$belowhomo+2] orbitals in total.
echo -e "\033[1;${frontcolor};${backgroundcolor}mMoment please, cube files are be generated by Multiwfn...\033[0m"
echo $range > tmp3.txt
echo 200 >> tmp2.mf #进入主功能200
echo 3 >> tmp2.mf #生成轨道波函数文件
cat tmp3.txt >> tmp2.mf #不知道为什么这里echo $range >> 不能用
echo 3 >> tmp2.mf #输出高质量格点,1,2分别对应低和中等质量
echo 1 >> tmp2.mf #分别输出轨道cub文件
Multiwfn ${inf} < tmp2.mf >> null
rm ${inf//.fchk}.tmp tmp.mf tmp3.txt tmp2.mf null
mv "orb$(printf "%06d" ${h}).cub" "orb$(printf "%06d" ${h})_homo.cub" #输出6位自动补0的HOMO轨道编号
mv "orb$(printf "%06d" ${l}).cub" "orb$(printf "%06d" ${l})_lumo.cub" #输出6位自动补0的HOMO轨道编号
mkdir ${inf//.fchk}
mv *cub ${inf//.fchk}
# ####test code####
# #echo h=$(sed -n 1p homo.txt)
# #echo l=$(sed -n 1p lumo.txt)
)
done
===================================================
缘起:有次考察分子轨道的时候,想批量输出HOMOLUMO附近正负3的轨道,脑洞一开,在输入分子轨道编号的时候在Multiwfn里输入了如下命令
h-3,h-2,h-1,h,l,l+1,l+2,l+3
当然运行失败,恳请社长修改代码未遂之后,受社长提示用脚本来干这个事情。
跌跌撞撞写了一个功能上能用的,但是语法很啰嗦的sh脚本,现在发出来供大家批评,如果有人能提供一样功能又简洁优美的脚本那就太好了。
使用方法
和fchk文件放在同一目录,修开头两行的数字,分别代表输入高于LUMO的几个轨道,低于HOMO的几个轨道,我测试过正整数和零,没有什么问题,没有测试负数以及其他奇怪的字符,请读者自行尝试。
例如,如果你要输出LUMO以上3个轨道,HOMO以下4个轨道,就改为下面这样。
abovelumo=3
belowhomo=4
非要说这个脚本有什么好处,恐怕就是不需要每次都点0功能,肉眼看HOMO LUMO对应的编号了吧。
感觉也没什么用的样子.....
#!/bin/bash
abovelumo=2
belowhomo=2
for ((l=1;l<=${abovelumo};l++))
do
echo l+$[$[${abovelumo}+1]-${l}] >> tmp.txt
done
echo l >> tmp.txt
echo h >> tmp.txt
for ((h=-1;h>=-${belowhomo};h--))
do
echo h${h} >> tmp.txt
done
for ((n=1;n<=$[${abovelumo}+${belowhomo}+2];n++))
do
touch tmp2.mf
echo 200 >> tmp2.mf #进入主功能200
echo 3 >> tmp2.mf #生成轨道波函数文件
echo replacedwithx >> tmp2.mf #输入轨道序号,这里使用随意字符,后续会用变量代替
echo 3 >> tmp2.mf #输出高质量格点,1,2分别对应低和中等质量
echo 1 >> tmp2.mf #分别输出轨道cub文件
x=$(sed -n ${n}p tmp.txt)
cp tmp2.mf ${x}_showorb.mf
sed -i "3c ${x}" ${x}_showorb.mf
for inf in *.fchk
do (
Multiwfn ${inf} < ${x}_showorb.mf
)
done
done
mkdir ${inf//.fchk}_orbs
mv *.cub ${inf//.fchk}_orbs
rm *.mf tmp.txt
|
评分 Rate
-
查看全部评分 View all ratings
|