echo \ form=0 else
echo \ form=1 fi fi # 2.a
else
#如果没有OUTCAR,那就自己设置一些参数:非自旋极化计算,费米能为0. echo \ echo \ form=0 nspin=1 efermi=0.0 fi
# If the outcar file is not present and you wish to set something by hand
# you should do it here. Uncomment the tokens below and set them by hand.
#这里是如果你要多次处理一些文件,同时又没有OUTCAR文件那么可以在这里设置费米能。
#efermi=2.255 #form= #nspin=
# Get the atomic coordinates $BIN/vp >| tmp.dat
tail -$natom tmp.dat | awk '{printf \tmp.dat2
#调用vp从POSCAR中获得原子的位置,然后用tail和awk获得具体的原子坐标,并且前面加上#,方便后面gnuplot画图。
#>表示重新定向,把本来vp输出到终端的结果输出到文件tmp.dat中 #使用>要注意,如果只是附加而不是新建那么必须用>>而非>
#除此之外,>是这样的工作的,它会左右两边的命令同时运行(只是一个直接运行而一个等待输入)而不是等一个运行完之后才运行第二个。所以不要执行这种命令:cat a.txt > a.txt,这样你只会得到一个空白文件,因为>在cat的时候同时创建了a.txt空白文件等待输入同时就把原来的a.txt覆盖掉了,所以cat a.txt就只是空白,重新定向输入到a.txt也就是空白。
# Total is first DOS i=0
#之前的if语句没有用,是因为之前的修改而留下的冗余语句。 #这个i是标记第几个原子的变量。
start=7
end=$((start+nl-1))
#从第7行到第end行开始输出DOS
echo $start $end #exit 0 rm -f DOS0
if [ $form -eq 1 ]; then #LORBIT=10
while [ $i -le $natom ]; do
#输入所有的原子,用while语句实现:i小于原子数,那么输出 echo $i $start $end
if [ $i -gt 0 ]; then
#并非totalDOS,那么在第一行中加入原子位置,输出到DOS$i文件 sed -n ''$i' p' tmp.dat2 >| DOS$i fi
if [ $i -gt 0 ]; then
# Atomic projected DOS
if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \$4, -1*$5, $6, -1*$7}' >> DOS$i
#如果是自旋计算,那么就按格式输出,并且把自旋朝下的乘以-1,方便后面画图。
#sed指定输出从start到end的行,awk指定输出格式并且做能量的处理(平移费米能到零点)
else sed -n ''$start','$end' p' $dosfile | awk '{printf \ #没有自旋就简单多了,只需要平移就可以了。 fi
else
# Total DOS
if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \.8f .8f .8f .8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else
sed -n ''$start','$end' p' $dosfile | awk '{printf \\\n\ fi
#对totaldos的处理 fi
start=$((end+2)) end=$((start+nl-1)) i=$((i+1))
移动到下一个原子的输出,只需要控制start和end就可以了,并且修改i的大小。 done
elif [ $form -eq 0 ];then
# the form=0 is an unkown code! while [ $i -le 0 ]; do
#这里-le应该换成-eq也可以,也即是说等于0就是totaldos就不输出原子坐标了。 echo $i $start $end
if [ $i -gt 0 ]; then
sed -n ''$i' p' tmp.dat2 >| DOS$i fi
if [ $i -gt 0 ]; then
# Atomic projected DOS
if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \$4, -1*$5, $6, -1*$7}' >> DOS$i else sed -n ''$start','$end' p' $dosfile | awk '{printf \ fi
else
# Total DOS
if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \.8f .8f .8f .8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else
sed -n ''$start','$end' p' $dosfile | awk '{printf \\\n\
fi
fi
start=$((end+2)) end=$((start+nl-1)) i=$((i+1)) done
#以上都是和form=1是一样的
elif [ $form -eq 2 ];then
#这里是我处理的LORBIT=11的时候加入的。主要是修改awk的输出格式 while [ $i -le $natom ]; do
echo $i $start $end
if [ $i -gt 0 ]; then
sed -n ''$i' p' tmp.dat2 >| DOS$i fi
if [ $i -gt 0 ]; then
# Atomic projected DOS
if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \.8f .8f .8f .8f .8f .8f .8f .8f \\n\-1*$3, $4, -1*$5, $6, -1*$7,$8,-1*$9,$10,-1*$11,$12,-1*$13,$14,-1*$15,$16,-1*$17,$18,-1*$19}' >> DOS$i #这里是要命的awk输出,其实就长一点,格式没有什么困难。
#这里的问题是不论是原子,都会输出这么长的一串,即使没有d,f轨道,但都是0.这是VASP的问题,不是这个脚本的问题。
else sed -n ''$start','$end' p' $dosfile | awk '{printf \.8f .8f .8f .8f .8f .8f .8f .8f .8f \\n\$1+(-1)*'$efermi', $2, $3, $4,$5,$6,$7,$8,$9,$10 }' >> DOS$i fi
else
# Total DOS
if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \.8f .8f .8f .8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i
else
sed -n ''$start','$end' p' $dosfile | awk '{printf \\\n\ fi
fi
start=$((end+2)) end=$((start+nl-1)) i=$((i+1)) done
#其他的都没有什么需要改的了 fi
exit 0
#这里停止程序并给出一个0的状态符,是个好的习惯,方便别人调用的脚本的时候判断这个脚本是否正常运行结束了。
#最后是shellscript和python,perl的对比
#不得不说perl,python的功能更加强大,但是shellscript更容易学和容易编写
#因为shellscipt就是把我们在命令行下面的输入的命令直接合在一起就可以了,而不需要调用库文件和编译之类;同时我们很多时候都用shell命令,对这些命令更加熟悉,在编写的时候也容易把握。
#有很多命令都可以在shell下面直接尝试,调好之后就直接放在shellscript就可以了。(我经常是这么干的……)
#shellscript就像把我们日常的话整理一下放在一起就发表的文章,而python,perl有专门的语法而要求,就像规范的文章.所以前者要容易写的多,后者如果不是经常写容易出错。 #由于shellscipt是没有编译的和优化的,所以效率会低;同时由于没有编译,所以没有整体的检查,所以bug会隐蔽(当然语法错误在运行的时候还是会提醒的)。而且由于很多管道和正则,所以shellscript的可读性并不是很好。而且shellscript的依赖性很强,不好移植。所以不要用shellscript写大程序,特别是计算量很大的程序。很多时候,shellscript是方便快捷的\处理。
#计算量大的程序,用fortran;处理大量文档和文本,用python或perl。
我的输入法不是很好所以经常有错别字,抱歉,发现请告知
PROCAR给出的信息非常多,但是和DOSCAR不一样,没有可比性。DOSCAR是给出态密度,而PROCAR是给出每个K点上面的每个能级的组合成分
实例13
关于VASP计算PDOS的疑问
小弟刚学VASP在计算完TDOS和PDOS之后,不知道怎么将DOS图画出来。后来找了个dos-procar.f的小脚本,不知道对不对。在处理之后得到的结果看不懂,以O原子为例:本
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VASP处理split_dos(4)在线全文阅读。
相关推荐: