vosko.f Source File


Source Code

  !-------------------------------------------------------------------------------
  !> Summary: Calculate the spin-polarized exchange-correlation potential and the spin-polarized exchange-correlation energy from ceperley-alder ( parametrization of vosko, wilk and nusair ) ( m. manninen )
  !> Author: B. Drittler
  !> Date: June 1987
  !> Category: xc-potential, KKRimp
  !> Deprecated: False 
  !> Calculate the spin-polarized exchange-correlation potential and the spin-polarized 
  !> exchange-correlation energy from ceperley-alder 
  !> ( parametrization of vosko, wilk and nusair ) ( m. manninen )
  !> Use as input the density generated on an angular mesh (see subroutine `vxclm`). 
  !> `fpirho(.,1)` contains the charge density times \(4\pi\) and `fpirho(.,2)` the 
  !> spin density times \(4\pi\). Then the ex.-cor. potential and the ex.-cor. energy on those
  !> mesh points is calculated .
  !> The spin-down potential is stored in `vxc(.,1)`.
  !-------------------------------------------------------------------------------
      SUBROUTINE VOSKO(EXC,FPIRHO,VXC,IJEND,IJD)
C     ..
C     .. Scalar Arguments ..
      INTEGER IJEND,IJD
C     ..
C     .. Array Arguments ..
      DOUBLE PRECISION EXC(*),FPIRHO(IJD,2),VXC(IJD,2)
C     ..
C     .. Local Scalars ..
      DOUBLE PRECISION AF,AP,ATNF,ATNP,BETA,BF,BP,CBRT1,CBRT2,CF,CF1,
     +                 CF2,CF3,CP,CP1,CP2,CP3,DBETA,DFS,DUC,DUC1,DUC2,
     +                 EC,ECF,ECP,FS,ONTHRD,QF,QP,RS,S,S4,SMAG,TF1,TP1,
     +                 UC0,UC1,UC10,UC2,UC20,UCF,UCP,X,XF0,XFX,XP0,XPX
      INTEGER IJ
C     ..
C     .. Intrinsic Functions ..
      INTRINSIC ABS,ATAN,LOG,MAX,MIN,SIGN,SQRT
C     ..
C     .. Save statement ..
      SAVE AP,XP0,BP,CP,QP,CP1,CP2,CP3,AF,XF0,BF,CF,QF,CF1,CF2,CF3
C     ..
C     .. Data statements ..
      DATA AP,XP0,BP,CP,QP,CP1,CP2,CP3/0.0621814D0,-0.10498D0,3.72744D0,
     +     12.9352D0,6.1519908D0,1.2117833D0,1.1435257D0,-0.031167608D0/
      DATA AF,XF0,BF,CF,QF,CF1,CF2,CF3/0.0310907D0,-0.32500D0,7.06042D0,
     +     18.0578D0,4.7309269D0,2.9847935D0,2.7100059D0,-0.1446006D0/
C     ..
c
      ONTHRD = 1.0D0/3.0D0
c
c---> loop over the angular mesh points
c
      DO 10 IJ = 1,IJEND
        FPIRHO(IJ,1) = MAX(1.0D-10,FPIRHO(IJ,1))
        SMAG = SIGN(1.0D0,FPIRHO(IJ,2))
        FPIRHO(IJ,2) = SMAG*MIN(FPIRHO(IJ,1)-1.0D-10,ABS(FPIRHO(IJ,2)))
        RS = (3.D0/FPIRHO(IJ,1))**ONTHRD
        S = FPIRHO(IJ,2)/FPIRHO(IJ,1)
        X = SQRT(RS)
        XPX = X*X + BP*X + CP
        XFX = X*X + BF*X + CF
        S4 = S**4 - 1.D0
        CBRT1 = (1.D0+S)** (1.D0/3.D0)
        CBRT2 = (1.D0-S)** (1.D0/3.D0)
        FS = ((1.D0+S)** (4.D0/3.D0)+ (1.D0-S)** (4.D0/3.D0)-2.D0)/
     +       (2.D0** (4.D0/3.D0)-2.D0)
        BETA = 1.D0/ (2.74208D0+3.182D0*X+0.09873D0*X*X+0.18268D0*X**3)
        DFS = 4.D0/3.D0* (CBRT1-CBRT2)/ (2.D0** (4.D0/3.D0)-2.D0)
        DBETA = - (0.27402D0*X+0.09873D0+1.591D0/X)*BETA**2
        ATNP = ATAN(QP/ (2.D0*X+BP))
        ATNF = ATAN(QF/ (2.D0*X+BF))
        ECP = AP* (LOG(X*X/XPX)+CP1*ATNP-
     +        CP3* (LOG((X-XP0)**2/XPX)+CP2*ATNP))
        ECF = AF* (LOG(X*X/XFX)+CF1*ATNF-
     +        CF3* (LOG((X-XF0)**2/XFX)+CF2*ATNF))
        EC = ECP + FS* (ECF-ECP)* (1.D0+S4*BETA)
c
c---> calculate ex.-cor. energy
c
        EXC(IJ) = EC - 0.9163306D0/RS - 0.2381735D0/RS*FS
        TP1 = (X*X+BP*X)/XPX
        TF1 = (X*X+BF*X)/XFX
        UCP = ECP - AP/3.D0* (1.D0-TP1-CP3* (X/ (X-XP0)-TP1-XP0*X/XPX))
        UCF = ECF - AF/3.D0* (1.D0-TF1-CF3* (X/ (X-XF0)-TF1-XF0*X/XFX))
        UC0 = UCP + (UCF-UCP)*FS
        UC10 = UC0 - (ECF-ECP)* (S-1.D0)*DFS
        UC20 = UC0 - (ECF-ECP)* (S+1.D0)*DFS
        DUC = (UCF-UCP)*BETA*S4*FS + (ECF-ECP)* (-RS/3.D0)*DBETA*S4*FS
        DUC1 = DUC - (ECF-ECP)*BETA* (S-1.D0)* (4.D0*S**3*FS+S4*DFS)
        DUC2 = DUC - (ECF-ECP)*BETA* (S+1.D0)* (4.D0*S**3*FS+S4*DFS)
        UC1 = UC10 + DUC1
        UC2 = UC20 + DUC2
c
c---> calculate exc.-cor. potential
c
        VXC(IJ,2) = UC1 - 1.221774D0/RS*CBRT1
        VXC(IJ,1) = UC2 - 1.221774D0/RS*CBRT2
        IF (ABS(FPIRHO(IJ,1)).LE.1.0D-10) THEN
          VXC(IJ,1) = 0.0D0
          VXC(IJ,2) = 0.0D0
        END IF

   10 CONTINUE
      END SUBROUTINE