1!
2! Copyright (C) 2008-2011 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!
8!=----------------------------------------------------------------------------=!
9MODULE read_upf_v2_module
10!-----------------------------------------------------------------------------=!
11   !!  this module provides the function read_upf_v2 to read pseudopotential data
12   !!  from files in UPF format version 2.
13#if defined (__use_fox)
14
15   ! ...   declare modules
16   USE upf_kinds,    ONLY: DP
17   USE pseudo_types, ONLY: pseudo_upf
18   USE upf_utils,    ONLY: matches, version_compare
19   USE FoX_dom
20   !
21   PRIVATE
22   PUBLIC :: read_upf_v2
23CONTAINS
24   !------------------------------------------------+
25   SUBROUTINE read_upf_v2(u, upf, ierr)             !
26   !---------------------------------------------+
27      !! Read pseudopotential in UPF format version 2, uses fox libraries.
28      !! data are stored in a pseudo_upf structure ( upf argument ),
29      !! If ierr argument is present the error status is returned otherwise
30      !! in case of error the program stops.
31      !! @Note  version 2 UPF  files generated with older versions of QE may contain
32      !! within in the PP_INFO/PP_INPUT section some xml reserved characters which
33      !! prevent any standard xml reader to parse them. To make the UPF file accessible is
34      !! sufficient to bracket  all the  text data within the PP_INPUT section with <![CDATA[
35      !! and ]]>
36
37      USE pseudo_types, ONLY: deallocate_pseudo_upf
38      IMPLICIT NONE
39      TYPE(Node),POINTER,INTENT(IN)  :: u
40      !! pointer to root DOM node.
41      TYPE(pseudo_upf),INTENT(INOUT) :: upf
42      !! pseudo_upf type structure storing the pseudo data
43      INTEGER,OPTIONAL,INTENT(OUT):: ierr
44      !!  /= 0 if something went wrong
45      !
46      !
47      INTEGER :: ierr_
48      TYPE(DOMException)   :: ex
49      TYPE(Node), POINTER  :: auxNode
50      LOGICAL :: found
51      CHARACTER(len = 256)  :: root
52      CHARACTER(len=6),PARAMETER :: max_version = '2.0.1'
53      !
54      ! Prepare the type .  Should be done where upf is instantiated
55      ! CALL deallocate_pseudo_upf(upf)
56      !
57      ! Initialize the file
58      root = getTagname(u, EX = ex)
59      ierr_ = getExceptionCode(ex)
60      !
61      IF((abs(ierr_)>0)  ) THEN
62      !
63         IF(.not. present(ierr)) &
64            CALL upf_error('read_upf_v2','Cannot open UPF file.',1)
65         ierr = 1
66         RETURN
67      ENDIF
68      IF ( .not. matches('UPF',root) ) THEN
69         IF (PRESENT (ierr) ) THEN
70            CALL upf_error( 'read_upf_v2', 'tagname is '//TRIM(root)//' instead of UPF', -1 )
71            ierr = 2
72            RETURN
73         ELSE
74            CALL upf_error('read_upf_v2', 'tagname is '//TRIM(root)//' instead of UPF',2)
75         END IF
76      END IF
77      CALL extractDataAttribute(u, 'version', upf%nv)
78      IF (version_compare(upf%nv, max_version) == 'newer') &
79         CALL upf_error('read_upf_v2', 'Unknown UPF format version: '//TRIM(upf%nv),1)
80      !
81      !
82      ! Read machine-readable header
83      !
84      CALL read_upf_header(u, upf)
85      !
86      ! CHECK for bug in version 2.0.0 of UPF file
87      IF ( version_compare(upf%nv, '2.0.1') == 'older' .and. upf%tvanp .and.  &
88         .not. upf%tpawp ) CALL upf_error('read_upf_v2',&
89                   'Ultrasoft pseudopotentials in UPF format v.2.0.0 are &
90                  & affected by a bug compromising their quality. Please &
91                  & regenerate pseudopotential file for '//TRIM(upf%psd), 1)
92
93      ! Read radial grid mesh
94      CALL read_upf_mesh(u, upf)
95      ! Read non-linear core correction charge
96      ALLOCATE( upf%rho_atc(upf%mesh) )
97      IF(upf%nlcc) THEN
98         auxNode => item(getElementsByTagname(u, 'PP_NLCC'), 0)
99         CALL extractDataContent(auxNode, upf%rho_atc)
100      ELSE
101         ! A null core charge simplifies several functions, mostly in PAW
102         upf%rho_atc(1:upf%mesh) = 0._dp
103      ENDIF
104      ! Read local potential
105      IF(.not. upf%tcoulombp) THEN
106         ALLOCATE( upf%vloc(upf%mesh) )
107         auxNode => item( getElementsByTagname( u, 'PP_LOCAL'), 0)
108         CALL extractDataContent(auxNode, upf%vloc)
109      ENDIF
110      ! Read nonlocal components: projectors, augmentation, hamiltonian elements
111
112      CALL read_upf_nonlocal(u, upf)
113
114      ! Read initial pseudo wavefunctions
115      ! (usually only wfcs with occupancy > 0)
116      CALL read_upf_pswfc(u, upf)
117
118      ! Read all-electron and pseudo wavefunctions
119      CALL read_upf_full_wfc(u, upf)
120
121      ! Read valence atomic density (used for initial density)
122      ALLOCATE( upf%rho_at(upf%mesh) )
123      auxNode => item(getElementsByTagname(u, 'PP_RHOATOM'), 0)
124      CALL extractDataContent(auxNode, upf%rho_at)
125
126      ! Read additional info for full-relativistic calculation
127      CALL read_upf_spin_orb(u, upf)
128
129      ! Read additional data for PAW (All-electron charge, wavefunctions, vloc..)
130      CALL read_upf_paw(u, upf)
131
132      ! Read data for gipaw reconstruction
133      CALL read_upf_gipaw(u, upf)
134
135      !
136      ! Close the file (not the unit!)
137      CALL destroy(u)
138      !
139      IF( present(ierr) ) ierr=0
140      !
141      RETURN
142
143END SUBROUTINE read_upf_v2
144   !
145SUBROUTINE read_upf_header(u, upf)
146   IMPLICIT NONE
147   TYPE(Node),POINTER,INTENT(IN)  :: u    ! parent node pointer
148   TYPE(pseudo_upf),INTENT(INOUT) :: upf  ! the pseudo data
149   INTEGER                     :: ierr, ios  ! /= 0 if something went wrong
150   CHARACTER(len=256) :: dft_buffer     ! needed to allow the string defining the
151                                        ! DFT flavor to be longer than upf%dft
152                                        ! (currently 25)
153                                        ! An error message is issued if trimmed
154                                        ! dft_buffer exceeds upf%dft size.
155   INTEGER :: len_buffer
156   !
157   INTEGER :: nw
158   TYPE(Node), POINTER  :: hdrNode
159   CHARACTER(LEN=256)   :: attr
160   TYPE(DOMException)   :: ex
161   !
162   ! GTH analytical format: obviously not true in this case
163   upf%is_gth=.false.
164   ! PP is assumed to be multi-projector
165   upf%is_multiproj=.true.
166   !
167   ! Read HEADER section with some initialization data
168   hdrNode  => item( getElementsByTagname(u, 'PP_HEADER'), 0 )
169   IF ( hasAttribute( hdrNode, 'generated') ) THEN
170      CALL extractDataAttribute(hdrNode, 'generated', upf%generated)
171   ELSE
172      upf%generated = ' '
173   END IF
174   IF ( hasAttribute( hdrNode, 'author') ) THEN
175      CALL extractDataAttribute(hdrNode, 'author', upf%author)
176   ELSE
177      upf%author = 'anonymous'
178   END IF
179   IF ( hasAttribute( hdrNode, 'date') ) THEN
180      CALL extractDataAttribute(hdrNode, 'date', upf%date)
181   ELSE
182      upf%date = ' '
183   END IF
184   IF ( hasAttribute( hdrNode, 'comment') ) THEN
185      CALL extractDataAttribute(hdrNode, 'comment', upf%comment)
186   ELSE
187      upf%comment = ' '
188   END IF
189   !
190   CALL extractDataAttribute(hdrNode, 'element', upf%psd)
191   CALL extractDataAttribute(hdrNode, 'pseudo_type', upf%typ)
192   CALL extractDataAttribute(hdrNode, 'relativistic', upf%rel)
193   !
194   CALL extractDataAttribute(hdrNode, 'is_ultrasoft', upf%tvanp, iostat = ios )
195   IF ( ios /= 0 ) THEN
196      CALL extractDataAttribute(hdrNode, 'is_ultrasoft', attr)
197      upf%tvanp = ( INDEX (attr, 'T') > 0 )
198   END IF
199   CALL extractDataAttribute(hdrNode, 'is_paw', upf%tpawp, iostat = ios)
200   IF ( ios /= 0 ) THEN
201      CALL extractDataAttribute(hdrNode, 'is_paw', attr)
202      upf%tpawp = ( INDEX (attr, 'T') > 0 )
203   END IF
204   !
205   IF ( hasAttribute ( hdrNode, 'is_coulomb')) THEN
206      CALL extractDataAttribute(hdrNode, 'is_coulomb', upf%tcoulombp, iostat = ios)
207      IF ( ios /= 0 ) THEN
208         CALL extractDataAttribute ( hdrNode, 'is_coulomb', attr)
209         upf%tcoulombp = ( INDEX ( attr, 'T') > 0 )
210      END IF
211   ELSE
212      upf%tcoulombp = .FALSE.
213   END IF
214   !
215   IF ( hasAttribute (hdrNode, 'has_so') ) THEN
216      CALL extractDataAttribute(hdrNode, 'has_so',         upf%has_so , IOSTAT = ios )
217      IF ( ios /=0) THEN
218         CALL extractDataAttribute(hdrNode, 'has_so',  attr)
219         upf%has_so = ( INDEX ( attr, 'T') > 0 )
220      END IF
221   ELSE
222      upf%has_so = .false.
223   END IF
224   IF ( hasAttribute( hdrNode, 'has_wfc') ) THEN
225      CALL extractDataAttribute(hdrNode, 'has_wfc',        upf%has_wfc, IOSTAT = ios)
226      IF ( ios /= 0 ) THEN
227         CALL extractDataAttribute (hdrNode, 'has_wfc', attr)
228         upf%has_wfc = ( INDEX(attr, 'T' ) > 0 )
229      END IF
230   ELSE
231      upf%has_wfc = upf%tpawp
232   END IF
233   IF ( hasAttribute ( hdrNode, 'has_gipaw' )) THEN
234      CALL extractDataAttribute(hdrNode, 'has_gipaw',      upf%has_gipaw, IOSTAT = ios )
235      IF ( ios /= 0 ) THEN
236         CALL extractDataAttribute(hdrNode, 'has_gipaw', attr )
237         upf%has_gipaw = ( INDEX ( attr, 'T') > 0 )
238      END IF
239   ELSE
240      upf%has_gipaw = .false.
241   END IF
242   !EMINE
243   IF ( hasAttribute ( hdrNode, 'paw_as_gipaw') ) THEN
244      CALL extractDataAttribute(hdrNode, 'paw_as_gipaw',      upf%paw_as_gipaw, IOSTAT = ios )
245      IF ( ios /= 0 ) THEN
246         CALL extractDataAttribute(hdrNode, 'paw_as_gipaw', attr )
247         upf%paw_as_gipaw = ( INDEX(attr, 'T') > 0 )
248      END IF
249   ELSE
250      upf%paw_as_gipaw  = .false.
251   END IF
252   !
253   CALL extractDataAttribute(hdrNode, 'core_correction',upf%nlcc, IOSTAT = ios)
254   IF ( ios /= 0 ) THEN
255      CALL extractDataAttribute(hdrNode, 'core_correction', attr )
256      upf%nlcc = ( INDEX( attr, 'T') > 0 )
257   END IF
258!
259   CALL extractDataAttribute(hdrNode, 'functional',  dft_buffer)
260      len_buffer=len_trim(dft_buffer)
261      IF (len_buffer > len(upf%dft)) &
262         CALL upf_error('read_upf_v2','String defining DFT is too long',len_buffer)
263      upf%dft=TRIM(dft_buffer)
264      !
265      CALL extractDataAttribute (hdrNode, 'z_valence',      upf%zp)
266      IF ( hasAttribute (hdrNode,  'total_psenergy') ) THEN
267         CALL extractDataAttribute (hdrNode, 'total_psenergy', upf%etotps)
268      ELSE
269         upf%etotps = 0._dp
270      END IF
271      IF ( hasAttribute (hdrNode, 'wfc_cutoff') ) THEN
272         CALL extractDataAttribute (hdrNode, 'wfc_cutoff',     upf%ecutwfc )
273      ELSE
274         upf%ecutwfc = 0._dp
275      END IF
276      IF  ( hasAttribute (hdrNode, 'rho_cutoff') ) THEN
277         CALL extractDataAttribute (hdrNode, 'rho_cutoff',     upf%ecutrho)
278      ELSE
279         upf%ecutrho = 0._dp
280      END IF
281      IF ( hasAttribute ( hdrNode, 'l_max' ) ) THEN
282         CALL extractDataAttribute (hdrNode, 'l_max',          upf%lmax)
283      ELSE
284         upf%lmax =0
285      END IF
286      IF ( hasAttribute ( hdrNode, 'l_max_rho') ) THEN
287         CALL extractDataAttribute (hdrNode, 'l_max_rho',      upf%lmax_rho)
288      ELSE
289         upf%lmax_rho = 2*upf%lmax
290      END IF
291      IF ( hasAttribute ( hdrNode, 'l_local') ) THEN
292         CALL extractDataAttribute (hdrNode, 'l_local',        upf%lloc )
293      ELSE
294         upf%lloc = 0
295      END IF
296      CALL extractDataAttribute (hdrNode, 'mesh_size',      upf%mesh)
297      CALL extractDataAttribute (hdrNode, 'number_of_wfc',  upf%nwfc)
298      CALL extractDataAttribute (hdrNode, 'number_of_proj', upf%nbeta)
299      !
300      RETURN
301   END SUBROUTINE read_upf_header
302   !
303   SUBROUTINE read_upf_mesh(u, upf)
304      IMPLICIT NONE
305      TYPE (Node),POINTER,INTENT(IN)       :: u    ! i/o unit
306      TYPE(pseudo_upf),INTENT(INOUT)         :: upf  ! the pseudo data
307      !
308      INTEGER                     :: ierr ! /= 0 if something went wrong
309      TYPE (Node),POINTER         :: mshNode, locNode
310      !
311      LOGICAL :: found
312      !
313      mshNode => item( getElementsByTagname(u, 'PP_MESH'),0 )
314      IF ( hasAttribute(mshNode, 'dx')) CALL extractDataAttribute(mshNode, 'dx',   upf%dx )
315      IF ( hasAttribute (mshNode, 'mesh')) &
316             CALL extractDataAttribute(mshNode, 'mesh', upf%mesh )
317      IF ( hasAttribute ( mshNode, 'xmin') )  CALL extractDataAttribute(mshNode, 'xmin', upf%xmin )
318      IF ( hasAttribute ( mshNode, 'rmax') ) CALL extractDataAttribute(mshNode, 'rmax', upf%rmax )
319      IF ( hasAttribute ( mshNode, 'zmesh') ) CALL extractDataAttribute(mshNode, 'zmesh',upf%zmesh )
320      ALLOCATE( upf%r( upf%mesh ), upf%rab( upf%mesh ) )
321      !
322      locNode => item( getElementsByTagname( mshNode, 'PP_R'), 0 )
323      CALL extractDataContent(locNode, upf%r(1:upf%mesh))
324      !
325      locNode => item(getElementsByTagname( mshNode, 'PP_RAB'), 0)
326      CALL extractDataContent(locNode, upf%rab(1:upf%mesh))
327      !
328      RETURN
329   END SUBROUTINE read_upf_mesh
330   !
331   SUBROUTINE read_upf_nonlocal(u, upf)
332      IMPLICIT NONE
333      TYPE(Node),POINTER,INTENT(IN)         :: u    ! i/o unit
334      TYPE(pseudo_upf),INTENT(INOUT) :: upf  ! the pseudo data
335      !
336      !
337      TYPE (Node),POINTER     :: nlcNode, locNode,locNode1, locNode2, locNode3
338      TYPE (nodeList),POINTER :: tmpList
339      INTEGER :: nb,mb,ln,lm,l,nmb,ierr=0
340      !INTEGER :: nb_=-1,mb_=-1,l_=-1,nmb_=-1
341      REAL(DP):: zeros(upf%mesh)
342      REAL(DP), ALLOCATABLE :: tmp_dbuffer(:)
343      LOGICAL :: isnull, found
344      CHARACTER(LEN = 256 )   :: attr
345      INTEGER :: ios
346      zeros=0._dp
347      !
348      ! modified by AF
349      !IF (upf%tcoulombp) RETURN
350      IF (upf%tcoulombp) upf%nbeta = 0
351      !
352      ! Allocate space for non-local part
353      IF ( upf%nbeta == 0) THEN
354         upf%nqf = 0
355         upf%nqlc= 0
356         upf%qqq_eps= -1._dp
357         upf%kkbeta = 0
358         ALLOCATE( upf%kbeta(1),         &
359                   upf%lll(1),           &
360                   upf%beta(upf%mesh,1), &
361                   upf%dion(1,1),        &
362                   upf%rinner(1),        &
363                   upf%qqq(1,1),         &
364                   upf%qfunc(upf%mesh,1),&
365                   upf%qfcoef(1,1,1,1),  &
366                   upf%rcut(1),          &
367                   upf%rcutus(1),        &
368                   upf%els_beta(1) )
369         RETURN
370      END IF
371      !
372      ! <AF>
373
374      nlcNode => item ( getElementsByTagname( u, 'PP_NONLOCAL'), 0 )
375      !
376      ALLOCATE( upf%kbeta(upf%nbeta),          &
377                upf%lll(upf%nbeta),            &
378                upf%beta(upf%mesh, upf%nbeta), &
379                upf%dion(upf%nbeta, upf%nbeta),&
380                upf%rcut(upf%nbeta),           &
381                upf%rcutus(upf%nbeta),         &
382                upf%els_beta(upf%nbeta) )
383
384      !
385      ! Read the projectors:
386      locNode2 => getFirstChild(nlcNode)
387      nb = 0
388      DO
389         IF (.NOT. ASSOCIATED( locNode2) )  EXIT
390         locNode => locNode2
391         locNode2 => getNextSibling(locNode)
392         IF (getNodeType( locNode) .NE. ELEMENT_NODE ) CYCLE
393         IF ( INDEX(getTagName(locNode), 'PP_BETA') .LE. 0 ) CYCLE
394         nb = nb + 1
395         CALL extractDataContent(locNode, upf%beta(:, nb))
396         IF ( hasAttribute( locNode, 'label') ) THEN
397            CALL extractDataAttribute(locNode, 'label',                  upf%els_beta(nb))
398         ELSE
399            upf%els_beta(nb) ='Xn'
400         END IF
401         CALL extractDataAttribute(locNode, 'angular_momentum',       upf%lll(nb))
402         IF ( hasAttribute( locNode,'cutoff_radius_index' )) THEN
403            CALL extractDataAttribute(locNode, 'cutoff_radius_index',    upf%kbeta(nb))
404         ELSE
405           upf%kbeta = upf%mesh
406         END IF
407         IF ( hasAttribute( locNode,'cutoff_radius' )) THEN
408            CALL extractDataAttribute(locNode, 'cutoff_radius',          upf%rcut(nb) )
409         ELSE
410            upf%rcut(nb) = 0._dp
411         END IF
412         IF ( hasAttribute( locNode,'ultrasoft_cutoff_radius' )) THEN
413            CALL extractDataAttribute(locNode, 'ultrasoft_cutoff_radius', upf%rcutus(nb))
414         ELSE
415           upf%rcutus(nb)  = 0._dp
416         END IF
417!
418!    Old version of UPF PPs v.2 contained an error in the tag.
419!    To be able to read the old PPs we need the following
420!
421         IF ( upf%rcutus(nb)==0._DP) THEN
422            IF ( hasAttribute( locNode,'norm_conserving_radius' )) THEN
423               CALL extractDataAttribute(locNode,'norm_conserving_radius',upf%rcutus(nb))
424            ELSE
425               upf%rcutus(nb)  = 0._dp
426            END IF
427         END IF
428      ENDDO
429      !
430      ! Read the hamiltonian terms D_ij
431      locNode => item( getElementsByTagname(nlcNode, 'PP_DIJ'),0)
432      CALL extractDataContent(locNode, upf%dion)
433      !
434      ! Read the augmentation charge section
435      augmentation : &
436      IF(upf%tvanp .or. upf%tpawp) THEN
437         !
438         locNode => item(getElementsByTagname(nlcNode, 'PP_AUGMENTATION'),0)
439         CALL extractDataAttribute(locNode, 'q_with_l', upf%q_with_l, IOSTAT = ios )
440         IF ( ios /= 0) THEN
441            CALL extractDataAttribute(locNode, 'q_with_l', attr )
442            upf%q_with_l = ( INDEX ( attr, 'T') > 0)
443         END IF
444         CALL extractDataAttribute(locNode, 'nqf',      upf%nqf)
445         IF (hasAttribute(locNode, 'nqlc') ) THEN
446            CALL extractDataAttribute(locNode, 'nqlc',     upf%nqlc)
447         ELSE
448            upf%nqlc =2*upf%lmax+1
449         END IF
450         IF (upf%tpawp) THEN
451            IF (hasAttribute(locNode, 'shape') ) THEN
452               CALL extractDataAttribute(locNode,'shape',          upf%paw%augshape)
453            ELSE
454               upf%paw%augshape ='UNKNOWN'
455            END IF
456            IF (hasAttribute(locNode, 'cutoff_r') ) THEN
457               CALL extractDataAttribute(locNode,'cutoff_r',       upf%paw%raug )
458            ELSE
459               upf%paw%raug = 0._dp
460            END IF
461            IF (hasAttribute(locNode, 'cutoff_r_index') ) THEN
462               CALL extractDataAttribute(locNode,'cutoff_r_index', upf%paw%iraug)
463            ELSE
464              upf%paw%iraug =upf%mesh
465            END IF
466            IF (hasAttribute(locNode, 'l_max_aug') ) THEN
467               CALL extractDataAttribute(locNode,'l_max_aug',      upf%paw%lmax_aug)
468            ELSE
469              upf%paw%lmax_aug   =upf%lmax_rho
470            END IF
471         ENDIF
472         ! a negative number means that all qfunc are stored
473         IF (hasAttribute(locNode,   'augmentation_epsilon'  ) ) THEN
474            CALL extractDataAttribute(locNode,'augmentation_epsilon',upf%qqq_eps)
475         ELSE
476            upf%qqq_eps = -1._dp
477         END IF
478         !
479         ALLOCATE( upf%rinner( upf%nqlc ) )
480         ALLOCATE( upf%qqq   ( upf%nbeta, upf%nbeta ) )
481         IF ( upf%q_with_l ) THEN
482            ALLOCATE( upf%qfuncl ( upf%mesh, upf%nbeta*(upf%nbeta+1)/2, 0:2*upf%lmax ) )
483            upf%qfuncl=0._dp
484         ELSE
485            ALLOCATE( upf%qfunc (upf%mesh, upf%nbeta*(upf%nbeta+1)/2) )
486         ENDIF
487         !
488         ! Read the integrals of the Q functions
489         locNode2 => item( getElementsByTagname( locNode, 'PP_Q'), 0)
490         CALL extractDataContent(locNode2, upf%qqq )
491         !
492         ! read charge multipoles (only if PAW)
493         IF( upf%tpawp ) THEN
494            ALLOCATE(upf%paw%augmom(upf%nbeta,upf%nbeta, 0:2*upf%lmax))
495            ALLOCATE( tmp_dbuffer(upf%nbeta*upf%nbeta*(2*upf%lmax+1)) )
496            locNode2 => item( getElementsByTagname(locNode,'PP_MULTIPOLES'), 0)
497            CALL extractDataContent(locNode2, tmp_dbuffer)
498            upf%paw%augmom=reshape(tmp_dbuffer, [upf%nbeta,upf%nbeta,2*upf%lmax+1])
499            DEALLOCATE (tmp_dbuffer)
500         ENDIF
501         !
502         ! Read polinomial coefficients for Q_ij expansion at small radius
503         IF(upf%nqf <= 0) THEN
504            upf%rinner(:) = 0._dp
505            ALLOCATE( upf%qfcoef(1,1,1,1) )
506            upf%qfcoef = 0._dp
507         ELSE
508            ALLOCATE( upf%qfcoef( upf%nqf, upf%nqlc, upf%nbeta, upf%nbeta ) )
509            ALLOCATE(tmp_dbuffer( upf%nqf*upf%nqlc*upf%nbeta*upf%nbeta))
510            locNode2=> item(getElementsByTagname(locNode, 'PP_QFCOEF'),0)
511            CALL extractDataContent(locNode2, tmp_dbuffer)
512            upf%qfcoef = reshape(tmp_dbuffer,[size(upf%qfcoef,1),size(upf%qfcoef,2),&
513                                           size(upf%qfcoef,3),size(upf%qfcoef,4)])
514            DEALLOCATE(tmp_dbuffer)
515            locNode2 => item(getElementsByTagname(locNode, 'PP_RINNER'),0)
516            CALL extractDataContent(locNode2, upf%rinner)
517         ENDIF
518         !
519         ! Read augmentation charge Q_ij
520         ultrasoft_or_paw : &
521         IF( upf%tvanp) THEN
522            locNode3 => getFirstChild(locNode)
523            IF (upf%q_with_l) THEN
524               upf%qfuncl = 0._dp
525            ELSE
526               upf%qfunc = 0._dp
527            END IF
528            search_for_qij: DO
529               IF ( .NOT. ASSOCIATED(locNode3) ) EXIT search_for_qij
530               locNode2 => locNode3
531               locNode3 => getNextSibling(locNode2)
532               IF (getNodeType(locNode2) .NE. ELEMENT_NODE) CYCLE search_for_qij
533               !
534               IF ( INDEX( getTagName(locNode2), 'PP_QIJ') .LE. 0) CYCLE search_for_qij
535               CALL extractDataAttribute(locNode2, 'composite_index', nmb)
536               IF (upf%q_with_l) THEN
537                  CALL extractDataAttribute(locNode2, 'angular_momentum', l)
538                  CALL extractDataContent( locNode2, upf%qfuncl(:, nmb,l))
539                  IF (upf%tpawp) upf%qfuncl(upf%paw%iraug+1:,nmb,l) = 0._DP
540               ELSE
541                  CALL extractDataContent ( locNode2, upf%qfunc(:,nmb))
542               END IF
543            END DO search_for_qij
544            !
545         ENDIF ultrasoft_or_paw
546      !
547      !
548      ENDIF augmentation
549      !
550      ! Maximum radius of beta projector: outer radius to integrate
551      upf%kkbeta = MAXVAL(upf%kbeta(1:upf%nbeta))
552      ! For PAW augmentation charge may extend a bit further:
553      IF(upf%tpawp) upf%kkbeta = MAX(upf%kkbeta, upf%paw%iraug)
554      !
555      !
556      RETURN
557   END SUBROUTINE read_upf_nonlocal
558   !
559   SUBROUTINE read_upf_pswfc(u, upf)
560      IMPLICIT NONE
561      TYPE(Node), POINTER, INTENT(IN) :: u    ! pointer to root node
562      TYPE(pseudo_upf),INTENT(INOUT)  :: upf  ! the pseudo data
563      INTEGER :: ierr ! /= 0 if something went wrong
564      !
565      !
566      INTEGER :: nw
567      TYPE(Node),POINTER                :: pswfcNode, locNode, locNode2
568      !
569      pswfcNode  => item(getElementsByTagname(u, 'PP_PSWFC'), 0)
570      !
571      ALLOCATE( upf%chi(upf%mesh,upf%nwfc) )
572      ALLOCATE( upf%els(upf%nwfc), &
573                upf%oc(upf%nwfc), &
574                upf%lchi(upf%nwfc), &
575                upf%nchi(upf%nwfc), &
576                upf%rcut_chi(upf%nwfc), &
577                upf%rcutus_chi(upf%nwfc), &
578                upf%epseu(upf%nwfc) &
579              )
580      !
581      locNode2 => getFirstChild ( pswfcNode )
582      nw = 0
583      DO
584         IF (.NOT. ASSOCIATED( locNode2) ) EXIT
585         locNode => locNode2
586         locNode2 => getNextSibling(locNode)
587         IF (getNodeType(locNode) .NE. ELEMENT_NODE ) CYCLE
588         IF ( INDEX ( getTagName(locNode),'PP_CHI') .LE. 0 ) CYCLE
589         nw = nw + 1
590         IF ( nw .GT. upf%nwfc ) THEN
591            CALL upf_error('pseudo '//trim(upf%psd), "too many chi found in pswfc",-1 )
592            EXIT
593         END IF
594         IF ( hasAttribute (locNode, 'label')) THEN
595            CALL extractDataAttribute(locNode, 'label', upf%els(nw) )
596         ELSE
597            upf%els(nw) = 'Xn'
598         END IF
599         CALL extractDataAttribute(locNode, 'l', upf%lchi(nw))
600         CALL extractDataAttribute(locNode, 'occupation',    upf%oc(nw))
601         IF ( hasAttribute(locNode, 'n')) THEN
602            CALL extractDataAttribute(locNode, 'n',             upf%nchi(nw))
603         ELSE
604             upf%nchi(nw) = upf%lchi(nw)-1
605         END IF
606         IF ( hasAttribute(locNode, 'pseudo_energy') ) THEN
607            CALL extractDataAttribute(locNode, 'pseudo_energy', upf%epseu(nw) )
608         ELSE
609            upf%epseu(nw) = 0._dp
610         END IF
611         IF ( hasAttribute( locNode,'cutoff_radius') ) THEN
612            CALL extractDataAttribute(locNode, 'cutoff_radius', upf%rcut_chi(nw) )
613         ELSE
614            upf%rcut_chi(nw) =0._dp
615         END IF
616         IF ( hasAttribute(locNode, 'ultrasoft_cutoff_radius') ) THEN
617            CALL extractDataAttribute(locNode, 'ultrasoft_cutoff_radius', upf%rcutus_chi(nw))
618         ELSE
619           upf%rcutus_chi(nw) =0._dp
620         END IF
621         CALL extractDataContent(locNode, upf%chi(:,nw) )
622      ENDDO
623      !
624      RETURN
625   END SUBROUTINE read_upf_pswfc
626
627   SUBROUTINE read_upf_full_wfc(u, upf)
628      IMPLICIT NONE
629      TYPE(Node),POINTER, INTENT(IN) :: u    ! parent node
630      TYPE(pseudo_upf),INTENT(INOUT) :: upf  ! the pseudo data
631      INTEGER :: ierr ! /= 0 if something went wrong
632      !
633      LOGICAL :: exst
634      !
635      INTEGER :: nbae, nbae_rel, nbps
636      TYPE(Node),POINTER       :: fllwfNode, locNode, locNode2
637      !
638      IF(.not. upf%has_wfc) RETURN
639      !
640      fllwfNode => item(getElementsByTagname (u, 'PP_FULL_WFC'), 0)
641      !
642      ALLOCATE( upf%aewfc(upf%mesh, upf%nbeta) )
643      ALLOCATE( upf%pswfc(upf%mesh, upf%nbeta) )
644      IF (upf%has_so .and. upf%tpawp) THEN
645        ALLOCATE( upf%paw%aewfc_rel(upf%mesh, upf%nbeta) )
646        upf%paw%aewfc_rel = 0._dp
647      END IF
648      locNode2 => getFirstChild(fllwfNode)
649      nbae=0
650      nbae_rel = 0
651      nbps = 0
652      DO
653         IF ( .NOT. ASSOCIATED ( locNode2) ) EXIT
654         locNode => locNode2
655         locNode2=> getNextSibling(locNode)
656         IF (getNodeType(locNode)  .NE. ELEMENT_NODE) CYCLE
657         IF (INDEX(getTagName(locNode), 'PP_AEWFC_REL') .GT. 0 ) THEN
658            nbae_rel = nbae_rel+1
659            IF (nbae_rel .GT. upf%nbeta ) THEN
660               CYCLE
661            ELSE
662               CALL extractDataContent(locNode, upf%paw%aewfc_rel(:,nbae_rel))
663            END IF
664         ELSE IF (INDEX(getTagName(locNode),'PP_AEWFC') .GT. 0) THEN
665            nbae  = nbae +1
666            IF (nbae .GT. upf%nbeta) THEN
667               CYCLE
668            ELSE
669               CALL extractDataContent(locNode, upf%aewfc(:,nbae))
670            END IF
671         ELSE IF (INDEX(getTagName(locNode), 'PP_PSWFC') .GT. 0) THEN
672            nbps = nbps + 1
673            IF ( nbps .LE. upf%nbeta ) THEN
674               CALL extractDataContent(locNode, upf%pswfc(:, nbps) )
675            END IF
676         END IF
677      ENDDO
678   END SUBROUTINE read_upf_full_wfc
679
680   !
681   SUBROUTINE read_upf_spin_orb(u, upf)
682      IMPLICIT NONE
683      TYPE(Node), POINTER, INTENT(IN) :: u    ! parent node pointer
684      TYPE(pseudo_upf),INTENT(INOUT)  :: upf  ! the pseudo data
685      INTEGER :: ierr ! /= 0 if something went wrong
686
687      !
688      !
689      INTEGER :: nw, nb
690      TYPE(Node), POINTER  :: soNode, locNode, locNode2
691      !
692      IF (.not. upf%has_so) RETURN
693      !
694      soNode => item(getElementsByTagName(u, 'PP_SPIN_ORB'), 0)
695      !
696      ALLOCATE (upf%nn(upf%nwfc))
697      ALLOCATE (upf%jchi(upf%nwfc))
698      !
699      ALLOCATE(upf%jjj(upf%nbeta))
700      !
701      locNode2=> getFirstChild(soNode)
702      nw = 0
703      nb = 0
704      DO
705        IF (.NOT. ASSOCIATED(locNode2)) EXIT
706           locNode => locNode2
707           locNode2 => getNextSibling(locNode)
708           IF ( getNodeType(locNode) .NE. ELEMENT_NODE ) CYCLE
709           select_tag: IF ( INDEX(getTagName(locNode),'PP_RELWFC') .GT. 0) THEN
710              nw = nw + 1
711              IF (nw .LE. upf%nwfc ) THEN
712                 CALL extractDataAttribute (locNode, 'nn', upf%nn(nw))
713                 CALL extractDataAttribute (locNode, 'jchi',  upf%jchi(nw))
714                 !extraxtDataAttribute(attr, 'els',   upf%els(nw))  ! already read
715                 !extraxtDataAttribute(attr, 'lchi',  upf%lchi(nw)) ! already read
716                 !extraxtDataAttribute(attr, 'oc',    upf%oc(nw))   ! already read
717              END IF
718           ELSE IF (INDEX(getTagName(locNode),'PP_RELBETA') .GT. 0) THEN
719              nb = nb + 1
720              IF (nb .LE. upf%nbeta ) THEN
721                 CALL extractDataAttribute(locNode, 'lll',   upf%lll(nb))
722                 CALL extractDataAttribute(locNode, 'jjj',   upf%jjj(nb))
723              END IF
724           END IF select_tag
725      ENDDO
726      !
727      RETURN
728   END SUBROUTINE read_upf_spin_orb
729   !
730   SUBROUTINE read_upf_paw(u, upf)
731      IMPLICIT NONE
732      TYPE(Node), POINTER, INTENT(IN) :: u    !
733      TYPE(pseudo_upf),INTENT(INOUT)  :: upf  ! the pseudo data
734      INTEGER :: ierr ! /= 0 if something went wrong
735      !
736      TYPE(Node), POINTER      :: pawNode, locNode
737      INTEGER :: nb,nb1
738
739      IF (.not. upf%tpawp ) RETURN
740
741      pawNode => item(getElementsByTagname(u, 'PP_PAW'), 0)
742      CALL extractDataAttribute(pawNode, 'paw_data_format', upf%paw_data_format)
743      IF(upf%paw_data_format /= 2) &
744         CALL upf_error('read_upf_v2::paw',&
745                     'Unknown format of PAW data.',1)
746      IF (hasAttribute(pawNode, 'core_energy')) THEN
747         CALL extractDataAttribute(pawNode, 'core_energy', upf%paw%core_energy)
748      ELSE
749        upf%paw%core_energy = 0._dp
750      END IF
751      !
752      ! Full occupation (not only > 0 ones)
753      ALLOCATE( upf%paw%oc(upf%nbeta) )
754      locNode => item(getElementsByTagname(pawNode, 'PP_OCCUPATIONS'), 0)
755      CALL  extractDataContent(locNode, upf%paw%oc)
756
757      !
758      ! All-electron core charge
759      ALLOCATE( upf%paw%ae_rho_atc(upf%mesh) )
760      locNode => item(getElementsByTagname(pawNode, 'PP_AE_NLCC'), 0)
761      CALL extractDataContent(locNode, upf%paw%ae_rho_atc)
762
763      !
764      ! All-electron local potential
765      ALLOCATE( upf%paw%ae_vloc(upf%mesh) )
766      locNode => item(getElementsByTagname( pawNode, 'PP_AE_VLOC'), 0)
767      CALL extractDataContent(locNode, upf%paw%ae_vloc)
768
769      !
770      ALLOCATE(upf%paw%pfunc(upf%mesh, upf%nbeta,upf%nbeta) )
771      upf%paw%pfunc(:,:,:) = 0._dp
772      IF (upf%has_so) THEN
773         ALLOCATE(upf%paw%pfunc_rel(upf%mesh, upf%nbeta,upf%nbeta) )
774         upf%paw%pfunc_rel(:,:,:) = 0._dp
775      ENDIF
776      DO nb=1,upf%nbeta
777         DO nb1=1,nb
778            upf%paw%pfunc (1:upf%mesh, nb, nb1) = &
779                  upf%aewfc(1:upf%mesh, nb) * upf%aewfc(1:upf%mesh, nb1)
780            IF (upf%has_so) THEN
781               upf%paw%pfunc_rel (1:upf%paw%iraug, nb, nb1) =  &
782                        upf%paw%aewfc_rel(1:upf%paw%iraug, nb) *   &
783                        upf%paw%aewfc_rel(1:upf%paw%iraug, nb1)
784!
785!    The small component is added to pfunc. pfunc_rel is useful only
786!    to add a small magnetic contribution
787!
788               upf%paw%pfunc (1:upf%paw%iraug, nb, nb1) = &
789                        upf%paw%pfunc (1:upf%paw%iraug, nb, nb1) + &
790                        upf%paw%pfunc_rel (1:upf%paw%iraug, nb, nb1)
791            ENDIF
792            upf%paw%pfunc(upf%paw%iraug+1:,nb,nb1) = 0._dp
793            !
794            upf%paw%pfunc (1:upf%mesh, nb1, nb) = upf%paw%pfunc (1:upf%mesh, nb, nb1)
795            IF (upf%has_so) upf%paw%pfunc_rel (1:upf%mesh, nb1, nb) =  &
796                                upf%paw%pfunc_rel (1:upf%mesh, nb, nb1)
797         ENDDO
798      ENDDO
799      !
800      ! Pseudo wavefunctions (not only the ones for oc > 0)
801      ! All-electron wavefunctions
802      ALLOCATE(upf%paw%ptfunc(upf%mesh, upf%nbeta,upf%nbeta) )
803      upf%paw%ptfunc(:,:,:) = 0._dp
804      DO nb=1,upf%nbeta
805         DO nb1=1,upf%nbeta
806            upf%paw%ptfunc (1:upf%mesh, nb, nb1) = &
807                  upf%pswfc(1:upf%mesh, nb) * upf%pswfc(1:upf%mesh, nb1)
808            upf%paw%ptfunc(upf%paw%iraug+1:,nb,nb1) = 0._dp
809            !
810            upf%paw%ptfunc (1:upf%mesh, nb1, nb) = upf%paw%ptfunc (1:upf%mesh, nb, nb1)
811         ENDDO
812      ENDDO
813      !
814      RETURN
815   END SUBROUTINE read_upf_paw
816!
817   SUBROUTINE read_upf_gipaw(u, upf)
818      IMPLICIT NONE
819      TYPE(Node), POINTER, INTENT(IN)  :: u    ! i/o unit
820      TYPE(pseudo_upf),INTENT(INOUT)   :: upf  ! the pseudo data
821      INTEGER :: ierr ! /= 0 if something went wrong
822      !
823      INTEGER :: nb
824      TYPE(Node), POINTER   :: gpawNode, locNode, locNode2, locNode3, locNode4
825      TYPE(NodeList), POINTER  :: locList
826      IF (.not. upf%has_gipaw ) RETURN
827      !
828      gpawNode => item(getElementsByTagname(u, 'PP_GIPAW'), 0)
829         CALL extractDataAttribute(gpawNode, 'gipaw_data_format', upf%gipaw_data_format)
830      IF(upf%gipaw_data_format /= 2) &
831         CALL upf_error('read_upf_v2::gipaw','Unknown format version',-1)
832      !
833      locNode => item(getElementsByTagname(gpawNode, 'PP_GIPAW_CORE_ORBITALS'), 0)
834         CALL extractDataAttribute(locNode, 'number_of_core_orbitals', upf%gipaw_ncore_orbitals)
835      ALLOCATE ( upf%gipaw_core_orbital_n(upf%gipaw_ncore_orbitals) )
836      ALLOCATE ( upf%gipaw_core_orbital_el(upf%gipaw_ncore_orbitals) )
837      ALLOCATE ( upf%gipaw_core_orbital_l(upf%gipaw_ncore_orbitals) )
838      ALLOCATE ( upf%gipaw_core_orbital(upf%mesh,upf%gipaw_ncore_orbitals) )
839      locNode2  => getFirstChild( locNode )
840      nb = 0
841      DO
842        IF ( .NOT. ASSOCIATED(locNode2) ) EXIT
843        IF ( getNodeType( locNode2 )  == ELEMENT_NODE ) THEN
844           IF ( INDEX(getTagName(locNode2), 'PP_GIPAW_CORE_ORBITAL' ) > 0) THEN
845              nb = nb + 1
846              CALL extractDataContent(locNode2, upf%gipaw_core_orbital(:,nb) )
847              CALL extractDataAttribute(locNode2, 'label', upf%gipaw_core_orbital_el(nb))
848              CALL extractDataAttribute(locNode2, 'n',     upf%gipaw_core_orbital_n(nb))
849              CALL extractDataAttribute(locNode2, 'l',     upf%gipaw_core_orbital_l(nb))
850           END IF
851        END IF
852        locNode3 => locNode2
853        locNode2 => getNextSibling(locNode3)
854      ENDDO
855      !
856      ! Read valence all-electron and pseudo orbitals and their labels
857      !
858      IF (upf%paw_as_gipaw) THEN
859         !READ PAW DATA INSTEAD OF GIPAW
860         upf%gipaw_wfs_nchannels = upf%nbeta
861         ALLOCATE ( upf%gipaw_wfs_el(upf%gipaw_wfs_nchannels) )
862         ALLOCATE ( upf%gipaw_wfs_ll(upf%gipaw_wfs_nchannels) )
863         ALLOCATE ( upf%gipaw_wfs_rcut(upf%gipaw_wfs_nchannels) )
864         ALLOCATE ( upf%gipaw_wfs_rcutus(upf%gipaw_wfs_nchannels) )
865         ALLOCATE ( upf%gipaw_wfs_ae(upf%mesh,upf%gipaw_wfs_nchannels) )
866         ALLOCATE ( upf%gipaw_wfs_ps(upf%mesh,upf%gipaw_wfs_nchannels) )
867         DO nb = 1,upf%gipaw_wfs_nchannels
868            upf%gipaw_wfs_el(nb) = upf%els_beta(nb)
869            upf%gipaw_wfs_ll(nb) = upf%lll(nb)
870            upf%gipaw_wfs_ae(:,nb) = upf%aewfc(:,nb)
871         ENDDO
872         DO nb = 1,upf%gipaw_wfs_nchannels
873            upf%gipaw_wfs_ps(:,nb) = upf%pswfc(:,nb)
874         ENDDO
875         ALLOCATE ( upf%gipaw_vlocal_ae(upf%mesh) )
876         ALLOCATE ( upf%gipaw_vlocal_ps(upf%mesh) )
877         upf%gipaw_vlocal_ae(:)= upf%paw%ae_vloc(:)
878         upf%gipaw_vlocal_ps(:)= upf%vloc(:)
879         DO nb = 1,upf%gipaw_wfs_nchannels
880            upf%gipaw_wfs_rcut(nb)=upf%rcut(nb)
881            upf%gipaw_wfs_rcutus(nb)=upf%rcutus(nb)
882         ENDDO
883      ELSEIF (upf%tcoulombp) THEN
884         upf%gipaw_wfs_nchannels = 1
885         ALLOCATE ( upf%gipaw_wfs_el(upf%gipaw_wfs_nchannels) )
886         ALLOCATE ( upf%gipaw_wfs_ll(upf%gipaw_wfs_nchannels) )
887         ALLOCATE ( upf%gipaw_wfs_rcut(upf%gipaw_wfs_nchannels) )
888         ALLOCATE ( upf%gipaw_wfs_rcutus(upf%gipaw_wfs_nchannels) )
889         ALLOCATE ( upf%gipaw_wfs_ae(upf%mesh,upf%gipaw_wfs_nchannels) )
890         ALLOCATE ( upf%gipaw_wfs_ps(upf%mesh,upf%gipaw_wfs_nchannels) )
891         DO nb = 1,upf%gipaw_wfs_nchannels
892            upf%gipaw_wfs_el(nb) = "1S"
893            upf%gipaw_wfs_ll(nb) = 0
894            upf%gipaw_wfs_ae(:,nb) = 0.0d0
895            upf%gipaw_wfs_ps(:,nb) = 0.0d0
896         ENDDO
897         ALLOCATE ( upf%gipaw_vlocal_ae(upf%mesh) )
898         ALLOCATE ( upf%gipaw_vlocal_ps(upf%mesh) )
899         upf%gipaw_vlocal_ae(:)=  0.0d0
900         upf%gipaw_vlocal_ps(:)=  0.0d0
901         DO nb = 1,upf%gipaw_wfs_nchannels
902            upf%gipaw_wfs_rcut(nb)=1.0d0
903            upf%gipaw_wfs_rcutus(nb)=1.0d0
904         ENDDO
905      ELSE
906         locNode => item(getElementsByTagname(gpawNode, 'PP_GIPAW_ORBITALS'), 0)
907         CALL extractDataAttribute(locNode, 'number_of_valence_orbitals', upf%gipaw_wfs_nchannels)
908
909         ALLOCATE ( upf%gipaw_wfs_el(upf%gipaw_wfs_nchannels) )
910         ALLOCATE ( upf%gipaw_wfs_ll(upf%gipaw_wfs_nchannels) )
911         ALLOCATE ( upf%gipaw_wfs_rcut(upf%gipaw_wfs_nchannels) )
912         ALLOCATE ( upf%gipaw_wfs_rcutus(upf%gipaw_wfs_nchannels) )
913         ALLOCATE ( upf%gipaw_wfs_ae(upf%mesh,upf%gipaw_wfs_nchannels) )
914         ALLOCATE ( upf%gipaw_wfs_ps(upf%mesh,upf%gipaw_wfs_nchannels) )
915
916         locNode2 => getFirstChild(locNode)
917         nb = 0
918         DO
919            IF (.NOT. ASSOCIATED( locNode2 ))  EXIT
920            !
921            IF ( getNodeType( locNode2 ) == ELEMENT_NODE)  THEN
922               IF ( index( getTagName( locNode2 ), "PP_GIPAW_ORBITAL." )> 0) THEN
923                  nb = nb + 1
924                  CALL extractDataAttribute(locNode2, 'label', upf%gipaw_wfs_el(nb))
925                  CALL extractDataAttribute(locNode2, 'l',     upf%gipaw_wfs_ll(nb))
926                  CALL extractDataAttribute(locNode2, 'cutoff_radius',           upf%gipaw_wfs_rcut(nb))
927                  IF (hasAttribute(locNode, 'ultrasoft_cutoff_radius') ) THEN
928                     CALL extractDataAttribute(locNode, 'ultrasoft_cutoff_radius', upf%gipaw_wfs_rcutus(nb) )
929                  ELSE
930                     upf%gipaw_wfs_rcutus(nb) = upf%gipaw_wfs_rcut(nb)
931                  END IF
932                  ! read all-electron orbital
933                  locNode4 => item( getElementsByTagname(locNode2, 'PP_GIPAW_WFS_AE'), 0)
934                  CALL extractDataContent(locNode4, upf%gipaw_wfs_ae(:,nb))
935                  ! read pseudo orbital
936                  locNode4 => item( getElementsByTagname( locNode2, 'PP_GIPAW_WFS_PS'), 0)
937                  CALL extractDataContent(locNode4, upf%gipaw_wfs_ps(:,nb))
938               END IF
939           END IF
940           locNode3 => locNode2
941           locNode2 => getNextSibling(locNode3)
942         !
943         ENDDO
944      !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
945      ! Read all-electron and pseudo local potentials
946         ALLOCATE ( upf%gipaw_vlocal_ae(upf%mesh) )
947         ALLOCATE ( upf%gipaw_vlocal_ps(upf%mesh) )
948         locNode => item(getElementsByTagname( gpawNode, 'PP_GIPAW_VLOCAL'), 0)
949           !
950           locNode2 => item(getElementsBytagname( locNode, 'PP_GIPAW_VLOCAL_AE'), 0)
951              CALL extractDataContent (locNode2, upf%gipaw_vlocal_ae(:))
952           !
953           locNode2 => item(getElementsByTagname( locNode, 'PP_GIPAW_VLOCAL_PS'), 0)
954              CALL extractDataContent(locNode2, upf%gipaw_vlocal_ps(:))
955      ENDIF
956      RETURN
957   END SUBROUTINE read_upf_gipaw
958!
959#endif
960END MODULE read_upf_v2_module
961