mirror of https://gitlab.com/QEF/q-e.git
283 lines
15 KiB
Fortran
283 lines
15 KiB
Fortran
!
|
|
! Copyright (C) 2002-2008 Quantum ESPRESSO 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 pseudo_types
|
|
|
|
! this module contains the definitions of several TYPE structures,
|
|
! together with their allocation/deallocation routines
|
|
|
|
USE kinds, ONLY: DP
|
|
use radial_grids, ONLY: radial_grid_type
|
|
|
|
IMPLICIT NONE
|
|
SAVE
|
|
!
|
|
! Additional data to make a PAW setup out of an US pseudo,
|
|
! they are all stored on a radial grid:
|
|
TYPE paw_in_upf
|
|
REAL(DP),POINTER :: ae_rho_atc(:) ! AE core charge (pseudo ccharge
|
|
! is already included in upf)
|
|
REAL(DP),POINTER :: pfunc(:,:,:),&! Psi_i(r)*Psi_j(r)
|
|
ptfunc(:,:,:) ! as above, but for pseudo
|
|
REAL(DP),POINTER :: ae_vloc(:) ! AE local potential (pseudo vloc
|
|
! is already included in upf)
|
|
REAL(DP),POINTER :: oc(:) ! starting occupation used to init becsum
|
|
! they differ from US ones because they
|
|
! are indexed on BETA functions, non on WFC
|
|
REAL(DP),POINTER :: augmom(:,:,:) ! multipole AE-pseudo (i,j,l=0:2*lmax)
|
|
REAL(DP) :: raug ! augfunction max radius
|
|
INTEGER :: iraug ! index on rgrid closer to, and >, raug
|
|
INTEGER :: lmax_aug ! max angmom of augmentation functions, it is ==
|
|
! to 2* max{l of pseudized wavefunctions}
|
|
! note that nqlc of upf also includes the angmom of
|
|
! empty virtual channel used to generate local potential
|
|
REAL(DP) :: core_energy ! constant to add in order to get all-electron energy
|
|
CHARACTER(len=12):: augshape ! shape of augmentation charge
|
|
END TYPE paw_in_upf
|
|
|
|
|
|
TYPE pseudo_upf
|
|
CHARACTER(LEN=80):: generated='' ! generator software
|
|
CHARACTER(LEN=80):: author='' ! pseudopotential's author
|
|
CHARACTER(LEN=80):: date='' ! generation date
|
|
CHARACTER(LEN=80):: comment='' ! author's comment
|
|
CHARACTER(LEN=2) :: psd='' ! Element label
|
|
CHARACTER(LEN=20) :: typ='' ! Pseudo type ( NC or US or PAW)
|
|
CHARACTER(len=6) :: rel='' ! relativistic: {no|scalar|full}
|
|
LOGICAL :: tvanp ! .true. if Ultrasoft
|
|
LOGICAL :: tcoulombp ! .true. if Coulomb 1/r potential
|
|
LOGICAL :: nlcc ! Non linear core corrections
|
|
CHARACTER(LEN=20) :: dft ! Exch-Corr type
|
|
REAL(DP) :: zp ! z valence
|
|
REAL(DP) :: etotps ! total energy
|
|
REAL(DP) :: ecutwfc ! suggested cut-off for wfc
|
|
REAL(DP) :: ecutrho ! suggested cut-off for rho
|
|
!
|
|
CHARACTER(len=11) :: nv ! UPF file three-digit version i.e. 2.0.0
|
|
INTEGER :: lmax ! maximum l component in beta
|
|
INTEGER :: lmax_rho ! max l componet in charge (should be 2*lmax)
|
|
! Wavefunctions and projectors
|
|
INTEGER :: nwfc ! number of atomic wavefunctions
|
|
INTEGER :: nbeta ! number of projectors
|
|
INTEGER, POINTER :: kbeta(:) ! kbeta(nbeta) see below
|
|
INTEGER :: kkbeta ! kkbeta=max(kbeta(:))
|
|
! kbeta<=mesh is the number of grid points for each beta function
|
|
! beta(r,nb) = 0 for r > r(kbeta(nb))
|
|
! kkbeta<=mesh is the largest of such number so that for all beta
|
|
! beta(r,nb) = 0 for r > r(kkbeta)
|
|
!
|
|
INTEGER, POINTER :: lll(:) ! lll(nbeta) l of each projector
|
|
REAL(DP), POINTER :: beta(:,:) ! beta(mesh,nbeta) projectors
|
|
!
|
|
CHARACTER(LEN=2), POINTER :: els(:) ! els(nwfc) label of wfc
|
|
CHARACTER(LEN=2), POINTER :: els_beta(:) ! els(nbeta) label of beta
|
|
INTEGER, POINTER :: nchi(:) ! lchi(nwfc) value of pseudo-n for wavefcts
|
|
INTEGER, POINTER :: lchi(:) ! lchi(nwfc) value of l for wavefcts
|
|
REAL(DP), POINTER :: oc(:) ! oc(nwfc) occupancies for wavefcts
|
|
REAL(DP), POINTER :: epseu(:) ! pseudo one-particle energy (nwfc)
|
|
REAL(DP), POINTER :: rcut_chi(:)! rcut_chi(nwfc) cutoff innner radius
|
|
REAL(DP), POINTER :: rcutus_chi(:)! rcutus_chi(nwfc) ultrasoft outer radius
|
|
! Chi and rho_at are only used for initial density and initial wfcs:
|
|
REAL(DP), POINTER :: chi(:,:) ! chi(mesh,nwfc) atomic wavefcts
|
|
REAL(DP), POINTER :: rho_at(:) ! rho_at(mesh) atomic charge
|
|
! Minimal radial grid:
|
|
INTEGER :: mesh ! number of points in the radial mesh
|
|
REAL(DP) :: xmin ! the minimum x of the linear mesh
|
|
REAL(DP) :: rmax ! the maximum radius of the mesh
|
|
REAL(DP) :: zmesh ! the nuclear charge used for mesh
|
|
REAL(DP) :: dx ! the deltax of the linear mesh
|
|
REAL(DP), POINTER :: r(:) ! r(mesh) radial grid
|
|
REAL(DP), POINTER :: rab(:) ! rab(mesh) dr(x)/dx (x=linear grid)
|
|
! Pseudized core charge
|
|
REAL(DP), POINTER :: rho_atc(:) ! rho_atc(mesh) atomic core charge
|
|
! Local potential
|
|
INTEGER :: lloc ! L of channel used to generate local potential
|
|
! (if < 0 it was generated by smoothing AE potential)
|
|
REAL(DP) :: rcloc ! vloc = v_ae for r > rcloc
|
|
REAL(DP), POINTER :: vloc(:) ! vloc(mesh) local atomic potential
|
|
!
|
|
REAL(DP), POINTER :: dion(:,:) ! dion(nbeta,nbeta) atomic D_{mu,nu}
|
|
! Augmentation
|
|
LOGICAL :: q_with_l ! if .true. qfunc is pseudized in
|
|
! different ways for different l
|
|
INTEGER :: nqf ! number of Q coefficients
|
|
INTEGER :: nqlc ! number of angular momenta in Q
|
|
REAL(DP):: qqq_eps ! qfunc is null if its norm is .lt. qqq_eps
|
|
REAL(DP), POINTER :: rinner(:) ! rinner(0:2*lmax) r_L
|
|
REAL(DP), POINTER :: qqq(:,:) ! qqq(nbeta,nbeta) q_{mu,nu}
|
|
! Augmentation without L dependecy
|
|
REAL(DP), POINTER :: qfunc(:,:) ! qfunc(mesh,nbeta*(nbeta+1)/2)
|
|
! Q_{mu,nu}(|r|) function for |r|> r_L
|
|
! Augmentation depending on L (optional, compulsory for PAW)
|
|
REAL(DP), POINTER :: qfuncl(:,:,:)! qfuncl(mesh,nbeta*(nbeta+1)/2,l)
|
|
! Q_{mu,nu}(|r|) function for |r|> r_L
|
|
! Analitycal coeffs cor small r expansion of qfunc (Vanderbilt's code)
|
|
REAL(DP), POINTER :: qfcoef(:,:,:,:) ! qfcoef(nqf,0:2*lmax,nbeta,nbeta)
|
|
! coefficients for Q for |r|<r_L
|
|
! All electron and pseudo wavefunction, pswfc differ from chi as they are
|
|
! one for each beta, not just some choosen for initial conditions
|
|
LOGICAL :: has_wfc ! if true, UPF contain AE and PS wfc for each beta
|
|
REAL(DP), POINTER :: aewfc(:,:) ! wfc(mesh,nbeta) all-electron wfc
|
|
REAL(DP), POINTER :: pswfc(:,:) ! wfc(mesh,nbeta) pseudo wfc
|
|
|
|
LOGICAL :: has_so ! if .true. includes spin-orbit
|
|
INTEGER, POINTER :: nn(:) ! nn(nwfc) quantum number of wfc
|
|
REAL(DP), POINTER :: rcut(:) ! cut-off radius(nbeta)
|
|
REAL(DP), POINTER :: rcutus(:)! ultrasoft cut-off radius (nbeta)
|
|
REAL(DP), POINTER :: jchi(:) ! jchi(nwfc) j=l+1/2 or l-1/2 of wfc
|
|
REAL(DP), POINTER :: jjj(:) ! jjj(nbeta) j=l+1/2 or l-1/2 of beta
|
|
|
|
! PAW:
|
|
INTEGER :: paw_data_format ! The version of the format
|
|
LOGICAL :: tpawp ! true if atom is PAW, PAW data must be present
|
|
TYPE(paw_in_upf) :: paw ! additional data for PAW (see above)
|
|
TYPE(radial_grid_type),POINTER :: grid ! pointer to the corresponding grid
|
|
! in radial_grids module
|
|
|
|
! GIPAW:
|
|
LOGICAL :: has_gipaw ! Whether GIPAW data is included
|
|
INTEGER :: gipaw_data_format ! The version of the format
|
|
INTEGER :: gipaw_ncore_orbitals
|
|
REAL(DP), POINTER :: gipaw_core_orbital_n(:)
|
|
REAL(DP), POINTER :: gipaw_core_orbital_l(:)
|
|
CHARACTER(LEN=2), POINTER :: gipaw_core_orbital_el(:)
|
|
REAL(DP), POINTER :: gipaw_core_orbital(:,:)
|
|
REAL(DP), POINTER :: gipaw_vlocal_ae(:)
|
|
REAL(DP), POINTER :: gipaw_vlocal_ps(:)
|
|
INTEGER :: gipaw_wfs_nchannels
|
|
CHARACTER(LEN=2), POINTER :: gipaw_wfs_el(:)
|
|
INTEGER, POINTER :: gipaw_wfs_ll(:)
|
|
REAL(DP), POINTER :: gipaw_wfs_ae(:,:)
|
|
REAL(DP), POINTER :: gipaw_wfs_rcut(:)
|
|
REAL(DP), POINTER :: gipaw_wfs_rcutus(:)
|
|
REAL(DP), POINTER :: gipaw_wfs_ps(:,:)
|
|
END TYPE
|
|
|
|
CONTAINS
|
|
|
|
SUBROUTINE nullify_paw_in_upf( paw )
|
|
TYPE( paw_in_upf ), INTENT(INOUT) :: paw
|
|
NULLIFY( paw%ae_rho_atc )
|
|
NULLIFY( paw%pfunc )
|
|
NULLIFY( paw%ptfunc )
|
|
NULLIFY( paw%ae_vloc )
|
|
NULLIFY( paw%augmom )
|
|
NULLIFY( paw%oc )
|
|
END SUBROUTINE nullify_paw_in_upf
|
|
|
|
SUBROUTINE deallocate_paw_in_upf( paw )
|
|
TYPE( paw_in_upf ), INTENT(INOUT) :: paw
|
|
IF( ASSOCIATED( paw%ae_rho_atc ) ) DEALLOCATE ( paw%ae_rho_atc )
|
|
IF( ASSOCIATED( paw%pfunc ) ) DEALLOCATE ( paw%pfunc )
|
|
IF( ASSOCIATED( paw%ptfunc ) ) DEALLOCATE ( paw%ptfunc )
|
|
IF( ASSOCIATED( paw%ae_vloc ) ) DEALLOCATE ( paw%ae_vloc )
|
|
IF( ASSOCIATED( paw%augmom ) ) DEALLOCATE ( paw%augmom )
|
|
IF( ASSOCIATED( paw%oc ) ) DEALLOCATE ( paw%oc )
|
|
END SUBROUTINE deallocate_paw_in_upf
|
|
!
|
|
!
|
|
SUBROUTINE nullify_pseudo_upf( upf )
|
|
TYPE( pseudo_upf ), INTENT(INOUT) :: upf
|
|
CALL nullify_paw_in_upf( upf%paw )
|
|
NULLIFY( upf%grid )
|
|
NULLIFY( upf%els, upf%lchi, upf%nchi, upf%jchi, upf%oc )
|
|
NULLIFY( upf%r, upf%rab )
|
|
NULLIFY( upf%rho_atc, upf%vloc )
|
|
NULLIFY( upf%nn)
|
|
NULLIFY( upf%els_beta)
|
|
NULLIFY( upf%rcut, upf%rcutus, upf%rcut_chi, upf%rcutus_chi )
|
|
NULLIFY( upf%epseu)
|
|
NULLIFY( upf%lll, upf%jjj, upf%kbeta, upf%beta, upf%dion )
|
|
NULLIFY( upf%aewfc, upf%pswfc )
|
|
NULLIFY( upf%rinner, upf%qqq, upf%qfunc, upf%qfuncl, upf%qfcoef )
|
|
NULLIFY( upf%chi )
|
|
NULLIFY( upf%rho_at )
|
|
NULLIFY ( upf%gipaw_core_orbital_n )
|
|
NULLIFY ( upf%gipaw_core_orbital_l )
|
|
NULLIFY ( upf%gipaw_core_orbital_el )
|
|
NULLIFY ( upf%gipaw_core_orbital )
|
|
NULLIFY ( upf%gipaw_vlocal_ae )
|
|
NULLIFY ( upf%gipaw_vlocal_ps )
|
|
NULLIFY ( upf%gipaw_wfs_el )
|
|
NULLIFY ( upf%gipaw_wfs_ll )
|
|
NULLIFY ( upf%gipaw_wfs_ae )
|
|
NULLIFY ( upf%gipaw_wfs_rcut )
|
|
NULLIFY ( upf%gipaw_wfs_rcutus )
|
|
NULLIFY ( upf%gipaw_wfs_ps )
|
|
RETURN
|
|
END SUBROUTINE nullify_pseudo_upf
|
|
|
|
SUBROUTINE deallocate_pseudo_upf( upf )
|
|
TYPE( pseudo_upf ), INTENT(INOUT) :: upf
|
|
CALL deallocate_paw_in_upf( upf%paw )
|
|
IF( ASSOCIATED( upf%els ) ) DEALLOCATE( upf%els )
|
|
IF( ASSOCIATED( upf%lchi ) ) DEALLOCATE( upf%lchi )
|
|
IF( ASSOCIATED( upf%nchi ) ) DEALLOCATE( upf%nchi )
|
|
IF( ASSOCIATED( upf%jchi ) ) DEALLOCATE( upf%jchi )
|
|
IF( ASSOCIATED( upf%oc ) ) DEALLOCATE( upf%oc )
|
|
!
|
|
IF(ASSOCIATED(upf%grid)) THEN
|
|
IF( ASSOCIATED( upf%r ) ) NULLIFY( upf%r )
|
|
IF( ASSOCIATED( upf%rab ) ) NULLIFY( upf%rab )
|
|
NULLIFY(upf%grid)
|
|
ELSE
|
|
IF( ASSOCIATED( upf%r ) ) DEALLOCATE( upf%r )
|
|
IF( ASSOCIATED( upf%rab ) ) DEALLOCATE( upf%rab )
|
|
ENDIF
|
|
!
|
|
IF( ASSOCIATED( upf%nn ) ) DEALLOCATE( upf%nn )
|
|
IF( ASSOCIATED( upf%els_beta ) )DEALLOCATE( upf%els_beta )
|
|
IF( ASSOCIATED( upf%rcut_chi ) ) DEALLOCATE( upf%rcut_chi )
|
|
IF( ASSOCIATED( upf%rcutus_chi ) )DEALLOCATE( upf%rcutus_chi )
|
|
IF( ASSOCIATED( upf%rcut ) ) DEALLOCATE( upf%rcut )
|
|
IF( ASSOCIATED( upf%rcutus ) ) DEALLOCATE( upf%rcutus )
|
|
IF( ASSOCIATED( upf%epseu ) ) DEALLOCATE( upf%epseu )
|
|
IF( ASSOCIATED( upf%rho_atc ) ) DEALLOCATE( upf%rho_atc )
|
|
IF( ASSOCIATED( upf%vloc ) ) DEALLOCATE( upf%vloc )
|
|
IF( ASSOCIATED( upf%lll ) ) DEALLOCATE( upf%lll )
|
|
IF( ASSOCIATED( upf%jjj ) ) DEALLOCATE( upf%jjj )
|
|
IF( ASSOCIATED( upf%kbeta ) ) DEALLOCATE( upf%kbeta )
|
|
IF( ASSOCIATED( upf%beta ) ) DEALLOCATE( upf%beta )
|
|
IF( ASSOCIATED( upf%aewfc ) ) DEALLOCATE( upf%aewfc )
|
|
IF( ASSOCIATED( upf%pswfc ) ) DEALLOCATE( upf%pswfc )
|
|
IF( ASSOCIATED( upf%dion ) ) DEALLOCATE( upf%dion )
|
|
IF( ASSOCIATED( upf%rinner ) ) DEALLOCATE( upf%rinner )
|
|
IF( ASSOCIATED( upf%qqq ) ) DEALLOCATE( upf%qqq )
|
|
IF( ASSOCIATED( upf%qfunc ) ) DEALLOCATE( upf%qfunc )
|
|
IF( ASSOCIATED( upf%qfuncl ) ) DEALLOCATE( upf%qfuncl )
|
|
IF( ASSOCIATED( upf%qfcoef ) ) DEALLOCATE( upf%qfcoef )
|
|
IF( ASSOCIATED( upf%chi ) ) DEALLOCATE( upf%chi )
|
|
IF( ASSOCIATED( upf%rho_at ) ) DEALLOCATE( upf%rho_at )
|
|
IF ( ASSOCIATED ( upf%gipaw_core_orbital_n ) ) &
|
|
DEALLOCATE ( upf%gipaw_core_orbital_n )
|
|
IF ( ASSOCIATED ( upf%gipaw_core_orbital_l ) ) &
|
|
DEALLOCATE ( upf%gipaw_core_orbital_l )
|
|
IF ( ASSOCIATED ( upf%gipaw_core_orbital_el ) ) &
|
|
DEALLOCATE ( upf%gipaw_core_orbital_el )
|
|
IF ( ASSOCIATED ( upf%gipaw_core_orbital ) ) &
|
|
DEALLOCATE ( upf%gipaw_core_orbital )
|
|
IF ( ASSOCIATED ( upf%gipaw_vlocal_ae ) ) &
|
|
DEALLOCATE ( upf%gipaw_vlocal_ae )
|
|
IF ( ASSOCIATED ( upf%gipaw_vlocal_ps ) ) &
|
|
DEALLOCATE ( upf%gipaw_vlocal_ps )
|
|
IF ( ASSOCIATED ( upf%gipaw_wfs_el ) ) &
|
|
DEALLOCATE ( upf%gipaw_wfs_el )
|
|
IF ( ASSOCIATED ( upf%gipaw_wfs_ll ) ) &
|
|
DEALLOCATE ( upf%gipaw_wfs_ll )
|
|
IF ( ASSOCIATED ( upf%gipaw_wfs_ae ) ) &
|
|
DEALLOCATE ( upf%gipaw_wfs_ae )
|
|
IF ( ASSOCIATED ( upf%gipaw_wfs_rcut ) ) &
|
|
DEALLOCATE ( upf%gipaw_wfs_rcut )
|
|
IF ( ASSOCIATED ( upf%gipaw_wfs_rcutus ) ) &
|
|
DEALLOCATE ( upf%gipaw_wfs_rcutus )
|
|
IF ( ASSOCIATED ( upf%gipaw_wfs_ps ) ) &
|
|
DEALLOCATE ( upf%gipaw_wfs_ps )
|
|
RETURN
|
|
END SUBROUTINE deallocate_pseudo_upf
|
|
|
|
END MODULE pseudo_types
|