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 else
while [ $i -le 0 ]; do #这个奇怪,为什么要讨论
i<0呢?不是只需
考虑i>=0吗?前面已经全部包含了的呀?
#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 fi
exit 0
你自己用fortran写个都比这个简单多了.
呵呵,想学学linux的shell编程,觉得shell编程比fortran好用呢。不过我不是反对fortran编程。
而是想通过这个来看看它处理数据的思路,这样用改用fortran也容易些。
这个split_dos不包括f电子。而且看起来比较古老,跟真实的DOSCAR的格式有出入。
比如我的DOSCAR,
(1)ISPIN=2, LORBIT=11,对于不含f电子的体系, DOSCAR site projected DOS有19列数字,分别是
energy, s(+/-),Px(+/-),Py(+/-),Pz(+/-),D1(+/-),D2(+/-).D3(+/-).D4(+/-),D5(+/-);
(2)ISPIN=2,LORBIT=11,含有f电子的体系有33列数字。在以上19列数字后再添加7个f的上下选(14个)。
(3)ISPIN=1,LORBIT=11,则上下旋合并,不含f电子的体系有10列数字,分别是: energy,s,Px,Py,Pz,D1,D2,D3,D4,D5.
(4)ISPIN=1,LORBIT=11,含有f电子的体系,增加7f电子,共17列数组。
这四种情况,没有一种是现在列出的split_dos可以处理的。
比如,对于情况(1),要得到sLDOS的O2p上旋态密度,是不是要把Px+Py+pz;而下旋态密度为 Px(-)+Py(-)+Pz(-)?
是的,需要都加起来.但是vasp提供了一个参数可以直接给出s,p,d而不是px,py...值.
我也是改的这个脚本,把其中处理数据列的部分增加后用于提取包含20列数据,即到d电子所有轨道的DOSCAR,要处理f电子的话,增加提取并输出的列数就可以了。
shell编程的优势我认为在于格式化读入和输出,语句很简洁而且功能强大,但是不适合用来做运算。我原来试过用shell写态密度相加的程序,但是运行起来非常非常的慢,所以后来我用C语言写了处理态密度的程序。
我的输入法不是很好所以经常有错别字,抱歉,发现请告知
下面开始了:
#!/bin/ksh
#ksh是linux下面的一种shell,指定shell类型。另一个常用的shell是bash。有些系统默认是bash而没有安装ksh,运行这个脚本就会出错。
# Script to break the VASP DOSCAR file into segments for # each atomic site. # JMS NRL 5/0/02
# Modified to also align the Fermi level from the ground state # to E=0.0
# JMS NRL 6/19/02
#注释信息。split_dos是JMS NRL发布的处理VASP输入输出文件的脚本包中的一个。
# Executables reside here #BIN=~/bin
#这里可以通过设置执行文件的位置,也可以设置PATH环境变量,例如: #export PATH=$PATH: (vp和split_dos所在的文件夹)
# GH: replace this so that it looks for vp in the same directory as this script EXE=$0
#$0即这个脚本split_dos,是完整路径
BIN=${EXE%/*}
#变量替换,获得split_dos所在的文件夹。%表示从后往前处理字符串EXE,删除匹配\正则表达式的部分,在bash下面试试你就知道了。
if [ $# -ne 0 ]; then
echo \ exit 2 fi
#$#表示跟在split_dos的参数个数。split_dos是不带参数的,所以如果$#!=0说明输入错误,停止程序。
# Script to split the DOSCAR file into the atomic # projections labeled by atom number dosfile=DOSCAR outfile=OUTCAR infile=INCAR #定义输入文件
# Token for splitting the files
token=$(sed -n '6 p' $dosfile | awk '{print $1}') #这样得到的是DOSCAR中的最高能量值
#|是管道,把左边的命令的输出输出给右边的命令作为输入。
#sed的作用是输入第六行,p表示答应,-n选项是不输出其他行(默认会打印整个文件)。 #awk就是把文件分割成很多列,$1表示第一列,print就是输出第一列。可以通过数学表达式对输出的列进行计算,例如:print $1^2,表示输出平方。
#sed 和awk是很强大的文本和字符串处理工具,功能没有perl强大但是方便快捷,适合在shellscript中用。强烈建议学习一下基本用法。
# Number of points
nl=$(sed -n '6 p' $dosfile | awk '{print $3}')
#得到DOSCAR中的分立能量值,即最高到最低中多少个能量,也就是有多少行要处理。
# Number of atoms
natom=$(sed -n '1 p' $dosfile | awk '{print $1}')
#原子个数,最后会得到多少DOS文件取决于这个数。
# Get the Fermi level if the OUTCAR file is present, # else we set it to zero. if [ -a $outfile ]; then
#如果存在OUTCAR,如下处理
echo \ echo \
efermi=$(grep \ #获取Fermi能
#grep是一个基本而强大的搜索文本的工具(不是shell自带),可以输出文本中匹配正则表达式的行。
#tail表示输出文件的末尾。-1表示最后一行,-10就表示最后10行(默认)。 echo \
nspin=$(grep \ #判断是否有自旋
if [ $nspin -eq 2 ]; then
echo \ else
echo \ fi
# 2.a
# JMS 2/3/03 Modified to accept specification by LORBIT token. #
lorbit=$(grep \ #获取LORBIT的值
if [ $lorbit -eq 10 ]; then echo \
echo \
echo \ form=1
elif [ $lorbit -eq 11 ];then echo \
echo \
echo \ form=2 else
#不同的LORBIT采用不同的处理,有form这个变量标志。
# 2.a
rwigs=$(grep \ #获取所谓的wig半径
if [ $rwigs -eq -100 ]; then
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库VASP处理split_dos(3)在线全文阅读。
相关推荐: