77范文网 - 专业文章范例文档资料分享平台

VASP处理split_dos(3)

来源:网络收集 时间:2019-06-11 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

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)在线全文阅读。

VASP处理split_dos(3).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/658172.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: