(git:d18deda)
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-2025 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
26 USE kinds, ONLY: default_string_length,&
27 dp
30 ptable
31 USE physcon, ONLY: bohr,&
32 evolt
34 USE xtb_types, ONLY: xtb_atom_type
35#include "./base/base_uses.f90"
36
37 IMPLICIT NONE
38
39 PRIVATE
40
41 INTEGER, PARAMETER, PRIVATE :: nelem = 106
42 ! H He
43 ! Li Be B C N O F Ne
44 ! Na Mg Al Si P S Cl Ar
45 ! K Ca Sc Ti V Cr Mn Fe Co Ni Cu Zn Ga Ge As Se Br Kr
46 ! Rb Sr Y Zr Nb Mo Tc Ru Rh Pd Ag Cd In Sn Sb Te I Xe
47 ! Cs Ba La Ce-Lu Hf Ta W Re Os Ir Pt Au Hg Tl Pb Bi Po At Rn
48 ! Fr Ra Ac Th Pa U Np Pu Am Cm Bk Cf Es Fm Md No Lr Rf Ha 106
49
50!&<
51 ! Element Valence
52 INTEGER, DIMENSION(0:nelem), &
53 PARAMETER, PRIVATE :: zval = (/-1, & ! 0
54 1, 2, & ! 2
55 1, 2, 3, 4, 5, 6, 7, 8, & ! 10
56 1, 2, 3, 4, 5, 6, 7, 8, & ! 18
57 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & ! 36
58 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 2, 3, 4, 5, 6, 7, 8, & ! 54
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, & ! 86
61 -1, -1, -1, 4, -1, 6, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1/)
62!&>
63
64!&<
65 ! Element Pauling Electronegativity
66 REAL(KIND=dp), DIMENSION(0:nelem), &
67 PARAMETER, PRIVATE :: eneg = (/0.00_dp, & ! 0
68 2.20_dp, 3.00_dp, & ! 2
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, & ! 10
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, & ! 18
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, & ! 36
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, & ! 54
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, & ! Lanthanides
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, & ! 86
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, & ! Actinides
83 1.50_dp, 1.50_dp, 1.50_dp/)
84!&>
85
86!&<
87 ! Shell occupation
88 INTEGER, DIMENSION(1:5, 0:nelem) :: occupation = reshape((/0,0,0,0,0, & ! 0
89 1,0,0,0,0, 2,0,0,0,0, & ! 2
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, & ! 10
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, & ! 18
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, & ! 36
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, & ! 54
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, & ! Lanthanides
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, & ! 86 (last element defined)
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, & ! Actinides
104 0,0,0,0,0, 0,0,0,0,0, 0,0,0,0,0/), (/5, nelem+1/))
105!&>
106
107!&<
108 ! COVALENT RADII
109 ! based on "Atomic Radii of the Elements," M. Mantina, R. Valero, C. J. Cramer, and D. G. Truhlar,
110 ! in CRC Handbook of Chemistry and Physics, 91st Edition (2010-2011),
111 ! edited by W. M. Haynes (CRC Press, Boca Raton, FL, 2010), pages 9-49-9-50;
112 ! corrected Nov. 17, 2010 for the 92nd edition.
113 REAL(KIND=dp), DIMENSION(0:nelem), &
114 PARAMETER, PRIVATE :: crad = (/0.00_dp, & ! 0
115 0.32_dp, 0.37_dp, & ! 2
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, & ! 10
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, & ! 18
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, & ! 36
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, & ! 54
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, & ! Lanthanides
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, & ! 86
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, & ! Actinides
130 1.50_dp, 1.50_dp, 1.50_dp/)
131!&>
132
133!&<
134 ! Charge Limits (Mulliken)
135 REAL(KIND=dp), DIMENSION(0:nelem), &
136 PARAMETER, PRIVATE :: clmt = (/0.00_dp, & ! 0
137 1.05_dp, 1.25_dp, & ! 2
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, & ! 10
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, & ! 18
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, & ! 36
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, & ! 54
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, & ! Lanthanides
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, & ! 86
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, & ! Actinides
152 3.00_dp, 3.00_dp, 3.00_dp/)
153!&>
154
155! *** Global parameters ***
156
157 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_parameters'
158
159! *** Public data types ***
160
162 PUBLIC :: metal, early3d, pp_gfn0
163
164CONTAINS
165
166! **************************************************************************************************
167!> \brief ...
168!> \param param ...
169!> \param gfn_type ...
170!> \param element_symbol ...
171!> \param parameter_file_path ...
172!> \param parameter_file_name ...
173!> \param para_env ...
174! **************************************************************************************************
175 SUBROUTINE xtb_parameters_init(param, gfn_type, element_symbol, &
176 parameter_file_path, parameter_file_name, &
177 para_env)
178
179 TYPE(xtb_atom_type), POINTER :: param
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
183 TYPE(mp_para_env_type), POINTER :: para_env
184
185 SELECT CASE (gfn_type)
186 CASE (0)
187 CALL xtb0_parameters_init(param, element_symbol, parameter_file_path, &
188 parameter_file_name, para_env)
189 CASE (1)
190 CALL xtb1_parameters_init(param, element_symbol, parameter_file_path, &
191 parameter_file_name, para_env)
192 CASE (2)
193 cpabort("gfn_type = 2 not yet supported")
194 CASE DEFAULT
195 cpabort("Wrong gfn_type")
196 END SELECT
197
198 END SUBROUTINE xtb_parameters_init
199
200! **************************************************************************************************
201!> \brief ...
202!> \param param ...
203!> \param element_symbol ...
204!> \param parameter_file_path ...
205!> \param parameter_file_name ...
206!> \param para_env ...
207! **************************************************************************************************
208 SUBROUTINE xtb0_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
209 para_env)
210
211 TYPE(xtb_atom_type), POINTER :: param
212 CHARACTER(LEN=2), INTENT(IN) :: element_symbol
213 CHARACTER(LEN=*), INTENT(IN) :: parameter_file_path, parameter_file_name
214 TYPE(mp_para_env_type), POINTER :: para_env
215
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
220 TYPE(cp_parser_type) :: parser
221
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)
224 found = .false.
225 znum = 0
226 CALL get_ptable_info(element_symbol, znum)
227 DO
228 at_end = .false.
229 CALL parser_get_next_line(parser, 1, at_end)
230 IF (at_end) EXIT
231 CALL parser_get_object(parser, aname)
232 CALL uppercase(aname)
233 IF (aname == "$Z") THEN
234 CALL parser_get_object(parser, zin)
235 IF (zin == znum) THEN
236 found = .true.
237 DO
238 CALL parser_get_next_line(parser, 1, at_end)
239 IF (at_end) THEN
240 cpabort("Incomplete xTB parameter file")
241 END IF
242 CALL parser_get_object(parser, aname)
243 CALL uppercase(aname)
244 SELECT CASE (aname)
245 CASE ("AO")
246 CALL parser_get_object(parser, atag)
247 CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
248 CASE ("LEV")
249 DO i = 1, param%nshell
250 CALL parser_get_object(parser, param%hen(i))
251 END DO
252 CASE ("EXP")
253 DO i = 1, param%nshell
254 CALL parser_get_object(parser, param%zeta(i))
255 END DO
256 CASE ("EN")
257 CALL parser_get_object(parser, param%en)
258 CASE ("GAM")
259 CALL parser_get_object(parser, param%eta)
260 CASE ("KQAT2")
261 CALL parser_get_object(parser, param%kqat2)
262 CASE ("KCNS")
263 CALL parser_get_object(parser, param%kcn(1))
264 param%kcn(1) = param%kcn(1)*0.1_dp !from orig xtb code
265 CASE ("KCNP")
266 CALL parser_get_object(parser, param%kcn(2))
267 param%kcn(2) = param%kcn(2)*0.1_dp !from orig xtb code
268 CASE ("KCND")
269 CALL parser_get_object(parser, param%kcn(3))
270 param%kcn(3) = param%kcn(3)*0.1_dp !from orig xtb code
271 CASE ("REPA")
272 CALL parser_get_object(parser, param%alpha)
273 CASE ("REPB")
274 CALL parser_get_object(parser, param%zneff)
275 CASE ("POLYS")
276 CALL parser_get_object(parser, param%kpoly(1))
277 CASE ("POLYP")
278 CALL parser_get_object(parser, param%kpoly(2))
279 CASE ("POLYD")
280 CALL parser_get_object(parser, param%kpoly(3))
281 CASE ("KQS")
282 CALL parser_get_object(parser, param%kq(1))
283 CASE ("KQP")
284 CALL parser_get_object(parser, param%kq(2))
285 CASE ("KQD")
286 CALL parser_get_object(parser, param%kq(3))
287 CASE ("XI")
288 CALL parser_get_object(parser, param%xi)
289 CASE ("KAPPA")
290 CALL parser_get_object(parser, param%kappa0)
291 CASE ("ALPG")
292 CALL parser_get_object(parser, param%alpg)
293 CASE ("$END")
294 EXIT
295 CASE DEFAULT
296 cpabort("Unknown parameter in xTB file")
297 END SELECT
298 END DO
299 ELSE
300 cycle
301 END IF
302 EXIT
303 END IF
304 END DO
305 IF (found) THEN
306 param%typ = "STANDARD"
307 param%symbol = element_symbol
308 param%defined = .true.
309 param%z = znum
310 param%aname = ptable(znum)%name
311 param%lmax = maxval(param%lval(1:param%nshell))
312 param%natorb = 0
313 DO i = 1, param%nshell
314 l = param%lval(i)
315 param%natorb = param%natorb + (2*l + 1)
316 END DO
317 param%zeff = zval(znum)
318 ELSE
319 esym = element_symbol
320 CALL uppercase(esym)
321 IF ("X " == esym) THEN
322 param%typ = "GHOST"
323 param%symbol = element_symbol
324 param%defined = .false.
325 param%z = 0
326 param%aname = "X "
327 param%lmax = 0
328 param%natorb = 0
329 param%nshell = 0
330 param%zeff = 0.0_dp
331 ELSE
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)))
335 END IF
336 END IF
337 CALL parser_release(parser)
338
339 END SUBROUTINE xtb0_parameters_init
340
341! **************************************************************************************************
342!> \brief ...
343!> \param param ...
344!> \param element_symbol ...
345!> \param parameter_file_path ...
346!> \param parameter_file_name ...
347!> \param para_env ...
348! **************************************************************************************************
349 SUBROUTINE xtb1_parameters_init(param, element_symbol, parameter_file_path, parameter_file_name, &
350 para_env)
351
352 TYPE(xtb_atom_type), POINTER :: param
353 CHARACTER(LEN=2), INTENT(IN) :: element_symbol
354 CHARACTER(LEN=*), INTENT(IN) :: parameter_file_path, parameter_file_name
355 TYPE(mp_para_env_type), POINTER :: para_env
356
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
361 TYPE(cp_parser_type) :: parser
362
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)
365 found = .false.
366 znum = 0
367 CALL get_ptable_info(element_symbol, znum)
368 DO
369 at_end = .false.
370 CALL parser_get_next_line(parser, 1, at_end)
371 IF (at_end) EXIT
372 CALL parser_get_object(parser, aname)
373 CALL uppercase(aname)
374 IF (aname == "$Z") THEN
375 CALL parser_get_object(parser, zin)
376 IF (zin == znum) THEN
377 found = .true.
378 DO
379 CALL parser_get_next_line(parser, 1, at_end)
380 IF (at_end) THEN
381 cpabort("Incomplete xTB parameter file")
382 END IF
383 CALL parser_get_object(parser, aname)
384 CALL uppercase(aname)
385 SELECT CASE (aname)
386 CASE ("AO")
387 CALL parser_get_object(parser, atag)
388 CALL xtb_get_shells(atag, param%nshell, param%nval, param%lval)
389 CASE ("LEV")
390 DO i = 1, param%nshell
391 CALL parser_get_object(parser, param%hen(i))
392 END DO
393 CASE ("EXP")
394 DO i = 1, param%nshell
395 CALL parser_get_object(parser, param%zeta(i))
396 END DO
397 CASE ("GAM")
398 CALL parser_get_object(parser, param%eta)
399 CASE ("GAM3")
400 CALL parser_get_object(parser, param%xgamma)
401 CASE ("CXB")
402 CALL parser_get_object(parser, param%kx)
403 CASE ("REPA")
404 CALL parser_get_object(parser, param%alpha)
405 CASE ("REPB")
406 CALL parser_get_object(parser, param%zneff)
407 CASE ("POLYS")
408 CALL parser_get_object(parser, param%kpoly(1))
409 CASE ("POLYP")
410 CALL parser_get_object(parser, param%kpoly(2))
411 CASE ("POLYD")
412 CALL parser_get_object(parser, param%kpoly(3))
413 CASE ("LPARP")
414 CALL parser_get_object(parser, param%kappa(2))
415 CASE ("LPARD")
416 CALL parser_get_object(parser, param%kappa(3))
417 CASE ("$END")
418 EXIT
419 CASE DEFAULT
420 cpabort("Unknown parameter in xTB file")
421 END SELECT
422 END DO
423 ELSE
424 cycle
425 END IF
426 EXIT
427 END IF
428 END DO
429 IF (found) THEN
430 param%typ = "STANDARD"
431 param%symbol = element_symbol
432 param%defined = .true.
433 param%z = znum
434 param%aname = ptable(znum)%name
435 param%lmax = maxval(param%lval(1:param%nshell))
436 param%natorb = 0
437 DO i = 1, param%nshell
438 l = param%lval(i)
439 param%natorb = param%natorb + (2*l + 1)
440 END DO
441 param%zeff = zval(znum)
442 ELSE
443 esym = element_symbol
444 CALL uppercase(esym)
445 IF ("X " == esym) THEN
446 param%typ = "GHOST"
447 param%symbol = element_symbol
448 param%defined = .false.
449 param%z = 0
450 param%aname = "X "
451 param%lmax = 0
452 param%natorb = 0
453 param%nshell = 0
454 param%zeff = 0.0_dp
455 ELSE
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)))
459 END IF
460 END IF
461 CALL parser_release(parser)
462
463 END SUBROUTINE xtb1_parameters_init
464
465! **************************************************************************************************
466!> \brief Read atom parameters for xTB Hamiltonian from input file
467!> \param param ...
468! **************************************************************************************************
469 SUBROUTINE xtb_parameters_set(param)
470
471 TYPE(xtb_atom_type), POINTER :: param
472
473 INTEGER :: i, is, l, na
474 REAL(kind=dp), DIMENSION(5) :: kp
475
476 IF (param%defined) THEN
477 ! AO to shell pointer
478 ! AO to l-qn pointer
479 na = 0
480 DO is = 1, param%nshell
481 l = param%lval(is)
482 DO i = 1, 2*l + 1
483 na = na + 1
484 param%nao(na) = is
485 param%lao(na) = l
486 END DO
487 END DO
488 !
489 i = param%z
490 ! Electronegativity
491 param%electronegativity = eneg(i)
492 IF (param%en == 0.0_dp) param%en = eneg(i)
493 ! covalent radius
494 param%rcov = crad(i)*bohr
495 ! shell occupances
496 param%occupation(:) = occupation(:, i)
497 ! check for consistency
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")
500 END IF
501 ! orbital energies [evolt] -> [a.u.]
502 param%hen = param%hen/evolt
503 ! some forgotten scaling parameters (not in orig. paper)
504 param%xgamma = 0.1_dp*param%xgamma
505 param%kpoly(:) = 0.01_dp*param%kpoly(:)
506 param%kappa(:) = 0.1_dp*param%kappa(:)
507 ! we have 1/6 g * q**3 (not 1/3)
508 param%xgamma = -2.0_dp*param%xgamma
509 ! we need kpoly in shell order
510 kp(:) = param%kpoly(:)
511 param%kpoly(:) = 0.0_dp
512 DO is = 1, param%nshell
513 l = param%lval(is)
514 param%kpoly(is) = kp(l + 1)
515 END DO
516 ! kx
517 param%kx = 0.1_dp*param%kx
518 IF (param%kx < -5._dp) THEN
519 ! use defaults
520 SELECT CASE (param%z)
521 CASE DEFAULT
522 param%kx = 0.0_dp
523 CASE (35) ! Br
524 param%kx = 0.1_dp*0.381742_dp
525 CASE (53) ! I
526 param%kx = 0.1_dp*0.321944_dp
527 CASE (85) ! At
528 param%kx = 0.1_dp*0.220000_dp
529 END SELECT
530 END IF
531 ! chmax
532 param%chmax = clmt(i)
533 END IF
534
535 END SUBROUTINE xtb_parameters_set
536
537! **************************************************************************************************
538!> \brief ...
539!> \param param ...
540!> \param gto_basis_set ...
541!> \param ngauss ...
542! **************************************************************************************************
543 SUBROUTINE init_xtb_basis(param, gto_basis_set, ngauss)
544
545 TYPE(xtb_atom_type), POINTER :: param
546 TYPE(gto_basis_set_type), POINTER :: gto_basis_set
547 INTEGER, INTENT(IN) :: ngauss
548
549 CHARACTER(LEN=6), DIMENSION(:), POINTER :: symbol
550 INTEGER :: i, nshell
551 INTEGER, DIMENSION(:), POINTER :: lq, nq
552 REAL(kind=dp), DIMENSION(:), POINTER :: zet
553 TYPE(sto_basis_set_type), POINTER :: sto_basis_set
554
555 IF (ASSOCIATED(param)) THEN
556 IF (param%defined) THEN
557 NULLIFY (sto_basis_set)
558 CALL allocate_sto_basis_set(sto_basis_set)
559 nshell = param%nshell
560
561 ALLOCATE (symbol(1:nshell))
562 symbol = ""
563 DO i = 1, nshell
564 SELECT CASE (param%lval(i))
565 CASE (0)
566 WRITE (symbol(i), '(I1,A1)') param%nval(i), "S"
567 CASE (1)
568 WRITE (symbol(i), '(I1,A1)') param%nval(i), "P"
569 CASE (2)
570 WRITE (symbol(i), '(I1,A1)') param%nval(i), "D"
571 CASE (3)
572 WRITE (symbol(i), '(I1,A1)') param%nval(i), "F"
573 CASE DEFAULT
574 cpabort('BASIS SET OUT OF RANGE (lval)')
575 END SELECT
576 END DO
577
578 IF (nshell > 0) THEN
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)
585 CALL create_gto_from_sto_basis(sto_basis_set, gto_basis_set, ngauss=ngauss, ortho=.true.)
586 END IF
587
588 ! this will remove the allocated arrays
589 CALL deallocate_sto_basis_set(sto_basis_set)
590 DEALLOCATE (symbol, nq, lq, zet)
591 END IF
592
593 ELSE
594 cpabort("The pointer param is not associated")
595 END IF
596
597 END SUBROUTINE init_xtb_basis
598
599! **************************************************************************************************
600!> \brief ...
601!> \param za ...
602!> \param zb ...
603!> \param xtb_control ...
604!> \return ...
605! **************************************************************************************************
606 FUNCTION xtb_set_kab(za, zb, xtb_control) RESULT(kab)
607
608 INTEGER, INTENT(IN) :: za, zb
609 TYPE(xtb_control_type), INTENT(IN), POINTER :: xtb_control
610 REAL(kind=dp) :: kab
611
612 INTEGER :: j, z
613 LOGICAL :: custom
614
615 kab = 1.0_dp
616 custom = .false.
617
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
624 custom = .true.
625 kab = xtb_control%kab_vals(j)
626 EXIT
627 END IF
628 END DO
629 END IF
630
631 IF (.NOT. custom) THEN
632 IF (za == 1 .OR. zb == 1) THEN
633 ! hydrogen
634 z = za + zb - 1
635 SELECT CASE (z)
636 CASE (1)
637 kab = 0.96_dp
638 CASE (5)
639 kab = 0.95_dp
640 CASE (7)
641 kab = 1.04_dp
642 CASE (28)
643 kab = 0.90_dp
644 CASE (75)
645 kab = 0.80_dp
646 CASE (78)
647 kab = 0.80_dp
648 END SELECT
649 ELSEIF (za == 5 .OR. zb == 5) THEN
650 ! Boron
651 z = za + zb - 5
652 SELECT CASE (z)
653 CASE (15)
654 kab = 0.97_dp
655 END SELECT
656 ELSEIF (za == 7 .OR. zb == 7) THEN
657 ! Nitrogen
658 z = za + zb - 7
659 SELECT CASE (z)
660 CASE (14)
661 !xtb orig code parameter file
662 ! in the paper this is Kab for B-Si
663 kab = 1.01_dp
664 END SELECT
665 ELSEIF (za > 20 .AND. za < 30) THEN
666 ! 3d
667 IF (zb > 20 .AND. zb < 30) THEN
668 ! 3d
669 kab = 1.10_dp
670 ELSEIF ((zb > 38 .AND. zb < 48) .OR. (zb > 56 .AND. zb < 80)) THEN
671 ! 4d/5d/4f
672 kab = 0.50_dp*(1.20_dp + 1.10_dp)
673 END IF
674 ELSEIF ((za > 38 .AND. za < 48) .OR. (za > 56 .AND. za < 80)) THEN
675 ! 4d/5d/4f
676 IF (zb > 20 .AND. zb < 30) THEN
677 ! 3d
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
680 ! 4d/5d/4f
681 kab = 1.20_dp
682 END IF
683 END IF
684 END IF
685
686 END FUNCTION xtb_set_kab
687
688! **************************************************************************************************
689!> \brief ...
690!> \param atag ...
691!> \param nshell ...
692!> \param nval ...
693!> \param lval ...
694!> \return ...
695! **************************************************************************************************
696 SUBROUTINE xtb_get_shells(atag, nshell, nval, lval)
697 CHARACTER(len=*) :: atag
698 INTEGER :: nshell
699 INTEGER, DIMENSION(:) :: nval, lval
700
701 CHARACTER(LEN=1) :: ltag
702 CHARACTER(LEN=10) :: aotag
703 INTEGER :: i, j
704
705 aotag = adjustl(trim(atag))
706 nshell = len(trim(aotag))/2
707 DO i = 1, nshell
708 j = (i - 1)*2 + 1
709 READ (aotag(j:j), fmt="(i1)") nval(i)
710 READ (aotag(j + 1:j + 1), fmt="(A1)") ltag
711 CALL uppercase(ltag)
712 SELECT CASE (ltag)
713 CASE ("S")
714 lval(i) = 0
715 CASE ("P")
716 lval(i) = 1
717 CASE ("D")
718 lval(i) = 2
719 CASE DEFAULT
720 END SELECT
721 END DO
722
723 END SUBROUTINE xtb_get_shells
724
725! **************************************************************************************************
726!> \brief ...
727!> \param z ...
728!> \return ...
729! **************************************************************************************************
730 FUNCTION metal(z) RESULT(ismetal)
731 INTEGER :: z
732 LOGICAL :: ismetal
733
734 SELECT CASE (z)
735 CASE DEFAULT
736 ismetal = .true.
737 CASE (1:2, 6:10, 14:18, 32:36, 50:54, 82:86)
738 ismetal = .false.
739 END SELECT
740
741 END FUNCTION metal
742
743! **************************************************************************************************
744!> \brief ...
745!> \param z ...
746!> \return ...
747! **************************************************************************************************
748 FUNCTION early3d(z) RESULT(isearly3d)
749 INTEGER :: z
750 LOGICAL :: isearly3d
751
752 isearly3d = .false.
753 IF (z >= 21 .AND. z <= 24) isearly3d = .true.
754
755 END FUNCTION early3d
756
757! **************************************************************************************************
758!> \brief ...
759!> \param za ...
760!> \param zb ...
761!> \return ...
762! **************************************************************************************************
763 FUNCTION pp_gfn0(za, zb) RESULT(pparm)
764 INTEGER :: za, zb
765 REAL(kind=dp) :: pparm
766
767 pparm = 1.0_dp
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
770 pparm = 1.1_dp
771 IF (za == 29 .OR. za == 47 .OR. za == 79) THEN
772 IF (za == 29 .OR. za == 47 .OR. za == 79) THEN
773 pparm = 0.9_dp
774 END IF
775 END IF
776 END IF
777 END IF
778
779 END FUNCTION pp_gfn0
780
781END MODULE xtb_parameters
782
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.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
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.
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.
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.
Definition xtb_types.F:20
stores all the informations relevant to an mpi environment