Line data Source code
1 : !
2 : ! Copyright (C) 2001-2002 PWSCF 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 : !
8 : ! MJV 18/6/2009: imported into abinit
9 : ! commented program part
10 : ! added small module for flib utilities
11 : !
12 :
13 : #if defined HAVE_CONFIG_H
14 : #include "config.h"
15 : #endif
16 :
17 : module m_read_upf_pwscf
18 :
19 : private
20 : public :: read_pseudo
21 :
22 : contains
23 :
24 : !---------------------------------------------------------------------
25 : !program read_ps
26 : ! !---------------------------------------------------------------------
27 : ! !
28 : ! ! Read pseudopotentials in the Unified Pseudopotential Format (UPF)
29 : ! !
30 : ! implicit none
31 : ! integer :: is, ios, iunps = 4
32 : ! character (len=256) :: filein
33 : ! !
34 : ! is = 0
35 : !10 print '('' Input PP file # '',i2,'' in UPF format > '',$)', is+1
36 : ! read (5, '(a)', end = 20, err = 20) filein
37 : ! open(unit=iunps,file=filein,status='old',form='formatted',iostat=ios)
38 : ! if (ios.ne.0) stop
39 : ! is = is + 1
40 : ! call read_pseudo(is, iunps)
41 : ! close (unit=iunps)
42 : ! go to 10
43 : !20 stop
44 : !end program read_ps
45 : !
46 : !---------------------------------------------------------------------
47 2 : subroutine read_pseudo (is, iunps)
48 : !---------------------------------------------------------------------
49 : !
50 : ! Read pseudopotential in the Unified Pseudopotential Format (UPF)
51 : !
52 : use defs_basis, only : std_out,std_out_default
53 : use flib_pwscf
54 : use pseudo_pwscf
55 : implicit none
56 : !
57 : integer :: is, iunps
58 : ! is : index of this pseudopotential
59 : ! iunps: unit connected with pseudopotential file
60 : !
61 2 : if (is < 0 .or. is > npsx ) then
62 0 : call errore ('read_pseudo', 'Wrong is number', 1)
63 : end if
64 2 : write(std_out,* ) " Reading pseudopotential file in UPF format..."
65 : !------->Search for Header
66 2 : call scan_begin (iunps, "HEADER", .true.)
67 2 : call read_pseudo_header (is, iunps)
68 2 : call scan_end (iunps, "HEADER")
69 :
70 : !-------->Search for mesh information
71 2 : call scan_begin (iunps, "MESH", .true.)
72 2 : call read_pseudo_mesh (is, iunps)
73 2 : call scan_end (iunps, "MESH")
74 : !-------->If present, search for nlcc
75 2 : if (nlcc (is) ) then
76 2 : call scan_begin (iunps, "NLCC", .true.)
77 2 : call read_pseudo_nlcc (is, iunps)
78 2 : call scan_end (iunps, "NLCC")
79 : endif
80 : !-------->Search for Local potential
81 2 : call scan_begin (iunps, "LOCAL", .true.)
82 2 : call read_pseudo_local (is, iunps)
83 2 : call scan_end (iunps, "LOCAL")
84 : !-------->Search for Nonlocal potential
85 2 : call scan_begin (iunps, "NONLOCAL", .true.)
86 2 : call read_pseudo_nl (is, iunps)
87 2 : call scan_end (iunps, "NONLOCAL")
88 : !-------->Search for atomic wavefunctions
89 2 : call scan_begin (iunps, "PSWFC", .true.)
90 2 : call read_pseudo_pswfc (is, iunps)
91 2 : call scan_end (iunps, "PSWFC")
92 : !-------->Search for atomic charge
93 2 : call scan_begin (iunps, "RHOATOM", .true.)
94 2 : call read_pseudo_rhoatom (is, iunps)
95 2 : call scan_end (iunps, "RHOATOM")
96 : !
97 2 : write(std_out,* ) " ...done"
98 2 : return
99 : end subroutine read_pseudo
100 : !---------------------------------------------------------------------
101 :
102 26 : subroutine scan_begin (iunps, string, rew)
103 : !---------------------------------------------------------------------
104 : !
105 : use flib_pwscf
106 : use pseudo_pwscf
107 : implicit none
108 : ! Unit of the input file
109 : integer :: iunps
110 : ! Label to be matched
111 : character (len=*) :: string
112 : logical :: rew
113 : ! Flag: if .true. rewind the file
114 : character (len=80) :: rstring
115 : ! String read from file
116 : integer :: ios
117 :
118 26 : ios = 0
119 26 : if (rew) rewind (iunps)
120 8690 : do while (ios.eq.0)
121 8690 : read (iunps, *, iostat = ios, err = 300) rstring
122 8690 : if (matches ("<PP_"//string//">", rstring) ) return
123 : enddo
124 0 : 300 call errore ('scan_begin', 'No '//string//' block', abs (ios) )
125 :
126 : end subroutine scan_begin
127 : !---------------------------------------------------------------------
128 :
129 26 : subroutine scan_end (iunps, string)
130 : !---------------------------------------------------------------------
131 : use flib_pwscf
132 : use pseudo_pwscf
133 : implicit none
134 : ! Unit of the input file
135 : integer :: iunps
136 : ! Label to be matched
137 : character (len=*) :: string
138 : ! String read from file
139 : character (len=80) :: rstring
140 : integer :: ios
141 :
142 26 : read (iunps, '(a)', iostat = ios, err = 300) rstring
143 26 : if (matches ("</PP_"//string//">", rstring) ) return
144 : 300 call errore ('scan_end', &
145 0 : 'No '//string//' block end statement, possibly corrupted file', - 1)
146 : end subroutine scan_end
147 : !
148 : !---------------------------------------------------------------------
149 :
150 2 : subroutine read_pseudo_header (is, iunps)
151 : !---------------------------------------------------------------------
152 : !
153 : use flib_pwscf
154 : use pseudo_pwscf
155 : implicit none
156 : !
157 : integer :: is, iunps
158 : !
159 : integer :: nv, ios, nw
160 : character (len=75) :: dummy
161 :
162 2 : read (iunps, *, err = 100, iostat = ios) nv, dummy
163 2 : read (iunps, *, err = 100, iostat = ios) psd (is), dummy
164 2 : read (iunps, *, err = 100, iostat = ios) pseudotype
165 2 : if (matches (pseudotype, "US") ) isus (is) = .true.
166 2 : read (iunps, *, err = 100, iostat = ios) nlcc (is), dummy
167 2 : read (iunps, '(a20,t24,a)', err = 100, iostat = ios) dft(is), dummy
168 2 : read (iunps, * ) zp (is), dummy
169 2 : read (iunps, * ) etotps, dummy
170 2 : read (iunps, * ) ecutwfc, ecutrho
171 2 : read (iunps, * ) lmax (is), dummy
172 2 : read (iunps, *, err = 100, iostat = ios) mesh (is), dummy
173 2 : read (iunps, *, err = 100, iostat = ios) ntwfc(is), nbeta (is), dummy
174 2 : read (iunps, '(a)', err = 100, iostat = ios) dummy
175 10 : do nw = 1, ntwfc(is)
176 10 : read (iunps, * ) els (nw,is), lchi (nw, is), oc (nw, is)
177 : enddo
178 2 : return
179 0 : 100 call errore ('read_pseudo_header', 'Reading pseudo file', abs (ios))
180 : end subroutine read_pseudo_header
181 : !
182 : !---------------------------------------------------------------------
183 2 : subroutine read_pseudo_local (is, iunps)
184 : !---------------------------------------------------------------------
185 : !
186 : use flib_pwscf
187 : use pseudo_pwscf
188 : implicit none
189 : !
190 : integer :: is, iunps
191 : !
192 : integer :: ir, ios
193 : !
194 2 : read (iunps, *, err=100, iostat=ios) (vloc0(ir,is) , ir=1,mesh(is))
195 :
196 2 : 100 call errore ('read_pseudo_local','Reading pseudo file', abs(ios) )
197 :
198 2 : return
199 : end subroutine read_pseudo_local
200 : !
201 : !---------------------------------------------------------------------
202 :
203 2 : subroutine read_pseudo_mesh (is, iunps)
204 : !---------------------------------------------------------------------
205 : !
206 : use flib_pwscf
207 : use pseudo_pwscf
208 : implicit none
209 : !
210 : integer :: is, iunps
211 : !
212 : integer :: ir, ios
213 : !
214 2 : call scan_begin (iunps, "R", .false.)
215 2 : read (iunps, *, err = 100, iostat = ios) (r(ir,is), ir=1,mesh(is) )
216 2 : call scan_end (iunps, "R")
217 2 : call scan_begin (iunps, "RAB", .false.)
218 2 : read (iunps, *, err = 100, iostat = ios) (rab(ir,is), ir=1,mesh(is) )
219 2 : call scan_end (iunps, "RAB")
220 :
221 2 : return
222 :
223 0 : 100 call errore ('read_pseudo_mesh', 'Reading pseudo file', abs (ios) )
224 : end subroutine read_pseudo_mesh
225 : !
226 : !---------------------------------------------------------------------
227 :
228 2 : subroutine read_pseudo_nl (is, iunps)
229 : !---------------------------------------------------------------------
230 : !
231 : use flib_pwscf
232 : use pseudo_pwscf
233 : implicit none
234 : !
235 : integer :: is, iunps
236 : !
237 : integer :: nb, mb, n, ir, nd, ios, idum, ldum, icon, lp, i
238 : ! counters
239 : character (len=75) :: dummy
240 : !
241 8 : do nb = 1, nbeta (is)
242 6 : call scan_begin (iunps, "BETA", .false.)
243 6 : read (iunps, *, err = 100, iostat = ios) idum, lll(nb,is), dummy
244 6 : read (iunps, *, err = 100, iostat = ios) ikk2(nb,is)
245 : read (iunps, *, err = 100, iostat = ios) &
246 6 : (betar(ir,nb,is), ir=1,ikk2(nb,is))
247 6 : do ir = ikk2(nb,is) + 1, mesh (is)
248 6 : betar (ir, nb, is) = 0.d0
249 : enddo
250 8 : call scan_end (iunps, "BETA")
251 : enddo
252 :
253 2 : call scan_begin (iunps, "DIJ", .false.)
254 2 : read (iunps, *, err = 100, iostat = ios) nd, dummy
255 146 : dion (:,:,is) = 0.d0
256 8 : do icon = 1, nd
257 6 : read (iunps, *, err = 100, iostat = ios) nb, mb, dion(nb,mb,is)
258 8 : dion (mb,nb,is) = dion (nb,mb,is)
259 : enddo
260 2 : call scan_end (iunps, "DIJ")
261 :
262 2 : if (isus (is) ) then
263 0 : call scan_begin (iunps, "QIJ", .false.)
264 0 : read (iunps, *, err = 100, iostat = ios) nqf(is)
265 0 : nqlc (is)= 2 * lmax (is) + 1
266 0 : if (nqlc(is).gt.lqmax .or. nqlc(is).lt.0) &
267 0 : call errore (' read_pseudo_nl', 'Wrong nqlc', nqlc (is) )
268 0 : if (nqf(is).ne.0) then
269 0 : call scan_begin (iunps, "RINNER", .false.)
270 : read (iunps,*,err=100,iostat=ios) &
271 0 : (idum,rinner(i,is),i=1,nqlc(is))
272 0 : call scan_end (iunps, "RINNER")
273 : end if
274 0 : do nb = 1, nbeta(is)
275 0 : do mb = nb, nbeta(is)
276 :
277 0 : read (iunps,*,err=100,iostat=ios) idum, idum, ldum, dummy
278 : !" i j (l)"
279 0 : if (ldum.ne.lll(mb,is) ) then
280 0 : call errore ('read_pseudo_nl','inconsistent angular momentum for Q_ij', 1)
281 : end if
282 :
283 0 : read (iunps,*,err=100,iostat=ios) qqq(nb,mb,is), dummy
284 : ! "Q_int"
285 0 : qqq(mb,nb,is) = qqq(nb,mb,is)
286 :
287 : read (iunps,*,err=100,iostat=ios) &
288 0 : (qfunc(n,nb,mb,is), n=1,mesh(is))
289 0 : do n = 0, mesh (is)
290 0 : qfunc(n,mb,nb,is) = qfunc(n,nb,mb,is)
291 : enddo
292 :
293 0 : if (nqf(is).gt.0) then
294 0 : call scan_begin (iunps, "QFCOEF", .false.)
295 : read (iunps,*,err=100,iostat=ios) &
296 0 : ((qfcoef(i,lp,nb,mb,is),i=1,nqf(is)),lp=1,nqlc(is))
297 0 : call scan_end (iunps, "QFCOEF")
298 : end if
299 :
300 : enddo
301 : enddo
302 0 : call scan_end (iunps, "QIJ")
303 : else
304 146 : qqq (:,:,is) = 0.d0
305 256146 : qfunc(:,:,:,is) =0.d0
306 : endif
307 :
308 2 : 100 call errore ('read_pseudo_nl', 'Reading pseudo file', abs (ios) )
309 2 : return
310 : end subroutine read_pseudo_nl
311 : !
312 : !---------------------------------------------------------------------
313 2 : subroutine read_pseudo_nlcc (is, iunps)
314 : !---------------------------------------------------------------------
315 : !
316 : use flib_pwscf
317 : use pseudo_pwscf
318 : implicit none
319 : !
320 : integer :: is, iunps
321 : !
322 : integer :: ir, ios
323 :
324 2 : read (iunps, *, err = 100, iostat = ios) (rho_atc(ir,is), ir=1,mesh(is) )
325 : !
326 2 : 100 call errore ('read_pseudo_nlcc', 'Reading pseudo file', abs (ios) )
327 2 : return
328 : end subroutine read_pseudo_nlcc
329 : !
330 : !---------------------------------------------------------------------
331 2 : subroutine read_pseudo_pswfc (is, iunps)
332 : !---------------------------------------------------------------------
333 : !
334 : use flib_pwscf
335 : use pseudo_pwscf
336 : implicit none
337 : !
338 : integer :: is, iunps
339 : !
340 : character (len=75) :: dummy
341 : integer :: nb, ir, ios
342 : !
343 10 : do nb = 1, ntwfc(is)
344 8 : read (iunps,*,err=100,iostat=ios) dummy !Wavefunction labels
345 10 : read (iunps,*,err=100,iostat=ios) (chi(ir,nb,is), ir=1,mesh(is))
346 : enddo
347 2 : 100 call errore ('read_pseudo_pswfc', 'Reading pseudo file', abs(ios))
348 2 : return
349 :
350 : end subroutine read_pseudo_pswfc
351 : !
352 : !---------------------------------------------------------------------
353 2 : subroutine read_pseudo_rhoatom (is, iunps)
354 : !---------------------------------------------------------------------
355 : !
356 : use flib_pwscf
357 : use pseudo_pwscf
358 : implicit none
359 : !
360 : integer :: is, iunps
361 : !
362 : integer :: ir, ios
363 :
364 2 : read (iunps,*,err=100,iostat=ios) (rho_at(ir,is), ir=1,mesh(is))
365 2 : return
366 :
367 0 : 100 call errore ('read_pseudo_rhoatom','Reading pseudo file',abs(ios))
368 :
369 : end subroutine read_pseudo_rhoatom
370 : !
371 : !!***
372 :
373 : end module m_read_upf_pwscf
374 : !!***
|