木虫 (著名写手)
叶落鹰飞 ![]()
|
★ identation(金币+5):谢谢参与 identation(金币+40): 2010-04-25 23:36
这个一般来说都是自己写的, 很简单!
那个web site不是提供了程序.
它的输入文件为syml,输出文件为inp.kpt。(你会做能带吧,这个取点跟能带的取点宗旨是一样的.)
其中syml输入文件的格式如下:
8
15 15 15 15 15 15 15
G 0.0 0.0 0.0
K -0.33333333333 0.6666666666667 0.000000000
H -0.33333333333 0.6666666666667 0.500000000
A 0.0 0.0 0.5
G 0.0 0.0 0.0
M 0.0 0.5 0.0
L 0.0 0.5 0.5
A 0.0 0.0 0.5
第一行用来标记有多少个特殊k点,下面是这些特殊k点之间每个要分多少个k点,接着就是这些特殊k点的坐标。
把下面这个程序编译,执行即可.
c +---------------------------------------------------------
c For generating k-points along the high-symmetry lines in
c Brillouin zone and for calculate band-structures !
c +----------------------------------------------------------
C ---------'syml'---------
c 6 : nhighk
c 20 20 20 10 20 : ndiv(i)
c X 0.5 0.0 0.5 : labhk(1),phighk(1,1),........
c G 0.0 0.0 0.0
c L 0.5 0.5 0.5
c W 0.5 0.25 0.75
c K 0.375 0.375 0.75
c G 0.0 0.0 0.0
c direct & reciprocal lattice vectors over 'emin, emax' line
C -----------------------
c max k-points = 200
program gk
implicit real*8 (a-h,o-z)
character*2 labhk
dimension tkpt(200,3),pk(200,3),phighk(10,3)
dimension disk(200),dish(10),labhk(10)
dimension ndiv(10)
c
open(5,file='syml',status='old')
open(7,file='inp.kpt')
c
read(5,*) nhighk
read(5,*) (ndiv(i),i=1,nhighk-1)
do i=1,nhighk-1
ntkp=ntkp+ndiv(i)
enddo
ntotkpt=ntkp+1
if(nhighk>10)then
write(*,*)'Number of high-symmetry k points must < 10!'
STOP
endif
if(ntotkpt>200)then
write(*,*)'Total number of k points must <= 200!'
STOP
endif
do i=1, nhighk
read(5,*) labhk(i),(phighk(i,j),j=1,3)
enddo
write(*,*) (labhk(i),i=1,nhighk)
c
c----- generating k-points along high symmetric lines --------
c
c
pk(1,1)=phighk(1,1)
pk(1,2)=phighk(1,2)
pk(1,3)=phighk(1,3)
ii=1
do i = 2, nhighk
delx = (phighk(i,1) - phighk(i-1,1))/float(ndiv(i-1))
dely = (phighk(i,2) - phighk(i-1,2))/float(ndiv(i-1))
delz = (phighk(i,3) - phighk(i-1,3))/float(ndiv(i-1))
do j=1, ndiv(i-1)
ii = ii + 1
pk(ii,1) = pk(ii-1,1) + delx
pk(ii,2) = pk(ii-1,2) + dely
pk(ii,3) = pk(ii-1,3) + delz
enddo
enddo
c
10 format(A34)
weight=1.d0
do i=1,ntotkpt
write(7,200) pk(i,1),pk(i,2),pk(i,3),weight
enddo
200 format(3F10.6,F6.2)
stop
end
c----------------------- end ---------------------------
网站上说的很清楚!
如果你想把两个k点分成十份, 就把15换成10就可以了!
[ Last edited by gavinliu7390 on 2010-4-25 at 22:34 ] |
|