35#include "./base/base_uses.f90"
41 INTEGER,
PARAMETER,
PRIVATE :: nelem = 106
52 INTEGER,
DIMENSION(0:nelem), &
53 PARAMETER,
PRIVATE :: zval = (/-1, &
55 1, 2, 3, 4, 5, 6, 7, 8, &
56 1, 2, 3, 4, 5, 6, 7, 8, &
57 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, &
58 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, &
59 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, &
60 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, &
61 -1, -1, -1, 4, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
66 REAL(KIND=
dp),
DIMENSION(0:nelem), &
67 PARAMETER,
PRIVATE :: eneg = (/0.00_dp, &
69 0.98_dp, 1.57_dp, 2.04_dp, 2.55_dp, 3.04_dp, 3.44_dp, 3.98_dp, 4.50_dp, &
70 0.93_dp, 1.31_dp, 1.61_dp, 1.90_dp, 2.19_dp, 2.58_dp, 3.16_dp, 3.50_dp, &
71 0.82_dp, 1.00_dp, 1.36_dp, 1.54_dp, 1.63_dp, 1.66_dp, 1.55_dp, 1.83_dp, &
72 1.88_dp, 1.91_dp, 1.90_dp, 1.65_dp, 1.81_dp, 2.01_dp, 2.18_dp, 2.55_dp, 2.96_dp, 3.00_dp, &
73 0.82_dp, 0.95_dp, 1.22_dp, 1.33_dp, 1.60_dp, 2.16_dp, 1.90_dp, 2.20_dp, &
74 2.28_dp, 2.20_dp, 1.93_dp, 1.69_dp, 1.78_dp, 1.96_dp, 2.05_dp, 2.10_dp, 2.66_dp, 2.60_dp, &
75 0.79_dp, 0.89_dp, 1.10_dp, &
76 1.12_dp, 1.13_dp, 1.14_dp, 1.15_dp, 1.17_dp, 1.18_dp, 1.20_dp, 1.21_dp, &
77 1.22_dp, 1.23_dp, 1.24_dp, 1.25_dp, 1.26_dp, 1.27_dp, &
78 1.30_dp, 1.50_dp, 2.36_dp, 1.90_dp, 2.20_dp, 2.20_dp, 2.28_dp, 2.54_dp, &
79 2.00_dp, 2.04_dp, 2.33_dp, 2.02_dp, 2.00_dp, 2.20_dp, 2.20_dp, &
80 0.70_dp, 0.89_dp, 1.10_dp, &
81 1.30_dp, 1.50_dp, 1.38_dp, 1.36_dp, 1.28_dp, 1.30_dp, 1.30_dp, 1.30_dp, &
82 1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.50_dp, &
83 1.50_dp, 1.50_dp, 1.50_dp/)
88 INTEGER,
DIMENSION(1:5, 0:nelem) :: occupation = reshape((/0,0,0,0,0, &
89 1,0,0,0,0, 2,0,0,0,0, &
90 1,0,0,0,0, 2,0,0,0,0, 2,1,0,0,0, 2,2,0,0,0, 2,3,0,0,0, 2,4,0,0,0, 2,5,0,0,0, 2,6,0,0,0, &
91 1,0,0,0,0, 2,0,0,0,0, 2,1,0,0,0, 2,2,0,0,0, 2,3,0,0,0, 2,4,0,0,0, 2,5,0,0,0, 2,6,0,0,0, &
92 1,0,0,0,0, 2,0,0,0,0, 2,0,1,0,0, 2,0,2,0,0, 2,0,3,0,0, 2,0,4,0,0, 2,0,5,0,0, 2,0,6,0,0, &
93 2,0,7,0,0, 2,0,8,0,0, 2,0,9,0,0, 2,0,0,0,0, 2,1,0,0,0, 2,2,0,0,0, 2,3,0,0,0, 2,4,0,0,0, 2,5,0,0,0, 2,6,0,0,0, &
94 1,0,0,0,0, 2,0,0,0,0, 2,0,1,0,0, 2,0,2,0,0, 2,0,3,0,0, 2,0,4,0,0, 2,0,5,0,0, 2,0,6,0,0, &
95 2,0,7,0,0, 2,0,8,0,0, 2,0,9,0,0, 2,0,0,0,0, 2,1,0,0,0, 2,2,0,0,0, 2,3,0,0,0, 2,4,0,0,0, 2,5,0,0,0, 2,6,0,0,0, &
96 1,0,0,0,0, 2,0,0,0,0, 2,0,1,0,0, &
97 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, &
98 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, 2,0,1,0,0, &
99 2,0,2,0,0, 2,0,3,0,0, 2,0,4,0,0, 2,0,5,0,0, 2,0,6,0,0, 2,0,7,0,0, 2,0,8,0,0, 2,0,9,0,0, &
100 2,0,0,0,0, 2,1,0,0,0, 2,2,0,0,0, 2,3,0,0,0, 2,4,0,0,0, 2,5,0,0,0, 2,6,0,0,0, &
101 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, &
102 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, &
103 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, &
104 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0/), (/5, nelem+1/))
113 REAL(KIND=
dp),
DIMENSION(0:nelem), &
114 PARAMETER,
PRIVATE :: crad = (/0.00_dp, &
116 1.30_dp, 0.99_dp, 0.84_dp, 0.75_dp, 0.71_dp, 0.64_dp, 0.60_dp, 0.62_dp, &
117 1.60_dp, 1.40_dp, 1.24_dp, 1.14_dp, 1.09_dp, 1.04_dp, 1.00_dp, 1.01_dp, &
118 2.00_dp, 1.74_dp, 1.59_dp, 1.48_dp, 1.44_dp, 1.30_dp, 1.29_dp, 1.24_dp, &
119 1.18_dp, 1.17_dp, 1.22_dp, 1.20_dp, 1.23_dp, 1.20_dp, 1.20_dp, 1.18_dp, 1.17_dp, 1.16_dp, &
120 2.15_dp, 1.90_dp, 1.76_dp, 1.64_dp, 1.56_dp, 1.46_dp, 1.38_dp, 1.36_dp, &
121 1.34_dp, 1.30_dp, 1.36_dp, 1.40_dp, 1.42_dp, 1.40_dp, 1.40_dp, 1.37_dp, 1.36_dp, 1.36_dp, &
122 2.38_dp, 2.06_dp, 1.94_dp, &
123 1.84_dp, 1.90_dp, 1.88_dp, 1.86_dp, 1.85_dp, 1.83_dp, 1.82_dp, 1.81_dp, &
124 1.80_dp, 1.79_dp, 1.77_dp, 1.77_dp, 1.78_dp, 1.74_dp, &
125 1.64_dp, 1.58_dp, 1.50_dp, 1.41_dp, 1.36_dp, 1.32_dp, 1.30_dp, 1.30_dp, &
126 1.32_dp, 1.44_dp, 1.45_dp, 1.50_dp, 1.42_dp, 1.48_dp, 1.46_dp, &
127 2.42_dp, 2.11_dp, 2.01_dp, &
128 1.90_dp, 1.84_dp, 1.83_dp, 1.80_dp, 1.80_dp, 1.51_dp, 0.96_dp, 1.54_dp, &
129 1.83_dp, 1.50_dp, 1.50_dp, 1.50_dp, 1.50_dp, 1.50_dp, &
130 1.50_dp, 1.50_dp, 1.50_dp/)
135 REAL(KIND=
dp),
DIMENSION(0:nelem), &
136 PARAMETER,
PRIVATE :: clmt = (/0.00_dp, &
138 1.05_dp, 2.05_dp, 3.00_dp, 4.00_dp, 3.00_dp, 2.00_dp, 1.25_dp, 1.00_dp, &
139 1.05_dp, 2.05_dp, 3.00_dp, 4.00_dp, 3.00_dp, 2.00_dp, 1.25_dp, 1.00_dp, &
140 1.05_dp, 2.05_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
141 3.50_dp, 3.50_dp, 3.50_dp, 2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 1.25_dp, 1.00_dp, &
142 1.05_dp, 2.05_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
143 3.50_dp, 3.50_dp, 3.50_dp, 2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 1.25_dp, 1.00_dp, &
144 1.05_dp, 2.05_dp, 3.00_dp, &
145 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
146 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
147 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
148 2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 1.25_dp, 1.00_dp, &
149 1.05_dp, 2.05_dp, 3.00_dp, &
150 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
151 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
152 3.00_dp, 3.00_dp, 3.00_dp/)
157 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'xtb_parameters'
176 parameter_file_path, parameter_file_name, &
180 INTEGER,
INTENT(IN) :: gfn_type
181 CHARACTER(LEN=2),
INTENT(IN) :: element_symbol
182 CHARACTER(LEN=*),
INTENT(IN) :: parameter_file_path, parameter_file_name
185 SELECT CASE (gfn_type)
187 CALL xtb0_parameters_init(param, element_symbol, parameter_file_path, &
188 parameter_file_name, para_env)
190 CALL xtb1_parameters_init(param, element_symbol, parameter_file_path, &
191 parameter_file_name, para_env)
193 cpabort(
"gfn_type = 2 not yet supported")
195 cpabort(
"Wrong gfn_type")
208 SUBROUTINE xtb0_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
212 CHARACTER(LEN=2),
INTENT(IN) :: element_symbol
213 CHARACTER(LEN=*),
INTENT(IN) :: parameter_file_path, parameter_file_name
216 CHARACTER(len=2) :: esym
217 CHARACTER(len=default_string_length) :: aname, atag, filename
218 INTEGER :: i, l, zin, znum
219 LOGICAL :: at_end, found
222 filename = adjustl(trim(parameter_file_path))//adjustl(trim(parameter_file_name))
223 CALL parser_create(parser, filename, apply_preprocessing=.false., para_env=para_env)
233 IF (aname ==
"$Z")
THEN
235 IF (zin == znum)
THEN
240 cpabort(
"Incomplete xTB parameter file")
247 CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
249 DO i = 1, param%nshell
253 DO i = 1, param%nshell
264 param%kcn(1) = param%kcn(1)*0.1_dp
267 param%kcn(2) = param%kcn(2)*0.1_dp
270 param%kcn(3) = param%kcn(3)*0.1_dp
296 cpabort(
"Unknown parameter in xTB file")
306 param%typ =
"STANDARD"
307 param%symbol = element_symbol
308 param%defined = .true.
310 param%aname =
ptable(znum)%name
311 param%lmax = maxval(param%lval(1:param%nshell))
313 DO i = 1, param%nshell
315 param%natorb = param%natorb + (2*l + 1)
317 param%zeff = zval(znum)
319 esym = element_symbol
321 IF (
"X " == esym)
THEN
323 param%symbol = element_symbol
324 param%defined = .false.
332 param%defined = .false.
333 CALL cp_warn(__location__,
"xTB parameters for element "//element_symbol// &
334 " were not found in the parameter file "//adjustl(trim(filename)))
339 END SUBROUTINE xtb0_parameters_init
349 SUBROUTINE xtb1_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
353 CHARACTER(LEN=2),
INTENT(IN) :: element_symbol
354 CHARACTER(LEN=*),
INTENT(IN) :: parameter_file_path, parameter_file_name
357 CHARACTER(len=2) :: esym
358 CHARACTER(len=default_string_length) :: aname, atag, filename
359 INTEGER :: i, l, zin, znum
360 LOGICAL :: at_end, found
363 filename = adjustl(trim(parameter_file_path))//adjustl(trim(parameter_file_name))
364 CALL parser_create(parser, filename, apply_preprocessing=.false., para_env=para_env)
374 IF (aname ==
"$Z")
THEN
376 IF (zin == znum)
THEN
381 cpabort(
"Incomplete xTB parameter file")
388 CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
390 DO i = 1, param%nshell
394 DO i = 1, param%nshell
420 cpabort(
"Unknown parameter in xTB file")
430 param%typ =
"STANDARD"
431 param%symbol = element_symbol
432 param%defined = .true.
434 param%aname =
ptable(znum)%name
435 param%lmax = maxval(param%lval(1:param%nshell))
437 DO i = 1, param%nshell
439 param%natorb = param%natorb + (2*l + 1)
441 param%zeff = zval(znum)
443 esym = element_symbol
445 IF (
"X " == esym)
THEN
447 param%symbol = element_symbol
448 param%defined = .false.
456 param%defined = .false.
457 CALL cp_warn(__location__,
"xTB parameters for element "//element_symbol// &
458 " were not found in the parameter file "//adjustl(trim(filename)))
463 END SUBROUTINE xtb1_parameters_init
473 INTEGER :: i, is, l, na
474 REAL(kind=
dp),
DIMENSION(5) :: kp
476 IF (param%defined)
THEN
480 DO is = 1, param%nshell
491 param%electronegativity = eneg(i)
492 IF (param%en == 0.0_dp) param%en = eneg(i)
494 param%rcov = crad(i)*
bohr
496 param%occupation(:) = occupation(:, i)
498 IF (abs(param%zeff - sum(param%occupation)) > 1.e-10_dp)
THEN
499 CALL cp_abort(__location__,
"Element <"//trim(param%aname)//
"> has inconsistent shell occupations")
502 param%hen = param%hen/
evolt
504 param%xgamma = 0.1_dp*param%xgamma
505 param%kpoly(:) = 0.01_dp*param%kpoly(:)
506 param%kappa(:) = 0.1_dp*param%kappa(:)
508 param%xgamma = -2.0_dp*param%xgamma
510 kp(:) = param%kpoly(:)
511 param%kpoly(:) = 0.0_dp
512 DO is = 1, param%nshell
514 param%kpoly(is) = kp(l + 1)
517 param%kx = 0.1_dp*param%kx
518 IF (param%kx < -5._dp)
THEN
520 SELECT CASE (param%z)
524 param%kx = 0.1_dp*0.381742_dp
526 param%kx = 0.1_dp*0.321944_dp
528 param%kx = 0.1_dp*0.220000_dp
532 param%chmax = clmt(i)
547 INTEGER,
INTENT(IN) :: ngauss
549 CHARACTER(LEN=6),
DIMENSION(:),
POINTER :: symbol
551 INTEGER,
DIMENSION(:),
POINTER :: lq, nq
552 REAL(kind=
dp),
DIMENSION(:),
POINTER :: zet
555 IF (
ASSOCIATED(param))
THEN
556 IF (param%defined)
THEN
557 NULLIFY (sto_basis_set)
559 nshell = param%nshell
561 ALLOCATE (symbol(1:nshell))
564 SELECT CASE (param%lval(i))
566 WRITE (symbol(i),
'(I1,A1)') param%nval(i),
"S"
568 WRITE (symbol(i),
'(I1,A1)') param%nval(i),
"P"
570 WRITE (symbol(i),
'(I1,A1)') param%nval(i),
"D"
572 WRITE (symbol(i),
'(I1,A1)') param%nval(i),
"F"
574 cpabort(
'BASIS SET OUT OF RANGE (lval)')
579 ALLOCATE (nq(nshell), lq(nshell), zet(nshell))
580 nq(1:nshell) = param%nval(1:nshell)
581 lq(1:nshell) = param%lval(1:nshell)
582 zet(1:nshell) = param%zeta(1:nshell)
583 CALL set_sto_basis_set(sto_basis_set, name=param%aname, nshell=nshell, symbol=symbol, &
584 nq=nq, lq=lq, zet=zet)
590 DEALLOCATE (symbol, nq, lq, zet)
594 cpabort(
"The pointer param is not associated")
608 INTEGER,
INTENT(IN) :: za, zb
618 IF (xtb_control%kab_nval .GT. 0)
THEN
619 DO j = 1, xtb_control%kab_nval
620 IF ((za == xtb_control%kab_types(1, j) .AND. &
621 zb == xtb_control%kab_types(2, j)) .OR. &
622 (za == xtb_control%kab_types(2, j) .AND. &
623 zb == xtb_control%kab_types(1, j)))
THEN
625 kab = xtb_control%kab_vals(j)
631 IF (.NOT. custom)
THEN
632 IF (za == 1 .OR. zb == 1)
THEN
649 ELSEIF (za == 5 .OR. zb == 5)
THEN
656 ELSEIF (za == 7 .OR. zb == 7)
THEN
665 ELSEIF (za > 20 .AND. za < 30)
THEN
667 IF (zb > 20 .AND. zb < 30)
THEN
670 ELSEIF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80))
THEN
672 kab = 0.50_dp*(1.20_dp + 1.10_dp)
674 ELSEIF ((za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80))
THEN
676 IF (zb > 20 .AND. zb < 30)
THEN
678 kab = 0.50_dp*(1.20_dp + 1.10_dp)
679 ELSEIF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80))
THEN
696 SUBROUTINE xtb_get_shells(atag, nshell, nval, lval)
697 CHARACTER(len=*) :: atag
699 INTEGER,
DIMENSION(:) :: nval, lval
701 CHARACTER(LEN=1) :: ltag
702 CHARACTER(LEN=10) :: aotag
705 aotag = adjustl(trim(atag))
706 nshell = len(trim(aotag))/2
709 READ (aotag(j:j), fmt=
"(i1)") nval(i)
710 READ (aotag(j + 1:j + 1), fmt=
"(A1)") ltag
723 END SUBROUTINE xtb_get_shells
737 CASE (1:2, 6:10, 14:18, 32:36, 50:54, 82:86)
753 IF (z >= 21 .AND. z <= 24) isearly3d = .true.
765 REAL(kind=
dp) :: pparm
768 IF ((za > 20 .AND. za < 30) .OR. (za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80))
THEN
769 IF ((zb > 20 .AND. zb < 30) .OR. (zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80))
THEN
771 IF (za == 29 .OR. za == 47 .OR. za == 79)
THEN
772 IF (za == 29 .OR. za == 47 .OR. za == 79)
THEN
subroutine, public deallocate_sto_basis_set(sto_basis_set)
...
subroutine, public allocate_sto_basis_set(sto_basis_set)
...
subroutine, public create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss, ortho)
...
subroutine, public set_sto_basis_set(sto_basis_set, name, nshell, symbol, nq, lq, zet)
...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_get_next_line(parser, nline, at_end)
Read the next input line and broadcast the input information. Skip (nline-1) lines and skip also all ...
Utility routines to read data from files. Kept as close as possible to the old parser because.
subroutine, public parser_release(parser)
releases the parser
subroutine, public parser_create(parser, file_name, unit_nr, para_env, end_section_label, separator_chars, comment_char, continuation_char, quote_char, section_char, parse_white_lines, initial_variables, apply_preprocessing)
Start a parser run. Initial variables allow to @SET stuff before opening the file.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
Periodic Table related data definitions.
type(atom), dimension(0:nelem), public ptable
subroutine, public get_ptable_info(symbol, number, amass, ielement, covalent_radius, metallic_radius, vdw_radius, found)
Pass information about the kind given the element symbol.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public bohr
Utilities for string manipulations.
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
subroutine, public xtb_parameters_set(param)
Read atom parameters for xTB Hamiltonian from input file.
logical function, public metal(z)
...
logical function, public early3d(z)
...
subroutine, public xtb_parameters_init(param, gfn_type, element_symbol, parameter_file_path, parameter_file_name, para_env)
...
subroutine, public init_xtb_basis(param, gto_basis_set, ngauss)
...
real(kind=dp) function, public pp_gfn0(za, zb)
...
real(kind=dp) function, public xtb_set_kab(za, zb, xtb_control)
...
Definition of the xTB parameter types.
stores all the informations relevant to an mpi environment