LCOV - code coverage report
Current view: top level - src/65_paw - m_paw_exactDC.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 221 0
Test Date: 2026-09-20 15:27:41 Functions: 0.0 % 5 0

            Line data    Source code
       1              : !!****m* m_paw_exactDC/m_paw_exactDC
       2              : !! NAME
       3              : !!  m_paw_exactDC
       4              : !!
       5              : !! FUNCTION
       6              : !!  This module contains several routines related to the exact formula for the double counting.
       7              : !!
       8              : !! COPYRIGHT
       9              : !! Copyright (C) 2025-2026 ABINIT group
      10              : !! These routines were inspired by K. Haule routines in embedded DMFT.
      11              : !! This file is distributed under the terms of the
      12              : !! GNU General Public License, see ~abinit/COPYING
      13              : !! or http://www.gnu.org/copyleft/gpl.txt .
      14              : !!
      15              : !! SOURCE
      16              : 
      17              : #if defined HAVE_CONFIG_H
      18              : #include "config.h"
      19              : #endif
      20              : 
      21              : #include "abi_common.h"
      22              : 
      23              : MODULE m_paw_exactDC
      24              : 
      25              :  use defs_basis
      26              :  use m_abicore
      27              :  use m_errors
      28              : 
      29              :  implicit none
      30              : 
      31              :  private
      32              : 
      33              :  public :: compute_exactDC
      34              : 
      35              : CONTAINS  !========================================================================================
      36              : !!***
      37              : 
      38              : !----------------------------------------------------------------------
      39              : 
      40              : !!****f* m_paw_exactDC/compute_exactDC
      41              : !! NAME
      42              : !! compute_exactDC
      43              : !!
      44              : !! FUNCTION
      45              : !!
      46              : !! Compute the exact formula for the double counting.
      47              : !! See Physical review letters, Haule, K. (2015), 115(19), 196403 for formula.
      48              : !!
      49              : !! INPUTS
      50              : !!  lpawu = angular momentum for correlated species
      51              : !!  pawtab <type(pawtab_type)>=paw tabulated starting data
      52              : !!  pawrad <type(pawrad_type)>=paw radial mesh and related data
      53              : !!  occ(2*lpawu+1,2*lpawu+1) = occupation matrix (summed over spins) in
      54              : !!    the real spherical harmonics basis, with the convention
      55              : !!    occ(i,j) = <c_j^dagger c_i>
      56              : !!  ixc = index of the XC functional
      57              : !!
      58              : !! OUTPUT
      59              : !!  vdc(2*lpawu+1,2*lpawu+1) = double counting potential
      60              : !!  edc = double counting energy
      61              : !!  edcdc = integral of Vdc(r)*rho_loc(r)
      62              : !!
      63              : !! SOURCE
      64              : 
      65            0 :  subroutine compute_exactDC(lpawu,pawtab,pawrad,occ,vdc,edc,edcdc,ixc)
      66              : 
      67              :  use m_pawtab, only : pawtab_type
      68              :  use m_pawrad, only : pawrad_type,simp_gen
      69              :  use m_paw_sphharm, only : ylmc,ylmcd
      70              :  use m_splines, only : spline2
      71              : 
      72              : !Arguments ------------------------------------
      73              :  integer, intent(in) :: ixc,lpawu
      74              :  type(pawtab_type), intent(in) :: pawtab
      75              :  type(pawrad_type), intent(in) :: pawrad
      76              :  complex(dp), intent(in) :: occ(2*lpawu+1,2*lpawu+1)
      77              :  complex(dp), intent(inout) :: vdc(2*lpawu+1,2*lpawu+1)
      78              :  real(dp), intent(out) :: edc,edcdc
      79              : !Local variables ------------------------------
      80              :  integer :: i,ir,j,k,l,m,m1,mm,minusm,meshsz,ndim
      81              :  logical :: need_gradient
      82              :  real(dp) :: cphi,ctheta,ecc,excint,exx,grad,gradphi,gradr,gradth
      83              :  real(dp) :: onemsqrt2,phi,rad,rho,rhor,sexc,sphi,stheta,svxc
      84              :  real(dp) :: theta,vcc,vxcf,vxx
      85              :  real(dp) :: kcart(3)
      86              :  complex(dp) :: dphi,dth,ylm_c
      87              :  integer, parameter :: ln = 13
      88            0 :  real(dp), allocatable :: exc(:,:,:),exci(:),phis(:),proj_dr(:),rho_angle(:,:)
      89            0 :  real(dp), allocatable :: rho_angle_dphi(:,:),rho_angle_dtheta(:,:)
      90            0 :  real(dp), allocatable :: slm_dphi(:,:,:),slm_dtheta(:,:,:),thetas(:),tweights(:)
      91            0 :  real(dp), allocatable :: vxc(:,:,:),vxci(:,:,:),ylm(:,:,:)
      92              :  !************************************************************************
      93              : 
      94              :  ! VERY IMPORTANT: This routine assumes that we work in the real spherical harmonic basis.
      95              :  ! If you want to generalize that to the complex case for some reason, the formulas
      96              :  ! below are not valid, so you would need to add some complex conjugates.
      97              :  ! Also, we work with the convention occ(i,j) = <c_j^dagger c_i>.
      98              : 
      99            0 :  if (ixc /= 7 .and. ixc /= 11 .and. ixc /= -1012 .and. ixc /= -101130) &
     100            0 :     & ABI_ERROR("Only PW92 and PBE are handled!")
     101              : 
     102            0 :  need_gradient = (ixc == 11 .or. ixc == -101130)
     103              : 
     104            0 :  meshsz = size(pawtab%proj2(:)) ! Size of radial mesh
     105            0 :  ndim = 2*lpawu + 1
     106              : 
     107            0 :  ABI_MALLOC(exc,(ln+1,2*ln+1,meshsz))
     108            0 :  ABI_MALLOC(exci,(meshsz))
     109            0 :  ABI_MALLOC(phis,(2*ln+1))
     110            0 :  ABI_MALLOC(rho_angle,(ln+1,2*ln+1))
     111            0 :  ABI_MALLOC(thetas,(ln+1))
     112            0 :  ABI_MALLOC(tweights,(ln+1))
     113            0 :  ABI_MALLOC(vxc,(ln+1,2*ln+1,meshsz))
     114            0 :  ABI_MALLOC(vxci,(meshsz,ndim,ndim))
     115            0 :  ABI_MALLOC(ylm,(ln+1,2*ln+1,ndim))
     116              : 
     117            0 :  if (need_gradient) then
     118            0 :    ABI_MALLOC(proj_dr,(meshsz))
     119            0 :    ABI_MALLOC(rho_angle_dphi,(ln+1,2*ln+1))
     120            0 :    ABI_MALLOC(rho_angle_dtheta,(ln+1,2*ln+1))
     121            0 :    ABI_MALLOC(slm_dphi,(ln+1,2*ln+1,ndim))
     122            0 :    ABI_MALLOC(slm_dtheta,(ln+1,2*ln+1,ndim))
     123              :    call spline2(pawrad%rad(1:meshsz),pawtab%proj2(:)/max(epsilon(one),pawrad%rad(1:meshsz)**2), &
     124            0 :               & meshsz,proj_dr(:),zero,zero,3,3)
     125            0 :    rho_angle_dphi(:,:)   = zero
     126            0 :    rho_angle_dtheta(:,:) = zero
     127              :  end if ! gradient
     128              : 
     129            0 :  vdc(:,:) = czero
     130            0 :  edc = zero
     131              : 
     132              :  ! Hartree contribution
     133              : 
     134            0 :  do l=1,ndim
     135            0 :    do j=1,ndim
     136            0 :      do k=1,ndim
     137            0 :        do i=1,ndim
     138              :          ! In the complex case, you should use conjg(pawtab%vee(i,k,j,l))
     139            0 :          vdc(i,j) = vdc(i,j) + pawtab%vee(i,k,j,l)*occ(k,l)
     140            0 :          edc = edc + pawtab%vee(i,k,j,l)*dble(occ(i,j)*occ(k,l))
     141              :        end do ! i
     142              :      end do ! k
     143              :    end do ! j
     144              :  end do ! l
     145              : 
     146            0 :  edc = half * edc
     147              : 
     148              :  ! XC contribution
     149              : 
     150              :  ! Prepare angular mesh
     151            0 :  call angular_mesh(thetas(:),phis(:),tweights(:),ln)
     152              : 
     153              :  ! Compute the real spherical harmonics on the angular mesh
     154            0 :  do m=0,lpawu
     155            0 :    mm = m + lpawu + 1 ; minusm = - m + lpawu + 1
     156            0 :    onemsqrt2 = (-one)**m * sqrt2
     157            0 :    do j=1,2*ln+1
     158            0 :      phi = phis(j) ; cphi = cos(phi) ; sphi = sin(phi)
     159            0 :      do i=1,ln+1
     160            0 :        theta = thetas(i) ; ctheta = cos(theta) ; stheta = sin(theta)
     161            0 :        kcart(1) = cphi * stheta ; kcart(2) = sphi * stheta ; kcart(3) = ctheta
     162            0 :        ylm_c = ylmc(lpawu,m,kcart(:))
     163              :        ! Convert complex harmonics to real harmonics
     164            0 :        if (m == 0) then
     165            0 :          ylm(i,j,mm) = dble(ylm_c)
     166              :        else
     167            0 :          ylm(i,j,mm)     = onemsqrt2 * dble(ylm_c)
     168            0 :          ylm(i,j,minusm) = onemsqrt2 * aimag(ylm_c)
     169              :        end if ! m=0
     170            0 :        if (need_gradient) then
     171            0 :          call ylmcd(lpawu,m,kcart(:),dth,dphi)
     172            0 :          if (m == 0) then
     173            0 :              slm_dphi(i,j,mm)   = dble(dphi)
     174            0 :              slm_dtheta(i,j,mm) = dble(dth)
     175              :          else
     176            0 :              slm_dphi(i,j,mm)       = onemsqrt2 * dble(dphi)
     177            0 :              slm_dtheta(i,j,mm)     = onemsqrt2 * dble(dth)
     178            0 :              slm_dphi(i,j,minusm)   = onemsqrt2 * aimag(dphi)
     179            0 :              slm_dtheta(i,j,minusm) = onemsqrt2 * aimag(dth)
     180              :          end if ! m=0
     181              :        end if ! gradient
     182              :      end do ! i
     183              :    end do ! j
     184              :  end do ! m
     185              : 
     186            0 :  rho_angle(:,:) = zero
     187              : 
     188            0 :  do m1=1,ndim
     189            0 :    do m=1,ndim
     190              :      ! In the complex case, you should use ylm(:,:,m)*conjg(ylm(:,:,m1))
     191            0 :      rho_angle(:,:) = rho_angle(:,:) + dble(occ(m,m1))*ylm(:,:,m)*ylm(:,:,m1)
     192            0 :      if (need_gradient) then
     193              :        ! In the complex case, there should be a conjg each time there is a m1
     194            0 :        rho_angle_dphi(:,:)   = rho_angle_dphi(:,:) + dble(occ(m,m1))*(slm_dphi(:,:,m)*ylm(:,:,m1)+ylm(:,:,m)*slm_dphi(:,:,m1))
     195            0 :        rho_angle_dtheta(:,:) = rho_angle_dtheta(:,:) + dble(occ(m,m1))*(slm_dtheta(:,:,m)*ylm(:,:,m1)+ylm(:,:,m)*slm_dtheta(:,:,m1))
     196              :      end if ! gradient
     197              :    end do ! m
     198              :  end do ! m1
     199              : 
     200            0 :  if (maxval(rho_angle(:,:)-abs(rho_angle(:,:))) > tol10) ABI_WARNING("WARNING: the density is negative !")
     201            0 :  rho_angle(:,:) = abs(rho_angle(:,:))
     202              : 
     203            0 :  do ir=1,meshsz
     204            0 :    rad  = pawrad%rad(ir)
     205            0 :    rhor = pawtab%proj2(ir) / max(rad**2,epsilon(one))
     206            0 :    do j=1,2*ln+1
     207            0 :      do i=1,ln+1
     208              : 
     209            0 :        rho  = rho_angle(i,j) * rhor
     210            0 :        grad = zero
     211              : 
     212            0 :        if (need_gradient) then
     213            0 :          stheta  = sin(thetas(i))
     214            0 :          gradr   = rho_angle(i,j) * proj_dr(ir)
     215            0 :          gradth  = (rho_angle_dtheta(i,j)*rhor) / max(rad,epsilon(one))
     216            0 :          gradphi = (rho_angle_dphi(i,j)*rhor) / (max(rad,epsilon(one))*stheta)
     217            0 :          grad = gradr*gradr + gradth*gradth + gradphi*gradphi
     218              :        end if ! gradient
     219              : 
     220            0 :        call exchange_yukawa(exx,vxx,rho,pawtab%lambda,pawtab%eps,grad,ixc)
     221            0 :        exc(i,j,ir) = exx ; vxc(i,j,ir) = vxx
     222              : 
     223            0 :        call correlation_yukawa(ecc,vcc,rho,pawtab%lambda,pawtab%eps,grad,ixc)
     224            0 :        exc(i,j,ir) = exc(i,j,ir) + ecc ; vxc(i,j,ir) = vxc(i,j,ir) + vcc
     225              : 
     226              :      end do ! i
     227              :    end do ! j
     228              :  end do ! ir
     229              : 
     230            0 :  exci(:) = zero
     231              : 
     232              :  ! Integrals over theta and phi
     233              : 
     234            0 :  do m1=1,ndim
     235            0 :    do m=1,ndim
     236            0 :      do ir=1,meshsz
     237              :        svxc = zero
     238              :        sexc = zero
     239            0 :        do j=1,2*ln+1
     240              :          ! In the complex case, you should use ylm(:,j,m)*conjg(ylm(:,j,m1))
     241            0 :          svxc = svxc + sum(ylm(:,j,m)*ylm(:,j,m1)*tweights(:)*vxc(:,j,ir))
     242            0 :          sexc = sexc + sum(ylm(:,j,m)*ylm(:,j,m1)*tweights(:)*exc(:,j,ir))
     243              :        end do ! j
     244            0 :        vxci(ir,m,m1) = two_pi * svxc / dble(2*ln+1)
     245            0 :        exci(ir) = exci(ir) + two_pi * sexc * dble(occ(m,m1)) / dble(2*ln+1)
     246              :      end do ! ir
     247              :    end do ! m
     248              :  end do ! m1
     249              : 
     250              :  ! Integrals over r
     251              : 
     252            0 :  call simp_gen(excint,exci(:)*pawtab%proj2(:),pawrad,r_for_intg=pawrad%rad(meshsz))
     253            0 :  edc = edc + excint
     254            0 :  edcdc = zero
     255              : 
     256              :  ! Careful, vdc(i,j) as defined here is the i,j-th matrix element of the TRANSPOSE of vdc !
     257              : 
     258            0 :  do m1=1,ndim
     259            0 :    do m=1,ndim
     260            0 :      call simp_gen(vxcf,vxci(:,m,m1)*pawtab%proj2(:),pawrad,r_for_intg=pawrad%rad(meshsz))
     261            0 :      vdc(m,m1) = vdc(m,m1) + cmplx(vxcf,zero,kind=dp)
     262            0 :      edcdc = edcdc + dble(vdc(m,m1)*occ(m,m1))
     263              :    end do ! m
     264              :  end do ! m1
     265              : 
     266            0 :  ABI_FREE(exc)
     267            0 :  ABI_FREE(exci)
     268            0 :  ABI_FREE(phis)
     269            0 :  ABI_FREE(rho_angle)
     270            0 :  ABI_FREE(thetas)
     271            0 :  ABI_FREE(tweights)
     272            0 :  ABI_FREE(vxc)
     273            0 :  ABI_FREE(vxci)
     274            0 :  ABI_FREE(ylm)
     275            0 :  ABI_SFREE(proj_dr)
     276            0 :  ABI_SFREE(rho_angle_dphi)
     277            0 :  ABI_SFREE(rho_angle_dtheta)
     278            0 :  ABI_SFREE(slm_dphi)
     279            0 :  ABI_SFREE(slm_dtheta)
     280              : 
     281            0 :  end subroutine compute_exactDC
     282              : !!***
     283              : 
     284              : !----------------------------------------------------------------------
     285              : 
     286              : !!****f* m_paw_exactDC/angular_mesh
     287              : !! NAME
     288              : !! angular_mesh
     289              : !!
     290              : !! FUNCTION
     291              : !!
     292              : !! Prepare the angular mesh for the integration over thetas and phis.
     293              : !!
     294              : !! INPUTS
     295              : !!  ln = controls the number of integration points
     296              : !!
     297              : !! OUTPUT
     298              : !!  thetas(ln+1) = Gauss-Legendre integration points for theta grid
     299              : !!  phis(2*ln+1) = uniform points for phi grid
     300              : !!  tweights(ln+1) = Gauss-Legendre weights for theta grid
     301              : !!
     302              : !! SOURCE
     303              : 
     304            0 : subroutine angular_mesh(thetas,phis,tweights,ln)
     305              : 
     306              : use m_numeric_tools, only : coeffs_gausslegint
     307              : 
     308              : !Arguments ------------------------------------
     309              :  integer, intent(in) :: ln
     310              :  real(dp), intent(inout) :: phis(2*ln+1),thetas(ln+1),tweights(ln+1)
     311              : !Local variables ------------------------------
     312              :  integer :: i,lg
     313              :  real(dp) :: dsum,phi
     314              :  real(dp), parameter :: fake_shift = exp(-4.0_dp) ! small shift such that we do not start at phi=0
     315              : !************************************************************************
     316              : 
     317            0 :  lg = ln + 1
     318            0 :  call coeffs_gausslegint(-1.0_dp,1.0_dp,thetas(:),tweights(:),lg)
     319            0 :  do i=1,lg
     320            0 :    thetas(i) = acos(thetas(i))
     321              :  end do
     322              : 
     323            0 :  do i=0,2*lg-2       ! 2*lg-1 points in phi direction
     324            0 :    phi = pi * (two*dble(i)/dble(2*lg-1)+fake_shift)
     325            0 :    phis(i+1) = phi
     326              :  end do ! i
     327              : 
     328            0 :  dsum = sum(tweights(:))
     329            0 :  tweights(:) = tweights(:) * 2.0_dp / dsum
     330              : 
     331            0 : end subroutine angular_mesh
     332              : !!***
     333              : 
     334              : !----------------------------------------------------------------------
     335              : 
     336              : !!****f* m_paw_exactDC/exchange_yukawa
     337              : !! NAME
     338              : !! exchange_yukawa
     339              : !!
     340              : !! FUNCTION
     341              : !!
     342              : !! Compute the exchange contribution with a Yukawa potential
     343              : !!
     344              : !! INPUTS
     345              : !!  rho = density at current point
     346              : !!  lambda = parameter for Yukawa potential (inverse screening length)
     347              : !!  eps = parameter for Yukawa potential (dielectric constant)
     348              : !!  grad = square of the gradient of the density
     349              : !!  ixc = index of the XC functional
     350              : !!
     351              : !! OUTPUT
     352              : !!  ex = exchange energy per particle
     353              : !!  vx = exchange potential
     354              : !!
     355              : !! SOURCE
     356              : 
     357            0 : subroutine exchange_yukawa(ex,vx,rho,lambda,eps,grad,ixc)
     358              : 
     359              : !Arguments ------------------------------------
     360              :  integer, intent(in) :: ixc
     361              :  real(dp), intent(in) :: grad,lambda,eps,rho
     362              :  real(dp), intent(out) :: ex,vx
     363              : !Local variables ------------------------------
     364              :  logical :: islambda
     365              :  real(dp) :: dfdkappa,dfdmu,dfdrho,dfdss,dfx,div,div2,dkappadx,dlogf,dmudx,dssdrho
     366              :  real(dp) :: dxdrho,fx,fx_pbe,kappa,mu,rhothird,rhotwothird,rsinv,ss,x,x2
     367              :  real(dp), parameter :: c0 = (9.0_dp/(4.0_dp*(pi**2)))**third * three_quarters
     368              :  real(dp), parameter :: c1 = 1.804_dp
     369              :  real(dp), parameter :: kf_fac = (3.0_dp*(pi**2))**third
     370              :  real(dp), parameter :: mu0 = 0.2195149727645171_dp
     371              :  real(dp), parameter :: rsinv_fac = (4.0_dp*pi/3.0_dp)**third
     372              :  real(dp), parameter :: twotwothird = (2.0_dp)**(2.0_dp*third)
     373              :  real(dp), parameter :: x_fac = (9.0_dp*pi/4.0_dp)**third
     374              : !************************************************************************
     375              : 
     376            0 :  rhothird = rho**third ; rsinv = rsinv_fac * rhothird
     377            0 :  islambda = (abs(lambda) > tol10)
     378              : 
     379              :  ! LDA exchange
     380            0 :  if (islambda) then
     381            0 :    x = x_fac * rsinv / lambda
     382            0 :    call fexchange(x,fx,dfx)
     383              :  else
     384            0 :    fx  = 1.0_dp
     385            0 :    dfx = 0.0_dp
     386              :  end if
     387              : 
     388            0 :  ex = - c0 * fx * rsinv / eps
     389            0 :  vx = 4.0_dp*ex/3.0_dp - c0*x*dfx*rsinv/(3.0_dp*eps)
     390              : 
     391            0 :  if (ixc == 7 .or. ixc == -1012) return
     392              : 
     393              :  ! PBE exchange
     394            0 :  if (abs(rho) < tol30) then
     395            0 :    ex = zero ; vx = zero
     396            0 :    return
     397              :  end if
     398              : 
     399            0 :  if (islambda) then
     400            0 :    x2 = x * x
     401            0 :    kappa = x2 / (x2 + twotwothird)
     402              :  else
     403              :    kappa = 1.0_dp
     404              :  end if
     405              : 
     406            0 :  kappa = c1*kappa/fx - 1.0_dp
     407            0 :  rhotwothird = rhothird * rhothird
     408            0 :  ss = grad / (4.0_dp*(rho**2)*rhotwothird*(kf_fac**2))
     409            0 :  mu = mu0 / fx
     410            0 :  div = 1.0_dp+mu*ss/kappa
     411            0 :  div2 = div * div
     412            0 :  fx_pbe = 1.0_dp + kappa*(1.0_dp-1.0_dp/div)
     413            0 :  dssdrho = -8.0_dp * third * ss / rho
     414            0 :  dfdss = mu / div2
     415            0 :  dfdrho = dfdss * dssdrho
     416            0 :  if (islambda) then
     417            0 :    dlogf = dfx / fx
     418            0 :    dxdrho = third * x / rho
     419            0 :    dkappadx = (kappa+1.0_dp) * (2.0_dp*twotwothird/(x*(x2+twotwothird))-dlogf)
     420            0 :    dfdkappa = 1.0_dp - (1.0_dp+2.0_dp*mu*ss/kappa)/div2
     421            0 :    dmudx = -mu * dlogf
     422            0 :    dfdmu = ss / div2
     423            0 :    dfdrho = dfdrho + (dfdkappa*dkappadx+dfdmu*dmudx)*dxdrho
     424              :  end if
     425            0 :  vx = vx*fx_pbe + rho*ex*dfdrho
     426            0 :  ex = ex * fx_pbe
     427              : 
     428              : end subroutine exchange_yukawa
     429              : !!***
     430              : 
     431              : !----------------------------------------------------------------------
     432              : 
     433              : !!****f* m_paw_exactDC/fexchange
     434              : !! NAME
     435              : !! fexchange
     436              : !!
     437              : !! FUNCTION
     438              : !!
     439              : !! Compute the function in the HEG exchange energy with Yukawa potential
     440              : !!
     441              : !! INPUTS
     442              : !!  x = input of the function (=(9*pi/4)**(1/3) / (lambda*rs)
     443              : !!      with lambda the Yukawa parameter and rs the Wigner-Seitz radius)
     444              : !!
     445              : !! OUTPUT
     446              : !!  fx  = value of the function at x
     447              : !!  dfx = derivative of the function at x
     448              : !!
     449              : !! SOURCE
     450              : 
     451            0 : subroutine fexchange(x,fx,dfx)
     452              : 
     453              : !Arguments ------------------------------------
     454              :  real(dp), intent(in) :: x
     455              :  real(dp), intent(out) :: fx,dfx
     456              : !Local variables ------------------------------
     457              :  real(dp) :: at2,lg2,x2,x3,x4,x5
     458              : !************************************************************************
     459              : 
     460            0 :  x2 =  x * x ; x3 = x2 * x ; x4 = x3 * x ; x5 = x4 * x
     461            0 :  if (x < tol2) then ! Taylor expansion
     462            0 :    fx  = 4.0_dp * x2 * (1.0_dp/9.0_dp-2.0_dp*x2/15.0_dp+8.0_dp*x4/35.0_dp)
     463            0 :    dfx = 8.0_dp * x * (1.0_dp/9.0_dp-4.0_dp*x2/15.0_dp+24.0_dp*x4/35.0_dp)
     464              :  else
     465            0 :    at2 = atan(2.0_dp*x) ; lg2 = log(1.0_dp+4.0_dp*x2)
     466              :    fx  = 1.0_dp - 1.0_dp/(6.0_dp*x2) - 4.0_dp*at2/(3.0_dp*x) + &
     467            0 :       & (1.0_dp+12.0_dp*x2)*lg2/(24.0_dp*x4)
     468            0 :    dfx = (8.0_dp*x3*at2+4.0_dp*x2-(1.0_dp+6.0_dp*x2)*lg2)/(6.0_dp*x5)
     469              :  end if
     470              : 
     471            0 : end subroutine fexchange
     472              : !!***
     473              : 
     474              : !!****f* m_paw_exactDC/correlation_yukawa
     475              : !! NAME
     476              : !! correlation_yukawa
     477              : !!
     478              : !! FUNCTION
     479              : !!
     480              : !! Compute the correlation contribution with a Yukawa potential
     481              : !!
     482              : !! INPUTS
     483              : !!  rho = density at current point
     484              : !!  lambda = parameter for screened potential (inverse screening length)
     485              : !!  eps = parameter for screened potential (dielectric constant)
     486              : !!  grad = square of the gradient of the density
     487              : !!  ixc = index of the XC functional
     488              : !!
     489              : !! OUTPUT
     490              : !!  ec = correlation energy per particle
     491              : !!  vc = correlation potential
     492              : !!
     493              : !! SOURCE
     494              : 
     495            0 : subroutine correlation_yukawa(ec,vc,rho,lambda,eps,grad,ixc)
     496              : 
     497              : !Arguments ------------------------------------
     498              :  integer, intent(in) :: ixc
     499              :  real(dp), intent(in) :: eps,grad,lambda,rho
     500              :  real(dp), intent(out) :: ec,vc
     501              : !Local variables ------------------------------
     502              :  logical :: islambda
     503              :  real(dp) :: aa_pbe,alb,alb_pow,arg_log,daadec,decdrho,den,df,dhdaa
     504              :  real(dp) :: dhdrho,dhdtt,div,div2,dttdrho,eps2,eps3,exp_pbe,fx,h_pbe,lg,pade,pow,q0
     505              :  real(dp) :: q1,q1p,rhothird,rs,sqr_rs,tt,xx
     506              :  real(dp), parameter :: aa = 0.031091_dp,a1 = 0.21370_dp
     507              :  real(dp), parameter :: b1 = 7.5957_dp,b2 = 3.5876_dp
     508              :  real(dp), parameter :: b3 = 1.6382_dp,b4 = 0.49294_dp
     509              :  real(dp), parameter :: a = 0.47808102_dp,b = 0.84449703_dp
     510              :  real(dp), parameter :: c = 1.30089155_dp,d = 0.02949437_dp,beta = 1.34835105_dp
     511              :  real(dp), parameter :: kf_fac = (3.0_dp*(pi**2))**third
     512              :  real(dp), parameter :: rs_fac = (3.0_dp/(4.0_dp*pi))**third
     513              :  real(dp), parameter :: beta_pbe = 0.066725_dp,gamma_pbe = (1.0_dp-log(2.0_dp))/(pi**2)
     514              : !************************************************************************
     515              : 
     516            0 :  if (abs(rho) < tol30) then
     517            0 :    ec = 0.0_dp
     518            0 :    vc = 0.0_dp
     519            0 :    return
     520              :  end if
     521              : 
     522            0 :  rhothird = rho**third
     523            0 :  rs = rs_fac / (rhothird*eps) ! Scaling law for r_s
     524            0 :  sqr_rs = sqrt(rs)
     525              : 
     526            0 :  eps2 = eps * eps
     527              : 
     528              :  ! LDA correlation for rescaled Coulomb potential (PW91 parametrization)
     529            0 :  q0  = -2.0_dp * aa * (1.0_dp+a1*rs)
     530            0 :  q1  = 2.0_dp * aa * (b1*sqr_rs+b2*rs+b3*rs*sqr_rs+b4*rs*rs)
     531            0 :  q1p = aa * (b1/sqr_rs+2._dp*b2+3._dp*b3*sqr_rs+4._dp*b4*rs)
     532            0 :  den = 1.0_dp / (q1*q1+q1)
     533            0 :  lg  = -log(q1*q1*den)
     534            0 :  ec  = q0 * lg
     535            0 :  vc  = -2.0_dp*aa*a1*lg - q0*q1p*den
     536            0 :  vc  = ec - rs*vc/3.0_dp
     537              : 
     538            0 :  islambda = (abs(lambda) > tol10)
     539              : 
     540              :  ! Correction factor for Yukawa potential
     541              :  ! Parametrization based on data from Savin, "Beyond the Kohn-Sham Determinant"
     542            0 :  pow = c + d*log(1.0_dp+rs)
     543            0 :  alb = a*lambda*eps*(rs**b) ; alb_pow = alb**pow  ! Scaling law for lambda
     544            0 :  fx  = (1.0_dp+alb_pow)**(-beta-1.0_dp)
     545            0 :  if (islambda) then
     546            0 :    df = -beta * fx * alb_pow * (pow*b/rs+d*log(alb)/(1.0_dp+rs))
     547              :  else
     548              :    df = zero
     549              :  end if
     550            0 :  fx = fx * (1.0_dp+alb_pow)
     551              : 
     552            0 :  vc = (vc*fx-ec*rs*df/3.0_dp) / eps2 ! Scaling law
     553            0 :  ec = ec * fx / eps2
     554              : 
     555            0 :  if (ixc == 7 .or. ixc == -1012) return
     556              : 
     557            0 :  eps3 = eps2 * eps
     558            0 :  tt = grad * pi / ((rho**2)*16.0_dp*kf_fac*rhothird)
     559            0 :  exp_pbe = exp(-ec*eps2/gamma_pbe)
     560            0 :  if (abs(exp_pbe-1.0_dp) < tol30) return
     561              : 
     562            0 :  aa_pbe = eps * beta_pbe / (gamma_pbe*(exp_pbe-1.0_dp))
     563            0 :  daadec = eps3 * beta_pbe * exp_pbe / (gamma_pbe*(exp_pbe-1.0_dp))**2
     564            0 :  decdrho = (vc-ec) / rho
     565            0 :  xx = aa_pbe * tt
     566            0 :  div = 1.0_dp + xx + xx**2
     567            0 :  div2 = div * div
     568            0 :  pade = (1.0_dp+xx) / div
     569            0 :  arg_log = 1.0_dp + eps*beta_pbe*tt*pade/gamma_pbe
     570            0 :  h_pbe = gamma_pbe * log(arg_log) / eps2
     571            0 :  dhdaa = -beta_pbe * (tt**2) * xx * (2.0_dp+xx) / (eps*div2*arg_log)
     572            0 :  dttdrho = -7.0_dp * tt / (3.0_dp*rho)
     573            0 :  dhdtt = beta_pbe * (pade-(xx**2)*(2.0_dp+xx)/div2) / (arg_log*eps)
     574            0 :  dhdrho = dhdtt*dttdrho + dhdaa*daadec*decdrho
     575            0 :  vc = vc + h_pbe + rho*dhdrho
     576            0 :  ec = ec + h_pbe
     577              : 
     578              : end subroutine correlation_yukawa
     579              : !!***
     580              : 
     581              : END MODULE m_paw_exactDC
     582              : !!***
     583              : 
        

Generated by: LCOV version 2.3-1