Hi,
Thank you very much for this bug report. I can confirm the problem.
It was a nasty bug, occurring only if you have
. non-spinpolarized spin-orbit calculations AND
. more than one atom/cell (the first atom is always ok).
The calculated partial charges (case.qtl) are all wrong except for the
first atom (not only the relativistic decomposition into 5/2 and 7/2,
..., but also the regular partial charges using "x qtl".
In addition there was a factor of two in the normalization, so that the
total DOS could be less than the partial one.
I include a few subroutines for SRC_qtl which should fix the problem.
Please verify.
Regards
Peter Blaha
On 06/19/2017 11:06 AM, Jindrich Kolorenc wrote:
Dear Wien2k developers,
I am trying to decompose the U 5f density of states in UGa2 to j=5/2 and
j=7/2 components and it appears that I am hitting a bug in the QTL
program. In the non-magnetic + SO calculation, the 5f DOS has two peaks,
the lower should be mostly j=5/2, the upper j=7/2. An earlier
calculation can be found in Fig.3 of Divis et al.,
https://doi.org/10.1103/PhysRevB.53.9658
The figure
http://www.fzu.cz/~kolorenc/wien2k_UGa2_bug/UGa2_f52_f72.png
shows what I get with Wien2k, version 16.1 (and 14.2 gives the same).
One can see that
1) it differs from the results of Divis at al.
2) the result depends on the direction of magnetization specified in
case.inso (001 or 100), which I believe it really should not when there
is no magnetization at all
3) the result for the direction 100 is clearly incorrect (the lower peak
certainly is not dominantly 7/2)
4) QTL gives long tail of the 5f DOS up to high energies whereas the 5f
DOS calculated after "lapw2 -so -qtl" does not have this tail.
Given the above, I think the problem is somewhere in interpreting the
lattice symmetry in QTL (here P6/mmm, group 191). My case.struct is
attached, the other input files were essentially straight from init_lapw
and initso_lapw. I use symmetrization in QTL just to be on the safe
side. I have also tried to run the calculations with the "ferromagnetic"
case.struct generated by initso_lapw (it reduces the number of symmetry
operations in the 100 case) but there seems to be no difference.
Any help leading toward a fix (or a workaround) would be really
appreciated.
Best regards,
Jindrich Kolorenc
_______________________________________________
Wien mailing list
Wien@zeus.theochem.tuwien.ac.at
http://zeus.theochem.tuwien.ac.at/mailman/listinfo/wien
SEARCH the MAILING-LIST at:
http://www.mail-archive.com/wien@zeus.theochem.tuwien.ac.at/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: bl...@theochem.tuwien.ac.at WIEN2k: http://www.wien2k.at
WWW: http://www.imc.tuwien.ac.at/TC_Blaha
--------------------------------------------------------------------------
SUBROUTINE ATPAR (JATOM,LATOM,itape,jtape,is,ISPIN,popmat)
USE param
USE struct
use com
IMPLICIT REAL*8 (A-H,O-Z)
integer popmat
LOGICAL loor(0:lomax),lapw(0:lmax2),rlo(1:nloat, &
0:lomax)
DIMENSION emist(0:lomax,nloat),E(0:LMAX2),elo(0:LOMAX,nloat), &
pei(0:lmax2),ilo(0:lomax),vr(nrad)
COMMON /UHELP/ A(NRAD),B(NRAD),AE(NRAD),BE(NRAD)
COMMON /ATSPDT/ P(0:LMAX2,2,nrf),DP(0:LMAX2,2,nrf)
COMMON /RADFU/ RF1(NRAD,0:LMAX2,2,nrf),RF2(NRAD,0:LMAX2,2,nrf)
COMMON /RINTEG/ RI_MAT(0:lmax2,0:lmax2,nrf,nrf,2,2)
common /loabc/ alo(0:lomax,2,nloat,nrf)
common /lolog/ nlo,nlov,nlon,loor,ilo,lapw
save vr
!---------------------------------------------------------------------
2022 FORMAT(3X,4E19.12)
!.....READ TOTAL SPHERICAL POTENTIAL V(0,0) OF TAPEjtape=VSP
! NORM OF V(0,0)=V00(R)*R/SQRT(4.D0*PI)
if(iso2.eq.1.and.is.eq.1) then
READ(jtape,1980)
READ(jtape,2000)IDUMMY
READ(jtape,2031)
READ(jtape,2022)(VR(J),J=1,JRJ(JATOM))
READ(jtape,2031)
READ(jtape,2030)
DO 115 J=1,JRJ(JATOM)
115 VR(J)=VR(J)/2.0D0
endif
if (ispin.eq.2) then
if(is.eq.1)then
write(6,*)'ATPAR for spin up'
else
write(6,*)'ATPAR for spin down'
endif
end if
nlo=0
nlov=0
nlon=0
do i=0,lomax
ilo(i)=0
end do
DO 15 I=1,JATOM
READ(itape)E
READ(itape)elo
IF(i.EQ.jatom) THEN
DO l=0,lmax2
lapw(l)=.TRUE.
IF(e(l).GT.150.) THEN
e(l)=e(l)-200.d+0
lapw(l)=.FALSE.
ENDIF
ENDDO
ENDIF
rlo(:,:)=.FALSE.
do 15 l = 0,lomax
loor(l)=.FALSE.
DO k=1,nloat
IF (i.EQ.jatom) THEN
IF (elo(l,k).LT.(995.d+0)) THEN
ilo(l)=ilo(l)+1
nlo=nlo+((2*l+1))*mult(i)
IF(.NOT.lapw(l).AND.k.EQ.1) GOTO 666
IF(k.EQ.nloat) THEN
rlo(ilo(l),l)=.TRUE.
GOTO 666
ENDIF
loor(l)=.TRUE.
666 CONTINUE
ENDIF
ELSE
IF (elo(l,k).LT.(995.d+0)) nlov=nlov+((2*l+1))*mult(i)
ENDIF
ENDDO
15 continue
IF(JATOM.EQ.NAT) GOTO 30
DO 20 I=JATOM+1,NAT
READ(itape) EMIST
READ(itape) EMIST
do 20 l=0,lomax
do 20 k=1,nloat
if (emist(l,k).lt.(995.0D+0)) &
nlon=nlon+((2*l+1))*mult(i)
20 continue
30 CONTINUE
WRITE(6,7) ANAME(JATOM)
WRITE(6,5) E
WRITE(6,14)
!
DO 70 l=0,LMAX2
DELE=2.0D-3
DELEI=0.25D0/DELE
FL=L
EI=E(l)/2.0d0
! CALCULATE ENERGY-DERIVATIVE BY FINITE DIFFERENCE
! DELE IS THE UPWARD AND DOWNWARD ENERGY SHIFT IN HARTREES
!
E1=EI-DELE
CALL OUTWIN(REL,VR,r0(JATOM),DX(JATOM),jrj(JATOM),E1, &
FL,UVB,DUVB,NODEL,zz(jatom))
CALL rint13(A,B,A,B,OVLP,JATOM)
TRX=1.0D0/SQRT(OVLP)
IMAX=jrj(JATOM)
DO 45 M=1,IMAX
AE(M)=TRX*A(M)
BE(M)=TRX*B(M)
45 CONTINUE
UVB=TRX*UVB
DUVB=TRX*DUVB
E1=EI+DELE
CALL OUTWIN(REL,VR,r0(JATOM),DX(JATOM),jrj(JATOM),E1, &
FL,UVE,DUVE,NODE,zz(jatom))
CALL rint13(A,B,A,B,OVLP,JATOM)
TRX=1.0d0/SQRT(OVLP)
UVE=DELEI*(TRX*UVE-UVB)
DUVE=DELEI*(TRX*DUVE-DUVB)
IMAX=jrj(JATOM)
DO 50 M=1,IMAX
AE(M)=DELEI*(TRX*A(M)-AE(M))
BE(M)=DELEI*(TRX*B(M)-BE(M))
50 CONTINUE
!
! CALCULATE FUNCTION AT EI
!
CALL OUTWIN(REL,VR,r0(JATOM),DX(JATOM),jrj(JATOM),EI, &
FL,UV,DUV,NODES,zz(jatom))
CALL rint13(A,B,A,B,OVLP,JATOM)
TRX=1.0d0/SQRT(OVLP)
P(l,is,1)=TRX*UV
DP(l,is,1)=TRX*DUV
IMAX=jrj(JATOM)
DO 60 M=1,IMAX
A(M)=TRX*A(M)
60 B(M)=TRX*B(M)
!
! INSURE ORTHOGONALIZATION
!
CALL rint13(A,B,AE,BE,CROSS,JATOM)
TRY=-CROSS
IMAX=jrj(JATOM)
DO 55 M=1,IMAX
AE(M)=(AE(M)+TRY*A(M))
55 BE(M)=(BE(M)+TRY*B(M))
IMAX=jrj(JATOM)
DO 80 I=1,IMAX
RF1(I,l,is,1)=A(I)
RF2(I,l,is,1)=B(I)
RF1(I,l,is,2)=AE(I)
RF2(I,l,is,2)=BE(I)
80 CONTINUE
P(l,is,2)=UVE+TRY*P(l,is,1)
DP(l,is,2)=DUVE+TRY*DP(l,is,1)
CALL rint13(AE,BE,AE,BE,PEI(l),JATOM)
70 WRITE(6,8) L,P(l,is,1),DP(l,is,1),P(l,is,2),DP(l,is,2)
!
! nun fur lo
!
DO 170 l=0,lomax
irf=2
do 170 jlo=1,ilo(l)
if ((.not.lapw(l)).and.(jlo.eq.1)) goto 180
irf=irf+1
DELE=2.0D-3
DELEI=0.25D0/DELE
FL=L
EI=elo(l,jlo)/2.d0
!
! CALCULATE FUNCTION AT EI
IF(rlo(jlo,l)) THEN
ei=elo(l,nloat)/2.d0
kappa=l
CALL diracout(rel,vr,r0(jatom),dx(jatom),jrj(jatom), &
ei,fl,kappa,uv,duv,nodes,zz(jatom))
CALL dergl(a,b,r0(jatom),dx(jatom),jrj(jatom))
DO m = 1, jrj(jatom)
r_m = r0(jatom)*exp(dx(jatom)*(m-1))
b(m) = b(m)*r_m/(2.d0*clight+(elo(l,jlo)- &
2.d0*vr(m)/r_m)/(2.d0*clight))
b(m)=b(m)*clight
ENDDO
ELSE
CALL outwin(rel,vr,r0(jatom),dx(jatom),jrj(jatom), &
ei,fl,uv,duv,nodes,zz(jatom))
ENDIF
!
CALL rint13(A,B,A,B,OVLP,JATOM)
TRX=1.0d0/SQRT(OVLP)
P(l,is,irf)=TRX*UV
DP(l,is,irf)=TRX*DUV
IMAX=jrj(JATOM)
DO 160 M=1,IMAX
rf1(M,l,is,irf)=TRX*A(M)
160 rf2(M,l,is,irf)=TRX*B(M)
CALL rint13(rf1(1,l,is,1),rf2(1,l,is,1), &
rf1(1,l,is,irf),rf2(1,l,is,irf),pi12lo,JATOM)
CALL rint13(rf1(1,l,is,2),rf2(1,l,is,2), &
rf1(1,l,is,irf),rf2(1,l,is,irf),pe12lo,JATOM)
180 continue
call abcd(l,jatom,pei(l),pi12lo,pe12lo,is,jlo,lapw(l))
WRITE(6,*)
170 continue
!... CALCULATION OF RADIAL INTEGRALS
IF (ISPIN.EQ.2.AND.IS.EQ.1) GOTO 469
CALL RADINT(JATOM,ISPIN,popmat)
469 RETURN
2 FORMAT(5E14.7)
3 FORMAT(16I5)
4 FORMAT(I4,E16.7)
5 FORMAT(10X,' ENERGY PARAMETERS ARE',7F7.2)
6 FORMAT(10X,'E(',I2,2H)=,F10.4)
7 FORMAT(/10X,'ATOMIC PARAMETERS FOR ',A10/)
14 FORMAT(/11X,1HL,5X,4HU(R),10X, &
5HU'(R),9X,5HDU/DE,8X,6HDU'/DE,6X,7HNORM-U')
8 FORMAT(10X,I2,5E14.6,5X,3I2)
9 FORMAT(10X,'FOR L=',I2,' CORRECTION=',E14.5,' OVERLAP=',E14.5)
11 FORMAT(7F10.5)
13 FORMAT(////,':POS',i2.2,':',1x,'AT.NR.',I3,2X,'POSITION =', &
3F8.5,2X,'MULTIPLICITY =',I3)
1040 FORMAT(8I2)
1060 FORMAT(//,3X,'NOT EQUIV ATOM ',A10,' LOCAL ROTATION MATRIX')
1070 FORMAT(30X,3F10.5)
1080 FORMAT(13X,'EQUIV ATOM ',I3,3X,'POSITION: ',3F8.3)
1090 FORMAT(30X,3F10.5,5X,F10.5)
1980 FORMAT(3X)
2000 FORMAT(16X,I2//)
2030 FORMAT(///)
2031 FORMAT(/)
END
SUBROUTINE OUTP(ICASE,popmat,so)
USE param
USE struct
USE case
USE com
! use abc
IMPLICIT REAL*8 (A-H,O-Z)
CHARACTER*7 LDUMMY
CHARACTER*10 KNAME
CHARACTER*67 ERRMSG
logical so
integer popmat,naxial(0:3),nhexa(0:3),ncubic(0:3),iL(0:4)
! index to the lms,l'm's' component: indices L1,M1,S1,L2,M2,S2,re/im ... maxl fixed to 5
integer kkla(0:5,-5:5,1:2,0:5,-5:5,1:2,1:2)
DIMENSION qtl1(4,14),qtl2(34),suml1(4)
complex*16 qtle,qtle1(3072)
dimension e(1000)
data naxial/1,2,4,5/,nhexa/1,2,3,5/,ncubic/1,1,2,3/
data suml1/0.,0.,0.,0./
!--------------------------------------------------------------------
ic1=1
write(6,*)'NUMBER OF K-POINTS:',nkpt
nband=100000
do i=1,nkpt
write(6,*)i,nb(i),'bands'
if(nb(i).lt.nband)nband=nb(i)
end do
if(popmat.eq.0)then
!pb iL(lcase)=0
iL=0
do lcase=1,nl(icase)
l=ll(icase,lcase)
if((nm(icase).le.2).or.(nm(icase).eq.6))then
iL(lcase)=(2*l+1)*iso
if(nm(icase).eq.0)iL(lcase)=2 ! |J,MJ> basis, L-1/2,L+1/2 sums
else if(nm(icase).eq.3)then ! axial symmetry
iL(lcase)=naxial(L)*iso
else if(nm(icase).eq.4)then ! hexagonal symmetry
iL(lcase)=nhexa(L)*iso
else if(nm(icase).eq.5)then ! cubic symmetry
iL(lcase)=ncubic(L)*iso
endif
enddo
else
kkL=100 ! write rest of popmat input for TETRA on files 70+icase
do Lcase1=1,nl(icase)
L1=LL(icase,Lcase1)
do ms1=1,iso
do m1=-L1,L1
do Lcase2=1,nL(icase)
L2=LL(icase,Lcase2)
do ms2=1,iso
do m2=-L2,L2
if(ms1.gt.ms2)then
kkL=kkL+1
kkla(l1,m1,ms1,l2,m2,ms2,1) = kkl
kkL=kkL+1
kkla(l1,m1,ms1,l2,m2,ms2,2) = kkl
else if(ms1.eq.ms2)then
if(L1.gt.L2)then
kkL=kkL+1
kkla(l1,m1,ms1,l2,m2,ms2,1) = kkl
kkL=kkL+1
kkla(l1,m1,ms1,l2,m2,ms2,2) = kkl
else if(L1.eq.L2)then
if(m1.ge.m2)then
kkL=kkL+1
kkla(l1,m1,ms1,l2,m2,ms2,1) = kkl
kkL=kkL+1
kkla(l1,m1,ms1,l2,m2,ms2,2) = kkl
endif
endif
endif
enddo
enddo
enddo
enddo
enddo
enddo
556 format(2i5,' real',6i3,' L1,M1,Ms1,L2,M2,Ms2')
557 format(2i5,' imag',6i3,' L1,M1,Ms1,L2,M2,Ms2')
do ms1=1,iso
ks1=1
if(ms1.eq.2)ks1=-1
do ms2=1,iso
ks2=1
if(ms2.eq.2)ks2=-1
do Lcase1=1,nl(icase)
L1=LL(icase,Lcase1)
do m1=-L1,L1
do Lcase2=1,nL(icase)
L2=LL(icase,Lcase2)
do m2=-L2,L2
if(ms1.gt.ms2)then
write(70+icase,556)ic1, kkla(L1,m1,ms1,L2,m2,ms2,1), L1,m1,ks1,L2,m2,ks2
write(70+icase,557)ic1, kkla(L1,m1,ms1,L2,m2,ms2,2), L1,m1,ks1,L2,m2,ks2
else if(ms1.eq.ms2)then
if(L1.gt.L2)then
write(70+icase,556)ic1, kkla(L1,m1,ms1,L2,m2,ms2,1), L1,m1,ks1,L2,m2,ks2
write(70+icase,557)ic1, kkla(L1,m1,ms1,L2,m2,ms2,2), L1,m1,ks1,L2,m2,ks2
else if(L1.eq.L2)then
if(m1.ge.m2)then
write(70+icase,556)ic1, kkla(L1,m1,ms1,L2,m2,ms2,1), L1,m1,ks1,L2,m2,ks2
write(70+icase,557)ic1, kkla(L1,m1,ms1,L2,m2,ms2,2), L1,m1,ks1,L2,m2,ks2
endif
endif
endif
enddo
enddo
enddo
enddo
enddo
enddo ! end writing popmat input for tetra
endif
!.....WRITE QTL TO FILE 31
do 10 jb0=1,nband
rewind(29)
WRITE(31,2040) jb0
DO 11 MK=1,nkpt
READ(29) R,S,T,NV,NE,KNAME
if(popmat.eq.0)then
sumL=0.
do lcase=1,nl(icase)
sumL1(lcase)=0.
DO 20 JB=1,nb(mk)
READ(29) NUM,Ee
if(JB.eq.JB0)Eb=Ee
DO JL=1,iL(lcase)
READ(29)QTL
if(so .and. iso2.eq.1) qtl=qtl/2.d0
if(JB.eq.JB0)then
qtl1(lcase,jl)=qtl
sumL1(lcase)=sumL1(lcase)+qtl
sumL=sumL+qtl ! sum of all DOS's considered
endif
END DO
20 CONTINUE
enddo !end Lcase loop
kL=0 ! reorganize sumL1,qtL1 -> qtl2
do lcase=1,nL(icase)
kL=kL+1
qtl2(kL)=suml1(lcase)
L1=LL(icase,Lcase)
if(L1.gt.0)then
do 111 jL=1,iL(lcase)
if((L1.eq.1).and.(nm(icase).eq.5))goto 111 !do not write x+y+z in cubic symmetry
kL=kL+1
qtl2(kL)=qtl1(Lcase,jL)
111 continue
endif
enddo
!pb WRITE(31,1050) Eb,jatom,kL,(qtl2(jL),jL=1,kL),sumL
WRITE(31,1050) Eb,icase,kL,suml,(qtl2(jL),jL=1,kL)
kLmax=max(kLmax,kL) !pb
else ! popmat starts
! JR: we initialize sums here!
suml=0.
do lcase1=1,nl(icase)
suml1(lcase1)=0.
enddo
! ----------------------------
DO 21 JB=1,nb(mk)
READ(29) NUM,Ee
if(JB.eq.JB0)Eb=Ee
kl=0
! JR: suml=0.
if((popmat.eq.98).or.(popmat.eq.99))then ! complete matrix with <L1||L2> terms
do Lcase1=1,nl(icase)
! JR: suml1(lcase1)=0.
L1=LL(icase,Lcase1)
do ms1=1,iso
do m1=-L1,L1
do Lcase2=1,nL(icase)
L2=LL(icase,Lcase2)
do ms2=1,iso
do m2=-L2,L2
if(ms1.gt.ms2)then
read(29)qtle
! JR: this condition solves the fact, that telnes2 does not expect spin-crossterms in SO calculation
if((popmat.eq.98).or.((ms1.eq.1).and.(ms2.eq.1))) then
kL=kL+1
if(jb.eq.jb0) qtle1(kL)=qtle
endif
eLse if(ms1.eq.ms2)then
if(L1.gt.L2)then
read(29)qtle
! JR: this condition solves the fact, that telnes2 does not expect spin-crossterms in SO calculation
if((popmat.eq.98).or.((ms1.eq.1).and.(ms2.eq.1))) then
kL=kL+1
if(jb.eq.jb0) qtle1(kL)=qtle
endif
eLse if(L1.eq.L2)then
if(m1.ge.m2)then
read(29)qtle
! JR: this condition solves the fact, that telnes2 does not expect spin-crossterms in SO calculation
if((popmat.eq.98).or.((ms1.eq.1).and.(ms2.eq.1))) then
kL=kL+1
if(jb.eq.jb0) qtle1(kL)=qtle
if(m1.eq.m2)then
if(jb.eq.jb0) suml1(lcase1)=suml1(lcase1)+qtle
if(jb.eq.jb0) suml=suml+qtle
endif
endif
endif
endif
endif
enddo
enddo
enddo
enddo
enddo
enddo
else if((popmat.eq.87).or.(popmat.eq.88))then ! matrix with <L1||L1> diagonal terms only
do Lcase1=1,nl(icase)
! JR: suml1(lcase1)=0.
L1=LL(icase,Lcase1)
do ms1=1,iso
do m1=-L1,L1
do Lcase2=1,nL(icase)
L2=LL(icase,Lcase2)
do ms2=1,iso
do m2=-L2,L2
if(ms1.gt.ms2)then
read(29)qtle
if((L1.eq.L2).and.(m1.eq.m2))then
! JR: this condition solves the fact, that telnes2 does not expect spin-crossterms in SO calculation
if(popmat.eq.87) then
kL=kL+1
if(jb.eq.jb0) qtle1(kL)=qtle
endif
endif
else if(ms1.eq.ms2)then
if(L1.gt.L2)then
read(29)qtle
else if(L1.eq.L2)then
if(m1.ge.m2)then
read(29)qtle
if(m1.eq.m2)then
! JR: this condition solves the fact, that telnes2 does not expect spin-crossterms in SO calculation
if((popmat.eq.87).or.(ms1.eq.1)) then
kL=kL+1
if(jb.eq.jb0)then
qtle1(kL)=qtle
suml1(lcase1)=suml1(lcase1)+qtle
suml=suml+qtle
! write(*,'(i3,2f10.6,3x,5f10.6)') kl, qtle, suml, suml1(1), suml1(2), suml1(3), suml1(4)
endif
endif
endif
endif
endif
endif
enddo
enddo
enddo
enddo
enddo
enddo
endif
21 continue
! WRITE(31,1050) Eb,jatom,kL,1.,sumL,(suml1(jL),jL=1,4)
! JR: WRITE(31,1050) Eb,icase,kL,1.,sumL,(suml1(jL),jL=1,4)
WRITE(31,1050) Eb,icase,kL,sumL,(suml1(jL),jL=1,nl(icase))
if(popmat.eq.88)then
write(31,208)(dble(qtle1(jL)),jL=1,kL)
else if(popmat.eq.87)then
write(31,209)(dble(qtle1(jL)),jL=1,kL)
else if(popmat.eq.99)then
write(31,208)(qtle1(jL),jL=1,kL)
else if(popmat.eq.98)then
write(31,209)(qtle1(jL),jL=1,kL)
endif
209 format(10E16.8)
208 FORMAT(10F10.5)
endif ! end popmat vs qtl
sumL=0.
! WRITE(31,1050) Eb,jatom+1,1,sumL ! because of interstitial
WRITE(31,1050) Eb,icase+1,1,sumL ! because of interstitial
11 CONTINUE
10 CONTINUE
RETURN
!
! Error messages
!
CALL OUTERR('OUTP',ERRMSG)
STOP 'OUTP - Error'
!
1000 FORMAT(/,10X,3F8.4,1X,I5,I4,2X,A10)
1001 FORMAT(/,1X,' K-POINT:',3F8.4,1X,I5,I4,2X,A10)
1009 FORMAT(8X,I3,4X,F9.5,9X,F10.7,4x,i8)
1010 FORMAT(8X,I3,4X,F9.5,9X,F10.7,12x,5f8.5)
1011 FORMAT(1X,' BAND #',I3,' E=',F9.5,' WEIGHT=',F10.7,' NL=',i8,5f8.5)
1020 FORMAT(2e17.8)
1050 FORMAT(F10.5,I3,I5,F8.5,3X,39F8.5)
2040 FORMAT(1X,'BAND',I5)
END
SUBROUTINE L2MAIN(cmplx,nsymop,popmat,qtlfn,so)
USE param
USE struct
USE case
USE sym2
USE com
USE abc
IMPLICIT REAL*8 (A-H,O-Z)
CHARACTER *10 BNAME
CHARACTER *180 VECFN,FNAME,qtlfn
LOGICAL notcalc,cmplx , so
REAL*8,ALLOCATABLE :: a_real(:),fj(:,:),dfj(:,:)
REAL*8,ALLOCATABLE :: weight(:)
DIMENSION ilo(0:lomax)
integer popmat
COMPLEX*16 YL((LMAX2+1)*(LMAX2+1)),densmat(7,7)
COMPLEX*16 PHSHEL,CFAC,IMAG,CZERO,PH_SPIN(2)
COMMON /GENER/ BR1(3,3),BR2(3,3)
COMMON /ATSPDT/ P(0:LMAX2,2,nrf),DP(0:LMAX2,2,nrf)
COMMON /RADFU/ RF1(NRAD,0:LMAX2,2,nrf),RF2(NRAD,0:LMAX2,2,nrf)
COMMON /RINTEG/ RI_MAT(0:lmax2,0:lmax2,nrf,nrf,2,2)
COMMON /XA/ R(NRAD),BK(3),BKROT(3),BKRLOC(3)
logical loor(0:lomax),lapw(0:lmax2)
common /loabc/ alo(0:lomax,2,nloat,nrf)
common /lolog/ nlo,nlov,nlon,loor,ilo,lapw
COMMON /PROC/ VECFN(2)
COMMON /IPROC/ IPROC
!...............................
complex*16 h_yl(2*LMAX2+1,iblock)
complex*16 h_alyl(2*LMAX2+1,iblock,2)
complex*16 h_blyl(2*LMAX2+1,iblock,2)
!...............................
DATA CZERO/(0.0D0,0.0D0)/,IMAG/(0.0D0,1.0D0)/
!------------------------------------------------------------------
assign 2022 to iform1
2022 FORMAT(3X,4E19.12)
PI=ACOS(-1.0D0)
TWOPI=2.D0*PI
EDELT=0.0D0
TEST=0.0D0
ETOT=0.0D0
MAXWAV=0
MINWAV=100000
DO JK=1,NKPT
NB(JK)=0
END DO
do i=1,iord
do ii=1,3
do jj=1,3
tmat(ii,jj,i)=iz(ii,jj,i)
end do
end do
end do
ALLOCATE(a_real(nmat),fj(0:lmax2,nmat),dfj(0:lmax2,nmat))
allocate (weight(nume))
if(so .and. iso2.eq.1) print*, 'non-spinpolarized so calculation'
! ---------------------------------
! START LOOP FOR ALL ATOMS BY DO 50
! ---------------------------------
do is=1,iso2
READ(17+is,2032) ISCF
end do
LFIRST=1
icount=1
DO 50 JATOM=1,NAT
if(icount.gt.natom)return
if(SO)then
iso=2 ! s-o calculation, but nonrelativistic basis
if(nm(jatom).lt.80)then ! exclude density matrix calculation
if(nm(jatom).ne.-1)then ! exclude relativistic basis
if(nm(jatom).ne.0)then ! exclude relativistic basis
if(nm(jatom).ne.6)then ! exclude user defined basis
iso=1
endif
endif
endif
endif
endif
notcalc=.true.
if (jatom.eq.iatom(icount)) then
notcalc=.false.
icase=icount
icount=icount+1
end if
if(notcalc)then
write(6,*)' ATOM=',JATOM,' left out '
else
write(6,*)' Calculation for atom',jatom
if(nm(icase).gt.50)then
do lcase1=1,nl(icase)
L1=LL(icase,lcase1)
n1=(2*L1+1)*ISO
do lcase2=1,nl(icase)
L2=LL(icase,lcase2)
n2=(2*L2+1)*iso
do i1=1,n1
do i2=1,n2
dmat(L1,L2,i1,i2)=(0.d0,0.d0)
enddo
enddo
enddo
enddo
endif
endif
IF(JATOM.GT.1) LFIRST=LFIRST + MULT(JATOM-1)
ITAP=30+JATOM
! CALCULATE RADIAL FUNCTIONS U(R), UE(R), ...
do is=1,iso
itape=8+is
jtape=17+is
rewind(itape)
if(is.eq.2.and.iso2.eq.1) then ! fix for SO-coupling and non-spinpolarized
jtape=18
! rewind(jtape)
! READ(jtape,2032) ISCF
endif
CALL ATPAR(JATOM,LFIRST,itape,jtape,is,iso,popmat)
rewind(itape)
end do
if (notcalc) goto 50
FAC=4.0D0*PI*RMT(JATOM)**2/SQRT(VOL)
!................................
KKK=0
!.....READ IN K POINT AND BASIS VECTORS
iloop=0
788 continue
if (IPROC.GT.0) then
iloop=iloop+1
write(6,*)'ILOOP ',iloop
do is=1,iso
itape=8+is
close(itape)
call mknam(FNAME,VECFN(is),ILOOP)
write(6,*)'opening ',FNAME
open(itape,FILE=FNAME,STATUS='old',FORM='unformatted',ERR=950)
end do
endif
DO I=1,NAT
do is=1,iso
itape=8+is
READ(itape) EMIST
READ(itape) EMIST
enddo
ENDDO
4 continue
! call inispl this took too much CPU time
do lcase1=1,nl(icase)
L1=LL(icase,lcase1)
n1=(2*L1+1)*ISO
do lcase2=1,nl(icase)
L2=LL(icase,lcase2)
n2=(2*L2+1)*iso
do i1=1,n1
do i2=1,n2
do num=1,nume
xqtl(L1,L2,i1,i2,num)=(0.,0.)
enddo
enddo
enddo
enddo
enddo
!......reading from vector for both spins
DO 17 is=1,iso
itape=8+is
READ(itape,END=998) S,T,Z,BNAME,N,NE
IF(N.GT.MAXWAV) MAXWAV=N
IF(N.LT.MINWAV) MINWAV=N
if (is.eq.1) then
KKK=KKK+1
WRITE(29) S,T,Z,N,NE,BNAME
end if
205 FORMAT(/,1X,' K-POINT:',3F8.4,1X,I5,I4,2X,A10)
! IF(icase.EQ.1.and.is.eq.1) NK=NK+1
READ(itape) (KX(I),KY(I),KZ(I),I=1,N)
DO 5 I=1,N
BKX(I)=(S+KX(I))
BKY(I)=(T+KY(I))
BKZ(I)=(Z+KZ(I))
5 CONTINUE
CALL HARMON(N,BKX,BKY,BKZ,LMAX2,FJ,DFJ,RMT(JATOM))
NEMIN=1
NEMAX=0
14 READ(itape) NUM,exxx
E(NUM)=exxx
if (.not.cmplx) then
READ(itape) (A_real(I),I=1,N)
do i=1,n
a(i,num,is)=(1.d0,0.d0)*a_real(i)
end do
else
READ(itape) (A(I,NUM,is),I=1,N)
end if
weight(num)=weigh(kkk,num)
IF(E(NUM).LT.EMIN) NEMIN=NEMIN+1
IF(E(NUM).LT.EMAX) NEMAX=NEMAX+1
IF(NUM.EQ.NE) GOTO 16
GOTO 14
16 CONTINUE
NB(KKK)=NEMAX-NEMIN+1
17 CONTINUE
!.......reading from vect end
!.......sum over sym. operations
DO 777 MU=1,nsymop
! loop over L(jatom)
do lcase=1,nl(icase)
l=ll(icase,lcase)
CFAC=IMAG**L
DO IS=1,iso
PH_SPIN(is)=EXP((2*is-3)*IMAG*PHASE(MU)/2)
DO 9 I=1,2*LMAX2+1
DO 9 NUM=NEMIN,NEMAX
DO 9 irf=1,nrf
ALM(I,num,irf,is)=CZERO
9 CONTINUE
END DO
DO 120 iI=1,N-(nlo+nlon+nlov),iblock
i3=0
do 121 i=ii,min(ii+iblock-1,N-(nlo+nlon+nlov))
i3=i3+1
BK(1)=BKX(I)
BK(2)=BKY(I)
BK(3)=BKZ(I)
CALL ROTATE (BK,TMAT(1,1,mu),BKROT)
BK(1)=BKROT(1)*BR1(1,1)+BKROT(2)*BR1(1,2)+BKROT(3)*BR1(1,3)
BK(2)=BKROT(1)*BR1(2,1)+BKROT(2)*BR1(2,2)+BKROT(3)*BR1(2,3)
BK(3)=BKROT(1)*BR1(3,1)+BKROT(2)*BR1(3,2)+BKROT(3)*BR1(3,3)
CALL ROTATE (BK,ROTLOC(1,1,JATOM),BKRLOC)
CALL YLM (BKRLOC,LMAX2,YL)
ARG1=BKROT(1)*POS(1,LFIRST)*TWOPI
ARG2=BKROT(2)*POS(2,LFIRST)*TWOPI
ARG3=BKROT(3)*POS(3,LFIRST)*TWOPI
ARGT=(BKX(I)*TAU(1,MU)+BKY(I)*TAU(2,MU)+ &
BKZ(I)*TAU(3,MU))*TWOPI
PHSHEL=EXP(IMAG*(ARG1+ARG2+ARG3+ARGT))
DO M=1,2*L+1
IND_YL=M+L*L
h_yl(M,i3)=conjg(yl(ind_yl))*phshel
END DO
121 continue
DO 122 IS=1,iso
i3=0
do i=ii,min(ii+iblock-1,N-(nlo+nlon+nlov))
i3=i3+1
DO M=1,2*L+1
if (lapw(l)) then
h_ALYL(m,i3,is)=(DFJ(L,I)*P(l,is,2)-FJ(L,I)*DP(l,is,2))* &
h_yl(M,i3)*ph_spin(is)
h_BLYL(m,i3,is)=(FJ(L,I)*DP(l,is,1)-DFJ(L,I)*P(l,is,1))* &
h_yl(M,i3)*ph_spin(is)
else
h_ALYL(m,i3,is)=FJ(L,I)/P(l,is,1)/RMT(JATOM)**2* &
h_yl(M,i3)*ph_spin(is)
h_BLYL(m,i3,is)=(0.d0,0.d0)
end if
END DO
enddo
ibb=min(iblock,N-(nlo+nlon+nlov)-ii+1)
lda=2*LMAX2+1
ldc=lda
ldb=nmat
call zgemm('N','N',2*l+1,nemax-nemin+1,ibb,(1.d0,0.d0), &
h_alyl(1,1,is),lda,a(ii,nemin,is),ldb,(1.d0,0.d0), &
alm(1,nemin,1,is),ldc)
call zgemm('N','N',2*l+1,nemax-nemin+1,ibb,(1.d0,0.d0), &
h_blyl(1,1,is),lda,a(ii,nemin,is),ldb,(1.d0,0.d0), &
alm(1,nemin,2,is),ldc)
122 CONTINUE
120 CONTINUE
if (nlo.ne.0) then
call &
lomain (nemin,nemax,lfirst,lfirst,n,jatom, &
mu,L,iso)
end if
DO 230 M=1,2*L+1
DO 892 NUM=NEMIN,NEMAX
DO 892 is=1, iso
DO 892 irf=1,nrf
ALML(L,M,NUM,irf,is)=ALM(M,NUM,irf,is)*FAC*CFAC
892 CONTINUE
230 CONTINUE
enddo !end of atom L loop (alm)
do lcase1=1,nl(icase)
l1=ll(icase,lcase1)
if(popmat.eq.0)then
CALL XSPLT0(nemin,nemax,l1,l1,MU,iso,nsymop)
else
do lcase2=1,lcase1
l2=ll(icase,lcase2)
CALL XSPLT(nemin,nemax,l1,l2,MU,iso,weight,nsymop)
enddo
endif
enddo
777 CONTINUE !end of symmetry loop
if(popmat.eq.0)then
do lcase=1,nl(icase)
CALL QTL(nemin,nemax,icase,lcase,iso)
enddo
endif
CALL PSPLIT(nemin,nemax,icase,iso,popmat)
GOTO 4 !k-points end
998 CONTINUE !k-points end (jump)
if (iloop.lt.iproc) goto 788
close(31)
call mknam(FNAME,qtlfn,Icase)
open(31,FILE=FNAME,STATUS='unknown',FORM='formatted',ERR=951)
CALL OUTP(ICASE,popmat,so)
if(nm(icase).gt.50)then ! population matrix output
write(12,200)jatom
write(21,*)
write(21,200)jatom
write(6,*)
write(6,200)jatom
200 format(i5,' atom population matrix')
do lcase1=1,nl(icase)
l1=ll(icase,lcase1)
if(popmat.gt.90)then
low=1
else
low=lcase1
endif
do lcase2=low,lcase1
l2=ll(icase,lcase2)
N1=2*L1+1
N2=2*L2+1
if(popmat.gt.90)then
write(6,201)l1,l2
write(21,201)l1,l2
else
write(6,202)l1
write(21,202)l1
endif
201 format(' L1=',i2,', L2=',i2)
202 format(' L=',i2)
N1=2*L1+1
N2=2*L2+1
do is1=1,iso
do is2=is1,iso
do m1=-l1,l1
ly=L1+1+m1
ind1=L1+1+m1+N1*(is1-1)
do m2=-l2,l2
lpy=l2+1+m2
ind2=L2+1+m2+N2*(is2-1)
write(12,655)dmat(l1,l2,ind1,ind2),is1,is2,l1,l2,m1,m2
densmat(ly,lpy)=dmat(l1,l2,ind1,ind2)
654 format(6i3,2f14.8)
655 format(2f14.8,6i3,' Ms1,Ms2,L1,L2,ML1,ML2')
enddo
enddo
call OUTDMAT(L1,L2,N1,N2,IS1,IS2,ISO,densmat)
enddo
enddo
enddo
enddo
endif
! CLOSE(15)
rewind(29)
50 CONTINUE
! ....END LOOP OVER ALL ATOMS
REWIND(itape)
!
!********************************************************************PH*
!.... WRITE Output for the BR1 matrix and the ROTIJ Matrix in file case.rotlm:
! they are read by LectureROTIJ in lecture.f in SRC_elnes / or SRC_mdff/.
! These lines are in SRC_lapw2lm/l2main.frc: surch *PH*
! The number of the output file is 22. his extention must be .rotlm
794 CALL ROTDEF
DO JR=1, 3
WRITE(22, 101) BR1(1,JR), BR1(2,JR), BR1(3,JR)
ENDDO
INDEX = 0
DO LATOM=1, NAT
DO LATEQ=1, MULT(LATOM)
INDEX = INDEX + 1
WRITE(22, 100) LATOM, LATEQ, INDEX
DO JR=1, 3
WRITE(22, 101) (ROTIJ(JC,JR,INDEX),JC=1,3)
ENDDO
ENDDO
ENDDO
100 FORMAT('inequivalent atomnumber ',I3,' number ',I2,' total ',I4)
101 FORMAT(3F10.5)
!**********************************************************************PH*
RETURN
950 CALL OUTERR('l2main','error reading parallel vectors')
STOP 'L2main - Error'
951 CALL OUTERR('l2main','error opening qtl_XX files')
STOP 'L2main - Error'
!
2032 FORMAT(50X,I2,//)
END
_______________________________________________
Wien mailing list
Wien@zeus.theochem.tuwien.ac.at
http://zeus.theochem.tuwien.ac.at/mailman/listinfo/wien
SEARCH the MAILING-LIST at:
http://www.mail-archive.com/wien@zeus.theochem.tuwien.ac.at/index.html