前言
计算一个异质结需要测试对比不同吸附位置之间的能量差异,可以直接手动建模,但是人太懒了,能交给机器的自己就别动手
问题描述
如图上所示是我计算吸附用的衬底,当原子在上面吸附时我考虑了25个(可以随便取,看需求)位置,如下表矩阵,手动弄却是有点头痛,
x、y | 0.1 | 0.35 | 0.5 | 0.7 | 0.9 |
---|---|---|---|---|---|
0.1 | 0.1, 0.1 | 0.1, 0.35 | … | … | … |
0.35 | 0.35, 0.1 | 0.35, 0.35 | … | … | … |
0.5 | … | … | … | … | … |
0.7 | … | … | … | … | … |
0.9 | … | … | … | … | 0.9, 0.9 |
脚本处理思路
先贴出我的POSCAR
3D\Atomistic
1.03.6405000687 0.0000000000 0.0000000000-1.8202500343 3.1527655419 0.00000000000.0000000000 0.0000000000 32.8615989685Br Ru Ga S1 1 2 3
Direct0.748189991 0.421450019 0.6179900170.103529994 0.109910011 0.6656600240.359649986 0.670469999 0.4959400000.708169997 0.353230000 0.3821200130.356599987 0.667739987 0.4282900090.025920033 0.023759961 0.5277299880.021280050 0.019580007 0.347180009
1,POSCAR分析
我POSCAR分两部分,Ga2S3是我的衬底,BrRu是我的吸附原子,其中要考虑的就是Ru原子在Ga2S3上的吸附,当Ru原子移动时,Br原子也得跟着一起移动
所以我需要修改的是第9段和第10段,其他的段不变,
2,处理流程
1.1,Ru的x坐标设置为0.1,Y依次设置为0.1,计算随动的Br原子的x,y坐标。保存POSCAR
1.2, Ru的x坐标设置为0.1,Y依次设置为0.2,计算随动的Br原子的x,y坐标,保存POSCAR
。。。。。
。。。。。
。。。。。
51.2, Ru的x坐标设置为0.9,Y依次设置为0.9,计算随动的Br原子的x,y坐标,保存POSCAR
3代码解释
这只是一个脚本思路,在使用时应该根据自己的实际情况改动
# 目标坐标值 ---这个值需要根据你需要的位置自行修改
POSX=(0.1 0.35 0.5 0.7 0.9)
POSY=(0.1 0.35 0.5 0.7 0.9)#读取不动段
firstpostion=$(sed -n '1,8p' POSCAR) ##我读取了前8段,这是不需要修改的部分
endpostion=$(sed -n '11,15p' POSCAR) ##我的POSCAR里12到16段是固定的衬底不需要修改# 读取需要修改的原子坐标值,如果你的体系大有需要可以添加更多行
read -r x9 y9 z9 <<< "$(sed -n '9p' POSCAR)"
read -r x10 y10 z10 <<< "$(sed -n '10p' POSCAR)"for ((i=0; i<5; i++)); #每行的值
dofor ((j=0; j<5; j++)); #每列的值do# 计算你需要的新坐标的位置,到Ru原子目前位置之间的距离差diff_x=$(echo "${POSX[$i]} - $x11" | bc)diff_y=$(echo "${POSY[$j]} - $y11" | bc)#Br(第9行)原子的新位置new_x9=$(awk " BEGIN{ printf \"%.8f\", $x9 + $diff_x}" )new_y9=$(awk " BEGIN{ printf \"%.8f\", $y9 + $diff_y}" )# 处理超出边界的情况()if (( $(echo "$new_x9 > 1" | bc -l) )); thennew_x9=$(awk " BEGIN{ printf \"%.8f\", $new_x9 - 1}" )fiif (( $(echo "$new_y9 > 1" | bc -l) )); thennew_y9=$(awk " BEGIN{ printf \"%.8f\", $new_y9 - 1}" )fi # 将坐标值乘以10X=$(echo "${POSX[$i]} * 10" | bc)Y=$(echo "${POSY[$j]} * 10" | bc)# 创建一个以坐标位置命名的文件夹,并且将准备好的INCAR, KPOINTS, POTCAR一起复制进去。folder_name="${X}_${Y}"mkdir "$folder_name"cp INCAR KPOINTS POTCAR "$folder_name/"# 将计算得到的更新的POSCAR写入echo -e "$firstpostion" > "$folder_name/POSCAR"echo -e "$new_x9 $new_y9 $z9" >> "$folder_name/POSCAR"echo -e "${POSX[$i]} ${POSY[$j]} $z11" >> "$folder_name/POSCAR"echo -e "$endpostion" >> "$folder_name/POSCAR"done
done
我将脚本命名为pos.sh
使用前需要
chmod 777 pos.sh
./pos.sh
这样就可以得到一系列的文件
这文件夹有点多,如果懒的一个个投,我们可以使用vasp.pbs进行遍历计算
!/bin/bash
# just for reference
path=`pwd`
for c in *.*
docd $path/$cecho `pwd`mpirun -np 24 vasp_ncl > logrelax # ! vasp_job_soc.sh为vasp_ncl作业脚本cd ${path}
done
计算完成后,如果懒得一个个查能量,可以使用我写的read.sh读取数据
对于不同的情况需要做修改。
###############loactions###############################################end###################
cat >f_date<< !
坐标 磁矩 能量 优化步数 收敛情况
!for q in 1.0 3.50 5.0 7.0 9.0
do
for i in 1.0 3.50 5.0 7.0 9.0
do
X=$(echo "$q" | bc)
Y=$(echo "$i" | bc)
folder_name="${X}_${Y}"cd $folder_name/long_log=`echo | wc -l logscf| awk '{print$1}'`situation=`echo|awk NR==$long_log logscf`log_max=$(tail -n 3 logscf | awk '{print $2}')#cd scf/magnetic=`echo |grep F OSZICAR| sed -n '$p' | awk '{print$10}'`enegry=`echo|grep 'energy(sigma->0) =' OUTCAR| sed -n '$p' | awk '{print$7}'`cd ..#echo $tall_date >> f_date
cat >f_date1<< !
$q $i $magnetic $enegry $log_max $situation
!
head -1 f_date1 >> f_date
done
done
rm f_date1
得到结果如下
处理数据
接着对坐标进行简单的处理,把他用ecel转化成平面坐标,在导入orign即可得图
结语
只是临时弄得还很粗糙,后续慢慢改进。