1! 2! Copyright (C) 2002-2008 Quantum ESPRESSO group 3! This file is distributed under the terms of the 4! GNU General Public License. See the file `License' 5! in the root directory of the present distribution, 6! or http://www.gnu.org/copyleft/gpl.txt . 7! 8MODULE pseudo_types 9 10 ! this module contains the definitions of several TYPE structures, 11 ! together with their allocation/deallocation routines 12 13 USE upf_kinds, ONLY: DP 14 15 IMPLICIT NONE 16 SAVE 17 ! 18 ! Additional data to make a PAW setup out of an US pseudo, 19 ! they are all stored on a radial grid: 20 TYPE paw_in_upf 21 REAL(DP),ALLOCATABLE :: ae_rho_atc(:) ! AE core charge (pseudo ccharge 22 ! is already included in upf) 23 REAL(DP),ALLOCATABLE :: pfunc(:,:,:),&! Psi_i(r)*Psi_j(r) 24 pfunc_rel(:,:,:), & ! Psi_i(r)*Psi_j(r) small component 25 ptfunc(:,:,:), & ! as above, but for pseudo 26 aewfc_rel(:,:) ! as above, but for pseudo 27 REAL(DP),ALLOCATABLE :: ae_vloc(:) ! AE local potential (pseudo vloc 28 ! is already included in upf) 29 REAL(DP),ALLOCATABLE :: oc(:) ! starting occupation used to init becsum 30 ! they differ from US ones because they 31 ! are indexed on BETA functions, non on WFC 32 REAL(DP),ALLOCATABLE :: augmom(:,:,:) ! multipole AE-pseudo (i,j,l=0:2*lmax) 33 REAL(DP) :: raug ! augfunction max radius 34 INTEGER :: iraug ! index on rgrid closer to, and >, raug 35 INTEGER :: lmax_aug ! max angmom of augmentation functions, it is == 36 ! to 2* max{l of pseudized wavefunctions} 37 ! note that nqlc of upf also includes the angmom of 38 ! empty virtual channel used to generate local potential 39 REAL(DP) :: core_energy ! constant to add in order to get all-electron energy 40 CHARACTER(len=12):: augshape ! shape of augmentation charge 41 END TYPE paw_in_upf 42 43 44 TYPE pseudo_upf 45 CHARACTER(LEN=80):: generated=' '! generator software 46 CHARACTER(LEN=80):: author=' ' ! pseudopotential's author 47 CHARACTER(LEN=80):: date=' ' ! generation date 48 CHARACTER(LEN=80):: comment=' ' ! author's comment 49 CHARACTER(LEN=2) :: psd=' ' ! Element label 50 CHARACTER(LEN=20):: typ=' ' ! Pseudo type ( NC or US or PAW) 51 CHARACTER(len=6) :: rel=' ' ! relativistic: {no|scalar|full} 52 LOGICAL :: tvanp ! .true. if Ultrasoft 53 LOGICAL :: tcoulombp ! .true. if Coulomb 1/r potential 54 LOGICAL :: nlcc ! Non linear core corrections 55 LOGICAL :: is_gth ! .true. if Goedecker-Teter-Hutter 56 LOGICAL :: is_multiproj ! .true. if multiple projectors per l 57 ! (for NC PP only; US-PP and PAW are assumed to be multi-projector) 58 CHARACTER(LEN=25) :: dft ! Exch-Corr type 59 REAL(DP) :: zp ! z valence 60 REAL(DP) :: etotps ! total energy 61 REAL(DP) :: ecutwfc ! suggested cut-off for wfc 62 REAL(DP) :: ecutrho ! suggested cut-off for rho 63 ! 64 CHARACTER(len=11) :: nv ! UPF file three-digit version i.e. 2.0.0 65 INTEGER :: lmax ! maximum l component in beta 66 INTEGER :: lmax_rho ! max l component in charge (should be 2*lmax) 67 REAL(DP), ALLOCATABLE :: vnl(:,:,:) ! vnl(i,l,s) = V(r_i)_{ls} 68 ! (semilocal form) only for single-channel NC PP 69 ! Wavefunctions and projectors 70 INTEGER :: nwfc ! number of atomic wavefunctions 71 INTEGER :: nbeta ! number of projectors 72 INTEGER, ALLOCATABLE :: kbeta(:) ! kbeta(nbeta) see below 73 INTEGER :: kkbeta ! kkbeta=max(kbeta(:)) 74 ! kbeta<=mesh is the number of grid points for each beta function 75 ! beta(r,nb) = 0 for r > r(kbeta(nb)) 76 ! kkbeta<=mesh is the largest of such number so that for all beta 77 ! beta(r,nb) = 0 for r > r(kkbeta) 78 ! 79 INTEGER, ALLOCATABLE :: lll(:) ! lll(nbeta) l of each projector 80 REAL(DP), ALLOCATABLE :: beta(:,:) ! beta(mesh,nbeta) projectors 81 ! 82 CHARACTER(LEN=2), ALLOCATABLE :: els(:) ! els(nwfc) label of wfc 83 CHARACTER(LEN=2), ALLOCATABLE :: els_beta(:) ! els(nbeta) label of beta 84 INTEGER, ALLOCATABLE :: nchi(:) ! lchi(nwfc) value of pseudo-n for wavefcts 85 INTEGER, ALLOCATABLE :: lchi(:) ! lchi(nwfc) value of l for wavefcts 86 REAL(DP), ALLOCATABLE :: oc(:) ! oc(nwfc) occupancies for wavefcts 87 REAL(DP), ALLOCATABLE :: epseu(:) ! pseudo one-particle energy (nwfc) 88 REAL(DP), ALLOCATABLE :: rcut_chi(:)! rcut_chi(nwfc) cutoff inner radius 89 REAL(DP), ALLOCATABLE :: rcutus_chi(:)! rcutus_chi(nwfc) ultrasoft outer radius 90 ! Chi and rho_at are only used for initial density and initial wfcs: 91 REAL(DP), ALLOCATABLE :: chi(:,:) ! chi(mesh,nwfc) atomic wavefcts 92 REAL(DP), ALLOCATABLE :: rho_at(:) ! rho_at(mesh) atomic charge 93 ! Minimal radial grid: 94 INTEGER :: mesh ! number of points in the radial mesh 95 REAL(DP) :: xmin ! the minimum x of the linear mesh 96 REAL(DP) :: rmax ! the maximum radius of the mesh 97 REAL(DP) :: zmesh ! the nuclear charge used for mesh 98 REAL(DP) :: dx ! the deltax of the linear mesh 99 REAL(DP), ALLOCATABLE :: r(:) ! r(mesh) radial grid 100 REAL(DP), ALLOCATABLE :: rab(:) ! rab(mesh) dr(x)/dx (x=linear grid) 101 ! Pseudized core charge 102 REAL(DP), ALLOCATABLE :: rho_atc(:) ! rho_atc(mesh) atomic core charge 103 ! Local potential 104 INTEGER :: lloc ! L of channel used to generate local potential 105 ! (if < 0 it was generated by smoothing AE potential) 106 REAL(DP) :: rcloc ! vloc = v_ae for r > rcloc 107 REAL(DP), ALLOCATABLE :: vloc(:) ! vloc(mesh) local atomic potential 108 ! 109 REAL(DP), ALLOCATABLE :: dion(:,:) ! dion(nbeta,nbeta) atomic D_{mu,nu} 110 ! Augmentation 111 LOGICAL :: q_with_l ! if .true. qfunc is pseudized in 112 ! different ways for different l 113 INTEGER :: nqf ! number of Q coefficients 114 INTEGER :: nqlc ! number of angular momenta in Q 115 REAL(DP):: qqq_eps ! qfunc is null if its norm is .lt. qqq_eps 116 REAL(DP), ALLOCATABLE :: rinner(:) ! rinner(0:2*lmax) r_L 117 REAL(DP), ALLOCATABLE :: qqq(:,:) ! qqq(nbeta,nbeta) q_{mu,nu} 118 ! Augmentation without L dependecy 119 REAL(DP), ALLOCATABLE :: qfunc(:,:) ! qfunc(mesh,nbeta*(nbeta+1)/2) 120 ! Q_{mu,nu}(|r|) function for |r|> r_L 121 ! Augmentation depending on L (optional, compulsory for PAW) 122 REAL(DP), ALLOCATABLE :: qfuncl(:,:,:)! qfuncl(mesh,nbeta*(nbeta+1)/2,l) 123 ! Q_{mu,nu}(|r|) function for |r|> r_L 124 ! Analitycal coeffs cor small r expansion of qfunc (Vanderbilt's code) 125 REAL(DP), ALLOCATABLE :: qfcoef(:,:,:,:) ! qfcoef(nqf,0:2*lmax,nbeta,nbeta) 126 ! coefficients for Q for |r|<r_L 127 ! All electron and pseudo wavefunction, pswfc differ from chi as they are 128 ! one for each beta, not just some choosen for initial conditions 129 LOGICAL :: has_wfc ! if true, UPF contain AE and PS wfc for each beta 130 REAL(DP), ALLOCATABLE :: aewfc(:,:) ! wfc(mesh,nbeta) all-electron wfc 131 REAL(DP), ALLOCATABLE :: pswfc(:,:) ! wfc(mesh,nbeta) pseudo wfc 132 133 LOGICAL :: has_so ! if .true. includes spin-orbit 134 INTEGER, ALLOCATABLE :: nn(:) ! nn(nwfc) quantum number of wfc 135 REAL(DP), ALLOCATABLE :: rcut(:) ! cut-off radius(nbeta) 136 REAL(DP), ALLOCATABLE :: rcutus(:)! ultrasoft cut-off radius (nbeta) 137 REAL(DP), ALLOCATABLE :: jchi(:) ! jchi(nwfc) j=l+1/2 or l-1/2 of wfc 138 REAL(DP), ALLOCATABLE :: jjj(:) ! jjj(nbeta) j=l+1/2 or l-1/2 of beta 139 140 ! PAW: 141 INTEGER :: paw_data_format ! The version of the format 142 LOGICAL :: tpawp ! true if atom is PAW, PAW data must be present 143 TYPE(paw_in_upf) :: paw ! additional data for PAW (see above) 144 ! GIPAW: 145 LOGICAL :: has_gipaw ! Whether GIPAW data is included 146 LOGICAL :: paw_as_gipaw !EMINE 147 INTEGER :: gipaw_data_format ! The version of the format 148 INTEGER :: gipaw_ncore_orbitals 149 REAL(DP), ALLOCATABLE :: gipaw_core_orbital_n(:) 150 REAL(DP), ALLOCATABLE :: gipaw_core_orbital_l(:) 151 CHARACTER(LEN=2), ALLOCATABLE :: gipaw_core_orbital_el(:) 152 REAL(DP), ALLOCATABLE :: gipaw_core_orbital(:,:) 153 REAL(DP), ALLOCATABLE :: gipaw_vlocal_ae(:) 154 REAL(DP), ALLOCATABLE :: gipaw_vlocal_ps(:) 155 INTEGER :: gipaw_wfs_nchannels 156 CHARACTER(LEN=2), ALLOCATABLE :: gipaw_wfs_el(:) 157 INTEGER, ALLOCATABLE :: gipaw_wfs_ll(:) 158 REAL(DP), ALLOCATABLE :: gipaw_wfs_ae(:,:) 159 REAL(DP), ALLOCATABLE :: gipaw_wfs_rcut(:) 160 REAL(DP), ALLOCATABLE :: gipaw_wfs_rcutus(:) 161 REAL(DP), ALLOCATABLE :: gipaw_wfs_ps(:,:) 162 ! 163 ! MD5 checksum ... used to verify integrity of the information contained 164 ! in the pseudopotential file w.r.t previous run 165 ! 166 CHARACTER(len=32) :: MD5_cksum = 'NOT SET' 167 168 END TYPE pseudo_upf 169 170 TYPE pseudo_config 171 INTEGER :: nwfs 172 CHARACTER(len=32) :: pseud 173 CHARACTER(len=2),ALLOCATABLE :: els(:) ! label 174 INTEGER,ALLOCATABLE :: nns(:) ! n 175 INTEGER,ALLOCATABLE :: lls(:) ! l 176 REAL(DP),ALLOCATABLE :: ocs(:) ! occupation 177 REAL(DP),ALLOCATABLE :: rcut(:) ! NC cutoff radius 178 REAL(DP),ALLOCATABLE :: rcutus(:) ! US cutoff radius 179 REAL(DP),ALLOCATABLE :: enls(:) ! energy 180 END TYPE pseudo_config 181 182CONTAINS 183 184 SUBROUTINE deallocate_paw_in_upf( paw ) 185 TYPE( paw_in_upf ), INTENT(INOUT) :: paw 186 IF( ALLOCATED( paw%ae_rho_atc ) ) DEALLOCATE ( paw%ae_rho_atc ) 187 IF( ALLOCATED( paw%aewfc_rel ) ) DEALLOCATE (paw%aewfc_rel ) 188 IF( ALLOCATED( paw%pfunc ) ) DEALLOCATE ( paw%pfunc ) 189 IF( ALLOCATED( paw%pfunc_rel ) ) DEALLOCATE ( paw%pfunc_rel ) 190 IF( ALLOCATED( paw%ptfunc ) ) DEALLOCATE ( paw%ptfunc ) 191 IF( ALLOCATED( paw%ae_vloc ) ) DEALLOCATE ( paw%ae_vloc ) 192 IF( ALLOCATED( paw%augmom ) ) DEALLOCATE ( paw%augmom ) 193 IF( ALLOCATED( paw%oc ) ) DEALLOCATE ( paw%oc ) 194 paw%raug = 0.0 195 paw%core_energy = 0.0 196 paw%iraug = 0 197 paw%lmax_aug = 0 198 paw%augshape = ' ' 199 END SUBROUTINE deallocate_paw_in_upf 200 ! 201 SUBROUTINE deallocate_pseudo_config(conf) 202 TYPE(pseudo_config),INTENT(INOUT) :: conf 203 IF ( ALLOCATED(conf%els) ) DEALLOCATE(conf%els) 204 IF ( ALLOCATED(conf%nns) ) DEALLOCATE(conf%nns) 205 IF ( ALLOCATED(conf%lls) ) DEALLOCATE(conf%lls) 206 IF ( ALLOCATED(conf%ocs) ) DEALLOCATE(conf%ocs) 207 IF ( ALLOCATED(conf%rcut) ) DEALLOCATE(conf%rcut) 208 IF ( ALLOCATED(conf%rcutus)) DEALLOCATE(conf%rcutus) 209 IF ( ALLOCATED(conf%enls) ) DEALLOCATE(conf%enls) 210 END SUBROUTINE deallocate_pseudo_config 211 212 213 214 SUBROUTINE deallocate_pseudo_upf( upf ) 215 TYPE( pseudo_upf ), INTENT(INOUT) :: upf 216 CALL deallocate_paw_in_upf( upf%paw ) 217 IF( ALLOCATED( upf%els ) ) DEALLOCATE( upf%els ) 218 IF( ALLOCATED( upf%lchi ) ) DEALLOCATE( upf%lchi ) 219 IF( ALLOCATED( upf%nchi ) ) DEALLOCATE( upf%nchi ) 220 IF( ALLOCATED( upf%jchi ) ) DEALLOCATE( upf%jchi ) 221 IF( ALLOCATED( upf%oc ) ) DEALLOCATE( upf%oc ) 222 ! 223 IF( ALLOCATED( upf%r ) ) DEALLOCATE( upf%r ) 224 IF( ALLOCATED( upf%rab ) ) DEALLOCATE( upf%rab ) 225 ! 226 IF( ALLOCATED( upf%nn ) ) DEALLOCATE( upf%nn ) 227 IF( ALLOCATED( upf%els_beta ) )DEALLOCATE( upf%els_beta ) 228 IF( ALLOCATED( upf%rcut_chi ) ) DEALLOCATE( upf%rcut_chi ) 229 IF( ALLOCATED( upf%rcutus_chi ) )DEALLOCATE( upf%rcutus_chi ) 230 IF( ALLOCATED( upf%rcut ) ) DEALLOCATE( upf%rcut ) 231 IF( ALLOCATED( upf%rcutus ) ) DEALLOCATE( upf%rcutus ) 232 IF( ALLOCATED( upf%epseu ) ) DEALLOCATE( upf%epseu ) 233 IF( ALLOCATED( upf%rho_atc ) ) DEALLOCATE( upf%rho_atc ) 234 IF( ALLOCATED( upf%vloc ) ) DEALLOCATE( upf%vloc ) 235 IF( ALLOCATED( upf%lll ) ) DEALLOCATE( upf%lll ) 236 IF( ALLOCATED( upf%jjj ) ) DEALLOCATE( upf%jjj ) 237 IF( ALLOCATED( upf%kbeta ) ) DEALLOCATE( upf%kbeta ) 238 IF( ALLOCATED( upf%beta ) ) DEALLOCATE( upf%beta ) 239 IF( ALLOCATED( upf%vnl ) ) DEALLOCATE( upf%vnl ) 240 IF( ALLOCATED( upf%aewfc ) ) DEALLOCATE( upf%aewfc ) 241 IF( ALLOCATED( upf%pswfc ) ) DEALLOCATE( upf%pswfc ) 242 IF( ALLOCATED( upf%dion ) ) DEALLOCATE( upf%dion ) 243 IF( ALLOCATED( upf%rinner ) ) DEALLOCATE( upf%rinner ) 244 IF( ALLOCATED( upf%qqq ) ) DEALLOCATE( upf%qqq ) 245 IF( ALLOCATED( upf%qfunc ) ) DEALLOCATE( upf%qfunc ) 246 IF( ALLOCATED( upf%qfuncl ) ) DEALLOCATE( upf%qfuncl ) 247 IF( ALLOCATED( upf%qfcoef ) ) DEALLOCATE( upf%qfcoef ) 248 IF( ALLOCATED( upf%chi ) ) DEALLOCATE( upf%chi ) 249 IF( ALLOCATED( upf%rho_at ) ) DEALLOCATE( upf%rho_at ) 250 IF ( ALLOCATED ( upf%gipaw_core_orbital_n ) ) & 251 DEALLOCATE ( upf%gipaw_core_orbital_n ) 252 IF ( ALLOCATED ( upf%gipaw_core_orbital_l ) ) & 253 DEALLOCATE ( upf%gipaw_core_orbital_l ) 254 IF ( ALLOCATED ( upf%gipaw_core_orbital_el ) ) & 255 DEALLOCATE ( upf%gipaw_core_orbital_el ) 256 IF ( ALLOCATED ( upf%gipaw_core_orbital ) ) & 257 DEALLOCATE ( upf%gipaw_core_orbital ) 258 IF ( ALLOCATED ( upf%gipaw_vlocal_ae ) ) & 259 DEALLOCATE ( upf%gipaw_vlocal_ae ) 260 IF ( ALLOCATED ( upf%gipaw_vlocal_ps ) ) & 261 DEALLOCATE ( upf%gipaw_vlocal_ps ) 262 IF ( ALLOCATED ( upf%gipaw_wfs_el ) ) & 263 DEALLOCATE ( upf%gipaw_wfs_el ) 264 IF ( ALLOCATED ( upf%gipaw_wfs_ll ) ) & 265 DEALLOCATE ( upf%gipaw_wfs_ll ) 266 IF ( ALLOCATED ( upf%gipaw_wfs_ae ) ) & 267 DEALLOCATE ( upf%gipaw_wfs_ae ) 268 IF ( ALLOCATED ( upf%gipaw_wfs_rcut ) ) & 269 DEALLOCATE ( upf%gipaw_wfs_rcut ) 270 IF ( ALLOCATED ( upf%gipaw_wfs_rcutus ) ) & 271 DEALLOCATE ( upf%gipaw_wfs_rcutus ) 272 IF ( ALLOCATED ( upf%gipaw_wfs_ps ) ) & 273 DEALLOCATE ( upf%gipaw_wfs_ps ) 274 ! 275 upf%tvanp = .false. 276 upf%tcoulombp = .false. 277 upf%nlcc = .false. 278 upf%dft = ' ' 279 upf%zp = 0.0 280 upf%etotps = 0.0 281 upf%ecutwfc = 0.0 282 upf%ecutrho = 0.0 283 upf%nv = ' ' 284 upf%lmax = 0 285 upf%lmax_rho = 0 286 upf%nwfc = 0 287 upf%nbeta = 0 288 upf%kkbeta = 0 289 upf%mesh = 0 290 upf%xmin = 0.0 291 upf%rmax = 0.0 292 upf%zmesh = 0.0 293 upf%dx = 0.0 294 upf%lloc = 0 295 upf%rcloc = 0.0 296 upf%q_with_l = .false. 297 upf%nqf = 0 298 upf%nqlc = 0 299 upf%qqq_eps = 0.0 300 upf%has_wfc = .false. 301 upf%paw_data_format = 0 302 upf%tpawp = .false. 303 upf%has_gipaw = .false. 304 upf%paw_as_gipaw = .false. 305 upf%gipaw_data_format = 0 306 upf%gipaw_ncore_orbitals = 0 307 upf%gipaw_wfs_nchannels = 0 308 309 END SUBROUTINE deallocate_pseudo_upf 310 311END MODULE pseudo_types 312