计算化学公社
标题: ORCA脚本分享 [打印本页]
作者Author: qqzhang 时间: 2025-11-20 10:54
标题: ORCA脚本分享
脚本1 使用gunplot绘制scan过程中的能量和键长变化,是直接读取的test.relaxscanact.dat进行的绘图:
#!/bin/sh
# 检查数据文件是否存在
if [ ! -f "test.relaxscanact.dat" ]; then
echo "错误: 找不到 test.relaxscanact.dat 文件!"
exit 1
fi
# 计算总行数作为步数
steps=$(wc -l < test.relaxscanact.dat)
# 生成带有步数的临时数据文件
awk '{print NR, $0}' test.relaxscanact.dat > temp.plot
# 使用gnuplot绘制数据
gnuplot <<EOF
set term dumb
set title '能量随距离变化曲线'
set xlabel '步数'
set ylabel '能量 (eV)'
plot 'temp.plot' u 1:3 w l t "能量 vs 步数"
set title '能量 vs 距离'
set xlabel '距离 (Å)'
set ylabel '能量 (eV)'
plot 'temp.plot' u 2:3 w l t "能量 vs 距离"
EOF
# 查找最小能量及其对应的距离
min_energy_line=$(awk 'NR == 1 || $2 < min {min = $2; line = NR} END {print line}' test.relaxscanact.dat)
min_energy=$(sed -n "${min_energy_line}p" test.relaxscanact.dat | awk '{print $2}')
distance_at_min=$(sed -n "${min_energy_line}p" test.relaxscanact.dat | awk '{print $1}')
echo "\n最小能量: ${min_energy} eV (步数 ${min_energy_line}, 距离 ${distance_at_min} Å)"
# 清理临时文件
rm temp.plot

就可以直接看到能量最高点,作为过渡态初猜结构
脚本2 结构优化过程中能量的可视化
#!/bin/sh
#created by qingqingzhang 2025.11.20
num_out_files=$(find . -maxdepth 1 -type f-regex './[0-9]+\.out' | sort -n)
if [ -z "$num_out_files" ]; then
echo "错误: 未找到数字.out文件!"
exit 1
fi
temp_data="temp_energy_data.dat"
> "$temp_data"
echo "处理的文件:"
for file in $num_out_files; do
echo " $file"
done
echo
total_step=1
for file in $num_out_files; do
grep "FINAL SINGLE POINT ENERGY" "$file" | awk'{print $5}' | while read -r energy; do
if [ -n "$energy" ] && echo "$energy" | grep-qE '^-?[0-9]+\.[0-9]+$'; then
echo "$total_step $energy" >> "$temp_data"
total_step=$((total_step + 1))
fi
done
done
if [ ! -s "$temp_data" ]; then
echo "错误: 没有从任何文件中提取到有效能量数据!"
rm -f "$temp_data"
exit 1
fi
gnuplot <<EOF
set term dumb enhanced
set title '能量随步数变化曲线'
set xlabel '步数'
set ylabel '能量 (eV)'
unset grid
unset key
plot '$temp_data' using 1:2 with lines lw 2lc rgb 'blue'
EOF
# 清理临时文件
rm -f "$temp_data"
脚本3 查看优化步数 读取最后电子能量 能量修正项 自由能项(均读取最后一个数值)
#!/bin/bash
# created by zhangqingqing 2025/07/12
set +f
NUM_OUT_FILES=$(ls -1d [0-9]*.out2>/dev/null | grep -E '^[0-9]+\.out$')
echo"=========================================================================="
echo "$(pwd)"
echo -e "\n优化日志:"
grep OPTI $NUM_OUT_FILES 2>/dev/null ||echo "未找到相关数据"
echo -e "\n电子能量项:"
grep "FINAL" $NUM_OUT_FILES2>/dev/null | tail -n 1 || echo "未找到相关数据"
echo -e "\n修正项:"
grep "G-E(el)" $NUM_OUT_FILES2>/dev/null | tail -n 1 || echo "未找到相关数据"
echo -e "\n运行时间:"
grep RUN $NUM_OUT_FILES 2>/dev/null |tail -n 1 || echo "未找到相关数据"
echo -e "\n吉布斯自由能:"
grep "Final Gibbs free energy"$NUM_OUT_FILES 2>/dev/null| tail -n 1 || echo "未找到相关数据"
echo"=========================================================================="
脚本4 查看振动状态,我主要是看虚频
#!/bin/bash
LINES=20
if [ ! -z "$1" ]; then
LINES=$1
fi
SED_COMMAND=""
for ((i=1; i<=LINES; i++)); do
SED_COMMAND="${SED_COMMAND}n; p;"
done
if [ $(ls *.out 2>/dev/null | wc -l) -eq0 ]; then
echo "当前目录下没有找到.out文件"
exit 1
fi
for file in *.out; do
echo "===========================$file-FREQUENCIES============================="
sed -n "/VIBRATIONAL FREQUENCIES/{${SED_COMMAND}}""$file"
echo
done
echo "..."
echo "-----------------------"
grep "G-E(el)" *.out
echo"-----------------------------------------------------------------------"
pwd
grep "TOTAL RUN TIME" *.out
echo"==========================================================================="
使用方法:脚本1和2需要安装gunplot。在根目录下创建bin/exc文件夹,在exc文件夹写入脚本,把bin/exc路径添加到~/.bashrc中,记得source一下,使用指令chmod 755 脚本 赋予可执行权限,即可在任何的目录下敲除对应指令。如果不知道怎么做可以发给ai问问怎么添加路径。如果无法使用,可以发给ai解读脚本,我读取的文件是以数字命名的.out文件。
作者Author: wal 时间: 2025-11-20 11:08
gnuplot的终端绘图步数一多就看不清了 实际用起来有点花瓶 我之前捣鼓过 最终还是转向了别的手法 (然而我的xyz剪切板艺术无人欣赏
作者Author: student0618 时间: 2025-11-20 14:30
建议代码用<>插入代码放,更清晰。
作者Author: dodobird1 时间: 2025-11-20 14:40
标题可以更具体一点 方便检索之类的
作者Author: Daniel_Arndt 时间: 2025-11-20 15:35
本帖最后由 Daniel_Arndt 于 2025-11-21 09:51 编辑
我稍微看了一下你的脚本1,有两个可以改进的地方,一是gnuplot其实是提供了跟Linux Shell简单交互的功能,你可能不清楚,所以使用了一个temp.plot文件,你看看 https://www.plumed.org/doc-v2.5/user-doc/html/belfast-2.html 中“p "<head -400 HILLS" u 2:3:4:5 w xyer”、“spl "<paste negative_bias.dat correction.dat " u 1:2:($3+$8) w pm3d”那两行就大概能明白了。二是查找最小能量及其相应的距离其实可以用一个awk脚本来完成,我在 http://bbs.keinsci.com/thread-36574-1-1.html 中讲解FNR和NR时提到了这个小技巧。
作者Author: Uus/pMeC6H4-/キ 时间: 2025-11-20 16:16
如果脚本为AI辅助编写,请在帖中声明AI生成内容与人工复核修改内容占最终代码的比例。
注意到四个脚本用了三种寻找文件的方式,不是很统一呢。
- if [ ! -f "test.relaxscanact.dat" ]; then
- echo "错误: 找不到 test.relaxscanact.dat 文件!"
- exit 1
- fi
复制代码- num_out_files=$(find . -maxdepth 1 -type f-regex './[0-9]+\.out' | sort -n)
- if [ -z "$num_out_files" ]; then
- echo "错误: 未找到数字.out文件!"
- exit 1
- fi
复制代码- if [ $(ls *.out 2>/dev/null | wc -l) -eq0 ]; then
- echo "当前目录下没有找到.out文件"
- exit 1
- fi
复制代码
感觉很多sed | awk或者grep | awk之类的指令都可以把pipeline简化成纯awk的。
作者Author: Novice 时间: 2025-11-21 14:35
我觉得其实AI写也没什么,毕竟脚本他需要花费时间去检验和排除bug。作为一个不会写代码的人,我自己子平时让AI帮写代码时就不知花费了多少时间去让AI解决他写的代码的问题,这就是AI时代不会写代码的人的贡献。
至于写出更优的代码,这个就需要专业的人去做了。但是这个即使不是最优的代码,在目前的应用场景下,资源需求也不大,还是很有使用价值的
作者Author: 玉米猫 时间: 2025-11-21 16:15
哈哈哈哈哈哈哈,你发出来的时候我看了,算是行为艺术吗
作者Author: Novice 时间: 2025-11-21 17:29
也可以分享一下
作者Author: wal 时间: 2025-11-21 19:37
算是吧(
毕竟些那个的时候PNG的功能已经用了很久,用着挺舒服运行也很平稳,只是发现能终端绘图,感觉很好玩,就捣鼓了一下加上了,hhh
自加上到现在,用的次数一双手都数的过来
作者Author: wal 时间: 2025-11-21 19:39
过一段时间整理下发,我对它目前的形态不是特别满意><
| 欢迎光临 计算化学公社 (http://bbs.keinsci.com/) |
Powered by Discuz! X3.3 |