二、能带结构计算
计算fcc Cu的能带结构
&control
calculation='bands'
pseudo_dir = './',
outdir='./',
prefix='cu'
/
&system
ibrav = 2, celldm(1) =6.73, nat= 1, ntyp= 1,
ecutwfc = 25.0, ecutrho = 300.0, nbnd = 8
/
&electrons
diagonalization='david'
/
ATOMIC_SPECIES
Cu 63.55 Cu.pz-d-rrkjus.UPF
ATOMIC_POSITIONS
Cu 0.0 0.0 0.0
K_POINTS
28
0.0 0.0 0.0 1.0
0.0 0.0 0.1 1.0
0.0 0.0 0.2 1.0
0.0 0.0 0.3 1.0
0.0 0.0 0.4 1.0
0.0 0.0 0.5 1.0
0.0 0.0 0.6 1.0
0.0 0.0 0.7 1.0
0.0 0.0 0.8 1.0
0.0 0.0 0.9 1.0
0.0 0.0 1.0 1.0
0.0 0.0 0.0 1.0
0.0 0.1 0.1 1.0
0.0 0.2 0.2 1.0
0.0 0.3 0.3 1.0
0.0 0.4 0.4 1.0
0.0 0.5 0.5 1.0
0.0 0.6 0.6 1.0
0.0 0.7 0.7 1.0
0.0 0.8 0.8 1.0
0.0 0.9 0.9 1.0
0.0 1.0 1.0 1.0
0.0 0.0 0.0 1.0
0.1 0.1 0.1 1.0
0.2 0.2 0.2 1.0
0.3 0.3 0.3 1.0
0.4 0.4 0.4 1.0
0.5 0.5 0.5 1.0
解释:
在进行能带计算时,calculation须设置为'bands',而且在此之前须进行一次相应的自洽计算,而且要有上一步计算得到输出文件供能带计算时读入。另外最好在&system中设置nbnd,以指定计算多少条能带。在计算能带时要自己先选定一些高对称点,并产生这些高对称点之间其他点。在这个例子中,计算沿G-X-L点之间的高对称线上的能带。
在产生所要计算的特殊k点时,可以采用下面简单的f77程序来实现:
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 ---------------------------
它的输入文件为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
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 ---------------------------
它的输入文件为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点的坐标。
产生的inp.kpt可以之间拷贝到pw.x在计算能带时的输入文件中。