LCOV - code coverage report
Current view: top level - xc-pot - excpw91.f90 (source / functions) Hit Total Coverage
Test: FLEUR test coverage Lines: 0 69 0.0 %
Date: 2024-04-19 04:21:58 Functions: 0 1 0.0 %

          Line data    Source code
       1             : MODULE m_excpw91
       2             : !.....-----------------------------------------------------------------
       3             : !..... pw91 exchange-correlation energy density in hartree.
       4             : !.....------------------------------------------------------------------
       5             : CONTAINS
       6           0 :    SUBROUTINE excpw91( &
       7           0 :       jspins,mirm,irmx,rh,agr,agru,agrd, &
       8           0 :       g2r,g2ru,g2rd,gggr,gggru,gggrd,gzgr, &
       9           0 :       exc, &
      10             :       idsprs,isprsv,sprsv)
      11             :       USE m_corl91
      12             :       USE m_corg91
      13             :       USE m_xch91
      14             :       USE m_constants
      15             : 
      16             :       IMPLICIT NONE
      17             : 
      18             : ! .. Arguments ..
      19             :       INTEGER, INTENT (IN) :: jspins,irmx,mirm,isprsv,idsprs
      20             :       REAL,    INTENT (IN) :: sprsv
      21             : 
      22             :       REAL,    INTENT (IN) :: rh(mirm,jspins)
      23             :       REAL,    INTENT (IN) :: agr(mirm),agru(mirm),agrd(mirm)
      24             :       REAL,    INTENT (IN) :: g2r(mirm),g2ru(mirm),g2rd(mirm)
      25             :       REAL,    INTENT (IN) :: gggr(mirm),gggru(mirm)
      26             :       REAL,    INTENT (IN) :: gggrd(mirm),gzgr(mirm)
      27             :       REAL,    INTENT (OUT) :: exc(mirm)
      28             : 
      29             : ! .. local variables
      30             :       REAL :: ro,zta,alf,alfc,c13,c23,c43,c53, &
      31             :               cedg,cedl,dbrod,dbrou,dsprs,ec,ecrs,eczta,fk,gz, &
      32             :               ro13,ro2,rod,rod3,rod43,rod53,rou,rou3,rou43,rou53, &
      33             :               rs,sd,sk,su,tc,td,tksg,tu,uc,ud,uu,vc, &
      34             :               vcgd,vcgu,vcld,vclu,vxgd,vxgu,vxld, &
      35             :               vxlu,wc,xced,xedg,xedgd,xedgu,xedl,xedld,xedlu
      36             : 
      37             :       INTEGER :: i
      38             :       REAL, PARAMETER :: sml = 1.e-14
      39             :       REAL, PARAMETER :: smlc = 2.01e-14
      40             : 
      41           0 :       DO i = 1,irmx
      42             : 
      43           0 :          IF (jspins == 1) THEN
      44           0 :             rou=rh(i,1)/2
      45           0 :             rou=max(rou,sml)
      46           0 :             rod=rou
      47             :          ELSE
      48           0 :             rou=rh(i,1)
      49           0 :             rod=rh(i,jspins)
      50           0 :             rou=max(rou,sml)
      51           0 :             rod=max(rod,sml)
      52             :          ENDIF
      53             : 
      54           0 :          ro=rou+rod
      55             : 
      56             :          !.....
      57             :          !       xedl,xedg: exchange energy density (local,grad.exp.) in ry.
      58             :          !       cedl,cedg: exchange energy density (local,grad.expnd.) in ry.
      59             :          !.....
      60           0 :          xedl = 0.0e0
      61           0 :          cedl = 0.0e0
      62           0 :          xedg = 0.0e0
      63           0 :          cedg = 0.0e0
      64             : 
      65           0 :          if(ro <= smlc) go to 200
      66             : 
      67           0 :          zta=(rou-rod)/ro
      68           0 :          if(zta > 1.e0-sml) zta = 1.e0 - sml
      69           0 :          if(zta < -1.e0-sml) zta = -1.e0 + sml
      70             : 
      71             :          !.....
      72           0 :          c13 = 1.e0/3.e0
      73           0 :          c23 = 2.e0/3.e0
      74           0 :          c43 = 4.e0/3.e0
      75           0 :          c53 = 5.e0/3.e0
      76             :          !.....  alf=-3*(3/4*pai)**(1/3).
      77           0 :          alf = -1.861051473e0
      78             :          !.....
      79           0 :          ro2 = ro*ro
      80           0 :          ro13 = ro**c13
      81             :          !.....
      82           0 :          rou3 = rou**3
      83           0 :          rou43 = rou**c43
      84             :          !.....
      85           0 :          rod3 = rod**3
      86           0 :          rod43 = rod**c43
      87             :          !.....
      88             :          !       gr2=drr*drr
      89             :          !       gr2u=drru**2
      90             :          !       drrd=drr-drru
      91             :          !       gr2d=drrd**2
      92             :          !       ddrrd=ddrr-ddrru
      93             :          !.....
      94             :          !.....  gz,gz2,gz3: for wang-perdew ssf.
      95           0 :          gz = ((1.e0+zta)**c23+ (1.e0-zta)**c23)/2.e0
      96             :          !.....
      97             :          !.....
      98           0 :          rs = 0.620350491e0/ro13
      99             :          !.....
     100             :          !.....  xedl: exchange-energy-density in ry.
     101           0 :          xedl = alf* (rou43+rod43)
     102             :          !.....
     103             :          !....  .gradient correction.
     104             :          !.....
     105             :          !         if(abs(agr(i)).lt.sml) go to 200
     106             :          !.....
     107             : 
     108             :          !.....
     109           0 :          dsprs = 1.e0
     110           0 :          if(idsprs == 1) dsprs = 1.e-19
     111           0 :          if(isprsv == 1) dsprs = dsprs*sprsv
     112             : 
     113             :          !.....
     114             :          !      agr,agru,agrd: abs(grad(rho)), for all, up, and down.
     115             :          !c     gr2,gr2u,gr2d: grad(rho_all)**2, grad(rho_up)**2, grad(rho_d)**2.
     116             :          !      g2r,g2ru,g2rd: laplacian rho_all, _up and _down.
     117             :          !      gggru,-d: grad(rho)*grad(abs(grad(rho))) for all,up and down.
     118             :          !      grgru,-d: grad(rho_all)*grad(rhor_up) and for down.
     119             : 
     120             :          !         g2r=ddrr+2*drr/rv
     121             :          !.....
     122             :          rou53 = rou**c53
     123             :          !.....
     124             :          !.....  edrru: d(abs(d(rou)/dr))/dr, edrrd for down.
     125             :          !         edrru=ddrru
     126             :          !         if(drru.lt.0.) edrru=-ddrru
     127             :          !.....
     128             :          !         agr,agbru,-d: abs(grad(rho)),for rou, rod.
     129             :          !         gggru,-d: grad(rho)*grad(abs(grad(rho))) for up and down.
     130             :          !.....  su:at ro=2*rou. 1/(2(3*pai**2)**(1/3))*|grad(rou)|/rou**(4/3).
     131           0 :          su = 0.128278244e0*agru(i)/rou43
     132             :          !         if(su.gt.huges) go to 200
     133             :          !         g2ru=ddrru+2*drru/rv
     134           0 :          tu = .016455307e0*g2ru(i)/rou53
     135           0 :          uu = 0.002110857e0*gggru(i)/rou3
     136             : 
     137           0 :          dbrou = rou*2
     138             : 
     139           0 :          call xch91(dbrou,su,uu,tu,xedlu,xedgu,vxlu,vxgu)
     140             : 
     141           0 :          xedl = xedlu/2
     142           0 :          xedgu = dsprs*xedgu
     143             : 
     144             :          !.....
     145             :          rod53 = rod**c53
     146             :          !         edrrd=ddrrd
     147             :          !         if(drrd.lt.0.) edrrd=-ddrrd
     148             : 
     149           0 :          sd = 0.128278244e0*agrd(i)/rod43
     150             :          !         if(sd.gt.huges) go to 200
     151             : 
     152             :          !         g2rd=ddrrd+2*drrd/rv
     153             : 
     154           0 :          td = .016455307e0*g2rd(i)/rod53
     155           0 :          ud = 0.002110857e0*gggrd(i)/rod3
     156             : 
     157           0 :          dbrod = rod*2
     158             : 
     159           0 :          call xch91(dbrod,sd,ud,td,xedld,xedgd,vxld,vxgd)
     160             : 
     161           0 :          xedl = xedl + xedld/2
     162           0 :          xedgd = dsprs*xedgd
     163             : 
     164           0 :          xedg = (xedgu+xedgd)/2
     165             : 
     166             :          !....   cro: c(n) of (6),phys.rev..b33,8822('86). in ry.
     167             :          !....   dcdr: d(cro)/d(ro).
     168             :          !.....  0.001625816=1.745*f(=0.11)*cro(rs=0).
     169             : 
     170           0 :          call corl91(rs,zta,ec,vclu,vcld,ecrs,eczta,alfc)
     171             : 
     172           0 :          cedl = ec*2.e0*ro
     173             : 
     174           0 :          fk = 1.91915829e0/rs
     175           0 :          sk = sqrt(4.e0*fk/pi_const)
     176           0 :          tksg = 2.e0*sk*gz
     177           0 :          tc = agr(i)/ (ro*tksg)
     178           0 :          uc = gggr(i)/ (ro2*tksg**3)
     179           0 :          vc = g2r(i)/ (ro*tksg**2)
     180           0 :          wc = gzgr(i)/ (ro*tksg**2)
     181             : 
     182             :          call corg91(fk,sk,gz,ec,ecrs,eczta,rs,zta,tc,uc,vc,wc,cedg, &
     183           0 :                      vcgu,vcgd)
     184             : 
     185           0 :          cedg = dsprs*cedg*ro*2.e0
     186             : 
     187             : 200      continue
     188             : 
     189           0 :          xced = (xedl+cedl+xedg+cedg)
     190           0 :          if(ro > smlc) xced = xced/ro
     191             : 
     192             :          !     in Ry.
     193             : 
     194           0 :          exc(i) = xced
     195             : 
     196             :       END DO
     197             : 
     198           0 :    END SUBROUTINE excpw91
     199             : END MODULE m_excpw91

Generated by: LCOV version 1.14