LCOV - code coverage report
Current view: top level - src/57_iopsp_parser - read_upf_new.F90 (source / functions) Coverage Total Hit
Test: coverage.info Lines: 38.3 % 481 184
Test Date: 2026-09-20 15:27:41 Functions: 85.7 % 14 12

            Line data    Source code
       1              : !
       2              : ! Copyright (C) 2020 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              : !--------------------------------------------------------
       9              : 
      10              : 
      11              : #if defined HAVE_CONFIG_H
      12              : #include "config.h"
      13              : #endif
      14              : 
      15              : #include "abi_common.h"
      16              : 
      17              : MODULE  read_upf_new_module
      18              :   !-----------------------------------------------------
      19              :   !! this module contains the simplified code for reading
      20              :   !! pseudopotential files in either UPF v.2 or xml
      21              :   !
      22              :   USE xmltools
      23              :   !USE upf_kinds, ONLY: dp
      24              :   use defs_basis, only : dp, std_out
      25              :   USE pseudo_types, ONLY: pseudo_upf, pseudo_config
      26              : 
      27              :   IMPLICIT NONE
      28              : 
      29              :   !
      30              :   LOGICAL :: v2
      31              :   !! true if UPF v.2 version, false if new UPF with xml schema
      32              :   INTEGER :: iun
      33              :   !! unit for reading data
      34              :   !
      35              :   PUBLIC
      36              :   !
      37              : CONTAINS
      38              :   !
      39              :   !------------------------------------------------+
      40           16 :   SUBROUTINE read_upf_new (filename, upf, ierr)         !
      41              :     !---------------------------------------------+
      42              :     !! Reads pseudopotential in UPF format (either v.2 or upf_schema).
      43              :     !! Derived-type variable *upf* store in output the data read from file.
      44              :     !! File *filename* is opened and closed inside the routine
      45              :     !
      46              :     !IMPLICIT NONE
      47              :     CHARACTER(len=*), INTENT(IN) :: filename
      48              :     !! i/o filename
      49              :     TYPE(pseudo_upf),INTENT(OUT) :: upf
      50              :     !! the derived type storing the pseudo data
      51              :     INTEGER, INTENT(OUT) :: ierr
      52              :     !! ierr=0  : xml schema, ierr=-2: UPF v.2
      53              :     !! ierr=-81: error reading PP file
      54              :     !
      55           16 :     iun = xml_open_file ( filename )
      56           16 :     IF ( iun == -1 ) CALL upf_error('read_upf', 'cannot open file',1)
      57           16 :     call xmlr_opentag ( 'qe_pp:pseudo', IERR = ierr )
      58           16 :     if ( ierr == 0 ) then
      59            0 :        v2 =.false.
      60           16 :     else if ( ierr == 1 ) then
      61           16 :        rewind (iun)
      62           16 :        call xmlr_opentag ( 'UPF', IERR = ierr )
      63           16 :        if ( ierr == 0 ) then
      64           16 :           v2 =.true.
      65           16 :           ierr = -2
      66           16 :           CALL get_attr ( 'version', upf%nv )
      67              :        end if
      68              :     end if
      69           16 :     if ( ierr /= 0 .and. ierr /= -2 ) then
      70            0 :        call xml_closefile( )
      71            0 :        ierr = -81
      72            0 :        return
      73              :     end if
      74              :     !
      75              :     ! The header sections differ a lot between UPF v.2 and UPF with schema
      76              :     !
      77           16 :     IF ( v2 ) THEN
      78           16 :        CALL read_pp_header_v2 ( upf )
      79              :     ELSE
      80            0 :        CALL read_pp_header_schema ( upf )
      81              :     END IF
      82              :     ! compatibility
      83           16 :     upf%is_gth = .false.
      84           16 :     upf%is_multiproj = .true.
      85           16 :     upf%with_metagga_info = .false.
      86              :     !
      87              :     ! From here on the format of v2 and schema do not differ much:
      88              :     ! the most frequent difference is capitalization of tags
      89              :     ! (see function capitalize_if_v2)
      90              :     !
      91           16 :     CALL read_pp_mesh ( upf )
      92              :     !
      93           48 :     allocate ( upf%rho_atc(upf%mesh) )
      94           16 :     IF(upf%nlcc) then
      95              :        CALL xmlr_readtag( capitalize_if_v2('pp_nlcc'), &
      96           16 :             upf%rho_atc(:) )
      97              :     else
      98            0 :        upf%rho_atc(:) = 0.0_dp
      99              :     end if
     100           16 :     IF( .NOT. upf%tcoulombp) then
     101           48 :        allocate ( upf%vloc(upf%mesh) )
     102              :        CALL xmlr_readtag( capitalize_if_v2('pp_local'), &
     103           16 :             upf%vloc(:), ierr )
     104              :        !
     105              :        ! existing PP files may have pp_nlcc first, pp_local later,
     106              :        ! but also the other way round - check that everything was right
     107              :        !
     108           16 :        if ( ierr /= 0 ) then
     109            0 :           ierr = -81
     110            0 :           return
     111              :        end if
     112              :     end if
     113              :     !
     114           16 :     CALL read_pp_semilocal ( upf )
     115              :     !
     116           16 :     CALL read_pp_nonlocal ( upf )
     117              :     !
     118           16 :     CALL read_pp_pswfc ( upf )
     119              :     !
     120           16 :     CALL read_pp_full_wfc ( upf )
     121              :     !
     122           48 :     allocate( upf%rho_at(1:upf%mesh) )
     123              :     CALL xmlr_readtag( capitalize_if_v2('pp_rhoatom'), &
     124           16 :          upf%rho_at(1:upf%mesh) )
     125              :     !
     126           48 :     allocate( upf%tau_at(1:upf%mesh) )
     127              :     CALL xmlr_readtag( capitalize_if_v2('pp_tauatom'), &
     128           16 :          upf%tau_at(1:upf%mesh) )
     129              :     !
     130           48 :     allocate( upf%tau_mod(1:upf%mesh) )
     131              :     CALL xmlr_readtag( capitalize_if_v2('pp_taumod'), &
     132           16 :          upf%tau_mod(1:upf%mesh) )
     133              :     !
     134           16 :     CALL read_pp_spinorb ( upf )
     135              :     !
     136           16 :     CALL read_pp_paw ( upf )
     137              :     !
     138           16 :     CALL read_pp_gipaw ( upf )
     139              :     !
     140              :     ! close initial tag, qe_pp:pseudo or UPF
     141              :     !
     142           16 :     CALL xmlr_closetag ( )
     143              :     !
     144           16 :     CALL xml_closefile ( )
     145              :     !
     146           16 :   END SUBROUTINE read_upf_new
     147              :   !
     148          192 :   FUNCTION capitalize_if_v2 ( strin ) RESULT ( strout )
     149              :     !
     150              :     ! returns a capitalized string for UPF v.2, the same string otherwise
     151              :     ! (UPF v.2 uses capitalized tags, UPF with schema use lowercase)
     152              :     !
     153              :     USE upf_utils, ONLY: capital
     154              :     !IMPLICIT NONE
     155              :     CHARACTER(LEN=*) :: strin
     156              :     !
     157              :     INTEGER :: n
     158              :     CHARACTER(LEN=:), ALLOCATABLE :: strout
     159              :     !
     160          192 :     IF ( v2 ) THEN
     161          192 :        strout = ''
     162         1712 :        DO n = 1,LEN_TRIM(strin)
     163         1712 :           strout = strout // capital(strin(n:n))
     164              :        END DO
     165              :     ELSE
     166            0 :        strout = TRIM(strin)
     167              :     END IF
     168              :     !
     169          192 :   END FUNCTION capitalize_if_v2
     170              :   !--------------------------------------------------------
     171            0 :   SUBROUTINE read_pp_header_schema ( upf )
     172              :     !--------------------------------------------------------
     173              :     !
     174              :     !IMPLICIT NONE
     175              :     TYPE(pseudo_upf), INTENT(INOUT) :: upf ! the pseudo data
     176              :     !
     177            0 :     CALL xmlr_opentag( capitalize_if_v2('pp_header') )
     178              :     !
     179            0 :     CALL xmlr_readtag( 'element', upf%psd )
     180            0 :     CALL xmlr_readtag( 'z_valence', upf%zp )
     181            0 :     CALL xmlr_readtag( 'type', upf%typ )
     182            0 :     CALL xmlr_readtag( 'functional', upf%dft )
     183            0 :     call remove_non_ascii(upf%dft)
     184              : 
     185            0 :     CALL xmlr_readtag( 'relativistic', upf%rel )
     186            0 :     CALL xmlr_readtag( 'is_ultrasoft', upf%tvanp )
     187            0 :     CALL xmlr_readtag( 'is_paw', upf%tpawp )
     188            0 :     CALL xmlr_readtag( 'is_coulomb', upf%tcoulombp )
     189            0 :     CALL xmlr_readtag( 'with_metagga_info', upf%with_metagga_info )
     190            0 :     CALL xmlr_readtag( 'has_so', upf%has_so )
     191            0 :     CALL xmlr_readtag( 'has_wfc', upf%has_wfc )
     192            0 :     CALL xmlr_readtag( 'has_gipaw', upf%has_gipaw )
     193            0 :     CALL xmlr_readtag( 'paw_as_gipaw', upf%paw_as_gipaw)
     194            0 :     CALL xmlr_readtag( 'core_correction', upf%nlcc)
     195            0 :     CALL xmlr_readtag( 'total_psenergy', upf%etotps )
     196            0 :     CALL xmlr_readtag( 'wfc_cutoff', upf%ecutwfc )
     197            0 :     CALL xmlr_readtag( 'rho_cutoff', upf%ecutrho )
     198            0 :     CALL xmlr_readtag( 'l_max', upf%lmax )
     199            0 :     CALL xmlr_readtag( 'l_max_rho', upf%lmax_rho )
     200            0 :     CALL xmlr_readtag( 'l_local', upf%lloc )
     201            0 :     CALL xmlr_readtag( 'mesh_size', upf%mesh )
     202            0 :     CALL xmlr_readtag( 'number_of_wfc', upf%nwfc )
     203            0 :     CALL xmlr_readtag( 'number_of_proj', upf%nbeta )
     204              :     !
     205            0 :     CALL xmlr_closetag( )
     206              :     !
     207            0 :   END SUBROUTINE read_pp_header_schema
     208              :   !
     209              :   !--------------------------------------------------------
     210           16 :   SUBROUTINE read_pp_header_v2 ( upf )
     211              :     !--------------------------------------------------------
     212              :     !
     213              :     !IMPLICIT NONE
     214              :     TYPE(pseudo_upf), INTENT(INOUT) :: upf ! the pseudo data
     215              :     !
     216              :     CHARACTER(LEN=1) :: dummy
     217              :     !
     218           16 :     CALL xmlr_readtag ( capitalize_if_v2('pp_header'), dummy )
     219           16 :     CALL get_attr ('generated', upf%generated)
     220           16 :     CALL get_attr ('author', upf%author)
     221           16 :     CALL get_attr ('date', upf%date)
     222           16 :     CALL get_attr ('comment', upf%comment)
     223           16 :     CALL get_attr ('element', upf%psd)
     224           16 :     CALL get_attr ('pseudo_type', upf%typ)
     225           16 :     CALL get_attr ('relativistic', upf%rel)
     226           16 :     CALL get_attr ('is_ultrasoft', upf%tvanp)
     227           16 :     CALL get_attr ('is_paw', upf%tpawp)
     228           16 :     CALL get_attr ('is_coulomb', upf%tcoulombp)
     229           16 :     CALL get_attr ('with_metagga_info', upf%with_metagga_info)
     230           16 :     CALL get_attr ('has_so', upf%has_so)
     231           16 :     CALL get_attr ('has_wfc', upf%has_wfc)
     232           16 :     CALL get_attr ('has_gipaw', upf%has_gipaw)
     233           16 :     CALL get_attr ('paw_as_gipaw', upf%paw_as_gipaw)
     234           16 :     CALL get_attr ('core_correction', upf%nlcc)
     235           16 :     CALL get_attr ('functional', upf%dft)
     236           16 :     call remove_non_ascii(upf%dft)
     237           16 :     CALL get_attr ('z_valence', upf%zp)
     238           16 :     CALL get_attr ('total_psenergy', upf%etotps)
     239           16 :     CALL get_attr ('wfc_cutoff', upf%ecutwfc)
     240           16 :     CALL get_attr ('rho_cutoff', upf%ecutrho)
     241           16 :     CALL get_attr ('l_max', upf%lmax)
     242           16 :     CALL get_attr ('l_max_rho', upf%lmax_rho)
     243           16 :     CALL get_attr ('l_local', upf%lloc)
     244           16 :     CALL get_attr ('mesh_size', upf%mesh)
     245           16 :     CALL get_attr ('number_of_wfc', upf%nwfc)
     246           16 :     CALL get_attr ('number_of_proj', upf%nbeta )
     247              :     !
     248           16 :   END SUBROUTINE read_pp_header_v2
     249              :   !
     250              :   !--------------------------------------------------------
     251           16 :   SUBROUTINE read_pp_mesh ( upf )
     252              :     !--------------------------------------------------------
     253              :     !
     254              :     !IMPLICIT NONE
     255              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     256              :     integer :: mesh
     257              :     !
     258           16 :     CALL xmlr_opentag( capitalize_if_v2('pp_mesh') )
     259           16 :     CALL get_attr ( 'mesh', mesh )
     260           16 :     if ( mesh == 0 ) THEN
     261              : #if defined (__debug)
     262              :        call upf_error('read_pp_mesh',&
     263              :          'mesh size missing, using the one in header',-1)
     264              : #else
     265              :        continue
     266              : #endif
     267            0 :     else if ( mesh /= upf%mesh ) THEN
     268              :        call upf_error('read_pp_mesh',&
     269            0 :          'mismatch in mesh size, discarding the one in header',-1)
     270            0 :        upf%mesh = mesh
     271              :     end if
     272           16 :     CALL get_attr ( 'dx'  , upf%dx   )
     273           16 :     CALL get_attr ( 'xmin', upf%xmin )
     274           16 :     CALL get_attr ( 'rmax', upf%rmax )
     275           16 :     CALL get_attr ( 'zmesh', upf%zmesh )
     276           48 :     allocate ( upf%r(1:upf%mesh) )
     277           16 :     CALL xmlr_readtag( capitalize_if_v2('pp_r'), upf%r(1:upf%mesh) )
     278           48 :     allocate ( upf%rab(1:upf%mesh) )
     279           16 :     CALL xmlr_readtag( capitalize_if_v2('pp_rab'), upf%rab(1:upf%mesh) )
     280              :     !
     281           16 :     CALL xmlr_closetag( ) ! end pp_mesh
     282              :     !
     283           16 :   END SUBROUTINE read_pp_mesh
     284              :   !
     285              :   !--------------------------------------------------------
     286           16 :   SUBROUTINE read_pp_semilocal ( upf )
     287              :     !--------------------------------------------------------
     288              :     !
     289              :     IMPLICIT NONE
     290              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     291              :     !
     292              :     INTEGER :: nb, ind, l, j, ierr
     293              :     CHARACTER(LEN=8) :: tag
     294           16 :     real(dp), allocatable :: vnl(:)
     295              :     !
     296           16 :     IF ( upf%typ == "SL" ) THEN
     297              :        !
     298            0 :        IF ( upf%has_so ) then
     299            0 :           ALLOCATE(upf%vnl(upf%mesh,0:upf%lmax,2))
     300              :        else
     301            0 :           ALLOCATE(upf%vnl(upf%mesh,0:upf%lmax,1))
     302              :        end if
     303            0 :        allocate ( vnl(1:upf%mesh) )
     304            0 :        CALL xmlr_opentag( capitalize_if_v2('pp_semilocal') )
     305              :        !
     306            0 :        tag = 'vnl'
     307            0 :        DO nb = 1,upf%nbeta
     308            0 :           IF ( v2 ) THEN
     309              :              ! NOTA BENE: v2 format follows available PP files, written
     310              :              ! using original write_upf_v2; not FoX-based write_upf_v2
     311            0 :              IF ( nb - 1 == upf%lloc ) CYCLE
     312            0 :              tag = 'PP_VNL.'//i2c(nb-1)
     313              :           END IF
     314            0 :           CALL xmlr_readtag( tag, vnl, ierr )
     315            0 :           if ( ierr /= 0 ) &
     316            0 :                call upf_error('read_pp_semilocal','error reading SL PPs',1)
     317            0 :           CALL get_attr ( 'l', l)
     318            0 :           ind = 1
     319            0 :           IF ( upf%has_so ) then
     320            0 :              CALL get_attr ( 'j', j)
     321            0 :              IF ( l > 0 .AND. ABS(j-l-0.5_dp) < 0.001_dp ) ind = 2
     322              :              ! FIXME: what about spin-orbit case for v.2 upf?
     323            0 :              if ( v2 ) &
     324            0 :                   call upf_error('read_pp_semilocal','check spin-orbit',1)
     325              :           END IF
     326            0 :           upf%vnl(:,l,ind) = vnl(:)
     327              :        END DO
     328            0 :        deallocate ( vnl )
     329              :        !
     330            0 :        CALL xmlr_closetag( ) ! end pp_semilocal
     331              :        !
     332              :     END IF
     333              :     !
     334           16 :   END SUBROUTINE read_pp_semilocal
     335              :   !
     336              :   !--------------------------------------------------------
     337           16 :   SUBROUTINE read_pp_nonlocal ( upf )
     338              :     !--------------------------------------------------------
     339              :     !
     340              :     IMPLICIT NONE
     341              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     342              :     !
     343              :     LOGICAL :: isnull
     344              :     INTEGER :: nb, l, l_, ln, lm, mb, nmb !ind,
     345              :     CHARACTER(LEN=15) :: tag
     346           16 :     REAL(dp), ALLOCATABLE :: aux(:)
     347              :     !
     348           16 :     nb = upf%nbeta
     349           16 :     IF ( nb == 0 ) nb = 1
     350           64 :     ALLOCATE (upf%beta(upf%mesh,nb) )
     351            0 :     ALLOCATE (upf%els_beta(nb), &
     352            0 :               upf%lll(nb),      &
     353            0 :               upf%kbeta(nb),    &
     354            0 :               upf%rcut(nb),     &
     355            0 :               upf%rcutus(nb),   &
     356            0 :               upf%dion(nb,nb),  &
     357          208 :               upf%qqq(nb,nb)    )
     358              :     !
     359           28 :     IF (upf%has_so) ALLOCATE( upf%jjj(upf%nbeta))
     360              :     !
     361           16 :     IF ( upf%nbeta == 0 ) THEN
     362            0 :        upf%nqf = 0
     363            0 :        upf%nqlc= 0
     364            0 :        upf%kkbeta = 0
     365            0 :        upf%qqq_eps=-1.0_dp
     366              :        RETURN
     367              :     END IF
     368              :     !
     369           16 :     CALL xmlr_opentag( capitalize_if_v2('pp_nonlocal') )
     370              :     !
     371          133 :     DO nb = 1,upf%nbeta
     372              :        !
     373          117 :        IF ( v2 ) THEN
     374          117 :           tag = 'PP_BETA.'//i2c(nb)
     375              :        ELSE
     376            0 :           tag = 'pp_beta'
     377              :        END IF
     378          117 :        CALL xmlr_readtag( tag, upf%beta(1:upf%mesh,nb) )
     379          117 :        CALL get_attr('index', mb)
     380              :        ! not-so-strict test: index is absent or incorrect in some UPF v.2 files
     381          117 :        IF ( .NOT. v2 .AND. nb /= mb ) &
     382            0 :             CALL upf_error('read_pp_nonlocal','mismatch',nb)
     383          117 :        CALL get_attr('label', upf%els_beta(nb))
     384          117 :        CALL get_attr('angular_momentum', upf%lll(nb))
     385          117 :        IF ( .NOT. v2 .AND. upf%has_so ) &
     386            0 :             CALL get_attr('tot_ang_mom', upf%jjj(nb))
     387          117 :        CALL get_attr('cutoff_radius_index', upf%kbeta(nb))
     388          117 :        CALL get_attr('cutoff_radius', upf%rcut(nb))
     389          250 :        CALL get_attr('ultrasoft_cutoff_radius', upf%rcutus(nb))
     390              :        !
     391              :     END DO
     392              :     !
     393              :     ! pp_dij (D_lm matrix)
     394              :     !
     395           16 :     CALL xmlr_readtag ( capitalize_if_v2 ('pp_dij'), upf%dion )
     396              :     !
     397              :     ! pp_augmentation
     398              :     !
     399           16 :     IF (upf%tvanp .or. upf%tpawp) THEN
     400            0 :        CALL xmlr_opentag( capitalize_if_v2('pp_augmentation') )
     401              :        !
     402            0 :        IF ( v2 ) THEN
     403            0 :           CALL get_attr ( 'q_with_l', upf%q_with_l )
     404            0 :           CALL get_attr ( 'nqf', upf%nqf )
     405            0 :           CALL get_attr ( 'nqlc', upf%nqlc )
     406            0 :           IF (upf%tpawp) THEN
     407            0 :              CALL get_attr ( 'shape', upf%paw%augshape )
     408            0 :              CALL get_attr ( 'cutoff_r', upf%paw%raug )
     409            0 :              CALL get_attr ( 'cutoff_r_index', upf%paw%iraug )
     410            0 :              CALL get_attr ( 'augmentation_epsilon', upf%qqq_eps )
     411            0 :              CALL get_attr ( 'l_max_aug', upf%paw%lmax_aug )
     412              :           ENDIF
     413              :        ELSE
     414            0 :           CALL xmlr_readtag( 'q_with_l', upf%q_with_l )
     415            0 :           CALL xmlr_readtag( 'nqf', upf%nqf )
     416            0 :           CALL xmlr_readtag( 'nqlc', upf%nqlc )
     417            0 :           IF (upf%tpawp) THEN
     418            0 :              CALL xmlr_readtag( 'shape', upf%paw%augshape )
     419            0 :              CALL xmlr_readtag( 'cutoff_r', upf%paw%raug )
     420            0 :              CALL xmlr_readtag( 'cutoff_r_index', upf%paw%iraug )
     421            0 :              CALL xmlr_readtag( 'augmentation_epsilon', upf%qqq_eps )
     422            0 :              CALL xmlr_readtag( 'l_max_aug', upf%paw%lmax_aug )
     423              :           ENDIF
     424              :        ENDIF
     425              :        !
     426            0 :        CALL xmlr_readtag( capitalize_if_v2('pp_q'), upf%qqq )
     427              :        !
     428            0 :        IF ( upf%tpawp ) THEN
     429            0 :           ALLOCATE ( upf%paw%augmom(1:upf%nbeta,1:upf%nbeta,0:2*upf%lmax) )
     430            0 :           CALL xmlr_readtag( capitalize_if_v2('pp_multipoles'), upf%paw%augmom )
     431              :        ENDIF
     432              :        !
     433              :        ! read polinomial coefficients for Q_ij expansion at small radius
     434              :        !
     435            0 :        IF ( upf%nqlc == 0 ) upf%nqlc = 2*upf%lmax+1
     436            0 :        ALLOCATE( upf%rinner( upf%nqlc ) )
     437            0 :        IF ( v2 .AND. upf%nqf > 0) THEN
     438            0 :           ALLOCATE ( upf%qfcoef(upf%nqf, upf%nqlc, upf%nbeta, upf%nbeta) )
     439            0 :           CALL xmlr_opentag('PP_QFCOEF')
     440            0 :           READ(iun,*) upf%qfcoef
     441            0 :           CALL xmlr_closetag ()
     442            0 :           CALL xmlr_readtag('PP_RINNER',upf%rinner)
     443            0 :        ELSE IF ( upf%nqf == 0 ) THEN
     444            0 :           ALLOCATE( upf%qfcoef(1,1,1,1) )
     445            0 :           upf%qfcoef =0.0_dp
     446              :        ENDIF
     447              :        !
     448              :        ! Read augmentation charge Q_ij
     449              :        !
     450            0 :        IF( upf%q_with_l ) THEN
     451            0 :           ALLOCATE( upf%qfuncl(upf%mesh,upf%nbeta*(upf%nbeta+1)/2,0:2*upf%lmax) )
     452            0 :           upf%qfuncl(:,:,:) = 0.0_dp
     453              :           ! NOTE: it would be wiser to dimension qfuncl as (:,:,0:upf%lmax)
     454              :           ! and store the q_l(r) with index l=L/2 (see loop_on_l below)
     455              :           ! This would save some storage and avoid "holes" in the array
     456              :           ! that may be a source of trouble if not initialized to zero
     457              :        ELSE
     458            0 :           ALLOCATE ( upf%qfunc(upf%mesh,upf%nbeta*(upf%nbeta+1)/2) )
     459            0 :           upf%qfunc (:,:) = 0.0_dp
     460              :        END IF
     461            0 :        ALLOCATE ( aux(upf%mesh) )
     462            0 :        loop_on_nb: DO nb = 1,upf%nbeta
     463            0 :           ln = upf%lll(nb)
     464            0 :           loop_on_mb: DO mb = nb,upf%nbeta
     465            0 :              lm = upf%lll(mb)
     466            0 :              IF( upf%q_with_l ) THEN
     467            0 :                 loop_on_l: DO l = abs(ln-lm),ln+lm,2 ! only even terms
     468            0 :                    isnull = .FALSE.
     469            0 :                    IF( upf%tpawp ) isnull = (abs(upf%paw%augmom(nb,mb,l)) < upf%qqq_eps)
     470            0 :                    IF(isnull) CYCLE loop_on_l
     471            0 :                    IF ( v2 ) THEN
     472            0 :                       tag = 'PP_QIJL.'//i2c(nb)//'.'//i2c(mb)//'.'//i2c(l)
     473              :                    ELSE
     474            0 :                       tag = 'pp_qijl'
     475              :                    END IF
     476            0 :                    CALL xmlr_readtag( tag, aux )
     477            0 :                    CALL get_attr ('composite_index', nmb)
     478            0 :                    IF ( nmb /= mb*(mb-1)/2 + nb ) &
     479            0 :                         CALL upf_error ('read_pp_nonlocal','mismatch',1)
     480            0 :                    CALL get_attr ('angular_momentum', l_)
     481            0 :                    IF ( l /= l_ ) CALL upf_error ('read_pp_nonlocal','mismatch',2)
     482            0 :                    upf%qfuncl(:,nmb,l) = aux(:)
     483            0 :                    IF (upf%tpawp) upf%qfuncl(upf%paw%iraug+1:,nmb,l) = 0._DP
     484              :                 ENDDO loop_on_l
     485              :              ELSE
     486            0 :                 isnull = .FALSE.
     487            0 :                 IF  ( upf%tpawp ) isnull = ( abs(upf%qqq(nb,mb)) < upf%qqq_eps )
     488            0 :                 IF (isnull) CYCLE loop_on_mb
     489            0 :                 IF ( v2 ) THEN
     490            0 :                    tag = 'PP_QIJ.'//i2c(nb)//'.'//i2c(mb)
     491              :                 ELSE
     492            0 :                    tag = 'pp_qij'
     493              :                 END IF
     494            0 :                 CALL xmlr_readtag( tag, aux )
     495            0 :                 CALL get_attr ('composite_index', nmb)
     496            0 :                 IF ( nmb /= mb*(mb-1)/2 + nb ) &
     497            0 :                      CALL upf_error ('read_pp_nonlocal','mismatch',3)
     498            0 :                 upf%qfunc(:,nmb) = aux(:)
     499              :                 !
     500              :              ENDIF
     501              :           ENDDO loop_on_mb
     502              :        ENDDO  loop_on_nb
     503              :        !
     504            0 :        DEALLOCATE (aux)
     505            0 :        CALL xmlr_closetag( ) ! end pp_augmentation
     506              :        !
     507              :     END IF
     508           16 :     CALL xmlr_closetag( ) ! end pp_nonlocal
     509              :     !
     510              :     ! Maximum radius of beta projector: outer radius to integrate
     511          133 :     upf%kkbeta = MAXVAL(upf%kbeta(1:upf%nbeta))
     512              :     ! For PAW, augmentation charge may extend a bit further:
     513           16 :     IF(upf%tpawp) upf%kkbeta = MAX(upf%kkbeta, upf%paw%iraug)
     514              :     !
     515           16 :   END SUBROUTINE read_pp_nonlocal
     516              :   !
     517              :   !--------------------------------------------------------
     518           16 :   SUBROUTINE read_pp_pswfc ( upf )
     519              :     !--------------------------------------------------------
     520              :     !
     521              :     !IMPLICIT NONE
     522              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     523              :     !
     524              :     INTEGER :: nw, ind !, l
     525              :     CHARACTER(LEN=8) :: tag
     526              :     !
     527           64 :     allocate ( upf%chi(1:upf%mesh,upf%nwfc) )
     528            0 :     allocate ( upf%els(upf%nwfc), &
     529            0 :                 upf%oc(upf%nwfc), &
     530            0 :                 upf%lchi(upf%nwfc), &
     531            0 :                 upf%nchi(upf%nwfc), &
     532            0 :                 upf%rcut_chi(upf%nwfc), &
     533            0 :                 upf%rcutus_chi(upf%nwfc), &
     534          160 :                 upf%epseu(upf%nwfc) )
     535           16 :     IF ( upf%has_so ) THEN
     536           12 :        allocate ( upf%nn(upf%nwfc) )
     537           12 :        allocate ( upf%jchi(upf%nwfc) )
     538              :     END IF
     539              :     !
     540           16 :     CALL xmlr_opentag( capitalize_if_v2('pp_pswfc') )
     541           70 :     DO nw=1,upf%nwfc
     542           54 :        IF ( v2 ) THEN
     543           54 :           tag = 'PP_CHI.'//i2c(nw)
     544              :        ELSE
     545            0 :           tag = 'pp_chi'
     546              :        END IF
     547           54 :        CALL xmlr_readtag( tag, upf%chi(1:upf%mesh,nw) )
     548           54 :        call get_attr('index', ind)
     549              :        ! not-so-strict test: index is absent or incorrect in some UPF v.2 files
     550           54 :        if ( .NOT. v2 .AND. ind /= nw ) &
     551            0 :             call upf_error('read_pp_pswfc','mismatch reading PSWFC', nw)
     552           54 :        call get_attr( 'label', upf%els(nw) )
     553           54 :        call get_attr( 'l', upf%lchi(nw) )
     554           54 :        IF ( .not. v2 .and. upf%has_so ) THEN
     555            0 :           call get_attr( 'nn', upf%nn(nw) )
     556            0 :           call get_attr( 'jchi', upf%jchi(nw) )
     557              :        END IF
     558           54 :        call get_attr( 'occupation', upf%oc(nw) )
     559           54 :        call get_attr( 'n', upf%nchi(nw) )
     560           54 :        call get_attr( 'pseudo_energy', upf%epseu(nw) )
     561           54 :        call get_attr( 'cutoff_radius', upf%rcut_chi(nw) )
     562          124 :        call get_attr( 'ultrasoft_cutoff_radius', upf%rcutus_chi(nw) )
     563              :     END DO
     564           16 :     CALL xmlr_closetag( ) ! end pp_pswfc
     565              :     !
     566           16 :   END SUBROUTINE read_pp_pswfc
     567              :   !
     568              :   !--------------------------------------------------------
     569           16 :   SUBROUTINE read_pp_full_wfc ( upf )
     570              :     !--------------------------------------------------------
     571              :     !
     572              :     !IMPLICIT NONE
     573              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     574              :     !
     575              :     INTEGER :: nb, mb
     576              :     CHARACTER(LEN=15) :: tag
     577              :     !
     578           16 :     IF ( upf%has_wfc ) THEN
     579              :        !
     580            0 :        ALLOCATE (upf%aewfc(1:upf%mesh,upf%nbeta) )
     581            0 :        CALL xmlr_opentag( capitalize_if_v2('pp_full_wfc') )
     582              :        !
     583            0 :        DO nb = 1, upf%nbeta
     584            0 :           IF ( v2 ) THEN
     585            0 :              tag = 'PP_AEWFC.'//i2c(nb)
     586              :           ELSE
     587            0 :              tag = 'pp_aewfc'
     588              :           END IF
     589            0 :           CALL xmlr_readtag( tag, upf%aewfc(1:upf%mesh,nb) )
     590            0 :           CALL get_attr ('index',mb)
     591              :           ! not-so-strict test (and two more below):
     592              :           ! index may be absent or incorrect in some UPF v.2 files
     593            0 :           IF ( .NOT. v2 .AND. nb /= mb ) CALL upf_error('read_pp_full_wfc','mismatch',1)
     594              :        END DO
     595              :        !
     596            0 :        IF ( upf%has_so .AND. upf%tpawp ) THEN
     597            0 :           ALLOCATE (upf%paw%aewfc_rel(1:upf%mesh,upf%nbeta) )
     598            0 :           DO nb = 1, upf%nbeta
     599            0 :              IF ( v2 ) THEN
     600            0 :                 tag = 'PP_AEWFC_REL.'//i2c(nb)
     601              :              ELSE
     602            0 :                 tag = 'pp_aewfc_rel'
     603              :              END IF
     604            0 :              CALL xmlr_readtag(tag, upf%paw%aewfc_rel(1:upf%mesh,nb) )
     605            0 :              CALL get_attr ('index',mb)
     606            0 :              IF ( .NOT. v2 .AND. nb /= mb ) CALL upf_error('read_pp_full_wfc','mismatch',2)
     607              :           END DO
     608              :        END IF
     609              :        !
     610            0 :        ALLOCATE (upf%pswfc(1:upf%mesh,upf%nbeta) )
     611            0 :        DO nb = 1, upf%nbeta
     612            0 :           IF ( v2 ) THEN
     613            0 :              tag = 'PP_PSWFC.'//i2c(nb)
     614              :           ELSE
     615            0 :              tag = 'pp_pswfc'
     616              :           END IF
     617            0 :           CALL xmlr_readtag(tag, upf%pswfc(1:upf%mesh,nb) )
     618            0 :           CALL get_attr ('index',mb)
     619            0 :           IF ( .NOT. v2 .AND. nb /= mb ) CALL upf_error('read_pp_full_wfc','mismatch',3)
     620              :        END DO
     621              :        !
     622            0 :        CALL xmlr_closetag( )
     623              :        !
     624              :     END IF
     625              :     !
     626           16 :   END SUBROUTINE read_pp_full_wfc
     627              :   !
     628              :   !--------------------------------------------------------
     629           16 :   SUBROUTINE read_pp_spinorb ( upf )
     630              :     !--------------------------------------------------------
     631              :     !
     632              :     !IMPLICIT NONE
     633              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     634              :     INTEGER :: nw, nb, ierr
     635              :     CHARACTER(LEN=1) :: dummy
     636              :     !
     637           16 :     IF ( .NOT. v2 .OR. .NOT. upf%has_so ) RETURN
     638              :     !
     639            6 :     CALL xmlr_opentag( 'PP_SPIN_ORB' )
     640           36 :     DO nw = 1,upf%nwfc
     641           30 :        CALL xmlr_readtag( 'PP_RELWFC.'//i2c(nw), dummy )
     642           30 :        CALL get_attr( 'index' , nb )
     643              :        ! not-so-strict test: index absent or incorrect in some UPF v.2 files
     644           30 :        IF ( .NOT. v2 .AND. nb /= nw ) CALL upf_error('read_pp_spinorb','mismatch',1)
     645           30 :        CALL get_attr( 'nn',    upf%nn(nw) )
     646           66 :        CALL get_attr( 'jchi',  upf%jchi(nw) )
     647              :        !
     648              :        ! the following data is already known and was not read in old versions
     649              :        ! of UPF-reading code. upf%oc is actually missing in some UPF files:
     650              :        ! reading it here may spoil the value read earlier and break DFT+U
     651              :        !
     652              :        ! CALL get_attr( 'lchi',  upf%lchi(nw) )
     653              :        ! CALL get_attr( 'els',   upf%els(nw) )
     654              :        ! CALL get_attr( 'oc',    upf%oc(nw) )
     655              :     ENDDO
     656              :     !
     657           66 :     DO nb = 1,upf%nbeta
     658           60 :        CALL xmlr_readtag( 'PP_RELBETA.'//i2c(nb), dummy, ierr )
     659              :        !
     660              :        ! existing PP files may have pp_relbeta first, pp_relwfc later,
     661              :        ! but also the other way round - check that everything was right
     662              :        !
     663           60 :        if ( ierr > 0 ) then
     664              :           ierr = -81
     665              :           return
     666              :        end if
     667           60 :        CALL get_attr( 'index' , nw )
     668           60 :        IF ( .NOT.v2 .AND. nb /= nw ) CALL upf_error('read_pp_spinorb','mismatch',2)
     669           60 :        CALL get_attr( 'lll',  upf%lll(nb) )
     670          126 :        CALL get_attr( 'jjj',  upf%jjj(nb) )
     671              :     ENDDO
     672            6 :     CALL xmlr_closetag () ! end pp_spin_orb
     673              :     !
     674              :   END SUBROUTINE read_pp_spinorb
     675              :   !
     676              :   !--------------------------------------------------------
     677           16 :   SUBROUTINE read_pp_paw ( upf )
     678              :     !--------------------------------------------------------
     679              :     !
     680              :     !IMPLICIT NONE
     681              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     682              :     INTEGER :: nb, mb
     683              :     !
     684           16 :     IF ( .NOT. upf%tpawp ) RETURN
     685              :     !
     686            0 :     CALL xmlr_opentag( capitalize_if_v2('pp_paw') )
     687            0 :     CALL get_attr ('paw_data_format', upf%paw_data_format)
     688            0 :     CALL get_attr ('core_energy', upf%paw%core_energy)
     689              :     ! Full occupation (not only > 0 ones)
     690            0 :     ALLOCATE (upf%paw%oc(upf%nbeta) )
     691            0 :     ALLOCATE (upf%paw%ae_rho_atc(upf%mesh) )
     692            0 :     ALLOCATE (upf%paw%ae_vloc(upf%mesh) )
     693              :     CALL xmlr_readtag( capitalize_if_v2('pp_occupations'), &
     694            0 :          upf%paw%oc(1:upf%nbeta) )
     695              :     ! All-electron core charge
     696              :     CALL xmlr_readtag( capitalize_if_v2('pp_ae_nlcc'), &
     697            0 :          upf%paw%ae_rho_atc(1:upf%mesh) )
     698              :     ! All-electron local potential
     699              :     CALL xmlr_readtag( capitalize_if_v2('pp_ae_vloc'), &
     700            0 :          upf%paw%ae_vloc(1:upf%mesh) )
     701            0 :     CALL xmlr_closetag () ! end pp_paw
     702              :     !
     703            0 :     ALLOCATE(upf%paw%pfunc(upf%mesh, upf%nbeta,upf%nbeta) )
     704            0 :     upf%paw%pfunc(:,:,:) = 0._dp
     705            0 :     IF (upf%has_so) THEN
     706            0 :        ALLOCATE(upf%paw%pfunc_rel(upf%mesh, upf%nbeta,upf%nbeta) )
     707            0 :        upf%paw%pfunc_rel(:,:,:) = 0._dp
     708              :     ENDIF
     709            0 :     DO nb=1,upf%nbeta
     710            0 :        DO mb=1,nb
     711              :           upf%paw%pfunc (1:upf%mesh, nb, mb) = &
     712            0 :                upf%aewfc(1:upf%mesh, nb) * upf%aewfc(1:upf%mesh, mb)
     713            0 :           IF (upf%has_so) THEN
     714              :              upf%paw%pfunc_rel (1:upf%paw%iraug, nb, mb) =  &
     715              :                   upf%paw%aewfc_rel(1:upf%paw%iraug, nb) *   &
     716            0 :                   upf%paw%aewfc_rel(1:upf%paw%iraug, mb)
     717              : !
     718              : !    The small component is added to pfunc. pfunc_rel is useful only
     719              : !    to add a small magnetic contribution
     720              : !
     721              :              upf%paw%pfunc (1:upf%paw%iraug, nb, mb) = &
     722              :                         upf%paw%pfunc (1:upf%paw%iraug, nb, mb) + &
     723            0 :                         upf%paw%pfunc_rel (1:upf%paw%iraug, nb, mb)
     724              :           ENDIF
     725            0 :           upf%paw%pfunc(upf%paw%iraug+1:,nb,mb) = 0._dp
     726              :           !
     727            0 :           upf%paw%pfunc (1:upf%mesh, mb, nb) = upf%paw%pfunc (1:upf%mesh, nb, mb)
     728            0 :           IF (upf%has_so) upf%paw%pfunc_rel (1:upf%mesh, mb, nb) =  &
     729            0 :                upf%paw%pfunc_rel (1:upf%mesh, nb, mb)
     730              :        ENDDO
     731              :     ENDDO
     732              :     !
     733              :     ! Pseudo wavefunctions (not only the ones for oc > 0)
     734              :     ! All-electron wavefunctions
     735            0 :     ALLOCATE(upf%paw%ptfunc(upf%mesh, upf%nbeta,upf%nbeta) )
     736            0 :     upf%paw%ptfunc(:,:,:) = 0._dp
     737            0 :     DO nb=1,upf%nbeta
     738            0 :        DO mb=1,upf%nbeta
     739              :           upf%paw%ptfunc (1:upf%mesh, nb, mb) = &
     740            0 :                upf%pswfc(1:upf%mesh, nb) * upf%pswfc(1:upf%mesh, mb)
     741            0 :           upf%paw%ptfunc(upf%paw%iraug+1:,nb,mb) = 0._dp
     742              :           !
     743            0 :           upf%paw%ptfunc (1:upf%mesh, mb, nb) = upf%paw%ptfunc (1:upf%mesh, nb, mb)
     744              :        ENDDO
     745              :     ENDDO
     746              :     !
     747              :   END SUBROUTINE read_pp_paw
     748              :   !--------------------------------------------------------
     749           16 :   SUBROUTINE read_pp_gipaw ( upf )
     750              :     !--------------------------------------------------------
     751              :     !
     752              :     !IMPLICIT NONE
     753              :     TYPE(pseudo_upf),INTENT(INOUT) :: upf ! the pseudo data
     754              :     !
     755              :     INTEGER :: nb, mb, ierr
     756              :     CHARACTER(LEN=24) :: tag
     757              :     !
     758           16 :     IF (.NOT. upf%has_gipaw) RETURN
     759              :     !
     760            0 :     CALL xmlr_opentag( capitalize_if_v2('pp_gipaw') )
     761            0 :     CALL get_attr ('gipaw_data_format', upf%gipaw_data_format )
     762            0 :     IF ( v2 ) THEN
     763            0 :        CALL xmlr_opentag( 'PP_GIPAW_CORE_ORBITALS', IERR=ierr )
     764              :        ! ierr= 0 for case <PP_GIPAW_CORE_ORBITALS>...</PP_GIPAW_CORE_ORBITALS>
     765              :        ! ierr=-1 for case <PP_GIPAW_CORE_ORBITALS ... />
     766            0 :        CALL get_attr ('number_of_core_orbitals', upf%gipaw_ncore_orbitals)
     767              :     ELSE
     768            0 :        CALL xmlr_readtag ('number_of_core_orbitals', upf%gipaw_ncore_orbitals)
     769            0 :        IF ( .NOT. upf%paw_as_gipaw) &
     770            0 :           CALL xmlr_readtag( 'number_of_valence_orbitals', upf%gipaw_wfs_nchannels)
     771              :     END IF
     772            0 :     ALLOCATE ( upf%gipaw_core_orbital(upf%mesh,upf%gipaw_ncore_orbitals) )
     773            0 :     ALLOCATE ( upf%gipaw_core_orbital_n(upf%gipaw_ncore_orbitals) )
     774            0 :     ALLOCATE ( upf%gipaw_core_orbital_el(upf%gipaw_ncore_orbitals) )
     775            0 :     ALLOCATE ( upf%gipaw_core_orbital_l(upf%gipaw_ncore_orbitals) )
     776            0 :     DO nb = 1,upf%gipaw_ncore_orbitals
     777            0 :        IF ( v2 ) THEN
     778            0 :           tag = "PP_GIPAW_CORE_ORBITAL."//i2c(nb)
     779              :        ELSE
     780            0 :           tag = 'pp_gipaw_core_orbital'
     781              :        END IF
     782            0 :        CALL xmlr_readtag( tag, upf%gipaw_core_orbital(1:upf%mesh,nb) )
     783            0 :        CALL get_attr ('index', mb)
     784            0 :        IF ( nb /= mb ) CALL upf_error('read_pp_gipaw','mismatch',1)
     785            0 :        CALL get_attr ('label', upf%gipaw_core_orbital_el(nb) )
     786            0 :        CALL get_attr ('n', upf%gipaw_core_orbital_n(nb) )
     787            0 :        CALL get_attr ('l', upf%gipaw_core_orbital_l(nb) )
     788              :     END DO
     789              :     ! close only for case <PP_GIPAW_CORE_ORBITALS> ... </PP_GIPAW_CORE_ORBITALS>
     790            0 :     IF ( v2 .AND. ierr == 0  ) CALL xmlr_closetag ( )
     791              :     !
     792            0 :     IF ( upf%paw_as_gipaw) THEN
     793              :        !
     794              :        !    PAW as GIPAW case: all-electron and pseudo-orbitals not read here
     795              :        !
     796            0 :        upf%gipaw_wfs_nchannels = upf%nbeta
     797            0 :        ALLOCATE ( upf%gipaw_wfs_el(upf%gipaw_wfs_nchannels) )
     798            0 :        ALLOCATE ( upf%gipaw_wfs_ll(upf%gipaw_wfs_nchannels) )
     799            0 :        ALLOCATE ( upf%gipaw_wfs_rcut(upf%gipaw_wfs_nchannels) )
     800            0 :        ALLOCATE ( upf%gipaw_wfs_rcutus(upf%gipaw_wfs_nchannels) )
     801            0 :        ALLOCATE ( upf%gipaw_wfs_ae(upf%mesh,upf%gipaw_wfs_nchannels) )
     802            0 :        ALLOCATE ( upf%gipaw_wfs_ps(upf%mesh,upf%gipaw_wfs_nchannels) )
     803            0 :        DO nb = 1,upf%gipaw_wfs_nchannels
     804            0 :           upf%gipaw_wfs_el(nb) = upf%els_beta(nb)
     805            0 :           upf%gipaw_wfs_ll(nb) = upf%lll(nb)
     806            0 :           upf%gipaw_wfs_ae(:,nb) = upf%aewfc(:,nb)
     807              :        ENDDO
     808            0 :        DO nb = 1,upf%gipaw_wfs_nchannels
     809            0 :           upf%gipaw_wfs_ps(:,nb) = upf%pswfc(:,nb)
     810              :        ENDDO
     811            0 :        ALLOCATE ( upf%gipaw_vlocal_ae(upf%mesh) )
     812            0 :        ALLOCATE ( upf%gipaw_vlocal_ps(upf%mesh) )
     813            0 :        upf%gipaw_vlocal_ae(:)= upf%paw%ae_vloc(:)
     814            0 :        upf%gipaw_vlocal_ps(:)= upf%vloc(:)
     815            0 :        DO nb = 1,upf%gipaw_wfs_nchannels
     816            0 :           upf%gipaw_wfs_rcut(nb)=upf%rcut(nb)
     817            0 :           upf%gipaw_wfs_rcutus(nb)=upf%rcutus(nb)
     818              :        ENDDO
     819              :        !
     820              :     ELSE
     821              :        !
     822              :        ! Read valence all-electron and pseudo orbitals
     823              :        !
     824            0 :        IF ( v2 ) THEN
     825            0 :           CALL xmlr_opentag( 'PP_GIPAW_ORBITALS' )
     826              :           CALL get_attr( 'number_of_valence_orbitals', &
     827            0 :                upf%gipaw_wfs_nchannels )
     828              :        END IF
     829            0 :        ALLOCATE ( upf%gipaw_wfs_el(upf%gipaw_wfs_nchannels) )
     830            0 :        ALLOCATE ( upf%gipaw_wfs_ll(upf%gipaw_wfs_nchannels) )
     831            0 :        ALLOCATE ( upf%gipaw_wfs_rcut(upf%gipaw_wfs_nchannels) )
     832            0 :        ALLOCATE ( upf%gipaw_wfs_rcutus(upf%gipaw_wfs_nchannels) )
     833            0 :        ALLOCATE ( upf%gipaw_wfs_ae(upf%mesh,upf%gipaw_wfs_nchannels) )
     834            0 :        ALLOCATE ( upf%gipaw_wfs_ps(upf%mesh,upf%gipaw_wfs_nchannels) )
     835            0 :        DO nb = 1,upf%gipaw_wfs_nchannels
     836            0 :           IF ( v2 ) THEN
     837            0 :              tag = "PP_GIPAW_ORBITAL."//i2c(nb)
     838              :           ELSE
     839            0 :              tag = 'pp_gipaw_orbital'
     840              :           END IF
     841            0 :           CALL xmlr_opentag( tag )
     842            0 :           CALL get_attr ('index', mb)
     843            0 :           IF ( nb /= mb ) CALL upf_error('read_pp_gipaw','mismatch',2)
     844            0 :           CALL get_attr ('label', upf%gipaw_wfs_el(nb) )
     845            0 :           CALL get_attr ('l',     upf%gipaw_wfs_ll(nb) )
     846            0 :           CALL get_attr ('cutoff_radius', upf%gipaw_wfs_rcut(nb) )
     847            0 :           CALL get_attr ('ultrasoft_cutoff_radius', upf%gipaw_wfs_rcutus(nb) )
     848              :           CALL xmlr_readtag( capitalize_if_v2('pp_gipaw_wfs_ae'), &
     849            0 :                upf%gipaw_wfs_ae(1:upf%mesh,nb) )
     850              :           CALL xmlr_readtag( capitalize_if_v2('pp_gipaw_wfs_ps'),&
     851            0 :                upf%gipaw_wfs_ps(1:upf%mesh,nb) )
     852            0 :           CALL xmlr_closetag ()
     853              :        END DO
     854            0 :        IF ( v2 ) CALL xmlr_closetag( )
     855              :        !
     856              :        ! Read all-electron and pseudo local potentials
     857              :        !
     858            0 :        ALLOCATE ( upf%gipaw_vlocal_ae(upf%mesh) )
     859            0 :        ALLOCATE ( upf%gipaw_vlocal_ps(upf%mesh) )
     860            0 :        CALL xmlr_opentag( capitalize_if_v2('pp_gipaw_vlocal') )
     861              :        CALL xmlr_readtag( capitalize_if_v2('pp_gipaw_vlocal_ae'), &
     862            0 :             upf%gipaw_vlocal_ae(1:upf%mesh) )
     863              :        CALL xmlr_readtag( capitalize_if_v2('pp_gipaw_vlocal_ps'), &
     864            0 :             upf%gipaw_vlocal_ps(1:upf%mesh) )
     865            0 :        CALL xmlr_closetag ()
     866              :     END IF
     867            0 :     CALL xmlr_closetag () ! end pp_gipaw
     868              :     !
     869              :   END SUBROUTINE read_pp_gipaw
     870              :   !
     871              : 
     872            0 : SUBROUTINE upf_error( calling_routine, message, ierr )
     873              :   use m_abicore
     874              :   use m_errors
     875              : 
     876              :   CHARACTER(LEN=*), INTENT(IN) :: calling_routine, message
     877              :     ! the name of the calling calling_routine
     878              :     ! the output message
     879              :   INTEGER,          INTENT(IN) :: ierr
     880              : 
     881            0 :   ABI_ERROR(message)
     882              :   if (.False.) write(std_out,*)trim(calling_routine), ierr
     883              : 
     884            0 : END SUBROUTINE upf_error
     885              : 
     886              : !
     887           16 : subroutine remove_non_ascii(in_str)
     888              : 
     889              :  character(len=*),intent(inout) :: in_str
     890              : 
     891           16 :  character(len=len(in_str)) :: tmp_str
     892              :  integer :: ii, cnt
     893              : 
     894              :  ! in UTF8 character value c2 a0 (194 160) is defined as NO-BREAK SPACE.
     895              :  ! According to ISO/IEC 8859 this is a space that does not allow a line break to be inserted.
     896           16 :  cnt = 0
     897           16 :  tmp_str = ""
     898          416 :  do ii=1,len(in_str)
     899          400 :    if ((iachar(in_str(ii:ii)) >= 127)) cycle
     900          400 :    cnt = cnt + 1 !; write(std_out, *) "copying`", in_str(ii:ii), "` with iachar:", iachar(in_str(ii:ii))
     901          416 :    tmp_str(cnt:cnt) = in_str(ii:ii)
     902              :  end do
     903              : 
     904          416 :  do ii=1,len(in_str)
     905          416 :    in_str(ii:ii) = " "
     906              :  end do
     907           16 :  in_str = tmp_str
     908              : 
     909           16 : end subroutine remove_non_ascii
     910              : 
     911         1520 : END MODULE read_upf_new_module
        

Generated by: LCOV version 2.3-1