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-11-10 16:57:26 Functions: 0.0 % 5 0
Branches: 0.0 % 270 0

             Branch data     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