²é¿´: 2355  |  »Ø¸´: 1

hakuna

ľ³æ (ÖªÃû×÷¼Ò)

[½»Á÷] ´¦Àí̬ÃܶȵĽű¾£ºvasp_pdos.pyÒÑÓÐ1È˲ÎÓë

http://cmd.kist.re.kr/code/etc/vasp_pdos.py
CODE:
#!/usr/bin/python

##### by jhshin #####
##
## 1. Extract DOS and from DOSCAR of VASP
## 2. Analysis DOS by distribution moment Eq.
##
## 2010.12.2
##########

import os
import sys

from getopt               import getopt
from numpy                import array
from ase.io               import *     
from ase.calculators.vasp import Vasp
from ase.calculators.vasp import VaspDos
from ase.dft              import get_distribution_moment

outcar_name_q = " OUTCAR name      > "
doscar_name_q = " DOSCAR name      > "
atom_list_q   = " Atom index       > "
orbit_list_q  = " Orbital          > "
en_range_q    = " Energy Min. Max. > "
screen_q      = " Screen on/off    > "

#####  Check and read options  #####
optlist, args = getopt(sys.argv[1:], 'hs')

help = 0 ; script = 0

for op,p in optlist:
  if op == '-h'   : help        = 1
  if op == '-s'   : script      = 1

if help==1:
  print ""
  print " Wellcome!"
  print ""
  print " Usage) ./vasp_pdos.py                : Input variables directly."
  print "        ./vasp_pdos.py < vasp_pdos.in : Use script file generated by user."
  print "        ./vasp_pdos.py -h             : Print explanation of this utility."
  print "        ./vasp_pdos.py -s             : Generate the sample script file named"
  print "                                        as 'vasp_pdos.in'."
  print "        ./vasp_pdos.py -hs (or) -sh   : Use 'h' and then 's' option, or inversly."
  print ""
  print " For all variables, see bellow. () is a default value"
  print ""
  print " - OUTCAR name : one string(OUTCAR), name of OUTCAR file"
  print "   ex) OUTCAR.xXX0"
  print ""
  print " - DOSCAR name : one string(DOSCAR), name of DOSCAR file"
  print "   ex) DOSCAR.xXX0"
  print ""
  print " - Atom index : list of integer, from 0 to # of total atoms"
  print "   ex) 0 1 2 3"
  print ""
  print " - Orbital : list of strings, which orbital to plot"
  print ""
  print "                     | Phase factor : X       | Phase factor : O          "
  print "   ==================.========================.==========================="
  print "                     | s                      | s                         "
  print "    Spin-unpolarized | p                      | px py pz                  "
  print "                     | d                      | dxy dyz dz2 dxz dx2       "
  print "   ------------------.------------------------.---------------------------"
  print "                     | s-up s-down (or) s+ s- | s-up s-down (or) s+ s-    "
  print "    Spin-polarized   | p-up p-down (or) p+ p- | px-up  ...  (or) px+ ...  "
  print "                     | d-up d-down (or) d+ d- | dxy-up ...  (or) dxy+ ... "
  print "   ex) s d"
  print ""
  print " - Energy Min. Max. : list of integer(* *), minimum and maximum of energy range"
  print "   ex) -10.0 5.0"
  print ""
  print " - Screen on/off : one integer(0), 0 is off and 1 is on"
  print ""
  print " Thanks!!\n"
  exit()

if script==1:
  print ""
  print " Edit 'vasp_pdos.in' file !!\n"
  in_script = open("vasp_pdos.in", 'wb')
  in_script.write( "%s\n"   % outcar_name_q)
  in_script.write( "%s\n"   % doscar_name_q)
  in_script.write( "%s\n"   % atom_list_q  )
  in_script.write( "%s\n"   % orbit_list_q )
  in_script.write( "%s\n"   % en_range_q   )
  in_script.write( "%s\n\n" % screen_q     )
  in_script.write( "# Enter values on the right side of '>'\n")
  in_script.write( "# Orbital list | (s) s  (p) px py pz  (d) dxy dyz dz2 dxz dx2")

  in_script.close()
  exit()
##########

#####  Input variables  #####
print ""
print " Wellcome! Enter bellow."
print " If you want to use a default value, do not enter anything."
print " ----------------------------------------------------------\n"
print " < Input variables >"
print ""
print " - Orbital list | (s) s  (p) px py pz  (d) dxy dyz dz2 dxz dx2"
print ""

print outcar_name_q, ; outcar_name = raw_input().replace(outcar_name_q,"")
if len(outcar_name) == outcar_name.count(" "): outcar_name="OUTCAR"
outcar_name = outcar_name.replace(" ","")
print "", outcar_name

print doscar_name_q, ; doscar_name = raw_input().replace(doscar_name_q,"")
if len(doscar_name) == doscar_name.count(" "): doscar_name="DOSCAR"
doscar_name = doscar_name.replace(" ","")
print "", doscar_name

print atom_list_q, ; atom_list   = raw_input().replace(atom_list_q,"").split()   
if len(atom_list) == 0:
  print "Enter list of integers!"
  exit()
print "", atom_list

print orbit_list_q, ; orbit_list  = raw_input().replace(orbit_list_q,"").split()   
if len(orbit_list) == 0:
  print "Enter list of strings!"
  exit()
print "", orbit_list

print en_range_q, ; en_range    = raw_input().replace(en_range_q,"")
if len(en_range) == en_range.count(" "): en_range="* *"
en_range = en_range.split()
print "", en_range

print screen_q, ; screen      = raw_input().replace(screen_q,"")
if len(screen) == screen.count(" "): screen="0"
screen = screen.replace(" ","")
print "", screen

print ""
print " ----------------------------------------------------------\n"
##########

#####  Read OUTCAR and DOSCAR  #####
fermiEn = (os.popen('grep E-fermi %s | cut -d":" -f 2' % outcar_name)).read().split()[0]
fermiEn = float(fermiEn)

doscar  = VaspDos(doscar=doscar_name)
doscar.read_doscar(doscar_name)

en_list  = array(doscar._get_energy()) -fermiEn

if en_range[0] == "*": en_min = min(en_list)
else: en_min = float(en_range[0])

if en_range[1] == "*": en_max = max(en_list)
else: en_max = float(en_range[1])
##########

#####  Prepare output  #####
outfile2_name  = doscar_name + ".info.out"
outfile2       = open(outfile2_name, 'wb')
gpInFile       = open("gnuplot.in", 'wb')

print          " < Output results >"
print          "\n# %10s %13s %16s %16s\n" % ("Atom index", "Elec. count", "Band center", "Band width")
outfile2.write("\n# %10s %13s %16s %16s\n" % ("Atom index", "Elec. count", "Band center", "Band width"))
##########

#####  Main loop : make DOS data and analysis  #####
sum=0
orbit0=""
dos_list0 = []

for atom in atom_list:
  for orbit in orbit_list:
    atom  = int(atom)

    if orbit == "+":
      sum = 1
      if len(orbit0)==0 : orbit0= orbit
      dos_list0 = dos_list

    else:
      dos_list = doscar.site_dos(atom, orbit)

      if sum==1:
        orbit = orbit0 + orbit
        orbit0 = orbit
        dos_list = dos_list + dos_list0
        sum = 0

      outfile1_name = str(doscar_name + ".atom" + str(atom) + orbit + "Orbit" + ".dat")
      outfile1      = open(outfile1_name, 'wb')

      en_list_mod  = []
      dos_list_mod = []
      i=0
      for en in en_list:
        dos = dos_list[i]
        if en_min < en < en_max:
          en_list_mod.append(en)
          dos_list_mod.append(dos)
          outfile1.write(' %16.6lf %9.6lf\n' % (en, dos))
        i += 1

      volume, center, width = get_distribution_moment(en_list_mod, dos_list_mod, (0,1,2))
      print          "  %10d %13.3lf %16.6lf %16.6lf     # %s"   % (atom, volume, center, width, orbit + " orbital")
      outfile2.write("  %10d %13.3lf %16.6lf %16.6lf     # %s\n" % (atom, volume, center, width, orbit + " orbital"))

      if str(atom) + str(orbit) == atom_list[0] + orbit_list[0]:
        gpInFile.write ("plot   '%s' w l\n" % outfile1_name)
      else:
        gpInFile.write ("replot '%s' w l\n" % outfile1_name)
##########

#####  Post-precessing  #####
outfile2.write('\n')

outfile1.close()
outfile2.close()
gpInFile.close()

if screen == '1': os.popen('gnuplot -persist gnuplot.in')

print ""
print " End\n"
##########

»Ø¸´´ËÂ¥

» ÊÕ¼±¾ÌûµÄÌÔÌùר¼­ÍƼö

¾«»ªÍøÌûÊÕ¼¯ ¼ÆËã-vasp vasp

» ²ÂÄãϲ»¶

» ±¾Ö÷ÌâÏà¹Ø¼ÛÖµÌùÍƼö£¬¶ÔÄúͬÑùÓаïÖú:

ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû

512771485

½ð³æ (СÓÐÃûÆø)

²©Ê¿

¡ï
Сľ³æ: ½ð±Ò+0.5, ¸ø¸öºì°ü£¬Ð»Ð»»ØÌû
ÎÒÖ»Ïë˵£¬Óò»¶®£¬Ò»¿ªÊ¼¾ÍÊDz»Í£µÄÊäÈë
ŬÁ¦×öÑо¿£¬ÔçЩ³ö³É¹û
2Â¥2015-07-16 17:27:04
ÒÑÔÄ   »Ø¸´´ËÂ¥   ¹Ø×¢TA ¸øTA·¢ÏûÏ¢ ËÍTAºì»¨ TAµÄ»ØÌû
Ïà¹Ø°æ¿éÌøת ÎÒÒª¶©ÔÄÂ¥Ö÷ hakuna µÄÖ÷Ìâ¸üÐÂ
×î¾ßÈËÆøÈÈÌûÍƼö [²é¿´È«²¿] ×÷Õß »Ø/¿´ ×îºó·¢±í
[»ù½ðÉêÇë] ¹ú×ÔÈ»»ù½ð¹«²¼µÄʱºò»ù½ðºÅÓÐÂð +8 äìÈ÷âùϧ 2024-06-13 11/550 2024-06-14 11:24 by JRfei
[˶²©¼ÒÔ°] ¹ØÓÚ˶²©Á¬¶ÁµÄһЩÒÉÎÊ£¿ +3 Lwenter 2024-06-14 3/150 2024-06-14 10:32 by JinèÖ×Ó
[½Ìʦ֮¼Ò] ÎÒÃÇѧԺ³£Äêλ¾Ó ¸÷ѧԺ µ¹ÊýµÚ¶þ¡£×¨Òµ³·ÏúµÄ»°£¬ÔÚ±àÕßÓÐʲô²¹³¥£¿ +12 ºÓÎ÷Ò¹ÀÉ 2024-06-09 13/650 2024-06-14 09:27 by dhdhgfv
[ÕÒ¹¤×÷] º¼µç¡¢Ìì½ò¿Æ¼¼¡¢ÇàÅ©ºÍÄþ²¨¹¤³ÌѧԺÈçºÎÑ¡£¿ +4 ζµÀºÜºÃ°¡ 2024-06-13 4/200 2024-06-14 09:05 by forever411
[ÂÛÎÄͶ¸å] ×î½üдÁËһƪ¿ØÖÆÓÅ»¯ÁìÓòµÄÎÄÕ£¬¿ÉÒÔͶÄÄÀï°¡£¿ÓÐûÓÐˮһЩµÄÆÚ¿¯ÍƼö +7 Ïã¹ÏľÏã 2024-06-12 13/650 2024-06-14 07:05 by Ïã¹ÏľÏã
[ÂÛÎÄͶ¸å] ÎÄÕÂproofÒªÇóʹÓûú¹¹µÄÓÊÏä 5+3 ²»¿É²»ÐÅÔµ 2024-06-11 11/550 2024-06-14 07:00 by 3001160025
[Óлú½»Á÷] ³µ¼äÉú²ú£¬Õæ¿Õ¶ÈºÜ¸ß£¬Î¶Ⱥܸߣ¬µ«¼õѹÕôÁóËٶȺÜÂý¡£ 10+9 ÕÙ»½¹íÆülL 2024-06-13 29/1450 2024-06-14 06:53 by gcl348
[»ù½ðÉêÇë] E12ÃæÉÏÉêÇë +3 ºº·çÖ®ÒÅ 2024-06-13 3/150 2024-06-14 06:48 by ÎÒÊÇÍõС˧
[»ù½ðÉêÇë] ¹¤²ÄE10¿Úº¯ÆÀ½áÊøÁËÂð 10+3 ÎÒ1µÄ·ÉÏè 2024-06-13 5/250 2024-06-14 06:35 by nono2009
[ÂÛÎÄͶ¸å] Ͷ¸åºó·¢ÏÖÆäËû×÷ÕßµÄÓÊÏäÌî´íÁ˸ÃÔõô°ìѽ 10+4 ÔڷɵÄÖí 2024-06-13 6/300 2024-06-14 04:45 by С³æ×ÓßÇßÇ
[˶²©¼ÒÔ°] ˶²©¾ÞÓ¤£¬Ò²Ðí²Å¸Õ¸Õ¿ªÊ¼ +22 SNaiL1995 2024-06-12 52/2600 2024-06-14 04:36 by SNaiL1995
[Óлú½»Á÷] ÐýÕôÇë½Ì +6 °ì¹«ÊÒÃþÓã 2024-06-09 9/450 2024-06-13 21:31 by wuxiaominggo
[»ù½ðÉêÇë] ²©Ê¿ºóÃæÉÏÏîĿ״̬»¹ÊÇר¼ÒÆÀÉóÂð 10+9 Thatcheremu 2024-06-13 55/2750 2024-06-13 21:23 by ÎÚºÏ÷è÷ë
[˶²©¼ÒÔ°] ¿ÆÑÐÇóÖú +5 ê½www 2024-06-12 6/300 2024-06-13 16:16 by ÐÕÀîÃûÃ÷
[ÂÛÎÄͶ¸å] with editorÈÕÆÚ±ä¸ü +3 É÷¶ÀµÄС»¨¾í 2024-06-12 8/400 2024-06-13 11:00 by É÷¶ÀµÄС»¨¾í
[½Ìʦ֮¼Ò] ¸±½ÌÊÚÌø²Û +24 €Ðì·ïÄê 2024-06-07 26/1300 2024-06-13 08:36 by Fanninger
[ÕÒ¹¤×÷] ³É¶¼²úÆ·ÖÊÁ¿¼ì²âÑо¿Ôº 200+3 ¾¨Óã663 2024-06-11 8/400 2024-06-13 08:10 by ¼ÓÄɾÓÊ¿
[»ù½ðÉêÇë] ²©ºóÌØÖúÕâÖܳö½á¹ûÂð£¿ÍùÄ궼ÊÇɶʱºò°¡£¿ +13 jsqy 2024-06-12 17/850 2024-06-12 19:55 by Lynn212
[ÂÛÎÄͶ¸å] ¼ÆËã»úÀ࣬ÇëÎÊeswaÓëkbsÄĸöÏà¶ÔÀ´ËµÈÝÒ×һЩ°¡£¿ +3 chenrui2015 2024-06-08 4/200 2024-06-11 13:37 by p-cloud
[¿¼²©] Ï£ÍûÄÜ25²©Ê¿Èëѧ£¬¿ÉÌáÇ°Ò»Äê×ö¿ÆÑÐÖúÀí +3 ¸É·¹°æС̫Ñô 2024-06-09 7/350 2024-06-10 00:05 by ¸É·¹°æС̫Ñô
ÐÅÏ¢Ìáʾ
ÇëÌî´¦ÀíÒâ¼û