split_dos and vp 源文件(考古贴)

split_dos and vp 源文件

前言

目前这两个脚本已经没人用了,留个纪念。

1、Split_dos 源文件

#!/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
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 -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 \n", "#", $2, $3, $4}' >| tmp.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", $1+(-1)*'$efermi', $2, -1*$3, $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", $1+(-1)*'$efermi', $2, $3, $4 }' >> 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", $1+(-1)*'$efermi', $2, $3 }' >> DOS$i
     fi
        fi
 start=$((end+2))
 end=$((start+nl-1))
 i=$((i+1))
    done
else
    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", $1+(-1)*'$efermi', $2, -1*$3, $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", $1+(-1)*'$efermi', $2, $3, $4 }' >> 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", $1+(-1)*'$efermi', $2, $3 }' >> DOS$i
     fi
        fi
 start=$((end+2))
 end=$((start+nl-1))
 i=$((i+1))
    done
fi
exit 0

2、VP文件

注意,split_dos中默认路径为BIN/vp,vp所在文件夹要有POSCAR,OUTCAR
#用来得到原子坐标

#!/bin/ksh
# Script to grab the atomic positions from the
# OUTCAR VASP file and write them to a file for use
# with an xmol movie.
# J M Sullivan NRL 12/4/01
# Scale the forces by this factor for visualization
fscale=1
posfile=POSCAR
# Output file containing the data
outfile=OUTCAR
# Token to search for to get the atomic positions
token=POSITION
# Get the atom number types
set -A ntype $(sed -n '6 p' $posfile)
echo "Number of atom types:" ${#ntype[*]}
echo "Multiplicities of these types:" ${ntype[*]}
ns=${#ntype[*]}
i=0
natoms=0
while [ $i -le $((ns-1)) ]; do
    nt=${ntype[$i]}
    let natoms=$natoms+$nt
    i=$((i+1))
done
echo "Total number of atoms:" $natoms
 
# Get the atom labels from the OUTCAR file
set -A type
#_jms 4/2/03
#set -A label $(grep "POTCAR:" $outfile | head -$ns | sed 's/POTCAR://g' | sed 's/US//g')
#set -A label $(grep "POTCAR:" $outfile | head -$ns | sed 's/POTCAR://g' | sed 's/US//g'| sed 's/PAW//g' | awk '{print $1}')
set -A label $(grep "POTCAR:" $outfile | head -$ns | sed 's/POTCAR://g' | sed 's/US//g'| sed 's/PAW//g' | sed 's/_PBE//g' | awk '{print $1}')
#_jms 4/2/03
#label[1]=H1
echo ${label[*]}
nt=0
i=0
while [ $i -le $((ns-1)) ]; do
    j=1
    while [ $j -le ${ntype[$i]} ]; do
 nt=$((nt+1))
 j=$((j+1))
 type[$nt]=${label[$i]}
 #echo $nt ${type[$nt]}
    done
    i=$((i+1))
done
echo ${type[*]}
grep -n "$token" $outfile | sed 's/POSITION/\ POSITION/g' | sed 's/://g' >| tmp.dump
while read nstart trash
do
 nstart=$((nstart+2))
 nend=$((nstart+natoms-1))
 #nend=$(echo $nstart $natoms | awk '{print $1+$2-1}')
 #echo $nstart $nend
 echo $natoms
 echo
 sed -n ''$nstart','$nend' p' $outfile | awk '{printf "%12.9f %12.9f %12.9f %s %12.9f %12.9f %12.9f \n", $1, $2, $3, NR, '$fscale'*$4, '$fscale'*$5, '$fscale'*$6}' >| tmp.dump2
 i=1
 while read a b c
 do
  echo ${type[$i]} $a $b $c
  i=$((i+1)) 
 done < tmp.dump2
done < tmp.dump
rm -f tmp.dump tmp.dump2
exit 0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值