quantum-espresso/atomic/compute_phi_tm.f90

95 lines
2.6 KiB
Fortran
Raw Normal View History

!
! Copyright (C) 2004 PWSCF group
! This file is distributed under the terms of the
! GNU General Public License. See the file `License'
! in the root directory of the present distribution,
! or http://www.gnu.org/copyleft/gpl.txt .
!
!--------------------------------------------------------------------------
subroutine compute_phi_tm(lam,ik,chir,phi_out,iflag,xc,e,els_in)
!--------------------------------------------------------------------------
!
! This routine computes the phi functions by pseudizing the
! all_electron chi functions. In input it receives, the point
! ik where the cut is done, the angular momentum lam,
! and the all electron wavefunction
!
!
!
use io_global, only : stdout
use kinds, only : DP
use constants, only: pi
use radial_grids, only: ndmx
use ld1inc, only: grid, vpot
implicit none
integer :: &
lam, & ! input: the angular momentum
ik, & ! input: the point corresponding to rc
iflag ! input: if 1 print the message
real(DP) :: &
e ! input: the energy of the level
real(DP) :: &
xc(8), & ! output: parameters of the fit
chir(ndmx), & ! input: the all-electron function
phi_out(ndmx) ! output: the phi function
character(len=2) :: els_in ! input: the label of the state
!
real(DP) :: &
faenor ! the norm of the function
integer :: &
n, nst
real(DP) :: &
gi(ndmx), &
cn(6), c2
real(DP), external :: deriv_7pts, deriv2_7pts, int_0_inf_dr, pr
!
!
! compute the norm of the all-electron function
!
nst=(lam+1)*2
do n=1,ik+1
gi(n)=chir(n)**2
enddo
faenor=int_0_inf_dr(gi,grid,ik,nst)
!
!
! TM: the pseudo-wavefunction is written as polynomial times exponential
!
call find_coefficients &
(ik, chir, e, grid%r, grid%dx, faenor, vpot, cn, c2, lam, grid%mesh)
do n=1,ik
phi_out(n)=sign(grid%r(n)**(lam+1)*exp(pr(cn,c2,grid%r(n))),chir(ik))
end do
xc(1:6) = cn(:)
xc(7) = c2
!
! for r > r(ik) the pseudo and all-electron psi(r) coincide
!
do n=ik+1,grid%mesh
phi_out(n)= chir(n)
enddo
!
! check for the norm of the pseudo wavefunction
!
! do n=1,ik
! gi(n)=phi_out(n)**2
! enddo
! psnor=int_0_inf_dr(gi,grid,ik,nst)
! write(stdout,'(5x," AE norm = ",f6.3," PS norm = ",f6.3)') faenor, psnor
if (iflag == 1) then
write(stdout,120) els_in, grid%r(ik)
120 format (/ /5x, ' Wfc ',a3,' rcut=',f6.3, &
' Using Troullier-Martins method ')
end if
return
end subroutine compute_phi_tm