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-09-21 22:40:37 Functions: 100.0 % 5 5

            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