LCOV - code coverage report
Current view: top level - shared/common/src/33_xc_lowlevel - m_xchcth.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 44.8 % 567 254
Test Date: 2026-09-21 13:49:52 Functions: 100.0 % 1 1

            Line data    Source code
       1              : !!****m* ABINIT/m_xchcth
       2              : !! NAME
       3              : !!  m_xchcth
       4              : !!
       5              : !! FUNCTION
       6              : !! Treat XC GGA functional of HCTH type.
       7              : !! See Hamprecht, Cohen, Tozer and Handy, J. Chem. Phys. 109, 6264 (1998) [[cite:Hamprecht1998]] for HCTH-93
       8              : !!  Boese, Doltsinis, Handy and Sprik, J. Chem. Phys. 112, 1670 (2000) [[cite:Boese2000]] for HCTH-120 and HCTH-147.
       9              : !!  Boese and Handy , J. Chem. Phys. 114, 5497 (2001) [[cite:Boese2001]] for HCTH-407.
      10              : !!
      11              : !! COPYRIGHT
      12              : !!  Copyright (C) 2002-2026 ABINIT group (XG,LG)
      13              : !!  This file is distributed under the terms of the
      14              : !!  GNU General Public License, see ~abinit/COPYING
      15              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      16              : !!
      17              : !! SOURCE
      18              : 
      19              : #if defined HAVE_CONFIG_H
      20              : #include "config.h"
      21              : #endif
      22              : 
      23              : #include "abi_common.h"
      24              : 
      25              : module m_xchcth
      26              : 
      27              :  use defs_basis
      28              :  use m_errors
      29              :  use m_abicore
      30              : 
      31              :  use m_numeric_tools,      only : invcb
      32              : 
      33              :  implicit none
      34              : 
      35              :  private
      36              : !!***
      37              : 
      38              :  public :: xchcth
      39              : !!***
      40              : 
      41              : contains
      42              : !!***
      43              : 
      44              : !!****f* ABINIT/xchcth
      45              : !! NAME
      46              : !! xchcth
      47              : !!
      48              : !! FUNCTION
      49              : !! Treat XC GGA functional of HCTH type.
      50              : !! See Hamprecht, Cohen, Tozer and Handy, J. Chem. Phys. 109, 6264 (1998) [[cite:Hamprecht1998]] for HCTH-93.
      51              : !!  Boese, Doltsinis, Handy and Sprik, J. Chem. Phys. 112, 1670 (2000) [[cite:Boese2000]] for HCTH-120 and HCTH-147.
      52              : !!  Boese and Handy , J. Chem. Phys. 114, 5497 (2001) [[cite:Boese2001]] for HCTH-407.
      53              : !!
      54              : !! For a series of values of the density and the square of the
      55              : !! gradient of the density, return the associated Exc energy,
      56              : !! potential, and, in case of response-function, functions needed
      57              : !! to build the XC kernel.
      58              : !!
      59              : !! INPUTS
      60              : !!  ixc=number of the XC functional : 16 for HCTH-93, 17 for HCTH-120, 26 for HCTH-147 and 27 for HCTH-407.
      61              : !!  npts= number of points to be computed
      62              : !!  nspden=1 for unpolarized, 2 for spin-polarized
      63              : !!  grho2_updn(npts,2*nspden-1)=square of the gradient of the spin-up,
      64              : !!     and, if nspden==2, spin-down, and total density (Hartree/Bohr**2)
      65              : !!  order=maximal derivative of Exc to be computed
      66              : !!   (1 => energy and potential, or 2 => also XC kernel )
      67              : !!   Warning : order=2 not yet available
      68              : !!  rho_updn(npts,nspden)=spin-up and spin-down density (Hartree/bohr**3)
      69              : !!
      70              : !! OUTPUT
      71              : !!
      72              : !!  dvxcdgr(npts,3)=partial derivative of the exchange-correlation
      73              : !!    energy (exci*$\rho$) with respect to the spin-up (dvxcdgr(:,1)),
      74              : !!    spin-down (dvxcdgr(:,2)) square of gradients of the density
      75              : !!
      76              : !!  exci(npts)=exchange-correlation energy density (hartree)
      77              : !!  vxci(npts,nspden)=partial derivative of the exchange-correlation energy (exci*$\rho$)
      78              : !!    with respect to the spin-down (vxci(:,1)) and spin-up (vxci(:,2) densities
      79              : !! Normalization: Exc=$\int (exc(r)*\rho (r) d^3 r)$ for $\rho$(r)=electron density.
      80              : !!
      81              : !! TODO
      82              : !! Response function not coded yet, but part of it are already present
      83              : !!
      84              : !! SOURCE
      85              : 
      86         1265 : subroutine xchcth(dvxcdgr,exci,grho2_updn,ixc,npts,nspden,order,rho_updn,vxci)
      87              : 
      88              : !Arguments ------------------------------------
      89              : !scalars
      90              :  integer,intent(in) :: ixc,npts,nspden,order
      91              : !arrays
      92              :  real(dp),intent(in) :: grho2_updn(npts,2*nspden-1),rho_updn(npts,nspden)
      93              :  real(dp),intent(out) :: dvxcdgr(npts,2),exci(npts),vxci(npts,nspden)
      94              : 
      95              : !Local variables-------------------------------
      96              : !scalars
      97              :  integer,save :: initialized=0
      98              :  integer :: ipts,ispden
      99              :  real(dp),parameter :: alpha_zeta2=one-1e-6_dp,alpha_zeta=one-1e-6_dp
     100              :  real(dp),parameter :: fsec_inv=one/1.709921_dp,gammacab=0.006_dp
     101              :  real(dp),parameter :: gammacsig=0.2_dp,gammax=0.004_dp
     102              :  real(dp),parameter :: rsfac=0.6203504908994000_dp
     103              :  real(dp),save :: factf_zeta,factfp_zeta,sixpi2_1_3,sixpi2m1_3,sq_rsfac
     104              :  real(dp),save :: sq_rsfac_inv,threefourth_divpi,twom1_3
     105              :  real(dp) :: ccab0,ccab1,ccab2,ccab3,ccab4,ccsig0,ccsig1,ccsig2,ccsig3,ccsig4
     106              :  real(dp) :: coeffss,cxsig0,cxsig1,cxsig2,cxsig3,cxsig4,d2ecrs0_drs2
     107              :  real(dp) :: d2ecrs1_drs2,d2ecrs_drs2,d2ecrs_drsdzeta,d2ecrs_dzeta2
     108              :  real(dp) :: d2fzeta4_dzeta2,d2gcrs_drs2,d2macrs_drs2,decrs0_drs,decrs1_drho
     109              :  real(dp) :: decrs1_drs,decrs_drs,decrs_dzeta,dfzeta4_dzeta,dgcabdss
     110              :  real(dp) :: dgcrs_drs,dgcsigdss,dgxsigdss,divcab,divcsig,divx,dmacrs_drs
     111              :  real(dp) :: drhoecab_drhodn,drhoecab_drhoup,drhoecrs1_drhodn,drhoecrs1_drhoup
     112              :  real(dp) :: drsdrho,dssdg,dssdndg,dssdndrho,dssdrho,dssupdg,dssupdrho,ducabdss
     113              :  real(dp) :: ducsigdss,duxsigdss,ec0_a1,ec0_aa,ec0_b1,ec0_b2,ec0_b3,ec0_b4
     114              :  real(dp) :: ec0_den,ec0_log,ec0_q0,ec0_q1,ec0_q1p,ec0_q1pp,ec1_a1,ec1_aa
     115              :  real(dp) :: ec1_b1,ec1_b2,ec1_b3,ec1_b4,ec1_den,ec1_log,ec1_q0,ec1_q1,ec1_q1p
     116              :  real(dp) :: ec1_q1pp,ecrs,ecrs0,ecrs1,ex_lsd,exc,f_zeta,factfpp_zeta
     117              :  real(dp) :: fp_zeta,fpp_zeta,gcab,gcrs,gcsig,gxsig,mac_a1,mac_aa,mac_b1
     118              :  real(dp) :: mac_b2,mac_b3,mac_b4,mac_den,mac_log,mac_q0,mac_q1,mac_q1p
     119              :  real(dp) :: mac_q1pp,macrs,rho,rho_inv
     120              :  real(dp) :: rhoecab,rhoecrs1_dn,rhoecrs1_up,rhomo6,rhomot,rhoo6
     121              :  real(dp) :: rhotmo6,rhotmot,rhoto6,rhotot,rhotot_inv,rs,rsm1_2,sqr_rs,ss,ss_dn
     122              :  real(dp) :: ss_up,ssavg,ucab,ucsig,uxsig,vxcadd,zeta,zeta4,zetm_1_3
     123              :  real(dp) :: zetp_1_3
     124              :  character(len=500) :: message
     125              : !arrays
     126         1265 :  real(dp),allocatable :: rho_updnm1_3(:,:),rhoarr(:),rhom1_3(:),zetm(:)
     127         1265 :  real(dp),allocatable :: zetmm1_3(:),zetp(:),zetpm1_3(:)
     128              : !no_abirules
     129              : !real(dp) :: delta,factor,grr,rho_dn,rho_dnm,rho_dnp,rho_up,rho_upm,rho_upp,zeta_mean
     130              : 
     131              : ! *************************************************************************
     132              : 
     133              : !DEBUG
     134              : !write(std_out,*)' xchcth : enter'
     135              : !write(std_out,*)' nspden=',nspden
     136              : !ENDDEBUG
     137              : 
     138         1265 :  if (order/=1) then
     139            0 :    write(message, '(a,i0)' )' Order must be 1 ; argument was ',order
     140            0 :    ABI_BUG(message)
     141              :  end if
     142              : 
     143         1265 :  if(initialized==0)then
     144            4 :    twom1_3=two**(-third)
     145            4 :    sixpi2_1_3=(six*pi**2)**third
     146            4 :    sixpi2m1_3=one/sixpi2_1_3
     147            4 :    threefourth_divpi=three_quarters*piinv
     148            4 :    factf_zeta= one / ( two**(four/three)-two )
     149            4 :    factfp_zeta= four_thirds * factf_zeta * alpha_zeta2
     150            4 :    sq_rsfac=sqrt(rsfac)
     151            4 :    sq_rsfac_inv=one/sq_rsfac
     152            4 :    initialized=1
     153              :  end if
     154              : 
     155         1265 :  if(ixc==16)then
     156              : !  HCTH-93 parameters from table II of JCP 109, 6264 (1998). Note that there is
     157              : !  an error in tables III of JCP 112, 1670 (2000) and JCP 114, 5497 (2001) for the coefficient ccab1
     158              :    cxsig0=1.09320_dp ; cxsig1=-0.744056_dp ; cxsig2=5.59920_dp   ; cxsig3=-6.78549_dp ; cxsig4=4.49357_dp
     159              :    ccsig0=0.222601_dp; ccsig1=-0.0338622_dp; ccsig2=-0.0125170_dp; ccsig3=-0.802496_dp; ccsig4=1.55396_dp
     160              :    ccab0=0.729974_dp ; ccab1=3.35287_dp   ; ccab2=-11.543_dp    ; ccab3=8.08564_dp   ; ccab4=-4.47857_dp
     161              :  else if(ixc==17)then
     162              : !  HCTH-120 parameters from table III of JCP 112, 1670 (2000)
     163              : !  Note the correction of the sign of cxsig1 and ccsig1, as there is a misprint in the HCTH paper !
     164              : !  see the exchange of mail with MMarques 23 Dec 2008, and 6 Jan 2009.
     165              : !  Now, the functional agrees with the libXC results
     166              :    cxsig0=1.09163_dp; cxsig1=-0.7472_dp; cxsig2=5.0783_dp; cxsig3=-4.1075_dp; cxsig4=1.1717_dp
     167              :    ccsig0=0.48951_dp; ccsig1=-0.2607_dp; ccsig2=0.4329_dp; ccsig3=-1.9925_dp; ccsig4=2.4853_dp
     168              :    ccab0=0.51473_dp ; ccab1=6.9298_dp  ; ccab2=-24.707_dp; ccab3=23.110_dp  ; ccab4=-11.323_dp
     169              : !  Exactly same values than in lib_xc
     170              :    cxsig0=1.09163_dp; cxsig1=-0.747215_dp; cxsig2=5.07833_dp; cxsig3=-4.10746_dp; cxsig4=1.17173_dp
     171              :    ccsig0=0.489508_dp; ccsig1=-0.260699_dp; ccsig2=0.432917_dp; ccsig3=-1.99247_dp; ccsig4=2.48531_dp
     172              :    ccab0=0.51473_dp ; ccab1=6.92982_dp  ; ccab2=-24.7073_dp; ccab3=23.1098_dp  ; ccab4=-11.3234_dp
     173              :  else if(ixc==26)then
     174              : !  HCTH-147 parameters from table III of JCP 112, 1670 (2000)
     175              :    cxsig0=1.09025_dp; cxsig1=-0.7992_dp; cxsig2=5.5721_dp ; cxsig3=-5.8676_dp; cxsig4=3.0454_dp
     176              :    ccsig0=0.56258_dp; ccsig1=-0.0171_dp; ccsig2=-1.3064_dp; ccsig3= 1.0575_dp; ccsig4=0.8854_dp
     177              :    ccab0=0.54235_dp ; ccab1=7.0146_dp  ; ccab2=-28.382_dp ; ccab3=35.033_dp  ; ccab4=-20.428_dp
     178              : !  Exactly same values than in lib_xc
     179              :    cxsig0=1.09025_dp; cxsig1=-0.799194_dp; cxsig2=5.57212_dp ; cxsig3=-5.86760_dp; cxsig4=3.04544_dp
     180              :    ccsig0=0.562576_dp; ccsig1= 0.0171436_dp; ccsig2=-1.30636_dp; ccsig3= 1.05747_dp; ccsig4=0.885429_dp
     181              :    ccab0=0.542352_dp ; ccab1=7.01464_dp  ; ccab2=-28.3822_dp ; ccab3=35.0329_dp  ; ccab4=-20.4284_dp
     182              :  else if(ixc==27)then
     183              : !  HCTH-407 parameters from table IV of JCP 114, 5497 (2001)
     184              :    cxsig0=1.08184_dp; cxsig1=-0.5183_dp; cxsig2=3.4256_dp; cxsig3=-2.6290_dp; cxsig4=2.2886_dp
     185              :    ccsig0=1.18777_dp; ccsig1=-2.4029_dp; ccsig2=5.6174_dp; ccsig3=-9.1792_dp; ccsig4=6.2480_dp
     186              :    ccab0=0.58908_dp ; ccab1=4.4237_dp  ; ccab2=-19.222_dp; ccab3=42.572_dp  ; ccab4=-42.005_dp
     187              : !  Exactly same values than in lib_xc
     188              :    cxsig0=1.08184_dp; cxsig1=-0.518339_dp; cxsig2=3.42562_dp; cxsig3=-2.62901_dp; cxsig4=2.28855_dp
     189              :    ccsig0=1.18777_dp; ccsig1=-2.40292_dp; ccsig2=5.61741_dp; ccsig3=-9.17923_dp; ccsig4=6.24798_dp
     190              :    ccab0=0.589076_dp ; ccab1=4.42374_dp  ; ccab2=-19.2218_dp; ccab3=42.5721_dp  ; ccab4=-42.0052_dp
     191              :  else
     192            0 :    write(message, '(a,i0)' )' xchcth : ixc must be 16, 17, 26, or 27 ; argument was ',ixc
     193            0 :    ABI_BUG(message)
     194              :  end if
     195              : 
     196              : !Parameters for the Perdew-Wang 92 LSD as well as LSD-RPA,
     197              : !see Table I of Phys.Rev.B 45,13244 (1992) [[cite:Perdew1992a]]
     198         1265 :  ec0_aa=0.031091_dp ; ec1_aa=0.015545_dp ; mac_aa=0.016887_dp
     199         1265 :  ec0_a1=0.21370_dp  ; ec1_a1=0.20548_dp  ; mac_a1=0.11125_dp
     200         1265 :  ec0_b1=7.5957_dp   ; ec1_b1=14.1189_dp  ; mac_b1=10.357_dp
     201         1265 :  ec0_b2=3.5876_dp   ; ec1_b2=6.1977_dp   ; mac_b2=3.6231_dp
     202         1265 :  ec0_b3=1.6382_dp   ; ec1_b3=3.3662_dp   ; mac_b3=0.88026_dp
     203         1265 :  ec0_b4=0.49294_dp  ; ec1_b4=0.62517_dp  ; mac_b4=0.49671_dp
     204              : 
     205              : !DEBUG
     206              : !Finite-difference debugging, do not take away
     207              : !Note : here work with collinear gradients. Might be generalized ...
     208              : !debug=2  ! Choose 1 (rho grads) or 2 (grho grads)
     209              : !factor=one
     210              : !zeta_mean=0.98_dp
     211              : !zeta_mean=zero
     212              : !delta=0.000025*factor
     213              : !delta=0.0000125*factor
     214              : !if(debug/=0)then
     215              : !do ipts=1,npts,5
     216              : !rho=ipts*0.zero*factor
     217              : !rho_up=rho*(one+zeta_mean)*half
     218              : !rho_dn=rho*(one-zeta_mean)*half
     219              : !rho_upp=rho_up+delta
     220              : !rho_upm=rho_up-delta
     221              : !rho_dnp=rho_dn+delta
     222              : !rho_dnm=rho_dn-delta
     223              : !! Here, vary rho
     224              : !if(debug==1)then
     225              : !rho_updn(ipts  ,1)=rho_up ; rho_updn(ipts  ,2)=rho_dn
     226              : !rho_updn(ipts+1,1)=rho_upp; rho_updn(ipts+1,2)=rho_dn
     227              : !rho_updn(ipts+2,1)=rho_upm; rho_updn(ipts+2,2)=rho_dn
     228              : !rho_updn(ipts+3,1)=rho_up ; rho_updn(ipts+3,2)=rho_dnp
     229              : !rho_updn(ipts+4,1)=rho_up ; rho_updn(ipts+4,2)=rho_dnm
     230              : !grho2_updn(ipts:ipts+4,1)=(0.2_dp*factor)**2     ! grad2 of spin up density
     231              : !grho2_updn(ipts:ipts+4,2)=(0.2_dp*factor)**2     ! grad2 of spin down density
     232              : !grho2_updn(ipts:ipts+4,3)=(0.3_dp*factor)**2     ! grad2 of total density
     233              : !else
     234              : !!  Here, vary grho (interchange rho and grho)
     235              : !grho2_updn(ipts  ,1)=rho_up**2 ; grho2_updn(ipts  ,2)=rho_dn**2
     236              : !grho2_updn(ipts+1,1)=rho_upp**2; grho2_updn(ipts+1,2)=rho_dn**2
     237              : !grho2_updn(ipts+2,1)=rho_upm**2; grho2_updn(ipts+2,2)=rho_dn**2
     238              : !grho2_updn(ipts+3,1)=rho_up**2 ; grho2_updn(ipts+3,2)=rho_dnp**2
     239              : !grho2_updn(ipts+4,1)=rho_up**2 ; grho2_updn(ipts+4,2)=rho_dnm**2
     240              : !grho2_updn(ipts  ,3)=(ipts*0.zero*factor)**2
     241              : !grho2_updn(ipts+1,3)=(ipts*0.zero*factor+delta)**2
     242              : !grho2_updn(ipts+2,3)=(ipts*0.zero*factor-delta)**2
     243              : !grho2_updn(ipts+3,3)=(ipts*0.zero*factor+delta)**2   ! identical to ipts+1
     244              : !grho2_updn(ipts+4,3)=(ipts*0.zero*factor-delta)**2   ! identical to ipts+2
     245              : !rho_updn(ipts:ipts+4,1)=0.2_dp*factor*(one+zeta_mean)*half    ! spin up density
     246              : !rho_updn(ipts:ipts+4,2)=0.2_dp*factor*(one-zeta_mean)*half    ! spin down density
     247              : !end if
     248              : !end do
     249              : !end if
     250              : !Usual option :
     251              : !nspden=2 ; order=2
     252              : !GGA
     253              : !nspden=2 ; order=1
     254              : !Might take also, although finite difference later is meaningless
     255              : !nspden=1 ; order=-2
     256              : !ENDDEBUG
     257              : 
     258         1265 :  if(order**2 >1)then
     259         1265 :    factfpp_zeta= third * factfp_zeta * alpha_zeta2
     260              :  end if
     261              : 
     262         3795 :  ABI_MALLOC(rhoarr,(npts))
     263         2530 :  ABI_MALLOC(rhom1_3,(npts))
     264         3795 :  ABI_MALLOC(rho_updnm1_3,(npts,2))
     265         2808 :  do ispden=1,nspden
     266         2808 :    call invcb(rho_updn(:,ispden),rho_updnm1_3(:,ispden),npts)
     267              :  end do
     268         1265 :  if(nspden==1)then
     269      3770715 :    rhoarr(:)=two*rho_updn(:,1)
     270      3770715 :    rhom1_3(:)=twom1_3*rho_updnm1_3(:,1)
     271      3770715 :    rho_updnm1_3(:,2)=rho_updnm1_3(:,1)
     272              :  else
     273      1032470 :    rhoarr(:)=rho_updn(:,1)+rho_updn(:,2)
     274          278 :    call invcb(rhoarr,rhom1_3,npts)
     275          556 :    ABI_MALLOC(zetm,(npts))
     276          556 :    ABI_MALLOC(zetmm1_3,(npts))
     277          556 :    ABI_MALLOC(zetp,(npts))
     278          556 :    ABI_MALLOC(zetpm1_3,(npts))
     279      1032470 :    do ipts=1,npts
     280      1032192 :      rhotmot=rhom1_3(ipts)
     281      1032192 :      rhotot_inv=rhotmot*rhotmot*rhotmot
     282      1032192 :      zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
     283      1032192 :      zetp(ipts)=one+zeta*alpha_zeta
     284      1032470 :      zetm(ipts)=one-zeta*alpha_zeta
     285              :    end do
     286          278 :    call invcb(zetp,zetpm1_3,npts)
     287          278 :    call invcb(zetm,zetmm1_3,npts)
     288              :  end if
     289              : 
     290         1265 :  if (nspden==1) then
     291              : 
     292          987 :    if(order==-2) then
     293              : 
     294            0 :      do ipts=1,npts
     295              : 
     296              : !      -----------------------------------------------------------------------
     297              : !      First take care of the spin-split part of the functional
     298            0 :        exc=zero
     299            0 :        ispden=1
     300            0 :        rho   =rho_updn(ipts,ispden)
     301            0 :        rhomot=rho_updnm1_3(ipts,ispden)
     302            0 :        rho_inv=rhomot*rhomot*rhomot
     303              : 
     304              : !      Exchange part
     305            0 :        ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     306              : !      Note that this definition differs from the PBE one
     307            0 :        coeffss=rho_inv*rho_inv*rhomot*rhomot
     308            0 :        ss=grho2_updn(ipts,ispden)*coeffss
     309            0 :        dssdrho=-eight*third*ss*rho_inv
     310            0 :        dssdg=two*coeffss
     311              : 
     312            0 :        divx=one/(one+gammax*ss)
     313            0 :        uxsig=gammax*ss*divx
     314            0 :        duxsigdss=gammax*divx*(one-ss*gammax*divx)
     315              : 
     316            0 :        gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
     317              :        dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
     318            0 : &       *duxsigdss
     319              : 
     320            0 :        exc=exc+ex_lsd*rho*gxsig
     321            0 :        vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
     322            0 :        dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
     323              : 
     324              : !      Spin parallel correlation part
     325              : !      Note that this definition is for fully spin-polarized quantities
     326            0 :        rs=rsfac*rhomot
     327            0 :        rhomo6=sqrt(rhomot)
     328            0 :        sqr_rs=sq_rsfac*rhomo6
     329            0 :        rhoo6=rho*rhomot*rhomot*rhomo6
     330            0 :        rsm1_2=sq_rsfac_inv*rhoo6
     331            0 :        drsdrho=-third*rs*rho_inv
     332              : 
     333            0 :        ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
     334            0 :        ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
     335            0 :        ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
     336            0 :        ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
     337              : !      ec1_log=log( one + one / ec1_q1 )
     338            0 :        ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
     339            0 :        ecrs1=ec1_q0*ec1_log
     340            0 :        decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
     341            0 :        decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
     342              : 
     343              : !      Store the LSDA corr energy and density derivative
     344            0 :        rhoecrs1_up=rho*ecrs1
     345            0 :        drhoecrs1_drhoup=decrs1_drho
     346            0 :        ss_up=ss
     347            0 :        dssupdrho=dssdrho
     348            0 :        dssupdg=dssdg
     349              : 
     350            0 :        divcsig=one/(one+gammacsig*ss)
     351            0 :        ucsig=gammacsig*ss*divcsig
     352            0 :        ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
     353              : 
     354            0 :        gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
     355              :        dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
     356            0 : &       *ducsigdss
     357              : 
     358              : !      DEBUG
     359              : !      gcsig=zero
     360              : !      dgcsigdss=zero
     361              : !      ENDDEBUG
     362            0 :        exc=exc+ecrs1*rho*gcsig
     363              :        vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
     364            0 : &       ecrs1*rho*dgcsigdss*dssdrho
     365            0 :        dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
     366              : 
     367            0 :        rhoecrs1_dn=rhoecrs1_up
     368            0 :        drhoecrs1_drhodn=drhoecrs1_drhoup
     369            0 :        ss_dn=ss_up
     370            0 :        dssdndrho=dssupdrho
     371            0 :        dssdndg=dssupdg
     372            0 :        exc=exc*2
     373              : 
     374              : !      -----------------------------------------------------------------------------
     375              : !      Then takes care of the LSD correlation part of the functional
     376              : 
     377            0 :        rhotot=rhoarr(ipts)
     378            0 :        rhotmot=rhom1_3(ipts)
     379            0 :        rhotot_inv=rhotmot*rhotmot*rhotmot
     380            0 :        rhotmo6=sqrt(rhotmot)
     381            0 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     382              : 
     383              : !      From now, the coding of the PW92 functional start. It is identical in xcpbe.f
     384            0 :        rs=rsfac*rhotmot
     385            0 :        sqr_rs=sq_rsfac*rhotmo6
     386            0 :        rsm1_2=sq_rsfac_inv*rhoto6
     387              : 
     388              : !      Formulas A6-A8 of PW92LSD
     389            0 :        ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
     390            0 :        ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
     391            0 :        ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
     392            0 :        ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
     393              : !      ec0_log=log( one + one / ec0_q1 )
     394            0 :        ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
     395            0 :        ecrs0=ec0_q0*ec0_log
     396            0 :        decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
     397              : 
     398            0 :        ec0_q1pp=half*ec0_aa*(-ec0_b1*rsm1_2**3+3.d0*ec0_b3*rsm1_2+8.d0*ec0_b4)
     399              :        d2ecrs0_drs2= 4.0d0*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
     400              : &       -ec0_q0*ec0_q1pp*ec0_den                        &
     401            0 : &       +ec0_q0*ec0_q1p**2*ec0_den**2*(2.d0*ec0_q1+one)
     402              : 
     403              : 
     404              : 
     405            0 :        mac_q0=-2.0d0*mac_aa*(one+mac_a1*rs)
     406            0 :        mac_q1=2.0d0*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
     407            0 :        mac_q1p=mac_aa*(mac_b1*rsm1_2+2.d0*mac_b2+3.d0*mac_b3*sqr_rs+4.d0*mac_b4*rs)
     408            0 :        mac_den=one/(mac_q1*mac_q1+mac_q1)
     409            0 :        mac_log=-log( mac_q1*mac_q1*mac_den )
     410            0 :        macrs=mac_q0*mac_log
     411            0 :        dmacrs_drs= -2.0d0*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
     412              : 
     413              : 
     414            0 :        ecrs=ecrs0
     415            0 :        decrs_drs=decrs0_drs
     416            0 :        decrs_dzeta=zero
     417              : 
     418            0 :        d2ecrs_drs2=d2ecrs0_drs2
     419              : 
     420            0 :        d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
     421              : 
     422            0 :        zeta=zero
     423              : 
     424              : !      At this point, the coding of the PW92 functional finishes.
     425              : 
     426              : !      The correlation between different spin from HCTH is now computed
     427              : !      First, the part without gradient correction factor
     428            0 :        rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
     429            0 :        vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
     430            0 :        drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
     431            0 :        drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
     432              : 
     433              : !      Now, the gradient correction factor
     434            0 :        ssavg=half*(ss_up+ss_dn)
     435            0 :        divcab=one/(one+gammacab*ssavg)
     436            0 :        ucab=gammacab*ssavg*divcab
     437            0 :        ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
     438              : 
     439            0 :        gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
     440              :        dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
     441            0 : &       *ducabdss
     442              : 
     443            0 :        exc=exc+rhoecab*gcab
     444              : 
     445            0 :        vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
     446            0 :        dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
     447              : !      If non spin-polarized, treat spin down contribution now, similar to spin up
     448              : !      vxci(ipts,2)=vxci(ipts,1)
     449            0 :        dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     450              : 
     451              : !      Final division by the total density, to give the energy density
     452            0 :        exci(ipts)=exc*rhotot_inv
     453              : 
     454              :      end do ! ipts=1,npts
     455              : 
     456          987 :    else if(order**2>1) then
     457              : 
     458            0 :      do ipts=1,npts
     459              : 
     460              : !      -----------------------------------------------------------------------
     461              : !      First take care of the spin-split part of the functional
     462            0 :        exc=zero
     463            0 :        ispden=1
     464            0 :        rho   =rho_updn(ipts,ispden)
     465            0 :        rhomot=rho_updnm1_3(ipts,ispden)
     466            0 :        rho_inv=rhomot*rhomot*rhomot
     467              : 
     468              : !      Exchange part
     469            0 :        ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     470              : !      Note that this definition differs from the PBE one
     471            0 :        coeffss=rho_inv*rho_inv*rhomot*rhomot
     472            0 :        ss=grho2_updn(ipts,ispden)*coeffss
     473            0 :        dssdrho=-eight*third*ss*rho_inv
     474            0 :        dssdg=two*coeffss
     475              : 
     476            0 :        divx=one/(one+gammax*ss)
     477            0 :        uxsig=gammax*ss*divx
     478            0 :        duxsigdss=gammax*divx*(one-ss*gammax*divx)
     479              : 
     480            0 :        gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
     481              :        dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
     482            0 : &       *duxsigdss
     483              : 
     484            0 :        exc=exc+ex_lsd*rho*gxsig
     485            0 :        vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
     486            0 :        dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
     487              : 
     488              : !      Spin parallel correlation part
     489              : !      Note that this definition is for fully spin-polarized quantities
     490            0 :        rs=rsfac*rhomot
     491            0 :        rhomo6=sqrt(rhomot)
     492            0 :        sqr_rs=sq_rsfac*rhomo6
     493            0 :        rhoo6=rho*rhomot*rhomot*rhomo6
     494            0 :        rsm1_2=sq_rsfac_inv*rhoo6
     495            0 :        drsdrho=-third*rs*rho_inv
     496              : 
     497            0 :        ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
     498            0 :        ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
     499            0 :        ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
     500            0 :        ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
     501              : !      ec1_log=log( one + one / ec1_q1 )
     502            0 :        ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
     503            0 :        ecrs1=ec1_q0*ec1_log
     504            0 :        decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
     505            0 :        decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
     506              : 
     507              : !      Store the LSDA corr energy and density derivative
     508            0 :        rhoecrs1_up=rho*ecrs1
     509            0 :        drhoecrs1_drhoup=decrs1_drho
     510            0 :        ss_up=ss
     511            0 :        dssupdrho=dssdrho
     512            0 :        dssupdg=dssdg
     513              : 
     514            0 :        divcsig=one/(one+gammacsig*ss)
     515            0 :        ucsig=gammacsig*ss*divcsig
     516            0 :        ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
     517              : 
     518            0 :        gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
     519              :        dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
     520            0 : &       *ducsigdss
     521              : 
     522              : !      DEBUG
     523              : !      gcsig=zero
     524              : !      dgcsigdss=zero
     525              : !      ENDDEBUG
     526            0 :        exc=exc+ecrs1*rho*gcsig
     527              :        vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
     528            0 : &       ecrs1*rho*dgcsigdss*dssdrho
     529            0 :        dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
     530              : 
     531            0 :        rhoecrs1_dn=rhoecrs1_up
     532            0 :        drhoecrs1_drhodn=drhoecrs1_drhoup
     533            0 :        ss_dn=ss_up
     534            0 :        dssdndrho=dssupdrho
     535            0 :        dssdndg=dssupdg
     536            0 :        exc=exc*2
     537              : 
     538              : !      -----------------------------------------------------------------------------
     539              : !      Then takes care of the LSD correlation part of the functional
     540              : 
     541            0 :        rhotot=rhoarr(ipts)
     542            0 :        rhotmot=rhom1_3(ipts)
     543            0 :        rhotot_inv=rhotmot*rhotmot*rhotmot
     544            0 :        rhotmo6=sqrt(rhotmot)
     545            0 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     546              : 
     547              : !      From now, the coding of the PW92 functional start. It is identical in xcpbe.f
     548            0 :        rs=rsfac*rhotmot
     549            0 :        sqr_rs=sq_rsfac*rhotmo6
     550            0 :        rsm1_2=sq_rsfac_inv*rhoto6
     551              : 
     552              : !      Formulas A6-A8 of PW92LSD
     553            0 :        ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
     554            0 :        ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
     555            0 :        ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
     556            0 :        ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
     557              : !      ec0_log=log( one + one / ec0_q1 )
     558            0 :        ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
     559            0 :        ecrs0=ec0_q0*ec0_log
     560            0 :        decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
     561            0 :        ec0_q1pp=half*ec0_aa*(-ec0_b1*rsm1_2**3+3.d0*ec0_b3*rsm1_2+8.d0*ec0_b4)
     562              :        d2ecrs0_drs2= 4.0d0*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
     563              : &       -ec0_q0*ec0_q1pp*ec0_den                        &
     564            0 : &       +ec0_q0*ec0_q1p**2*ec0_den**2*(2.d0*ec0_q1+one)
     565              : 
     566              : 
     567            0 :        ecrs=ecrs0
     568            0 :        decrs_drs=decrs0_drs
     569            0 :        decrs_dzeta=zero
     570            0 :        d2ecrs_drs2=d2ecrs0_drs2
     571            0 :        zeta=zero
     572              : 
     573              : !      At this point, the coding of the PW92 functional finishes.
     574              : 
     575              : !      The correlation between different spin from HCTH is now computed
     576              : !      First, the part without gradient correction factor
     577            0 :        rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
     578            0 :        vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
     579            0 :        drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
     580            0 :        drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
     581              : 
     582              : !      Now, the gradient correction factor
     583            0 :        ssavg=half*(ss_up+ss_dn)
     584            0 :        divcab=one/(one+gammacab*ssavg)
     585            0 :        ucab=gammacab*ssavg*divcab
     586            0 :        ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
     587              : 
     588            0 :        gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
     589              :        dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
     590            0 : &       *ducabdss
     591              : 
     592            0 :        exc=exc+rhoecab*gcab
     593              : 
     594            0 :        vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
     595            0 :        dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
     596              : !      If non spin-polarized, treat spin down contribution now, similar to spin up
     597              : !      vxci(ipts,2)=vxci(ipts,1)
     598            0 :        dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     599              : 
     600              : !      Final division by the total density, to give the energy density
     601            0 :        exci(ipts)=exc*rhotot_inv
     602              : 
     603              :      end do ! ipts=1,npts
     604              :    else
     605              : 
     606      3770715 :      do ipts=1,npts
     607              : 
     608              : !      -----------------------------------------------------------------------
     609              : !      First take care of the spin-split part of the functional
     610      3769728 :        exc=zero
     611      3769728 :        ispden=1
     612      3769728 :        rho   =rho_updn(ipts,ispden)
     613      3769728 :        rhomot=rho_updnm1_3(ipts,ispden)
     614      3769728 :        rho_inv=rhomot*rhomot*rhomot
     615              : 
     616              : !      Exchange part
     617      3769728 :        ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     618              : !      Note that this definition differs from the PBE one
     619      3769728 :        coeffss=rho_inv*rho_inv*rhomot*rhomot
     620      3769728 :        ss=grho2_updn(ipts,ispden)*coeffss
     621      3769728 :        dssdrho=-eight*third*ss*rho_inv
     622      3769728 :        dssdg=two*coeffss
     623              : 
     624      3769728 :        divx=one/(one+gammax*ss)
     625      3769728 :        uxsig=gammax*ss*divx
     626      3769728 :        duxsigdss=gammax*divx*(one-ss*gammax*divx)
     627              : 
     628      3769728 :        gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
     629              :        dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
     630      3769728 : &       *duxsigdss
     631              : 
     632      3769728 :        exc=exc+ex_lsd*rho*gxsig
     633      3769728 :        vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
     634      3769728 :        dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
     635              : 
     636              : !      Spin parallel correlation part
     637              : !      Note that this definition is for fully spin-polarized quantities
     638      3769728 :        rs=rsfac*rhomot
     639      3769728 :        rhomo6=sqrt(rhomot)
     640      3769728 :        sqr_rs=sq_rsfac*rhomo6
     641      3769728 :        rhoo6=rho*rhomot*rhomot*rhomo6
     642      3769728 :        rsm1_2=sq_rsfac_inv*rhoo6
     643      3769728 :        drsdrho=-third*rs*rho_inv
     644              : 
     645      3769728 :        ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
     646      3769728 :        ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
     647      3769728 :        ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
     648      3769728 :        ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
     649              : !      ec1_log=log( one + one / ec1_q1 )
     650      3769728 :        ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
     651      3769728 :        ecrs1=ec1_q0*ec1_log
     652      3769728 :        decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
     653      3769728 :        decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
     654              : 
     655              : !      Store the LSDA corr energy and density derivative
     656      3769728 :        rhoecrs1_up=rho*ecrs1
     657      3769728 :        drhoecrs1_drhoup=decrs1_drho
     658      3769728 :        ss_up=ss
     659      3769728 :        dssupdrho=dssdrho
     660      3769728 :        dssupdg=dssdg
     661              : 
     662      3769728 :        divcsig=one/(one+gammacsig*ss)
     663      3769728 :        ucsig=gammacsig*ss*divcsig
     664      3769728 :        ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
     665              : 
     666      3769728 :        gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
     667              :        dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
     668      3769728 : &       *ducsigdss
     669              : 
     670              : !      DEBUG
     671              : !      gcsig=zero
     672              : !      dgcsigdss=zero
     673              : !      ENDDEBUG
     674      3769728 :        exc=exc+ecrs1*rho*gcsig
     675              :        vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
     676      3769728 : &       ecrs1*rho*dgcsigdss*dssdrho
     677      3769728 :        dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
     678              : 
     679      3769728 :        rhoecrs1_dn=rhoecrs1_up
     680      3769728 :        drhoecrs1_drhodn=drhoecrs1_drhoup
     681      3769728 :        ss_dn=ss_up
     682      3769728 :        dssdndrho=dssupdrho
     683      3769728 :        dssdndg=dssupdg
     684      3769728 :        exc=exc*2
     685              : 
     686              : !      -----------------------------------------------------------------------------
     687              : !      Then takes care of the LSD correlation part of the functional
     688              : 
     689      3769728 :        rhotot=rhoarr(ipts)
     690      3769728 :        rhotmot=rhom1_3(ipts)
     691      3769728 :        rhotot_inv=rhotmot*rhotmot*rhotmot
     692      3769728 :        rhotmo6=sqrt(rhotmot)
     693      3769728 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     694              : 
     695              : !      From now, the coding of the PW92 functional start. It is identical in xcpbe.f
     696      3769728 :        rs=rsfac*rhotmot
     697      3769728 :        sqr_rs=sq_rsfac*rhotmo6
     698      3769728 :        rsm1_2=sq_rsfac_inv*rhoto6
     699              : 
     700              : !      Formulas A6-A8 of PW92LSD
     701      3769728 :        ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
     702      3769728 :        ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
     703      3769728 :        ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
     704      3769728 :        ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
     705              : !      ec0_log=log( one + one / ec0_q1 )
     706      3769728 :        ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
     707      3769728 :        ecrs0=ec0_q0*ec0_log
     708      3769728 :        decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
     709              : 
     710      3769728 :        ecrs=ecrs0
     711      3769728 :        decrs_drs=decrs0_drs
     712      3769728 :        decrs_dzeta=zero
     713      3769728 :        zeta=zero
     714              : 
     715              : !      At this point, the coding of the PW92 functional finishes.
     716              : 
     717              : !      The correlation between different spin from HCTH is now computed
     718              : !      First, the part without gradient correction factor
     719      3769728 :        rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
     720      3769728 :        vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
     721      3769728 :        drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
     722      3769728 :        drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
     723              : 
     724              : !      Now, the gradient correction factor
     725      3769728 :        ssavg=half*(ss_up+ss_dn)
     726      3769728 :        divcab=one/(one+gammacab*ssavg)
     727      3769728 :        ucab=gammacab*ssavg*divcab
     728      3769728 :        ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
     729              : 
     730      3769728 :        gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
     731              :        dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
     732      3769728 : &       *ducabdss
     733              : 
     734      3769728 :        exc=exc+rhoecab*gcab
     735              : 
     736      3769728 :        vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
     737      3769728 :        dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
     738              : !      If non spin-polarized, treat spin down contribution now, similar to spin up
     739              : !      vxci(ipts,2)=vxci(ipts,1)
     740      3769728 :        dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     741              : 
     742              : !      Final division by the total density, to give the energy density
     743      3770715 :        exci(ipts)=exc*rhotot_inv
     744              : 
     745              :      end do ! ipts=1,npts
     746              :    end if
     747              : 
     748          278 :  else if(nspden==2) then
     749              : 
     750          278 :    if(order**2>1) then
     751              : 
     752            0 :      do ipts=1,npts
     753              : 
     754              : !      -----------------------------------------------------------------------
     755              : !      First take care of the spin-split part of the functional
     756              :        exc=zero
     757            0 :        do ispden=1,nspden
     758            0 :          rho   =rho_updn(ipts,ispden)
     759            0 :          rhomot=rho_updnm1_3(ipts,ispden)
     760            0 :          rho_inv=rhomot*rhomot*rhomot
     761              : 
     762              : !        Exchange part
     763            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     764              : !        Note that this definition differs from the PBE one
     765            0 :          coeffss=rho_inv*rho_inv*rhomot*rhomot
     766            0 :          ss=grho2_updn(ipts,ispden)*coeffss
     767            0 :          dssdrho=-eight*third*ss*rho_inv
     768            0 :          dssdg=two*coeffss
     769              : 
     770            0 :          divx=one/(one+gammax*ss)
     771            0 :          uxsig=gammax*ss*divx
     772            0 :          duxsigdss=gammax*divx*(one-ss*gammax*divx)
     773              : 
     774            0 :          gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
     775              :          dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
     776            0 : &         *duxsigdss
     777              : 
     778            0 :          exc=exc+ex_lsd*rho*gxsig
     779            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
     780            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
     781              : 
     782              : !        Spin parallel correlation part
     783              : !        Note that this definition is for fully spin-polarized quantities
     784            0 :          rs=rsfac*rhomot
     785            0 :          rhomo6=sqrt(rhomot)
     786            0 :          sqr_rs=sq_rsfac*rhomo6
     787            0 :          rhoo6=rho*rhomot*rhomot*rhomo6
     788            0 :          rsm1_2=sq_rsfac_inv*rhoo6
     789            0 :          drsdrho=-third*rs*rho_inv
     790              : 
     791            0 :          ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
     792            0 :          ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
     793            0 :          ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
     794            0 :          ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
     795              : !        ec1_log=log( one + one / ec1_q1 )
     796            0 :          ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
     797            0 :          ecrs1=ec1_q0*ec1_log
     798            0 :          decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
     799            0 :          decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
     800              : 
     801              : !        Store the LSDA corr energy and density derivative
     802            0 :          if(ispden==1)then
     803            0 :            rhoecrs1_up=rho*ecrs1
     804            0 :            drhoecrs1_drhoup=decrs1_drho
     805            0 :            ss_up=ss
     806            0 :            dssupdrho=dssdrho
     807            0 :            dssupdg=dssdg
     808              :          else
     809            0 :            rhoecrs1_dn=rho*ecrs1
     810            0 :            drhoecrs1_drhodn=decrs1_drho
     811            0 :            ss_dn=ss
     812            0 :            dssdndrho=dssdrho
     813            0 :            dssdndg=dssdg
     814              :          end if
     815              : 
     816            0 :          divcsig=one/(one+gammacsig*ss)
     817            0 :          ucsig=gammacsig*ss*divcsig
     818            0 :          ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
     819              : 
     820            0 :          gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
     821              :          dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
     822            0 : &         *ducsigdss
     823              : 
     824              : !        DEBUG
     825              : !        gcsig=zero
     826              : !        dgcsigdss=zero
     827              : !        ENDDEBUG
     828            0 :          exc=exc+ecrs1*rho*gcsig
     829              :          vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
     830            0 : &         ecrs1*rho*dgcsigdss*dssdrho
     831            0 :          dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
     832              : 
     833              :        end do
     834              : 
     835              : !      -----------------------------------------------------------------------------
     836              : !      Then takes care of the LSD correlation part of the functional
     837              : 
     838            0 :        rhotot=rhoarr(ipts)
     839            0 :        rhotmot=rhom1_3(ipts)
     840            0 :        rhotot_inv=rhotmot*rhotmot*rhotmot
     841            0 :        rhotmo6=sqrt(rhotmot)
     842            0 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     843              : 
     844              : !      From now, the coding of the PW92 functional start. It is identical in xcpbe.f
     845            0 :        rs=rsfac*rhotmot
     846            0 :        sqr_rs=sq_rsfac*rhotmo6
     847            0 :        rsm1_2=sq_rsfac_inv*rhoto6
     848              : 
     849              : !      Formulas A6-A8 of PW92LSD
     850            0 :        ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
     851            0 :        ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
     852            0 :        ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
     853            0 :        ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
     854              : !      ec0_log=log( one + one / ec0_q1 )
     855            0 :        ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
     856            0 :        ecrs0=ec0_q0*ec0_log
     857            0 :        decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
     858            0 :        ec0_q1pp=half*ec0_aa*(-ec0_b1*rsm1_2**3+3.d0*ec0_b3*rsm1_2+8.d0*ec0_b4)
     859              :        d2ecrs0_drs2= 4.0d0*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
     860              : &       -ec0_q0*ec0_q1pp*ec0_den                        &
     861            0 : &       +ec0_q0*ec0_q1p**2*ec0_den**2*(2.d0*ec0_q1+one)
     862              : 
     863            0 :        mac_q0=-2.0d0*mac_aa*(one+mac_a1*rs)
     864            0 :        mac_q1=2.0d0*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
     865            0 :        mac_q1p=mac_aa*(mac_b1*rsm1_2+2.d0*mac_b2+3.d0*mac_b3*sqr_rs+4.d0*mac_b4*rs)
     866            0 :        mac_den=one/(mac_q1*mac_q1+mac_q1)
     867            0 :        mac_log=-log( mac_q1*mac_q1*mac_den )
     868            0 :        macrs=mac_q0*mac_log
     869            0 :        dmacrs_drs= -2.0d0*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
     870              : 
     871            0 :        zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
     872            0 :        ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
     873            0 :        ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
     874            0 :        ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
     875            0 :        ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
     876              : !      ec1_log=log( one + one / ec1_q1 )
     877            0 :        ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
     878            0 :        ecrs1=ec1_q0*ec1_log
     879            0 :        decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
     880              : 
     881              : !      alpha_zeta is introduced in order to remove singularities for fully
     882              : !      polarized systems.
     883            0 :        zetp_1_3=(one+zeta*alpha_zeta)*zetpm1_3(ipts)**2
     884            0 :        zetm_1_3=(one-zeta*alpha_zeta)*zetmm1_3(ipts)**2
     885              : 
     886              :        f_zeta=( (one+zeta*alpha_zeta2)*zetp_1_3 +                      &
     887            0 : &       (one-zeta*alpha_zeta2)*zetm_1_3 - 2.0d0 ) * factf_zeta
     888            0 :        fp_zeta=( zetp_1_3 - zetm_1_3 ) * factfp_zeta
     889            0 :        zeta4=zeta**4
     890            0 :        gcrs=ecrs1-ecrs0+macrs*fsec_inv
     891              : !      ecrs=ecrs0+f_zeta*(-macrs*(one-zeta4)*fsec_inv+(ecrs1-ecrs0)*zeta4)
     892            0 :        ecrs=ecrs0+f_zeta*(zeta4*gcrs-macrs*fsec_inv)
     893              : 
     894            0 :        dgcrs_drs=decrs1_drs-decrs0_drs+dmacrs_drs*fsec_inv
     895              : !      decrs_drs=decrs0_drs+f_zeta*&
     896              : !      &       (-dmacrs_drs*(one-zeta4)*fsec_inv+(decrs1_drs-decrs0_drs)*zeta4)
     897            0 :        decrs_drs=decrs0_drs+f_zeta*(zeta4*dgcrs_drs-dmacrs_drs*fsec_inv)
     898            0 :        dfzeta4_dzeta=4.0d0*zeta**3*f_zeta+fp_zeta*zeta4
     899            0 :        decrs_dzeta=dfzeta4_dzeta*gcrs-fp_zeta*macrs*fsec_inv
     900              : 
     901            0 :        ec1_q1pp=half*ec1_aa*(-ec1_b1*rsm1_2**3+3.d0*ec1_b3*rsm1_2+8.d0*ec1_b4)
     902              :        d2ecrs1_drs2= 4.0d0*ec1_aa*ec1_a1*ec1_q1p*ec1_den            &
     903              : &       -ec1_q0*ec1_q1pp*ec1_den                        &
     904            0 : &       +ec1_q0*ec1_q1p**2*ec1_den**2*(2.d0*ec1_q1+one)
     905              : 
     906            0 :        mac_q1pp=half*mac_aa*(-mac_b1*rsm1_2**3+3.d0*mac_b3*rsm1_2+8.d0*mac_b4)
     907              :        d2macrs_drs2= 4.0d0*mac_aa*mac_a1*mac_q1p*mac_den            &
     908              : &       -mac_q0*mac_q1pp*mac_den                        &
     909            0 : &       +mac_q0*mac_q1p**2*mac_den**2*(2.d0*mac_q1+one)
     910              : 
     911            0 :        d2gcrs_drs2=d2ecrs1_drs2-d2ecrs0_drs2+d2macrs_drs2*fsec_inv
     912            0 :        fpp_zeta=(zetpm1_3(ipts)**2+zetmm1_3(ipts)**2) * factfpp_zeta
     913              :        d2fzeta4_dzeta2=12.0d0*zeta**2*f_zeta  &
     914              : &       + 8.0d0*zeta**3*fp_zeta &
     915            0 : &       +       zeta4  *fpp_zeta
     916              : 
     917              :        d2ecrs_drs2=d2ecrs0_drs2+&
     918            0 : &       f_zeta*(zeta4*d2gcrs_drs2-d2macrs_drs2*fsec_inv)
     919            0 :        d2ecrs_drsdzeta=dfzeta4_dzeta*dgcrs_drs-fp_zeta*dmacrs_drs*fsec_inv
     920            0 :        d2ecrs_dzeta2=d2fzeta4_dzeta2*gcrs-fpp_zeta*macrs*fsec_inv
     921              : 
     922              : 
     923              : !      At this point, the coding of the PW92 functional finishes.
     924              : 
     925              : !      The correlation between different spin from HCTH is now computed
     926              : !      First, the part without gradient correction factor
     927            0 :        rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
     928            0 :        vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
     929            0 :        drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
     930            0 :        drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
     931              : 
     932              : !      Now, the gradient correction factor
     933            0 :        ssavg=half*(ss_up+ss_dn)
     934            0 :        divcab=one/(one+gammacab*ssavg)
     935            0 :        ucab=gammacab*ssavg*divcab
     936            0 :        ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
     937              : 
     938            0 :        gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
     939              :        dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
     940            0 : &       *ducabdss
     941              : 
     942            0 :        exc=exc+rhoecab*gcab
     943              : 
     944            0 :        vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
     945            0 :        dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
     946            0 :        vxci(ipts,2)=vxci(ipts,2)+drhoecab_drhodn*gcab+rhoecab*dgcabdss*half*dssdndrho
     947            0 :        dvxcdgr(ipts,2)=dvxcdgr(ipts,2)+rhoecab*dgcabdss*half*dssdndg
     948              : 
     949              : !      Final division by the total density, to give the energy density
     950            0 :        exci(ipts)=exc*rhotot_inv
     951              : 
     952              :      end do ! ipts=1,npts
     953              : 
     954              :    else
     955              : 
     956      1032470 :      do ipts=1,npts
     957              : 
     958              : !      -----------------------------------------------------------------------
     959              : !      First take care of the spin-split part of the functional
     960              :        exc=zero
     961      3096576 :        do ispden=1,nspden
     962      2064384 :          rho   =rho_updn(ipts,ispden)
     963      2064384 :          rhomot=rho_updnm1_3(ipts,ispden)
     964      2064384 :          rho_inv=rhomot*rhomot*rhomot
     965              : 
     966              : !        Exchange part
     967      2064384 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     968              : !        Note that this definition differs from the PBE one
     969      2064384 :          coeffss=rho_inv*rho_inv*rhomot*rhomot
     970      2064384 :          ss=grho2_updn(ipts,ispden)*coeffss
     971      2064384 :          dssdrho=-eight*third*ss*rho_inv
     972      2064384 :          dssdg=two*coeffss
     973              : 
     974      2064384 :          divx=one/(one+gammax*ss)
     975      2064384 :          uxsig=gammax*ss*divx
     976      2064384 :          duxsigdss=gammax*divx*(one-ss*gammax*divx)
     977              : 
     978      2064384 :          gxsig=cxsig0+uxsig*(cxsig1+uxsig*(cxsig2+uxsig*(cxsig3+uxsig*cxsig4)))
     979              :          dgxsigdss=(cxsig1+uxsig*(two*cxsig2+uxsig*(three*cxsig3+uxsig*four*cxsig4)))&
     980      2064384 : &         *duxsigdss
     981              : 
     982      2064384 :          exc=exc+ex_lsd*rho*gxsig
     983      2064384 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*gxsig+rho*dgxsigdss*dssdrho)
     984      2064384 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dgxsigdss*dssdg
     985              : 
     986              : !        Spin parallel correlation part
     987              : !        Note that this definition is for fully spin-polarized quantities
     988      2064384 :          rs=rsfac*rhomot
     989      2064384 :          rhomo6=sqrt(rhomot)
     990      2064384 :          sqr_rs=sq_rsfac*rhomo6
     991      2064384 :          rhoo6=rho*rhomot*rhomot*rhomo6
     992      2064384 :          rsm1_2=sq_rsfac_inv*rhoo6
     993      2064384 :          drsdrho=-third*rs*rho_inv
     994              : 
     995      2064384 :          ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
     996      2064384 :          ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
     997      2064384 :          ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
     998      2064384 :          ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
     999              : !        ec1_log=log( one + one / ec1_q1 )
    1000      2064384 :          ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
    1001      2064384 :          ecrs1=ec1_q0*ec1_log
    1002      2064384 :          decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
    1003      2064384 :          decrs1_drho=ecrs1+decrs1_drs*drsdrho*rho
    1004              : 
    1005              : !        Store the LSDA corr energy and density derivative
    1006      2064384 :          if(ispden==1)then
    1007      1032192 :            rhoecrs1_up=rho*ecrs1
    1008      1032192 :            drhoecrs1_drhoup=decrs1_drho
    1009      1032192 :            ss_up=ss
    1010      1032192 :            dssupdrho=dssdrho
    1011      1032192 :            dssupdg=dssdg
    1012              :          else
    1013      1032192 :            rhoecrs1_dn=rho*ecrs1
    1014      1032192 :            drhoecrs1_drhodn=decrs1_drho
    1015      1032192 :            ss_dn=ss
    1016      1032192 :            dssdndrho=dssdrho
    1017      1032192 :            dssdndg=dssdg
    1018              :          end if
    1019              : 
    1020      2064384 :          divcsig=one/(one+gammacsig*ss)
    1021      2064384 :          ucsig=gammacsig*ss*divcsig
    1022      2064384 :          ducsigdss=gammacsig*divcsig*(one-ss*gammacsig*divcsig)
    1023              : 
    1024      2064384 :          gcsig=ccsig0+ucsig*(ccsig1+ucsig*(ccsig2+ucsig*(ccsig3+ucsig*ccsig4)))
    1025              :          dgcsigdss=(ccsig1+ucsig*(two*ccsig2+ucsig*(three*ccsig3+ucsig*four*ccsig4)))&
    1026      2064384 : &         *ducsigdss
    1027              : 
    1028              : !        DEBUG
    1029              : !        gcsig=zero
    1030              : !        dgcsigdss=zero
    1031              : !        ENDDEBUG
    1032      2064384 :          exc=exc+ecrs1*rho*gcsig
    1033              :          vxci(ipts,ispden)=vxci(ipts,ispden)+decrs1_drho*gcsig+&
    1034      2064384 : &         ecrs1*rho*dgcsigdss*dssdrho
    1035      3096576 :          dvxcdgr(ipts,ispden)=dvxcdgr(ipts,ispden)+ecrs1*rho*dgcsigdss*dssdg
    1036              : 
    1037              :        end do
    1038              : 
    1039              : !      -----------------------------------------------------------------------------
    1040              : !      Then takes care of the LSD correlation part of the functional
    1041              : 
    1042      1032192 :        rhotot=rhoarr(ipts)
    1043      1032192 :        rhotmot=rhom1_3(ipts)
    1044      1032192 :        rhotot_inv=rhotmot*rhotmot*rhotmot
    1045      1032192 :        rhotmo6=sqrt(rhotmot)
    1046      1032192 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1047              : 
    1048              : !      From now, the coding of the PW92 functional start. It is identical in xcpbe.f
    1049      1032192 :        rs=rsfac*rhotmot
    1050      1032192 :        sqr_rs=sq_rsfac*rhotmo6
    1051      1032192 :        rsm1_2=sq_rsfac_inv*rhoto6
    1052              : 
    1053              : !      Formulas A6-A8 of PW92LSD
    1054      1032192 :        ec0_q0=-2.0d0*ec0_aa*(one+ec0_a1*rs)
    1055      1032192 :        ec0_q1=2.0d0*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    1056      1032192 :        ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2.d0*ec0_b2+3.d0*ec0_b3*sqr_rs+4.d0*ec0_b4*rs)
    1057      1032192 :        ec0_den=one/(ec0_q1*ec0_q1+ec0_q1)
    1058              : !      ec0_log=log( one + one / ec0_q1 )
    1059      1032192 :        ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    1060      1032192 :        ecrs0=ec0_q0*ec0_log
    1061      1032192 :        decrs0_drs= -2.0d0*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    1062              : 
    1063      1032192 :        mac_q0=-2.0d0*mac_aa*(one+mac_a1*rs)
    1064      1032192 :        mac_q1=2.0d0*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    1065      1032192 :        mac_q1p=mac_aa*(mac_b1*rsm1_2+2.d0*mac_b2+3.d0*mac_b3*sqr_rs+4.d0*mac_b4*rs)
    1066      1032192 :        mac_den=one/(mac_q1*mac_q1+mac_q1)
    1067      1032192 :        mac_log=-log( mac_q1*mac_q1*mac_den )
    1068      1032192 :        macrs=mac_q0*mac_log
    1069      1032192 :        dmacrs_drs= -2.0d0*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    1070              : 
    1071      1032192 :        zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
    1072      1032192 :        ec1_q0=-two*ec1_aa*(one+ec1_a1*rs)
    1073      1032192 :        ec1_q1=two*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
    1074      1032192 :        ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+two*ec1_b2+three*ec1_b3*sqr_rs+four*ec1_b4*rs)
    1075      1032192 :        ec1_den=one/(ec1_q1*ec1_q1+ec1_q1)
    1076              : !      ec1_log=log( one + one / ec1_q1 )
    1077      1032192 :        ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
    1078      1032192 :        ecrs1=ec1_q0*ec1_log
    1079      1032192 :        decrs1_drs= -two*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
    1080              : 
    1081              : !      alpha_zeta is introduced in order to remove singularities for fully
    1082              : !      polarized systems.
    1083      1032192 :        zetp_1_3=(one+zeta*alpha_zeta)*zetpm1_3(ipts)**2
    1084      1032192 :        zetm_1_3=(one-zeta*alpha_zeta)*zetmm1_3(ipts)**2
    1085              : 
    1086              :        f_zeta=( (one+zeta*alpha_zeta2)*zetp_1_3 +                      &
    1087      1032192 : &       (one-zeta*alpha_zeta2)*zetm_1_3 - 2.0d0 ) * factf_zeta
    1088      1032192 :        fp_zeta=( zetp_1_3 - zetm_1_3 ) * factfp_zeta
    1089      1032192 :        zeta4=zeta**4
    1090      1032192 :        gcrs=ecrs1-ecrs0+macrs*fsec_inv
    1091              : !      ecrs=ecrs0+f_zeta*(-macrs*(one-zeta4)*fsec_inv+(ecrs1-ecrs0)*zeta4)
    1092      1032192 :        ecrs=ecrs0+f_zeta*(zeta4*gcrs-macrs*fsec_inv)
    1093              : 
    1094      1032192 :        dgcrs_drs=decrs1_drs-decrs0_drs+dmacrs_drs*fsec_inv
    1095              : !      decrs_drs=decrs0_drs+f_zeta*&
    1096              : !      &       (-dmacrs_drs*(one-zeta4)*fsec_inv+(decrs1_drs-decrs0_drs)*zeta4)
    1097      1032192 :        decrs_drs=decrs0_drs+f_zeta*(zeta4*dgcrs_drs-dmacrs_drs*fsec_inv)
    1098      1032192 :        dfzeta4_dzeta=4.0d0*zeta**3*f_zeta+fp_zeta*zeta4
    1099      1032192 :        decrs_dzeta=dfzeta4_dzeta*gcrs-fp_zeta*macrs*fsec_inv
    1100              : 
    1101              : !      At this point, the coding of the PW92 functional finishes.
    1102              : 
    1103              : !      The correlation between different spin from HCTH is now computed
    1104              : !      First, the part without gradient correction factor
    1105      1032192 :        rhoecab=ecrs*rhotot-rhoecrs1_dn-rhoecrs1_up
    1106      1032192 :        vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
    1107      1032192 :        drhoecab_drhoup=vxcadd+decrs_dzeta-drhoecrs1_drhoup
    1108      1032192 :        drhoecab_drhodn=vxcadd-decrs_dzeta-drhoecrs1_drhodn
    1109              : 
    1110              : !      Now, the gradient correction factor
    1111      1032192 :        ssavg=half*(ss_up+ss_dn)
    1112      1032192 :        divcab=one/(one+gammacab*ssavg)
    1113      1032192 :        ucab=gammacab*ssavg*divcab
    1114      1032192 :        ducabdss=gammacab*divcab*(one-ssavg*gammacab*divcab)
    1115              : 
    1116      1032192 :        gcab=ccab0+ucab*(ccab1+ucab*(ccab2+ucab*(ccab3+ucab*ccab4)))
    1117              :        dgcabdss=(ccab1+ucab*(two*ccab2+ucab*(three*ccab3+ucab*four*ccab4)))&
    1118      1032192 : &       *ducabdss
    1119              : 
    1120      1032192 :        exc=exc+rhoecab*gcab
    1121              : 
    1122      1032192 :        vxci(ipts,1)=vxci(ipts,1)+drhoecab_drhoup*gcab+rhoecab*dgcabdss*half*dssupdrho
    1123      1032192 :        dvxcdgr(ipts,1)=dvxcdgr(ipts,1)+rhoecab*dgcabdss*half*dssupdg
    1124      1032192 :        vxci(ipts,2)=vxci(ipts,2)+drhoecab_drhodn*gcab+rhoecab*dgcabdss*half*dssdndrho
    1125      1032192 :        dvxcdgr(ipts,2)=dvxcdgr(ipts,2)+rhoecab*dgcabdss*half*dssdndg
    1126              : 
    1127              : !      Final division by the total density, to give the energy density
    1128      1032470 :        exci(ipts)=exc*rhotot_inv
    1129              : 
    1130              :      end do ! ipts=1,npts
    1131              : 
    1132              :    end if
    1133              : 
    1134              :  else
    1135              : !  Disallowed value for nspden
    1136              :    write(message, '(3a,i0)' )&
    1137            0 : &   '  Argument nspden must be 1 or 2; ',ch10,&
    1138            0 : &   '  Value provided as argument was ',nspden
    1139            0 :    ABI_BUG(message)
    1140              :  end if
    1141              : 
    1142              : !DEBUG
    1143              : !Finite-difference debugging, do not take away
    1144              : !Beware that dvxcdgr(:,3) no longer exists
    1145              : !if(debug/=0)then
    1146              : !do ipts=1,npts,5
    1147              : 
    1148              : !rho=rho_updn(ipts,1)+rho_updn(ipts,2)
    1149              : !write(std_out,'(a,i5,a,es16.8)' ) ' Point number',ipts,' with rho=',rho
    1150              : 
    1151              : !! For rho
    1152              : !if(debug==1)then
    1153              : !write(std_out,'(3es16.8)' )exci(ipts)*rho,vxci(ipts,1),vxci(ipts,2)
    1154              : !else
    1155              : !!  For grho2
    1156              : !write(std_out,'(4es16.8)' )exci(ipts)*rho,dvxcdgr(ipts,1),&
    1157              : !&  dvxcdgr(ipts,2),dvxcdgr(ipts,3)
    1158              : !end if
    1159              : 
    1160              : !if(debug==1)then
    1161              : !!  For rho
    1162              : !write(std_out,'(3es16.8)' )exci(ipts)*rho,&
    1163              : !&      ( exci(ipts+1)*(rho+delta) - exci(ipts+2)*(rho-delta) )/2.d0/delta,&
    1164              : !&      ( exci(ipts+3)*(rho+delta) - exci(ipts+4)*(rho-delta) )/2.d0/delta
    1165              : !write(std_out,'(3es16.8)' )&
    1166              : !&    ( vxci(ipts+1,1) - vxci(ipts+2,1) )/2.d0/delta,&
    1167              : !&    ( vxci(ipts+3,1) - vxci(ipts+4,1) )/2.d0/delta,&
    1168              : !&    ( vxci(ipts+3,2) - vxci(ipts+4,2) )/2.d0/delta
    1169              : !write(std_out,'(4es16.8)' )&
    1170              : !&    ( dvxcdgr(ipts+1,1) - dvxcdgr(ipts+2,1) )/2.d0/delta,&
    1171              : !&    ( dvxcdgr(ipts+3,2) - dvxcdgr(ipts+4,2) )/2.d0/delta,&
    1172              : !&    ( dvxcdgr(ipts+1,3) - dvxcdgr(ipts+2,3) )/2.d0/delta,&
    1173              : !&    ( dvxcdgr(ipts+3,3) - dvxcdgr(ipts+4,3) )/2.d0/delta
    1174              : !else
    1175              : !!  For grho2  (should distinguish exchange and correlation ...)
    1176              : !grr=sqrt(grho2_updn(ipts,1)) ! Analysis of exchange
    1177              : !grr=sqrt(grho2_updn(ipts,3)) ! Analysis of correlation
    1178              : !write(std_out,'(3es16.8)' )exci(ipts)*rho,&
    1179              : !&      ( exci(ipts+1)*rho - exci(ipts+2)*rho )/2.d0/delta/grr,&
    1180              : !&      ( exci(ipts+3)*rho - exci(ipts+4)*rho )/2.d0/delta/grr
    1181              : !write(std_out,'(3es16.8)' )&
    1182              : !&    ( vxci(ipts+1,1) - vxci(ipts+2,1) )/2.d0/delta/grr,&
    1183              : !&    ( vxci(ipts+3,1) - vxci(ipts+4,1) )/2.d0/delta/grr,&
    1184              : !&    ( vxci(ipts+3,2) - vxci(ipts+4,2) )/2.d0/delta/grr
    1185              : !write(std_out,'(4es16.8)' )&
    1186              : !&    ( dvxcdgr(ipts+1,1) - dvxcdgr(ipts+2,1) )/2.d0/delta/grr,&
    1187              : !&    ( dvxcdgr(ipts+3,2) - dvxcdgr(ipts+4,2) )/2.d0/delta/grr,&
    1188              : !&    ( dvxcdgr(ipts+1,3) - dvxcdgr(ipts+2,3) )/2.d0/delta/grr,&
    1189              : !&    ( dvxcdgr(ipts+3,3) - dvxcdgr(ipts+4,3) )/2.d0/delta/grr
    1190              : !end if
    1191              : !end do
    1192              : !stop
    1193              : !end if
    1194              : !ENDDEBUG
    1195              : 
    1196         1265 :  ABI_FREE(rhoarr)
    1197         1265 :  ABI_FREE(rhom1_3)
    1198         1265 :  ABI_FREE(rho_updnm1_3)
    1199         1265 :  if(nspden==2) then
    1200          278 :    ABI_FREE(zetm)
    1201          278 :    ABI_FREE(zetmm1_3)
    1202          278 :    ABI_FREE(zetp)
    1203          278 :    ABI_FREE(zetpm1_3)
    1204              :  end if
    1205              : 
    1206              : !DEBUG
    1207              : !write(std_out,*)' xchcth : exit'
    1208              : !write(std_out,*)' nspden=',nspden
    1209              : !if(order==2)stop
    1210              : !ENDDEBUG
    1211              : 
    1212         1265 : end subroutine xchcth
    1213              : !!***
    1214              : 
    1215              : end module m_xchcth
    1216              : !!***
        

Generated by: LCOV version 2.3-1