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