LCOV - code coverage report
Current view: top level - shared/common/src/33_xc_lowlevel - m_xcpbe.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 54.1 % 2794 1512
Test Date: 2026-09-21 19:39:32 Functions: 83.3 % 6 5

            Line data    Source code
       1              : !!****m* ABINIT/m_xcpbe
       2              : !! NAME
       3              : !!  m_xcpbe
       4              : !!
       5              : !! FUNCTION
       6              : !! Treat XC functionals closely linked with the Perdew-Wang 92 LSD and the PBE GGA.
       7              : !!
       8              : !! COPYRIGHT
       9              : !!  Copyright (C) 1998-2026 ABINIT group (XG,MF,LG,CE,AB)
      10              : !!  This file is distributed under the terms of the
      11              : !!  GNU General Public License, see ~abinit/COPYING
      12              : !!  or http://www.gnu.org/copyleft/gpl.txt .
      13              : !!
      14              : !! SOURCE
      15              : 
      16              : #if defined HAVE_CONFIG_H
      17              : #include "config.h"
      18              : #endif
      19              : 
      20              : #include "abi_common.h"
      21              : 
      22              : module m_xcpbe
      23              : 
      24              :  use defs_basis
      25              :  use m_abicore
      26              :  use m_errors
      27              :  use m_special_funcs,      only : tildeAx,tildeBx,tildeBc
      28              :  use m_xclda,              only : fxc_ksdt,fec_ksdt
      29              :  use m_numeric_tools,      only : invcb
      30              : 
      31              :  implicit none
      32              : 
      33              :  private
      34              : !!***
      35              : 
      36              :  public :: xcpbe
      37              :  public :: xckdt16 ! KDT16 (TGGA) finite-temperature xc functional
      38              : !!***
      39              : 
      40              : contains
      41              : !!***
      42              : 
      43              : !!****f* ABINIT/xcpbe
      44              : !! NAME
      45              : !! xcpbe
      46              : !!
      47              : !! FUNCTION
      48              : !! Treat XC functionals closely linked with the Perdew-Wang 92 LSD and the PBE GGA.
      49              : !!
      50              : !! For a series of values of the density and, if GGA, the square of the
      51              : !! gradient of the density, return the associated Exc energy,
      52              : !! potential, and, in case of response-function, functions needed
      53              : !! to build the XC kernel.
      54              : !!
      55              : !! If option==2, Exchange-correlation functional from Perdew-Burke-Ernzerhof,
      56              : !! Phys.Rev.Lett. 77, 3866 (1996) [[cite:Perdew1996]].
      57              : !! If option==1, Reduces to Perdew-Wang LSD , PRB45,13244 (1992) [[cite:Perdew1992]].
      58              : !! If option==-1 or -2, take only exchange part of PW (-1) or PBE (-2) functionals.
      59              : !! If option==-4, C09x exchange functional of V. R. Cooper, PRB 81, 161104(R) (2010) [[cite:Cooper2010]].
      60              : !! If option==3 or 4, take exchange plus RPA correlation
      61              : !!   part of LSD PW (3) or GGA PBE (4) functionals.
      62              : !! If option==5, revPBE functional of Zhang and Yang, PRL 80, 890 (1998) [[cite:Zhang1998]]
      63              : !! If option==6, RPBE functional of Hammer, Hansen and Norskov, PRB 59, 7413 (1999) [[cite:Hammer1999]]
      64              : !! If option==7, WC functional of Wu and Cohen, PRB 73, 235116 (2006) [[cite:Wu2006]]
      65              : !!
      66              : !! INPUTS
      67              : !!  exexch= choice of local exact exchange. Active if exexch=1
      68              : !!  npts= number of points to be computed
      69              : !!  nspden=1 for unpolarized, 2 for spin-polarized
      70              : !!  grho2_updn(npts,2*nspden-1)=square of the gradient of the spin-up,
      71              : !!     and, if nspden==2, spin-down, and total density (Hartree/Bohr**2),
      72              : !!     only used if gradient corrected functional (option=2,-2,-4 and 4 or beyond)
      73              : !!  option= see above
      74              : !!  order=its absolute value gives the maximal derivative of Exc to be computed.
      75              : !!  rho_updn(npts,nspden)=spin-up and spin-down density (Hartree/bohr**3)
      76              : !!  ndvxci= size of dvxci(npts,ndvxci)
      77              : !!  nd2vxci=size of d2vxci(npts,nd2vxci)
      78              : !!
      79              : !! OUTPUT
      80              : !!  d2vxci=third derivative of the xc energy with respect to the density, only
      81              : !!    only if local-density approximation
      82              : !!   calculated if order==3
      83              : !!   In case of local energy functional (option=1,-1 or 3):
      84              : !!    d2vxci(npts,nd2vxc)=              (Hartree*bohr^3)
      85              : !!     if(nspden=1): d2vxci(:,1)=-(2/3)*dvxci/d$\rho$
      86              : !!                                  (dvxci is the second derivative, see below)
      87              : !!     if(nspden=2): d2vxci(:,1)=3rd order derivative of XC energy with respect to rhouprhouprhoup,
      88              : !!                   d2vxci(:,2)=3rd order derivative of XC energy with respect to rhouprhouprhodn
      89              : !!                   d2vxci(:,3)=3rd order derivative of XC energy with respect to rhodnrhouprhodn
      90              : !!                   d2vxci(:,4)=3rd order derivative of XC energy with respect to rhodnrhodnrhodn
      91              : !!  dvxcdgr(npts,3)=partial derivative of the exchange-correlation
      92              : !!    energy (exci*$\rho$) with respect to the spin-up (dvxcdgr(:,1)),
      93              : !!    spin-down (dvxcdgr(:,2)), or total spin (dvxcdgr(:,3)) gradients of the density
      94              : !!    divided by the norm of the gradient (the definition changed in v3.3)
      95              : !!
      96              : !!  dvxci=partial second derivatives of the xc energy, only if abs(order)>1
      97              : !!   In case of local energy functional (option=1,-1 or 3):
      98              : !!    dvxci(npts,1+nspden)=              (Hartree*bohr^3)
      99              : !!     if(nspden=1 .and. order==2): dvxci(:,1)=dvxc/d$\rho$ , dvxc(:,2) empty
     100              : !!     if(nspden=1 .and. order==-2): also compute dvxci(:,2)=dvxc($\uparrow$)/d$\rho(\downarrow)$
     101              : !!     if(nspden=2): dvxci(:,1)=dvxc($\uparrow$)/d$\rho(\uparrow)$,
     102              : !!                   dvxci(:,2)=dvxc($\uparrow$)/d$\rho(\downarrow)$,
     103              : !!                   dvxci(:,3)=dvxc($\downarrow$)/d$\rho(\downarrow)$
     104              : !!   In case of gradient corrected functional (option=2,-2, 4, 5, 6, -4):
     105              : !!    dvxci(npts,15)=
     106              : !!     dvxci(:,1)= d2Ex/drho_up drho_up
     107              : !!     dvxci(:,2)= d2Ex/drho_dn drho_dn
     108              : !!     dvxci(:,3)= dEx/d(abs(grad(rho_up))) / abs(grad(rho_up))
     109              : !!     dvxci(:,4)= dEx/d(abs(grad(rho_dn))) / abs(grad(rho_dn))
     110              : !!     dvxci(:,5)= d2Ex/d(abs(grad(rho_up))) drho_up / abs(grad(rho_up))
     111              : !!     dvxci(:,6)= d2Ex/d(abs(grad(rho_dn))) drho_dn / abs(grad(rho_dn))
     112              : !!     dvxci(:,7)= 1/abs(grad(rho_up)) * d/drho_up (dEx/d(abs(grad(rho_up))) /abs(grad(rho_up)))
     113              : !!     dvxci(:,8)= 1/abs(grad(rho_dn)) * d/drho_dn (dEx/d(abs(grad(rho_dn))) /abs(grad(rho_dn)))
     114              : !!     dvxci(:,9)= d2Ec/drho_up drho_up
     115              : !!     dvxci(:,10)=d2Ec/drho_up drho_dn
     116              : !!     dvxci(:,11)=d2Ec/drho_dn drho_dn
     117              : !!     dvxci(:,12)=dEc/d(abs(grad(rho))) / abs(grad(rho))
     118              : !!     dvxci(:,13)=d2Ec/d(abs(grad(rho))) drho_up / abs(grad(rho))
     119              : !!     dvxci(:,14)=d2Ec/d(abs(grad(rho))) drho_dn / abs(grad(rho))
     120              : !!     dvxci(:,15)=1/abs(grad(rho)) * d/drho (dEc/d(abs(grad(rho))) /abs(grad(rho)))
     121              : !!
     122              : !!  exci(npts)=exchange-correlation energy density (hartree)
     123              : !!  vxci(npts,nspden)=partial derivative of the exchange-correlation energy (exci*$\rho$)
     124              : !!    with respect to the spin-down (vxci(:,1)) and spin-up (vxci(:,2) densities
     125              : !! Normalization: Exc=$\int (exc(r)*\rho (r) d^3 r)$ for $\rho$(r)=electron density.
     126              : !!
     127              : !! TODO
     128              : !!  WARNING: option=4 not yet implemented.
     129              : !!
     130              : !! SOURCE
     131              : 
     132       635724 : subroutine xcpbe(exci,npts,nspden,option,order,rho_updn,vxci,ndvxci,nd2vxci, & !Mandatory Arguments
     133       226730 : &                d2vxci,dvxcdgr,dvxci,exexch,grho2_updn)                       !Optional Arguments
     134              : 
     135              : !Arguments ------------------------------------
     136              : !scalars
     137              :  integer,intent(in) :: ndvxci,nd2vxci,npts,nspden,option,order
     138              :  integer,intent(in),optional :: exexch
     139              : !arrays
     140              :  real(dp),intent(in) :: rho_updn(npts,nspden)
     141              :  real(dp),intent(in),optional :: grho2_updn(npts,2*nspden-1)
     142              :  real(dp),intent(out) :: exci(npts),vxci(npts,nspden)
     143              :  real(dp),intent(out),optional :: d2vxci(npts,nd2vxci),dvxcdgr(npts,3)
     144              :  real(dp),intent(out),optional :: dvxci(npts,ndvxci)
     145              : 
     146              : !Local variables-------------------------------
     147              : ! The "accurate" value of mu is taken from the PBE code.
     148              : ! The value of mu_c09 is taken from the paper (see above) in order to recover
     149              : ! the GEA behaviour of the enhancement factor for small values of s rather than
     150              : ! the LSD linear response limit used in revPBE.
     151              : !scalars
     152              :  integer,save :: initialized=0
     153              :  integer :: exexch_,ipts,ispden
     154              :  real(dp),parameter :: alpha_c09=0.0483_dp
     155              : !GMR (to match Libxc one should comment the next line and uncomment the following )
     156              :  real(dp),parameter :: alpha_zeta2=1.0_dp-1.0e-6_dp,alpha_zeta=1.0_dp-1.0e-6_dp
     157              : !real(dp),parameter :: alpha_zeta2=1.0_dp,alpha_zeta=1.0_dp
     158              : !GMR
     159              : !GMR (to match Libxc one should comment the next line and uncomment the following )
     160              :  real(dp),parameter :: b_wc=0.123456790123_dp,beta=0.066725_dp
     161              : !real(dp),parameter :: b_wc=0.123456790123_dp,beta=0.06672455060314922_dp
     162              : !GMR
     163              :  real(dp),parameter :: beta_inv=1.0_dp/beta,c_wc=0.00793746933516_dp
     164              : !GMR (to match Libxc one should comment the next line and uncomment the following two)
     165              :  real(dp),parameter :: fsec_inv=1.0_dp/1.709921_dp,kappa_pbe=0.804_dp
     166              : !real(dp),parameter :: fsec_inv=1.0_dp/1.709920934161365617563962776245_dp
     167              : !real(dp),parameter :: kappa_pbe=0.804_dp
     168              : !GMR
     169              :  real(dp),parameter :: kappa_revpbe=1.245_dp,mu=0.2195149727645171_dp
     170              :  real(dp),parameter :: kappa_c09=1.245_dp, mu_c09=0.0617_dp
     171              :  real(dp),parameter :: mu_divkappa_pbe=mu/kappa_pbe
     172              :  real(dp),parameter :: mu_divkappa_revpbe=mu/kappa_revpbe
     173              :  real(dp),parameter :: rsfac=0.6203504908994000_dp,tolgrad=tol10
     174              :  real(dp),save :: beta_gamma,coeff_tt,factf_zeta,factfp_zeta,gamma,gamma_inv
     175              :  real(dp),save :: sixpi2_1_3,sixpi2m1_3,sq_rsfac,sq_rsfac_inv,threefourth_divpi,twom1_3
     176              :  real(dp) :: aa,arg_rr,bb,cc,coeff_aa,alphs2,alphmu,coeff_qq,coeffss,d2aa_drs2,d2aa_drsdzeta
     177              :  real(dp) :: d2aa_dzeta2,d2bb_drs2,d2bb_drsdzeta,d2bb_dzeta2,d2cc_dbb2
     178              :  real(dp) :: d2cc_drs2,d2cc_drsdzeta,d2cc_dzeta2,d2ecrs0_drs2,d2ecrs1_drs2
     179              :  real(dp) :: d2ecrs_drdn2,d2ecrs_drdndrup,d2ecrs_drho2,d2ecrs_drs2
     180              :  real(dp) :: d2ecrs_drsdzeta,d2ecrs_drup2,d2ecrs_dzeta2,d2fxdg2,d2fxdn2
     181              :  real(dp) :: d2fxdndg,d2fxdss2,d2fzeta4_dzeta2,d2gcrs_drs2,d2hh_drs2
     182              :  real(dp) :: d2hh_drsdtt,d2hh_drsdzeta,d2hh_dtt2,d2hh_dttdzeta,d2hh_dzeta2
     183              :  real(dp) :: d2macrs_drs2,d2pade_drs2,d2pade_drsdtt,d2pade_drsdzeta,d2pade_dtt2
     184              :  real(dp) :: d2pade_dttdzeta,d2pade_dxx2,d2pade_dzeta2,d2qq_drs2,d2qq_drsdtt
     185              :  real(dp) :: d2qq_drsdzeta,d2qq_dtt2,d2qq_dttdzeta,d2qq_dzeta2,d2rhohh_drho2
     186              :  real(dp) :: d2rhohh_drhodg,d2rr_dqq2,d2rr_drs2,d2rr_drsdtt,d2rr_drsdzeta
     187              :  real(dp) :: d2rr_dtt2,d2rr_dttdzeta,d2rr_dzeta2,d2rs_dn2,d2ssdn2,d2ssdndg
     188              :  real(dp) :: d2vcrs_drs2,d2xx_drs2,d2xx_drsdtt,d2xx_drsdzeta,d2xx_dttdzeta
     189              :  real(dp) :: d2xx_dzeta2,d3ecrs0_drs3,d3ecrs_drup3,d3ecrs_drup2drdn
     190              :  real(dp) :: d3ecrs_drupdrdn2,d3ecrs_drdn3,d3ecrs_dzeta3
     191              :  real(dp) :: d3ecrs_drs2dzeta,d3ecrs_dzeta2drs,d3ecrs1_drs3,d3gcrs_drs3
     192              :  real(dp) :: d3ecrs_drs3,d3macrs_drs3
     193              :  real(dp) :: d_wc,daa_drs,daa_dzeta,dbb_drs,dbb_dzeta
     194              :  real(dp) :: dcc_dbb,dcc_drs,dcc_dzeta,decrs0_drs,decrs1_drs,decrs_drs
     195              :  real(dp) :: decrs_dzeta,dfxdg,dfxdn,dfxdss,dfzeta4_dzeta,dgcrs_drs
     196              :  real(dp) :: dhh_drs,dhh_dtt,dhh_dzeta,div_rr,divss,dmacrs_drs,dpade_drs
     197              :  real(dp) :: dpade_dtt,dpade_dxx,dpade_dzeta,dqq_drs,dqq_dtt,dqq_dzeta
     198              :  real(dp) :: drhohh_drho,drr_dqq,drr_drs,drr_dtt,drr_dzeta,drs_dn,dssdg,dssdn
     199              :  real(dp) :: dtt_dg,dvcrs_drs,dxx_drs,dxx_dtt,dxx_dzeta,ec0_a1,ec0_aa,ec0_b1
     200              :  real(dp) :: ec0_b2,ec0_b3,ec0_b4,ec0_den,ec0_f1,ec0_f2,ec0_log,ec0_q0,ec0_q1
     201              :  real(dp) :: ec0_q1p,ec0_q1pp,ec0_q1ppp,ec1_a1,ec1_aa,ec1_b1,ec1_b2,ec1_b3
     202              :  real(dp) :: ec1_b4,ec1_den,ec1_f1,ec1_f2,ec1_log,ec1_q0,ec1_q1,ec1_q1p,ec1_q1pp
     203              :  real(dp) :: ec1_q1ppp,ecrs,ecrs0,factfppp_zeta
     204              :  real(dp) :: ecrs1,ex_gga,ex_lsd,exc,exp_pbe,expss,f_zeta,factfpp_zeta
     205              :  real(dp) :: fp_zeta,fpp_zeta,fppp_zeta,fx,gamphi3inv,gcrs,grrho2,hh,kappa
     206              :  real(dp) :: mac_a1,mac_aa,mac_b1,mac_b2,mac_b3,mac_b4,mac_den,mac_f1,mac_f2,mac_log,mac_q0
     207              :  real(dp) :: mac_q1,mac_q1ppp
     208              :  real(dp) :: mac_q1p,mac_q1pp,macrs,mu_divkappa,p1_wc,p2_wc,pade,pade_den
     209              :  real(dp) :: phi3_zeta,phi_logder,phi_zeta,phi_zeta_inv,phip_zeta,phipp_zeta,qq
     210              :  real(dp) :: rho,rho_inv,rhomot
     211              :  real(dp) :: rhotmo6,rhotmot,rhoto6,rhotot,rhotot_inv,rr,rs,rsm1_2,sqr_rs
     212              :  real(dp) :: sqr_sqr_rs,ss,tt,vxcadd,xx,zeta,zeta4,zetm_1_3,zetp_1_3
     213              :  real(dp) :: a1fa,a2fa,b1fa,b2fa,c1fa,c2fa,e1fa,e2fa,f1fa,f2fa,g1fa,g2fa,h1fa,h2fa
     214              :  real(dp) :: i1fa,i2fa,m1fa,m2fa,n1fa,n2fa
     215              :  real(dp) :: sp1_up3,sp1_up2dn,sp1_updn2,sp1_dn3
     216              :  real(dp) :: sp2_up3,sp2_up2dn,sp2_updn2,sp2_dn3
     217              :  real(dp) :: sp3_up3,sp3_up2dn,sp3_updn2,sp3_dn3
     218              :  real(dp) :: d3ecrs_sp0,d3ecrs_sp1,d3ecrs_sp2,d3ecrs_sp3
     219              :  character(len=500) :: message
     220              : !arrays
     221       317862 :  real(dp),allocatable :: rho_updnm1_3(:,:),rhoarr(:),rhom1_3(:),zetm(:)
     222       317862 :  real(dp),allocatable :: zetmm1_3(:),zetp(:),zetpm1_3(:)
     223              : !no_abirules
     224              : !integer :: debug
     225              : !real(dp) :: delta,factor,grr,rho_dn,rho_dnm,rho_dnp,rho_up,rho_upm,rho_upp,zeta_mean
     226              : !real(dp), allocatable :: wecrsz(:,:),d1wecrsz(:,:),d2wecrsz(:,:),d3wecrsz(:,:)
     227              : !real(dp) :: d3ecrs_drho3,d3ecrs_drhodndrho2,d3ecrs_drhoupdrho2
     228              : !real(dp) :: ec1_q0p,mac_q0p,sigma1,sigma2,sigma3
     229              : 
     230              : ! *************************************************************************
     231              : 
     232              : !DEBUG
     233              : !write(std_out,*)' xcpbe : enter'
     234              : !ENDDEBUG
     235              : 
     236       317862 :  d_wc=mu-b_wc
     237       317862 :  exexch_=0;if(present(exexch)) exexch_=exexch
     238              : 
     239              : !DEBUG
     240              : !allocate(wecrsz(npts,8),d1wecrsz(npts,8),d2wecrsz(npts,8),d3wecrsz(npts,8))
     241              : !ENDDEBUG
     242              : 
     243       317862 :  if (option<=-4 .or. option==0 .or. option==4 .or. option>=8 ) then
     244          742 :    write(message, '(a,a,a,a,i12,a)' ) ch10,&
     245          742 : &   ' xcpbe : BUG -',ch10,&
     246         1484 : &   '  Option must be 1, 2, 3, 5, 6, 7, 8, -1 or -2 ; argument was ',option,'.'
     247              : !  ABI_BUG(message)
     248              :  end if
     249              : 
     250              : !Checks the compatibility between the presence of dvxci and ndvxci
     251       317862 :  if(ndvxci /=0 .neqv. present(dvxci))then
     252            0 :    message = ' If ndvxci/=0 there must the optional argument dvxci'
     253            0 :    ABI_BUG(message)
     254              :  end if
     255              : 
     256              : !Checks the compatibility between the inputs and the presence of the optional arguments
     257       317862 :  if(ndvxci /= 0 .and. abs(order) <= 1)then
     258              :    write(message, '(3a,i8,a)' )&
     259            0 : &   'The order does not require the presence of dvxci',ch10,&
     260            0 : &   'that is allowed when |order|>1, while we have',order,'.'
     261            0 :    ABI_BUG(message)
     262              :  end if
     263              : 
     264       317862 :  if(ndvxci /= 0 .and. (&
     265              : & ((option == 1 .or. option == -1 .or. option == 3) .and. ndvxci /= nspden + 1)&
     266              : & .or. (option == -2 .and. ndvxci /= 8)&
     267              : & .or. ((option == 2 .or. option == 5 .or. option == 6 .or. option == 7 .or. option == 8) .and. ndvxci /= 15)&
     268              : & ))then
     269              :    write(message, '(12a,4(a,i5))' )&
     270            0 : &   '  The option is not consistent with the value of ndvxci',ch10,&
     271            0 : &   '  Allowed values are:',ch10,&
     272            0 : &   '  ndvxci     option',ch10,&
     273            0 : &   ' nspden+1    1,-1,3',ch10,&
     274            0 : &   '    8          -2',ch10,&
     275            0 : &   '    15       2, 5,6,7',ch10,&
     276            0 : &   '  While we have: ndvxc=',ndvxci,', option=',option,', nspden=',nspden,', order=',order
     277            0 :    ABI_BUG(message)
     278              :  end if
     279              : 
     280       317862 :  if ((option == 1 .or. option == -1 .or. option ==3) .and.  (present(grho2_updn) .or. present(dvxcdgr))) then
     281              :    write(message, '(a,a,a,i6,a)' )&
     282            0 : &   'The option chosen does not need the presence',ch10,&
     283            0 : &   'of the gradient, or of the array dvxcdgr in the input, needed if option/=1,-1,3 , while we have',option,'.'
     284            0 :    ABI_BUG(message)
     285              :  end if
     286              : 
     287       317862 :  if (order /= 3 .and. present(d2vxci)) then
     288              :    write(message, '(a,a,a,i6,a)' )&
     289            0 : &   'The order chosen does not need the presence',ch10,&
     290            0 : &   'of the array d2vxci, needed if order=3 , while we have',order,'.'
     291            0 :    ABI_BUG(message)
     292              :  end if
     293              : 
     294       317862 :  if(initialized==0)then
     295          420 :    twom1_3=two**(-third)
     296          420 :    sixpi2_1_3=(six*pi**2)**third
     297          420 :    sixpi2m1_3=one/sixpi2_1_3
     298          420 :    threefourth_divpi=three_quarters*piinv
     299          420 :    gamma=(one-log(two))*piinv**2
     300          420 :    gamma_inv=one/gamma
     301          420 :    beta_gamma=beta*gamma_inv
     302          420 :    factf_zeta= one / ( two**(four/three)-two )
     303          420 :    factfp_zeta= four_thirds * factf_zeta * alpha_zeta2
     304          420 :    coeff_tt= one/ (four*four*piinv*(three*pi**2)**third)
     305              : !  coeff_tt= two * sqrt(four*piinv*(three*pi**2)**third)
     306          420 :    sq_rsfac=sqrt(rsfac)
     307          420 :    sq_rsfac_inv=one/sq_rsfac
     308          420 :    initialized=1
     309              :  end if
     310              : 
     311              : !Parameters for the Perdew-Wang 92 LSD as well as LSD-RPA,
     312              : !see Table I of Phys.Rev.B 45,13244 (1992) [[cite:Perdew1992]]
     313              : !GMR (to match Libxc one should comment the next line and uncomment the following two)
     314       317862 :  ec0_aa=0.031091_dp  ; ec1_aa=0.015545_dp ; mac_aa=0.016887_dp
     315              : !ec0_aa=0.0310907_dp  ; ec1_aa=0.01554535_dp ; mac_aa=0.0168869_dp
     316              : !GMR
     317       317862 :  if(option/=3 .and. option/=4)then
     318              :    ec0_a1=0.21370_dp  ; ec1_a1=0.20548_dp  ; mac_a1=0.11125_dp
     319              :    ec0_b1=7.5957_dp   ; ec1_b1=14.1189_dp  ; mac_b1=10.357_dp
     320              :    ec0_b2=3.5876_dp   ; ec1_b2=6.1977_dp   ; mac_b2=3.6231_dp
     321              :    ec0_b3=1.6382_dp   ; ec1_b3=3.3662_dp   ; mac_b3=0.88026_dp
     322              :    ec0_b4=0.49294_dp  ; ec1_b4=0.62517_dp  ; mac_b4=0.49671_dp
     323              :  else  ! RPA values
     324            0 :    ec0_a1=0.082477_dp ; ec1_a1=0.035374_dp ; mac_a1=0.028829_dp
     325            0 :    ec0_b1=5.1486_dp   ; ec1_b1=6.4869_dp   ; mac_b1=10.357_dp
     326            0 :    ec0_b2=1.6483_dp   ; ec1_b2=1.3083_dp   ; mac_b2=3.6231_dp
     327            0 :    ec0_b3=0.23647_dp  ; ec1_b3=0.11518_dp  ; mac_b3=0.479_dp
     328            0 :    ec0_b4=0.20614_dp  ; ec1_b4=0.082349_dp ; mac_b4=0.112279_dp
     329              :  end if
     330              : 
     331              :  if(option/=5 .and. option/=-4)then
     332              :    kappa=kappa_pbe
     333              :    mu_divkappa=mu_divkappa_pbe
     334              :  end if
     335       317862 :  if(option==5)then
     336          492 :    kappa=kappa_revpbe
     337          492 :    mu_divkappa=mu_divkappa_revpbe
     338              :  end if
     339       317862 :  if(option==-4)then
     340          742 :    kappa=kappa_c09
     341              :  end if
     342              : !DEBUG
     343              : !Finite-difference debugging, do not take away
     344              : !Note : here work with collinear gradients. Might be generalized ...
     345              : !debug=2  ! Choose 1 (rho grads) or 2 (grho grads)
     346              : !if(order==3)debug=1
     347              : !factor=1.0_dp
     348              : !zeta_mean=0.98_dp
     349              : !!zeta_mean=zero
     350              : !delta=0.000025*factor
     351              : !delta=0.0000125*factor
     352              : !if(debug/=0)then
     353              : !do ipts=1,npts-4,5
     354              : !rho=ipts*0.01_dp*factor
     355              : !rho_up=rho*(1.0_dp+zeta_mean)*0.5_dp
     356              : !rho_dn=rho*(1.0_dp-zeta_mean)*0.5_dp
     357              : !rho_upp=rho_up+delta
     358              : !rho_upm=rho_up-delta
     359              : !rho_dnp=rho_dn+delta
     360              : !rho_dnm=rho_dn-delta
     361              : !! Here, vary rho
     362              : !if(debug==1)then
     363              : !rho_updn(ipts  ,1)=rho_up ; rho_updn(ipts  ,2)=rho_dn
     364              : !rho_updn(ipts+1,1)=rho_upp; rho_updn(ipts+1,2)=rho_dn
     365              : !rho_updn(ipts+2,1)=rho_upm; rho_updn(ipts+2,2)=rho_dn
     366              : !rho_updn(ipts+3,1)=rho_up ; rho_updn(ipts+3,2)=rho_dnp
     367              : !rho_updn(ipts+4,1)=rho_up ; rho_updn(ipts+4,2)=rho_dnm
     368              : !grho2_updn(ipts:ipts+4,1)=(0.2_dp*factor)**2     ! grad2 of spin up density
     369              : !grho2_updn(ipts:ipts+4,2)=(0.2_dp*factor)**2     ! grad2 of spin down density
     370              : !grho2_updn(ipts:ipts+4,3)=(0.3_dp*factor)**2     ! grad2 of total density
     371              : !else
     372              : !!  Here, vary grho (interchange rho and grho)
     373              : !grho2_updn(ipts  ,1)=rho_up**2 ; grho2_updn(ipts  ,2)=rho_dn**2
     374              : !grho2_updn(ipts+1,1)=rho_upp**2; grho2_updn(ipts+1,2)=rho_dn**2
     375              : !grho2_updn(ipts+2,1)=rho_upm**2; grho2_updn(ipts+2,2)=rho_dn**2
     376              : !grho2_updn(ipts+3,1)=rho_up**2 ; grho2_updn(ipts+3,2)=rho_dnp**2
     377              : !grho2_updn(ipts+4,1)=rho_up**2 ; grho2_updn(ipts+4,2)=rho_dnm**2
     378              : !grho2_updn(ipts  ,3)=(ipts*0.01_dp*factor)**2
     379              : !grho2_updn(ipts+1,3)=(ipts*0.01_dp*factor+delta)**2
     380              : !grho2_updn(ipts+2,3)=(ipts*0.01_dp*factor-delta)**2
     381              : !grho2_updn(ipts+3,3)=(ipts*0.01_dp*factor+delta)**2   ! identical to ipts+1
     382              : !grho2_updn(ipts+4,3)=(ipts*0.01_dp*factor-delta)**2   ! identical to ipts+2
     383              : !rho_updn(ipts:ipts+4,1)=0.2_dp*factor*(1.0_dp+zeta_mean)*0.5_dp    ! spin up density
     384              : !rho_updn(ipts:ipts+4,2)=0.2_dp*factor*(1.0_dp-zeta_mean)*0.5_dp    ! spin down density
     385              : !end if
     386              : !end do
     387              : !end if
     388              : !Usual option :
     389              : !nspden=2 ; order=2
     390              : !GGA
     391              : !nspden=2 ; order=1
     392              : !Might take also, although finite difference later is meaningless
     393              : !nspden=1 ; order=-2
     394              : !Here, alternative specification, in terms of defined rs and zeta
     395              : !do ipts=1,5
     396              : !if(ipts==1)then ;rs=0.01_dp ; zeta=0.98_dp ; endif
     397              : !if(ipts==2)then ;rs=0.01_dp+delta ; zeta=0.98_dp ; endif
     398              : !if(ipts==3)then ;rs=0.01_dp-delta ; zeta=0.98_dp ; endif
     399              : !if(ipts==4)then ;rs=0.01_dp ; zeta=0.98_dp+delta ; endif
     400              : !if(ipts==5)then ;rs=0.01_dp ; zeta=0.98_dp-delta ; endif
     401              : !rho=(rsfac/rs)**3
     402              : !rho_up=rho*(1.0_dp+zeta)*0.5_dp
     403              : !rho_dn=rho*(1.0_dp-zeta)*0.5_dp
     404              : !rho_updn(ipts  ,1)=rho_up ; rho_updn(ipts  ,2)=rho_dn
     405              : !enddo
     406              : !ENDDEBUG
     407              : 
     408       317862 :  if(order**2 >1)then
     409        50438 :    factfpp_zeta= third * factfp_zeta * alpha_zeta2
     410              :  end if
     411              : 
     412              : 
     413       953586 :  ABI_MALLOC(rhoarr,(npts))
     414       635724 :  ABI_MALLOC(rhom1_3,(npts))
     415       953586 :  ABI_MALLOC(rho_updnm1_3,(npts,2))
     416       635724 :  ABI_MALLOC(zetm,(npts))
     417       635724 :  ABI_MALLOC(zetmm1_3,(npts))
     418       635724 :  ABI_MALLOC(zetp,(npts))
     419       635724 :  ABI_MALLOC(zetpm1_3,(npts))
     420              : 
     421       800903 :  do ispden=1,nspden
     422       800903 :    call invcb(rho_updn(:,ispden),rho_updnm1_3(:,ispden),npts)
     423              :  end do
     424              : 
     425              : 
     426       317862 :  if(nspden==1)then
     427    401829111 :    rhoarr(:)=two*rho_updn(:,1)
     428    401829111 :    rhom1_3(:)=twom1_3*rho_updnm1_3(:,1)
     429    401829111 :    rho_updnm1_3(:,2)=rho_updnm1_3(:,1)
     430              :  else
     431    214781358 :    rhoarr(:)=rho_updn(:,1)+rho_updn(:,2)
     432       165179 :    call invcb(rhoarr,rhom1_3,npts)
     433    214781358 :    do ipts=1,npts
     434    214616179 :      rhotmot=rhom1_3(ipts)
     435    214616179 :      rhotot_inv=rhotmot*rhotmot*rhotmot
     436    214616179 :      zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
     437    214616179 :      zetp(ipts)=1.0_dp+zeta*alpha_zeta
     438    214781358 :      zetm(ipts)=1.0_dp-zeta*alpha_zeta
     439              :    end do
     440       165179 :    call invcb(zetp,zetpm1_3,npts)
     441       165179 :    call invcb(zetm,zetmm1_3,npts)
     442              :  end if
     443              : 
     444              : 
     445              : !fab: eliminate the following restriction
     446              : 
     447              : !if (order==3 .and. nspden == 1) d2vxci(:,:)=0._dp
     448              : 
     449              : 
     450     10514975 :  if (order==3) d2vxci(:,:)=0._dp
     451              : 
     452              : !!!Loop unrolling summary
     453              : !Completely unrolled for spin non-polarized case
     454              : !To be optimized for spin-polarized cases
     455              : !The loops are unrolled as follows:
     456              : !nspden=1     (line 433)
     457              : !order^2<=1  (line 460)
     458              : !option=2,5 (line 462)
     459              : !option=6,7 (line 630)
     460              : !option=-1  (line 825)
     461              : !option=-2  (line 853)
     462              : !option=1   (line 904)
     463              : !option=3   (line 963)
     464              : !order=3     (line 1024)
     465              : !option=2,5
     466              : !option=6,7
     467              : !option=-1
     468              : !option=-2
     469              : !option=1
     470              : !option=3
     471              : !order=-2    (line 1983)
     472              : !option=2,5
     473              : !option=6,7
     474              : !option=-1
     475              : !option=-2
     476              : !option=1
     477              : !option=3
     478              : !order^2>1   (line 2875)
     479              : !option=2,5
     480              : !option=6,7
     481              : !option=-1
     482              : !option=-2
     483              : !option=1
     484              : !option=3
     485              : !nspden=2     (line 3750)
     486              : !order^2<=1  (line 3754)
     487              : !order^2>1 (with if statements inside distinguishing between order=3 or -2)   (line 4000)
     488              : !!!End loop unrolling summary
     489              : 
     490              : !we separate different cases, depending on nspden
     491       317862 :  if (nspden==1) then
     492              : !  we separate different cases, depending on order
     493       152683 :    if (order**2<=1) then
     494              : !    we separate different cases, depending on option
     495       122896 :      if(option==2 .or. option==5)then
     496              : 
     497     92746789 :        do ipts=1,npts
     498              : 
     499     92707036 :          rhotot=rhoarr(ipts)
     500     92707036 :          rhotmot=rhom1_3(ipts)
     501     92707036 :          rhotot_inv=rhotmot*rhotmot*rhotmot
     502     92707036 :          rhotmo6=sqrt(rhotmot)
     503     92707036 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     504              : !        -----------------------------------------------------------------------
     505              : !        First take care of the exchange part of the functional
     506              : 
     507     92707036 :          exc=zero
     508     92707036 :          dvxcdgr(ipts,3)=zero
     509              : !        loop over the spin
     510     92707036 :          ispden=1
     511     92707036 :          rho   =rho_updn(ipts,ispden)
     512     92707036 :          rhomot=rho_updnm1_3(ipts,ispden)
     513     92707036 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     514              : !        Perdew-Burke-Ernzerhof GGA, exchange part
     515     92707036 :          rho_inv=rhomot*rhomot*rhomot
     516     92707036 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
     517     92707036 :          ss=grho2_updn(ipts,ispden)*coeffss
     518     92707036 :          divss=one/(one+mu_divkappa*ss)
     519     92707036 :          dfxdss= mu*divss*divss
     520     92707036 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
     521     92707036 :          fx    = one+kappa*(one-divss)
     522     92707036 :          ex_gga= ex_lsd*fx
     523     92707036 :          dssdn=-eight*third*ss*rho_inv
     524     92707036 :          dfxdn  = dfxdss*dssdn
     525     92707036 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
     526              : !        The new definition (v3.3) includes the division by the norm of the gradient
     527     92707036 :          dssdg =two*coeffss
     528     92707036 :          dfxdg=dfxdss*dssdg
     529     92707036 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
     530     92707036 :          exc=exc+ex_gga*rho
     531              : 
     532              : !        end of loop over the spin
     533              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
     534     92707036 :          exc=exc*2
     535     92707036 :          exci(ipts)=exc*rhotot_inv
     536     92707036 :          if(exexch_==1) cycle
     537              : !        -----------------------------------------------------------------------------
     538              : !        Then takes care of the LSD correlation part of the functional
     539              : 
     540              : 
     541     92707036 :          rs=rsfac*rhotmot
     542     92707036 :          sqr_rs=sq_rsfac*rhotmo6
     543     92707036 :          rsm1_2=sq_rsfac_inv*rhoto6
     544              : 
     545              : !        Formulas A6-A8 of PW92LSD
     546     92707036 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
     547     92707036 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
     548     92707036 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
     549     92707036 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
     550              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
     551     92707036 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
     552     92707036 :          ecrs0=ec0_q0*ec0_log
     553     92707036 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
     554              : 
     555     92707036 :          ecrs=ecrs0
     556     92707036 :          decrs_drs=decrs0_drs
     557     92707036 :          decrs_dzeta=0.0_dp
     558     92707036 :          zeta=0.0_dp
     559              : 
     560              : !        Add LSD correlation functional to GGA exchange functional
     561     92707036 :          exci(ipts)=exci(ipts)+ecrs
     562     92707036 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
     563              : 
     564              : 
     565              : !        -----------------------------------------------------------------------------
     566              : !        Eventually add the GGA correlation part of the PBE functional
     567              : !        Note : the computation of the potential in the spin-unpolarized
     568              : !        case could be optimized much further. Other optimizations are left to do.
     569              : 
     570     92707036 :          phi_zeta=1.0_dp
     571     92707036 :          phip_zeta=0.0_dp
     572     92707036 :          phi_zeta_inv=1.0_dp
     573     92707036 :          phi_logder=0.0_dp
     574     92707036 :          phi3_zeta=1.0_dp
     575     92707036 :          gamphi3inv=gamma_inv
     576     92707036 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
     577              : 
     578              : !        From ec to bb
     579     92707036 :          bb=ecrs*gamphi3inv
     580     92707036 :          dbb_drs=decrs_drs*gamphi3inv
     581     92707036 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
     582              : 
     583              : !        From bb to cc
     584     92707036 :          exp_pbe=exp(-bb)
     585     92707036 :          cc=one/(exp_pbe-one)
     586     92707036 :          dcc_dbb=cc*cc*exp_pbe
     587     92707036 :          dcc_drs=dcc_dbb*dbb_drs
     588     92707036 :          dcc_dzeta=dcc_dbb*dbb_dzeta
     589              : 
     590              : !        From cc to aa
     591     92707036 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
     592     92707036 :          aa=coeff_aa*cc
     593     92707036 :          daa_drs=coeff_aa*dcc_drs
     594     92707036 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
     595              : 
     596              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
     597     92707036 :          grrho2=four*grho2_updn(ipts,1)
     598     92707036 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
     599              : !        Note that tt is (the t variable of PBE divided by phi) squared
     600     92707036 :          tt=half*grrho2*dtt_dg
     601              : 
     602              : !        Get xx from aa and tt
     603     92707036 :          xx=aa*tt
     604     92707036 :          dxx_drs=daa_drs*tt
     605     92707036 :          dxx_dzeta=daa_dzeta*tt
     606     92707036 :          dxx_dtt=aa
     607              : 
     608              : !        From xx to pade
     609     92707036 :          pade_den=one/(one+xx*(one+xx))
     610     92707036 :          pade=(one+xx)*pade_den
     611     92707036 :          dpade_dxx=-xx*(two+xx)*pade_den**2
     612     92707036 :          dpade_drs=dpade_dxx*dxx_drs
     613     92707036 :          dpade_dtt=dpade_dxx*dxx_dtt
     614     92707036 :          dpade_dzeta=dpade_dxx*dxx_dzeta
     615              : 
     616              : !        From pade to qq
     617     92707036 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
     618     92707036 :          qq=coeff_qq*pade
     619     92707036 :          dqq_drs=coeff_qq*dpade_drs
     620     92707036 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
     621     92707036 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
     622              : 
     623              : !        From qq to rr
     624     92707036 :          arg_rr=one+beta*gamma_inv*qq
     625     92707036 :          div_rr=one/arg_rr
     626     92707036 :          rr=gamma*log(arg_rr)
     627     92707036 :          drr_dqq=beta*div_rr
     628     92707036 :          drr_drs=drr_dqq*dqq_drs
     629     92707036 :          drr_dtt=drr_dqq*dqq_dtt
     630     92707036 :          drr_dzeta=drr_dqq*dqq_dzeta
     631              : 
     632              : !        From rr to hh
     633     92707036 :          hh=phi3_zeta*rr
     634     92707036 :          dhh_drs=phi3_zeta*drr_drs
     635     92707036 :          dhh_dtt=phi3_zeta*drr_dtt
     636     92707036 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
     637              : 
     638              : !        The GGA correlation energy is added
     639     92707036 :          exci(ipts)=exci(ipts)+hh
     640              : 
     641              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
     642              : 
     643              : !        From hh to the derivative of the energy wrt the density
     644     92707036 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
     645     92707036 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
     646              : 
     647              : !        From hh to the derivative of the energy wrt to the gradient of the
     648              : !        density, divided by the gradient of the density
     649              : !        (The v3.3 definition includes the division by the norm of the gradient)
     650     92707036 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
     651              : 
     652              : !        End condition of GGA
     653              : 
     654              : !        Correlation has been added
     655              : !        -----------------------------------------------------------------------------
     656              : 
     657              : !        vxci(ipts,2)=vxci(ipts,1)
     658     92746789 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     659              : 
     660              :        end do
     661              :      else if((option==6) .or. (option==7)) then
     662              : 
     663      3449693 :        do ipts=1,npts
     664              : 
     665      3448704 :          rhotot=rhoarr(ipts)
     666      3448704 :          rhotmot=rhom1_3(ipts)
     667      3448704 :          rhotot_inv=rhotmot*rhotmot*rhotmot
     668      3448704 :          rhotmo6=sqrt(rhotmot)
     669      3448704 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     670              : !        -----------------------------------------------------------------------
     671              : !        First take care of the exchange part of the functional
     672              : 
     673      3448704 :          exc=zero
     674      3448704 :          dvxcdgr(ipts,3)=zero
     675              : !        loop over the spin
     676      3448704 :          ispden=1
     677      3448704 :          rho   =rho_updn(ipts,ispden)
     678      3448704 :          rhomot=rho_updnm1_3(ipts,ispden)
     679      3448704 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     680              : !        Perdew-Burke-Ernzerhof GGA, exchange part
     681      3448704 :          rho_inv=rhomot*rhomot*rhomot
     682      3448704 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
     683      3448704 :          ss=grho2_updn(ipts,ispden)*coeffss
     684              : 
     685              : !        This is RPBE modification
     686      3448704 :          if (option==6) then
     687      1333632 :            divss=exp(-mu_divkappa*ss)
     688      1333632 :            dfxdss= mu*divss
     689      1333632 :            d2fxdss2=-mu*mu_divkappa*divss
     690              : 
     691      1333632 :            fx    = one+kappa*(one-divss)
     692      1333632 :            ex_gga= ex_lsd*fx
     693      1333632 :            dssdn=-eight*third*ss*rho_inv
     694      1333632 :            dfxdn  = dfxdss*dssdn
     695      1333632 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
     696              : !          The new definition (v3.3) includes the division by the norm of the gradient
     697      1333632 :            dssdg =two*coeffss
     698      1333632 :            dfxdg=dfxdss*dssdg
     699      1333632 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
     700      1333632 :            exc=exc+ex_gga*rho
     701              : !          This is the Wu and Cohen modification
     702              :          else
     703      2115072 :            expss=exp(-ss)
     704      2115072 :            p1_wc=b_wc+(mu-b_wc)*(one-ss)*expss+two*c_wc*ss/(one+c_wc*ss*ss)
     705              :            p2_wc=d_wc*(ss-two)*expss+two*c_wc/(one+c_wc*ss*ss)-&
     706      2115072 : &           four*c_wc*c_wc*ss*ss/((one+c_wc*ss*ss)*(one+c_wc*ss*ss))
     707      2115072 :            divss=one/(one+(b_wc*ss+d_wc*ss*expss+log(one+c_wc*ss*ss))/kappa)
     708      2115072 :            dfxdss=p1_wc*divss*divss
     709      2115072 :            d2fxdss2=p2_wc*divss*divss-two*divss*divss*divss*p1_wc*p1_wc/kappa
     710              : 
     711      2115072 :            fx    = one+kappa*(one-divss)
     712      2115072 :            ex_gga= ex_lsd*fx
     713      2115072 :            dssdn=-eight*third*ss*rho_inv
     714      2115072 :            dfxdn  = dfxdss*dssdn
     715      2115072 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
     716              : !          The new definition (v3.3) includes the division by the norm of the gradient
     717      2115072 :            dssdg =two*coeffss
     718      2115072 :            dfxdg=dfxdss*dssdg
     719      2115072 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
     720      2115072 :            exc=exc+ex_gga*rho
     721              :          end if
     722              : 
     723              : !        end of loop over the spin
     724              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
     725      3448704 :          exc=exc*2
     726      3448704 :          exci(ipts)=exc*rhotot_inv
     727      3448704 :          if(exexch_==1) cycle
     728              : !        -----------------------------------------------------------------------------
     729              : !        Then takes care of the LSD correlation part of the functional
     730              : 
     731              : 
     732      3448704 :          rs=rsfac*rhotmot
     733      3448704 :          sqr_rs=sq_rsfac*rhotmo6
     734      3448704 :          rsm1_2=sq_rsfac_inv*rhoto6
     735              : 
     736              : !        Formulas A6-A8 of PW92LSD
     737      3448704 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
     738      3448704 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
     739      3448704 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
     740      3448704 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
     741              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
     742      3448704 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
     743      3448704 :          ecrs0=ec0_q0*ec0_log
     744      3448704 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
     745              : 
     746      3448704 :          ecrs=ecrs0
     747      3448704 :          decrs_drs=decrs0_drs
     748      3448704 :          decrs_dzeta=0.0_dp
     749      3448704 :          zeta=0.0_dp
     750              : 
     751              : !        Add LSD correlation functional to GGA exchange functional
     752      3448704 :          exci(ipts)=exci(ipts)+ecrs
     753      3448704 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
     754              : 
     755              : 
     756              : !        -----------------------------------------------------------------------------
     757              : !        Eventually add the GGA correlation part of the PBE functional
     758              : !        Note : the computation of the potential in the spin-unpolarized
     759              : !        case could be optimized much further. Other optimizations are left to do.
     760              : 
     761      3448704 :          phi_zeta=1.0_dp
     762      3448704 :          phip_zeta=0.0_dp
     763      3448704 :          phi_zeta_inv=1.0_dp
     764      3448704 :          phi_logder=0.0_dp
     765      3448704 :          phi3_zeta=1.0_dp
     766      3448704 :          gamphi3inv=gamma_inv
     767      3448704 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
     768              : 
     769              : !        From ec to bb
     770      3448704 :          bb=ecrs*gamphi3inv
     771      3448704 :          dbb_drs=decrs_drs*gamphi3inv
     772      3448704 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
     773              : 
     774              : !        From bb to cc
     775      3448704 :          exp_pbe=exp(-bb)
     776      3448704 :          cc=one/(exp_pbe-one)
     777      3448704 :          dcc_dbb=cc*cc*exp_pbe
     778      3448704 :          dcc_drs=dcc_dbb*dbb_drs
     779      3448704 :          dcc_dzeta=dcc_dbb*dbb_dzeta
     780              : 
     781              : !        From cc to aa
     782      3448704 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
     783      3448704 :          aa=coeff_aa*cc
     784      3448704 :          daa_drs=coeff_aa*dcc_drs
     785      3448704 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
     786              : 
     787              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
     788      3448704 :          grrho2=four*grho2_updn(ipts,1)
     789      3448704 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
     790              : !        Note that tt is (the t variable of PBE divided by phi) squared
     791      3448704 :          tt=half*grrho2*dtt_dg
     792              : 
     793              : !        Get xx from aa and tt
     794      3448704 :          xx=aa*tt
     795      3448704 :          dxx_drs=daa_drs*tt
     796      3448704 :          dxx_dzeta=daa_dzeta*tt
     797      3448704 :          dxx_dtt=aa
     798              : 
     799              : !        From xx to pade
     800      3448704 :          pade_den=one/(one+xx*(one+xx))
     801      3448704 :          pade=(one+xx)*pade_den
     802      3448704 :          dpade_dxx=-xx*(two+xx)*pade_den**2
     803      3448704 :          dpade_drs=dpade_dxx*dxx_drs
     804      3448704 :          dpade_dtt=dpade_dxx*dxx_dtt
     805      3448704 :          dpade_dzeta=dpade_dxx*dxx_dzeta
     806              : 
     807              : !        From pade to qq
     808      3448704 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
     809      3448704 :          qq=coeff_qq*pade
     810      3448704 :          dqq_drs=coeff_qq*dpade_drs
     811      3448704 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
     812      3448704 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
     813              : 
     814              : !        From qq to rr
     815      3448704 :          arg_rr=one+beta*gamma_inv*qq
     816      3448704 :          div_rr=one/arg_rr
     817      3448704 :          rr=gamma*log(arg_rr)
     818      3448704 :          drr_dqq=beta*div_rr
     819      3448704 :          drr_drs=drr_dqq*dqq_drs
     820      3448704 :          drr_dtt=drr_dqq*dqq_dtt
     821      3448704 :          drr_dzeta=drr_dqq*dqq_dzeta
     822              : 
     823              : !        From rr to hh
     824      3448704 :          hh=phi3_zeta*rr
     825      3448704 :          dhh_drs=phi3_zeta*drr_drs
     826      3448704 :          dhh_dtt=phi3_zeta*drr_dtt
     827      3448704 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
     828              : 
     829              : !        The GGA correlation energy is added
     830      3448704 :          exci(ipts)=exci(ipts)+hh
     831              : 
     832              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
     833              : 
     834              : !        From hh to the derivative of the energy wrt the density
     835      3448704 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
     836      3448704 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
     837              : 
     838              : !        From hh to the derivative of the energy wrt to the gradient of the
     839              : !        density, divided by the gradient of the density
     840              : !        (The v3.3 definition includes the division by the norm of the gradient)
     841      3448704 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
     842              : 
     843              : !        End condition of GGA
     844              : 
     845              : !        Correlation has been added
     846              : !        -----------------------------------------------------------------------------
     847              : 
     848              : !        vxci(ipts,2)=vxci(ipts,1)
     849      3449693 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     850              : 
     851              :        end do
     852              : 
     853              : 
     854              :      else if (option==-1) then
     855              : 
     856       786630 :        do ipts=1,npts
     857              : 
     858       786432 :          rhotot=rhoarr(ipts)
     859       786432 :          rhotmot=rhom1_3(ipts)
     860       786432 :          rhotot_inv=rhotmot*rhotmot*rhotmot
     861       786432 :          rhotmo6=sqrt(rhotmot)
     862       786432 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     863              : !        -----------------------------------------------------------------------
     864              : !        First take care of the exchange part of the functional
     865              : 
     866       786432 :          exc=zero
     867              : !        loop over the spin
     868       786432 :          ispden=1
     869       786432 :          rho   =rho_updn(ipts,ispden)
     870       786432 :          rhomot=rho_updnm1_3(ipts,ispden)
     871       786432 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     872              : !        Perdew_Wang 91 LSD
     873       786432 :          vxci(ipts,ispden)=four_thirds*ex_lsd
     874       786432 :          exc=exc+ex_lsd*rho
     875              : 
     876              : !        end of loop over the spin
     877              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
     878       786432 :          exc=exc*2
     879       786630 :          exci(ipts)=exc*rhotot_inv
     880              :        end do
     881              : 
     882              :      else if(option==-2) then
     883              : 
     884              : 
     885      4607222 :        do ipts=1,npts
     886              : 
     887      4604924 :          rhotot=rhoarr(ipts)
     888      4604924 :          rhotmot=rhom1_3(ipts)
     889      4604924 :          rhotot_inv=rhotmot*rhotmot*rhotmot
     890      4604924 :          rhotmo6=sqrt(rhotmot)
     891      4604924 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     892              : !        -----------------------------------------------------------------------
     893              : !        First take care of the exchange part of the functional
     894              : 
     895      4604924 :          exc=zero
     896      4604924 :          dvxcdgr(ipts,3)=zero
     897              : !        loop over the spin
     898      4604924 :          ispden=1
     899      4604924 :          rho   =rho_updn(ipts,ispden)
     900      4604924 :          rhomot=rho_updnm1_3(ipts,ispden)
     901      4604924 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     902              : !        Perdew-Burke-Ernzerhof GGA, exchange part
     903      4604924 :          rho_inv=rhomot*rhomot*rhomot
     904      4604924 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
     905      4604924 :          ss=grho2_updn(ipts,ispden)*coeffss
     906      4604924 :          divss=one/(one+mu_divkappa*ss)
     907      4604924 :          dfxdss= mu*divss*divss
     908      4604924 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
     909      4604924 :          fx    = one+kappa*(one-divss)
     910      4604924 :          ex_gga= ex_lsd*fx
     911      4604924 :          dssdn=-eight*third*ss*rho_inv
     912      4604924 :          dfxdn  = dfxdss*dssdn
     913      4604924 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
     914              : !        The new definition (v3.3) includes the division by the norm of the gradient
     915      4604924 :          dssdg =two*coeffss
     916      4604924 :          dfxdg=dfxdss*dssdg
     917      4604924 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
     918      4604924 :          exc=exc+ex_gga*rho
     919              : 
     920              : !        end of loop over the spin
     921              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
     922      4604924 :          exc=exc*2
     923      4604924 :          exci(ipts)=exc*rhotot_inv
     924              : 
     925              : !        Correlation has been added
     926              : !        -----------------------------------------------------------------------------
     927              : 
     928              : !        vxci(ipts,2)=vxci(ipts,1)
     929      4607222 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     930              : 
     931              :        end do
     932              : 
     933              : 
     934              :      else if(option==-4) then
     935              : 
     936              : 
     937      2937998 :        do ipts=1,npts
     938              : 
     939      2937256 :          rhotot=rhoarr(ipts)
     940      2937256 :          rhotmot=rhom1_3(ipts)
     941      2937256 :          rhotot_inv=rhotmot*rhotmot*rhotmot
     942      2937256 :          rhotmo6=sqrt(rhotmot)
     943      2937256 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
     944              : !        -----------------------------------------------------------------------
     945              : !        First take care of the exchange part of the functional
     946              : 
     947      2937256 :          exc=zero
     948      2937256 :          dvxcdgr(ipts,3)=zero
     949              : !        loop over the spin
     950      2937256 :          ispden=1
     951      2937256 :          rho   =rho_updn(ipts,ispden)
     952      2937256 :          rhomot=rho_updnm1_3(ipts,ispden)
     953      2937256 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
     954              : !        VALENTINO R. COOPER C09x GGA, This is an exchange term proposed
     955              : !        to use together with vdw-DF (see above).
     956      2937256 :          rho_inv=rhomot*rhomot*rhomot
     957      2937256 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
     958              : !        the quarter that is lacking is compensated by the grho2_updn in the
     959              : !        next line.
     960      2937256 :          ss=grho2_updn(ipts,ispden)*coeffss
     961      2937256 :          alphs2=alpha_c09*ss
     962              : ! jmb : overflow if alphs2 > 100
     963              :          if (alphs2 > 100.0 ) alphs2=100.0
     964      2937256 :          alphmu=alpha_c09*mu_c09
     965              :          dfxdss= mu_c09*exp(-alphs2)*(one-alphs2)+&
     966      2937256 : &         kappa*alpha_c09*exp(-alphs2/two)/two
     967              :          d2fxdss2=-alphmu*exp(-alphs2)*(two-alphs2)-&
     968      2937256 : &         kappa*(alpha_c09**two)*exp(alphs2/two)/four
     969      2937256 :          fx    = one+mu_c09*ss*exp(-alphs2)+kappa*(one-exp(-alphs2/two))
     970      2937256 :          ex_gga= ex_lsd*fx
     971      2937256 :          dssdn=-eight*third*ss*rho_inv
     972      2937256 :          dfxdn  = dfxdss*dssdn
     973      2937256 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
     974              : !
     975              : !        The new definition (v3.3) includes the division by the norm of the gradient
     976      2937256 :          dssdg =two*coeffss
     977      2937256 :          dfxdg=dfxdss*dssdg
     978      2937256 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg !here also
     979      2937256 :          exc=exc+ex_gga*rho
     980              : 
     981              : !        end of loop over the spin
     982              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
     983      2937256 :          exc=exc*2
     984      2937256 :          exci(ipts)=exc*rhotot_inv
     985              : 
     986              : !        Correlation has been added
     987              : !        -----------------------------------------------------------------------------
     988              : 
     989              : !        vxci(ipts,2)=vxci(ipts,1)
     990      2937998 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
     991              : 
     992              :        end do
     993              : 
     994              : 
     995              :      else if(option==1)then
     996              : 
     997              : 
     998    196598392 :        do ipts=1,npts
     999              : 
    1000    196519476 :          rhotot=rhoarr(ipts)
    1001    196519476 :          rhotmot=rhom1_3(ipts)
    1002    196519476 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1003    196519476 :          rhotmo6=sqrt(rhotmot)
    1004    196519476 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1005              : !        -----------------------------------------------------------------------
    1006              : !        First take care of the exchange part of the functional
    1007              : 
    1008    196519476 :          exc=zero
    1009              : !        loop over the spin
    1010    196519476 :          ispden=1
    1011    196519476 :          rho   =rho_updn(ipts,ispden)
    1012    196519476 :          rhomot=rho_updnm1_3(ipts,ispden)
    1013    196519476 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1014              : !        Perdew_Wang 91 LSD
    1015    196519476 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    1016    196519476 :          exc=exc+ex_lsd*rho
    1017              : 
    1018              : !        end of loop over the spin
    1019              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1020    196519476 :          exc=exc*2
    1021    196519476 :          exci(ipts)=exc*rhotot_inv
    1022              : !        -----------------------------------------------------------------------------
    1023              : !        Then takes care of the LSD correlation part of the functional
    1024              : 
    1025              : 
    1026    196519476 :          rs=rsfac*rhotmot
    1027    196519476 :          sqr_rs=sq_rsfac*rhotmo6
    1028    196519476 :          rsm1_2=sq_rsfac_inv*rhoto6
    1029              : 
    1030              : !        Formulas A6-A8 of PW92LSD
    1031    196519476 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    1032    196519476 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    1033    196519476 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    1034    196519476 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    1035              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    1036    196519476 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    1037    196519476 :          ecrs0=ec0_q0*ec0_log
    1038    196519476 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    1039              : 
    1040    196519476 :          ecrs=ecrs0
    1041    196519476 :          decrs_drs=decrs0_drs
    1042    196519476 :          decrs_dzeta=0.0_dp
    1043    196519476 :          zeta=0.0_dp
    1044              : 
    1045              : !        Add LSD correlation functional to GGA exchange functional
    1046    196519476 :          exci(ipts)=exci(ipts)+ecrs
    1047    196598392 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    1048              : 
    1049              : !        Correlation has been added
    1050              : !        -----------------------------------------------------------------------------
    1051              : 
    1052              :        end do
    1053              : 
    1054              :      else if (option==3) then
    1055            0 :        do ipts=1,npts
    1056              : 
    1057            0 :          rhotot=rhoarr(ipts)
    1058            0 :          rhotmot=rhom1_3(ipts)
    1059            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1060            0 :          rhotmo6=sqrt(rhotmot)
    1061            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1062              : !        -----------------------------------------------------------------------
    1063              : !        First take care of the exchange part of the functional
    1064              : 
    1065            0 :          exc=zero
    1066              : !        loop over the spin
    1067            0 :          ispden=1
    1068            0 :          rho   =rho_updn(ipts,ispden)
    1069            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    1070            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1071              : !        Perdew_Wang 91 LSD
    1072            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    1073            0 :          exc=exc+ex_lsd*rho
    1074              : 
    1075              : !        end of loop over the spin
    1076              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1077            0 :          exc=exc*2
    1078            0 :          exci(ipts)=exc*rhotot_inv
    1079              : !        -----------------------------------------------------------------------------
    1080              : !        Then takes care of the LSD correlation part of the functional
    1081              : 
    1082              : 
    1083            0 :          rs=rsfac*rhotmot
    1084            0 :          sqr_rs=sq_rsfac*rhotmo6
    1085            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    1086              : 
    1087              : !        Formulas A6-A8 of PW92LSD
    1088            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    1089            0 :          sqr_sqr_rs=max(1.e-15_dp,sqrt(sqr_rs))
    1090            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs/sqr_sqr_rs)
    1091            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+3.5_dp*ec0_b4*rs/sqr_sqr_rs)
    1092            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    1093              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    1094            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    1095            0 :          ecrs0=ec0_q0*ec0_log
    1096            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    1097              : 
    1098            0 :          ecrs=ecrs0
    1099            0 :          decrs_drs=decrs0_drs
    1100            0 :          decrs_dzeta=0.0_dp
    1101            0 :          zeta=0.0_dp
    1102              : 
    1103              : !        Add LSD correlation functional to GGA exchange functional
    1104            0 :          exci(ipts)=exci(ipts)+ecrs
    1105            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    1106              : 
    1107              : !        Correlation has been added
    1108              : !        -----------------------------------------------------------------------------
    1109              : 
    1110              :        end do
    1111              : 
    1112              : 
    1113              :      end if
    1114              : 
    1115        29787 :    else if (order==3) then
    1116              : !    separate cases with respect to option
    1117          629 :      if(option==2 .or. option==5) then
    1118              : 
    1119            0 :        do ipts=1,npts
    1120              : 
    1121            0 :          rhotot=rhoarr(ipts)
    1122            0 :          rhotmot=rhom1_3(ipts)
    1123            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1124            0 :          rhotmo6=sqrt(rhotmot)
    1125            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1126              : !        -----------------------------------------------------------------------
    1127              : !        First take care of the exchange part of the functional
    1128              : 
    1129            0 :          exc=zero
    1130            0 :          dvxcdgr(ipts,3)=zero
    1131              : !        loop over the spin
    1132            0 :          ispden=1
    1133            0 :          rho   =rho_updn(ipts,ispden)
    1134            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    1135            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1136              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    1137            0 :          rho_inv=rhomot*rhomot*rhomot
    1138            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    1139            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    1140            0 :          divss=one/(one+mu_divkappa*ss)
    1141            0 :          dfxdss= mu*divss*divss
    1142            0 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    1143            0 :          fx    = one+kappa*(one-divss)
    1144            0 :          ex_gga= ex_lsd*fx
    1145            0 :          dssdn=-eight*third*ss*rho_inv
    1146            0 :          dfxdn  = dfxdss*dssdn
    1147            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    1148              : !        The new definition (v3.3) includes the division by the norm of the gradient
    1149            0 :          dssdg =two*coeffss
    1150            0 :          dfxdg=dfxdss*dssdg
    1151            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    1152            0 :          exc=exc+ex_gga*rho
    1153              : 
    1154              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    1155              : !        Components 3 or 4
    1156            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    1157              : !        Components 1 or 2
    1158            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    1159            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    1160              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    1161            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    1162              : !        Components 5 or 6
    1163            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    1164            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    1165            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    1166              : !        Components 7 or 8
    1167            0 :          d2fxdg2=d2fxdss2*dssdg**2
    1168            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    1169              : !        For the time being, treat non-spin-polarized like spin-polarized
    1170            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    1171            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    1172            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    1173            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    1174              : 
    1175              : !        end of loop over the spin
    1176              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1177            0 :          exc=exc*2
    1178            0 :          exci(ipts)=exc*rhotot_inv
    1179              : !        -----------------------------------------------------------------------------
    1180              : !        Then takes care of the LSD correlation part of the functional
    1181              : 
    1182              : 
    1183            0 :          rs=rsfac*rhotmot
    1184            0 :          sqr_rs=sq_rsfac*rhotmo6
    1185            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    1186              : 
    1187              : !        Formulas A6-A8 of PW92LSD
    1188            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    1189            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    1190            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    1191            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    1192              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    1193            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    1194            0 :          ecrs0=ec0_q0*ec0_log
    1195            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    1196            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    1197              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    1198              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    1199            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    1200            0 :          ec0_q1ppp = 0.75_dp*ec0_aa*(rsm1_2**5)*(ec0_b1-ec0_b3*rs)
    1201            0 :          ec0_f1 = 1._dp/(ec0_q1*ec0_q1*(1._dp + ec0_q1))
    1202            0 :          ec0_f2 = 1._dp/(ec0_q1*(1+ec0_q1))
    1203              :          d3ecrs0_drs3 = 6._dp*ec0_q1p*ec0_f1*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + &
    1204              : &         ec0_q0*ec0_q1pp) - &
    1205              : &         ec0_f2*(-6._dp*ec0_aa*ec0_a1*ec0_q1pp + ec0_q0*ec0_q1ppp + &
    1206              : &         ec0_f2*(3._dp*ec0_q1p*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + ec0_q0*ec0_q1pp) + &
    1207            0 : &         ec0_f2*2._dp*ec0_q0*(ec0_q1p**3)*(1._dp + 3._dp*ec0_q1*(1._dp + ec0_q1))))
    1208              : 
    1209            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    1210            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    1211            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    1212            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    1213            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    1214            0 :          macrs=mac_q0*mac_log
    1215            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    1216              : 
    1217            0 :          ecrs=ecrs0
    1218            0 :          decrs_drs=decrs0_drs
    1219            0 :          decrs_dzeta=0.0_dp
    1220            0 :          d2ecrs_drs2=d2ecrs0_drs2
    1221            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    1222            0 :          d2ecrs_drsdzeta=zero
    1223            0 :          zeta=0.0_dp
    1224              : 
    1225              : 
    1226              : !        Add LSD correlation functional to GGA exchange functional
    1227            0 :          exci(ipts)=exci(ipts)+ecrs
    1228            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    1229              : 
    1230            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    1231              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    1232            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    1233            0 :          dvxci(ipts,9)=d2ecrs_drho2
    1234            0 :          dvxci(ipts,10)=d2ecrs_drho2
    1235            0 :          dvxci(ipts,11)=d2ecrs_drho2
    1236              : 
    1237              : !        -----------------------------------------------------------------------------
    1238              : !        Eventually add the GGA correlation part of the PBE functional
    1239              : !        Note : the computation of the potential in the spin-unpolarized
    1240              : !        case could be optimized much further. Other optimizations are left to do.
    1241              : 
    1242            0 :          phi_zeta=1.0_dp
    1243            0 :          phip_zeta=0.0_dp
    1244            0 :          phi_zeta_inv=1.0_dp
    1245            0 :          phi_logder=0.0_dp
    1246            0 :          phi3_zeta=1.0_dp
    1247            0 :          gamphi3inv=gamma_inv
    1248            0 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
    1249              : 
    1250              : !        From ec to bb
    1251            0 :          bb=ecrs*gamphi3inv
    1252            0 :          dbb_drs=decrs_drs*gamphi3inv
    1253            0 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    1254            0 :          d2bb_drs2=d2ecrs_drs2*gamphi3inv
    1255            0 :          d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    1256              :          d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    1257            0 : &         12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    1258              : 
    1259              : !        From bb to cc
    1260            0 :          exp_pbe=exp(-bb)
    1261            0 :          cc=one/(exp_pbe-one)
    1262            0 :          dcc_dbb=cc*cc*exp_pbe
    1263            0 :          dcc_drs=dcc_dbb*dbb_drs
    1264            0 :          dcc_dzeta=dcc_dbb*dbb_dzeta
    1265            0 :          d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    1266            0 :          d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    1267            0 :          d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    1268            0 :          d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    1269              : 
    1270              : !        From cc to aa
    1271            0 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    1272            0 :          aa=coeff_aa*cc
    1273            0 :          daa_drs=coeff_aa*dcc_drs
    1274            0 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    1275            0 :          d2aa_drs2=coeff_aa*d2cc_drs2
    1276            0 :          d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    1277              :          d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    1278            0 : &         coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    1279              : 
    1280              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
    1281            0 :          grrho2=four*grho2_updn(ipts,1)
    1282            0 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    1283              : !        Note that tt is (the t variable of PBE divided by phi) squared
    1284            0 :          tt=half*grrho2*dtt_dg
    1285              : 
    1286              : !        Get xx from aa and tt
    1287            0 :          xx=aa*tt
    1288            0 :          dxx_drs=daa_drs*tt
    1289            0 :          dxx_dzeta=daa_dzeta*tt
    1290            0 :          dxx_dtt=aa
    1291            0 :          d2xx_drs2=d2aa_drs2*tt
    1292            0 :          d2xx_drsdzeta=d2aa_drsdzeta*tt
    1293            0 :          d2xx_drsdtt=daa_drs
    1294            0 :          d2xx_dttdzeta=daa_dzeta
    1295            0 :          d2xx_dzeta2=d2aa_dzeta2*tt
    1296              : 
    1297              : !        From xx to pade
    1298            0 :          pade_den=one/(one+xx*(one+xx))
    1299            0 :          pade=(one+xx)*pade_den
    1300            0 :          dpade_dxx=-xx*(two+xx)*pade_den**2
    1301            0 :          dpade_drs=dpade_dxx*dxx_drs
    1302            0 :          dpade_dtt=dpade_dxx*dxx_dtt
    1303            0 :          dpade_dzeta=dpade_dxx*dxx_dzeta
    1304            0 :          d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    1305            0 :          d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    1306            0 :          d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    1307            0 :          d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    1308            0 :          d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    1309            0 :          d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    1310            0 :          d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    1311              : 
    1312              : !        From pade to qq
    1313            0 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    1314            0 :          qq=coeff_qq*pade
    1315            0 :          dqq_drs=coeff_qq*dpade_drs
    1316            0 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    1317            0 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    1318            0 :          d2qq_drs2=coeff_qq*d2pade_drs2
    1319            0 :          d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    1320            0 :          d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    1321            0 :          d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    1322              :          d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    1323            0 : &         coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    1324              :          d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    1325              : &         +six*pade*phi_logder*phi_logder            &
    1326            0 : &         -two*pade*phi_zeta_inv*phipp_zeta)
    1327              : 
    1328              : !        From qq to rr
    1329            0 :          arg_rr=one+beta*gamma_inv*qq
    1330            0 :          div_rr=one/arg_rr
    1331            0 :          rr=gamma*log(arg_rr)
    1332            0 :          drr_dqq=beta*div_rr
    1333            0 :          drr_drs=drr_dqq*dqq_drs
    1334            0 :          drr_dtt=drr_dqq*dqq_dtt
    1335            0 :          drr_dzeta=drr_dqq*dqq_dzeta
    1336            0 :          d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    1337            0 :          d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    1338            0 :          d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    1339            0 :          d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    1340            0 :          d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    1341            0 :          d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    1342            0 :          d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    1343              : 
    1344              : !        From rr to hh
    1345            0 :          hh=phi3_zeta*rr
    1346            0 :          dhh_drs=phi3_zeta*drr_drs
    1347            0 :          dhh_dtt=phi3_zeta*drr_dtt
    1348            0 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    1349            0 :          d2hh_drs2=phi3_zeta*d2rr_drs2
    1350            0 :          d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    1351            0 :          d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    1352            0 :          d2hh_dtt2=phi3_zeta*d2rr_dtt2
    1353            0 :          d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    1354              :          d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    1355              : &         six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    1356            0 : &         +three*phi_zeta*phi_zeta*rr*phipp_zeta
    1357              : 
    1358              : 
    1359              : !        The GGA correlation energy is added
    1360            0 :          exci(ipts)=exci(ipts)+hh
    1361              : 
    1362              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    1363              : 
    1364              : 
    1365              : 
    1366              : !        From hh to the derivative of the energy wrt the density
    1367            0 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    1368            0 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
    1369              : 
    1370              : !        From hh to the derivative of the energy wrt to the gradient of the
    1371              : !        density, divided by the gradient of the density
    1372              : !        (The v3.3 definition includes the division by the norm of the gradient)
    1373            0 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    1374              : 
    1375              :          d2rhohh_drho2=rhotot_inv*&
    1376              : &         (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    1377              : &         +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    1378              : &         +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    1379            0 : &         +two*seven*third*tt*zeta*d2hh_dttdzeta)
    1380              :          d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    1381            0 : &         -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    1382              : 
    1383              : !        Component 12 : first derivative with respect to the gradient
    1384              : !        of the density, div by the grad of the density
    1385            0 :          dvxci(ipts,12)=dvxcdgr(ipts,3)
    1386              : !        Components 9, 10 and 11 : second derivatives with respect to the spin-density
    1387              : !        Note that there is already a contribution from LSDA
    1388              :          dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    1389              : &         ( d2hh_dzeta2*(one-two*zeta) &
    1390            0 : &         -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    1391            0 :          dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    1392              :          dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    1393              : &         ( d2hh_dzeta2*(one+two*zeta) &
    1394            0 : &         +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    1395              : !        Components 13 and 14 : second derivatives with respect to spin density
    1396              : !        and gradient, divided by the gradient
    1397            0 :          dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    1398            0 :          dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    1399              : !        Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    1400              : !        divided by the grad
    1401            0 :          dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    1402              : 
    1403              : 
    1404              : !        End condition of GGA
    1405              : 
    1406              : !        Correlation has been added
    1407              : !        -----------------------------------------------------------------------------
    1408              : 
    1409              : !        vxci(ipts,2)=vxci(ipts,1)
    1410            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    1411              : 
    1412              :        end do
    1413              :      else if ((option==6) .or. (option==7)) then
    1414              : 
    1415            0 :        do ipts=1,npts
    1416              : 
    1417            0 :          rhotot=rhoarr(ipts)
    1418            0 :          rhotmot=rhom1_3(ipts)
    1419            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1420            0 :          rhotmo6=sqrt(rhotmot)
    1421            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1422              : !        -----------------------------------------------------------------------
    1423              : !        First take care of the exchange part of the functional
    1424              : 
    1425            0 :          exc=zero
    1426            0 :          dvxcdgr(ipts,3)=zero
    1427              : !        loop over the spin
    1428            0 :          ispden=1
    1429            0 :          rho   =rho_updn(ipts,ispden)
    1430            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    1431            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1432              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    1433            0 :          rho_inv=rhomot*rhomot*rhomot
    1434            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    1435            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    1436              : 
    1437            0 :          if (option==6) then
    1438            0 :            divss=exp(-mu_divkappa*ss)
    1439            0 :            dfxdss= mu*divss
    1440            0 :            d2fxdss2=-mu*mu_divkappa*divss
    1441              : 
    1442            0 :            fx    = one+kappa*(one-divss)
    1443            0 :            ex_gga= ex_lsd*fx
    1444            0 :            dssdn=-eight*third*ss*rho_inv
    1445            0 :            dfxdn  = dfxdss*dssdn
    1446            0 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    1447              : !          The new definition (v3.3) includes the division by the norm of the gradient
    1448            0 :            dssdg =two*coeffss
    1449            0 :            dfxdg=dfxdss*dssdg
    1450            0 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    1451            0 :            exc=exc+ex_gga*rho
    1452              : !          This is the Wu and Cohen modification
    1453              :          else
    1454            0 :            expss=exp(-ss)
    1455            0 :            p1_wc=b_wc+(mu-b_wc)*(one-ss)*expss+two*c_wc*ss/(one+c_wc*ss*ss)
    1456              :            p2_wc=d_wc*(ss-two)*expss+two*c_wc/(one+c_wc*ss*ss)-&
    1457            0 : &           four*c_wc*c_wc*ss*ss/((one+c_wc*ss*ss)*(one+c_wc*ss*ss))
    1458            0 :            divss=one/(one+(b_wc*ss+d_wc*ss*expss+log(one+c_wc*ss*ss))/kappa)
    1459            0 :            dfxdss=p1_wc*divss*divss
    1460            0 :            d2fxdss2=p2_wc*divss*divss-two*divss*divss*divss*p1_wc*p1_wc/kappa
    1461              : 
    1462            0 :            fx    = one+kappa*(one-divss)
    1463            0 :            ex_gga= ex_lsd*fx
    1464            0 :            dssdn=-eight*third*ss*rho_inv
    1465            0 :            dfxdn  = dfxdss*dssdn
    1466            0 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    1467              : !          The new definition (v3.3) includes the division by the norm of the gradient
    1468            0 :            dssdg =two*coeffss
    1469            0 :            dfxdg=dfxdss*dssdg
    1470            0 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    1471            0 :            exc=exc+ex_gga*rho
    1472              :          end if
    1473              : 
    1474              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    1475              : !        Components 3 or 4
    1476            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    1477              : !        Components 1 or 2
    1478            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    1479            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    1480              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    1481            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    1482              : !        Components 5 or 6
    1483            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    1484            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    1485            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    1486              : !        Components 7 or 8
    1487            0 :          d2fxdg2=d2fxdss2*dssdg**2
    1488            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    1489              : !        For the time being, treat non-spin-polarized like spin-polarized
    1490            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    1491            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    1492            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    1493            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    1494              : 
    1495              : !        end of loop over the spin
    1496              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1497            0 :          exc=exc*2
    1498            0 :          exci(ipts)=exc*rhotot_inv
    1499              : !        -----------------------------------------------------------------------------
    1500              : !        Then takes care of the LSD correlation part of the functional
    1501              : 
    1502              : 
    1503            0 :          rs=rsfac*rhotmot
    1504            0 :          sqr_rs=sq_rsfac*rhotmo6
    1505            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    1506              : 
    1507              : !        Formulas A6-A8 of PW92LSD
    1508            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    1509            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    1510            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    1511            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    1512              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    1513            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    1514            0 :          ecrs0=ec0_q0*ec0_log
    1515            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    1516            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    1517              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    1518              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    1519            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    1520            0 :          ec0_q1ppp = 0.75_dp*ec0_aa*(rsm1_2**5)*(ec0_b1-ec0_b3*rs)
    1521            0 :          ec0_f1 = 1._dp/(ec0_q1*ec0_q1*(1._dp + ec0_q1))
    1522            0 :          ec0_f2 = 1._dp/(ec0_q1*(1+ec0_q1))
    1523              :          d3ecrs0_drs3 = 6._dp*ec0_q1p*ec0_f1*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + &
    1524              : &         ec0_q0*ec0_q1pp) - &
    1525              : &         ec0_f2*(-6._dp*ec0_aa*ec0_a1*ec0_q1pp + ec0_q0*ec0_q1ppp + &
    1526              : &         ec0_f2*(3._dp*ec0_q1p*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + ec0_q0*ec0_q1pp) + &
    1527            0 : &         ec0_f2*2._dp*ec0_q0*(ec0_q1p**3)*(1._dp + 3._dp*ec0_q1*(1._dp + ec0_q1))))
    1528              : 
    1529            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    1530            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    1531            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    1532            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    1533            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    1534            0 :          macrs=mac_q0*mac_log
    1535            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    1536              : 
    1537            0 :          ecrs=ecrs0
    1538            0 :          decrs_drs=decrs0_drs
    1539            0 :          decrs_dzeta=0.0_dp
    1540            0 :          d2ecrs_drs2=d2ecrs0_drs2
    1541            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    1542            0 :          d2ecrs_drsdzeta=zero
    1543            0 :          zeta=0.0_dp
    1544              : 
    1545              : 
    1546              : !        Add LSD correlation functional to GGA exchange functional
    1547            0 :          exci(ipts)=exci(ipts)+ecrs
    1548            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    1549              : 
    1550            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    1551              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    1552            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    1553            0 :          dvxci(ipts,9)=d2ecrs_drho2
    1554            0 :          dvxci(ipts,10)=d2ecrs_drho2
    1555            0 :          dvxci(ipts,11)=d2ecrs_drho2
    1556              : 
    1557              : !        -----------------------------------------------------------------------------
    1558              : !        Eventually add the GGA correlation part of the PBE functional
    1559              : !        Note : the computation of the potential in the spin-unpolarized
    1560              : !        case could be optimized much further. Other optimizations are left to do.
    1561              : 
    1562            0 :          phi_zeta=1.0_dp
    1563            0 :          phip_zeta=0.0_dp
    1564            0 :          phi_zeta_inv=1.0_dp
    1565            0 :          phi_logder=0.0_dp
    1566            0 :          phi3_zeta=1.0_dp
    1567            0 :          gamphi3inv=gamma_inv
    1568            0 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
    1569              : 
    1570              : !        From ec to bb
    1571            0 :          bb=ecrs*gamphi3inv
    1572            0 :          dbb_drs=decrs_drs*gamphi3inv
    1573            0 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    1574            0 :          d2bb_drs2=d2ecrs_drs2*gamphi3inv
    1575            0 :          d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    1576              :          d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    1577            0 : &         12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    1578              : 
    1579              : !        From bb to cc
    1580            0 :          exp_pbe=exp(-bb)
    1581            0 :          cc=one/(exp_pbe-one)
    1582            0 :          dcc_dbb=cc*cc*exp_pbe
    1583            0 :          dcc_drs=dcc_dbb*dbb_drs
    1584            0 :          dcc_dzeta=dcc_dbb*dbb_dzeta
    1585            0 :          d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    1586            0 :          d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    1587            0 :          d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    1588            0 :          d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    1589              : 
    1590              : !        From cc to aa
    1591            0 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    1592            0 :          aa=coeff_aa*cc
    1593            0 :          daa_drs=coeff_aa*dcc_drs
    1594            0 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    1595            0 :          d2aa_drs2=coeff_aa*d2cc_drs2
    1596            0 :          d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    1597              :          d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    1598            0 : &         coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    1599              : 
    1600              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
    1601            0 :          grrho2=four*grho2_updn(ipts,1)
    1602            0 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    1603              : !        Note that tt is (the t variable of PBE divided by phi) squared
    1604            0 :          tt=half*grrho2*dtt_dg
    1605              : 
    1606              : !        Get xx from aa and tt
    1607            0 :          xx=aa*tt
    1608            0 :          dxx_drs=daa_drs*tt
    1609            0 :          dxx_dzeta=daa_dzeta*tt
    1610            0 :          dxx_dtt=aa
    1611            0 :          d2xx_drs2=d2aa_drs2*tt
    1612            0 :          d2xx_drsdzeta=d2aa_drsdzeta*tt
    1613            0 :          d2xx_drsdtt=daa_drs
    1614            0 :          d2xx_dttdzeta=daa_dzeta
    1615            0 :          d2xx_dzeta2=d2aa_dzeta2*tt
    1616              : 
    1617              : !        From xx to pade
    1618            0 :          pade_den=one/(one+xx*(one+xx))
    1619            0 :          pade=(one+xx)*pade_den
    1620            0 :          dpade_dxx=-xx*(two+xx)*pade_den**2
    1621            0 :          dpade_drs=dpade_dxx*dxx_drs
    1622            0 :          dpade_dtt=dpade_dxx*dxx_dtt
    1623            0 :          dpade_dzeta=dpade_dxx*dxx_dzeta
    1624            0 :          d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    1625            0 :          d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    1626            0 :          d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    1627            0 :          d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    1628            0 :          d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    1629            0 :          d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    1630            0 :          d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    1631              : 
    1632              : !        From pade to qq
    1633            0 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    1634            0 :          qq=coeff_qq*pade
    1635            0 :          dqq_drs=coeff_qq*dpade_drs
    1636            0 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    1637            0 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    1638            0 :          d2qq_drs2=coeff_qq*d2pade_drs2
    1639            0 :          d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    1640            0 :          d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    1641            0 :          d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    1642              :          d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    1643            0 : &         coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    1644              :          d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    1645              : &         +six*pade*phi_logder*phi_logder            &
    1646            0 : &         -two*pade*phi_zeta_inv*phipp_zeta)
    1647              : 
    1648              : !        From qq to rr
    1649            0 :          arg_rr=one+beta*gamma_inv*qq
    1650            0 :          div_rr=one/arg_rr
    1651            0 :          rr=gamma*log(arg_rr)
    1652            0 :          drr_dqq=beta*div_rr
    1653            0 :          drr_drs=drr_dqq*dqq_drs
    1654            0 :          drr_dtt=drr_dqq*dqq_dtt
    1655            0 :          drr_dzeta=drr_dqq*dqq_dzeta
    1656            0 :          d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    1657            0 :          d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    1658            0 :          d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    1659            0 :          d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    1660            0 :          d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    1661            0 :          d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    1662            0 :          d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    1663              : 
    1664              : !        From rr to hh
    1665            0 :          hh=phi3_zeta*rr
    1666            0 :          dhh_drs=phi3_zeta*drr_drs
    1667            0 :          dhh_dtt=phi3_zeta*drr_dtt
    1668            0 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    1669            0 :          d2hh_drs2=phi3_zeta*d2rr_drs2
    1670            0 :          d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    1671            0 :          d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    1672            0 :          d2hh_dtt2=phi3_zeta*d2rr_dtt2
    1673            0 :          d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    1674              :          d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    1675              : &         six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    1676            0 : &         +three*phi_zeta*phi_zeta*rr*phipp_zeta
    1677              : 
    1678              : 
    1679              : !        The GGA correlation energy is added
    1680            0 :          exci(ipts)=exci(ipts)+hh
    1681              : 
    1682              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    1683              : 
    1684              : !        From hh to the derivative of the energy wrt the density
    1685            0 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    1686            0 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
    1687              : 
    1688              : !        From hh to the derivative of the energy wrt to the gradient of the
    1689              : !        density, divided by the gradient of the density
    1690              : !        (The v3.3 definition includes the division by the norm of the gradient)
    1691            0 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    1692              : 
    1693              :          d2rhohh_drho2=rhotot_inv*&
    1694              : &         (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    1695              : &         +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    1696              : &         +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    1697            0 : &         +two*seven*third*tt*zeta*d2hh_dttdzeta)
    1698              :          d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    1699            0 : &         -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    1700              : 
    1701              : !        Component 12 : first derivative with respect to the gradient
    1702              : !        of the density, div by the grad of the density
    1703            0 :          dvxci(ipts,12)=dvxcdgr(ipts,3)
    1704              : !        Components 9, 10 and 11 : second derivatives with respect to the spin-density
    1705              : !        Note that there is already a contribution from LSDA
    1706              :          dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    1707              : &         ( d2hh_dzeta2*(one-two*zeta) &
    1708            0 : &         -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    1709            0 :          dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    1710              :          dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    1711              : &         ( d2hh_dzeta2*(one+two*zeta) &
    1712            0 : &         +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    1713              : !        Components 13 and 14 : second derivatives with respect to spin density
    1714              : !        and gradient, divided by the gradient
    1715            0 :          dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    1716            0 :          dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    1717              : !        Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    1718              : !        divided by the grad
    1719            0 :          dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    1720              : 
    1721              : 
    1722              : !        End condition of GGA
    1723              : 
    1724              : 
    1725              : !        Correlation has been added
    1726              : !        -----------------------------------------------------------------------------
    1727              : 
    1728              : !        vxci(ipts,2)=vxci(ipts,1)
    1729            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    1730              :        end do
    1731              : 
    1732              :      else if (option==-1) then
    1733              : 
    1734            0 :        do ipts=1,npts
    1735              : 
    1736            0 :          rhotot=rhoarr(ipts)
    1737            0 :          rhotmot=rhom1_3(ipts)
    1738            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1739            0 :          rhotmo6=sqrt(rhotmot)
    1740            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1741              : !        -----------------------------------------------------------------------
    1742              : !        First take care of the exchange part of the functional
    1743              : 
    1744            0 :          exc=zero
    1745              : !        loop over the spin
    1746            0 :          ispden=1
    1747            0 :          rho   =rho_updn(ipts,ispden)
    1748            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    1749            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1750              : !        Perdew_Wang 91 LSD
    1751            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    1752            0 :          exc=exc+ex_lsd*rho
    1753              : !        Perdew_Wang 91 LSD
    1754              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    1755            0 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    1756            0 :          dvxci(ipts,2)=zero
    1757              : !        If non-spin-polarized, first component of dvxci is second
    1758              : !        derivative with respect to TOTAL density.
    1759            0 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    1760              :          if(order==3)then
    1761              : !          Compute the second derivative of vx
    1762              : !          vx^(2) = -2*vx^(1)/(3*rhotot)
    1763            0 :            d2vxci(ipts,1) = -2._dp*dvxci(ipts,1)/(3._dp*rhotot)
    1764              :          end if
    1765              : !        end of loop over the spin
    1766              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1767            0 :          exc=exc*2
    1768            0 :          exci(ipts)=exc*rhotot_inv
    1769              : !        -----------------------------------------------------------------------------
    1770              : !        Then takes care of the LSD correlation part of the functional
    1771              : 
    1772              : !        Correlation has been added
    1773              : !        -----------------------------------------------------------------------------
    1774              : 
    1775              :        end do
    1776              :      else if (option==-2) then
    1777              : 
    1778            0 :        do ipts=1,npts
    1779              : 
    1780            0 :          rhotot=rhoarr(ipts)
    1781            0 :          rhotmot=rhom1_3(ipts)
    1782            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1783            0 :          rhotmo6=sqrt(rhotmot)
    1784            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1785              : !        -----------------------------------------------------------------------
    1786              : !        First take care of the exchange part of the functional
    1787              : 
    1788            0 :          exc=zero
    1789            0 :          dvxcdgr(ipts,3)=zero
    1790              : !        loop over the spin
    1791            0 :          ispden=1
    1792            0 :          rho   =rho_updn(ipts,ispden)
    1793            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    1794            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1795              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    1796            0 :          rho_inv=rhomot*rhomot*rhomot
    1797            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    1798            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    1799            0 :          divss=one/(one+mu_divkappa*ss)
    1800            0 :          dfxdss= mu*divss*divss
    1801            0 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    1802            0 :          fx    = one+kappa*(one-divss)
    1803            0 :          ex_gga= ex_lsd*fx
    1804            0 :          dssdn=-eight*third*ss*rho_inv
    1805            0 :          dfxdn  = dfxdss*dssdn
    1806            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    1807              : !        The new definition (v3.3) includes the division by the norm of the gradient
    1808            0 :          dssdg =two*coeffss
    1809            0 :          dfxdg=dfxdss*dssdg
    1810            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    1811            0 :          exc=exc+ex_gga*rho
    1812              : 
    1813              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    1814              : !        Components 3 or 4
    1815            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    1816              : !        Components 1 or 2
    1817            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    1818            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    1819              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    1820            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    1821              : !        Components 5 or 6
    1822            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    1823            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    1824            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    1825              : !        Components 7 or 8
    1826            0 :          d2fxdg2=d2fxdss2*dssdg**2
    1827            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    1828              : !        For the time being, treat non-spin-polarized like spin-polarized
    1829            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    1830            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    1831            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    1832            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    1833              : 
    1834              : !        end of loop over the spin
    1835              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1836            0 :          exc=exc*2
    1837            0 :          exci(ipts)=exc*rhotot_inv
    1838              : !        -----------------------------------------------------------------------------
    1839              : !        Then takes care of the LSD correlation part of the functional
    1840              : 
    1841              : !        Correlation has been added
    1842              : !        -----------------------------------------------------------------------------
    1843              : 
    1844              : !        vxci(ipts,2)=vxci(ipts,1)
    1845            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    1846              : 
    1847              :        end do
    1848              : 
    1849              : 
    1850              :      else if(option==-4) then
    1851              : 
    1852              : 
    1853            0 :        do ipts=1,npts
    1854              : 
    1855            0 :          rhotot=rhoarr(ipts)
    1856            0 :          rhotmot=rhom1_3(ipts)
    1857            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1858            0 :          rhotmo6=sqrt(rhotmot)
    1859            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1860              : !        -----------------------------------------------------------------------
    1861              : !        First take care of the exchange part of the functional
    1862              : 
    1863            0 :          exc=zero
    1864            0 :          dvxcdgr(ipts,3)=zero
    1865              : !        loop over the spin
    1866            0 :          ispden=1
    1867            0 :          rho   =rho_updn(ipts,ispden)
    1868            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    1869            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1870              : !        VALENTINO R. COOPER C09x GGA, This is an exchange term proposed
    1871              : !        to use together with vdw-DF (see above).
    1872            0 :          rho_inv=rhomot*rhomot*rhomot
    1873            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    1874              : !        the quarter that is lacking is compensated by the grho2_updn in the
    1875              : !        next line.
    1876            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    1877            0 :          alphs2=alpha_c09*ss
    1878            0 :          alphmu=alpha_c09*mu_c09
    1879              :          dfxdss= mu_c09*exp(-alphs2)*(one-alphs2)+&
    1880            0 : &         kappa*alpha_c09*exp(-alphs2/two)/two
    1881              :          d2fxdss2=-alphmu*exp(-alphs2)*(two-alphs2)-&
    1882            0 : &         kappa*(alpha_c09**two)*exp(alphs2/two)/four
    1883            0 :          fx    = one+mu_c09*ss*exp(-alphs2)+kappa*(one-exp(-alphs2/two))
    1884            0 :          ex_gga= ex_lsd*fx
    1885            0 :          dssdn=-eight*third*ss*rho_inv
    1886            0 :          dfxdn  = dfxdss*dssdn
    1887            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    1888              : !        The new definition (v3.3) includes the division by the norm of the gradient
    1889            0 :          dssdg =two*coeffss
    1890            0 :          dfxdg=dfxdss*dssdg
    1891            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    1892            0 :          exc=exc+ex_gga*rho
    1893              : 
    1894              : !        Cooper C09x GGA exchange
    1895              : !        Components 3 or 4
    1896            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    1897              : !        Components 1 or 2
    1898            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    1899            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    1900              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    1901            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    1902              : !        Components 5 or 6
    1903            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    1904            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    1905            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    1906              : !        Components 7 or 8
    1907            0 :          d2fxdg2=d2fxdss2*dssdg**2
    1908            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    1909              : !        For the time being, treat non-spin-polarized like spin-polarized
    1910            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    1911            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    1912            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    1913            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    1914              : 
    1915              : !        end of loop over the spin
    1916              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1917            0 :          exc=exc*2
    1918            0 :          exci(ipts)=exc*rhotot_inv
    1919              : !        -----------------------------------------------------------------------------
    1920              : !        Then takes care of the LSD correlation part of the functional
    1921              : 
    1922              : !        Correlation has been added
    1923              : !        -----------------------------------------------------------------------------
    1924              : 
    1925              : !        vxci(ipts,2)=vxci(ipts,1)
    1926            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    1927              : 
    1928              :        end do
    1929              : 
    1930              : 
    1931              :      else if(option==1) then
    1932              : 
    1933       781853 :        do ipts=1,npts
    1934              : 
    1935              : 
    1936       781224 :          rhotot=rhoarr(ipts)
    1937       781224 :          rhotmot=rhom1_3(ipts)
    1938       781224 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    1939       781224 :          rhotmo6=sqrt(rhotmot)
    1940       781224 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    1941              : !        -----------------------------------------------------------------------
    1942              : !        First take care of the exchange part of the functional
    1943              : 
    1944       781224 :          exc=zero
    1945              : !        loop over the spin
    1946       781224 :          ispden=1
    1947       781224 :          rho   =rho_updn(ipts,ispden)
    1948       781224 :          rhomot=rho_updnm1_3(ipts,ispden)
    1949       781224 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    1950              : !        Perdew_Wang 91 LSD
    1951       781224 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    1952       781224 :          exc=exc+ex_lsd*rho
    1953              : 
    1954              : !        Perdew_Wang 91 LSD
    1955              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    1956       781224 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    1957       781224 :          dvxci(ipts,2)=zero
    1958              : !        If non-spin-polarized, first component of dvxci is second
    1959              : !        derivative with respect to TOTAL density.
    1960       781224 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    1961              :          if(order==3)then
    1962              : !          Compute the second derivative of vx
    1963              : !          vx^(2) = -2*vx^(1)/(3*rhotot)
    1964       781224 :            d2vxci(ipts,1) = -2._dp*dvxci(ipts,1)/(3._dp*rhotot)
    1965              :          end if
    1966              : !        end of loop over the spin
    1967              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    1968       781224 :          exc=exc*2
    1969       781224 :          exci(ipts)=exc*rhotot_inv
    1970              : !        -----------------------------------------------------------------------------
    1971              : !        Then takes care of the LSD correlation part of the functional
    1972              : 
    1973       781224 :          rs=rsfac*rhotmot
    1974       781224 :          sqr_rs=sq_rsfac*rhotmo6
    1975       781224 :          rsm1_2=sq_rsfac_inv*rhoto6
    1976              : 
    1977              : !        Formulas A6-A8 of PW92LSD
    1978       781224 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    1979       781224 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    1980       781224 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    1981       781224 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    1982              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    1983       781224 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    1984       781224 :          ecrs0=ec0_q0*ec0_log
    1985       781224 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    1986       781224 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    1987              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    1988              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    1989       781224 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    1990       781224 :          ec0_q1ppp = 0.75_dp*ec0_aa*(rsm1_2**5)*(ec0_b1-ec0_b3*rs)
    1991       781224 :          ec0_f1 = 1._dp/(ec0_q1*ec0_q1*(1._dp + ec0_q1))
    1992       781224 :          ec0_f2 = 1._dp/(ec0_q1*(1+ec0_q1))
    1993              :          d3ecrs0_drs3 = 6._dp*ec0_q1p*ec0_f1*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + &
    1994              : &         ec0_q0*ec0_q1pp) - &
    1995              : &         ec0_f2*(-6._dp*ec0_aa*ec0_a1*ec0_q1pp + ec0_q0*ec0_q1ppp + &
    1996              : &         ec0_f2*(3._dp*ec0_q1p*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + ec0_q0*ec0_q1pp) + &
    1997       781224 : &         ec0_f2*2._dp*ec0_q0*(ec0_q1p**3)*(1._dp + 3._dp*ec0_q1*(1._dp + ec0_q1))))
    1998              : 
    1999       781224 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    2000       781224 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    2001       781224 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    2002       781224 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    2003       781224 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    2004       781224 :          macrs=mac_q0*mac_log
    2005       781224 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    2006              : 
    2007       781224 :          ecrs=ecrs0
    2008       781224 :          decrs_drs=decrs0_drs
    2009       781224 :          decrs_dzeta=0.0_dp
    2010       781224 :          d2ecrs_drs2=d2ecrs0_drs2
    2011       781224 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    2012       781224 :          d2ecrs_drsdzeta=zero
    2013       781224 :          zeta=0.0_dp
    2014              : 
    2015              : 
    2016              : !        Add LSD correlation functional to GGA exchange functional
    2017       781224 :          exci(ipts)=exci(ipts)+ecrs
    2018       781224 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    2019              : 
    2020       781224 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    2021              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    2022       781224 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    2023       781224 :          dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drho2
    2024       781224 :          d2vcrs_drs2 = third*(d2ecrs_drs2 - rs*d3ecrs0_drs3)
    2025       781224 :          drs_dn = -1._dp*four_pi*ninth*rs**4
    2026       781224 :          d2rs_dn2 = 64._dp*pi*pi*(rs**7)/81._dp
    2027          629 :          if(order==3)then
    2028              :            d2vxci(ipts,1) = d2vxci(ipts,1) + d2vcrs_drs2*drs_dn*drs_dn + &
    2029       781224 : &           dvcrs_drs*d2rs_dn2
    2030              : 
    2031              : 
    2032              : 
    2033              : 
    2034              : 
    2035              :          end if
    2036              : 
    2037              : !        -----------------------------------------------------------------------------
    2038              : !        Eventually add the GGA correlation part of the PBE functional
    2039              : !        Note : the computation of the potential in the spin-unpolarized
    2040              : !        case could be optimized much further. Other optimizations are left to do.
    2041              : 
    2042              : 
    2043              : !        Correlation has been added
    2044              : !        -----------------------------------------------------------------------------
    2045              :        end do
    2046              :      else if (option==3) then
    2047              : 
    2048            0 :        do ipts=1,npts
    2049              : 
    2050            0 :          rhotot=rhoarr(ipts)
    2051            0 :          rhotmot=rhom1_3(ipts)
    2052            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2053            0 :          rhotmo6=sqrt(rhotmot)
    2054            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2055              : !        -----------------------------------------------------------------------
    2056              : !        First take care of the exchange part of the functional
    2057              : 
    2058            0 :          exc=zero
    2059              : !        loop over the spin
    2060            0 :          ispden=1
    2061            0 :          rho   =rho_updn(ipts,ispden)
    2062            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    2063            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2064              : !        Perdew_Wang 91 LSD
    2065            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    2066            0 :          exc=exc+ex_lsd*rho
    2067              : 
    2068              : 
    2069              : !        Perdew_Wang 91 LSD
    2070              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    2071            0 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    2072            0 :          dvxci(ipts,2)=zero
    2073              : !        If non-spin-polarized, first component of dvxci is second
    2074              : !        derivative with respect to TOTAL density.
    2075            0 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    2076              :          if(order==3)then
    2077              : !          Compute the second derivative of vx
    2078              : !          vx^(2) = -2*vx^(1)/(3*rhotot)
    2079            0 :            d2vxci(ipts,1) = -2._dp*dvxci(ipts,1)/(3._dp*rhotot)
    2080              :          end if
    2081              : !        end of loop over the spin
    2082              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2083            0 :          exc=exc*2
    2084            0 :          exci(ipts)=exc*rhotot_inv
    2085              : !        -----------------------------------------------------------------------------
    2086              : !        Then takes care of the LSD correlation part of the functional
    2087              : 
    2088            0 :          rs=rsfac*rhotmot
    2089            0 :          sqr_rs=sq_rsfac*rhotmo6
    2090            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    2091              : 
    2092              : !        Formulas A6-A8 of PW92LSD
    2093            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    2094            0 :          sqr_sqr_rs=max(1.e-15_dp,sqrt(sqr_rs))
    2095            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs/sqr_sqr_rs)
    2096            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+3.5_dp*ec0_b4*rs/sqr_sqr_rs)
    2097            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    2098              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    2099            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    2100            0 :          ecrs0=ec0_q0*ec0_log
    2101            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    2102            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    2103              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    2104              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    2105            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    2106            0 :          ec0_q1ppp = 0.75_dp*ec0_aa*(rsm1_2**5)*(ec0_b1-ec0_b3*rs)
    2107            0 :          ec0_f1 = 1._dp/(ec0_q1*ec0_q1*(1._dp + ec0_q1))
    2108            0 :          ec0_f2 = 1._dp/(ec0_q1*(1+ec0_q1))
    2109              :          d3ecrs0_drs3 = 6._dp*ec0_q1p*ec0_f1*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + &
    2110              : &         ec0_q0*ec0_q1pp) - &
    2111              : &         ec0_f2*(-6._dp*ec0_aa*ec0_a1*ec0_q1pp + ec0_q0*ec0_q1ppp + &
    2112              : &         ec0_f2*(3._dp*ec0_q1p*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + ec0_q0*ec0_q1pp) + &
    2113            0 : &         ec0_f2*2._dp*ec0_q0*(ec0_q1p**3)*(1._dp + 3._dp*ec0_q1*(1._dp + ec0_q1))))
    2114              : 
    2115            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    2116            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    2117            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    2118            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    2119            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    2120            0 :          macrs=mac_q0*mac_log
    2121            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    2122              : 
    2123            0 :          ecrs=ecrs0
    2124            0 :          decrs_drs=decrs0_drs
    2125            0 :          decrs_dzeta=0.0_dp
    2126            0 :          d2ecrs_drs2=d2ecrs0_drs2
    2127            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    2128            0 :          d2ecrs_drsdzeta=zero
    2129            0 :          zeta=0.0_dp
    2130              : 
    2131              : 
    2132              : !        Add LSD correlation functional to GGA exchange functional
    2133            0 :          exci(ipts)=exci(ipts)+ecrs
    2134            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    2135              : 
    2136            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    2137              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    2138            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    2139              : 
    2140            0 :          dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drho2
    2141            0 :          d2vcrs_drs2 = third*(d2ecrs_drs2 - rs*d3ecrs0_drs3)
    2142            0 :          drs_dn = -1._dp*four_pi*ninth*rs**4
    2143            0 :          d2rs_dn2 = 64._dp*pi*pi*(rs**7)/81._dp
    2144            0 :          if(order==3)then
    2145              :            d2vxci(ipts,1) = d2vxci(ipts,1) + d2vcrs_drs2*drs_dn*drs_dn + &
    2146            0 : &           dvcrs_drs*d2rs_dn2
    2147              : 
    2148              : 
    2149              : 
    2150              :          end if
    2151              : 
    2152              : 
    2153              :        end do
    2154              : 
    2155              :      end if
    2156              : 
    2157        29158 :    else if(order==-2) then
    2158           65 :      if(option==2 .or. option==5) then
    2159            0 :        do ipts=1,npts
    2160              : 
    2161            0 :          rhotot=rhoarr(ipts)
    2162            0 :          rhotmot=rhom1_3(ipts)
    2163            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2164            0 :          rhotmo6=sqrt(rhotmot)
    2165            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2166              : !        -----------------------------------------------------------------------
    2167              : !        First take care of the exchange part of the functional
    2168              : 
    2169            0 :          exc=zero
    2170            0 :          dvxcdgr(ipts,3)=zero
    2171              : !        loop over the spin
    2172            0 :          ispden=1
    2173            0 :          rho   =rho_updn(ipts,ispden)
    2174            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    2175            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2176              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    2177            0 :          rho_inv=rhomot*rhomot*rhomot
    2178            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    2179            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    2180            0 :          divss=one/(one+mu_divkappa*ss)
    2181            0 :          dfxdss= mu*divss*divss
    2182            0 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    2183            0 :          fx    = one+kappa*(one-divss)
    2184            0 :          ex_gga= ex_lsd*fx
    2185            0 :          dssdn=-eight*third*ss*rho_inv
    2186            0 :          dfxdn  = dfxdss*dssdn
    2187            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    2188              : !        The new definition (v3.3) includes the division by the norm of the gradient
    2189            0 :          dssdg =two*coeffss
    2190            0 :          dfxdg=dfxdss*dssdg
    2191            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    2192            0 :          exc=exc+ex_gga*rho
    2193              : 
    2194              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    2195              : !        Components 3 or 4
    2196            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    2197              : !        Components 1 or 2
    2198            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    2199            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    2200              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    2201            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    2202              : !        Components 5 or 6
    2203            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    2204            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    2205            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    2206              : !        Components 7 or 8
    2207            0 :          d2fxdg2=d2fxdss2*dssdg**2
    2208            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    2209              : !        For the time being, treat non-spin-polarized like spin-polarized
    2210            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    2211            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    2212            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    2213            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    2214              : !        end of loop over the spin
    2215              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2216            0 :          exc=exc*2
    2217            0 :          exci(ipts)=exc*rhotot_inv
    2218              : !        -----------------------------------------------------------------------------
    2219              : !        Then takes care of the LSD correlation part of the functional
    2220              : 
    2221              : 
    2222            0 :          rs=rsfac*rhotmot
    2223            0 :          sqr_rs=sq_rsfac*rhotmo6
    2224            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    2225              : 
    2226              : !        Formulas A6-A8 of PW92LSD
    2227            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    2228            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    2229            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    2230            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    2231              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    2232            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    2233            0 :          ecrs0=ec0_q0*ec0_log
    2234            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    2235            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    2236              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    2237              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    2238            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    2239              : 
    2240            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    2241            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    2242            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    2243            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    2244            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    2245            0 :          macrs=mac_q0*mac_log
    2246            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    2247              : 
    2248            0 :          ecrs=ecrs0
    2249            0 :          decrs_drs=decrs0_drs
    2250            0 :          decrs_dzeta=0.0_dp
    2251            0 :          d2ecrs_drs2=d2ecrs0_drs2
    2252            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    2253            0 :          d2ecrs_drsdzeta=zero
    2254            0 :          zeta=0.0_dp
    2255              : 
    2256              : 
    2257              : !        Add LSD correlation functional to GGA exchange functional
    2258            0 :          exci(ipts)=exci(ipts)+ecrs
    2259            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    2260              : 
    2261            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    2262              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    2263            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    2264            0 :          dvxci(ipts,9)=d2ecrs_drho2
    2265            0 :          dvxci(ipts,10)=d2ecrs_drho2
    2266            0 :          dvxci(ipts,11)=d2ecrs_drho2
    2267              : 
    2268              : !        -----------------------------------------------------------------------------
    2269              : !        Eventually add the GGA correlation part of the PBE functional
    2270              : !        Note : the computation of the potential in the spin-unpolarized
    2271              : !        case could be optimized much further. Other optimizations are left to do.
    2272              : 
    2273            0 :          phi_zeta=1.0_dp
    2274            0 :          phip_zeta=0.0_dp
    2275            0 :          phi_zeta_inv=1.0_dp
    2276            0 :          phi_logder=0.0_dp
    2277            0 :          phi3_zeta=1.0_dp
    2278            0 :          gamphi3inv=gamma_inv
    2279            0 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
    2280              : 
    2281              : !        From ec to bb
    2282            0 :          bb=ecrs*gamphi3inv
    2283            0 :          dbb_drs=decrs_drs*gamphi3inv
    2284            0 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    2285            0 :          d2bb_drs2=d2ecrs_drs2*gamphi3inv
    2286            0 :          d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    2287              :          d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    2288            0 : &         12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    2289              : 
    2290              : !        From bb to cc
    2291            0 :          exp_pbe=exp(-bb)
    2292            0 :          cc=one/(exp_pbe-one)
    2293            0 :          dcc_dbb=cc*cc*exp_pbe
    2294            0 :          dcc_drs=dcc_dbb*dbb_drs
    2295            0 :          dcc_dzeta=dcc_dbb*dbb_dzeta
    2296            0 :          d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    2297            0 :          d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    2298            0 :          d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    2299            0 :          d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    2300              : 
    2301              : !        From cc to aa
    2302            0 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    2303            0 :          aa=coeff_aa*cc
    2304            0 :          daa_drs=coeff_aa*dcc_drs
    2305            0 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    2306            0 :          d2aa_drs2=coeff_aa*d2cc_drs2
    2307            0 :          d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    2308              :          d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    2309            0 : &         coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    2310              : 
    2311              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
    2312            0 :          grrho2=four*grho2_updn(ipts,1)
    2313            0 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    2314              : !        Note that tt is (the t variable of PBE divided by phi) squared
    2315            0 :          tt=half*grrho2*dtt_dg
    2316              : 
    2317              : !        Get xx from aa and tt
    2318            0 :          xx=aa*tt
    2319            0 :          dxx_drs=daa_drs*tt
    2320            0 :          dxx_dzeta=daa_dzeta*tt
    2321            0 :          dxx_dtt=aa
    2322            0 :          d2xx_drs2=d2aa_drs2*tt
    2323            0 :          d2xx_drsdzeta=d2aa_drsdzeta*tt
    2324            0 :          d2xx_drsdtt=daa_drs
    2325            0 :          d2xx_dttdzeta=daa_dzeta
    2326            0 :          d2xx_dzeta2=d2aa_dzeta2*tt
    2327              : 
    2328              : !        From xx to pade
    2329            0 :          pade_den=one/(one+xx*(one+xx))
    2330            0 :          pade=(one+xx)*pade_den
    2331            0 :          dpade_dxx=-xx*(two+xx)*pade_den**2
    2332            0 :          dpade_drs=dpade_dxx*dxx_drs
    2333            0 :          dpade_dtt=dpade_dxx*dxx_dtt
    2334            0 :          dpade_dzeta=dpade_dxx*dxx_dzeta
    2335            0 :          d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    2336            0 :          d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    2337            0 :          d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    2338            0 :          d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    2339            0 :          d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    2340            0 :          d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    2341            0 :          d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    2342              : 
    2343              : !        From pade to qq
    2344            0 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    2345            0 :          qq=coeff_qq*pade
    2346            0 :          dqq_drs=coeff_qq*dpade_drs
    2347            0 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    2348            0 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    2349            0 :          d2qq_drs2=coeff_qq*d2pade_drs2
    2350            0 :          d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    2351            0 :          d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    2352            0 :          d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    2353              :          d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    2354            0 : &         coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    2355              :          d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    2356              : &         +six*pade*phi_logder*phi_logder            &
    2357            0 : &         -two*pade*phi_zeta_inv*phipp_zeta)
    2358              : 
    2359              : !        From qq to rr
    2360            0 :          arg_rr=one+beta*gamma_inv*qq
    2361            0 :          div_rr=one/arg_rr
    2362            0 :          rr=gamma*log(arg_rr)
    2363            0 :          drr_dqq=beta*div_rr
    2364            0 :          drr_drs=drr_dqq*dqq_drs
    2365            0 :          drr_dtt=drr_dqq*dqq_dtt
    2366            0 :          drr_dzeta=drr_dqq*dqq_dzeta
    2367            0 :          d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    2368            0 :          d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    2369            0 :          d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    2370            0 :          d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    2371            0 :          d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    2372            0 :          d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    2373            0 :          d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    2374              : 
    2375              : !        From rr to hh
    2376            0 :          hh=phi3_zeta*rr
    2377            0 :          dhh_drs=phi3_zeta*drr_drs
    2378            0 :          dhh_dtt=phi3_zeta*drr_dtt
    2379            0 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    2380            0 :          d2hh_drs2=phi3_zeta*d2rr_drs2
    2381            0 :          d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    2382            0 :          d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    2383            0 :          d2hh_dtt2=phi3_zeta*d2rr_dtt2
    2384            0 :          d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    2385              :          d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    2386              : &         six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    2387            0 : &         +three*phi_zeta*phi_zeta*rr*phipp_zeta
    2388              : 
    2389              : !        The GGA correlation energy is added
    2390            0 :          exci(ipts)=exci(ipts)+hh
    2391              : 
    2392              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    2393              : 
    2394              : !        From hh to the derivative of the energy wrt the density
    2395            0 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    2396            0 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
    2397              : 
    2398              : !        From hh to the derivative of the energy wrt to the gradient of the
    2399              : !        density, divided by the gradient of the density
    2400              : !        (The v3.3 definition includes the division by the norm of the gradient)
    2401            0 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    2402              : 
    2403              :          d2rhohh_drho2=rhotot_inv*&
    2404              : &         (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    2405              : &         +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    2406              : &         +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    2407            0 : &         +two*seven*third*tt*zeta*d2hh_dttdzeta)
    2408              :          d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    2409            0 : &         -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    2410              : 
    2411              : !        Component 12 : first derivative with respect to the gradient
    2412              : !        of the density, div by the grad of the density
    2413            0 :          dvxci(ipts,12)=dvxcdgr(ipts,3)
    2414              : !        Components 9, 10 and 11 : second derivatives with respect to the spin-density
    2415              : !        Note that there is already a contribution from LSDA
    2416              :          dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    2417              : &         ( d2hh_dzeta2*(one-two*zeta) &
    2418            0 : &         -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    2419            0 :          dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    2420              :          dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    2421              : &         ( d2hh_dzeta2*(one+two*zeta) &
    2422            0 : &         +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    2423              : !        Components 13 and 14 : second derivatives with respect to spin density
    2424              : !        and gradient, divided by the gradient
    2425            0 :          dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    2426            0 :          dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    2427              : !        Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    2428              : !        divided by the grad
    2429            0 :          dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    2430              : 
    2431              : 
    2432              : !        End condition of GGA
    2433              : 
    2434              : 
    2435              : !        Correlation has been added
    2436              : !        -----------------------------------------------------------------------------
    2437              : 
    2438              : !        vxci(ipts,2)=vxci(ipts,1)
    2439            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    2440              : 
    2441              :        end do
    2442              : 
    2443              :      else if ((option==6) .or. (option==7)) then
    2444            0 :        do ipts=1,npts
    2445              : 
    2446            0 :          rhotot=rhoarr(ipts)
    2447            0 :          rhotmot=rhom1_3(ipts)
    2448            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2449            0 :          rhotmo6=sqrt(rhotmot)
    2450            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2451              : !        -----------------------------------------------------------------------
    2452              : !        First take care of the exchange part of the functional
    2453              : 
    2454            0 :          exc=zero
    2455            0 :          dvxcdgr(ipts,3)=zero
    2456              : !        loop over the spin
    2457            0 :          ispden=1
    2458            0 :          rho   =rho_updn(ipts,ispden)
    2459            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    2460            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2461              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    2462            0 :          rho_inv=rhomot*rhomot*rhomot
    2463            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    2464            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    2465              : 
    2466            0 :          if (option==6) then
    2467            0 :            divss=exp(-mu_divkappa*ss)
    2468            0 :            dfxdss= mu*divss
    2469            0 :            d2fxdss2=-mu*mu_divkappa*divss
    2470              : 
    2471            0 :            fx    = one+kappa*(one-divss)
    2472            0 :            ex_gga= ex_lsd*fx
    2473            0 :            dssdn=-eight*third*ss*rho_inv
    2474            0 :            dfxdn  = dfxdss*dssdn
    2475            0 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    2476              : !          The new definition (v3.3) includes the division by the norm of the gradient
    2477            0 :            dssdg =two*coeffss
    2478            0 :            dfxdg=dfxdss*dssdg
    2479            0 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    2480            0 :            exc=exc+ex_gga*rho
    2481              : !          This is the Wu and Cohen modification
    2482              :          else
    2483            0 :            expss=exp(-ss)
    2484            0 :            p1_wc=b_wc+(mu-b_wc)*(one-ss)*expss+two*c_wc*ss/(one+c_wc*ss*ss)
    2485              :            p2_wc=d_wc*(ss-two)*expss+two*c_wc/(one+c_wc*ss*ss)-&
    2486            0 : &           four*c_wc*c_wc*ss*ss/((one+c_wc*ss*ss)*(one+c_wc*ss*ss))
    2487            0 :            divss=one/(one+(b_wc*ss+d_wc*ss*expss+log(one+c_wc*ss*ss))/kappa)
    2488            0 :            dfxdss=p1_wc*divss*divss
    2489            0 :            d2fxdss2=p2_wc*divss*divss-two*divss*divss*divss*p1_wc*p1_wc/kappa
    2490              : 
    2491            0 :            fx    = one+kappa*(one-divss)
    2492            0 :            ex_gga= ex_lsd*fx
    2493            0 :            dssdn=-eight*third*ss*rho_inv
    2494            0 :            dfxdn  = dfxdss*dssdn
    2495            0 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    2496              : !          The new definition (v3.3) includes the division by the norm of the gradient
    2497            0 :            dssdg =two*coeffss
    2498            0 :            dfxdg=dfxdss*dssdg
    2499            0 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    2500            0 :            exc=exc+ex_gga*rho
    2501              :          end if
    2502              : 
    2503              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    2504              : !        Components 3 or 4
    2505            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    2506              : !        Components 1 or 2
    2507            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    2508            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    2509              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    2510            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    2511              : !        Components 5 or 6
    2512            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    2513            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    2514            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    2515              : !        Components 7 or 8
    2516            0 :          d2fxdg2=d2fxdss2*dssdg**2
    2517            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    2518              : !        For the time being, treat non-spin-polarized like spin-polarized
    2519            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    2520            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    2521            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    2522            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    2523              : !        end of loop over the spin
    2524              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2525            0 :          exc=exc*2
    2526            0 :          exci(ipts)=exc*rhotot_inv
    2527              : !        -----------------------------------------------------------------------------
    2528              : !        Then takes care of the LSD correlation part of the functional
    2529              : 
    2530              : 
    2531            0 :          rs=rsfac*rhotmot
    2532            0 :          sqr_rs=sq_rsfac*rhotmo6
    2533            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    2534              : 
    2535              : !        Formulas A6-A8 of PW92LSD
    2536            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    2537            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    2538            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    2539            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    2540              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    2541            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    2542            0 :          ecrs0=ec0_q0*ec0_log
    2543            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    2544            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    2545              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    2546              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    2547            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    2548              : 
    2549            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    2550            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    2551            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    2552            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    2553            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    2554            0 :          macrs=mac_q0*mac_log
    2555            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    2556              : 
    2557            0 :          ecrs=ecrs0
    2558            0 :          decrs_drs=decrs0_drs
    2559            0 :          decrs_dzeta=0.0_dp
    2560            0 :          d2ecrs_drs2=d2ecrs0_drs2
    2561            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    2562            0 :          d2ecrs_drsdzeta=zero
    2563            0 :          zeta=0.0_dp
    2564              : 
    2565              : 
    2566              : !        Add LSD correlation functional to GGA exchange functional
    2567            0 :          exci(ipts)=exci(ipts)+ecrs
    2568            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    2569              : 
    2570            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    2571              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    2572            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    2573            0 :          dvxci(ipts,9)=d2ecrs_drho2
    2574            0 :          dvxci(ipts,10)=d2ecrs_drho2
    2575            0 :          dvxci(ipts,11)=d2ecrs_drho2
    2576              : 
    2577              : !        -----------------------------------------------------------------------------
    2578              : !        Eventually add the GGA correlation part of the PBE functional
    2579              : !        Note : the computation of the potential in the spin-unpolarized
    2580              : !        case could be optimized much further. Other optimizations are left to do.
    2581              : 
    2582            0 :          phi_zeta=1.0_dp
    2583            0 :          phip_zeta=0.0_dp
    2584            0 :          phi_zeta_inv=1.0_dp
    2585            0 :          phi_logder=0.0_dp
    2586            0 :          phi3_zeta=1.0_dp
    2587            0 :          gamphi3inv=gamma_inv
    2588            0 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
    2589              : 
    2590              : !        From ec to bb
    2591            0 :          bb=ecrs*gamphi3inv
    2592            0 :          dbb_drs=decrs_drs*gamphi3inv
    2593            0 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    2594            0 :          d2bb_drs2=d2ecrs_drs2*gamphi3inv
    2595            0 :          d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    2596              :          d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    2597            0 : &         12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    2598              : 
    2599              : !        From bb to cc
    2600            0 :          exp_pbe=exp(-bb)
    2601            0 :          cc=one/(exp_pbe-one)
    2602            0 :          dcc_dbb=cc*cc*exp_pbe
    2603            0 :          dcc_drs=dcc_dbb*dbb_drs
    2604            0 :          dcc_dzeta=dcc_dbb*dbb_dzeta
    2605            0 :          d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    2606            0 :          d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    2607            0 :          d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    2608            0 :          d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    2609              : 
    2610              : !        From cc to aa
    2611            0 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    2612            0 :          aa=coeff_aa*cc
    2613            0 :          daa_drs=coeff_aa*dcc_drs
    2614            0 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    2615            0 :          d2aa_drs2=coeff_aa*d2cc_drs2
    2616            0 :          d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    2617              :          d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    2618            0 : &         coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    2619              : 
    2620              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
    2621            0 :          grrho2=four*grho2_updn(ipts,1)
    2622            0 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    2623              : !        Note that tt is (the t variable of PBE divided by phi) squared
    2624            0 :          tt=half*grrho2*dtt_dg
    2625              : 
    2626              : !        Get xx from aa and tt
    2627            0 :          xx=aa*tt
    2628            0 :          dxx_drs=daa_drs*tt
    2629            0 :          dxx_dzeta=daa_dzeta*tt
    2630            0 :          dxx_dtt=aa
    2631            0 :          d2xx_drs2=d2aa_drs2*tt
    2632            0 :          d2xx_drsdzeta=d2aa_drsdzeta*tt
    2633            0 :          d2xx_drsdtt=daa_drs
    2634            0 :          d2xx_dttdzeta=daa_dzeta
    2635            0 :          d2xx_dzeta2=d2aa_dzeta2*tt
    2636              : 
    2637              : !        From xx to pade
    2638            0 :          pade_den=one/(one+xx*(one+xx))
    2639            0 :          pade=(one+xx)*pade_den
    2640            0 :          dpade_dxx=-xx*(two+xx)*pade_den**2
    2641            0 :          dpade_drs=dpade_dxx*dxx_drs
    2642            0 :          dpade_dtt=dpade_dxx*dxx_dtt
    2643            0 :          dpade_dzeta=dpade_dxx*dxx_dzeta
    2644            0 :          d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    2645            0 :          d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    2646            0 :          d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    2647            0 :          d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    2648            0 :          d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    2649            0 :          d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    2650            0 :          d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    2651              : 
    2652              : !        From pade to qq
    2653            0 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    2654            0 :          qq=coeff_qq*pade
    2655            0 :          dqq_drs=coeff_qq*dpade_drs
    2656            0 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    2657            0 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    2658            0 :          d2qq_drs2=coeff_qq*d2pade_drs2
    2659            0 :          d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    2660            0 :          d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    2661            0 :          d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    2662              :          d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    2663            0 : &         coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    2664              :          d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    2665              : &         +six*pade*phi_logder*phi_logder            &
    2666            0 : &         -two*pade*phi_zeta_inv*phipp_zeta)
    2667              : 
    2668              : !        From qq to rr
    2669            0 :          arg_rr=one+beta*gamma_inv*qq
    2670            0 :          div_rr=one/arg_rr
    2671            0 :          rr=gamma*log(arg_rr)
    2672            0 :          drr_dqq=beta*div_rr
    2673            0 :          drr_drs=drr_dqq*dqq_drs
    2674            0 :          drr_dtt=drr_dqq*dqq_dtt
    2675            0 :          drr_dzeta=drr_dqq*dqq_dzeta
    2676            0 :          d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    2677            0 :          d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    2678            0 :          d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    2679            0 :          d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    2680            0 :          d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    2681            0 :          d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    2682            0 :          d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    2683              : 
    2684              : !        From rr to hh
    2685            0 :          hh=phi3_zeta*rr
    2686            0 :          dhh_drs=phi3_zeta*drr_drs
    2687            0 :          dhh_dtt=phi3_zeta*drr_dtt
    2688            0 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    2689            0 :          d2hh_drs2=phi3_zeta*d2rr_drs2
    2690            0 :          d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    2691            0 :          d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    2692            0 :          d2hh_dtt2=phi3_zeta*d2rr_dtt2
    2693            0 :          d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    2694              :          d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    2695              : &         six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    2696            0 : &         +three*phi_zeta*phi_zeta*rr*phipp_zeta
    2697              : 
    2698              : !        The GGA correlation energy is added
    2699            0 :          exci(ipts)=exci(ipts)+hh
    2700              : 
    2701              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    2702              : 
    2703              : !        From hh to the derivative of the energy wrt the density
    2704            0 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    2705            0 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
    2706              : 
    2707              : !        From hh to the derivative of the energy wrt to the gradient of the
    2708              : !        density, divided by the gradient of the density
    2709              : !        (The v3.3 definition includes the division by the norm of the gradient)
    2710            0 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    2711              : 
    2712              :          d2rhohh_drho2=rhotot_inv*&
    2713              : &         (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    2714              : &         +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    2715              : &         +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    2716            0 : &         +two*seven*third*tt*zeta*d2hh_dttdzeta)
    2717              :          d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    2718            0 : &         -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    2719              : 
    2720              : !        Component 12 : first derivative with respect to the gradient
    2721              : !        of the density, div by the grad of the density
    2722            0 :          dvxci(ipts,12)=dvxcdgr(ipts,3)
    2723              : !        Components 9, 10 and 11 : second derivatives with respect to the spin-density
    2724              : !        Note that there is already a contribution from LSDA
    2725              :          dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    2726              : &         ( d2hh_dzeta2*(one-two*zeta) &
    2727            0 : &         -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    2728            0 :          dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    2729              :          dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    2730              : &         ( d2hh_dzeta2*(one+two*zeta) &
    2731            0 : &         +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    2732              : !        Components 13 and 14 : second derivatives with respect to spin density
    2733              : !        and gradient, divided by the gradient
    2734            0 :          dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    2735            0 :          dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    2736              : !        Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    2737              : !        divided by the grad
    2738            0 :          dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    2739              : 
    2740              : 
    2741              : !        End condition of GGA
    2742              : 
    2743              : 
    2744              : !        Correlation has been added
    2745              : !        -----------------------------------------------------------------------------
    2746              : 
    2747              : !        vxci(ipts,2)=vxci(ipts,1)
    2748            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    2749              : 
    2750              :        end do
    2751              : 
    2752              :      else if (option==-1) then
    2753            0 :        do ipts=1,npts
    2754              : 
    2755            0 :          rhotot=rhoarr(ipts)
    2756            0 :          rhotmot=rhom1_3(ipts)
    2757            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2758            0 :          rhotmo6=sqrt(rhotmot)
    2759            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2760              : !        -----------------------------------------------------------------------
    2761              : !        First take care of the exchange part of the functional
    2762              : 
    2763            0 :          exc=zero
    2764              : !        loop over the spin
    2765            0 :          ispden=1
    2766            0 :          rho   =rho_updn(ipts,ispden)
    2767            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    2768            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2769              : !        Perdew_Wang 91 LSD
    2770            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    2771            0 :          exc=exc+ex_lsd*rho
    2772              : 
    2773              : !        Perdew_Wang 91 LSD
    2774              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    2775            0 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    2776            0 :          dvxci(ipts,2)=zero
    2777              : !        If non-spin-polarized, first component of dvxci is second
    2778              : !        derivative with respect to TOTAL density.
    2779            0 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    2780              : !        Compute the second derivative of vx
    2781              : !        vx^(2) = -2*vx^(1)/(3*rhotot)
    2782              : !        end of loop over the spin
    2783              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2784            0 :          exc=exc*2
    2785            0 :          exci(ipts)=exc*rhotot_inv
    2786              : 
    2787              : 
    2788              : !        Correlation has been added
    2789              : !        -----------------------------------------------------------------------------
    2790              : 
    2791              : 
    2792              :        end do
    2793              : 
    2794              :      else if (option==-2) then
    2795            0 :        do ipts=1,npts
    2796              : 
    2797            0 :          rhotot=rhoarr(ipts)
    2798            0 :          rhotmot=rhom1_3(ipts)
    2799            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2800            0 :          rhotmo6=sqrt(rhotmot)
    2801            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2802              : !        -----------------------------------------------------------------------
    2803              : !        First take care of the exchange part of the functional
    2804              : 
    2805            0 :          exc=zero
    2806            0 :          dvxcdgr(ipts,3)=zero
    2807              : !        loop over the spin
    2808            0 :          ispden=1
    2809            0 :          rho   =rho_updn(ipts,ispden)
    2810            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    2811            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2812              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    2813            0 :          rho_inv=rhomot*rhomot*rhomot
    2814            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    2815            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    2816            0 :          divss=one/(one+mu_divkappa*ss)
    2817            0 :          dfxdss= mu*divss*divss
    2818            0 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    2819            0 :          fx    = one+kappa*(one-divss)
    2820            0 :          ex_gga= ex_lsd*fx
    2821            0 :          dssdn=-eight*third*ss*rho_inv
    2822            0 :          dfxdn  = dfxdss*dssdn
    2823            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    2824              : !        The new definition (v3.3) includes the division by the norm of the gradient
    2825            0 :          dssdg =two*coeffss
    2826            0 :          dfxdg=dfxdss*dssdg
    2827            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    2828            0 :          exc=exc+ex_gga*rho
    2829              : 
    2830              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    2831              : !        Components 3 or 4
    2832            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    2833              : !        Components 1 or 2
    2834            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    2835            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    2836              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    2837            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    2838              : !        Components 5 or 6
    2839            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    2840            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    2841            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    2842              : !        Components 7 or 8
    2843            0 :          d2fxdg2=d2fxdss2*dssdg**2
    2844            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    2845              : !        For the time being, treat non-spin-polarized like spin-polarized
    2846            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    2847            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    2848            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    2849            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    2850              : !        end of loop over the spin
    2851              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2852            0 :          exc=exc*2
    2853            0 :          exci(ipts)=exc*rhotot_inv
    2854              : !        -----------------------------------------------------------------------------
    2855              : !        Then takes care of the LSD correlation part of the functional
    2856              : 
    2857              : 
    2858              : !        Correlation has been added
    2859              : !        -----------------------------------------------------------------------------
    2860              : 
    2861              : !        vxci(ipts,2)=vxci(ipts,1)
    2862            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    2863              : 
    2864              :        end do
    2865              : 
    2866              :      else if(option==-4) then
    2867              : 
    2868              : 
    2869            0 :        do ipts=1,npts
    2870              : 
    2871            0 :          rhotot=rhoarr(ipts)
    2872            0 :          rhotmot=rhom1_3(ipts)
    2873            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2874            0 :          rhotmo6=sqrt(rhotmot)
    2875            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2876              : !        -----------------------------------------------------------------------
    2877              : !        First take care of the exchange part of the functional
    2878              : 
    2879            0 :          exc=zero
    2880            0 :          dvxcdgr(ipts,3)=zero
    2881              : !        loop over the spin
    2882            0 :          ispden=1
    2883            0 :          rho   =rho_updn(ipts,ispden)
    2884            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    2885            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2886              : !        VALENTINO R. COOPER C09x GGA, This is an exchange term proposed
    2887              : !        to use together with vdw-DF (see above).
    2888            0 :          rho_inv=rhomot*rhomot*rhomot
    2889            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    2890              : !        the quarter that is lacking is compensated by the grho2_updn in the
    2891              : !        next line.
    2892            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    2893            0 :          alphs2=alpha_c09*ss
    2894            0 :          alphmu=alpha_c09*mu_c09
    2895              :          dfxdss= mu_c09*exp(-alphs2)*(one-alphs2)+&
    2896            0 : &         kappa*alpha_c09*exp(-alphs2/two)/two
    2897              :          d2fxdss2=-alphmu*exp(-alphs2)*(two-alphs2)-&
    2898            0 : &         kappa*(alpha_c09**two)*exp(alphs2/two)/four
    2899            0 :          fx    = one+mu_c09*ss*exp(-alphs2)+kappa*(one-exp(-alphs2/two))
    2900            0 :          ex_gga= ex_lsd*fx
    2901            0 :          dssdn=-eight*third*ss*rho_inv
    2902            0 :          dfxdn  = dfxdss*dssdn
    2903            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    2904              : !        The new definition (v3.3) includes the division by the norm of the gradient
    2905            0 :          dssdg =two*coeffss
    2906            0 :          dfxdg=dfxdss*dssdg
    2907            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    2908            0 :          exc=exc+ex_gga*rho
    2909              : 
    2910              : !        Cooper C09x GGA exchange
    2911              : !        Components 3 or 4
    2912            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    2913              : !        Components 1 or 2
    2914            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    2915            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    2916              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    2917            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    2918              : !        Components 5 or 6
    2919            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    2920            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    2921            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    2922              : !        Components 7 or 8
    2923            0 :          d2fxdg2=d2fxdss2*dssdg**2
    2924            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    2925              : !        For the time being, treat non-spin-polarized like spin-polarized
    2926            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    2927            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    2928            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    2929            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    2930              : 
    2931              : !        end of loop over the spin
    2932              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2933            0 :          exc=exc*2
    2934            0 :          exci(ipts)=exc*rhotot_inv
    2935              : !        -----------------------------------------------------------------------------
    2936              : !        Then takes care of the LSD correlation part of the functional
    2937              : 
    2938              : !        Correlation has been added
    2939              : !        -----------------------------------------------------------------------------
    2940              : 
    2941              : !        vxci(ipts,2)=vxci(ipts,1)
    2942            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    2943              : 
    2944              :        end do
    2945              : 
    2946              : 
    2947              :      else if (option==1) then
    2948       251533 :        do ipts=1,npts
    2949              : 
    2950       251468 :          rhotot=rhoarr(ipts)
    2951       251468 :          rhotmot=rhom1_3(ipts)
    2952       251468 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    2953       251468 :          rhotmo6=sqrt(rhotmot)
    2954       251468 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    2955              : !        -----------------------------------------------------------------------
    2956              : !        First take care of the exchange part of the functional
    2957              : 
    2958       251468 :          exc=zero
    2959              : !        loop over the spin
    2960       251468 :          ispden=1
    2961       251468 :          rho   =rho_updn(ipts,ispden)
    2962       251468 :          rhomot=rho_updnm1_3(ipts,ispden)
    2963       251468 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    2964              : !        Perdew_Wang 91 LSD
    2965       251468 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    2966       251468 :          exc=exc+ex_lsd*rho
    2967              : 
    2968              : 
    2969              : !        Perdew_Wang 91 LSD
    2970              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    2971       251468 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    2972       251468 :          dvxci(ipts,2)=zero
    2973              : !        If non-spin-polarized, first component of dvxci is second
    2974              : !        derivative with respect to TOTAL density.
    2975       251468 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    2976              : !        Compute the second derivative of vx
    2977              : !        vx^(2) = -2*vx^(1)/(3*rhotot)
    2978              : !        end of loop over the spin
    2979              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    2980       251468 :          exc=exc*2
    2981       251468 :          exci(ipts)=exc*rhotot_inv
    2982              : !        -----------------------------------------------------------------------------
    2983              : !        Then takes care of the LSD correlation part of the functional
    2984              : 
    2985       251468 :          rs=rsfac*rhotmot
    2986       251468 :          sqr_rs=sq_rsfac*rhotmo6
    2987       251468 :          rsm1_2=sq_rsfac_inv*rhoto6
    2988              : 
    2989              : !        Formulas A6-A8 of PW92LSD
    2990       251468 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    2991              : 
    2992       251468 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    2993       251468 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    2994       251468 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    2995              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    2996       251468 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    2997       251468 :          ecrs0=ec0_q0*ec0_log
    2998       251468 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    2999       251468 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    3000              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    3001              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    3002       251468 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    3003              : 
    3004       251468 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    3005       251468 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    3006       251468 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    3007       251468 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    3008       251468 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    3009       251468 :          macrs=mac_q0*mac_log
    3010       251468 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    3011              : 
    3012       251468 :          ecrs=ecrs0
    3013       251468 :          decrs_drs=decrs0_drs
    3014       251468 :          decrs_dzeta=0.0_dp
    3015       251468 :          d2ecrs_drs2=d2ecrs0_drs2
    3016       251468 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    3017       251468 :          d2ecrs_drsdzeta=zero
    3018       251468 :          zeta=0.0_dp
    3019              : 
    3020              : 
    3021              : !        Add LSD correlation functional to GGA exchange functional
    3022       251468 :          exci(ipts)=exci(ipts)+ecrs
    3023       251468 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    3024              : 
    3025       251468 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    3026              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    3027       251468 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    3028              : 
    3029       251468 :          dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drho2
    3030       251533 :          dvxci(ipts,2)=dvxci(ipts,2)+d2ecrs_drho2-d2ecrs_dzeta2*rhotot_inv
    3031              : 
    3032              : 
    3033              : !        Correlation has been added
    3034              : !        -----------------------------------------------------------------------------
    3035              : 
    3036              :        end do
    3037              : 
    3038              :      else if (option==3) then
    3039            0 :        do ipts=1,npts
    3040              : 
    3041            0 :          rhotot=rhoarr(ipts)
    3042            0 :          rhotmot=rhom1_3(ipts)
    3043            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3044            0 :          rhotmo6=sqrt(rhotmot)
    3045            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3046              : !        -----------------------------------------------------------------------
    3047              : !        First take care of the exchange part of the functional
    3048              : 
    3049            0 :          exc=zero
    3050              : !        loop over the spin
    3051            0 :          ispden=1
    3052            0 :          rho   =rho_updn(ipts,ispden)
    3053            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    3054            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3055              : !        Perdew_Wang 91 LSD
    3056            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    3057            0 :          exc=exc+ex_lsd*rho
    3058              : 
    3059              : !        Perdew_Wang 91 LSD
    3060              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    3061            0 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    3062            0 :          dvxci(ipts,2)=zero
    3063              : !        If non-spin-polarized, first component of dvxci is second
    3064              : !        derivative with respect to TOTAL density.
    3065            0 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    3066              : !        Compute the second derivative of vx
    3067              : !        vx^(2) = -2*vx^(1)/(3*rhotot)
    3068              : !        end of loop over the spin
    3069              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3070            0 :          exc=exc*2
    3071            0 :          exci(ipts)=exc*rhotot_inv
    3072              : !        -----------------------------------------------------------------------------
    3073              : !        Then takes care of the LSD correlation part of the functional
    3074              : 
    3075              : 
    3076            0 :          rs=rsfac*rhotmot
    3077            0 :          sqr_rs=sq_rsfac*rhotmo6
    3078            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    3079              : 
    3080              : !        Formulas A6-A8 of PW92LSD
    3081            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    3082            0 :          sqr_sqr_rs=max(1.e-15_dp,sqrt(sqr_rs))
    3083            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs/sqr_sqr_rs)
    3084            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+3.5_dp*ec0_b4*rs/sqr_sqr_rs)
    3085            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    3086              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    3087            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    3088            0 :          ecrs0=ec0_q0*ec0_log
    3089            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    3090            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    3091              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    3092              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    3093            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    3094              : 
    3095            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    3096            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    3097            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    3098            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    3099            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    3100            0 :          macrs=mac_q0*mac_log
    3101            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    3102              : 
    3103            0 :          ecrs=ecrs0
    3104            0 :          decrs_drs=decrs0_drs
    3105            0 :          decrs_dzeta=0.0_dp
    3106            0 :          d2ecrs_drs2=d2ecrs0_drs2
    3107            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    3108            0 :          d2ecrs_drsdzeta=zero
    3109            0 :          zeta=0.0_dp
    3110              : 
    3111              : 
    3112              : !        Add LSD correlation functional to GGA exchange functional
    3113            0 :          exci(ipts)=exci(ipts)+ecrs
    3114            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    3115              : 
    3116            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    3117              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    3118            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    3119            0 :          dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drho2
    3120            0 :          dvxci(ipts,2)=dvxci(ipts,2)+d2ecrs_drho2-d2ecrs_dzeta2*rhotot_inv
    3121              : 
    3122              : !        Correlation has been added
    3123              : !        -----------------------------------------------------------------------------
    3124              : 
    3125              :        end do
    3126              : 
    3127              :      end if
    3128              : 
    3129              : 
    3130              :    else if (order**2>1) then
    3131              : !    separate cases depending to option
    3132        29093 :      if(option==2 .or. option==5) then
    3133     26222384 :        do ipts=1,npts
    3134              : 
    3135     26213795 :          rhotot=rhoarr(ipts)
    3136     26213795 :          rhotmot=rhom1_3(ipts)
    3137     26213795 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3138     26213795 :          rhotmo6=sqrt(rhotmot)
    3139     26213795 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3140              : !        -----------------------------------------------------------------------
    3141              : !        First take care of the exchange part of the functional
    3142              : 
    3143     26213795 :          exc=zero
    3144     26213795 :          dvxcdgr(ipts,3)=zero
    3145              : !        loop over the spin
    3146     26213795 :          ispden=1
    3147     26213795 :          rho   =rho_updn(ipts,ispden)
    3148     26213795 :          rhomot=rho_updnm1_3(ipts,ispden)
    3149     26213795 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3150              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    3151     26213795 :          rho_inv=rhomot*rhomot*rhomot
    3152     26213795 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    3153     26213795 :          ss=grho2_updn(ipts,ispden)*coeffss
    3154              : 
    3155     26213795 :          divss=one/(one+mu_divkappa*ss)
    3156     26213795 :          dfxdss= mu*divss*divss
    3157     26213795 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    3158              : 
    3159     26213795 :          fx    = one+kappa*(one-divss)
    3160     26213795 :          ex_gga= ex_lsd*fx
    3161     26213795 :          dssdn=-eight*third*ss*rho_inv
    3162     26213795 :          dfxdn  = dfxdss*dssdn
    3163     26213795 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    3164              : !        The new definition (v3.3) includes the division by the norm of the gradient
    3165     26213795 :          dssdg =two*coeffss
    3166     26213795 :          dfxdg=dfxdss*dssdg
    3167     26213795 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    3168     26213795 :          exc=exc+ex_gga*rho
    3169              : 
    3170              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    3171              : !        Components 3 or 4
    3172     26213795 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    3173              : !        Components 1 or 2
    3174     26213795 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    3175     26213795 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    3176              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    3177     26213795 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    3178              : !        Components 5 or 6
    3179     26213795 :          d2ssdndg=-eight*third*dssdg*rho_inv
    3180     26213795 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    3181     26213795 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    3182              : !        Components 7 or 8
    3183     26213795 :          d2fxdg2=d2fxdss2*dssdg**2
    3184     26213795 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    3185              : !        For the time being, treat non-spin-polarized like spin-polarized
    3186     26213795 :          dvxci(ipts,2)=dvxci(ipts,1)
    3187     26213795 :          dvxci(ipts,4)=dvxci(ipts,3)
    3188     26213795 :          dvxci(ipts,6)=dvxci(ipts,5)
    3189     26213795 :          dvxci(ipts,8)=dvxci(ipts,7)
    3190              : !        end of loop over the spin
    3191              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3192     26213795 :          exc=exc*2
    3193     26213795 :          exci(ipts)=exc*rhotot_inv
    3194              : !        -----------------------------------------------------------------------------
    3195              : !        Then takes care of the LSD correlation part of the functional
    3196              : 
    3197     26213795 :          rs=rsfac*rhotmot
    3198     26213795 :          sqr_rs=sq_rsfac*rhotmo6
    3199     26213795 :          rsm1_2=sq_rsfac_inv*rhoto6
    3200              : 
    3201              : !        Formulas A6-A8 of PW92LSD
    3202     26213795 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    3203     26213795 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    3204     26213795 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    3205     26213795 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    3206              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    3207     26213795 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    3208     26213795 :          ecrs0=ec0_q0*ec0_log
    3209     26213795 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    3210     26213795 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    3211              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    3212              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    3213     26213795 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    3214     26213795 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    3215     26213795 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    3216     26213795 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    3217     26213795 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    3218     26213795 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    3219     26213795 :          macrs=mac_q0*mac_log
    3220     26213795 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    3221     26213795 :          ecrs=ecrs0
    3222     26213795 :          decrs_drs=decrs0_drs
    3223     26213795 :          decrs_dzeta=0.0_dp
    3224     26213795 :          d2ecrs_drs2=d2ecrs0_drs2
    3225     26213795 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    3226     26213795 :          d2ecrs_drsdzeta=zero
    3227     26213795 :          zeta=0.0_dp
    3228              : 
    3229              : !        Add LSD correlation functional to GGA exchange functional
    3230     26213795 :          exci(ipts)=exci(ipts)+ecrs
    3231     26213795 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    3232              : 
    3233     26213795 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    3234              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    3235     26213795 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    3236     26213795 :          dvxci(ipts,9)=d2ecrs_drho2
    3237     26213795 :          dvxci(ipts,10)=d2ecrs_drho2
    3238     26213795 :          dvxci(ipts,11)=d2ecrs_drho2
    3239              : 
    3240              : 
    3241              : !        -----------------------------------------------------------------------------
    3242              : !        Eventually add the GGA correlation part of the PBE functional
    3243              : !        Note : the computation of the potential in the spin-unpolarized
    3244              : !        case could be optimized much further. Other optimizations are left to do.
    3245              : 
    3246     26213795 :          phi_zeta=1.0_dp
    3247     26213795 :          phip_zeta=0.0_dp
    3248     26213795 :          phi_zeta_inv=1.0_dp
    3249     26213795 :          phi_logder=0.0_dp
    3250     26213795 :          phi3_zeta=1.0_dp
    3251     26213795 :          gamphi3inv=gamma_inv
    3252     26213795 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
    3253              : 
    3254              : !        From ec to bb
    3255     26213795 :          bb=ecrs*gamphi3inv
    3256     26213795 :          dbb_drs=decrs_drs*gamphi3inv
    3257     26213795 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    3258     26213795 :          d2bb_drs2=d2ecrs_drs2*gamphi3inv
    3259     26213795 :          d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    3260              :          d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    3261     26213795 : &         12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    3262              : 
    3263              : !        From bb to cc
    3264     26213795 :          exp_pbe=exp(-bb)
    3265     26213795 :          cc=one/(exp_pbe-one)
    3266     26213795 :          dcc_dbb=cc*cc*exp_pbe
    3267     26213795 :          dcc_drs=dcc_dbb*dbb_drs
    3268     26213795 :          dcc_dzeta=dcc_dbb*dbb_dzeta
    3269     26213795 :          d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    3270     26213795 :          d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    3271     26213795 :          d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    3272     26213795 :          d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    3273              : 
    3274              : !        From cc to aa
    3275     26213795 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    3276     26213795 :          aa=coeff_aa*cc
    3277     26213795 :          daa_drs=coeff_aa*dcc_drs
    3278     26213795 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    3279     26213795 :          d2aa_drs2=coeff_aa*d2cc_drs2
    3280     26213795 :          d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    3281              :          d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    3282     26213795 : &         coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    3283              : 
    3284              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
    3285     26213795 :          grrho2=four*grho2_updn(ipts,1)
    3286     26213795 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    3287              : !        Note that tt is (the t variable of PBE divided by phi) squared
    3288     26213795 :          tt=half*grrho2*dtt_dg
    3289              : 
    3290              : !        Get xx from aa and tt
    3291     26213795 :          xx=aa*tt
    3292     26213795 :          dxx_drs=daa_drs*tt
    3293     26213795 :          dxx_dzeta=daa_dzeta*tt
    3294     26213795 :          dxx_dtt=aa
    3295     26213795 :          d2xx_drs2=d2aa_drs2*tt
    3296     26213795 :          d2xx_drsdzeta=d2aa_drsdzeta*tt
    3297     26213795 :          d2xx_drsdtt=daa_drs
    3298     26213795 :          d2xx_dttdzeta=daa_dzeta
    3299     26213795 :          d2xx_dzeta2=d2aa_dzeta2*tt
    3300              : 
    3301              : !        From xx to pade
    3302     26213795 :          pade_den=one/(one+xx*(one+xx))
    3303     26213795 :          pade=(one+xx)*pade_den
    3304     26213795 :          dpade_dxx=-xx*(two+xx)*pade_den**2
    3305     26213795 :          dpade_drs=dpade_dxx*dxx_drs
    3306     26213795 :          dpade_dtt=dpade_dxx*dxx_dtt
    3307     26213795 :          dpade_dzeta=dpade_dxx*dxx_dzeta
    3308     26213795 :          d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    3309     26213795 :          d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    3310     26213795 :          d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    3311     26213795 :          d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    3312     26213795 :          d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    3313     26213795 :          d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    3314     26213795 :          d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    3315              : 
    3316              : 
    3317              : !        From pade to qq
    3318     26213795 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    3319     26213795 :          qq=coeff_qq*pade
    3320     26213795 :          dqq_drs=coeff_qq*dpade_drs
    3321     26213795 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    3322     26213795 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    3323     26213795 :          d2qq_drs2=coeff_qq*d2pade_drs2
    3324     26213795 :          d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    3325     26213795 :          d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    3326     26213795 :          d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    3327              :          d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    3328     26213795 : &         coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    3329              :          d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    3330              : &         +six*pade*phi_logder*phi_logder            &
    3331     26213795 : &         -two*pade*phi_zeta_inv*phipp_zeta)
    3332              : 
    3333              : !        From qq to rr
    3334     26213795 :          arg_rr=one+beta*gamma_inv*qq
    3335     26213795 :          div_rr=one/arg_rr
    3336     26213795 :          rr=gamma*log(arg_rr)
    3337     26213795 :          drr_dqq=beta*div_rr
    3338     26213795 :          drr_drs=drr_dqq*dqq_drs
    3339     26213795 :          drr_dtt=drr_dqq*dqq_dtt
    3340     26213795 :          drr_dzeta=drr_dqq*dqq_dzeta
    3341     26213795 :          d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    3342     26213795 :          d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    3343     26213795 :          d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    3344     26213795 :          d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    3345     26213795 :          d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    3346     26213795 :          d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    3347     26213795 :          d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    3348              : 
    3349              : !        From rr to hh
    3350     26213795 :          hh=phi3_zeta*rr
    3351     26213795 :          dhh_drs=phi3_zeta*drr_drs
    3352     26213795 :          dhh_dtt=phi3_zeta*drr_dtt
    3353     26213795 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    3354     26213795 :          d2hh_drs2=phi3_zeta*d2rr_drs2
    3355     26213795 :          d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    3356     26213795 :          d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    3357     26213795 :          d2hh_dtt2=phi3_zeta*d2rr_dtt2
    3358     26213795 :          d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    3359              :          d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    3360              : &         six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    3361     26213795 : &         +three*phi_zeta*phi_zeta*rr*phipp_zeta
    3362              : 
    3363              : 
    3364              : !        The GGA correlation energy is added
    3365     26213795 :          exci(ipts)=exci(ipts)+hh
    3366              : 
    3367              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    3368              : 
    3369              : 
    3370              : !        From hh to the derivative of the energy wrt the density
    3371     26213795 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    3372     26213795 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
    3373              : 
    3374              : !        From hh to the derivative of the energy wrt to the gradient of the
    3375              : !        density, divided by the gradient of the density
    3376              : !        (The v3.3 definition includes the division by the norm of the gradient)
    3377     26213795 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    3378              : 
    3379              :          d2rhohh_drho2=rhotot_inv*&
    3380              : &         (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    3381              : &         +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    3382              : &         +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    3383     26213795 : &         +two*seven*third*tt*zeta*d2hh_dttdzeta)
    3384              :          d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    3385     26213795 : &         -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    3386              : 
    3387              : !        Component 12 : first derivative with respect to the gradient
    3388              : !        of the density, div by the grad of the density
    3389     26213795 :          dvxci(ipts,12)=dvxcdgr(ipts,3)
    3390              : !        Components 9, 10 and 11 : second derivatives with respect to the spin-density
    3391              : !        Note that there is already a contribution from LSDA
    3392              :          dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    3393              : &         ( d2hh_dzeta2*(one-two*zeta) &
    3394     26213795 : &         -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    3395     26213795 :          dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    3396              :          dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    3397              : &         ( d2hh_dzeta2*(one+two*zeta) &
    3398     26213795 : &         +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    3399              : !        Components 13 and 14 : second derivatives with respect to spin density
    3400              : !        and gradient, divided by the gradient
    3401     26213795 :          dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    3402     26213795 :          dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    3403              : !        Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    3404              : !        divided by the grad
    3405     26213795 :          dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    3406              : 
    3407              : 
    3408              : !        End condition of GGA
    3409              : 
    3410              : !        Correlation has been added
    3411              : !        -----------------------------------------------------------------------------
    3412              : 
    3413              : !        vxci(ipts,2)=vxci(ipts,1)
    3414     26222384 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    3415              : 
    3416              :        end do
    3417              : 
    3418              :      else if ((option==6) .or. (option==7)) then
    3419        42254 :        do ipts=1,npts
    3420              : 
    3421        42240 :          rhotot=rhoarr(ipts)
    3422        42240 :          rhotmot=rhom1_3(ipts)
    3423        42240 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3424        42240 :          rhotmo6=sqrt(rhotmot)
    3425        42240 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3426              : !        -----------------------------------------------------------------------
    3427              : !        First take care of the exchange part of the functional
    3428              : 
    3429        42240 :          exc=zero
    3430        42240 :          dvxcdgr(ipts,3)=zero
    3431              : !        loop over the spin
    3432        42240 :          ispden=1
    3433        42240 :          rho   =rho_updn(ipts,ispden)
    3434        42240 :          rhomot=rho_updnm1_3(ipts,ispden)
    3435        42240 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3436              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    3437        42240 :          rho_inv=rhomot*rhomot*rhomot
    3438        42240 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    3439        42240 :          ss=grho2_updn(ipts,ispden)*coeffss
    3440              : 
    3441        42240 :          if (option==6) then
    3442         9600 :            divss=exp(-mu_divkappa*ss)
    3443         9600 :            dfxdss= mu*divss
    3444         9600 :            d2fxdss2=-mu*mu_divkappa*divss
    3445              : 
    3446         9600 :            fx    = one+kappa*(one-divss)
    3447         9600 :            ex_gga= ex_lsd*fx
    3448         9600 :            dssdn=-eight*third*ss*rho_inv
    3449         9600 :            dfxdn  = dfxdss*dssdn
    3450         9600 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    3451              : !          The new definition (v3.3) includes the division by the norm of the gradient
    3452         9600 :            dssdg =two*coeffss
    3453         9600 :            dfxdg=dfxdss*dssdg
    3454         9600 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    3455         9600 :            exc=exc+ex_gga*rho
    3456              : !          This is the Wu and Cohen modification
    3457              :          else
    3458        32640 :            expss=exp(-ss)
    3459        32640 :            p1_wc=b_wc+(mu-b_wc)*(one-ss)*expss+two*c_wc*ss/(one+c_wc*ss*ss)
    3460              :            p2_wc=d_wc*(ss-two)*expss+two*c_wc/(one+c_wc*ss*ss)-&
    3461        32640 : &           four*c_wc*c_wc*ss*ss/((one+c_wc*ss*ss)*(one+c_wc*ss*ss))
    3462        32640 :            divss=one/(one+(b_wc*ss+d_wc*ss*expss+log(one+c_wc*ss*ss))/kappa)
    3463        32640 :            dfxdss=p1_wc*divss*divss
    3464        32640 :            d2fxdss2=p2_wc*divss*divss-two*divss*divss*divss*p1_wc*p1_wc/kappa
    3465              : 
    3466        32640 :            fx    = one+kappa*(one-divss)
    3467        32640 :            ex_gga= ex_lsd*fx
    3468        32640 :            dssdn=-eight*third*ss*rho_inv
    3469        32640 :            dfxdn  = dfxdss*dssdn
    3470        32640 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    3471              : !          The new definition (v3.3) includes the division by the norm of the gradient
    3472        32640 :            dssdg =two*coeffss
    3473        32640 :            dfxdg=dfxdss*dssdg
    3474        32640 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    3475        32640 :            exc=exc+ex_gga*rho
    3476              :          end if
    3477              : 
    3478              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    3479              : !        Components 3 or 4
    3480        42240 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    3481              : !        Components 1 or 2
    3482        42240 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    3483        42240 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    3484              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    3485        42240 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    3486              : !        Components 5 or 6
    3487        42240 :          d2ssdndg=-eight*third*dssdg*rho_inv
    3488        42240 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    3489        42240 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    3490              : !        Components 7 or 8
    3491        42240 :          d2fxdg2=d2fxdss2*dssdg**2
    3492        42240 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    3493              : !        For the time being, treat non-spin-polarized like spin-polarized
    3494        42240 :          dvxci(ipts,2)=dvxci(ipts,1)
    3495        42240 :          dvxci(ipts,4)=dvxci(ipts,3)
    3496        42240 :          dvxci(ipts,6)=dvxci(ipts,5)
    3497        42240 :          dvxci(ipts,8)=dvxci(ipts,7)
    3498              : !        end of loop over the spin
    3499              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3500        42240 :          exc=exc*2
    3501        42240 :          exci(ipts)=exc*rhotot_inv
    3502              : !        -----------------------------------------------------------------------------
    3503              : !        Then takes care of the LSD correlation part of the functional
    3504              : 
    3505              : 
    3506        42240 :          rs=rsfac*rhotmot
    3507        42240 :          sqr_rs=sq_rsfac*rhotmo6
    3508        42240 :          rsm1_2=sq_rsfac_inv*rhoto6
    3509              : 
    3510              : !        Formulas A6-A8 of PW92LSD
    3511        42240 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    3512        42240 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    3513        42240 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    3514        42240 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    3515              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    3516        42240 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    3517        42240 :          ecrs0=ec0_q0*ec0_log
    3518        42240 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    3519        42240 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    3520              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    3521              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    3522        42240 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    3523        42240 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    3524        42240 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    3525        42240 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    3526        42240 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    3527        42240 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    3528        42240 :          macrs=mac_q0*mac_log
    3529        42240 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    3530        42240 :          ecrs=ecrs0
    3531        42240 :          decrs_drs=decrs0_drs
    3532        42240 :          decrs_dzeta=0.0_dp
    3533        42240 :          d2ecrs_drs2=d2ecrs0_drs2
    3534        42240 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    3535        42240 :          d2ecrs_drsdzeta=zero
    3536        42240 :          zeta=0.0_dp
    3537              : 
    3538              : !        Add LSD correlation functional to GGA exchange functional
    3539        42240 :          exci(ipts)=exci(ipts)+ecrs
    3540        42240 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    3541              : 
    3542        42240 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    3543              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    3544        42240 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    3545        42240 :          dvxci(ipts,9)=d2ecrs_drho2
    3546        42240 :          dvxci(ipts,10)=d2ecrs_drho2
    3547        42240 :          dvxci(ipts,11)=d2ecrs_drho2
    3548              : 
    3549              : 
    3550              : !        -----------------------------------------------------------------------------
    3551              : !        Eventually add the GGA correlation part of the PBE functional
    3552              : !        Note : the computation of the potential in the spin-unpolarized
    3553              : !        case could be optimized much further. Other optimizations are left to do.
    3554              : 
    3555        42240 :          phi_zeta=1.0_dp
    3556        42240 :          phip_zeta=0.0_dp
    3557        42240 :          phi_zeta_inv=1.0_dp
    3558        42240 :          phi_logder=0.0_dp
    3559        42240 :          phi3_zeta=1.0_dp
    3560        42240 :          gamphi3inv=gamma_inv
    3561        42240 :          phipp_zeta=-two*ninth*alpha_zeta*alpha_zeta
    3562              : 
    3563              : !        From ec to bb
    3564        42240 :          bb=ecrs*gamphi3inv
    3565        42240 :          dbb_drs=decrs_drs*gamphi3inv
    3566        42240 :          dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    3567        42240 :          d2bb_drs2=d2ecrs_drs2*gamphi3inv
    3568        42240 :          d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    3569              :          d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    3570        42240 : &         12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    3571              : 
    3572              : !        From bb to cc
    3573        42240 :          exp_pbe=exp(-bb)
    3574        42240 :          cc=one/(exp_pbe-one)
    3575        42240 :          dcc_dbb=cc*cc*exp_pbe
    3576        42240 :          dcc_drs=dcc_dbb*dbb_drs
    3577        42240 :          dcc_dzeta=dcc_dbb*dbb_dzeta
    3578        42240 :          d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    3579        42240 :          d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    3580        42240 :          d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    3581        42240 :          d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    3582              : 
    3583              : !        From cc to aa
    3584        42240 :          coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    3585        42240 :          aa=coeff_aa*cc
    3586        42240 :          daa_drs=coeff_aa*dcc_drs
    3587        42240 :          daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    3588        42240 :          d2aa_drs2=coeff_aa*d2cc_drs2
    3589        42240 :          d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    3590              :          d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    3591        42240 : &         coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    3592              : 
    3593              : !        Introduce tt : do not assume that the spin-dependent gradients are collinear
    3594        42240 :          grrho2=four*grho2_updn(ipts,1)
    3595        42240 :          dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    3596              : !        Note that tt is (the t variable of PBE divided by phi) squared
    3597        42240 :          tt=half*grrho2*dtt_dg
    3598              : 
    3599              : !        Get xx from aa and tt
    3600        42240 :          xx=aa*tt
    3601        42240 :          dxx_drs=daa_drs*tt
    3602        42240 :          dxx_dzeta=daa_dzeta*tt
    3603        42240 :          dxx_dtt=aa
    3604        42240 :          d2xx_drs2=d2aa_drs2*tt
    3605        42240 :          d2xx_drsdzeta=d2aa_drsdzeta*tt
    3606        42240 :          d2xx_drsdtt=daa_drs
    3607        42240 :          d2xx_dttdzeta=daa_dzeta
    3608        42240 :          d2xx_dzeta2=d2aa_dzeta2*tt
    3609              : 
    3610              : !        From xx to pade
    3611        42240 :          pade_den=one/(one+xx*(one+xx))
    3612        42240 :          pade=(one+xx)*pade_den
    3613        42240 :          dpade_dxx=-xx*(two+xx)*pade_den**2
    3614        42240 :          dpade_drs=dpade_dxx*dxx_drs
    3615        42240 :          dpade_dtt=dpade_dxx*dxx_dtt
    3616        42240 :          dpade_dzeta=dpade_dxx*dxx_dzeta
    3617        42240 :          d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    3618        42240 :          d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    3619        42240 :          d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    3620        42240 :          d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    3621        42240 :          d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    3622        42240 :          d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    3623        42240 :          d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    3624              : 
    3625              : 
    3626              : !        From pade to qq
    3627        42240 :          coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    3628        42240 :          qq=coeff_qq*pade
    3629        42240 :          dqq_drs=coeff_qq*dpade_drs
    3630        42240 :          dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    3631        42240 :          dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    3632        42240 :          d2qq_drs2=coeff_qq*d2pade_drs2
    3633        42240 :          d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    3634        42240 :          d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    3635        42240 :          d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    3636              :          d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    3637        42240 : &         coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    3638              :          d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    3639              : &         +six*pade*phi_logder*phi_logder            &
    3640        42240 : &         -two*pade*phi_zeta_inv*phipp_zeta)
    3641              : 
    3642              : !        From qq to rr
    3643        42240 :          arg_rr=one+beta*gamma_inv*qq
    3644        42240 :          div_rr=one/arg_rr
    3645        42240 :          rr=gamma*log(arg_rr)
    3646        42240 :          drr_dqq=beta*div_rr
    3647        42240 :          drr_drs=drr_dqq*dqq_drs
    3648        42240 :          drr_dtt=drr_dqq*dqq_dtt
    3649        42240 :          drr_dzeta=drr_dqq*dqq_dzeta
    3650        42240 :          d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    3651        42240 :          d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    3652        42240 :          d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    3653        42240 :          d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    3654        42240 :          d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    3655        42240 :          d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    3656        42240 :          d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    3657              : 
    3658              : !        From rr to hh
    3659        42240 :          hh=phi3_zeta*rr
    3660        42240 :          dhh_drs=phi3_zeta*drr_drs
    3661        42240 :          dhh_dtt=phi3_zeta*drr_dtt
    3662        42240 :          dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    3663        42240 :          d2hh_drs2=phi3_zeta*d2rr_drs2
    3664        42240 :          d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    3665        42240 :          d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    3666        42240 :          d2hh_dtt2=phi3_zeta*d2rr_dtt2
    3667        42240 :          d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    3668              :          d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    3669              : &         six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    3670        42240 : &         +three*phi_zeta*phi_zeta*rr*phipp_zeta
    3671              : 
    3672              : 
    3673              : !        The GGA correlation energy is added
    3674        42240 :          exci(ipts)=exci(ipts)+hh
    3675              : 
    3676              : !        Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    3677              : 
    3678              : 
    3679              : !        From hh to the derivative of the energy wrt the density
    3680        42240 :          drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    3681        42240 :          vxci(ipts,1)=vxci(ipts,1)+drhohh_drho
    3682              : 
    3683              : !        From hh to the derivative of the energy wrt to the gradient of the
    3684              : !        density, divided by the gradient of the density
    3685              : !        (The v3.3 definition includes the division by the norm of the gradient)
    3686        42240 :          dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    3687              : 
    3688              :          d2rhohh_drho2=rhotot_inv*&
    3689              : &         (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    3690              : &         +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    3691              : &         +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    3692        42240 : &         +two*seven*third*tt*zeta*d2hh_dttdzeta)
    3693              :          d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    3694        42240 : &         -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    3695              : 
    3696              : !        Component 12 : first derivative with respect to the gradient
    3697              : !        of the density, div by the grad of the density
    3698        42240 :          dvxci(ipts,12)=dvxcdgr(ipts,3)
    3699              : !        Components 9, 10 and 11 : second derivatives with respect to the spin-density
    3700              : !        Note that there is already a contribution from LSDA
    3701              :          dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    3702              : &         ( d2hh_dzeta2*(one-two*zeta) &
    3703        42240 : &         -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    3704        42240 :          dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    3705              :          dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    3706              : &         ( d2hh_dzeta2*(one+two*zeta) &
    3707        42240 : &         +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    3708              : !        Components 13 and 14 : second derivatives with respect to spin density
    3709              : !        and gradient, divided by the gradient
    3710        42240 :          dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    3711        42240 :          dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    3712              : !        Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    3713              : !        divided by the grad
    3714        42240 :          dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    3715              : 
    3716              : 
    3717              : !        End condition of GGA
    3718              : 
    3719              : !        Correlation has been added
    3720              : !        -----------------------------------------------------------------------------
    3721              : 
    3722              : !        vxci(ipts,2)=vxci(ipts,1)
    3723        42254 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    3724              : 
    3725              :        end do
    3726              : 
    3727              :      else if (option==-1) then
    3728            0 :        do ipts=1,npts
    3729              : 
    3730            0 :          rhotot=rhoarr(ipts)
    3731            0 :          rhotmot=rhom1_3(ipts)
    3732            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3733            0 :          rhotmo6=sqrt(rhotmot)
    3734            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3735              : !        -----------------------------------------------------------------------
    3736              : !        First take care of the exchange part of the functional
    3737              : 
    3738            0 :          exc=zero
    3739              : !        loop over the spin
    3740            0 :          ispden=1
    3741            0 :          rho   =rho_updn(ipts,ispden)
    3742            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    3743            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3744              : !        Perdew_Wang 91 LSD
    3745            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    3746            0 :          exc=exc+ex_lsd*rho
    3747              : 
    3748              : !        Perdew_Wang 91 LSD
    3749              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    3750            0 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    3751            0 :          dvxci(ipts,2)=zero
    3752              : !        If non-spin-polarized, first component of dvxci is second
    3753              : !        derivative with respect to TOTAL density.
    3754            0 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    3755              : !        Compute the second derivative of vx
    3756              : !        vx^(2) = -2*vx^(1)/(3*rhotot)
    3757              : !        end of loop over the spin
    3758              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3759            0 :          exc=exc*2
    3760            0 :          exci(ipts)=exc*rhotot_inv
    3761              : !        -----------------------------------------------------------------------------
    3762              : !        Then takes care of the LSD correlation part of the functional
    3763              : 
    3764              :        end do
    3765              : 
    3766              :      else if (option==-2) then
    3767      4158971 :        do ipts=1,npts
    3768              : 
    3769      4157876 :          rhotot=rhoarr(ipts)
    3770      4157876 :          rhotmot=rhom1_3(ipts)
    3771      4157876 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3772      4157876 :          rhotmo6=sqrt(rhotmot)
    3773      4157876 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3774              : !        -----------------------------------------------------------------------
    3775              : !        First take care of the exchange part of the functional
    3776              : 
    3777      4157876 :          exc=zero
    3778      4157876 :          dvxcdgr(ipts,3)=zero
    3779              : !        loop over the spin
    3780      4157876 :          ispden=1
    3781      4157876 :          rho   =rho_updn(ipts,ispden)
    3782      4157876 :          rhomot=rho_updnm1_3(ipts,ispden)
    3783      4157876 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3784              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    3785      4157876 :          rho_inv=rhomot*rhomot*rhomot
    3786      4157876 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    3787      4157876 :          ss=grho2_updn(ipts,ispden)*coeffss
    3788      4157876 :          divss=one/(one+mu_divkappa*ss)
    3789      4157876 :          dfxdss= mu*divss*divss
    3790      4157876 :          d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    3791      4157876 :          fx    = one+kappa*(one-divss)
    3792      4157876 :          ex_gga= ex_lsd*fx
    3793      4157876 :          dssdn=-eight*third*ss*rho_inv
    3794      4157876 :          dfxdn  = dfxdss*dssdn
    3795      4157876 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    3796              : !        The new definition (v3.3) includes the division by the norm of the gradient
    3797      4157876 :          dssdg =two*coeffss
    3798      4157876 :          dfxdg=dfxdss*dssdg
    3799      4157876 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    3800      4157876 :          exc=exc+ex_gga*rho
    3801              : 
    3802              : !        Perdew-Burke-Ernzerhof GGA, exchange part
    3803              : !        Components 3 or 4
    3804      4157876 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    3805              : !        Components 1 or 2
    3806      4157876 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    3807      4157876 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    3808              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    3809      4157876 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    3810              : !        Components 5 or 6
    3811      4157876 :          d2ssdndg=-eight*third*dssdg*rho_inv
    3812      4157876 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    3813      4157876 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    3814              : !        Components 7 or 8
    3815      4157876 :          d2fxdg2=d2fxdss2*dssdg**2
    3816      4157876 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    3817              : !        For the time being, treat non-spin-polarized like spin-polarized
    3818      4157876 :          dvxci(ipts,2)=dvxci(ipts,1)
    3819      4157876 :          dvxci(ipts,4)=dvxci(ipts,3)
    3820      4157876 :          dvxci(ipts,6)=dvxci(ipts,5)
    3821      4157876 :          dvxci(ipts,8)=dvxci(ipts,7)
    3822              : !        end of loop over the spin
    3823              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3824      4157876 :          exc=exc*2
    3825      4157876 :          exci(ipts)=exc*rhotot_inv
    3826              : !        -----------------------------------------------------------------------------
    3827              : !        Then takes care of the LSD correlation part of the functional
    3828              : 
    3829              : !        Correlation has been added
    3830              : !        -----------------------------------------------------------------------------
    3831              : 
    3832              : !        vxci(ipts,2)=vxci(ipts,1)
    3833      4158971 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    3834              : 
    3835              :        end do
    3836              : 
    3837              : 
    3838              :      else if(option==-4) then
    3839              : 
    3840              : 
    3841            0 :        do ipts=1,npts
    3842              : 
    3843            0 :          rhotot=rhoarr(ipts)
    3844            0 :          rhotmot=rhom1_3(ipts)
    3845            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3846            0 :          rhotmo6=sqrt(rhotmot)
    3847            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3848              : !        -----------------------------------------------------------------------
    3849              : !        First take care of the exchange part of the functional
    3850              : 
    3851            0 :          exc=zero
    3852            0 :          dvxcdgr(ipts,3)=zero
    3853              : !        loop over the spin
    3854            0 :          ispden=1
    3855            0 :          rho   =rho_updn(ipts,ispden)
    3856            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    3857            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3858              : !        VALENTINO R. COOPER C09x GGA, This is an exchange term proposed
    3859              : !        to use together with vdw-DF (see above).
    3860            0 :          rho_inv=rhomot*rhomot*rhomot
    3861            0 :          coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    3862              : !        the quarter that is lacking is compensated by the grho2_updn in the
    3863              : !        next line.
    3864            0 :          ss=grho2_updn(ipts,ispden)*coeffss
    3865            0 :          alphs2=alpha_c09*ss
    3866            0 :          alphmu=alpha_c09*mu_c09
    3867              :          dfxdss= mu_c09*exp(-alphs2)*(one-alphs2)+&
    3868            0 : &         kappa*alpha_c09*exp(-alphs2/two)/two
    3869              :          d2fxdss2=-alphmu*exp(-alphs2)*(two-alphs2)-&
    3870            0 : &         kappa*(alpha_c09**two)*exp(alphs2/two)/four
    3871            0 :          fx    = one+mu_c09*ss*exp(-alphs2)+kappa*(one-exp(-alphs2/two))
    3872            0 :          ex_gga= ex_lsd*fx
    3873            0 :          dssdn=-eight*third*ss*rho_inv
    3874            0 :          dfxdn  = dfxdss*dssdn
    3875            0 :          vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    3876              : !        The new definition (v3.3) includes the division by the norm of the gradient
    3877            0 :          dssdg =two*coeffss
    3878            0 :          dfxdg=dfxdss*dssdg
    3879            0 :          dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    3880            0 :          exc=exc+ex_gga*rho
    3881              : 
    3882              : !        Cooper C09x GGA exchange
    3883              : !        Components 3 or 4
    3884            0 :          dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    3885              : !        Components 1 or 2
    3886            0 :          d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    3887            0 :          d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    3888              :          dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    3889            0 : &         ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    3890              : !        Components 5 or 6
    3891            0 :          d2ssdndg=-eight*third*dssdg*rho_inv
    3892            0 :          d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    3893            0 :          dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    3894              : !        Components 7 or 8
    3895            0 :          d2fxdg2=d2fxdss2*dssdg**2
    3896            0 :          dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    3897              : !        For the time being, treat non-spin-polarized like spin-polarized
    3898            0 :          dvxci(ipts,2)=dvxci(ipts,1)
    3899            0 :          dvxci(ipts,4)=dvxci(ipts,3)
    3900            0 :          dvxci(ipts,6)=dvxci(ipts,5)
    3901            0 :          dvxci(ipts,8)=dvxci(ipts,7)
    3902              : 
    3903              : !        end of loop over the spin
    3904              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3905            0 :          exc=exc*2
    3906            0 :          exci(ipts)=exc*rhotot_inv
    3907              : !        -----------------------------------------------------------------------------
    3908              : !        Then takes care of the LSD correlation part of the functional
    3909              : 
    3910              : !        Correlation has been added
    3911              : !        -----------------------------------------------------------------------------
    3912              : 
    3913              : !        vxci(ipts,2)=vxci(ipts,1)
    3914            0 :          dvxcdgr(ipts,2)=dvxcdgr(ipts,1)
    3915              : 
    3916              :        end do
    3917              : 
    3918              : 
    3919              :      else if (option==1) then
    3920     69245392 :        do ipts=1,npts
    3921              : 
    3922     69225997 :          rhotot=rhoarr(ipts)
    3923     69225997 :          rhotmot=rhom1_3(ipts)
    3924     69225997 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    3925     69225997 :          rhotmo6=sqrt(rhotmot)
    3926     69225997 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    3927              : !        -----------------------------------------------------------------------
    3928              : !        First take care of the exchange part of the functional
    3929              : 
    3930     69225997 :          exc=zero
    3931              : !        loop over the spin
    3932     69225997 :          ispden=1
    3933     69225997 :          rho   =rho_updn(ipts,ispden)
    3934     69225997 :          rhomot=rho_updnm1_3(ipts,ispden)
    3935     69225997 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    3936              : !        Perdew_Wang 91 LSD
    3937     69225997 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    3938     69225997 :          exc=exc+ex_lsd*rho
    3939              : 
    3940              : !        Perdew_Wang 91 LSD
    3941              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    3942     69225997 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    3943     69225997 :          dvxci(ipts,2)=zero
    3944              : !        If non-spin-polarized, first component of dvxci is second
    3945              : !        derivative with respect to TOTAL density.
    3946     69225997 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    3947              : !        Compute the second derivative of vx
    3948              : !        vx^(2) = -2*vx^(1)/(3*rhotot)
    3949              : !        end of loop over the spin
    3950              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    3951     69225997 :          exc=exc*2
    3952     69225997 :          exci(ipts)=exc*rhotot_inv
    3953              : !        -----------------------------------------------------------------------------
    3954              : !        Then takes care of the LSD correlation part of the functional
    3955              : 
    3956              : 
    3957     69225997 :          rs=rsfac*rhotmot
    3958     69225997 :          sqr_rs=sq_rsfac*rhotmo6
    3959     69225997 :          rsm1_2=sq_rsfac_inv*rhoto6
    3960              : 
    3961              : !        Formulas A6-A8 of PW92LSD
    3962     69225997 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    3963     69225997 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    3964     69225997 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    3965     69225997 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    3966              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    3967     69225997 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    3968     69225997 :          ecrs0=ec0_q0*ec0_log
    3969     69225997 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    3970     69225997 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    3971              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    3972              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    3973     69225997 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    3974     69225997 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    3975     69225997 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    3976     69225997 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    3977     69225997 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    3978     69225997 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    3979     69225997 :          macrs=mac_q0*mac_log
    3980     69225997 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    3981     69225997 :          ecrs=ecrs0
    3982     69225997 :          decrs_drs=decrs0_drs
    3983     69225997 :          decrs_dzeta=0.0_dp
    3984     69225997 :          d2ecrs_drs2=d2ecrs0_drs2
    3985     69225997 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    3986     69225997 :          d2ecrs_drsdzeta=zero
    3987     69225997 :          zeta=0.0_dp
    3988              : 
    3989              : !        Add LSD correlation functional to GGA exchange functional
    3990     69225997 :          exci(ipts)=exci(ipts)+ecrs
    3991     69225997 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    3992              : 
    3993     69225997 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    3994              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    3995     69225997 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    3996              : 
    3997     69245392 :          dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drho2
    3998              : 
    3999              :        end do
    4000              :      else if (option==3) then
    4001            0 :        do ipts=1,npts
    4002              : 
    4003            0 :          rhotot=rhoarr(ipts)
    4004            0 :          rhotmot=rhom1_3(ipts)
    4005            0 :          rhotot_inv=rhotmot*rhotmot*rhotmot
    4006            0 :          rhotmo6=sqrt(rhotmot)
    4007            0 :          rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    4008              : !        -----------------------------------------------------------------------
    4009              : !        First take care of the exchange part of the functional
    4010              : 
    4011            0 :          exc=zero
    4012              : !        loop over the spin
    4013            0 :          ispden=1
    4014            0 :          rho   =rho_updn(ipts,ispden)
    4015            0 :          rhomot=rho_updnm1_3(ipts,ispden)
    4016            0 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    4017              : !        Perdew_Wang 91 LSD
    4018            0 :          vxci(ipts,ispden)=four_thirds*ex_lsd
    4019            0 :          exc=exc+ex_lsd*rho
    4020              : 
    4021              : !        Perdew_Wang 91 LSD
    4022              :          dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    4023            0 : &         threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    4024            0 :          dvxci(ipts,2)=zero
    4025              : !        If non-spin-polarized, first component of dvxci is second
    4026              : !        derivative with respect to TOTAL density.
    4027            0 :          dvxci(ipts,1)=dvxci(ipts,1)*half
    4028              : !        Compute the second derivative of vx
    4029              : !        vx^(2) = -2*vx^(1)/(3*rhotot)
    4030              : !        end of loop over the spin
    4031              : !        If non spin-polarized, treat spin down contribution now, similar to spin up
    4032            0 :          exc=exc*2
    4033            0 :          exci(ipts)=exc*rhotot_inv
    4034              : !        -----------------------------------------------------------------------------
    4035              : !        Then takes care of the LSD correlation part of the functional
    4036              : 
    4037              : 
    4038            0 :          rs=rsfac*rhotmot
    4039            0 :          sqr_rs=sq_rsfac*rhotmo6
    4040            0 :          rsm1_2=sq_rsfac_inv*rhoto6
    4041              : 
    4042              : !        Formulas A6-A8 of PW92LSD
    4043            0 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    4044            0 :          sqr_sqr_rs=max(1.e-15_dp,sqrt(sqr_rs))
    4045            0 :          ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs/sqr_sqr_rs)
    4046            0 :          ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+3.5_dp*ec0_b4*rs/sqr_sqr_rs)
    4047            0 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    4048              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    4049            0 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    4050            0 :          ecrs0=ec0_q0*ec0_log
    4051            0 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    4052            0 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    4053              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    4054              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    4055            0 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    4056            0 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    4057            0 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    4058            0 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    4059            0 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    4060            0 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    4061            0 :          macrs=mac_q0*mac_log
    4062            0 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    4063            0 :          ecrs=ecrs0
    4064            0 :          decrs_drs=decrs0_drs
    4065            0 :          decrs_dzeta=0.0_dp
    4066            0 :          d2ecrs_drs2=d2ecrs0_drs2
    4067            0 :          d2ecrs_dzeta2=alpha_zeta**2*(-macrs)
    4068            0 :          d2ecrs_drsdzeta=zero
    4069            0 :          zeta=0.0_dp
    4070              : 
    4071              : !        Add LSD correlation functional to GGA exchange functional
    4072            0 :          exci(ipts)=exci(ipts)+ecrs
    4073            0 :          vxci(ipts,1)=vxci(ipts,1)+ecrs-rs*third*decrs_drs
    4074              : 
    4075            0 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    4076              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    4077            0 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    4078            0 :          dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drho2
    4079              : 
    4080              :        end do
    4081              :      end if
    4082              : 
    4083              :    end if
    4084              : 
    4085              : 
    4086              : !  fab: here it starts the spin polarized case
    4087              : 
    4088       165179 :  else if(nspden==2) then
    4089              : 
    4090              : !  we separate different cases depending on order
    4091              : 
    4092       165179 :    if (order**2<=1) then
    4093              : 
    4094    150275949 :      do ipts=1,npts
    4095              : 
    4096    150131421 :        rhotot=rhoarr(ipts)
    4097    150131421 :        rhotmot=rhom1_3(ipts)
    4098    150131421 :        rhotot_inv=rhotmot*rhotmot*rhotmot
    4099    150131421 :        rhotmo6=sqrt(rhotmot)
    4100    150131421 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    4101              : !      -----------------------------------------------------------------------
    4102              : !      First take care of the exchange part of the functional
    4103              : 
    4104    150131421 :        exc=zero
    4105    150131421 :        if (present(dvxcdgr)) dvxcdgr(ipts,3)=zero
    4106    450394263 :        do ispden=1,nspden
    4107    300262842 :          rho   =rho_updn(ipts,ispden)
    4108    300262842 :          rhomot=rho_updnm1_3(ipts,ispden)
    4109    300262842 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    4110    150131421 :          if(option==1 .or. option==-1 .or. option==3)then
    4111              : !          Perdew_Wang 91 LSD
    4112    232615762 :            vxci(ipts,ispden)=four_thirds*ex_lsd
    4113    232615762 :            if(present(dvxcdgr)) dvxcdgr(ipts,ispden)=0.0_dp
    4114    232615762 :            exc=exc+ex_lsd*rho
    4115              :          else
    4116     67647080 :            rho_inv=rhomot*rhomot*rhomot
    4117     67647080 :            coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    4118     67647080 :            ss=grho2_updn(ipts,ispden)*coeffss
    4119     67647080 :            if(option==7) then ! This is WC
    4120       875520 :              expss=exp(-ss)
    4121       875520 :              p1_wc=b_wc+(mu-b_wc)*(one-ss)*expss+two*c_wc*ss/(one+c_wc*ss*ss)
    4122              :              p2_wc=d_wc*(ss-two)*expss+two*c_wc/(one+c_wc*ss*ss)-&
    4123       875520 : &             four*c_wc*c_wc*ss*ss/((one+c_wc*ss*ss)*(one+c_wc*ss*ss))
    4124       875520 :              divss=one/(one+(b_wc*ss+d_wc*ss*expss+log(one+c_wc*ss*ss))/kappa)
    4125       875520 :              dfxdss=p1_wc*divss*divss
    4126       875520 :              d2fxdss2=p2_wc*divss*divss-two*divss*divss*divss*p1_wc*p1_wc/kappa
    4127              :            else
    4128     66771560 :              if(option/=6)then ! This is Perdew-Burke-Ernzerhof GGA, exchange part
    4129     66387560 :                divss=one/(one+mu_divkappa*ss)
    4130     66387560 :                dfxdss= mu*divss*divss
    4131     66387560 :                d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    4132              :              else  ! This is RPBE modification
    4133       384000 :                divss=exp(-mu_divkappa*ss)
    4134       384000 :                dfxdss= mu*divss
    4135       384000 :                d2fxdss2=-mu*mu_divkappa*divss
    4136              :              end if
    4137              :            end if
    4138     67647080 :            fx    = one+kappa*(one-divss)
    4139     67647080 :            ex_gga= ex_lsd*fx
    4140     67647080 :            dssdn=-eight*third*ss*rho_inv
    4141     67647080 :            dfxdn  = dfxdss*dssdn
    4142     67647080 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    4143              : !          The new definition (v3.3) includes the division by the norm of the gradient
    4144     67647080 :            dssdg =two*coeffss
    4145     67647080 :            dfxdg=dfxdss*dssdg
    4146     67647080 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    4147     67647080 :            exc=exc+ex_gga*rho
    4148              :          end if
    4149              : 
    4150              :        end do
    4151    150131421 :        exci(ipts)=exc*rhotot_inv
    4152    150131421 :        if(exexch_==1)cycle
    4153              : 
    4154              : !      -----------------------------------------------------------------------------
    4155              : !      Then takes care of the LSD correlation part of the functional
    4156              : 
    4157    150049149 :        if(option>0)then
    4158              : 
    4159    148611437 :          rs=rsfac*rhotmot
    4160    148611437 :          sqr_rs=sq_rsfac*rhotmo6
    4161    148611437 :          rsm1_2=sq_rsfac_inv*rhoto6
    4162              : 
    4163              : !        Formulas A6-A8 of PW92LSD
    4164    148611437 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    4165    148611437 :          if(option/=3 .and. option/=4)then
    4166    148611437 :            ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    4167    148611437 :            ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    4168              :          else
    4169            0 :            sqr_sqr_rs=max(1.e-15_dp,sqrt(sqr_rs))
    4170            0 :            ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs/sqr_sqr_rs)
    4171            0 :            ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+3.5_dp*ec0_b4*rs/sqr_sqr_rs)
    4172              :          end if
    4173    148611437 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    4174              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    4175    148611437 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    4176    148611437 :          ecrs0=ec0_q0*ec0_log
    4177    148611437 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    4178              : 
    4179    148611437 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    4180    148611437 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    4181    148611437 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    4182    148611437 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    4183    148611437 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    4184    148611437 :          macrs=mac_q0*mac_log
    4185    148611437 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    4186              : 
    4187    148611437 :          zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
    4188    148611437 :          ec1_q0=-2.0_dp*ec1_aa*(1.0_dp+ec1_a1*rs)
    4189    148611437 :          if(option/=3 .and. option/=4)then
    4190    148611437 :            ec1_q1=2.0_dp*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
    4191    148611437 :            ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+2._dp*ec1_b2+3._dp*ec1_b3*sqr_rs+4._dp*ec1_b4*rs)
    4192              :          else
    4193            0 :            ec1_q1=2.0_dp*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs/sqr_sqr_rs)
    4194            0 :            ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+2._dp*ec1_b2+3._dp*ec1_b3*sqr_rs+3.5_dp*ec1_b4*rs/sqr_sqr_rs)
    4195              :          end if
    4196    148611437 :          ec1_den=1.0_dp/(ec1_q1*ec1_q1+ec1_q1)
    4197              : !        ec1_log=log( 1.0_dp + 1.0_dp / ec1_q1 )
    4198    148611437 :          ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
    4199    148611437 :          ecrs1=ec1_q0*ec1_log
    4200    148611437 :          decrs1_drs= -2.0_dp*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
    4201              : 
    4202              : !        alpha_zeta is introduced in order to remove singularities for fully
    4203              : !        polarized systems.
    4204    148611437 :          zetp_1_3=(1.0_dp+zeta*alpha_zeta)*zetpm1_3(ipts)**2
    4205    148611437 :          zetm_1_3=(1.0_dp-zeta*alpha_zeta)*zetmm1_3(ipts)**2
    4206              : 
    4207              :          f_zeta=( (1.0_dp+zeta*alpha_zeta2)*zetp_1_3 +                      &
    4208    148611437 : &         (1.0_dp-zeta*alpha_zeta2)*zetm_1_3 - 2.0_dp ) * factf_zeta
    4209    148611437 :          fp_zeta=( zetp_1_3 - zetm_1_3 ) * factfp_zeta
    4210    148611437 :          zeta4=zeta**4
    4211              : 
    4212    148611437 :          gcrs=ecrs1-ecrs0+macrs*fsec_inv
    4213              : !        ecrs=ecrs0+f_zeta*(-macrs*(1.0_dp-zeta4)*fsec_inv+(ecrs1-ecrs0)*zeta4)
    4214    148611437 :          ecrs=ecrs0+f_zeta*(zeta4*gcrs-macrs*fsec_inv)
    4215              : 
    4216    148611437 :          dgcrs_drs=decrs1_drs-decrs0_drs+dmacrs_drs*fsec_inv
    4217              : !        decrs_drs=decrs0_drs+f_zeta*&
    4218              : !        &        (-dmacrs_drs*(1.0_dp-zeta4)*fsec_inv+(decrs1_drs-decrs0_drs)*zeta4)
    4219    148611437 :          decrs_drs=decrs0_drs+f_zeta*(zeta4*dgcrs_drs-dmacrs_drs*fsec_inv)
    4220    148611437 :          dfzeta4_dzeta=4.0_dp*zeta**3*f_zeta+fp_zeta*zeta4
    4221    148611437 :          decrs_dzeta=dfzeta4_dzeta*gcrs-fp_zeta*macrs*fsec_inv
    4222              : 
    4223              : !        Add LSD correlation functional to GGA exchange functional
    4224    148611437 :          exci(ipts)=exci(ipts)+ecrs
    4225    148611437 :          vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
    4226    148611437 :          vxci(ipts,1)=vxci(ipts,1)+vxcadd+decrs_dzeta
    4227    148611437 :          vxci(ipts,2)=vxci(ipts,2)+vxcadd-decrs_dzeta
    4228              : 
    4229              : !        -----------------------------------------------------------------------------
    4230              : !        Eventually add the GGA correlation part of the PBE functional
    4231              : !        Note : the computation of the potential in the spin-unpolarized
    4232              : !        case could be optimized much further. Other optimizations are left to do.
    4233              : 
    4234    148611437 :          if(option==2 .or. option==5 .or. option==6 .or. option==7)then
    4235              : !          The definition of phi has been slightly changed, because
    4236              : !          the original PBE one gives divergent behaviour for fully
    4237              : !          polarized points
    4238              : !          zetpm1_3=(1.0_dp+zeta*alpha_zeta)**(-third)
    4239              : !          zetmm1_3=(1.0_dp-zeta*alpha_zeta)**(-third)
    4240              :            phi_zeta=( zetpm1_3(ipts)*(1.0_dp+zeta*alpha_zeta)+ &
    4241     32303556 : &           zetmm1_3(ipts)*(1.0_dp-zeta*alpha_zeta)   )*0.5_dp
    4242     32303556 :            phip_zeta=(zetpm1_3(ipts)-zetmm1_3(ipts))*third*alpha_zeta
    4243     32303556 :            phi_zeta_inv=1.0_dp/phi_zeta
    4244     32303556 :            phi_logder=phip_zeta*phi_zeta_inv
    4245     32303556 :            phi3_zeta=phi_zeta*phi_zeta*phi_zeta
    4246     32303556 :            gamphi3inv=gamma_inv*phi_zeta_inv*phi_zeta_inv*phi_zeta_inv
    4247              : 
    4248              : !          From ec to bb
    4249     32303556 :            bb=ecrs*gamphi3inv
    4250     32303556 :            dbb_drs=decrs_drs*gamphi3inv
    4251     32303556 :            dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    4252              : !          From bb to cc
    4253     32303556 :            exp_pbe=exp(-bb)
    4254     32303556 :            cc=one/(exp_pbe-one)
    4255     32303556 :            dcc_dbb=cc*cc*exp_pbe
    4256     32303556 :            dcc_drs=dcc_dbb*dbb_drs
    4257     32303556 :            dcc_dzeta=dcc_dbb*dbb_dzeta
    4258              : 
    4259              : !          From cc to aa
    4260     32303556 :            coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    4261     32303556 :            aa=coeff_aa*cc
    4262     32303556 :            daa_drs=coeff_aa*dcc_drs
    4263     32303556 :            daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    4264              : !          Introduce tt : do not assume that the spin-dependent gradients are collinear
    4265     32303556 :            grrho2=grho2_updn(ipts,3)
    4266     32303556 :            dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    4267              : !          Note that tt is (the t variable of PBE divided by phi) squared
    4268     32303556 :            tt=half*grrho2*dtt_dg
    4269              : 
    4270              : !          Get xx from aa and tt
    4271     32303556 :            xx=aa*tt
    4272     32303556 :            dxx_drs=daa_drs*tt
    4273     32303556 :            dxx_dzeta=daa_dzeta*tt
    4274     32303556 :            dxx_dtt=aa
    4275              : !          From xx to pade
    4276     32303556 :            pade_den=one/(one+xx*(one+xx))
    4277     32303556 :            pade=(one+xx)*pade_den
    4278     32303556 :            dpade_dxx=-xx*(two+xx)*pade_den**2
    4279     32303556 :            dpade_drs=dpade_dxx*dxx_drs
    4280     32303556 :            dpade_dtt=dpade_dxx*dxx_dtt
    4281     32303556 :            dpade_dzeta=dpade_dxx*dxx_dzeta
    4282              : 
    4283              : !          From pade to qq
    4284     32303556 :            coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    4285     32303556 :            qq=coeff_qq*pade
    4286     32303556 :            dqq_drs=coeff_qq*dpade_drs
    4287     32303556 :            dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    4288     32303556 :            dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    4289              : 
    4290              : !          From qq to rr
    4291     32303556 :            arg_rr=one+beta*gamma_inv*qq
    4292     32303556 :            div_rr=one/arg_rr
    4293     32303556 :            rr=gamma*log(arg_rr)
    4294     32303556 :            drr_dqq=beta*div_rr
    4295     32303556 :            drr_drs=drr_dqq*dqq_drs
    4296     32303556 :            drr_dtt=drr_dqq*dqq_dtt
    4297     32303556 :            drr_dzeta=drr_dqq*dqq_dzeta
    4298              : 
    4299              : !          From rr to hh
    4300     32303556 :            hh=phi3_zeta*rr
    4301     32303556 :            dhh_drs=phi3_zeta*drr_drs
    4302     32303556 :            dhh_dtt=phi3_zeta*drr_dtt
    4303     32303556 :            dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    4304              : 
    4305              : !          The GGA correlation energy is added
    4306     32303556 :            exci(ipts)=exci(ipts)+hh
    4307              : 
    4308              : !          Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    4309              : 
    4310              : !          From hh to the derivative of the energy wrt the density
    4311     32303556 :            drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    4312     32303556 :            vxci(ipts,1)=vxci(ipts,1)+drhohh_drho+dhh_dzeta
    4313     32303556 :            vxci(ipts,2)=vxci(ipts,2)+drhohh_drho-dhh_dzeta
    4314              : 
    4315              : 
    4316              : !          From hh to the derivative of the energy wrt to the gradient of the
    4317              : !          density, divided by the gradient of the density
    4318              : !          (The v3.3 definition includes the division by the norm of the gradient)
    4319     32303556 :            dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    4320              : 
    4321              : !          End condition of GGA
    4322              :          end if
    4323              : 
    4324              :        else  ! no correlation
    4325              : 
    4326              : !        End condition of including correlation, and not only exchange
    4327              :        end if
    4328              : 
    4329              : !      Correlation has been added
    4330              : !      -----------------------------------------------------------------------------
    4331              : 
    4332              :      end do
    4333              : 
    4334              : !    fab: the following is the "else" on order !!!
    4335              : 
    4336              :    else
    4337              : 
    4338     64505409 :      do ipts=1,npts
    4339              : 
    4340     64484758 :        rhotot=rhoarr(ipts)
    4341     64484758 :        rhotmot=rhom1_3(ipts)
    4342     64484758 :        rhotot_inv=rhotmot*rhotmot*rhotmot
    4343     64484758 :        rhotmo6=sqrt(rhotmot)
    4344     64484758 :        rhoto6=rhotot*rhotmot*rhotmot*rhotmo6
    4345              : !      -----------------------------------------------------------------------
    4346              : !      First take care of the exchange part of the functional
    4347              : 
    4348     64484758 :        exc=zero
    4349     64484758 :        if (present(dvxcdgr)) dvxcdgr(ipts,3)=zero
    4350    193454274 :        do ispden=1,nspden
    4351    128969516 :          rho   =rho_updn(ipts,ispden)
    4352    128969516 :          rhomot=rho_updnm1_3(ipts,ispden)
    4353    128969516 :          ex_lsd= - threefourth_divpi * sixpi2_1_3*rhomot*rhomot*rho
    4354              :          if(option==1 .or. option==-1 .or. option==3)then
    4355              : !          Perdew_Wang 91 LSD
    4356     91979102 :            vxci(ipts,ispden)=four_thirds*ex_lsd
    4357     91979102 :            if(present(dvxcdgr)) dvxcdgr(ipts,ispden)=0.0_dp
    4358     91979102 :            exc=exc+ex_lsd*rho
    4359              :          else
    4360     36990414 :            rho_inv=rhomot*rhomot*rhomot
    4361     36990414 :            coeffss=quarter*sixpi2m1_3*sixpi2m1_3*rho_inv*rho_inv*rhomot*rhomot
    4362     36990414 :            ss=grho2_updn(ipts,ispden)*coeffss
    4363     36990414 :            if(option==7) then ! This is WC
    4364            0 :              expss=exp(-ss)
    4365            0 :              p1_wc=b_wc+(mu-b_wc)*(one-ss)*expss+two*c_wc*ss/(one+c_wc*ss*ss)
    4366              :              p2_wc=d_wc*(ss-two)*expss+two*c_wc/(one+c_wc*ss*ss)-&
    4367            0 : &             four*c_wc*c_wc*ss*ss/((one+c_wc*ss*ss)*(one+c_wc*ss*ss))
    4368            0 :              divss=one/(one+(b_wc*ss+d_wc*ss*expss+log(one+c_wc*ss*ss))/kappa)
    4369            0 :              dfxdss=p1_wc*divss*divss
    4370            0 :              d2fxdss2=p2_wc*divss*divss-two*divss*divss*divss*p1_wc*p1_wc/kappa
    4371              :            else
    4372     36990414 :              if(option/=6)then ! This is Perdew-Burke-Ernzerhof GGA, exchange part
    4373     36990414 :                divss=one/(one+mu_divkappa*ss)
    4374     36990414 :                dfxdss= mu*divss*divss
    4375     36990414 :                d2fxdss2=-mu*two*mu_divkappa*divss*divss*divss
    4376              :              else  ! This is RPBE modification
    4377            0 :                divss=exp(-mu_divkappa*ss)
    4378            0 :                dfxdss= mu*divss
    4379            0 :                d2fxdss2=-mu*mu_divkappa*divss
    4380              :              end if
    4381              :            end if
    4382     36990414 :            fx    = one+kappa*(one-divss)
    4383     36990414 :            ex_gga= ex_lsd*fx
    4384     36990414 :            dssdn=-eight*third*ss*rho_inv
    4385     36990414 :            dfxdn  = dfxdss*dssdn
    4386     36990414 :            vxci(ipts,ispden)=ex_lsd*(four_thirds*fx+rho*dfxdn)
    4387              : !          The new definition (v3.3) includes the division by the norm of the gradient
    4388     36990414 :            dssdg =two*coeffss
    4389     36990414 :            dfxdg=dfxdss*dssdg
    4390     36990414 :            dvxcdgr(ipts,ispden)=ex_lsd*rho*dfxdg
    4391     36990414 :            exc=exc+ex_gga*rho
    4392              :          end if
    4393              : 
    4394     64484758 :          if(option==1 .or. option==-1 .or. option==3)then
    4395              : 
    4396              : !          Perdew_Wang 91 LSD
    4397              :            dvxci(ipts,2*ispden-1)=-four_thirds*third*&
    4398     91979102 : &           threefourth_divpi*sixpi2_1_3*rhomot*rhomot
    4399     91979102 :            dvxci(ipts,2)=zero
    4400     91979102 :            if(order==3)then
    4401              : !            If non-spin-polarized, first component of dvxci is second
    4402              : !            derivative with respect to TOTAL density.
    4403              : !            Compute the second derivative of vx
    4404              : !            vx^(2) = -2*vx^(1)/(3*rhotot)
    4405              : 
    4406              : !            fab: third order derivatives of the exchange part in the spin polarized case
    4407              : 
    4408      4703856 :              d2vxci(ipts,3*ispden-2) = -2._dp*dvxci(ipts,2*ispden-1)*(rhomot*rhomot*rhomot)/3._dp
    4409              : 
    4410              : !            mixed thir order derivatives of the exchange energy with respect to rho of
    4411              : !            different spin polarization are zero
    4412      4703856 :              d2vxci(ipts,2)=zero
    4413      4703856 :              d2vxci(ipts,3)=zero
    4414              : 
    4415              :            end if
    4416              : 
    4417              :          else
    4418              : !          Perdew-Burke-Ernzerhof GGA, exchange part
    4419              : !          Components 3 or 4
    4420     36990414 :            dvxci(ipts,2+ispden)=dvxcdgr(ipts,ispden)
    4421              : !          Components 1 or 2
    4422     36990414 :            d2ssdn2=-11.0_dp*third*dssdn*rho_inv
    4423     36990414 :            d2fxdn2=d2fxdss2*dssdn**2+dfxdss*d2ssdn2
    4424              :            dvxci(ipts,ispden)=third*rho_inv*vxci(ipts,ispden)+&
    4425     36990414 : &           ex_lsd*(seven*third*dfxdn+rho*d2fxdn2)
    4426              : !          Components 5 or 6
    4427     36990414 :            d2ssdndg=-eight*third*dssdg*rho_inv
    4428     36990414 :            d2fxdndg=d2fxdss2*dssdn*dssdg+dfxdss*d2ssdndg
    4429     36990414 :            dvxci(ipts,4+ispden)=ex_lsd*(four_thirds*dfxdg+rho*d2fxdndg)
    4430              : !          Components 7 or 8
    4431     36990414 :            d2fxdg2=d2fxdss2*dssdg**2
    4432     36990414 :            dvxci(ipts,6+ispden)=ex_lsd*rho*d2fxdg2
    4433              : !          For the time being, treat non-spin-polarized like spin-polarized
    4434              :          end if
    4435              :        end do
    4436     64484758 :        exci(ipts)=exc*rhotot_inv
    4437              : !      -----------------------------------------------------------------------------
    4438              : !      Then takes care of the LSD correlation part of the functional
    4439              : 
    4440     64505409 :        if(option>0)then
    4441              : 
    4442     61422958 :          rs=rsfac*rhotmot
    4443     61422958 :          sqr_rs=sq_rsfac*rhotmo6
    4444     61422958 :          rsm1_2=sq_rsfac_inv*rhoto6
    4445              : 
    4446              : !        Formulas A6-A8 of PW92LSD
    4447     61422958 :          ec0_q0=-2.0_dp*ec0_aa*(1.0_dp+ec0_a1*rs)
    4448     61422958 :          if(option/=3 .and. option/=4)then
    4449     61422958 :            ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs)
    4450     61422958 :            ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+4._dp*ec0_b4*rs)
    4451              :          else
    4452            0 :            sqr_sqr_rs=max(1.e-15_dp,sqrt(sqr_rs))
    4453            0 :            ec0_q1=2.0_dp*ec0_aa*(ec0_b1*sqr_rs+ec0_b2*rs+ec0_b3*rs*sqr_rs+ec0_b4*rs*rs/sqr_sqr_rs)
    4454            0 :            ec0_q1p=ec0_aa*(ec0_b1*rsm1_2+2._dp*ec0_b2+3._dp*ec0_b3*sqr_rs+3.5_dp*ec0_b4*rs/sqr_sqr_rs)
    4455              :          end if
    4456     61422958 :          ec0_den=1.0_dp/(ec0_q1*ec0_q1+ec0_q1)
    4457              : !        ec0_log=log( 1.0_dp + 1.0_dp / ec0_q1 )
    4458     61422958 :          ec0_log=-log( ec0_q1*ec0_q1*ec0_den )
    4459     61422958 :          ecrs0=ec0_q0*ec0_log
    4460     61422958 :          decrs0_drs= -2.0_dp*ec0_aa*ec0_a1*ec0_log - ec0_q0*ec0_q1p *ec0_den
    4461     61422958 :          ec0_q1pp=0.5_dp*ec0_aa*(-ec0_b1*rsm1_2**3+3._dp*ec0_b3*rsm1_2+8._dp*ec0_b4)
    4462              :          d2ecrs0_drs2= 4.0_dp*ec0_aa*ec0_a1*ec0_q1p*ec0_den            &
    4463              : &         -ec0_q0*ec0_q1pp*ec0_den                        &
    4464     61422958 : &         +ec0_q0*ec0_q1p**2*ec0_den**2*(2._dp*ec0_q1+1.0_dp)
    4465     61422958 :          if (order==3) then
    4466      2351928 :            ec0_q1ppp = 0.75_dp*ec0_aa*(rsm1_2**5)*(ec0_b1-ec0_b3*rs)
    4467      2351928 :            ec0_f1 = 1._dp/(ec0_q1*ec0_q1*(1._dp + ec0_q1))
    4468      2351928 :            ec0_f2 = 1._dp/(ec0_q1*(1+ec0_q1))
    4469              :            d3ecrs0_drs3 = 6._dp*ec0_q1p*ec0_f1*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + &
    4470              : &           ec0_q0*ec0_q1pp) - &
    4471              : &           ec0_f2*(-6._dp*ec0_aa*ec0_a1*ec0_q1pp + ec0_q0*ec0_q1ppp + &
    4472              : &           ec0_f2*(3._dp*ec0_q1p*(-2._dp*ec0_aa*ec0_a1*ec0_q1p + ec0_q0*ec0_q1pp) + &
    4473      2351928 : &           ec0_f2*2._dp*ec0_q0*(ec0_q1p**3)*(1._dp + 3._dp*ec0_q1*(1._dp + ec0_q1))))
    4474              :          end if
    4475              : 
    4476     61422958 :          mac_q0=-2.0_dp*mac_aa*(1.0_dp+mac_a1*rs)
    4477     61422958 :          mac_q1=2.0_dp*mac_aa*(mac_b1*sqr_rs+mac_b2*rs+mac_b3*rs*sqr_rs+mac_b4*rs*rs)
    4478     61422958 :          mac_q1p=mac_aa*(mac_b1*rsm1_2+2._dp*mac_b2+3._dp*mac_b3*sqr_rs+4._dp*mac_b4*rs)
    4479     61422958 :          mac_den=1.0_dp/(mac_q1*mac_q1+mac_q1)
    4480     61422958 :          mac_log=-log( mac_q1*mac_q1*mac_den )
    4481     61422958 :          macrs=mac_q0*mac_log
    4482     61422958 :          dmacrs_drs= -2.0_dp*mac_aa*mac_a1*mac_log - mac_q0*mac_q1p*mac_den
    4483              : 
    4484     61422958 :          zeta=(rho_updn(ipts,1)-rho_updn(ipts,2))*rhotot_inv
    4485     61422958 :          ec1_q0=-2.0_dp*ec1_aa*(1.0_dp+ec1_a1*rs)
    4486     61422958 :          if(option/=3 .and. option/=4)then
    4487     61422958 :            ec1_q1=2.0_dp*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs)
    4488     61422958 :            ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+2._dp*ec1_b2+3._dp*ec1_b3*sqr_rs+4._dp*ec1_b4*rs)
    4489              :          else
    4490            0 :            ec1_q1=2.0_dp*ec1_aa*(ec1_b1*sqr_rs+ec1_b2*rs+ec1_b3*rs*sqr_rs+ec1_b4*rs*rs/sqr_sqr_rs)
    4491            0 :            ec1_q1p=ec1_aa*(ec1_b1*rsm1_2+2._dp*ec1_b2+3._dp*ec1_b3*sqr_rs+3.5_dp*ec1_b4*rs/sqr_sqr_rs)
    4492              :          end if
    4493     61422958 :          ec1_den=1.0_dp/(ec1_q1*ec1_q1+ec1_q1)
    4494              : !        ec1_log=log( 1.0_dp + 1.0_dp / ec1_q1 )
    4495     61422958 :          ec1_log=-log( ec1_q1*ec1_q1*ec1_den )
    4496     61422958 :          ecrs1=ec1_q0*ec1_log
    4497     61422958 :          decrs1_drs= -2.0_dp*ec1_aa*ec1_a1*ec1_log - ec1_q0*ec1_q1p *ec1_den
    4498              : 
    4499              : !        alpha_zeta is introduced in order to remove singularities for fully
    4500              : !        polarized systems.
    4501     61422958 :          zetp_1_3=(1.0_dp+zeta*alpha_zeta)*zetpm1_3(ipts)**2
    4502     61422958 :          zetm_1_3=(1.0_dp-zeta*alpha_zeta)*zetmm1_3(ipts)**2
    4503              : 
    4504              :          f_zeta=( (1.0_dp+zeta*alpha_zeta2)*zetp_1_3 +                      &
    4505     61422958 : &         (1.0_dp-zeta*alpha_zeta2)*zetm_1_3 - 2.0_dp ) * factf_zeta
    4506     61422958 :          fp_zeta=( zetp_1_3 - zetm_1_3 ) * factfp_zeta
    4507     61422958 :          zeta4=zeta**4
    4508              : 
    4509     61422958 :          gcrs=ecrs1-ecrs0+macrs*fsec_inv
    4510              : !        ecrs=ecrs0+f_zeta*(-macrs*(1.0_dp-zeta4)*fsec_inv+(ecrs1-ecrs0)*zeta4)
    4511     61422958 :          ecrs=ecrs0+f_zeta*(zeta4*gcrs-macrs*fsec_inv)
    4512              : 
    4513     61422958 :          dgcrs_drs=decrs1_drs-decrs0_drs+dmacrs_drs*fsec_inv
    4514              : !        decrs_drs=decrs0_drs+f_zeta*&
    4515              : !        &        (-dmacrs_drs*(1.0_dp-zeta4)*fsec_inv+(decrs1_drs-decrs0_drs)*zeta4)
    4516     61422958 :          decrs_drs=decrs0_drs+f_zeta*(zeta4*dgcrs_drs-dmacrs_drs*fsec_inv)
    4517     61422958 :          dfzeta4_dzeta=4.0_dp*zeta**3*f_zeta+fp_zeta*zeta4
    4518     61422958 :          decrs_dzeta=dfzeta4_dzeta*gcrs-fp_zeta*macrs*fsec_inv
    4519              : 
    4520     61422958 :          ec1_q1pp=0.5_dp*ec1_aa*(-ec1_b1*rsm1_2**3+3._dp*ec1_b3*rsm1_2+8._dp*ec1_b4)
    4521              : 
    4522              :          d2ecrs1_drs2= 4.0_dp*ec1_aa*ec1_a1*ec1_q1p*ec1_den            &
    4523              : &         -ec1_q0*ec1_q1pp*ec1_den                        &
    4524     61422958 : &         +ec1_q0*ec1_q1p**2*ec1_den**2*(2._dp*ec1_q1+1.0_dp)
    4525              : 
    4526              : 
    4527     61422958 :          mac_q1pp=0.5_dp*mac_aa*(-mac_b1*rsm1_2**3+3._dp*mac_b3*rsm1_2+8._dp*mac_b4)
    4528              :          d2macrs_drs2= 4.0_dp*mac_aa*mac_a1*mac_q1p*mac_den            &
    4529              : &         -mac_q0*mac_q1pp*mac_den                        &
    4530     61422958 : &         +mac_q0*mac_q1p**2*mac_den**2*(2._dp*mac_q1+1.0_dp)
    4531              : 
    4532     61422958 :          d2gcrs_drs2=d2ecrs1_drs2-d2ecrs0_drs2+d2macrs_drs2*fsec_inv
    4533     61422958 :          fpp_zeta=(zetpm1_3(ipts)**2+zetmm1_3(ipts)**2) * factfpp_zeta
    4534              :          d2fzeta4_dzeta2=12.0_dp*zeta**2*f_zeta  &
    4535              : &         + 8.0_dp*zeta**3*fp_zeta &
    4536     61422958 : &         +       zeta4  *fpp_zeta
    4537              : 
    4538              :          d2ecrs_drs2=d2ecrs0_drs2+&
    4539     61422958 : &         f_zeta*(zeta4*d2gcrs_drs2-d2macrs_drs2*fsec_inv)
    4540     61422958 :          d2ecrs_drsdzeta=dfzeta4_dzeta*dgcrs_drs-fp_zeta*dmacrs_drs*fsec_inv
    4541     61422958 :          d2ecrs_dzeta2=d2fzeta4_dzeta2*gcrs-fpp_zeta*macrs*fsec_inv
    4542              : 
    4543              : !        End condition of abs(order)>1
    4544              : !        Add LSD correlation functional to GGA exchange functional
    4545     61422958 :          exci(ipts)=exci(ipts)+ecrs
    4546     61422958 :          vxcadd=ecrs-rs*third*decrs_drs-zeta*decrs_dzeta
    4547              : !        decrs_drup=vxcadd+decrs_dzeta
    4548              : !        decrs_drdn=vxcadd-decrs_dzeta
    4549     61422958 :          vxci(ipts,1)=vxci(ipts,1)+vxcadd+decrs_dzeta
    4550     61422958 :          vxci(ipts,2)=vxci(ipts,2)+vxcadd-decrs_dzeta
    4551              : 
    4552              : 
    4553              : 
    4554     61422958 :          dvcrs_drs=third*(2._dp*decrs_drs-rs*d2ecrs_drs2)
    4555              : !        And d(vxc)/d(rho)=(-rs/(3*rho))*d(vxc)/d(rs)
    4556     61422958 :          d2ecrs_drho2= -rs**4*(four_pi*third)*third*dvcrs_drs
    4557              :          d2ecrs_drup2=d2ecrs_drho2+&
    4558              : &         two*(-third*rs*d2ecrs_drsdzeta)*(1._dp-zeta)*rhotot_inv+ &
    4559     61422958 : &         d2ecrs_dzeta2*(1._dp-zeta)**2*rhotot_inv
    4560              :          d2ecrs_drdndrup=d2ecrs_drho2+&
    4561              : &         2.0_dp*(-third*rs*d2ecrs_drsdzeta)*(-zeta)*rhotot_inv+ &
    4562     61422958 : &         d2ecrs_dzeta2*(1._dp-zeta)*(-1._dp-zeta)*rhotot_inv
    4563              :          d2ecrs_drdn2=d2ecrs_drho2+&
    4564              : &         2.0_dp*(-third*rs*d2ecrs_drsdzeta)*(-1._dp-zeta)*rhotot_inv+ &
    4565     61422958 : &         d2ecrs_dzeta2*(-1._dp-zeta)**2*rhotot_inv
    4566              : 
    4567              : 
    4568              : 
    4569              : 
    4570     61422958 :          if (order==3) then
    4571              : 
    4572              : 
    4573              : !          fab : INGREDIENTS NEEDED
    4574              : 
    4575      2351928 :            a1fa=-third*(threefourth_divpi**(third))*((rhotot)**(-4._dp/3._dp))
    4576      2351928 :            a2fa=(1._dp-zeta)/rhotot
    4577      2351928 :            b2fa=(-2._dp/3._dp)*((threefourth_divpi)**(third))*((7._dp/3._dp)*(-1._dp+zeta)/((rhotot)**(7._dp/3._dp)))
    4578      2351928 :            b1fa=a2fa
    4579      2351928 :            c2fa=((1._dp-zeta)**2)*(-3._dp*(1._dp/((rhotot)**2)))
    4580      2351928 :            c1fa=((1._dp-zeta)*(1._dp-zeta))/rhotot
    4581      2351928 :            e2fa=(2._dp/3._dp)*((threefourth_divpi)**(third))*((1._dp-(7._dp/3._dp)*zeta)/((rhotot)**(7._dp/3._dp)))
    4582      2351928 :            e1fa=-zeta/rhotot
    4583      2351928 :            f2fa=(2._dp*zeta)*(1._dp/((rhotot)**2))-(3._dp*zeta*zeta)*(1._dp/((rhotot)**2))+1._dp/(((rhotot)**2))
    4584      2351928 :            f1fa=(zeta*zeta-1._dp)/rhotot
    4585      2351928 :            g1fa=a1fa
    4586      2351928 :            g2fa=(-1._dp-zeta)/rhotot
    4587      2351928 :            h2fa=(2._dp/3._dp)*((threefourth_divpi)**(third))*((-1._dp-(7._dp/3._dp)*zeta)/((rhotot)**(7._dp/3._dp)))
    4588      2351928 :            h1fa=e1fa
    4589      2351928 :            i2fa=((-2._dp*zeta)-(3*zeta*zeta)+1)/((rhotot)**2)
    4590      2351928 :            i1fa=f1fa
    4591      2351928 :            m2fa=(-2._dp/3._dp)*((threefourth_divpi)**(third))*(((7._dp/3._dp)*(zeta+1._dp))/((rhotot)**(7._dp/3._dp)))
    4592      2351928 :            m1fa=g2fa
    4593      2351928 :            n2fa=(-3._dp*(1._dp+zeta)*(1._dp+zeta))/(rhotot*rhotot)
    4594      2351928 :            n1fa=((-1._dp-zeta)**2)/rhotot
    4595              : 
    4596              : 
    4597              : !          TERMS APPEARING IN THE THIRD ORDER DERIVATIVES
    4598              : !          terms appearing in the third order derivatives of the spin polarized
    4599              : !          correlation energy with respect to spin densities
    4600              : 
    4601              : 
    4602              : !          ec1_q0p=-2.0_dp*ec1_aa*ec1_a1
    4603              : !          ec1_q1ppp=(3._dp/4._dp)*ec1_aa*(ec1_b1*(rsm1_2**5)-ec1_b3*(rsm1_2**3))
    4604              : !          This must be erroneous ...
    4605              : !          d3ecrs1_drs3=(ec1_q1pp*(4._dp*ec1_aa*ec1_a1-ec1_q0p)-ec1_q0*ec1_q1ppp)*ec1_den+ &
    4606              : !          &           ((-ec1_q1p**2)*(4._dp*ec1_aa*ec1_a1)+ec1_q0*ec1_q1pp*ec1_q1+ec1_q0p*(ec1_q1p**2)+ &
    4607              : !          &           2._dp*ec1_q0*ec1_q1p*ec1_q1pp)*(ec1_den**2)*(2._dp*ec1_q1+1._dp)- &
    4608              : !          &           (2._dp*ec1_q0*(ec1_q1p**3)*((2._dp*ec1_q1+1._dp)**2))*(ec1_den**3)+  &
    4609              : !          &           (2._dp*ec1_q0*(ec1_q1p**3))*(ec1_den**2)
    4610              : 
    4611      2351928 :            ec1_q1ppp = 0.75_dp*ec1_aa*(rsm1_2**5)*(ec1_b1-ec1_b3*rs)
    4612      2351928 :            ec1_f1 = 1._dp/(ec1_q1*ec1_q1*(1._dp + ec1_q1))
    4613      2351928 :            ec1_f2 = 1._dp/(ec1_q1*(1+ec1_q1))
    4614              :            d3ecrs1_drs3 = 6._dp*ec1_q1p*ec1_f1*(-2._dp*ec1_aa*ec1_a1*ec1_q1p + &
    4615              : &           ec1_q0*ec1_q1pp) - &
    4616              : &           ec1_f2*(-6._dp*ec1_aa*ec1_a1*ec1_q1pp + ec1_q0*ec1_q1ppp + &
    4617              : &           ec1_f2*(3._dp*ec1_q1p*(-2._dp*ec1_aa*ec1_a1*ec1_q1p + ec1_q0*ec1_q1pp) + &
    4618      2351928 : &           ec1_f2*2._dp*ec1_q0*(ec1_q1p**3)*(1._dp + 3._dp*ec1_q1*(1._dp + ec1_q1))))
    4619              : 
    4620              : 
    4621              : !          mac_q0p=-2.0_dp*mac_aa*mac_a1
    4622              : !          mac_q1ppp=(3._dp/4._dp)*mac_aa*(mac_b1*((rsm1_2)**5)-mac_b3*((rsm1_2)**3))
    4623              : !          This must be erroneous ...
    4624              : !          d3macrs_drs3=(mac_q1pp*(4._dp*mac_aa*mac_a1-mac_q0p)-mac_q0*mac_q1ppp)*mac_den+ &
    4625              : !          &           ((-mac_q1p**2)*(4._dp*mac_aa*mac_a1)+mac_q0*mac_q1pp*mac_q1+mac_q0p*(mac_q1p**2)+ &
    4626              : !          &           2._dp*mac_q0*mac_q1p*mac_q1pp)*(mac_den**2)*(2._dp*mac_q1+1._dp)- &
    4627              : !          &           (2._dp*mac_q0*(mac_q1p**3)*((2._dp*mac_q1+1._dp)**2))*(mac_den**3)+  &
    4628              : !          &           (2._dp*mac_q0*(mac_q1p**3))*(mac_den**2)
    4629              : 
    4630      2351928 :            mac_q1ppp = 0.75_dp*mac_aa*(rsm1_2**5)*(mac_b1-mac_b3*rs)
    4631      2351928 :            mac_f1 = 1._dp/(mac_q1*mac_q1*(1._dp + mac_q1))
    4632      2351928 :            mac_f2 = 1._dp/(mac_q1*(1+mac_q1))
    4633              :            d3macrs_drs3 = 6._dp*mac_q1p*mac_f1*(-2._dp*mac_aa*mac_a1*mac_q1p + &
    4634              : &           mac_q0*mac_q1pp) - &
    4635              : &           mac_f2*(-6._dp*mac_aa*mac_a1*mac_q1pp + mac_q0*mac_q1ppp + &
    4636              : &           mac_f2*(3._dp*mac_q1p*(-2._dp*mac_aa*mac_a1*mac_q1p + mac_q0*mac_q1pp) + &
    4637      2351928 : &           mac_f2*2._dp*mac_q0*(mac_q1p**3)*(1._dp + 3._dp*mac_q1*(1._dp + mac_q1))))
    4638              : 
    4639      2351928 :            d3gcrs_drs3=d3ecrs1_drs3-d3ecrs0_drs3+d3macrs_drs3*fsec_inv
    4640      2351928 :            d3ecrs_drs3=d3ecrs0_drs3+f_zeta*(zeta4*d3gcrs_drs3-d3macrs_drs3*fsec_inv)
    4641      2351928 :            factfppp_zeta=-two*third*factfpp_zeta*alpha_zeta2
    4642      2351928 :            fppp_zeta=factfppp_zeta*(((zetpm1_3(ipts))**5)-((zetmm1_3(ipts))**5))
    4643              : 
    4644              :            d3ecrs_dzeta3=(24._dp*zeta*f_zeta+36._dp*(zeta**2)*fp_zeta+  &
    4645              : &           12._dp*(zeta**3)*fpp_zeta+(zeta**4)*fppp_zeta)*gcrs+   &
    4646      2351928 : &           fppp_zeta*(-macrs)*fsec_inv
    4647              : 
    4648              :            d3ecrs_drs2dzeta=dfzeta4_dzeta*(d2gcrs_drs2)+   &
    4649      2351928 : &           fp_zeta*(-d2macrs_drs2)*fsec_inv
    4650              : 
    4651              :            d3ecrs_dzeta2drs=d2fzeta4_dzeta2*dgcrs_drs+  &
    4652      2351928 : &           fpp_zeta*(-dmacrs_drs)*fsec_inv
    4653              : 
    4654              : 
    4655              : 
    4656              : 
    4657              : !          ***************** all this part has been commented following the suggestion by xavier
    4658              : 
    4659              : !          The following is the calculations of only a part of the third order derivatives.
    4660              : !          the term d3ecrs_drho3 is the part which remains in the
    4661              : !          non spin polarized limit
    4662              : !          THIS CODING IS CORRECT, but the alternative one is also correct ...
    4663              : 
    4664              : !          d3ecrs_drho3=(128._dp*pi*pi/243._dp)*(rs**7)*(decrs_drs)- &
    4665              : !          &           (48._dp*pi*pi/243._dp)*(rs**8)*d2ecrs_drs2- &
    4666              : !          &           (16._dp*pi*pi/243._dp)*(rs**9)*d3ecrs_drs3
    4667              : 
    4668              : !          d3ecrs_drhoupdrho2=d3ecrs_drho3+ &
    4669              : !          &           a2fa*((-8._dp*pi/27._dp)*(rs**4)*d2ecrs_drsdzeta+ &
    4670              : !          &           (4._dp*pi/27._dp)*(rs**5)*d3ecrs_drs2dzeta)
    4671              : 
    4672              : 
    4673              : !          d3ecrs_drhodndrho2=d3ecrs_drho3+ &
    4674              : !          &           g2fa*((-8._dp*pi/27._dp)*(rs**4)*d2ecrs_drsdzeta+ &
    4675              : !          &           (4._dp*pi/27._dp)*(rs**5)*d3ecrs_drs2dzeta)
    4676              : 
    4677              : 
    4678              : !          third order derivatives of the exchange-correlation part
    4679              : 
    4680              : !          d3ecrs_drup3=d3ecrs_drhoupdrho2+b2fa*d2ecrs_drsdzeta-  &
    4681              : !          &           (2._dp/3._dp)*rs*b1fa*a1fa*d3ecrs_drs2dzeta- &
    4682              : !          &           (2._dp/3._dp)*rs*b1fa*b1fa*d3ecrs_dzeta2drs+ &
    4683              : !          &           c2fa*d2ecrs_dzeta2+c1fa*(a1fa*d3ecrs_dzeta2drs+a2fa*d3ecrs_dzeta3)
    4684              : 
    4685              : 
    4686              : !          d3ecrs_drup2drdn=d3ecrs_drhoupdrho2+e2fa*d2ecrs_drsdzeta-  &
    4687              : !          &           (2._dp/3._dp)*rs*e1fa*a1fa*d3ecrs_drs2dzeta- &
    4688              : !          &           (2._dp/3._dp)*rs*e1fa*b1fa*d3ecrs_dzeta2drs+ &
    4689              : !          &           f2fa*d2ecrs_dzeta2+f1fa*(a1fa*d3ecrs_dzeta2drs+a2fa*d3ecrs_dzeta3)
    4690              : 
    4691              : !          d3ecrs_drupdrdn2=d3ecrs_drhodndrho2+h2fa*d2ecrs_drsdzeta-  &
    4692              : !          &           (2._dp/3._dp)*rs*h1fa*g1fa*d3ecrs_drs2dzeta- &
    4693              : !          &           (2._dp/3._dp)*rs*h1fa*g2fa*d3ecrs_dzeta2drs+ &
    4694              : !          &           i2fa*d2ecrs_dzeta2+i1fa*(g1fa*d3ecrs_dzeta2drs+g2fa*d3ecrs_dzeta3)
    4695              : 
    4696              : 
    4697              : !          d3ecrs_drdn3=d3ecrs_drhodndrho2+m2fa*d2ecrs_drsdzeta-  &
    4698              : !          &           (2._dp/3._dp)*rs*m1fa*g1fa*d3ecrs_drs2dzeta- &
    4699              : !          &           (2._dp/3._dp)*rs*m1fa*g2fa*d3ecrs_dzeta2drs+ &
    4700              : !          &           n2fa*d2ecrs_dzeta2+n1fa*(g1fa*d3ecrs_dzeta2drs+g2fa*d3ecrs_dzeta3)
    4701              : 
    4702              : 
    4703              : !          ********* suggested by xavier  (now corrected, XG100524)
    4704              : 
    4705      2351928 :            sp1_up3=three-three*zeta
    4706      2351928 :            sp1_up2dn=one-three*zeta
    4707      2351928 :            sp1_updn2=-one-three*zeta
    4708      2351928 :            sp1_dn3=-three-three*zeta
    4709              : 
    4710      2351928 :            sp2_up3=three-six*zeta+three*zeta*zeta
    4711      2351928 :            sp2_up2dn=-one-two*zeta+three*zeta*zeta
    4712      2351928 :            sp2_updn2=-one+two*zeta+three*zeta*zeta
    4713      2351928 :            sp2_dn3=three+six*zeta+three*zeta*zeta
    4714              : 
    4715      2351928 :            sp3_up3=(one-zeta)**3
    4716      2351928 :            sp3_up2dn=-one+zeta+zeta**2-zeta**3
    4717      2351928 :            sp3_updn2=one+zeta-zeta**2-zeta**3
    4718      2351928 :            sp3_dn3=-(one+zeta)**3
    4719              : 
    4720      2351928 :            d3ecrs_sp0=(eight*rs*decrs_drs-three*rs*rs*d2ecrs_drs2-rs*rs*rs*d3ecrs_drs3)/(rhotot*rhotot*27.0_dp)
    4721      2351928 :            d3ecrs_sp1=(four*rs*d2ecrs_drsdzeta+rs*rs*d3ecrs_drs2dzeta)/(rhotot*rhotot*nine)
    4722      2351928 :            d3ecrs_sp2=(-three*d2ecrs_dzeta2-rs*d3ecrs_dzeta2drs)/(rhotot*rhotot*three)
    4723      2351928 :            d3ecrs_sp3=d3ecrs_dzeta3/(rhotot*rhotot)
    4724              : 
    4725      2351928 :            d3ecrs_drup3=d3ecrs_sp0+d3ecrs_sp1*sp1_up3+d3ecrs_sp2*sp2_up3+d3ecrs_sp3*sp3_up3
    4726      2351928 :            d3ecrs_drup2drdn=d3ecrs_sp0+d3ecrs_sp1*sp1_up2dn+d3ecrs_sp2*sp2_up2dn+d3ecrs_sp3*sp3_up2dn
    4727      2351928 :            d3ecrs_drupdrdn2=d3ecrs_sp0+d3ecrs_sp1*sp1_updn2+d3ecrs_sp2*sp2_updn2+d3ecrs_sp3*sp3_updn2
    4728      2351928 :            d3ecrs_drdn3=d3ecrs_sp0+d3ecrs_sp1*sp1_dn3+d3ecrs_sp2*sp2_dn3+d3ecrs_sp3*sp3_dn3
    4729              : 
    4730              : !          **** end of the section suggested by xavier...
    4731              : 
    4732              : 
    4733              : !          fab: this is the end of the if over order==3
    4734              : 
    4735              : 
    4736              :          end if
    4737              : 
    4738              : !        fab: I think the following lines are wrong..indeed we are in the case option>0, so option cannot be -1
    4739              : !        I comment them and I put the if only for option 1 and 3
    4740              : 
    4741              : !        if(option==1 .or. option==-1 .or. option==3)then
    4742              : !        dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drup2
    4743              : !        dvxci(ipts,2)=dvxci(ipts,2)+d2ecrs_drdndrup
    4744              : !        dvxci(ipts,3)=dvxci(ipts,3)+d2ecrs_drdn2
    4745              : 
    4746              : 
    4747              : !        fab: however, here the thing seems a bit strange...option=3 doesn't seem to be completely implemented
    4748              : !        (the second derivatives of ec1_q and ec0_q are the derived only in correspondance of the first derivative in the case option !=3 and !=4)
    4749              : !        so..I think that here the case "or option==3 should be cancelled
    4750              : 
    4751     61422958 :          if(option==1 .or. option==3)then
    4752     45989551 :            dvxci(ipts,1)=dvxci(ipts,1)+d2ecrs_drup2
    4753     45989551 :            dvxci(ipts,2)=dvxci(ipts,2)+d2ecrs_drdndrup
    4754     45989551 :            dvxci(ipts,3)=dvxci(ipts,3)+d2ecrs_drdn2
    4755              : 
    4756     45989551 :            if(order==3) then
    4757              : !            third order derivatives of the spin polarized exchange+correlation energy
    4758      2351928 :              d2vxci(ipts,1)=d2vxci(ipts,1)+d3ecrs_drup3
    4759      2351928 :              d2vxci(ipts,2)=d2vxci(ipts,2)+d3ecrs_drup2drdn
    4760      2351928 :              d2vxci(ipts,3)=d2vxci(ipts,3)+d3ecrs_drupdrdn2
    4761      2351928 :              d2vxci(ipts,4)=d2vxci(ipts,4)+d3ecrs_drdn3
    4762              : !            DEBUG
    4763              : !            wecrsz(ipts,1)=ecrs
    4764              : !            wecrsz(ipts,1)=ecrs*rhotot
    4765              : !            wecrsz(ipts,2)=rs
    4766              : !            wecrsz(ipts,2)=rho_updn(ipts,1)
    4767              : !            wecrsz(ipts,3)=zeta
    4768              : !            wecrsz(ipts,3)=rho_updn(ipts,2)
    4769              : !            wecrsz(ipts,5)=ecrs0
    4770              : !            wecrsz(ipts,6)=gcrs
    4771              : !            wecrsz(ipts,7)=macrs
    4772              : !            wecrsz(ipts,8)=ecrs1
    4773              : !            d1wecrsz(ipts,1)=decrs_drs
    4774              : !            d1wecrsz(ipts,1)=decrs_drup
    4775              : !            d1wecrsz(ipts,2)=decrs_dzeta
    4776              : !            d1wecrsz(ipts,2)=decrs_drdn
    4777              : !            d1wecrsz(ipts,5)=decrs0_drs
    4778              : !            d1wecrsz(ipts,6)=dgcrs_drs
    4779              : !            d1wecrsz(ipts,7)=dmacrs_drs
    4780              : !            d1wecrsz(ipts,8)=decrs1_drs
    4781              : !            d2wecrsz(ipts,1)=d2ecrs_drs2
    4782              : !            d2wecrsz(ipts,1)=d2ecrs_drup2
    4783              : !            d2wecrsz(ipts,2)=d2ecrs_drsdzeta
    4784              : !            d2wecrsz(ipts,2)=d2ecrs_drdndrup
    4785              : !            d2wecrsz(ipts,3)=d2ecrs_dzeta2
    4786              : !            d2wecrsz(ipts,3)=d2ecrs_drdn2
    4787              : !            d2wecrsz(ipts,5)=d2ecrs0_drs2
    4788              : !            d2wecrsz(ipts,6)=d2gcrs_drs2
    4789              : !            d2wecrsz(ipts,7)=d2macrs_drs2
    4790              : !            d2wecrsz(ipts,8)=d2ecrs1_drs2
    4791              : !            d3wecrsz(ipts,1)=d3ecrs_drs3
    4792              : !            d3wecrsz(ipts,1)=d3ecrs_drup3
    4793              : !            d3wecrsz(ipts,2)=d3ecrs_drs2dzeta
    4794              : !            d3wecrsz(ipts,2)=d3ecrs_drup2drdn
    4795              : !            d3wecrsz(ipts,3)=d3ecrs_dzeta2drs
    4796              : !            d3wecrsz(ipts,3)=d3ecrs_drupdrdn2
    4797              : !            d3wecrsz(ipts,4)=d3ecrs_dzeta3
    4798              : !            d3wecrsz(ipts,4)=d3ecrs_drdn3
    4799              : !            d3wecrsz(ipts,5)=d3ecrs0_drs3
    4800              : !            d3wecrsz(ipts,6)=d3gcrs_drs3
    4801              : !            d3wecrsz(ipts,7)=d3macrs_drs3
    4802              : !            d3wecrsz(ipts,8)=d3ecrs1_drs3
    4803              : !            ENDDEBUG
    4804              :            end if
    4805              : 
    4806              : 
    4807              :          else
    4808     15433407 :            dvxci(ipts,9)=d2ecrs_drup2
    4809     15433407 :            dvxci(ipts,10)=d2ecrs_drdndrup
    4810     15433407 :            dvxci(ipts,11)=d2ecrs_drdn2
    4811              :          end if
    4812              : 
    4813              : 
    4814              : 
    4815              : 
    4816              : !        -----------------------------------------------------------------------------
    4817              : !        Eventually add the GGA correlation part of the PBE functional
    4818              : !        Note : the computation of the potential in the spin-unpolarized
    4819              : !        case could be optimized much further. Other optimizations are left to do.
    4820              : 
    4821     61422958 :          if(option==2 .or. option==5 .or. option==6 .or. option==7)then
    4822              : !          The definition of phi has been slightly changed, because
    4823              : !          the original PBE one gives divergent behaviour for fully
    4824              : !          polarized points
    4825              : !          zetpm1_3=(1.0_dp+zeta*alpha_zeta)**(-third)
    4826              : !          zetmm1_3=(1.0_dp-zeta*alpha_zeta)**(-third)
    4827              :            phi_zeta=( zetpm1_3(ipts)*(1.0_dp+zeta*alpha_zeta)+ &
    4828     15433407 : &           zetmm1_3(ipts)*(1.0_dp-zeta*alpha_zeta)   )*0.5_dp
    4829     15433407 :            phip_zeta=(zetpm1_3(ipts)-zetmm1_3(ipts))*third*alpha_zeta
    4830     15433407 :            phi_zeta_inv=1.0_dp/phi_zeta
    4831     15433407 :            phi_logder=phip_zeta*phi_zeta_inv
    4832     15433407 :            phi3_zeta=phi_zeta*phi_zeta*phi_zeta
    4833     15433407 :            gamphi3inv=gamma_inv*phi_zeta_inv*phi_zeta_inv*phi_zeta_inv
    4834              :            phipp_zeta=-alpha_zeta*alpha_zeta*ninth*&
    4835              : &           (zetpm1_3(ipts)*zetpm1_3(ipts)*zetpm1_3(ipts)*zetpm1_3(ipts) + &
    4836     15433407 : &           zetmm1_3(ipts)*zetmm1_3(ipts)*zetmm1_3(ipts)*zetmm1_3(ipts)  )
    4837              : 
    4838              : !          From ec to bb
    4839     15433407 :            bb=ecrs*gamphi3inv
    4840     15433407 :            dbb_drs=decrs_drs*gamphi3inv
    4841     15433407 :            dbb_dzeta=gamphi3inv*(decrs_dzeta-three*ecrs*phi_logder)
    4842     15433407 :            d2bb_drs2=d2ecrs_drs2*gamphi3inv
    4843     15433407 :            d2bb_drsdzeta=gamphi3inv*(d2ecrs_drsdzeta-three*decrs_drs*phi_logder)
    4844              :            d2bb_dzeta2=gamphi3inv*(d2ecrs_dzeta2-six*decrs_dzeta*phi_logder+&
    4845     15433407 : &           12.0_dp*ecrs*phi_logder*phi_logder-three*ecrs*phi_zeta_inv*phipp_zeta)
    4846              : 
    4847              : !          From bb to cc
    4848     15433407 :            exp_pbe=exp(-bb)
    4849     15433407 :            cc=one/(exp_pbe-one)
    4850     15433407 :            dcc_dbb=cc*cc*exp_pbe
    4851     15433407 :            dcc_drs=dcc_dbb*dbb_drs
    4852     15433407 :            dcc_dzeta=dcc_dbb*dbb_dzeta
    4853     15433407 :            d2cc_dbb2=cc*cc*exp_pbe*(two*cc*exp_pbe-one)
    4854     15433407 :            d2cc_drs2=d2cc_dbb2*dbb_drs*dbb_drs+dcc_dbb*d2bb_drs2
    4855     15433407 :            d2cc_drsdzeta=d2cc_dbb2*dbb_drs*dbb_dzeta+dcc_dbb*d2bb_drsdzeta
    4856     15433407 :            d2cc_dzeta2=d2cc_dbb2*dbb_dzeta*dbb_dzeta+dcc_dbb*d2bb_dzeta2
    4857              : 
    4858              : !          From cc to aa
    4859     15433407 :            coeff_aa=beta*gamma_inv*phi_zeta_inv*phi_zeta_inv
    4860     15433407 :            aa=coeff_aa*cc
    4861     15433407 :            daa_drs=coeff_aa*dcc_drs
    4862     15433407 :            daa_dzeta=-two*aa*phi_logder+coeff_aa*dcc_dzeta
    4863     15433407 :            d2aa_drs2=coeff_aa*d2cc_drs2
    4864     15433407 :            d2aa_drsdzeta=-two*daa_drs*phi_logder+coeff_aa*d2cc_drsdzeta
    4865              :            d2aa_dzeta2=aa*(-two*phi_zeta_inv*phipp_zeta+six*phi_logder*phi_logder)+&
    4866     15433407 : &           coeff_aa*(-four*dcc_dzeta*phi_logder+d2cc_dzeta2)
    4867              : 
    4868              : !          Introduce tt : do not assume that the spin-dependent gradients are collinear
    4869     15433407 :            grrho2=grho2_updn(ipts,3)
    4870     15433407 :            dtt_dg=two*rhotot_inv*rhotot_inv*rhotmot*coeff_tt
    4871              : !          Note that tt is (the t variable of PBE divided by phi) squared
    4872     15433407 :            tt=half*grrho2*dtt_dg
    4873              : 
    4874              : !          Get xx from aa and tt
    4875     15433407 :            xx=aa*tt
    4876     15433407 :            dxx_drs=daa_drs*tt
    4877     15433407 :            dxx_dzeta=daa_dzeta*tt
    4878     15433407 :            dxx_dtt=aa
    4879     15433407 :            d2xx_drs2=d2aa_drs2*tt
    4880     15433407 :            d2xx_drsdzeta=d2aa_drsdzeta*tt
    4881     15433407 :            d2xx_drsdtt=daa_drs
    4882     15433407 :            d2xx_dttdzeta=daa_dzeta
    4883     15433407 :            d2xx_dzeta2=d2aa_dzeta2*tt
    4884              : 
    4885              : !          From xx to pade
    4886     15433407 :            pade_den=one/(one+xx*(one+xx))
    4887     15433407 :            pade=(one+xx)*pade_den
    4888     15433407 :            dpade_dxx=-xx*(two+xx)*pade_den**2
    4889     15433407 :            dpade_drs=dpade_dxx*dxx_drs
    4890     15433407 :            dpade_dtt=dpade_dxx*dxx_dtt
    4891     15433407 :            dpade_dzeta=dpade_dxx*dxx_dzeta
    4892     15433407 :            d2pade_dxx2=two*(-one+xx*xx*(three+xx))*pade_den*pade_den*pade_den
    4893     15433407 :            d2pade_drs2=d2pade_dxx2*dxx_drs*dxx_drs+dpade_dxx*d2xx_drs2
    4894     15433407 :            d2pade_drsdtt=d2pade_dxx2*dxx_drs*dxx_dtt+dpade_dxx*d2xx_drsdtt
    4895     15433407 :            d2pade_drsdzeta=d2pade_dxx2*dxx_drs*dxx_dzeta+dpade_dxx*d2xx_drsdzeta
    4896     15433407 :            d2pade_dtt2=d2pade_dxx2*dxx_dtt*dxx_dtt
    4897     15433407 :            d2pade_dttdzeta=d2pade_dxx2*dxx_dtt*dxx_dzeta+dpade_dxx*d2xx_dttdzeta
    4898     15433407 :            d2pade_dzeta2=d2pade_dxx2*dxx_dzeta*dxx_dzeta+dpade_dxx*d2xx_dzeta2
    4899              : 
    4900              : !          From pade to qq
    4901     15433407 :            coeff_qq=tt*phi_zeta_inv*phi_zeta_inv
    4902     15433407 :            qq=coeff_qq*pade
    4903     15433407 :            dqq_drs=coeff_qq*dpade_drs
    4904     15433407 :            dqq_dtt=pade*phi_zeta_inv*phi_zeta_inv+coeff_qq*dpade_dtt
    4905     15433407 :            dqq_dzeta=coeff_qq*(dpade_dzeta-two*pade*phi_logder)
    4906     15433407 :            d2qq_drs2=coeff_qq*d2pade_drs2
    4907     15433407 :            d2qq_drsdtt=phi_zeta_inv*phi_zeta_inv*(dpade_drs+tt*d2pade_drsdtt)
    4908     15433407 :            d2qq_drsdzeta=coeff_qq*(d2pade_drsdzeta-two*dpade_drs*phi_logder)
    4909     15433407 :            d2qq_dtt2=phi_zeta_inv*phi_zeta_inv*(two*dpade_dtt+tt*d2pade_dtt2)
    4910              :            d2qq_dttdzeta=phi_zeta_inv*phi_zeta_inv*(dpade_dzeta-two*pade*phi_logder)+&
    4911     15433407 : &           coeff_qq*(d2pade_dttdzeta-two*dpade_dtt*phi_logder)
    4912              :            d2qq_dzeta2=coeff_qq*( d2pade_dzeta2-four*dpade_dzeta*phi_logder &
    4913              : &           +six*pade*phi_logder*phi_logder            &
    4914     15433407 : &           -two*pade*phi_zeta_inv*phipp_zeta)
    4915              : 
    4916              : !          From qq to rr
    4917     15433407 :            arg_rr=one+beta*gamma_inv*qq
    4918     15433407 :            div_rr=one/arg_rr
    4919     15433407 :            rr=gamma*log(arg_rr)
    4920     15433407 :            drr_dqq=beta*div_rr
    4921     15433407 :            drr_drs=drr_dqq*dqq_drs
    4922     15433407 :            drr_dtt=drr_dqq*dqq_dtt
    4923     15433407 :            drr_dzeta=drr_dqq*dqq_dzeta
    4924     15433407 :            d2rr_dqq2=-div_rr**2*beta*beta*gamma_inv
    4925     15433407 :            d2rr_drs2=d2rr_dqq2*dqq_drs*dqq_drs+drr_dqq*d2qq_drs2
    4926     15433407 :            d2rr_drsdtt=d2rr_dqq2*dqq_drs*dqq_dtt+drr_dqq*d2qq_drsdtt
    4927     15433407 :            d2rr_drsdzeta=d2rr_dqq2*dqq_drs*dqq_dzeta+drr_dqq*d2qq_drsdzeta
    4928     15433407 :            d2rr_dtt2=d2rr_dqq2*dqq_dtt*dqq_dtt+drr_dqq*d2qq_dtt2
    4929     15433407 :            d2rr_dttdzeta=d2rr_dqq2*dqq_dtt*dqq_dzeta+drr_dqq*d2qq_dttdzeta
    4930     15433407 :            d2rr_dzeta2=d2rr_dqq2*dqq_dzeta*dqq_dzeta+drr_dqq*d2qq_dzeta2
    4931              : 
    4932              : !          From rr to hh
    4933     15433407 :            hh=phi3_zeta*rr
    4934     15433407 :            dhh_drs=phi3_zeta*drr_drs
    4935     15433407 :            dhh_dtt=phi3_zeta*drr_dtt
    4936     15433407 :            dhh_dzeta=phi3_zeta*(drr_dzeta+three*rr*phi_logder)
    4937     15433407 :            d2hh_drs2=phi3_zeta*d2rr_drs2
    4938     15433407 :            d2hh_drsdtt=phi3_zeta*d2rr_drsdtt
    4939     15433407 :            d2hh_drsdzeta=phi3_zeta*(d2rr_drsdzeta+three*drr_drs*phi_logder)
    4940     15433407 :            d2hh_dtt2=phi3_zeta*d2rr_dtt2
    4941     15433407 :            d2hh_dttdzeta=phi3_zeta*(d2rr_dttdzeta+three*drr_dtt*phi_logder)
    4942              :            d2hh_dzeta2=phi3_zeta*(six*rr*phi_logder*phi_logder+&
    4943              : &           six*phi_logder*drr_dzeta+d2rr_dzeta2)  &
    4944     15433407 : &           +three*phi_zeta*phi_zeta*rr*phipp_zeta
    4945              : 
    4946              : !          The GGA correlation energy is added
    4947     15433407 :            exci(ipts)=exci(ipts)+hh
    4948              : 
    4949              : !          Change of variables : from (rs,zeta,tt) to (rhoup,rhodn,grrho)
    4950              : 
    4951              : 
    4952              : !          From hh to the derivative of the energy wrt the density
    4953     15433407 :            drhohh_drho=hh-third*rs*dhh_drs-zeta*dhh_dzeta-seven*third*tt*dhh_dtt
    4954     15433407 :            vxci(ipts,1)=vxci(ipts,1)+drhohh_drho+dhh_dzeta
    4955     15433407 :            vxci(ipts,2)=vxci(ipts,2)+drhohh_drho-dhh_dzeta
    4956              : 
    4957              : 
    4958              : !          From hh to the derivative of the energy wrt to the gradient of the
    4959              : !          density, divided by the gradient of the density
    4960              : !          (The v3.3 definition includes the division by the norm of the gradient)
    4961     15433407 :            dvxcdgr(ipts,3)=rhotot*dtt_dg*dhh_dtt
    4962              : 
    4963              :            d2rhohh_drho2=rhotot_inv*&
    4964              : &           (-two*ninth*rs*dhh_drs +seven*four*ninth*tt*dhh_dtt &
    4965              : &           +ninth*rs*rs*d2hh_drs2+zeta*zeta*d2hh_dzeta2+(seven*third*tt)**2*d2hh_dtt2 &
    4966              : &           +two*third*rs*zeta*d2hh_drsdzeta+two*seven*ninth*rs*tt*d2hh_drsdtt &
    4967     15433407 : &           +two*seven*third*tt*zeta*d2hh_dttdzeta)
    4968              :            d2rhohh_drhodg=dtt_dg*(-four*third*dhh_dtt-third*rs*d2hh_drsdtt &
    4969     15433407 : &           -zeta*d2hh_dttdzeta-seven*third*tt*d2hh_dtt2)
    4970              : 
    4971              : !          Component 12 : first derivative with respect to the gradient
    4972              : !          of the density, div by the grad of the density
    4973     15433407 :            dvxci(ipts,12)=dvxcdgr(ipts,3)
    4974              : !          Components 9, 10 and 11 : second derivatives with respect to the spin-density
    4975              : !          Note that there is already a contribution from LSDA
    4976              :            dvxci(ipts,9)=dvxci(ipts,9)+d2rhohh_drho2+rhotot_inv*           &
    4977              : &           ( d2hh_dzeta2*(one-two*zeta) &
    4978     15433407 : &           -two*third*rs*d2hh_drsdzeta-14.0_dp*third*tt*d2hh_dttdzeta)
    4979     15433407 :            dvxci(ipts,10)=dvxci(ipts,10)+d2rhohh_drho2-rhotot_inv*d2hh_dzeta2
    4980              :            dvxci(ipts,11)=dvxci(ipts,11)+d2rhohh_drho2+rhotot_inv*           &
    4981              : &           ( d2hh_dzeta2*(one+two*zeta) &
    4982     15433407 : &           +two*third*rs*d2hh_drsdzeta+14.0_dp*third*tt*d2hh_dttdzeta)
    4983              : !          Components 13 and 14 : second derivatives with respect to spin density
    4984              : !          and gradient, divided by the gradient
    4985     15433407 :            dvxci(ipts,13)=d2rhohh_drhodg+dtt_dg*d2hh_dttdzeta
    4986     15433407 :            dvxci(ipts,14)=d2rhohh_drhodg-dtt_dg*d2hh_dttdzeta
    4987              : !          Component 15 : derivative of the (derivative wrt the gradient div by the grad),
    4988              : !          divided by the grad
    4989     15433407 :            dvxci(ipts,15)=rhotot*d2hh_dtt2*dtt_dg*dtt_dg
    4990              : 
    4991              : !          End condition of GGA
    4992              :          end if
    4993              : 
    4994              :        else  ! no correlation
    4995              : 
    4996      3061800 :          if(ndvxci > 8)then
    4997              : !          Must zero the correlation part of the xc kernel
    4998            0 :            dvxci(:,9:15)=zero
    4999              :          end if
    5000              : 
    5001              : !        End condition of including correlation, and not only exchange
    5002              :        end if
    5003              : 
    5004              : !      Correlation has been added
    5005              : !      -----------------------------------------------------------------------------
    5006              : 
    5007              :      end do
    5008              :    end if
    5009              : 
    5010              : !  fab: this should be the else on nspden
    5011              :  else
    5012              : !  Disallowed value for nspden
    5013              :    write(message, '(a,a,a,i12,a)' )&
    5014            0 : &   '  Argument nspden must be 1 or 2; ',ch10,&
    5015            0 : &   '  Value provided as argument was ',nspden,'.'
    5016            0 :    ABI_BUG(message)
    5017              :  end if
    5018              : 
    5019              : !DEBUG
    5020              : !Finite-difference debugging, do not take away
    5021              : !if(debug/=0)then
    5022              : !do ipts=1,5,5
    5023              : 
    5024              : !rho=rho_updn(ipts,1)+rho_updn(ipts,2)
    5025              : !write(std_out,'(a,i5,a,2es16.8)' ) ' Point number',ipts,' with rhoup,rhodn=',rho_updn(ipts,1),rho_updn(ipts,2)
    5026              : !write(std_out,'(a,i5,a,2es16.8)' ) ' Point number',ipts+1,' with rhoup,rhodn=',rho_updn(ipts+1,1),rho_updn(ipts+1,2)
    5027              : !write(std_out,'(a,i5,a,2es16.8)' ) ' Point number',ipts+2,' with rhoup,rhodn=',rho_updn(ipts+2,1),rho_updn(ipts+2,2)
    5028              : !write(std_out,'(a,i5,a,2es16.8)' ) ' Point number',ipts+3,' with rhoup,rhodn=',rho_updn(ipts+3,1),rho_updn(ipts+3,2)
    5029              : !write(std_out,'(a,i5,a,2es16.8)' ) ' Point number',ipts+4,' with rhoup,rhodn=',rho_updn(ipts+4,1),rho_updn(ipts+4,2)
    5030              : 
    5031              : !! For rho
    5032              : !if(debug==1)then
    5033              : !write(std_out,'(a)' )' Direct values :'
    5034              : !write(std_out,'(3es16.8)' )exci(ipts)*rho,vxci(ipts,1),vxci(ipts,2)
    5035              : !else
    5036              : !!  For grho2
    5037              : !write(std_out,'(4es16.8)' )exci(ipts)*rho,dvxcdgr(ipts,1),&
    5038              : !&  dvxcdgr(ipts,2),dvxcdgr(ipts,3)
    5039              : !end if
    5040              : 
    5041              : !write(std_out,'(4es16.8)' )dvxci(ipts,1:3)  ! For LDA
    5042              : !write(std_out,'(a)' )'     3rd-order '
    5043              : !write(std_out,'(4es16.8)' )d2vxci(ipts,1:4)  ! For LDA
    5044              : 
    5045              : !write(std_out,'(4es16.8)' )dvxci(ipts,1:4)  ! For exchange
    5046              : !write(std_out,'(4es16.8)' )dvxci(ipts,5:8)  ! For exchange
    5047              : !write(std_out,'(4es16.8)' )dvxci(ipts,9:12) ! For correlation
    5048              : !write(std_out,'(4es16.8)' )dvxci(ipts,13:15) ! For correlation
    5049              : 
    5050              : !if(debug==1)then
    5051              : !!  For rho
    5052              : !write(std_out,'(a)' )' Finite-difference values :'
    5053              : !write(std_out,'(3es16.8)' )exci(ipts)*rho,&
    5054              : !&      ( exci(ipts+1)*(rho+delta) - exci(ipts+2)*(rho-delta) )/2._dp/delta,&
    5055              : !&      ( exci(ipts+3)*(rho+delta) - exci(ipts+4)*(rho-delta) )/2._dp/delta
    5056              : !write(std_out,'(3es16.8)' )&
    5057              : !&    ( vxci(ipts+1,1) - vxci(ipts+2,1) )/2._dp/delta,&
    5058              : !&    ( vxci(ipts+3,1) - vxci(ipts+4,1) )/2._dp/delta,&
    5059              : !&    ( vxci(ipts+3,2) - vxci(ipts+4,2) )/2._dp/delta
    5060              : !!This is for order 3
    5061              : !write(std_out,'(a)' )'     3rd-order by two methods, giving components 1, 2, 3, then on the next line 2, 3, 4 '
    5062              : !write(std_out,'(3es16.8)' )&
    5063              : !&    ( dvxci(ipts+1,1) - dvxci(ipts+2,1) )/2._dp/delta,&
    5064              : !&    ( dvxci(ipts+1,2) - dvxci(ipts+2,2) )/2._dp/delta,&
    5065              : !&    ( dvxci(ipts+1,3) - dvxci(ipts+2,3) )/2._dp/delta
    5066              : !write(std_out,'(3es16.8)' )&
    5067              : !&    ( dvxci(ipts+3,1) - dvxci(ipts+4,1) )/2._dp/delta,&
    5068              : !&    ( dvxci(ipts+3,2) - dvxci(ipts+4,2) )/2._dp/delta,&
    5069              : !&    ( dvxci(ipts+3,3) - dvxci(ipts+4,3) )/2._dp/delta
    5070              : 
    5071              : !write(std_out,*)
    5072              : !write(std_out,*)' Now for ecrs and derivatives '
    5073              : !write(std_out,'(a)' )' ecrs, rs, zeta ='
    5074              : !write(std_out,'(3es16.8)' )wecrsz(ipts,1:3)
    5075              : !write(std_out,'(3es16.8)' )wecrsz(ipts+1,1:3)
    5076              : !write(std_out,'(3es16.8)' )wecrsz(ipts+2,1:3)
    5077              : !write(std_out,'(3es16.8)' )wecrsz(ipts+3,1:3)
    5078              : !write(std_out,'(3es16.8)' )wecrsz(ipts+4,1:3)
    5079              : !write(std_out,'(a)' )' ecrs derivatives :'
    5080              : !write(std_out,'(3es16.8)' )d1wecrsz(ipts,1:2)
    5081              : !write(std_out,'(3es16.8)' )d2wecrsz(ipts,1:3)
    5082              : !write(std_out,'(4es16.8)' )d3wecrsz(ipts,1:4)
    5083              : !write(std_out,'(a)' )' Finite-differences :'
    5084              : !write(std_out,'(3es16.8)' )&
    5085              : !&    ( wecrsz(ipts+1,1) - wecrsz(ipts+2,1) )/( wecrsz(ipts+1,2) - wecrsz(ipts+2,2) ),&
    5086              : !&    ( wecrsz(ipts+3,1) - wecrsz(ipts+4,1) )/( wecrsz(ipts+3,3) - wecrsz(ipts+4,3) )
    5087              : !write(std_out,'(3es16.8)' )&
    5088              : !&    ( d1wecrsz(ipts+1,1) - d1wecrsz(ipts+2,1) )/( wecrsz(ipts+1,2) - wecrsz(ipts+2,2) ),&
    5089              : !&    ( d1wecrsz(ipts+1,2) - d1wecrsz(ipts+2,2) )/( wecrsz(ipts+1,2) - wecrsz(ipts+2,2) )
    5090              : !write(std_out,'(3es16.8)' )&
    5091              : !&    ( d1wecrsz(ipts+3,1) - d1wecrsz(ipts+4,1) )/( wecrsz(ipts+3,3) - wecrsz(ipts+4,3) ),&
    5092              : !&    ( d1wecrsz(ipts+3,2) - d1wecrsz(ipts+4,2) )/( wecrsz(ipts+3,3) - wecrsz(ipts+4,3) )
    5093              : !write(std_out,'(a)' )' Finite-differences, 3rd order :'
    5094              : !write(std_out,'(3es16.8)' )&
    5095              : !&    ( d2wecrsz(ipts+1,1) - d2wecrsz(ipts+2,1) )/( wecrsz(ipts+1,2) - wecrsz(ipts+2,2) ),&
    5096              : !&    ( d2wecrsz(ipts+1,2) - d2wecrsz(ipts+2,2) )/( wecrsz(ipts+1,2) - wecrsz(ipts+2,2) ),&
    5097              : !&    ( d2wecrsz(ipts+1,3) - d2wecrsz(ipts+2,3) )/( wecrsz(ipts+1,2) - wecrsz(ipts+2,2) )
    5098              : !write(std_out,'(3es16.8)' )&
    5099              : !&    ( d2wecrsz(ipts+3,1) - d2wecrsz(ipts+4,1) )/( wecrsz(ipts+3,3) - wecrsz(ipts+4,3) ),&
    5100              : !&    ( d2wecrsz(ipts+3,2) - d2wecrsz(ipts+4,2) )/( wecrsz(ipts+3,3) - wecrsz(ipts+4,3) ),&
    5101              : !&    ( d2wecrsz(ipts+3,3) - d2wecrsz(ipts+4,3) )/( wecrsz(ipts+3,3) - wecrsz(ipts+4,3) )
    5102              : 
    5103              : 
    5104              : !!This is for GGA
    5105              : 
    5106              : !write(std_out,'(4es16.8)' )&
    5107              : !&    ( dvxcdgr(ipts+1,1) - dvxcdgr(ipts+2,1) )/2._dp/delta,&
    5108              : !&    ( dvxcdgr(ipts+3,2) - dvxcdgr(ipts+4,2) )/2._dp/delta,&
    5109              : !&    ( dvxcdgr(ipts+1,3) - dvxcdgr(ipts+2,3) )/2._dp/delta,&
    5110              : !&    ( dvxcdgr(ipts+3,3) - dvxcdgr(ipts+4,3) )/2._dp/delta
    5111              : !else
    5112              : !!  For grho2  (should distinguish exchange and correlation ...)
    5113              : !grr=sqrt(grho2_updn(ipts,1)) ! Analysis of exchange
    5114              : !grr=sqrt(grho2_updn(ipts,3)) ! Analysis of correlation
    5115              : !write(std_out,'(3es16.8)' )exci(ipts)*rho,&
    5116              : !&      ( exci(ipts+1)*rho - exci(ipts+2)*rho )/2._dp/delta/grr,&
    5117              : !&      ( exci(ipts+3)*rho - exci(ipts+4)*rho )/2._dp/delta/grr
    5118              : !write(std_out,'(3es16.8)' )&
    5119              : !&    ( vxci(ipts+1,1) - vxci(ipts+2,1) )/2._dp/delta/grr,&
    5120              : !&    ( vxci(ipts+3,1) - vxci(ipts+4,1) )/2._dp/delta/grr,&
    5121              : !&    ( vxci(ipts+3,2) - vxci(ipts+4,2) )/2._dp/delta/grr
    5122              : !write(std_out,'(4es16.8)' )&
    5123              : !&    ( dvxcdgr(ipts+1,1) - dvxcdgr(ipts+2,1) )/2._dp/delta/grr,&
    5124              : !&    ( dvxcdgr(ipts+3,2) - dvxcdgr(ipts+4,2) )/2._dp/delta/grr,&
    5125              : !&    ( dvxcdgr(ipts+1,3) - dvxcdgr(ipts+2,3) )/2._dp/delta/grr,&
    5126              : !&    ( dvxcdgr(ipts+3,3) - dvxcdgr(ipts+4,3) )/2._dp/delta/grr
    5127              : !end if
    5128              : !end do
    5129              : !stop
    5130              : !end if
    5131              : !ENDDEBUG
    5132              : 
    5133       317862 :  ABI_FREE(rhoarr)
    5134       317862 :  ABI_FREE(rhom1_3)
    5135       317862 :  ABI_FREE(rho_updnm1_3)
    5136       317862 :  ABI_FREE(zetm)
    5137       317862 :  ABI_FREE(zetmm1_3)
    5138       317862 :  ABI_FREE(zetp)
    5139       317862 :  ABI_FREE(zetpm1_3)
    5140              : 
    5141              : !DEBUG
    5142              : !deallocate(wecrsz,d1wecrsz,d2wecrsz,d3wecrsz)
    5143              : !ENDDEBUG
    5144              : 
    5145              : !DEBUG
    5146              : !write(std_out,*)' xcpbe : exit'
    5147              : !write(std_out,*)' nspden=',nspden
    5148              : !if(order==2)stop
    5149              : !ENDDEBUG
    5150              : 
    5151       542076 : end subroutine xcpbe
    5152              : !!***
    5153              : 
    5154              : !!****f* ABINIT/xckdt16
    5155              : !! NAME
    5156              : !! xckdt16
    5157              : !!
    5158              : !! FUNCTION
    5159              : !!  Treat TGGA temperature-dependant exchange-correlation functional KDT16,
    5160              : !!  return the associated Exc energy, potential, and, in case of response-function,
    5161              : !!  functions needed to build the XC kernel.
    5162              : !!
    5163              : !! NOTES
    5164              : !!  Karasiev-Dufty-Trickey (KDT16) TGGA xc-functional
    5165              : !!  V.V. Karasiev, J.W. Dufty, and S.B. Trickey, PRL 120(7), 076401 (2018) [[cite:Karasiev2018]]
    5166              : !!  ixc=60 means KDT16 xc (PBE TGGA parametrization)
    5167              : !!  ixc=61 means KDT16 xc (PBEsol TGGA parametrization)
    5168              : !!  ixc=62 means KDT16 xc (PBEmol TGGA parametrization)
    5169              : !!
    5170              : !! INPUTS
    5171              : !!  grho2_updn(npts,2*nspden-1)=square of the gradient of the spin-up,
    5172              : !!     and, if nspden==2, spin-down, and total density (Hartree/Bohr**2),
    5173              : !!     only used if gradient corrected functional (option=2,-2,-4 and 4 or beyond)
    5174              : !!  ixc=index of the XC functional
    5175              : !!  npts= number of points to be computed
    5176              : !!  nspden=1 for unpolarized, 2 for spin-polarized
    5177              : !!  rhor=value of electronic density at each point
    5178              : !!  rspts(npt)=Wigner-Seitz radii at each point
    5179              : !!  el_temp=electronic temperature (hartree)
    5180              : !!
    5181              : !! OUTPUT
    5182              : !!  dvxcdgr(npts,3)=partial derivative of the exchange-correlation
    5183              : !!    energy (exci*$\rho$) with respect to the spin-up (dvxcdgr(:,1)),
    5184              : !!    spin-down (dvxcdgr(:,2)), or total spin (dvxcdgr(:,3)) gradients of the density
    5185              : !!    divided by the norm of the gradient (the definition changed in v3.3)
    5186              : !!  exci(npts)=exchange-correlation free energy density (hartree)
    5187              : !!  tsxci(npts)=exchange-correlation entropy energy density (hartree)
    5188              : !!  vxci(npts,nspden)=input xc potential
    5189              : !!
    5190              : !! SOURCE
    5191           57 : subroutine xckdt16(dvxcdgr,exci,tsxci,grho2_updn,ixc,npts,nspden,order,&
    5192           57 : &                  rhor,rspts,el_temp,vxci,&
    5193              : &                  dvxci) ! optional arguments
    5194              : !scalars
    5195              :  integer,intent(in) :: ixc,npts,nspden,order
    5196              : !arrays
    5197              :  real(dp),intent(in) :: grho2_updn(npts,2*nspden-1)
    5198              :  real(dp),intent(in) :: rhor(npts),rspts(npts),el_temp
    5199              :  real(dp),intent(out) :: dvxcdgr(npts,3),exci(npts),tsxci(npts),vxci(npts,nspden)
    5200              :  real(dp),intent(out),optional :: dvxci(npts)
    5201              : !Local variables-------------------------------
    5202              : !scalars
    5203              :  integer :: ipt,i
    5204              :  real(dp) :: tfac,rs,rho,tempf,tred
    5205              :  real(dp) :: grho,degauss
    5206              :  real(dp) :: fxclda,tsxclda,vxclda,einxclda
    5207              :  real(dp) :: fx,v1x,v2x,einx,tsx
    5208              :  real(dp) :: fc,v1c,v2c,einc,tsc
    5209              :  real(dp) :: drho
    5210              : !character(len=500) :: message
    5211              : !arrays
    5212              :  real(dp) :: vxctmp(5)
    5213              : 
    5214              : ! *************************************************************************
    5215              : 
    5216           57 :  tfac=(3._dp*pi**2)**(2._dp/3._dp)/2._dp
    5217           57 :  degauss = el_temp*2._dp ! setup temperature (in Ry)
    5218              : !Loop over grid points
    5219        29815 :  do ipt=1,npts
    5220        29758 :    rs=rspts(ipt)
    5221        29758 :    rho=rhor(ipt)                 !0.75_dp/pi/(rs**3)
    5222        29758 :    tempf=tfac*rho**(2._dp/3._dp) !(3._dp*pi**2*rho)**(2._dp/3._dp)/2._dp
    5223        29758 :    tred=el_temp/tempf
    5224        29758 :    grho=grho2_updn(ipt,1)*4.d0   ! this array must have grad2_rho_up even in
    5225              :                                  ! the spin-unpolarized case, such that
    5226              :                                  ! grad2_rho=4*grad2_rho_up=4*grad2_rho_dn
    5227        29758 :    call fxc_ksdt(fxclda,vxclda,einxclda,tsxclda,rs,tred,0)
    5228        29758 :    if(ixc.eq.60) then
    5229        29758 :      call fex_kdt16(rho,grho,5,fx,v1x,v2x,einx,tsx,degauss)
    5230        29758 :      call fec_kdt16(rho,grho,1,fc,v1c,v2c,einc,tsc,degauss)
    5231              : !  elseif(ixc.eq.61) then ! These parametrizations are not yet active.
    5232              : !    call fex_kdt16(rho,grho,6,fx,v1x,v2x,einx,tsx,degauss)
    5233              : !    call fec_kdt16(rho,grho,2,fc,v1c,v2c,einc,tsc,degauss)
    5234              : !  elseif(ixc.eq.62) then ! These parametrizations are not yet active.
    5235              : !    call fex_kdt16(rho,grho,7,fx,v1x,v2x,einx,tsx,degauss)
    5236              : !    call fec_kdt16(rho,grho,3,fc,v1c,v2c,einc,tsc,degauss)
    5237              :    endif
    5238        29758 :    exci(ipt)=(fx+fc)+fxclda
    5239        29758 :    tsxci(ipt)=(tsx+tsc)+tsxclda ! total exchange-correlation entropy energy: S_xc[n] = kTS_xc[n]/kT
    5240        29758 :    vxci(ipt,1)=(v1x+v1c)+vxclda
    5241        29758 :    dvxcdgr(ipt,3)=(v2x+v2c)     !d(exc*rho)/d|gradRho|*1/|gradRho|
    5242        29758 :    dvxcdgr(ipt,1)=zero          !dvxcdgr(ipt,3)*4.d0 ! d(exc*rho)/d|gradRho_up|*1/|gradRho_up|
    5243        29815 :    dvxcdgr(ipt,2)=zero          !dvxcdgr(ipt,1)      ! d(exc*rho)/d|gradRho_dn|*1/|gradRho_dn|
    5244              :  enddo
    5245              : !for order==2, use numerical derivative
    5246           57 :  if(order==2) then
    5247              : !  Loop over grid points
    5248         7007 :    do ipt=1,npts
    5249         7000 :      drho=0.01_dp*rhor(ipt)
    5250        42000 :      do i=1,5
    5251        35000 :        rho=rhor(ipt)+drho*dble(i-3)
    5252        35000 :        rs=(0.75_dp/pi/rho)**(1._dp/3._dp) ! density
    5253        35000 :        tempf=tfac*rho**(2._dp/3._dp) !(3._dp*pi**2*rho)**(2._dp/3._dp)/2._dp
    5254        35000 :        tred=el_temp/tempf
    5255        35000 :        if(ixc.eq.60) then
    5256        35000 :          call fex_kdt16(rho,grho,5,fx,v1x,v2x,einx,tsx,degauss)
    5257        35000 :          call fec_kdt16(rho,grho,1,fc,v1c,v2c,einc,tsc,degauss)
    5258              :        end if
    5259        42000 :        vxctmp(i)=v1x+v1c
    5260              :      enddo
    5261         7000 :      dvxci(ipt)=vxctmp(1)-8._dp*vxctmp(2)+8._dp*vxctmp(4)-vxctmp(5)
    5262         7000 :      dvxci(ipt)=dvxci(ipt)/(12._dp*drho)
    5263              : !    In case something went wrong, set dvxc to zero.
    5264         7007 :      if( dvxci(ipt)/=dvxci(ipt) ) then
    5265            0 :        dvxci(ipt)=0._dp
    5266              : !       write(message, '(a,2d12.5)' )&
    5267              : !&      'dvxc = NaN: rs,tred=',rs,tred
    5268              : !       ABI_WARNING(message)
    5269         7000 :      elseif(dvxci(ipt)>huge(1._dp)) then
    5270            0 :        dvxci(ipt)=0._dp
    5271              : !       write(message, '(a,2d12.5)' )&
    5272              : !&      'dvxc = Inf: rs,tred=',rs,tred
    5273              : !       ABI_WARNING(message)
    5274              :      endif
    5275              :    enddo
    5276              :  endif
    5277           57 : end subroutine xckdt16
    5278              : !!***
    5279              : 
    5280              : !!****f* ABINIT/fex_kdt16
    5281              : !! NAME
    5282              : !! fex_kdt16
    5283              : !!
    5284              : !! FUNCTION
    5285              : !!  Returns TGGA exchange free energy, internal energy and entropy energy of xc functional KDT16
    5286              : !!
    5287              : !! NOTES
    5288              : !!  Karasiev GGA X (without TLDA exchange): see subroutine enfact1_kdt16
    5289              : !!  V.V. Karasiev, J.W. Dufty, and S.B. Trickey, PRL 120(7), 076401 (2018) [[cite:Karasiev2018]]
    5290              : !!
    5291              : !! INPUTS
    5292              : !!  rho=density at this point
    5293              : !!  grho=gradient of the density at this point
    5294              : !!  iflag=flag selector integer
    5295              : !!  degauss=setup temperature (Rydberg)
    5296              : !!
    5297              : !! OUTPUT
    5298              : !!  fx=exchange free energy per electron
    5299              : !!  v1x=first part of the exchange potnetial
    5300              : !!  v2x=second part of the exchange potential
    5301              : !!  einx=exchange internal energy per electron
    5302              : !!  tsx=exchange entropy energy per electron
    5303              : !!
    5304              : !! SOURCE
    5305       129516 : subroutine fex_kdt16(rho,grho,iflag,fx,v1x,v2x,einx,tsx,degauss)
    5306              : !Arguments ------------------------------------
    5307              : !scalars
    5308              :  integer,intent(in) :: iflag
    5309              :  real(dp),intent(in) :: rho,grho,degauss
    5310              :  real(dp),intent(out) :: fx,v1x,v2x,einx,tsx
    5311              : !Local variables ------------------------------
    5312              : !scalars
    5313              :  real(dp) :: rs,tF,t,dtdn
    5314              :  real(dp) :: kf,agrho,s1,s2,ds2dn,ds2dg_agrho,dsg
    5315              :  real(dp) :: Ax,dAx,d2Ax
    5316              :  real(dp) :: Bx,dBx,d2Bx
    5317              :  real(dp) :: BAx,dBAx,d2BAx
    5318              :  real(dp) :: s2x,ds2xdt,ds2xdn
    5319              :  real(dp) :: ex0,vx0,fxunif,dfxunif,sx,FFx,dFFxds2x
    5320              :  real(dp) :: f_slater,alpha_slater
    5321              :  real(dp), parameter :: twothird = 2._dp*third
    5322              :  real(dp), parameter :: fourthird = 4._dp*third
    5323              :  real(dp), parameter :: eightthird = 8._dp*third
    5324              :  real(dp), parameter :: c1 = 0.75_dp / pi
    5325              :  real(dp), parameter :: c2 = 3.093667726280136_dp
    5326              :  real(dp), parameter :: pi34 = 0.6203504908994d0
    5327              : 
    5328              : ! *************************************************************************
    5329              : 
    5330        64758 :  rs = pi34 / rho**third
    5331        64758 :  tF = (3._dp*pi**2*rho)**twothird/2._dp !tF=Fermi temperature for spin-unpol case
    5332        64758 :  t = degauss/2.0_dp/tF !reduced temperature
    5333        64758 :  dtdn = -twothird*t!/rho        ! n*(dt/dn)
    5334        64758 :  agrho = sqrt (grho)
    5335        64758 :  kf = c2 * rho**third           ! (3*pi^2*rho)^(1/3)
    5336        64758 :  dsg = 0.5_dp / kf              ! n*ds/d(gn)
    5337        64758 :  s1 = agrho * dsg / rho         ! s
    5338        64758 :  s2 = s1 * s1                   ! s^2
    5339        64758 :  ds2dn = -eightthird*s2          ! n*ds^2/dn
    5340              : !ds2dg = agrho/(2._dp*rho*kf**2) ! n*ds^2/d(gn)
    5341        64758 :  ds2dg_agrho = 1._dp/(2._dp*rho*kf**2) ! n*ds^2/d(gn)
    5342              : !
    5343              : ! Call t-dependent functions
    5344              : !
    5345        64758 :  call tildeAx(t,Ax,dAx,d2Ax)
    5346        64758 :  call tildeBx(t,Bx,dBx,d2Bx)
    5347              : !
    5348        64758 :  BAx = Bx/Ax
    5349        64758 :  dBAx = dBx/Ax - Bx*dAx/Ax**2
    5350              :  d2BAx = d2Bx/Ax - dBx*dAx/Ax**2 & ! derivative of first term in above line
    5351        64758 :        - dBx*dAx/Ax**2 - Bx*d2Ax/Ax**2 + 2._dp*Bx*dAx*dAx/Ax**3 ! derivative of second term
    5352              : !
    5353        64758 :  s2x = s2*BAx
    5354        64758 :  ds2xdt = s2*dBAx
    5355              :  ds2xdn = ds2dn*BAx & ! n*(d(s2x)/dn)=d(s2x)/d(s^2) * n*d(s^2)/dn
    5356        64758 :         + ds2xdt*dtdn !              +d(s2x)/dt * n*dt/dn
    5357              : !
    5358              : ! Energy
    5359              : !
    5360        64758 :  f_slater=-0.687247939924714d0
    5361        64758 :  alpha_slater=twothird
    5362        64758 :  ex0=f_slater*alpha_slater/rs
    5363        64758 :  vx0=four/three*f_slater*alpha_slater/rs
    5364              : 
    5365        64758 :  if(iflag.le.4) call enfact1_kdt16(iflag,s2x,FFx,dFFxds2x)
    5366        64758 :  if(iflag.ge.5) call enfact2_kdt16(iflag-4,s2x,FFx,dFFxds2x)
    5367        64758 :  fxunif = ex0*Ax                                 ! LDA exchange free-energy per electron
    5368        64758 :  fx = fxunif*FFx                                 ! GGA exchange free-energy per electron
    5369              :                                                  ! fx=fxunif*Fx without "n" factor
    5370              : ! sx = -dfx/dt*1/T_F = -d(fxunif*Fx)/dt*1/T_F
    5371              : !    = -{ex0*(dAx/dt)*Fx+fxunif*dFx/d(s2x)*d(s2x)/dt}*1/T_F
    5372        64758 :  sx = -(ex0*dAx*FFx + fxunif*dFFxds2x*ds2xdt)/tF ! entropy per electron
    5373        64758 :  einx = fx + t*tF*sx                             ! internal energy per electron
    5374        64758 :  tsx = t*tF*sx                                   ! T*entropy per electron
    5375              : ! Potential=
    5376              : ! = d/dn(n*fxunif*Fx(s2x))=fxunif*Fx + n*(dfxunif/dn)*Fx + n*fxunif*(dFx/d2sx)*(ds2x/dn)
    5377              : ! Pay attention: "*n" factor is included in dtdn, ds2dn, ds2dg, ds2xdn terms (see above).
    5378        64758 :  dfxunif = fxunif*third + ex0*dAx*dtdn !n*(dfxunif/dn)=fxunif*(1/3) + e_x^0*(dAx/dt)* n*(dt/dn)
    5379        64758 :  v1x = fx + dfxunif*FFx + fxunif*dFFxds2x*ds2xdn ! d/dn(n*fxunif*FFx(s2x) see above
    5380        64758 :  v2x = fxunif*dFFxds2x*ds2dg_agrho*BAx !d(n*fxunif*Fx(s2x))/d(gn)*1/(gn)=
    5381              : !                                     =fxunif*d(Fx(s2x))/d(s2x) *n*ds2/d(gn) *Bx/Ax)*1/(gn)
    5382        64758 : end subroutine fex_kdt16
    5383              : !!***
    5384              : 
    5385              : !!****f* ABINIT/enfact1_kdt16
    5386              : !! NAME
    5387              : !! enfact1_kdt16
    5388              : !!
    5389              : !! FUNCTION
    5390              : !!  Returns Finite-T GGA KDT16 enhancement factor and its derivative
    5391              : !!
    5392              : !! NOTES
    5393              : !!  Finite-T GGA enhancement factor and its derivative
    5394              : !!  Karasiev GGA X (without TLDA exchange):
    5395              : !!  iflag=1  mu=0.21951 (as in PBE), Fmax=1.804
    5396              : !!  iflag=2  mu=10/81=0.12345679012345679012d0 (as in PBEsol), Fmax=1.804
    5397              : !!  iflag=3  mu=0.27583 (as in PBEmol), Fmax=1.804
    5398              : !!  iflag=4  mu=8/81=0.09876543209876543209 (finite-T X GE, see Geldart), Fmax=1.804
    5399              : !!  V.V. Karasiev, J.W. Dufty, and S.B. Trickey, PRL 120(7), 076401 (2018) [[cite:Karasiev2018]]
    5400              : !!
    5401              : !! INPUTS
    5402              : !!  iflag=flag selector integer
    5403              : !!  s2x=variable
    5404              : !!  Fx=enhancement factor
    5405              : !!  dFxds2x=derivative of Fx w.r.t. s2x
    5406              : !!
    5407              : !! OUTPUT
    5408              : !!  fx=exchange free energy per electron
    5409              : !!  v1x=first part of the exchange potnetial
    5410              : !!  v2x=second part of the exchange potential
    5411              : !!  einx=exchange internal energy per electron
    5412              : !!  tsx=exchange entropy energy per electron
    5413              : !!
    5414              : !! SOURCE
    5415            0 : subroutine enfact1_kdt16(iflag,s2x,Fx,dFxds2x)
    5416              : !Arguments ------------------------------------
    5417              : !scalars
    5418              :  integer,intent(in) :: iflag
    5419              :  real(dp),intent(in) :: s2x
    5420              :  real(dp),intent(out) :: Fx,dFxds2x
    5421              : !Local variables ------------------------------
    5422              : !scalars
    5423              :  real(dp),parameter :: threehalf=three/two
    5424              :  real(dp) :: alpha,expe,den, dden,nom,dnom
    5425              : !arrays
    5426              :  real(dp) :: Fxmax(4),mu(4),gamma(4)
    5427              : 
    5428              : ! *************************************************************************
    5429              : 
    5430              : !            PBE         PBEsol                     PBEmol      Geldart
    5431              :  data Fxmax /1.804_dp,   1.804_dp                 , 1.804_dp,   1.804_dp                 /
    5432              :  data    mu /0.21951_dp, 0.12345679012345679012_dp, 0.27583_dp, 0.09876543209876543209_dp/
    5433              :  data gamma /0.1_dp    , 0.05_dp                  , 0.1_dp,     0.05_dp                  /
    5434            0 :  alpha = mu(iflag)**2/(Fxmax(iflag)**2-one)
    5435            0 :  if(s2x.lt.zero) then
    5436            0 :    expe = exp(gamma(iflag)*s2x)
    5437            0 :    nom = one+mu(iflag)*s2x*expe
    5438            0 :    dnom = mu(iflag)*expe + mu(iflag)*s2x*gamma(iflag)*expe
    5439            0 :    den = sqrt(one+alpha*s2x**2)
    5440            0 :    dden = alpha*s2x/den
    5441              :  else
    5442            0 :    nom = one+mu(iflag)*s2x
    5443            0 :    dnom = mu(iflag)
    5444            0 :    den = sqrt(one+alpha*s2x**2)
    5445            0 :    dden = alpha*s2x/den
    5446              :  endif
    5447            0 :  Fx = nom/den - one !remove LDA term (subtract 1) to make it compatible with WE
    5448            0 :  dFxds2x = dnom/den - nom*dden/den**2
    5449            0 : end subroutine enfact1_kdt16
    5450              : !!***
    5451              : 
    5452              : !!****f* ABINIT/enfact2_kdt16
    5453              : !! NAME
    5454              : !! enfact2_kdt16
    5455              : !!
    5456              : !! FUNCTION
    5457              : !!  Returns Finite-T GGA KDT16 enhancement factor and its derivative
    5458              : !!
    5459              : !! NOTES
    5460              : !!  Finite-T GGA enhancement factor and its derivative
    5461              : !!  Karasiev GGA X, finite-T PBE form (without TLDA exchange):
    5462              : !!  iflag=1  mu=0.21951 (as in PBE), Fmax=1.804
    5463              : !!  iflag=2  mu=10/81=0.12345679012345679012d0 (as in PBEsol), Fmax=1.804
    5464              : !!  iflag=3  mu=0.27583 (as in PBEmol), Fmax=1.804
    5465              : !!  iflag=4  mu=8/81=0.09876543209876543209 (finite-T X GE, see Geldart), Fmax=1.804
    5466              : !!  V.V. Karasiev, J.W. Dufty, and S.B. Trickey, PRL 120(7), 076401 (2018) [[cite:Karasiev2018]]
    5467              : !!
    5468              : !! INPUTS
    5469              : !!  iflag=flag selector integer
    5470              : !!  s2x=variable
    5471              : !!  Fx=enhancement factor
    5472              : !!  dFxds2x=derivative of Fx w.r.t. s2x
    5473              : !!
    5474              : !! OUTPUT
    5475              : !!  fx=exchange free energy per electron
    5476              : !!  v1x=first part of the exchange potnetial
    5477              : !!  v2x=second part of the exchange potential
    5478              : !!  einx=exchange internal energy per electron
    5479              : !!  tsx=exchange entropy energy per electron
    5480              : !!
    5481              : !! SOURCE
    5482        64758 : subroutine enfact2_kdt16(iflag,s2x,Fx,dFxds2x)
    5483              : !Arguments ------------------------------------
    5484              : !scalars
    5485              :  integer,intent(in) :: iflag
    5486              :  real(dp),intent(in) :: s2x
    5487              :  real(dp),intent(out) :: Fx,dFxds2x
    5488              : !Local variables ------------------------------
    5489              : !scalars
    5490              :  real(dp),parameter :: threehalf = three/two
    5491              :  real(dp) :: aa1
    5492              : !arrays
    5493              :  real(DP) :: kappa(4),mu(4)
    5494              : 
    5495              : ! *************************************************************************
    5496              : 
    5497              : !           PBE         PBEsol                     PBEmol      Geldart
    5498              :  data kappa /0.804_dp,   0.804_dp                 , 0.804_dp,   0.804_dp                 /
    5499              :  data    mu /0.21951_dp, 0.12345679012345679012_dp, 0.27583_dp, 0.09876543209876543209_dp/
    5500        64758 :  aa1 = mu(iflag)/kappa(iflag)
    5501        64758 :  Fx = mu(iflag)*s2x/(one+aa1*abs(s2x)) !remove LDA term (subtract 1) to make it compatible with WE
    5502        64758 :  dFxds2x = mu(iflag)/(one+aa1*abs(s2x))**2
    5503        64758 : end subroutine enfact2_kdt16
    5504              : !!***
    5505              : 
    5506              : !!****f* ABINIT/fec_kdt16
    5507              : !! NAME
    5508              : !! fec_kdt16
    5509              : !!
    5510              : !! FUNCTION
    5511              : !!  Returns TGGA correlation free energy, internal energy and entropy energy of xc functional KDT16
    5512              : !!
    5513              : !! NOTES
    5514              : !!  finite-T PBE correlation (without LDA part)
    5515              : !!  it returns energy fc, einc and tsc densities,
    5516              : !!  the LDA fex_ksdt and fec_ksdt return energies per electron.
    5517              : !!  iflag=1: PBE with Bc(rs,t) from Pade fit
    5518              : !!  iflag=2: PBEsol with Bc(rs,t) from Pade fit
    5519              : !!  iflag=3: PBEmol with Bc(rs,t) from Pade fit
    5520              : !!  iflag=4: PBEgel with Bc(rs,t) from Pade fit !<-- for the moment we use the same beta as in PBEsol
    5521              : !!  iflag=5: PBE with Bc(rs,t)=1
    5522              : !!  iflag=6: PBEsol with Bc(rs,t)=1
    5523              : !!  iflag=7: PBEmol with Bc(rs,t)=1
    5524              : !!  iflag=8: PBEgel with Bc(rs,t)=1 !<-- for the moment we use the same beta as in PBEsol
    5525              : !!  iflag=9: PBE with BcII(rs,t) from Pade fit
    5526              : !!  iflag=10: PBEsol with BcII(rs,t) from Pade fit
    5527              : !!  iflag=11: PBEmol with BcII(rs,t) from Pade fit
    5528              : !!  iflag=12: PBEgel with BcII(rs,t) from Pade fit !<-- for the moment we use the same beta as in PBEsol
    5529              : !!  V.V. Karasiev, J.W. Dufty, and S.B. Trickey, PRL 120(7), 076401 (2018) [[cite:Karasiev2018]]
    5530              : !!
    5531              : !! INPUTS
    5532              : !!  rho=density at this point
    5533              : !!  grho=gradient of the density at this point
    5534              : !!  iflag=flag selector integer
    5535              : !!  degauss=setup temperature (Rydberg)
    5536              : !!
    5537              : !! OUTPUT
    5538              : !!  fc=correlation free energy per electron
    5539              : !!  v1c=first part of the correlation potnetial
    5540              : !!  v2c=second part of the correlation potential
    5541              : !!  einc=correlation internal energy per electron
    5542              : !!  tsc=correlation entropy energy per electron
    5543              : !!
    5544              : !! SOURCE
    5545        64758 : subroutine fec_kdt16(rho,grho,iflag,fc,v1c,v2c,einc,tsc,degauss)
    5546              : !Arguments ------------------------------------
    5547              : !scalars
    5548              :  integer,intent(in) :: iflag
    5549              :  real(dp),intent(in) :: rho,grho,degauss
    5550              :  real(dp),intent(out):: fc,v1c,v2c,einc,tsc
    5551              : !Local variables ------------------------------
    5552              : !scalars
    5553              :  real(dp),parameter :: ga=0.031091d0
    5554              :  real(dp),parameter :: pi34=0.6203504908994d0
    5555              :  real(dp),parameter :: xkf=1.919158292677513d0,xks=1.128379167095513d0
    5556              :  real(dp),parameter :: twothird=two/three
    5557              :  real(dp) :: fc_lda,einc_lda,tsc_lda,vc_lda
    5558              :  real(dp) :: Bc,dBcdrs,dBcdt
    5559              :  real(dp) :: t,dtdn,tF,tilde_ds1dqc,tilde_qc
    5560              :  real(dp) :: kf,ks,rs,drsdn
    5561              :  real(dp) :: qc,dqcdn,dqcdt
    5562              :  real(dp) :: expe,af,dadf
    5563              :  real(dp) :: y,xy,dxy,s1,ds1dqc,ds1da
    5564              :  real(dp) :: h0
    5565              : !arrays
    5566              :  real(dp) :: be(12)
    5567              : 
    5568              : ! *************************************************************************
    5569              : 
    5570              : !         pbe         pbesol   pbemol     pbegel
    5571              :  data be / 0.066725d0, 0.046d0, 0.08384d0, 0.046d0, &
    5572              :            0.066725d0, 0.046d0, 0.08384d0, 0.046d0, &
    5573              :            0.066725d0, 0.046d0, 0.08384d0, 0.046d0/
    5574              : 
    5575        64758 :  rs = pi34 / rho**third
    5576              : !drsdn = -third*rs/rho
    5577        64758 :  drsdn = -third*rs !n*d(rs)/dn
    5578        64758 :  tF = (3._dp*pi**2*rho)**twothird/2._dp !tF=Fermi temperature for spin-unpol case
    5579        64758 :  t = degauss/2.0_dp/tF
    5580              : !dtdn = -twothird*t/rho ! (dt/dn)
    5581        64758 :  dtdn = -twothird*t ! n*(dt/dn)
    5582              : ! LDA f_c, einternal_c and T*s_c energies per electron
    5583        64758 :  call fec_ksdt (rs,fc_lda,einc_lda,tsc_lda,vc_lda,degauss)
    5584              : ! added temporarily for tests
    5585              : !call pw (rs, 1, fc_lda, vc_lda)
    5586              : !einc_lda = fc_lda
    5587              : !tsc_lda = 0._dp
    5588              : !
    5589        64758 :  if(iflag.le.8)   call tildeBc(iflag,rs,t,Bc,dBcdrs,dBcdt)  !iflag=1,2,..8
    5590              : !if(iflag.gt.8) call tildeBcII(iflag,rs,t,Bc,dBcdrs,dBcdt)  !iflag=9,10,..12
    5591              : 
    5592        64758 :  kf = xkf/rs
    5593        64758 :  ks = xks*sqrt(kf)
    5594        64758 :  qc = sqrt(grho)/(2.d0*ks*rho) * sqrt(Bc)
    5595              : !dqcdn = -(7._dp/6._dp)*qc/rho - 0.5_dp*sqrt(grho)/(2.d0*ks*rho)/sqrt(Bc) * dBcdrs*drsdn !d(qc)/dn
    5596              : !dqcdn = -(7._dp/6._dp)*qc - 0.5_dp*sqrt(grho)/(2.d0*ks*rho)/sqrt(Bc) * dBcdrs*drsdn !n*d(qc)/dn
    5597              : !dqcdt = - 0.5_dp*sqrt(grho)/(2.d0*ks*rho)/sqrt(Bc) * dBcdt ! d(qc)/dt
    5598        64758 :  dqcdn = -(7._dp/6._dp)*qc + 0.5_dp*qc/Bc * dBcdrs*drsdn !n*d(qc)/dn
    5599        64758 :  dqcdt = + 0.5_dp*qc/Bc * dBcdt ! d(qc)/dt
    5600        64758 :  expe = exp(-fc_lda/ga)
    5601        64758 :  af = be(iflag)/ga/(expe-1.d0) !A(fc_lda)
    5602        64758 :  dadf = expe*af**2/be(iflag) !dA(fc_lda)/d(fc_lda)
    5603        64758 :  y = af*qc*qc
    5604        64758 :  xy = (1.d0 + y) / (1.d0 + y + y * y)
    5605        64758 :  dxy = -y*(2._dp + y)/(1._dp + y + y*y)**2 !d(xy)/dy
    5606        64758 :  s1 = 1.d0 + be(iflag)/ga*qc*qc*xy
    5607        64758 :  ds1dqc = be(iflag)/ga*2._dp*qc*xy + be(iflag)/ga*qc*qc*dxy * 2._dp*af*qc !d(s1)/d(qc)
    5608        64758 :  ds1da = be(iflag)/ga*qc*qc*dxy * qc*qc !d(s1)/dA
    5609        64758 :  h0 = ga*log(s1)
    5610        64758 :  fc = rho * h0 ! energy density !17-APR-2016: commented in ABINIT version
    5611              : !fc = h0 ! energy per electron, 17-APR-2016: ABINIT version
    5612              : !v1c=d(n*H)/dn=H + n*(dH/ds1)*(ds1/dA)*(dA/d(fc_lda))*(d(fc_lda)/dn) + n*(dH/ds1)*(ds1/d(qc))*{(d(qc)/dn) + (d(qc)/dt)*(dt/dn)}
    5613              : !   = H + (dH/ds1)*(ds1/dA)*(dA/d(fc_lda))*(vc_lda - fc_lda) + (dH/ds1)*(ds1/d(qc))*{(n*d(qc)/dn) + (d(qc)/dt)*(n*dt/dn)}
    5614              : !
    5615              : ! where we used the following: n*d(fc_lda)/dn = vc_lda - fc_lda
    5616              : ! fc_lda is the energy per electron
    5617              : !
    5618        64758 :  v1c = h0 + (ga/s1)*ds1da*dadf*(vc_lda - fc_lda) + (ga/s1)*ds1dqc*(dqcdn + dqcdt*dtdn)
    5619              : !A. Blanchet: fixing indeterminate form by introducing tilde_qc and tilde_ds1dqc (when grho == 0)
    5620              : !v2c = rho * (ga/s1) * ds1dqc * qc/grho
    5621        64758 :  tilde_qc = 1._dp/(2.d0*ks*rho) * sqrt(Bc) ! tilde_qc == qc /sqrt(grho)
    5622        64758 :  tilde_ds1dqc = be(iflag)/ga*2._dp*tilde_qc*xy + be(iflag)/ga*qc*qc*dxy * 2._dp*af*tilde_qc ! tilde_ds1dqc = ds1dqc/sqrt(grho)
    5623        64758 :  v2c = rho * (ga/s1) * tilde_ds1dqc * tilde_qc
    5624              : ! first version:
    5625              : !tsc = rho*(ga/s1) * ds1da * dadf * tsc_lda - rho*(ga/s1) * t*dqcdt
    5626              : !
    5627              : ! LDA quantities per particle:
    5628              : ! sc_lda = -d(fc_lda)/dt)/T_F
    5629              : ! tsc_lda = -t*d(fc_lda)/dt)
    5630              : ! GGA entropy and T*s_c density (not per particle)
    5631              : ! sc = -d(n*H)/dt*(1/T_F) = -n*(dH/ds1)*(ds1/dA)*(dA/d(fc_lda))*(d(fc_lda)/dt)/T_F - n*(dH/ds1)*(ds1/d(qc))*(d(qc)/dt)/T_F
    5632              : ! T*sc=t*T_F*sc = -t*d(n*H)/dt = +n*(dH/ds1)*(ds1/dA)*(dA/d(fc_lda))*(-t*d(fc_lda)/dt) - t*n*(dH/ds1)*(ds1/d(qc))*(d(qc)/dt)
    5633        64758 :  tsc = rho*(ga/s1)*ds1da*dadf*tsc_lda - t*rho*(ga/s1)*ds1dqc*dqcdt !17-APR-2016: commented in ABINIT version
    5634              : !tsc =     (ga/s1)*ds1da*dadf*tsc_lda - t*    (ga/s1)*ds1dqc*dqcdt ! energy per electron, 17-APR-2016: ABINIT version
    5635        64758 :  einc = fc + tsc
    5636              :  ! convert energy density to energy per electron
    5637        64758 :  fc = fc / rho
    5638        64758 :  einc = einc / rho
    5639        64758 :  tsc = tsc / rho
    5640        64758 : end subroutine fec_kdt16
    5641              : !!***
    5642              : 
    5643              : end module m_xcpbe
    5644              : !!***
        

Generated by: LCOV version 2.3-1