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

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

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

ABINIT/m_invars2 [ Modules ]

[ Top ] [ Modules ]

NAME

  m_invars2

FUNCTION

COPYRIGHT

  Copyright (C) 1999-2022 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

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