calcwldau.f Source File


Source Code

      MODULE MOD_CALCWLDAU
!-------------------------------------------------------------------------------
!> Summary: Calculation of Coulomb interaction potential in LDA+U in the
!> non-relativistic case
!> Author:
!> Category: KKRimp, single-site, electrostatics, potential, lda+u 
!>           
!-------------------------------------------------------------------------------
      CONTAINS
!-------------------------------------------------------------------------------
!> Summary: Calculation of Coulomb interaction potential in LDA+U in the
!> non-relativistic case
!> Author:
!> Category: KKRimp, single-site, electrostatics, potential, lda+u 
!>           
!-------------------------------------------------------------------------------
      SUBROUTINE CALCWLDAU(
     >     NSPIN,NATOM,LMAXD,IRMD,LMAXATOM,DENSITY,STRMIX, QBOUND_LDAU, 
     X     LDAU)

C **********************************************************************
C
C Calculation of Coulomb interaction potential in LDA+U
C Non-relativistic case. (Otherwise matrices DENMAT and VLDAU must
C have double dimension)
C
C Uses the Coulomb matrix U (array ULDAU), the density matrix n
C (array DENMATC) and the occupation numbers dentot (total) and n_s (array
C DENTOTS) (per spin).
C
C The expression evaluated (array VLDAU) is
C
C V_{m1,s,m2,s'} = 
C   delta_{ss'} Sum_{s'',m3,m4} U_{m1,m2,m3,m4} n_{m3,s'',m4,s''}
C - Sum_{m3,m4} U_{m1,m4,m3,m2} n_{m3,s',m4,s}
C - [Ueff (dentot-1/2) - Jeff (n_s - 1/2)] delta_{ss'} delta_{m1,m2}
C
C This is expressed in complex spherical harmonics basis. Then it is
C transformed into the real spherical harmonics basis via subr. rclm.
C
!    Old method:
C The density matrix n is calculated using the Green function and the
C reference functions Phi as
C
C n_{m,s,m',s'} = -1/pi Int dE 
C [ Sum_{L''L'''} (Phi_L,R_L'') G_{L''L'''}(E) (R_L''',Phi_L') +
C   Sum_L'' (Phi_L,R_L'')(H_L'',Phi_L')                          ]
C
C
!     New method:
! The density matrix is obtained by the Green-function matrix elements
! integrated in energy up to EF: n_{m,m',s} = (G-G^{+})_{mm',ss}  / 2i    
!
C
C **********************************************************************
C
C PARAMETER definitions
C
      USE TYPE_LDAU
      USE NRTYPE
      USE TYPE_DENSITY
      USE MOD_RWLDAUPOT
      USE MOD_RCLM
      implicit none
      INTEGER LMAXD,MMAXD,IRMD
      DOUBLE COMPLEX CZERO,CONE,CI
      PARAMETER (CZERO=(0.0D0,0.0D0),CONE=(1.D0,0.D0),CI=(0.D0,1.D0))
      REAL*8 DZERO
      PARAMETER (DZERO=0.0D0)
C
C Dummy arguments
C
      INTEGER NATOM,NSPIN
      INTEGER LMAXATOM(:)
      REAL*8 QBOUND_LDAU
      TYPE(LDAU_TYPE),ALLOCATABLE :: LDAU(:) ! lda+u variables dimension: (NATOM)
      TYPE(DENSITY_TYPE) :: DENSITY(:)

C
C Local variables
C

      REAL*8,ALLOCATABLE  ::  WLDAU_OLD(:,:,:),RMS(:)   ! for mixing purposes
      REAL*8 DENTOT,DENTOTS(2),RMSTOT
      COMPLEX*16 CSUM,CSUM2
      COMPLEX*16,ALLOCATABLE :: VLDAU(:,:)
      REAL*8 XMIX,STRMIX  ! mixing factor, input straight-mixing factor
      INTEGER IRUNLDAU, IAT
     &     ,L1,M1,M2,M3,M4,MM,IS,JS,MMAX
     &     ,LM1,LMLO,LMHI


!      SAVE 

!      EXTERNAL CINIT,RCLM,RWLDAUPOT

      MMAXD = 2*LMAXD + 1
C--------------------------------------------------------------------
      ALLOCATE( WLDAU_OLD(MMAXD,MMAXD,NSPIN) )
      ALLOCATE( VLDAU(MMAXD,MMAXD) )
      ALLOCATE( RMS(NATOM) )

      RMSTOT = 0.D0


      DO 200 IAT = 1,NATOM

      LDAU(IAT)%EDC = 0.D0
      LDAU(IAT)%EU = 0.D0
 
      L1 = LDAU(IAT)%LOPT

      IF (L1.GE.0) THEN         

         MMAX = 2*L1 + 1

! Save old potential for mixing later
         WLDAU_OLD(1:MMAX,1:MMAX,1:NSPIN) =  
     &           LDAU(IAT)%WLDAU(1:MMAX,1:MMAX,1:NSPIN)


          WRITE(6,*) 'Atom Number:',IAT

! Calculate density matrix per spin direction for this atom.
! Remember, GFINT is always allocated as 2x2 matrix in spin-space
          LMLO = L1**2 + 1
          LMHI = (L1 + 1)**2
          DO M1 = 1,MMAX
             LM1 = LMLO - 1 + M1
             LDAU(IAT)%DENMATC(1:MMAX,M1,1) = 
     &               DENSITY(IAT)%GFINT(LMLO:LMHI,LM1) - 
     &       DCONJG( DENSITY(IAT)%GFINT(LM1,LMLO:LMHI) )      ! ( G-G^{+} ), down-down
          ENDDO
          IF (NSPIN.EQ.2) THEN
             LMLO = (LMAXATOM(IAT) + 1)**2 + L1**2 + 1
             LMHI = (LMAXATOM(IAT) + 1)**2 + (L1 + 1)**2
             DO M1 = 1,MMAX
                LM1 = LMLO - 1 + M1
                LDAU(IAT)%DENMATC(1:MMAX,M1,2) = 
     &                       DENSITY(IAT)%GFINT(LMLO:LMHI,LM1) - 
     &               DCONJG( DENSITY(IAT)%GFINT(LM1,LMLO:LMHI) ) ! ( G-G^{+} ) , up-up
             ENDDO
          ENDIF

          LDAU(IAT)%DENMATC(1:MMAX,1:MMAX,1:NSPIN) = 
     &         LDAU(IAT)%DENMATC(1:MMAX,1:MMAX,1:NSPIN) / 2.D0 / CI   ! ( G-G^{+} ) / 2i
          ! Factor (-1/pi) has been included in integr. weight

C Result is in real Ylm basis. It must be converted to complex Ylm basis:
          WRITE(6,*) 'Occupation matrix (complex) in real basis:'
          DO IS = 1,NSPIN
              WRITE(6,*) 'IS=',IS
              CALL ZWRITE(LDAU(IAT)%DENMATC(:,:,IS),MMAX,MMAX,6)
          ENDDO
C Convert DENMATC to complex spherical harmonics.
          DO IS = 1,NSPIN
             CALL RCLM(1,L1,LMAXD,LDAU(IAT)%DENMATC(1,1,IS))
          ENDDO
          WRITE(6,*) 'Occupation matrix (complex) in complex basis:'
          DO IS = 1,NSPIN
              WRITE(6,*) 'IS=',IS
              CALL ZWRITE(LDAU(IAT)%DENMATC(:,:,IS),MMAX,MMAX,6)
          ENDDO



C 2.  Calculate total occupation numbers: 
C ntot_s = Sum_m n_{m,s,m,s}, ntot = n_1 + n_2
C

          DENTOT = 0.D0
          DO IS = 1,NSPIN
              DENTOTS(IS) = 0.D0
              DO MM = 1,MMAX
                 DENTOTS(IS) = DENTOTS(IS) + LDAU(IAT)%DENMATC(MM,MM,IS)
              ENDDO
              DENTOT = DENTOT + DENTOTS(IS)
              DENTOTS(IS) = DENTOTS(IS) / (3-NSPIN) ! If nspin=1, denmatc is spin-summed
          ENDDO                                     ! but dentots should be per spin.
          WRITE(6,FMT='(A7,F8.5,A11,2F8.5)') 
     &         'DENTOT=',DENTOT,'  DENTOTS(IS)=',(DENTOTS(IS),IS=1,2)
C In paramagnetic case the spin degeneracy has been accounted
C for by the weight DF.


          DO 100 IS = 1,NSPIN

          VLDAU(1:MMAXD,1:MMAXD) = CZERO

C 3.  Use density matrix and Coulomb matrix ULDAU to calculate the
C interaction potential VLDAU
C 3a. First part (always diagonal in spin).
          DO M1 = 1,MMAX
              DO M2 = 1,MMAX
                  CSUM = CZERO
                  DO M4 = 1,MMAX
                      DO M3 = 1,MMAX
                          CSUM2 = CZERO
                          DO JS = 1,NSPIN
                             CSUM2 = CSUM2 + LDAU(IAT)%DENMATC(M3,M4,JS)
                          ENDDO
                          CSUM = CSUM 
     &                         + LDAU(IAT)%ULDAU(M1,M2,M3,M4) * CSUM2
                      ENDDO
                  ENDDO
                  VLDAU(M1,M2) = VLDAU(M1,M2) + CSUM
              ENDDO
          ENDDO
C 3b. Second part (in fully rel. case not diagonal in spin; then this
C loop must be changed accordingly).
          DO M2 = 1,MMAX
              DO M1 = 1,MMAX
                  CSUM = CZERO
                  DO M4 = 1,MMAX
                     DO M3 = 1,MMAX
                        CSUM = CSUM - LDAU(IAT)%ULDAU(M1,M4,M3,M2) 
     &                   * LDAU(IAT)%DENMATC(M3,M4,IS) / DFLOAT(3-NSPIN) ! If nspin=1, denmatc is spin-summed
                     ENDDO                                         ! but here we need it per spin.
                  ENDDO
                  VLDAU(M1,M2) = VLDAU(M1,M2) + CSUM
              ENDDO
          ENDDO
C 3c. Third part (always spin- and m-diagonal).
          DO M1 = 1,MMAX
              VLDAU(M1,M1) = VLDAU(M1,M1)
     &             - LDAU(IAT)%UEFF*(DENTOT-0.5D0) 
     &             + LDAU(IAT)%JEFF*(DENTOTS(IS)-0.5D0)
          ENDDO

C 4. Calculate total-energy corrections EU and EDC (double-counting).
C Then the correction is EU-EDC.
C Here VLDAU is assumed spin-diagonal (contrary to the spin-orbit case).
          DO M2 = 1,MMAX
              DO M1 = 1,MMAX
                  LDAU(IAT)%EU = LDAU(IAT)%EU 
     &               + LDAU(IAT)%DENMATC(M1,M2,IS) * DREAL(VLDAU(M1,M2))
              ENDDO
          ENDDO

          LDAU(IAT)%EDC = LDAU(IAT)%EDC - 
     &                    DENTOTS(IS) * (DENTOTS(IS) - 1.D0)



          WRITE(6,*) 'Interaction potential (complex) for spin:',IS
          WRITE(6,*) '(in complex basis)'
          CALL ZWRITE (VLDAU,MMAXD,MMAX,6)

C 5.  Transform VLDAU into real spherical harmonics basis
          CALL RCLM(2,L1,LMAXD,VLDAU)

          WRITE(6,*) 'Interaction potential (complex) for spin:',IS
          WRITE(6,*) '(in real basis)'
          CALL ZWRITE (VLDAU,MMAXD,MMAX,6)

C Copy transformed VLDAU
          DO M2 = 1,MMAX
              DO M1 = 1,MMAX
                  LDAU(IAT)%WLDAU(M1,M2,IS) = DREAL(VLDAU(M1,M2))
              ENDDO
          ENDDO

 100      ENDDO                 ! IS = 1,NSPIN


C Corrections in total energy:
          LDAU(IAT)%EU = 0.5D0 * LDAU(IAT)%EU 
          LDAU(IAT)%EDC = 0.5D0 
     &     * (LDAU(IAT)%UEFF * DENTOT * (DENTOT - 1.D0) - LDAU(IAT)%EDC)


C Write out corrections on energy:
      WRITE(*,*) 'Correction to energy for atom ',IAT
      WRITE(*,*) 'EU = ',LDAU(IAT)%EU,' EDC= ',LDAU(IAT)%EDC
      WRITE(*,*) 'Total energy in LDA+U should be calculated as:'
      WRITE(*,*) 'E[LDA+U] = E[LDA] + EU - EDC'
      WRITE(*,*) 'only for atoms treated with LDA+U.'

C Calculate rms error for wldau
      RMS(IAT) = 0.D0
      DO IS = 1,NSPIN
         DO M2 = 1,MMAX
            DO M1 = 1,MMAX
               RMS(IAT) = RMS(IAT) + 
     &              (LDAU(IAT)%WLDAU(M1,M2,IS) - WLDAU_OLD(M1,M2,IS))**2
            ENDDO
         ENDDO
      ENDDO
      RMSTOT = RMSTOT + RMS(IAT)

C Apply damping to the interaction matrix WLDAU (mixing):
      XMIX =STRMIX
      if (QBOUND_LDAU > DSQRT(RMSTOT)) then
        write(*,*) 'LDAU mixing: reached QBOUND_LDAU',QBOUND_LDAU
        xmix = 0.0d0
      end if
      write(*,*) 'Mixing old-new wldau with xmix=',xmix
      CALL WMIX(XMIX,LDAU(IAT)%WLDAU(:,:,:),WLDAU_OLD(:,:,:),MMAX,NSPIN)
      
      ENDIF                     !  (L1.GE.0) 
 200  ENDDO                     ! IAT = 1,NATOM

C 6.  Write result on disk (to be used in the next iteration)

      IRUNLDAU = 1
      CALL RWLDAUPOT(.TRUE.,4,NATOM,NSPIN,LMAXD,IRMD,IRUNLDAU,LDAU)


C 7. Write out rms error
      DO IAT = 1,NATOM
         IF (LDAU(IAT)%LOPT.GE.0) 
     &    WRITE(*,*) 'RMS-ERROR for LDA+U pot. atom',IAT,DSQRT(RMS(IAT))
      ENDDO
      WRITE(*,*) 'TOTAL RMS-ERROR for LDA+U:',DSQRT(RMSTOT)


      DEALLOCATE( WLDAU_OLD )
      DEALLOCATE( VLDAU )
      DEALLOCATE( RMS )

      RETURN

      END SUBROUTINE CALCWLDAU

!*********************************************************************
!-------------------------------------------------------------------------------
!> Summary: Write-out routine 
!> Author:
!> Category: KKRimp, single-site, electrostatics, potential, lda+u 
!>           
!-------------------------------------------------------------------------------
      SUBROUTINE RWRITE(Z,MMAXD,MMAX,IFILE)
      implicit none
      INTEGER MMAXD,MMAX,M1,M2,IFILE
      REAL*8 Z(MMAXD,MMAXD)
      DO M2=1,MMAX
          WRITE(IFILE,9000) (Z(M1,M2),M1=1,MMAX)
      ENDDO
 9000 FORMAT(20F8.4)
      RETURN
      END SUBROUTINE RWRITE
!*********************************************************************
!-------------------------------------------------------------------------------
!> Summary: Write-out routine 
!> Author:
!> Category: KKRimp, single-site, electrostatics, potential, lda+u 
!>           
!-------------------------------------------------------------------------------
      SUBROUTINE ZWRITE(Z,MMAXD,MMAX,IFILE)
      implicit none
      INTEGER MMAXD,MMAX,M1,M2,IFILE
      COMPLEX*16 Z(:,:)
      DO M2=1,MMAX
          WRITE(IFILE,9000) (Z(M1,M2),M1=1,MMAX)
      ENDDO
 9000 FORMAT(20F12.8)
      RETURN
      END SUBROUTINE ZWRITE


!*********************************************************************
!-------------------------------------------------------------------------------
!> Summary: Mix old and new potential. Linear mixing with factor xmix.
!> Author:
!> Category: KKRimp, single-site, electrostatics, potential, lda+u 
!>           
!-------------------------------------------------------------------------------
      SUBROUTINE WMIX(XMIX,WLDAU,WLDAU_OLD,MMAXD,NSPIND)
c Mix old and new potential. Linear mixing with factor xmix.
      implicit none
      INTEGER MMAXD,NSPIND
      INTEGER M1,M2,IS!,IAT
      REAL*8 WLDAU_OLD(:,:,:) ! for mixing purposes
      REAL*8 WLDAU(:,:,:)
      REAL*8 XMIX,ONEMXMIX

      WRITE(*,*) 'Mixing old and new WLDAU with mixing coef.=',XMIX

      ONEMXMIX = 1.D0 - XMIX

!     DO IAT = 0,NATLDAUD
         DO IS = 1,NSPIND
            DO M2 = 1,MMAXD
               DO M1 = 1,MMAXD
                  WLDAU(M1,M2,IS) = XMIX * WLDAU(M1,M2,IS) +
     &                 ONEMXMIX * WLDAU_OLD(M1,M2,IS)
               ENDDO
            ENDDO
         ENDDO
!     ENDDO
      RETURN
      END SUBROUTINE WMIX

      END MODULE MOD_CALCWLDAU