gxcpt.f Source File


Source Code

  !-------------------------------------------------------------------------------
  !> Summary: Exchange-correlation potential and total energy for PW91 (GGA)
  !> Author: 
  !> Category: xc-potential, KKRimp
  !> Deprecated: False 
  !> Exchange-correlation potential in ry. also total-energy
  !------------------------------------------------------------------------------- 
      SUBROUTINE GXCPT(IDSPR,RO,ZTA,AGR,AGRU,AGRD,G2R,G2RU,G2RD,GGGR,
     +                 GGGRU,GGGRD,GRGRU,GRGRD,GZGR,XCPTU,XCPTD,XCED,
     +                 VXLU,VXLD,VCLU,VCLD,XEDL,CEDL,VXGU,VXGD,VCGU,
     +                 VCGD,XEDG,CEDG)

c     common/cxcf/igl,igh,imj,ibh,ica,icg,ivn,ipw,ipg,ivg,ip9,igd,ixlf,
c    &  iex,xlf
c     common/ctrns7/hugeo,huges,hugef,dspr,rdspr,idspr
c.....-----------------------------------------------------------------
C     .. Scalar Arguments ..
      DOUBLE PRECISION AGR,AGRD,AGRU,CEDG,CEDL,G2R,G2RD,G2RU,GGGR,GGGRD,
     +                 GGGRU,GRGRD,GRGRU,GZGR,RO,VCGD,VCGU,VCLD,VCLU,
     +                 VXGD,VXGU,VXLD,VXLU,XCED,XCPTD,XCPTU,XEDG,XEDL,
     +                 ZTA
      INTEGER IDSPR
C     ..
C     .. Local Scalars ..
      DOUBLE PRECISION A,A1,A2,A3,AF,ALC,ALF,ALFC,AP,B,B1,B1F,B1P,B2,
     +                 B2F,B2P,B3,BCR,BETA,BF,BP,BRS,BX,BXD,BXU,BZ41,C,
     +                 C1,C113,C115,C13,C1415,C2,C23,C2915,C2Q23,C3,C32,
     +                 C43,C53,C56,C76,C83,CA,CCF,CCP,CE,CEF,CEP,CF,CGZ,
     +                 CP,CRDC,CRF,CRO,CRP,CRR1,CRR2,D,DACDR,DBDR,DBROD,
     +                 DBROU,DCDR,DD,DECDRF,DECDRP,DF,DFDZ,DLTA,DP,
     +                 DSDFD,DSDFU,DSPR,DSPRS,DVDR1,DVDR2,DVDRD,DVDRU,
     +                 EC,ECF,ECP,ECRS,ECZTA,EF3VI,EXPFAI,F1D,F1U,F2D,
     +                 F2U,F3D,F3U,FAI,FAI2,FD,FDD0,FK,FU,FZ,G,GF,GP,
     +                 GR2,GR2D,GR2U,GZ,GZ2,GZ3,HUGEF,HUGEO,HUGES,PI,Q,
     +                 Q1,Q2,Q3,R,RNC,RO113,RO13,RO2,RO43,RO76,RO83,ROD,
     +                 ROD13,ROD23,ROD3,ROD43,ROD53,ROU,ROU13,ROU23,
     +                 ROU3,ROU43,ROU53,RS,RS2,RS3,SD,SD2,SD3,SD4,SD6,
     +                 SIDFD,SIDFU,SK,SML,SSFC,SU,SU2,SU3,SU4,SU6,TC,TD,
     +                 TKSG,TU,UC,UD,UU,VC,VC13,VC45D,VC45U,VC6,VCCF,
     +                 VCF,VCL1,VCL2,VCP,VXP,VZ,WC,X,X0,X01,X02,X03,
     +                 XEDGD,XEDGU,XEDLD,XEDLU,XF,XL,XL0,XL01,XL02,XL03,
     +                 XL1,XL2,XL3,XLD,XLD1,XLD2,XLD3,XLF,XP,XS,ZT13M,
     +                 ZT13P,ZTA3,ZTA4
      INTEGER IBH,ICA,ICG,IEX,IGD,IGH,IGL,IMJ,IP9,IPG,IPW,IVG,IVN,IXLF
C     ..
C     .. External Subroutines ..
!       EXTERNAL CORLSD,CPW91,EXCH91
C     ..
C     .. Intrinsic Functions ..
      INTRINSIC ACOS,ATAN,EXP,LOG,SQRT
C     ..
C     .. Statement Functions ..
      DOUBLE PRECISION FBET,FDEDR,FDFDZ,FFZ,FNCECL,FNCECS,FNCF,FNCVCL,
     +                 FNCVCS,FVNEC,FVQ
C     ..
C     .. Save statement ..
      SAVE GP,GF,B1P,B1F,B2P,B2F,CP,CF,DP,DF,AP,BP,AF,BF,A1,X01,B1,C1,
     +     A2,X02,B2,C2,A3,X03,B3,C3,FDD0,HUGEO,HUGES,HUGEF,DSPR,IGL,
     +     IGH,IMJ,IBH,ICA,ICG,IVN,IPW,IPG,IVG,IP9,IGD,IXLF,IEX,XLF
C     ..
C     .. Statement Function definitions ..
      FNCF(X) = (1.d0+X*X*X)*LOG(1.d0+1.d0/X) + X/2.d0 - X*X -
     +          0.333333333d0
      FNCECL(R,G,B1,B2) = G/ (1.d0+B1*SQRT(R)+B2*R)
      FNCVCL(CE,R,B1,B2) = CE* (1.d0+1.16666667d0*B1*SQRT(R)+
     +                     1.33333333d0*B2*R)/ (1.d0+B1*SQRT(R)+B2*R)
      FNCECS(R,A,B,C,D) = A*LOG(R) + B + C*R*LOG(R) + D*R
      FNCVCS(R,A,B,C,D) = A*LOG(R) + (B-A/3.d0) +
     +                    0.666666667d0*C*R*LOG(R) + (2.d0*D-C)*R/3.d0
      FFZ(ZTA) = 1.923661051d0* ((1.d0+ZTA)**1.3333333333d0+
     +           (1.d0-ZTA)**1.3333333333d0-2.d0)
      FDFDZ(ZTA) = 2.564881401d0* ((1.d0+ZTA)**.333333333333d0-
     +             (1.d0-ZTA)**.333333333333d0)
      FVQ(B,C) = SQRT(4.d0*C-B**2)
      FVNEC(A,X,XL,X0,XL0,B,Q) = A* (LOG(X*X/XL)+
     +                           2.d0*B/Q*ATAN(Q/ (2.d0*X+B))-
     +                           B*X0/XL0* (LOG((X-X0)**2/XL)+2.d0* (B+
     +                           2.d0*X0)/Q*ATAN(Q/ (2.d0*X+B))))
      FBET(FDD0,ECF,ECP,ALC) = FDD0* (ECF-ECP)/ALC - 1.d0
      FDEDR(RO,X,A,X0,XL,XL0,XLD,B,Q) = -X/ (6.d0*RO)*A*
     +  ((2.d0*XL-X*XLD)/ (X*XL)-B* (4.d0/ (XLD**2+Q**2)+
     +  X0/XL0* ((2.d0*XL- (X-X0)*XLD)/ ((X-X0)*XL)-4.d0* (B+
     +  2.d0*X0)/ (XLD**2+Q**2))))
C     ..
C     .. Data statements ..
      DATA GP,GF,B1P,B1F,B2P,B2F,CP,CF,DP,DF/-.2846d0,-.1686d0,1.0529d0,
     +     1.3981d0,0.3334d0,0.2611d0,0.0040d0,0.0014d0,-.0232d0,
     +     -.0096d0/
      DATA AP,BP,AF,BF/0.0622d0,-.096d0,0.0311d0,-0.0538d0/
      DATA A1,X01,B1,C1/.0621814d0,-.10498d0,3.72744d0,12.9352d0/
      DATA A2,X02,B2,C2/.0310907d0,-.32500d0,7.06042d0,18.0578d0/
      DATA A3,X03,B3,C3/-.03377373d0,-.0047584d0,1.13107d0,13.0045d0/
      DATA FDD0/1.70992093d0/
      DATA HUGEO,HUGES,HUGEF,DSPR/625.D0,1.d+6,50.D0,1.d-4/
      DATA IGL,IGH,IMJ,IBH,ICA,ICG,IVN,IPW,IPG,IVG,IP9,IGD,IXLF,IEX,
     +     XLF/0,0,0,0,0,0,0,0,0,0,0,0,0,0,0.00D0/
C     ..
c.....-----------------------------------------------------------------
c.....Perdew-zunger parametrization of Ceperley-Alder. g,a,b,c,d in ry.
c.....for vwn. a1,x01,b1,c1 for para(zta=0), -2 for zta=1, -3 for alfac.
c.....fdd0: fz''(o).
c.....-----------------------------------------------------------------
C
C     PW91   ip9=1  igd=1
C
C     PW86      imj=1  igd=1
C

      IP9 = 1
      IGD = 1
C
C
      PI = ACOS(-1.d0)
      SML = 1.d-12
      IF (ZTA.GT.1.d0-SML) ZTA = 1.d0 - SML
c.....
c     vxlu,vxld,vxgu,vxgd: exchange potential in ry.(local,grad),(up,dw)
c     vclu,vcld,vcgu,vcgd: correl. potential in ry.(local,grad),(up,dw)
c     xedl,xedg: exchange energy density (local,grad.exp.) in ry.
c     cedl,cedg: exchange energy density (local,grad.expnd.) in ry.
c.....
      VXLU = 0.0D0
      VCLU = 0.0D0
      VXLD = 0.0D0
      VCLD = 0.0D0
      XEDL = 0.0D0
      CEDL = 0.0D0
      VXGU = 0.0D0
      VCGU = 0.0D0
      VXGD = 0.0D0
      VCGD = 0.0D0
      XEDG = 0.0D0
      CEDG = 0.0D0
c.....
      IF (RO.LT.SML) GO TO 20
c.....
      C13 = 1.D0/3.D0
      C23 = 2.D0/3.D0
      C32 = 3.D0/2.D0
      C43 = 4.D0/3.D0
      C53 = 5.D0/3.D0
      C76 = 7.D0/6.D0
      C113 = 11.D0/3.D0
c.....ca=2.**(-.33333333)
      CA = 0.793700526d0
c.....alf=-3*(3/4*pai)**(1/3).
      ALF = -1.861051473d0
c.....
      RO2 = RO*RO
      RO13 = RO**C13
      RO43 = RO**C43
      RO83 = RO43**2
      RO76 = RO**C76
      RO113 = RO**C113
c.....
      ROU = RO* (1.D0+ZTA)/2.d0
      ROU3 = ROU**3
      ROU13 = ROU**C13
      ROU23 = ROU**C23
      ROU43 = ROU**C43
c.....
      ROD = RO - ROU
      ROD3 = ROD**3
      ROD13 = ROD**C13
      ROD23 = ROD**C23
      ROD43 = ROD**C43
c.....
c     gr2=drr*drr
c     gr2u=drru**2
c     drrd=drr-drru
c     gr2d=drrd**2
c     ddrrd=ddrr-ddrru
c.....
      FZ = FFZ(ZTA)
      DFDZ = FDFDZ(ZTA)
c.....
c.....gz,gz2,gz3: for Wang-Perdew ssf.
      GZ = ((1.D0+ZTA)**C23+ (1.D0-ZTA)**C23)/2.D0
      GZ2 = GZ**2
      GZ3 = GZ**3
c.....
      ZTA3 = ZTA**3
      ZTA4 = ZTA**4
      ZT13P = (1.D0+ZTA)**C13
      ZT13M = (1.D0-ZTA)**C13
c.....
      RS = 0.620350491d0/RO13
      RS2 = RS*RS
      RS3 = RS*RS2
c.....
c.....xedl: exchange-energy-density in ry.
      XEDL = ALF* (ROU43+ROD43)
c.....
c.....exchange-potential, vxp,vxlu,vxld: v-exchange-(para,up,dw).
      VXLU = C43*ALF*ROU13
      VXLD = C43*ALF*ROD13

c.....
      IF (IEX.EQ.1) GO TO 10
c.....

c.....xlfa.
      IF (IXLF.NE.0) THEN
        XLF = 2.D0/3.D0
        VCLU = (XLF*C32-1.D0)*VXLU
        VCLD = (XLF*C32-1.D0)*VXLD
        CEDL = (XLF*C32-1.D0)*XEDL
        GO TO 10
      END IF
c.....
c.....Gunnarson-Lundqvist.(p.r.b13('76),4274,eqs(54)~(56).) or
cc....  g-l but with beta by hedin-lundq.(j.phys.c.4('71),2064))
      IF ((IGL.NE.0) .OR. (IGH.NE.0)) THEN
        XP = RS/11.4d0
        XF = RS/15.9d0
        CEP = -0.0666d0*FNCF(XP)
        CEF = -0.0406d0*FNCF(XF)
        CE = CEP + (CEF-CEP)*FZ
        CEDL = CE*RO
c.....
        IF (IGL.NE.0) BETA = 1.D0 + 0.0545d0*RS*LOG(1.D0+11.4d0/RS)
        IF (IGH.NE.0) BETA = 1.D0 + .03683d0*RS*LOG(1.D0+21.D0/RS)
        DLTA = 1.D0 - 0.036d0*RS + 1.36d0*RS/ (1.D0+10.D0*RS)
c.....
        VXP = C43*ALF*CA*RO13
        VCLU = VXP* (BETA+DLTA/3.D0*ZTA/ (1.D0+0.297d0*ZTA)) - VXLU
        VCLD = VXP* (BETA-DLTA/3.D0*ZTA/ (1.D0-0.297d0*ZTA)) - VXLD
c.....
        GO TO 10
      END IF
c.....
c.....Hedin-von Barth. (j.phys.c.5('72),1629) or moruzzi-janak-williams.
      IF ((IBH.NE.0) .OR. (IMJ.NE.0)) THEN
        IF (IBH.NE.0) THEN
          CRP = 30.D0
          CRF = 75.D0
          CCP = 0.0504d0
          CCF = 0.0254d0
        ELSE IF (IMJ.NE.0) THEN
          CRP = 21.D0
          CRF = 52.916684d0
          CCP = 0.045d0
          CCF = 0.0225d0
c           write(6,*) 'MJW'
        END IF
        XP = RS/CRP
        XF = RS/CRF
        CEP = -CCP*FNCF(XP)
        CEF = -CCF*FNCF(XF)
        CE = CEP + (CEF-CEP)*FZ
        CEDL = CE*RO
c       vclu,vcld: v-correlation-(up,dw). potential.(ry)
        RNC = C43*CA/ (1.D0-CA)* (CEF-CEP)
        VCP = -CCP*LOG(1.D0+CRP/RS)
        BRS = VCP - RNC
        VCLU = RNC*ZT13P + BRS
        VCLD = RNC*ZT13M + BRS
c.....
        GO TO 10
      END IF
c.....
c.....Ceperley-Alder.(paramtrzd by Perdew-zunger.(p.r.23('81),5048)).
      IF (ICA.NE.0) THEN
c.....
        IF (RS.GE.1.d0) THEN
          CEP = FNCECL(RS,GP,B1P,B2P)
          CEF = FNCECL(RS,GF,B1F,B2F)
          VCP = FNCVCL(CEP,RS,B1P,B2P)
          VCF = FNCVCL(CEF,RS,B1F,B2F)
        ELSE
          CEP = FNCECS(RS,AP,BP,CP,DP)
          CEF = FNCECS(RS,AF,BF,CF,DF)
          VCP = FNCVCS(RS,AP,BP,CP,DP)
          VCF = FNCVCS(RS,AF,BF,CF,DF)
        END IF
c.....
        CE = CEP + (CEF-CEP)*FZ
        CEDL = CE*RO
c.....
c.....
        VCL2 = (CEF-CEP)*DFDZ
        VCL1 = VCP + (VCF-VCP)*FZ - VCL2*ZTA
        VCLU = VCL1 + VCL2
        VCLD = VCL1 - VCL2
c.....
        GO TO 10
      END IF
c.....
c.....Ceperley-Alder.with Wang-Perdew spin-scaling-factor.
      IF (ICG.NE.0) THEN
c.....
        IF (RS.GE.1.d0) THEN
          CEP = FNCECL(RS,GP,B1P,B2P)
          VCP = FNCVCL(CEP,RS,B1P,B2P)
        ELSE
          CEP = FNCECS(RS,AP,BP,CP,DP)
          VCP = FNCVCS(RS,AP,BP,CP,DP)
        END IF
c.....
        CE = CEP*GZ3
        CEDL = CE*RO
c.....
        CGZ = CEP*GZ2* (1.D0/ZT13P-1.D0/ZT13M)
        VCL1 = VCP*GZ3 - CGZ*ZTA
        VCLU = VCP*GZ3 + CGZ
        VCLD = VCP*GZ3 - CGZ
c.....
        GO TO 10
      END IF
c.....
c.....Vosko-Wilk-Nusair. Phys.Rev..22,3812,'80.
      IF (IVN.NE.0) THEN
c.....
c.....xl:x-large. xld:d(xl)/dx. xl0:x-large for x=x0.
        XS = SQRT(RS)
        XL1 = XS**2 + B1*XS + C1
        XL2 = XS**2 + B2*XS + C2
        XL3 = XS**2 + B3*XS + C3
        XLD1 = 2.D0*XS + B1
        XLD2 = 2.D0*XS + B2
        XLD3 = 2.D0*XS + B3
        XL01 = X01**2 + B1*X01 + C1
        XL02 = X02**2 + B2*X02 + C2
        XL03 = X03**2 + B3*X03 + C3
        Q1 = FVQ(B1,C1)
        Q2 = FVQ(B2,C2)
        Q3 = FVQ(B3,C3)
        ECP = FVNEC(A1,XS,XL1,X01,XL01,B1,Q1)
        ECF = FVNEC(A2,XS,XL2,X02,XL02,B2,Q2)
        ALC = FVNEC(A3,XS,XL3,X03,XL03,B3,Q3)
        BETA = FBET(FDD0,ECF,ECP,ALC)
        BZ41 = 1.D0 + BETA*ZTA4
c.....
        CE = ECP + ALC*FZ/FDD0*BZ41
        CEDL = CE*RO
c.....
c.....alc: alfac.
c.....decdrp,decdrf: d(ec)/dro-para(zta=0), -(zta=1).
c.....dacdr: d(alc)/dro.
c.....dbdr: d(beta)/dro.
        DECDRP = FDEDR(RO,XS,A1,X01,XL1,XL01,XLD1,B1,Q1)
        DECDRF = FDEDR(RO,XS,A2,X02,XL2,XL02,XLD2,B2,Q2)
        DACDR = FDEDR(RO,XS,A3,X03,XL3,XL03,XLD3,B3,Q3)
c.....
        DBDR = FDD0* ((DECDRF-DECDRP)*ALC- (ECF-ECP)*DACDR)/ALC**2
        VCL1 = CE + RO* (DECDRP+ (DACDR*FZ*BZ41+ALC*FZ*DBDR*ZTA4)/FDD0)
        VCL2 = 2.d0*ALC/ (FDD0*RO)* (DFDZ*BZ41+4.D0*FZ*BETA*ZTA3)
        VCLU = VCL1 + VCL2*ROD
        VCLD = VCL1 + VCL2* (-ROU)
c.....
        GO TO 10
      END IF
c.....
      IF (IP9.EQ.1) THEN
        GO TO 10
      END IF
c.....
   10 CONTINUE

c.....gradient expansion.
c.....
      IF (IGD.LE.0) GO TO 20
c       write(6,*)  '  GGA '
c.....
      GR2 = AGR**2
      GR2U = AGRU**2
      GR2D = AGRD**2

      C56 = 5.D0/6.D0
      C115 = 1.D0/15.D0
      C1415 = 14.D0/15.D0
      C2915 = 29.D0/15.D0
      C2Q23 = 2.D0**C23
      C83 = 8.D0/3.D0
c.....
c.....  dsprs: divergence-suppress-factor.
c       if((log(dspr)+2.*log(agr)-c83*log(ro)).gt.8.0) go to 200
      DSPRS = 1.D0
      IF (IDSPR.EQ.1) DSPRS = EXP(-DSPR*GR2/RO**C83)
c.....
c     agr,agru,agrd: abs(grad(rho)), for all, up, and down.
cc    gr2,gr2u,gr2d: grad(rho_all)**2, grad(rho_up)**2, grad(rho_d)**2.
c     g2r,g2ru,g2rd: laplacian rho_all, _up and _down.
c     gggru,-d: grad(rho)*grad(abs(grad(rho))) for all,up and down.
c     grgru,-d: grad(rho_all)*grad(rhor_up) and for down.

c       g2r=ddrr+2.*drr/rv
c.....
      ROU53 = ROU**C53
c.....
c.....  edrru: d(abs(d(rou)/dr))/dr, edrrd for down.
c       edrru=ddrru
c       if(drru.lt.0.) edrru=-ddrru
c.....
c       agr,agbru,-d: abs(grad(rho)),for rou, rod.
c       gggru,-d: grad(rho)*grad(abs(grad(rho))) for up and down.
c.....  su:at ro=2*rou. 1/(2(3*pai**2)**(1/3))*|grad(rou)|/rou**(4/3).
      SU = 0.128278244d0*AGRU/ROU43
      IF (SU.GT.HUGES) GO TO 20
c       g2ru=ddrru+2.*drru/rv
      TU = .016455307d0*G2RU/ROU53
      UU = 0.002110857d0*GGGRU/ROU3

      IF (IP9.NE.1) THEN

        SU2 = SU*SU
        SU3 = SU*SU2
        SU4 = SU2*SU2
        SU6 = SU2*SU4
c.....
        F1U = 1.d0 + 1.296d0*SU2 + 14.d0*SU4 + .2d0*SU6
        F2U = 2.592d0 + 56.d0*SU2 + 1.2d0*SU4
        F3U = 112.d0*SU + 4.8d0*SU3
c.....
c.....  fu: fgga(su) eq.(20) of Perdew-Wang.(Phys.Rev..b33,8800,'86.)
c.....  sidfu: su**(-1)*d(fu)/d(su)).
c.....  dsdfu: d(sidfu)/d(su).
c.....  xedgu; exchange energy density xe at ro=2*rou.(16) of p.w.
cc....      xedgu=ax*rou**(4/3)*(fu-1). ax=2**(4/3)*1.47711(ry).

        FU = F1U**C115
        SIDFU = C115*F1U** (-C1415)*F2U
        DSDFU = C115*F1U** (-C2915)* (-C1415*SU*F2U**2+F1U*F3U)
c.....
        XEDGU = -3.722102942d0* (FU-1.d0)*ROU43
c.....
        VXGU = DSPRS*ALF*ROU13* (C43* (FU-1.D0)-TU*SIDFU-
     +         (UU-C43*SU3)*DSDFU)

      ELSE

        DBROU = ROU*2.D0

        CALL EXCH91(DBROU,SU,UU,TU,XEDLU,XEDGU,VXLU,VXGU)

        XEDL = XEDLU/2.d0

      END IF

c.....
c.....bxu,bxd,bx: grad-coeff. for exchange.

      BXU = XEDGU/GR2U*ROU43
c.....
      ROD53 = ROD**C53
c       edrrd=ddrrd
c       if(drrd.lt.0.) edrrd=-ddrrd

      SD = 0.128278244d0*AGRD/ROD43
      IF (SD.GT.HUGES) GO TO 20

c       g2rd=ddrrd+2.*drrd/rv

      TD = .016455307d0*G2RD/ROD53
      UD = 0.002110857d0*GGGRD/ROD3

      IF (IP9.NE.1) THEN

        SD2 = SD*SD
        SD3 = SD*SD2
        SD4 = SD2*SD2
        SD6 = SD2*SD4
c.....
        F1D = 1.d0 + 1.296d0*SD2 + 14.d0*SD4 + .2d0*SD6
        F2D = 2.592d0 + 56.d0*SD2 + 1.2d0*SD4
        F3D = 112.d0*SD + 4.8d0*SD3
c.....
c.....  fd: fgga(sd) eq.(20) of Perdew-Wang.(Phys.Rev..b33,8800,'86.)
c.....  sidfd: sd**(-1)*d(fd)/d(sd)).
c.....  dsdfd: d(sidfd)/d(sd).
c.....  xedgd; exchange energy density xe at ro=2*rod.(16) of p.w.
cc....      xedgd=ax*rod**(4/3)*(fd-1). ax=2**(4/3)*1.47711(ry).

        FD = F1D**C115
        SIDFD = C115*F1D** (-C1415)*F2D
        DSDFD = C115*F1D** (-C2915)* (-C1415*SD*F2D**2+F1D*F3D)
c.....
        XEDGD = -3.722102942d0* (FD-1.d0)*ROD43
c.....
        VXGD = DSPRS*ALF*ROD13* (C43* (FD-1.D0)-TD*SIDFD-
     +         (UD-C43*SD3)*DSDFD)

      ELSE

        DBROD = ROD*2.D0

        CALL EXCH91(DBROD,SD,UD,TD,XEDLD,XEDGD,VXLD,VXGD)

        XEDL = XEDL + XEDLD/2.d0

      END IF

      BXD = XEDGD/GR2D*ROD43
c.....

      XEDG = DSPRS* (XEDGU+XEDGD)/2.d0

      BX = (BXU+BXD)/2.d0

      IF (IEX.EQ.1) GO TO 20

c.....
c.... cro: c(n) of (6),Phys.Rev..b33,8822('86). in ry.
c.... dcdr: d(cro)/d(ro).
c.....0.001625816=1.745*f(=0.11)*cro(rs=0).

      IF (IP9.NE.1) THEN

        CRR1 = .005136d0 + .046532d0*RS + 1.4778d-5*RS2
        CRR2 = 1.D0 + 8.723d0*RS + .472d0*RS2 + .07389d0*RS3
        CRO = .003334d0 + CRR1/CRR2
        DCDR = ((.046532d0+2.9556d-5*RS)*CRR2-
     +         CRR1* (8.723d0+.944d0*RS+.22167d0*RS2))/CRR2/CRR2*
     +         (-RS/RO/3.D0)
c.....
        FAI = 0.001625816d0/CRO*AGR/RO76
        IF (FAI.GT.HUGEF) GO TO 20
        FAI2 = FAI*FAI
        EXPFAI = EXP(-FAI)
c.....
c.....
        IF (IPG.EQ.0) THEN

          DD = 0.707106781d0*SQRT((1.D0+ZTA)**C53+ (1.D0-ZTA)**C53)
c.....    ssfc: spin-scaling-factor for gradient correlation energy.
          SSFC = 1.D0/DD
          CRDC = C56/ (RO113*DD**2)*C2Q23
          VC45U = -CRDC* (ROU23-ROD23)* ((1.D0-FAI)*ROD*GR2-
     +            (2.D0-FAI)*RO*GRGRD)
          VC45D = -CRDC* (ROD23-ROU23)* ((1.D0-FAI)*ROU*GR2-
     +            (2.D0-FAI)*RO*GRGRU)

        ELSE IF (IPG.EQ.1) THEN

          SSFC = GZ
          CRDC = C2Q23/ (3.D0*GZ*RO83)
          VC45U = CRDC* (1.D0/ROU13-1.D0/ROD13)*
     +            ((1.D0-FAI)*ROD*GR2- (2.D0-FAI)*RO*GRGRD)
          VC45D = CRDC* (1.D0/ROD13-1.D0/ROU13)*
     +            ((1.D0-FAI)*ROU*GR2- (2.D0-FAI)*RO*GRGRU)

        ELSE IF (IVG.EQ.1) THEN

          WRITE (6,FMT=
     +      '(/'' non-spher modification not completed for vg'')')
          STOP 30

          IF (IVN.EQ.0) THEN
            WRITE (6,FMT=9000) IVN,IVG
            STOP 16
          END IF
c.....
          DFDZ = FDFDZ(ZTA)
          VZ = (1.D0+ALC/ECP*FZ/FDD0*BZ41)**C13
c.....
          SSFC = VZ
c.....
c.....    dvdru,dvdrd: d(vz)/drou,-d.
          EF3VI = 1.d0/ (ECP*FDD0*3.d0*VZ**2)
          DVDR1 = (DACDR*BZ41-ALC/ECP*DECDRP*BZ41+ALC*DBDR*ZTA4)*FZ*
     +            EF3VI
          DVDR2 = 2.d0* (DFDZ*BZ41+4.d0*FZ*BETA*ZTA3)*ALC/RO2*EF3VI
          DVDRU = DVDR1 + DVDR2*ROD
          DVDRD = DVDR1 - DVDR2*ROU
c.....
          VC45U = ((1.D0-FAI)*GR2*DVDRU-
     +            (2.D0-FAI)*GRGRD* (DVDRU-DVDRD))/ (VZ*RO)
          VC45D = ((1.D0-FAI)*GR2*DVDRD-
     +            (2.D0-FAI)*GRGRU* (DVDRD-DVDRU))/ (VZ*RO)

        END IF

c.....  cedg: correlation-energy-density from grad.expansion.
c.....  bcr: grad-coeff. for correlation.
        BCR = SSFC*EXPFAI*CRO
        CEDG = DSPRS*BCR*GR2/RO43
c.....
c.....  vccf:v-correlation-coeff.
        VCCF = -SSFC*EXPFAI*CRO/RO13
        VC13 = (2.D0-FAI)*G2R/RO - (C43-C113*FAI+C76*FAI2)*GR2/RO2 +
     +         FAI* (FAI-3.D0)*GGGR/AGR/RO
c    &    fai*(fai-3.)*ddrr/ro
        VC6 = -GR2/RO* (FAI2-FAI-1.D0)/CRO*DCDR
c.....
        VCGU = DSPRS*VCCF* (VC13+VC6+VC45U)
c.....
        VCGD = DSPRS*VCCF* (VC13+VC6+VC45D)

      ELSE

c       PW91

        CALL CORLSD(RS,ZTA,EC,VCLU,VCLD,ECRS,ECZTA,ALFC)

        VCLU = VCLU*2.D0
        VCLD = VCLD*2.D0
        CEDL = EC*2.D0*RO

        FK = 1.91915829d0/RS
        SK = SQRT(4.D0*FK/PI)
        TKSG = 2.D0*SK*GZ
        TC = AGR/ (RO*TKSG)
c           gagr: d(ABS(d(ro)/dr))/dr.
c           gagr=ddrr
c           if(drr.lt.0.) gagr=-ddrr
        UC = GGGR/ (RO2*TKSG**3)
c         uc=drr*gagr/(ro2*tksg**3)
        VC = G2R/ (RO*TKSG**2)
        WC = GZGR/ (RO*TKSG**2)
c         wc=drr*dzr/(ro*tksg**2)

        CALL CPW91(FK,SK,GZ,EC,ECRS,ECZTA,RS,ZTA,TC,UC,VC,WC,CEDG,VCGU,
     +             VCGD)

        VCGU = VCGU*2.D0
        VCGD = VCGD*2.D0
        CEDG = CEDG*RO*2.D0*DSPRS

        BCR = CEDG/GR2*RO43

      END IF
c.....
   20 CONTINUE

      XCPTU = VXLU + VCLU + VXGU + VCGU
      XCPTD = VXLD + VCLD + VXGD + VCGD
check
c     ro is small
c
      XCED = 0.0D0
      IF (RO.GT.SML) XCED = (XEDL+CEDL+XEDG+CEDG)/RO

c     write(6,'(/'' vxlu,vxld,vclu,vcld,xedl,cedl ro='',7f11.5)') vxlu,
c    &    vxld,vclu,vcld,xedl,cedl,ro
c       write(6,'(/'' vxgu,vxgd,vcgu,vcgd,xedg,cedg='',6f12.7)') vxgu,
c    &    vxgd,vcgu,vcgd,xedg,cedg

      RETURN
 9000 FORMAT (/,' ivn should be 1 for ivg=1. ivn,ivg=',2i5,/)
      END SUBROUTINE