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