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.

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)
 ucvol: Unit cell volume
 comm=MPI communicator

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.

SOURCE

 220 subroutine invars2(bravais,dtset,iout,jdtset,lenstr,mband,msym,npsp,string,usepaw,zionpsp,ucvol,comm)
 221 
 222 !Arguments ------------------------------------
 223 !scalars
 224  integer,intent(in) :: iout,jdtset,lenstr,mband,msym,npsp,usepaw, comm
 225  character(len=*),intent(in) :: string
 226  type(dataset_type),intent(inout) :: dtset
 227  real(dp),intent(in) :: ucvol
 228 !arrays
 229  integer,intent(in) :: bravais(11)
 230  real(dp),intent(in) :: zionpsp(npsp)
 231 
 232 !Local variables-------------------------------
 233 !scalars
 234  integer,parameter :: master = 0
 235  integer :: bantot,berryopt,dmatsize,ndim,getocc,narr,nprocs
 236  integer :: iat,iatom,iband,ii,iimage,ikpt,intimage,ionmov,isppol,ixc_here
 237  integer :: densfor_pred,ipsp,iscf,isiz,itypat,jj,kptopt,lpawu,marr,natom,natomcor,nband1,nberry
 238  integer :: niatcon,nimage,nkpt,nkpthf,npspalch,nqpt,nsp,nspinor,nsppol,nsym,ntypalch,ntypat,ntyppure
 239  integer :: occopt,occopt_tmp,response,sumnbl,tfband,tnband,tread,tread_alt,tread_dft,tread_fock,tread_key,tread_extrael
 240  integer :: tread_brange, tread_erange, tread_kfilter
 241  integer :: itol, itol_gen, ds_input, ifreq, ncerr, ierr, image, tread_dipdip, my_rank
 242  integer :: itol_wfr, itol_gen_wfr
 243  logical :: xc_is_mgga,xc_is_tb09,xc_need_kden,xc_has_kxc
 244  real(dp) :: areaxy,cellcharge_min,fband,kptrlen,nelectjell,sum_spinat
 245  real(dp) :: rhoavg,zelect,zval
 246  real(dp) :: toldfe_, tolrff_, toldff_, tolwfr_, tolvrs_
 247  real(dp) :: tolmxde_, tolmxf_
 248  character(len=500) :: msg
 249  character(len=fnlen) :: key_value
 250  type(crystal_t) :: cryst
 251  type(kmesh_t) :: kmesh, qmesh
 252 !arrays
 253  integer :: vacuum(3)
 254  integer,allocatable :: iatcon(:),natcon(:), intarr(:)
 255  real(dp) :: tsec(2)
 256  real(dp),allocatable :: dmatpawu_tmp(:), dprarr(:)
 257  type(libxc_functional_type) :: xcfunc(2)
 258 
 259 ! *************************************************************************
 260 
 261  call timab(191,1,tsec)
 262 
 263  nprocs = xmpi_comm_size(comm); my_rank = xmpi_comm_rank(comm)
 264 
 265  ! Compute the maximum size of arrays intarr and dprarr
 266  natom=dtset%natom
 267  nimage=dtset%nimage
 268  nkpt=dtset%nkpt
 269  nkpthf=dtset%nkpthf
 270  npspalch=dtset%npspalch
 271  nspinor=dtset%nspinor
 272  nsppol=dtset%nsppol
 273  ntypat=dtset%ntypat
 274  ntypalch=dtset%ntypalch
 275  ntyppure=dtset%ntyppure
 276 
 277  dmatsize=0 ! dmatpu not available for usepawu<0
 278  if (dtset%usepawu>0.and.dtset%usedmatpu/=0) then
 279    do iatom=1,natom
 280      lpawu=dtset%lpawu(dtset%typat(iatom))
 281      if (lpawu/=-1) dmatsize=dmatsize+nsppol*nspinor*(2*lpawu+1)**2
 282    end do
 283  end if
 284 
 285  marr=max(3*natom,&
 286    nkpt*nsppol*mband,&
 287    2*dtset%nkptgw*nsppol,&
 288    dmatsize,&
 289    3*nkpt,&
 290    npsp,&
 291    ntypat,&
 292    9*msym,&
 293    60,100,&
 294    3*dtset%nconeq*natom,&
 295    nimage,&
 296    3*dtset%nqptdm,&
 297    3*dtset%natsph_extra,&
 298    dtset%natvshift*nsppol*natom,&
 299    3*dtset%nzchempot*ntypat)
 300 
 301  ABI_MALLOC(intarr,(marr))
 302  ABI_MALLOC(dprarr,(marr))
 303 
 304  !----------------------------------------------------------------------------
 305 
 306  !****   Read parameters which set remaining array dimensions ****
 307 
 308  !Note: some parameters have already been read in invars0 and invars1
 309  !Also, some checking is needed here.
 310 
 311  !Read ngfft(1), ngfft(2), and ngfft(3), then ngfft(7)=fftalg and ngfft(8)=fftcache.
 312  !Read ngfftdg(1:3)
 313 
 314  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ngfft',tread,'INT')
 315  if(tread==1) dtset%ngfft(1:3)=intarr(1:3)
 316 
 317  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fftalg',tread,'INT')
 318  if(tread==1) then
 319    dtset%ngfft(7)=intarr(1)
 320    if (usepaw==1) dtset%ngfftdg(7)=intarr(1)
 321  end if
 322 
 323  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fftcache',tread,'INT')
 324 
 325  if(tread==1) then
 326    dtset%ngfft(8)=intarr(1)
 327    if (usepaw==1) dtset%ngfftdg(8)=intarr(1)
 328  end if
 329 
 330  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ngfftdg',tread,'INT')
 331  if(tread==1) dtset%ngfftdg(1:3)=intarr(1:3)
 332 
 333  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mqgrid',tread,'INT')
 334  if(tread==1) dtset%mqgrid=intarr(1)
 335 
 336  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mqgriddg',tread,'INT')
 337  if(tread==1) dtset%mqgriddg=intarr(1)
 338 
 339  ! Make special arrangements to check nband: may be a scalar
 340  ! (for occopt=0, 1 or 3, 4, 5, 6, 7, 8) or may be an array (for occopt=2)
 341 
 342  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'occopt',tread,'INT')
 343  if(tread==1) dtset%occopt=intarr(1)
 344  occopt=dtset%occopt
 345 
 346  ! check for variables related to genetic algorithm. ga_n_rules has been already read
 347 
 348  if (dtset%imgmov==4) then
 349    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ga_algor',tread,'INT')
 350    if(tread==1) dtset%ga_algor=intarr(1)
 351 
 352    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ga_fitness',tread,'INT')
 353    if(tread==1) dtset%ga_fitness=intarr(1)
 354 
 355    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ga_opt_percent',tread,'ENE')
 356    if(tread==1) dtset%ga_opt_percent=dprarr(1)
 357 
 358    call intagm(dprarr,intarr,jdtset,marr,dtset%ga_n_rules,string(1:lenstr),'ga_rules',tread,'INT')
 359    if(tread==1)then
 360      dtset%ga_rules(1:dtset%ga_n_rules)=intarr(1:dtset%ga_n_rules)
 361      do ii=1,dtset%ga_n_rules
 362        if(dtset%ga_rules(ii)<0)then
 363          write(msg, '(3a)' )&
 364          'All values for Genetic rules must be greater than 0.',ch10,&
 365          'Action: check the values of ga_rules.'
 366          ABI_ERROR(msg)
 367        end if
 368      end do
 369    end if
 370  end if
 371 
 372  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwaclowrank',tread,'INT')
 373  if(tread==1) dtset%gwaclowrank=intarr(1)
 374 
 375  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwcalctyp',tread,'INT')
 376  if(tread==1) dtset%gwcalctyp=intarr(1)
 377 
 378  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwcomp',tread,'INT')
 379  if(tread==1) dtset%gwcomp=intarr(1)
 380 
 381  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwencomp',tread,'ENE')
 382  if(tread==1) dtset%gwencomp=dprarr(1)
 383 
 384  if (usepaw==1) then
 385    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_sigxcore',tread,'INT')
 386    if(tread==1) dtset%gw_sigxcore=intarr(1)
 387  end if
 388 
 389  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwmem',tread,'INT')
 390  if(tread==1) dtset%gwmem=intarr(1)
 391 
 392  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwr_nstep',tread,'INT')
 393  if(tread==1) dtset%gwr_nstep=intarr(1)
 394 
 395  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwr_tolqpe',tread,'ENE')
 396  if(tread==1) dtset%gwr_tolqpe=dprarr(1)
 397 
 398  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_stern_kmax',tread,'INT')
 399  if(tread==1) dtset%gwls_stern_kmax=intarr(1)
 400 
 401  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_npt_gauss_quad',tread,'INT')
 402  if(tread==1) dtset%gwls_npt_gauss_quad=intarr(1)
 403 
 404  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_diel_model',tread,'INT')
 405  if(tread==1) dtset%gwls_diel_model=intarr(1)
 406 
 407  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_model_parameter',tread,'ENE')
 408  if(tread==1) dtset%gwls_model_parameter=dprarr(1)
 409 
 410  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_recycle',tread,'INT')
 411  if(tread==1) dtset%gwls_recycle=intarr(1)
 412 
 413  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_print_debug',tread,'INT')
 414  if(tread==1) dtset%gwls_print_debug=intarr(1)
 415 
 416  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_nseeds',tread,'INT')
 417  if(tread==1) dtset%gwls_nseeds=intarr(1)
 418 
 419  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_complement',tread,'INT')
 420  if(tread==1) dtset%gwls_kmax_complement=intarr(1)
 421 
 422  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_poles',tread,'INT')
 423  if(tread==1) dtset%gwls_kmax_poles=intarr(1)
 424 
 425  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_analytic',tread,'INT')
 426  if(tread==1) dtset%gwls_kmax_analytic=intarr(1)
 427 
 428  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_kmax_numeric',tread,'INT')
 429  if(tread==1) dtset%gwls_kmax_numeric=intarr(1)
 430 
 431  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_exchange',tread,'INT')
 432  if(tread==1) dtset%gwls_exchange=intarr(1)
 433 
 434  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_correlation',tread,'INT')
 435  if(tread==1) dtset%gwls_correlation=intarr(1)
 436 
 437  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_band_index',tread,'INT')
 438  if(tread==1) dtset%gwls_band_index=intarr(1)
 439 
 440  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw1rdm',tread,'INT')
 441  if(tread==1) dtset%gw1rdm=intarr(1)
 442 
 443  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'x1rdm',tread,'INT')
 444  if(tread==1) dtset%x1rdm=intarr(1)
 445 
 446  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtchkprdm',tread,'INT')
 447  if(tread==1) dtset%prtchkprdm=intarr(1)
 448 
 449  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdchkprdm',tread,'INT')
 450  if(tread==1) dtset%irdchkprdm=intarr(1)
 451 
 452  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwls_first_seed',tread,'INT')
 453  if(tread==1) then
 454    dtset%gwls_first_seed=intarr(1)
 455  else
 456    dtset%gwls_first_seed=dtset%gwls_band_index
 457  end if
 458 
 459  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'extfpmd_nbcut',tread,'INT')
 460  if(tread==1) dtset%extfpmd_nbcut=intarr(1)
 461 
 462  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'extfpmd_nbdbuf',tread,'INT')
 463  if(tread==1) dtset%extfpmd_nbdbuf=intarr(1)
 464 
 465  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rhoqpmix',tread,'DPR')
 466  if(tread==1) dtset%rhoqpmix=dprarr(1)
 467 
 468  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rifcsph',tread,'DPR')
 469  if(tread==1) dtset%rifcsph=dprarr(1)
 470 
 471  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nfreqim',tread,'INT')
 472  if(tread==1) dtset%nfreqim=intarr(1)
 473  if (dtset%cd_customnimfrqs/=0) then
 474    write(msg, '(3a)' )&
 475    'cd_customnimfrqs not equal to zero and not equal to nfreqim',ch10,&
 476    'setting nfreqim = cd_customnimfrqs'
 477    ABI_WARNING(msg)
 478    dtset%nfreqim = dtset%cd_customnimfrqs
 479  end if
 480 
 481  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqim_alpha',tread,'DPR')
 482  if(tread==1) dtset%freqim_alpha=dprarr(1)
 483 
 484  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqremin',tread,'ENE')
 485  if(tread==1) dtset%freqremin=dprarr(1)
 486 
 487  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqremax',tread,'ENE')
 488  if(tread==1) dtset%freqremax=dprarr(1)
 489 
 490  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nfreqre',tread,'INT')
 491  if(tread==1) dtset%nfreqre=intarr(1)
 492 
 493  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nfreqsp',tread,'INT')
 494  if(tread==1) dtset%nfreqsp=intarr(1)
 495 
 496  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqspmax',tread,'ENE')
 497  if(tread==1) dtset%freqspmax=dprarr(1)
 498 
 499  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'freqspmin',tread,'ENE')
 500  if(tread==1) then
 501    ! If found, set it
 502    dtset%freqspmin=dprarr(1)
 503  else
 504    ! Else give it the value -freqspmax
 505    dtset%freqspmin=-dtset%freqspmax
 506  end if
 507 
 508  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_frqim_inzgrid',tread,'INT')
 509  if(tread==1) dtset%gw_frqim_inzgrid=intarr(1)
 510 
 511  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_frqre_inzgrid',tread,'INT')
 512  if(tread==1) dtset%gw_frqre_inzgrid=intarr(1)
 513 
 514  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_frqre_tangrid',tread,'INT')
 515  if(tread==1) dtset%gw_frqre_tangrid=intarr(1)
 516 
 517  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_invalid_freq',tread,'INT')
 518  if(tread==1) dtset%gw_invalid_freq=intarr(1)
 519 
 520  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_icutcoul',tread,'INT')
 521  if(tread==1) dtset%gw_icutcoul=intarr(1)
 522 
 523  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gw_qprange',tread,'INT')
 524  if(tread==1) dtset%gw_qprange=intarr(1)
 525 
 526  if(dtset%cd_customnimfrqs/=0) then
 527    call intagm(dprarr,intarr,jdtset,marr,dtset%cd_customnimfrqs,string(1:lenstr),'cd_imfrqs',tread,'ENE')
 528    if(tread==1) then
 529      dtset%cd_imfrqs(1:dtset%cd_customnimfrqs)=dprarr(1:dtset%cd_customnimfrqs)
 530      do ifreq=1,dtset%cd_customnimfrqs-1
 531        if (dtset%cd_imfrqs(ifreq+1)<dtset%cd_imfrqs(ifreq)) then
 532          write(msg, '(3a)' )&
 533          'The frequencies specified in cd_imfrqs must be strictly increasing',ch10,&
 534          'Action: Correct this in your input file'
 535          ABI_ERROR(msg)
 536        end if
 537      end do
 538    end if
 539  end if
 540 
 541  if(dtset%gw_customnfreqsp/=0) then
 542    call intagm(dprarr,intarr,jdtset,marr,dtset%gw_customnfreqsp,string(1:lenstr),'gw_freqsp',tread,'ENE')
 543    if(tread==1) then
 544      dtset%gw_freqsp(1:dtset%gw_customnfreqsp)=dprarr(1:dtset%gw_customnfreqsp)
 545      do ifreq=1,dtset%gw_customnfreqsp-1
 546        if (dtset%gw_freqsp(ifreq+1)<dtset%gw_freqsp(ifreq)) then
 547          write(msg, '(3a)' )&
 548          'The frequencies specified in gw_freqsp must be strictly increasing',ch10,&
 549          'Action: Correct this in your input file'
 550          ABI_ERROR(msg)
 551        end if
 552      end do
 553    end if
 554  end if
 555 
 556  if(dtset%gwls_n_proj_freq/=0) then
 557    call intagm(dprarr,intarr,jdtset,marr,dtset%gwls_n_proj_freq,string(1:lenstr),'gwls_list_proj_freq',tread,'ENE')
 558    if(tread==1) then
 559      dtset%gwls_list_proj_freq(1:dtset%gwls_n_proj_freq)=dprarr(1:dtset%gwls_n_proj_freq)
 560    end if
 561  end if
 562 
 563  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_full_grid',tread,'INT')
 564  if(tread==1) dtset%cd_full_grid=intarr(1)
 565 
 566  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_frqim_method',tread,'INT')
 567  if(tread==1) dtset%cd_frqim_method=intarr(1)
 568 
 569  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_halfway_freq',tread,'ENE')
 570  if(tread==1) dtset%cd_halfway_freq=dprarr(1)
 571 
 572  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cd_max_freq',tread,'ENE')
 573  if(tread==1) dtset%cd_max_freq=dprarr(1)
 574 
 575  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'cd_subset_freq',tread,'INT')
 576  if(tread==1) dtset%cd_subset_freq(1:2)=intarr(1:2)
 577 
 578  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwrpacorr',tread,'INT')
 579  if(tread==1) dtset%gwrpacorr=intarr(1)
 580 
 581  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwgmcorr',tread,'INT')
 582  if(tread==1) dtset%gwgmcorr=intarr(1)
 583 
 584  narr = size(dtset%gwr_np_kgts)
 585  call intagm(dprarr, intarr, jdtset, marr, narr, string(1:lenstr), 'gwr_np_kgts', tread, 'INT')
 586  if (tread == 1) dtset%gwr_np_kgts = intarr(1:narr)
 587 
 588  narr = size(dtset%gwr_ucsc_batch)
 589  call intagm(dprarr, intarr, jdtset, marr, narr, string(1:lenstr), 'gwr_ucsc_batch', tread, 'INT')
 590  if (tread == 1) dtset%gwr_ucsc_batch = intarr(1:narr)
 591 
 592  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_ntau', tread,'INT')
 593  if (tread == 1) dtset%gwr_ntau = intarr(1)
 594 
 595  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_chi_algo', tread,'INT')
 596  if (tread == 1) dtset%gwr_chi_algo = intarr(1)
 597  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_sigma_algo', tread,'INT')
 598  if (tread == 1) dtset%gwr_sigma_algo = intarr(1)
 599  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_rpa_ncut', tread,'INT')
 600  if (tread == 1) dtset%gwr_rpa_ncut = intarr(1)
 601 
 602  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_boxcutmin', tread, 'DPR')
 603  if (tread == 1) dtset%gwr_boxcutmin = dprarr(1)
 604 
 605  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_max_hwtene', tread, 'ENE')
 606  if (tread == 1) dtset%gwr_max_hwtene = dprarr(1)
 607 
 608  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gwr_regterm', tread, 'DPR')
 609  if (tread == 1) dtset%gwr_regterm = dprarr(1)
 610 
 611  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "gwr_task", tread, 'KEY', key_value=key_value)
 612  if (tread == 1) dtset%gwr_task = toupper(trim(key_value))
 613 
 614  ! RESPFN integer input variables (needed here to get the value of response)
 615  ! Warning: rfddk,rfelfd,rfmagn,rfphon,rfstrs,rfsrs_ref,rfuser,rf2_dkdk and rf2_dkde are also read in invars1
 616 
 617 !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfasr',tread,'INT')
 618 !if(tread==1) dtset%rfasr=intarr(1)
 619 
 620  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'asr',tread,'INT')
 621  if(tread==1) dtset%asr=intarr(1)
 622 
 623  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chneut',tread,'INT')
 624  if(tread==1) dtset%chneut=intarr(1)
 625 
 626 
 627  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'rfatpol',tread,'INT')
 628  if(tread==1) dtset%rfatpol(1:2)=intarr(1:2)
 629  if(dtset%rfatpol(1)==-1)then
 630    dtset%rfatpol(1)=1
 631  endif
 632  if(dtset%rfatpol(2)==-1)then
 633    dtset%rfatpol(2)=dtset%natom
 634  endif
 635 
 636  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rfdir',tread,'INT')
 637  if(tread==1) dtset%rfdir(1:3)=intarr(1:3)
 638 
 639  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfddk',tread,'INT')
 640  if(tread==1) dtset%rfddk=intarr(1)
 641 
 642  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfelfd',tread,'INT')
 643  if(tread==1) dtset%rfelfd=intarr(1)
 644 
 645  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfmagn',tread,'INT')
 646  if(tread==1) dtset%rfmagn=intarr(1)
 647 
 648  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfmeth',tread,'INT')
 649  if(tread==1) dtset%rfmeth=intarr(1)
 650 
 651  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfphon',tread,'INT')
 652  if(tread==1) dtset%rfphon=intarr(1)
 653 
 654  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfstrs',tread,'INT')
 655  if(tread==1) dtset%rfstrs=intarr(1)
 656 
 657  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfstrs_ref',tread,'INT')
 658  if(tread==1) dtset%rfstrs_ref=intarr(1)
 659 
 660  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rfuser',tread,'INT')
 661  if(tread==1) dtset%rfuser=intarr(1)
 662 
 663  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf2_dkdk',tread,'INT')
 664  if(tread==1) dtset%rf2_dkdk=intarr(1)
 665 
 666  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rf2_dkde',tread,'INT')
 667  if(tread==1) dtset%rf2_dkde=intarr(1)
 668 
 669  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf2_pert1_dir',tread,'INT')
 670  if(tread==1) dtset%rf2_pert1_dir(1:3)=intarr(1:3)
 671 
 672  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'rf2_pert2_dir',tread,'INT')
 673  if(tread==1) dtset%rf2_pert2_dir(1:3)=intarr(1:3)
 674 
 675  ! Set value of response to 1 and also set rfdir to 1 1 1 if we are doing
 676  ! response calculation but rfdir was left at default 0 0 0 value.
 677  ! For rf2_dkdk and rf2_dkde, we do the same for rf2_pert1_dir and rf2_pert2_dir
 678  response=0
 679  if(dtset%rfddk/=0 .or. dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0 .or. dtset%rfelfd/=0 .or. &
 680    dtset%rfphon/=0 .or. dtset%rfstrs/=0 .or. dtset%rfuser/=0 ) then
 681    response=1
 682    if( (dtset%rfdir(1) == 0) .and. (dtset%rfdir(2) == 0) .and. (dtset%rfdir(3) == 0) ) dtset%rfdir(1:3) = 1
 683    if (dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0) then
 684      if (sum(abs(dtset%rf2_pert1_dir)) == 0) dtset%rf2_pert1_dir(:) = 1
 685      if (sum(abs(dtset%rf2_pert2_dir)) == 0) dtset%rf2_pert2_dir(:) = 1
 686    end if
 687  end if
 688 
 689  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rmm_diis',tread,'INT')
 690  if(tread==1) dtset%rmm_diis=intarr(1)
 691  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rmm_diis_savemem',tread,'INT')
 692  if(tread==1) dtset%rmm_diis_savemem=intarr(1)
 693 
 694  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nonlinear_info',tread,'INT')
 695  if(tread==1) dtset%nonlinear_info=intarr(1)
 696 
 697  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nonlop_ylm_count',tread,'INT')
 698  if(tread==1) dtset%nonlop_ylm_count=intarr(1)
 699 
 700 !Need always to be read, in order to change the default value.
 701  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'d3e_pert1_atpol',tread,'INT')
 702  if(tread==1) dtset%d3e_pert1_atpol(1:2)=intarr(1:2)
 703  if(dtset%d3e_pert1_atpol(1)==-1)then
 704    dtset%d3e_pert1_atpol(1)=1
 705  endif
 706  if(dtset%d3e_pert1_atpol(2)==-1)then
 707    dtset%d3e_pert1_atpol(2)=dtset%natom
 708  endif
 709 
 710  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'d3e_pert2_atpol',tread,'INT')
 711  if(tread==1) dtset%d3e_pert2_atpol(1:2)=intarr(1:2)
 712  if(dtset%d3e_pert2_atpol(1)==-1)then
 713    dtset%d3e_pert2_atpol(1)=1
 714  endif
 715  if(dtset%d3e_pert2_atpol(2)==-1)then
 716    dtset%d3e_pert2_atpol(2)=dtset%natom
 717  endif
 718 
 719  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'d3e_pert3_atpol',tread,'INT')
 720  if(tread==1) dtset%d3e_pert3_atpol(1:2)=intarr(1:2)
 721  if(dtset%d3e_pert3_atpol(1)==-1)then
 722    dtset%d3e_pert3_atpol(1)=1
 723  endif
 724  if(dtset%d3e_pert3_atpol(2)==-1)then
 725    dtset%d3e_pert3_atpol(2)=dtset%natom
 726  endif
 727 
 728 
 729  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'d3e_pert1_dir',tread,'INT')
 730  if(tread==1) dtset%d3e_pert1_dir(1:3)=intarr(1:3)
 731 
 732  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert1_elfd',tread,'INT')
 733  if(tread==1) dtset%d3e_pert1_elfd=intarr(1)
 734 
 735  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert1_phon',tread,'INT')
 736  if(tread==1) dtset%d3e_pert1_phon=intarr(1)
 737 
 738  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'d3e_pert2_dir',tread,'INT')
 739  if(tread==1) dtset%d3e_pert2_dir(1:3)=intarr(1:3)
 740 
 741  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert2_elfd',tread,'INT')
 742  if(tread==1) dtset%d3e_pert2_elfd=intarr(1)
 743 
 744  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert2_phon',tread,'INT')
 745  if(tread==1) dtset%d3e_pert2_phon=intarr(1)
 746 
 747  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'d3e_pert3_dir',tread,'INT')
 748  if(tread==1) dtset%d3e_pert3_dir(1:3)=intarr(1:3)
 749 
 750  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert3_elfd',tread,'INT')
 751  if(tread==1) dtset%d3e_pert3_elfd=intarr(1)
 752 
 753  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'d3e_pert3_phon',tread,'INT')
 754  if(tread==1) dtset%d3e_pert3_phon=intarr(1)
 755 
 756  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'usepead',tread,'INT')
 757  if(tread==1) dtset%usepead=intarr(1)
 758 
 759  response=0
 760  if(dtset%rfddk/=0 .or. dtset%rfphon/=0 .or. dtset%rfelfd/=0 .or. &
 761     dtset%rfstrs/=0 .or. dtset%rfuser/=0 .or. &
 762     dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0 .or. &
 763     dtset%d3e_pert1_elfd/=0 .or. dtset%d3e_pert1_phon/=0 .or. &
 764     dtset%d3e_pert2_elfd/=0 .or. dtset%d3e_pert2_phon/=0 .or. &
 765     dtset%d3e_pert3_elfd/=0 .or. dtset%d3e_pert3_phon/=0 ) response=1
 766 
 767  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prepanl',tread,'INT')
 768  if(tread==1) dtset%prepanl=intarr(1)
 769 
 770  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prepgkk',tread,'INT')
 771  if(tread==1) dtset%prepgkk=intarr(1)
 772 
 773  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'use_nonscf_gkk',tread,'INT')
 774  if(tread==1) dtset%use_nonscf_gkk=intarr(1)
 775 
 776  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'use_yaml',tread,'INT')
 777  if(tread==1) dtset%use_yaml=intarr(1)
 778 
 779  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'use_oldchi',tread,'INT')
 780  if(tread==1) dtset%use_oldchi=intarr(1)
 781 
 782  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'brav',tread,'INT')
 783  if(tread==1) dtset%brav=intarr(1)
 784 
 785  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'boxcutmin',tread,'DPR')
 786  if(tread==1) dtset%boxcutmin=dprarr(1)
 787 
 788 !Initialize cellcharge, that might differ for each image
 789  cellcharge_min=huge(one)
 790  do iimage=1,dtset%nimage
 791    if (dtset%nimage /= 1) call wrtout(std_out, sjoin(' invars2: cellcharge, treat image number: ',itoa(iimage)))
 792 
 793 !  Read cellcharge for each image, but use it only to initialize cellcharge_min
 794 !  The old name 'charge' is still tolerated. Will be removed in due time.
 795    dprarr(1)=dtset%cellcharge(iimage)
 796    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cellcharge',tread,'DPR')
 797    if(tread==1)then
 798      dtset%cellcharge(iimage)=dprarr(1)
 799    else
 800      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'charge',tread,'DPR')
 801      if(tread==1) dtset%cellcharge(iimage)=dprarr(1)
 802    endif
 803 !  Possibly overwrite cellcharge from the first image with a specific value for the current image
 804    call intagm_img(dprarr,iimage,jdtset,lenstr,dtset%nimage,1,string,'cellcharge',tread_alt,'DPR')
 805    if(tread_alt==1)then
 806      dtset%cellcharge(iimage)=dprarr(1)
 807    else
 808      call intagm_img(dprarr,iimage,jdtset,lenstr,dtset%nimage,1,string,'charge',tread_alt,'DPR')
 809      if(tread_alt==1) dtset%cellcharge(iimage)=dprarr(1)
 810    endif
 811 
 812    if(dtset%cellcharge(iimage) < cellcharge_min)cellcharge_min=dtset%cellcharge(iimage)
 813  end do
 814 
 815  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'invovl_blksliced',tread,'INT')
 816  if(tread==1)dtset%invovl_blksliced=intarr(1)
 817 
 818  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dosdeltae',tread,'ENE')
 819  if(tread==1) dtset%dosdeltae=dprarr(1)
 820 
 821  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dtion',tread,'DPR')
 822  if(tread==1) dtset%dtion=dprarr(1)
 823 
 824  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dtele',tread,'DPR')
 825  if(tread==1) dtset%dtele=dprarr(1)
 826 
 827  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecut',tread,'ENE')
 828  if(tread==1) dtset%ecut=dprarr(1)
 829 
 830  ! With planewaves, ecut must use positive ecut
 831  ! Must perform the check here instad of chkinp else the code sigfaults in mpi_setup before calling chkinp
 832  if(dtset%usewvl==0)then
 833    if (dtset%ecut < tol2) then
 834      write(msg, '(3a)' )&
 835        'The input keyword "ecut" is compulsory !',ch10,&
 836        'Action: add a value for "ecut" in the input file.'
 837      ABI_ERROR(msg)
 838    end if
 839  end if
 840 
 841 
 842  call intagm(dprarr,intarr,jdtset,marr,size(dtset%einterp),string(1:lenstr),'einterp',tread,'DPR')
 843  if(tread==1) dtset%einterp=dprarr(1:size(dtset%einterp))
 844 
 845  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'elph2_imagden',tread,'ENE')
 846  if(tread==1) dtset%elph2_imagden=dprarr(1)
 847 
 848  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'esmear',tread,'ENE')
 849  if(tread==1) dtset%esmear=dprarr(1)
 850 
 851  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fermie_nest',tread,'ENE')
 852  if(tread==1) dtset%fermie_nest=dprarr(1)
 853 
 854  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dfpt_sciss',tread,'ENE')
 855  if(tread==1) dtset%dfpt_sciss=dprarr(1)
 856 
 857  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'tmesh',tread,'DPR')
 858  if(tread==1) dtset%tmesh=dprarr(1:3)
 859  ABI_CHECK(all(dtset%tmesh >= zero), sjoin("Invalid tmesh containg T < 0:", ltoa(dtset%tmesh)))
 860 
 861  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tsmear',tread,'ENE')
 862  if(tread==1) dtset%tsmear=dprarr(1)
 863 
 864  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vis',tread,'DPR')
 865  if(tread==1) dtset%vis=dprarr(1)
 866 
 867  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vloc_rcut',tread,'LEN')
 868  if(tread==1) dtset%vloc_rcut=dprarr(1)
 869 
 870  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecutsm',tread,'ENE')
 871  if(tread==1) dtset%ecutsm=dprarr(1)
 872 
 873  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'exchmix',tread,'DPR')
 874  if(tread==1) dtset%exchmix=dprarr(1)
 875 
 876  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dilatmx',tread,'DPR')
 877  if(tread==1) dtset%dilatmx=dprarr(1)
 878 
 879  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fxcartfactor',tread,'DPR')
 880  if(tread==1) dtset%fxcartfactor=dprarr(1)
 881 
 882  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'strfact',tread,'DPR')
 883  if(tread==1) dtset%strfact=dprarr(1)
 884 
 885  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'effmass_free',tread,'DPR')
 886  if(tread==1) dtset%effmass_free=dprarr(1)
 887 
 888  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'mdtemp',tread,'DPR')
 889  if(tread==1) dtset%mdtemp(1:2)=dprarr(1:2)
 890 
 891  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prepalw',tread,'INT')
 892  if(tread==1) dtset%prepalw=intarr(1)
 893 
 894  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lw_flexo',tread,'INT')
 895  if(tread==1) dtset%lw_flexo=intarr(1)
 896 
 897  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lw_qdrpl',tread,'INT')
 898  if(tread==1) dtset%lw_qdrpl=intarr(1)
 899 
 900  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lw_natopt',tread,'INT')
 901  if(tread==1) dtset%lw_natopt=intarr(1)
 902 
 903  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ffnl_lw',tread,'INT')
 904  if(tread==1) dtset%ffnl_lw=intarr(1)
 905 
 906  ! Recursion input variables
 907  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tfkinfunc',tread,'INT')
 908  if(tread==1) dtset%tfkinfunc=intarr(1)
 909 
 910  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recgratio',tread,'INT')
 911  if(tread==1) dtset%recgratio=intarr(1)
 912 
 913  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recefermi',tread,'ENE')
 914  if(tread==1) dtset%recefermi=dprarr(1)
 915 
 916  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recnpath',tread,'INT')
 917  if(tread==1) dtset%recnpath=intarr(1)
 918 
 919  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recnrec',tread,'INT')
 920  if(tread==1) dtset%recnrec=intarr(1)
 921 
 922  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recrcut',tread,'LEN')
 923  if(tread==1) dtset%recrcut=dprarr(1)
 924 
 925  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'recptrott',tread,'INT')
 926  if(tread==1) dtset%recptrott=intarr(1)
 927 
 928  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rectesteg',tread,'INT')
 929  if(tread==1) dtset%rectesteg=intarr(1)
 930 
 931  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rectolden',tread,'DPR')
 932  if(tread==1) dtset%rectolden=dprarr(1)
 933 
 934  ! Constant NPT Molecular Dynamics Input variables
 935  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'noseinert',tread,'DPR')
 936  if(tread==1) dtset%noseinert=dprarr(1)
 937 
 938  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bmass',tread,'DPR')
 939  if(tread==1) dtset%bmass=dprarr(1)
 940 
 941  call intagm(dprarr,intarr,jdtset,marr,dtset%nnos,string(1:lenstr),'qmass',tread,'DPR')
 942  if(tread==1) dtset%qmass(:)=dprarr(1:dtset%nnos)
 943 
 944  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tphysel',tread,'ENE')
 945  if(tread==1) dtset%tphysel=dprarr(1)
 946 
 947  call intagm(dprarr,intarr,jdtset,marr,6,string(1:lenstr),'strtarget',tread,'DPR')
 948  if(tread==1) dtset%strtarget(1:6)=dprarr(1:6)
 949 
 950  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'vcutgeo',tread,'DPR')
 951  if(tread==1) dtset%vcutgeo(1:3)=dprarr(1:3)
 952 
 953  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'friction',tread,'DPR')
 954  if(tread==1) dtset%friction=dprarr(1)
 955 
 956  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mdwall',tread,'LEN')
 957  if(tread==1) dtset%mdwall=dprarr(1)
 958 
 959  ! Path-Integral Molecular Dynamics Input variables
 960  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'adpimd',tread,'INT')
 961  if(tread==1) dtset%adpimd=intarr(1)
 962 
 963  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'adpimd_gamma',tread,'DPR')
 964  if(tread==1) dtset%adpimd_gamma=dprarr(1)
 965 
 966  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pimd_constraint',tread,'INT')
 967  if(tread==1) dtset%pimd_constraint=intarr(1)
 968 
 969  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pitransform',tread,'INT')
 970  if(tread==1) dtset%pitransform=intarr(1)
 971 
 972  ! Default for pimass is amu
 973  dtset%pimass(1:ntypat)=dtset%amu_orig(1:ntypat,1)
 974  ! NOTE: initialisation with the first image only. TO BE MODIFIED ....
 975  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'pimass',tread,'DPR')
 976  if(tread==1) dtset%pimass(1:ntypat)=dprarr(1:ntypat)
 977 
 978  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spinmagntarget',tread,'DPR')
 979  if(tread==1) dtset%spinmagntarget=dprarr(1)
 980 
 981  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eshift',tread,'ENE')
 982  if(tread==1) dtset%eshift=dprarr(1)
 983 
 984  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'boxcenter',tread,'DPR')
 985  if(tread==1) dtset%boxcenter(1:3)=dprarr(1:3)
 986 
 987  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecuteps',tread,'ENE')
 988  if(tread==1) dtset%ecuteps=dprarr(1)
 989 
 990  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecutsigx',tread,'ENE')
 991  if(tread==1) dtset%ecutsigx=dprarr(1)
 992 
 993  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ecutwfn',tread,'ENE')
 994  if(tread==1) then
 995    dtset%ecutwfn=dprarr(1)
 996  else
 997    if(dtset%optdriver==RUNL_SCREENING .or. dtset%optdriver==RUNL_SIGMA) dtset%ecutwfn=dtset%ecut
 998  end if
 999  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'omegasimax',tread,'ENE')
1000  if(tread==1) dtset%omegasimax=dprarr(1)
1001 
1002  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'omegasrdmax',tread,'ENE')
1003  if(tread==1) dtset%omegasrdmax=dprarr(1)
1004 
1005  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mbpt_sciss',tread,'ENE')
1006  if(tread==1) dtset%mbpt_sciss=dprarr(1)
1007 
1008  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spbroad',tread,'ENE')
1009  if(tread==1) dtset%spbroad=dprarr(1)
1010 
1011  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'stmbias',tread,'ENE')
1012  if(tread==1) dtset%stmbias=dprarr(1)
1013 
1014  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'awtr',tread,'INT')
1015  if(tread==1) dtset%awtr=intarr(1)
1016 
1017  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'inclvkb',tread,'INT')
1018  if(tread==1) dtset%inclvkb=intarr(1)
1019 
1020  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nomegasf',tread,'INT')
1021  if(tread==1) dtset%nomegasf=intarr(1)
1022 
1023  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spmeth',tread,'INT')
1024  if(tread==1) dtset%spmeth=intarr(1)
1025 
1026  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symchi',tread,'INT')
1027  if(tread==1) dtset%symchi=intarr(1)
1028 
1029  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getefmas',tread,'INT')
1030  if(tread==1) dtset%getefmas=intarr(1)
1031 
1032  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getscr',tread,'INT')
1033  if(tread==1) dtset%getscr=intarr(1)
1034 
1035  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getscr_filepath',tread,'KEY', key_value=key_value)
1036  if(tread==1) dtset%getscr_filepath = key_value
1037 
1038  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwgamma',tread,'INT')
1039  if(tread==1) dtset%gwgamma=intarr(1)
1040 
1041  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdefmas',tread,'INT')
1042  if(tread==1) dtset%irdefmas=intarr(1)
1043 
1044  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdsuscep',tread,'INT')
1045  if(tread==1) dtset%irdsuscep=intarr(1)
1046 
1047  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdscr',tread,'INT')
1048  if(tread==1) dtset%irdscr=intarr(1)
1049 
1050  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nomegasi',tread,'INT')
1051  if(tread==1) dtset%nomegasi=intarr(1)
1052 
1053  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ppmodel',tread,'INT')
1054  if(tread==1) dtset%ppmodel=intarr(1)
1055 
1056  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symsigma',tread,'INT')
1057  if(tread==1) dtset%symsigma=intarr(1)
1058 
1059  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fftgw',tread,'INT')
1060  if(tread==1) dtset%fftgw=intarr(1)
1061 
1062  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fft_count',tread,'INT')
1063  if(tread==1) dtset%fft_count=intarr(1)
1064 
1065  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getsuscep',tread,'INT')
1066  if(tread==1) dtset%getsuscep=intarr(1)
1067 
1068  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getqps',tread,'INT')
1069  if(tread==1) dtset%getqps=intarr(1)
1070 
1071  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gwpara',tread,'INT')
1072  if(tread==1) dtset%gwpara=intarr(1)
1073 
1074  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdqps',tread,'INT')
1075  if(tread==1) dtset%irdqps=intarr(1)
1076 
1077  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ppmfrq',tread,'ENE')
1078  if(tread==1) dtset%ppmfrq=dprarr(1)
1079 
1080  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'rcut',tread,'LEN')
1081  if(tread==1) dtset%rcut=dprarr(1)
1082 
1083  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'zcut',tread,'ENE')
1084  if(tread==1) dtset%zcut = dprarr(1)
1085 
1086  ! q-points for long wave-length limit.
1087  if (dtset%gw_nqlwl > 0) then
1088    call intagm(dprarr,intarr,jdtset,marr,3*dtset%gw_nqlwl,string(1:lenstr),'gw_qlwl',tread,'DPR')
1089    if(tread==1) dtset%gw_qlwl(1:3,1:dtset%gw_nqlwl) = reshape(dprarr(1:3*dtset%gw_nqlwl), [3, dtset%gw_nqlwl])
1090  end if
1091 
1092  !@bethe_salpeter
1093  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_nstates',tread,'INT')
1094  if(tread==1) dtset%bs_nstates=intarr(1)
1095 
1096  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_algorithm',tread,'INT')
1097  if(tread==1) dtset%bs_algorithm=intarr(1)
1098 
1099  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_haydock_niter',tread,'INT')
1100  if(tread==1) dtset%bs_haydock_niter=intarr(1)
1101 
1102  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_hayd_term',tread,'INT')
1103  if(tread==1) dtset%bs_hayd_term=intarr(1)
1104 
1105  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_exchange_term',tread,'INT')
1106  if(tread==1) dtset%bs_exchange_term=intarr(1)
1107 
1108  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_calctype',tread,'INT')
1109  if(tread==1) dtset%bs_calctype=intarr(1)
1110 
1111  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_coulomb_term',tread,'INT')
1112  if(tread==1) dtset%bs_coulomb_term=intarr(1)
1113 
1114  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_coupling',tread,'INT')
1115  if(tread==1) dtset%bs_coupling=intarr(1)
1116 
1117  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdbseig',tread,'INT')
1118  if(tread==1) dtset%irdbseig=intarr(1)
1119 
1120  !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdbsr',tread,'INT')
1121  !if(tread==1) dtset%irdbsr=intarr(1)
1122 
1123  !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdbsc',tread,'INT')
1124  !if(tread==1) dtset%irdbsc=intarr(1)
1125 
1126  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getbseig',tread,'INT')
1127  if(tread==1) dtset%getbseig=intarr(1)
1128 
1129  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getbsreso',tread,'INT')
1130  if(tread==1) dtset%getbsreso=intarr(1)
1131 
1132  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getbscoup',tread,'INT')
1133  if(tread==1) dtset%getbscoup=intarr(1)
1134 
1135  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'gethaydock',tread,'INT')
1136  if(tread==1) dtset%gethaydock=intarr(1)
1137 
1138  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_method',tread,'INT')
1139  if(tread==1) dtset%bs_interp_method=intarr(1)
1140 
1141  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_mode',tread,'INT')
1142  if(tread==1) dtset%bs_interp_mode=intarr(1)
1143 
1144  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_prep',tread,'INT')
1145  if(tread==1) dtset%bs_interp_prep=intarr(1)
1146 
1147  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bs_interp_m3_width',tread,'DPR')
1148  if(tread==1) dtset%bs_interp_m3_width=dprarr(1)
1149 
1150  call intagm(dprarr,intarr,jdtset,marr,dtset%nsppol,string(1:lenstr),'bs_loband',tread,'INT')
1151  if(tread==1) dtset%bs_loband=intarr(1:dtset%nsppol)
1152 
1153  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'bs_interp_kmult',tread,'INT')
1154  if(tread==1) dtset%bs_interp_kmult(1:3) = intarr(1:3)
1155 
1156  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'bs_eh_cutoff',tread,'ENE')
1157  if(tread==1) dtset%bs_eh_cutoff(1:2)=dprarr(1:2)
1158 
1159  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'bs_freq_mesh',tread,'ENE')
1160  if(tread==1) dtset%bs_freq_mesh(1:3)=dprarr(1:3)
1161 
1162  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'bs_haydock_tol',tread,'DPR')
1163  if(tread==1) dtset%bs_haydock_tol=dprarr(1:2)
1164 
1165  ntypalch=dtset%ntypalch
1166  npspalch=dtset%npspalch
1167 
1168  ! Compute ziontypat. When the pseudo-atom is pure, simple copy
1169  if(ntyppure>0)then
1170    do itypat=1,ntyppure
1171      dtset%ziontypat(itypat)=zionpsp(itypat)
1172    end do
1173  end if
1174 
1175  ! When the pseudo-atom is alchemical, must make mixing
1176  if(ntypalch>0)then
1177    do itypat=ntyppure+1,ntypat
1178      dtset%ziontypat(itypat)=zero
1179      do ipsp=ntyppure+1,npsp
1180        dtset%ziontypat(itypat)=dtset%ziontypat(itypat) &
1181         + dtset%mixalch_orig(ipsp-ntyppure,itypat-ntyppure,1)*zionpsp(ipsp)
1182      end do
1183    end do
1184  end if
1185 
1186  dtset%nh_qFD=zero
1187  dtset%ne_qFD=zero
1188  dtset%ivalence=0
1189 
1190  if (occopt==0 .or. occopt==1 .or. (occopt>=3 .and. occopt<=9) ) then
1191    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nband',tnband,'INT')
1192    if(tnband==1) then
1193      nband1=intarr(1)
1194    else
1195      ! Default value in the metallic case, or in the insulating case
1196      fband=0.5_dp
1197      if(occopt==1)fband=0.125_dp
1198      if((occopt/=1).and.(dtset%accuracy==5.or.dtset%accuracy==6)) fband =0.75_dp
1199      if (dtset%usewvl == 1) fband = zero
1200      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fband',tfband,'DPR')
1201      if(tfband==1)then
1202        fband=dprarr(1)
1203        write(msg, '(a,es16.8,a)' )' invars2: read the value of fband=',fband,' from input file.'
1204      else
1205        write(msg, '(a,es16.8)' )' invars2: take the default value of fband=',fband
1206      end if
1207      dtset%fband=fband
1208      call wrtout(std_out,msg,'COLL')
1209      ! First compute the total valence charge
1210      zval=zero
1211      sum_spinat=zero
1212      do iatom=1,natom
1213        zval=zval+dtset%ziontypat(dtset%typat(iatom))
1214        sum_spinat=sum_spinat+dtset%spinat(3,iatom)
1215      end do
1216      zelect=zval-cellcharge_min
1217      ! Then select the minimum number of bands, and add the required number.
1218      ! Note that this number might be smaller than the one computed
1219      ! by a slightly different formula in invars1 (difference in fband).
1220      nband1=dtset%nspinor * ((ceiling(zelect-tol10)+1)/2 + ceiling( fband*natom - tol10 )) &
1221 &     + (nsppol-1)*(ceiling(half*(sum_spinat -tol10)))
1222    end if
1223 
1224    ! Set nband to same input number for each k point and spin
1225    ! where nband1 is the eventual input, computed value, or default
1226    do ikpt=1,nkpt*nsppol
1227      dtset%nband(ikpt)=nband1
1228    end do
1229 
1230    if (occopt==9)then
1231       !Read the valence band index
1232       call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ivalence',tread,'INT')
1233       if (tread==1) dtset%ivalence=intarr(1)
1234       call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nqfd',tread,'DPR')
1235       if (tread==1)then
1236         dtset%nqfd=dprarr(1)
1237         dtset%ne_qFD=dprarr(1)
1238         dtset%nh_qFD=dprarr(1)
1239         ! Here we assume that number of excited electrons  = number of excited holes.
1240         ! Potentially can be relaxed in the future if consistent changes with the
1241         ! cellcharge tag are made.
1242       end if
1243    end if
1244 
1245  else if (occopt==2) then
1246    ! Give nband explicitly for each k point and spin
1247    call intagm(dprarr,intarr,jdtset,nkpt*nsppol,nkpt*nsppol,string(1:lenstr),'nband',tnband,'INT')
1248    if(tnband==1) dtset%nband(1:nkpt*nsppol)=intarr(1:nkpt*nsppol)
1249 
1250  else
1251    write(msg, '(a,i0,3a)' )'occopt=',occopt,' not allowed.',ch10,'Action: correct your input file.'
1252    ABI_ERROR(msg)
1253  end if
1254 
1255  !----------------------------------------------------------------------------
1256  ! Read other parameters
1257  ! ALL CHECKING SHOULD BE DONE IN m_chkinp.F90
1258 
1259  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'builtintest',tread,'INT')
1260  if(tread==1) dtset%builtintest=intarr(1)
1261 
1262  ! Here we set the values of the different chk* flags depending on the value of expert_user.
1263  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'expert_user',tread,'INT')
1264  if(tread==1) dtset%expert_user=intarr(1)
1265 
1266  if (dtset%expert_user > 0) then
1267    ! Set all flags to zero although we still allow users to activate particular tests via explicit values.
1268    dtset%chkdilatmx=0
1269    dtset%chkparal=0
1270    dtset%chkprim=0
1271    dtset%chksymbreak=0
1272    dtset%chksymtnons=0
1273  end if
1274 
1275  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chkdilatmx',tread,'INT')
1276  if(tread==1) dtset%chkdilatmx=intarr(1)
1277 
1278  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chkparal',tread,'INT')
1279  if(tread==1) dtset%chkparal=intarr(1)
1280 
1281  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chkprim',tread,'INT')
1282  if(tread==1) dtset%chkprim=intarr(1)
1283 
1284  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chksymbreak',tread,'INT')
1285  if(tread==1) dtset%chksymbreak=intarr(1)
1286 
1287  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chksymtnons',tread,'INT')
1288  if(tread==1) dtset%chksymtnons=intarr(1)
1289 
1290  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'fockoptmix',tread,'INT')
1291  if(tread==1) dtset%fockoptmix=intarr(1)
1292 
1293  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getocc',tread,'INT')
1294  if(tread==1) dtset%getocc=intarr(1)
1295  getocc=dtset%getocc
1296 
1297  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfk',tread,'INT')
1298  if(tread==1) dtset%getwfk=intarr(1)
1299  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfk_filepath',tread,'KEY', key_value=key_value)
1300  if(tread==1) dtset%getwfk_filepath = key_value
1301 
1302  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfkfine',tread,'INT')
1303  if(tread==1) dtset%getwfkfine=intarr(1)
1304  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfkfine_filepath',tread,'KEY', key_value=key_value)
1305  if(tread==1) dtset%getwfkfine_filepath = key_value
1306 
1307  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getxcart',tread,'INT')
1308  if(tread==1) dtset%getxcart=intarr(1)
1309 
1310  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getxred',tread,'INT')
1311  if(tread==1) dtset%getxred=intarr(1)
1312 
1313  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getddb',tread,'INT')
1314  if(tread==1) dtset%getddb=intarr(1)
1315 
1316  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdvdb',tread,'INT')
1317  if(tread==1) dtset%getdvdb=intarr(1)
1318 
1319  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getden',tread,'INT')
1320  if(tread==1) dtset%getden=intarr(1)
1321 
1322  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getden_filepath',tread,'KEY', key_value=key_value)
1323  if(tread==1) dtset%getden_filepath = key_value
1324 
1325  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getpawden',tread,'INT')
1326  if(tread==1) dtset%getpawden=intarr(1)
1327 
1328  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getddb_filepath',tread,'KEY', key_value=key_value)
1329  if(tread==1) dtset%getddb_filepath = key_value
1330 
1331  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdvdb_filepath',tread,'KEY', key_value=key_value)
1332  if(tread==1) dtset%getdvdb_filepath = key_value
1333 
1334  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getpot_filepath',tread,'KEY', key_value=key_value)
1335  if(tread==1) dtset%getpot_filepath = key_value
1336 
1337  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getsigeph_filepath',tread,'KEY', key_value=key_value)
1338  if(tread==1) dtset%getsigeph_filepath = key_value
1339 
1340  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getgstore_filepath',tread,'KEY', key_value=key_value)
1341  if(tread==1) dtset%getgstore_filepath = key_value
1342 
1343  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getcell',tread,'INT')
1344  if(tread==1) dtset%getcell=intarr(1)
1345 
1346  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getgam_eig2nkq',tread,'INT')
1347  if(tread==1) dtset%getgam_eig2nkq=intarr(1)
1348 
1349  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfq',tread,'INT')
1350  if(tread==1) dtset%getwfq=intarr(1)
1351  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getwfq_filepath',tread,'KEY', key_value=key_value)
1352  if(tread==1) dtset%getwfq_filepath = key_value
1353 
1354  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'get1wf',tread,'INT')
1355  if(tread==1) dtset%get1wf=intarr(1)
1356  ! TODO
1357  !call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'get1wf_filepath',tread,'KEY', key_value=key_value)
1358  !if(tread==1) dtset%get1wf_filepath = key_value
1359 
1360  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getddk',tread,'INT')
1361  if(tread==1) dtset%getddk=intarr(1)
1362 
1363  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdelfd',tread,'INT')
1364  if(tread==1) dtset%getdelfd=intarr(1)
1365 
1366  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdkdk',tread,'INT')
1367  if(tread==1) dtset%getdkdk=intarr(1)
1368 
1369  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getdkde',tread,'INT')
1370  if(tread==1) dtset%getdkde=intarr(1)
1371 
1372  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getvel',tread,'INT')
1373  if(tread==1) dtset%getvel=intarr(1)
1374 
1375  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'get1den',tread,'INT')
1376  if(tread==1) dtset%get1den=intarr(1)
1377 
1378  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iomode',tread,'INT')
1379  if(tread==1) dtset%iomode=intarr(1)
1380 
1381  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'enunit',tread,'INT')
1382  if(tread==1) dtset%enunit=intarr(1)
1383 
1384  ! eph variables
1385  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dipdip',tread_dipdip,'INT')
1386  if(tread_dipdip==1) dtset%dipdip=intarr(1)
1387 
1388  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symdynmat',tread,'INT')
1389  if(tread==1) dtset%symdynmat=intarr(1)
1390 
1391  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'symv1scf',tread,'INT')
1392  if(tread==1) dtset%symv1scf = intarr(1)
1393 
1394  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_prtscratew',tread,'INT')
1395  if(tread==1) dtset%eph_prtscratew = intarr(1)
1396 
1397  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_restart',tread,'INT')
1398  if(tread==1) dtset%eph_restart = intarr(1)
1399 
1400  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_task',tread,'INT')
1401  if(tread==1) dtset%eph_task=intarr(1)
1402 
1403  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_mustar',tread,'DPR')
1404  if(tread==1) dtset%eph_mustar=dprarr(1)
1405 
1406  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'eph_tols_idelta',tread,'DPR')
1407  if (tread == 1) dtset%eph_tols_idelta = dprarr(1:2)
1408 
1409  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'eph_phrange',tread,'INT')
1410  if (tread == 1) dtset%eph_phrange = intarr(1:2)
1411 
1412  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'eph_phrange_w',tread,'ENE')
1413  if (tread == 1) dtset%eph_phrange_w = dprarr(1:2)
1414 
1415  if (any(abs(dtset%eph_phrange) /= 0) .and. any(abs(dtset%eph_phrange_w) > tol16)) then
1416    ABI_ERROR("eph_phrange and eph_phrange_w are mutually exclusive")
1417  end if
1418 
1419  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_intmeth',tread,'INT')
1420  if (tread == 1) then
1421    dtset%eph_intmeth = intarr(1)
1422  else
1423    ! eph_intmeth depends on eph_task.
1424    !if (abs(dtset%eph_task) == 4) dtset%eph_intmeth = 1
1425    if (dtset%eph_task == +4) dtset%eph_intmeth = 1
1426    if (dtset%eph_task == -4 .and. dtset%symsigma == 0) dtset%eph_intmeth = 1
1427  end if
1428 
1429  ! Allow use to dope the system or to shift artificially the Fermi level
1430  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_extrael',tread_extrael,'DPR')
1431  if (tread_extrael == 1) dtset%eph_extrael = dprarr(1)
1432 
1433  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'eph_doping', tread, 'DPR')
1434  if (tread == 1) then
1435    ABI_CHECK(tread_extrael == 0, "eph_extrael and eph_doping are mutually exclusive!")
1436    ! Units of eph_doping is e_charge / cm^3
1437    dtset%eph_extrael = - dprarr(1) * ucvol * (Bohr_meter * 100) ** 3
1438  end if
1439 
1440  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_ahc_type',tread,'INT')
1441  if(tread==1) dtset%eph_ahc_type=intarr(1)
1442 
1443  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_fermie',tread,'ENE')
1444  if(tread==1) dtset%eph_fermie=dprarr(1)
1445 
1446  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_frohlichm',tread,'INT')
1447  if(tread==1) dtset%eph_frohlichm=intarr(1)
1448 
1449  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_frohl_ntheta',tread,'INT')
1450  if(tread==1) dtset%eph_frohl_ntheta=intarr(1)
1451 
1452  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_fsmear',tread,'ENE')
1453  if(tread==1) dtset%eph_fsmear=dprarr(1)
1454 
1455  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_fsewin',tread,'ENE')
1456  if(tread==1) dtset%eph_fsewin=dprarr(1)
1457 
1458  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_ecutosc',tread,'ENE')
1459  if(tread==1) dtset%eph_ecutosc=dprarr(1)
1460 
1461  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_phwinfact',tread,'DPR')
1462  if(tread==1) dtset%eph_phwinfact = dprarr(1)
1463 
1464  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'eph_ngqpt_fine',tread,'INT')
1465  if(tread==1) dtset%eph_ngqpt_fine=intarr(1:3)
1466 
1467  narr = size(dtset%eph_np_pqbks)
1468  call intagm(dprarr,intarr,jdtset,marr,narr,string(1:lenstr),'eph_np_pqbks',tread,'INT')
1469  if (tread==1) dtset%eph_np_pqbks = intarr(1:narr)
1470 
1471  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_stern',tread,'INT')
1472  if(tread==1) dtset%eph_stern = intarr(1)
1473 
1474  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_use_ftinterp',tread,'INT')
1475  if(tread==1) dtset%eph_use_ftinterp = intarr(1)
1476 
1477  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'eph_transport',tread,'INT')
1478  if(tread==1) dtset%eph_transport=intarr(1)
1479 
1480  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_wstep',tread,'ENE')
1481  if(tread==1) dtset%ph_wstep=dprarr(1)
1482 
1483  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_intmeth',tread,'INT')
1484  if(tread==1) dtset%ph_intmeth=intarr(1)
1485 
1486  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_smear',tread,'ENE')
1487  if(tread==1) dtset%ph_smear=dprarr(1)
1488 
1489  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ddb_ngqpt',tread,'INT')
1490  if(tread==1) dtset%ddb_ngqpt=intarr(1:3)
1491 
1492  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ddb_shiftq',tread,'DPR')
1493  if(tread==1) dtset%ddb_shiftq=dprarr(1:3)
1494 
1495  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dvdb_qcache_mb',tread,'DPR')
1496  if(tread==1) dtset%dvdb_qcache_mb = dprarr(1)
1497 
1498  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dvdb_qdamp',tread,'DPR')
1499  if(tread==1) dtset%dvdb_qdamp = dprarr(1)
1500 
1501  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dvdb_rspace_cell',tread, 'INT')
1502  if(tread==1) dtset%dvdb_rspace_cell = intarr(1)
1503 
1504  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dvdb_add_lr',tread,'INT')
1505  if(tread==1) dtset%dvdb_add_lr = intarr(1)
1506 
1507  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_ndivsm',tread,'INT')
1508  if(tread==1) dtset%ph_ndivsm=intarr(1)
1509 
1510  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_nqpath',tread,'INT')
1511  if(tread==1) dtset%ph_nqpath=intarr(1)
1512 
1513  if (dtset%ph_nqpath > 0) then
1514    ! Read qpath for phonons
1515    ABI_MALLOC(dtset%ph_qpath, (3, dtset%ph_nqpath))
1516    ABI_CHECK(3 * dtset%ph_nqpath <= marr, "3 * dtset%ph_nqpath > marr!")
1517    call intagm(dprarr,intarr,jdtset,marr,3*dtset%ph_nqpath,string(1:lenstr),'ph_qpath',tread,'DPR')
1518    if (tread == 0) then
1519      ABI_ERROR("When ph_nqpath > 0, ph_qpath should be specified")
1520    end if
1521    dtset%ph_qpath = reshape(dprarr(1:3*dtset%ph_nqpath), [3, dtset%ph_nqpath])
1522  end if
1523 
1524  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ph_nqshift',tread,'INT')
1525  if(tread==1) dtset%ph_nqshift=intarr(1)
1526 
1527  if (dtset%ph_nqshift > 0) then
1528    ! Read ph_qshift for phonons, default is [0,0,0]
1529    ABI_CALLOC(dtset%ph_qshift, (3, dtset%ph_nqshift))
1530    if (tread == 1) then
1531      ABI_CHECK(3 * dtset%ph_nqshift <= marr, "3 * dtset%ph_nqshift > marr!")
1532      call intagm(dprarr,intarr,jdtset,marr,3*dtset%ph_nqshift,string(1:lenstr),'ph_qshift',tread,'DPR')
1533      if (tread == 0) then
1534        ABI_ERROR("When ph_nqshift > 0, ph_qshift should be specified")
1535      end if
1536      dtset%ph_qshift = reshape(dprarr(1:3*dtset%ph_nqshift), [3, dtset%ph_nqshift])
1537    end if
1538  end if
1539 
1540  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'ph_ngqpt',tread,'INT')
1541  if(tread==1) dtset%ph_ngqpt=intarr(1:3)
1542 !end e-ph variables
1543 
1544  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'exchn2n3d',tread,'INT')
1545  if(tread==1) dtset%exchn2n3d=intarr(1)
1546 
1547  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'extrapwf',tread,'INT')
1548  if(tread==1) dtset%extrapwf=intarr(1)
1549 
1550  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ibte_abs_tol',tread,'DPR')
1551  if(tread==1) dtset%ibte_abs_tol=dprarr(1)
1552 
1553  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ibte_alpha_mix',tread,'DPR')
1554  if(tread==1) dtset%ibte_alpha_mix=dprarr(1)
1555 
1556  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ibte_niter',tread,'INT')
1557  if(tread==1) dtset%ibte_niter=intarr(1)
1558 
1559  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ibte_prep',tread,'INT')
1560  ! ibte_prep is only available when we compute the imaginary part.
1561  if(tread==1 .and. dtset%eph_task == -4) dtset%ibte_prep=intarr(1)
1562 
1563  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iboxcut',tread,'INT')
1564  if(tread==1) dtset%iboxcut=intarr(1)
1565 
1566  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'icutcoul',tread,'INT')
1567  if(tread==1) dtset%icutcoul=intarr(1)
1568 
1569  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'imgwfstor',tread,'INT')
1570  if(tread==1) dtset%imgwfstor=intarr(1)
1571 
1572  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mdf_epsinf',tread,'DPR')
1573  if(tread==1) dtset%mdf_epsinf=dprarr(1)
1574 
1575  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mem_test',tread,'INT')
1576  if(tread==1) dtset%mem_test=intarr(1)
1577 
1578  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mixprec',tread,'INT')
1579  if (tread==1) dtset%mixprec = intarr(1)
1580 
1581  if (dtset%imgmov==0.or.dtset%imgmov==2.or.dtset%imgmov==5) then
1582    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mep_mxstep',tread,'LEN')
1583    if(tread==1) then
1584      dtset%mep_mxstep=dprarr(1)
1585    else if(dtset%imgmov==5) then
1586      dtset%mep_mxstep=0.4_dp
1587    end if
1588  end if
1589  if (dtset%imgmov==2.or.dtset%imgmov==5) then
1590    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mep_solver',tread,'INT')
1591    if(tread==1) then
1592      dtset%mep_solver=intarr(1)
1593    else if(dtset%imgmov==2) then
1594      dtset%mep_solver=0
1595    else if(dtset%imgmov==5) then
1596      dtset%mep_solver=0
1597    end if
1598    if (dtset%imgmov==2) then
1599      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'string_algo',tread,'INT')
1600      if(tread==1) dtset%string_algo=intarr(1)
1601    end if
1602    if (dtset%imgmov==5) then
1603      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'neb_algo',tread,'INT')
1604      if(tread==1) dtset%neb_algo=intarr(1)
1605      call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'neb_spring',tread,'DPR')
1606      if(tread==1) then
1607        dtset%neb_spring(1:2)=dprarr(1:2)
1608      else if (dtset%neb_algo==2) then
1609        dtset%neb_spring(1:2)=(/0.02_dp,0.15_dp/)
1610      end if
1611      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cineb_start',tread,'INT')
1612      if(tread==1) dtset%cineb_start=intarr(1)
1613    end if
1614  end if
1615 
1616  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'istatimg',tread,'INT')
1617  if(tread==1) dtset%istatimg=intarr(1)
1618 
1619  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'quadquad',tread,'INT')
1620  if(tread==1) dtset%quadquad=intarr(1)
1621 
1622  ! variables for random positions in unit cell
1623  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'random_atpos',tread,'INT')
1624  if(tread==1) dtset%random_atpos=intarr(1)
1625 
1626  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ionmov',tread,'INT')
1627  if(tread==1) dtset%ionmov=intarr(1)
1628 
1629  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'intxc',tread,'INT')
1630  if(tread==1) dtset%intxc=intarr(1)
1631 
1632  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'densfor_pred',tread,'INT')
1633  if(tread==1) then
1634    dtset%densfor_pred=intarr(1)
1635  else
1636    if (dtset%paral_kgb==1) dtset%densfor_pred=6
1637  end if
1638 
1639  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hmcsst',tread,'INT')
1640  if(tread==1) dtset%hmcsst=intarr(1)
1641 
1642  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hmctt',tread,'INT')
1643  if(tread==1) dtset%hmctt=intarr(1)
1644 
1645  ! For the moment LOTF does not use different from 2
1646  if(dtset%ionmov==23) then
1647 #ifdef HAVE_LOTF
1648    if(dtset%densfor_pred/=2)then
1649      densfor_pred=2
1650      dtset%densfor_pred=densfor_pred
1651      write(msg, '(4a)' )&
1652        'When ionmov==23, densfor_pred must be 2.',ch10,&
1653        'Set densfor_pred to 2.',ch10
1654      ABI_COMMENT(msg)
1655    end if
1656 #else
1657    dtset%ionmov=12
1658    write(msg, '(4a)' )&
1659      'LOTF is disabled, ionmov can not be 23.',ch10,&
1660      'Set ionmov to 12.',ch10
1661    ABI_COMMENT(msg)
1662 #endif
1663  end if
1664 
1665  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iprcel',tread,'INT')
1666  if(tread==1) dtset%iprcel=intarr(1)
1667 
1668  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iprcfc',tread,'INT')
1669  if(tread==1) dtset%iprcfc=intarr(1)
1670 
1671  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irandom',tread,'INT')
1672  if(tread==1) dtset%irandom=intarr(1)
1673 
1674  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdddb',tread,'INT')
1675  if(tread==1) dtset%irdddb=intarr(1)
1676 
1677  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdden',tread,'INT')
1678  if(tread==1) dtset%irdden=intarr(1)
1679 
1680  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irddvdb',tread,'INT')
1681  if(tread==1) dtset%irddvdb = intarr(1)
1682 
1683  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdpawden',tread,'INT')
1684  if(tread==1) dtset%irdpawden=intarr(1)
1685 
1686  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdhaydock',tread,'INT')
1687  if(tread==1) dtset%irdhaydock=intarr(1)
1688 
1689  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdvdw',tread,'INT')
1690  if(tread==1) dtset%irdvdw=intarr(1)
1691 
1692  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdwfk',tread,'INT')
1693  if(tread==1) dtset%irdwfk=intarr(1)
1694 
1695  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdwfkfine',tread,'INT')
1696  if(tread==1) dtset%irdwfkfine=intarr(1)
1697 
1698  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'isecur',tread,'INT')
1699  if(tread==1) dtset%isecur=intarr(1)
1700 
1701  ! Reading ixc must be immediately followed by reading xcname
1702  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixc',tread,'INT')
1703  if(tread==1) dtset%ixc=intarr(1)
1704 
1705  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),"xcname",tread_key,'KEY',key_value=key_value)
1706  if(tread_key==1)then
1707    if(tread==1)then
1708      write(msg, '(5a)' )&
1709       'ixc and xcname cannot be specified simultaneously',ch10,&
1710       'for the same dataset.',ch10,'Action: check the input file.'
1711      ABI_ERROR(msg)
1712    else
1713      !Note that xcname is a 'key' variable : its value is stored in keyw at output of intagm
1714      if(trim(key_value) == 'PW92') then
1715         dtset%ixc=7
1716      else
1717        ABI_ERROR(sjoin("Don't know how to convert xcname", key_value, "to ixc"))
1718      end if
1719      tread=1
1720    end if
1721  end if
1722  ixc_here=dtset%ixc
1723 
1724  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixcrot',tread,'INT')
1725  if(tread==1) dtset%ixcrot=intarr(1)
1726 
1727  ! Read the ixc for an advanced functional
1728  ! If present, and relevant (only specific values for gcalctyp),
1729  ! the other internal variable will be adjusted to this other functional)
1730  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixc_sigma',tread,'INT')
1731  if(tread==1)then
1732    dtset%ixc_sigma=intarr(1)
1733    if (dtset%optdriver==RUNL_SIGMA.and.mod(dtset%gwcalctyp,10)==5) ixc_here=dtset%ixc_sigma
1734  end if
1735 
1736  ! Initialize here data related to exchange-correlation functional
1737  if (ixc_here<0) then
1738    call libxc_functionals_init(ixc_here,dtset%nspden,xc_functionals=xcfunc,xc_tb09_c=dtset%xc_tb09_c)
1739  end if
1740  call get_xclevel(ixc_here,dtset%xclevel,dtset%usefock)
1741  xc_has_kxc=has_kxc(ixc_here,xc_funcs=xcfunc)
1742  ! Meta-GGA
1743  if (ixc_here<0) then
1744    xc_is_mgga=libxc_functionals_ismgga(xc_functionals=xcfunc)
1745    xc_is_tb09=libxc_functionals_is_tb09(xc_functionals=xcfunc)
1746    xc_need_kden=xc_is_mgga  ! We shoud discriminate with Laplacian based mGGa functionals
1747  else
1748    xc_is_mgga=(ixc_here>=31.and.ixc_here<=35)
1749    xc_is_tb09=.false.
1750    xc_need_kden=(ixc_here==31.or.ixc_here==34.or.ixc_here==35)
1751  end if
1752  ! Hybrids
1753  if (dtset%usefock==1) then
1754    if(ixc_here==40.or.ixc_here==41.or.ixc_here==42) then
1755      dtset%hyb_mixing_sr=zero
1756      dtset%hyb_range_dft=zero ; dtset%hyb_range_fock=zero
1757      if(ixc_here==40)dtset%hyb_mixing=one
1758      if(ixc_here==41)dtset%hyb_mixing=quarter
1759      if(ixc_here==42)dtset%hyb_mixing=third
1760    else if(ixc_here==-427)then
1761      ! Special case of HSE03
1762      dtset%hyb_mixing=zero  ; dtset%hyb_mixing_sr=quarter
1763      dtset%hyb_range_dft=0.15_dp*two**third  ; dtset%hyb_range_fock=0.15_dp*sqrt(half)
1764    else if (ixc_here<0) then
1765      call libxc_functionals_get_hybridparams(hyb_mixing=dtset%hyb_mixing,hyb_mixing_sr=dtset%hyb_mixing_sr,&
1766        hyb_range=dtset%hyb_range_dft,xc_functionals=xcfunc)
1767      dtset%hyb_range_fock=dtset%hyb_range_dft
1768    end if
1769  end if
1770  ! Hybrids: auxilliary functional
1771  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'auxc_scal',tread,'DPR')
1772  if(tread==1) dtset%auxc_scal=dprarr(1)
1773  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'auxc_ixc',tread,'INT')
1774  if(tread==1) dtset%auxc_ixc=intarr(1)
1775  ! If the default value had been given, possibly switch on
1776  ! the auxc_ixc corresponding to ixc, if the latter is an hybrid
1777  if (dtset%auxc_ixc==0) then
1778    call get_auxc_ixc(dtset%auxc_ixc,ixc_here)
1779  end if
1780  if (ixc_here<0) then
1781    call libxc_functionals_end(xc_functionals=xcfunc)
1782  end if
1783 
1784  ! Now take care of the parameters for hybrid functionals
1785  if(dtset%usefock==1)then
1786 
1787    ! Warning: the user-defined parameters for hybrids are by convention stored as negative numbers
1788    ! This trick will allow to echo them, and only them.
1789    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_mixing',tread,'DPR')
1790    if(tread==1)then
1791      if(dprarr(1)<-tol14)then
1792        write(msg, '(a,es16.8,2a)' )&
1793        'A negative value for hyb_mixing is not allowed, while at input hyb_mixing=',dprarr(1),ch10,&
1794        'Action: modify hyb_mixing in the input file.'
1795        ABI_ERROR(msg)
1796      end if
1797      dtset%hyb_mixing=-dprarr(1) ! Note the minus sign
1798    end if
1799 
1800    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_mixing_sr',tread,'DPR')
1801    if(tread==1)then
1802      if(dprarr(1)<-tol14)then
1803        write(msg, '(a,es16.8,2a)' )&
1804        'A negative value for hyb_mixing_sr is not allowed, while at input hyb_mixing_sr=',dprarr(1),ch10,&
1805        'Action: modify hyb_mixing_sr in the input file.'
1806        ABI_ERROR(msg)
1807      end if
1808      dtset%hyb_mixing_sr=-dprarr(1) ! Note the minus sign
1809    end if
1810 
1811    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_range_dft',tread_dft,'DPR')
1812    if(tread_dft==1)then
1813      if(dprarr(1)<-tol14)then
1814        write(msg, '(a,es16.8,2a)' )&
1815        'A negative value for hyb_range_dft is not allowed, while at input hyb_range_dft=',dprarr(1),ch10,&
1816        'Action: modify hyb_range_dft in the input file.'
1817        ABI_ERROR(msg)
1818      end if
1819      dtset%hyb_range_dft=-dprarr(1) ! Note the minus sign
1820    end if
1821 
1822    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'hyb_range_fock',tread_fock,'DPR')
1823    if(tread_fock==1)then
1824      if(dprarr(1)<-tol14)then
1825        write(msg, '(a,es16.8,2a)' )&
1826        'A negative value for hyb_range_fock is not allowed, while at input hyb_range_fock=',dprarr(1),ch10,&
1827        'Action: modify hyb_range_fock in the input file.'
1828        ABI_ERROR(msg)
1829      end if
1830      dtset%hyb_range_fock=-dprarr(1) ! Note the minus sign
1831    end if
1832 
1833    if(tread_fock==1 .and. tread_dft==0)dtset%hyb_range_dft=dtset%hyb_range_fock
1834    if(tread_fock==0 .and. tread_dft==1)dtset%hyb_range_fock=dtset%hyb_range_dft
1835 
1836  end if
1837 
1838 !Note iscf has to be read after ixc, usewvl, optdriver, optforces, densfor_pred
1839  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'iscf',tread,'INT')
1840  if(tread==1) then
1841    dtset%iscf=intarr(1)
1842    if (dtset%usewvl==1) then
1843      !wvl_bigdft_comp should be 1 for iscf=0, 0 for iscf>0, except if it is set by the user
1844      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_bigdft_comp',tread,'INT')
1845      if (tread==0.and.dtset%iscf==0) dtset%wvl_bigdft_comp=1
1846      if (tread==0.and.dtset%iscf >0) dtset%wvl_bigdft_comp=0
1847    end if
1848  else if (dtset%optdriver==RUNL_GWLS) then
1849    !For GWLS, iscf=-2 is mandatory
1850    dtset%iscf=-2
1851  else if (dtset%optdriver==RUNL_RESPFN.and.dtset%iscf>=10) then
1852    !Only potential mixing available for response function
1853    dtset%iscf=dtset%iscf-10
1854  else if (dtset%optdriver==RUNL_GSTATE.and.dtset%iscf>=10.and.xc_is_tb09) then
1855    !For the TB09 xc functional, the potential mixing seems to be better
1856    dtset%iscf=dtset%iscf-10
1857    msg='Automatically switching to potential mixing (iscf<10); seems to be better for TB09 XC...'
1858    ABI_COMMENT(msg)
1859  else if (dtset%optdriver==RUNL_GSTATE.and.dtset%iscf>=10.and. &
1860 &         dtset%densfor_pred/=0.and.abs(dtset%densfor_pred)/=5) then
1861    !In case of density mixing (iscf>=10) and correction of forces (densfor_pred/=0 and 5)
1862    !  we need Kxc. If it is not available, we switch to potential mixing (iscf<10)
1863    if (.not.xc_has_kxc) then
1864      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optforces',tread,'INT')
1865      if (dtset%optforces/=0.or.intarr(1)/=0) then
1866        dtset%iscf=dtset%iscf-10
1867        msg='Automatically switching to potential mixing (iscf<10), because XC functional doesnt provide Kxc!'
1868        ABI_COMMENT(msg)
1869      end if
1870    end if
1871  end if
1872 
1873  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_acutmin',tread,'DPR')
1874  if(tread==1) dtset%vdw_df_acutmin=dprarr(1)
1875  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_aratio',tread,'DPR')
1876  if(tread==1) dtset%vdw_df_aratio=dprarr(1)
1877  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_damax',tread,'DPR')
1878  if(tread==1) dtset%vdw_df_damax=dprarr(1)
1879  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_damin',tread,'DPR')
1880  if(tread==1) dtset%vdw_df_damin=dprarr(1)
1881  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_dcut',tread,'DPR')
1882  if(tread==1) dtset%vdw_df_dcut=dprarr(1)
1883  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_dratio',tread,'DPR')
1884  if(tread==1) dtset%vdw_df_dratio=dprarr(1)
1885  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_dsoft',tread,'DPR')
1886  if(tread==1) dtset%vdw_df_dsoft=dprarr(1)
1887  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_gcut',tread,'DPR')
1888  if(tread==1) dtset%vdw_df_gcut=dprarr(1)
1889  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_ndpts',tread,'INT')
1890  if(tread==1) dtset%vdw_df_ndpts=intarr(1)
1891  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_ngpts',tread,'INT')
1892  if(tread==1) dtset%vdw_df_ngpts=intarr(1)
1893  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_nqpts',tread,'INT')
1894  if(tread==1) dtset%vdw_df_nqpts=intarr(1)
1895  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_nrpts',tread,'INT')
1896  if(tread==1) dtset%vdw_df_nrpts=intarr(1)
1897  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_nsmooth',tread,'INT')
1898  if(tread==1) dtset%vdw_df_nsmooth=intarr(1)
1899  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_phisoft',tread,'DPR')
1900  if(tread==1) dtset%vdw_df_phisoft=dprarr(1)
1901  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_qcut',tread,'DPR')
1902  if(tread==1) dtset%vdw_df_qcut=dprarr(1)
1903  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_qratio',tread,'DPR')
1904  if(tread==1) dtset%vdw_df_qratio=dprarr(1)
1905  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_rcut',tread,'DPR')
1906  if(tread==1) dtset%vdw_df_rcut=dprarr(1)
1907  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_rsoft',tread,'DPR')
1908  if(tread==1) dtset%vdw_df_rsoft=dprarr(1)
1909  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_tolerance',tread,'DPR')
1910  if(tread==1) dtset%vdw_df_tolerance=dprarr(1)
1911  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_threshold',tread,'DPR',ds_input)
1912  if(tread==1) dtset%vdw_df_threshold=dprarr(1)
1913  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_tweaks',tread,'INT')
1914  if(tread==1) dtset%vdw_df_tweaks=intarr(1)
1915  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_df_zab',tread,'DPR')
1916  if(tread==1) dtset%vdw_df_zab=dprarr(1)
1917  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_xc',tread,'INT')
1918  if(tread==1) dtset%vdw_xc=intarr(1)
1919 
1920  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'posdoppler',tread,'INT')
1921  if(tread==1) dtset%posdoppler=intarr(1)
1922 
1923  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'positron',tread,'INT')
1924  if(tread==1) dtset%positron=intarr(1)
1925 
1926  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ixcpositron',tread,'INT')
1927  if(tread==1) dtset%ixcpositron=intarr(1)
1928 
1929  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'posnstep',tread,'INT')
1930  if(tread==1) dtset%posnstep=intarr(1)
1931 
1932  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'posocc',tread,'DPR')
1933  if(tread==1) dtset%posocc=dprarr(1)
1934 
1935  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'frzfermi',tread,'INT')
1936  if(tread==1) dtset%frzfermi=intarr(1)
1937 
1938  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nqpt',tread,'INT')
1939  if(tread==1) dtset%nqpt=intarr(1)
1940 
1941  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas',tread,'INT')
1942  if(tread==1) dtset%efmas=intarr(1)
1943 
1944  if(dtset%efmas>0) then
1945    call intagm(dprarr,intarr,jdtset,marr,2*nkpt,string(1:lenstr),'efmas_bands',tread,'INT')
1946    if(tread==1) then
1947      dtset%efmas_bands(1:2,1:nkpt)=reshape(intarr(1:2*nkpt), [2,nkpt])
1948    else
1949      dtset%efmas_bands(1,:)=1
1950      dtset%efmas_bands(2,:)=dtset%nband(:)
1951    end if
1952  end if
1953 
1954  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_deg',tread,'INT')
1955  if(tread==1) dtset%efmas_deg=intarr(1)
1956 
1957  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_deg_tol',tread,'ENE')
1958  if(tread==1) dtset%efmas_deg_tol=dprarr(1)
1959 
1960  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_dim',tread,'INT')
1961  if(tread==1) dtset%efmas_dim=intarr(1)
1962 
1963  if(dtset%efmas_calc_dirs/=0 .and. dtset%efmas_n_dirs>0) then
1964    ndim=2+MERGE(1,0,ABS(dtset%efmas_calc_dirs)<3)
1965    call intagm(dprarr,intarr,jdtset,marr,ndim*dtset%efmas_n_dirs,string(1:lenstr),'efmas_dirs',tread,'DPR')
1966    if(tread==1) then
1967      dtset%efmas_dirs(1:ndim,1:dtset%efmas_n_dirs)=reshape(dprarr(1:ndim*dtset%efmas_n_dirs),(/ndim,dtset%efmas_n_dirs/))
1968    end if
1969  end if
1970 
1971  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'efmas_ntheta',tread,'INT')
1972  if(tread==1) dtset%efmas_ntheta=intarr(1)
1973 
1974  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ieig2rf',tread,'INT')
1975  if(tread==1) dtset%ieig2rf=intarr(1)
1976 
1977  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'smdelta',tread,'INT')
1978  if(tread==1) dtset%smdelta=intarr(1)
1979 
1980  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bdeigrf',tread,'INT')
1981  if(tread==1) dtset%bdeigrf=intarr(1)
1982 
1983  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'restartxf',tread,'INT')
1984  if(tread==1) dtset%restartxf=intarr(1)
1985 
1986  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optcell',tread,'INT')
1987  if(tread==1) dtset%optcell=intarr(1)
1988 
1989  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdwfq',tread,'INT')
1990  if(tread==1) dtset%irdwfq=intarr(1)
1991 
1992  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ird1den',tread,'INT')
1993  if(tread==1) dtset%ird1den=intarr(1)
1994 
1995  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ird1wf',tread,'INT')
1996  if(tread==1) dtset%ird1wf=intarr(1)
1997 
1998  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdddk',tread,'INT')
1999  if(tread==1) dtset%irdddk=intarr(1)
2000 
2001  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kptopt',tread,'INT')
2002  if(tread==1) dtset%kptopt=intarr(1)
2003 
2004  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'chkexit',tread,'INT')
2005  if(tread==1) dtset%chkexit=intarr(1)
2006 
2007  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbdblock',tread,'INT')
2008  if(tread==1) dtset%nbdblock=intarr(1)
2009 
2010  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbdbuf',tread,'INT')
2011  if(tread==1)then
2012    dtset%nbdbuf=intarr(1)
2013    ! A negative value is interpreted as percentage of nband
2014    if (dtset%nbdbuf < 0) then
2015      if (dtset%nbdbuf/=-101) then
2016        ABI_CHECK(abs(dtset%nbdbuf) < 100, "abs(nbdbuf) should be < 100")
2017        dtset%nbdbuf = max(nint(abs(dtset%nbdbuf) / 100.0_dp * maxval(dtset%nband)), 1)
2018      else
2019        ABI_CHECK(response==0,'nbdbuf=-101 is not implemented for DFPT')
2020      end if
2021    end if
2022  else
2023    if(response/=1 .and. dtset%iscf<0) then
2024      dtset%nbdbuf=2*dtset%nspinor
2025      write(msg, "(5a)") &
2026         "nbdbuf is not specified in input, using `nbdbuf = 2*nspinor` that may be too small!", ch10, &
2027         "As a consequence, the NSCF cycle may have problems to converge the last bands within nstep iterations.", ch10, &
2028         "To avoid this problem specify nbdbuf in the input file and adjust nband accordingly."
2029      ABI_WARNING(msg)
2030    end if
2031    if(response==1 .and. 3<=occopt .and. occopt<=8 )dtset%nbdbuf=2*dtset%nspinor
2032  end if
2033 
2034  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'localrdwf',tread,'INT')
2035  if(tread==1) dtset%localrdwf=intarr(1)
2036 
2037  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'magconon',tread,'INT')
2038  if(tread==1) dtset%magconon=intarr(1)
2039 
2040  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'magcon_lambda',tread,'DPR')
2041  if(tread==1) dtset%magcon_lambda=dprarr(1)
2042 
2043  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ratsm',tread,'DPR')
2044  if(tread==1) dtset%ratsm=dprarr(1)
2045 
2046  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optforces',tread,'INT')
2047  if(tread==1) then
2048    dtset%optforces=intarr(1)
2049  else if (xc_is_tb09) then
2050    dtset%optforces=0
2051    write(msg, '(9a)' ) &
2052 &      'When the selected XC functional is Tran-Blaha 2009 functional (modified Becke-Johnson),',ch10,&
2053 &        'which is a potential-only functional, calculations cannot be self-consistent',ch10,&
2054 &        'with respect to the total energy.',ch10, &
2055 &        'For that reason, neither forces nor stresses can be computed.',ch10,&
2056 &        'optforces and optstress are automatically set to 0.'
2057    ABI_COMMENT(msg)
2058  end if
2059 
2060  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optstress',tread,'INT')
2061  if(tread==1) then
2062    dtset%optstress=intarr(1)
2063  else if (xc_is_mgga.or.xc_is_tb09) then
2064    dtset%optstress=0  ! This is temporary, hopefully
2065  end if
2066 
2067  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'optnlxccc',tread,'INT')
2068  if(tread==1) dtset%optnlxccc=intarr(1)
2069 
2070  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nberry',tread,'INT')
2071  if(tread==1) dtset%nberry=intarr(1)
2072 
2073  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nc_xccc_gspace',tread,'INT')
2074  if(tread==1) dtset%nc_xccc_gspace=intarr(1)
2075 
2076  call intagm(dprarr,intarr,jdtset,marr,2*nsppol,string(1:lenstr),'bdberry',tread,'INT')
2077  if(tread==1) then
2078    dtset%bdberry(1)=intarr(1); dtset%bdberry(2)=intarr(2)
2079    if(nsppol==2)then
2080      dtset%bdberry(3)=intarr(3); dtset%bdberry(4)=intarr(4)
2081    end if
2082  end if
2083 
2084  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'berrystep',tread,'INT')
2085  if(tread==1) dtset%berrystep=intarr(1)
2086 
2087  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'delayperm',tread,'INT')
2088  if(tread==1) dtset%delayperm=intarr(1)
2089 
2090  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'signperm',tread,'INT')
2091  if(tread==1) dtset%signperm=intarr(1)
2092 
2093  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbandkss',tread,'INT')
2094  if(tread==1) dtset%nbandkss=intarr(1)
2095 !This overloading of usepawu should be replaced by something cleaner ...
2096 ! if ( dtset%usedmft > 0  .and. (dtset%nbandkss==0.or.dtset%iscf<0)) then
2097 !   if (dtset%usepawu==4.or.dtset%usepawu==14)  dtset%usepawu=14
2098 !   if (dtset%usepawu/=4.and.dtset%usepawu/=14) dtset%usepawu=10
2099 ! end if
2100 
2101  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'npwkss',tread,'INT')
2102  if(tread==1) dtset%npwkss=intarr(1)
2103 
2104  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'kssform',tread,'INT')
2105  if(tread==1) dtset%kssform=intarr(1)
2106 
2107  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_mexcit',tread,'INT')
2108  if(tread==1) dtset%td_mexcit=intarr(1)
2109 
2110  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_exp_order',tread,'INT')
2111  if(tread==1) dtset%td_exp_order=intarr(1)
2112 
2113  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_scnmax',tread,'INT')
2114  if(tread==1) dtset%td_scnmax=intarr(1)
2115 
2116  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_prtstr',tread,'INT')
2117  if(tread==1) dtset%td_prtstr=intarr(1)
2118 
2119  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_restart',tread,'INT')
2120  if(tread==1) dtset%td_restart=intarr(1)
2121 
2122  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_propagator',tread,'INT')
2123  if(tread==1) dtset%td_propagator=intarr(1)
2124 
2125  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_scthr',tread,'DPR')
2126  if(tread==1) dtset%td_scthr=dprarr(1)
2127 
2128  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'npvel',tread,'INT')
2129  if(tread==1) dtset%npvel=intarr(1)
2130 
2131  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'npulayit',tread,'INT')
2132  if(tread==1) dtset%npulayit=intarr(1)
2133 
2134  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diismemory',tread,'INT')
2135  if(tread==1) dtset%diismemory=intarr(1)
2136 
2137  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dipquad',tread,'INT')
2138  if(tread==1) dtset%dipquad=intarr(1)
2139 
2140  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'goprecon',tread,'INT')
2141  if(tread==1) dtset%goprecon=intarr(1)
2142 
2143  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'goprecprm',tread,'DPR')
2144  if(tread==1) dtset%goprecprm(1:3)=dprarr(1:3)
2145 
2146  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gstore_cplex', tread, 'INT')
2147  if (tread == 1) dtset%gstore_cplex = intarr(1)
2148 
2149  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gstore_with_vk', tread, 'INT')
2150  if (tread == 1) dtset%gstore_with_vk = intarr(1)
2151 
2152  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gstore_kzone', tread, 'KEY', key_value=key_value)
2153  if (tread == 1) dtset%gstore_kzone = tolower(key_value)
2154 
2155  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gstore_qzone', tread, 'KEY', key_value=key_value)
2156  if (tread == 1) dtset%gstore_qzone = tolower(key_value)
2157 
2158  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'gstore_kfilter', tread_kfilter, 'KEY', key_value=key_value)
2159  if (tread_kfilter == 1) dtset%gstore_kfilter = tolower(key_value)
2160 
2161  narr = 2 * nsppol
2162  call intagm(dprarr, intarr, jdtset, marr, narr, string(1:lenstr), 'gstore_brange', tread_brange, 'INT')
2163  if (tread_brange == 1) then
2164    if (nsppol == 1) dtset%gstore_brange(:, 1) = intarr(1:narr)
2165    if (nsppol == 2) dtset%gstore_brange = reshape(intarr(1:narr), [2, nsppol])
2166  end if
2167 
2168  narr = 2 * nsppol
2169  call intagm(dprarr, intarr, jdtset, marr, narr, string(1:lenstr), 'gstore_erange', tread_erange, 'ENE')
2170  if (tread_erange == 1) then
2171    if (nsppol == 1) dtset%gstore_erange(:, 1) = dprarr(1:narr)
2172    if (nsppol == 2) dtset%gstore_erange = reshape(dprarr(1:narr), [2, nsppol])
2173  end if
2174 
2175  if (tread_erange == 1 .and. tread_brange == 1) then
2176    ABI_ERROR("gstore_erange and gstore_brange are mutually exclusive!")
2177  end if
2178 
2179  if (tread_erange == 1 .and. tread_kfilter == 1) then
2180    ABI_ERROR("gstore_erange and gstore_kfilter are mutually exclusive!")
2181  end if
2182 
2183  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'lambsig',tread,'DPR')
2184  if(tread==1) dtset%lambsig(1:ntypat)=dprarr(1:ntypat)
2185 
2186  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nwfshist',tread,'INT')
2187  if(tread==1) dtset%nwfshist=intarr(1)
2188 
2189  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'nscforder', tread, 'INT')
2190  if (tread == 1) dtset%nscforder = intarr(1)
2191 
2192  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nomegasrd',tread,'INT')
2193  if(tread==1) dtset%nomegasrd=intarr(1)
2194 
2195  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'corecs',tread,'DPR')
2196  if(tread==1)then
2197    dtset%corecs(1:ntypat)=dprarr(1:ntypat)
2198  end if
2199 
2200  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'ptcharge',tread,'DPR')
2201  if(tread==1)then
2202    dtset%ptcharge(1:ntypat)=dprarr(1:ntypat)
2203  end if
2204 
2205  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'quadmom',tread,'DPR')
2206  if(tread==1)then
2207    dtset%quadmom(1:ntypat)=dprarr(1:ntypat)
2208  end if
2209 
2210  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawcpxocc',tread,'INT')
2211  if(tread==1) then
2212    dtset%pawcpxocc=intarr(1)
2213  else if (dtset%nspinor==2.and.(dtset%usepawu/=0.or.dtset%usedmft>0)) then
2214    dtset%pawcpxocc=2
2215  else if (dtset%pawspnorb>0.and.(dtset%kptopt<=0.or.dtset%kptopt>=3)) then
2216    if (dtset%optdriver/=RUNL_GSTATE.or.dtset%ionmov<6.or.dtset%iscf<10) dtset%pawcpxocc=2
2217  end if
2218 
2219  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawcross',tread,'INT')
2220  if(tread==1) dtset%pawcross=intarr(1)
2221 
2222  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawecutdg',tread,'ENE')
2223  if(tread==1) then
2224    dtset%pawecutdg=dprarr(1)
2225  else if (dtset%accuracy==1.or.dtset%accuracy==2) then
2226    dtset%pawecutdg=dtset%ecut
2227  else if (dtset%accuracy==3.) then
2228    dtset%pawecutdg=1.2_dp*dtset%ecut
2229  else if (dtset%accuracy==4) then
2230    dtset%pawecutdg=1.5_dp*dtset%ecut
2231  else if (dtset%accuracy==5.or.dtset%accuracy==6) then
2232    dtset%pawecutdg=two*dtset%ecut
2233 ! NOT YET ACTIVATED
2234 ! else if (dtset%accuracy==0.and.usepaw==1.and.dtset%usewvl==0) then
2235 !  dtset%pawecutdg=1.5_dp*dtset%ecut
2236  end if
2237  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawlcutd',tread,'INT')
2238  if(tread==1) dtset%pawlcutd=intarr(1)
2239 
2240  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawlmix',tread,'INT')
2241  if(tread==1) dtset%pawlmix=intarr(1)
2242 
2243  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawmixdg',tread,'INT')
2244  if(tread==1) then
2245    dtset%pawmixdg=intarr(1)
2246  else if (dtset%npfft>1.and.usepaw==1) then
2247    dtset%pawmixdg=1
2248  else if (dtset%usewvl==1.and.usepaw==1) then
2249    dtset%pawmixdg=1
2250  end if
2251 
2252  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawnhatxc',tread,'INT')
2253  if(tread==1) dtset%pawnhatxc=intarr(1)
2254 
2255  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawntheta',tread,'INT')
2256  if(tread==1) dtset%pawntheta=intarr(1)
2257 
2258  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawnphi',tread,'INT')
2259  if(tread==1) dtset%pawnphi=intarr(1)
2260 
2261  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawnzlm',tread,'INT')
2262  if(tread==1) dtset%pawnzlm=intarr(1)
2263 
2264  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawoptmix',tread,'INT')
2265  if(tread==1) then
2266    dtset%pawoptmix=intarr(1)
2267  else
2268    if (usepaw==1.and.dtset%iscf<10.and.(dtset%positron==1.or.dtset%positron<0)) dtset%pawoptmix=1
2269  end if
2270 
2271  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawoptosc',tread,'INT')
2272  if(tread==1) dtset%pawoptosc=intarr(1)
2273 
2274  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawovlp',tread,'DPR')
2275  if(tread==1) dtset%pawovlp=dprarr(1)
2276 
2277  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprtdos',tread,'INT')
2278  if(tread==1) dtset%pawprtdos=intarr(1)
2279 
2280  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprtvol',tread,'INT')
2281  if(tread==1) dtset%pawprtvol=intarr(1)
2282 
2283  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprtwf',tread,'INT')
2284  if(tread==1) dtset%pawprtwf=intarr(1)
2285 
2286  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprt_k',tread,'INT')
2287  if(tread==1) dtset%pawprt_k=intarr(1)
2288 
2289  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawprt_b',tread,'INT')
2290  if(tread==1) dtset%pawprt_b=intarr(1)
2291 
2292  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawstgylm',tread,'INT')
2293  if(tread==1) dtset%pawstgylm=intarr(1)
2294 
2295  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawsushat',tread,'INT')
2296  if(tread==1) dtset%pawsushat=intarr(1)
2297 
2298  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawusecp',tread,'INT')
2299  if(tread==1) dtset%pawusecp=intarr(1)
2300 
2301  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawxcdev',tread,'INT')
2302  if(tread==1) then
2303    dtset%pawxcdev=intarr(1)
2304  else if (usepaw==1.and.xc_is_mgga) then
2305    dtset%pawxcdev=0
2306  end if
2307 
2308  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'spnorbscl',tread,'DPR')
2309  if(tread==1) dtset%spnorbscl=dprarr(1)
2310 
2311  if (dtset%usedmft>0) then
2312    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_dc',tread,'INT')
2313    if(tread==1) dtset%dmft_dc=intarr(1)
2314 ! XG20220322 - Should not impose dmft_dc on the flight. Should check in m_chkinp, and possibly stop.
2315 !  if (dtset%usepawu==14.and.dtset%dmft_dc/=5.and.dtset%dmft_dc/=6) then
2316 !    write(msg, '(a,a,a)' )&
2317 !     'usepawu == 4 and usedmft == 1, dmft_dc should be equal to 5 or 6 ',ch10,&
2318 !     'imposing dmft_dc = 5'
2319 !    ABI_WARNING(msg)
2320 !    dtset%dmft_dc=5
2321 !  end if
2322    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_iter',tread,'INT')
2323    if(tread==1) dtset%dmft_iter=intarr(1)
2324    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_kspectralfunc',tread,'INT')
2325    if(tread==1) dtset%dmft_kspectralfunc=intarr(1)
2326    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_mxsf',tread,'DPR')
2327    if(tread==1) dtset%dmft_mxsf=dprarr(1)
2328    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_nwli',tread,'INT')
2329    if(tread==1) dtset%dmft_nwli=intarr(1)
2330    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_nwlo',tread,'INT')
2331    if(tread==1) dtset%dmft_nwlo=intarr(1)
2332    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_occnd_imag',tread,'INT')
2333    if(tread==1) dtset%dmft_occnd_imag=intarr(1)
2334    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_read_occnd',tread,'INT')
2335    if(tread==1) dtset%dmft_read_occnd=intarr(1)
2336    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_rslf',tread,'INT')
2337    if(tread==1) dtset%dmft_rslf=intarr(1)
2338    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_solv',tread,'INT')
2339    if(tread==1) dtset%dmft_solv=intarr(1)
2340    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_t2g',tread,'INT')
2341    if(tread==1) dtset%dmft_t2g=intarr(1)
2342 
2343    natomcor=0
2344    do iatom=1,dtset%natom
2345      if(dtset%lpawu(dtset%typat(iatom))>0) natomcor=natomcor+1
2346    enddo
2347    if(natomcor>1) dtset%dmft_wanorthnorm=2
2348    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_wanorthnorm',tread,'INT')
2349    if(tread==1) dtset%dmft_wanorthnorm=intarr(1)
2350 
2351 !  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_x2my2d',tread,'INT')
2352 !  if(tread==1) dtset%dmft_x2my2d=intarr(1)
2353    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_tolfreq',tread,'DPR')
2354    if(tread==1) dtset%dmft_tolfreq=dprarr(1)
2355    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_tollc',tread,'DPR')
2356    if(tread==1) dtset%dmft_tollc=dprarr(1)
2357    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_charge_prec',tread,'DPR')
2358    if(tread==1) dtset%dmft_charge_prec=dprarr(1)
2359    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftbandi',tread,'INT')
2360    if(tread==1) dtset%dmftbandi=intarr(1)
2361    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftbandf',tread,'INT')
2362    if(tread==1) dtset%dmftbandf=intarr(1)
2363    if((dtset%dmftbandf-dtset%dmftbandi+1)<2*maxval(dtset%lpawu(:))+1.and.&
2364 !     ((dtset%dmft_t2g==0).and.(dtset%dmft_x2my2d==0))) then
2365       (dtset%dmft_t2g==0) ) then
2366      write(msg, '(4a,i2,2a)' )&
2367      '   dmftbandf-dmftbandi+1)<2*max(lpawu(:))+1)',ch10, &
2368      '   Number of bands to construct Wannier functions is not', &
2369      ' sufficient to build Wannier functions for l=',maxval(dtset%lpawu(:)),ch10, &
2370      '   Action: select a correct number of KS bands with dmftbandi and dmftbandf.'
2371      ABI_ERROR(msg)
2372    end if
2373 
2374    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftcheck',tread,'INT')
2375    if(tread==1) dtset%dmftcheck=intarr(1)
2376    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_entropy',tread,'INT')
2377    if(tread==1) dtset%dmft_entropy=intarr(1)
2378    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_nlambda',tread,'INT')
2379    if(tread==1) dtset%dmft_nlambda=intarr(1)
2380 
2381    if(dtset%dmft_solv>=5) then
2382 
2383      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_n',tread,'DPR')
2384      if(tread==1) dtset%dmftqmc_n=dprarr(1)
2385      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_l',tread,'INT')
2386      if(tread==1) dtset%dmftqmc_l=intarr(1)
2387      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_seed',tread,'INT')
2388      if(tread==1) dtset%dmftqmc_seed=intarr(1)
2389      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftqmc_therm',tread,'INT')
2390      if(tread==1) dtset%dmftqmc_therm=intarr(1)
2391      if(dtset%dmft_solv==5.or.dtset%dmft_solv==8.or.dtset%dmft_solv==9) then
2392     ! if(dtset%dmft_solv==5) then
2393        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_basis',tread,'INT')
2394        if(tread==1) dtset%dmftctqmc_basis  =intarr(1)
2395        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_check',tread,'INT')
2396        if(tread==1) dtset%dmftctqmc_check  =intarr(1)
2397        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_correl',tread,'INT')
2398        if(tread==1) dtset%dmftctqmc_correl =intarr(1)
2399        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_gmove',tread,'INT')
2400        if(tread==1) dtset%dmftctqmc_gmove  =intarr(1)
2401        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_grnns',tread,'INT')
2402        if(tread==1) dtset%dmftctqmc_grnns  =intarr(1)
2403        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_config',tread,'INT')
2404        if(tread==1) dtset%dmftctqmc_config  =intarr(1)
2405        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_meas',tread,'INT')
2406        if(tread==1) dtset%dmftctqmc_meas   =intarr(1)
2407        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_mrka',tread,'INT')
2408        if(tread==1) dtset%dmftctqmc_mrka   =intarr(1)
2409        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_mov',tread,'INT')
2410        if(tread==1) dtset%dmftctqmc_mov    =intarr(1)
2411        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_order',tread,'INT')
2412        if(tread==1) dtset%dmftctqmc_order  =intarr(1)
2413      end if
2414      if(dtset%dmft_solv>=6.and.dtset%dmft_solv<=7) then
2415        call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmftctqmc_triqs_nleg',tread,'INT')
2416        if(tread==1) dtset%dmftctqmc_triqs_nleg  =intarr(1)
2417      end if
2418    end if
2419  end if
2420 
2421  if (dtset%usepawu/=0.or.dtset%usedmft>0) then
2422    call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'f4of2_sla',tread,'ENE')
2423    if(tread==1) dtset%f4of2_sla(1:ntypat)=dprarr(1:ntypat)
2424    call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'f6of2_sla',tread,'ENE')
2425    if(tread==1) dtset%f6of2_sla(1:ntypat)=dprarr(1:ntypat)
2426  end if
2427  if (dtset%usepawu>0.or.dtset%usedmft>0) then
2428    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmatpuopt',tread,'INT')
2429    if(tread==1) dtset%dmatpuopt=intarr(1)
2430    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmatudiag',tread,'INT')
2431    if(tread==1) dtset%dmatudiag=intarr(1)
2432  end if
2433 
2434  if (dtset%macro_uj>0) then
2435    dtset%pawujat=minval(pack((/ (ii,ii=1,dtset%natom) /) ,dtset%lpawu(dtset%typat(:))>0))
2436    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawujat',tread,'INT')
2437    if(tread==1) dtset%pawujat=intarr(1)
2438 
2439    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawujrad',tread,'LEN')
2440    if(tread==1) dtset%pawujrad=dprarr(1)
2441 
2442    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawujv',tread,'ENE')
2443    if(tread==1) dtset%pawujv=dprarr(1)
2444  end if
2445 
2446  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'pawfatbnd',tread,'INT')
2447  if(tread==1) dtset%pawfatbnd=intarr(1)
2448 
2449  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'bxctmindg',tread,'DPR')
2450  if(tread==1) then
2451    dtset%bxctmindg=dprarr(1)
2452  else if(usepaw==1.and.dtset%accuracy==0)then
2453    dtset%bxctmindg=dtset%boxcutmin
2454  end if
2455 
2456  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'usexcnhat',tread,'INT')
2457  if(tread==1) dtset%usexcnhat_orig=intarr(1)
2458 
2459  ! gemm_nonlop (must read it before useylm)
2460  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'use_gemm_nonlop',tread,'INT')
2461  if(tread==1) dtset%use_gemm_nonlop=intarr(1)
2462 
2463  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'useylm',tread,'INT')
2464  if(tread==1) dtset%useylm=intarr(1)
2465 
2466  ! Here we set useylm automatically to 1
2467  if (dtset%use_gemm_nonlop == 1) dtset%useylm = 1
2468  if (usepaw==1) dtset%useylm=1
2469  if (usepaw==1 .and. dtset%usewvl==1) dtset%useylm=0
2470  if (dtset%efmas==1 .or. dtset%rf2_dkdk/=0 .or. dtset%rf2_dkde/=0) dtset%useylm=1
2471  if (dtset%gpu_option /= ABI_GPU_DISABLED .and. dtset%optdriver /= RUNL_GWR) dtset%useylm=1
2472  if(dtset%tfkinfunc==2 .and. dtset%usewvl==0 ) then
2473    dtset%useylm=1
2474    dtset%userec=1
2475  end if
2476 
2477  ionmov=dtset%ionmov ; densfor_pred=dtset%densfor_pred ; iscf=dtset%iscf ; nqpt=dtset%nqpt
2478  kptopt=dtset%kptopt; nberry=dtset%nberry ; berryopt=dtset%berryopt
2479 
2480  ! Dielectric real(dp) input variables
2481  ! Reading of diemix/diemixmag must be inserted after iprcel
2482  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diecut',tread,'ENE')
2483  if(tread==1) dtset%diecut=dprarr(1)
2484  ! Special treatment if iscf==-1
2485  if(iscf==-1) dtset%diecut=four*dtset%ecut
2486  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dielng',tread,'LEN')
2487  if(tread==1) dtset%dielng=dprarr(1)
2488  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diemac',tread,'DPR')
2489  if(tread==1) dtset%diemac=dprarr(1)
2490 
2491  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diemix',tread,'DPR')
2492  if(tread==1) then
2493    dtset%diemix=dprarr(1)
2494  else
2495    if (mod(dtset%iprcel,100)>19) dtset%diemix=one
2496  end if
2497 
2498  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diemixmag',tread,'DPR')
2499  if(tread==1) then
2500    dtset%diemixmag=dprarr(1)
2501  else
2502    if (dtset%iscf<10.or.dtset%nspden==1.or.dtset%iprcel==0.or.(dtset%iprcel>70.and.dtset%iprcel<80)) then
2503      dtset%diemixmag=dtset%diemix
2504    else
2505      dtset%diemixmag=-dtset%diemix
2506    end if
2507  end if
2508 
2509  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'diegap',tread,'ENE')
2510  if(tread==1) dtset%diegap=dprarr(1)
2511 
2512  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dielam',tread,'DPR')
2513  if(tread==1) dtset%dielam=dprarr(1)
2514 
2515  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'maxestep',tread,'DPR')
2516  if(tread==1) dtset%maxestep=dprarr(1)
2517 
2518  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'td_maxene',tread,'DPR')
2519  if(tread==1) dtset%td_maxene=dprarr(1)
2520 
2521  if((iscf==5.or.iscf==6) .and. ionmov==4 .and. densfor_pred/=3 )then
2522    densfor_pred=3
2523    dtset%densfor_pred=densfor_pred
2524    write(msg, '(3a)' )&
2525    'When ionmov is [4, 5, 6], densfor_pred must be 3.',ch10,&
2526    'Set densfor_pred to 3.'
2527    ABI_COMMENT(msg)
2528  end if
2529 
2530  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'mffmem',tread,'INT')
2531  if(tread==1) dtset%mffmem=intarr(1)
2532 
2533  ! Set default values of 0 for occupation numbers and k pt wts
2534  bantot = 0
2535  ! nkpt and nband must be defined to execute following loop
2536  if ( tnband == 1 ) then
2537    do ikpt=1,nkpt*nsppol
2538      do ii=1,dtset%nband(ikpt)
2539        bantot=bantot+1
2540        dtset%occ_orig(bantot,:)=zero
2541      end do
2542    end do
2543  end if
2544 
2545  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nloc_alg',tread,'INT')
2546  if(tread==1) dtset%nloalg(1)=intarr(1)
2547 
2548  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nloc_mem',tread,'INT')
2549  if(tread==1) then
2550    dtset%nloalg(2)=1 ; if(intarr(1)<0)dtset%nloalg(2)=-1
2551    dtset%nloalg(3)=abs(intarr(1))-1
2552  end if
2553 
2554  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'cprj_update_lvl',tread,'INT')
2555  if(tread==1) dtset%cprj_update_lvl=intarr(1)
2556 
2557  ! LOOP variables
2558  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nline',tread,'INT')
2559  if(tread==1) dtset%nline=intarr(1)
2560 
2561  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nblock_lobpcg',tread,'INT')
2562  if(tread==1) dtset%nblock_lobpcg=intarr(1)
2563 
2564  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nnsclo',tread,'INT')
2565  if(tread==1) dtset%nnsclo=intarr(1)
2566 
2567  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nnsclohf',tread,'INT')
2568  if(tread==1) dtset%nnsclohf=intarr(1)
2569 
2570  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nstep',tread,'INT')
2571  if(tread==1) dtset%nstep=intarr(1)
2572 
2573  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ntime',tread,'INT')
2574  if(tread==1) dtset%ntime=intarr(1)
2575 
2576  if (tread == 0) then
2577    ! if ntime is not given but ionmov > 0 and imgmv is != 0, use a reasonable number of iterations!
2578    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ionmov',tread,'INT')
2579    if (tread == 1 .and. intarr(1) /= 0 .and. dtset%imgmov == 0) then
2580      dtset%ntime = 1000
2581      ABI_COMMENT("Found ionmov /= 0 without ntime in the input. ntime has been set automatically to 1000")
2582    end if
2583  end if
2584 
2585  if (ionmov == 28) then
2586    ! i-pi driver mode: check whether initial geometry from server agrees with input file")
2587    !dtset%ntime = 10000
2588    image = 1
2589    call ipi_check_initial_consistency(natom, dtset%rprimd_orig(:,:,image), dtset%xred_orig(:,:,image), ierr)
2590    ABI_CHECK(ierr == 0, "Initial structure sent by i-pi server does not match the one read from file! See messages above")
2591  end if
2592 
2593  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nctime',tread,'INT')
2594  if(tread==1) dtset%nctime=intarr(1)
2595 
2596  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nucefg',tread,'INT')
2597  if(tread==1) dtset%nucefg=intarr(1)
2598 
2599  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nucfc',tread,'INT')
2600  if(tread==1) dtset%nucfc=intarr(1)
2601 
2602  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'orbmag',tread,'INT')
2603  if(tread==1) dtset%orbmag=intarr(1)
2604 
2605  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prt_lorbmag',tread,'INT')
2606  if(tread==1) dtset%prt_lorbmag=intarr(1)
2607 
2608  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ortalg',tread,'INT')
2609  if(tread==1) then
2610    dtset%ortalg=intarr(1)
2611  else if (dtset%wfoptalg>=10 .and. dtset%ortalg>0) then
2612    dtset%ortalg=-dtset%ortalg
2613  end if
2614 
2615  ! Print variables
2616  call intagm(dprarr,intarr,jdtset,marr,natom,string(1:lenstr),'prtatlist',tread,'INT')
2617  if(tread==1) then
2618    dtset%prtatlist=intarr(1:natom)
2619    call sort_int(natom,dtset%prtatlist,intarr)
2620  end if
2621 
2622  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtbbb',tread,'INT')
2623  if(tread==1) dtset%prtbbb=intarr(1)
2624 
2625  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtbltztrp',tread,'INT')
2626  if(tread==1) dtset%prtbltztrp=intarr(1)
2627 
2628  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtcif',tread,'INT')
2629  if(tread==1) dtset%prtcif=intarr(1)
2630 
2631  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtden',tread,'INT')
2632  if(tread==1) dtset%prtden=intarr(1)
2633 
2634  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdipole',tread,'INT')
2635  if(tread==1) dtset%prtdipole=intarr(1)
2636 
2637  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdos',tread,'INT')
2638  if(tread==1) dtset%prtdos=intarr(1)
2639 
2640  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdosm',tread,'INT')
2641  if(tread==1) dtset%prtdosm=intarr(1)
2642 
2643  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtebands',tread,'INT')
2644  if(tread==1) dtset%prtebands=intarr(1)
2645 
2646  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtefmas',tread,'INT')
2647  if(tread==1) dtset%prtefmas=intarr(1)
2648 
2649  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prteig',tread,'INT')
2650  if(tread==1) dtset%prteig=intarr(1)
2651 
2652  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtelf',tread,'INT')
2653  if(tread==1) dtset%prtelf=intarr(1)
2654 
2655  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prteliash',tread,'INT')
2656  if(tread==1) dtset%prteliash=intarr(1)
2657 
2658  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtfull1wf',tread,'INT')
2659  if(tread==1) dtset%prtfull1wf=intarr(1)
2660 
2661  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtfsurf',tread,'INT')
2662  if(tread==1) dtset%prtfsurf=intarr(1)
2663 
2664  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgsr',tread,'INT')
2665  if(tread==1) dtset%prtgsr=intarr(1)
2666 
2667  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgden',tread,'INT')
2668  if(tread==1) dtset%prtgden=intarr(1)
2669 
2670  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgeo',tread,'INT')
2671  if(tread==1) dtset%prtgeo=intarr(1)
2672 
2673  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtgkk',tread,'INT')
2674  if(tread==1) dtset%prtgkk=intarr(1)
2675 
2676  ! Read usekden and set prtkden to 1 by default.
2677  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'usekden',tread,'INT')
2678  if(tread==1) then
2679    dtset%usekden=intarr(1)
2680  else
2681    dtset%usekden=merge(1,0,xc_need_kden)
2682  end if
2683  if (dtset%usekden == 1 .and. dtset%nimage == 1) dtset%prtkden = 1
2684 
2685 ! Some variables need usekden before beeing red
2686 if (dtset%usekden==1) then
2687    dtset%getkden=dtset%getden
2688    dtset%irdkden=dtset%irdden
2689    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getkden',tread,'INT')
2690    if(tread==1) dtset%getkden=intarr(1)
2691    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdkden',tread,'INT')
2692    if(tread==1) dtset%irdkden=intarr(1)
2693  end if
2694 
2695  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtkden',tread,'INT')
2696  if(tread==1) dtset%prtkden=intarr(1)
2697 
2698  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtlden',tread,'INT')
2699  if(tread==1) dtset%prtlden=intarr(1)
2700 
2701  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtnabla',tread,'INT')
2702  if(tread==1) dtset%prtnabla=intarr(1)
2703 
2704  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtnest',tread,'INT')
2705  if(tread==1) dtset%prtnest=intarr(1)
2706 
2707  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtocc',tread,'INT')
2708  if(tread==1) dtset%prtocc=intarr(1)
2709 
2710  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtphbands',tread,'INT')
2711  if(tread==1) dtset%prtphbands=intarr(1)
2712 
2713  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtphdos',tread,'INT')
2714  if(tread==1) dtset%prtphdos=intarr(1)
2715 
2716  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtphsurf',tread,'INT')
2717  if(tread==1) dtset%prtphsurf=intarr(1)
2718 
2719  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtposcar',tread,'INT')
2720  if(tread==1) dtset%prtposcar=intarr(1)
2721 
2722  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtprocar',tread,'INT')
2723  if(tread==1) dtset%prtprocar=intarr(1)
2724 
2725  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtpot',tread,'INT')
2726  if (dtset%optdriver == RUNL_RESPFN) dtset%prtpot = 1
2727  if(tread==1) dtset%prtpot=intarr(1)
2728 
2729  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtpsps',tread,'INT')
2730  if(tread==1) dtset%prtpsps=intarr(1)
2731 
2732  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtspcur',tread,'INT')
2733  if(tread==1) dtset%prtspcur=intarr(1)
2734 
2735  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtsuscep',tread,'INT')
2736  if(tread==1) dtset%prtsuscep=intarr(1)
2737 
2738  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtstm',tread,'INT')
2739  if(tread==1) dtset%prtstm=intarr(1)
2740 
2741  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prt1dm',tread,'INT')
2742  if(tread==1) dtset%prt1dm=intarr(1)
2743 
2744  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvclmb',tread,'INT')
2745  if(tread==1) dtset%prtvclmb=intarr(1)
2746 
2747  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvdw',tread,'INT')
2748  if(tread==1) dtset%prtvdw=intarr(1)
2749 
2750  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvha',tread,'INT')
2751  if(tread==1) dtset%prtvha=intarr(1)
2752 
2753  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvhxc',tread,'INT')
2754  if(tread==1) dtset%prtvhxc=intarr(1)
2755 
2756  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtkbff',tread,'INT')
2757  if(tread==1) dtset%prtkbff=intarr(1)
2758 
2759  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvol',tread,'INT')
2760  if(tread==1) dtset%prtvol=intarr(1)
2761 
2762  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvolimg',tread,'INT')
2763  if(tread==1) dtset%prtvolimg=intarr(1)
2764 
2765  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvpsp',tread,'INT')
2766  if(tread==1) dtset%prtvpsp=intarr(1)
2767 
2768  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtvxc',tread,'INT')
2769  if(tread==1) dtset%prtvxc=intarr(1)
2770 
2771  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtwant',tread,'INT')
2772  if(tread==1) dtset%prtwant=intarr(1)
2773 
2774  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtwf',tread,'INT')
2775  if(tread==1) then
2776    dtset%prtwf=intarr(1)
2777  else if (dtset%tfkinfunc==2)then
2778    dtset%prtwf=0
2779  endif
2780 
2781  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtwf_full',tread,'INT')
2782  if (tread==1) dtset%prtwf_full=intarr(1)
2783 
2784  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtxml',tread,'INT')
2785  if(tread==1) dtset%prtxml=intarr(1)
2786 
2787  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ratsph_extra',tread,'DPR')
2788  if(tread==1) dtset%ratsph_extra=dprarr(1)
2789 
2790  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'qprtrb',tread,'INT')
2791  if(tread==1) dtset%qprtrb(:)=intarr(1:3)
2792 
2793  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'strprecon',tread,'DPR')
2794  if(tread==1) dtset%strprecon=dprarr(1)
2795 
2796  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tim1rev',tread,'INT')
2797  if (tread==1) dtset%tim1rev=intarr(1)
2798 
2799  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'xc_denpos',tread,'DPR')
2800  if(tread==1) dtset%xc_denpos=dprarr(1)
2801 
2802  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'xc_taupos',tread,'DPR')
2803  if(tread==1) then
2804    dtset%xc_taupos=dprarr(1)
2805  else
2806    dtset%xc_taupos=dtset%xc_denpos
2807  end if
2808 
2809  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'xc_tb09_c',tread,'DPR')
2810  if(tread==1) dtset%xc_tb09_c=dprarr(1)
2811 
2812  call intagm(dprarr,intarr,jdtset,marr,3*dtset%natsph_extra,string(1:lenstr),'xredsph_extra',tread,'DPR')
2813  if(tread==1) dtset%xredsph_extra=reshape(dprarr(1:3*dtset%natsph_extra), (/3,dtset%natsph_extra/))
2814 
2815  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wfinit',tread,'INT')
2816  if(tread==1) dtset%wfinit=intarr(1)
2817 
2818  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wfmix',tread,'DPR')
2819  if(tread==1) dtset%wfmix=dprarr(1)
2820 
2821  ! WVL - Wavelets related values
2822  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_hgrid',tread,'DPR')
2823  if(tread==1) dtset%wvl_hgrid=dprarr(1)
2824 
2825  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_crmult',tread,'DPR')
2826  if(tread==1) dtset%wvl_crmult=dprarr(1)
2827 
2828  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_frmult',tread,'DPR')
2829  if(tread==1) dtset%wvl_frmult=dprarr(1)
2830 
2831  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'wvl_ngauss',tread,'INT')
2832  if(tread==1) dtset%wvl_ngauss(1:2)=intarr(1:2)
2833 
2834  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'wvl_nprccg',tread,'INT')
2835  if(tread==1) dtset%wvl_nprccg=intarr(1)
2836 
2837  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tl_nprccg',tread,'INT')
2838  if(tread==1) dtset%tl_nprccg=intarr(1)
2839 
2840  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tl_radius',tread,'DPR')
2841  if(tread==1) dtset%tl_radius=dprarr(1)
2842 
2843  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'write_files',tread,'KEY', key_value=key_value)
2844  if(tread==1) dtset%write_files = key_value
2845 ! Print variables
2846  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'write_files',tread,'KEY', key_value=key_value)
2847  if(tread==1) dtset%write_files = key_value
2848  if(dtset%write_files=='default') then
2849   !!!EMPTY ON PURPOSE
2850  else if(dtset%write_files=='all') then
2851    dtset%ncout      = 1 !Already the default but good to keep track
2852    dtset%prtddb     = 1
2853    dtset%prtden     = 1
2854    !dtset%prtdos     = 1
2855    dtset%prtebands  = 1 !DEFAULT in all set to xgr
2856    dtset%prteig     = 1
2857    dtset%prtelf     = 1 ! TO BE CHECKED FOR CONSISTENCY
2858    dtset%prtevk     = 1  ! TO BE CHECKED FOR CONSISTENCY
2859    !dtset%prtfsurf   = 1  ! TO BE CHECKED FOR CONSISTENCY
2860    !dtset%prtgden    = 1  ! TO BE CHECKED FOR CONSISTENCY
2861    dtset%prtgeo     = 1
2862    dtset%prtgkk     = 1
2863    dtset%prtgsr     = 1
2864    dtset%prthist    = 1
2865    dtset%prtkbff    = 1
2866    !dtset%prtkden    = 1  ! TO BE CHECKED FOR CONSISTENCY
2867    dtset%prtlden    = 1  ! TO BE CHECKED FOR CONSISTENCY
2868    dtset%prtpot     = 1
2869    !dtset%prtpsps    = 1  ! TO BE CHECKED FOR CONSISTENCY
2870    !dtset%prtstm     = 1  ! TO BE CHECKED FOR CONSISTENCY
2871    dtset%prtsuscep  = 1  ! TO BE CHECKED FOR CONSISTENCY
2872    dtset%prtvclmb   = 2  ! NC default
2873    dtset%prtvha     = 1
2874    dtset%prtvhxc    = 1
2875    dtset%prtvhxc    = 1
2876    dtset%prtvpsp    = 1  ! TO BE CHECKED FOR CONSISTENCY
2877    dtset%prtvxc     = 1
2878    !dtset%prtwant    = 1   ! TO BE CHECKED FOR CONSISTENCY
2879    dtset%prtwf      = 1
2880    dtset%prtxml     = 1
2881  else if(dtset%write_files=='none') then
2882    dtset%ncout      = 0
2883    dtset%prtddb     = 0
2884    dtset%prtden     = 0
2885    dtset%prtdos     = 0
2886    dtset%prtebands  = 0
2887    dtset%prteig     = 0
2888    dtset%prtelf     = 0
2889    dtset%prtevk     = 0
2890    dtset%prtfsurf   = 0
2891    dtset%prtgden    = 0
2892    dtset%prtgeo     = 0
2893    dtset%prtgkk     = 0
2894    dtset%prtgsr     = 0
2895    dtset%prthist    = 0
2896    dtset%prtkbff    = 0
2897    dtset%prtkden    = 0
2898    dtset%prtlden    = 0
2899    dtset%prtpot     = 0
2900    dtset%prtpsps    = 0
2901    dtset%prtstm     = 0
2902    dtset%prtsuscep  = 0
2903    dtset%prtvclmb   = 0
2904    dtset%prtvha     = 0
2905    dtset%prtvhxc    = 0
2906    dtset%prtvhxc    = 0
2907    dtset%prtvpsp    = 0
2908    dtset%prtvxc     = 0
2909    dtset%prtwant    = 0
2910    dtset%prtwf      = 0
2911    dtset%prtxml     = 0
2912  !!!PLEASE ADD IN ALPHABETICAL ORDER THE FUTURE OPTIONS BELOW!!!
2913  else if (dtset%write_files.ne.'none' .or. dtset%write_files.ne.'all' .or. dtset%write_files.ne.'default' ) then
2914    if (INDEX(dtset%write_files,'ddb') .gt. 0) then
2915       dtset%prtddb = 1
2916    else
2917       dtset%prtddb = 0
2918    end if
2919    if (INDEX(dtset%write_files,'den_1') .gt. 0) then
2920       dtset%prtden = 1
2921    else if (INDEX(dtset%write_files,'den_2') .gt. 0) then
2922       dtset%prtden = 2
2923    else if (INDEX(dtset%write_files,'den_3') .gt. 0) then
2924       dtset%prtden = 3
2925    else if (INDEX(dtset%write_files,'den_4') .gt. 0) then
2926       dtset%prtden = 4
2927    else if (INDEX(dtset%write_files,'den_5') .gt. 0) then
2928       dtset%prtden = 5
2929    else if (INDEX(dtset%write_files,'den_6') .gt. 0) then
2930       dtset%prtden = 6
2931    else if (INDEX(dtset%write_files,'den_7') .gt. 0) then
2932       dtset%prtden = 7
2933    else
2934       dtset%prtden = 0
2935    end if
2936    if ( (INDEX(dtset%write_files,'dos_1') .gt. 0) .AND. (dtset%occopt .ge. 3 .AND. dtset%occopt .le. 7 ) )then
2937       dtset%prtdos = 1
2938    else if ( (INDEX(dtset%write_files,'dos_1') .gt. 0) .AND. (dtset%iscf .eq. -3 ) )then
2939       dtset%prtdos = 1
2940    else if ( INDEX(dtset%write_files,'dos_2') .gt. 0 )then
2941       dtset%prtdos = 2
2942    else if ( INDEX(dtset%write_files,'dos_3') .gt. 0 )then
2943       dtset%prtdos = 3
2944    else if ( INDEX(dtset%write_files,'dos_4') .gt. 0 )then
2945       dtset%prtdos = 4
2946    else if ( (INDEX(dtset%write_files,'dos_5') .gt. 0 ) .AND. (dtset%nspinor .eq. 2 ) )then
2947       dtset%prtdos = 5
2948    else
2949       dtset%prtdos = 0
2950    end if
2951    if ( (INDEX(dtset%write_files,'dosm_1') .gt. 0) .AND. (dtset%prtdos .eq. 3 ) )then
2952       dtset%prtdosm = 1
2953       dtset%prtdos  = 3
2954    else
2955       dtset%prtdosm = 0
2956    end if
2957    if (INDEX(dtset%write_files,'ebands_1') .gt. 0) then
2958       dtset%prtebands = 1
2959    else if (INDEX(dtset%write_files,'ebands_2') .gt. 0) then
2960       dtset%prtebands = 2
2961    else
2962       dtset%prtebands = 0
2963    end if
2964    if (INDEX(dtset%write_files,'eig') .gt. 0) then
2965       dtset%prteig = 1
2966    else
2967       dtset%prteig = 0
2968    end if
2969    if (INDEX(dtset%write_files,'elf') .gt. 0) then
2970       dtset%prtelf = 1
2971    else
2972       dtset%prtelf = 0
2973    end if
2974    if (INDEX(dtset%write_files,'evk') .gt. 0) then
2975       dtset%prtevk = 1
2976    end if
2977    if (INDEX(dtset%write_files,'fsurf') .gt. 0) then
2978       dtset%prtfsurf = 1
2979    else
2980       dtset%prtfsurf = 0
2981    end if
2982    if (INDEX(dtset%write_files,'gden') .gt. 0) then
2983       dtset%prtgden = 1
2984    else
2985       dtset%prtgden = 0
2986    end if
2987    if (INDEX(dtset%write_files,'geo') .gt. 0) then
2988       dtset%prtgeo = 1
2989    else
2990       dtset%prtgeo = 0
2991    end if
2992    if (INDEX(dtset%write_files,'gkk') .gt. 0) then
2993       dtset%prtgkk = 1
2994    else
2995       dtset%prtgkk = 0
2996    end if
2997    if (INDEX(dtset%write_files,'gsr') .gt. 0) then
2998       dtset%prtgsr = 1
2999    else
3000       dtset%prtgsr = 0
3001    end if
3002    if (INDEX(dtset%write_files,'hist') .gt. 0) then
3003       dtset%prthist = 1
3004    else
3005       dtset%prthist = 0
3006    end if
3007    if ( (INDEX(dtset%write_files,'kbff') .gt. 0) .AND. (dtset%iomode .eq. 3) )then
3008       dtset%prtkbff = 1
3009    else
3010       dtset%prtkbff = 0
3011    end if
3012    if (INDEX(dtset%write_files,'kden') .gt. 0) then
3013       dtset%prtkden = 1
3014    else
3015       dtset%prtkden = 0
3016    end if
3017    if (INDEX(dtset%write_files,'lden') .gt. 0) then
3018       dtset%prtlden = 1
3019    else
3020       dtset%prtlden = 0
3021    end if
3022    if (INDEX(dtset%write_files,'ncout') .gt. 0) then
3023       dtset%ncout = 1
3024    else
3025       dtset%ncout = 0
3026    end if
3027    if (INDEX(dtset%write_files,'pot') .gt. 0) then
3028       dtset%prtpot = 1
3029    else
3030       dtset%prtpot = 0
3031    end if
3032    if (INDEX(dtset%write_files,'psps_1') .gt. 0) then
3033       dtset%prtpsps = 1
3034    else if (INDEX(dtset%write_files,'psps_-1') .gt. 0) then
3035       dtset%prtpsps = -1
3036    else
3037       dtset%prtpsps = 0
3038    end if
3039    if (INDEX(dtset%write_files,'stm') .gt. 0) then
3040       dtset%prtstm = 1
3041    else
3042       dtset%prtstm = 0
3043    end if
3044    if (INDEX(dtset%write_files,'suscep') .gt. 0) then
3045       dtset%prtsuscep = 1
3046    else
3047       dtset%prtsuscep = 0
3048    end if
3049    if (INDEX(dtset%write_files,'vclmb_1') .gt. 0) then
3050       dtset%prtvclmb = 1
3051    else if (INDEX(dtset%write_files,'vclmb_2') .gt. 0) then
3052       dtset%prtvclmb = 2
3053    else
3054       dtset%prtvha = 0
3055    end if
3056    if (INDEX(dtset%write_files,'vha') .gt. 0) then
3057       dtset%prtvha = 1
3058    else
3059       dtset%prtvha = 0
3060    end if
3061    if (INDEX(dtset%write_files,'vhxc') .gt. 0) then
3062       dtset%prtvhxc = 1
3063    else
3064       dtset%prtvhxc = 0
3065    end if
3066    if (INDEX(dtset%write_files,'vpsp') .gt. 0) then
3067       dtset%prtvpsp = 1
3068    else
3069       dtset%prtvpsp = 0
3070    end if
3071    if (INDEX(dtset%write_files,'vxc') .gt. 0) then
3072       dtset%prtvxc = 1
3073    else
3074       dtset%prtvxc = 0
3075    end if
3076    if (INDEX(dtset%write_files,'want_1') .gt. 0) then
3077       dtset%prtwant = 1
3078    else if (INDEX(dtset%write_files,'want_2') .gt. 0) then
3079       dtset%prtwant = 2
3080    else if (INDEX(dtset%write_files,'want_3') .gt. 0) then
3081       dtset%prtwant = 3
3082    else
3083       dtset%prtwant = 0
3084    end if
3085    if (INDEX(dtset%write_files,'wf_1') .gt. 0) then
3086       dtset%prtwf = 1
3087       if (INDEX(dtset%write_files,'wf_full_1') .gt. 0) then
3088          dtset%prtwf_full = 1
3089       end if
3090    else if (INDEX(dtset%write_files,'wf_2') .gt. 0) then
3091       dtset%prtwf = 2
3092    else if (INDEX(dtset%write_files,'wf_3') .gt. 0) then
3093       dtset%prtwf = 3
3094    else if (INDEX(dtset%write_files,'wf_-1') .gt. 0) then
3095       dtset%prtwf = -1
3096    else
3097       dtset%prtwf = 0
3098    end if
3099    if (INDEX(dtset%write_files,'xml') .gt. 0) then
3100       dtset%prtxml = 1
3101    else
3102       dtset%prtxml = 0
3103    end if
3104  end if
3105 
3106  ! Wannier90 interface related variables
3107  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'w90iniprj',tread,'INT')
3108  if(tread==1) then
3109    dtset%w90iniprj=intarr(1)
3110 !  These checks should be moved to m_chkinp.F90
3111    if ( usepaw == 0 .and. ( dtset%w90iniprj /= 2  .and. dtset%w90iniprj/=0 .and. dtset%w90iniprj /= 1 )) then
3112      write(msg, '(a,i0,2a)' )&
3113       'w90iniprj should be set to 0, 1 or 2, however, it was ',dtset%w90iniprj,ch10,&
3114       'Action: check the values of w90iniprj.'
3115      ABI_ERROR(msg)
3116    end if
3117 !  These checks should be moved to m_chkinp.F90
3118    if ( usepaw == 1 .and. ( dtset%w90iniprj < 2 .or. dtset%w90iniprj>6 ) &
3119       .and. ( dtset%w90iniprj /= 1 .and. dtset%w90iniprj/=0 )) then
3120      write(msg, '(a,i0,2a)' )&
3121       'In the PAW case, the only valid values for w90iniprj are 0, 1, 2, 5 and 6 however, it was ',dtset%w90iniprj,ch10,&
3122       'Action: check the values of w90iniprj.'
3123      ABI_ERROR(msg)
3124    end if
3125  end if
3126 
3127  ! w90prtunk
3128  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'w90prtunk',tread,'INT')
3129  if(tread==1) then
3130    dtset%w90prtunk=intarr(1)
3131 !  if ( dtset%w90prtunk < 0 ) then
3132 !    write(msg, '(4a)' )&
3133 !     'w90prtunk should be greater or equal to zero, however, it was ',dtset%w90prtunk,ch10,&
3134 !     'Action: check the values of w90prtunk.'
3135 !    ABI_ERROR(msg)
3136 !  end if
3137  end if
3138 
3139  ! Wannier90 - GW quasiparticle interface
3140  if(dtset%prtwant==3) then
3141    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'getqps',tread,'INT')
3142    if(tread==1) dtset%getqps=intarr(1)
3143    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'irdqps',tread,'INT')
3144    if(tread==1) dtset%irdqps=intarr(1)
3145  end if
3146 
3147   !van der Waals with DFT-D approach
3148  if(dtset%vdw_xc==5.or.dtset%vdw_xc==6.or.dtset%vdw_xc==7) then
3149    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_tol',tread,'DPR')
3150    if(tread==1) dtset%vdw_tol=dprarr(1)
3151    if (dtset%vdw_xc==6.or.dtset%vdw_xc==7) then
3152      call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_tol_3bt',tread,'DPR')
3153      if(tread==1) dtset%vdw_tol_3bt=dprarr(1)
3154    end if
3155  end if
3156 
3157  ! van der Waals with Wannier functions (Silvestrelli's approach versions 1,2 and 3)
3158  if(dtset%vdw_xc==10.or.dtset%vdw_xc==11.or.dtset%vdw_xc==12.or.dtset%vdw_xc==14) then
3159    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'vdw_nfrag',tread,'INT')
3160    if(tread==1) dtset%vdw_nfrag=intarr(1)
3161 
3162    call intagm(dprarr,intarr,jdtset,marr,dtset%natom,string(1:lenstr),'vdw_typfrag',tread,'INT')
3163    if(tread==1)then
3164      dtset%vdw_typfrag(1:dtset%natom)=intarr(1:dtset%natom)
3165 !    These checks should be moved to m_chkinp.F90
3166      do ii=1,dtset%natom
3167        if(dtset%vdw_typfrag(ii)<0)then
3168          write(msg, '(a,a,a,i0,a,i0,a,a)' )&
3169           'All the components of vdw_typfrag must be greater than 0.',ch10,&
3170           'The component',ii,' is equal to ',dtset%vdw_typfrag(ii),ch10,&
3171           'Action: check the values of vdw_typfrag.'
3172          ABI_ERROR(msg)
3173        end if
3174      end do
3175    end if
3176  end if
3177  if(dtset%vdw_xc==10.or.dtset%vdw_xc==11.or.dtset%vdw_xc==12.or.dtset%vdw_xc==14) then
3178    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'vdw_supercell',tread,'INT')
3179    if(tread==1)then
3180      dtset%vdw_supercell(1:3)=intarr(1:3)
3181 !    These checks should be moved to m_chkinp.F90
3182      if (dtset%vdw_supercell(1)<zero.and.dtset%vdw_supercell(2)<zero) then
3183        write(msg, '(7a)' )&
3184         ' only one component of vdw_supercell could be < 0, however, it was ',ch10,&
3185         dtset%vdw_supercell(1),dtset%vdw_supercell(2),dtset%vdw_supercell(3),ch10,&
3186         'Action: check the components of vdw_supercell.'
3187        ABI_ERROR(msg)
3188      end if
3189      if (dtset%vdw_supercell(2)<zero.and.dtset%vdw_supercell(3)<zero) then
3190        write(msg, '(7a)' )&
3191         'only one component of vdw_supercell could be < 0, however, it was ',ch10,&
3192         dtset%vdw_supercell(1),dtset%vdw_supercell(2),dtset%vdw_supercell(3),ch10,&
3193         'Action: check the components of vdw_supercell.'
3194        ABI_ERROR(msg)
3195      end if
3196      if (dtset%vdw_supercell(1)<zero.and.dtset%vdw_supercell(3)<zero) then
3197        write(msg, '(7a)' )&
3198         'only one component of vdw_supercell could be < 0, however, it was ',ch10,&
3199         dtset%vdw_supercell(1),dtset%vdw_supercell(2),dtset%vdw_supercell(3),ch10,&
3200         'Action: check the components of vdw_supercell.'
3201        ABI_ERROR(msg)
3202      end if
3203    end if
3204 
3205  end if !vdw_xc==10 or vdw_xc==11 or vdw_xc==12 or vdw_xc==14
3206 
3207  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ucrpa',tread,'INT')
3208  if(tread==1) dtset%ucrpa=intarr(1)
3209 
3210  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'ucrpa_bands',tread_key,'INT')
3211  if(tread_key==1) then
3212    if(dtset%nsym/=1) then
3213      write(msg,"(a,i0,3a)")&
3214       'Value of nsym different from 1 when ucrpa_bands is used is under test ',dtset%nsym,&
3215       ' (because symmetry is not yet used)',ch10,&
3216       'Action: check your calculation  with nsym=1'
3217      ABI_WARNING(msg)
3218    end if
3219    dtset%ucrpa_bands(1:2)=intarr(1:2)
3220  end if
3221 
3222  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'ucrpa_window',tread,'ENE')
3223  if(tread==1) then
3224    if(dtset%nsym/=1) then
3225      write(msg,*)&
3226       'Value of nsym different from 1 when ucrpa_windows is used is under test ',dtset%nsym,&
3227       ' (because symmetry is not yet used)',ch10,&
3228       'Action: check your calculation  with nsym=1'
3229      ABI_WARNING(msg)
3230    end if
3231    dtset%ucrpa_window(1:2)=dprarr(1:2)
3232  end if
3233 
3234  if(tread==1.and.tread_key==1) then
3235    write(msg, '(a,a,a,a,a)' )&
3236     'ucrpa_bands and ucrpa_window cannot be specified simultaneously',ch10,&
3237     'for the same dataset.',ch10,&
3238     'Action: check the input file.'
3239    ABI_ERROR(msg)
3240  end if
3241 
3242  ! Tolerance variables
3243  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolimg',tread,'ENE')
3244  if(tread==1) dtset%tolimg=dprarr(1)
3245 
3246  ! find which tolerance is used for the ionic relaxations
3247  tolmxde_=dtset%tolmxde
3248  tolmxf_=dtset%tolmxf
3249  itol=0
3250  itol_gen=0
3251 
3252  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolmxde',tread,'ENE',ds_input)
3253  if(tread==1) then
3254    if (ds_input == 0) then
3255      tolmxde_=dprarr(1)
3256      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3257    else
3258      dtset%tolmxde=dprarr(1)
3259      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3260    end if
3261  end if
3262 
3263  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolmxf',tread,'DPR',ds_input)
3264  if(tread==1) then
3265    if (ds_input == 0) then
3266      tolmxf_=dprarr(1)
3267      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3268    else
3269      dtset%tolmxf=dprarr(1)
3270      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3271    end if
3272  else
3273    itol_gen=itol_gen+1
3274  end if
3275 
3276  ! check for definitions of tolmxf and tolmxde for the present dataset
3277  if (itol > 1 .or. itol_gen > 1) then
3278    write(msg, '(5a)' )&
3279     'Only one of the tolmxf/tolmxde variables may be defined at once.',ch10,&
3280     'Action: check values of tolmxf, tolmxde. If you want to use ',ch10,&
3281     'tolmxde, you should explicitly put tolmxf to 0.0.'
3282    ABI_ERROR(msg)
3283  end if
3284 
3285  ! if no value is given for jdtset, use defaults
3286  if (itol == 0 .and. itol_gen == 1) then
3287    dtset%tolmxde=tolmxde_
3288    dtset%tolmxf=tolmxf_
3289  end if
3290 
3291  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolcum',tread,'DPR',ds_input)
3292  if(tread==1) dtset%tolcum=dprarr(1)
3293 
3294  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'focktoldfe',tread,'DPR')
3295  if(tread==1) dtset%focktoldfe=dprarr(1)
3296 
3297  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolrde',tread,'DPR')
3298  if(tread==1) dtset%tolrde=dprarr(1)
3299 
3300  ! find which tolXXX are defined generically and for this jdtset
3301  tolwfr_=zero
3302  toldfe_=zero
3303  toldff_=zero
3304  tolrff_=zero
3305  tolvrs_=zero
3306  itol=0
3307  itol_gen=0
3308  itol_wfr=0
3309  itol_gen_wfr=0
3310  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolwfr',tread,'DPR',ds_input)
3311  if(tread==1) then
3312    if (ds_input == 0) then
3313      tolwfr_=dprarr(1)
3314      if(abs(dprarr(1))>tiny(0._dp)) then
3315        itol_gen_wfr=itol_gen_wfr+1
3316        ! Set tolwfr_diago to tolwfr by default.
3317        ! Will be overwritten below if tolwfr_diago is specified by the user
3318        dtset%tolwfr_diago=dprarr(1)
3319      end if
3320    else
3321      dtset%tolwfr=dprarr(1)
3322      if(abs(dprarr(1))>tiny(0._dp)) then
3323        itol_wfr=itol_wfr+1
3324        ! Set tolwfr_diago to tolwfr by default.
3325        ! Will be overwritten below if tolwfr_diago is specified by the user
3326        dtset%tolwfr_diago=dprarr(1)
3327      end if
3328    end if
3329  end if
3330 
3331  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'toldff',tread,'DPR',ds_input)
3332  if(tread==1) then
3333    if (ds_input == 0) then
3334      toldff_=dprarr(1)
3335      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3336    else
3337      dtset%toldff=dprarr(1)
3338      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3339    end if
3340    dtset%optforces=1
3341  end if
3342 
3343  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolrff',tread,'DPR',ds_input)
3344  if(tread==1) then
3345    if (ds_input == 0) then
3346      tolrff_=dprarr(1)
3347      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3348    else
3349      dtset%tolrff=dprarr(1)
3350      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3351    end if
3352    dtset%optforces=1
3353  end if
3354 
3355  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'toldfe',tread,'ENE',ds_input)
3356  if(tread==1) then
3357    if (ds_input == 0) then
3358      toldfe_=dprarr(1)
3359      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3360    else
3361      dtset%toldfe=dprarr(1)
3362      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3363    end if
3364  end if
3365 
3366  if((dtset%accuracy>0).and.(itol>0.or.itol_gen>0)) tolvrs_=zero
3367 
3368  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolvrs',tread,'DPR',ds_input)
3369  if(tread==1) then
3370    if (ds_input == 0) then
3371      tolvrs_=dprarr(1)
3372      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3373    else
3374      dtset%tolvrs=dprarr(1)
3375      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3376    end if
3377  end if
3378 
3379  ! check for multiple definitions of tolXXX for the present dataset
3380  if (itol > 1 .or. itol_gen > 1) then
3381    write(msg, '(3a)' )&
3382    'Only one of the tolXXX variables may be defined at once.',ch10,&
3383    'Action: check values of tolvrs, toldfe, tolrff and toldff.'
3384    ABI_ERROR(msg)
3385  end if
3386 
3387 ! Now we take into account that tolwfr can be coupled with an other tolerance,
3388 ! ONLY if both tolerances are given for this dataset, or both generic values are defined
3389 !if tol/=tolwfr is set without tolwfr, tolwfr should be 0
3390  if (itol == 1 .and. itol_wfr == 0) then
3391    dtset%tolwfr=zero
3392    dtset%tolwfr_diago=zero
3393  end if
3394 !if tolwfr is set without tol/=tolwfr, tol/=tolwfr should be 0
3395  if (itol == 0 .and. itol_wfr == 1) then
3396    dtset%toldfe=zero
3397    dtset%toldff=zero
3398    dtset%tolrff=zero
3399    dtset%tolvrs=zero
3400  end if
3401 
3402 ! up to here:
3403 ! -- dtset%tolXXX is set if given for this dataset (itol or itol_wfr>0)
3404 ! -- tolXXX_ is non-zero if a generic value is defined (itol_gen or itol_wfr_gen>0)
3405 !if no value is given for jdtset, use defaults:
3406  if (itol == 0 .and. itol_wfr == 0) then
3407    if (itol_gen == 1) then
3408      dtset%toldfe=toldfe_
3409      dtset%toldff=toldff_
3410      dtset%tolrff=tolrff_
3411      dtset%tolvrs=tolvrs_
3412    end if
3413    if (itol_gen_wfr == 1) then
3414      dtset%tolwfr=tolwfr_
3415    end if
3416  end if
3417 
3418  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tolwfr_diago',tread,'DPR')
3419  if(tread==1) dtset%tolwfr_diago = dprarr(1)
3420 
3421  ! Tolerance variable for TFW initialization step
3422  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'tfw_toldfe',tread,'ENE',ds_input)
3423  if(tread==1) then
3424    dtset%tfw_toldfe=dprarr(1)
3425  else if (dtset%tfkinfunc>10.and.dtset%toldfe>tiny(0._dp)) then
3426    dtset%tfw_toldfe=dtset%toldfe
3427  end if
3428 
3429  ! Tolerance variables for electrons-positron tc-dft
3430  toldfe_=zero;toldff_=zero
3431  itol=0;itol_gen=0
3432  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'postoldff',tread,'DPR',ds_input)
3433  if(tread==1) then
3434    if (ds_input == 0) then
3435      toldff_=dprarr(1)
3436      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3437    else
3438      dtset%postoldff=dprarr(1)
3439      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3440    end if
3441    dtset%postoldfe=zero
3442  end if
3443 
3444  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'postoldfe',tread,'ENE',ds_input)
3445  if(tread==1) then
3446    if (ds_input == 0) then
3447      toldfe_=dprarr(1)
3448      if(abs(dprarr(1))>tiny(0._dp))itol_gen=itol_gen+1
3449    else
3450      dtset%postoldfe=dprarr(1)
3451      if(abs(dprarr(1))>tiny(0._dp))itol=itol+1
3452    end if
3453  end if
3454  if (itol > 1.or.itol_gen >1) then
3455    write(msg, '(3a)' )&
3456    'Only one of the postolXXX variables may be defined at once.',ch10,&
3457    'Action: check values of postoldfe and postoldff.'
3458    ABI_ERROR(msg)
3459  end if
3460  if (itol==0.and.itol_gen==1) then
3461    dtset%postoldfe=toldfe_
3462    dtset%postoldff=toldff_
3463  end if
3464 
3465  call intagm(dprarr,intarr,jdtset,marr,2,string(1:lenstr),'vprtrb',tread,'ENE')
3466  if(tread==1) dtset%vprtrb(:)=dprarr(1:2)
3467 
3468 !TODO: should this test be just on natsph without caring about the others? natsph might be used for other purposes
3469  if((dtset%pawfatbnd>0.or.dtset%prtdos==3) .and. dtset%natsph>0)then
3470    call intagm(dprarr,intarr,jdtset,marr,dtset%natsph,string(1:lenstr),'iatsph',tread,'INT')
3471    if(tread==1) dtset%iatsph(1:dtset%natsph)=intarr(1:dtset%natsph)
3472  end if
3473 
3474  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtdensph',tread,'INT')
3475  if(tread==1) then
3476    dtset%prtdensph=intarr(1)
3477  else if (dtset%nsppol==1.and.dtset%nspden==2) then
3478    dtset%prtdensph=1
3479  end if
3480 
3481  ! Initialize atvshift
3482  if(dtset%natvshift>0)then
3483    call intagm(dprarr,intarr,jdtset,marr,dtset%natvshift*nsppol*dtset%natom,string(1:lenstr),'atvshift',tread,'ENE')
3484    if(tread==1) dtset%atvshift(1:dtset%natvshift,1:nsppol,1:dtset%natom)=&
3485 &   reshape(dprarr(1:dtset%natvshift*nsppol*dtset%natom),(/dtset%natvshift,nsppol,dtset%natom/))
3486  end if
3487 
3488  ! Initialize wtatcon
3489  if(dtset%nconeq>0)then
3490 
3491    ! Read and check natcon
3492    ABI_MALLOC(natcon,(dtset%nconeq))
3493    call intagm(dprarr,intarr,jdtset,marr,dtset%nconeq,string(1:lenstr),'natcon',tread,'INT')
3494    if(tread==1)then
3495      natcon(:)=intarr(1:dtset%nconeq)
3496    else
3497      write(msg, '(3a)' )&
3498       'When nconeq is positive, natcon MUST be defined.',ch10,&
3499       'Action: check the values of nconeq and natcon.'
3500      ABI_ERROR(msg)
3501    end if
3502    do ii=1,dtset%nconeq
3503      if(natcon(ii)<0)then
3504        write(msg, '(3a,i0,a,i0,2a)' )&
3505         'All the components of natcon must be greater than 0.',ch10,&
3506         'The component',ii,' is equal to ',natcon(ii),ch10,&
3507         'Action: check the values of natcon.'
3508        ABI_ERROR(msg)
3509      end if
3510    end do
3511    niatcon=sum(natcon(:))
3512 
3513    ! Read and check iatcon
3514    ABI_MALLOC(iatcon,(niatcon))
3515    call intagm(dprarr,intarr,jdtset,marr,niatcon,string(1:lenstr),'iatcon',tread,'INT')
3516    if(tread==1)then
3517      iatcon(:)=intarr(1:niatcon)
3518    else
3519      write(msg, '(3a)' )&
3520      'When nconeq is positive, natcon MUST be defined.',ch10,&
3521      'Action: check the values of nconeq and natcon.'
3522      ABI_ERROR(msg)
3523    end if
3524    do ii=1,niatcon
3525      if(iatcon(ii)<0)then
3526        write(msg, '(a,a,a,i4,a,i4,a,a)' )&
3527         'All the components of iatcon must be greater than 0.',ch10,&
3528         'The component',ii,' is equal to ',iatcon(ii),ch10,&
3529         'Action: check the values of iatcon.'
3530        ABI_ERROR(msg)
3531      end if
3532    end do
3533 
3534    ! Read wtatcon, and unfold it.
3535    call intagm(dprarr,intarr,jdtset,marr,3*niatcon,string(1:lenstr),'wtatcon',tread,'DPR')
3536    if(tread/=1)then
3537      write(msg, '(3a)' )&
3538      'When nconeq is positive, wtatcon MUST be defined.',ch10,&
3539      'Action: check the values of nconeq and wtatcon.'
3540      ABI_ERROR(msg)
3541    end if
3542    iat=0
3543    do ii=1,dtset%nconeq
3544      do jj=1,natcon(ii)
3545        dtset%wtatcon(1:3,iatcon(jj+iat),ii)=dprarr(1+3*(jj+iat-1):3+3*(jj+iat-1))
3546      end do
3547      iat=iat+natcon(ii)
3548    end do
3549 
3550    ABI_FREE(iatcon)
3551    ABI_FREE(natcon)
3552  end if
3553 
3554   ! Initialize chempot
3555  if(dtset%nzchempot>0)then
3556    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nzchempot*ntypat,string(1:lenstr),'chempot',tread,'DPR')
3557    if(tread==1) dtset%chempot(1:3,1:dtset%nzchempot,1:ntypat)=&
3558 &   reshape(dprarr(1:3*dtset%nzchempot*ntypat),(/3,dtset%nzchempot,ntypat/))
3559  end if
3560 
3561  ! Initialize the list of k points, as well as wtk and istwfk
3562  intimage=1 ; if(nimage>2)intimage=(1+nimage)/2
3563  call invacuum(jdtset,lenstr,natom,dtset%rprimd_orig(1:3,1:3,intimage),string,vacuum,dtset%xred_orig(1:3,1:natom,intimage))
3564 
3565  ! reset rfdir to 1 1 1 in case it was left at the default of 0 0 0 for berryopt -1
3566  if( (dtset%berryopt == -1) .AND. &
3567 & (dtset%rfdir(1) == 0) .AND. &
3568 & (dtset%rfdir(2) == 0) .AND. &
3569 & (dtset%rfdir(3) == 0) ) dtset%rfdir(1:3) = 1
3570 
3571 !In case of a Berryphase calculation put response = 1
3572 !in order to set istwfk = 1 at all k-points
3573  if ( dtset%berryopt/=0 ) then
3574    response = 1
3575  end if
3576 
3577 !In case of longwave calculation put response = 1
3578 !in order to set istwfk = 1 at all k-points
3579  if ( dtset%optdriver==RUNL_LONGWAVE ) then
3580    response = 1
3581  end if
3582 
3583  nsym=dtset%nsym
3584  ii=0;if (mod(dtset%wfoptalg,10)==4) ii=2
3585  if(dtset%ngfft(7)==314)ii=1
3586  if(dtset%usefock==1.and.dtset%optdriver/=RUNL_SIGMA.and.mod(dtset%wfoptalg,10)/=5) ii=1
3587  !Enforce istwfk = 1 for all k-points in RT-TDDFT calculations
3588  if(dtset%optdriver==RUNL_RTTDDFT) ii=1
3589 
3590  call inkpts(bravais,dtset%chksymbreak,dtset%fockdownsampling,iout,iscf,dtset%istwfk(1:nkpt),jdtset,&
3591    dtset%kpt(:,1:nkpt),dtset%kptns_hf(:,1:nkpthf),kptopt,dtset%kptnrm,&
3592    dtset%kptrlatt_orig,dtset%kptrlatt,kptrlen,lenstr,nsym, dtset%getkerange_filepath, &
3593    nkpt,nkpthf,nqpt,dtset%ngkpt,dtset%nshiftk,dtset%nshiftk_orig,dtset%shiftk_orig,nsym,&
3594    occopt,dtset%qptn,response,dtset%rprimd_orig(1:3,1:3,intimage),dtset%shiftk,string,&
3595    dtset%symafm(1:nsym),dtset%symrel(:,:,1:nsym),vacuum,dtset%wtk(1:nkpt), comm, impose_istwf_1=ii)
3596 
3597  dtset%kptrlen=kptrlen
3598 
3599  dtset%kptns(:,1:nkpt)=dtset%kpt(:,1:nkpt)/dtset%kptnrm
3600  if(nqpt>=1 .and. dtset%optdriver/=RUNL_RESPFN)then
3601    dtset%kptns(1,1:nkpt)=dtset%kptns(1,1:nkpt)+dtset%qptn(1)
3602    dtset%kptns(2,1:nkpt)=dtset%kptns(2,1:nkpt)+dtset%qptn(2)
3603    dtset%kptns(3,1:nkpt)=dtset%kptns(3,1:nkpt)+dtset%qptn(3)
3604  end if
3605 
3606  if(nkpthf/=0)then
3607    dtset%kptns_hf(:,1:nkpthf)=dtset%kptns_hf(:,1:nkpthf)/dtset%kptnrm
3608  end if
3609 
3610  ! Read variables defining the k-path
3611  ! If kptopt < 0  --> Band structure and kptbounds size is given by abs(kptopt)
3612  ! If kptopt >= 0 --> We may have a k-path specified by nkpath and kptbounds (used by post-processing tools)
3613  ! TODO: ndivk?
3614 
3615  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ndivsm',tread,'INT')
3616  if (tread == 1) dtset%ndivsm = intarr(1)
3617 
3618  if (dtset%kptopt < 0) then
3619    dtset%nkpath = abs(dtset%kptopt)
3620  else
3621    dtset%nkpath = 0
3622    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nkpath',tread,'INT')
3623    if (tread==1) dtset%nkpath = intarr(1)
3624  end if
3625 
3626  if (dtset%nkpath /= 0) then
3627    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nkpath,string(1:lenstr),'kptbounds',tread,'DPR')
3628 
3629    if (tread == 1) then
3630      ABI_MALLOC(dtset%kptbounds, (3, dtset%nkpath))
3631      dtset%kptbounds = reshape(dprarr(1:3*dtset%nkpath), [3, dtset%nkpath])
3632    else
3633      ABI_ERROR("When nkpath /= 0 or kptopt < 0, kptbounds must be defined in the input file.")
3634    end if
3635  else
3636    ABI_MALLOC(dtset%kptbounds, (0,0))
3637  end if
3638 
3639  ! if prtkpt==-2, write the k-points in netcdf format and exit here so that AbiPy can read the data.
3640  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'prtkpt',tread,'INT')
3641  if (tread == 1 .and. intarr(1) == -2) then
3642    if (my_rank == 0) then
3643      ncerr= nctk_write_ibz("kpts.nc", dtset%kptns(:,1:nkpt), dtset%wtk(1:nkpt))
3644      NCF_CHECK(ncerr)
3645    end if
3646    call xmpi_barrier(comm)
3647    ABI_ERROR_NODUMP("kpts.nc file written. Aborting now")
3648  end if
3649 
3650  if (dtset%nkptgw>0) then
3651    ! Read bdgw.
3652    call intagm(dprarr,intarr,jdtset,marr,2*dtset%nkptgw*dtset%nsppol,string(1:lenstr),'bdgw',tread,'INT')
3653    if (tread==1) then
3654      dtset%bdgw(1:2,1:dtset%nkptgw,1:dtset%nsppol) =  &
3655        reshape(intarr(1:2*dtset%nkptgw*dtset%nsppol),[2,dtset%nkptgw,dtset%nsppol])
3656    end if
3657 
3658    ! Test bdgw values.
3659    if (any(dtset%optdriver == [RUNL_SIGMA, RUNL_EPH])) then
3660      if (any(dtset%bdgw(1:2,1:dtset%nkptgw,1:dtset%nsppol) <= 0)) then
3661        ABI_ERROR("bdgw entries cannot be <= 0. Check input file")
3662      end if
3663      if (any(dtset%bdgw(1,1:dtset%nkptgw,1:dtset%nsppol) > dtset%bdgw(2,1:dtset%nkptgw,1:dtset%nsppol))) then
3664        ABI_ERROR("First band index in bdgw cannot be greater than the second index")
3665      end if
3666    end if
3667 
3668    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nkptgw,string(1:lenstr),'kptgw',tread,'DPR')
3669    if(tread==1) dtset%kptgw(1:3,1:dtset%nkptgw) = reshape(dprarr(1:3*dtset%nkptgw), [3, dtset%nkptgw])
3670  end if
3671 
3672  if (dtset%nqptdm > 0) then
3673    call intagm(dprarr,intarr,jdtset,marr,3*dtset%nqptdm,string(1:lenstr),'qptdm',tread,'DPR')
3674    if(tread==1) dtset%qptdm(1:3,1:dtset%nqptdm)=reshape(dprarr(1:3*dtset%nqptdm), [3, dtset%nqptdm])
3675  end if
3676 
3677  if(dtset%npvel>0) then
3678    call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'pvelmax',tread,'DPR')
3679    if(tread==1) dtset%pvelmax(1:3)=dprarr(1:3)
3680  end if
3681 
3682  if(dtset%imgmov==6)then
3683    call intagm(dprarr,intarr,jdtset,marr,dtset%nimage,string(1:lenstr),'mixesimgf',tread,'DPR')
3684    if(tread==1)dtset%mixesimgf(1:dtset%nimage)=dprarr(1:dtset%nimage)
3685  endif
3686 
3687  ! Read remaining input variables depending on images : occ_orig, upawu, jpawu.
3688  ! MT oct 15: these lines are inspired from invars1 but are not really understood
3689  intimage=2 ; if(dtset%nimage==1)intimage=1
3690  do ii=1,dtset%nimage+1
3691    iimage=ii
3692    if(dtset%nimage==1 .and. ii==2)exit
3693    if(dtset%nimage==2 .and. ii==3)exit
3694    if(dtset%nimage> 2 .and. ii==intimage)cycle ! Will do the intermediate reference image at the last reading
3695    if(dtset%nimage>=2 .and. ii==dtset%nimage+1)iimage=intimage
3696 
3697    ! Only read occ if (iscf >0 or iscf=-1 or iscf=-3) and (occopt==0 or occopt==2)
3698    if  (iscf>=0.or.iscf==-1.or.iscf==-3)  then
3699      if (occopt==2 .and. getocc==0) then
3700        ! Read occ(nband(kpt)*nkpt*nsppol) explicitly
3701        call wrtout(std_out,' invars2: reading occ(nband*nkpt*nsppol) explicitly','COLL')
3702        call intagm(dprarr,intarr,jdtset,marr,bantot,string(1:lenstr),'occ',tread,'DPR')
3703        if(tread==1) dtset%occ_orig(1:bantot,iimage)=dprarr(1:bantot)
3704        call intagm_img(dprarr(1:bantot),iimage,jdtset,lenstr,dtset%nimage,bantot,string,'occ',tread_alt,'DPR')
3705        if(tread_alt==1) dtset%occ_orig(1:bantot,iimage)=dprarr(1:bantot)
3706      else if(occopt==0) then
3707        nband1=dtset%nband(1)
3708        ! Read usual occupancy--same for all k points but might differ for spins
3709        call intagm(dprarr,intarr,jdtset,marr,nband1*nsppol,string(1:lenstr),'occ',tread,'DPR')
3710        if(tread==1) dtset%occ_orig(1:nband1*nsppol,iimage)=dprarr(1:nband1*nsppol)
3711        call intagm_img(dprarr(1:nband1*nsppol),iimage,jdtset,lenstr,dtset%nimage,nband1*nsppol,string,'occ',tread_alt,'DPR')
3712        if(tread_alt==1) dtset%occ_orig(1:nband1*nsppol,iimage)=dprarr(1:nband1*nsppol)
3713        ! Fill in full occ array using input values for each k and spin
3714        ! (make a separate copy for each k point and spin)
3715        if(nkpt>1)then
3716          do isppol=nsppol,1,-1
3717            do ikpt=1,nkpt
3718              dtset%occ_orig(1+(ikpt-1)*nband1+nkpt*nband1*(isppol-1):ikpt*nband1+nkpt*nband1*(isppol-1),iimage)=&
3719 &             dtset%occ_orig(1+nband1*(isppol-1):nband1*isppol,iimage)
3720            end do
3721          end do
3722        endif
3723      end if
3724    end if
3725 
3726    if (dtset%usepawu/=0.or.dtset%usedmft>0) then
3727 
3728      dprarr(1:ntypat)=dtset%upawu(1:ntypat,iimage)
3729      call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'upawu',tread,'ENE')
3730      if(tread==1) dtset%upawu(1:ntypat,iimage)=dprarr(1:ntypat)
3731      call intagm_img(dprarr(1:ntypat),iimage,jdtset,lenstr,dtset%nimage,ntypat,string,'upawu',tread_alt,'ENE')
3732      if(tread_alt==1) dtset%upawu(1:ntypat,iimage)=dprarr(1:ntypat)
3733 
3734      dprarr(1:ntypat)=dtset%jpawu(1:ntypat,iimage)
3735      call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'jpawu',tread,'ENE')
3736      if(tread==1) dtset%jpawu(1:ntypat,iimage)=dprarr(1:ntypat)
3737      call intagm_img(dprarr(1:ntypat),iimage,jdtset,lenstr,dtset%nimage,ntypat,string,'jpawu',tread_alt,'ENE')
3738      if(tread_alt==1) dtset%jpawu(1:ntypat,iimage)=dprarr(1:ntypat)
3739 
3740      if (dtset%usedmatpu/=0.and.dmatsize>0) then
3741        nsp=nsppol*nspinor
3742        call intagm(dprarr,intarr,jdtset,marr,dmatsize,string(1:lenstr),'dmatpawu',tread,'DPR')
3743        if(tread==1) then
3744          iat=1;jj=1
3745          do iatom=1,natom
3746            lpawu=dtset%lpawu(dtset%typat(iatom))
3747            if (lpawu/=-1) then
3748              isiz=nsp*(2*lpawu+1)**2
3749              dtset%dmatpawu(1:2*lpawu+1,1:2*lpawu+1,1:nsp,iat,iimage)= &
3750 &             reshape(dprarr(jj:jj+isiz),(/2*lpawu+1,2*lpawu+1,nsp/))
3751              iat=iat+1;jj=jj+isiz
3752            end if
3753          end do
3754        end if
3755 
3756        ABI_MALLOC(dmatpawu_tmp,(dmatsize))
3757        iat=1;jj=1
3758        do iatom=1,natom
3759          lpawu=dtset%lpawu(dtset%typat(iatom))
3760          if (lpawu/=-1) then
3761            isiz=nsp*(2*lpawu+1)**2
3762            dmatpawu_tmp(jj:jj+isiz-1)= &
3763 &           reshape(dtset%dmatpawu(1:2*lpawu+1,1:2*lpawu+1,1:nsp,iat,iimage),(/isiz/))
3764            iat=iat+1;jj=jj+isiz
3765          end if
3766        end do
3767        call intagm_img(dmatpawu_tmp,iimage,jdtset,lenstr,dtset%nimage,dmatsize, string,'dmatpawu',tread_alt,'DPR')
3768        if(tread_alt==1) then
3769          iat=1;jj=1
3770          do iatom=1,natom
3771            lpawu=dtset%lpawu(dtset%typat(iatom))
3772            if (lpawu/=-1) then
3773              isiz=nsp*(2*lpawu+1)**2
3774              dtset%dmatpawu(1:2*lpawu+1,1:2*lpawu+1,1:nsp,iat,iimage)= &
3775 &             reshape(dmatpawu_tmp(jj:jj+isiz-1),(/2*lpawu+1,2*lpawu+1,nsp/))
3776              iat=iat+1;jj=jj+isiz
3777            end if
3778          end do
3779        end if
3780        ABI_FREE(dmatpawu_tmp)
3781 
3782        if (tread/=1.and.tread_alt/=1) then
3783          write(msg, '(3a)' )&
3784          'When LDA/GGA+U is activated and usedmatpu/=0, dmatpawu MUST be defined.',ch10,&
3785          'Action: add dmatpawu keyword in input file.'
3786          ABI_ERROR(msg)
3787        end if
3788      end if
3789 
3790    end if
3791 
3792  end do
3793 
3794  nelectjell=zero
3795  if(dtset%jellslab/=0)then
3796    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'slabwsrad',tread,'LEN')
3797    if(tread==1) dtset%slabwsrad=dprarr(1)
3798 
3799    ! Update number of electrons taking into account jellium
3800    ! Suppose that the cell has z axis perpendicular to x and y axes.
3801    ! This will be checked later
3802    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))
3803    rhoavg=three/(four_pi*dtset%slabwsrad**3)
3804    nelectjell=areaxy*(dtset%slabzend-dtset%slabzbeg)*rhoavg
3805  end if
3806 
3807  ! Initialize occ if occopt==1 or 3 ... 8,
3808  ! while if getocc/=0, make a fake initialization
3809  ! If iscf>0, check the charge of the system, and compute nelect.
3810  occopt_tmp=occopt
3811  if(getocc/=0)occopt_tmp=1
3812  call dtset%initocc_chkneu(nelectjell,occopt_tmp)
3813 
3814  ! Now that the occupation numbers have been initialized, can meaningfully define nbandhf.
3815  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'nbandhf',tread,'INT')
3816  if(tread==1) then
3817    dtset%nbandhf=intarr(1)
3818  else
3819    ! If the occupation numbers might change, must keep the maximum number of bands
3820    if(occopt>=3 .and. occopt<=9)then
3821      dtset%nbandhf=maxval(dtset%nband(1:nkpt*nsppol))
3822    else if(occopt==0 .or. occopt==1 .or. occopt==2) then
3823      ! Eliminate all the bands that are never occupied
3824      nband1=0 ; bantot=0
3825      do isppol=1,dtset%nsppol
3826        do ikpt=1,dtset%nkpt
3827          do iband=1,dtset%nband(ikpt+(isppol-1)*dtset%nkpt)
3828            bantot=bantot+1
3829            if(maxval(abs(dtset%occ_orig(bantot,:)))>tol8)then
3830              if(iband>nband1)nband1=iband
3831            end if
3832          end do
3833        end do
3834      end do
3835      dtset%nbandhf=nband1
3836    else
3837      write(msg, '(a,i0,3a)' )'occopt=',occopt,' not allowed.',ch10,'Action: correct your input file.'
3838      ABI_ERROR(msg)
3839    end if
3840  end if
3841 
3842  ! Initialize Berry phase vectors
3843  ! Should check that nberry is smaller than 20
3844  if(berryopt>0 .and. nberry>0)then
3845    call intagm(dprarr,intarr,jdtset,marr,3*nberry,string(1:lenstr),'kberry',tread,'INT')
3846    if(tread==1) dtset%kberry(1:3,1:nberry)=reshape(intarr(1:3*nberry), [3,nberry])
3847  end if
3848 
3849  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'ddamp',tread,'DPR')
3850  if (tread==1) dtset%ddamp = dprarr(1)
3851 
3852  call intagm(dprarr,intarr,jdtset,marr,3,string(1:lenstr),'polcen',tread,'DPR')
3853  if (tread==1) dtset%polcen(1:3) = dprarr(1:3)
3854 
3855  call intagm(dprarr,intarr,jdtset,marr,ntypat,string(1:lenstr),'densty',tread,'DPR')
3856  if(tread==1) dtset%densty(1:ntypat,1)=dprarr(1:ntypat)
3857 
3858  call intagm(dprarr,intarr,jdtset,marr,npsp,string(1:lenstr),'so_psp',tread,'INT')
3859  if (tread==1.and.dtset%usepaw==0) dtset%so_psp(1:npsp) = intarr(1:npsp)
3860 
3861  ! LOTF variables
3862 #if defined HAVE_LOTF
3863  if(dtset%ionmov==23) then
3864    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_classic',tread,'INT')
3865    if(tread==1) dtset%lotf_classic=intarr(1)
3866    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_nitex',tread,'INT')
3867    if(tread==1) dtset%lotf_nitex=intarr(1)
3868    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_nneigx',tread,'INT')
3869    if(tread==1) dtset%lotf_nneigx=intarr(1)
3870    call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'lotf_version',tread,'INT')
3871    if(tread==1) dtset%lotf_version=intarr(1)
3872  end if
3873 #endif
3874 
3875 !Read input variables related to Projected Local Orbitals Wannier functions (plowan)
3876  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_bandi',tread,'INT')
3877  if(tread==1) dtset%plowan_bandi=intarr(1)
3878  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_bandf',tread,'INT')
3879  if(tread==1) dtset%plowan_bandf=intarr(1)
3880  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_realspace',tread,'INT')
3881  if(tread==1) dtset%plowan_realspace=intarr(1)
3882  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_natom',tread,'INT')
3883  if(tread==1) dtset%plowan_natom=intarr(1)
3884  call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'plowan_nt',tread,'INT')
3885  if(tread==1) dtset%plowan_nt=intarr(1)
3886 
3887 ! if (dtset%plowan_compute>0) then
3888    call intagm(dprarr,intarr,jdtset,marr,3*dtset%plowan_nt,string(1:lenstr),'plowan_it',tread,'INT')
3889    if(tread==1) dtset%plowan_it(1:3*dtset%plowan_nt)=intarr(1:3*dtset%plowan_nt)
3890 
3891    call intagm(dprarr,intarr,jdtset,marr,dtset%plowan_natom,string(1:lenstr),'plowan_iatom',tread,'INT')
3892    if(tread==1) dtset%plowan_iatom(1:dtset%plowan_natom)=intarr(1:dtset%plowan_natom)
3893 
3894    call intagm(dprarr,intarr,jdtset,marr,dtset%plowan_natom,string(1:lenstr),'plowan_nbl',tread,'INT')
3895    if(tread==1) dtset%plowan_nbl(1:dtset%plowan_natom)=intarr(1:dtset%plowan_natom)
3896    sumnbl=sum(dtset%plowan_nbl(:))
3897 
3898    call intagm(dprarr,intarr,jdtset,marr,sumnbl,string(1:lenstr),'plowan_lcalc',tread,'INT')
3899    if(tread==1) dtset%plowan_lcalc(1:sumnbl)=intarr(1:sumnbl)
3900 
3901    call intagm(dprarr,intarr,jdtset,marr,sumnbl,string(1:lenstr),'plowan_projcalc',tread,'INT')
3902    if(tread==1) dtset%plowan_projcalc(1:sumnbl)=intarr(1:sumnbl)
3903 ! end if
3904 
3905 
3906    if ((dtset%ucrpa > 0 .and. dtset%plowan_compute >=0 )) then
3907    !   dtset%plowan_natom=1
3908    !   dtset%plowan_nbl(:)=1
3909      dtset%plowan_nt=1
3910      dtset%plowan_it(:)=0
3911      dtset%plowan_realspace=1
3912    !   call intagm(dprarr,intarr,jdtset,marr,1,string(1:lenstr),'dmft_t2g',tread,'INT')
3913    !   if(tread==1) dtset%dmft_t2g=intarr(1)
3914    !   do iatom=1,dtset%natom
3915    !     lpawu=dtset%lpawu(dtset%typat(iatom))
3916    !     if (lpawu/=-1) then
3917    !       dtset%plowan_lcalc(:)=lpawu
3918    !       dtset%plowan_iatom(:)=iatom
3919    !       dtset%plowan_projcalc(:)=-2
3920    !     end if
3921    !   end do
3922    !   dtset%plowan_bandi=dtset%dmftbandi
3923    !   dtset%plowan_bandf=dtset%dmftbandf
3924    !   if (dtset%nbandkss /= 0 .and. dtset%usedmft/=0) then
3925    !     dtset%plowan_compute=1
3926    !     dtset%usedmft=0
3927    !   else if (dtset%optdriver==3) then
3928    !     dtset%plowan_compute=10
3929    !   else if(dtset%optdriver==4) then
3930    !     dtset%plowan_compute=10
3931    !   end if
3932    end if
3933 
3934  ! band range for self-energy sum
3935  call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'sigma_bsum_range', tread, 'INT')
3936  if (tread == 1) then
3937     dtset%sigma_bsum_range = intarr(1:2)
3938     ABI_CHECK(all(dtset%sigma_bsum_range > 0), "sigma_bsum_range cannot be negative")
3939     ABI_CHECK(dtset%sigma_bsum_range(2) >= dtset%sigma_bsum_range(1), "sigma_bsum_range(2) must be >= (1)")
3940  end if
3941 
3942  ! band range for self-energy corrections.
3943  call intagm(dprarr, intarr, jdtset, marr, 2, string(1:lenstr), 'sigma_erange', tread, 'ENE')
3944  if (tread == 1) then
3945    dtset%sigma_erange = dprarr(1:2)
3946    !if (all(dtset%sigma_erange < zero) .and. .not. tread_dipdip == 1) dtset%dipdip = 0
3947  end if
3948 
3949  ! IBZ k-points for transport calculation in terms of transport_ngkpt
3950  call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'transport_ngkpt', tread, 'INT')
3951  if (tread == 1) dtset%transport_ngkpt = intarr(1:3)
3952 
3953  ! IBZ k-points for electron self-energy given in terms of sigma_ngkpt
3954  call intagm(dprarr, intarr, jdtset, marr, 3, string(1:lenstr), 'sigma_ngkpt', tread, 'INT')
3955 
3956  if (tread == 1) then
3957    ! sigma_ngkpt mode --> initialize shifts, provide default if not given in input
3958    ! Consistency check: nkptgw must be zero, sigma_erange should not be given.
3959    ABI_CHECK(dtset%nkptgw == 0, "nkptgw and sigma_ngkpt are mutually exclusive.")
3960 
3961    dtset%sigma_ngkpt = intarr(1:3)
3962    call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), 'sigma_nshiftk', tread, 'INT')
3963    if (tread == 1) dtset%sigma_nshiftk = intarr(1)
3964    if (dtset%sigma_nshiftk < 1 .or. dtset%sigma_nshiftk > MAX_NSHIFTK ) then
3965      write(msg, '(a,i0,2a,i0,3a)' ) &
3966      'The only allowed values of nshiftk are between 1 and ',MAX_NSHIFTK,ch10,&
3967      'while it is found to be ',dtset%sigma_nshiftk,'.',ch10,&
3968      'Action: change the value of sigma_nshiftk in your input file, or change kptopt.'
3969      ABI_ERROR(msg)
3970    end if
3971 
3972    call intagm(dprarr, intarr, jdtset, marr, 3*dtset%sigma_nshiftk, string(1:lenstr), 'sigma_shiftk', tread, 'DPR')
3973    ! Yes, I know that multidatasets will likely crash if sigma_nshiftk changes...
3974    ABI_CALLOC(dtset%sigma_shiftk, (3, dtset%sigma_nshiftk))
3975    if (tread == 1) then
3976      dtset%shiftk(:,1:dtset%sigma_nshiftk) = reshape(dprarr(1:3*dtset%sigma_nshiftk), [3,dtset%sigma_nshiftk])
3977    end if
3978  end if
3979 
3980  call intagm(dprarr, intarr, jdtset, marr, 1, string(1:lenstr), "wfk_task", tread, 'KEY', key_value=key_value)
3981  if (tread==1) dtset%wfk_task = str2wfktask(tolower(key_value))
3982  if (dtset%optdriver == RUNL_WFK .and. dtset%wfk_task == WFK_TASK_NONE) then
3983    ABI_ERROR(sjoin("A valid wfk_task must be specified when optdriver= ", itoa(dtset%optdriver), ", Received:", key_value))
3984  end if
3985 
3986  ABI_FREE(intarr)
3987  ABI_FREE(dprarr)
3988 
3989  !Now all inputs are read, we can determine if "cprj_in_memory" implementation can be used or not
3990  dtset%cprj_in_memory=0
3991  if (dtset%cprj_update_lvl/=0) then
3992    dtset%cprj_in_memory=1
3993    ! Must be ground state computation...
3994    if (dtset%optdriver/=0) dtset%cprj_in_memory = 0
3995    ! ...with PAW...
3996    if (dtset%usepaw/=1) dtset%cprj_in_memory = 0
3997    ! ... and Conjugate Gradient...
3998    if (dtset%wfoptalg/=10) dtset%cprj_in_memory = 0
3999    ! ...without kgb parallelization...
4000    if (dtset%paral_kgb/=0) dtset%cprj_in_memory = 0
4001    ! ...without RMM-DIIS...
4002    if (dtset%rmm_diis/=0) dtset%cprj_in_memory = 0
4003    ! ...without electric field...
4004    if (dtset%berryopt/=0) dtset%cprj_in_memory = 0
4005    ! ...without Fock exchange...
4006    if (dtset%usefock/=0) dtset%cprj_in_memory = 0
4007    ! ...without nuclear dipolar moments...
4008    if (sum(abs(dtset%nucdipmom))>tol16) dtset%cprj_in_memory = 0
4009  end if
4010 
4011  if (dtset%nqptdm == -1) then
4012    cryst = dtset%get_crystal(1)
4013    !call cryst%print(mode_paral='COLL')
4014    call Kmesh%init(Cryst, dtset%nkpt, dtset%kptns, Dtset%kptopt, wrap_1zone=.FALSE.)
4015 
4016    ! Some required information are not filled up inside kmesh_init
4017    ! So doing it here, even though it is not clean
4018    Kmesh%kptrlatt(:,:) =Dtset%kptrlatt(:,:)
4019    Kmesh%nshift        =Dtset%nshiftk
4020    ABI_MALLOC(Kmesh%shift,(3,Kmesh%nshift))
4021    Kmesh%shift(:,:)    =Dtset%shiftk(:,1:Dtset%nshiftk)
4022    !call Kmesh%print("K-mesh for the wavefunctions",ab_out, dtset%prtvol)
4023    call find_qmesh(Qmesh, Cryst, Kmesh)
4024 #ifdef HAVE_NETCDF
4025    if (my_rank == master) then
4026      NCF_CHECK(nctk_write_ibz("qptdms.nc", qmesh%ibz, qmesh%wt))
4027    end if
4028 #endif
4029    call xmpi_barrier(comm)
4030    ABI_ERROR_NODUMP("Aborting now")
4031  end if
4032 
4033  call timab(191,2,tsec)
4034 
4035 end subroutine invars2

ABINIT/invars2m [ Functions ]

[ Top ] [ Functions ]

NAME

 invars2m

FUNCTION

 Initialisation phase - main input routine.
 Big loop on the datasets :
 - for each of the datasets, write one line about the crystallographic data
 - call invars2, that read the eventual single dataset input values;
 - compute mgfft,mpw,nfft,... for this data set;
 - compute quantities for the susceptibility computation
 - compute the memory needs for this data set.

INPUTS

  bravais_(11,0:ndtset_alloc)=characteristics of Bravais lattice
  iout=unit number of output file
  lenstr=actual length of string
  mband_upper_(0:ndtset_alloc)=list of mband_upper values
  msym=default maximal number of symmetries
  ndtset= number of datasets to be read; if 0, no multi-dataset mode
  ndtset_alloc=number of datasets, corrected for allocation of at least
      one data set.
  npsp=number of pseudopotentials
  pspheads(npsp)=<type pspheader_type>all the important information from the
   pseudopotential file header, as well as the psp file name
  string*(*)=character string containing all the input data.
   Initialized previously in instrng.
 comm=MPI communicator

OUTPUT

  dtsets(0:ndtset_alloc)=<type datafiles_type>contains all input variables,
   some of which are initialized here, while other were already
   initialized previously.

NOTES

 The outputs of this routine are the values of input variables,
 their default value is stored at the index 0 of the last dimension
 of their multi-dataset representation.

SOURCE

104 subroutine invars2m(dtsets,iout,lenstr,mband_upper_,msym,ndtset,ndtset_alloc,npsp,pspheads,string, comm)
105 
106 !Arguments ------------------------------------
107 !scalars
108  integer,intent(in) :: iout,lenstr,msym,ndtset,ndtset_alloc,npsp, comm
109  character(len=*),intent(in) :: string
110 !arrays
111  integer,intent(in) :: mband_upper_(0:ndtset_alloc)
112  type(dataset_type),intent(inout) :: dtsets(0:ndtset_alloc)
113  type(pspheader_type),intent(in) :: pspheads(npsp)
114 
115 !Local variables -------------------------------
116 !scalars
117  integer :: idtset,jdtset,mband_upper,nsheps,nshsigx,nshwfn,usepaw
118  !integer,parameter :: master = 0
119  real(dp) :: ucvol
120 !arrays
121  integer :: bravais(11)
122  real(dp) :: gmet(3,3),gprimd(3,3),rmet(3,3),rprimd(3,3)
123  real(dp),allocatable :: zionpsp(:)
124 
125 !*************************************************************************
126 
127  do idtset=1,ndtset_alloc
128    jdtset=dtsets(idtset)%jdtset ; if(ndtset==0)jdtset=0
129    bravais(:)=dtsets(idtset)%bravais(:)
130    mband_upper  =mband_upper_(idtset)
131    usepaw=dtsets(idtset)%usepaw
132    ! Allocate arrays
133    ABI_MALLOC(zionpsp,(npsp))
134    zionpsp(:)=pspheads(1:npsp)%zionpsp
135 
136    call mkrdim(dtsets(idtset)%acell_orig(1:3,1),dtsets(idtset)%rprim_orig(1:3,1:3,1),rprimd)
137    call metric(gmet,gprimd,-1,rmet,rprimd,ucvol)
138 
139    ! Here, nearly all the remaining input variables are initialized
140    call invars2(bravais,dtsets(idtset),iout,jdtset,lenstr,mband_upper,msym,npsp,string,usepaw,zionpsp,ucvol,comm)
141 
142    ABI_FREE(zionpsp)
143 
144    if (ANY(dtsets(idtset)%optdriver == [RUNL_SCREENING,RUNL_SIGMA,RUNL_BSE])) then
145     ! For GW or BSE calculations, we only use (npwwfn|ecutwfn) G-vectors read from the KSS file,
146     ! therefore the FFT box for the density should be defined according to ecut=ecutwfn.
147 
148      nshwfn=0
149      call setshells(dtsets(idtset)%ecutwfn,dtsets(idtset)%npwwfn,nshwfn,&
150        dtsets(idtset)%nsym,gmet,gprimd,dtsets(idtset)%symrel,'wfn',ucvol)
151 
152      ! MG: Hack to avoid portability problems under gfortran:
153      ! getng and getmpw are indeed quite sensitive if ecut is small
154      ! and, in the GW tests, mpw and ngfft might depend on the compiler used.
155      ! the problem shows up if we use npwwfn instead of ecutwfn, a good reason for removing npwwfn!
156      dtsets(idtset)%ecutwfn=dtsets(idtset)%ecutwfn-tol14
157      ! MG: This is a kind of a hack, but the problem is ecutwfn that is too much redundant!
158      dtsets(idtset)%ecut=dtsets(idtset)%ecutwfn
159 
160      ! Close the shell for (W|chi0)
161      nsheps=0
162      call setshells(dtsets(idtset)%ecuteps,dtsets(idtset)%npweps,nsheps,&
163       dtsets(idtset)%nsym,gmet,gprimd,dtsets(idtset)%symrel,'eps',ucvol)
164 
165      ! Close the shell for the exchange term.
166      nshsigx=0
167      call setshells(dtsets(idtset)%ecutsigx,dtsets(idtset)%npwsigx,nshsigx,&
168       dtsets(idtset)%nsym,gmet,gprimd,dtsets(idtset)%symrel,'sigx',ucvol)
169    end if ! (SIGMA|SCREENING|SCGW|BSE|RDFTM)
170 
171  end do
172 
173 end subroutine invars2m

ABINIT/m_invars2 [ Modules ]

[ Top ] [ Modules ]

NAME

  m_invars2

FUNCTION

COPYRIGHT

  Copyright (C) 1999-2024 ABINIT group (XG)
  This file is distributed under the terms of the
  GNU General Public License, see ~abinit/COPYING
  or http://www.gnu.org/copyleft/gpl.txt .

SOURCE

16 #if defined HAVE_CONFIG_H
17 #include "config.h"
18 #endif
19 
20 #include "abi_common.h"
21 
22 module m_invars2
23 
24  use defs_basis
25  use m_abicore
26  use m_errors
27  use m_xmpi
28  use m_nctk
29  use m_sort
30  use m_dtset
31  use libxc_functionals
32 #ifdef HAVE_NETCDF
33  use netcdf
34 #endif
35 
36  use defs_datatypes, only : pspheader_type
37  use m_time,      only : timab
38  use m_fstrings,  only : sjoin, itoa, ltoa, tolower, toupper
39  use m_symtk,     only : matr3inv
40  use m_parser,    only : intagm, intagm_img
41  use m_geometry,  only : mkrdim, metric
42  use m_gsphere,   only : setshells
43  use m_xcdata,    only : get_auxc_ixc, get_xclevel
44  use m_inkpts,    only : inkpts
45  use m_ingeo,     only : invacuum
46  use m_ipi,       only : ipi_check_initial_consistency
47  use m_crystal,   only : crystal_t
48  use m_bz_mesh,   only : kmesh_t, find_qmesh
49  use m_drivexc,   only : has_kxc
50 
51  implicit none
52 
53  private