|
¡ï ¡ï cenwanglai(½ð±Ò+1):лл²ÎÓë zzy870720z(½ð±Ò+1):лл½»Á÷ 2010-09-23 12:01:20 cenwanglai(½ð±Ò+5):¿´¿´ÏÈ£¬ºÇºÇ¡£Ð»Ð»·ÖÏí£¡ 2010-09-24 09:39:44 cenwanglai(½ð±Ò+2):лл»Ø¸´£¡ 2010-09-29 11:13:12
ÎÒµÄÊäÈë·¨²»ÊǺܺÃËùÒÔ¾³£Óдí±ð×Ö£¬±§Ç¸£¬·¢ÏÖÇë¸æÖª
ÏÂÃ濪ʼÁË£º
#!/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ÊDz»´ø²ÎÊýµÄ£¬ËùÒÔÈç¹û$#!=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Ñ¡ÏîÊDz»Êä³öÆäËûÐУ¨Ä¬ÈÏ»á´òÓ¡Õû¸öÎļþ£©¡£
#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 \n", "#", $2, $3, $4}' >| 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ÊDZê¼ÇµÚ¼¸¸öÔ×ӵıäÁ¿¡£
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", $1+(-1)*'$efermi', $2, -1*$3, $4, -1*$5, $6, -1*$7}' >> DOS$i
#Èç¹ûÊÇ×ÔÐý¼ÆË㣬ÄÇô¾Í°´¸ñʽÊä³ö£¬²¢ÇÒ°Ñ×ÔÐý³¯ÏµijËÒÔ-1,·½±ãºóÃæ»Í¼¡£
#sedÖ¸¶¨Êä³ö´Óstartµ½endµÄÐУ¬awkÖ¸¶¨Êä³ö¸ñʽ²¢ÇÒ×öÄÜÁ¿µÄ´¦Àí£¨Æ½ÒÆ·ÑÃ×Äܵ½Áãµã£©
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
#¶Ô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", $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
#ÒÔÉ϶¼ÊǺÍ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+(-1)*'$efermi', $2, -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Êä³ö£¬Æäʵ¾Í³¤Ò»µã£¬¸ñʽûÓÐʲôÀ§ÄÑ¡£
#ÕâÀïµÄÎÊÌâÊDz»ÂÛÊÇÔ×Ó£¬¶¼»áÊä³öÕâô³¤µÄÒ»´®£¬¼´Ê¹Ã»ÓÐ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", $1+(-1)*'$efermi', $2, $3 }' >> DOS$i
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¡£
ÎÒµÄÊäÈë·¨²»ÊǺܺÃËùÒÔ¾³£Óдí±ð×Ö£¬±§Ç¸£¬·¢ÏÖÇë¸æÖª
[ Last edited by bingmou on 2010-9-23 at 19:20 ] |
|