懒是人的原动力;觉得vasp做拉伸就是一个重复性工作;就写了一个自动拉伸脚本:基本思路是检测队列中是否有在运行的;没有运行的就把当前的文件全部复制到下一个文件夹;然后替换CONTCAR 到POSCAR;在提交任务;以此往复到我设定的拉升距离
#!/bin/bash
# date:2020-11-20
#自动模拟拉伸
for ((a=36;a<=40;a++));
do
echo $a
cd $a; qsub vasp.pbs;cd ..
sleep 10
qstat > qstat.log
while (grep R qstat.log) #检测是否有正在运行的任务,R表示正在运行,这个可根据你自己队列名自行机智
do
sleep 10m
qstat > qstat.log
done
b=$(echo $a+1| bc)#计数增加,为下一个拉伸步骤文件准备名字
mkdir $b
cd $a ; cp * ../$b #继承上一步计算文件
cd ../$b ; cp CONTCAR POSCAR #继承上一步优化好的结构
./changep-ele.sh;#上下平移原子
cd ..
done
还有changep-ele.sh 是移动原子坐标的的脚本,基本思路是筛选处C轴坐标,做循环遍历所有的需要替换的原子坐标,以达到界面原子平移。
#!/bin/bash
# 移动指定编号原子脚本,自动拉伸脚本专用版
# 重庆理工大学材料学院张某
cp POSCAR POSCAR_old
s=1
e=36
l=0.0027897 #需要移动的距离,注意确定POSCAR的是笛卡尔,还是分数坐标
#read -p "输入起始移动原子编号:" s
#read -p "输入末尾移动原子编号:" e
#echo "输入移动距离"
#read -p "input a val:" l
#echo $l
awk '{print $3}' POSCAR > sj.txt #打印第三列
tail -n +10 sj.txt > sj1.txt #从第10行开始 输出 c轴坐标
sed -n ''$s','$e'p' sj1.txt > sj2.txt # 输指定的原子由开始指定的原子移动
#awk -v val=$c ' $1>val {print $1}' sj1.txt > sj2.txt #筛选需要移动的坐标
cat sj2.txt | sort | uniq > sj3.txt #去掉重复坐标
#echo 23
for y in $(cat sj3.txt)
do
#echo 24
k=$(echo $y | tr -d $'\r') #输出字符串由回车 bc计算会报错 需删掉回车
d=$(echo $k-$l| bc) #因为Si在下层所以是减号,根据具体结构设置加减
#echo $d
sed -i "s/$k/$d/g" `grep $k -rl POSCAR` #替换需要的原子坐标
done
echo ok
下面是脚本文件,可以下载
21年我更新了一下脚本,需要的可以看这里