24小时热门版块排行榜    

查看: 1350  |  回复: 4

hakuna

木虫 (知名作家)

[交流] 【分享】一个绘制band的python小程序 已有4人参与

网上淘来的,向作者致敬!
不做能带,不懂python,未经测试
原文地址:http://people.vanderbilt.edu/~brandon.g.cook/vaspbandplot/vband.py
CODE:
!/usr/bin/env python

#make a simple plot of band structure from vasp calculation
# -Brandon Cook April 7, 2010

from numpy import *
import pylab

class OUTCAR():
    def __init__(self):

        f = open('OUTCAR', 'r')
        s = f.read()
        f.close()
        
        i = s.find('E-fermi')
        self.ef = float(s[i:i+19].split()[-1])
        
        i = s.find('NBANDS')
        self.nbands = int(s[i:i+15].split()[-1])

        i = s.find('NKPTS')
        self.nkpts = int(s[i:i+15].split()[-1])



class KPOINTS():
    def __init__(self):
        # kpts file should be in line mode
        # only take 1 line for now

        f = open('KPOINTS', 'r')
        s = f.readlines()
        f.close()
        
        l1 = s[-2].split()
        l2 = s[-1].split()

        self.p1 = array([ l1[0], l1[1], l1[2] ], float)
        self.p2 = array([ l2[0], l2[1], l2[2] ], float)

class BandStructure():
    # Just take all the points and make a scatter plot
    # todo: connect the lines

    def __init__(self):
        f = open('EIGENVAL', 'r')
        s = f.readlines()
        f.close()
        
        oc = OUTCAR()
        kp = KPOINTS()

        axis = kp.p2 - kp.p1
        axis /= linalg.norm(axis)

        nbands = oc.nbands
        nkpts  = oc.nkpts
        
        kpts = zeros( nkpts*nbands )
        en   = zeros( nkpts*nbands )

        istart = 7
        for k in range(0, nkpts):
            ik = istart + k*(nbands+2)
            kpt = s[ik].split()
            
            kpt = array([kpt[0], kpt[1], kpt[2]], float)
            
            x = dot(kpt, axis)
            
            i1 = k*nbands
            i2 = (k+1)*nbands
            kpts[i1:i2] = x

            for ib in range(0, nbands):
                j1 = ik + 1 + ib
                j2 = i1 + ib
                en[j2] = float(s[j1].split()[-1])


        pylab.scatter(kpts, en, s=1)

        # add a line for the fermi energy
        xmin = 0.0
        xmax = linalg.norm(kp.p2 - kp.p1)
        x = linspace(xmin, xmax, num=100, endpoint=True)
        y = oc.ef * ones(100)
        pylab.plot(x,y)

        pylab.show()


o = OUTCAR()
print 'fermi energy, nbands, nkpts'
print o.ef,o.nbands,o.nkpts


b = BandStructure()

回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

sg18408926

至尊木虫 (著名写手)

不错啊
2楼2010-12-26 20:43:52
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

gavinliu7390

木虫 (著名写手)

叶落鹰飞


小木虫(金币+0.5):给个红包,谢谢回帖交流
执行不了, 错误很多。
真理是一点点接近的!
3楼2010-12-27 10:44:18
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

westmonster

金虫 (正式写手)

pylab是嘛?孤陋寡闻了,改改还是能用的,谢谢楼主分享。
蝉,于其脱壳展翅,则蛰居地下,似无声无息,实则以备有所为。
4楼2010-12-27 12:54:53
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

akakcolin

金虫 (著名写手)

python 是个好语言啊
为人应当诚实正直不能心怀叵测心眼明亮才能迎来幸福避开灾祸盲目者若有人指点才不会迷失道路若单独上路就难以保证不误入岐途
5楼2010-12-27 23:09:27
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 hakuna 的主题更新
普通表情 高级回复 (可上传附件)
信息提示
请填处理意见