read(10,*) iii, iii, iii, ispin
read(10,*) (xxxx(i),i=1,5)
read(10,*) xxxx(6)
read(10,*) xx
read(10,*) yy
read(10,*) nn,nk,nbands
allocate(e(nk,nbands))
allocate(eup(nk,nbands))
allocate(edn(nk,nbands))
allocate(k(nk,3))
allocate(dk(0:nk))
allocate(x(1:nk))
wtk=0.2500000E-01
if(ispin.eq.2) then
open(13,file='bndup.dat')
open(14,file='bnddn.dat')
do i=1,nk
read(10,*)
read(10,*) (k(i,j),j=1,3),wtk
do j=1,nbands
read(10,*) jj,eup(i,j),edn(i,j)
enddo
enddo
do n=1,nk
dk(0)=0
if (n.eq.1) then
k0=k(n,
endif
a=k(n,-k0
dk(n)=dk(n-1)+sqrt(dot_product(a,a))
x(n)=dk(n)
k0=k(n,
enddo
do i=1,nk
write(13,9030) x(i), ((eup(i,j)-ef),j=1,nbands)
write(14,9030) x(i), ((edn(i,j)-ef),j=1,nbands)
enddo
else
open(11,file='bnd.dat')
do i=1,nk
read(10,*)
read(10,*) nosence,nosence,nosence,(k(i,j),j=1,3)
read(10,*)
do j=1,nbands
read(10,*) jj,e(i,j)
enddo
enddo
do n=1,nk
dk(0)=0
if (n.eq.1) then
k0=k(n,
endif
a=k(n,-k0
dk(n)=dk(n-1)+sqrt(dot_product(a,a))
x(n)=dk(n)
k0=k(n,
enddo
do i=1,nk
write(11,9030) x(i),((e(i,j)-ef),j=1,nbands)
enddo
endif
9030 format (1x,f9.4,2x ,2000(f12.6,2x))
stop
end program prog
采用VASP软件计算出相应的能带后,那就用origin,好多列用不同的y就可以了啊,不仅是能带计算,带自旋的态密度计算也同样处理。
一个处理能带数据的代码,先编译一下生成一个可执行程序,然后在你的vasp计算目录下面运行生成的可执行程序即可得到一个可以用origin处理的能带数据
如果没有考虑自旋转,生成的文件名是bnd.dat
考虑了自选,则生成两个文件bndup.dat和bnddn.dat,一个自旋向上,另一个是自旋向下
程序执行过程中会要你输入费米能级(单位是eV)。
bnd.dat文件中,第一列是x坐标(没有意义,画图的时候要把它的标度隐掉,并写上高对称点),它按KPOINTS中的高对点顺序依次排开。
程序从网上找的,自己相应改一下.......版权不属于我......呵呵
program prog
real, allocatable :: e(:, ,eup(:,,edn(:,
real, allocatable :: k(:, ,dk( ,x(
real, dimension(3) ::k0,a
real, dimension(6) ::xxxx
character(len=32):: xx, yy ,nosence
write(6,*) 'fermi level (eV)'
read(5,*) ef
open(10,file='EIGENVAL', status='old')
read(10,*) iii, iii, iii, ispin
read(10,*) (xxxx(i),i=1,5)
read(10,*) xxxx(6)
read(10,*) xx
read(10,*) yy
read(10,*) nn,nk,nbands
allocate(e(nk,nbands))
allocate(eup(nk,nbands))
allocate(edn(nk,nbands))
allocate(k(nk,3))
allocate(dk(0:nk))
allocate(x(1:nk))
wtk=0.2500000E-01
if(ispin.eq.2) then
open(13,file='bndup.dat')
open(14,file='bnddn.dat')
do i=1,nk
read(10,*)
read(10,*) (k(i,j),j=1,3),wtk
do j=1,nbands
read(10,*) jj,eup(i,j),edn(i,j)
enddo
enddo
do n=1,nk
dk(0)=0
if (n.eq.1) then
k0=k(n,
endif
a=k(n,-k0
dk(n)=dk(n-1)+sqrt(dot_product(a,a))
x(n)=dk(n)
k0=k(n,
enddo
do i=1,nk
write(13,9030) x(i), ((eup(i,j)-ef),j=1,nbands)
write(14,9030) x(i), ((edn(i,j)-ef),j=1,nbands)
enddo
else
open(11,file='bnd.dat')
do i=1,nk
read(10,*)
read(10,*) nosence,nosence,nosence,(k(i,j),j=1,3)
read(10,*)
do j=1,nbands
read(10,*) jj,e(i,j)
enddo
enddo
do n=1,nk
dk(0)=0
if (n.eq.1) then
k0=k(n,
endif
a=k(n,-k0
dk(n)=dk(n-1)+sqrt(dot_product(a,a))
x(n)=dk(n)
k0=k(n,
enddo
do i=1,nk
write(11,9030) x(i),((e(i,j)-ef),j=1,nbands)
enddo
endif
9030 format (1x,f9.4,2x ,2000(f12.6,2x))
stop
end program prog
学习一下~,
这个问题需要知道或查找到这些数据:
1、AZO的费米能级相对于真空能级的位置(AZO的费米能级一般进入到ZnO的导带中,其位置与Al的掺杂量等有关);
2、MgO的导带、价带相对于真空能级的位置。如果MgO是本征的(i-MgO),则其费米能级在禁带中央;否则其费米能级与掺杂水平等有关(需确认或查找)。
结合上述数据,再看看“半导体物理”一书中“金属-半导体接触”章节的知识就完全可以画出来了。(费米能级的知识在“半导体物理”一书中也有)