(git:374b731)
Loading...
Searching...
No Matches
xtb_parameters.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Read xTB parameters.
10!> \author JGH (10.2018)
11! **************************************************************************************************
13
32 USE input_val_types, ONLY: val_get,&
34 USE kinds, ONLY: default_string_length,&
35 dp
38 ptable
39 USE physcon, ONLY: bohr,&
40 evolt
41 USE string_utilities, ONLY: remove_word,&
43 USE xtb_types, ONLY: xtb_atom_type
44#include "./base/base_uses.f90"
45
46 IMPLICIT NONE
47
48 PRIVATE
49
50 INTEGER, PARAMETER, PRIVATE :: nelem = 106
51 ! H He
52 ! Li Be B C N O F Ne
53 ! Na Mg Al Si P S Cl Ar
54 ! K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr
55 ! Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe
56 ! Cs Ba La Ce-Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn
57 ! Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Ha 106
58
59!&<
60 ! Element Valence
61 INTEGER, DIMENSION(0:nelem), &
62 PARAMETER, PRIVATE :: zval = (/-1, & ! 0
63 1, 2, & ! 2
64 1, 2, 3, 4, 5, 6, 7, 8, & ! 10
65 1, 2, 3, 4, 5, 6, 7, 8, & ! 18
66 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & ! 36
67 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & ! 54
68 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, &
69 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & ! 86
70 -1, -1, -1, 4, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
71!&>
72
73!&<
74 ! Element Pauling Electronegativity
75 REAL(KIND=dp), DIMENSION(0:nelem), &
76 PARAMETER, PRIVATE :: eneg = (/0.00_dp, & ! 0
77 2.20_dp, 3.00_dp, & ! 2
78 0.98_dp, 1.57_dp, 2.04_dp, 2.55_dp, 3.04_dp, 3.44_dp, 3.98_dp, 4.50_dp, & ! 10
79 0.93_dp, 1.31_dp, 1.61_dp, 1.90_dp, 2.19_dp, 2.58_dp, 3.16_dp, 3.50_dp, & ! 18
80 0.82_dp, 1.00_dp, 1.36_dp, 1.54_dp, 1.63_dp, 1.66_dp, 1.55_dp, 1.83_dp, &
81 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, & ! 36
82 0.82_dp, 0.95_dp, 1.22_dp, 1.33_dp, 1.60_dp, 2.16_dp, 1.90_dp, 2.20_dp, &
83 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, & ! 54
84 0.79_dp, 0.89_dp, 1.10_dp, &
85 1.12_dp, 1.13_dp, 1.14_dp, 1.15_dp, 1.17_dp, 1.18_dp, 1.20_dp, 1.21_dp, &
86 1.22_dp, 1.23_dp, 1.24_dp, 1.25_dp, 1.26_dp, 1.27_dp, & ! Lanthanides
87 1.30_dp, 1.50_dp, 2.36_dp, 1.90_dp, 2.20_dp, 2.20_dp, 2.28_dp, 2.54_dp, &
88 2.00_dp, 2.04_dp, 2.33_dp, 2.02_dp, 2.00_dp, 2.20_dp, 2.20_dp, & ! 86
89 0.70_dp, 0.89_dp, 1.10_dp, &
90 1.30_dp, 1.50_dp, 1.38_dp, 1.36_dp, 1.28_dp, 1.30_dp, 1.30_dp, 1.30_dp, &
91 1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.30_dp, 1.50_dp, & ! Actinides
92 1.50_dp, 1.50_dp, 1.50_dp/)
93!&>
94
95!&<
96 ! Shell occupation
97 INTEGER, DIMENSION(1:5, 0:nelem) :: occupation = reshape((/0,0,0,0,0, & ! 0
98 1,0,0,0,0, 2,0,0,0,0, & ! 2
99 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, & ! 10
100 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, & ! 18
101 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, &
102 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, & ! 36
103 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, & !
104 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, & ! 54
105 1,0,0,0,0, 2,0,0,0,0, 2,0,1,0,0, &
106 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, &
107 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, & ! Lanthanides
108 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, &
109 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, & ! 86 (last element defined)
110 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0, & !
111 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, &
112 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, & ! Actinides
113 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0/), (/5, nelem+1/))
114!&>
115
116!&<
117 ! COVALENT RADII
118 ! based on "Atomic Radii of the Elements," M. Mantina, R. Valero, C. J. Cramer, and D. G. Truhlar,
119 ! in CRC Handbook of Chemistry and Physics, 91st Edition (2010-2011),
120 ! edited by W. M. Haynes (CRC Press, Boca Raton, FL, 2010), pages 9-49-9-50;
121 ! corrected Nov. 17, 2010 for the 92nd edition.
122 REAL(KIND=dp), DIMENSION(0:nelem), &
123 PARAMETER, PRIVATE :: crad = (/0.00_dp, & ! 0
124 0.32_dp, 0.37_dp, & ! 2
125 1.30_dp, 0.99_dp, 0.84_dp, 0.75_dp, 0.71_dp, 0.64_dp, 0.60_dp, 0.62_dp, & ! 10
126 1.60_dp, 1.40_dp, 1.24_dp, 1.14_dp, 1.09_dp, 1.04_dp, 1.00_dp, 1.01_dp, & ! 18
127 2.00_dp, 1.74_dp, 1.59_dp, 1.48_dp, 1.44_dp, 1.30_dp, 1.29_dp, 1.24_dp, &
128 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, & ! 36
129 2.15_dp, 1.90_dp, 1.76_dp, 1.64_dp, 1.56_dp, 1.46_dp, 1.38_dp, 1.36_dp, &
130 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, & ! 54
131 2.38_dp, 2.06_dp, 1.94_dp, &
132 1.84_dp, 1.90_dp, 1.88_dp, 1.86_dp, 1.85_dp, 1.83_dp, 1.82_dp, 1.81_dp, &
133 1.80_dp, 1.79_dp, 1.77_dp, 1.77_dp, 1.78_dp, 1.74_dp, & ! Lanthanides
134 1.64_dp, 1.58_dp, 1.50_dp, 1.41_dp, 1.36_dp, 1.32_dp, 1.30_dp, 1.30_dp, &
135 1.32_dp, 1.44_dp, 1.45_dp, 1.50_dp, 1.42_dp, 1.48_dp, 1.46_dp, & ! 86
136 2.42_dp, 2.11_dp, 2.01_dp, &
137 1.90_dp, 1.84_dp, 1.83_dp, 1.80_dp, 1.80_dp, 1.51_dp, 0.96_dp, 1.54_dp, &
138 1.83_dp, 1.50_dp, 1.50_dp, 1.50_dp, 1.50_dp, 1.50_dp, & ! Actinides
139 1.50_dp, 1.50_dp, 1.50_dp/)
140!&>
141
142!&<
143 ! Charge Limits (Mulliken)
144 REAL(KIND=dp), DIMENSION(0:nelem), &
145 PARAMETER, PRIVATE :: clmt = (/0.00_dp, & ! 0
146 1.05_dp, 1.25_dp, & ! 2
147 1.05_dp, 2.05_dp, 3.00_dp, 4.00_dp, 3.00_dp, 2.00_dp, 1.25_dp, 1.00_dp, & ! 10
148 1.05_dp, 2.05_dp, 3.00_dp, 4.00_dp, 3.00_dp, 2.00_dp, 1.25_dp, 1.00_dp, & ! 18
149 1.05_dp, 2.05_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
150 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, & ! 36
151 1.05_dp, 2.05_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
152 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, & ! 54
153 1.05_dp, 2.05_dp, 3.00_dp, &
154 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
155 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, & ! Lanthanides
156 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, &
157 2.50_dp, 2.50_dp, 3.50_dp, 3.50_dp, 3.50_dp, 1.25_dp, 1.00_dp, & ! 86
158 1.05_dp, 2.05_dp, 3.00_dp, &
159 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, &
160 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, 3.00_dp, & ! Actinides
161 3.00_dp, 3.00_dp, 3.00_dp/)
162!&>
163
164! *** Global parameters ***
165
166 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_parameters'
167
168! *** Public data types ***
169
172
173CONTAINS
174
175! **************************************************************************************************
176!> \brief ...
177!> \param param ...
178!> \param element_symbol ...
179!> \param parameter_file_path ...
180!> \param parameter_file_name ...
181!> \param para_env ...
182! **************************************************************************************************
183 SUBROUTINE xtb_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
184 para_env)
185
186 TYPE(xtb_atom_type), POINTER :: param
187 CHARACTER(LEN=2), INTENT(IN) :: element_symbol
188 CHARACTER(LEN=*), INTENT(IN) :: parameter_file_path, parameter_file_name
189 TYPE(mp_para_env_type), POINTER :: para_env
190
191 CHARACTER(len=2) :: enam, esym
192 CHARACTER(len=default_string_length) :: aname, filename
193 INTEGER :: i, ia, l
194 LOGICAL :: at_end, found
195 TYPE(cp_parser_type) :: parser
196
197 filename = adjustl(trim(parameter_file_path))//adjustl(trim(parameter_file_name))
198 CALL parser_create(parser, filename, para_env=para_env)
199 found = .false.
200 DO
201 at_end = .false.
202 CALL parser_get_next_line(parser, 1, at_end)
203 IF (at_end) EXIT
204 CALL parser_get_object(parser, aname)
205 enam = aname
206 esym = element_symbol
207 CALL uppercase(enam)
208 CALL uppercase(esym)
209 IF (enam == esym) THEN
210 found = .true.
211 CALL parser_get_object(parser, param%eta)
212 CALL parser_get_object(parser, param%xgamma)
213 CALL parser_get_object(parser, param%alpha)
214 CALL parser_get_object(parser, param%zneff)
215 DO i = 1, 5
216 CALL parser_get_object(parser, aname)
217 ia = ichar(aname(1:1))
218 IF (ia >= 49 .AND. ia <= 57) THEN
219 CALL parser_get_object(parser, param%kpoly(i))
220 CALL parser_get_object(parser, param%kappa(i))
221 CALL parser_get_object(parser, param%hen(i))
222 CALL parser_get_object(parser, param%zeta(i))
223 param%nshell = i
224 param%nval(i) = ia - 48
225 SELECT CASE (aname(2:2))
226 CASE ("s", "S")
227 param%lval(i) = 0
228 CASE ("p", "P")
229 param%lval(i) = 1
230 CASE ("d", "D")
231 param%lval(i) = 2
232 CASE ("f", "F")
233 param%lval(i) = 3
234 CASE DEFAULT
235 cpabort("xTB PARAMETER ERROR")
236 END SELECT
237 CALL parser_get_next_line(parser, 1, at_end)
238 IF (at_end) EXIT
239 ELSE
240 EXIT
241 END IF
242 END DO
243 EXIT
244 END IF
245 END DO
246 IF (found) THEN
247 param%typ = "STANDARD"
248 param%symbol = element_symbol
249 param%defined = .true.
250 CALL get_ptable_info(element_symbol, number=ia)
251 param%z = ia
252 param%aname = ptable(ia)%name
253 param%lmax = maxval(param%lval(1:param%nshell))
254 param%natorb = 0
255 DO i = 1, param%nshell
256 l = param%lval(i)
257 param%natorb = param%natorb + (2*l + 1)
258 END DO
259 param%zeff = zval(ia)
260 ELSE
261 esym = element_symbol
262 CALL uppercase(esym)
263 IF ("X " == esym) THEN
264 param%typ = "GHOST"
265 param%symbol = element_symbol
266 param%defined = .false.
267 param%z = 0
268 param%aname = "X "
269 param%lmax = 0
270 param%natorb = 0
271 param%nshell = 0
272 param%zeff = 0.0_dp
273 ELSE
274 param%defined = .false.
275 CALL cp_warn(__location__, "xTB parameters for element "//element_symbol// &
276 " were not found in the parameter file "//adjustl(trim(filename)))
277 END IF
278 END IF
279 CALL parser_release(parser)
280
281 END SUBROUTINE xtb_parameters_init
282
283! **************************************************************************************************
284!> \brief Read atom parameters for xTB Hamiltonian from input file
285!> \param param ...
286!> \param element_symbol ...
287!> \param xtb_section ...
288! **************************************************************************************************
289 SUBROUTINE xtb_parameters_read(param, element_symbol, xtb_section)
290
291 TYPE(xtb_atom_type), POINTER :: param
292 CHARACTER(LEN=2), INTENT(IN) :: element_symbol
293 TYPE(section_vals_type), POINTER :: xtb_section
294
295 CHARACTER(LEN=2) :: label
296 CHARACTER(len=20*default_string_length) :: line_att
297 INTEGER :: i, ia, k, l, nshell
298 LOGICAL :: explicit, found, is_ok
299 TYPE(cp_sll_val_type), POINTER :: list
300 TYPE(section_vals_type), POINTER :: ap_section
301 TYPE(val_type), POINTER :: val
302
303 !
304 ! This could probably be done nicer
305 !
306 NULLIFY (list, val)
307 ap_section => section_vals_get_subs_vals(xtb_section, "ATOM_PARAMETER")
308 CALL section_vals_get(ap_section, explicit=explicit)
309 IF (explicit) THEN
310 CALL section_vals_list_get(ap_section, "_DEFAULT_KEYWORD_", list=list)
311 found = .false.
312 nshell = 0
313 DO
314 is_ok = cp_sll_val_next(list, val)
315 IF (.NOT. is_ok) EXIT
316 CALL val_get(val, c_val=line_att)
317 IF (found) THEN
318 READ (line_att, *) label
319 CALL remove_word(line_att)
320 ia = ichar(label(1:1))
321 IF (ia >= 49 .AND. ia <= 57) THEN
322 nshell = nshell + 1
323 k = nshell
324 param%nval(k) = ia - 48
325 SELECT CASE (label(2:2))
326 CASE ("s", "S")
327 param%lval(k) = 0
328 CASE ("p", "P")
329 param%lval(k) = 1
330 CASE ("d", "D")
331 param%lval(k) = 2
332 CASE ("f", "F")
333 param%lval(k) = 3
334 CASE DEFAULT
335 cpabort("xTB PARAMETER ERROR")
336 END SELECT
337 !
338 READ (line_att, *) param%kpoly(k)
339 CALL remove_word(line_att)
340 READ (line_att, *) param%kappa(k)
341 CALL remove_word(line_att)
342 READ (line_att, *) param%hen(k)
343 CALL remove_word(line_att)
344 READ (line_att, *) param%zeta(k)
345 CALL remove_word(line_att)
346 ELSE
347 EXIT
348 END IF
349 ELSE
350 READ (line_att, *) label
351 CALL remove_word(line_att)
352 IF (label == element_symbol) THEN
353 found = .true.
354 nshell = nshell + 1
355 k = nshell
356 READ (line_att, *) param%eta
357 CALL remove_word(line_att)
358 READ (line_att, *) param%xgamma
359 CALL remove_word(line_att)
360 READ (line_att, *) param%alpha
361 CALL remove_word(line_att)
362 READ (line_att, *) param%zneff
363 CALL remove_word(line_att)
364 READ (line_att, *) label
365 CALL remove_word(line_att)
366 ia = ichar(label(1:1))
367 cpassert((ia >= 49 .AND. ia <= 57))
368 param%nval(k) = ia - 48
369 SELECT CASE (label(2:2))
370 CASE ("s", "S")
371 param%lval(k) = 0
372 CASE ("p", "P")
373 param%lval(k) = 1
374 CASE ("d", "D")
375 param%lval(k) = 2
376 CASE ("f", "F")
377 param%lval(k) = 3
378 CASE DEFAULT
379 cpabort("xTB PARAMETER ERROR")
380 END SELECT
381 !
382 READ (line_att, *) param%kpoly(k)
383 CALL remove_word(line_att)
384 READ (line_att, *) param%kappa(k)
385 CALL remove_word(line_att)
386 READ (line_att, *) param%hen(k)
387 CALL remove_word(line_att)
388 READ (line_att, *) param%zeta(k)
389 CALL remove_word(line_att)
390 END IF
391 END IF
392 END DO
393 IF (found) THEN
394 param%typ = "STANDARD"
395 param%symbol = element_symbol
396 param%defined = .true.
397 CALL get_ptable_info(element_symbol, number=ia)
398 param%z = ia
399 param%aname = ptable(ia)%name
400 param%lmax = maxval(param%lval(1:param%nshell))
401 param%natorb = 0
402 param%nshell = nshell
403 DO i = 1, param%nshell
404 l = param%lval(i)
405 param%natorb = param%natorb + (2*l + 1)
406 END DO
407 param%zeff = zval(ia)
408 END IF
409 END IF
410
411 END SUBROUTINE xtb_parameters_read
412
413! **************************************************************************************************
414!> \brief Read atom parameters for xTB Hamiltonian from input file
415!> \param param ...
416! **************************************************************************************************
417 SUBROUTINE xtb_parameters_set(param)
418
419 TYPE(xtb_atom_type), POINTER :: param
420
421 INTEGER :: i, is, l, na
422 REAL(kind=dp), DIMENSION(5) :: kp
423
424 IF (param%defined) THEN
425 ! AO to shell pointer
426 ! AO to l-qn pointer
427 na = 0
428 DO is = 1, param%nshell
429 l = param%lval(is)
430 DO i = 1, 2*l + 1
431 na = na + 1
432 param%nao(na) = is
433 param%lao(na) = l
434 END DO
435 END DO
436 !
437 i = param%z
438 ! Electronegativity
439 param%electronegativity = eneg(i)
440 ! covalent radius
441 param%rcov = crad(i)*bohr
442 ! shell occupances
443 param%occupation(:) = occupation(:, i)
444 ! check for consistency
445 IF (abs(param%zeff - sum(param%occupation)) > 1.e-10_dp) THEN
446 CALL cp_abort(__location__, "Element <"//trim(param%aname)//"> has inconsistent shell occupations")
447 END IF
448 ! orbital energies [evolt] -> [a.u.]
449 param%hen = param%hen/evolt
450 ! some forgotten scaling parameters (not in orig. paper)
451 param%xgamma = 0.1_dp*param%xgamma
452 param%kpoly(:) = 0.01_dp*param%kpoly(:)
453 param%kappa(:) = 0.1_dp*param%kappa(:)
454 ! we have 1/6 g * q**3 (not 1/3)
455 param%xgamma = -2.0_dp*param%xgamma
456 ! we need kappa l-indexed
457 kp(:) = param%kappa(:)
458 param%kappa(:) = 0.0_dp
459 DO is = 1, param%nshell
460 l = param%lval(is)
461 IF (param%kappa(l + 1) == 0.0_dp) THEN
462 param%kappa(l + 1) = kp(is)
463 ELSE
464 cpassert(abs(param%kappa(l + 1) - kp(is)) < 1.e-10_dp)
465 END IF
466 END DO
467 ! kx
468 IF (param%kx < -10._dp) THEN
469 ! use defaults
470 SELECT CASE (param%z)
471 CASE DEFAULT
472 param%kx = 0.0_dp
473 CASE (35) ! Br
474 param%kx = 0.1_dp*0.381742_dp
475 CASE (53) ! I
476 param%kx = 0.1_dp*0.321944_dp
477 CASE (85) ! At
478 param%kx = 0.1_dp*0.220000_dp
479 END SELECT
480 END IF
481 ! chmax
482 param%chmax = clmt(i)
483 END IF
484
485 END SUBROUTINE xtb_parameters_set
486
487! **************************************************************************************************
488!> \brief ...
489!> \param param ...
490!> \param gto_basis_set ...
491!> \param ngauss ...
492! **************************************************************************************************
493 SUBROUTINE init_xtb_basis(param, gto_basis_set, ngauss)
494
495 TYPE(xtb_atom_type), POINTER :: param
496 TYPE(gto_basis_set_type), POINTER :: gto_basis_set
497 INTEGER, INTENT(IN) :: ngauss
498
499 CHARACTER(LEN=6), DIMENSION(:), POINTER :: symbol
500 INTEGER :: i, nshell
501 INTEGER, DIMENSION(:), POINTER :: lq, nq
502 REAL(kind=dp), DIMENSION(:), POINTER :: zet
503 TYPE(sto_basis_set_type), POINTER :: sto_basis_set
504
505 IF (ASSOCIATED(param)) THEN
506 IF (param%defined) THEN
507 NULLIFY (sto_basis_set)
508 CALL allocate_sto_basis_set(sto_basis_set)
509 nshell = param%nshell
510
511 ALLOCATE (symbol(1:nshell))
512 symbol = ""
513 DO i = 1, nshell
514 SELECT CASE (param%lval(i))
515 CASE (0)
516 WRITE (symbol(i), '(I1,A1)') param%nval(i), "S"
517 CASE (1)
518 WRITE (symbol(i), '(I1,A1)') param%nval(i), "P"
519 CASE (2)
520 WRITE (symbol(i), '(I1,A1)') param%nval(i), "D"
521 CASE (3)
522 WRITE (symbol(i), '(I1,A1)') param%nval(i), "F"
523 CASE DEFAULT
524 cpabort('BASIS SET OUT OF RANGE (lval)')
525 END SELECT
526 END DO
527
528 IF (nshell > 0) THEN
529 ALLOCATE (nq(nshell), lq(nshell), zet(nshell))
530 nq(1:nshell) = param%nval(1:nshell)
531 lq(1:nshell) = param%lval(1:nshell)
532 zet(1:nshell) = param%zeta(1:nshell)
533 CALL set_sto_basis_set(sto_basis_set, name=param%aname, nshell=nshell, symbol=symbol, &
534 nq=nq, lq=lq, zet=zet)
535 CALL create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss=ngauss, ortho=.true.)
536 END IF
537
538 ! this will remove the allocated arrays
539 CALL deallocate_sto_basis_set(sto_basis_set)
540 DEALLOCATE (symbol, nq, lq, zet)
541 END IF
542
543 ELSE
544 cpabort("The pointer param is not associated")
545 END IF
546
547 END SUBROUTINE init_xtb_basis
548
549! **************************************************************************************************
550!> \brief ...
551!> \param za ...
552!> \param zb ...
553!> \param xtb_control ...
554!> \return ...
555! **************************************************************************************************
556 FUNCTION xtb_set_kab(za, zb, xtb_control) RESULT(kab)
557
558 INTEGER, INTENT(IN) :: za, zb
559 TYPE(xtb_control_type), INTENT(IN), POINTER :: xtb_control
560 REAL(kind=dp) :: kab
561
562 INTEGER :: j, z
563 LOGICAL :: custom
564
565 kab = 1.0_dp
566 custom = .false.
567
568 IF (xtb_control%kab_nval .GT. 0) THEN
569 DO j = 1, xtb_control%kab_nval
570 IF ((za == xtb_control%kab_types(1, j) .AND. &
571 zb == xtb_control%kab_types(2, j)) .OR. &
572 (za == xtb_control%kab_types(2, j) .AND. &
573 zb == xtb_control%kab_types(1, j))) THEN
574 custom = .true.
575 kab = xtb_control%kab_vals(j)
576 EXIT
577 END IF
578 END DO
579 END IF
580
581 IF (.NOT. custom) THEN
582 IF (za == 1 .OR. zb == 1) THEN
583 ! hydrogen
584 z = za + zb - 1
585 SELECT CASE (z)
586 CASE (1)
587 kab = 0.96_dp
588 CASE (5)
589 kab = 0.95_dp
590 CASE (7)
591 kab = 1.04_dp
592 CASE (28)
593 kab = 0.90_dp
594 CASE (75)
595 kab = 0.80_dp
596 CASE (78)
597 kab = 0.80_dp
598 END SELECT
599 ELSEIF (za == 5 .OR. zb == 5) THEN
600 ! Boron
601 z = za + zb - 5
602 SELECT CASE (z)
603 CASE (15)
604 kab = 0.97_dp
605 END SELECT
606 ELSEIF (za == 7 .OR. zb == 7) THEN
607 ! Nitrogen
608 z = za + zb - 7
609 SELECT CASE (z)
610 CASE (14)
611 !xtb orig code parameter file
612 ! in the paper this is Kab for B-Si
613 kab = 1.01_dp
614 END SELECT
615 ELSEIF (za > 20 .AND. za < 30) THEN
616 ! 3d
617 IF (zb > 20 .AND. zb < 30) THEN
618 ! 3d
619 kab = 1.10_dp
620 ELSEIF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
621 ! 4d/5d/4f
622 kab = 0.50_dp*(1.20_dp + 1.10_dp)
623 END IF
624 ELSEIF ((za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80)) THEN
625 ! 4d/5d/4f
626 IF (zb > 20 .AND. zb < 30) THEN
627 ! 3d
628 kab = 0.50_dp*(1.20_dp + 1.10_dp)
629 ELSEIF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
630 ! 4d/5d/4f
631 kab = 1.20_dp
632 END IF
633 END IF
634 END IF
635
636 END FUNCTION xtb_set_kab
637
638END MODULE xtb_parameters
639
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...
logical function, public cp_sll_val_next(iterator, el_att)
returns true if the actual element is valid (i.e. iterator ont at end) moves the iterator to the next...
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.
objects that represent the structure of input sections and the data contained in an input section
subroutine, public section_vals_list_get(section_vals, keyword_name, i_rep_section, list)
returns the requested list
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
a wrapper for basic fortran types.
subroutine, public val_get(val, has_l, has_i, has_r, has_lc, has_c, l_val, l_vals, i_val, i_vals, r_val, r_vals, c_val, c_vals, len_c, type_of_var, enum)
returns the stored values
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Definition list.F:24
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:
Definition physcon.F:68
real(kind=dp), parameter, public evolt
Definition physcon.F:183
real(kind=dp), parameter, public bohr
Definition physcon.F:147
Utilities for string manipulations.
subroutine, public remove_word(string)
remove a word from a string (words are separated by white spaces)
elemental subroutine, public uppercase(string)
Convert all lower case characters in a string to upper case.
Read xTB parameters.
subroutine, public xtb_parameters_set(param)
Read atom parameters for xTB Hamiltonian from input file.
subroutine, public xtb_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, para_env)
...
subroutine, public init_xtb_basis(param, gto_basis_set, ngauss)
...
subroutine, public xtb_parameters_read(param, element_symbol, xtb_section)
Read atom parameters for xTB Hamiltonian from input file.
real(kind=dp) function, public xtb_set_kab(za, zb, xtb_control)
...
Definition of the xTB parameter types.
Definition xtb_types.F:20
represent a single linked list that stores pointers to the elements
a type to have a wrapper that stores any basic fortran type
stores all the informations relevant to an mpi environment