1!> LATTE parser. 2!! \ingroup LATTE 3!! \brief This module is used to parse all the necessary input variables for a LATTE TB run (SCF/OPT/MD) 4!! Adding a new input keyword to the parser: 5!! - If the variable is real, we have to increase nkey_re. 6!! - Add the keyword (character type) in the keyvector_re vector. 7!! - Add a default value (real type) in the valvector_re. 8!! - Define a new variable int the latte type and pass the value through valvector_re(num) 9!! where num is the position of the new keyword in the vector. 10!! - Use DUMMY= as a placeholder. This variable will be ignored by not searched by the parser. 11!! 12MODULE LATTEPARSER_LATTE_MOD 13 14 USE CONSTANTS_MOD 15 USE SETUPARRAY 16 USE PPOTARRAY 17 USE NEBLISTARRAY 18 USE COULOMBARRAY 19 USE SPARSEARRAY 20 USE RELAXCOMMON 21 USE MDARRAY 22 USE KSPACEARRAY 23 24 USE OPENFILES_MOD 25 USE KERNELPARSER_MOD 26 27#ifdef PROGRESSON 28 USE BML 29#endif 30 31 IMPLICIT NONE 32 33 PRIVATE 34 35 INTEGER, PARAMETER :: DP = LATTEPREC 36 37 PUBLIC :: PARSE_CONTROL, PARSE_MD, PARSE_KMESH 38 39#ifdef PROGRESSON 40 !> General latte input variables type. 41 !! 42 TYPE, PUBLIC :: LATTE_TYPE 43 44 !> Name of the current job. 45 CHARACTER(20) :: JOBNAME 46 47 !> Verbosity level. 48 INTEGER :: VERBOSE 49 50 !> Threshold values for matrix elements. 51 REAL(DP) :: THRESHOLD 52 53 !> Max nonzero elements per row for every row see \cite Mniszewski2015 . 54 INTEGER :: MDIM 55 56 !> Matrix format (Dense or Ellpack). 57 CHARACTER(20) :: BML_TYPE 58 59 !> Distribution mode (sequential, distributed, or graph_distributed). 60 CHARACTER(20) :: BML_DMODE 61 62 !> Coulomb Accuracy. 63 REAL(DP) :: COUL_ACC 64 65 !> Pulay mixing coefficient. 66 REAL(DP) :: PULAYCOEFF 67 68 !> Linear mixing coefficient. 69 REAL(DP) :: MIXCOEFF 70 71 !> Coulomb Accuracy. 72 INTEGER :: MPULAY 73 74 !> Maximum SCF iterations. 75 INTEGER :: MAXSCF 76 77 !> SCF tolerance. 78 REAL(DP) :: SCFTOL 79 80 !> Z Matrix calculation type. 81 CHARACTER(20) :: ZMAT 82 83 !> Solver method 84 CHARACTER(20) :: METHOD 85 86 !> Estimated ration between real & k space time efficiency. 87 REAL(DP) :: TIMERATIO 88 89 !> Total number of steps for MD simulation. 90 INTEGER :: MDSTEPS 91 92 !> Total number of steps for MD simulation. 93 REAL(DP) :: TIMESTEP 94 95 !> Total number of steps for MD simulation. 96 CHARACTER(100) :: PARAMPATH 97 98 !> File containing coordinates. 99 CHARACTER(100) :: COORDSFILE 100 101 !> File containing coordinates. 102 INTEGER :: NLISTEACH 103 104 !> Restart calculation. 105 LOGICAL :: RESTART 106 107 !> Restart calculation. 108 REAL(DP) :: EFERMI 109 110 111 END TYPE LATTE_TYPE 112 113 TYPE(LATTE_TYPE), PUBLIC :: LT 114 115#endif 116 117CONTAINS 118 119 !> The parser for Latte General input variables. 120 !! 121 SUBROUTINE PARSE_CONTROL(FILENAME) 122 123 USE FERMICOMMON 124 125 IMPLICIT NONE 126 INTEGER, PARAMETER :: NKEY_CHAR = 7, NKEY_INT = 53, NKEY_RE = 21, NKEY_LOG = 2 127 CHARACTER(LEN=*) :: FILENAME 128 129 !Library of keywords with the respective defaults. 130 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_CHAR(NKEY_CHAR) = [CHARACTER(LEN=100) :: & 131 'JOBNAME=','BASISTYPE=','SP2CONV=','RELAXTYPE=','PARAMPATH=','COORDSFILE=',& 132 'SCLTYPE='] 133 CHARACTER(LEN=100) :: VALVECTOR_CHAR(NKEY_CHAR) = [CHARACTER(LEN=100) :: & 134 'MyJob','NONORTHO','REL','SD','./TBparam','./bl/inputblock.dat','EXP'] 135 136 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_INT(NKEY_INT) = [CHARACTER(LEN=50) :: & 137 'XCONTROL=','DEBUGON=','FERMIM=','CGORLIB=','NORECS=','ENTROPYKIND=',& 138 'PPOTON=','VDWON=','SPINON=','ELECTRO=', 'ELECMETH=','MAXSCF=',& !12 139 'MINSP2ITER=','FULLQCONV=','QITER=','ORDERNMOL=','SPARSEON=','THRESHOLDON=',& !18 140 'FILLINSTOP=','BLKSZ=','MSPARSE=','LCNON=','LCNITER=','RELAX=','MAXITER=',& !25 141 'MDON=','PBCON=','RESTART=','CHARGE=','XBO=','XBODISON=','XBODISORDER=','NGPU=',& !33 142 'KON=','COMPFORCE=','DOSFIT=','INTS2FIT=','NFITSTEP=','QFIT=',& !39 143 'PPFITON=','ALLFITON=','PPSTEP=','BISTEP=','PP2FIT=','BINT2FIT=','PPNMOL=',& !46 144 'PPNGEOM=','PARREP=','VERBOSE=','MIXER=','RESTARTLIB=','FREEZE=','xControl='] 145 INTEGER :: VALVECTOR_INT(NKEY_INT) = (/ & 146 1,0,6,1,1,1, & 147 1,0,0,1,0,250, & 148 22,0,1,0,0,1, & 149 100,4,3000,0,4,0,100, & 150 1,1,0,0,1,1,5,2, & 151 0,1,0,1,5000,0,& 152 0,0,500,500,2,6,10,& 153 200,0,1,0,0,0,-1 /) 154 155 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_RE(NKEY_RE) = [CHARACTER(LEN=50) :: & 156 'CGTOL=','KBT=','SPINTOL=','ELEC_ETOL=','ELEC_QTOL=','COULACC=','COULCUT=', 'COULR1=',& !8 157 'BREAKTOL=','QMIX=','SPINMIX=','MDMIX=','NUMTHRESH=','CHTOL=','SKIN=',& !15 158 'RLXFTOL=','BETA=','MCSIGMA=','PPBETA=','PPSIGMA=','ER='] !21 159 REAL(DP) :: VALVECTOR_RE(NKEY_RE) = (/& 160 1.0e-6,0.0,1.0e-4,0.001,1.0e-8,1.0e-6,-500.0, 500.0,& 161 1.0e-6,0.25,0.25,0.25,1.0e-6,0.01,1.0,& 162 1.0e-7,1000.0,0.2,1000.0,0.01,1.0/) 163 164 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_LOG(NKEY_LOG) = [CHARACTER(LEN=100) :: & 165 'LIBINIT=','STOPATMAXSCF='] 166 LOGICAL :: VALVECTOR_LOG(NKEY_LOG) = (/& 167 .FALSE.,.FALSE./) 168 169 !Start and stop characters 170 CHARACTER(LEN=50), PARAMETER :: STARTSTOP(2) = [CHARACTER(LEN=50) :: & 171 'CONTROL{', '}'] 172 173 CALL PARSING_KERNEL(KEYVECTOR_CHAR,VALVECTOR_CHAR& 174 ,KEYVECTOR_INT,VALVECTOR_INT,KEYVECTOR_RE,VALVECTOR_RE,& 175 KEYVECTOR_LOG,VALVECTOR_LOG,TRIM(FILENAME),STARTSTOP) 176 177 178 JOB = VALVECTOR_CHAR(1) 179 180 ! CONTROL determines how the density matrix is going to be 181 ! calculated: 1 = diagonalization, 2 = SP2 purification, 182 ! 3 = recursive expansion of the Fermi operator, 4 = SP2T, 183 ! 5 = SP2 Fermi 184 ! 185 186 CONTROL = VALVECTOR_INT(1) 187 IF (VALVECTOR_INT(53) > 0) THEN !Someone is using xControl= 188 CALL ERRORS("latteparser_latte_mod","xControl= is not longer in use. Please use XCONTROL= instead.") 189 ENDIF 190 191 192 ! 193 ! BASISTYPE can equal "ORTHO" OR "NONORTHO", 194 ! 195 196 BASISTYPE = VALVECTOR_CHAR(2) 197 198 IF (BASISTYPE .NE. "ORTHO" .AND. BASISTYPE .NE. "NONORTHO") THEN 199 CALL ERRORS("latteparser_latte_mod","Error defining basis type (ortho/nonortho)") 200 ENDIF 201 202 DEBUGON = VALVECTOR_INT(2) 203 204 205 ! 206 ! Read the order of the recursion in the expansion of the Fermi 207 ! operator, M. 208 ! 209 210 FERMIM = VALVECTOR_INT(3) 211 212 ! If we're using the expansion of the Fermi operator, we can 213 ! use a LAPACK routine or Niklasson's conjugate gradient method to 214 ! solve AX = B. CGORLIB: 0 = LAPACK, 1 = conjugate gradient 215 ! CGTOL = the user-supplied tolerance for the CG solution of AX = B 216 217 CGORLIB = VALVECTOR_INT(4); CGTOL = VALVECTOR_RE(1) 218 219 CGTOL2 = CGTOL*CGTOL 220 221 ! Electronic temperature, in eV 222 223 KBT = VALVECTOR_RE(2) 224 225 ! 226 ! Read the number of recursions for the truncated, finite 227 ! temperature SP2 algorithm 228 ! 229 230 NORECS = VALVECTOR_INT(5) 231 232 ! 233 ! What kind of entropy are we going to use in a finite Te calculation 234 ! 235 ! ENTROPYKIND = 0 : none 236 ! ENTROPYKIND = 1 : exact for Fermi-Dirac occupation 237 ! ENTROPYKIND = 2 : Different form of exact expression that may be useful 238 ! when using CONTROL = 5 239 ! ENTROPYKIND = 3 : 4th order expansion of exact form (no diag) 240 ! ENTROPYKIND = 4 : 8th order expansion of exact form (no diag) 241 ! 242 243 ENTROPYKIND = VALVECTOR_INT(6) 244 245 ! 246 ! Do we want long-range C/R^6 tails? 247 ! 248 ! PPOTON = 1: Turn on pairwise interaction 249 ! PPOTON = 0: Turn it off (useful for fitting) 250 ! 251 ! VDWON = 0: No C/R^6 tails 252 ! VDWON = 1: Use tails 253 ! 254 255 PPOTON = VALVECTOR_INT(7); VDWON = VALVECTOR_INT(8) 256 257 258 ! 259 ! Are we doing a spin-polarized calculation? 260 ! SPINON = 1 = yes 261 ! SPINON = 0 = no 262 263 SPINON = VALVECTOR_INT(9); SPINTOL = VALVECTOR_RE(3) 264 265 ! 266 ! Controls for electrostatics: 267 ! 268 ! ELECTRO: 0 = LCN is applied, 1 = charge dependent TB on 269 ! ELECMETH: 0 = Ewald summation, 1 = All real space 270 ! ELEC_ETOL: Tolerance on energy when determining charges (not implemented) 271 ! ELEC_QTOL: Tolerance on charges during self-consistent calc 272 ! 273 274 ELECTRO = VALVECTOR_INT(10); ELECMETH = VALVECTOR_INT(11) 275 ELEC_ETOL = VALVECTOR_RE(4); ELEC_QTOL = VALVECTOR_RE(5) 276 277 ! 278 ! COULACC: Accuracy for the Ewald method (1.0e-4 works) 279 ! COULCUT: If we're using the Ewald method, this is the cut-off for the 280 ! real space part. If we're doing it all in real space, this is the radial 281 ! cut-off for the sum. 282 ! COULR1: If we're doing it in real space, the cut-off tail on 1/R is 283 ! applied here at terminated at COULCUT. 284 ! 285 286 COULACC = VALVECTOR_RE(6); COULCUT = VALVECTOR_RE(7); COULR1 = VALVECTOR_RE(8) 287 288 ! 289 ! MAXSCF: Maximum number of SCF cycles 290 ! 291 292 MAXSCF = VALVECTOR_INT(12) 293 294 ! 295 ! BREAKTOL: Tolerance for breaking SP2 loops 296 ! MINSP2ITER: Minimum number of iterations during SP2 purification 297 ! 298 299 BREAKTOL = VALVECTOR_RE(9); MINSP2ITER = VALVECTOR_INT(13); SP2CONV = VALVECTOR_CHAR(3) 300 301 ! 302 ! FULLQCONV: 0 = We'll run QITER SCF cycles during MD, = 1, we'll run 303 ! SCF cycles until we've reached ELEC_QTOL. Only important for MD 304 ! QITER: Number of SCF cycles we're going to run at each MD time step 305 ! 306 307 FULLQCONV = VALVECTOR_INT(14); QITER = VALVECTOR_INT(15) 308 309 ! 310 ! QMIX AND SPINMIX are the coefficients for the linear mixing of 311 ! new and old charge and spin densities, respectively, during SCF cycles 312 ! 313 314 QMIX = VALVECTOR_RE(10); SPINMIX = VALVECTOR_RE(11); MDMIX = VALVECTOR_RE(12) 315 316 ! 317 ! ORDERNMOL: Turn on molecule-ID-based density matrix blocking 318 ! 319 320 ORDERNMOL = VALVECTOR_INT(16) 321 322 ! 323 ! SPARSEON: 0 = all dense matrix stuff, 1 = use CSR format and 324 ! Gustavson's algorithm for matrix-matrix multiplication 325 ! THRESHOLDON: 0 = do not throw away elements; 1 = throw away elements 326 ! NUMTHRESH: If THRESHOLDON = 1 throw away element whose absolute value is 327 ! smaller than NUMTHRESH 328 ! FILLINSTOP: Number of purification cycles beyond which we stop allowing 329 ! for further fill-in 330 ! 331 332 SPARSEON = VALVECTOR_INT(17); THRESHOLDON = VALVECTOR_INT(18); NUMTHRESH = VALVECTOR_RE(13) 333 334#ifdef PROGRESSON 335 336 IF(SPARSEON == 0)THEN 337 LT%BML_TYPE = BML_MATRIX_DENSE 338 ELSEIF(SPARSEON == 1)THEN 339 LT%BML_TYPE = BML_MATRIX_ELLPACK 340 ELSE 341 CALL ERRORS("latteparser_latte_mod","SPARSEON > 1 yet not implemented") 342 ENDIF 343 344 IF(THRESHOLDON == 0)THEN 345 LT%THRESHOLD = 0.0_DP 346 ELSEIF(THRESHOLDON == 1)THEN 347 LT%THRESHOLD = NUMTHRESH 348 ELSE 349 CALL ERRORS("latteparser_latte_mod","THRESHOLDON > 1 yet not implemented") 350 ENDIF 351 352#endif 353 354 FILLINSTOP = VALVECTOR_INT(19); BLKSZ = VALVECTOR_INT(20) 355 356 ! 357 ! MSPARSE: value for M when SPARSEON = 1, used by sp2 sparse algorithm 358 ! 0 = value for M is not known, defaults to N 359 ! 360 361 MSPARSE = VALVECTOR_INT(21) 362 363#ifdef PROGRESSON 364 365 IF(MSPARSE == 0)THEN 366 LT%MDIM = -1 !Defaults to N 367 ELSEIF(MSPARSE > 0)THEN 368 LT%MDIM = MSPARSE 369 ELSE 370 CALL ERRORS("latteparser_latte_mod","MSPARSE cannot be negative") 371 ENDIF 372 373#endif 374 375 ! 376 ! LCNON: 0 = during charge neutral MD simulations we'll run LCNITER SCF 377 ! cycles at each time step, 1 = we'll run SCF cycles until CHTOL is reached 378 ! LCNITER: Number of SCF cycles to achieve LCN at each MD time step 379 ! CHTOL: Tolerance on atomic charges (Mulliken) before LCN is declared 380 ! 381 382 LCNON = VALVECTOR_INT(22); LCNITER = VALVECTOR_INT(23); CHTOL = VALVECTOR_RE(14) 383 384 ! 385 ! Read the SKIN for the neighbor list (Angstrom) 386 ! 387 388 SKIN = VALVECTOR_RE(15) 389 390 ! 391 ! RELAXME: 0 = Don't run relaxation, 1 = relax geometry 392 ! RELTYPE: SD = steepest descent, CG = conjugate gradient 393 ! MXRLX: Maximum number of steps in the geometry optimization 394 ! RLXFTOT: Run optimization until all forces are less than RLXFTOL 395 ! 396 397 RELAXME = VALVECTOR_INT(24); RELTYPE = VALVECTOR_CHAR(4) ;MXRLX = VALVECTOR_INT(25) 398 RLXFTOL = VALVECTOR_RE(16) 399 400 ! 401 ! MDON: 0 = Molecular dynamics off, 1 = Molecular dynamics on 402 ! (MD is controlled using the file MDcontroller) 403 ! 404 405 MDON = VALVECTOR_INT(26) 406 407 ! 408 ! PBCON: 1 = full periodic boundary conditions, 0 = gas phase: no pbc and 409 ! electrostatics done all in real space 410 ! 411 412 PBCON = VALVECTOR_INT(27) 413 414 RESTART = VALVECTOR_INT(28) 415 416 ! Add or remove electrons. 2+ -> charge = +2 since TOTNE = TOTNE - CHARGE 417 418 CHARGE = VALVECTOR_INT(29) 419 420 ! 421 ! XBOON: 0 = Niklasson's extended Lagrangian Born-Oppenheimer MD off, 422 ! 1 = on. 423 ! 424 425 XBOON = VALVECTOR_INT(30) 426 427 ! 428 ! XBODISON: We have the option of turning on damping for the XBO 429 ! to remedy the accumulation of noise. 0 = off, 1 = on. 430 ! 431 432 XBODISON = VALVECTOR_INT(31) 433 434 ! 435 ! XBODISORDER: = Order of the damping function (1 - 9) 436 ! 437 438 XBODISORDER = VALVECTOR_INT(32) 439 440 FITON = 0 441 442 ! 443 ! Read in the number of GPUs per node 444 ! 445 446 NGPU = VALVECTOR_INT(33) 447 448 ! Are we doing k-space? 449 450 KON = VALVECTOR_INT(34) 451 452 ! Do we want to calculate forces too (not always necessary when fitting) 453 454 COMPFORCE = VALVECTOR_INT(35) 455 456 ! Turn on the simulated annealing subroutine to fit DOS 457 458 459 DOSFITON = VALVECTOR_INT(36); INT2FIT = VALVECTOR_INT(37) 460 MCBETA = VALVECTOR_RE(17); NFITSTEP = VALVECTOR_INT(38); QFIT = VALVECTOR_INT(39) 461 MCSIGMA = VALVECTOR_RE(18) 462 463 PPFITON = VALVECTOR_INT(40) 464 465 ALLFITON = VALVECTOR_INT(41) 466 467 PPNFITSTEP = VALVECTOR_INT(42); BINFITSTEP = VALVECTOR_INT(43) 468 PP2FIT = VALVECTOR_INT(44); BINT2FIT = VALVECTOR_INT(45) 469 470 PPBETA = VALVECTOR_RE(19); PPSIGMA = VALVECTOR_RE(20) 471 PPNMOL = VALVECTOR_INT(46); PPNGEOM = VALVECTOR_INT(47) 472 473 PARREP = VALVECTOR_INT(48) 474 475 ! Verbosity level to control general output 476 477 VERBOSE = VALVECTOR_INT(49) 478 479 ! If Pulay Mixer 480 481 MIXER = VALVECTOR_INT(50) 482 483 ! Restart option for latte lib. 484 485 MIXER = VALVECTOR_INT(51) 486 487 ! Dielectric constant 488 489 RELPERM = VALVECTOR_RE(21) 490 491 ! Coordinates and parameter paths 492 493 PARAMPATH = VALVECTOR_CHAR(5) 494 COORDSFILE = VALVECTOR_CHAR(6) 495 496 ! If latte_lib has to be restarted 497 498 RESTARTLIB = VALVECTOR_INT(51) 499 500 ! Freeze atoms 501 502 FREEZE = VALVECTOR_INT(52) 503 504 IF (ELECTRO == 1 .AND. ELECMETH == 1 .AND. PBCON == 1) THEN 505 CALL ERRORS("latteparser_latte_mod","If CONTROL{ELECTRO= 1 ELECMETH= 1} & 506 &then CONTROL{PBCON= 0}") 507 END IF 508 509 SCLTYPE = VALVECTOR_CHAR(7) 510 511 STOPATMAXSCF = VALVECTOR_LOG(2) 512 513 END SUBROUTINE PARSE_CONTROL 514 515 516 !> The parser for Latte General input variables. 517 !! 518 SUBROUTINE PARSE_MD(FILENAME) 519 520 IMPLICIT NONE 521 INTEGER, PARAMETER :: NKEY_CHAR = 3, NKEY_INT = 18, NKEY_RE = 10, NKEY_LOG = 1 522 CHARACTER(LEN=*) :: FILENAME 523 524 !Library of keywords with the respective defaults. 525 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_CHAR(NKEY_CHAR) = [CHARACTER(LEN=100) :: & 526 'RNDIST=','SEEDINIT=','NPTTYPE='] 527 CHARACTER(LEN=100) :: VALVECTOR_CHAR(NKEY_CHAR) = [CHARACTER(LEN=100) :: & 528 'GAUSSIAN','UNIFORM','ISO'] 529 530 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_INT(NKEY_INT) = [CHARACTER(LEN=50) :: & 531 'MAXITER=', 'UDNEIGH=', 'DUMPFREQ=','RSFREQ=', 'WRTFREQ=', 'TOINITTEMP5=', 'THERMPER=',& !7 532 'THERMRUN=', 'NVTON=', 'NPTON=', 'AVEPER=', 'SEED=', 'SHOCKON=',& 533 'SHOCKSTART=','SHOCKDIR=','MDADAPT=','GETHUG=','RSLEVEL='] 534 INTEGER :: VALVECTOR_INT(NKEY_INT) = (/ & 535 5000,1,250,500,25,1,500, & 536 50000,0,0,1000,54,0, & 537 100000,1,0,0,0/) 538 539 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_RE(NKEY_RE) = [CHARACTER(LEN=50) :: & 540 'DT=','TEMPERATURE=','FRICTION=','PTARGET=','UPARTICLE=','USHOCK=','C0=', 'E0=',& 541 'V0=','P0='] 542 REAL(DP) :: VALVECTOR_RE(NKEY_RE) = (/& 543 0.25,300.00,1000.0,0.0,500.0,-4590.0,1300.0,-795.725,& 544 896.984864,0.083149/) 545 546 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_LOG(NKEY_LOG) = [CHARACTER(LEN=100) :: & 547 'DUMMY='] 548 LOGICAL :: VALVECTOR_LOG(NKEY_LOG) = (/& 549 .FALSE./) 550 551 !Start and stop characters 552 CHARACTER(LEN=50), PARAMETER :: STARTSTOP(2) = [CHARACTER(LEN=50) :: & 553 'MDCONTROL{', '}'] 554 555 CALL PARSING_KERNEL(KEYVECTOR_CHAR,VALVECTOR_CHAR& 556 ,KEYVECTOR_INT,VALVECTOR_INT,KEYVECTOR_RE,VALVECTOR_RE,& 557 KEYVECTOR_LOG,VALVECTOR_LOG,TRIM(FILENAME),STARTSTOP) 558 559 560 ! 561 ! MAXITER = run this many MD time steps 562 ! 563 564 MAXITER = VALVECTOR_INT(1) 565 566 ! 567 ! UDNEIGH = update the neighbor lists every UDNEIGH time steps 568 ! 569 570 UDNEIGH = VALVECTOR_INT(2) 571 ! write(*,*)"UDNEIGH",UDNEIGH 572 ! 573 ! DT = size of the time step in fs 574 ! 575 576 DT = VALVECTOR_RE(1) 577 ! write(*,*)"DT",DT 578 ! 579 ! TTARGET = temperature in K were initialize and aim for during NVT MD 580 ! RNDIST = Type of distribution of random numbers used to initialize T 581 ! = GAUSSIAN or UNIFORM 582 ! SEEDINIT = Type of seed used in the generation of random numbers 583 ! = RANDOM - seed changes every time 584 ! = DEFAULT - use the same, default seed every time 585 ! 586 587 TTARGET = VALVECTOR_RE(2); RNDIST = VALVECTOR_CHAR(1); SEEDINIT = VALVECTOR_CHAR(2) 588 ! write(*,*)"TTARGET,RNDIST,SEEDINIT",TTARGET,RNDIST,SEEDINIT 589 ! 590 ! DUMPFREQ: Write a dump file every DUMPFREQ time steps 591 ! 592 593 DUMPFREQ = VALVECTOR_INT(3) 594 ! write(*,*)"DUMPFREQ",DUMPFREQ 595 ! 596 ! RSFREQ: Write a restart file every RSFREQ time steps 597 ! 598 599 RSFREQ = VALVECTOR_INT(4) 600 ! write(*,*)"RSFREQ",RSFREQ 601 ! 602 ! WRTFREQ: Output energy and temperature every WRTFREQ time steps 603 ! 604 605 WRTFREQ = VALVECTOR_INT(5) 606 IF ( WRTFREQ <= 0 ) THEN 607 CALL ERRORS("latteparser_latte_mod","You cannot have WRTFREQ <= 0.& 608 &Set this variable to a very high value to avoid frequent printing") 609 ENDIF 610 ! write(*,*)"WRTFREQ",WRTFREQ 611 ! 612 ! TOINITTEMP: Whether or not we are going to initialize velocities 613 ! using a random number generator (sometimes during a restart we 614 ! may not want to reinitialize the temperature 615 ! 616 617 TOINITTEMP = VALVECTOR_INT(6) 618 ! write(*,*)"TOINITTEMP",TOINITTEMP 619 ! 620 ! THERMPER: If we're running NVT, rescale velocities every THERMPER 621 ! time steps. 622 ! 623 624 THERMPER = VALVECTOR_INT(7) 625 ! write(*,*)"THERMPER",THERMPER 626 ! 627 ! THERMRUN: Thermalize over this many time steps when NVT is on 628 ! 629 630 THERMRUN = VALVECTOR_INT(8) 631 ! write(*,*)"THERMRUN",THERMRUN 632 ! 633 ! NVTON: 0 = running NVE MD, 1 = running NVT MD 634 ! AVEPER: Average the temperature over AVEPER time steps when determining 635 ! how to rescale velocities 636 ! 637 638 NVTON = VALVECTOR_INT(9); NPTON = VALVECTOR_INT(10) 639 ! write(*,*)"NVTON,NPTON",NVTON,NPTON 640 AVEPER = VALVECTOR_INT(11); FRICTION = VALVECTOR_RE(3); SEEDTH = VALVECTOR_INT(12) 641 ! write(*,*)"AVEPER,FRICTION,SEEDTH",AVEPER,FRICTION,SEEDTH 642 643 644 IF (NVTON .EQ. 1 .AND. NPTON .EQ. 1) THEN 645 CALL ERRORS("latteparser_latte_mod","You can't have NVTON = 1 and NPTON = 1") 646 ENDIF 647 648 ! PTARGET = Target pressure (in GPa) when running NPT 649 ! NPTTYPE = ISO or ANISO 650 651 PTARGET = VALVECTOR_RE(4); NPTTYPE = VALVECTOR_CHAR(3) 652 ! write(*,*)"PTARGET,NPTTYPE",PTARGET,NPTTYPE 653 654 ! 655 ! The following are for the Hugoniostat 656 ! 657 658 ! On (1) or off (0)? 659 660 SHOCKON = VALVECTOR_INT(13) 661 ! write(*,*)"SHOCKON",SHOCKON 662 ! 663 ! SHOCKSTART = the MD iteration where we will start to compress 664 ! the iteration when we stop depends on the size of the block and Us 665 ! 666 667 SHOCKSTART = VALVECTOR_INT(14) 668 ! write(*,*)"SHOCKSTART",SHOCKSTART 669 ! 670 ! SHOCKDIR is the cartensian direction (1 = X, 2 = Y, 3 = Z), 671 ! parallel to which we're going to compress uniaxially 672 ! 673 674 SHOCKDIR = VALVECTOR_INT(15) 675 ! write(*,*)"SHOCKDIR",SHOCKDIR 676 ! 677 ! And finally, the particle and shock velocities 678 ! IN UNITS OF METRES PER SECOND 679 ! 680 681 UPARTICLE = VALVECTOR_RE(5); USHOCK = VALVECTOR_RE(6); C0 = VALVECTOR_RE(7) 682 ! write(*,*)"UPARTICLE,USHOCK,C0",UPARTICLE,USHOCK,C0 683 ! Adapt SCF on the fly? 684 685 MDADAPT = VALVECTOR_INT(16) 686 ! write(*,*)"MDADAPT",MDADAPT 687 ! Calculating Hugoniot points? 688 689 GETHUG = VALVECTOR_INT(17) 690 691 RSLEVEL = VALVECTOR_INT(18) 692 693 ! write(*,*)"GETHUG",GETHUG 694 E0 = VALVECTOR_RE(8); V0 = VALVECTOR_RE(9); P0 = VALVECTOR_RE(10) 695 ! write(*,*)"E0,V0,P0",E0,V0,P0 696 697 END SUBROUTINE PARSE_MD 698 699 700 !> The parser for K Mesh input variables. 701 !! 702 SUBROUTINE PARSE_KMESH(FILENAME) 703 704 IMPLICIT NONE 705 INTEGER, PARAMETER :: NKEY_CHAR = 1, NKEY_INT = 3, NKEY_RE = 3, NKEY_LOG = 1 706 CHARACTER(LEN=*) :: FILENAME 707 708 !Library of keywords with the respective defaults. 709 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_CHAR(NKEY_CHAR) = [CHARACTER(LEN=100) :: & 710 'DUMMY='] 711 CHARACTER(LEN=100) :: VALVECTOR_CHAR(NKEY_CHAR) = [CHARACTER(LEN=100) :: & 712 'DUMMY'] 713 714 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_INT(NKEY_INT) = [CHARACTER(LEN=50) :: & 715 'NKX=','NKY=','NKZ='] 716 INTEGER :: VALVECTOR_INT(NKEY_INT) = (/ & 717 1,1,1/) 718 719 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_RE(NKEY_RE) = [CHARACTER(LEN=50) :: & 720 'KSHIFTX=','KSHIFTY=','KSHIFTZ='] 721 REAL(DP) :: VALVECTOR_RE(NKEY_RE) = (/& 722 0.0,0.0,0.0/) 723 724 CHARACTER(LEN=50), PARAMETER :: KEYVECTOR_LOG(NKEY_LOG) = [CHARACTER(LEN=100) :: & 725 'DUMMY='] 726 LOGICAL :: VALVECTOR_LOG(NKEY_LOG) = (/& 727 .FALSE./) 728 729 !Start and stop characters 730 CHARACTER(LEN=50), PARAMETER :: STARTSTOP(2) = [CHARACTER(LEN=50) :: & 731 'KMESH{', '}'] 732 733 CALL PARSING_KERNEL(KEYVECTOR_CHAR,VALVECTOR_CHAR& 734 ,KEYVECTOR_INT,VALVECTOR_INT,KEYVECTOR_RE,VALVECTOR_RE,& 735 KEYVECTOR_LOG,VALVECTOR_LOG,TRIM(FILENAME),STARTSTOP) 736 737 NKX= VALVECTOR_INT(1); NKY= VALVECTOR_INT(2); NKZ=VALVECTOR_INT(3) 738 KSHIFT(1)= VALVECTOR_RE(1); KSHIFT(2)= VALVECTOR_RE(2); KSHIFT(3)= VALVECTOR_RE(3) 739 740 741 END SUBROUTINE PARSE_KMESH 742 743 744END MODULE LATTEPARSER_LATTE_MOD 745