phicalc.f Source File


Source Code

      !------------------------------------------------------------------------------------
      !> Summary: Calculates test functions PHI for LDA+U
      !> Author: Ph. Mavropoulos
      !> Calculates test functions PHI for LDA+U. Only spherical part of the potential is used.
      !> PHI are then normalised within Voronoi Circumscribing Sphere.
      !> In SRA treatment, only large component is considered as important and normalised 
      !> although small component is also calculated. `PHI` is here one-dimensional array 
      !> -- `PHI(IRMD)` -- so the subroutine must be called for each atom seperately.
      !------------------------------------------------------------------------------------
      MODULE MOD_PHICALC
      CONTAINS

      !-------------------------------------------------------------------------------
      !> Summary: Calculates test functions PHI for LDA+U
      !> Author: Ph. Mavropoulos
      !> Category: lda+u, KKRimp, KKRhost
      !> Deprecated: False 
      !> Calculates test functions PHI for LDA+U. Only spherical part of the potential is used.
      !> PHI are then normalised within Voronoi Circumscribing Sphere.
      !> In SRA treatment, only large component is considered as important and normalised 
      !> although small component is also calculated. `PHI` is here one-dimensional array 
      !> -- `PHI(IRMD)` -- so the subroutine must be called for each atom seperately.
      !-------------------------------------------------------------------------------
      SUBROUTINE PHICALC(LPHI,PHI,VISP
     &     ,IPAN,IRCUT,R,DRDI,Z,EREFLDAU,IDOLDAU,WLDAUAV,CUTOFF
     &     ,IATOM,NSPIN,NSRA,LMAXD,IRMD)

      use nrtype, only: dp
      USE mod_regsol
      USE mod_simpk
      use global_variables, only: ipand
      implicit none
      real(kind=dp), PARAMETER :: CVLIGHT=274.0720442_dp

! Input
      INTEGER IATOM,NSRA,NSPIN,IRMD,LMAXD
      INTEGER LPHI                 ! l-value for LDA+U
      INTEGER IPAN,IRCUT(0:IPAN)   ! IPAN,IRCUT(0:IPAND)
      INTEGER IDOLDAU
      REAL(kind=dp) DRDI(:)             ! DRDI(IRMD,NATYPD)
      REAL(kind=dp) R(:),VISP(:,:),Z ! R(IRMD),VISP(IRMD,NPOTD)
      REAL(kind=dp) EREFLDAU,WLDAUAV(2),CUTOFF(:)

! Output:
      COMPLEX(kind=dp) PHI(:)          ! PHI(IRMD)

! Inside
      REAL(kind=dp),ALLOCATABLE :: RS(:,:),S(:),DROR(:)  ! RS(IRMD,0:LMAXD),S(0:LMAXD),DROR(IRMD)
      COMPLEX(kind=dp),ALLOCATABLE :: HAMF(:,:),MASS(:),DLOGDP(:)     ! HAMF(IRMD,0:LMAXD),MASS(IRMD),DLOGDP(0:LMAXD)
      REAL(kind=dp),ALLOCATABLE  :: VAVRG(:),WINT(:)    ! VAVRG(IRMD),WINT(IRMD)
      COMPLEX(kind=dp),ALLOCATABLE :: PZ(:,:),FZ(:,:) ! PZ(IRMD,0:LMAXD),FZ(IRMD,0:LMAXD)


      INTEGER IPOT1,IRS1,IRC1

      INTEGER IR,L1,MMAX
      REAL(kind=dp) WNORM,WLDAUAVUD
      COMPLEX(kind=dp) CNORM,EZ,CZERO



      ALLOCATE ( RS(IRMD,0:LMAXD),S(0:LMAXD),DROR(IRMD) )
      ALLOCATE( HAMF(IRMD,0:LMAXD),  MASS(IRMD),  DLOGDP(0:LMAXD) )
      ALLOCATE( VAVRG(IRMD), WINT(IRMD) )
      ALLOCATE( PZ(IRMD,0:LMAXD),FZ(IRMD,0:LMAXD) )

      CZERO = DCMPLX(0.D0,0.D0)
      MMAX = 2*LPHI + 1
      IRS1 = IRCUT(1)
      IRC1 = IRCUT(IPAN)

      IPOT1 = (IATOM-1)*NSPIN + 1 ! points at the correct potential,
                                  ! i.e., 1,3,5,.. for NSPIN=2.
C
C --> set VAVRG = [ V(UP) + V(DN) ]/2  for IATOM
C     only for the spherical part.
C
      WLDAUAVUD = WLDAUAV(1)
      CALL DCOPY(IRMD,VISP(1,IPOT1),1,VAVRG(1),1)
      IF ( NSPIN.EQ.2 ) THEN
          CALL DAXPY(IRMD,1.D0,VISP(1,IPOT1+1),1,VAVRG(1),1)
          CALL DSCAL(IRMD,0.5D0,VAVRG,1)
          WLDAUAVUD = 0.5D0 * (WLDAUAV(1) + WLDAUAV(2))
      END IF


C Prepare and call REGSOL
C
      DO L1 = 0,LMAXD
          IF ( NSRA.GE.2 ) THEN
              S(L1) = DSQRT(DBLE(L1*L1+L1+1)-4.0D0*Z*Z
     &             /(CVLIGHT*CVLIGHT))
              IF ( Z.EQ.0.0D0 ) S(L1) = DBLE(L1)
          ELSE
              S(L1) = DBLE(L1)
          END IF
          RS(1,L1) = 0.0D0
          DO IR = 2,IRC1
              RS(IR,L1) = R(IR)**S(L1)
          END DO
      END DO
C     
      DO IR = 2,IRC1
          DROR(IR) = DRDI(IR)/R(IR)
      END DO
      EZ = DCMPLX(EREFLDAU,0.D0)
      CALL REGSOL(CVLIGHT,EZ,NSRA,DLOGDP,FZ,HAMF,MASS,PZ,DROR,R,
     &     S,VAVRG,Z,IPAN,IRCUT,IDOLDAU,LPHI,WLDAUAVUD,CUTOFF,
     +     IRMD,IPAN,LMAXD)

C The result of regsol is (R*r)/r**l (in non-sra and similar in sra)
C
C
C --> set current angular momentum as LPHI
C
      IF ( NSRA.GE.2 ) THEN
          DO IR = 2,IRC1
              PZ(IR,LPHI) = PZ(IR,LPHI)*RS(IR,LPHI)
              FZ(IR,LPHI) = FZ(IR,LPHI)/CVLIGHT*RS(IR,LPHI)/CVLIGHT
          END DO
      ELSE
          DO IR = 2,IRC1
              PZ(IR,LPHI) = PZ(IR,LPHI)*RS(IR,LPHI)
              FZ(IR,LPHI) = CZERO
          END DO
      END IF
C Copy result to PHI (only large component)
      CALL ZCOPY(IRMD,PZ(1,LPHI),1,PHI(1),1)

C Prepare Gaunt coefficients in array GSH and pass to array GAUNT:
c     CALL RINIT(LMMAXD*LMMAXD*LMPOTD,GAUNT(1,1,1))
c     CALL GAUNT2(WG,YRG)
c     CALL SHAPE(LMAXD,1,GSH,ILM,IMAXSH,LMSP,NTCELL,WG,YRG)
c     DO II = 1,IMAXSH(LMMAXD)
c         LM1 = ILM(II,1)
c         LM2 = ILM(II,2)
c         LM3 = ILM(II,3)
c         GAUNT(LM1,LM2,LM3) = GSH(II)
c     END DO
C
C --> prepare integrand for normalisation of the reg. wavefunctions
C     
C     WINT(r)= R(r)**2 * W2(r), W2(r)=Sum_{LLL'} C_{LLL'} Theta_{L'}(r)
c     CALL RINIT(IRMD,WINT(1))
c     CALL RINIT(IRMD,W2(1))

c     LM1 = LPHI**2+LPHI+1 !Set LM1 to (L=LPHI,M=0) (See Note below)
c     DO LM2 = 1,LMPOTD !Loop over shapes
c         IF (LMSP(IATOM,LM2).GT.0) THEN
c         DO IR = IRS1+1,IRC1
c             W2(IR) = W2(IR) + GAUNT(LM1,LM1,LM2) 
c    &                 * THETAS(IR-IRS1,LM2,ICELL)
c         ENDDO
c         END IF
c     ENDDO
C Normalise in cell:
c     DO IR = 1,IRS1
c         WINT(IR) = DREAL( DCONJG(PHI(IR)) * PHI(IR) )
c     END DO
c     DO IR = IRS1+1,IRC1
c         WINT(IR) = DREAL( DCONJG(PHI(IR)) * PHI(IR) )
c    &               * W2(IR)
c     ENDDO
C Or, Normalise in sphere:
      PHI(:) = CUTOFF(:) * PHI(:)
      DO IR = 1,IRC1
          WINT(IR) = REAL( CONJG(PHI(IR)) * PHI(IR), kind=dp )
      ENDDO

C
C --> integrate, normalisation factor = WNORM
C
      ipand = ipan
      CALL SIMPK(WINT,WNORM,IPAN,IRCUT,DRDI) !,IPAN)
C
C --> normalise PZ,FZ to unit probability in WS cell
C

      CNORM = 1.D0/SQRT(WNORM)
      CALL ZSCAL(IRMD,CNORM,PHI,1)
   
      DEALLOCATE( RS,S,DROR )
      DEALLOCATE( HAMF,  MASS,  DLOGDP )
      DEALLOCATE( VAVRG, WINT )
      DEALLOCATE( PZ, FZ )
   
      
      RETURN
      END SUBROUTINE PHICALC

C     Note: If we would normalise in cell instead of sphere, the choice
C     M=0 would be arbitrary. One would have different normalisation for
C     each M, if the cell has no cubic symmetry.  Here we normalise in
C     sphere, to avoid this inconsistency.


      END MODULE MOD_PHICALC