您的当前位置:首页VASP处理split_dos

VASP处理split_dos

2022-05-26 来源:乌哈旅游
实例1

split-dos的工作原理

我算了一个BaTiO3单胞,5个原子,加上总的态密度应该一共6组数据。但是计算结果的DOSCAR中却有1+5*7,36组数据,不知道每组数据对应什么?用split-dos脚本处理之后,确实生成了DOS0……DOS5,这是怎么生成的?脚本看不懂,望指教其原理。我对比过DOS4和DOSCAR,里面的数据没相同的。

PS:是不是一定要运行vp后才能运行split-dos?

split_dos是把费米能级算进去了的,所以能量会有不同 但是其他的应该只是从DOSCAR里面提取出来的。

可以给我发第一列是能量 后面的分别是s-up s-down p-up p-down d-up d-down

从 脚本上看 vp 不是必须的

实例2

电子态密度图是怎么做的?

我看好多文献在做电子结构计算时,都有态密度图,请问这是怎么作的?装个p4vasp,里面可以导入计算所得到的vasp.xml文件,选择electronic -> DOS+BAND就可以画出态密度图,然后Graph -> export 就可以到处数据到Origin中画图。p4vasp还可以处理各种PDOS,并自动把自旋向下的电子态密度数据设为负值,非常方便。

我不用P4VASP 行吗?直接从DOSCAR里找出数据画图或者用split-dos给分割一下之后画图 这样做也是正确的吧?

实例3

split_dos运行

我将split_dos 和vp放在vasp第一次运行后的同一个目录下,然后运行,出现结果./split_dos[94]: /vp: not found [No such file or directory] 请问是什么原因,在split_dos应该修改路径吗

赋予执行属性

是chmod 755 split_dos吧 我赋予了呀。split_dos中不用改路径吗,我的目录下都没bin文件

那就是你缺少一个vp

修正版的splitdos有三个文件:vp、 sumdos和split_dos.ksh

实例4

散尽金币求split_dos 运行

1 我将split_dos 与vp 放在 需要计算的文件夹下 然后在当前目录运行 sh split_dos 出现以下错误

zhangkun@zhangkun-desktop:~/band750$ sh split_dos : not found2: : not found3: : not found8: : not found11: : not found12: : not found18:

: No such file or directory set: 20: Illegal option -A

zhangkun@zhangkun-desktop:~/band750$ 请问是怎么回事 ? 怎样才能计算出呢

2 还有为什么我自己编译的vasp p4vasp 不能读入vasprun.xml文件呢 有没有别的方法 求的局域态密度的呢

我用了split-dos 通过读入procar文件 这几个需要输入的参数是什么含义啊 为什么会显示数组越界呢

我有自己些的分开DOS文件的shell,不知道和你用的split_dos功能一样不,如果需要站内PM我

运行shell时不用 sh split_dos直接 . /split_dos就行了

我有自己些的分开DOS文件的shell,不知道和你用的split_dos功能一样不,如果需要站内PM我

实例5

VASP计算出来的PDOS怎么画图啊?求指教

用origin 画图软件画,你把VASP计算出来的PDOS弄成txt格式(当然得从DOSCAR 中 split dos 得到,这个需要小程序,你自己搜一下),有两列,一列能量,一列态密度,直接用origin打开就行。这个软件很有用的,像画能带结构什么的都是用的到的。做分子模拟和材料计算 material studio 和 origin 是必不可少的,论坛上有这两个软件的教程,自己学习一下。还有就是计算

然后: ./split_dos这样他就会帮你执行啦

实例6

VASP 分波态密度 求助: 我算一个有Zn,O,H的体系,在用VASP计算态密度的时候,用的是PAW势,在INCAR里设置LORBIT=11计算, 用split-dos程序分割每个原子的分波态密度,竟然在O原子里看到了有d电子的成分,觉得很奇怪,后来以为是INCAR的设置有问题,于是舍弃LORBIT=11, 换成RWIGS ,将Zn,O,H三个元素的Weige-Size 半径写到INCAR里,可是最后得到的DOSCAR里连每个原子的dos 都没有,只有一个总的dos.请教大家一下,这

到底是为什么,要如何设置才能得到每个原子正确的分波态密度。

应该还是要设LORBIT=11这个参数的,至于O出现d的成份,很正常,因为PAW里面O默认的RWIGS偏大有可能把金属原子的d成份包括进去了,不过你可以把O原子所谓的p和d画在一起看看,你会发现d相对于p来说很小,几乎可以忽略不计,而且其所在的能量范围也比p高(可能就是金属原子的d所在能量范围)。

我查了一下O的dos,发现d电子的量还是非常大,在有的能级上能和O的p电子同量级,甚至有的比p电子的量还大。

这是一个O原子的PDOS,第二个是第一个在费米能级附近的放大图

曾经尝试过手动输入RWIGS,调节O的RWIGS,当然我的体系中只含一个氧原子,调节总的DOS影响不大,且尽可能保证OUTCAR中的volume of typ 接近100%。可以消除O的D态。

至于楼主说的没有分波态密度,猜测莫非不是静态计算,因为优化过程不产生DOS。

实例7

怎样移动态密度图DOS的费米能级Ef才是正确的呢?

问题:为了同其他模型对比,计算出了晶体硅Si在gama点的态密度图,如下图所示,但老师说费米能级是错的。

计算按标准计算DOS步骤进行,经过了自洽计算->非自洽计算->DOSCAR分割,使用vdos脚本分割DOSCAR时已经自动移动了费米能级。

可是经过这样做得到的费米能级似乎是错的,其位置应该是在红色点线附近才对。不知应该怎样移动费米能级才是正确的呢?从图中看应该移动大约2 eV左右,但这个值从哪里得到。

盼高手解答。

附:

1、晶体硅Si的计算模型图

2、VASP计算的INCAR文件、KPOINTS文件。

INCAR文件(非自洽计算) general:

System = Crystal Si cell

ISTART = 0 ; ICHARG=11 #自洽计算 ICHARG=2; 非自洽计算 ICHARG=11 PREC=Accurate ENCUT=320

ISMEAR = 0; SIGMA = 0.1 IALGO = 48 GGA=91 ISPIN=2

VOSKOWN = 1 AMIX=0.2 BMIX=0.0001 AMIX_MAG=0.8 BMIX_MAG=0.0001 MAGMOM= 8*0

LREAL = .FALSE. #option for system contain less than 20 atoms

NPAR = 1 LWAVE = .F.

LORBIT = 1 #非自洽计算选项,计算spd分波态密度 RWIGS = 1.312

非自洽计算gama点态密度DOS时的KPOINTS文件: K-Points 0 Gama 1 1 1 0 0 0

费米能级的移动是什么意思呢?

费米能级不是确定的吗?在自洽计算得到的OUTCAR文件中有的。在非自洽计算得到的OUTCAR文件中也有的。这两处得到的费米能级有些差别,有的似乎较大。

做split dos的时候,会从与DOSCAR放在一起的的OUTCAR文件中读费米能级E-fermi。然后就自动以这个费米能级为零点。

我个人觉得,费米能级算不准,不同软件,以及vasp中静态自洽和非自洽计算结果也有差别。所以有文献干脆不提费米能级,而只以价带顶为参考零点。

你的体系并不大,静态自洽的K点只取一个似乎不好,可以取7*7*7.

费米能级是否能算的准,比如费米能级是否能出现在浅受主能级与价带顶之间,或者本征绝然体带隙正中间?我没有算出来过。

1、费米能级是能够确定的。

费米能级由vdos脚本(或split_dos脚本)自动从DOSCAR中抽取出来的,然后得到上面的DOS图。

2、k点是故意选成单个gama点的。

由于我想看gama点的态密度,所以只设定了一个k点,因而k点个数是不必增加的。 3、费米能级的确会算不准。

之前查看过自洽计算和非自洽计算的OUTCAR,它们的费米能级有差别,因而在作图时应该考虑自洽计算和非自洽计算费米能级的差值。

我的困惑在于,现在图中标示的费米能级是错的,应该是在大约红线的位置,可是不知怎之前的自洽计算,k点取了多少?

自洽计算时的KPOINTS文件: K-Points 0 m

11 11 11 0 0 0

实例8

怎么使用DOSCAR画出DOS图形

• 我安装好VASP好长时间了,但是一直没有用过。这几天用别人的一个实例运行了一下,得到一些输出文件,但不知如何画DOS图。

不知道如何由输出文件DOSCAR,提取有用数据从而得到DOS图形。 请教大家:大致步骤和所用的工具。 另:我机器上安装过了Origin8.0。

好像直接可以输出DOS图!!

搜索下 P4VASP 或者split-dos 软件 都可以画dos

附件中的程序可以帮你处理,你用下看看

总DOS一般没多大用,一般投影到原子或轨道上更有用些。找到你要的那个原子,直接把数据拷出来,用ORIGIN画就是了

直接拷贝出来画图即可 如果你既做了自旋极化,又做了轨道投影,一般DOSCAR的结构为前301行的5列是:能量值 自旋向上的总态密度 自旋向下的总态密度 自旋向上的电子数 自旋向下的电子数 后面的是:能量值 s-up s-down py-up py-down pz-up

pz-down px-up px-down dxy-up dxy-down dyz-up dyz-down dz2 -up dz2-down dxz-up dxz-down dx2-up dx2-down 类推吧

在linux下你可以用xmgrace 或者用p4vasp先处理一下,再用xmgrace

推荐是gnuplot,可以写一个批处理文件,以后画同一类型的都可以统一画

实例9

DOSCAR分割问题 请教大家,vasp 计算的结果 输出有个DOSCAR文件,用于分析态密度的我用split_dos 工具分割此文件 ,会出现DOS0,DOS1.........; DOS1是第一个原子的分波态密度值,其中的第一列数据是能量值,第二、三、四列数据分别对应于s、p、d态的分波态密度值. 问题出现了,我这个原子没来d轨道,竟然出现第四列,这是上面原因呢?

第4列上的数字是0么?建议你用p4vasp做DOS图,快些

我没有设LORBIT 这个参数 按理 应出现energy s-DOS p-DOS d-DOS 我这个原子没来d轨道,竟然出现第四列 而且第四列不是0

不管算什么都会有d电子出现的。。。正常情况下d的值应该很小才对,画的时候可以忽略掉。

实例11同样情况下,不同的导出数据方法 态密度怎么不一样

RT

我是将DOSCAR中的数据转换成图中黑色的线,然后用小程序spilt_dos分出DOS0后,得到图中的红线,很明显,两者像是平移了一样,我有点怀疑是菲米能级的问题,用split_dos时其费米能级用的是静态计算的OUTCAR里的,但又不是很明白,麻烦大家帮帮忙。

另外,我用split_dos分出每一个原子的态密度之后,我想知道某些个原子的态密度的共同贡献,怎么处理呢,总不能一个一个DOSi 相加吧,这工作量很大啊,不知道高手们是怎么处理的?

你的菲米能级不一样造成的,自己看DOSCAR,确定那个的菲米能级是对的吧

恩 查了一下 应该是DOSCAR是以真正的费米能级,而split_dos 则是以零为费米能级的 。 请问您试着叠加过很多原子的DOS么?不能手动相加吧

没有 但是你可以徐程序相加 或者通过origin,excel也行

origin怎么相加啊 我的大约要相加100多个原子,而且每个原子的态密度文件中又是分S.P.D的

实例12读懂split_dos,学会linux shell编脚本处理数据

下面是处理VASP输出数据得到态密度的脚本文件split_dos,与它配合的vp没有贴出来。学习vasp如果会一些shell编程,对vasp的运用会更灵活方便。这个程序听说比较老,有些

问题,不能直接用来处理vasp4.6及以上版本的数据,也不能处理f电子。有兴趣的可以关注一下,看看语法本身,或者提出修改意见,都有BB鼓励。 :D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D:D

#!/bin/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

# Executables reside here

BIN=~/bin #把这里修改为

vp保存的路径。然后把

split_dos的路径添加到PATH中。

if [ $# -ne 0 ]; then #直接在

shell提示符下输入split_dos运行,否

则提醒Usage: split_dos,返回信息2.

echo \"Usage: split_dos\" exit 2 fi

# 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}') #这个

token后面好像没有用

到,有什么用呢?

# Number of points

nl=$(sed -n '6 p' $dosfile | awk '{print $3}')

# Number of atoms

natom=$(sed -n '1 p' $dosfile | awk '{print $1}')

# Get the Fermi level if the OUTCAR file is present, # else we set it to zero. if [ -a $outfile ]; then

echo \"The\" $outfile \"exists, we use it to get the Fermi level,\" echo \"the RWIGS tag and the number of spins.\"

efermi=$(grep \"E-fermi\" $outfile | tail -1 | awk '{print $3}') echo \"Fermi level:\" $efermi

nspin=$(grep \"ISPIN\" $outfile | tail -1 | awk '{print $3}') if [ $nspin -eq 2 ]; then

echo \"Spin polarized calculation\" else

echo \"Unpolarized calculation\" fi

# 2.a

# JMS 2/3/03 Modified to accept specification by LORBIT token. #

lorbit=$(grep \"LORBIT\" $outfile | tail -1 | awk '{print $3}') if [ $lorbit -ge 10 ]; then echo \"LORBIT > 10\"

echo \"WARNING: not completely test for vasp.4.*\"

echo \"Use at your own risk. Please check results for consistency.\" form=1 else # 2.a

rwigs=$(grep \"RWIGS\" $outfile | tail -1 | awk '{print $3}' | sed 's/\\.//g') if [ $rwigs -eq -100 ]; then

echo \"RWIGS token not set\" form=0 else

echo \"RWIGS token set\" form=1 fi # 2.a fi # 2.a

else

echo \"The\" $outfile \"does not exist, we set the Fermi level to 0\" echo \"assume an unpolarized calculation, and RWIGS not set\" 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.

#efermi=2.255 #form= #nspin=

# Get the atomic coordinates $BIN/vp >| tmp.dat

tail -$natom tmp.dat | awk '{printf \"%s %12.8f %12.8f %12.8f \\nmp.dat2

# Total is first DOS

if [ $form -eq 0 ]; then #这个很怪,为什么不直接i=0 else i=0

fi

start=7

end=$((start+nl-1)) #echo $start $end #exit 0 rm -f DOS0

if [ $form -eq 1 ]; then

while [ $i -le $natom ]; do

#echo $i $start $end

if [ $i -gt 0 ]; then

sed -n ''$i' p' tmp.dat2 >| DOS$i #读入对应原子位置坐标到

i=0呢?

DOSi

第一行

fi

if [ $i -gt 0 ]; then

# Atomic projected DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f \\n\$4, -1*$5, $6, -1*$7}' >> DOS$i else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f \\n\ fi

else

# Total DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f \\n\$4, -1*$5, $6, -1*$7}' >> DOS$i else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f \\n\ fi

else

# Total DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\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 \"Usage: split_dos\" 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 \"The\" $outfile \"exists, we use it to get the Fermi level,\" echo \"the RWIGS tag and the number of spins.\"

efermi=$(grep \"E-fermi\" $outfile | tail -1 | awk '{print $3}') #获取Fermi能

#grep是一个基本而强大的搜索文本的工具(不是shell自带),可以输出文本中匹配正则表达式的行。

#tail表示输出文件的末尾。-1表示最后一行,-10就表示最后10行(默认)。 echo \"Fermi level:\" $efermi

nspin=$(grep \"ISPIN\" $outfile | tail -1 | awk '{print $3}') #判断是否有自旋

if [ $nspin -eq 2 ]; then

echo \"Spin polarized calculation\" else

echo \"Unpolarized calculation\" fi

# 2.a

# JMS 2/3/03 Modified to accept specification by LORBIT token. #

lorbit=$(grep \"LORBIT\" $outfile | tail -1 | awk '{print $3}') #获取LORBIT的值

if [ $lorbit -eq 10 ]; then echo \"LORBIT = 10\"

echo \"WARNING: not completely test for vasp.4.*\"

echo \"Use at your own risk. Please check results for consistency.\" form=1

elif [ $lorbit -eq 11 ];then echo \"LORBIT = 11\"

echo \"WARNING: not completely test for vasp.4.*\"

echo \"Use at your own risk. Please check results for consistency.\" form=2 else

#不同的LORBIT采用不同的处理,有form这个变量标志。

# 2.a

rwigs=$(grep \"RWIGS\" $outfile | tail -1 | awk '{print $3}' | sed 's/\\.//g') #获取所谓的wig半径

if [ $rwigs -eq -100 ]; then

echo \"RWIGS token not set\" form=0 else

echo \"RWIGS token set\" form=1 fi fi # 2.a

else

#如果没有OUTCAR,那就自己设置一些参数:非自旋极化计算,费米能为0. echo \"The\" $outfile \"does not exist, we set the Fermi level to 0\" echo \"assume an unpolarized calculation, and RWIGS not set\" 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 \"%s %12.8f %12.8f %12.8f \\nmp.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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f \\n\$4, -1*$5, $6, -1*$7}' >> DOS$i

#如果是自旋计算,那么就按格式输出,并且把自旋朝下的乘以-1,方便后面画图。

#sed指定输出从start到end的行,awk指定输出格式并且做能量的处理(平移费米能到零点)

else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f \\n\ #没有自旋就简单多了,只需要平移就可以了。 fi

else

# Total DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f \\n\$4, -1*$5, $6, -1*$7}' >> DOS$i else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f \\n\ fi

else

# Total DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.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 \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i

else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\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是方便快捷的\"dirty\"处理。

#计算量大的程序,用fortran;处理大量文档和文本,用python或perl。

我的输入法不是很好所以经常有错别字,抱歉,发现请告知

PROCAR给出的信息非常多,但是和DOSCAR不一样,没有可比性。DOSCAR是给出态密度,而PROCAR是给出每个K点上面的每个能级的组合成分

实例13

关于VASP计算PDOS的疑问

小弟刚学VASP在计算完TDOS和PDOS之后,不知道怎么将DOS图画出来。后来找了个dos-procar.f的小脚本,不知道对不对。在处理之后得到的结果看不懂,以O原子为例:本

来O有s p 两个轨道,但是得到的ldos中一共有5列,其中第一列是能量,请问我怎么区分其余四列各是什么啊??

还有就是各位有什么更好的处理方式么?

用p4vasp作图,挺方便的。你可以到网上下载p4vasp。

vasp manual DOSCAR里边什么都有。。。

nanual中的情况跟我的结果对应不上啊

下了一个,但是安装完了之后提示错误说:AttributeRrror:'module‘ object has no attribute ’VisIsosurface Drawer_draw_as_points_set‘ 解决不了这个问题

对于画DOS我一般用的是split—dos来处理DOSCAR 的。至于DOSCAR里面有多少列,那么这个和你的设置有关系,建议仔细看看手册。

第2-5列分别是S、py、pz、px

实例14

态密度和能带问题 各位朋友:我现在遇到的问题是对同一体系计算的态密度和计算的能带对应不上,不知道为什么原因,我所想到的办法都试过了,还是那样子,请大家指教,谢谢你们了

能带是和态密度一一对应, 你认真查看你处理DOSCAR和EIGENVAL文件的方式, 有些软件的处理会出错的,比如split-dos或者p4vasp不可能对应不上的

你给出INCAR等更多信息,我们才好帮你解决。否则只能说,你一定算错什么了

我想这个计算可能出错的地方是,第一DOSCAR计算错了,第二,对于该体系的布里渊区的高对称点没有弄对,所以bands错了。仔细检查吧

检查一下高对称点,如果确认设置没错,可能像二楼说的后处理有问题,画能带的时候要考虑对称性,p4vasp等软件可能没有考虑,不知道楼主计算什么材料,有没有过渡金属?

在想来估计是两个fermi能级计算有点出入,所以就不能对应。

现在你可以用静态计算的Fermi能,统一一下,估计就没有问题了。

实例16

关于态密度问题

我现在做总态密度图和分拨态密度。但是我得出结果是总态密度文件夹DOS0中第二列出现有总的态密度值,但是分波态密度第二列什么也没有也就是都是0,我郁闷得很,不知道怎么回事,请大家帮助。

总态密度文件好分波态密度文件怎么能这样比较了。直接打开DOSCAR读~读数据不就很清

楚了

实例17

lev00处理PDOS

我用lev00处理DOS要得到PDOS图,首先是在做到输入: Chemical elment (character*2) of special 1> 我按我POSCAR顺序里面的La输入La (谰)元素,它提示:RROR! specials La has not been recognised! 但输入其他元素却可以? 然后是我的PROCAR 明明在目录文件下,它提示:FATAL! the file PROCAR is bad or absent! 我也碰到过这个情况,估计在Levoo中没有包含稀土元素。所以稀土的元素符号是不认的,其实你完全可以用其它levoo认可的元素符号代替。应该没有任何影响的。

我输入了其他元素替代稀土元素La 但老提示我的PROCAR有问题,我不知道是因为我输入的其他元素不行,还是其他什么的。但我计算应该没有问题,因为我算了好几次啊!

难道Lev00就不可以处理稀土元素了吗?有没有谁用 lev00 得到过正确的PDOS图?还是跟Lev00的版本有关系?

诶有关系的,你想这个只是一个符号的问题,计算出来的电子密度等文件已经是确定的了,那还有什么问题呢。我认为输入任何符号都对结果没有影响的。

那难道是我的PROCAR 错了,因为它老提示:FATAL! the file PROCAR is bad or absent! 可是我计算了好多次结果都这样啊!我INCAR里面设置计算PDOS的参数是 LORBIT = 1 ; NPAR = 1; RWIGS = 1.535 0.82 1.302 1.217

想问一下,用origin画d电子态密度图,自旋向上我把在DOSCAR中最后10列的前五列直接加起来,自旋向下我又把后五列加起来,横坐标能量减去费米能可以吗?

如果没记错的话,spin up & spin down应该是相间排列的

你可以再网上找个split-dos(忘记是个script还是f code),可以把DOSCAR按原子序号分开

如果没记错的话,spin up & spin down应该是相间排列的

你可以再网上找个split-dos(忘记是个script还是f code),可以把DOSCAR按原子序号分开

实例18

态密度图跟文献里面的怎么都不一样,求救 弛豫过程 System=L ENCUT=520 GGA=91

VOSKOWN=1 ISTART=0 ICHARG=2

ISMEAR=-5 SIGMA=0.2 ISPIN=2

MAGMOM=4*0 16*0 4*0 4 -4 -4 4 EDIFF=0.1E-05 EDIFFG=-0.03 IBRION=2 POTIM=0.5 NSW=200 ISIF=3 NPAR=1 NSIM=8

LPLANE=.TRUE. LSCALU=.FALSE. NBANDS=200 PREC=High LDAU=.TRUE. LDAUTYPE=2

LDAUL=-1 -1 -1 2 LDAUU=0.0 0.0 0.0 5.3 LDAUJ=0.0 0.0 0.0 1.0 LDAUPRINT=2 静态过程

System=L ENCUT=520 GGA=91

VOSKOWN=1 ISTART=0 ICHARG=2 ISMEAR=-5 SIGMA=0.2 ISPIN=2

MAGMOM=4*0 16*0 4*0 8 -8 -8 8 EDIFF=0.1E-05 EDIFFG=-0.03 IBRION=-1 POTIM=0.5 NSW=0 ISIF=3 PREC=High LDAU=.TRUE. LDAUTYPE=2

LDAUL=-1 -1 -1 2 LDAUU=0.0 0.0 0.0 5.3

LDAUJ=0.0 0.0 0.0 1.0 LDAUPRINT=2 态密度过程

System=L ENCUT=520 GGA=91

VOSKOWN=1 ISTART=1 ICHARG=11 ISMEAR=-5 SIGMA=0.2 ISPIN=2

MAGMOM=4*0 16*0 4*0 8 -8 -8 8 EDIFF=0.1E-05 EDIFFG=-0.03 #IBRION=-1 #POTIM=0.5 #NSW=0 ISIF=3 PREC=High LDAU=.TRUE. LDAUTYPE=2

LDAUL=-1 -1 -1 2 LDAUU=0.0 0.0 0.0 5.3 LDAUJ=0.0 0.0 0.0 1.0 LDAUPRINT=2

主要问题不是你说的那样,而是 bandgap 我一直都算不出文献的3.7eV,我DOS过程算出来都是1.5eV,但是静态过程可以得到3.6eV

文献DOS显示体系是磁性的, 你的DOS显示的是非磁性的。可能自洽计算就出了问题。检查一下磁量子数的初始值设置有没有问题。

哪位高手路过拔刀相助下呀。。。主要问题是这半导体材料的DOS应该不对称,结果对称了,

而且带隙3.7ev,我得到1.5 ev。。。。在静态得到的DOS有3.6ev

貌似你没设置LMAXMIX=4还有你的赝势确定是PAW的吗?

用PAW91的,所以设了GGA=91,LMAXMIX=4是什么作用啊?我之前设过半径,结果也没用,DOS图一直顽固的对称着。。。带隙也没有变

手册上说 +U计算时 LMAXMIX=4 有助于收敛 ,在态密度、能带计算(ICHARGE=11)时必须设置为LMAXMIX=4 ,否则有较大误差。PAW 是赝势产生的方法,你说的GGA 赝势是PW91。因为这个参数设置针对的是PAW方法产生的赝势,所以我问你的赝势是不是PAW方法产生的。

那我就在DOS过程设置ICHARGE=1,LMAXMIX=4 试试。。。。。。看看能不能有奇迹出现。。。 ICHARGE=11 希望会有奇迹出现

ICHARGE=11我之前算态密度的时候有设置过,没有设过LMAXMIX=4,很多设置不太清楚,就都用默认的了。。。真希望DOS图不要再对称了。。。

这个材料是否既有FM又有AFM态呢?有没有可能是因为文献中计算的是FM态,而你得到的却是AFM态,因此你的DOS是对称的。

没用过vasp,猜测MAGMOM=4*0 16*0 4*0 4 -4 -4 4 这一行是设置初试自旋吧?那么4个铁原子似乎是反铁磁排列啊,如果材料确实有AFM态,那么你最终得到的是AFM态也就不奇怪了。

另外你\"说得到带隙1.5 eV,在静态得到的DOS有3.6ev\"这里应该也有问题,如果确实是这么大的差别,那应该是某个过程的参数设置有误。但不太明确你的计算过程,是relax与scf得到的gap不同,还是scf与计算DOS中的gap不同?

我是AFM计算

我明白文献中为啥不对称了,是数据处理过程跟我不一样 我现在就是纠结DOS过程的band gap跟文献不同 静态过程画出来3.6ev,DOS过程是1.5左右

很奇怪的是我DOS过程跳了8步之后又从头跳,从头跳2步就没了

AFM得到对称的结果应该是正确的。但文献得到图更像是FM,除非是用了某种诡异的表述方法,所以最好确认一下。

gap不同这个问题还是需要确定的。如果只是与文献有差别,那很可能仅仅是使用的U值,或是其他函数、计算方法的区别造成的。但现在是自身的计算之间就有这种差别,那就是有某个错误在里面了。

不了解vasp,所以也不知道你的输入文件有没有问题,你提到的DOS计算中的那个现象可能会有些线索在里面吧

另外你说的”静态过程画出来3.6ev“是怎么做的?vasp在scf之后会自动给出gap值吗?

我是用split-dos切分静态过程的DOSCAR得到3.6的 文献AFM跟FM的图都是不对称的

我现在就是在试一下参数然后改变U值来看看能不能得到3.7的结果

我现在就是不懂哪个参数有问题,然后慢慢试

取太少了 就会有变化的 把静态计算的k点加大点吧,算dos的时候就可以不变了

我按文献的取7*3*5 也试过大的11*11*11 计算的时候出过错误提示 所以我又改成文献里面的了

实例19

帮我看看这里错误提示是什么意思?

fortcom: Warning: ./mod.F90, line 32: Because of COMMON, the alignment of object is inconsistent with its type [B0]

real*8::r0(3,nat),a0(3,nat),v0(3,nat),b0(3,nat),r01(3,nat),wme(nel),fat(3,nat)

应该是你common里面的B0在不同小节程序里面的定义不同导致矛盾 是个程序问题,试试看修补或者升级能不能解决。

common块在数据对齐上是按照定义的顺序,一旦对齐错误轻则类型和数据错误,重则程序崩溃。

实例20

WARNING: not completely test for vasp 4*. 在计算电子态密度时,用split_dos处理DOSCAR时出现了:WARNING: not completely test for vasp 4*. use at your own risk.please check results for consistency.是由于什么原因造成的啊?望高手指教一二,不胜感激。

程序中这么写的

lorbit=$(grep \"LORBIT\" $outfile | tail -1 | awk '{print $3}') if [ $lorbit -ge 10 ]; then echo \"LORBIT > 10\"

echo \"WARNING: not completely test for vasp.4.*\"

echo \"Use at your own risk. Please check results for consistency.\" form=1 else

意思是如果如果LORBIT>10它就会提示这条语句,放心不是错误。

实例21

DOSCAR用split_dos处理后不会看!

本人vasp初学,刚刚得到DOSCAR,然后用小工具split_dos处理,得到分割后的总态密度DOS0和各个原子的分态密度DOS1~DOSn,具体如下:

[img]http://pic.emuch.net/201009/20/886038_170745.png[/img

但是我看不懂,因为我的LORBIT=11,原子有104个,为什么输出的DOS只有从DOS0

到DOS10?并且对于任意一个分态密度,例如DOS11,我也不知道每列代表什么意思,具体的:

-9.18500000 0.00000000 0.00000000 0.00000000 -9.17500000 0.00000000 0.00000000 0.00000000 -9.16500000 0.00000000 0.00000000 0.00000000 -9.15500000 0.00000000 0.00000000 0.00000000 -9.14500000 0.00000000 0.00000000 0.00000000 -9.13500000 0.00000000 0.00000000 0.00000000 -9.12500000 0.00000000 0.00000000 0.00000000 -9.11500000 0.00000000 0.00000000 0.00000000 -9.10500000 0.00000000 0.00000000 0.00000000 -9.09500000 0.00000000 0.00000000 0.00000000 -9.08500000 0.00000000 0.00000000 0.00000000 -9.07500000 0.00000000 0.00000000 0.00000000 -9.06500000 0.00000000 0.00000000 0.00000000 -9.05500000 0.00000000 0.00000000 0.00000000 -9.04500000 0.00000000 0.00000000 0.00000000 -9.03500000 0.00000000 0.00000000 0.00000000 -9.02500000 0.00000000 0.00000000 0.00000000 -9.01500000 0.00000000 0.00000000 0.00000000 -9.00500000 0.00000000 0.00000000 0.00000000 -8.99500000 0.00000000 0.00000000 0.00000000 -8.98500000 0.00000000 0.00000000 0.00000000 -8.97500000 0.00000000 0.00000000 0.00000000 -8.96500000 0.00000000 0.00000000 0.00000000 这是一部分。我知道第一列是能量,后面四列是什么?

见附件。在Linux下,运行

cc -lm vaspdos.c -o vaspdos

得到可执行命令vaspdos,把它放到DOSCAR文件的同一目录下,然后准备一个输入文件pdos_input,里面存放相关参数,用以定义你要计算哪些原子的哪些轨道的PDOS。格式如下:

2 # Number of spins. This is the first line.

5 2 4 6 8 10 # The number of selected atoms followed by their atom indices. If the first number is 0, all atoms are calculated. If -1, the atoms in the range determined by the following two atom indices are calculated. For example, if '-1 12 15', then the PDOS of atoms numbered by 12, 13, 14 and 15 will be calculated. 1 # l. The azimuthal quantum number. -1 for all. -1 # m. The magnetic quantum number. 9 for all.

然后运行

vaspdos pdos_input 即可得到所需的结果。

这是split_dos的一个bug。

split_dos是shell脚本,所以可以直接看的。其实修改很简单的。修改后的: #!/bin/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

# Executables reside here #BIN=~/bin

# GH: replace this so that it looks for vp in the same directory as this script EXE=$0

BIN=${EXE%/*}

if [ $# -ne 0 ]; then

echo \"Usage: split_dos\" exit 2 fi

# 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}')

# Number of points

nl=$(sed -n '6 p' $dosfile | awk '{print $3}')

# Number of atoms

natom=$(sed -n '1 p' $dosfile | awk '{print $1}')

# Get the Fermi level if the OUTCAR file is present,

# else we set it to zero. if [ -a $outfile ]; then

echo \"The\" $outfile \"exists, we use it to get the Fermi level,\" echo \"the RWIGS tag and the number of spins.\"

efermi=$(grep \"E-fermi\" $outfile | tail -1 | awk '{print $3}') echo \"Fermi level:\" $efermi

nspin=$(grep \"ISPIN\" $outfile | tail -1 | awk '{print $3}') if [ $nspin -eq 2 ]; then

echo \"Spin polarized calculation\" else

echo \"Unpolarized calculation\" fi

# 2.a

# JMS 2/3/03 Modified to accept specification by LORBIT token. #

lorbit=$(grep \"LORBIT\" $outfile | tail -1 | awk '{print $3}') if [ $lorbit -eq 10 ]; then echo \"LORBIT = 10\"

echo \"WARNING: not completely test for vasp.4.*\"

echo \"Use at your own risk. Please check results for consistency.\" form=1

elif [ $lorbit -eq 11 ];then echo \"LORBIT = 11\"

echo \"WARNING: not completely test for vasp.4.*\"

echo \"Use at your own risk. Please check results for consistency.\" form=2 else # 2.a

rwigs=$(grep \"RWIGS\" $outfile | tail -1 | awk '{print $3}' | sed 's/\\.//g') if [ $rwigs -eq -100 ]; then

echo \"RWIGS token not set\" form=0 else

echo \"RWIGS token set\" form=1 fi # 2.a fi # 2.a

else

echo \"The\" $outfile \"does not exist, we set the Fermi level to 0\" echo \"assume an unpolarized calculation, and RWIGS not set\"

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.

#efermi=2.255 #form= #nspin=

# Get the atomic coordinates $BIN/vp >| tmp.dat

tail -$natom tmp.dat | awk '{printf \"%s %12.8f %12.8f %12.8f \\nmp.dat2

# Total is first DOS if [ $form -eq 0 ]; then i=0 else i=0 fi

start=7

end=$((start+nl-1)) echo $start $end #exit 0 rm -f DOS0

if [ $form -eq 1 ]; then

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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f \\n\$4, -1*$5, $6, -1*$7}' >> DOS$i else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f \\n\ fi

else

# Total DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\n\ fi

fi

start=$((end+2)) end=$((start+nl-1)) i=$((i+1)) done

elif [ $form -eq 0 ];then

# the form=0 is an unkown code! while [ $i -le 0 ]; 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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f \\n\$4, -1*$5, $6, -1*$7}' >> DOS$i else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f \\n\ fi

else

# Total DOS

if [ $nspin -eq 2 ]; then sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\n\ fi

fi

start=$((end+2)) end=$((start+nl-1)) i=$((i+1)) done

elif [ $form -eq 2 ];then

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 \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.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 else sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.8f %12.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 \"%12.8f %12.8f %12.8f %12.8f %12.8f \\n\$1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5 }' >> DOS$i else

sed -n ''$start','$end' p' $dosfile | awk '{printf \"%12.8f %12.8f %12.8f \\n\ fi

fi

start=$((end+2)) end=$((start+nl-1)) i=$((i+1)) done fi

exit 0

如果你理解DOSCAR的含义,还是自己写个程序来处理来的快,而且更灵活自如。我是自己写的,功能比这个强多了。比如任意某个原子的态密度,或者仅仅是这个原子的某个lm分量,或任意某几个原子的态密度的和,...。需要什么才提取什么。

而不是split_dos这样的管你需要不需要,都给你算出来。

因篇幅问题不能全部显示,请点此查看更多更全内容