I've made some small modifications of SRC_tetra, such that it can
calculate the DOS only for tetrahedra which contain the desired k-point.
a) Check case.klist and select the k-point of your choice (eg. Gamma as
number 1, or XX for any other selection.
b) modify case.int as: (3rd line)
PbTiO3 #Title
-0.91780 0.002 .9915901704 0.003 #Emin, DE, Emax, Gauss-Broad
11 N 0.000 KSEL=1 #Number of DOS-cases,G/L/B
broadening (Ry), KSELect=XX
Using the keyword KSEL= directs tetra to integrate only those tetrahedra
which contain the selected k-point.
A negative number (-XX) (or no KSEL=) switches this off and the regular
integration happens.
Depending on the density of your -mesh, it will cover a certain volume
of the BZ (a few percent ...).
NOTE: At the moment you cannot add this up for 2 different k-points,
since X1 and X2 may share the same tetrahedron and thus double counting
occurs. It would be straight forward, however, to specify several
k-points at the same time and use all tetrahedra which contain at least
one of the selected k-points ....
On 8/28/19 8:59 AM, Peter Blaha wrote:
Not with standard wien2k tools.
However, you can write your own little programs, eg.
reading the case.qtl file for an arbitrary k-mesh of your choice and do
a "root sampling", i.e. divide your energy mesh into some intervals and
count the number of eigenvalues (times the multiplicity of the k-point)
in each E-interval. Plot the corresponding histogram.
An alternative is to modify tetra such, that instead of summing over all
tetrahedra, it sums only over those involving k-points of your choice.
For this you need to understand the case.kgen file, which lists the
vertices of all tetrahedra and you select only thos which contain the
desired k-points.
On 8/27/19 6:12 PM, Jens Biegert wrote:
Dear All,
I was wondering wether I can get the DOS, or better PDOS, for a
specified k-path. Say, instead of an integration over the whole
Brillouin zone, just (like for the bandstructure) along gamma to K to
M to gamma.
If not possible, can I restrict 3D k-space integration close to e.g.
the K point such as to get the PDOS close to K?
I saw some previous answers that seem to hint at this not being
possible, but it was not clear to me.
Best regards,
Jens Biegert
_______________________________________________
Wien mailing list
[email protected]
http://zeus.theochem.tuwien.ac.at/mailman/listinfo/wien
SEARCH the MAILING-LIST at:
http://www.mail-archive.com/[email protected]/index.html
--
P.Blaha
--------------------------------------------------------------------------
Peter BLAHA, Inst.f. Materials Chemistry, TU Vienna, A-1060 Vienna
Phone: +43-1-58801-165300 FAX: +43-1-58801-165982
Email: [email protected] WIEN2k: http://www.wien2k.at
WWW: http://www.imc.tuwien.ac.at/TC_Blaha
--------------------------------------------------------------------------
PROGRAM TETRA
!
! D E N S I T Y O F S T A T E S
! ACTUAL VERSION with BLOECHL SCHEME
!
use reallocate
INCLUDE 'param.inc'
CHARACTER *7 A7
CHARACTER *9 A9,B9
CHARACTER *20 TITLE
CHARACTER*120,allocatable :: TEXT(:)
CHARACTER *70 SYSTEM
CHARACTER*11 FORM,STATUS
CHARACTER*180 FNAME,fname1,fname2
CHARACTER*80 errfn
character*2 fnameupdn,fnum2
character*1 fnum1 ,abrsw
!
real*4,allocatable :: RNUMB(:,:), DENSTY(:,:),dsum(:)
real*4 fermden(MG)
COMMON /NCOUNT/ NNOC
real*4,pointer :: EBS(:,:), FC(:,:,:)
CHARACTER *14 DOSTYP(MG)
DIMENSION IDOS(MG,2)
real*4,allocatable :: QTL(:,:),xqtl(:,:)
real*4,allocatable :: ehelp(:),denbr(:,:)
integer,allocatable :: isumdos(:,:)
logical rxes,rxesw,enefile
common /rxescom/ rxes,rxesw
!
DATA PI /3.141592654/, EEF /0.0/
!--------------------------------------------------------------------
! call getarg(2,fname)
rxes=.false.
rxesw=.false.
enefile=.false.
CALL GTFNAM(fname,ERRFN)
! if(fname.eq.' ') call getarg(1,fname)
OPEN(1,FILE=fname,STATUS='OLD',ERR=8000)
8003 READ(1,*,END=8001) IUNIT,FNAME,STATUS,FORM,IRECL
OPEN(IUNIT,FILE=FNAME,STATUS=STATUS,FORM=FORM,ERR=8002)
if(iunit.eq.7) then
do i=180,5,-1
if(fname(i:i).eq.'1') then
nnchar=i-1
fname1(1:i-1)=fname(1:i-1)
fnameupdn=''
GOTO 8003
else if(fname(i:i).eq.'p') then
nnchar=i-3
fname1(1:i-3)=fname(1:i-3)
fnameupdn='up'
GOTO 8003
else if(fname(i:i).eq.'n') then
nnchar=i-3
fname1(1:i-3)=fname(1:i-3)
fnameupdn='dn'
GOTO 8003
endif
enddo
endif
if(iunit.eq.108) then
enefile=.true.
kspin=2
if(fnameupdn.eq.'') kspin=1
endif
if(iunit.eq.8) then
rxes=.true.
read(8,'(a)')system
write(6,'("RXES spectroscopy for",a )') system
endif
if(iunit.eq.9) then
rxesw=.true.
write(6,'("RXES spectroscopy weight file case.rxes calculated")')
endif
GOTO 8003
8000 WRITE(*,*) ' ERROR IN OPENING TETRA.DEF !!!!'
STOP 'TETRA.DEF'
8002 WRITE(*,*) ' ERROR IN OPENING UNIT:',IUNIT
WRITE(*,*) ' FILENAME: ',FNAME,' STATUS: ',STATUS,' FORM:',FORM
STOP 'OPEN FAILED'
8001 CONTINUE
CLOSE (1)
!----------------------------------------------------------------------
READ(5,1) TITLE
IAV=0
NPRINT=1
! MI=1000
eef=999.
! EEF=0.
! NST number of k points
! IAV 0 NO PLOT OTHERWISE DOS AVERAGED OVER IAV VALUES
! NPRINT 0 NO DOS PRINTED
! 1 DOS AND INTEGRATED DOS PRINTED
! NYMIN LOWER BAND INDEX
! NYMAX UPPER BAND INDEX
! ZEL NUMBER OF ELECTRONS
! EMIN,DE,EMAX ENERGY GRID FOR DOS
!
! DOS1 DOS: GES, S, P, D, EG, T2G, F, FOR ATOM NR.1
! DOS2 DOS: S, ... F, OUT FOR ATOM NR.2
!
!***** FIRST PRINTED ENERGY ON DOS PLOT IS
!***** E0 + (IAV-1) * DE / 2 + 4 * DE * IAV
!***** E.G.IAV=5 FIRST ENERGY E0 + 22*DE
!***** NEXT AT 25*DE HIGHER
!
! read(5,*) nst
read(3,*) nst
rewind 3
! if(nst.gt.nktot) then
! write(*,*) ' nktot',nktot,' .lt. nst=',nst
! stop
! end if
! READ(5,*) NYMIN,NYMAX
! read(5,*) ZEL
nymin=1
! nymax=nbtot
prev=0.d0
! prev: Gaussian broadening parameter in Ry!!!
read(5,*,ERR=4848) EMIN,DE,EMAX,prev
4848 continue
! if(nymax.gt.nbtot) then
! write(*,*) ' nbtot',nbtot,' .lt. nymax=',nymax
! stop
! end if
ibrsw=-1 !use tetra by default
br=0.01
brlor=0.01
read(5,'(a)') system
READ(system,*,end=123,err=123) NNDOS,abrsw,br
if(abrsw.eq.'G') then
ibrsw=1
else if(abrsw.eq.'L') then
ibrsw=0
brlor=br
else if(abrsw.eq.'B') then
ibrsw=2
READ(system,*,err=123,end=123) NNDOS,abrsw,br,brlor
endif
123 continue
do i=1,65
if(system(i:i).eq.'#') exit
if(system(i:i+4).eq.'KSEL=') then
read(system(i+5:70),*) kselect
print*,'DOS for tetrahedra around K=',kselect
exit
endif
enddo
if(ibrsw.ge.0) then
print*,'using broadening method instead of TETRA',ibrsw,br,brlor
write(6,*)'using broadening method instead of TETRA',ibrsw,br,brlor
endif
if(nndos.gt.mg) stop 'mg too small, TETRA does not support more the 51 cases'
!
if(nndos.gt.1 .and. enefile) then
STOP 'NNDOS must be 1 when using case.energy file'
endif
! reading case.energy instead of case.qtl
if(enefile) then
779 read(109,'(A)',end=997) system
if(system(1:4).ne.':FER') goto 779
do i=1,69
if(system(i:i).eq.'=') exit
enddo
read(system(i+1:70),*) EFERM
eef=EFERM
spin=1.d0
if(KSPIN.eq.2) spin=0.5d0
KSO=0
SO=1.d0
NSORT=1
KLMAX=1
allocate( TEXT(0:Nsort+1),QTL(Nsort+1,klmax+1),xqtl(nsort,lxdos2*(lxdos2+1)) )
IDOS(1,1)=0
IDOS(1,2)=0
DOSTYP(1)='TOTAL'
NRBAND=99999999
emax1=-999.d0
nbtot=1000
allocate (EBS(Nst,NBTOT), FC(MG,Nst,NBTOT))
do k=1,nst
777 read(108,'(3e19.10,i10,6x,i6)',err=777,end=999) xk,xk,zk,numk,ne
NRBAND=min(NRBAND,ne)
if(ne.gt.nbtot) then
nbtot=ne*1.5
call doreallocate(ebs, nst, nbtot)
call doreallocate(fc, mg, nst, nbtot)
endif
do i=1,ne
read(108,*) i1,ebs(numk,i)
enddo
enddo
do i=1,NRBAND
BMIN=10000.
BMAX=-10000.
do k=1,nst
BMIN=AMIN1(ebs(k,i),BMIN)
BMAX=AMAX1(ebs(k,i),BMAX)
enddo
WRITE(6,14) i,BMIN,BMAX
emax1=amax1(bmin,emax1)
enddo
nymax=NRBAND
if(emax.gt.emax1) then
write(6,*) ' EMAX reduced due to lower HIGHEST BAND-minimum'
emax=emax1
endif
!
fc=1.d0*spin
endif
! end reading case.energy
WRITE(6,3) TITLE
WRITE(6,4) IAV,NPRINT
! WRITE(6,5) NYMIN,NYMAX
WRITE(6,7) NNDOS
!
nnsum_dos=0
if(enefile) goto 200 ! read case.energy instead of case.qtl
REWIND 4
READ(4,1000) SYSTEM
READ(4,1010) ALAT1,ALAT2,ALAT3,EFERM
READ(4,1020) MINWAV,MAXWAV,KSPIN,NSORT,kso,kLmax
if(klmax.eq.0) klmax=14
allocate( TEXT(0:Nsort+1),QTL(Nsort+1,klmax+1),xqtl(nsort,lxdos2*(lxdos2+1)) )
! INCREASE NSORT BY ONE FOR THE INTERSTITIAL DOS (OUT)
NSORT=NSORT+1
WRITE(6,2000) SYSTEM
WRITE(6,2010) ALAT1,ALAT2,ALAT3,EFERM
WRITE(6,2020) MINWAV,MAXWAV,KSPIN,NSORT
eef=eferm
SPIN=1.d0
IF(KSPIN.EQ.2) SPIN=0.5d0
so=1.d0
if(kso.eq.2) then
so=2.d0
spin=spin/2.d0
endif
!
! 106 KAT=NST*NSORT
!
DO 107 ISORT=1,NSORT
IF(ISORT.EQ.NSORT) GOTO 107
READ(4,1030) JATOM,NEQU,isplit,text(isort)
WRITE(6,2030) JATOM,NEQU,isplit,text(isort)
107 CONTINUE
nndos_save=nndos
DO 90 JCASE=1,NNDOS
READ(5,*,err=998) IATOM,ICOLUM !,DOSTYP(JCASE)
IDOS(JCASE,1)=IATOM
IDOS(JCASE,2)=ICOLUM
call parsetext(iatom,icolum,dostyp(jcase),text(iatom))
IF(IATOM.EQ.0) THEN
IDOS(JCASE,2)=0
ENDIF
WRITE(6,25) JCASE,IDOS(JCASE,1),IDOS(JCASE,2),DOSTYP(JCASE)
90 CONTINUE
nnsum_dos=0
read(5,'(a)',end=91) system
if(system(1:3).ne.'SUM') goto 91
read(system(5:70),*,ERR=91,END=91) nnsum_dos,nnsum_dos_max
if(nnsum_dos.gt.7) then
nnsum_dos=7
print*,':WARNING: maximal NNSUM_DOS=7, input truncated'
endif
WRITE(6,*) 'We will add ',nnsum_dos,' DOS-cases together:'
allocate(isumdos(nnsum_dos,nnsum_dos_max),dsum(nnsum_dos))
isumdos=0
do i=1,nnsum_dos
read(5,'(a)') system
READ(system,*,end=92,err=92) (isumdos(i,j),j=1,nnsum_dos_max)
92 continue
write(6,'("adding:",99i3)') (isumdos(i,j),j=1,nnsum_dos_max)
enddo
91 continue
! in spin.pol SO case set total DOS to DOS of interstital (=normso)
if(kso.eq.2.and.kspin.eq.2) then
DO JCASE=1,NNDOS
if(IDOS(JCASE,1).eq.0) then
IDOS(JCASE,1)=NSORT
IDOS(JCASE,2)=1
ENDIF
enddo
endif
text(nsort)=' '
!
emax1=-999.d0
nbtot=1000
allocate (EBS(Nst,NBTOT), FC(MG,Nst,NBTOT))
ny=0
115 NY=NY+1
if(ny.gt.nbtot) then
nbtot=nbtot*2
call doreallocate(ebs, nst, nbtot)
call doreallocate(fc, mg, nst, nbtot)
endif
read(4,'(a)',end=141) title
READ(title,1041,err=1042) NRBAND
goto 1043
1042 READ(title,1040) NRBAND
1043 continue
BMIN=10000.
BMAX=-10000.
DO 120 I=1,NST
DO 113 ISORT=1,NSORT
READ(4,1050,err=114) EVAL,ISRT,( QTL(ISORT,J), J=1,klmax+1 )
! WRITE(6,1050) EVAL,ISRT,( QTL(ISORT,J), J=1,13 )
if(text(isort)(13:20).eq.'xdos(i,j') then
if(lxdos.ne.3) stop 'LXDOS must be 3 for ISPLIT 99 or 88'
read(4,208)(xqtl(isort,i1),i1=1,(lxdos2)*(lxdos2+1))
else if(text(isort)(13:20).eq.'xdos(i,i') then
read(4,208)(xqtl(isort,i1),i1=1,lxdos2)
endif
goto 113
114 print*,'qtl-reading error',eval,isrt,( QTL(ISORT,J), J=1,klmax+1 ),'BAND',nrband,'K=',i,'ISORT=',isort
stop 'error reading qtl-file'
113 CONTINUE
EBS(I,NY)=EVAL
BMIN=AMIN1(EVAL,BMIN)
BMAX=AMAX1(EVAL,BMAX)
DO 201 NDOS=1,NNDOS
IAT=IDOS(NDOS,1)
JAT=IDOS(NDOS,2)
if(iat.gt.NSORT) stop 'iat in input too large'
IF(IAT.EQ.0) FC(NDOS,I,NY)=1.d0*SPIN
! IF(IAT.GT.0.and.jat.le.14)then
IF(IAT.GT.0.and.jat.le.klmax+1)then
FC(NDOS,I,NY)=QTL(IAT,JAT)*SPIN*so
else if(IAT.GT.0) then
FC(NDOS,I,NY)=xQTL(IAT,JAT-100)*SPIN
endif
201 continue
120 CONTINUE
!
WRITE(6,14) NRBAND,BMIN,BMAX
emax1=amax1(bmin,emax1)
goto 115
141 nymax=ny-1
if(emax.gt.emax1) then
write(6,*) ' EMAX reduced due to lower HIGHEST BAND-minimum'
emax=emax1
endif
200 CONTINUE
!
JEND=1 + (EMAX-EMIN)/DE
if(jend.lt.1) stop 'Error: Energy mesh not ok'
allocate (RNUMB(jend,MG), DENSTY(jend,MG))
allocate (ehelp(jend),denbr(jend,mg))
DENSTY=0.0
RNUMB=0.0
write(6,55) EMIN,DE,EMAX
if(rxesw) then
! if(jend.ne.1) then
! print*, "For RXESW switch exactly ONE energy must be specified in case.int"
! stop 'Error: RXESW-select only one energy'
! endif
! if(nndos.ne.1) then
! print*, "For RXESW switch only ONE DOS must be specified in case.int"
! stop 'Error: RXESW-select only one DOS'
! endif
write(9,'("Energy",2f6.3," atom,column",7(i4,i3))') emin,emax,(IDOS(j,1),IDOS(j,2),j=1,nndos)
write(6,'(/,"RXES weight file case.rxes calculated", &
& " for Atom",i4," col=",i3," Energy=",2f8.4,/)') &
IDOS(1,1),IDOS(1,2),emin,emax
endif
CALL ARBDOS (0,NNDOS,1,JEND,EMIN,EMAX,NYMIN,NYMAX,DE,ebs,fc,nst,rnumb,densty,kselect)
if(nst.eq.1.and.ibrsw.eq.-1) then ! for one k-point calculate the DOS with broadening
ibrsw=1
if(br.lt.1.d-6) then
br=0.002
! print*,' No broadening specified, increasing broadening to',br
endif
print*,'Only 1 k-point, switching to Gauss-broadening with',br
Write(6,*) 'Only 1 k-point, switching to Gauss-broadening with',br
endif
if(ibrsw.ne.-1) then
CALL broadDOS (ibrsw,br,brlor,NNDOS,1,JEND,EMIN,EMAX,NYMIN,NYMAX,DE,ebs,fc,nst,densty)
endif
!
!.....WRITE OUT RESULTS TO DOS FILES
IFILE=6
ilmin=1
do 295 j=1,jend
if(emin+(j-1)*de.ge.eef) then
if(idos(1,1).eq.0) zel=rnumb(j,1)
jef=j
goto 300
endif
295 continue
300 CONTINUE
IFILE=IFILE+1
if(ifile.gt.7) then
close(ifile-1)
close(ifile-1+50)
fname=''
fname2=''
if(ifile-6.lt.10) then
write(fnum1,'(i1)') ifile-6
fname=fname1(1:nnchar)//fnum1//fnameupdn
fname2=fname1(1:nnchar)//fnum1//'ev'//fnameupdn
else
write(fnum2,'(i2)') ifile-6
fname=fname1(1:nnchar)//fnum2//fnameupdn
fname2=fname1(1:nnchar)//fnum2//'ev'//fnameupdn
endif
print*,'openfilename:',fname
OPEN(ifile,FILE=fname,STATUS='unknown')
OPEN(ifile+50,FILE=fname2,STATUS='unknown')
endif
IL=MIN0(7,NNDOS)
ilmax=il+ilmin-1
WRITE(IFILE,15) TITLE,EEF,IL,JEND,prev
WRITE(IFILE,217) (DOSTYP(IX),IX=ilmin,ILmax)
WRITE(IFILE+50,15) TITLE,0.0,IL,JEND,prev
WRITE(IFILE+50,217) (DOSTYP(IX),IX=ilmin,ILmax)
WRITE(6,15) TITLE,EEF,IL,JEND,prev
if(idos(1,1).eq.0) then
! write(6,44) zel
if(spin.eq.1.d0) then
write(6,*) 'DOS in states/Ry'
else
write(6,*) 'DOS in states/Ry/spin'
endif
endif
!
DO J=1,JEND
Ehelp(j)=EMIN+(J-1)*DE
enddo
do IND=ILMIN,ILMAX
call Broad(prev,jend,ehelp,DENSTY(1,IND),denbr(1,ind))
enddo
write(6,44) (rnumb(jef,ix),ix=ilmin,ilmax)
WRITE(6,117) (IDOS(IX,1),DOSTYP(IX),IX=ilmin,ILmax)
!
DO J=1,JEND
ENRG=EMIN+(J-1)*DE
WRITE(6,16) ENRG,(DENSTY(J,IND)*2.d0,RNUMB(J,IND),IND=ILMIN,ILMAX)
WRITE(IFILE,116) ENRG,(DENbr(J,IND)*2.d0,IND=ILMIN,ILMAX)
WRITE(IFILE+50,116) (ENRG-eef)*13.605698,(DENbr(J,IND)/13.605698*2.d0,IND=ILMIN,ILMAX)
IF(ENRG.GE.eferm.AND.enrg-DE.LE.eferm.and.j.gt.1) THEN
DO ind=ilmin,ilmax
fermden(ind)=2.d0*((eferm-enrg+de)*DENSTY(J,IND)+(enrg-eferm)*DENSTY(J-1,IND))/de
ENDDO
ENDIF
ENDDO
240 CONTINUE
NNDOS=NNDOS-7
WRITE(6,*) '******** EF and DOS at fermi level *******'
WRITE(6,'(f9.5,7(F9.2,9x))') eferm,(fermDEN(ind),ind=ILMIN,ilmax)
! AM (2.80)
DO ind=ilmin,ilmax
! fermDEN(ind)=fermDEN(ind)/2.d0*(8.617D-5)**2*(pi**2)/3.d0*2.6255D6/27.212d0*1000.d0
fermDEN(ind)=fermDEN(ind)*(pi**2)/3.d0*(6.3336303d-6)**2*6.0221d23*13.605698d0*1.60219d-19*1000.d0
ENDDO
WRITE(6,*) 'Gamma in mJ/(mol cell K**2). (Divide by number of formula units in cell to get it per mole only)'
WRITE(6,'(A9,7(F9.2,9x))') 'Cv/T ',(fermDEN(ind),ind=ILMIN,ilmax)
ilmin=ilmin+7
IF(NNDOS.GT.0) GOTO 300
! summing up some DOS columns
if(nnsum_dos.gt.0) then
do i=1,nnsum_dos
WRITE(6,1176) i,(isumdos(i,i1),i1=1,nnsum_dos_max)
write(dostyp(i),'(7i2)') (isumdos(i,i1),i1=1,min(7,nnsum_dos_max))
enddo
WRITE(6,1177) (i1,i1=1,nnsum_dos)
fname=fname1(1:nnchar)//'sum'//fnameupdn
fname2=fname1(1:nnchar)//'sumev'//fnameupdn
print*,'openfilename:',fname
OPEN(ifile,FILE=fname,STATUS='unknown')
OPEN(ifile+50,FILE=fname2,STATUS='unknown')
WRITE(IFILE,15) TITLE,EEF,IL,JEND,prev
WRITE(IFILE,217) (DOSTYP(IX),IX=1,nnsum_dos)
WRITE(IFILE+50,15) TITLE,0.0,IL,JEND,prev
WRITE(IFILE+50,217) (DOSTYP(IX),IX=1,nnsum_dos)
DO J=1,JEND
ENRG=EMIN+(J-1)*DE
dsum=0.d0
do i=1,nnsum_dos
do i1=1,nnsum_dos_max
if(isumdos(i,i1).eq.0) exit
! dsum(i)=dsum(i)+DENSTY(J,isumdos(i,i1))*2.d0
dsum(i)=dsum(i)+DENbr(J,isumdos(i,i1))*2.d0
enddo
enddo
WRITE(6,116) ENRG,(Dsum(i),i=1,nnsum_dos)
WRITE(IFILE,116) ENRG,(Dsum(i),i=1,nnsum_dos)
WRITE(IFILE+50,116) (ENRG-eef)*13.605698,(Dsum(i)/13.605698,i=1,nnsum_dos)
enddo
endif
!DOS at Fermi
STOP ' LEGAL END TETRA'
997 print*, "ERROR when reading EF from case.scf2"
STOP 'Error when reading case.scf2'
998 print*, "ERROR when reading the DOS-cases in case.int"
STOP 'Error when reading case.int'
999 print*, "ERROR when reading case.energy"
STOP 'Error when reading case.energy'
!
1 FORMAT(A20)
! 1 FORMAT(A20/A4,/I2/I2)
2 FORMAT(2I3/F10.5/3F10.5)
3 FORMAT(1X,A20/)
4 FORMAT(1X,'IAV',25X,':',I3,/,1X,'NPRINT',22X,':',I3)
44 Format(/,1X,'NUMBER OF ELECTRONS UP TO EF:',/,':CTOTAL: ',7(F10.4,9x))
5 FORMAT(1X,'LOWER AND UPPER BAND-INDEX',2X,':',2I5)
55 format(1X,'EMIN, DE, EMAX',14X,':',3F10.5,/)
6 FORMAT(I5)
7 FORMAT(1X,I2,' CASES FOR DOS',12X,': ATOM L')
13 FORMAT(8X,I2)
14 FORMAT(' BAND LIMITS OF BAND',I4,' ARE',2F10.5)
15 FORMAT('# ',A20,/,'#EF=',F10.5,5X,'NDOS=',I2,5X,'NENRG=',I5,' Gaussian bradening:',f8.5)
16 FORMAT(f9.5,7(F9.2,f9.4))
116 FORMAT(f10.5,7f14.8)
117 FORMAT('# ENERGY',1X,7(1x,I3,1X,A14))
1175 FORMAT(//,'DOS summed up for following columns:')
1176 FORMAT('Sum',i3,':',1X,7I3)
1177 FORMAT('# ENERGY',1X,7(5x,I3,6X))
217 FORMAT('# ENERGY',2X,7(A14,1x))
18 FORMAT(' ATOM NO.',I3,4X,A6,'-CHARGE',F10.5)
19 FORMAT(A72/17X,3F9.5,18X,F7.4/5X,I3,9X,I2,11X,I3)
20 FORMAT(A7,F4.1,1X,A9,F8.5,A9,I3)
221 FORMAT(F10.5,I3,1X,F9.5,3X,6F9.5)
21 FORMAT(F10.5,I4,1X,F10.5,5X,12F10.5)
22 FORMAT(/,1X,A72/17X,3F9.5,18X,F7.4/5X,I3,9X,I2,11X,I3)
23 FORMAT(1X,A7,F4.1,1X,A9,F8.5,A9,I3)
24 FORMAT(3X,I2,2X,I3,3X,A6)
25 FORMAT(1X,'CASE',I2,' : ATOM NUMBER',I3,' COLUMN READ',I3,' DOSTYPE=',A14)
208 FORMAT((10F10.5))
1000 FORMAT(1X,A70,/)
1010 FORMAT(1X,15X,3F8.5,16X,F10.5)
1020 FORMAT(1X,I4,10X,I4,8X,I1,7X,I3,8x,i2,6x,i3)
1030 FORMAT(6X,I3,7X,I2,9x,i2,2x,a120)
1040 FORMAT(6X,I4)
1041 FORMAT(5X,I5)
1050 FORMAT(F10.5,I3,F8.5,3X,(40F8.5))
2000 FORMAT(/,1X,A70)
2010 FORMAT(1X,'LATTICE CONST.=',3F8.5,3X,'FERMI ENERGY=',F10.5)
2020 FORMAT(1X,I4,' < NMAT < ',I4,3X,'SPIN=',I1,3X,'NATO=',I4)
2030 FORMAT(1X,'JATOM',I3,2X,'MULT=',I2,2x,'ISPLIT=',i2,2x,a120)
END
!.......................................................................
SUBROUTINE ADOS (NS,NFU,NEMIN,NEMAX,ebs,fc,nst,RNUMB,DENSTY,SNUMB,nlast,kselect)
! ** ARBDOS READS EIGENVALUES AND EIGENFUNCTIONS FROM FILE 8 **
! ** **
! ** SUBROUTINES USED: **
! ** NOCULC **
! ** **
! ** INPUT AND OUTPUT: **
! ** NFU: NUMBER OF EIGENFUNCTIONS PER K-POINT *
! ** NNOC: NUMBER OF ALLREADY FILLED TETRAHEDRA **
! ** NEMAX: NUMBER OF LAST BAND **
! ** NEMIN: NUMBER OF FIRST BAND-1 **
! ** NUMK: NUMBER OF K-POINTS **
! ** NTT NUMBER OF DIFFERENT TETRAHEDRA **
! ** **
INCLUDE 'param.inc'
COMMON /NCOUNT/ NNOC
real*4 EBS(Nst,*), FC(MG,Nst,*)
real*4 RNUMB(nlast,MF), DENSTY(nlast,MF)
real*4 SNUMB(nlast,MF)
COMMON /EMICRO/ D(4), F(MF,4), V
logical rxes,rxesw
common /rxescom/ rxes,rxesw
real*4, allocatable :: rxesweight(:,:)
real*4, allocatable :: dosold(:,:),dosold1(:,:),dosnew(:)
logical doit
PARAMETER (NITT = 505)
DIMENSION ITTFL(nitt)
DATA IWTET /0/
NNOC=0
NWRIT=100
READ(3,1234)Ndim,NTT,V1,nWRIT,NREC
1234 format(2i10,e20.12,2i10)
! READ(12,1101) NDIM,NTT,V1
WRITE (6,*) 'NUMBER OF K-POINTS:',NDIM
write(6,*) 'NUMBER OF TETRAHEDRONS:',NTT
if(rxesw ) then
allocate (dosold1(nlast,ns+nfu),dosnew(ns+nfu))
dosold1=0.0
endif
if(rxes ) then
allocate (rxesweight(ntt,ns+nfu))
allocate (dosold(nlast,ns+nfu),dosold1(nlast,ns+nfu),dosnew(ns+nfu))
dosold=0.0
dosold1=0.0
read(8,*) (j1,j2,(rxesweight(j,j3),j3=1,ns+nfu),j=1,ntt)
endif
! NTTW=(NTT/NWRIT)+1
!.....correction by Nelhiebel
if((ntt/nwrit)*nwrit.eq.ntt) then
Nttw=NTT/NWRIT
else
Nttw=NTT/NWRIT+1
end if
!.....
ind=0
dostot=0.d0
volumetot=0.d0
volumepart=0.d0
DO 30 N=1,NTTW
IF (N.EQ.NTTW) THEN
KMAX=NTT-(N-1)*NWRIT
ELSE
KMAX=NWRIT
ENDIF
!cad
if(5*kmax.gt.NITT) then
write(*,*) 'increase parameter NITT in ados!'
write(*,*) 'the value should be at least ',5*kmax
STOP 'NITT in ados too small'
endif
!cad
! READ(12,1102) (ITTFL(K),K=1,KMAX*5)
READ(3,1235) (ITTFL(K),K=1,KMAX*5)
1235 format(6i10)
DO 30 K=1,KMAX
V=FLOAT(ITTFL((K-1)*5+1))*V1
ind=ind+1
doit=.true.
if(kselect.gt.0) doit=.false.
DO 31 JJ=NEMIN,NEMAX
DO 20 KP=1,4
KPP=ITTFL((K-1)*5+KP+1)
if(kpp.eq.kselect.and.kselect.gt.0) doit=.true.
DO 10 I=1,NFU
10 F(I,KP)=FC(I,KPP,JJ)
20 D(KP)=EBS(KPP,JJ)
if(jj.eq.nemin) volumetot=volumetot+v
if(.not.doit) exit
if(jj.eq.nemin.and.kselect.gt.0) print*,'doing tetrahedra',(n-1)*nwrit+k
if(jj.eq.nemin) volumepart=volumepart+v
CALL NOCULC (NS, RNUMB,DENSTY,SNUMB,nlast)
if(rxesw .and. (jj.eq.nemax)) then
do l=1,nfu
dosnew(l)=0.0
do i=1,nlast ! loop over energy-mesh
dosnew(l)=dosnew(l)+densty(i,l+ns)-dosold1(i,l)
dosold1(i,l)=densty(i,l+ns)
enddo
dostot=dostot+dosnew(l)
enddo
write(9,'(2i6,7e20.12)') n,k,(dosnew(l),l=1,nfu)
endif
if(rxes) then
DO L=1,NFU ! loop over cases
do i=1,nlast ! loop over energy-mesh
! if(i.eq.600) print*,n,k,jj,rxesweight(ind,1),dosold(i,1)
dosnew(l)=densty(i,L+NS)-dosold(i,L+NS)
densty(i,L+NS)=dosold(i,L+NS)+dosnew(l)*rxesweight(ind,L+ns)
dosold(i,L+NS)=densty(i,L+NS)
enddo
enddo
endif
31 CONTINUE
30 CONTINUE
print*,'covered volume (%)',volumepart/ volumetot*100.d0
write(6,*) 'dostot in rxesw', dostot
RETURN
END
SUBROUTINE ARBDOS (NFLOW,NFUN1,NFIRST,NLAST,EMIN,EMAX,NEMIN,NEMAX &
,DET,ebs,fc,nst,RNUMB,DENSTY,kselect)
! NEW TETRA.-SUBR. (P.BLOECHL, OKA, O. JEPSEN, M. ALOUANI
!**********************************************************************
!* *
!* DENSITY OF STATES PROGRAM *
!* CALCULATES THE PROJECTED DENSITIES OF STATES, CORRESPONDING *
!* TO THE BAND ENERGIES AND ANGULAR MOMENTUM WEIGHTS, STORED ON *
!* THE FILE 8 *
!*********************************************************************
INCLUDE 'param.inc'
real*4 EBS(Nst,*), FC(MG,Nst,*)
real*4 RNUMB(nlast,mg), DENSTY(nlast,mg)
real*4,allocatable :: SNUMB(:,:)
COMMON /EME/ EMIN1, EMAX1, EFACTR, ESTEP, NO, NFUN, NU
!
allocate (SNUMB(nlast,MG))
snumb=0.d0
ESTEP=DET
EFACTR=1.E0/DET
NFUN=NFUN1
EMIN1=EMIN
EMAX1=EMAX
NU=NFIRST
NO=NLAST
WRITE (6,10) EMIN,EMAX,EFACTR,ESTEP,NEMIN,NEMAX,NU,NO
10 FORMAT (1H ,' EMIN=',F10.5,' EMAX=',F10.5,' EFACTR=',F16.8, &
' ESTEP =',F10.5/' ENERGY BAND',I5,' THROUGH',I5,' ENERGY CHANNEL:', &
I5,' TO',I5)
CALL ADOS (NFLOW,NFUN1,NEMIN,NEMAX,ebs,fc,nst, RNUMB,DENSTY,SNUMB,nlast,kselect)
!
NU1=NU+1
DO 30 L=1,NFUN1
DO 20 I=NU1,NO
SNUMB(I,L+NFLOW)=SNUMB(I,L+NFLOW)+SNUMB(I-1,L+NFLOW)
20 RNUMB(I,L+NFLOW)=(RNUMB(I,L+NFLOW)+SNUMB(I,L+NFLOW))*2.
30 CONTINUE
! DO 40 L=1,NFUN1
! DO 40 I=NU,NO
! TDOS(I)=TDOS(I)+DENSTY(I,L+NFLOW)
! 40 TNOS(I)=TNOS(I)+RNUMB(I,L+NFLOW)
RETURN
! 50 WRITE (6,60) Nlast
! 60 FORMAT (' ARRAYS TOO SMALL. Nlast=',I7)
! STOP
END
_______________________________________________
Wien mailing list
[email protected]
http://zeus.theochem.tuwien.ac.at/mailman/listinfo/wien
SEARCH the MAILING-LIST at:
http://www.mail-archive.com/[email protected]/index.html