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