LCOV - code coverage report
Current view: top level - src/64_psp - m_psp6.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 95.0 % 301 286
Test Date: 2026-11-09 13:21:34 Functions: 100.0 % 5 5
Branches: 60.3 % 600 362

             Branch data     Line data    Source code
       1                 :             : !!****m* ABINIT/m_psp6
       2                 :             : !! NAME
       3                 :             : !!  m_psp6
       4                 :             : !!
       5                 :             : !! FUNCTION
       6                 :             : !! Initialize pspcod=6 (Pseudopotentials from the fhi98pp code):
       7                 :             : !!
       8                 :             : !! COPYRIGHT
       9                 :             : !!  Copyright (C) 1999-2026 ABINIT group (XG, AF, GJ,FJ,MT, DRH)
      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_psp6
      23                 :             : 
      24                 :             :  use defs_basis
      25                 :             :  use m_splines
      26                 :             :  use m_errors
      27                 :             :  use m_abicore
      28                 :             : 
      29                 :             :  use m_numeric_tools,  only : smooth, ctrap
      30                 :             :  use m_psptk,          only : psp5lo, psp5nl, cc_derivatives
      31                 :             : 
      32                 :             :  implicit none
      33                 :             : 
      34                 :             :  private
      35                 :             : !!***
      36                 :             : 
      37                 :             :  public :: psp6in
      38                 :             : !!***
      39                 :             : 
      40                 :             : contains
      41                 :             : !!***
      42                 :             : 
      43                 :             : !!****f* m_psp6/psp6in
      44                 :             : !! NAME
      45                 :             : !! psp6in
      46                 :             : !!
      47                 :             : !! FUNCTION
      48                 :             : !! Initialize pspcod=6 (Pseudopotentials from the fhi98pp code):
      49                 :             : !! continue to read the corresponding file, then compute the
      50                 :             : !! local and non-local potentials.
      51                 :             : !!
      52                 :             : !! INPUTS
      53                 :             : !!  lloc=angular momentum choice of local pseudopotential
      54                 :             : !!  lmax=value of lmax mentioned at the second line of the psp file
      55                 :             : !!  lmnmax=if useylm=1, max number of (l,m,n) comp. over all type of psps
      56                 :             : !!        =if useylm=0, max number of (l,n)   comp. over all type of psps
      57                 :             : !!  lnmax=max. number of (l,n) components over all type of psps
      58                 :             : !!  mmax=maximum number of points in real space grid in the psp file
      59                 :             : !!   angular momentum of nonlocal pseudopotential
      60                 :             : !!  mpsang= 1+maximum angular momentum for nonlocal pseudopotentials
      61                 :             : !!  mqgrid=dimension of q (or G) grid for arrays.
      62                 :             : !!  n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
      63                 :             : !!  optnlxccc=option for nl XC core correction (input variable)
      64                 :             : !!  positron=0 if electron GS calculation
      65                 :             : !!          1 if positron GS calculation
      66                 :             : !!          2 if electron GS calculation in presence of the positron
      67                 :             : !!  qgrid(mqgrid)=values of q (or |G|) on grid from 0 to qmax
      68                 :             : !!  useylm=governs the way the nonlocal operator is to be applied:
      69                 :             : !!         1=using Ylm, 0=using Legendre polynomials
      70                 :             : !!  zion=nominal valence of atom as specified in psp file
      71                 :             : !!  znucl=nuclear number of atom as specified in psp file
      72                 :             : !!
      73                 :             : !! OUTPUT
      74                 :             : !!  ekb(lnmax)=Kleinman-Bylander energy,
      75                 :             : !!             {{\ \begin{equation}
      76                 :             : !!               \frac{\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))^2 dr]}
      77                 :             : !!             {\int_0^\infty [Rl(r)^2 (Vl(r)-Vloc(r))   dr]}
      78                 :             : !!              \end{equation} }}
      79                 :             : !!             for each (l,n)
      80                 :             : !!  epsatm=$ (4\pi)\int_0^\infty [r^2 (V(r)+\frac{Zv}{r} dr]$ (hartree)
      81                 :             : !!  ffspl(mqgrid,2,lnmax)=Kleinman-Bylander form factor f_l(q) and
      82                 :             : !!   second derivative from spline fit for each angular momentum and
      83                 :             : !!   each projector
      84                 :             : !!  indlmn(6,i)= array giving l,m,n,lm,ln,s for i=ln  (if useylm=0)
      85                 :             : !!                                           or i=lmn (if useylm=1)
      86                 :             : !!  nproj(mpsang)=number of projection functions for each angular momentum
      87                 :             : !!  qchrg is not used, and could be suppressed later
      88                 :             : !!  vlspl(mqgrid,2)=q^2 Vloc(q) and second derivatives from spline fit
      89                 :             : !!  xcccrc=XC core correction cutoff radius (bohr)
      90                 :             : !!  xccc1d(n1xccc,6)=1D core charge function and five derivatives, from psp file
      91                 :             : !!
      92                 :             : !! SOURCE
      93                 :             : 
      94                 :         179 : subroutine psp6in(ekb,epsatm,ffspl,indlmn,lloc,lmax,lmnmax,lnmax,&
      95                 :         179 : &                  mmax,mpsang,mqgrid,nproj,n1xccc,optnlxccc,positron,qchrg,qgrid,&
      96                 :         179 : &                  useylm,vlspl,xcccrc,xccc1d,zion,znucl)
      97                 :             : 
      98                 :             : !Arguments ------------------------------------
      99                 :             : !scalars
     100                 :             :  integer,intent(in) :: lloc,lmax,lmnmax,lnmax,mmax,mpsang,mqgrid,n1xccc
     101                 :             :  integer,intent(in) :: optnlxccc,positron,useylm
     102                 :             :  real(dp),intent(in) :: zion,znucl
     103                 :             :  real(dp),intent(out) :: epsatm,qchrg,xcccrc
     104                 :             : !arrays
     105                 :             :  integer,intent(out) :: indlmn(6,lmnmax),nproj(mpsang)
     106                 :             :  real(dp),intent(in) :: qgrid(mqgrid)
     107                 :             :  real(dp),intent(out) :: ekb(lnmax),vlspl(mqgrid,2) !vz_i
     108                 :             :  real(dp),intent(inout) :: ffspl(mqgrid,2,lnmax) !vz_i
     109                 :             :  real(dp),intent(inout) :: xccc1d(n1xccc,6) !vz_i
     110                 :             : 
     111                 :             : !Local variables-------------------------------
     112                 :             : !scalars
     113                 :             :  integer :: ii,index,ipsang,irad,jj,jpsang,mm,mmax2
     114                 :             :  real(dp) :: al,al_announced,amesh,fchrg,ratio,rchrg,yp1,ypn
     115                 :             :  character(len=3) :: testxc
     116                 :             :  character(len=500) :: message,errmsg
     117                 :             : !arrays
     118                 :         179 :  real(dp),allocatable :: ekb_tmp(:),ffspl_tmp(:,:,:),rad(:),vloc(:)
     119                 :             : !real(dp),allocatable :: radbis
     120                 :         179 :  real(dp),allocatable :: vpspll(:,:),wfll(:,:),work_space(:),work_spl(:)
     121                 :             : 
     122                 :             : ! ***************************************************************************
     123                 :             : 
     124                 :             : !File format of formatted fhi psp input, as adapted for use
     125                 :             : !by the ABINIT code (the 3 first lines
     126                 :             : !have already been read in calling -pspatm- routine) :
     127                 :             : 
     128                 :             : !(1) title (character) line
     129                 :             : !(2) znucl,zion,pspdat
     130                 :             : !(3) pspcod,pspxc,lmax,lloc,mmax,r2well
     131                 :             : !(4) rchrg,fchrg,qchrg
     132                 :             : !Note : prior to version 2.2, this 4th line started with  4--  ,
     133                 :             : !and no core-correction was available.
     134                 :             : !(5)-(18) -empty-
     135                 :             : !(19) mmax, amesh ( mesh increment r(m+1)/r(m) )
     136                 :             : !Then, for ll=0,lmax :
     137                 :             : !for  irad=1,mmax  : irad, r(irad), upsp(irad,ll), vpsp(irad,ll)
     138                 :             : 
     139         [ +  - ]:         179 :  read (tmp_unit, '(a3)', err=10, iomsg=errmsg) testxc
     140         [ +  + ]:         179 :  if(testxc/='4--')then
     141                 :         102 :    backspace(tmp_unit)
     142         [ +  - ]:         102 :    read (tmp_unit,*, err=10, iomsg=errmsg) rchrg,fchrg,qchrg
     143                 :         102 :    write(message, '(3f20.14,t64,a)' ) rchrg,fchrg,qchrg,'rchrg,fchrg,qchrg'
     144                 :         102 :    call wrtout(ab_out,message,'COLL')
     145                 :         102 :    call wrtout(std_out,  message,'COLL')
     146                 :             :  else
     147                 :          77 :    write(message, '(a)' ) '  No XC core correction.'
     148                 :          77 :    call wrtout(ab_out,message,'COLL')
     149                 :          77 :    call wrtout(std_out,  message,'COLL')
     150                 :          77 :    rchrg=zero ; fchrg=zero ; qchrg=zero
     151                 :             :  end if
     152         [ +  + ]:        2685 :  do ii=5,18
     153         [ +  - ]:        2685 :    read(tmp_unit,*, err=10, iomsg=errmsg)
     154                 :             :  end do
     155                 :             : 
     156   [ +  +  -  + ]:         179 :  if (positron==1.and.abs(fchrg)<=tol14) then
     157                 :             :    write(message,'(5a)')&
     158                 :           0 : &   'You can only perform positronic ground-state calculations (positron=1)',ch10,&
     159                 :           0 : &   'using fhi pseudopotentials with a core density (fchrg>0)',ch10,&
     160                 :           0 : &   'Action: change your psp file (add fchrg>0).'
     161                 :           0 :    ABI_ERROR(message)
     162                 :             :  end if
     163                 :             : !--------------------------------------------------------------------
     164                 :             : !Will now proceed at the reading of pots and wfs
     165                 :             : 
     166                 :             : !rad(:)=radial grid r(i)
     167                 :             : !vpspll(:,1),...,vpspll(:,4)=nonlocal pseudopotentials
     168                 :             : !wfll(:,1),...,wfll(:,4)=reference config. wavefunctions
     169                 :             : 
     170   [ -  +  +  -  :         537 :  ABI_MALLOC(rad,(mmax))
          +  -  +  -  -  
                +  -  + ]
     171   [ -  +  +  -  :         716 :  ABI_MALLOC(vpspll,(mmax,mpsang))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     172   [ -  +  +  -  :         537 :  ABI_MALLOC(wfll,(mmax,mpsang))
          -  +  +  -  -  
                +  -  + ]
     173                 :             : 
     174                 :             : !Read atomic pseudopotential for each l, filling up arrays vpspll
     175                 :             : !and wfll. Also set up rad array (actually read more than once)
     176                 :             : !Note: put each l into vpspll(:,l+1)
     177         [ +  + ]:         690 :  do ipsang=1,lmax+1
     178                 :         511 :    nproj(ipsang)=1
     179         [ +  - ]:         511 :    read(tmp_unit,*, err=10, iomsg=errmsg)mmax2,amesh
     180         [ +  + ]:         511 :    if(ipsang==1)then
     181                 :         179 :      write(message, '(f10.6,t20,a)' ) amesh,' amesh (Hamman grid)'
     182                 :             :      al_announced=log(amesh)
     183                 :         179 :      call wrtout(ab_out,message,'COLL')
     184                 :         179 :      call wrtout(std_out,  message,'COLL')
     185                 :             :    end if
     186         [ +  + ]:      275990 :    do irad=1,mmax
     187         [ +  - ]:      275811 :      read(tmp_unit,*, err=10, iomsg=errmsg)jj,rad(irad),wfll(irad,ipsang),vpspll(irad,ipsang)
     188                 :             :    end do
     189                 :             :  end do
     190                 :             : 
     191                 :             : 
     192                 :             : !Generate core charge function and derivatives, if needed
     193         [ +  + ]:         179 :  if(fchrg>tol14)then
     194                 :             : 
     195         [ +  + ]:          26 :    if (positron==1) then
     196                 :           1 :      call psp6cc(mmax,n1xccc,rchrg,xccc1d,znucl,vh_tnzc=vpspll(:,lloc+1))
     197         [ +  + ]:          25 :    else if(optnlxccc==1)then
     198                 :          24 :      call psp6cc(mmax,n1xccc,rchrg,xccc1d,znucl)
     199         [ +  - ]:           1 :    else if(optnlxccc==2)then
     200                 :           1 :      call psp6cc_drh(mmax,n1xccc,rchrg,xccc1d)
     201                 :             :    end if
     202                 :             : 
     203                 :             : ! The core charge function for pspcod=6 becomes zero beyond rchrg.
     204                 :             : ! Thus xcccrc must be set equal to rchrg.
     205                 :          26 :    xcccrc=rchrg
     206                 :             :  else
     207   [ +  +  +  + ]:      676341 :    xccc1d(:,:)=zero
     208                 :         153 :    xcccrc=zero
     209                 :             :  end if
     210                 :             : 
     211                 :             : !Compute in real(dp) al : the announced amesh is inaccurate.
     212                 :         179 :  ratio=rad(mmax)/rad(1)
     213                 :         179 :  al=log(ratio)/dble(mmax-1)
     214                 :             : 
     215                 :             : !vloc(:)=Vlocal(r), lloc=0, 1, or 2 or -1 for avg.
     216   [ -  +  +  -  :         358 :  ABI_MALLOC(vloc,(mmax))
             -  +  -  + ]
     217                 :             : !Copy appropriate nonlocal psp for use as local one
     218         [ +  + ]:       96577 :  vloc( 1:mmax ) = vpspll( 1:mmax , lloc+1 )
     219                 :             : 
     220                 :             : !--------------------------------------------------------------------
     221                 :             : !Carry out calculations for local (lloc) pseudopotential.
     222                 :             : !Obtain Fourier transform (1-d sine transform) to get q^2 V(q).
     223                 :             : 
     224                 :             :  call psp5lo(al,epsatm,mmax,mqgrid,qgrid,&
     225                 :         179 : & vlspl(:,1),rad,vloc,yp1,ypn,zion)
     226                 :             : 
     227                 :             : !Fit spline to q^2 V(q) (Numerical Recipes subroutine)
     228   [ -  +  +  -  :         537 :  ABI_MALLOC(work_space,(mqgrid))
          +  -  +  -  -  
                +  -  + ]
     229   [ -  +  +  -  :         358 :  ABI_MALLOC(work_spl,(mqgrid))
             -  +  -  + ]
     230                 :         179 :  call spline (qgrid,vlspl(:,1),mqgrid,yp1,ypn,work_spl)
     231         [ +  + ]:      535106 :  vlspl(:,2)=work_spl(:)
     232         [ -  + ]:         179 :  ABI_FREE(work_space)
     233         [ -  + ]:         179 :  ABI_FREE(work_spl)
     234                 :             : 
     235                 :             : !--------------------------------------------------------------------
     236                 :             : !Take care of non-local part
     237                 :             : 
     238   [ -  +  +  -  :         537 :  ABI_MALLOC(ekb_tmp,(mpsang))
          +  -  +  -  -  
                +  -  + ]
     239   [ -  +  +  -  :         716 :  ABI_MALLOC(ffspl_tmp,(mqgrid,2,mpsang))
          -  +  +  -  +  
          -  +  -  -  +  
                   -  + ]
     240                 :             : 
     241                 :             : !Zero out all Kleinman-Bylander energies to initialize
     242         [ +  + ]:         696 :  ekb_tmp(:)=zero
     243         [ +  + ]:         714 :  ekb(:)=zero
     244                 :             : 
     245                 :             : !Allow for option of no nonlocal corrections (lloc=lmax=0)
     246   [ +  +  +  + ]:         179 :  if (lloc==0.and.lmax==0) then
     247                 :           9 :    write(message, '(a,f5.1)' ) ' Note: local psp for atom with Z=',znucl
     248                 :           9 :    call wrtout(ab_out,message,'COLL')
     249                 :           9 :    call wrtout(std_out,  message,'COLL')
     250                 :             :  else
     251                 :             : 
     252                 :             : !  ----------------------------------------------------------------------
     253                 :             : !  Compute KB form factors and fit splines
     254                 :             : 
     255                 :         170 :    call psp5nl(al,ekb_tmp,ffspl_tmp,lmax,mmax,mpsang,mqgrid,qgrid,rad,vloc, vpspll,wfll)
     256                 :             : 
     257                 :             :  end if
     258                 :             : 
     259   [ +  +  +  + ]:        4540 :  jj=0;index=0;indlmn(:,:)=0
     260         [ +  + ]:         690 :  do ipsang=1,lmax+1
     261                 :             : !  nproj had been set at 1, by default
     262         [ +  + ]:         511 :    if(abs(ekb_tmp(ipsang))<tol10)then
     263                 :         179 :      nproj(ipsang)=0
     264                 :             :    end if
     265                 :             : !  Possible values for nproj in this routine : 0 or 1.
     266         [ +  + ]:         690 :    if(nproj(ipsang)==1)then
     267         [ +  + ]:         332 :      if (useylm==1) then
     268                 :          24 :        jj=jj+1
     269         [ +  + ]:          84 :        do mm=1,2*ipsang-1
     270                 :          60 :          index=index+1
     271                 :          60 :          indlmn(1,index)=ipsang-1
     272                 :          60 :          indlmn(2,index)=mm-ipsang
     273                 :          60 :          indlmn(3,index)=1
     274                 :          60 :          indlmn(4,index)=mm+(ipsang-1)*(ipsang-1)
     275                 :          60 :          indlmn(5,index)=jj
     276                 :          84 :          indlmn(6,index)=1
     277                 :             :        end do
     278                 :             :      else
     279                 :         308 :        jj=jj+1
     280                 :         308 :        index=index+1
     281                 :         308 :        indlmn(1,index)=ipsang-1
     282                 :         308 :        indlmn(2,index)=0
     283                 :         308 :        indlmn(3,index)=1
     284                 :         308 :        indlmn(4,index)=ipsang+(ipsang-1)*(ipsang-1)
     285                 :         308 :        indlmn(5,index)=jj
     286                 :         308 :        indlmn(6,index)=1
     287                 :             :      end if
     288                 :             :    end if
     289                 :             :  end do
     290                 :             : !Transfer ekb and ffspl to their definitive location
     291                 :         179 :  jpsang=1
     292         [ +  + ]:         690 :  do ipsang=1,lmax+1
     293         [ +  + ]:         690 :    if(nproj(ipsang)/=0)then
     294                 :         332 :      ekb(jpsang)=ekb_tmp(ipsang)
     295   [ +  +  +  + ]:     1980156 :      ffspl(:,:,jpsang)=ffspl_tmp(:,:,ipsang)
     296                 :         332 :      jpsang=jpsang+1
     297         [ -  + ]:         332 :      if(jpsang>lnmax)then
     298                 :             :        write(message,'(3a,2i6)')&
     299                 :           0 : &       'Problem with the dimension of the ekb and ffspl arrays.',ch10,&
     300                 :           0 : &       'ipsang,lnmax=',ipsang,lnmax
     301                 :             :      end if
     302                 :             :    end if
     303                 :             :  end do
     304                 :             : 
     305         [ -  + ]:         179 :  ABI_FREE(ekb_tmp)
     306         [ -  + ]:         179 :  ABI_FREE(ffspl_tmp)
     307         [ -  + ]:         179 :  ABI_FREE(vpspll)
     308                 :         179 :  ABI_FREE(rad)
     309         [ -  + ]:         179 :  ABI_FREE(vloc)
     310         [ -  + ]:         179 :  ABI_FREE(wfll)
     311                 :             : 
     312                 :         179 :  return
     313                 :             : 
     314                 :             :  ! Handle IO error
     315                 :             :  10 continue
     316                 :           0 :  ABI_ERROR(errmsg)
     317                 :             : 
     318   [ -  +  -  +  :         179 : end subroutine psp6in
                   -  + ]
     319                 :             : !!***
     320                 :             : 
     321                 :             : !!****f* m_psp6/psp6cc
     322                 :             : !! NAME
     323                 :             : !! psp6cc
     324                 :             : !!
     325                 :             : !! FUNCTION
     326                 :             : !! Compute the core charge density, for use in the XC core
     327                 :             : !! correction, following the function definition valid
     328                 :             : !! for the format 6 of pseudopotentials.
     329                 :             : !!
     330                 :             : !! INPUTS
     331                 :             : !!  mmax=maximum number of points in real space grid in the psp file
     332                 :             : !!  n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
     333                 :             : !!  rchrg=cut-off radius for the core density
     334                 :             : !!  znucl=nuclear number of atom as specified in psp file
     335                 :             : !!
     336                 :             : !! OUTPUT
     337                 :             : !!  xccc1d(n1xccc,6)= 1D core charge function and its five first derivatives
     338                 :             : !!  Optional output:
     339                 :             : !!    vh_tnzc(mmax) = Hartree potential induced by density tild_[n_Z+n_core]
     340                 :             : !!                    (pseudized [n_Z+n_core], where n_Z=ions, n_core=core electrons)
     341                 :             : !!                    using a simple pseudization scheme
     342                 :             : !!
     343                 :             : !! SOURCE
     344                 :             : 
     345                 :          25 : subroutine psp6cc(mmax,n1xccc,rchrg,xccc1d,znucl,&
     346                 :             : &                 vh_tnzc) ! optional argument
     347                 :             : 
     348                 :             : !Arguments ------------------------------------
     349                 :             : !scalars
     350                 :             :  integer,intent(in) :: mmax,n1xccc
     351                 :             :  real(dp),intent(in) :: rchrg,znucl
     352                 :             : !arrays
     353                 :             :  real(dp),intent(inout) :: xccc1d(n1xccc,6) !vz_i
     354                 :             :  real(dp),intent(out),optional :: vh_tnzc(mmax)
     355                 :             : 
     356                 :             : !Local variables-------------------------------
     357                 :             : !scalars
     358                 :             :  integer :: i1xccc,irad
     359                 :             :  real(dp) :: der1,dern
     360                 :             :  character(len=500) :: errmsg
     361                 :             : !arrays
     362                 :          25 :  real(dp),allocatable :: ff(:),ff1(:),ff2(:),ff3(:),gg(:),gg1(:),gg2(:),gg3(:)
     363                 :          25 :  real(dp),allocatable :: gg4(:),nc(:),rad(:),work(:),xx(:)
     364                 :             : 
     365                 :             : !**********************************************************************
     366                 :             : 
     367   [ -  +  +  -  :          75 :  ABI_MALLOC(ff,(mmax))
          +  -  +  -  -  
                +  -  + ]
     368   [ -  +  +  -  :          50 :  ABI_MALLOC(ff1,(mmax))
             -  +  -  + ]
     369   [ -  +  +  -  :          50 :  ABI_MALLOC(ff2,(mmax))
             -  +  -  + ]
     370   [ -  +  +  -  :          50 :  ABI_MALLOC(ff3,(mmax))
             -  +  -  + ]
     371   [ -  +  +  -  :          50 :  ABI_MALLOC(rad,(mmax))
             -  +  -  + ]
     372   [ -  +  +  -  :          75 :  ABI_MALLOC(gg,(n1xccc))
          +  -  +  -  -  
                +  -  + ]
     373   [ -  +  +  -  :          50 :  ABI_MALLOC(gg1,(n1xccc))
             -  +  -  + ]
     374   [ -  +  +  -  :          50 :  ABI_MALLOC(gg2,(n1xccc))
             -  +  -  + ]
     375   [ -  +  +  -  :          50 :  ABI_MALLOC(gg3,(n1xccc))
             -  +  -  + ]
     376   [ -  +  +  -  :          50 :  ABI_MALLOC(gg4,(n1xccc))
             -  +  -  + ]
     377   [ -  +  +  -  :          50 :  ABI_MALLOC(work,(n1xccc))
             -  +  -  + ]
     378   [ -  +  +  -  :          50 :  ABI_MALLOC(xx,(n1xccc))
             -  +  +  - ]
     379                 :             : 
     380                 :             : !read from pp file the model core charge (ff) and first (ff1) and
     381                 :             : !second (ff2) derivative on logarithmic mesh mmax; rad is the radial grid
     382                 :             : !the input functions contain the 4pi factor, it must be rescaled.
     383                 :             : 
     384         [ +  + ]:       16179 :  do irad=1,mmax
     385         [ +  - ]:       16154 :    read(tmp_unit,*, err=10, iomsg=errmsg) rad(irad),ff(irad),ff1(irad),ff2(irad)
     386                 :       16154 :    ff(irad)=ff(irad)/four_pi
     387                 :       16154 :    ff1(irad)=ff1(irad)/four_pi
     388                 :       16179 :    ff2(irad)=ff2(irad)/four_pi
     389                 :             :  end do
     390                 :             : 
     391                 :             : !Optional output: VHartree(tild_[n_Z+n_core])
     392         [ +  + ]:          25 :  if (present(vh_tnzc)) then
     393   [ -  +  +  -  :           2 :    ABI_MALLOC(nc,(mmax))
             -  +  -  + ]
     394   [ -  +  +  + ]:         495 :    nc=ff ! n_core
     395                 :           1 :    call psden(1,ff,mmax,nc,rchrg,rad,ff1=ff1,ff2=ff2)
     396                 :           1 :    call vhtnzc(ff,rchrg,vh_tnzc,mmax,rad,znucl)
     397         [ -  + ]:           1 :    ABI_FREE(nc)
     398                 :             :  end if
     399                 :             : 
     400                 :          25 :  rad(1)=zero
     401                 :             : 
     402                 :             : !calculate third derivative ff3 on logarithmic grid
     403                 :          25 :  der1=ff2(1)
     404                 :          25 :  dern=ff2(mmax)
     405                 :          25 :  call spline(rad,ff1,mmax,der1,dern,ff3)
     406                 :             : 
     407                 :             : !generate uniform mesh xx in the box cut by rchrg:
     408                 :             : 
     409         [ +  + ]:       62550 :  do i1xccc=1,n1xccc
     410                 :       62550 :    xx(i1xccc)=(i1xccc-1)* rchrg/dble(n1xccc-1)
     411                 :             :  end do
     412                 :             : 
     413                 :             : !now interpolate core charge and derivatives on the uniform grid
     414                 :             : !core charge, input=ff,  output=gg
     415                 :          25 :  call splint(mmax,rad,ff,ff2,n1xccc,xx,gg)
     416                 :             : 
     417                 :             : !first derivative input=ff1, output=gg1
     418                 :          25 :  call splint(mmax,rad,ff1,ff3,n1xccc,xx,gg1)
     419                 :             : 
     420                 :             : !normalize gg1
     421         [ +  + ]:       62550 :  gg1(:)=gg1(:)*rchrg
     422                 :             : 
     423                 :             : !now calculate second to fourth derivative by forward differences
     424                 :             : !to avoid numerical noise uses a smoothing function
     425                 :             : 
     426                 :          25 :  call smooth(gg1,n1xccc,10)
     427                 :             : 
     428                 :          25 :  gg2(n1xccc)=zero
     429         [ +  + ]:       62525 :  do i1xccc=1,n1xccc-1
     430                 :       62525 :    gg2(i1xccc)=(gg1(i1xccc+1)-gg1(i1xccc))*dble(n1xccc-1)
     431                 :             :  end do
     432                 :             : 
     433                 :          25 :  call smooth(gg2,n1xccc,10)
     434                 :             : 
     435                 :          25 :  gg3(n1xccc)=zero
     436         [ +  + ]:       62525 :  do i1xccc=1,n1xccc-1
     437                 :       62525 :    gg3(i1xccc)=(gg2(i1xccc+1)-gg2(i1xccc))*dble(n1xccc-1)
     438                 :             :  end do
     439                 :             : 
     440                 :          25 :  call smooth(gg3,n1xccc,10)
     441                 :             : 
     442                 :          25 :  gg4(n1xccc)=zero
     443         [ +  + ]:       62525 :  do i1xccc=1,n1xccc-1
     444                 :       62525 :    gg4(i1xccc)=(gg3(i1xccc+1)-gg3(i1xccc))*dble(n1xccc-1)
     445                 :             :  end do
     446                 :             : 
     447                 :          25 :  call smooth(gg4,n1xccc,10)
     448                 :             : 
     449                 :             : !write on xcc1d
     450         [ +  + ]:       62550 :  xccc1d(:,1)=gg(:)
     451         [ +  + ]:       62550 :  xccc1d(:,2)=gg1(:)
     452         [ +  + ]:       62550 :  xccc1d(:,3)=gg2(:)
     453         [ +  + ]:       62550 :  xccc1d(:,4)=gg3(:)
     454         [ +  + ]:       62550 :  xccc1d(:,5)=gg4(:)
     455                 :             : 
     456                 :             : !WARNING : fifth derivative not yet computed
     457         [ +  + ]:       62550 :  xccc1d(:,6)=zero
     458                 :             : 
     459                 :             : !note: the normalization condition is the following:
     460                 :             : !4pi rchrg /dble(n1xccc-1) sum xx^2 xccc1d(:,1) = qchrg
     461                 :             : !
     462                 :             : !norm=zero
     463                 :             : !do i1xccc=1,n1xccc
     464                 :             : !norm = norm + four_pi*rchrg/dble(n1xccc-1)*&
     465                 :             : !&             xx(i1xccc)**2*xccc1d(i1xccc,1)
     466                 :             : !end do
     467                 :             : !write(std_out,*) ' norm=',norm
     468                 :             : !
     469                 :             : !write(std_out,*)' psp1cc : output of core charge density and derivatives '
     470                 :             : !write(std_out,*)'   xx          gg           gg1  '
     471                 :             : !do i1xccc=1,n1xccc
     472                 :             : !write(10, '(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,1),xccc1d(i1xccc,2)
     473                 :             : !end do
     474                 :             : !write(std_out,*)'   xx          gg2          gg3  '
     475                 :             : !do i1xccc=1,n1xccc
     476                 :             : !write(11, '(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,3),xccc1d(i1xccc,4)
     477                 :             : !end do
     478                 :             : !write(std_out,*)'   xx          gg4          gg5  '
     479                 :             : !do i1xccc=1,n1xccc
     480                 :             : !write(12, '(3es14.6)' ) xx(i1xccc),xccc1d(i1xccc,5),xccc1d(i1xccc,6)
     481                 :             : !end do
     482                 :             : !write(std_out,*)' psp1cc : debug done, stop '
     483                 :             : !stop
     484                 :             : !ENDDEBUG
     485                 :             : 
     486         [ -  + ]:          25 :  ABI_FREE(ff)
     487         [ -  + ]:          25 :  ABI_FREE(ff1)
     488                 :          25 :  ABI_FREE(ff2)
     489         [ -  + ]:          25 :  ABI_FREE(ff3)
     490         [ -  + ]:          25 :  ABI_FREE(gg)
     491         [ -  + ]:          25 :  ABI_FREE(gg1)
     492                 :          25 :  ABI_FREE(gg2)
     493                 :          25 :  ABI_FREE(gg3)
     494                 :          25 :  ABI_FREE(gg4)
     495                 :          25 :  ABI_FREE(rad)
     496         [ -  + ]:          25 :  ABI_FREE(work)
     497         [ -  + ]:          25 :  ABI_FREE(xx)
     498                 :             : 
     499                 :          25 :  return
     500                 :             : 
     501                 :             :  ! Handle IO error
     502                 :             :  10 continue
     503                 :           0 :  ABI_ERROR(errmsg)
     504                 :             : 
     505   [ -  +  -  +  :          25 : end subroutine psp6cc
          -  +  -  +  -  
          +  -  +  -  +  
          -  +  -  +  -  
             +  -  +  -  
                      + ]
     506                 :             : !!***
     507                 :             : 
     508                 :             : !!****f* m_psp6/psden
     509                 :             : !! NAME
     510                 :             : !! psden
     511                 :             : !!
     512                 :             : !! FUNCTION
     513                 :             : !! Calculate a pseudo-density from an original density on a radial grid (regular or logarithmic)
     514                 :             : !!
     515                 :             : !! INPUTS
     516                 :             : !!  ilog=1 if grid is logarithmic, else 0
     517                 :             : !!  mesh= dimension of nc
     518                 :             : !!  nc(mesh)= density to be pseudized
     519                 :             : !!  rc= cut-off radius
     520                 :             : !!  rad(mesh) = radial mesh
     521                 :             : !!
     522                 :             : !! OUTPUT
     523                 :             : !!  ff(mesh)= pseudized density
     524                 :             : !!
     525                 :             : !!SIDE EFFECTS
     526                 :             : !!  Optional:
     527                 :             : !!    ff1(mesh)= 1st derivative of pseudo density (only r<rc modified)
     528                 :             : !!    ff2(mesh)= 2nd derivative of pseudo density (only r<rc modified)
     529                 :             : !!
     530                 :             : !! NOTES
     531                 :             : !!    ff=exp(-(a+b.r^2+c.r^4))
     532                 :             : !!
     533                 :             : !! SOURCE
     534                 :             : 
     535                 :           1 : subroutine psden(ilog,ff,mesh,nc,rc,rad,ff1,ff2)
     536                 :             : 
     537                 :             : !Arguments ------------------------------------
     538                 :             : !scalars
     539                 :             :  integer,intent(in) :: ilog,mesh
     540                 :             :  real(dp),intent(in) :: rc
     541                 :             : !arrays
     542                 :             :  real(dp),intent(in) :: nc(mesh),rad(mesh)
     543                 :             :  real(dp),intent(out) :: ff(mesh)
     544                 :             :  real(dp),intent(inout),optional :: ff1(mesh),ff2(mesh)
     545                 :             : 
     546                 :             : !Local variables-------------------------------
     547                 :             : !scalars
     548                 :             :  integer :: ii,nc1
     549                 :             :  real(dp) :: aa,aa1,aa2,bb,cc,c1,c3,f0,f0p,norm1,norm2,rc1,step
     550                 :             : !arrays
     551                 :           1 :  real(dp),allocatable :: fpir(:),gg(:)
     552                 :             : 
     553                 :             : ! *************************************************************************
     554                 :             : 
     555                 :           1 :  rc1=rc/four
     556                 :             : 
     557   [ -  +  +  -  :           3 :  ABI_MALLOC(fpir,(mesh))
          +  -  +  -  -  
                +  -  + ]
     558         [ +  + ]:         494 :  fpir(1:mesh)=four_pi*rad(1:mesh)**2
     559   [ +  -  +  + ]:         494 :  if (ilog==1) fpir(1:mesh)=fpir(1:mesh)*rad(1:mesh)
     560                 :             : 
     561         [ -  + ]:           1 :  if (ilog==0) then
     562                 :           0 :    step=rad(2)-rad(1)
     563                 :           0 :    nc1=int(rc1/step)+1
     564                 :           0 :    rc1=(nc1-1)*step
     565         [ +  - ]:           1 :  else if (ilog==1) then
     566                 :           1 :    step=log(rad(2)/rad(1))
     567                 :           1 :    nc1=int(log(rc1/rad(1))/step)+1
     568                 :           1 :    rc1=rad(nc1)
     569                 :             :  end if
     570         [ +  + ]:         319 :  ff(1:nc1)=nc(1:nc1)*fpir(1:nc1)
     571                 :           1 :  call ctrap(nc1,ff(1:nc1),step,c3)
     572         [ +  - ]:           1 :  if (ilog==1) c3=c3+half*ff(1)
     573                 :           1 :  f0=nc(nc1);c1=-log(f0)
     574                 :           1 :  f0p=half*(nc(nc1+1)-nc(nc1-1))/step
     575                 :             : 
     576                 :           1 :  ii=0;aa1=zero;norm1=c3+one
     577   [ +  +  -  + ]:           2 :  do while (norm1>c3.and.ii<100)
     578                 :           1 :    ii=ii+1;aa1=aa1+one
     579                 :           1 :    aa=c1-aa1*rc1**4+rc1*(f0p/f0+four*aa1*rc1**3)*half
     580                 :           1 :    bb=-half*(f0p/f0+four*aa1*rc1**3)/rc1
     581         [ +  + ]:         319 :    ff(1:nc1)=fpir(1:nc1)*exp(-aa-bb*rad(1:nc1)**2-aa1*rad(1:nc1)**4)
     582                 :           1 :    call ctrap(nc1,ff(1:nc1),step,norm1)
     583         [ -  + ]:           2 :    if (ilog==1) norm1=norm1+half*ff(1)
     584                 :             :  end do
     585         [ -  + ]:           1 :  if (ii==100) then
     586                 :           0 :    ABI_ERROR('Big pb 1 in psden !')
     587                 :             :  end if
     588                 :             : 
     589                 :           1 :  ii=0;aa2=zero;norm2=c3-one
     590   [ +  +  -  + ]:           2 :  do while (norm2<c3.and.ii<100)
     591                 :           1 :    ii=ii+1;aa2=aa2-one
     592                 :           1 :    aa=c1-aa2*rc1**4+rc1*(f0p/f0+four*aa2*rc1**3)*half
     593                 :           1 :    bb=-half*(f0p/f0+four*aa2*rc1**3)/rc1
     594         [ +  + ]:         319 :    ff(1:nc1)=fpir(1:nc1)*exp(-aa-bb*rad(1:nc1)**2-aa2*rad(1:nc1)**4)
     595                 :           1 :    call ctrap(nc1,ff(1:nc1),step,norm2)
     596         [ -  + ]:           2 :    if (ilog==1) norm2=norm2+half*ff(1)
     597                 :             :  end do
     598         [ -  + ]:           1 :  if (ii==100) then
     599                 :           0 :    ABI_ERROR('Big pb 2 in psden !')
     600                 :             :  end if
     601                 :             : 
     602         [ +  + ]:          36 :  do while (abs(norm2-c3)>tol10)
     603                 :             : 
     604                 :          35 :    cc=(aa1+aa2)*half
     605                 :          35 :    aa=c1-cc*rc1**4+rc1*(f0p/f0+four*cc*rc1**3)*half
     606                 :          35 :    bb=-half*(f0p/f0+four*cc*rc1**3)/rc1
     607         [ +  + ]:       11165 :    ff(1:nc1)=fpir(1:nc1)*exp(-aa-bb*rad(1:nc1)**2-cc*rad(1:nc1)**4)
     608                 :          35 :    call ctrap (nc1,ff(1:nc1),step,norm2)
     609         [ +  - ]:          35 :    if (ilog==1) norm2=norm2+half*ff(1)
     610         [ +  + ]:          36 :    if ((norm1-c3)*(norm2-c3)>zero) then
     611                 :          19 :      aa1=cc
     612                 :          19 :      norm1=norm2
     613                 :             :    else
     614                 :             :      aa2=cc
     615                 :             :    end if
     616                 :             : 
     617                 :             :  end do ! while
     618                 :             : 
     619         [ +  - ]:           1 :  ff(1)=exp(-aa);if (ilog==1) ff(1)=ff(1)*exp(-bb*rad(1)**2-cc*rad(1)**4)
     620         [ +  + ]:         318 :  ff(2:nc1)=ff(2:nc1)/fpir(2:nc1)
     621   [ +  -  +  + ]:         176 :  if (nc1<mesh) ff(nc1+1:mesh)=nc(nc1+1:mesh)
     622   [ +  -  +  + ]:         319 :  if (present(ff1)) ff1(1:nc1)=-(two*bb*rad(1:nc1)+four*cc*rad(1:nc1)**3)*ff(1:nc1)
     623         [ +  - ]:           1 :  if (present(ff2)) ff2(1:nc1)=-(two*bb+12.0_dp*cc*rad(1:nc1)**2)*ff(1:nc1) &
     624         [ +  + ]:         319 : & +(two*bb*rad(1:nc1)+four*cc*rad(1:nc1)**3)**2*ff(1:nc1)
     625                 :             : 
     626   [ -  +  +  -  :           2 :  ABI_MALLOC(gg,(mesh))
             -  +  -  + ]
     627         [ +  + ]:         494 :  gg(1:mesh)=fpir(1:mesh)*ff(1:mesh)
     628                 :           1 :  call ctrap(mesh,gg(1:mesh),step,norm1)
     629                 :             :  if (ilog==1) norm1=norm1+half*gg(1)
     630                 :             :  !write(std_out,*) 'psden: tild_nc integral= ',norm1
     631         [ -  + ]:           1 :  ABI_FREE(gg)
     632                 :             : 
     633         [ -  + ]:           1 :  ABI_FREE(fpir)
     634                 :             : 
     635                 :           1 : end subroutine psden
     636                 :             : !!***
     637                 :             : 
     638                 :             : !!****f* m_psp6/vhtnzc
     639                 :             : !! NAME
     640                 :             : !! vhtnzc
     641                 :             : !!
     642                 :             : !! FUNCTION
     643                 :             : !! Compute VHartree(tild[n_Z+n_core]) from input ncore
     644                 :             : !!
     645                 :             : !! INPUTS
     646                 :             : !!  mesh=dimension of radial mesh
     647                 :             : !!  nc= core density (to be pseudized)
     648                 :             : !!  rad(mesh)=radial mesh
     649                 :             : !!  rc=cut-off radius
     650                 :             : !!  znucl=nuclear number of atom as specified in psp file
     651                 :             : !!
     652                 :             : !! OUTPUT
     653                 :             : !!  vhtnzc(mesh) = hartree potential induced by density tild[n_Z+n_core] (pseudo core density + nucleus)
     654                 :             : !!
     655                 :             : !! SOURCE
     656                 :             : 
     657                 :           1 : subroutine vhtnzc(nc,rc,vh_tnzc,mesh,rad,znucl)
     658                 :             : 
     659                 :             : !Arguments ------------------------------------
     660                 :             : !scalars
     661                 :             :  integer,intent(in) :: mesh
     662                 :             :  real(dp),intent(in) :: znucl
     663                 :             :  real(dp),intent(in) :: rc
     664                 :             : !arrays
     665                 :             :  real(dp),intent(in) :: nc(mesh),rad(mesh)
     666                 :             :  real(dp),intent(out) :: vh_tnzc(mesh)
     667                 :             : 
     668                 :             : !Local variables-------------------------------
     669                 :             : !scalars
     670                 :             :  integer :: ir,nc1
     671                 :             :  real(dp) :: gnorm,rc1,step,yp1,yp2,yp3
     672                 :             : !arrays
     673                 :           1 :  real(dp),allocatable :: den1(:),den2(:),den3(:),den4(:),nzc(:),rvhn(:),shapefunc(:)
     674                 :             : 
     675                 :             : ! *************************************************************************
     676                 :             : 
     677                 :           1 :  rc1=rc/four
     678                 :             : 
     679                 :           1 :  step=log(rad(2)/rad(1))
     680                 :           1 :  nc1=int(log(rc1/rad(1))/step)+1
     681                 :           1 :  rc1=rad(nc1)
     682                 :             : 
     683   [ -  +  +  -  :           3 :  ABI_MALLOC(shapefunc,(mesh))
          +  -  +  -  -  
                +  -  + ]
     684                 :           1 :  shapefunc(1)=one
     685         [ +  + ]:         318 :  shapefunc(2:nc1)=(sin(pi*rad(2:nc1)/rc1)/(pi*rad(2:nc1)/rc1))**2
     686   [ +  -  +  + ]:         176 :  if (nc1<mesh) shapefunc(nc1+1:mesh)=zero
     687                 :             : 
     688   [ -  +  +  -  :           2 :  ABI_MALLOC(den1,(mesh))
             -  +  -  + ]
     689         [ +  + ]:         494 :  den1(1:mesh)=four_pi*shapefunc(1:mesh)*rad(1:mesh)**3
     690                 :           1 :  call ctrap(mesh,den1,step,gnorm)
     691                 :           1 :  gnorm =one/gnorm
     692         [ -  + ]:           1 :  ABI_FREE(den1)
     693                 :             : 
     694   [ -  +  +  -  :           2 :  ABI_MALLOC(nzc,(mesh))
             -  +  -  + ]
     695         [ +  + ]:         494 :  nzc(1:mesh)=four*pi*nc(1:mesh)*rad(1:mesh)**2-four_pi*shapefunc(1:mesh)*rad(1:mesh)**2*znucl*gnorm
     696                 :           1 :  ABI_FREE(shapefunc)
     697                 :             : 
     698   [ -  +  +  -  :           2 :  ABI_MALLOC(rvhn,(mesh))
             -  +  -  + ]
     699                 :           1 :  rvhn(1)=zero
     700                 :             : 
     701   [ -  +  +  -  :           2 :  ABI_MALLOC(den1,(mesh))
             -  +  -  + ]
     702   [ -  +  +  -  :           2 :  ABI_MALLOC(den2,(mesh))
             -  +  -  + ]
     703   [ -  +  +  -  :           2 :  ABI_MALLOC(den3,(mesh))
             -  +  -  + ]
     704   [ -  +  +  -  :           2 :  ABI_MALLOC(den4,(mesh))
             -  +  -  + ]
     705                 :             : 
     706                 :           1 :  den1(1)=zero;den2(1)=zero
     707         [ +  + ]:         493 :  do ir=2,mesh
     708                 :         492 :    den1(ir)= rad(ir)*nzc(ir)
     709                 :         493 :    den2(ir)= den1(ir)/rad(ir)
     710                 :             :  end do
     711                 :             : 
     712                 :             : !For first few points do stupid integral
     713                 :           1 :  den3(1)=zero;den4(1)=zero
     714         [ +  + ]:         493 :  do ir=2,mesh
     715                 :         492 :    call ctrap(ir,den1(1:ir),step,den3(ir))
     716                 :         493 :    call ctrap(ir,den2(1:ir),step,den4(ir))
     717                 :             :  end do
     718                 :             : 
     719         [ +  + ]:         494 :  do ir=1,mesh
     720                 :         494 :    rvhn(ir)=den3(ir)+rad(ir)*(den4(mesh)-den4(ir))
     721                 :             :  end do
     722                 :             : 
     723                 :           1 :  ABI_FREE(den1)
     724                 :           1 :  ABI_FREE(den2)
     725                 :           1 :  ABI_FREE(den3)
     726                 :           1 :  ABI_FREE(den4)
     727                 :             : 
     728         [ +  + ]:         493 :  vh_tnzc(2:mesh)=rvhn(2:mesh)/rad(2:mesh)
     729                 :           1 :  yp2=(vh_tnzc(3)-vh_tnzc(2))/(rad(3)-rad(2))
     730                 :           1 :  yp3=(vh_tnzc(4)-vh_tnzc(3))/(rad(4)-rad(3))
     731                 :           1 :  yp1=yp2+(yp2-yp3)*rad(2)/(rad(3)-rad(2))
     732                 :           1 :  vh_tnzc(1)=vh_tnzc(2)-(yp1+yp2)*rad(2)
     733                 :             : 
     734         [ -  + ]:           1 :  ABI_FREE(nzc)
     735                 :           1 :  ABI_FREE(rvhn)
     736                 :             : 
     737                 :           1 : end subroutine vhtnzc
     738                 :             : !!***
     739                 :             : 
     740                 :             : !!****f* m_psp6/psp6cc_drh
     741                 :             : !! NAME
     742                 :             : !! psp6cc_drh
     743                 :             : !!
     744                 :             : !! FUNCTION
     745                 :             : !! Compute the core charge density, for use in the XC core
     746                 :             : !! correction, following the function definition valid
     747                 :             : !! for the format 6 of pseudopotentials.
     748                 :             : !! Version modified by DHamann, with consistent treatment
     749                 :             : !! of the derivatives in this routine and the remaining of the code.
     750                 :             : !!
     751                 :             : !! INPUTS
     752                 :             : !!  mmax=maximum number of points in real space grid in the psp file
     753                 :             : !!  n1xccc=dimension of xccc1d ; 0 if no XC core correction is used
     754                 :             : !!  rchrg=cut-off radius for the core density
     755                 :             : !!
     756                 :             : !! OUTPUT
     757                 :             : !!  xccc1d(n1xccc,6)= 1D core charge function and its five first derivatives
     758                 :             : !!
     759                 :             : !! NOTES
     760                 :             : !! Test version by DRH - requires very smooth model core charge
     761                 :             : !!
     762                 :             : !! SOURCE
     763                 :             : 
     764                 :           1 : subroutine psp6cc_drh(mmax,n1xccc,rchrg,xccc1d)
     765                 :             : 
     766                 :             : !Arguments ------------------------------------
     767                 :             : !scalars
     768                 :             :  integer,intent(in) :: mmax,n1xccc
     769                 :             :  real(dp),intent(in) :: rchrg
     770                 :             : !arrays
     771                 :             :  real(dp),intent(inout) :: xccc1d(n1xccc,6) !vz_i
     772                 :             : 
     773                 :             : !Local variables-------------------------------
     774                 :             : !scalars
     775                 :             :  integer :: irad
     776                 :             :  character(len=500) :: errmsg
     777                 :             : !arrays
     778                 :           1 :  real(dp),allocatable :: ff(:),ff1(:),ff2(:),rad(:)
     779                 :             : 
     780                 :             : !**********************************************************************
     781                 :             : 
     782   [ -  +  +  -  :           3 :  ABI_MALLOC(ff,(mmax))
          +  -  +  -  -  
                +  -  + ]
     783   [ -  +  +  -  :           2 :  ABI_MALLOC(ff1,(mmax))
             -  +  -  + ]
     784   [ -  +  +  -  :           2 :  ABI_MALLOC(ff2,(mmax))
             -  +  -  + ]
     785   [ -  +  +  -  :           2 :  ABI_MALLOC(rad,(mmax))
             -  +  +  - ]
     786                 :             : 
     787                 :             : !
     788                 :             : !read from pp file the model core charge (ff) and first (ff1) and
     789                 :             : !second (ff2) derivative on logarithmic mesh mmax; rad is the radial grid
     790                 :             : !the input functions contain the 4pi factor, it must be rescaled.
     791                 :             : 
     792                 :             :  !write(std_out,'(a,2i6)') 'drh:psp6cc_drh - mmax,n1xccc',mmax,n1xccc
     793         [ +  + ]:         601 :  do irad=1,mmax
     794         [ +  - ]:         600 :    read(tmp_unit,*,err=10,iomsg=errmsg) rad(irad),ff(irad),ff1(irad),ff2(irad)
     795                 :         600 :    ff(irad)=ff(irad)/4.d0/pi
     796                 :         600 :    ff1(irad)=ff1(irad)/4.d0/pi
     797                 :         601 :    ff2(irad)=ff2(irad)/4.d0/pi
     798                 :             :  end do
     799                 :           1 :  rad(1)=0.d0
     800                 :             : 
     801                 :           1 :  call cc_derivatives(rad,ff,ff1,ff2,mmax,n1xccc,rchrg,xccc1d)
     802                 :             : 
     803         [ -  + ]:           1 :  ABI_FREE(ff)
     804         [ -  + ]:           1 :  ABI_FREE(ff1)
     805         [ -  + ]:           1 :  ABI_FREE(ff2)
     806                 :           1 :  ABI_FREE(rad)
     807                 :             : 
     808                 :             :  return
     809                 :             : 
     810                 :             :  ! Handle IO error
     811                 :             :  10 continue
     812                 :           0 :  ABI_ERROR(errmsg)
     813                 :             : 
     814   [ #  #  #  #  :           0 : end subroutine psp6cc_drh
             #  #  #  # ]
     815                 :             : !!***
     816                 :             : 
     817                 :             : end module m_psp6
     818                 :             : !!***
        

Generated by: LCOV version 2.3-1