TABLE OF CONTENTS


ABINIT/invars2 [ Functions ]

[ Top ] [ Functions ]

NAME

 invars2

FUNCTION

 Initialize variables for the ABINIT code, for one particular
 dataset, characterized by jdtset.
 Note: some parameters have already been read in invars0 and invars1,
 and were used to dimension the arrays needed here.

COPYRIGHT

 Copyright (C) 1998-2018 ABINIT group (DCA, XG, GMR)
 This file is distributed under the terms of the
 GNU General Public License, see ~abinit/COPYING
 or http://www.gnu.org/copyleft/gpl.txt .
 For the initials of contributors, see ~abinit/doc/developers/contributors.txt .

INPUTS

 bravais(11): bravais(1)=iholohedry
              bravais(2)=center
              bravais(3:11)=coordinates of rprim in the axes
               of the conventional bravais lattice (*2 if center/=0)
 iout=unit number for echoed output
 jdtset=number of the dataset looked for
 lenstr=actual length of the string
 mband=maximum number of bands for any k-point
 msym=default maximal number of symmetries
 npsp=number of pseudopotentials
 string*(*)=character string containing all the input data.
  Initialized previously in instrng.
 usepaw= 0 for non paw calculation; =1 for paw calculation
 zionpsp(npsp)=valence charge of each type of atom (coming from the psp files)

OUTPUT

  (see side effects)

SIDE EFFECTS

 Input/Output:
  dtset=<type datafiles_type>contains all input variables,
   some of which are initialized here, while other were already
 All rest of arguments given alphabetically from acell (length scales)
 to wtk (k-point weights), used to control running of the main routine.
 See abinit_help for definitions of these variables.
 These values become defined by being read from string,
 that contains all information from the input file,
 in a compressed, standardized, format
 At the input, they already contain a default value.

NOTES

PARENTS

      invars2m,m_ab7_invars_f90

CHILDREN

      dtset_chkneu,get_auxc_ixc,get_kpt_fullbz,get_xclevel,ingeo_img,inkpts
      intagm,invacuum,libxc_functionals_end
      libxc_functionals_get_hybridparams,libxc_functionals_init,matr3inv
      sort_int,timab,wrtout

SOURCE

  64 #if defined HAVE_CONFIG_H
  65 #include "config.h"
  66 #endif
  67 
  68 #include "abi_common.h"
  69 
  70 subroutine invars2(bravais,dtset,iout,jdtset,lenstr,&
  71 & mband,msym,npsp,string,usepaw,zionpsp)
  72 
  73  use defs_basis
  74  use defs_abitypes
  75  use m_profiling_abi
  76  use m_errors
  77  use m_nctk
  78  use m_sort
  79  use libxc_functionals
  80 #ifdef HAVE_NETCDF
  81  use netcdf
  82 #endif
  83 
  84  use m_fstrings,  only : sjoin, itoa, ltoa, tolower, rmquotes
  85  use m_parser,    only : intagm
  86  use m_ingeo_img, only : ingeo_img
  87  use m_dtset,     only : dtset_chkneu
  88  use m_xcdata,    only : get_auxc_ixc, get_xclevel
  89 
  90 !This section has been created automatically by the script Abilint (TD).
  91 !Do not modify the following lines by hand.
  92 #undef ABI_FUNC
  93 #define ABI_FUNC 'invars2'
  94  use interfaces_14_hidewrite
  95  use interfaces_18_timing
  96  use interfaces_32_util
  97  use interfaces_56_recipspace
  98  use interfaces_57_iovars, except_this_one => invars2
  99 !End of the abilint section
 100 
 101  implicit none
 102 
 103 !Arguments ------------------------------------
 104 !scalars
 105  integer,intent(in) :: iout,jdtset,lenstr,mband,msym,npsp,usepaw
 106  character(len=*),intent(in) :: string
 107  type(dataset_type),intent(inout) :: dtset
 108 !arrays
 109  integer,intent(in) :: bravais(11)
 110  real(dp),intent(in) :: zionpsp(npsp)
 111 
 112 !Local variables-------------------------------
 113 !scalars
 114  integer :: bantot,berryopt,dmatsize,ndim,getocc
 115  integer :: iat,iatom,iband,ii,iimage,ikpt,intimage,ionmov,isppol,ixc_current
 116  integer :: densfor_pred,ipsp,iscf,isiz,itypat,jj,kptopt,lpawu,marr,natom,nband1,nberry
 117  integer :: niatcon,nimage,nkpt,nkpthf,npspalch,nqpt,nsp,nspinor,nsppol,nsym,ntypalch,ntypat,ntyppure
 118  integer :: occopt,occopt_tmp,response,sumnbl,tfband,tnband,tread,tread_alt,tread_dft,tread_fock,tread_key
 119  integer :: itol, itol_gen, ds_input, ifreq,ncerr !nkpt_fullbz,
 120  real(dp) :: areaxy,charge,fband,kptrlen,nelectjell
 121  real(dp) :: rhoavg,zelect,zval
 122  real(dp) :: toldfe_, tolrff_, toldff_, tolwfr_, tolvrs_
 123  real(dp) :: tolmxde_, tolmxf_
 124  character(len=500) :: message
 125  character(len=fnlen) :: key_value
 126 !arrays
 127  integer :: vacuum(3) !rlatt(3,3),
 128  integer,allocatable :: iatcon(:),natcon(:)
 129  integer,allocatable :: intarr(:) !Dummy arguments for subroutine 'intagm' to parse input file
 130  real(dp) :: tsec(2) !gprimd(3,3),kpt_cart(3),
 131  real(dp),allocatable :: dmatpawu_tmp(:)
 132  real(dp),allocatable :: dprarr(:) !Dummy arguments for subroutine 'intagm' to parse input file
 133  !real(dp),allocatable :: kpt_fullbz(:,:)
 134 
 135 ! *************************************************************************
 136 
 137  call timab(191,1,tsec)
 138 
 139 !Compute the maximum size of arrays intarr and dprarr
 140  natom=dtset%natom
 141  nimage=dtset%nimage
 142  nkpt=dtset%nkpt
 143  nkpthf=dtset%nkpthf
 144  npspalch=dtset%npspalch
 145  nspinor=dtset%nspinor
 146  nsppol=dtset%nsppol
 147  ntypat=dtset%ntypat
 148  ntypalch=dtset%ntypalch
 149  ntyppure=dtset%ntyppure
 150 
 151  dmatsize=0
 152  if (dtset%usepawu>0.and.dtset%usedmatpu/=0) then
 153    do iatom=1,natom
 154      lpawu=dtset%lpawu(dtset%typat(iatom))
 155      if (lpawu/=-1) dmatsize=dmatsize+nsppol*nspinor*(2*lpawu+1)**2
 156    end do
 157  end if
 158 
 159  marr=max(3*natom,&
 160 & nkpt*nsppol*mband,&
 161 & 2*dtset%nkptgw*nsppol,&
 162 & dmatsize,&
 163 & 3*nkpt,&
 164 & npsp,&
 165 & ntypat,&
 166 & 9*msym,&
 167 & 60,100,&
 168 & 3*dtset%nconeq*natom,&
 169 & nimage,&
 170 & 3*dtset%nqptdm,&
 171 & 3*dtset%natsph_extra,&
 172 & dtset%natvshift*nsppol*natom,&
 173 & 3*dtset%nzchempot*ntypat)
 174  ABI_ALLOCATE(intarr,(marr))
 175  ABI_ALLOCATE(dprarr,(marr))
 176 
 177 !----------------------------------------------------------------------------
 178 
 179 !****   Read parameters which set remaining array dimensions ****
 180 
 181 !Note : some parameters have already been read in invars0 and invars1
 182 !Also, some checking is needed here.
 183 
 184 !Read ngfft(1), ngfft(2), and ngfft(3),
 185 !then ngfft(7)=fftalg and ngfft(8)=fftcache.
 186 !Read ngfftdg(1:3)
 187 
 188  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ngfft',tread,'INT')
 189  if(tread==1) dtset%ngfft(1:3)=intarr(1:3)
 190 
 191  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fftalg',tread,'INT')
 192  if(tread==1) then
 193    dtset%ngfft(7)=intarr(1)
 194    if (usepaw==1) dtset%ngfftdg(7)=intarr(1)
 195  end if
 196 
 197  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fftcache',tread,'INT')
 198 
 199  if(tread==1) then
 200    dtset%ngfft(8)=intarr(1)
 201    if (usepaw==1) dtset%ngfftdg(8)=intarr(1)
 202  end if
 203 
 204  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ngfftdg',tread,'INT')
 205  if(tread==1) dtset%ngfftdg(1:3)=intarr(1:3)
 206 
 207  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mqgrid',tread,'INT')
 208  if(tread==1) dtset%mqgrid=intarr(1)
 209 
 210  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mqgriddg',tread,'INT')
 211  if(tread==1) dtset%mqgriddg=intarr(1)
 212 
 213 !Make special arrangements to check nband: may be a scalar
 214 !(for occopt=0, 1 or 3, 4, 5, 6, 7, 8) or may be an array (for occopt=2)
 215 
 216  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'occopt',tread,'INT')
 217  if(tread==1) dtset%occopt=intarr(1)
 218  occopt=dtset%occopt
 219 
 220 !check for variables related to genetic algorithm. ga_n_rules has been already read
 221 
 222  if (dtset%imgmov==4) then
 223    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ga_algor',tread,'INT')
 224    if(tread==1) dtset%ga_algor=intarr(1)
 225 
 226    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ga_fitness',tread,'INT')
 227    if(tread==1) dtset%ga_fitness=intarr(1)
 228 
 229    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ga_opt_percent',tread,'ENE')
 230    if(tread==1) dtset%ga_opt_percent=dprarr(1)
 231 
 232    call intagm(dprarr,intarr,jdtset,marr,dtset%ga_n_rules,string(1:lenstr),'ga_rules',tread,'INT')
 233 !  DEBUG AHR
 234 !  write(std_out,*) ' write ga_n_rules ',dtset%ga_n_rules
 235 !  call flush(std_out)
 236 !  ENDDEBUG
 237    if(tread==1)then
 238      dtset%ga_rules(1:dtset%ga_n_rules)=intarr(1:dtset%ga_n_rules)
 239      do ii=1,dtset%ga_n_rules
 240        if(dtset%ga_rules(ii)<0)then
 241          write(message, '(a,i4,a)' )&
 242 &         'All values for Genetic rules must be greater than 0.',ch10,&
 243 &         'Action: check the values of ga_rules.'
 244          MSG_ERROR(message)
 245        end if
 246      end do
 247    end if
 248  end if
 249 
 250 
 251  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwcalctyp',tread,'INT')
 252  if(tread==1) dtset%gwcalctyp=intarr(1)
 253 
 254  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwcomp',tread,'INT')
 255  if(tread==1) dtset%gwcomp=intarr(1)
 256 
 257  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwencomp',tread,'ENE')
 258  if(tread==1) dtset%gwencomp=dprarr(1)
 259 
 260  if (usepaw==1) then
 261    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_sigxcore',tread,'INT')
 262    if(tread==1) dtset%gw_sigxcore=intarr(1)
 263  end if
 264 
 265  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwmem',tread,'INT')
 266  if(tread==1) dtset%gwmem=intarr(1)
 267 
 268  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_sctype',tread,'INT')
 269  if(tread==1) dtset%gw_sctype=intarr(1)
 270 
 271  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_nstep',tread,'INT')
 272  if(tread==1) dtset%gw_nstep=intarr(1)
 273 
 274  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_toldfeig',tread,'ENE')
 275  if(tread==1) dtset%gw_toldfeig=dprarr(1)
 276 
 277 
 278  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_stern_kmax',tread,'INT')
 279  if(tread==1) dtset%gwls_stern_kmax=intarr(1)
 280 
 281  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_npt_gauss_quad',tread,'INT')
 282  if(tread==1) dtset%gwls_npt_gauss_quad=intarr(1)
 283 
 284  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_diel_model',tread,'INT')
 285  if(tread==1) dtset%gwls_diel_model=intarr(1)
 286 
 287  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_model_parameter',tread,'ENE')
 288  if(tread==1) dtset%gwls_model_parameter=dprarr(1)
 289 
 290  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_recycle',tread,'INT')
 291  if(tread==1) dtset%gwls_recycle=intarr(1)
 292 
 293  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_print_debug',tread,'INT')
 294  if(tread==1) dtset%gwls_print_debug=intarr(1)
 295 
 296  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_nseeds',tread,'INT')
 297  if(tread==1) dtset%gwls_nseeds=intarr(1)
 298 
 299  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_complement',tread,'INT')
 300  if(tread==1) dtset%gwls_kmax_complement=intarr(1)
 301 
 302  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_poles',tread,'INT')
 303  if(tread==1) dtset%gwls_kmax_poles=intarr(1)
 304 
 305  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_analytic',tread,'INT')
 306  if(tread==1) dtset%gwls_kmax_analytic=intarr(1)
 307 
 308  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_numeric',tread,'INT')
 309  if(tread==1) dtset%gwls_kmax_numeric=intarr(1)
 310 
 311  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_exchange',tread,'INT')
 312  if(tread==1) dtset%gwls_exchange=intarr(1)
 313 
 314  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_correlation',tread,'INT')
 315  if(tread==1) dtset%gwls_correlation=intarr(1)
 316 
 317  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_band_index',tread,'INT')
 318  if(tread==1) dtset%gwls_band_index=intarr(1)
 319 
 320  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_first_seed',tread,'INT')
 321  if(tread==1) then
 322    dtset%gwls_first_seed=intarr(1)
 323  else
 324    dtset%gwls_first_seed=dtset%gwls_band_index
 325  end if
 326 
 327 
 328  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rhoqpmix',tread,'DPR')
 329  if(tread==1) dtset%rhoqpmix=dprarr(1)
 330 
 331  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nfreqim',tread,'INT')
 332  if(tread==1) dtset%nfreqim=intarr(1)
 333  if (dtset%cd_customnimfrqs/=0) then
 334    write(message, '(a,a,a)' )&
 335 &   'cd_customnimfrqs not equal to zero and not equal to nfreqim',ch10,&
 336 &   'setting nfreqim = cd_customnimfrqs'
 337    MSG_WARNING(message)
 338    dtset%nfreqim = dtset%cd_customnimfrqs
 339  end if
 340 
 341  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqim_alpha',tread,'DPR')
 342  if(tread==1) dtset%freqim_alpha=dprarr(1)
 343 
 344  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqremin',tread,'ENE')
 345  if(tread==1) dtset%freqremin=dprarr(1)
 346 
 347  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqremax',tread,'ENE')
 348  if(tread==1) dtset%freqremax=dprarr(1)
 349 
 350  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nfreqre',tread,'INT')
 351  if(tread==1) dtset%nfreqre=intarr(1)
 352 
 353  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nfreqsp',tread,'INT')
 354  if(tread==1) dtset%nfreqsp=intarr(1)
 355 
 356  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqspmax',tread,'ENE')
 357  if(tread==1) dtset%freqspmax=dprarr(1)
 358 
 359  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqspmin',tread,'ENE')
 360  if(tread==1) then ! If found, set it
 361    dtset%freqspmin=dprarr(1)
 362  else ! Else give it the value -freqspmax
 363    dtset%freqspmin=-dtset%freqspmax
 364  end if
 365 
 366  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_frqim_inzgrid',tread,'INT')
 367  if(tread==1) dtset%gw_frqim_inzgrid=intarr(1)
 368 
 369  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_frqre_inzgrid',tread,'INT')
 370  if(tread==1) dtset%gw_frqre_inzgrid=intarr(1)
 371 
 372  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_frqre_tangrid',tread,'INT')
 373  if(tread==1) dtset%gw_frqre_tangrid=intarr(1)
 374 
 375  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_invalid_freq',tread,'INT')
 376  if(tread==1) dtset%gw_invalid_freq=intarr(1)
 377 
 378  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_qprange',tread,'INT')
 379  if(tread==1) dtset%gw_qprange=intarr(1)
 380 
 381  if(dtset%cd_customnimfrqs/=0) then
 382    call intagm(dprarr,intarr,jdtset,marr,dtset%cd_customnimfrqs,string(1:lenstr),'cd_imfrqs',tread,'ENE')
 383    if(tread==1) then
 384      dtset%cd_imfrqs(1:dtset%cd_customnimfrqs)=dprarr(1:dtset%cd_customnimfrqs)
 385      do ifreq=1,dtset%cd_customnimfrqs-1
 386        if (dtset%cd_imfrqs(ifreq+1)<dtset%cd_imfrqs(ifreq)) then
 387          write(message, '(a,a,a)' )&
 388 &         'The frequencies specified in cd_imfrqs must be strictly increasing',ch10,&
 389 &         'Action: Correct this in your input file'
 390          MSG_ERROR(message)
 391        end if
 392      end do
 393    end if
 394  end if
 395 
 396  if(dtset%gw_customnfreqsp/=0) then
 397    call intagm(dprarr,intarr,jdtset,marr,dtset%gw_customnfreqsp,string(1:lenstr),'gw_freqsp',tread,'ENE')
 398    if(tread==1) then
 399      dtset%gw_freqsp(1:dtset%gw_customnfreqsp)=dprarr(1:dtset%gw_customnfreqsp)
 400      do ifreq=1,dtset%gw_customnfreqsp-1
 401        if (dtset%gw_freqsp(ifreq+1)<dtset%gw_freqsp(ifreq)) then
 402          write(message, '(a,a,a)' )&
 403 &         'The frequencies specified in gw_freqsp must be strictly increasing',ch10,&
 404 &         'Action: Correct this in your input file'
 405          MSG_ERROR(message)
 406        end if
 407      end do
 408    end if
 409  end if
 410 
 411  if(dtset%gwls_n_proj_freq/=0) then
 412    call intagm(dprarr,intarr,jdtset,marr,dtset%gwls_n_proj_freq,string(1:lenstr),'gwls_list_proj_freq',tread,'ENE')
 413    if(tread==1) then
 414      dtset%gwls_list_proj_freq(1:dtset%gwls_n_proj_freq)=dprarr(1:dtset%gwls_n_proj_freq)
 415    end if
 416  end if
 417 
 418  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_full_grid',tread,'INT')
 419  if(tread==1) dtset%cd_full_grid=intarr(1)
 420 
 421  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_frqim_method',tread,'INT')
 422  if(tread==1) dtset%cd_frqim_method=intarr(1)
 423 
 424  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_halfway_freq',tread,'ENE')
 425  if(tread==1) dtset%cd_halfway_freq=dprarr(1)
 426 
 427  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_max_freq',tread,'ENE')
 428  if(tread==1) dtset%cd_max_freq=dprarr(1)
 429 
 430  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'cd_subset_freq',tread,'INT')
 431  if(tread==1) dtset%cd_subset_freq(1:2)=intarr(1:2)
 432 
 433  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwrpacorr',tread,'INT')
 434  if(tread==1) dtset%gwrpacorr=intarr(1)
 435 
 436  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'supercell',tread,'INT')
 437  if(tread==1) dtset%supercell(1:3)=intarr(1:3)
 438 
 439 !RESPFN integer input variables (needed here to get the value of response
 440 !Presently, rfmeth is not used.
 441 !Warning : rfddk,rfelfd,rfmagn,rfphon,rfstrs,rfuser,rf2_dkdk and rf2_dkde are also read in invars1
 442  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfasr',tread,'INT')
 443  if(tread==1) dtset%rfasr=intarr(1)
 444 
 445  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'rfatpol',tread,'INT')
 446  if(tread==1) dtset%rfatpol(1:2)=intarr(1:2)
 447 
 448  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rfdir',tread,'INT')
 449  if(tread==1) dtset%rfdir(1:3)=intarr(1:3)
 450 
 451  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfddk',tread,'INT')
 452  if(tread==1) dtset%rfddk=intarr(1)
 453 
 454  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfelfd',tread,'INT')
 455  if(tread==1) dtset%rfelfd=intarr(1)
 456 
 457  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfmagn',tread,'INT')
 458  if(tread==1) dtset%rfmagn=intarr(1)
 459 
 460  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfmeth',tread,'INT')
 461  if(tread==1) dtset%rfmeth=intarr(1)
 462 
 463  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfphon',tread,'INT')
 464  if(tread==1) dtset%rfphon=intarr(1)
 465 
 466  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfstrs',tread,'INT')
 467  if(tread==1) dtset%rfstrs=intarr(1)
 468 
 469  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfuser',tread,'INT')
 470  if(tread==1) dtset%rfuser=intarr(1)
 471 
 472  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf2_dkdk',tread,'INT')
 473  if(tread==1) dtset%rf2_dkdk=intarr(1)
 474 
 475  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf2_dkde',tread,'INT')
 476  if(tread==1) dtset%rf2_dkde=intarr(1)
 477 
 478  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf2_pert1_dir',tread,'INT')
 479  if(tread==1) dtset%rf2_pert1_dir(1:3)=intarr(1:3)
 480 
 481  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf2_pert2_dir',tread,'INT')
 482  if(tread==1) dtset%rf2_pert2_dir(1:3)=intarr(1:3)
 483 
 484 !Set value of response to 1 and also set rfdir to 1 1 1 if we are doing
 485 !response calculation but rfdir was left at default 0 0 0 value.
 486 !For rf2_dkdk and rf2_dkde, we do the same for rf2_pert1_dir and rf2_pert2_dir
 487  response=0
 488  if(dtset%rfddk/=0 .or. dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0 .or. dtset%rfelfd/=0 .or. &
 489 & dtset%rfphon/=0 .or. dtset%rfstrs/=0 .or. dtset%rfuser/=0 ) then
 490    response=1
 491    if( (dtset%rfdir(1) == 0) .and. &
 492 &   (dtset%rfdir(2) == 0) .and. &
 493 &   (dtset%rfdir(3) == 0) ) dtset%rfdir(1:3) = 1
 494    if (dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0) then
 495      if (sum(abs(dtset%rf2_pert1_dir)) == 0) dtset%rf2_pert1_dir(:) = 1
 496      if (sum(abs(dtset%rf2_pert2_dir)) == 0) dtset%rf2_pert2_dir(:) = 1
 497    end if
 498  end if
 499 
 500 !NONLINEAR integer input variables (same definition as for rfarr)
 501 !Presently, rf?asr, rf?meth,rf?strs and rf?thrd are not used
 502 !--Keep the old input variables for backward compatibility
 503  if(dtset%optdriver==RUNL_NONLINEAR) then
 504    tread_key=0
 505 
 506    call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'d3e_pert1_atpol',tread,'INT')
 507    call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'rf1atpol',tread_alt,'INT')
 508    if(tread==1.or.tread_alt==1) dtset%d3e_pert1_atpol(1:2)=intarr(1:2)
 509    if (tread_alt==1) tread_key=1
 510 
 511    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'d3e_pert1_dir',tread,'INT')
 512    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf1dir',tread_alt,'INT')
 513    if(tread==1.or.tread_alt==1) dtset%d3e_pert1_dir(1:3)=intarr(1:3)
 514    if (tread_alt==1) tread_key=1
 515 
 516    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert1_elfd',tread,'INT')
 517    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf1elfd',tread_alt,'INT')
 518    if(tread==1.or.tread_alt==1) dtset%d3e_pert1_elfd=intarr(1)
 519    if (tread_alt==1) tread_key=1
 520 
 521    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert1_phon',tread,'INT')
 522    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf1phon',tread_alt,'INT')
 523    if(tread==1.or.tread_alt==1) dtset%d3e_pert1_phon=intarr(1)
 524    if (tread_alt==1) tread_key=1
 525 
 526    call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'d3e_pert2_atpol',tread,'INT')
 527    call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'rf2atpol',tread_alt,'INT')
 528    if(tread==1.or.tread_alt==1) dtset%d3e_pert2_atpol(1:2)=intarr(1:2)
 529    if (tread_alt==1) tread_key=1
 530 
 531    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'d3e_pert2_dir',tread,'INT')
 532    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf2dir',tread_alt,'INT')
 533    if(tread==1.or.tread_alt==1) dtset%d3e_pert2_dir(1:3)=intarr(1:3)
 534    if (tread_alt==1) tread_key=1
 535 
 536    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert2_elfd',tread,'INT')
 537    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf2elfd',tread_alt,'INT')
 538    if(tread==1.or.tread_alt==1) dtset%d3e_pert2_elfd=intarr(1)
 539    if (tread_alt==1) tread_key=1
 540 
 541    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert2_phon',tread,'INT')
 542    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf2phon',tread_alt,'INT')
 543    if(tread==1.or.tread_alt==1) dtset%d3e_pert2_phon=intarr(1)
 544    if (tread_alt==1) tread_key=1
 545 
 546    call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'d3e_pert3_atpol',tread,'INT')
 547    call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'rf3atpol',tread_alt,'INT')
 548    if(tread==1.or.tread_alt==1) dtset%d3e_pert3_atpol(1:2)=intarr(1:2)
 549    if (tread_alt==1) tread_key=1
 550 
 551    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'d3e_pert3_dir',tread,'INT')
 552    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf3dir',tread_alt,'INT')
 553    if(tread==1.or.tread_alt==1) dtset%d3e_pert3_dir(1:3)=intarr(1:3)
 554    if (tread_alt==1) tread_key=1
 555 
 556    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert3_elfd',tread,'INT')
 557    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf3elfd',tread_alt,'INT')
 558    if(tread==1.or.tread_alt==1) dtset%d3e_pert3_elfd=intarr(1)
 559    if (tread_alt==1) tread_key=1
 560 
 561    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert3_phon',tread,'INT')
 562    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf3phon',tread_alt,'INT')
 563    if(tread==1.or.tread_alt==1) dtset%d3e_pert3_phon=intarr(1)
 564    if (tread_alt==1) tread_key=1
 565 
 566    if (tread_key==1) then
 567      message='The following input keywords are obsolete:'//ch10//&
 568 &     '  rfxatpol, rfxdir, rfxrlfd, rfxphon (with x=1,2,3)'//ch10//&
 569 &     'Action: change to the d3e_pertx_*** input parameters!'
 570      MSG_WARNING(message)
 571    end if
 572 
 573  end if
 574 
 575  response=0
 576  if(dtset%rfddk/=0 .or. dtset%rfphon/=0 .or. dtset%rfelfd/=0 .or. &
 577 & dtset%rfstrs/=0 .or. dtset%rfuser/=0 .or. &
 578 & dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0 .or. &
 579 & dtset%d3e_pert1_elfd/=0 .or. dtset%d3e_pert1_phon/=0 .or. &
 580 & dtset%d3e_pert2_elfd/=0 .or. dtset%d3e_pert2_phon/=0 .or. &
 581 & dtset%d3e_pert3_elfd/=0 .or. dtset%d3e_pert3_phon/=0 ) response=1
 582 
 583  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prepanl',tread,'INT')
 584  if(tread==1) dtset%prepanl=intarr(1)
 585 
 586  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prepgkk',tread,'INT')
 587  if(tread==1) dtset%prepgkk=intarr(1)
 588 
 589  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'use_nonscf_gkk',tread,'INT')
 590  if(tread==1) dtset%use_nonscf_gkk=intarr(1)
 591 
 592  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'use_gemm_nonlop',tread,'INT')
 593  if(tread==1) dtset%use_gemm_nonlop=intarr(1)
 594 
 595 !real(dp) input variables
 596  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'boxcutmin',tread,'DPR')
 597  if(tread==1) dtset%boxcutmin=dprarr(1)
 598 
 599  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'charge',tread,'DPR')
 600  if(tread==1) dtset%charge=dprarr(1)
 601 
 602  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dosdeltae',tread,'ENE')
 603  if(tread==1) dtset%dosdeltae=dprarr(1)
 604 
 605  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dtion',tread,'DPR')
 606  if(tread==1) dtset%dtion=dprarr(1)
 607 
 608  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecut',tread,'ENE')
 609  if(tread==1) dtset%ecut=dprarr(1)
 610 
 611  call intagm(dprarr,intarr,jdtset,marr,size(dtset%einterp),string(1:lenstr),'einterp',tread,'DPR')
 612  if(tread==1) dtset%einterp=dprarr(1:size(dtset%einterp))
 613 
 614  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'elph2_imagden',tread,'ENE')
 615  if(tread==1) dtset%elph2_imagden=dprarr(1)
 616 
 617  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'esmear',tread,'ENE')
 618  if(tread==1) dtset%esmear=dprarr(1)
 619 
 620  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fermie_nest',tread,'ENE')
 621  if(tread==1) dtset%fermie_nest=dprarr(1)
 622 
 623  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dfpt_sciss',tread,'ENE')
 624  if(tread==1) dtset%dfpt_sciss=dprarr(1)
 625 
 626  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'tmesh',tread,'DPR')
 627  if(tread==1) dtset%tmesh=dprarr(1:3)
 628  ABI_CHECK(all(dtset%tmesh >= zero), sjoin("Invalid tmesh:", ltoa(dtset%tmesh)))
 629  ABI_CHECK(dtset%tmesh(2) >= dtset%tmesh(1), "tmesh(2) < tmesh(1)")
 630 
 631  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tsmear',tread,'ENE')
 632  if(tread==1) dtset%tsmear=dprarr(1)
 633 
 634  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vis',tread,'DPR')
 635  if(tread==1) dtset%vis=dprarr(1)
 636 
 637  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecutsm',tread,'ENE')
 638  if(tread==1) dtset%ecutsm=dprarr(1)
 639 
 640  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'exchmix',tread,'DPR')
 641  if(tread==1) dtset%exchmix=dprarr(1)
 642 
 643  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dilatmx',tread,'DPR')
 644  if(tread==1) dtset%dilatmx=dprarr(1)
 645 
 646  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fxcartfactor',tread,'DPR')
 647  if(tread==1) dtset%fxcartfactor=dprarr(1)
 648 
 649  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'strfact',tread,'DPR')
 650  if(tread==1) dtset%strfact=dprarr(1)
 651 
 652  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'effmass_free',tread,'DPR')
 653  if(tread==1) dtset%effmass_free=dprarr(1)
 654 
 655  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'mdtemp',tread,'DPR')
 656  if(tread==1) dtset%mdtemp(1:2)=dprarr(1:2)
 657 
 658 !Recursion input variables
 659 
 660  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tfkinfunc',tread,'INT')
 661  if(tread==1) dtset%tfkinfunc=intarr(1)
 662 
 663  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recgratio',tread,'INT')
 664  if(tread==1) dtset%recgratio=intarr(1)
 665 
 666  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recefermi',tread,'ENE')
 667  if(tread==1) dtset%recefermi=dprarr(1)
 668 
 669  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recnpath',tread,'INT')
 670  if(tread==1) dtset%recnpath=intarr(1)
 671 
 672  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recnrec',tread,'INT')
 673  if(tread==1) dtset%recnrec=intarr(1)
 674 
 675  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recrcut',tread,'LEN')
 676  if(tread==1) dtset%recrcut=dprarr(1)
 677 
 678  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recptrott',tread,'INT')
 679  if(tread==1) dtset%recptrott=intarr(1)
 680 
 681  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rectesteg',tread,'INT')
 682  if(tread==1) dtset%rectesteg=intarr(1)
 683 
 684  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rectolden',tread,'DPR')
 685  if(tread==1) dtset%rectolden=dprarr(1)
 686 
 687 !Constant NPT Molecular Dynamics Input variables
 688  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'noseinert',tread,'DPR')
 689  if(tread==1) dtset%noseinert=dprarr(1)
 690 
 691  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bmass',tread,'DPR')
 692  if(tread==1) dtset%bmass=dprarr(1)
 693 
 694  call intagm(dprarr,intarr,jdtset,marr,dtset%nnos,string(1:lenstr),'qmass',tread,'DPR')
 695  if(tread==1) dtset%qmass(:)=dprarr(1:dtset%nnos)
 696 
 697  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tphysel',tread,'ENE')
 698  if(tread==1) dtset%tphysel=dprarr(1)
 699 
 700  call intagm(dprarr,intarr,jdtset,marr,6,string(1:lenstr),'strtarget',tread,'DPR')
 701  if(tread==1) dtset%strtarget(1:6)=dprarr(1:6)
 702 
 703  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'vcutgeo',tread,'DPR')
 704  if(tread==1) dtset%vcutgeo(1:3)=dprarr(1:3)
 705 
 706  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'friction',tread,'DPR')
 707  if(tread==1) dtset%friction=dprarr(1)
 708 
 709  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mdwall',tread,'LEN')
 710  if(tread==1) dtset%mdwall=dprarr(1)
 711 
 712 
 713 !Path-Integral Molecular Dynamics Input variables
 714  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'adpimd',tread,'INT')
 715  if(tread==1) dtset%adpimd=intarr(1)
 716 
 717  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'adpimd_gamma',tread,'DPR')
 718  if(tread==1) dtset%adpimd_gamma=dprarr(1)
 719 
 720  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pimd_constraint',tread,'INT')
 721  if(tread==1) dtset%pimd_constraint=intarr(1)
 722 
 723  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pitransform',tread,'INT')
 724  if(tread==1) dtset%pitransform=intarr(1)
 725 
 726 !Default for pimass is amu
 727  dtset%pimass(1:ntypat)=dtset%amu_orig(1:ntypat,1)   ! NOTE : initialisation with the first image only. TO BE MODIFIED ....
 728  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'pimass',tread,'DPR')
 729  if(tread==1) dtset%pimass(1:ntypat)=dprarr(1:ntypat)
 730 
 731  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spinmagntarget',tread,'DPR')
 732  if(tread==1) dtset%spinmagntarget=dprarr(1)
 733 
 734  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eshift',tread,'ENE')
 735  if(tread==1) dtset%eshift=dprarr(1)
 736 
 737  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'boxcenter',tread,'DPR')
 738  if(tread==1) dtset%boxcenter(1:3)=dprarr(1:3)
 739 
 740  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecuteps',tread,'ENE')
 741  if(tread==1) dtset%ecuteps=dprarr(1)
 742 
 743  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecutsigx',tread,'ENE')
 744  if(tread==1) dtset%ecutsigx=dprarr(1)
 745 
 746  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecutwfn',tread,'ENE')
 747  if(tread==1) then
 748    dtset%ecutwfn=dprarr(1)
 749  else
 750    if(dtset%optdriver==RUNL_SCREENING .or. dtset%optdriver==RUNL_SIGMA) dtset%ecutwfn=dtset%ecut
 751  end if
 752  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'omegasimax',tread,'ENE')
 753  if(tread==1) dtset%omegasimax=dprarr(1)
 754 
 755  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'omegasrdmax',tread,'ENE')
 756  if(tread==1) dtset%omegasrdmax=dprarr(1)
 757 
 758  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mbpt_sciss',tread,'ENE')
 759  if(tread==1) dtset%mbpt_sciss=dprarr(1)
 760 
 761  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spbroad',tread,'ENE')
 762  if(tread==1) dtset%spbroad=dprarr(1)
 763 
 764  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'stmbias',tread,'ENE')
 765  if(tread==1) dtset%stmbias=dprarr(1)
 766 
 767  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'awtr',tread,'INT')
 768  if(tread==1) dtset%awtr=intarr(1)
 769 
 770  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'inclvkb',tread,'INT')
 771  if(tread==1) dtset%inclvkb=intarr(1)
 772  if (dtset%inclvkb == 1) then
 773    MSG_ERROR("inclvkb == 1 is not allowed anymore. Choose between 0 and 1.")
 774  end if
 775 
 776  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nomegasf',tread,'INT')
 777  if(tread==1) dtset%nomegasf=intarr(1)
 778 
 779  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spmeth',tread,'INT')
 780  if(tread==1) dtset%spmeth=intarr(1)
 781 
 782  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symchi',tread,'INT')
 783  if(tread==1) dtset%symchi=intarr(1)
 784 
 785  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getscr',tread,'INT')
 786  if(tread==1) dtset%getscr=intarr(1)
 787 
 788  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwgamma',tread,'INT')
 789  if(tread==1) dtset%gwgamma=intarr(1)
 790 
 791  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdsuscep',tread,'INT')
 792  if(tread==1) dtset%irdsuscep=intarr(1)
 793 
 794  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdscr',tread,'INT')
 795  if(tread==1) dtset%irdscr=intarr(1)
 796 
 797  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nomegasi',tread,'INT')
 798  if(tread==1) dtset%nomegasi=intarr(1)
 799 
 800  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ppmodel',tread,'INT')
 801  if(tread==1) dtset%ppmodel=intarr(1)
 802 
 803  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symsigma',tread,'INT')
 804  if(tread==1) dtset%symsigma=intarr(1)
 805 
 806  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fftgw',tread,'INT')
 807  if(tread==1) dtset%fftgw=intarr(1)
 808 
 809  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getsuscep',tread,'INT')
 810  if(tread==1) dtset%getsuscep=intarr(1)
 811 
 812  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getqps',tread,'INT')
 813  if(tread==1) dtset%getqps=intarr(1)
 814 
 815  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwpara',tread,'INT')
 816  if(tread==1) dtset%gwpara=intarr(1)
 817 
 818  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdqps',tread,'INT')
 819  if(tread==1) dtset%irdqps=intarr(1)
 820 
 821  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ppmfrq',tread,'ENE')
 822  if(tread==1) dtset%ppmfrq=dprarr(1)
 823 
 824  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rcut',tread,'LEN')
 825  if(tread==1) dtset%rcut=dprarr(1)
 826 
 827  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'zcut',tread,'ENE')
 828  if(tread==1) dtset%zcut=dprarr(1)
 829 
 830 !q-points for long wave-length limit.
 831  if (dtset%gw_nqlwl>0) then
 832    call intagm(dprarr,intarr,jdtset,marr,3*dtset%gw_nqlwl,string(1:lenstr),'gw_qlwl',tread,'DPR')
 833    if(tread==1) dtset%gw_qlwl(1:3,1:dtset%gw_nqlwl) = reshape(dprarr(1:3*dtset%gw_nqlwl),(/3,dtset%gw_nqlwl/))
 834  end if
 835 
 836 !@bethe_salpeter
 837 
 838 !integer scalars
 839  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_nstates',tread,'INT')
 840  if(tread==1) dtset%bs_nstates=intarr(1)
 841 
 842  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_algorithm',tread,'INT')
 843  if(tread==1) dtset%bs_algorithm=intarr(1)
 844 
 845  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_haydock_niter',tread,'INT')
 846  if(tread==1) dtset%bs_haydock_niter=intarr(1)
 847 
 848  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_hayd_term',tread,'INT')
 849  if(tread==1) dtset%bs_hayd_term=intarr(1)
 850 
 851  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_exchange_term',tread,'INT')
 852  if(tread==1) dtset%bs_exchange_term=intarr(1)
 853 
 854  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_calctype',tread,'INT')
 855  if(tread==1) dtset%bs_calctype=intarr(1)
 856 
 857  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_coulomb_term',tread,'INT')
 858  if(tread==1) dtset%bs_coulomb_term=intarr(1)
 859 
 860  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_coupling',tread,'INT')
 861  if(tread==1) dtset%bs_coupling=intarr(1)
 862 
 863  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdbseig',tread,'INT')
 864  if(tread==1) dtset%irdbseig=intarr(1)
 865 
 866 !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdbsr',tread,'INT')
 867 !if(tread==1) dtset%irdbsr=intarr(1)
 868 
 869 !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdbsc',tread,'INT')
 870 !if(tread==1) dtset%irdbsc=intarr(1)
 871 
 872  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getbseig',tread,'INT')
 873  if(tread==1) dtset%getbseig=intarr(1)
 874 
 875  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getbsreso',tread,'INT')
 876  if(tread==1) dtset%getbsreso=intarr(1)
 877 
 878  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getbscoup',tread,'INT')
 879  if(tread==1) dtset%getbscoup=intarr(1)
 880 
 881  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gethaydock',tread,'INT')
 882  if(tread==1) dtset%gethaydock=intarr(1)
 883 
 884  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_method',tread,'INT')
 885  if(tread==1) dtset%bs_interp_method=intarr(1)
 886 
 887  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_mode',tread,'INT')
 888  if(tread==1) dtset%bs_interp_mode=intarr(1)
 889 
 890  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_prep',tread,'INT')
 891  if(tread==1) dtset%bs_interp_prep=intarr(1)
 892 
 893  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_m3_width',tread,'DPR')
 894  if(tread==1) dtset%bs_interp_m3_width=dprarr(1)
 895 
 896 !integer arrays
 897  call intagm(dprarr,intarr,jdtset,marr,dtset%nsppol,string(1:lenstr),'bs_loband',tread,'INT')
 898  if(tread==1) dtset%bs_loband=intarr(1:dtset%nsppol)
 899 
 900  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'bs_interp_kmult',tread,'INT')
 901  if(tread==1) dtset%bs_interp_kmult(1:3) = intarr(1:3)
 902 
 903 !real arrays
 904  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'bs_eh_cutoff',tread,'ENE')
 905  if(tread==1) dtset%bs_eh_cutoff(1:2)=dprarr(1:2)
 906 
 907  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'bs_freq_mesh',tread,'ENE')
 908  if(tread==1) dtset%bs_freq_mesh(1:3)=dprarr(1:3)
 909 
 910  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'bs_haydock_tol',tread,'DPR')
 911  if(tread==1) dtset%bs_haydock_tol=dprarr(1:2)
 912 
 913  ntypalch=dtset%ntypalch
 914  npspalch=dtset%npspalch
 915 
 916 !Compute ziontypat. When the pseudo-atom is pure, simple copy
 917  if(ntyppure>0)then
 918    do itypat=1,ntyppure
 919      dtset%ziontypat(itypat)=zionpsp(itypat)
 920    end do
 921  end if
 922 !When the pseudo-atom is alchemical, must make mixing
 923  if(ntypalch>0)then
 924    do itypat=ntyppure+1,ntypat
 925      dtset%ziontypat(itypat)=zero
 926      do ipsp=ntyppure+1,npsp
 927        dtset%ziontypat(itypat)=dtset%ziontypat(itypat) &
 928 &       +dtset%mixalch_orig(ipsp-ntyppure,itypat-ntyppure,1)*zionpsp(ipsp)
 929      end do
 930    end do
 931  end if
 932 
 933  charge=dtset%charge
 934 
 935  if (occopt==0 .or. occopt==1 .or. (occopt>=3 .and. occopt<=8) ) then
 936 
 937    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nband',tnband,'INT')
 938    if(tnband==1) then
 939      nband1=intarr(1)
 940    else
 941 !    Default value in the metallic case, or in the insulating case
 942      fband=0.5_dp
 943      if(occopt==1)fband=0.125_dp
 944      if((occopt/=1).and.(dtset%accuracy==5.or.dtset%accuracy==6)) fband =0.75_dp
 945      if (dtset%usewvl == 1) fband = zero
 946      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fband',tfband,'DPR')
 947      if(tfband==1)then
 948        fband=dprarr(1)
 949        write(message, '(a,es16.8,a)' )' invars2: read the value of fband=',fband,' from input file.'
 950      else
 951        write(message, '(a,es16.8)' )' invars2: take the default value of fband=',fband
 952      end if
 953      dtset%fband=fband
 954      call wrtout(std_out,message,'COLL')
 955 !    First compute the total valence charge
 956      zval=0.0_dp
 957      do iatom=1,natom
 958        zval=zval+dtset%ziontypat(dtset%typat(iatom))
 959      end do
 960      zelect=zval-charge
 961 !    Then select the minimum number of bands, and add the required number
 962 !    Note that this number might be smaller than the one computed
 963 !    by a slightly different formula in invars1
 964      nband1=dtset%nspinor * ((ceiling(zelect-1.0d-10)+1)/2 + ceiling( fband*natom - 1.0d-10 ))
 965    end if
 966 
 967 !  Set nband to same input number for each k point and spin
 968 !  where nband1 is the eventual input, computed value, or default
 969    do ikpt=1,nkpt*nsppol
 970      dtset%nband(ikpt)=nband1
 971    end do
 972 
 973  else if (occopt==2) then
 974 !  Give nband explicitly for each k point and spin
 975 
 976    call intagm(dprarr,intarr,jdtset,nkpt*nsppol,nkpt*nsppol,string(1:lenstr),'nband',tnband,'INT')
 977    if(tnband==1) dtset%nband(1:nkpt*nsppol)=intarr(1:nkpt*nsppol)
 978 
 979  else
 980    write(message, '(a,i0,3a)' )&
 981 &   'occopt=',occopt,' not allowed.',ch10,&
 982 &   'Action: correct your input file.'
 983    MSG_ERROR(message)
 984  end if
 985 
 986 !----------------------------------------------------------------------------
 987 
 988 !****   Read other parameters  ****
 989 
 990 !All checking should be done in chkinp.f
 991 
 992  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'auxc_scal',tread,'DPR')
 993  if(tread==1) dtset%auxc_scal=dprarr(1)
 994 
 995  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'builtintest',tread,'INT')
 996  if(tread==1) dtset%builtintest=intarr(1)
 997 
 998  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chkdilatmx',tread,'INT')
 999  if(tread==1) dtset%chkdilatmx=intarr(1)
1000 
1001  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chksymbreak',tread,'INT')
1002  if(tread==1) dtset%chksymbreak=intarr(1)
1003 
1004  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fockoptmix',tread,'INT')
1005  if(tread==1) dtset%fockoptmix=intarr(1)
1006 
1007 !Get array
1008  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getocc',tread,'INT')
1009  if(tread==1) dtset%getocc=intarr(1)
1010 
1011  getocc=dtset%getocc
1012  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfk',tread,'INT')
1013  if(tread==1) dtset%getwfk=intarr(1)
1014 
1015  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfkfine',tread,'INT')
1016  if(tread==1) dtset%getwfkfine=intarr(1)
1017 
1018  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getxcart',tread,'INT')
1019  if(tread==1) dtset%getxcart=intarr(1)
1020 
1021  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getxred',tread,'INT')
1022  if(tread==1) dtset%getxred=intarr(1)
1023 
1024  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getddb',tread,'INT')
1025  if(tread==1) dtset%getddb=intarr(1)
1026 
1027  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getden',tread,'INT')
1028  if(tread==1) dtset%getden=intarr(1)
1029 
1030  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getpawden',tread,'INT')
1031  if(tread==1) dtset%getpawden=intarr(1)
1032 
1033  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getcell',tread,'INT')
1034  if(tread==1) dtset%getcell=intarr(1)
1035 
1036  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getgam_eig2nkq',tread,'INT')
1037  if(tread==1) dtset%getgam_eig2nkq=intarr(1)
1038 
1039  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfq',tread,'INT')
1040  if(tread==1) dtset%getwfq=intarr(1)
1041 
1042  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'get1wf',tread,'INT')
1043  if(tread==1) dtset%get1wf=intarr(1)
1044 
1045  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getddk',tread,'INT')
1046  if(tread==1) dtset%getddk=intarr(1)
1047 
1048  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdelfd',tread,'INT')
1049  if(tread==1) dtset%getdelfd=intarr(1)
1050 
1051  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdkdk',tread,'INT')
1052  if(tread==1) dtset%getdkdk=intarr(1)
1053 
1054  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdkde',tread,'INT')
1055  if(tread==1) dtset%getdkde=intarr(1)
1056 
1057  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getvel',tread,'INT')
1058  if(tread==1) dtset%getvel=intarr(1)
1059 
1060  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'get1den',tread,'INT')
1061  if(tread==1) dtset%get1den=intarr(1)
1062 
1063  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iomode',tread,'INT')
1064  if(tread==1) dtset%iomode=intarr(1)
1065 
1066  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'enunit',tread,'INT')
1067  if(tread==1) dtset%enunit=intarr(1)
1068 
1069 ! eph variables
1070  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'asr',tread,'INT')
1071  if(tread==1) dtset%asr=intarr(1)
1072 
1073  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dipdip',tread,'INT')
1074  if(tread==1) dtset%dipdip=intarr(1)
1075 
1076  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chneut',tread,'INT')
1077  if(tread==1) dtset%chneut=intarr(1)
1078 
1079  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symdynmat',tread,'INT')
1080  if(tread==1) dtset%symdynmat=intarr(1)
1081 
1082  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_mustar',tread,'DPR')
1083  if(tread==1) dtset%eph_mustar=dprarr(1)
1084 
1085  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_intmeth',tread,'INT')
1086  if(tread==1) dtset%eph_intmeth=intarr(1)
1087 
1088  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_extrael',tread,'DPR')
1089  if(tread==1) dtset%eph_extrael=dprarr(1)
1090 
1091  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_fermie',tread,'ENE')
1092  if(tread==1) dtset%eph_fermie=dprarr(1)
1093 
1094  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_fsmear',tread,'ENE')
1095  if(tread==1) dtset%eph_fsmear=dprarr(1)
1096 
1097  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_fsewin',tread,'ENE')
1098  if(tread==1) dtset%eph_fsewin=dprarr(1)
1099 
1100  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'eph_ngqpt_fine',tread,'INT')
1101  if(tread==1) dtset%eph_ngqpt_fine=intarr(1:3)
1102 
1103  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_task',tread,'INT')
1104  if(tread==1) dtset%eph_task=intarr(1)
1105 
1106  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_transport',tread,'INT')
1107  if(tread==1) dtset%eph_transport=intarr(1)
1108 
1109  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_wstep',tread,'ENE')
1110  if(tread==1) dtset%ph_wstep=dprarr(1)
1111 
1112  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_intmeth',tread,'INT')
1113  if(tread==1) dtset%ph_intmeth=intarr(1)
1114 
1115  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_smear',tread,'ENE')
1116  if(tread==1) dtset%ph_smear=dprarr(1)
1117 
1118  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ddb_ngqpt',tread,'INT')
1119  if(tread==1) dtset%ddb_ngqpt=intarr(1:3)
1120 
1121  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ddb_shiftq',tread,'DPR')
1122  if(tread==1) dtset%ddb_shiftq=dprarr(1:3)
1123 
1124  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_ndivsm',tread,'INT')
1125  if(tread==1) dtset%ph_ndivsm=intarr(1)
1126 
1127  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_nqpath',tread,'INT')
1128  if(tread==1) dtset%ph_nqpath=intarr(1)
1129 
1130  if (dtset%ph_nqpath > 0) then
1131    ! Read qpath for phonons
1132    ABI_MALLOC(dtset%ph_qpath, (3, dtset%ph_nqpath))
1133    ABI_CHECK(3 * dtset%ph_nqpath <= marr, "3 * dtset%ph_nqpath > marr!")
1134    call intagm(dprarr,intarr,jdtset,marr,3*dtset%ph_nqpath,string(1:lenstr),'ph_qpath',tread,'DPR')
1135    if (tread==0) then
1136      MSG_ERROR("When ph_nqpath > 0, ph_qpath should be specified")
1137    end if
1138    dtset%ph_qpath = reshape(dprarr(1:3*dtset%ph_nqpath), [3, dtset%ph_nqpath])
1139  end if
1140 
1141  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_nqshift',tread,'INT')
1142  if(tread==1) dtset%ph_nqshift=intarr(1)
1143 
1144  if (dtset%ph_nqshift > 0) then
1145    ! Read ph_qshift for phonons default is [0,0,0]
1146    ABI_CALLOC(dtset%ph_qshift, (3, dtset%ph_nqshift))
1147    if (tread == 1) then
1148      ABI_CHECK(3 * dtset%ph_nqshift <= marr, "3 * dtset%ph_nqshift > marr!")
1149      call intagm(dprarr,intarr,jdtset,marr,3*dtset%ph_nqshift,string(1:lenstr),'ph_qshift',tread,'DPR')
1150      if (tread == 0) then
1151        MSG_ERROR("When ph_nqshift > 0, ph_qshift should be specified")
1152      end if
1153      dtset%ph_qshift = reshape(dprarr(1:3*dtset%ph_nqshift), [3, dtset%ph_nqshift])
1154    end if
1155  end if
1156 
1157  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ph_ngqpt',tread,'INT')
1158  if(tread==1) dtset%ph_ngqpt=intarr(1:3)
1159 !end e-ph variables
1160 
1161  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'exchn2n3d',tread,'INT')
1162  if(tread==1) dtset%exchn2n3d=intarr(1)
1163 
1164  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'extrapwf',tread,'INT')
1165  if(tread==1) dtset%extrapwf=intarr(1)
1166 
1167  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iboxcut',tread,'INT')
1168  if(tread==1) dtset%iboxcut=intarr(1)
1169 
1170  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'icutcoul',tread,'INT')
1171  if(tread==1) dtset%icutcoul=intarr(1)
1172 
1173  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mdf_epsinf',tread,'DPR')
1174  if(tread==1) dtset%mdf_epsinf=dprarr(1)
1175 
1176  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mem_test',tread,'INT')
1177  if(tread==1) dtset%mem_test=intarr(1)
1178 
1179  if (dtset%imgmov==0.or.dtset%imgmov==2.or.dtset%imgmov==5) then
1180    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mep_mxstep',tread,'LEN')
1181    if(tread==1) then
1182      dtset%mep_mxstep=dprarr(1)
1183    else if(dtset%imgmov==5) then
1184      dtset%mep_mxstep=0.4_dp
1185    end if
1186  end if
1187  if (dtset%imgmov==2.or.dtset%imgmov==5) then
1188    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mep_solver',tread,'INT')
1189    if(tread==1) then
1190      dtset%mep_solver=intarr(1)
1191    else if(dtset%imgmov==2) then
1192      dtset%mep_solver=0
1193    else if(dtset%imgmov==5) then
1194      dtset%mep_solver=0
1195    end if
1196    if (dtset%imgmov==2) then
1197      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'string_algo',tread,'INT')
1198      if(tread==1) dtset%string_algo=intarr(1)
1199    end if
1200    if (dtset%imgmov==5) then
1201      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'neb_algo',tread,'INT')
1202      if(tread==1) dtset%neb_algo=intarr(1)
1203      call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'neb_spring',tread,'DPR')
1204      if(tread==1) then
1205        dtset%neb_spring(1:2)=dprarr(1:2)
1206      else if (dtset%neb_algo==2) then
1207        dtset%neb_spring(1:2)=(/0.02_dp,0.15_dp/)
1208      end if
1209      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cineb_start',tread,'INT')
1210      if(tread==1) dtset%cineb_start=intarr(1)
1211    end if
1212  end if
1213 
1214  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'istatimg',tread,'INT')
1215  if(tread==1) dtset%istatimg=intarr(1)
1216 
1217 !variables for random positions in unit cell
1218  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'random_atpos',tread,'INT')
1219  if(tread==1) dtset%random_atpos=intarr(1)
1220 
1221  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ionmov',tread,'INT')
1222  if(tread==1) dtset%ionmov=intarr(1)
1223 
1224  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'intxc',tread,'INT')
1225  if(tread==1) dtset%intxc=intarr(1)
1226 
1227  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'densfor_pred',tread,'INT')
1228  if(tread==1) then
1229    dtset%densfor_pred=intarr(1)
1230  else
1231    if (dtset%paral_kgb==1) dtset%densfor_pred=6
1232  end if
1233 
1234 !--For the moment LOTF does not use different from 2
1235  if(dtset%ionmov==23) then
1236 #ifdef HAVE_LOTF
1237    if(dtset%densfor_pred/=2)then
1238      densfor_pred=2
1239      dtset%densfor_pred=densfor_pred
1240      write(message, '(4a)' )&
1241 &     'When ionmov==23, densfor_pred must be 2.',ch10,&
1242 &     'Set densfor_pred to 2.',ch10
1243      MSG_COMMENT(message)
1244    end if
1245 #else
1246    dtset%ionmov=12
1247    write(message, '(4a)' )&
1248 &   'LOTF is disabled, ionmov can not be 23.',ch10,&
1249 &   'Set ionmov to 12.',ch10
1250    MSG_COMMENT(message)
1251 #endif
1252  end if
1253 
1254  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iprcel',tread,'INT')
1255  if(tread==1) dtset%iprcel=intarr(1)
1256 
1257  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iprcfc',tread,'INT')
1258  if(tread==1) dtset%iprcfc=intarr(1)
1259 
1260  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irandom',tread,'INT')
1261  if(tread==1) dtset%irandom=intarr(1)
1262 
1263  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdddb',tread,'INT')
1264  if(tread==1) dtset%irdddb=intarr(1)
1265 
1266  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdden',tread,'INT')
1267  if(tread==1) dtset%irdden=intarr(1)
1268 
1269  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdpawden',tread,'INT')
1270  if(tread==1) dtset%irdpawden=intarr(1)
1271 
1272  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdhaydock',tread,'INT')
1273  if(tread==1) dtset%irdhaydock=intarr(1)
1274 
1275  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdvdw',tread,'INT')
1276  if(tread==1) dtset%irdvdw=intarr(1)
1277 
1278  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdwfk',tread,'INT')
1279  if(tread==1) dtset%irdwfk=intarr(1)
1280 
1281  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdwfkfine',tread,'INT')
1282  if(tread==1) dtset%irdwfkfine=intarr(1)
1283 
1284  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iscf',tread,'INT')
1285  if(tread==1) then
1286    dtset%iscf=intarr(1)
1287    if (dtset%usewvl==1) then
1288      !wvl_bigdft_comp should be 1 for iscf=0, 0 for iscf>0, except if it is set by the user
1289      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_bigdft_comp',tread,'INT')
1290      if (tread==0.and.dtset%iscf==0) dtset%wvl_bigdft_comp=1
1291      if (tread==0.and.dtset%iscf >0) dtset%wvl_bigdft_comp=0
1292    end if
1293  else if (dtset%optdriver==RUNL_RESPFN.and.dtset%iscf>=10) then
1294    dtset%iscf=dtset%iscf-10
1295  else if (dtset%optdriver==RUNL_GWLS) then
1296    dtset%iscf=-2
1297  end if
1298 
1299  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'isecur',tread,'INT')
1300  if(tread==1) dtset%isecur=intarr(1)
1301 
1302 !Reading ixc must be immediately followed by reading xcname
1303  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixc',tread,'INT')
1304  if(tread==1) dtset%ixc=intarr(1)
1305  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),"xcname",tread_key,'KEY',key_value=key_value)
1306  if(tread_key==1)then
1307    if(tread==1)then
1308      write(message, '(5a)' )&
1309 &     'ixc and xcname cannot be specified simultaneously',ch10,&
1310 &     'for the same dataset.',ch10,&
1311 &     'Action: check the input file.'
1312      MSG_ERROR(message)
1313    else
1314 !    Note that xcname is a 'key' variable : its value is stored in keyw at output of intagm
1315      if(trim(key_value)=='PW92')dtset%ixc=7
1316      tread=1
1317    end if
1318  end if
1319  ixc_current=dtset%ixc
1320 
1321  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixcrot',tread,'INT')
1322  if(tread==1) dtset%ixcrot=intarr(1)
1323 
1324 !Read the ixc for an advanced functional
1325 !If present, and relevant (only specific values for gcalctyp), the other internal variable will be adjusted to this other functional)
1326  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixc_sigma',tread,'INT')
1327  if(tread==1)then
1328    dtset%ixc_sigma=intarr(1)
1329    if( dtset%optdriver==RUNL_SIGMA .and. mod(dtset%gwcalctyp,10)==5)ixc_current=dtset%ixc_sigma
1330  end if
1331 
1332 !Initialize xclevel and usefock
1333  call get_xclevel(ixc_current,dtset%xclevel,dtset%usefock)
1334 
1335  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'auxc_ixc',tread,'INT')
1336  if(tread==1) dtset%auxc_ixc=intarr(1)
1337 !If the default value had been given, possibly switch on the auxc_ixc corresponding to ixc, if the latter is an hybrid
1338  if(dtset%auxc_ixc==0)then
1339    call get_auxc_ixc(dtset%auxc_ixc,ixc_current)
1340  end if
1341 
1342 !Now take care of the parameters for hybrid functionals
1343  if(dtset%usefock==1)then
1344 
1345    if(ixc_current ==40 .or. ixc_current ==41 .or. ixc_current ==42)then
1346      dtset%hyb_mixing_sr=zero
1347      dtset%hyb_range_dft=zero ; dtset%hyb_range_fock=zero
1348      if(ixc_current==40)dtset%hyb_mixing=one
1349      if(ixc_current==41)dtset%hyb_mixing=quarter
1350      if(ixc_current==42)dtset%hyb_mixing=third
1351    else if(ixc_current==-427)then   ! Special case of HSE03
1352      dtset%hyb_mixing=zero  ; dtset%hyb_mixing_sr=quarter
1353      dtset%hyb_range_dft=0.15_dp*two**third  ; dtset%hyb_range_fock=0.15_dp*sqrt(half)
1354    else if (ixc_current<0) then
1355      call libxc_functionals_init(ixc_current,dtset%nspden)
1356      call libxc_functionals_get_hybridparams(hyb_mixing=dtset%hyb_mixing,hyb_mixing_sr=dtset%hyb_mixing_sr,&
1357 &     hyb_range=dtset%hyb_range_dft)
1358      call libxc_functionals_end()
1359      dtset%hyb_range_fock=dtset%hyb_range_dft
1360    end if
1361 
1362 !  Warning : the user-defined parameters for hybrids are by convention stored as negative numbers
1363 !  This trick will allow to echo them, and only them.
1364    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_mixing',tread,'DPR')
1365    if(tread==1)then
1366      if(dprarr(1)<-tol14)then
1367        write(message, '(5a)' )&
1368 &       ' A negative value for hyb_mixing is not allowed, while at input hyb_mixing=',dprarr(1),ch10,&
1369 &       ' Action: modify hyb_mixing in the input file.'
1370        MSG_ERROR(message)
1371      end if
1372      dtset%hyb_mixing=-dprarr(1) ! Note the minus sign
1373    end if
1374 
1375    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_mixing_sr',tread,'DPR')
1376    if(tread==1)then
1377      if(dprarr(1)<-tol14)then
1378        write(message, '(5a)' )&
1379 &       ' A negative value for hyb_mixing_sr is not allowed, while at input hyb_mixing_sr=',dprarr(1),ch10,&
1380 &       ' Action: modify hyb_mixing_sr in the input file.'
1381        MSG_ERROR(message)
1382      end if
1383      dtset%hyb_mixing_sr=-dprarr(1) ! Note the minus sign
1384    end if
1385 
1386    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_range_dft',tread_dft,'DPR')
1387    if(tread_dft==1)then
1388      if(dprarr(1)<-tol14)then
1389        write(message, '(5a)' )&
1390 &       ' A negative value for hyb_range_dft is not allowed, while at input hyb_range_dft=',dprarr(1),ch10,&
1391 &       ' Action: modify hyb_range_dft in the input file.'
1392        MSG_ERROR(message)
1393      end if
1394      dtset%hyb_range_dft=-dprarr(1) ! Note the minus sign
1395    end if
1396 
1397    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_range_fock',tread_fock,'DPR')
1398    if(tread_fock==1)then
1399      if(dprarr(1)<-tol14)then
1400        write(message, '(5a)' )&
1401 &       ' A negative value for hyb_range_fock is not allowed, while at input hyb_range_fock=',dprarr(1),ch10,&
1402 &       ' Action: modify hyb_range_fock in the input file.'
1403        MSG_ERROR(message)
1404      end if
1405      dtset%hyb_range_fock=-dprarr(1) ! Note the minus sign
1406    end if
1407 
1408    if(tread_fock==1 .and. tread_dft==0)dtset%hyb_range_dft=dtset%hyb_range_fock
1409    if(tread_fock==0 .and. tread_dft==1)dtset%hyb_range_fock=dtset%hyb_range_dft
1410 
1411  end if
1412 
1413  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_acutmin',tread,'DPR')
1414  if(tread==1) dtset%vdw_df_acutmin=dprarr(1)
1415  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_aratio',tread,'DPR')
1416  if(tread==1) dtset%vdw_df_aratio=dprarr(1)
1417  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_damax',tread,'DPR')
1418  if(tread==1) dtset%vdw_df_damax=dprarr(1)
1419  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_damin',tread,'DPR')
1420  if(tread==1) dtset%vdw_df_damin=dprarr(1)
1421  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_dcut',tread,'DPR')
1422  if(tread==1) dtset%vdw_df_dcut=dprarr(1)
1423  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_dratio',tread,'DPR')
1424  if(tread==1) dtset%vdw_df_dratio=dprarr(1)
1425  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_dsoft',tread,'DPR')
1426  if(tread==1) dtset%vdw_df_dsoft=dprarr(1)
1427  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_gcut',tread,'DPR')
1428  if(tread==1) dtset%vdw_df_gcut=dprarr(1)
1429  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_ndpts',tread,'INT')
1430  if(tread==1) dtset%vdw_df_ndpts=intarr(1)
1431  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_ngpts',tread,'INT')
1432  if(tread==1) dtset%vdw_df_ngpts=intarr(1)
1433  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_nqpts',tread,'INT')
1434  if(tread==1) dtset%vdw_df_nqpts=intarr(1)
1435  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_nrpts',tread,'INT')
1436  if(tread==1) dtset%vdw_df_nrpts=intarr(1)
1437  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_nsmooth',tread,'INT')
1438  if(tread==1) dtset%vdw_df_nsmooth=intarr(1)
1439  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_phisoft',tread,'DPR')
1440  if(tread==1) dtset%vdw_df_phisoft=dprarr(1)
1441  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_qcut',tread,'DPR')
1442  if(tread==1) dtset%vdw_df_qcut=dprarr(1)
1443  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_qratio',tread,'DPR')
1444  if(tread==1) dtset%vdw_df_qratio=dprarr(1)
1445  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_rcut',tread,'DPR')
1446  if(tread==1) dtset%vdw_df_rcut=dprarr(1)
1447  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_rsoft',tread,'DPR')
1448  if(tread==1) dtset%vdw_df_rsoft=dprarr(1)
1449  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_tolerance',tread,'DPR')
1450  if(tread==1) dtset%vdw_df_tolerance=dprarr(1)
1451  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_threshold',tread,'DPR',ds_input)
1452  if(tread==1) dtset%vdw_df_threshold=dprarr(1)
1453  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_tweaks',tread,'INT')
1454  if(tread==1) dtset%vdw_df_tweaks=intarr(1)
1455  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_zab',tread,'DPR')
1456  if(tread==1) dtset%vdw_df_zab=dprarr(1)
1457  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_xc',tread,'INT')
1458  if(tread==1) dtset%vdw_xc=intarr(1)
1459 
1460  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'posdoppler',tread,'INT')
1461  if(tread==1) dtset%posdoppler=intarr(1)
1462 
1463  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'positron',tread,'INT')
1464  if(tread==1) dtset%positron=intarr(1)
1465 
1466  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixcpositron',tread,'INT')
1467  if(tread==1) dtset%ixcpositron=intarr(1)
1468 
1469  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'posnstep',tread,'INT')
1470  if(tread==1) dtset%posnstep=intarr(1)
1471 
1472  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'posocc',tread,'DPR')
1473  if(tread==1) dtset%posocc=dprarr(1)
1474 
1475  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'frzfermi',tread,'INT')
1476  if(tread==1) dtset%frzfermi=intarr(1)
1477 
1478  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nqpt',tread,'INT')
1479  if(tread==1) dtset%nqpt=intarr(1)
1480 
1481  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas',tread,'INT')
1482  if(tread==1) dtset%efmas=intarr(1)
1483 
1484  if(dtset%efmas>0) then
1485    call intagm(dprarr,intarr,jdtset,marr,2*nkpt,string(1:lenstr),'efmas_bands',tread,'INT')
1486    if(tread==1) then
1487      dtset%efmas_bands(1:2,1:nkpt)=reshape(intarr(1:2*nkpt),(/2,nkpt/))
1488    else
1489      dtset%efmas_bands(1,:)=1
1490      dtset%efmas_bands(2,:)=dtset%nband(:)
1491    end if
1492  end if
1493 
1494  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_deg',tread,'INT')
1495  if(tread==1) dtset%efmas_deg=intarr(1)
1496 
1497  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_deg_tol',tread,'ENE')
1498  if(tread==1) dtset%efmas_deg_tol=dprarr(1)
1499 
1500  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_dim',tread,'INT')
1501  if(tread==1) dtset%efmas_dim=intarr(1)
1502 
1503  if(dtset%efmas_calc_dirs/=0 .and. dtset%efmas_n_dirs>0) then
1504    ndim=2+MERGE(1,0,ABS(dtset%efmas_calc_dirs)<3)
1505    call intagm(dprarr,intarr,jdtset,marr,ndim*dtset%efmas_n_dirs,string(1:lenstr),'efmas_dirs',tread,'DPR')
1506    if(tread==1) then
1507      dtset%efmas_dirs(1:ndim,1:dtset%efmas_n_dirs)=reshape(dprarr(1:ndim*dtset%efmas_n_dirs),(/ndim,dtset%efmas_n_dirs/))
1508    end if
1509  end if
1510 
1511  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_ntheta',tread,'INT')
1512  if(tread==1) dtset%efmas_ntheta=intarr(1)
1513 
1514  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ieig2rf',tread,'INT')
1515  if(tread==1) dtset%ieig2rf=intarr(1)
1516 
1517  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'smdelta',tread,'INT')
1518  if(tread==1) dtset%smdelta=intarr(1)
1519 
1520  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bdeigrf',tread,'INT')
1521  if(tread==1) dtset%bdeigrf=intarr(1)
1522 
1523  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'restartxf',tread,'INT')
1524  if(tread==1) dtset%restartxf=intarr(1)
1525  if (dtset%restartxf == 1) then
1526    MSG_ERROR("restartxf == 1 has been removed in Abinit8. Use 0,-1,-2")
1527  end if
1528 
1529  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optcell',tread,'INT')
1530  if(tread==1) dtset%optcell=intarr(1)
1531 
1532  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdwfq',tread,'INT')
1533  if(tread==1) dtset%irdwfq=intarr(1)
1534 
1535  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ird1den',tread,'INT')
1536  if(tread==1) dtset%ird1den=intarr(1)
1537 
1538  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ird1wf',tread,'INT')
1539  if(tread==1) dtset%ird1wf=intarr(1)
1540 
1541  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdddk',tread,'INT')
1542  if(tread==1) dtset%irdddk=intarr(1)
1543 
1544  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kptopt',tread,'INT')
1545  if(tread==1) dtset%kptopt=intarr(1)
1546 
1547  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chkexit',tread,'INT')
1548  if(tread==1) dtset%chkexit=intarr(1)
1549 
1550  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbdblock',tread,'INT')
1551  if(tread==1) dtset%nbdblock=intarr(1)
1552 
1553  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbdbuf',tread,'INT')
1554  if(tread==1)then
1555    dtset%nbdbuf=intarr(1)
1556  else
1557    if(response/=1 .and. dtset%iscf<0)dtset%nbdbuf=2*dtset%nspinor
1558    if(response==1 .and. 3<=occopt .and. occopt<=8 )dtset%nbdbuf=2*dtset%nspinor
1559  end if
1560 
1561  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'localrdwf',tread,'INT')
1562  if(tread==1) dtset%localrdwf=intarr(1)
1563 
1564  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'magconon',tread,'INT')
1565  if(tread==1) dtset%magconon=intarr(1)
1566 
1567  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'magcon_lambda',tread,'DPR')
1568  if(tread==1) dtset%magcon_lambda=dprarr(1)
1569 
1570  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optforces',tread,'INT')
1571  if(tread==1) dtset%optforces=intarr(1)
1572  if(dtset%usedmft>0.and.dtset%optforces/=0) then
1573    write(message, '(3a,i0)' )&
1574 &   'When DFT+DMFT is activated ', ch10, &
1575 &   'optforces must be equal to 0 instead of',dtset%optforces
1576    MSG_ERROR(message)
1577  end if
1578 
1579  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optstress',tread,'INT')
1580  if(tread==1) dtset%optstress=intarr(1)
1581 
1582  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optnlxccc',tread,'INT')
1583  if(tread==1) dtset%optnlxccc=intarr(1)
1584 
1585  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nberry',tread,'INT')
1586  if(tread==1) dtset%nberry=intarr(1)
1587 
1588  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nc_xccc_gspace',tread,'INT')
1589  if(tread==1) dtset%nc_xccc_gspace=intarr(1)
1590 
1591  call intagm(dprarr,intarr,jdtset,marr,2*nsppol,string(1:lenstr),'bdberry',tread,'INT')
1592  if(tread==1) then
1593    dtset%bdberry(1)=intarr(1); dtset%bdberry(2)=intarr(2)
1594    if(nsppol==2)then
1595      dtset%bdberry(3)=intarr(3); dtset%bdberry(4)=intarr(4)
1596    end if
1597  end if
1598 
1599  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'berrystep',tread,'INT')
1600  if(tread==1) dtset%berrystep=intarr(1)
1601 
1602  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'delayperm',tread,'INT')
1603  if(tread==1) dtset%delayperm=intarr(1)
1604 
1605  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'signperm',tread,'INT')
1606  if(tread==1) dtset%signperm=intarr(1)
1607 
1608  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbandkss',tread,'INT')
1609  if(tread==1) dtset%nbandkss=intarr(1)
1610  if ( dtset%usedmft > 0  .and. dtset%nbandkss==0) then
1611   if (dtset%usepawu==4.or.dtset%usepawu==14)  dtset%usepawu=14
1612   if (dtset%usepawu/=4.and.dtset%usepawu/=14) dtset%usepawu=10
1613  endif
1614 
1615  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'npwkss',tread,'INT')
1616  if(tread==1) dtset%npwkss=intarr(1)
1617 
1618  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kssform',tread,'INT')
1619  if(tread==1) dtset%kssform=intarr(1)
1620 
1621  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_mexcit',tread,'INT')
1622  if(tread==1) dtset%td_mexcit=intarr(1)
1623 
1624  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'npvel',tread,'INT')
1625  if(tread==1) dtset%npvel=intarr(1)
1626 
1627  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'npulayit',tread,'INT')
1628  if(tread==1) dtset%npulayit=intarr(1)
1629 
1630  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diismemory',tread,'INT')
1631  if(tread==1) dtset%diismemory=intarr(1)
1632 
1633  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'goprecon',tread,'INT')
1634  if(tread==1) dtset%goprecon=intarr(1)
1635 
1636  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'goprecprm',tread,'DPR')
1637  if(tread==1) dtset%goprecprm(1:3)=dprarr(1:3)
1638 
1639  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nwfshist',tread,'INT')
1640  if(tread==1) dtset%nwfshist=intarr(1)
1641 
1642  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nscforder', tread, 'INT')
1643  if (tread == 1) dtset%nscforder = intarr(1)
1644 
1645  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nomegasrd',tread,'INT')
1646  if(tread==1) dtset%nomegasrd=intarr(1)
1647 
1648  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'corecs',tread,'DPR')
1649  if(tread==1)then
1650    dtset%corecs(1:ntypat)=dprarr(1:ntypat)
1651  end if
1652 
1653  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'ptcharge',tread,'DPR')
1654  if(tread==1)then
1655    dtset%ptcharge(1:ntypat)=dprarr(1:ntypat)
1656  end if
1657 
1658  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'quadmom',tread,'DPR')
1659  if(tread==1)then
1660    dtset%quadmom(1:ntypat)=dprarr(1:ntypat)
1661  end if
1662 
1663  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawcpxocc',tread,'INT')
1664  if(tread==1) then
1665    dtset%pawcpxocc=intarr(1)
1666  else if (dtset%nspinor==2.and.(dtset%usepawu>=1.or.dtset%usedmft>0)) then
1667    dtset%pawcpxocc=2
1668  else if (dtset%pawspnorb>0.and.(dtset%kptopt<=0.or.dtset%kptopt>=3)) then
1669    if (dtset%optdriver/=RUNL_GSTATE.or.dtset%ionmov<6.or.dtset%iscf<10) dtset%pawcpxocc=2
1670  end if
1671 
1672  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawcross',tread,'INT')
1673  if(tread==1) dtset%pawcross=intarr(1)
1674 
1675  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawecutdg',tread,'ENE')
1676  if(tread==1) then
1677    dtset%pawecutdg=dprarr(1)
1678  else if (dtset%accuracy==1.or.dtset%accuracy==2) then
1679    dtset%pawecutdg=dtset%ecut
1680  else if (dtset%accuracy==3.) then
1681    dtset%pawecutdg=1.2_dp*dtset%ecut
1682  else if (dtset%accuracy==4) then
1683    dtset%pawecutdg=1.5_dp*dtset%ecut
1684  else if (dtset%accuracy==5.or.dtset%accuracy==6) then
1685    dtset%pawecutdg=two*dtset%ecut
1686 ! NOT YET ACTIVATED
1687 ! else if (dtset%accuracy==0.and.usepaw==1.and.dtset%usewvl==0) then
1688 !  dtset%pawecutdg=1.5_dp*dtset%ecut
1689  end if
1690  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawlcutd',tread,'INT')
1691  if(tread==1) dtset%pawlcutd=intarr(1)
1692 
1693  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawlmix',tread,'INT')
1694  if(tread==1) dtset%pawlmix=intarr(1)
1695 
1696  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawmixdg',tread,'INT')
1697  if(tread==1) then
1698    dtset%pawmixdg=intarr(1)
1699  else if (dtset%npfft>1.and.usepaw==1) then
1700    dtset%pawmixdg=1
1701  else if (dtset%usewvl==1.and.usepaw==1) then
1702    dtset%pawmixdg=1
1703  end if
1704 
1705  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawnhatxc',tread,'INT')
1706  if(tread==1) dtset%pawnhatxc=intarr(1)
1707 
1708  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawntheta',tread,'INT')
1709  if(tread==1) dtset%pawntheta=intarr(1)
1710 
1711  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawnphi',tread,'INT')
1712  if(tread==1) dtset%pawnphi=intarr(1)
1713 
1714  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawnzlm',tread,'INT')
1715  if(tread==1) dtset%pawnzlm=intarr(1)
1716 
1717  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawoptmix',tread,'INT')
1718  if(tread==1) then
1719    dtset%pawoptmix=intarr(1)
1720  else
1721    if (usepaw==1.and.dtset%iscf<10.and.(dtset%positron==1.or.dtset%positron<0)) dtset%pawoptmix=1
1722  end if
1723 
1724  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawoptosc',tread,'INT')
1725  if(tread==1) dtset%pawoptosc=intarr(1)
1726 
1727  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawovlp',tread,'DPR')
1728  if(tread==1) dtset%pawovlp=dprarr(1)
1729 
1730  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprtdos',tread,'INT')
1731  if(tread==1) dtset%pawprtdos=intarr(1)
1732 
1733  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprtvol',tread,'INT')
1734  if(tread==1) dtset%pawprtvol=intarr(1)
1735 
1736  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprtwf',tread,'INT')
1737  if(tread==1) dtset%pawprtwf=intarr(1)
1738 
1739  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprt_k',tread,'INT')
1740  if(tread==1) dtset%pawprt_k=intarr(1)
1741 
1742  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprt_b',tread,'INT')
1743  if(tread==1) dtset%pawprt_b=intarr(1)
1744 
1745  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawstgylm',tread,'INT')
1746  if(tread==1) dtset%pawstgylm=intarr(1)
1747 
1748  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawsushat',tread,'INT')
1749  if(tread==1) dtset%pawsushat=intarr(1)
1750 
1751  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawusecp',tread,'INT')
1752  if(tread==1) dtset%pawusecp=intarr(1)
1753 
1754  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawxcdev',tread,'INT')
1755  if(tread==1) dtset%pawxcdev=intarr(1)
1756 
1757  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spnorbscl',tread,'DPR')
1758  if(tread==1) dtset%spnorbscl=dprarr(1)
1759 
1760  if (dtset%usedmft>0) then
1761    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_dc',tread,'INT')
1762    if(tread==1) dtset%dmft_dc=intarr(1)
1763    if (dtset%usepawu==14.and.dtset%dmft_dc/=5) then
1764      write(message, '(a,a,a)' )&
1765 &     'usepawu==4 and usedmft=1, dmft_dc should be equal to 5  ',ch10,&
1766 &     'impose dmft_dc = 5'
1767      MSG_WARNING(message)
1768      dtset%dmft_dc=5
1769    endif
1770    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_iter',tread,'INT')
1771    if(tread==1) dtset%dmft_iter=intarr(1)
1772    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_mxsf',tread,'DPR')
1773    if(tread==1) dtset%dmft_mxsf=dprarr(1)
1774    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_nwli',tread,'INT')
1775    if(tread==1) dtset%dmft_nwli=intarr(1)
1776    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_nwlo',tread,'INT')
1777    if(tread==1) dtset%dmft_nwlo=intarr(1)
1778    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_read_occnd',tread,'INT')
1779    if(tread==1) dtset%dmft_read_occnd=intarr(1)
1780    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_rslf',tread,'INT')
1781    if(tread==1) dtset%dmft_rslf=intarr(1)
1782    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_solv',tread,'INT')
1783    if(tread==1) dtset%dmft_solv=intarr(1)
1784    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_t2g',tread,'INT')
1785    if(tread==1) dtset%dmft_t2g=intarr(1)
1786    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_tolfreq',tread,'DPR')
1787    if(tread==1) dtset%dmft_tolfreq=dprarr(1)
1788    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_tollc',tread,'DPR')
1789    if(tread==1) dtset%dmft_tollc=dprarr(1)
1790    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftbandi',tread,'INT')
1791    if(tread==1) dtset%dmftbandi=intarr(1)
1792    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftbandf',tread,'INT')
1793    if(tread==1) dtset%dmftbandf=intarr(1)
1794    if((dtset%dmftbandf-dtset%dmftbandi+1)<2*maxval(dtset%lpawu(:))+1.and.(dtset%dmft_t2g==0)) then
1795      write(message, '(4a,i2,2a)' )&
1796      '   dmftbandf-dmftbandi+1)<2*max(lpawu(:))+1)',ch10, &
1797 &     '   Number of bands to construct Wannier functions is not', &
1798 &     ' sufficient to build Wannier functions for l=',maxval(dtset%lpawu(:)),ch10, &
1799 &     '   Action: select a correct number of KS bands with dmftbandi and dmftbandf.'
1800      MSG_ERROR(message)
1801    end if
1802 
1803    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftcheck',tread,'INT')
1804    if(tread==1) dtset%dmftcheck=intarr(1)
1805    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_entropy',tread,'INT')
1806    if(tread==1) dtset%dmft_entropy=intarr(1)
1807    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_nlambda',tread,'INT')
1808    if(tread==1) dtset%dmft_nlambda=intarr(1)
1809    if(dtset%dmft_solv>=4) then
1810      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_n',tread,'DPR')
1811      if(tread==1) then
1812        dtset%dmftqmc_n=dprarr(1)
1813      else if(dtset%ucrpa==0) then
1814      else
1815        write(message, '(5a)' )&
1816 &       'When DFT+DMFT is activated and one of QMC solvers is used,', ch10, &
1817 &       'dmftqmc_n MUST be defined.',ch10,&
1818 &       'Action: add dmftqmc_n keyword in input file.'
1819        MSG_ERROR(message)
1820      end if
1821      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_l',tread,'INT')
1822      if(tread==1) then
1823        dtset%dmftqmc_l=intarr(1)
1824      else if(dtset%ucrpa==0) then
1825        write(message, '(5a)' )&
1826 &       'When DFT+DMFT is activated and one of QMC solvers is used,', ch10, &
1827 &       'dmftqmc_l MUST be defined.',ch10,&
1828 &       'Action: add dmftqmc_l keyword in input file.'
1829        MSG_ERROR(message)
1830      end if
1831      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_seed',tread,'INT')
1832      if(tread==1) dtset%dmftqmc_seed=intarr(1)
1833      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_therm',tread,'INT')
1834      if(tread==1) then
1835        dtset%dmftqmc_therm=intarr(1)
1836      else if(dtset%ucrpa==0) then
1837        write(message, '(5a)' )&
1838 &       'When DFT+DMFT is activated and one of QMC solvers is used,', ch10, &
1839 &       'dmftqmc_therm MUST be defined.',ch10,&
1840 &       'Action: add dmftqmc_therm keyword in input file.'
1841        MSG_ERROR(message)
1842      end if
1843      if(dtset%dmft_solv==5) then
1844        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_basis',tread,'INT')
1845        if(tread==1) dtset%dmftctqmc_basis  =intarr(1)
1846        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_check',tread,'INT')
1847        if(tread==1) dtset%dmftctqmc_check  =intarr(1)
1848        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_correl',tread,'INT')
1849        if(tread==1) dtset%dmftctqmc_correl =intarr(1)
1850        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_gmove',tread,'INT')
1851        if(tread==1) dtset%dmftctqmc_gmove  =intarr(1)
1852        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_grnns',tread,'INT')
1853        if(tread==1) dtset%dmftctqmc_grnns  =intarr(1)
1854        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_meas',tread,'INT')
1855        if(tread==1) dtset%dmftctqmc_meas   =intarr(1)
1856        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_mrka',tread,'INT')
1857        if(tread==1) dtset%dmftctqmc_mrka   =intarr(1)
1858        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_mov',tread,'INT')
1859        if(tread==1) dtset%dmftctqmc_mov    =intarr(1)
1860        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_order',tread,'INT')
1861        if(tread==1) dtset%dmftctqmc_order  =intarr(1)
1862      end if
1863      if(dtset%dmft_solv>=6.and.dtset%dmft_solv<=7) then
1864        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_triqs_nleg',tread,'INT')
1865        if(tread==1) dtset%dmftctqmc_triqs_nleg  =intarr(1)
1866      end if
1867    end if
1868  end if
1869 
1870  if (dtset%usepawu>0.or.dtset%usedmft>0) then
1871    call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'f4of2_sla',tread,'ENE')
1872    if(tread==1)then
1873      dtset%f4of2_sla(1:ntypat)=dprarr(1:ntypat)
1874    end if
1875    call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'f6of2_sla',tread,'ENE')
1876    if(tread==1)then
1877      dtset%f6of2_sla(1:ntypat)=dprarr(1:ntypat)
1878    end if
1879    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmatpuopt',tread,'INT')
1880    if(tread==1) dtset%dmatpuopt=intarr(1)
1881    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmatudiag',tread,'INT')
1882    if(tread==1) dtset%dmatudiag=intarr(1)
1883  end if
1884 
1885  if (dtset%macro_uj>0) then
1886    dtset%pawujat=minval(pack((/ (ii,ii=1,dtset%natom) /) ,dtset%lpawu(dtset%typat(:))>0))
1887    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawujat',tread,'INT')
1888    if(tread==1) dtset%pawujat=intarr(1)
1889 
1890    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawujrad',tread,'LEN')
1891    if(tread==1) dtset%pawujrad=dprarr(1)
1892 
1893    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawujv',tread,'ENE')
1894    if(tread==1) dtset%pawujv=dprarr(1)
1895  end if
1896 
1897  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawfatbnd',tread,'INT')
1898  if(tread==1) dtset%pawfatbnd=intarr(1)
1899 
1900  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bxctmindg',tread,'DPR')
1901  if(tread==1) then
1902    dtset%bxctmindg=dprarr(1)
1903  else if(usepaw==1.and.dtset%accuracy==0)then
1904    dtset%bxctmindg=dtset%boxcutmin
1905  end if
1906 
1907  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'usexcnhat',tread,'INT')
1908  if(tread==1) dtset%usexcnhat_orig=intarr(1)
1909 
1910  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'useylm',tread,'INT')
1911  if(tread==1) then
1912    dtset%useylm=intarr(1)
1913    if ((usepaw==1).and.(dtset%useylm==0)) then
1914      write(message, '(a,a,a,a,a)' )&
1915 &     'Pseudopotential file is PAW format (pspcod=7 or 17) while',ch10,&
1916 &     'input variable "useylm" has the incompatible value 0 !',ch10,&
1917 &     'Action: change psp format or "useylm" value in your input file.'
1918      MSG_ERROR(message)
1919    end if
1920    if ((dtset%tfkinfunc==2).and.(dtset%useylm==0)) then
1921      write(message, '(a,a,a,a,a)' )&
1922 &     'You are using recursion method (tfkinfunc=2)  while',ch10,&
1923 &     'input variable "useylm" has the incompatible value 0 !',ch10,&
1924 &     'Action: change  "useylm" value in your input file.'
1925      MSG_ERROR(message)
1926    end if
1927    if ((dtset%efmas==1).and.(dtset%useylm==0)) then
1928      write(message, '(a,a,a,a,a)' )&
1929 &     'The calculation of effective masses requires the input variable, ',ch10,&
1930 &     '"useylm" to be 1, while in your input file, useylm=0',ch10,&
1931 &     'Action: change "useylm" value in your input file.'
1932      MSG_ERROR(message)
1933    end if
1934    if ((dtset%rf2_dkdk/=0).and.(dtset%useylm==0)) then
1935      write(message, '(a,a,a,a,a)' )&
1936 &     'The calculation of 2nd order k perturbation requires the input variable, ',ch10,&
1937 &     '"useylm" to be 1, while in your input file, useylm=0',ch10,&
1938 &     'Action: change "useylm" value in your input file.'
1939      MSG_ERROR(message)
1940    end if
1941    if ((dtset%rf2_dkde/=0).and.(dtset%useylm==0)) then
1942      write(message, '(a,a,a,a,a)' )&
1943 &     'The calculation of the 2nd order k/Efield perturbation requires the input variable, ',ch10,&
1944 &     '"useylm" to be 1, while in your input file, useylm=0',ch10,&
1945 &     'Action: change "useylm" value in your input file.'
1946      MSG_ERROR(message)
1947    end if
1948  end if
1949  if (usepaw==1) dtset%useylm=1
1950  if (usepaw==1 .and. dtset%usewvl==1) then
1951    dtset%useylm=0
1952  end if
1953  if (dtset%efmas==1.or.dtset%use_gpu_cuda==1.or.dtset%rf2_dkdk/=0.or.dtset%rf2_dkde/=0) dtset%useylm=1
1954 
1955  if(dtset%tfkinfunc==2 .and. dtset%usewvl==0 ) then
1956    dtset%useylm=1
1957    dtset%userec=1
1958  end if
1959 
1960  ionmov=dtset%ionmov ; densfor_pred=dtset%densfor_pred ; iscf=dtset%iscf ; nqpt=dtset%nqpt
1961  kptopt=dtset%kptopt; nberry=dtset%nberry ; berryopt=dtset%berryopt
1962 
1963 !Dielectric real(dp) input variables
1964 !Reading of diemix/diemixmag must be inserted after iprcel
1965  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diecut',tread,'ENE')
1966  if(tread==1) dtset%diecut=dprarr(1)
1967 !Special treatment if iscf==-1
1968  if(iscf==-1) dtset%diecut=four*dtset%ecut
1969  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dielng',tread,'LEN')
1970  if(tread==1) dtset%dielng=dprarr(1)
1971  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diemac',tread,'DPR')
1972  if(tread==1) dtset%diemac=dprarr(1)
1973 
1974  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diemix',tread,'DPR')
1975  if(tread==1) then
1976    dtset%diemix=dprarr(1)
1977  else
1978    if (mod(dtset%iprcel,100)>19) dtset%diemix=one
1979  end if
1980 
1981  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diemixmag',tread,'DPR')
1982  if(tread==1) then
1983    dtset%diemixmag=dprarr(1)
1984  else
1985    if (dtset%iscf<10.or.dtset%nspden==1.or.dtset%iprcel==0.or.(dtset%iprcel>70.and.dtset%iprcel<80)) then
1986      dtset%diemixmag=dtset%diemix
1987    else
1988      dtset%diemixmag=-dtset%diemix
1989    end if
1990  end if
1991 
1992  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diegap',tread,'ENE')
1993  if(tread==1) dtset%diegap=dprarr(1)
1994 
1995  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dielam',tread,'DPR')
1996  if(tread==1) dtset%dielam=dprarr(1)
1997 
1998  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'maxestep',tread,'DPR')
1999  if(tread==1) dtset%maxestep=dprarr(1)
2000 
2001  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_maxene',tread,'DPR')
2002  if(tread==1) dtset%td_maxene=dprarr(1)
2003 
2004  if((iscf==5.or.iscf==6) .and. ionmov==4 .and. densfor_pred/=3 )then
2005    densfor_pred=3
2006    dtset%densfor_pred=densfor_pred
2007    write(message, '(3a)' )&
2008 &   '  When ionmov==4 and iscf==5 or 6, densfor_pred must be 3.',ch10,&
2009 &   '  Set densfor_pred to 3.'
2010    MSG_COMMENT(message)
2011  end if
2012 
2013  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mffmem',tread,'INT')
2014  if(tread==1) dtset%mffmem=intarr(1)
2015 
2016 !Set default values of 0 for occupation numbers and k pt wts
2017  bantot=0
2018 
2019 !nkpt and nband must be defined to execute following loop
2020  if ( tnband == 1 ) then
2021    do ikpt=1,nkpt*nsppol
2022      do ii=1,dtset%nband(ikpt)
2023        bantot=bantot+1
2024        dtset%occ_orig(bantot)=0.0_dp
2025      end do
2026    end do
2027  end if
2028 
2029  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nloc_alg',tread,'INT')
2030  if(tread==1) then
2031    dtset%nloalg(1)=intarr(1)
2032  end if
2033 
2034  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nloc_mem',tread,'INT')
2035  if(tread==1) then
2036    dtset%nloalg(2)=1 ; if(intarr(1)<0)dtset%nloalg(2)=-1
2037    dtset%nloalg(3)=abs(intarr(1))-1
2038  end if
2039 
2040 !LOOP variables
2041  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nline',tread,'INT')
2042  if(tread==1) dtset%nline=intarr(1)
2043 
2044  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nnsclo',tread,'INT')
2045  if(tread==1) dtset%nnsclo=intarr(1)
2046 
2047  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nnsclohf',tread,'INT')
2048  if(tread==1) dtset%nnsclohf=intarr(1)
2049 
2050  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nstep',tread,'INT')
2051  if(tread==1) dtset%nstep=intarr(1)
2052 
2053  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ntime',tread,'INT')
2054  if(tread==1) dtset%ntime=intarr(1)
2055 
2056  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nctime',tread,'INT')
2057  if(tread==1) dtset%nctime=intarr(1)
2058 
2059  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'orbmag',tread,'INT')
2060  if(tread==1) dtset%orbmag=intarr(1)
2061 
2062  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ortalg',tread,'INT')
2063  if(tread==1) then
2064    dtset%ortalg=intarr(1)
2065  else if (dtset%wfoptalg>=10 .and. dtset%ortalg>0) then
2066    dtset%ortalg=-dtset%ortalg
2067  end if
2068 
2069 !Print variables
2070  call intagm(dprarr,intarr,jdtset,marr,natom,string(1:lenstr),'prtatlist',tread,'INT')
2071  if(tread==1) then
2072    dtset%prtatlist=intarr(1:natom)
2073    call sort_int(natom,dtset%prtatlist,intarr)
2074  end if
2075 
2076  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtbbb',tread,'INT')
2077  if(tread==1) dtset%prtbbb=intarr(1)
2078 
2079  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtbltztrp',tread,'INT')
2080  if(tread==1) dtset%prtbltztrp=intarr(1)
2081 
2082  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtcif',tread,'INT')
2083  if(tread==1) dtset%prtcif=intarr(1)
2084 
2085  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtden',tread,'INT')
2086  if(tread==1) dtset%prtden=intarr(1)
2087 
2088  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdipole',tread,'INT')
2089  if(tread==1) dtset%prtdipole=intarr(1)
2090 
2091  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdos',tread,'INT')
2092  if(tread==1) dtset%prtdos=intarr(1)
2093 
2094  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdosm',tread,'INT')
2095  if(tread==1) dtset%prtdosm=intarr(1)
2096 
2097  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtebands',tread,'INT')
2098  if(tread==1) dtset%prtebands=intarr(1)
2099 
2100  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtefg',tread,'INT')
2101  if(tread==1) dtset%prtefg=intarr(1)
2102 
2103  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prteig',tread,'INT')
2104  if(tread==1) dtset%prteig=intarr(1)
2105 
2106  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtelf',tread,'INT')
2107  if(tread==1) dtset%prtelf=intarr(1)
2108 
2109  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtfc',tread,'INT')
2110  if(tread==1) dtset%prtfc=intarr(1)
2111 
2112  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtfsurf',tread,'INT')
2113  if(tread==1) dtset%prtfsurf=intarr(1)
2114 
2115  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgsr',tread,'INT')
2116  if(tread==1) dtset%prtgsr=intarr(1)
2117 
2118  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgden',tread,'INT')
2119  if(tread==1) dtset%prtgden=intarr(1)
2120 
2121  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgeo',tread,'INT')
2122  if(tread==1) dtset%prtgeo=intarr(1)
2123 
2124  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgkk',tread,'INT')
2125  if(tread==1) dtset%prtgkk=intarr(1)
2126 
2127  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtkden',tread,'INT')
2128  if(tread==1) dtset%prtkden=intarr(1)
2129 
2130  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtlden',tread,'INT')
2131  if(tread==1) dtset%prtlden=intarr(1)
2132 
2133  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtnabla',tread,'INT')
2134  if(tread==1) dtset%prtnabla=intarr(1)
2135 
2136  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtnest',tread,'INT')
2137  if(tread==1) dtset%prtnest=intarr(1)
2138 
2139  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtphbands',tread,'INT')
2140  if(tread==1) dtset%prtphbands=intarr(1)
2141 
2142  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtphdos',tread,'INT')
2143  if(tread==1) dtset%prtphdos=intarr(1)
2144 
2145  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtphsurf',tread,'INT')
2146  if(tread==1) dtset%prtphsurf=intarr(1)
2147 
2148  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtposcar',tread,'INT')
2149  if(tread==1) dtset%prtposcar=intarr(1)
2150 
2151  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtpot',tread,'INT')
2152  if(tread==1) dtset%prtpot=intarr(1)
2153 
2154  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtpsps',tread,'INT')
2155  if(tread==1) dtset%prtpsps=intarr(1)
2156 
2157  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtspcur',tread,'INT')
2158  if(tread==1) dtset%prtspcur=intarr(1)
2159 
2160  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtsuscep',tread,'INT')
2161  if(tread==1) dtset%prtsuscep=intarr(1)
2162 
2163  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtstm',tread,'INT')
2164  if(tread==1) dtset%prtstm=intarr(1)
2165 
2166  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prt1dm',tread,'INT')
2167  if(tread==1) dtset%prt1dm=intarr(1)
2168 
2169  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvclmb',tread,'INT')
2170  if(tread==1) dtset%prtvclmb=intarr(1)
2171 
2172  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvdw',tread,'INT')
2173  if(tread==1) dtset%prtvdw=intarr(1)
2174 
2175  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvha',tread,'INT')
2176  if(tread==1) dtset%prtvha=intarr(1)
2177 
2178  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvhxc',tread,'INT')
2179  if(tread==1) dtset%prtvhxc=intarr(1)
2180 
2181  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvol',tread,'INT')
2182  if(tread==1) dtset%prtvol=intarr(1)
2183 
2184  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvolimg',tread,'INT')
2185  if(tread==1) dtset%prtvolimg=intarr(1)
2186 
2187  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvpsp',tread,'INT')
2188  if(tread==1) dtset%prtvpsp=intarr(1)
2189 
2190  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvxc',tread,'INT')
2191  if(tread==1) dtset%prtvxc=intarr(1)
2192 
2193  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtwant',tread,'INT')
2194  if(tread==1) dtset%prtwant=intarr(1)
2195 
2196  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtwf',tread,'INT')
2197  if(tread==1) then
2198    dtset%prtwf=intarr(1)
2199    if ((dtset%tfkinfunc==2).and.(dtset%prtwf==1)) then
2200      write(message, '(a,a,a,a,a)' )&
2201 &     'You are using recursion method (tfkinfunc=2)  while',ch10,&
2202 &     'input variable "prtwf" has the incompatible value 1 !',ch10,&
2203 &     'Action: change  "prtwf=0" value in your input file.'
2204      MSG_ERROR(message)
2205    end if
2206  end if
2207  if (dtset%tfkinfunc==2) dtset%prtwf=0
2208 
2209  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtwf_full',tread,'INT')
2210  if (tread==1) dtset%prtwf_full=intarr(1)
2211 
2212  if (dtset%prtwf_full == 1 .and. dtset%prtwf == 0) then
2213    write(message, '(3a)' )&
2214    'You are using prtwf_full=1 while prtwf=0',ch10,&
2215    'Action: set "prtwf=0" in your input file.'
2216    MSG_ERROR(message)
2217  end if
2218 
2219  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtxml',tread,'INT')
2220  if(tread==1) dtset%prtxml=intarr(1)
2221 
2222  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ratsph_extra',tread,'DPR')
2223  if(tread==1) dtset%ratsph_extra=dprarr(1)
2224 
2225  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'qprtrb',tread,'INT')
2226  if(tread==1) dtset%qprtrb(:)=intarr(1:3)
2227 
2228  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'strprecon',tread,'DPR')
2229  if(tread==1) dtset%strprecon=dprarr(1)
2230 
2231  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tim1rev',tread,'INT')
2232  if (tread==1) dtset%tim1rev=intarr(1)
2233 
2234  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'xc_denpos',tread,'DPR')
2235  if(tread==1) dtset%xc_denpos=dprarr(1)
2236 
2237  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'xc_tb09_c',tread,'DPR')
2238  if(tread==1) dtset%xc_tb09_c=dprarr(1)
2239 
2240  call intagm(dprarr,intarr,jdtset,marr,3*dtset%natsph_extra,string(1:lenstr),'xredsph_extra',tread,'DPR')
2241  if(tread==1) dtset%xredsph_extra=reshape(dprarr(1:3*dtset%natsph_extra), (/3,dtset%natsph_extra/))
2242 
2243  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wfmix',tread,'DPR')
2244  if(tread==1) dtset%wfmix=dprarr(1)
2245 
2246 
2247 !WVL - Wavelets related values
2248 
2249  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_hgrid',tread,'DPR')
2250  if(tread==1) dtset%wvl_hgrid=dprarr(1)
2251 
2252  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_crmult',tread,'DPR')
2253  if(tread==1) dtset%wvl_crmult=dprarr(1)
2254 
2255  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_frmult',tread,'DPR')
2256  if(tread==1) dtset%wvl_frmult=dprarr(1)
2257 
2258  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'wvl_ngauss',tread,'INT')
2259  if(tread==1) dtset%wvl_ngauss(1:2)=intarr(1:2)
2260 
2261  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_nprccg',tread,'INT')
2262  if(tread==1) dtset%wvl_nprccg=intarr(1)
2263 
2264  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tl_nprccg',tread,'INT')
2265  if(tread==1) dtset%tl_nprccg=intarr(1)
2266 
2267  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tl_radius',tread,'DPR')
2268  if(tread==1) dtset%tl_radius=dprarr(1)
2269 
2270 !Wannier90 interface related variables
2271  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'w90iniprj',tread,'INT')
2272  if(tread==1) then
2273    dtset%w90iniprj=intarr(1)
2274    if ( usepaw == 0 .and. ( dtset%w90iniprj /= 2  .and. dtset%w90iniprj/=0 .and. dtset%w90iniprj /= 1 )) then
2275      write(message, '(a,i4,2a)' )&
2276 &     'w90iniprj should be set to 0, 1 or 2, however, it was ',dtset%w90iniprj,ch10,&
2277 &     'Action: check the values of w90iniprj.'
2278      MSG_ERROR(message)
2279    end if
2280    if ( usepaw == 1 .and. ( dtset%w90iniprj < 2 .or. dtset%w90iniprj>6 ) &
2281 &   .and. ( dtset%w90iniprj /= 1 .and. dtset%w90iniprj/=0 )) then
2282      write(message, '(a,i4,2a)' )&
2283 &     'In the PAW case, the only valid values for w90iniprj are 0, 1, 2, 5 and 6 however, it was ',dtset%w90iniprj,ch10,&
2284 &     'Action: check the values of w90iniprj.'
2285      MSG_ERROR(message)
2286    end if
2287  end if
2288 !w90prtunk
2289  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'w90prtunk',tread,'INT')
2290  if(tread==1) then
2291    dtset%w90prtunk=intarr(1)
2292    if ( dtset%w90prtunk < 0 ) then
2293      write(message, '(4a)' )&
2294 &     'w90prtunk should be greater or equal to zero, however, it was ',dtset%w90prtunk,ch10,&
2295 &     'Action: check the values of w90prtunk.'
2296      MSG_ERROR(message)
2297    end if
2298  end if
2299 
2300 !Wannier90 - GW quasiparticle interface
2301  if(dtset%prtwant==3) then
2302    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getqps',tread,'INT')
2303    if(tread==1) dtset%getqps=intarr(1)
2304    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdqps',tread,'INT')
2305    if(tread==1) dtset%irdqps=intarr(1)
2306  end if
2307 
2308 !van der Waals with DFT-D approach
2309  if(dtset%vdw_xc==5.or.dtset%vdw_xc==6.or.dtset%vdw_xc==7) then
2310    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_tol',tread,'DPR')
2311    if(tread==1) dtset%vdw_tol=dprarr(1)
2312    if (dtset%vdw_xc==6.or.dtset%vdw_xc==7) then
2313      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_tol_3bt',tread,'DPR')
2314      if(tread==1) dtset%vdw_tol_3bt=dprarr(1)
2315    end if
2316  end if
2317 
2318 !van der Waals with Wannier functions (Silvestrelli's approach versions 1,2 and 3)
2319  if(dtset%vdw_xc==10.or.dtset%vdw_xc==11.or.dtset%vdw_xc==12.or.dtset%vdw_xc==14) then
2320    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_nfrag',tread,'INT')
2321    if(tread==1)then
2322      dtset%vdw_nfrag=intarr(1)
2323    end if
2324 
2325    call intagm(dprarr,intarr,jdtset,marr,dtset%natom,string(1:lenstr),'vdw_typfrag',tread,'INT')
2326    if(tread==1)then
2327      dtset%vdw_typfrag(1:dtset%natom)=intarr(1:dtset%natom)
2328      do ii=1,dtset%natom
2329        if(dtset%vdw_typfrag(ii)<0)then
2330          write(message, '(a,a,a,i0,a,i0,a,a)' )&
2331 &         'All the components of vdw_typfrag must be greater than 0.',ch10,&
2332 &         'The component',ii,' is equal to ',dtset%vdw_typfrag(ii),ch10,&
2333 &         'Action: check the values of vdw_typfrag.'
2334          MSG_ERROR(message)
2335        end if
2336      end do
2337    end if
2338  end if
2339  if(dtset%vdw_xc==10.or.dtset%vdw_xc==11.or.dtset%vdw_xc==12.or.dtset%vdw_xc==14) then
2340    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'vdw_supercell',tread,'INT')
2341    if(tread==1)then
2342      dtset%vdw_supercell(1:3)=intarr(1:3)
2343      if (dtset%vdw_supercell(1)<zero.and.dtset%vdw_supercell(2)<zero) then
2344        write(message, '(7a)' )&
2345 &       ' only one component of vdw_supercell could be < 0, however, it was ',ch10,&
2346 &       dtset%vdw_supercell(1),dtset%vdw_supercell(2),dtset%vdw_supercell(3),ch10,&
2347 &       'Action: check the components of vdw_supercell.'
2348        MSG_ERROR(message)
2349      end if
2350      if (dtset%vdw_supercell(2)<zero.and.dtset%vdw_supercell(3)<zero) then
2351        write(message, '(7a)' )&
2352 &       'only one component of vdw_supercell could be < 0, however, it was ',ch10,&
2353 &       dtset%vdw_supercell(1),dtset%vdw_supercell(2),dtset%vdw_supercell(3),ch10,&
2354 &       'Action: check the components of vdw_supercell.'
2355        MSG_ERROR(message)
2356      end if
2357      if (dtset%vdw_supercell(1)<zero.and.dtset%vdw_supercell(3)<zero) then
2358        write(message, '(7a)' )&
2359 &       'only one component of vdw_supercell could be < 0, however, it was ',ch10,&
2360 &       dtset%vdw_supercell(1),dtset%vdw_supercell(2),dtset%vdw_supercell(3),ch10,&
2361 &       'Action: check the components of vdw_supercell.'
2362        MSG_ERROR(message)
2363      end if
2364    end if
2365 
2366  end if !vdw_xc==10 or vdw_xc==11 or vdw_xc==12 or vdw_xc==14
2367 
2368  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ucrpa',tread,'INT')
2369  if(tread==1) dtset%ucrpa=intarr(1)
2370 
2371  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'ucrpa_bands',tread_key,'INT')
2372  if(tread_key==1) then
2373    if(dtset%nsym/=1) then
2374      write(message,"(a,i0,3a)")&
2375 &     '  Value of nsym different from 1 when ucrpa_bands is used is under test ',dtset%nsym,&
2376 &     '(because symmetry is not yet used)',ch10,&
2377 &     '  Action : check your calculation  with nsym=1'
2378      MSG_WARNING(message)
2379    end if
2380    dtset%ucrpa_bands(1:2)=intarr(1:2)
2381  end if
2382 
2383  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'ucrpa_window',tread,'ENE')
2384  if(tread==1) then
2385    if(dtset%nsym/=1) then
2386      write(message,*)&
2387 &     '  Value of nsym different from 1 when ucrpa_windows is used is under test ',dtset%nsym,&
2388 &     '  (because symmetry is not yet used)',ch10,&
2389 &     '  Action : check your calculation  with nsym=1'
2390      MSG_WARNING(message)
2391    end if
2392    dtset%ucrpa_window(1:2)=dprarr(1:2)
2393  end if
2394 
2395  if(tread==1.and.tread_key==1) then
2396    write(message, '(a,a,a,a,a)' )&
2397 &   ' ucrpa_bands and ucrpa_window cannot be specified simultaneously',ch10,&
2398 &   ' for the same dataset.',ch10,&
2399 &   ' Action : check the input file.'
2400    MSG_ERROR(message)
2401  end if
2402 
2403 !Tolerance variables
2404  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolimg',tread,'ENE')
2405  if(tread==1) dtset%tolimg=dprarr(1)
2406 
2407 !find which tolerance is used for the ionic relaxations
2408  tolmxde_=dtset%tolmxde
2409  tolmxf_=dtset%tolmxf
2410  itol=0
2411  itol_gen=0
2412 
2413  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolmxde',tread,'ENE',ds_input)
2414  if(tread==1) then
2415    if (ds_input == 0) then
2416      tolmxde_=dprarr(1)
2417      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2418    else
2419      dtset%tolmxde=dprarr(1)
2420      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2421    end if
2422  end if
2423 
2424  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolmxf',tread,'DPR',ds_input)
2425  if(tread==1) then
2426    if (ds_input == 0) then
2427      tolmxf_=dprarr(1)
2428      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2429    else
2430      dtset%tolmxf=dprarr(1)
2431      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2432    end if
2433  else
2434    itol_gen=itol_gen+1
2435  end if
2436 
2437 !check for definitions of tolmxf and tolmxde for the present dataset
2438  if (itol > 1 .or. itol_gen > 1) then
2439    write(message, '(5a)' )&
2440 &   'Only one of the tolmxf/tolmxde variables may be defined at once.',ch10,&
2441 &   'Action: check values of tolmxf, tolmxde. If you want to use ',ch10,&
2442 &   '        tolmxde, you should explicitly put tolmxf to 0.0.'
2443    MSG_ERROR(message)
2444  end if
2445 
2446 !if no value is given for jdtset, use defaults
2447  if (itol == 0 .and. itol_gen == 1) then
2448    dtset%tolmxde=tolmxde_
2449    dtset%tolmxf=tolmxf_
2450  end if
2451 
2452  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'focktoldfe',tread,'DPR')
2453  if(tread==1) dtset%focktoldfe=dprarr(1)
2454 
2455  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolrde',tread,'DPR')
2456  if(tread==1) dtset%tolrde=dprarr(1)
2457 
2458 !find which tolXXX are defined generically and for this jdtset
2459  tolwfr_=zero
2460  toldfe_=zero
2461  toldff_=zero
2462  tolrff_=zero
2463  tolvrs_=zero
2464  itol=0
2465  itol_gen=0
2466  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolwfr',tread,'DPR',ds_input)
2467  if(tread==1) then
2468    if (ds_input == 0) then
2469      tolwfr_=dprarr(1)
2470      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2471    else
2472      dtset%tolwfr=dprarr(1)
2473      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2474    end if
2475  end if
2476 
2477  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'toldff',tread,'DPR',ds_input)
2478  if(tread==1) then
2479    if (ds_input == 0) then
2480      toldff_=dprarr(1)
2481      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2482    else
2483      dtset%toldff=dprarr(1)
2484      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2485    end if
2486    dtset%optforces=1
2487  end if
2488 
2489  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolrff',tread,'DPR',ds_input)
2490  if(tread==1) then
2491    if (ds_input == 0) then
2492      tolrff_=dprarr(1)
2493      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2494    else
2495      dtset%tolrff=dprarr(1)
2496      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2497    end if
2498    dtset%optforces=1
2499  end if
2500 
2501  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'toldfe',tread,'ENE',ds_input)
2502  if(tread==1) then
2503    if (ds_input == 0) then
2504      toldfe_=dprarr(1)
2505      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2506    else
2507      dtset%toldfe=dprarr(1)
2508      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2509    end if
2510  end if
2511 
2512  if((dtset%accuracy>0).and.(itol>0.or.itol_gen>0)) tolvrs_=zero
2513 
2514  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolvrs',tread,'DPR',ds_input)
2515  if(tread==1) then
2516    if (ds_input == 0) then
2517      tolvrs_=dprarr(1)
2518      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2519    else
2520      dtset%tolvrs=dprarr(1)
2521      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2522    end if
2523  end if
2524 
2525 !check for multiple definitions of tolXXX for the present dataset
2526  if (itol > 1 .or. itol_gen > 1) then
2527    write(message, '(3a)' )&
2528 &   'Only one of the tolXXX variables may be defined at once.',ch10,&
2529 &   'Action: check values of tolvrs, toldfe, tolrff, tolwfr, and toldff.'
2530    MSG_ERROR(message)
2531  end if
2532 
2533 !if no value is given for jdtset, use defaults
2534  if (itol == 0 .and. itol_gen == 1) then
2535    dtset%tolwfr=tolwfr_
2536    dtset%toldfe=toldfe_
2537    dtset%toldff=toldff_
2538    dtset%tolrff=tolrff_
2539    dtset%tolvrs=tolvrs_
2540  end if
2541 
2542 !Tolerance variable for TFW initialization step
2543  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tfw_toldfe',tread,'ENE',ds_input)
2544  if(tread==1) then
2545    dtset%tfw_toldfe=dprarr(1)
2546  else if (dtset%tfkinfunc>10.and.dtset%toldfe>tiny(0._dp)) then
2547    dtset%tfw_toldfe=dtset%toldfe
2548  end if
2549 
2550 !Tolerance variables for electrons-positron tc-dft
2551  toldfe_=zero;toldff_=zero
2552  itol=0;itol_gen=0
2553  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'postoldff',tread,'DPR',ds_input)
2554  if(tread==1) then
2555    if (ds_input == 0) then
2556      toldff_=dprarr(1)
2557      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2558    else
2559      dtset%postoldff=dprarr(1)
2560      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2561    end if
2562    dtset%postoldfe=zero
2563  end if
2564 
2565  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'postoldfe',tread,'ENE',ds_input)
2566  if(tread==1) then
2567    if (ds_input == 0) then
2568      toldfe_=dprarr(1)
2569      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
2570    else
2571      dtset%postoldfe=dprarr(1)
2572      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
2573    end if
2574  end if
2575  if (itol > 1.or.itol_gen >1) then
2576    write(message, '(3a)' )&
2577 &   'Only one of the postolXXX variables may be defined at once.',ch10,&
2578 &   'Action: check values of postoldfe and postoldff.'
2579    MSG_ERROR(message)
2580  end if
2581  if (itol==0.and.itol_gen==1) then
2582    dtset%postoldfe=toldfe_
2583    dtset%postoldff=toldff_
2584  end if
2585 
2586  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'usekden',tread,'INT')
2587  if(tread==1) dtset%usekden=intarr(1)
2588 
2589  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'vprtrb',tread,'ENE')
2590  if(tread==1) dtset%vprtrb(:)=dprarr(1:2)
2591 
2592 !TODO : should this test be just on natsph without caring about the others? natsph might be used for other purposes
2593  if((dtset%pawfatbnd>0.or.dtset%prtdos==3) .and. dtset%natsph>0)then
2594    call intagm(dprarr,intarr,jdtset,marr,dtset%natsph,string(1:lenstr),'iatsph',tread,'INT')
2595    if(tread==1) dtset%iatsph(1:dtset%natsph)=intarr(1:dtset%natsph)
2596  end if
2597 
2598  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdensph',tread,'INT')
2599  if(tread==1) then
2600    dtset%prtdensph=intarr(1)
2601  else if (dtset%nsppol==1.and.dtset%nspden==2) then
2602    dtset%prtdensph=1
2603  end if
2604 
2605 !Initialize atvshift
2606  if(dtset%natvshift>0)then
2607    call intagm(dprarr,intarr,jdtset,marr,dtset%natvshift*nsppol*dtset%natom,string(1:lenstr),'atvshift',tread,'ENE')
2608    if(tread==1) dtset%atvshift(1:dtset%natvshift,1:nsppol,1:dtset%natom)=&
2609 &   reshape(dprarr(1:dtset%natvshift*nsppol*dtset%natom),(/dtset%natvshift,nsppol,dtset%natom/))
2610  end if
2611 
2612 !Initialize wtatcon
2613  if(dtset%nconeq>0)then
2614 
2615 !  Read and check natcon
2616    ABI_ALLOCATE(natcon,(dtset%nconeq))
2617    call intagm(dprarr,intarr,jdtset,marr,dtset%nconeq,string(1:lenstr),'natcon',tread,'INT')
2618    if(tread==1)then
2619      natcon(:)=intarr(1:dtset%nconeq)
2620    else
2621      write(message, '(3a)' )&
2622 &     'When nconeq is positive, natcon MUST be defined.',ch10,&
2623 &     'Action: check the values of nconeq and natcon.'
2624      MSG_ERROR(message)
2625    end if
2626    do ii=1,dtset%nconeq
2627      if(natcon(ii)<0)then
2628        write(message, '(a,a,a,i4,a,i4,a,a)' )&
2629 &       'All the components of natcon must be greater than 0.',ch10,&
2630 &       'The component',ii,' is equal to ',natcon(ii),ch10,&
2631 &       'Action: check the values of natcon.'
2632        MSG_ERROR(message)
2633      end if
2634    end do
2635    niatcon=sum(natcon(:))
2636 
2637 !  Read and check iatcon
2638    ABI_ALLOCATE(iatcon,(niatcon))
2639    call intagm(dprarr,intarr,jdtset,marr,niatcon,string(1:lenstr),'iatcon',tread,'INT')
2640    if(tread==1)then
2641      iatcon(:)=intarr(1:niatcon)
2642    else
2643      write(message, '(3a)' )&
2644 &     'When nconeq is positive, natcon MUST be defined.',ch10,&
2645 &     'Action: check the values of nconeq and natcon.'
2646      MSG_ERROR(message)
2647    end if
2648    do ii=1,niatcon
2649      if(iatcon(ii)<0)then
2650        write(message, '(a,a,a,i4,a,i4,a,a)' )&
2651 &       'All the components of iatcon must be greater than 0.',ch10,&
2652 &       'The component',ii,' is equal to ',iatcon(ii),ch10,&
2653 &       'Action: check the values of iatcon.'
2654        MSG_ERROR(message)
2655      end if
2656    end do
2657 
2658 !  Read wtatcon, and unfold it.
2659    call intagm(dprarr,intarr,jdtset,marr,3*niatcon,string(1:lenstr),'wtatcon',tread,'DPR')
2660    if(tread/=1)then
2661      write(message, '(3a)' )&
2662 &     'When nconeq is positive, wtatcon MUST be defined.',ch10,&
2663 &     'Action: check the values of nconeq and wtatcon.'
2664      MSG_ERROR(message)
2665    end if
2666    iat=0
2667    do ii=1,dtset%nconeq
2668      do jj=1,natcon(ii)
2669        dtset%wtatcon(1:3,iatcon(jj+iat),ii)=dprarr(1+3*(jj+iat-1):3+3*(jj+iat-1))
2670      end do
2671      iat=iat+natcon(ii)
2672    end do
2673 
2674    ABI_DEALLOCATE(iatcon)
2675    ABI_DEALLOCATE(natcon)
2676  end if
2677 
2678 !Initialize chempot
2679  if(dtset%nzchempot>0)then
2680    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nzchempot*ntypat,string(1:lenstr),'chempot',tread,'DPR')
2681    if(tread==1) dtset%chempot(1:3,1:dtset%nzchempot,1:ntypat)=&
2682 &   reshape(dprarr(1:3*dtset%nzchempot*ntypat),(/3,dtset%nzchempot,ntypat/))
2683  end if
2684 
2685 !Initialize the list of k points, as well as wtk and istwfk
2686  intimage=1 ; if(nimage>2)intimage=(1+nimage)/2
2687  call invacuum(jdtset,lenstr,natom,dtset%rprimd_orig(1:3,1:3,intimage),string,vacuum,dtset%xred_orig(1:3,1:natom,intimage))
2688 
2689 !reset rfdir to 1 1 1 in case it was left at the default of 0 0 0 for berryopt -1
2690  if( (dtset%berryopt == -1) .AND. &
2691 & (dtset%rfdir(1) == 0) .AND. &
2692 & (dtset%rfdir(2) == 0) .AND. &
2693 & (dtset%rfdir(3) == 0) ) dtset%rfdir(1:3) = 1
2694 
2695 !In case of a Berryphase calculation put response = 1
2696 !in order to set istwfk = 1 at all k-points
2697  if ( dtset%berryopt/=0 ) then
2698    response = 1
2699  end if
2700 
2701  nsym=dtset%nsym
2702  ii=0;if (mod(dtset%wfoptalg,10)==4) ii=2
2703  if(dtset%ngfft(7)==314)ii=1
2704  if(dtset%usefock==1.and.dtset%optdriver/=RUNL_SIGMA.and.mod(dtset%wfoptalg,10)/=5) ii=1
2705 
2706  call inkpts(bravais,dtset%chksymbreak,dtset%fockdownsampling,iout,iscf,dtset%istwfk(1:nkpt),jdtset,&
2707 & dtset%kpt(:,1:nkpt),dtset%kptns_hf(:,1:nkpthf),kptopt,dtset%kptnrm,&
2708 & dtset%kptrlatt_orig,dtset%kptrlatt,kptrlen,lenstr,nsym,&
2709 & nkpt,nkpthf,nqpt,dtset%ngkpt,dtset%nshiftk,dtset%nshiftk_orig,dtset%shiftk_orig,nsym,&
2710 & occopt,dtset%qptn,response,dtset%rprimd_orig(1:3,1:3,intimage),dtset%shiftk,string,&
2711 & dtset%symafm(1:nsym),dtset%symrel(:,:,1:nsym),vacuum,dtset%wtk(1:nkpt),&
2712 & impose_istwf_1=ii)
2713 
2714  dtset%kptrlen=kptrlen
2715 
2716  dtset%kptns(:,1:nkpt)=dtset%kpt(:,1:nkpt)/dtset%kptnrm
2717  if(nqpt>=1 .and. dtset%optdriver/=RUNL_RESPFN)then
2718    dtset%kptns(1,1:nkpt)=dtset%kptns(1,1:nkpt)+dtset%qptn(1)
2719    dtset%kptns(2,1:nkpt)=dtset%kptns(2,1:nkpt)+dtset%qptn(2)
2720    dtset%kptns(3,1:nkpt)=dtset%kptns(3,1:nkpt)+dtset%qptn(3)
2721  end if
2722 
2723  if(nkpthf/=0)then
2724    dtset%kptns_hf(:,1:nkpthf)=dtset%kptns_hf(:,1:nkpthf)/dtset%kptnrm
2725  end if
2726 
2727  ! Read variables defining the k-path
2728  ! If kptopt < 0  --> Band structure and kptbounds size is given by abs(kptopt)
2729  ! If kptopt >= 0 --> We may have a k-path specified by nkpath and kptbounds (used by post-processing tools)
2730  ! TODO: ndivk?
2731 
2732  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ndivsm',tread,'INT')
2733  if (tread == 1) dtset%ndivsm = intarr(1)
2734 
2735  if (dtset%kptopt < 0) then
2736    dtset%nkpath = abs(dtset%kptopt)
2737  else
2738    dtset%nkpath = 0
2739    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nkpath',tread,'INT')
2740    if (tread==1) dtset%nkpath = intarr(1)
2741  end if
2742 
2743  if (dtset%nkpath /= 0) then
2744    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nkpath,string(1:lenstr),'kptbounds',tread,'DPR')
2745 
2746    if (tread == 1) then
2747      ABI_MALLOC(dtset%kptbounds, (3, dtset%nkpath))
2748      dtset%kptbounds = reshape(dprarr(1:3*dtset%nkpath), [3, dtset%nkpath])
2749    else
2750      MSG_ERROR("When nkpath /= 0 or kptopt < 0, kptbounds must be defined in the input file.")
2751    end if
2752  else
2753    ABI_MALLOC(dtset%kptbounds, (0,0))
2754  end if
2755 
2756 ! This part has been commented out as get_kpt_fullbz is not able to handle kptrlatt with shifts e.g.
2757 ! kptrlatt
2758 !   0 6 0
2759 !   0 0 6
2760 !   3 3 3
2761 !nshiftk 1
2762 !shiftk 0.0 1.0 0.5
2763 ! A test (v8/t03.in) has been added to make sure the job does not stop at the level of the parser.
2764 
2765 #if 0
2766 !Echo the information about the k point grid
2767  call matr3inv(dtset%rprimd_orig(1:3,1:3,intimage),gprimd)
2768  write(std_out,'(3a)')' ',ch10,' invars2 : Printing the k point grid (values of kptns - max 100 of them)'
2769  write(std_out,'(a,2i8)')' nkpt=',nkpt
2770  write(std_out,'(a)')&
2771 & '     ikpt istwfk    wtk       --------- reduced coordinates ---------  --------- cartesian coordinates ---------'
2772  do ikpt=1,min(nkpt,100)
2773    kpt_cart(:)=dtset%kptns(1,ikpt)*gprimd(:,1)+&
2774 &   dtset%kptns(2,ikpt)*gprimd(:,2)+&
2775 &   dtset%kptns(3,ikpt)*gprimd(:,3)
2776    write(std_out,'(i8,i6,7es14.6)')ikpt,dtset%istwfk(ikpt),dtset%wtk(ikpt),dtset%kptns(:,ikpt),kpt_cart(:)
2777  end do
2778 
2779  if(sum(abs(dtset%kptrlatt(:,1)))/=0 .and. sum(abs(dtset%kptrlatt(:,2)))/=0 .and. sum(abs(dtset%kptrlatt(:,3)))/=0)then
2780    write(std_out,'(5a)')' ',ch10,&
2781 &   ' invars2 : Printing the k point grid from kptrlatt, shifted with shiftk and qptn, in the full Brillouin zone.',ch10,&
2782 &   '   Maximum 100 of them. No use of symmetries'
2783    rlatt(:,:)=dtset%kptrlatt(:,:)
2784    nkpt_fullbz=(rlatt(1,1)*(rlatt(2,2)*rlatt(3,3)-rlatt(2,3)*rlatt(3,2)) &
2785 &   +rlatt(1,2)*(rlatt(2,3)*rlatt(3,1)-rlatt(2,1)*rlatt(3,3)) &
2786 &   +rlatt(1,3)*(rlatt(3,2)*rlatt(2,1)-rlatt(3,1)*rlatt(2,2)))*dtset%nshiftk
2787    ABI_ALLOCATE(kpt_fullbz,(3,nkpt_fullbz))
2788    call get_kpt_fullbz(kpt_fullbz,dtset%kptrlatt,nkpt_fullbz,dtset%nshiftk,dtset%shiftk)
2789    write(std_out,'(a,2i8)')' nkpt_fullbz=',nkpt_fullbz
2790    write(std_out,'(a)')&
2791 &   '     ikpt      --------------- reduced coordinates ---------------  --------- cartesian coordinates ---------'
2792    do ikpt=1,min(nkpt_fullbz,100)
2793      kpt_fullbz(:,ikpt)=kpt_fullbz(:,ikpt)+dtset%qptn(:)
2794      kpt_cart(:)=kpt_fullbz(1,ikpt)*gprimd(:,1)+&
2795 &     kpt_fullbz(2,ikpt)*gprimd(:,2)+&
2796 &     kpt_fullbz(3,ikpt)*gprimd(:,3)
2797      write(std_out,'(i8,a,3es18.10,3es14.6)')ikpt,'     ',kpt_fullbz(:,ikpt),kpt_cart(:)
2798    end do
2799    ABI_DEALLOCATE(kpt_fullbz)
2800  end if
2801 #endif
2802 
2803 !if prtkpt==-2, write the k-points in netcdf format and exit here so that AbiPy can read the data.
2804  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtkpt',tread,'INT')
2805  if (tread == 1 .and. intarr(1) == -2) then
2806 #ifdef HAVE_NETCDF
2807    ncerr= nctk_write_ibz("kpts.nc", dtset%kptns(:,1:nkpt), dtset%wtk(1:nkpt))
2808    NCF_CHECK(ncerr)
2809 #endif
2810    MSG_ERROR_NODUMP("kpts.nc file written. Aborting now")
2811  end if
2812 
2813  if(dtset%nkptgw>0) then
2814    ! Read bdgw.
2815    call intagm(dprarr,intarr,jdtset,marr,2*dtset%nkptgw*dtset%nsppol,string(1:lenstr),'bdgw',tread,'INT')
2816    if(tread==1) then
2817      dtset%bdgw(1:2,1:dtset%nkptgw,1:dtset%nsppol) =  &
2818 &     reshape(intarr(1:2*dtset%nkptgw*dtset%nsppol),[2,dtset%nkptgw,dtset%nsppol])
2819    end if
2820 
2821    ! Test bdgw values.
2822    if (dtset%optdriver == RUNL_SIGMA) then
2823      if (any(dtset%bdgw(1:2,1:dtset%nkptgw,1:dtset%nsppol) <= 0)) then
2824        MSG_ERROR("bdgw entries cannot be <= 0. Check input file")
2825      end if
2826      if (any(dtset%bdgw(1,1:dtset%nkptgw,1:dtset%nsppol) > dtset%bdgw(2,1:dtset%nkptgw,1:dtset%nsppol))) then
2827        MSG_ERROR("First band index in bdgw cannot be greater than the second index")
2828      end if
2829    end if
2830 
2831    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nkptgw,string(1:lenstr),'kptgw',tread,'DPR')
2832    if(tread==1) dtset%kptgw(1:3,1:dtset%nkptgw) = reshape(dprarr(1:3*dtset%nkptgw),(/3,dtset%nkptgw/))
2833  end if
2834 
2835  if(dtset%nqptdm>0) then
2836    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nqptdm,string(1:lenstr),'qptdm',tread,'DPR')
2837    if(tread==1) dtset%qptdm(1:3,1:dtset%nqptdm)=reshape(dprarr(1:3*dtset%nqptdm),(/3,dtset%nqptdm/))
2838  end if
2839 
2840  if(dtset%npvel>0) then
2841    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'pvelmax',tread,'DPR')
2842    if(tread==1) dtset%pvelmax(1:3)=dprarr(1:3)
2843  end if
2844 
2845 !Only read occ if (iscf >0 or iscf=-1 or iscf=-3) and (occopt==0 or occopt==2)
2846  if  (iscf>=0.or.iscf==-1.or.iscf==-3)  then
2847    if (occopt==2 .and. getocc==0) then
2848 !    Read occ(nband(kpt)*nkpt*nsppol) explicitly
2849      call wrtout(std_out,' invars2: reading occ(nband*nkpt*nsppol) explicitly','COLL')
2850      call intagm(dprarr,intarr,jdtset,marr,bantot,string(1:lenstr),'occ',tread,'DPR')
2851      if(tread==1) dtset%occ_orig(1:bantot)=dprarr(1:bantot)
2852    else if(occopt==0) then
2853 !    Read usual occupancy--same for all k points and spins
2854      call intagm(dprarr,intarr,jdtset,marr,dtset%nband(1),string(1:lenstr),'occ',tread,'DPR')
2855      if(tread==1) dtset%occ_orig(1:dtset%nband(1))=dprarr(1:dtset%nband(1))
2856 !    Fill in full occ array using input values for each k and spin
2857 !    (make a separate copy for each k point and spin)
2858      do ikpt=1,nkpt*nsppol
2859        dtset%occ_orig(1+(ikpt-1)*dtset%nband(1):ikpt*dtset%nband(1))=&
2860 &       dtset%occ_orig(1:dtset%nband(1))
2861      end do
2862    end if
2863  end if
2864 
2865  if(dtset%jellslab/=0)then
2866    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'slabwsrad',tread,'LEN')
2867    if(tread==1) dtset%slabwsrad=dprarr(1)
2868 
2869 !  Update number of electrons taking into account jellium
2870 !  Suppose that the cell has z axis perpendicular to x and y axes.
2871 !  This will be checked later
2872    areaxy=abs(dtset%rprimd_orig(1,1,1)*dtset%rprimd_orig(2,2,1)-dtset%rprimd_orig(1,2,1)*dtset%rprimd_orig(2,1,1))
2873    rhoavg=three/(four_pi*dtset%slabwsrad**3)
2874    nelectjell=areaxy*(dtset%slabzend-dtset%slabzbeg)*rhoavg
2875    charge=charge-nelectjell
2876  end if
2877 
2878 !Initialize occ if occopt==1 or 3 ... 8,
2879 !while if getocc/=0, make a fake initialization
2880 !If iscf>0, check the charge of the system, and compute nelect.
2881  occopt_tmp=occopt
2882  if(getocc/=0)occopt_tmp=1
2883  call dtset_chkneu(charge,dtset,occopt_tmp)
2884 
2885 !Now that the occupation numbers have been initialized, can meaningfully define nbandhf.
2886  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbandhf',tread,'INT')
2887  if(tread==1) then
2888    dtset%nbandhf=intarr(1)
2889  else
2890 !  If the occupation numbers might change, must keep the maximum number of bands
2891    if(occopt>=3 .and. occopt<=8)then
2892      dtset%nbandhf=maxval(dtset%nband(1:nkpt*nsppol))
2893    else if(occopt==0 .or. occopt==1 .or. occopt==2) then ! Eliminate all the bands that are never occupied
2894      nband1=0 ; bantot=0
2895      do isppol=1,dtset%nsppol
2896        do ikpt=1,dtset%nkpt
2897          do iband=1,dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
2898            bantot=bantot+1
2899            if(abs(dtset%occ_orig(bantot))>tol8)then
2900              if(iband>nband1)nband1=iband
2901            end if
2902          end do
2903        end do
2904      end do
2905      dtset%nbandhf=nband1
2906    else
2907      write(message, '(a,i0,3a)' )&
2908 &     'occopt=',occopt,' not allowed.',ch10,&
2909 &     'Action: correct your input file.'
2910      MSG_ERROR(message)
2911    end if
2912  end if
2913 
2914 !Initialize Berry phase vectors
2915 !Should check that nberry is smaller than 20
2916  if(berryopt>0 .and. nberry>0)then
2917    call intagm(dprarr,intarr,jdtset,marr,3*nberry,string(1:lenstr),'kberry',tread,'INT')
2918    if(tread==1) dtset%kberry(1:3,1:nberry)=reshape(intarr(1:3*nberry), (/3,nberry/))
2919  end if
2920 
2921  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ddamp',tread,'DPR')
2922  if (tread==1) dtset%ddamp = dprarr(1)
2923 
2924  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'polcen',tread,'DPR')
2925  if (tread==1) dtset%polcen(1:3) = dprarr(1:3)
2926 
2927  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'densty',tread,'DPR')
2928  if(tread==1) dtset%densty(1:ntypat,1)=dprarr(1:ntypat)
2929 
2930  call intagm(dprarr,intarr,jdtset,marr,npsp,string(1:lenstr),'so_psp',tread,'INT')
2931  if(tread==1)then
2932    dtset%so_psp(1:npsp)=intarr(1:npsp)
2933  end if
2934 
2935 !LOTF variables
2936 #if defined HAVE_LOTF
2937  if(dtset%ionmov==23) then
2938    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_classic',tread,'INT')
2939    if(tread==1) dtset%lotf_classic=intarr(1)
2940 
2941    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_nitex',tread,'INT')
2942    if(tread==1) dtset%lotf_nitex=intarr(1)
2943 
2944    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_nneigx',tread,'INT')
2945    if(tread==1) dtset%lotf_nneigx=intarr(1)
2946 
2947    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_version',tread,'INT')
2948    if(tread==1) dtset%lotf_version=intarr(1)
2949  end if
2950 #endif
2951 
2952 !Read input variables related to Projected Local Orbitals Wannier functions (plowan)
2953  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_bandi',tread,'INT')
2954  if(tread==1) dtset%plowan_bandi=intarr(1)
2955  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_bandf',tread,'INT')
2956  if(tread==1) dtset%plowan_bandf=intarr(1)
2957  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_realspace',tread,'INT')
2958  if(tread==1) dtset%plowan_realspace=intarr(1)
2959  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_natom',tread,'INT')
2960  if(tread==1) dtset%plowan_natom=intarr(1)
2961  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_nt',tread,'INT')
2962  if(tread==1) dtset%plowan_nt=intarr(1)
2963 
2964  if (dtset%plowan_compute>0) then
2965    call intagm(dprarr,intarr,jdtset,marr,3*dtset%plowan_nt,string(1:lenstr),'plowan_it',tread,'INT')
2966    if(tread==1) dtset%plowan_it(1:3*dtset%plowan_nt)=intarr(1:3*dtset%plowan_nt)
2967 
2968    call intagm(dprarr,intarr,jdtset,marr,dtset%plowan_natom,string(1:lenstr),'plowan_iatom',tread,'INT')
2969    if(tread==1) dtset%plowan_iatom(1:dtset%plowan_natom)=intarr(1:dtset%plowan_natom)
2970 
2971    call intagm(dprarr,intarr,jdtset,marr,dtset%plowan_natom,string(1:lenstr),'plowan_nbl',tread,'INT')
2972    if(tread==1) dtset%plowan_nbl(1:dtset%plowan_natom)=intarr(1:dtset%plowan_natom)
2973    sumnbl=sum(dtset%plowan_nbl(:))
2974 
2975    call intagm(dprarr,intarr,jdtset,marr,sumnbl,string(1:lenstr),'plowan_lcalc',tread,'INT')
2976    if(tread==1) dtset%plowan_lcalc(1:sumnbl)=intarr(1:sumnbl)
2977 
2978    call intagm(dprarr,intarr,jdtset,marr,sumnbl,string(1:lenstr),'plowan_projcalc',tread,'INT')
2979    if(tread==1) dtset%plowan_projcalc(1:sumnbl)=intarr(1:sumnbl)
2980  end if
2981 
2982  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),"wfk_task",tread,'KEY',key_value=key_value)
2983  if (tread==1) then
2984    dtset%wfk_task = str2wfktask(tolower(rmquotes(key_value)))
2985  end if
2986  if (dtset%optdriver == RUNL_WFK .and. dtset%wfk_task == WFK_TASK_NONE) then
2987    MSG_ERROR(sjoin("wfk_task must be specified when optdriver=",itoa(dtset%optdriver)))
2988  end if
2989 
2990 !Read remaining input variables depending on images
2991 !MT oct 15: these lines are inspired from invars1 but are not really understood
2992  intimage=2 ; if(dtset%nimage==1)intimage=1
2993  do ii=1,dtset%nimage+1
2994    iimage=ii
2995    if(dtset%nimage==1 .and. ii==2)exit
2996    if(dtset%nimage==2 .and. ii==3)exit
2997    if(dtset%nimage> 2 .and. ii==intimage)cycle ! Will do the intermediate reference image at the last reading
2998    if(dtset%nimage>=2 .and. ii==dtset%nimage+1)iimage=intimage
2999 
3000    if (dtset%usepawu>0.or.dtset%usedmft>0) then
3001 
3002      dprarr(1:ntypat)=dtset%upawu(1:ntypat,iimage)
3003      call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'upawu',tread,'ENE')
3004      if(tread==1) dtset%upawu(1:ntypat,iimage)=dprarr(1:ntypat)
3005      call ingeo_img(dprarr(1:ntypat),iimage,jdtset,lenstr,dtset%nimage,ntypat,string,'upawu',tread_alt,'ENE')
3006      if(tread_alt==1) dtset%upawu(1:ntypat,iimage)=dprarr(1:ntypat)
3007 
3008      dprarr(1:ntypat)=dtset%jpawu(1:ntypat,iimage)
3009      call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'jpawu',tread,'ENE')
3010      if(tread==1) dtset%jpawu(1:ntypat,iimage)=dprarr(1:ntypat)
3011      call ingeo_img(dprarr(1:ntypat),iimage,jdtset,lenstr,dtset%nimage,ntypat,string,'jpawu',tread_alt,'ENE')
3012      if(tread_alt==1) dtset%jpawu(1:ntypat,iimage)=dprarr(1:ntypat)
3013 
3014      if (dtset%usedmatpu/=0.and.dmatsize>0) then
3015        nsp=nsppol*nspinor
3016        call intagm(dprarr,intarr,jdtset,marr,dmatsize,string(1:lenstr),'dmatpawu',tread,'DPR')
3017        if(tread==1) then
3018          iat=1;jj=1
3019          do iatom=1,natom
3020            lpawu=dtset%lpawu(dtset%typat(iatom))
3021            if (lpawu/=-1) then
3022              isiz=nsp*(2*lpawu+1)**2
3023              dtset%dmatpawu(1:2*lpawu+1,1:2*lpawu+1,1:nsp,iat,iimage)= &
3024 &             reshape(dprarr(jj:jj+isiz),(/2*lpawu+1,2*lpawu+1,nsp/))
3025              iat=iat+1;jj=jj+isiz
3026            end if
3027          end do
3028        end if
3029 
3030        ABI_ALLOCATE(dmatpawu_tmp,(dmatsize))
3031        iat=1;jj=1
3032        do iatom=1,natom
3033          lpawu=dtset%lpawu(dtset%typat(iatom))
3034          if (lpawu/=-1) then
3035            isiz=nsp*(2*lpawu+1)**2
3036            dmatpawu_tmp(jj:jj+isiz-1)= &
3037 &           reshape(dtset%dmatpawu(1:2*lpawu+1,1:2*lpawu+1,1:nsp,iat,iimage),(/isiz/))
3038            iat=iat+1;jj=jj+isiz
3039          end if
3040        end do
3041        call ingeo_img(dmatpawu_tmp,iimage,jdtset,lenstr,dtset%nimage,dmatsize, &
3042 &       string,'dmatpawu',tread_alt,'DPR')
3043        if(tread_alt==1) then
3044          iat=1;jj=1
3045          do iatom=1,natom
3046            lpawu=dtset%lpawu(dtset%typat(iatom))
3047            if (lpawu/=-1) then
3048              isiz=nsp*(2*lpawu+1)**2
3049              dtset%dmatpawu(1:2*lpawu+1,1:2*lpawu+1,1:nsp,iat,iimage)= &
3050 &             reshape(dmatpawu_tmp(jj:jj+isiz-1),(/2*lpawu+1,2*lpawu+1,nsp/))
3051              iat=iat+1;jj=jj+isiz
3052            end if
3053          end do
3054        end if
3055        ABI_DEALLOCATE(dmatpawu_tmp)
3056 
3057        if (tread/=1.and.tread_alt/=1) then
3058          write(message, '(3a)' )&
3059 &         'When LDA/GGA+U is activated and usedmatpu/=0, dmatpawu MUST be defined.',ch10,&
3060 &         'Action: add dmatpawu keyword in input file.'
3061          MSG_ERROR(message)
3062        end if
3063      end if
3064 
3065    end if
3066 
3067  end do
3068 
3069  ABI_DEALLOCATE(intarr)
3070  ABI_DEALLOCATE(dprarr)
3071 
3072  call timab(191,2,tsec)
3073 
3074 end subroutine invars2