!
! Copyright (C) 2003-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 .
!
MODULE paw_gipaw
USE kinds, ONLY: DP
USE parameters, ONLY: npsx
use radial_grids, ONLY: ndmx
!!use gipaw_module, ONLY: nbrx
!
! ... These parameters are needed for the paw variables
!
SAVE
!
! REAL(DP) :: &
! paw_betar(ndmx,nbrx,npsx) ! radial beta_{mu} functions
! INTEGER :: &
! paw_nh(npsx), &! number of beta functions per atomic type
! paw_nbeta(npsx), &! number of beta functions
! paw_kkbeta(npsx), &! point where the beta are zero
! paw_lll(nbrx,npsx) ! angular momentum of the beta function
! INTEGER :: &
! paw_nhm, &! max number of different beta functions per atom
! paw_nkb, &! total number of beta functions, with st.fact.
! paw_nqxq, &! size of interpolation table
! paw_lmaxkb, &! max angular momentum
! paw_lmaxq, &! max angular momentum + 1 for Q functions
! paw_nqx ! number of interpolation points
! INTEGER, ALLOCATABLE ::&
! paw_indv(:,:), &! correspondence of betas atomic <-> soli
! paw_nhtol(:,:), &! correspondence n <-> angular momentum
! paw_nhtom(:,:), &! correspondence n <-> magnetic angular m
! paw_nl(:,:), &! number of projectors for each l
! paw_iltonh(:,:,:) ! corresp l, num <--> n for each type
! complex(DP), ALLOCATABLE, TARGET :: &
! paw_vkb(:,:), & ! all beta functions in reciprocal space
! paw_becp(:,:) ! products of wavefunctions and proj
! REAL(DP), ALLOCATABLE :: &
! paw_tab(:,:,:) ! interpolation table for PPs
! !
! REAL(DP), ALLOCATABLE :: &
! paw_tab_d2y(:,:,:) ! for cubic splines
! !
type wfc_label
integer :: na , & ! Atom number
nt , & ! Type
n , & ! Chi index
l , & ! l
m , & ! m
nrc, & ! index of core radius on mesh
nrs ! index of inner core radius (where "f_step" starts)
real(DP) :: rc ! paw core radius
end type wfc_label
type at_wfc
type(wfc_label) :: label
integer :: kkpsi
real(DP) , pointer :: psi(:)
end type at_wfc
! TYPE ( at_wfc ), POINTER :: aephi(:,:)
! TYPE ( at_wfc ), POINTER :: psphi(:,:)
!
! LOGICAL, ALLOCATABLE :: vloc_present ( : )
! REAL(dp), ALLOCATABLE :: gipaw_ae_vloc ( :, : )
! REAL(dp), ALLOCATABLE :: gipaw_ps_vloc ( :, : )
!
! LOGICAL, ALLOCATABLE :: gipaw_data_in_upf_file ( : )
!
! INTEGER, ALLOCATABLE :: gipaw_ncore_orbital ( : )
! REAL(dp), ALLOCATABLE :: gipaw_core_orbital ( :, :, : )
integer, parameter :: nbrx = 20
INTEGER :: &
paw_nkb, & ! total number of beta functions, with st.fact.
paw_nqxq, & ! size of interpolation table
paw_lmaxkb, & ! max angular momentum
paw_lmaxq, & ! max angular momentum + 1 for Q functions
paw_nqx ! number of interpolation points
complex(DP), ALLOCATABLE :: &
paw_vkb(:,:), & ! all beta functions in reciprocal space
paw_becp(:,:) ! products of wavefunctions and proj
TYPE paw_recon_type
REAL(DP) :: &
paw_betar(ndmx,nbrx) ! radial beta_{mu} functions
INTEGER :: &
paw_nh, & ! number of beta functions per atomic type
paw_nbeta, & ! number of beta functions
paw_kkbeta, & ! point where the beta are zero
paw_lll(nbrx) ! angular momentum of the beta function
INTEGER, POINTER ::&
paw_indv(:), & ! correspondence of betas atomic <-> soli
paw_nhtol(:), & ! correspondence n <-> angular momentum
paw_nhtom(:), & ! correspondence n <-> magnetic angular m
paw_nl(:), & ! number of projectors for each l
paw_iltonh(:,:) ! corresp l, num <--> n for each type
REAL(DP), POINTER :: &
paw_tab(:,:) ! interpolation table for PPs
REAL(DP), POINTER :: &
paw_tab_d2y(:,:) ! for cubic splines
TYPE ( at_wfc ), POINTER :: aephi(:)
TYPE ( at_wfc ), POINTER :: psphi(:)
LOGICAL :: vloc_present
REAL(dp), POINTER :: gipaw_ae_vloc(:)
REAL(dp), POINTER :: gipaw_ps_vloc(:)
LOGICAL :: gipaw_data_in_upf_file
INTEGER :: gipaw_ncore_orbital
REAL(dp), POINTER :: gipaw_core_orbital(:,:)
INTEGER, POINTER :: gipaw_core_orbital_l(:)
END TYPE paw_recon_type
TYPE ( paw_recon_type ), ALLOCATABLE :: paw_recon(:)
CONTAINS
SUBROUTINE paw_wfc_init(phi)
!
! Initialize default values for labe end kkpsi
!
implicit none
! Argument
TYPE ( at_wfc ), INTENT ( INOUT ) :: phi(:)
phi(:)%label%na = 0
phi(:)%label%nt = 0
phi(:)%label%n = 0
phi(:)%label%l = -99
phi(:)%label%m = -99
phi(:)%label%nrc = 0
phi(:)%kkpsi = 0
END SUBROUTINE paw_wfc_init
!****************************************************************************
subroutine read_recon ( filerec_sp, jtyp, paw_recon_sp )
!
! Read all-electron and pseudo atomic wavefunctions
! needed for PAW reconstruction
!
use read_upf_v1_module, only : scan_begin, scan_end
use atom, only : rgrid
USE io_global, ONLY : stdout
IMPLICIT NONE
! Arguments
CHARACTER ( LEN = 256 ), INTENT ( IN ) :: filerec_sp
INTEGER, INTENT ( IN ) :: jtyp
TYPE ( paw_recon_type ), INTENT ( INOUT ) :: paw_recon_sp
! Local
INTEGER :: j, i, kkphi, ios
! If the data has already been read from a UPF file
IF ( paw_recon_sp%gipaw_data_in_upf_file ) RETURN
OPEN ( 14, FILE = filerec_sp, iostat=ios, status='OLD' )
IF(ios/=0) CALL errore("paw_gipaw", "could not open "//TRIM(filerec_sp),1)
CALL scan_begin ( 14, 'PAW', .true. )
READ(14,*,iostat=ios) paw_recon_sp%paw_nbeta
IF(ios/=0) CALL errore("paw_gipaw", "could not read "//TRIM(filerec_sp),1)
CALL scan_end ( 14, 'PAW' )
CLOSE ( 14 )
ALLOCATE ( paw_recon_sp%psphi(paw_recon_sp%paw_nbeta) )
ALLOCATE ( paw_recon_sp%aephi(paw_recon_sp%paw_nbeta) )
CALL paw_wfc_init ( paw_recon_sp%psphi )
CALL paw_wfc_init ( paw_recon_sp%aephi )
OPEN ( 14, FILE = filerec_sp )
WRITE (stdout,*) "N_AEwfc atom",jtyp,":", paw_recon_sp%paw_nbeta
recphi_loop: DO i = 1, paw_recon_sp%paw_nbeta
ALLOCATE ( paw_recon_sp%aephi(i)%psi(rgrid(jtyp)%mesh) )
paw_recon_sp%aephi(i)%label%nt=jtyp
paw_recon_sp%aephi(i)%label%n=i
CALL scan_begin(14,'REC',.false.)
CALL scan_begin(14,'kkbeta',.false.)
read(14,*) kkphi
CALL scan_end(14,'kkbeta')
paw_recon_sp%aephi(i)%kkpsi=kkphi
CALL scan_begin(14,'L',.false.)
read(14,*) paw_recon_sp%aephi(i)%label%l
CALL scan_end(14,'L')
CALL scan_begin(14,'REC_AE',.false.)
read(14,*) ( paw_recon_sp%aephi(i)%psi(j),j=1,kkphi)
CALL scan_end(14,'REC_AE')
ALLOCATE ( paw_recon_sp%psphi(i)%psi(rgrid(jtyp)%mesh) )
paw_recon_sp%psphi(i)%label%nt = jtyp
paw_recon_sp%psphi(i)%label%n = i
paw_recon_sp%psphi(i)%label%l = paw_recon_sp%aephi(i)%label%l
paw_recon_sp%psphi(i)%kkpsi = kkphi
CALL scan_begin(14,'REC_PS',.false.)
READ(14,*) ( paw_recon_sp%psphi(i)%psi(j),j=1,kkphi)
CALL scan_end(14,'REC_PS')
CALL scan_end(14,'REC')
END DO recphi_loop
CLOSE(14)
END SUBROUTINE read_recon
!****************************************************************************
subroutine set_paw_upf ( is, upf)
!
! interface between the UPF pseudo type and the internal representation
! of the PAW-related variables
!
USE pseudo_types
USE ions_base, ONLY : nsp
USE atom, ONLY: rgrid
implicit none
!
INTEGER, INTENT(IN) :: is
TYPE (pseudo_upf) :: upf
!
INTEGER :: nb
!
IF ( upf%has_gipaw ) THEN
IF ( .NOT. ALLOCATED ( paw_recon ) ) THEN !CG
ALLOCATE ( paw_recon(nsp) )
paw_recon(:)%gipaw_data_in_upf_file = .FALSE.
END IF
paw_recon(is)%paw_nbeta = upf%gipaw_wfs_nchannels
paw_recon(is)%vloc_present = .TRUE.
paw_recon(is)%gipaw_data_in_upf_file = .TRUE.
paw_recon(is)%gipaw_ncore_orbital = upf%gipaw_ncore_orbitals
ALLOCATE ( paw_recon(is)%gipaw_core_orbital(upf%mesh,upf%gipaw_ncore_orbitals) )
ALLOCATE ( paw_recon(is)%gipaw_core_orbital_l(upf%gipaw_ncore_orbitals) )
paw_recon(is)%gipaw_core_orbital(:upf%mesh,:upf%gipaw_ncore_orbitals) &
= upf%gipaw_core_orbital(:upf%mesh,:upf%gipaw_ncore_orbitals)
paw_recon(is)%gipaw_core_orbital_l(:upf%gipaw_ncore_orbitals) &
= upf%gipaw_core_orbital_l(:upf%gipaw_ncore_orbitals)
ALLOCATE ( paw_recon(is)%gipaw_ae_vloc(upf%mesh) )
ALLOCATE ( paw_recon(is)%gipaw_ps_vloc(upf%mesh) )
paw_recon(is)%gipaw_ae_vloc(:upf%mesh) = upf%gipaw_vlocal_ae(:upf%mesh)
paw_recon(is)%gipaw_ps_vloc(:upf%mesh) = upf%gipaw_vlocal_ps(:upf%mesh)
ALLOCATE ( paw_recon(is)%aephi(upf%gipaw_wfs_nchannels) )
ALLOCATE ( paw_recon(is)%psphi(upf%gipaw_wfs_nchannels) )
DO nb = 1, upf%gipaw_wfs_nchannels
ALLOCATE ( paw_recon(is)%aephi(nb)%psi(rgrid(is)%mesh) )
paw_recon(is)%aephi(nb)%label%nt = is
paw_recon(is)%aephi(nb)%label%n = nb
paw_recon(is)%aephi(nb)%label%l = upf%gipaw_wfs_ll(nb)
!paw_recon(is)%aephi(nb)%label%m =
paw_recon(is)%aephi(nb)%label%nrc = upf%mesh
paw_recon(is)%aephi(nb)%kkpsi = upf%mesh
paw_recon(is)%aephi(nb)%label%rc = upf%gipaw_wfs_rcut(nb)
paw_recon(is)%aephi(nb)%psi(:upf%mesh) = upf%gipaw_wfs_ae(:upf%mesh,nb)
ALLOCATE ( paw_recon(is)%psphi(nb)%psi(rgrid(is)%mesh) )
paw_recon(is)%psphi(nb)%label%nt = is
paw_recon(is)%psphi(nb)%label%n = nb
paw_recon(is)%psphi(nb)%label%l = upf%gipaw_wfs_ll(nb)
!paw_recon(is)%psphi(nb)%label%m =
paw_recon(is)%psphi(nb)%label%nrc = upf%mesh
paw_recon(is)%psphi(nb)%kkpsi = upf%mesh
paw_recon(is)%psphi(nb)%label%rc = upf%gipaw_wfs_rcutus(nb)
paw_recon(is)%psphi(nb)%psi(:upf%mesh) = upf%gipaw_wfs_ps(:upf%mesh,nb)
!FC
paw_recon(is)%paw_betar(:,nb) = 0.0_dp
paw_recon(is)%paw_betar(:upf%mesh,nb) = upf%beta(:upf%mesh,nb)
END DO
END IF
!
END SUBROUTINE set_paw_upf
END MODULE paw_gipaw