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