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