LCOV - code coverage report
Current view: top level - src/64_psp - m_psptk.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 97.5 % 564 550
Test Date: 2026-11-12 14:41:44 Functions: 100.0 % 12 12
Branches: 68.0 % 584 397

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_psptk
       2                 :             : !! NAME
       3                 :             : !!  m_psptk
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !!  This module collects low-level procedures used by the other psp modules
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 1998-2026 ABINIT group (XG, DCA, MM, DRH, FrD, GZ, AF)
      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_psptk
      23                 :             : 
      24                 :             :  use defs_basis
      25                 :             :  use m_errors
      26                 :             :  use m_abicore
      27                 :             :  use m_splines
      28                 :             : 
      29                 :             :  use m_numeric_tools,  only : ctrap
      30                 :             :  use m_special_funcs,  only : sbf8
      31                 :             : 
      32                 :             :  implicit none
      33                 :             : 
      34                 :             :  private
      35                 :             : !!***
      36                 :             : 
      37                 :             :  public :: psp1cc
      38                 :             :  public :: psp5lo
      39                 :             :  public :: psp5nl
      40                 :             :  public :: psp8lo
      41                 :             :  public :: psp8nl
      42                 :             :  public :: cc_derivatives
      43                 :             : !!***
      44                 :             : 
      45                 :             : contains
      46                 :             : !!***
      47                 :             : 
      48                 :             : !!****f* ABINIT/psp1cc
      49                 :             : !! NAME
      50                 :             : !! psp1cc
      51                 :             : !!
      52                 :             : !! FUNCTION
      53                 :             : !! Compute the core charge density, for use in the XC core
      54                 :             : !! correction, following the function definition valid
      55                 :             : !! for the format 1 and 5 of pseudopotentials.
      56                 :             : !! WARNING : the fifth derivate is actually set to zero
      57                 :             : !!
      58                 :             : !! INPUTS
      59                 :             : !!  fchrg=magnitude of the core charge correction
      60                 :             : !!  n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
      61                 :             : !
      62                 :             : !! OUTPUT
      63                 :             : !!  xccc1d(n1xccc,6)= 1D core charge function and its five first derivatives
      64                 :             : !!
      65                 :             : !! NOTES
      66                 :             : !! This is a revised expression for core density (5 Nov 1992) :
      67                 :             : !! density(r)=fchrg*gg(xx)
      68                 :             : !! with
      69                 :             : !! $ gg(xx)=(\frac{\sin(2\pi xx)}{(2\pi xx)(1-4 xx^2)(1-xx^2)})^2 $
      70                 :             : !! and
      71                 :             : !! $ xx=\frac{r}{rchrg}=\frac{r}{xcccrc/3.0d0}=3*\frac{r}{xcccrc}=3*yy $
      72                 :             : !!
      73                 :             : !! Code for gg(xx), gp(xx), and gpp(xx) has been tested by numerical
      74                 :             : !! derivatives--looks ok. gpp(x) should still be rewritten.
      75                 :             : !! The argument of xccc1d is assumed to be normalized, and to vary
      76                 :             : !! from yy=0 to 1 (from r=0 to r=xcccrc, or from xx=0 to 3)
      77                 :             : !! Thus :
      78                 :             : !!{{\ \begin{equation}
      79                 :             : !! xccc1d(yy)=fchrg*[\frac{\sin(2*\pi*(3yy))}
      80                 :             : !! {(6*\pi*(3yy))(1-4*(3yy)^2)(1-(3yy)^2)}]^2
      81                 :             : !!\end{equation} }}
      82                 :             : !!
      83                 :             : !! WARNINGS
      84                 :             : !! Warning: the fifth derivative is not yet delivered.
      85                 :             : !!
      86                 :             : !! SOURCE
      87                 :             : 
      88                 :         589 : subroutine psp1cc(fchrg,n1xccc,xccc1d)
      89                 :             : 
      90                 :             : !Arguments ------------------------------------
      91                 :             : !scalars
      92                 :             :  integer,intent(in) :: n1xccc
      93                 :             :  real(dp),intent(in) :: fchrg
      94                 :             : !arrays
      95                 :             :  real(dp),intent(inout) :: xccc1d(n1xccc,6) !vz_i
      96                 :             : 
      97                 :             : !Local variables-------------------------------
      98                 :             : !scalars
      99                 :             :  integer :: i1xccc,ider
     100                 :             :  real(dp) :: der1,dern,factor,gg1cc_xx,gp1cc_xx,gpp1cc_xx,xx
     101                 :             :  character(len=500) :: message
     102                 :             : !arrays
     103                 :         589 :  real(dp),allocatable :: ff(:),ff2(:),work(:),yy(:)
     104                 :             : ! *************************************************************************
     105                 :             : 
     106   [ -  +  +  -  :        1767 :  ABI_MALLOC(ff,(n1xccc))
          +  -  +  -  -  
                +  -  + ]
     107   [ -  +  +  -  :        1178 :  ABI_MALLOC(ff2,(n1xccc))
             -  +  -  + ]
     108   [ -  +  +  -  :        1178 :  ABI_MALLOC(work,(n1xccc))
             -  +  -  + ]
     109   [ -  +  +  -  :        1178 :  ABI_MALLOC(yy,(n1xccc))
             -  +  -  + ]
     110                 :             : 
     111         [ +  - ]:         589 :  if(n1xccc > 1)then
     112                 :         589 :    factor=one/dble(n1xccc-1)
     113         [ +  + ]:     1473678 :    do i1xccc=1,n1xccc
     114                 :     1473678 :      yy(i1xccc)=(i1xccc-1)*factor
     115                 :             :    end do
     116                 :             :  else
     117                 :           0 :    write(message, '(a,i0)' )' n1xccc should larger than 1, while it is n1xccc=',n1xccc
     118                 :           0 :    ABI_BUG(message)
     119                 :             :  end if
     120                 :             : 
     121                 :             : !Initialization, to avoid some problem with some compilers
     122   [ +  +  +  + ]:        7657 :  xccc1d(1,:)=zero ; xccc1d(n1xccc,:)=zero
     123                 :             : 
     124                 :             : !Take care of each derivative separately
     125         [ +  + ]:        2356 :  do ider=0,2
     126                 :             : 
     127         [ +  + ]:        1767 :    if(ider==0)then
     128                 :             : !    Generate spline fitting for the function gg
     129         [ +  + ]:     1473678 :      do i1xccc=1,n1xccc
     130                 :     1473089 :        xx=three*yy(i1xccc)
     131                 :     1473089 :        call gg1cc(gg1cc_xx,xx)
     132                 :     1473678 :        ff(i1xccc)=fchrg*gg1cc_xx
     133                 :             :      end do
     134                 :             : !    Complete with derivatives at end points
     135                 :         589 :      der1=zero
     136                 :         589 :      call gp1cc(gp1cc_xx,three)
     137                 :         589 :      dern=three*fchrg*gp1cc_xx
     138         [ +  + ]:        1178 :    else if(ider==1)then
     139                 :             : !    Generate spline fitting for the function gp
     140         [ +  + ]:     1473678 :      do i1xccc=1,n1xccc
     141                 :     1473089 :        xx=three*yy(i1xccc)
     142                 :     1473089 :        call gp1cc(gp1cc_xx,xx)
     143                 :     1473678 :        ff(i1xccc)=three*fchrg*gp1cc_xx
     144                 :             :      end do
     145                 :             : !    Complete with derivatives at end points, already estimated
     146                 :         589 :      der1=xccc1d(1,ider+2)
     147                 :         589 :      dern=xccc1d(n1xccc,ider+2)
     148                 :             :    else if(ider==2)then
     149                 :             : !    Generate spline fitting for the function gpp
     150                 :             : !    (note : the function gpp has already been estimated, for the spline
     151                 :             : !    fitting of the function gg, but it is replaced here by the more
     152                 :             : !    accurate analytic derivative)
     153         [ +  + ]:     1473678 :      do i1xccc=1,n1xccc
     154                 :     1473089 :        xx=three*yy(i1xccc)
     155                 :     1473089 :        call gpp1cc(gpp1cc_xx,xx)
     156                 :     1473678 :        ff(i1xccc)=9.0_dp*fchrg*gpp1cc_xx
     157                 :             :      end do
     158                 :             : !    Complete with derivatives of end points
     159                 :         589 :      der1=xccc1d(1,ider+2)
     160                 :         589 :      dern=xccc1d(n1xccc,ider+2)
     161                 :             :    end if
     162                 :             : 
     163                 :             : !  Produce second derivative numerically, for use with splines
     164                 :        1767 :    call spline(yy,ff,n1xccc,der1,dern,ff2)
     165         [ +  + ]:     4421034 :    xccc1d(:,ider+1)=ff(:)
     166         [ +  + ]:     4421623 :    xccc1d(:,ider+3)=ff2(:)
     167                 :             :  end do
     168                 :             : 
     169         [ +  + ]:     1473678 :  xccc1d(:,6)=zero
     170                 :             : 
     171                 :             : !DEBUG
     172                 :             : !write(std_out,*)' psp1cc : output of core charge density and derivatives '
     173                 :             : !write(std_out,*)'   yy          gg           gp  '
     174                 :             : !do i1xccc=1,n1xccc
     175                 :             : !write(std_out,'(3es14.6)' ) yy(i1xccc),xccc1d(i1xccc,1),xccc1d(i1xccc,2)
     176                 :             : !end do
     177                 :             : !write(std_out,*)'   yy          gpp          gg2  '
     178                 :             : !do i1xccc=1,n1xccc
     179                 :             : !write(std_out,'(3es14.6)' ) yy(i1xccc),xccc1d(i1xccc,3),xccc1d(i1xccc,4)
     180                 :             : !end do
     181                 :             : !write(std_out,*)'   yy          gp2          gpp2  '
     182                 :             : !do i1xccc=1,n1xccc
     183                 :             : !write(std_out,'(3es14.6)' ) yy(i1xccc),xccc1d(i1xccc,5),xccc1d(i1xccc,6)
     184                 :             : !end do
     185                 :             : !write(std_out,*)' psp1cc : debug done, stop '
     186                 :             : !stop
     187                 :             : !ENDDEBUG
     188                 :             : 
     189         [ -  + ]:         589 :  ABI_FREE(ff)
     190         [ -  + ]:         589 :  ABI_FREE(ff2)
     191         [ -  + ]:         589 :  ABI_FREE(work)
     192         [ -  + ]:         589 :  ABI_FREE(yy)
     193                 :             : 
     194                 :         589 : end subroutine psp1cc
     195                 :             : !!***
     196                 :             : 
     197                 :             : !!****f* ABINIT/gg1cc
     198                 :             : !! NAME
     199                 :             : !! gg1cc
     200                 :             : !!
     201                 :             : !! FUNCTION
     202                 :             : !! gg1cc_xx=$(\frac{\sin(2\pi xx)}{(2\pi xx)(1-4xx^2)(1-xx^2)})^2$
     203                 :             : !!
     204                 :             : !! INPUTS
     205                 :             : !!  xx= abscisse to which gg1cc_xx is calculated
     206                 :             : !!
     207                 :             : !! OUTPUT
     208                 :             : !!  gg1cc_xx= gg1cc_x(xx)
     209                 :             : !!
     210                 :             : !! SOURCE
     211                 :             : 
     212                 :     1473089 : subroutine gg1cc(gg1cc_xx,xx)
     213                 :             : 
     214                 :             : !Arguments ------------------------------------
     215                 :             : !scalars
     216                 :             :  real(dp),intent(in) :: xx
     217                 :             :  real(dp),intent(out) :: gg1cc_xx
     218                 :             : 
     219                 :             : !Local variables -------------------------------------------
     220                 :             : !The c s are coefficients for Taylor expansion of the analytic form near xx=0, 1/2, and 1.
     221                 :             : !scalars
     222                 :             :  real(dp) :: c21=4.d0/9.d0,c22=-40.d0/27.d0,c23=20.d0/3.d0-16.d0*pi**2/27.d0
     223                 :             :  real(dp) :: c24=-4160.d0/243.d0+160.d0*pi**2/81.d0,c31=1.d0/36.d0
     224                 :             :  real(dp) :: c32=-25.d0/108.d0,c33=485.d0/432.d0-pi**2/27.d0
     225                 :             :  real(dp) :: c34=-4055.d0/972.d0+25.d0*pi**2/81.d0
     226                 :             : ! *************************************************************************
     227                 :             : 
     228                 :             : !Cut off beyond 3/gcut=xcccrc
     229         [ -  + ]:     1473089 :  if (xx>3.0d0) then
     230                 :           0 :    gg1cc_xx=0.0d0
     231                 :             : !  Take care of difficult limits near x=0, 1/2, and 1
     232         [ +  + ]:     1473089 :  else if (abs(xx)<=1.d-09) then
     233                 :         589 :    gg1cc_xx=1.d0
     234         [ -  + ]:     1472500 :  else if (abs(xx-0.5d0)<=1.d-04) then
     235                 :             : !  (this limit and next are more troublesome for numerical cancellation)
     236                 :           0 :    gg1cc_xx=c21+(xx-0.5d0)*(c22+(xx-0.5d0)*(c23+(xx-0.5d0)*c24))
     237         [ -  + ]:     1472500 :  else if (abs(xx-1.d0)<=1.d-04) then
     238                 :           0 :    gg1cc_xx=c31+(xx-1.0d0)*(c32+(xx-1.0d0)*(c33+(xx-1.0d0)*c34))
     239                 :             :  else
     240                 :             : !  The following is the square of the Fourier transform of a
     241                 :             : !  function built out of two spherical bessel functions in G
     242                 :             : !  space and cut off absolutely beyond gcut
     243                 :             :    gg1cc_xx=(sin(2.0d0*pi*xx)/( (2.0d0*pi*xx) * &
     244                 :     1472500 : &   (1.d0-4.0d0*xx**2)*(1.d0-xx**2) )  )**2
     245                 :             :  end if
     246                 :             : 
     247                 :     1473089 : end subroutine gg1cc
     248                 :             : !!***
     249                 :             : 
     250                 :             : !!****f* ABINIT/gp1cc
     251                 :             : !! NAME
     252                 :             : !! gp1cc
     253                 :             : !!
     254                 :             : !! FUNCTION
     255                 :             : !! Derivative of gg(xx) wrt xx.
     256                 :             : !!
     257                 :             : !! INPUTS
     258                 :             : !!  xx=abscisse to which gp1cc_xx is calculated
     259                 :             : !!
     260                 :             : !! OUTPUT
     261                 :             : !!  gp1cc_xx=derivative of gg(xx) wrt xx.
     262                 :             : !!
     263                 :             : !! NOTES
     264                 :             : !! $ phi(x) = \frac{\sin(2\pi x)}{(2\pi x)(1-4x^2)(1-x^2)}$
     265                 :             : !! $ gg(x)= phi(x)^2$
     266                 :             : !! $ gp(x)= 2 * phi(x) * phi''(x)$
     267                 :             : !! $ phi''(x)=\frac{\cos(2\pi x)-(1-15x^2+20x^4) phi(x)}{x(1-4x^2)(1-x^2)}$
     268                 :             : !!
     269                 :             : !! SOURCE
     270                 :             : 
     271                 :     1473678 : subroutine gp1cc(gp1cc_xx,xx)
     272                 :             : 
     273                 :             : !Arguments ------------------------------------
     274                 :             : !scalars
     275                 :             :  real(dp),intent(in) :: xx
     276                 :             :  real(dp),intent(out) :: gp1cc_xx
     277                 :             : 
     278                 :             : !Local variables -------------------------------------------
     279                 :             : !scalars
     280                 :             :  real(dp),parameter :: c11=20.d0-8.d0*pi**2/3.d0
     281                 :             :  real(dp),parameter :: c12=268.d0-160.d0/3.d0*pi**2+128.d0/45.d0*pi**4
     282                 :             :  real(dp),parameter :: c21=-40.d0/27.d0,c22=40.d0/3.d0-32.d0*pi**2/27.d0
     283                 :             :  real(dp),parameter :: c23=-4160.d0/81.d0+160.d0*pi**2/27.d0
     284                 :             :  real(dp),parameter :: c24=157712.d0/729.d0-320.d0*pi**2/9.d0+512.d0*pi**4/405.d0
     285                 :             :  real(dp),parameter :: c25=-452200.d0/729.d0+83200.d0*pi**2/729.d0-1280.d0*pi**4/243.d0
     286                 :             :  real(dp),parameter :: c31=-25.d0/108.d0,c32=485.d0/216.d0-2.d0*pi**2/27.d0
     287                 :             :  real(dp),parameter :: c33=-4055.d0/324.d0+25.d0*pi**2/27.d0
     288                 :             :  real(dp),parameter :: c34=616697.d0/11664.d0-485.d0*pi**2/81.d0+32.d0*pi**4/405.d0
     289                 :             :  real(dp),parameter :: c35=-2933875.d0/15552.d0+20275.d0*pi**2/729.d0-200.d0*pi**4/243.d0
     290                 :             :  real(dp),parameter :: two_pim1=1.0d0/two_pi
     291                 :             :  real(dp) :: denom,phi,phip
     292                 :             : ! *************************************************************************
     293                 :             : 
     294                 :             : !Cut off beyond r=3*xcccrc is already done at the calling level
     295         [ +  + ]:     1473678 :  if (xx>1.001d0) then
     296                 :             : !  The part that follows will be repeated later, but written in this way,
     297                 :             : !  only one "if" condition is tested in most of the cases (1.001 < x < 3.0)
     298                 :      981863 :    denom=1.d0/(xx*(1.d0-4.d0*xx**2)*(1.d0-xx**2))
     299                 :      981863 :    phi=denom*sin(two_pi*xx)*two_pim1
     300                 :      981863 :    phip=denom*(cos(two_pi*xx)-(1.d0-xx**2*(15.d0-xx**2*20))*phi)
     301                 :      981863 :    gp1cc_xx=2.d0*phi*phip
     302                 :             : !  Handle limits where denominator vanishes
     303         [ +  + ]:      491815 :  else if (abs(xx)<1.d-03) then
     304                 :         589 :    gp1cc_xx=xx*(c11+xx**2*c12)
     305         [ +  + ]:      491226 :  else if (abs(xx-0.5d0)<=1.d-03) then
     306                 :        1178 :    gp1cc_xx=c21+(xx-0.5d0)*(c22+(xx-0.5d0)*(c23+(xx-0.5d0)*(c24+(xx-0.5d0)*c25)))
     307         [ +  + ]:      490048 :  else if (abs(xx-1.d0)<=1.d-03) then
     308                 :        1178 :    gp1cc_xx=c31+(xx-1.0d0)*(c32+(xx-1.0d0)*(c33+(xx-1.0d0)*(c34+(xx-1.0d0)*c35)))
     309                 :             :  else
     310                 :             : !  Here is the repeated part ...
     311                 :      488870 :    denom=1.d0/(xx*(1.d0-4.d0*xx**2)*(1.d0-xx**2))
     312                 :      488870 :    phi=denom*sin(two_pi*xx)*two_pim1
     313                 :      488870 :    phip=denom*(cos(two_pi*xx)-(1.d0-xx**2*(15.d0-xx**2*20))*phi)
     314                 :      488870 :    gp1cc_xx=2.d0*phi*phip
     315                 :             :  end if
     316                 :             : 
     317                 :     1473678 : end subroutine gp1cc
     318                 :             : !!***
     319                 :             : 
     320                 :             : !!****f* ABINIT/gpp1cc
     321                 :             : !! NAME
     322                 :             : !! gpp1cc
     323                 :             : !!
     324                 :             : !! FUNCTION
     325                 :             : !! Second derivative of gg wrt xx.
     326                 :             : !!
     327                 :             : !! INPUTS
     328                 :             : !!  xx= abscisse to which gpp1cc_xx is calculated
     329                 :             : !!
     330                 :             : !! OUTPUT
     331                 :             : !!  gpp1cc_xx=second derivative of gg wrt xx.
     332                 :             : !!
     333                 :             : !! SOURCE
     334                 :             : 
     335                 :     1473089 : subroutine gpp1cc(gpp1cc_xx,xx)
     336                 :             : 
     337                 :             : !Arguments ------------------------------------
     338                 :             : !scalars
     339                 :             :  real(dp),intent(in) :: xx
     340                 :             :  real(dp),intent(out) :: gpp1cc_xx
     341                 :             : 
     342                 :             : !Local variables -------------------------------------------
     343                 :             : !scalars
     344                 :             :  real(dp),parameter :: c1=20.d0-8.d0*pi**2/3.d00
     345                 :             :  real(dp),parameter :: c2=40.d0/3.d0-32.d0*pi**2/27.d0
     346                 :             :  real(dp),parameter :: c3=-8320.d0/81.d0+320.d0*pi**2/27.d0
     347                 :             :  real(dp),parameter :: c4=157712.d0/243.d0-320.d0*pi**2/3.d0+512.d0*pi**4/135.d0
     348                 :             :  real(dp),parameter :: c5=-18088.d2/729.d0+3328.d2*pi**2/729.d0-5120.d0*pi**4/243.d0
     349                 :             :  real(dp),parameter :: c6=485.d0/216.d0-2.d0*pi**2/27.d0
     350                 :             :  real(dp),parameter :: c7=-4055.d0/162.d0+50.d0*pi**2/27.d0
     351                 :             :  real(dp),parameter :: c8=616697.d0/3888.d0-485.d0*pi**2/27.d0+32.d0*pi**4/135.d0
     352                 :             :  real(dp),parameter :: c9=-2933875.d0/3888.d0+81100.d0*pi**2/729.d0-800.d0*pi**4/243.d0
     353                 :             :  real(dp) :: t1,t10,t100,t11,t12,t120,t121,t122,t127,t138,t14,t140,t15,t152
     354                 :             :  real(dp) :: t157,t16,t160,t17,t174,t175,t18,t19,t2,t20,t21,t23,t24,t3,t31,t33
     355                 :             :  real(dp) :: t34,t4,t41,t42,t44,t45,t46,t5,t54,t55,t56,t57,t6,t62,t64,t65,t7
     356                 :             :  real(dp) :: t72,t78,t79,t8,t85,t9,t93
     357                 :             : ! *************************************************************************
     358                 :             : 
     359         [ -  + ]:     1473089 :  if (xx>3.0d0) then
     360                 :             : !  Cut off beyond 3/gcut=3*xcccrc
     361                 :           0 :    gpp1cc_xx=0.0d0
     362                 :             : !  Take care of difficult limits near xx=0, 1/2, and 1
     363         [ +  + ]:     1473089 :  else if (abs(xx)<=1.d-09) then
     364                 :         589 :    gpp1cc_xx=c1
     365         [ -  + ]:     1472500 :  else if (abs(xx-0.5d0)<=1.d-04) then
     366                 :             : !  (this limit and next are more troublesome for numerical cancellation)
     367                 :           0 :    gpp1cc_xx=c2+(xx-0.5d0)*(c3+(xx-0.5d0)*(c4+(xx-0.5d0)*c5))
     368         [ -  + ]:     1472500 :  else if (abs(xx-1.d0)<=1.d-04) then
     369                 :           0 :    gpp1cc_xx=c6+(xx-1.0d0)*(c7+(xx-1.0d0)*(c8+(xx-1.0d0)*c9))
     370                 :             :  else
     371                 :             : 
     372                 :             : !  Should fix up this Maple fortran later
     373                 :     1472500 :    t1 = xx**2
     374                 :     1472500 :    t2 = 1/t1
     375                 :     1472500 :    t3 = 1/Pi
     376                 :     1472500 :    t4 = 2*xx
     377                 :     1472500 :    t5 = t4-1
     378                 :     1472500 :    t6 = t5**2
     379                 :     1472500 :    t7 = 1/t6
     380                 :     1472500 :    t8 = t4+1
     381                 :     1472500 :    t9 = t8**2
     382                 :     1472500 :    t10 = 1/t9
     383                 :     1472500 :    t11 = xx-1
     384                 :     1472500 :    t12 = t11**2
     385                 :     1472500 :    t14 = 1/t12/t11
     386                 :     1472500 :    t15 = xx+1
     387                 :     1472500 :    t16 = t15**2
     388                 :     1472500 :    t17 = 1/t16
     389                 :     1472500 :    t18 = Pi*xx
     390                 :     1472500 :    t19 = sin(t18)
     391                 :     1472500 :    t20 = cos(t18)
     392                 :     1472500 :    t21 = t20**2
     393                 :     1472500 :    t23 = t19*t21*t20
     394                 :     1472500 :    t24 = t17*t23
     395                 :     1472500 :    t31 = t19**2
     396                 :     1472500 :    t33 = t31*t19*t20
     397                 :     1472500 :    t34 = t17*t33
     398                 :     1472500 :    t41 = Pi**2
     399                 :     1472500 :    t42 = 1/t41
     400                 :     1472500 :    t44 = 1/t16/t15
     401                 :     1472500 :    t45 = t31*t21
     402                 :     1472500 :    t46 = t44*t45
     403                 :     1472500 :    t54 = 1/t1/xx
     404                 :     1472500 :    t55 = 1/t12
     405                 :     1472500 :    t56 = t55*t46
     406                 :     1472500 :    t57 = t10*t56
     407                 :     1472500 :    t62 = t9**2
     408                 :     1472500 :    t64 = t17*t45
     409                 :     1472500 :    t65 = t55*t64
     410                 :     1472500 :    t72 = 1/t9/t8
     411                 :     1472500 :    t78 = t14*t64
     412                 :     1472500 :    t79 = t10*t78
     413                 :     1472500 :    t85 = t12**2
     414                 :     1472500 :    t93 = t21**2
     415                 :     1472500 :    t100 = t31**2
     416                 :     1472500 :    t120 = 1/t6/t5
     417                 :     1472500 :    t121 = t55*t34
     418                 :     1472500 :    t122 = t10*t121
     419                 :     1472500 :    t127 = t16**2
     420                 :     1472500 :    t138 = t6**2
     421                 :     1472500 :    t140 = t10*t65
     422                 :     1472500 :    t152 = t72*t65
     423                 :     1472500 :    t157 = t7*t140
     424                 :     1472500 :    t160 = t1**2
     425                 :     1472500 :    t174 = t55*t24
     426                 :     1472500 :    t175 = t10*t174
     427                 :             :    gpp1cc_xx = 8*t2*t3*t7*t10*t14*t34+8*t2*t42*t7*t10*t14*t46&
     428                 :             : &   -8*t2*t3*t7*t10*t14*t24+8*t2*t3*t7*t10*t55*t44*t33+&
     429                 :             : &   6*t2*t42*t7*t10*t55/t127*t45+24*t2*t42/t138*t140+&
     430                 :             : &   16*t54*t42*t120*t140+16*t2*t3*t120*t122+16*t2&
     431                 :             : &   *t42*t7*t72*t78-8*t2*t3*t7*t10*t55*t44*t23-8*t54*t3*t7*t175&
     432                 :             : &   +2*t2*t7*t10*t55*t17*t100+2*t2*t7*t10*t55*t17*t93+&
     433                 :             : &   8*t54*t42*t7*t79+16*t2*t42*t7*t72*t56+6*t2*t42*t7*t10/t85&
     434                 :             : &   *t64+24*t2*t42*t7/t62*t65+8*t54*t42*t7*t57-&
     435                 :             : &   16*t2*t3*t7*t72*t174+8*t54*t3*t7*t122-16*t2*t3*t120*t175&
     436                 :             : &   +16*t2*t42*t120*t79+16*t2*t42*t120*t57+16*t54*t42*t7*t152+&
     437                 :             : &   32*t2*t42*t120*t152+16*t2*t3*t7*t72*t121-12*t2*t157+&
     438                 :     1472500 : &   6/t160*t42*t157
     439                 :             :  end if
     440                 :             : 
     441                 :     1473089 : end subroutine gpp1cc
     442                 :             : !!***
     443                 :             : 
     444                 :             : !!****f* ABINIT/psp5lo
     445                 :             : !! NAME
     446                 :             : !! psp5lo
     447                 :             : !!
     448                 :             : !! FUNCTION
     449                 :             : !! Compute sine transform to transform from V(r) to q^2 V(q).
     450                 :             : !! Computes integrals on logarithmic grid using related uniform
     451                 :             : !! grid in exponent and corrected trapezoidal integration.
     452                 :             : !!
     453                 :             : !! INPUTS
     454                 :             : !!  al=spacing in exponent for radial atomic grid.
     455                 :             : !!  mmax=number of radial r grid points (logarithmic atomic grid).
     456                 :             : !!  mqgrid=number of grid points in q from 0 to qmax.
     457                 :             : !!  qgrid(mqgrid)=q grid values (bohr**-1).
     458                 :             : !!  rad(mmax)=r grid values (bohr).
     459                 :             : !!  vloc(mmax)=V(r) on radial grid.
     460                 :             : !!  zion=nominal valence charge of atom.
     461                 :             : !!
     462                 :             : !! OUTPUT
     463                 :             : !!  epsatm=$ 4\pi\int[r^2 (V(r)+\frac{Zv}{r}dr]$.
     464                 :             : !!{{\\ \begin{equation}
     465                 :             : !!  q2vq(mqgrid)
     466                 :             : !!   =q^2 V(q)
     467                 :             : !!   = -\frac{Zv}{\pi}
     468                 :             : !!     + q^2 4\pi\int[(\frac{\sin(2\pi q r)}{2\pi q r})(r^2 V(r)+r Zv)dr].
     469                 :             : !!\end{equation} }}
     470                 :             : !!  yp1,ypn=derivative of q^2 V(q) wrt q at q=0 and q=qmax
     471                 :             : !!   (needed for spline fitter).
     472                 :             : !!
     473                 :             : !! SOURCE
     474                 :             : 
     475                 :         324 : subroutine psp5lo(al,epsatm,mmax,mqgrid,qgrid,q2vq,rad,&
     476                 :         324 : &                  vloc,yp1,ypn,zion)
     477                 :             : 
     478                 :             : !Arguments----------------------------------------------------------
     479                 :             : !scalars
     480                 :             :  integer,intent(in) :: mmax,mqgrid
     481                 :             :  real(dp),intent(in) :: al,zion
     482                 :             :  real(dp),intent(out) :: epsatm,yp1,ypn
     483                 :             : !arrays
     484                 :             :  real(dp),intent(in) :: qgrid(mqgrid),rad(mmax),vloc(mmax)
     485                 :             :  real(dp),intent(out) :: q2vq(mqgrid)
     486                 :             : 
     487                 :             : !Local variables-------------------------------
     488                 :             : !scalars
     489                 :             :  integer :: iq,ir
     490                 :             :  real(dp),parameter :: scale=10.0d0
     491                 :             :  real(dp) :: arg,result,rmtoin,test,ztor1
     492                 :             : !arrays
     493                 :         324 :  real(dp),allocatable :: work(:)
     494                 :             : ! *************************************************************************
     495                 :             : 
     496   [ -  +  +  -  :         972 :  ABI_MALLOC(work,(mmax))
          +  -  +  -  -  
                +  -  + ]
     497                 :             : 
     498                 :             : !Do q=0 separately (compute epsatm)
     499                 :             : !Do integral from 0 to r1
     500                 :         324 :  ztor1=(zion/2.0d0+rad(1)*vloc(1)/3.d0)*rad(1)**2
     501                 :             : 
     502                 :             : !Set up integrand for q=0: $ \int[r^2 (V(r)+\frac{Zv}{r}) dr]$
     503                 :             : !with extra factor of r to convert to uniform grid in exponent
     504         [ +  + ]:      159840 :  do ir=1,mmax
     505                 :             : !  First handle tail region
     506                 :      159516 :    test=vloc(ir)+zion/rad(ir)
     507                 :             : !  DEBUG
     508                 :             : !  write(std_out,*)ir,rad(ir),test
     509                 :             : !  ENDDEBUG
     510                 :             : !  Ignore small contributions, or impose a cut-off in the case
     511                 :             : !  the pseudopotential data are in single precision.
     512                 :             : !  (it is indeed expected that vloc is very close to zero beyond 20,
     513                 :             : !  so a value larger than 2.0d-8 is considered anomalous)
     514   [ +  +  +  +  :      159840 :    if (abs(test)<1.0d-20 .or. (rad(ir)>20.0d0 .and. abs(test)>2.0d-8) ) then
                   +  + ]
     515                 :        3064 :      work(ir)=zero
     516                 :             :    else
     517                 :      156452 :      work(ir)=(rad(ir)*rad(ir))*(rad(ir)*vloc(ir)+zion)
     518                 :             :    end if
     519                 :             :  end do
     520                 :             : !write(std_out,*)' psp5lo : stop '; stop
     521                 :             : 
     522                 :             : !Do integral from r(1) to r(max)
     523                 :         324 :  call ctrap(mmax,work,al,result)
     524                 :             : !Do integral from r(mmax) to infinity
     525                 :             : !compute decay length lambda at r(mmax)
     526                 :             : !$\lambda=-\log((rad(im1)*vloc(im1)+zion)$/ &
     527                 :             : !$(rad(imat)*vloc(imat)+zion))/(rad(im1)-rad(imat))$
     528                 :             : !rmtoin=$(rad(mmax)*vloc(mmax)+zion)*(rad(mmax)+1.d0/\lambda)/\lambda$
     529                 :             : !Due to inability to fit exponential decay to r*V(r)+Zv
     530                 :             : !in tail, NO TAIL CORRECTION IS APPLIED
     531                 :             : !(numerical trouble might be removed if atomic code is
     532                 :             : !cleaned up in tail region)
     533                 :         324 :  rmtoin=0.0d0
     534                 :             : 
     535                 :         324 :  epsatm=4.d0*pi*(result+ztor1+rmtoin)
     536                 :             : 
     537                 :         324 :  q2vq(1)=-zion/pi
     538                 :             : 
     539                 :             : !Loop over q values
     540         [ +  + ]:      970438 :  do iq=2,mqgrid
     541                 :      970114 :    arg=2.d0*pi*qgrid(iq)
     542                 :             : !  ztor1=$ -Zv/\pi+2q \int_0^{r1}[\sin(2\pi q r)(rV(r)+Zv) dr]$
     543                 :             :    ztor1=(vloc(1)*sin(arg*rad(1))/arg-(rad(1)*vloc(1)+zion)* &
     544                 :      970114 : &   cos(arg*rad(1)) )/pi
     545                 :             : 
     546                 :             : !  set up integrand
     547         [ +  + ]:   476319419 :    do  ir=1,mmax
     548                 :   475349305 :      test=vloc(ir)+zion/rad(ir)
     549                 :             : !    Ignore contributions within decade of machine precision
     550         [ +  + ]:   476319419 :      if ((scale+abs(test)).eq.scale) then
     551                 :    20359150 :        work(ir)=zero
     552                 :             :      else
     553                 :   454990155 :        work(ir)=rad(ir)*sin(arg*rad(ir))*(rad(ir)*vloc(ir)+zion)
     554                 :             :      end if
     555                 :             :    end do
     556                 :             : !  do integral from r(1) to r(mmax)
     557                 :      970114 :    call ctrap(mmax,work,al,result)
     558                 :             : 
     559                 :             : !  do integral from r(mmax) to infinity
     560                 :             : !  rmtoin=(r(mmax)*vr(mmax)+zion)*(lambda*sin(arg*r(mmax))+
     561                 :             : !  arg*cos(arg*r(mmax)))/(arg**2+lambda**2)
     562                 :             : !  See comment above; no tail correction
     563                 :      970114 :    rmtoin=0.0d0
     564                 :             : 
     565                 :             : !  store q^2 v(q)
     566                 :      970438 :    q2vq(iq)=ztor1+2.d0*qgrid(iq)*(result+rmtoin)
     567                 :             : 
     568                 :             :  end do
     569                 :             : 
     570                 :             : !Compute derivatives of q^2 v(q) at ends of interval
     571                 :         324 :  yp1=0.0d0
     572                 :             : !ypn=$ 2\int_0^\infty[(\sin(2\pi qmax r)+(2\pi qmax r)*\cos(2\pi qmax r)(r V(r)+Z) dr]$
     573                 :             : !integral from 0 to r1
     574                 :         324 :  arg=2.0d0*pi*qgrid(mqgrid)
     575                 :         324 :  ztor1=zion*rad(1)*sin(arg*rad(1))
     576                 :             :  ztor1=ztor1+ 3.d0*rad(1)*vloc(1)*cos(arg*rad(1))/arg + &
     577                 :         324 : & (rad(1)**2-1.0d0/arg**2)*vloc(1)*sin(arg*rad(1))
     578                 :             : !integral from r(mmax) to infinity is overkill; ignore
     579                 :             : !set up integrand
     580         [ +  + ]:      159840 :  do ir=1,mmax
     581                 :      159516 :    test=vloc(ir)+zion/rad(ir)
     582                 :             : !  Ignore contributions within decade of machine precision
     583         [ +  + ]:      159840 :    if ((scale+abs(test)).eq.scale) then
     584                 :        6785 :      work(ir)=0.0d0
     585                 :             :    else
     586                 :             :      work(ir)=rad(ir)*(sin(arg*rad(ir))+arg*rad(ir)*cos(arg*rad(ir))) * &
     587                 :      152731 : &     (rad(ir)*vloc(ir)+zion)
     588                 :             :    end if
     589                 :             :  end do
     590                 :         324 :  call ctrap(mmax,work,al,result)
     591                 :         324 :  ypn=2.0d0 * (ztor1 + result)
     592                 :             : 
     593         [ -  + ]:         324 :  ABI_FREE(work)
     594                 :             : 
     595                 :         648 : end subroutine psp5lo
     596                 :             : !!***
     597                 :             : 
     598                 :             : !!****f* ABINIT/psp5nl
     599                 :             : !! NAME
     600                 :             : !! psp5nl
     601                 :             : !!
     602                 :             : !! FUNCTION
     603                 :             : !! Make Kleinman-Bylander form factors f_l(q) for each l from 0 to lmax.
     604                 :             : !! Vloc is assumed local potential.
     605                 :             : !!
     606                 :             : !! INPUTS
     607                 :             : !!  al=grid spacing in exponent for radial grid
     608                 :             : !!  lmax=maximum ang momentum for which nonlocal form factor is desired.
     609                 :             : !!   Usually lmax=1, sometimes = 0 (e.g. for oxygen); lmax <= 2 allowed.
     610                 :             : !!  mmax=number of radial grid points for atomic grid
     611                 :             : !!  mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
     612                 :             : !!  mqgrid=number of grid points for q grid
     613                 :             : !!  qgrid(mqgrid)=values at which form factors are returned
     614                 :             : !!  rad(mmax)=radial grid values
     615                 :             : !!  vloc(mmax)=local pseudopotential on radial grid
     616                 :             : !!  vpspll(mmax,3)=nonlocal pseudopotentials for each l on radial grid
     617                 :             : !!  wfll(mmax,3)=reference state wavefunctions on radial grid mmax and mqgrid
     618                 :             : !!
     619                 :             : !! OUTPUT
     620                 :             : !!  ekb(mpsang)=Kleinman-Bylander energy,
     621                 :             : !!             {{\\ \begin{equation}
     622                 :             : !!               \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
     623                 :             : !!               {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))   dr]}
     624                 :             : !!               \end{equation} }}
     625                 :             : !!                for each l
     626                 :             : !!  ffspl(mqgrid,2,mpsang)=Kleinman-Bylander form factor f_l(q) and
     627                 :             : !!   second derivative from spline fit for each angular momentum
     628                 :             : !!
     629                 :             : !! NOTES
     630                 :             : !! u_l(r) is reference state wavefunction (input as wf);
     631                 :             : !! j_l(q) is a spherical Bessel function;
     632                 :             : !! dV_l(r) = vpsp_l(r)-vloc(r) for angular momentum l;
     633                 :             : !! f_l(q) = $ \int_0^{rmax}[j_l(2\pi q r) u_l(r) dV_l(r) r dr]/\sqrt{dvms}$
     634                 :             : !! where dvms = $\int_0^{rmax} [(u_l(r) dV_l(r))^2 dr]$ is the mean
     635                 :             : !! square value of the nonlocal correction for angular momentum l.
     636                 :             : !! Xavier Gonze s E_KB = $ dvms/\int_0^{rmax}[(u_l(r))^2 dV_l(r) dr]$.
     637                 :             : !! This is the eigenvalue of the Kleinman-Bylander operator and sets
     638                 :             : !! the energy scale of the nonlocal psp corrections.
     639                 :             : !!
     640                 :             : !! SOURCE
     641                 :             : 
     642                 :         322 : subroutine psp5nl(al,ekb,ffspl,lmax,mmax,mpsang,mqgrid,qgrid,rad,vloc,vpspll,wfll)
     643                 :             : 
     644                 :             : !Arguments ------------------------------------
     645                 :             : !scalars
     646                 :             :  real(dp),intent(in) :: al
     647                 :             :  integer,intent(in) :: lmax,mmax,mpsang,mqgrid
     648                 :             : !arrays
     649                 :             :  real(dp),intent(in) :: qgrid(mqgrid),rad(mmax),vloc(mmax),vpspll(mmax,mpsang)
     650                 :             :  real(dp),intent(in) :: wfll(mmax,mpsang)
     651                 :             :  real(dp),intent(out) :: ekb(mpsang),ffspl(mqgrid,2,mpsang)
     652                 :             : 
     653                 :             : !Local variables-------------------------------
     654                 :             : !scalars
     655                 :             :  integer,parameter :: dpsang=5
     656                 :             :  integer :: iq,ir,lp1
     657                 :             :  real(dp) :: arg,bessel,dvwf,qr,result,yp1,ypn,ztor1
     658                 :             :  character(len=500) :: message
     659                 :             : !arrays
     660                 :             :  real(dp) :: ckb(dpsang),dvms(dpsang),eta(dpsang),renorm(dpsang)
     661                 :         322 :  real(dp),allocatable :: work1(:),work2(:),work3(:),work4(:)
     662                 :             : !*************************************************************************
     663                 :             : 
     664                 :             : !l=0,1,2 and 3 spherical Bessel functions
     665                 :             : !The accuracy of the bes1, bes2, bes3 functions for small arguments
     666                 :             : !may be insufficient. In the present version
     667                 :             : !of the routines, some care is taken with the value of the argument.
     668                 :             : !If smaller than 1.d-3, a two terms
     669                 :             : !Taylor series expansion is prefered.
     670                 :             : ! bes0(arg)=sin(arg)/arg
     671                 :             : ! bes1(arg)=(sin(arg)-arg*cos(arg))/arg**2
     672                 :             : ! bes2(arg)=( (3.0d0-arg**2)*sin(arg)-&
     673                 :             : !& 3.0d0*arg*cos(arg) )      /arg**3
     674                 :             : 
     675                 :             : ! bes3(arg)=(15.d0*sin(arg)-15.d0*arg*cos(arg) &
     676                 :             : !& -6.d0*arg**2*sin(arg)+arg**3*cos(arg) )/arg**4
     677                 :             : 
     678                 :             : !Zero out Kleinman-Bylander energies ekb
     679         [ +  + ]:        1283 :  ekb(:)=0.0d0
     680                 :             : 
     681   [ -  +  +  -  :         966 :  ABI_MALLOC(work1,(mmax))
          +  -  +  -  -  
                +  -  + ]
     682   [ -  +  +  -  :         644 :  ABI_MALLOC(work2,(mmax))
             -  +  -  + ]
     683   [ -  +  +  -  :         644 :  ABI_MALLOC(work3,(mmax))
             -  +  -  + ]
     684   [ -  +  +  -  :         644 :  ABI_MALLOC(work4,(mmax))
             -  +  -  + ]
     685                 :             : 
     686                 :             : !Allow for no nonlocal correction (lmax=-1)
     687         [ +  - ]:         322 :  if (lmax/=-1) then
     688                 :             : 
     689                 :             : !  Check that lmax is within allowed range
     690         [ -  + ]:         322 :    if (lmax<0.or.lmax>3) then
     691                 :             :      write(message, '(a,i12,a,a,a,a,a,a,a)' )&
     692                 :           0 : &     'lmax=',lmax,' is not an allowed value.',ch10,&
     693                 :           0 : &     'Allowed values are -1 for no nonlocal correction or else',ch10,&
     694                 :           0 : &     '0, 1,2 or 3 for maximum l nonlocal correction.',ch10,&
     695                 :           0 : &     'Action: check the input atomic psp data file for lmax.'
     696                 :           0 :      ABI_ERROR(message)
     697                 :             :    end if
     698                 :             : 
     699                 :             : !  Compute normalizing integrals eta=<dV> and mean square
     700                 :             : !  nonlocal psp correction dvms=<dV^2>
     701                 :             : !  "dvwf" consistently refers to dV(r)*wf(r) where dV=nonlocal correction
     702         [ +  + ]:        1277 :    do lp1=1,lmax+1
     703                 :             : 
     704                 :             : !    integral from 0 to r1
     705                 :         955 :      dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)
     706                 :         955 :      ztor1=(wfll(1,lp1)*dvwf)*rad(1)/dble(2*(lp1-1)+3)
     707                 :             : !    integrand for r1 to r(mmax) (incl extra factor of r)
     708         [ +  + ]:      469215 :      do ir=1,mmax
     709                 :      468260 :        dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)
     710                 :      469215 :        work1(ir)=rad(ir)*(wfll(ir,lp1)*dvwf)
     711                 :             :      end do
     712                 :             : !    do integral by corrected trapezoidal integration
     713                 :         955 :      call ctrap(mmax,work1,al,result)
     714                 :         955 :      eta(lp1)=ztor1+result
     715                 :             : 
     716                 :         955 :      dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)
     717                 :         955 :      ztor1=dvwf**2*rad(1)/dble(2*(lp1-1)+3)
     718         [ +  + ]:      469215 :      do ir=1,mmax
     719                 :      468260 :        dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)
     720                 :      469215 :        work1(ir)=rad(ir)*(dvwf**2)
     721                 :             :      end do
     722                 :         955 :      call ctrap(mmax,work1,al,result)
     723                 :         955 :      dvms(lp1)=ztor1+result
     724                 :             : 
     725                 :             : !    DEBUG
     726                 :             : !    Compute the norm of wfll
     727                 :             : !    wf=wfll(1,lp1)
     728                 :             : !    ztor1=wf**2*rad(1)/dble(2*(lp1-1)+3)
     729                 :             : !    do ir=1,mmax
     730                 :             : !    wf=wfll(ir,lp1)
     731                 :             : !    work1(ir)=rad(ir)*(wf**2)
     732                 :             : !    end do
     733                 :             : !    call ctrap(mmax,work1,al,result)
     734                 :             : !    norm=ztor1+result
     735                 :             : !    write(std_out,*)' lp1, norm',lp1,norm
     736                 :             : !    ENDDEBUG
     737                 :             : 
     738                 :             : !    If dvms is not 0 for any given angular momentum l,
     739                 :             : !    compute Xavier Gonze's definition of the Kleinman-Bylander
     740                 :             : !    energy E_KB = dvms/eta.  In this case also renormalize
     741                 :             : !    the projection operator to u_KB(r)=$u_l(r)*dV(r)/\sqrt{dvms}$.
     742                 :             : !    This means dvwf gets multiplied by the normalization factor
     743                 :             : !    "renorm"=$1/\sqrt{dvms}$ as seen below.
     744         [ +  + ]:        2232 :      if (dvms(lp1)/=0.0d0) then
     745                 :         633 :        ekb(lp1)=dvms(lp1)/eta(lp1)
     746                 :         633 :        renorm(lp1)=1.0d0/sqrt(dvms(lp1))
     747                 :             : !      ckb is Kleinman-Bylander "cosine" (Xavier Gonze)
     748                 :             :        ckb(lp1)=eta(lp1)/sqrt(dvms(lp1))
     749                 :             :      else
     750                 :         322 :        ekb(lp1)=0.0d0
     751                 :             :      end if
     752                 :             : 
     753                 :             :    end do
     754                 :             : 
     755                 :             : !  l=0 form factor if ekb(1) not 0 (lmax always at least 0)
     756         [ +  + ]:         322 :    if (ekb(1)/=0.0d0) then
     757                 :             : 
     758                 :             : !    do q=0 separately
     759                 :         280 :      lp1=1
     760                 :             : !    0 to r1 integral
     761                 :         280 :      dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     762                 :         280 :      ztor1=(rad(1)*dvwf)*rad(1)/3.0d0
     763                 :             : !    integrand
     764         [ +  + ]:      128567 :      do ir=1,mmax
     765                 :      128287 :        dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     766                 :      128567 :        work1(ir)=rad(ir)*(rad(ir)*dvwf)
     767                 :             :      end do
     768                 :         280 :      call ctrap(mmax,work1,al,result)
     769                 :         280 :      ffspl(1,1,1)=ztor1+result
     770                 :             : 
     771                 :             : !    do rest of q points
     772         [ +  + ]:      837845 :      do iq=2,mqgrid
     773                 :      837565 :        arg=two_pi*qgrid(iq)
     774                 :             : !      0 to r1 integral
     775                 :      837565 :        dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     776                 :      837565 :        ztor1=(bes0_psp5(arg*rad(1))*rad(1)*dvwf)*rad(1)/3.0d0
     777                 :             : !      integrand
     778         [ +  + ]:   382181450 :        do ir=1,mmax
     779                 :   381343885 :          dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     780                 :      837565 :          work1(ir)=rad(ir)*(rad(ir)*bes0_psp5(arg*rad(ir))*dvwf)
     781                 :             :        end do
     782                 :      837565 :        call ctrap(mmax,work1,al,result)
     783                 :      837845 :        ffspl(iq,1,1)=ztor1+result
     784                 :             :      end do
     785                 :             : 
     786                 :             : !    Compute yp1,ypn=derivatives of f(q) at q=0, q=qgrid(mqgrid)
     787                 :             : !    yp1=0 for l=0
     788                 :         280 :      yp1=0.0d0
     789                 :             : !    ypn=$ \int [2\pi r (-bes1(2\pi r q)) wf(r) dV(r) r dr]$
     790                 :         280 :      arg=two_pi*qgrid(mqgrid)
     791                 :         280 :      dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     792                 :         280 :      qr=arg*rad(1)
     793         [ +  + ]:         280 :      if(qr<1.d-3)then
     794                 :          92 :        bessel=(10.d0-qr*qr)*qr/30.0d0
     795                 :             :      else
     796                 :         188 :        bessel=bes1_psp5(qr)
     797                 :             :      end if
     798                 :             : !    ztor1=(-bes1(arg*rad(1))*two_pi*rad(1)*r(1)*dvwf)*rad(1)/5.0d0
     799                 :         280 :      ztor1=(-bessel*two_pi*rad(1)*rad(1)*dvwf)*rad(1)/5.0d0
     800         [ +  + ]:      128567 :      do ir=1,mmax
     801                 :      128287 :        qr=arg*rad(ir)
     802         [ +  + ]:      128287 :        if(qr<1.d-3)then
     803                 :        7802 :          bessel=(10.d0-qr*qr)*qr/30.0d0
     804                 :             :        else
     805                 :      120485 :          bessel=bes1_psp5(qr)
     806                 :             :        end if
     807                 :      128287 :        dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     808                 :             : !      work(ir)=rad(ir)*(-bes1(arg*rad(ir))*two_pi*rad(ir)*rad(ir)*dvwf)
     809                 :      128567 :        work1(ir)=rad(ir)*(-bessel*two_pi*rad(ir)*rad(ir)*dvwf)
     810                 :             :      end do
     811                 :         280 :      call ctrap(mmax,work1,al,result)
     812                 :         280 :      ypn=ztor1+result
     813                 :             : 
     814                 :             : !    Fit spline to get second derivatives by spline fit
     815                 :         280 :      call spline(qgrid,ffspl(1,1,1),mqgrid,yp1,ypn,ffspl(1,2,1))
     816                 :             : 
     817                 :             :    else
     818                 :             : !    or else put nonlocal correction at l=0 to 0
     819   [ +  +  +  + ]:      253308 :      ffspl(:,:,1)=0.0d0
     820                 :             :    end if
     821                 :             : 
     822                 :             : !  Finished if lmax=0 (highest nonlocal correction)
     823                 :             : !  Do l=1 form factor if ekb(2) not 0 and lmax>=1
     824         [ +  - ]:         322 :    if (lmax>0)then
     825         [ +  + ]:         322 :      if(ekb(2)/=0.0d0) then
     826                 :             : 
     827                 :         283 :        lp1=2
     828                 :             : !      do q=0 separately: f_1(q=0) vanishes !
     829                 :         283 :        ffspl(1,1,2)=0.0d0
     830                 :             : 
     831                 :             : !      do rest of q points
     832         [ +  + ]:      848332 :        do iq=2,mqgrid
     833                 :      848049 :          arg=two_pi*qgrid(iq)
     834                 :      848049 :          dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     835                 :      848049 :          qr=arg*rad(1)
     836         [ +  + ]:      848049 :          if(qr<1.d-3)then
     837                 :      588535 :            bessel=(10.d0-qr*qr)*qr/30.0d0
     838                 :             :          else
     839                 :      259514 :            bessel=bes1_psp5(qr)
     840                 :             :          end if
     841                 :             : !        ztor1=(bes1(arg*rad(1))*rad(1)*dvwf)*rad(1)/5.0d0
     842                 :      848049 :          ztor1=(bessel*rad(1)*dvwf)*rad(1)/5.0d0
     843                 :             : 
     844         [ +  + ]:   401004969 :          do ir=1,mmax
     845                 :   400156920 :            qr=arg*rad(ir)
     846         [ +  + ]:   400156920 :            if(qr<1.d-3)then
     847                 :    53985365 :              bessel=(10.d0-qr*qr)*qr/30.0d0
     848                 :             :            else
     849                 :   346171555 :              bessel=bes1_psp5(qr)
     850                 :             :            end if
     851                 :   400156920 :            dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     852                 :   401004969 :            work2(ir)=rad(ir)*(rad(ir)*bessel*dvwf)
     853                 :             :          end do
     854                 :             : 
     855                 :      848049 :          call ctrap(mmax,work2,al,result)
     856                 :      848332 :          ffspl(iq,1,2)=ztor1+result
     857                 :             :        end do
     858                 :             : 
     859                 :             : !      Compute yp1,ypn for l=1
     860                 :             : !      yp1=$\displaystyle \int [2\pi r^2 wf(r) dV(r)]/3$
     861                 :         283 :        dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     862                 :         283 :        ztor1=((two_pi*rad(1)**2)*dvwf)*rad(1)/(3.0d0*5.0d0)
     863         [ +  + ]:      134187 :        do ir=1,mmax
     864                 :      133904 :          dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     865                 :      134187 :          work2(ir)=rad(ir)*((two_pi*rad(ir)**2)*dvwf/3.0d0)
     866                 :             :        end do
     867                 :         283 :        call ctrap(mmax,work2,al,result)
     868                 :         283 :        yp1=ztor1+result
     869                 :             : !      ypn=$\int [2\pi r^2 wf(r) dV(r) (j_0(x)-(2/x)j_1(x)) dr]$
     870                 :             : !      where x=2 Pi qgrid(mqgrid) r
     871                 :         283 :        arg=two_pi*qgrid(mqgrid)
     872                 :         283 :        dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     873                 :         283 :        qr=arg*rad(1)
     874         [ +  + ]:         283 :        if(qr<1.d-3)then
     875                 :          96 :          bessel=(10.d0-3.0d0*qr*qr)/30.0d0
     876                 :             :        else
     877                 :         187 :          bessel=bes0_psp5(qr)-2.d0*bes1_psp5(qr)/qr
     878                 :             :        end if
     879                 :             : !      ztor1=( (two_pi*rad(1)**2)*dvwf* (bes0(arg*rad(1))-
     880                 :             : !      2.0d0*bes1(arg*rad(1))/(arg*rad(1))) ) * rad(1)/5.0d0
     881                 :         283 :        ztor1=( (two_pi*rad(1)**2)*dvwf*bessel)*  rad(1)/5.0d0
     882                 :             : 
     883         [ +  + ]:      134187 :        do ir=1,mmax
     884                 :      133904 :          dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     885                 :      133904 :          qr=arg*rad(ir)
     886         [ +  + ]:      133904 :          if(qr<1.d-3)then
     887                 :       11581 :            bessel=(10.d0-3.0d0*qr*qr)/30.0d0
     888                 :             :          else
     889                 :      122323 :            bessel=bes0_psp5(qr)-2.d0*bes1_psp5(qr)/qr
     890                 :             :          end if
     891                 :             : !        work(ir)=rad(ir)*((two_pi*rad(ir)**2)*dvwf*
     892                 :             : !        (bes0(arg*rad(ir))-2.d0*bes1(arg*rad(ir))/(arg*rad(ir))) )
     893                 :      134187 :          work2(ir)=rad(ir)*(two_pi*rad(ir)**2)*dvwf*bessel
     894                 :             :        end do
     895                 :         283 :        call ctrap(mmax,work2,al,result)
     896                 :         283 :        ypn=ztor1+result
     897                 :             : 
     898                 :             : !      Fit spline for l=1 Kleinman-Bylander form factor
     899                 :         283 :        call spline(qgrid,ffspl(1,1,2),mqgrid,yp1,ypn,ffspl(1,2,2))
     900                 :             : 
     901                 :             :      else
     902                 :             : !      or else put form factor to 0 for l=1
     903   [ +  +  +  + ]:      232325 :        ffspl(:,:,2)=0.0d0
     904                 :             :      end if
     905                 :             : !    Endif condition of lmax>0
     906                 :             :    end if
     907                 :             : 
     908                 :             : !  Finished if lmax=1 (highest nonlocal correction)
     909                 :             : !  Do l=2 nonlocal form factor if eta(3) not 0 and lmax>=2
     910         [ +  + ]:         322 :    if (lmax>1)then
     911         [ +  + ]:         284 :      if(ekb(3)/=0.0d0) then
     912                 :             : 
     913                 :          43 :        lp1=3
     914                 :             : !      do q=0 separately; f_2(q=0) vanishes
     915                 :          43 :        ffspl(1,1,3)=0.0d0
     916                 :             : 
     917                 :             : !      do rest of q points
     918         [ +  + ]:      127909 :        do iq=2,mqgrid
     919                 :      127866 :          arg=two_pi*qgrid(iq)
     920                 :      127866 :          dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     921                 :      127866 :          qr=arg*rad(1)
     922         [ +  + ]:      127866 :          if(qr<1.d-3)then
     923                 :      118980 :            bessel=qr*qr/15.0d0-qr**4/210.0d0
     924                 :             :          else
     925                 :        8886 :            bessel=bes2_psp5(qr)
     926                 :             :          end if
     927                 :             : !        ztor1=(bes2(arg*rad(1))*rad(1)*dvwf)*rad(1)/7.0d0
     928                 :      127866 :          ztor1=(bessel*rad(1)*dvwf)*rad(1)/7.0d0
     929         [ +  + ]:    93120186 :          do ir=1,mmax
     930                 :    92992320 :            qr=arg*rad(ir)
     931         [ +  + ]:    92992320 :            if(qr<1.d-3)then
     932                 :    22338050 :              bessel=qr*qr/15.0d0-qr**4/210.0d0
     933                 :             :            else
     934                 :    70654270 :              bessel=bes2_psp5(qr)
     935                 :             :            end if
     936                 :    92992320 :            dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     937                 :             : !          work(ir)=rad(ir)*(r(ir)*bes2(arg*rad(ir))*dvwf)
     938                 :    93120186 :            work3(ir)=rad(ir)*(rad(ir)*bessel*dvwf)
     939                 :             :          end do
     940                 :      127866 :          call ctrap(mmax,work3,al,result)
     941                 :      127909 :          ffspl(iq,1,3)=ztor1+result
     942                 :             :        end do
     943                 :             : 
     944                 :             : !      Compute yp1,ypn for l=2
     945                 :             : !      yp1=0 for l=2
     946                 :          43 :        yp1=0.0d0
     947                 :             : !      ypn=$\int [2 \pi r^2 wf(r) dV(r) (j_1(x)-(3/x)j_2(x)) dr]$
     948                 :             : !      where x=2 Pi qgrid(mqgrid) r
     949                 :          43 :        arg=two_pi*qgrid(mqgrid)
     950                 :          43 :        dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     951                 :          43 :        qr=arg*rad(1)
     952         [ +  + ]:          43 :        if(qr<1.d-3)then
     953                 :          37 :          bessel=qr*2.0d0/15.0d0-qr**3*4.0d0/210.0d0
     954                 :             :        else
     955                 :           6 :          bessel=bes1_psp5(qr)-3.0d0*bes2_psp5(qr)/qr
     956                 :             :        end if
     957                 :             : !      ztor1=( (two_pi*rad(1)**2)*dvwf* (bes1(arg*rad(1))-
     958                 :             : !      3.0d0*bes2(arg*rad(1))/(arg*rad(1))) ) * rad(1)/7.0d0
     959                 :          43 :        ztor1=( (two_pi*rad(1)**2)*dvwf* bessel ) * rad(1)/7.0d0
     960         [ +  + ]:       31594 :        do ir=1,mmax
     961                 :       31551 :          qr=arg*rad(ir)
     962         [ +  + ]:       31551 :          if(qr<1.d-3)then
     963                 :        5753 :            bessel=qr*2.0d0/15.0d0-qr**3*4.0d0/210.0d0
     964                 :             :          else
     965                 :       25798 :            bessel=bes1_psp5(qr)-3.0d0*bes2_psp5(qr)/qr
     966                 :             :          end if
     967                 :       31551 :          dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
     968                 :             : !        work3(ir)=rad(ir)*((two_pi*rad(ir)**2)*dvwf*
     969                 :             : !        (bes1(arg*rad(ir))-3.d0*bes2(arg*rad(ir))/(arg*rad(ir))) )
     970                 :       31594 :          work3(ir)=rad(ir)*((two_pi*rad(ir)**2)*dvwf*bessel)
     971                 :             :        end do
     972                 :          43 :        call ctrap(mmax,work3,al,result)
     973                 :          43 :        ypn=ztor1+result
     974                 :             : 
     975                 :             : !      Fit spline for l=2 Kleinman-Bylander form factor
     976                 :          43 :        call spline(qgrid,ffspl(1,1,3),mqgrid,yp1,ypn,ffspl(1,2,3))
     977                 :             : 
     978                 :             :      else
     979                 :             : !      or else put form factor to 0 for l=1
     980   [ +  +  +  + ]:     1444205 :        ffspl(:,:,3)=0.0d0
     981                 :             :      end if
     982                 :             : !    Endif condition of lmax>1
     983                 :             :    end if
     984                 :             : 
     985                 :             : !  Finished if lmax=2 (highest nonlocal correction)
     986                 :             : !  Do l=3 nonlocal form factor if eta(4) not 0 and lmax>=3
     987         [ +  + ]:         322 :    if (lmax>2)then
     988         [ +  - ]:          27 :      if(ekb(4)/=0.0d0) then
     989                 :             : 
     990                 :          27 :        lp1=4
     991                 :             : !      do q=0 separately; f_3(q=0) vanishes
     992                 :          27 :        ffspl(1,1,4)=0.0d0
     993                 :             : 
     994                 :             : !      do rest of q points
     995         [ +  + ]:       79527 :        do iq=2,mqgrid
     996                 :       79500 :          arg=two_pi*qgrid(iq)
     997                 :       79500 :          dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
     998                 :       79500 :          qr=arg*rad(1)
     999         [ +  + ]:       79500 :          if(qr<1.d-3)then
    1000                 :       74602 :            bessel=qr*qr*qr/105.0d0-qr**5/1890.0d0+qr**7/83160.0d0
    1001                 :             :          else
    1002                 :        4898 :            bessel=bes3_psp5(qr)
    1003                 :             :          end if
    1004                 :             : !        ztor1=(bes3(arg*rad(1))*rad(1)*dvwf)*rad(1)/9.0d0
    1005                 :       79500 :          ztor1=(bessel*rad(1)*dvwf)*rad(1)/9.0d0
    1006         [ +  + ]:    48801000 :          do ir=1,mmax
    1007                 :    48721500 :            qr=arg*rad(ir)
    1008         [ +  + ]:    48721500 :            if(qr<1.d-3)then
    1009                 :     7439225 :              bessel=qr*qr*qr/105.0d0-qr**5/1890.0d0+qr**7/83160.0d0
    1010                 :             :            else
    1011                 :    41282275 :              bessel=bes3_psp5(qr)
    1012                 :             :            end if
    1013                 :    48721500 :            dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
    1014                 :             : !          work(ir)=rad(ir)*(rad(ir)*bes3(arg*rad(ir))*dvwf)
    1015                 :    48801000 :            work4(ir)=rad(ir)*(rad(ir)*bessel*dvwf)
    1016                 :             :          end do
    1017                 :       79500 :          call ctrap(mmax,work4,al,result)
    1018                 :       79527 :          ffspl(iq,1,4)=ztor1+result
    1019                 :             :        end do
    1020                 :             : 
    1021                 :             : !      Compute yp1,ypn for l=3
    1022                 :             : !      yp1=0 for l=3
    1023                 :          27 :        yp1=0.0d0
    1024                 :             : !      ypn=$\int [2\pi r^2 wf(r) dV(r) (j_2(x)-(4/x)j_3(x)) dr]$
    1025                 :             : !      where x=2 Pi qgrid(mqgrid) r
    1026                 :          27 :        arg=two_pi*qgrid(mqgrid)
    1027                 :          27 :        dvwf=(vpspll(1,lp1)-vloc(1))*wfll(1,lp1)*renorm(lp1)
    1028                 :          27 :        qr=arg*rad(1)
    1029         [ +  + ]:          27 :        if(qr<1.d-3)then
    1030                 :          24 :          bessel=3.d0*qr**2/105.0d0-5.d0*qr**4/1890.0d0+7.d0*qr**6/83160.0d0
    1031                 :             :        else
    1032                 :           3 :          bessel=bes2_psp5(qr)-4.0d0*bes3_psp5(qr)/qr
    1033                 :             :        end if
    1034                 :             : !      ztor1=( (two_pi*rad(1)**2)*dvwf* (bes2(arg*rad(1))-
    1035                 :             : !      3.0d0*bes3(arg*rad(1))/(arg*rad(1))) ) * rad(1)/9.0d0
    1036                 :          27 :        ztor1=( (two_pi*rad(1)**2)*dvwf* bessel ) * rad(1)/9.0d0
    1037         [ +  + ]:       16915 :        do ir=1,mmax
    1038                 :       16888 :          qr=arg*rad(ir)
    1039         [ +  + ]:       16888 :          if(qr<1.d-3)then
    1040                 :        1548 :            bessel=3.d0*qr**2/105.0d0-5.d0*qr**4/1890.0d0+7.d0*qr**6/83160.0d0
    1041                 :             :          else
    1042                 :       15340 :            bessel=bes2_psp5(qr)-4.0d0*bes3_psp5(qr)/qr
    1043                 :             :          end if
    1044                 :       16888 :          dvwf=(vpspll(ir,lp1)-vloc(ir))*wfll(ir,lp1)*renorm(lp1)
    1045                 :             : !        work4(ir)=rad(ir)*((two_pi*rad(ir)**2)*dvwf*
    1046                 :             : !        (bes2(arg*rad(ir))-4.d0*bes3(arg*rad(ir))/(arg*rad(ir))) )
    1047                 :       16915 :          work4(ir)=rad(ir)*((two_pi*rad(ir)**2)*dvwf*bessel)
    1048                 :             :        end do
    1049                 :          27 :        call ctrap(mmax,work4,al,result)
    1050                 :          27 :        ypn=ztor1+result
    1051                 :             : 
    1052                 :             : !      Fit spline for l=3 Kleinman-Bylander form factor
    1053                 :          27 :        call spline(qgrid,ffspl(1,1,4),mqgrid,yp1,ypn,ffspl(1,2,4))
    1054                 :             : 
    1055                 :             :      else
    1056                 :             : !      or else put form factor to 0 for l=3
    1057   [ #  #  #  # ]:           0 :        ffspl(:,:,4)=0.0d0
    1058                 :             :      end if
    1059                 :             : !    Endif condition of lmax>2
    1060                 :             :    end if
    1061                 :             : 
    1062                 :             : !  Endif condition lmax/=-1
    1063                 :             :  end if
    1064                 :             : 
    1065                 :             : !DEBUG
    1066                 :             : !write(std_out,*) 'EKB=',(ekb(iq),iq=1,3)
    1067                 :             : !write(std_out,*) 'COSKB=',(ckb(iq),iq=1,3)
    1068                 :             : !ENDDEBUG
    1069                 :             : 
    1070         [ -  + ]:         322 :  ABI_FREE(work1)
    1071         [ -  + ]:         322 :  ABI_FREE(work2)
    1072         [ -  + ]:         322 :  ABI_FREE(work3)
    1073         [ -  + ]:         322 :  ABI_FREE(work4)
    1074                 :             : 
    1075                 :             : contains
    1076                 :             : 
    1077                 :   382303960 : function  bes0_psp5(arg)
    1078                 :             :  real(dp) :: bes0_psp5,arg
    1079                 :   382303960 :  bes0_psp5=sin(arg)/arg
    1080                 :             : end function bes0_psp5
    1081                 :             : 
    1082                 :   346700056 : function bes1_psp5(arg)
    1083                 :             :   real(dp) :: bes1_psp5,arg
    1084                 :   346700056 :   bes1_psp5=(sin(arg)-arg*cos(arg))/arg**2
    1085                 :   346700056 : end function bes1_psp5
    1086                 :             : 
    1087                 :    70704303 : function bes2_psp5(arg)
    1088                 :             :   real(dp) :: bes2_psp5,arg
    1089                 :    70704303 :   bes2_psp5=( (3.0d0-arg**2)*sin(arg)- 3.0d0*arg*cos(arg))/arg**3
    1090                 :    70704303 : end function bes2_psp5
    1091                 :             : 
    1092                 :    41302516 : function bes3_psp5(arg)
    1093                 :             :   real(dp) :: bes3_psp5, arg
    1094                 :             :   bes3_psp5=(15.d0*sin(arg)-15.d0*arg*cos(arg) &
    1095                 :    41302516 :               -6.d0*arg**2*sin(arg)+arg**3*cos(arg) )/arg**4
    1096                 :    41302516 : end function bes3_psp5
    1097                 :             : 
    1098                 :             : end subroutine psp5nl
    1099                 :             : !!***
    1100                 :             : 
    1101                 :             : !!****f* ABINIT/psp8lo
    1102                 :             : !! NAME
    1103                 :             : !! psp8lo
    1104                 :             : !!
    1105                 :             : !! FUNCTION
    1106                 :             : !! Compute sine transform to transform from V(r) to q^2 V(q).
    1107                 :             : !! Computes integrals on linear grid interpolated from the linear input
    1108                 :             : !! grid with a spacing adjusted to ensure convergence at the maximum
    1109                 :             : !! wavevector using corrected trapezoidal integration.
    1110                 :             : !!
    1111                 :             : !! INPUTS
    1112                 :             : !!  amesh=spacing for linear radial atomic grid.
    1113                 :             : !!  mmax=number of radial r grid points
    1114                 :             : !!  mqgrid=number of grid points in q from 0 to qmax.
    1115                 :             : !!  qgrid(mqgrid)=q grid values (bohr**-1).
    1116                 :             : !!  rad(mmax)=r grid values (bohr).
    1117                 :             : !!  vloc(mmax)=V(r) on radial grid.
    1118                 :             : !!  zion=nominal valence charge of atom.
    1119                 :             : !!
    1120                 :             : !! OUTPUT
    1121                 :             : !!  epsatm=$ 4\pi\int[r^2 (V(r)+\frac{Zv}{r}dr]$.
    1122                 :             : !!{{\\ \begin{equation}
    1123                 :             : !!  q2vq(mqgrid)
    1124                 :             : !!   =q^2 V(q)
    1125                 :             : !!   = -\frac{Zv}{\pi}
    1126                 :             : !!     + q^2 4\pi\int[(\frac{\sin(2\pi q r)}{2\pi q r})(r^2 V(r)+r Zv)dr].
    1127                 :             : !!\end{equation} }}
    1128                 :             : !!  yp1,ypn=derivative of q^2 V(q) wrt q at q=0 and q=qmax
    1129                 :             : !!   (needed for spline fitter).
    1130                 :             : !!
    1131                 :             : !! SOURCE
    1132                 :             : 
    1133                 :         510 : subroutine psp8lo(amesh, epsatm, mmax, mqgrid, qgrid, q2vq, rad, vloc, yp1, ypn, zion)
    1134                 :             : 
    1135                 :             : !Arguments----------------------------------------------------------
    1136                 :             : !scalars
    1137                 :             :  integer,intent(in) :: mmax,mqgrid
    1138                 :             :  real(dp),intent(in) :: amesh,zion
    1139                 :             :  real(dp),intent(out) :: epsatm,yp1,ypn
    1140                 :             : !arrays
    1141                 :             :  real(dp),intent(in) :: qgrid(mqgrid),rad(mmax),vloc(mmax)
    1142                 :             :  real(dp),intent(out) :: q2vq(mqgrid)
    1143                 :             : 
    1144                 :             : !Local variables-------------------------------
    1145                 :             : !Following parameter controls accuracy of Fourier transform based on qmax
    1146                 :             : !and represents the minimun number of integration points in one period scalars
    1147                 :             :  integer,parameter :: NPT_IN_2PI=200
    1148                 :             :  integer :: ider,iq,ir,irmu,irn,mesh_mult,mmax_new
    1149                 :             :  real(dp) :: amesh_new,arg,fp1,fpn,qmesh,result,ztor1
    1150                 :             : !arrays
    1151                 :         510 :  real(dp),allocatable :: rad_new(:),rvlpz(:),rvlpz_new(:),sprvlpz(:,:),work(:)
    1152                 :             : ! *************************************************************************
    1153                 :             : 
    1154   [ -  +  +  -  :        1530 :  ABI_MALLOC(work,(mmax))
          +  -  +  -  -  
                +  -  + ]
    1155   [ -  +  +  -  :        1020 :  ABI_MALLOC(rvlpz,(mmax))
             -  +  -  + ]
    1156                 :             : 
    1157                 :             : !Do q=0 separately (compute epsatm)
    1158                 :         510 :  ztor1=(zion/2.0d0+rad(1)*vloc(1)/3.d0)*rad(1)**2
    1159                 :             : !Set up integrand for q=0: $ \int[r^2 (V(r)+\frac{Zv}{r}) dr]$
    1160         [ +  + ]:      293123 :  do ir=1,mmax
    1161                 :      292613 :    rvlpz(ir)=rad(ir)*vloc(ir)+zion
    1162                 :      293123 :    work(ir)=rad(ir)*rvlpz(ir)
    1163                 :             :  end do
    1164                 :             : 
    1165                 :             : !Do integral from zero to r(max)
    1166                 :         510 :  call ctrap(mmax,work,amesh,result)
    1167                 :             : 
    1168                 :         510 :  epsatm=4.d0*pi*result
    1169                 :         510 :  q2vq(1)=-zion/pi
    1170                 :             : 
    1171                 :             : !Find r mesh spacing necessary for accurate integration at qmax
    1172                 :         510 :  amesh_new=2.d0*pi/(NPT_IN_2PI*qgrid(mqgrid))
    1173                 :             : 
    1174                 :             : !Choose submultiple of input mesh
    1175                 :         510 :  mesh_mult=int(amesh/amesh_new) + 1
    1176                 :             :  !mesh_mult = 1  ! DEBUG
    1177                 :         510 :  mmax_new=mesh_mult*(mmax-1)+1
    1178                 :         510 :  amesh_new=amesh/dble(mesh_mult)
    1179                 :             : 
    1180   [ -  +  +  -  :        1530 :  ABI_MALLOC(rad_new,(mmax_new))
          +  -  +  -  -  
                +  -  + ]
    1181   [ -  +  +  -  :        1020 :  ABI_MALLOC(rvlpz_new,(mmax_new))
             -  +  -  + ]
    1182                 :             : 
    1183                 :             :  !print *, "in psp8lo with mesh_mult:", mesh_mult
    1184                 :             :  !print *, "in psp8lo with mmax_new:", mmax_new
    1185                 :             :  !print *, "in psp8lo with amesh_new:", amesh_new
    1186                 :             : 
    1187         [ +  + ]:         510 :  if(mesh_mult==1) then
    1188         [ +  + ]:      248629 :    rad_new(:)=rad(:)
    1189         [ +  + ]:      248629 :    rvlpz_new(:)=rvlpz(:)
    1190                 :             :  else
    1191                 :             : !  Set up spline and interpolate to finer mesh.
    1192                 :             : !  First, compute derivatives at end points
    1193                 :             :    fp1=(-50.d0*rvlpz(1)+96.d0*rvlpz(2)-72.d0*rvlpz(3)+32.d0*rvlpz(4)&
    1194                 :          78 : &   -6.d0*rvlpz(5))/(24.d0*amesh)
    1195                 :             :    fpn=(6.d0*rvlpz(mmax-4)-32.d0*rvlpz(mmax-3)+72.d0*rvlpz(mmax-2)&
    1196                 :          78 : &   -96.d0*rvlpz(mmax-1)+50.d0*rvlpz(mmax))/(24.d0*amesh)
    1197   [ -  +  +  -  :         234 :    ABI_MALLOC(sprvlpz,(mmax,2))
          +  -  +  -  -  
                +  -  + ]
    1198         [ +  + ]:       44494 :    work(:)=zero
    1199                 :             : 
    1200                 :             : !  Spline fit
    1201                 :          78 :    call spline(rad, rvlpz,mmax,fp1,fpn,sprvlpz(:,2))
    1202         [ +  + ]:       44494 :    sprvlpz(:,1)=rvlpz(:)
    1203                 :             : 
    1204                 :             : !  Set up new radial mesh
    1205                 :             :    irn=1
    1206         [ +  + ]:       44416 :    do ir=1,mmax-1
    1207         [ +  + ]:      133404 :      do irmu=0,mesh_mult-1
    1208                 :       88988 :        rad_new(irn)=rad(ir)+dble(irmu)*amesh_new
    1209                 :      133326 :        irn=irn+1
    1210                 :             :      end do
    1211                 :             :    end do
    1212                 :          78 :    rad_new(mmax_new)=rad(mmax)
    1213                 :             : 
    1214                 :          78 :    ider=0
    1215                 :          78 :    call splfit(rad,work,sprvlpz,ider,rad_new,rvlpz_new,mmax,mmax_new)
    1216                 :             : 
    1217         [ -  + ]:          78 :    ABI_FREE(sprvlpz)
    1218         [ -  + ]:          78 :    ABI_FREE(work)
    1219   [ -  +  +  -  :         156 :    ABI_MALLOC(work,(mmax_new))
             -  +  -  + ]
    1220                 :             :  end if
    1221                 :             : 
    1222                 :             : !Loop over q values
    1223         [ +  + ]:     1548893 :  do iq=2,mqgrid
    1224                 :     1548383 :    arg=2.d0*pi*qgrid(iq)
    1225                 :             : 
    1226                 :             : !  Set up integrand
    1227         [ +  + ]:  1031190390 :    do  ir=1,mmax_new
    1228                 :  1031190390 :      work(ir)=sin(arg*rad_new(ir))*rvlpz_new(ir)
    1229                 :             :    end do
    1230                 :             : 
    1231                 :             : !  Do integral from zero to rad(mmax)
    1232                 :     1548383 :    call ctrap(mmax_new,work,amesh_new,result)
    1233                 :             : 
    1234                 :             : !  Store q^2 v(q)
    1235                 :     1548893 :    q2vq(iq)=q2vq(1)+2.d0*qgrid(iq)*result
    1236                 :             : 
    1237                 :             :  end do
    1238                 :             : 
    1239                 :             : !Compute derivatives of q^2 v(q) at ends of interval
    1240                 :         510 :  qmesh=qgrid(2)-qgrid(1)
    1241                 :             :  yp1=(-50.d0*q2vq(1)+96.d0*q2vq(2)-72.d0*q2vq(3)+32.d0*q2vq(4)&
    1242                 :         510 : & -6.d0*q2vq(5))/(24.d0*qmesh)
    1243                 :             :  ypn=(6.d0*q2vq(mqgrid-4)-32.d0*q2vq(mqgrid-3)+72.d0*q2vq(mqgrid-2)&
    1244                 :         510 : & -96.d0*q2vq(mqgrid-1)+50.d0*q2vq(mqgrid))/(24.d0*qmesh)
    1245                 :             : 
    1246         [ -  + ]:         510 :  ABI_FREE(work)
    1247         [ -  + ]:         510 :  ABI_FREE(rad_new)
    1248         [ -  + ]:         510 :  ABI_FREE(rvlpz_new)
    1249         [ -  + ]:         510 :  ABI_FREE(rvlpz)
    1250                 :             : 
    1251                 :         510 : end subroutine psp8lo
    1252                 :             : !!***
    1253                 :             : 
    1254                 :             : !!****f* ABINIT/psp8nl
    1255                 :             : !! NAME
    1256                 :             : !! psp8nl
    1257                 :             : !!
    1258                 :             : !! FUNCTION
    1259                 :             : !! Make Kleinman-Bylander/Bloechl form factors f_ln(q) for each
    1260                 :             : !!  projector n for each angular momentum l excepting an l corresponding to the local potential.
    1261                 :             : !! Note that an arbitrary local potential can be used, so all l from 0 to lmax may be represented.
    1262                 :             : !!
    1263                 :             : !! INPUTS
    1264                 :             : !!  amesh=grid spacing for uniform (linear) radial grid
    1265                 :             : !!  indlmn(6,lmnmax)= array giving l,m,n,lm,ln,s for i=ln  (if useylm=0)
    1266                 :             : !!                                                or i=lmn (if useylm=1)
    1267                 :             : !!  lmax=maximum ang momentum for which nonlocal form factor is desired. lmax <= 2 allowed.
    1268                 :             : !!  lmnmax=if useylm=1, max number of (l,m,n) comp. over all type of psps
    1269                 :             : !!        =if useylm=0, max number of (l,n)   comp. over all type of psps
    1270                 :             : !!  lnmax=max. number of (l,n) components over all type of psps
    1271                 :             : !!  mmax=number of radial grid points for atomic grid
    1272                 :             : !!  mqgrid=number of grid points for q grid
    1273                 :             : !!  qgrid(mqgrid)=values at which form factors are returned
    1274                 :             : !!  rad(mmax)=radial grid values
    1275                 :             : !!  vpspll(mmax,lnmax)=nonlocal projectors for each (l,n) on linear radial grid.
    1276                 :             : !!   Here, these are the  product of the reference
    1277                 :             : !!   wave functions and (v(l,n)-vloc), calculated in the psp generation
    1278                 :             : !!   program and normalized so that integral(0,rc(l)) vpsll^2 dr = 1,
    1279                 :             : !!   which leads to the the usual convention for the energies ekb(l,n)
    1280                 :             : !!   also calculated in the psp generation program.
    1281                 :             : !!
    1282                 :             : !! OUTPUT
    1283                 :             : !!  ffspl(mqgrid,2,lnmax)=Kleinman-Bylander form factor f_ln(q) and
    1284                 :             : !!   second derivative from spline fit for each (l,n).
    1285                 :             : !!
    1286                 :             : !! NOTES
    1287                 :             : !! u_l(r) is reference state wavefunction (input as wf);
    1288                 :             : !! j_l(q) is a spherical Bessel function;
    1289                 :             : !! dV_l(r) = vpsp_l(r)-vloc(r) for angular momentum l;
    1290                 :             : !! f_l(q) = $ \int_0^{rmax}[j_l(2\pi q r) u_l(r) dV_l(r) r dr]/\sqrt{dvms}$
    1291                 :             : !! where dvms = $\int_0^{rmax} [(u_l(r) dV_l(r))^2 dr]$ is the mean
    1292                 :             : !! square value of the nonlocal correction for angular momentum l.
    1293                 :             : !! Xavier Gonze s E_KB = $ dvms/\int_0^{rmax}[(u_l(r))^2 dV_l(r) dr]$.
    1294                 :             : !! This is the eigenvalue of the Kleinman-Bylander operator and sets
    1295                 :             : !! the energy scale of the nonlocal psp corrections.
    1296                 :             : !!
    1297                 :             : !! SOURCE
    1298                 :             : 
    1299                 :         510 : subroutine psp8nl(amesh, ffspl, indlmn, lmax, lmnmax, lnmax, mmax, mqgrid, qgrid, rad, vpspll)
    1300                 :             : 
    1301                 :             : !Arguments----------------------------------------------------------
    1302                 :             : !scalars
    1303                 :             :  integer,intent(in) :: lmax,lmnmax,lnmax,mmax,mqgrid
    1304                 :             :  real(dp),intent(in) :: amesh
    1305                 :             : !arrays
    1306                 :             :  integer,intent(in) :: indlmn(6,lmnmax)
    1307                 :             :  real(dp),intent(in) :: qgrid(mqgrid),rad(mmax),vpspll(mmax,lnmax)
    1308                 :             :  real(dp),intent(inout) :: ffspl(mqgrid,2,lnmax) !vz_i
    1309                 :             : 
    1310                 :             : !Local variables-------------------------------
    1311                 :             : !Following parameter controls accuracy of Fourier transform based on qmax
    1312                 :             : !and represents the minimun number of integration points in one period.
    1313                 :             : !scalars
    1314                 :             :  integer,parameter :: NPT_IN_2PI=200
    1315                 :             :  integer :: iln,iln0,ilmn,iq,ir,irmu,irn,ll,mesh_mult,mmax_new,mvpspll
    1316                 :             :  real(dp) :: amesh_new,arg,c1,c2,c3,c4,dri,qmesh,result,tv,xp,xpm1,xpm2,xpp1,yp1,ypn
    1317                 :             : !arrays
    1318                 :             :  real(dp) :: sb_out(4)
    1319                 :         510 :  real(dp),allocatable :: rad_new(:),vpspll_new(:,:),work(:,:),work2(:)
    1320                 :             : ! *************************************************************************
    1321                 :             : 
    1322                 :             :  ! Find r mesh spacing necessary for accurate integration at qmax
    1323                 :         510 :  amesh_new=2.d0*pi/(NPT_IN_2PI*qgrid(mqgrid))
    1324                 :             : 
    1325                 :             :  ! Choose submultiple of input mesh
    1326                 :         510 :  mesh_mult=int(amesh/amesh_new) + 1
    1327                 :         510 :  mmax_new=mesh_mult*(mmax-1)+1
    1328                 :         510 :  amesh_new=amesh/dble(mesh_mult)
    1329                 :             : 
    1330   [ -  +  +  -  :        1530 :  ABI_MALLOC(rad_new,(mmax_new))
          +  -  +  -  -  
                +  -  + ]
    1331   [ -  +  +  -  :        2040 :  ABI_MALLOC(vpspll_new,(mmax_new,lnmax))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
    1332                 :             : 
    1333         [ +  + ]:         510 :  if (mesh_mult == 1) then
    1334         [ +  + ]:      253682 :    rad_new(:)=rad(:)
    1335                 :             :  else
    1336                 :             :    ! Set up new radial mesh
    1337                 :             :    irn=1
    1338         [ +  + ]:       45331 :    do ir=1,mmax-1
    1339         [ +  + ]:      136149 :      do irmu=0,mesh_mult-1
    1340                 :       90818 :        rad_new(irn)=rad(ir)+dble(irmu)*amesh_new
    1341                 :      136071 :        irn=irn+1
    1342                 :             :      end do
    1343                 :             :    end do
    1344                 :          78 :    rad_new(mmax_new)=rad(mmax)
    1345                 :             :  end if
    1346                 :             : 
    1347                 :             :  ! Interpolate projectors onto new grid if called for
    1348                 :             :  ! Cubic polynomial interpolation is used which is consistent
    1349                 :             :  ! with the original interpolation of these functions from
    1350                 :             :  ! a log grid to the input linear grid.
    1351                 :         510 :  dri = one/amesh
    1352         [ +  + ]:      344656 :  do irn=1,mmax_new
    1353                 :             :    ! index to find bracketing input mesh points
    1354         [ +  + ]:      344656 :    if(mesh_mult>1) then
    1355                 :       90896 :      ir = irn/mesh_mult + 1
    1356                 :       90896 :      ir = max(ir,2)
    1357                 :       90896 :      ir = min(ir,mmax-2)
    1358                 :             :      ! interpolation coefficients
    1359                 :       90896 :      xp = dri * (rad_new(irn) - rad(ir))
    1360                 :       90896 :      xpp1 = xp + one
    1361                 :       90896 :      xpm1 = xp - one
    1362                 :       90896 :      xpm2 = xp - two
    1363                 :       90896 :      c1 = -xp * xpm1 * xpm2 * sixth
    1364                 :       90896 :      c2 = xpp1 * xpm1 * xpm2 * half
    1365                 :       90896 :      c3 = - xp * xpp1 * xpm2 * half
    1366                 :       90896 :      c4 = xp * xpp1 * xpm1 * sixth
    1367                 :             : 
    1368                 :             :      ! Now do the interpolation on all projectors for this grid point
    1369                 :       90896 :      iln0=0
    1370         [ +  + ]:      501103 :      do ilmn=1,lmnmax
    1371                 :      410207 :        iln=indlmn(5,ilmn)
    1372         [ +  + ]:      501103 :        if (iln>iln0) then
    1373                 :      387032 :          iln0=iln
    1374                 :             :          tv =  c1 * vpspll(ir - 1, iln) &
    1375                 :             : &         + c2 * vpspll(ir    , iln) &
    1376                 :             : &         + c3 * vpspll(ir + 1, iln) &
    1377                 :      387032 : &         + c4 * vpspll(ir + 2, iln)
    1378         [ +  + ]:      387032 :          if(abs(tv)>tol10) then
    1379                 :       93636 :            vpspll_new(irn,iln)=tv
    1380                 :       93636 :            mvpspll=irn
    1381                 :             :          else
    1382                 :      293396 :            vpspll_new(irn,iln)=zero
    1383                 :             :          end if
    1384                 :             :        end if
    1385                 :             :      end do
    1386                 :             : 
    1387                 :             :    else
    1388                 :             :      ! With no mesh multiplication, just copy projectors
    1389                 :     3085814 :      ir=irn
    1390                 :             :      iln0=0
    1391         [ +  + ]:     3085814 :      do ilmn=1,lmnmax
    1392                 :     2832564 :        iln=indlmn(5,ilmn)
    1393         [ +  + ]:     3085814 :        if (iln>iln0) then
    1394                 :     1921400 :          iln0=iln
    1395                 :     1921400 :          tv = vpspll(ir,iln)
    1396         [ +  + ]:     1921400 :          if(abs(tv)>tol10) then
    1397                 :      558923 :            vpspll_new(irn,iln)=tv
    1398                 :      558923 :            mvpspll=irn
    1399                 :             :          else
    1400                 :     1362477 :            vpspll_new(irn,iln)=zero
    1401                 :             :          end if
    1402                 :             :        end if
    1403                 :             :      end do
    1404                 :             : 
    1405                 :             :    end if
    1406                 :             :  end do ! irn
    1407                 :             : 
    1408   [ -  +  +  -  :        2040 :  ABI_MALLOC(work, (mvpspll,lnmax))
          -  +  +  -  +  
          -  +  -  -  +  
                   +  - ]
    1409                 :             : 
    1410                 :             :  ! Loop over q values
    1411         [ +  + ]:     1549403 :  do iq=1,mqgrid
    1412                 :     1548893 :    arg=2.d0*pi*qgrid(iq)
    1413                 :             : 
    1414                 :             :    ! Set up integrands
    1415         [ +  + ]:   314288135 :    do ir=1,mvpspll
    1416                 :   312739242 :      call sbf8(lmax+1,arg*rad_new(ir),sb_out)
    1417                 :   312739242 :      iln0=0
    1418         [ +  + ]:  3304690469 :      do ilmn=1,lmnmax
    1419                 :  2990402334 :        iln=indlmn(5,ilmn)
    1420         [ +  + ]:  3303141576 :        if (iln>iln0) then
    1421                 :  2159656511 :          iln0=iln
    1422                 :  2159656511 :          ll=indlmn(1,ilmn)
    1423                 :  2159656511 :          work(ir,iln)=sb_out(ll+1)*vpspll_new(ir,iln)*rad_new(ir)
    1424                 :             :        end if
    1425                 :             :      end do
    1426                 :             :    end do !ir
    1427                 :             : 
    1428                 :             :    ! Do integral from zero to rad_new(mvpspll)
    1429                 :             :    iln0=0
    1430         [ +  + ]:    16733936 :    do ilmn=1,lmnmax
    1431                 :    15184533 :      iln=indlmn(5,ilmn)
    1432         [ +  + ]:    16733426 :      if (iln>iln0) then
    1433                 :    10632016 :        iln0=iln
    1434                 :    10632016 :        call ctrap(mvpspll,work(1,iln),amesh_new,result)
    1435                 :    10632016 :        ffspl(iq,1,iln)=result
    1436                 :             :      end if
    1437                 :             :    end do
    1438                 :             :  end do ! iq mesh
    1439                 :             : 
    1440                 :             :  ! Fit splines for form factors
    1441   [ -  +  +  -  :        1530 :  ABI_MALLOC(work2,(mqgrid))
          +  -  +  -  -  
                +  -  + ]
    1442                 :         510 :  qmesh=qgrid(2)-qgrid(1)
    1443                 :             : 
    1444                 :         510 :  iln0=0
    1445         [ +  + ]:        5545 :  do ilmn=1,lmnmax
    1446                 :        5035 :    iln=indlmn(5,ilmn)
    1447         [ +  + ]:        5545 :    if (iln>iln0) then
    1448                 :        3518 :      iln0=iln
    1449                 :             :      ! Compute derivatives of form factors at ends of interval
    1450                 :             :      yp1=(-50.d0*ffspl(1,1,iln)+96.d0*ffspl(2,1,iln)-72.d0*ffspl(3,1,iln)&
    1451                 :        3518 : &     +32.d0*ffspl(4,1,iln)- 6.d0*ffspl(5,1,iln))/(24.d0*qmesh)
    1452                 :             :      ypn=(6.d0*ffspl(mqgrid-4,1,iln)-32.d0*ffspl(mqgrid-3,1,iln)&
    1453                 :             : &     +72.d0*ffspl(mqgrid-2,1,iln)-96.d0*ffspl(mqgrid-1,1,iln)&
    1454                 :        3518 : &     +50.d0*ffspl(mqgrid,1,iln))/(24.d0*qmesh)
    1455                 :             : 
    1456                 :        3518 :      call spline(qgrid,ffspl(1,1,iln),mqgrid,yp1,ypn,ffspl(1,2,iln))
    1457                 :             :    end if
    1458                 :             :  end do
    1459                 :             : 
    1460         [ -  + ]:         510 :  ABI_FREE(rad_new)
    1461         [ -  + ]:         510 :  ABI_FREE(vpspll_new)
    1462         [ -  + ]:         510 :  ABI_FREE(work)
    1463         [ -  + ]:         510 :  ABI_FREE(work2)
    1464                 :             : 
    1465                 :         510 : end subroutine psp8nl
    1466                 :             : !!***
    1467                 :             : 
    1468                 :             : !!****f* ABINIT/cc_derivatives
    1469                 :             : !! NAME
    1470                 :             : !! cc_derivatives
    1471                 :             : !!
    1472                 :             : !! FUNCTION
    1473                 :             : !! subroutine to spline the core charge and get derivatives
    1474                 :             : !! extracted from previous version of psp6cc_drh
    1475                 :             : !! input on log grid, and splined to regular grid between 0 and rchrg
    1476                 :             : !!
    1477                 :             : !! INPUTS
    1478                 :             : !!  mmax=maximum number of points in real space grid in the psp file
    1479                 :             : !!  n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
    1480                 :             : !!  rchrg=cut-off radius for the core density
    1481                 :             : !!  rad=radial grid points
    1482                 :             : !!  ff=core charge at points in rad
    1483                 :             : !!  ff1=first derivative of ff on log grid
    1484                 :             : !!  ff2=second derivative of ff on log grid
    1485                 :             : !!
    1486                 :             : !! OUTPUT
    1487                 :             : !!  xccc1d(n1xccc,6)= 1D core charge function and its five first derivatives
    1488                 :             : !!
    1489                 :             : !! NOTES
    1490                 :             : !! Test version by DRH - requires very smooth model core charge
    1491                 :             : !!
    1492                 :             : !! SOURCE
    1493                 :             : 
    1494                 :          22 : subroutine cc_derivatives(rad,ff,ff1,ff2,mmax,n1xccc,rchrg,xccc1d)
    1495                 :             : 
    1496                 :             : !Arguments ------------------------------------
    1497                 :             : ! scalars
    1498                 :             :  integer,intent(in) :: mmax,n1xccc
    1499                 :             :  real(dp),intent(in) :: rchrg
    1500                 :             : !arrays
    1501                 :             :  real(dp),intent(in) :: rad(mmax),ff(mmax),ff1(mmax),ff2(mmax)
    1502                 :             :  real(dp),intent(inout) :: xccc1d(n1xccc,6) !vz_i
    1503                 :             : 
    1504                 :             : !Local variables-------------------------------
    1505                 :             : ! scalars
    1506                 :             :  integer :: i1xccc
    1507                 :             :  real(dp) :: der1,dern
    1508                 :             : !arrays
    1509                 :          22 :  real(dp),allocatable :: ff3(:),ff4(:),gg(:),gg1(:),gg2(:)
    1510                 :          22 :  real(dp),allocatable :: gg3(:),gg4(:),work(:),xx(:)
    1511                 :             : ! *************************************************************************
    1512                 :             : 
    1513                 :             :  !write(std_out,*) 'cc_derivatives : enter'
    1514                 :             : 
    1515   [ -  +  +  -  :          66 :  ABI_MALLOC(ff3, (mmax))
          +  -  +  -  -  
                +  -  + ]
    1516   [ -  +  +  -  :          44 :  ABI_MALLOC(ff4, (mmax))
             -  +  -  + ]
    1517   [ -  +  +  -  :          66 :  ABI_MALLOC(gg, (n1xccc))
          +  -  +  -  -  
                +  -  + ]
    1518   [ -  +  +  -  :          44 :  ABI_MALLOC(gg1, (n1xccc))
             -  +  -  + ]
    1519   [ -  +  +  -  :          44 :  ABI_MALLOC(gg2, (n1xccc))
             -  +  -  + ]
    1520   [ -  +  +  -  :          44 :  ABI_MALLOC(gg3, (n1xccc))
             -  +  -  + ]
    1521   [ -  +  +  -  :          44 :  ABI_MALLOC(gg4, (n1xccc))
             -  +  -  + ]
    1522   [ -  +  +  -  :          44 :  ABI_MALLOC(work, (mmax))
             -  +  -  + ]
    1523   [ -  +  +  -  :          44 :  ABI_MALLOC(xx, (n1xccc))
             -  +  -  + ]
    1524                 :             : 
    1525                 :             :  ! calculate third derivative ff3 on logarithmic grid
    1526                 :          22 :  der1=ff2(1)
    1527                 :          22 :  dern=ff2(mmax)
    1528                 :          22 :  call spline(rad,ff1,mmax,der1,dern,ff3)
    1529                 :             : 
    1530                 :             :  ! calculate fourth derivative ff4 on logarithmic grid
    1531                 :          22 :  der1=0.d0
    1532                 :          22 :  dern=0.d0
    1533                 :          22 :  call spline(rad,ff2,mmax,der1,dern,ff4)
    1534                 :             : 
    1535                 :             :  ! generate uniform mesh xx in the box cut by rchrg:
    1536         [ +  + ]:       55044 :  do i1xccc=1,n1xccc
    1537                 :       55044 :    xx(i1xccc)=(i1xccc-1)* rchrg/dble(n1xccc-1)
    1538                 :             :  end do
    1539                 :             : 
    1540                 :             :  !now interpolate core charge and derivatives on the uniform grid
    1541                 :             :  !core charge, input=ff,  output=gg
    1542                 :          22 :  call splint(mmax,rad,ff,ff2,n1xccc,xx,gg)
    1543                 :             : 
    1544                 :             :  ! first derivative input=ff1, output=gg1
    1545                 :          22 :  call splint(mmax,rad,ff1,ff3,n1xccc,xx,gg1)
    1546                 :             : 
    1547                 :             :  !normalize gg1
    1548                 :             :  !gg1(:)=gg1(:)*rchrg
    1549                 :             : 
    1550                 :             :  ! second derivative input=ff2, output=gg2
    1551                 :          22 :  call splint(mmax,rad,ff2,ff4,n1xccc,xx,gg2)
    1552                 :             : 
    1553                 :             :  !normalize gg2
    1554                 :             :  !gg2(:)=gg2(:)*rchrg**2
    1555                 :             : 
    1556                 :             :  ! reallocate work otherwise the calls to spline crash (n1xccc /= mmax)
    1557         [ -  + ]:          22 :  ABI_FREE(work)
    1558   [ -  +  +  -  :          44 :  ABI_MALLOC(work, (n1xccc))
             -  +  -  + ]
    1559                 :             : 
    1560                 :             : !recalculate 3rd derivative consistent with spline fit to first derivative on linear grid
    1561                 :          22 :  der1=gg2(1)
    1562                 :          22 :  dern=gg2(n1xccc)
    1563                 :          22 :  call spline(xx,gg1,n1xccc,der1,dern,gg3)
    1564                 :             : 
    1565                 :             : !calculate 4th derivative consistent with spline fit to second derivative on linear grid
    1566                 :          22 :  der1=0.0d0
    1567                 :          22 :  dern=0.0d0
    1568                 :          22 :  call spline(xx,gg2,n1xccc,der1,dern,gg4)
    1569                 :             : 
    1570                 :             : !now calculate second to fourth derivative by forward differences
    1571                 :             : !to avoid numerical noise uses a smoothing function
    1572                 :             : !
    1573                 :             : !call smooth(gg1,n1xccc,10)
    1574                 :             : 
    1575                 :             : !gg2(n1xccc)=0.0
    1576                 :             : !do i1xccc=1,n1xccc-1
    1577                 :             : !gg2(i1xccc)=(gg1(i1xccc+1)-gg1(i1xccc))*dble(n1xccc-1)
    1578                 :             : !end do
    1579                 :             : 
    1580                 :             : !call smooth(gg2,n1xccc,10)
    1581                 :             : 
    1582                 :             : !gg3(n1xccc)=0.0
    1583                 :             : !do i1xccc=1,n1xccc-1
    1584                 :             : !gg3(i1xccc)=(gg2(i1xccc+1)-gg2(i1xccc))*dble(n1xccc-1)
    1585                 :             : !end do
    1586                 :             : 
    1587                 :             : !call smooth(gg3,n1xccc,10)
    1588                 :             : 
    1589                 :             : !gg4(n1xccc)=0.0
    1590                 :             : !do i1xccc=1,n1xccc-1
    1591                 :             : !gg4(i1xccc)=(gg3(i1xccc+1)-gg3(i1xccc))*dble(n1xccc-1)
    1592                 :             : !end do
    1593                 :             : 
    1594                 :             : !call smooth(gg4,n1xccc,10)
    1595                 :             : 
    1596                 :             : !write on xcc1d
    1597                 :             : !normalize to unit range usage later in program
    1598         [ +  + ]:       55044 :  xccc1d(:,1)=gg(:)
    1599         [ +  + ]:       55044 :  xccc1d(:,2)=gg1(:)*rchrg
    1600         [ +  + ]:       55044 :  xccc1d(:,3)=gg2(:)*rchrg**2
    1601         [ +  + ]:       55044 :  xccc1d(:,4)=gg3(:)*rchrg**3
    1602         [ +  + ]:       55044 :  xccc1d(:,5)=gg4(:)*rchrg**4
    1603                 :             : !write(std_out,'(a,2i6)') 'drh:psp6cc_drh - mmax,n1xccc',mmax,n1xccc
    1604                 :             : 
    1605                 :             : !DEBUG
    1606                 :             : !note: the normalization condition is the following:
    1607                 :             : !4pi rchrg /dble(n1xccc-1) sum xx^2 xccc1d(:,1) = qchrg
    1608                 :             : !
    1609                 :             : !norm=0.d0
    1610                 :             : !do i1xccc=1,n1xccc
    1611                 :             : !norm = norm + 4.d0*pi*rchrg/dble(n1xccc-1)*&
    1612                 :             : !&             xx(i1xccc)**2*xccc1d(i1xccc,1)
    1613                 :             : !end do
    1614                 :             : !write(std_out,*) ' norm=',norm
    1615                 :             : !
    1616                 :             : !write(std_out,*)' psp6cc_drh : output of core charge density and derivatives '
    1617                 :             : !write(std_out,*)'   xx          gg           gg1  '
    1618                 :             : !do i1xccc=1,n1xccc
    1619                 :             : !write(10, '(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,1),xccc1d(i1xccc,2)
    1620                 :             : !end do
    1621                 :             : !write(std_out,*)'   xx          gg2          gg3  '
    1622                 :             : !do i1xccc=1,n1xccc
    1623                 :             : !write(11, '(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,3),xccc1d(i1xccc,4)
    1624                 :             : !end do
    1625                 :             : !write(std_out,*)'   xx          gg4          gg5  '
    1626                 :             : !do i1xccc=1,n1xccc
    1627                 :             : !write(12, '(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,5),xccc1d(i1xccc,6)
    1628                 :             : !end do
    1629                 :             : !write(std_out,*)' psp1cc : debug done, stop '
    1630                 :             : !stop
    1631                 :             : !ENDDEBUG
    1632                 :             : 
    1633         [ -  + ]:          22 :  ABI_FREE(ff3)
    1634         [ -  + ]:          22 :  ABI_FREE(ff4)
    1635         [ -  + ]:          22 :  ABI_FREE(gg)
    1636         [ -  + ]:          22 :  ABI_FREE(gg1)
    1637                 :          22 :  ABI_FREE(gg2)
    1638         [ -  + ]:          22 :  ABI_FREE(gg3)
    1639         [ -  + ]:          22 :  ABI_FREE(gg4)
    1640         [ -  + ]:          22 :  ABI_FREE(work)
    1641         [ -  + ]:          22 :  ABI_FREE(xx)
    1642                 :             : 
    1643                 :          22 : end subroutine cc_derivatives
    1644                 :             : !!***
    1645                 :             : 
    1646                 :             : end module m_psptk
    1647                 :             : !!***
        

Generated by: LCOV version 2.3-1