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