Line data Source code
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 Calculation of Overlap and Hamiltonian matrices in xTB
10 : !> Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov
11 : !> JCTC 13, 1989-2009, (2017)
12 : !> DOI: 10.1021/acs.jctc.7b00118
13 : !> \author JGH
14 : ! **************************************************************************************************
15 : MODULE xtb_matrices
16 : USE ai_contraction, ONLY: block_add,&
17 : contraction
18 : USE ai_overlap, ONLY: overlap_ab
19 : USE atomic_kind_types, ONLY: atomic_kind_type,&
20 : get_atomic_kind,&
21 : get_atomic_kind_set
22 : USE atprop_types, ONLY: atprop_array_init,&
23 : atprop_type
24 : USE basis_set_types, ONLY: gto_basis_set_p_type,&
25 : gto_basis_set_type
26 : USE block_p_types, ONLY: block_p_type
27 : USE cp_blacs_env, ONLY: cp_blacs_env_type
28 : USE cp_control_types, ONLY: dft_control_type,&
29 : xtb_control_type
30 : USE cp_dbcsr_cp2k_link, ONLY: cp_dbcsr_alloc_block_from_nbl
31 : USE cp_dbcsr_operations, ONLY: dbcsr_allocate_matrix_set,&
32 : dbcsr_deallocate_matrix_set
33 : USE cp_dbcsr_output, ONLY: cp_dbcsr_write_sparse_matrix
34 : USE cp_log_handling, ONLY: cp_get_default_logger,&
35 : cp_logger_get_default_io_unit,&
36 : cp_logger_type,&
37 : cp_to_string
38 : USE cp_output_handling, ONLY: cp_p_file,&
39 : cp_print_key_finished_output,&
40 : cp_print_key_should_output,&
41 : cp_print_key_unit_nr
42 : USE dbcsr_api, ONLY: &
43 : dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_dot, dbcsr_finalize, dbcsr_get_block_p, &
44 : dbcsr_multiply, dbcsr_p_type, dbcsr_type
45 : USE efield_tb_methods, ONLY: efield_tb_matrix
46 : USE ewald_environment_types, ONLY: ewald_env_get,&
47 : ewald_environment_type
48 : USE fparser, ONLY: evalfd,&
49 : finalizef
50 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
51 : section_vals_type,&
52 : section_vals_val_get
53 : USE kinds, ONLY: default_string_length,&
54 : dp
55 : USE kpoint_types, ONLY: get_kpoint_info,&
56 : kpoint_type
57 : USE message_passing, ONLY: mp_para_env_type
58 : USE mulliken, ONLY: ao_charges
59 : USE orbital_pointers, ONLY: ncoset
60 : USE pair_potential, ONLY: init_genpot
61 : USE pair_potential_types, ONLY: not_initialized,&
62 : pair_potential_p_type,&
63 : pair_potential_pp_create,&
64 : pair_potential_pp_release,&
65 : pair_potential_pp_type,&
66 : pair_potential_single_clean,&
67 : pair_potential_single_copy,&
68 : pair_potential_single_type
69 : USE pair_potential_util, ONLY: ener_pot
70 : USE particle_types, ONLY: particle_type
71 : USE qs_charge_mixing, ONLY: charge_mixing
72 : USE qs_condnum, ONLY: overlap_condnum
73 : USE qs_dispersion_pairpot, ONLY: d3_cnumber,&
74 : dcnum_distribute,&
75 : dcnum_type
76 : USE qs_dispersion_types, ONLY: qs_dispersion_type
77 : USE qs_energy_types, ONLY: qs_energy_type
78 : USE qs_environment_types, ONLY: get_qs_env,&
79 : qs_environment_type
80 : USE qs_force_types, ONLY: qs_force_type
81 : USE qs_integral_utils, ONLY: basis_set_list_setup,&
82 : get_memory_usage
83 : USE qs_kind_types, ONLY: get_qs_kind,&
84 : get_qs_kind_set,&
85 : qs_kind_type
86 : USE qs_ks_types, ONLY: get_ks_env,&
87 : qs_ks_env_type,&
88 : set_ks_env
89 : USE qs_mo_types, ONLY: get_mo_set,&
90 : mo_set_type
91 : USE qs_neighbor_list_types, ONLY: get_iterator_info,&
92 : neighbor_list_iterate,&
93 : neighbor_list_iterator_create,&
94 : neighbor_list_iterator_p_type,&
95 : neighbor_list_iterator_release,&
96 : neighbor_list_set_p_type
97 : USE qs_overlap, ONLY: create_sab_matrix
98 : USE qs_rho_types, ONLY: qs_rho_get,&
99 : qs_rho_type
100 : USE qs_scf_types, ONLY: qs_scf_env_type
101 : USE string_utilities, ONLY: compress,&
102 : uppercase
103 : USE virial_methods, ONLY: virial_pair_force
104 : USE virial_types, ONLY: virial_type
105 : USE xtb_coulomb, ONLY: build_xtb_coulomb
106 : USE xtb_parameters, ONLY: xtb_set_kab
107 : USE xtb_types, ONLY: get_xtb_atom_param,&
108 : xtb_atom_type
109 : #include "./base/base_uses.f90"
110 :
111 : IMPLICIT NONE
112 :
113 : TYPE neighbor_atoms_type
114 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: coord
115 : REAL(KIND=dp), DIMENSION(:), POINTER :: rab
116 : INTEGER, DIMENSION(:), POINTER :: katom
117 : END TYPE neighbor_atoms_type
118 :
119 : PRIVATE
120 :
121 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_matrices'
122 :
123 : PUBLIC :: build_xtb_matrices, build_xtb_ks_matrix, xtb_hab_force
124 :
125 : CONTAINS
126 :
127 : ! **************************************************************************************************
128 : !> \brief ...
129 : !> \param qs_env ...
130 : !> \param para_env ...
131 : !> \param calculate_forces ...
132 : ! **************************************************************************************************
133 3184 : SUBROUTINE build_xtb_matrices(qs_env, para_env, calculate_forces)
134 :
135 : TYPE(qs_environment_type), POINTER :: qs_env
136 : TYPE(mp_para_env_type), POINTER :: para_env
137 : LOGICAL, INTENT(IN) :: calculate_forces
138 :
139 : CHARACTER(LEN=*), PARAMETER :: routineN = 'build_xtb_matrices'
140 :
141 : INTEGER :: after, atom_a, atom_b, atom_c, handle, i, iatom, ic, icol, ikind, img, ir, irow, &
142 : iset, iw, j, jatom, jkind, jset, katom, kkind, la, lb, ldsab, lmaxa, lmaxb, maxder, maxs, &
143 : n1, n2, na, natom, natorb_a, natorb_b, nb, ncoa, ncob, nderivatives, nimg, nkind, nsa, &
144 : nsb, nseta, nsetb, nshell, sgfa, sgfb, za, zat, zb
145 6368 : INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
146 : INTEGER, DIMENSION(25) :: laoa, laob, lval, naoa, naob
147 : INTEGER, DIMENSION(3) :: cell
148 3184 : INTEGER, DIMENSION(:), POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
149 3184 : npgfb, nsgfa, nsgfb
150 3184 : INTEGER, DIMENSION(:, :), POINTER :: first_sgfa, first_sgfb
151 3184 : INTEGER, DIMENSION(:, :, :), POINTER :: cell_to_index
152 : LOGICAL :: defined, diagblock, do_nonbonded, floating_a, found, ghost_a, norml1, norml2, &
153 : omit_headers, use_arnoldi, use_virial, xb_inter
154 3184 : LOGICAL, ALLOCATABLE, DIMENSION(:) :: floating, ghost
155 : REAL(KIND=dp) :: alphaa, alphab, derepij, dfp, dhij, dr, drk, drx, ena, enb, enonbonded, &
156 : erep, erepij, etaa, etab, exb, f0, f1, fen, fhua, fhub, fhud, foab, hij, k2sh, kab, kcnd, &
157 : kcnp, kcns, kd, ken, kf, kg, kia, kjb, kp, ks, ksp, kx2, kxr, rcova, rcovab, rcovb, rrab, &
158 : zneffa, zneffb
159 6368 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cnumbers, kx
160 6368 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dfblock, huckel, kcnlk, owork, rcab
161 3184 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: oint, sint
162 3184 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: kijab
163 : REAL(KIND=dp), DIMENSION(0:3) :: kl
164 : REAL(KIND=dp), DIMENSION(2) :: condnum
165 : REAL(KIND=dp), DIMENSION(3) :: fdik, fdika, fdikb, force_ab, force_rr, &
166 : rij, rik
167 : REAL(KIND=dp), DIMENSION(5) :: dpia, dpib, hena, henb, kappaa, kappab, &
168 : kpolya, kpolyb, pia, pib
169 3184 : REAL(KIND=dp), DIMENSION(:), POINTER :: set_radius_a, set_radius_b
170 3184 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: fblock, pblock, rpgfa, rpgfb, sblock, &
171 3184 : scon_a, scon_b, wblock, zeta, zetb
172 3184 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
173 : TYPE(atprop_type), POINTER :: atprop
174 12736 : TYPE(block_p_type), DIMENSION(2:4) :: dsblocks
175 : TYPE(cp_blacs_env_type), POINTER :: blacs_env
176 : TYPE(cp_logger_type), POINTER :: logger
177 3184 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_h, matrix_p, matrix_s, matrix_w
178 3184 : TYPE(dcnum_type), ALLOCATABLE, DIMENSION(:) :: dcnum
179 : TYPE(dft_control_type), POINTER :: dft_control
180 3184 : TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
181 : TYPE(gto_basis_set_type), POINTER :: basis_set_a, basis_set_b
182 : TYPE(kpoint_type), POINTER :: kpoints
183 : TYPE(neighbor_atoms_type), ALLOCATABLE, &
184 3184 : DIMENSION(:) :: neighbor_atoms
185 : TYPE(neighbor_list_iterator_p_type), &
186 3184 : DIMENSION(:), POINTER :: nl_iterator
187 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
188 3184 : POINTER :: sab_orb, sab_xb, sab_xtb_nonbond
189 3184 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
190 : TYPE(qs_dispersion_type), POINTER :: dispersion_env
191 : TYPE(qs_energy_type), POINTER :: energy
192 3184 : TYPE(qs_force_type), DIMENSION(:), POINTER :: force
193 3184 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
194 : TYPE(qs_ks_env_type), POINTER :: ks_env
195 : TYPE(qs_rho_type), POINTER :: rho
196 : TYPE(virial_type), POINTER :: virial
197 : TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
198 : TYPE(xtb_control_type), POINTER :: xtb_control
199 :
200 : !, na1
201 :
202 3184 : CALL timeset(routineN, handle)
203 :
204 3184 : NULLIFY (logger, virial, atprop)
205 3184 : logger => cp_get_default_logger()
206 :
207 3184 : NULLIFY (matrix_h, matrix_s, matrix_p, matrix_w, atomic_kind_set, &
208 3184 : qs_kind_set, sab_orb, ks_env)
209 :
210 : CALL get_qs_env(qs_env=qs_env, &
211 : ks_env=ks_env, &
212 : energy=energy, &
213 : atomic_kind_set=atomic_kind_set, &
214 : qs_kind_set=qs_kind_set, &
215 : matrix_h_kp=matrix_h, &
216 : matrix_s_kp=matrix_s, &
217 : atprop=atprop, &
218 : dft_control=dft_control, &
219 3184 : sab_orb=sab_orb)
220 :
221 3184 : nkind = SIZE(atomic_kind_set)
222 3184 : xtb_control => dft_control%qs_control%xtb_control
223 3184 : xb_inter = xtb_control%xb_interaction
224 3184 : do_nonbonded = xtb_control%do_nonbonded
225 3184 : nimg = dft_control%nimages
226 3184 : nderivatives = 0
227 3184 : IF (calculate_forces) nderivatives = 1
228 3184 : IF (dft_control%tddfpt2_control%enabled) nderivatives = 1
229 3184 : maxder = ncoset(nderivatives)
230 :
231 3184 : IF (xb_inter) energy%xtb_xb_inter = 0.0_dp
232 3184 : IF (do_nonbonded) energy%xtb_nonbonded = 0.0_dp
233 :
234 : ! global parameters (Table 2 from Ref.)
235 3184 : ks = xtb_control%ks
236 3184 : kp = xtb_control%kp
237 3184 : kd = xtb_control%kd
238 3184 : ksp = xtb_control%ksp
239 3184 : k2sh = xtb_control%k2sh
240 3184 : kg = xtb_control%kg
241 3184 : kf = xtb_control%kf
242 3184 : kcns = xtb_control%kcns
243 3184 : kcnp = xtb_control%kcnp
244 3184 : kcnd = xtb_control%kcnd
245 3184 : ken = xtb_control%ken
246 3184 : kxr = xtb_control%kxr
247 3184 : kx2 = xtb_control%kx2
248 :
249 3184 : NULLIFY (particle_set)
250 3184 : CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
251 3184 : natom = SIZE(particle_set)
252 3184 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
253 3184 : CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxsgf=maxs, basis_type="ORB")
254 :
255 3184 : IF (calculate_forces) THEN
256 428 : NULLIFY (rho, force, matrix_w)
257 : CALL get_qs_env(qs_env=qs_env, &
258 : rho=rho, matrix_w_kp=matrix_w, &
259 428 : virial=virial, force=force)
260 428 : CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
261 :
262 428 : IF (SIZE(matrix_p, 1) == 2) THEN
263 432 : DO img = 1, nimg
264 : CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, &
265 414 : alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
266 : CALL dbcsr_add(matrix_w(1, img)%matrix, matrix_w(2, img)%matrix, &
267 432 : alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
268 : END DO
269 : END IF
270 806 : use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
271 : END IF
272 : ! atomic energy decomposition
273 3184 : IF (atprop%energy) THEN
274 36 : CALL atprop_array_init(atprop%atecc, natom)
275 : END IF
276 :
277 3184 : NULLIFY (cell_to_index)
278 3184 : IF (nimg > 1) THEN
279 336 : CALL get_ks_env(ks_env=ks_env, kpoints=kpoints)
280 336 : CALL get_kpoint_info(kpoint=kpoints, cell_to_index=cell_to_index)
281 : END IF
282 :
283 : ! set up basis set lists
284 17380 : ALLOCATE (basis_set_list(nkind))
285 3184 : CALL basis_set_list_setup(basis_set_list, "ORB", qs_kind_set)
286 :
287 : ! allocate overlap matrix
288 3184 : CALL dbcsr_allocate_matrix_set(matrix_s, maxder, nimg)
289 : CALL create_sab_matrix(ks_env, matrix_s, "xTB OVERLAP MATRIX", basis_set_list, basis_set_list, &
290 3184 : sab_orb, .TRUE.)
291 3184 : CALL set_ks_env(ks_env, matrix_s_kp=matrix_s)
292 :
293 : ! initialize H matrix
294 3184 : CALL dbcsr_allocate_matrix_set(matrix_h, 1, nimg)
295 50004 : DO img = 1, nimg
296 46820 : ALLOCATE (matrix_h(1, img)%matrix)
297 : CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
298 46820 : name="HAMILTONIAN MATRIX")
299 50004 : CALL cp_dbcsr_alloc_block_from_nbl(matrix_h(1, img)%matrix, sab_orb)
300 : END DO
301 3184 : CALL set_ks_env(ks_env, matrix_h_kp=matrix_h)
302 :
303 : ! Calculate coordination numbers
304 : ! needed for effective atomic energy levels (Eq. 12)
305 : ! code taken from D3 dispersion energy
306 9552 : ALLOCATE (cnumbers(natom))
307 31458 : cnumbers = 0._dp
308 3184 : IF (calculate_forces) THEN
309 1284 : ALLOCATE (dcnum(natom))
310 4218 : dcnum(:)%neighbors = 0
311 4218 : DO iatom = 1, natom
312 4218 : ALLOCATE (dcnum(iatom)%nlist(10), dcnum(iatom)%dvals(10), dcnum(iatom)%rik(3, 10))
313 : END DO
314 : ELSE
315 2756 : ALLOCATE (dcnum(1))
316 : END IF
317 :
318 22288 : ALLOCATE (ghost(nkind), floating(nkind), atomnumber(nkind))
319 11012 : DO ikind = 1, nkind
320 7828 : CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
321 7828 : CALL get_qs_kind(qs_kind_set(ikind), ghost=ghost_a, floating=floating_a)
322 7828 : ghost(ikind) = ghost_a
323 7828 : floating(ikind) = floating_a
324 18840 : atomnumber(ikind) = za
325 : END DO
326 3184 : CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
327 : CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, &
328 3184 : calculate_forces, .FALSE.)
329 3184 : DEALLOCATE (ghost, floating, atomnumber)
330 3184 : CALL para_env%sum(cnumbers)
331 3184 : IF (calculate_forces) THEN
332 428 : CALL dcnum_distribute(dcnum, para_env)
333 : END IF
334 :
335 : ! Calculate Huckel parameters
336 : ! Eq 12
337 : ! huckel(nshell,natom)
338 9552 : ALLOCATE (kcnlk(0:3, nkind))
339 11012 : DO ikind = 1, nkind
340 7828 : CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
341 11012 : IF (metal(za)) THEN
342 250 : kcnlk(0:3, ikind) = 0.0_dp
343 7778 : ELSEIF (early3d(za)) THEN
344 0 : kcnlk(0, ikind) = kcns
345 0 : kcnlk(1, ikind) = kcnp
346 0 : kcnlk(2, ikind) = 0.005_dp
347 0 : kcnlk(3, ikind) = 0.0_dp
348 : ELSE
349 7778 : kcnlk(0, ikind) = kcns
350 7778 : kcnlk(1, ikind) = kcnp
351 7778 : kcnlk(2, ikind) = kcnd
352 7778 : kcnlk(3, ikind) = 0.0_dp
353 : END IF
354 : END DO
355 9552 : ALLOCATE (huckel(5, natom))
356 3184 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
357 31458 : DO iatom = 1, natom
358 28274 : ikind = kind_of(iatom)
359 28274 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
360 28274 : CALL get_xtb_atom_param(xtb_atom_a, nshell=nshell, lval=lval, hen=hena)
361 169644 : huckel(:, iatom) = 0.0_dp
362 116834 : DO i = 1, nshell
363 85376 : huckel(i, iatom) = hena(i)*(1._dp + kcnlk(lval(i), ikind)*cnumbers(iatom))
364 : END DO
365 : END DO
366 :
367 : ! Calculate KAB parameters and Huckel parameters and electronegativity correction
368 3184 : kl(0) = ks
369 3184 : kl(1) = kp
370 3184 : kl(2) = kd
371 3184 : kl(3) = 0.0_dp
372 19104 : ALLOCATE (kijab(maxs, maxs, nkind, nkind))
373 595064 : kijab = 0.0_dp
374 11012 : DO ikind = 1, nkind
375 7828 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
376 7828 : CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
377 7828 : IF (.NOT. defined .OR. natorb_a < 1) CYCLE
378 7826 : CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, electronegativity=ena)
379 40562 : DO jkind = 1, nkind
380 21724 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
381 21724 : CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
382 21724 : IF (.NOT. defined .OR. natorb_b < 1) CYCLE
383 21722 : CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, electronegativity=enb)
384 : ! get Fen = (1+ken*deltaEN^2)
385 21722 : fen = 1.0_dp + ken*(ena - enb)**2
386 : ! Kab
387 21722 : kab = xtb_set_kab(za, zb, xtb_control)
388 128010 : DO j = 1, natorb_b
389 76736 : lb = laob(j)
390 76736 : nb = naob(j)
391 390334 : DO i = 1, natorb_a
392 291874 : la = laoa(i)
393 291874 : na = naoa(i)
394 291874 : kia = kl(la)
395 291874 : kjb = kl(lb)
396 291874 : IF (zb == 1 .AND. nb == 2) kjb = k2sh
397 291874 : IF (za == 1 .AND. na == 2) kia = k2sh
398 368610 : IF ((zb == 1 .AND. nb == 2) .OR. (za == 1 .AND. na == 2)) THEN
399 48328 : kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)
400 : ELSE
401 243546 : IF ((la == 0 .AND. lb == 1) .OR. (la == 1 .AND. lb == 0)) THEN
402 83676 : kijab(i, j, ikind, jkind) = ksp*kab*fen
403 : ELSE
404 159870 : kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)*kab*fen
405 : END IF
406 : END IF
407 : END DO
408 : END DO
409 : END DO
410 : END DO
411 :
412 3184 : IF (xb_inter) THEN
413 : ! list of neighbor atoms for XB term
414 9552 : ALLOCATE (neighbor_atoms(nkind))
415 11012 : DO ikind = 1, nkind
416 7828 : NULLIFY (neighbor_atoms(ikind)%coord)
417 7828 : NULLIFY (neighbor_atoms(ikind)%rab)
418 7828 : NULLIFY (neighbor_atoms(ikind)%katom)
419 7828 : CALL get_atomic_kind(atomic_kind_set(ikind), z=zat, natom=na)
420 11012 : IF (zat == 17 .OR. zat == 35 .OR. zat == 53 .OR. zat == 85) THEN
421 174 : ALLOCATE (neighbor_atoms(ikind)%coord(3, na))
422 290 : neighbor_atoms(ikind)%coord(1:3, 1:na) = 0.0_dp
423 174 : ALLOCATE (neighbor_atoms(ikind)%rab(na))
424 116 : neighbor_atoms(ikind)%rab(1:na) = HUGE(0.0_dp)
425 174 : ALLOCATE (neighbor_atoms(ikind)%katom(na))
426 116 : neighbor_atoms(ikind)%katom(1:na) = 0
427 : END IF
428 : END DO
429 : ! kx parameters
430 9552 : ALLOCATE (kx(nkind))
431 11012 : DO ikind = 1, nkind
432 7828 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
433 11012 : CALL get_xtb_atom_param(xtb_atom_a, kx=kx(ikind))
434 : END DO
435 : !
436 12736 : ALLOCATE (rcab(nkind, nkind))
437 11012 : DO ikind = 1, nkind
438 7828 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
439 7828 : CALL get_xtb_atom_param(xtb_atom_a, rcov=rcova)
440 32740 : DO jkind = 1, nkind
441 21728 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
442 21728 : CALL get_xtb_atom_param(xtb_atom_b, rcov=rcovb)
443 29556 : rcab(ikind, jkind) = kxr*(rcova + rcovb)
444 : END DO
445 : END DO
446 : !
447 3184 : CALL get_qs_env(qs_env=qs_env, sab_xb=sab_xb)
448 : END IF
449 :
450 : ! initialize repulsion energy
451 3184 : erep = 0._dp
452 :
453 : ! loop over all atom pairs with a non-zero overlap (sab_orb)
454 3184 : CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
455 943739 : DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
456 : CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
457 940555 : iatom=iatom, jatom=jatom, r=rij, cell=cell)
458 940555 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
459 940555 : CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
460 940555 : IF (.NOT. defined .OR. natorb_a < 1) CYCLE
461 940555 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
462 940555 : CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
463 940555 : IF (.NOT. defined .OR. natorb_b < 1) CYCLE
464 :
465 3762220 : dr = SQRT(SUM(rij(:)**2))
466 :
467 : ! neighbor atom for XB term
468 940555 : IF (xb_inter .AND. (dr > 1.e-3_dp)) THEN
469 926113 : IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
470 250 : atom_a = atom_of_kind(iatom)
471 250 : IF (dr < neighbor_atoms(ikind)%rab(atom_a)) THEN
472 91 : neighbor_atoms(ikind)%rab(atom_a) = dr
473 364 : neighbor_atoms(ikind)%coord(1:3, atom_a) = rij(1:3)
474 91 : neighbor_atoms(ikind)%katom(atom_a) = jatom
475 : END IF
476 : END IF
477 926113 : IF (ASSOCIATED(neighbor_atoms(jkind)%rab)) THEN
478 287 : atom_b = atom_of_kind(jatom)
479 287 : IF (dr < neighbor_atoms(jkind)%rab(atom_b)) THEN
480 94 : neighbor_atoms(jkind)%rab(atom_b) = dr
481 376 : neighbor_atoms(jkind)%coord(1:3, atom_b) = -rij(1:3)
482 94 : neighbor_atoms(jkind)%katom(atom_b) = iatom
483 : END IF
484 : END IF
485 : END IF
486 :
487 : ! atomic parameters
488 : CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, rcov=rcova, eta=etaa, &
489 : lmax=lmaxa, nshell=nsa, alpha=alphaa, zneff=zneffa, kpoly=kpolya, &
490 940555 : kappa=kappaa, hen=hena)
491 : CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, rcov=rcovb, eta=etab, &
492 : lmax=lmaxb, nshell=nsb, alpha=alphab, zneff=zneffb, kpoly=kpolyb, &
493 940555 : kappa=kappab, hen=henb)
494 :
495 940555 : IF (nimg == 1) THEN
496 : ic = 1
497 : ELSE
498 241506 : ic = cell_to_index(cell(1), cell(2), cell(3))
499 241506 : CPASSERT(ic > 0)
500 : END IF
501 :
502 940555 : icol = MAX(iatom, jatom)
503 940555 : irow = MIN(iatom, jatom)
504 940555 : NULLIFY (sblock, fblock)
505 : CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
506 940555 : row=irow, col=icol, BLOCK=sblock, found=found)
507 940555 : CPASSERT(found)
508 : CALL dbcsr_get_block_p(matrix=matrix_h(1, ic)%matrix, &
509 940555 : row=irow, col=icol, BLOCK=fblock, found=found)
510 940555 : CPASSERT(found)
511 :
512 940555 : IF (calculate_forces) THEN
513 193498 : NULLIFY (pblock)
514 : CALL dbcsr_get_block_p(matrix=matrix_p(1, ic)%matrix, &
515 193498 : row=irow, col=icol, block=pblock, found=found)
516 193498 : CPASSERT(ASSOCIATED(pblock))
517 193498 : NULLIFY (wblock)
518 : CALL dbcsr_get_block_p(matrix=matrix_w(1, ic)%matrix, &
519 193498 : row=irow, col=icol, block=wblock, found=found)
520 193498 : CPASSERT(ASSOCIATED(wblock))
521 773992 : DO i = 2, 4
522 580494 : NULLIFY (dsblocks(i)%block)
523 : CALL dbcsr_get_block_p(matrix=matrix_s(i, ic)%matrix, &
524 580494 : row=irow, col=icol, BLOCK=dsblocks(i)%block, found=found)
525 773992 : CPASSERT(found)
526 : END DO
527 : END IF
528 :
529 : ! overlap
530 940555 : basis_set_a => basis_set_list(ikind)%gto_basis_set
531 940555 : IF (.NOT. ASSOCIATED(basis_set_a)) CYCLE
532 940555 : basis_set_b => basis_set_list(jkind)%gto_basis_set
533 940555 : IF (.NOT. ASSOCIATED(basis_set_b)) CYCLE
534 940555 : atom_a = atom_of_kind(iatom)
535 940555 : atom_b = atom_of_kind(jatom)
536 : ! basis ikind
537 940555 : first_sgfa => basis_set_a%first_sgf
538 940555 : la_max => basis_set_a%lmax
539 940555 : la_min => basis_set_a%lmin
540 940555 : npgfa => basis_set_a%npgf
541 940555 : nseta = basis_set_a%nset
542 940555 : nsgfa => basis_set_a%nsgf_set
543 940555 : rpgfa => basis_set_a%pgf_radius
544 940555 : set_radius_a => basis_set_a%set_radius
545 940555 : scon_a => basis_set_a%scon
546 940555 : zeta => basis_set_a%zet
547 : ! basis jkind
548 940555 : first_sgfb => basis_set_b%first_sgf
549 940555 : lb_max => basis_set_b%lmax
550 940555 : lb_min => basis_set_b%lmin
551 940555 : npgfb => basis_set_b%npgf
552 940555 : nsetb = basis_set_b%nset
553 940555 : nsgfb => basis_set_b%nsgf_set
554 940555 : rpgfb => basis_set_b%pgf_radius
555 940555 : set_radius_b => basis_set_b%set_radius
556 940555 : scon_b => basis_set_b%scon
557 940555 : zetb => basis_set_b%zet
558 :
559 940555 : ldsab = get_memory_usage(qs_kind_set, "ORB", "ORB")
560 7524440 : ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
561 4702775 : ALLOCATE (sint(natorb_a, natorb_b, maxder))
562 33934923 : sint = 0.0_dp
563 :
564 2906698 : DO iset = 1, nseta
565 1966143 : ncoa = npgfa(iset)*ncoset(la_max(iset))
566 1966143 : n1 = npgfa(iset)*(ncoset(la_max(iset)) - ncoset(la_min(iset) - 1))
567 1966143 : sgfa = first_sgfa(1, iset)
568 7092079 : DO jset = 1, nsetb
569 4185381 : IF (set_radius_a(iset) + set_radius_b(jset) < dr) CYCLE
570 3550035 : ncob = npgfb(jset)*ncoset(lb_max(jset))
571 3550035 : n2 = npgfb(jset)*(ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1))
572 3550035 : sgfb = first_sgfb(1, jset)
573 3550035 : IF (calculate_forces) THEN
574 : CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
575 : lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
576 736677 : rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
577 : ELSE
578 : CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
579 : lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
580 2813358 : rij, sab=oint(:, :, 1))
581 : END IF
582 : ! Contraction
583 : CALL contraction(oint(:, :, 1), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
584 3550035 : cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.FALSE.)
585 3550035 : CALL block_add("IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, 1), sgfa, sgfb, trans=.FALSE.)
586 5516178 : IF (calculate_forces) THEN
587 2946708 : DO i = 2, 4
588 : CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
589 2210031 : cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.FALSE.)
590 2946708 : CALL block_add("IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.FALSE.)
591 : END DO
592 : END IF
593 : END DO
594 : END DO
595 : ! forces W matrix
596 940555 : IF (calculate_forces) THEN
597 773992 : DO i = 1, 3
598 773992 : IF (iatom <= jatom) THEN
599 8160408 : force_ab(i) = SUM(sint(:, :, i + 1)*wblock(:, :))
600 : ELSE
601 6149439 : force_ab(i) = SUM(sint(:, :, i + 1)*TRANSPOSE(wblock(:, :)))
602 : END IF
603 : END DO
604 193498 : f1 = 2.0_dp
605 773992 : force(ikind)%overlap(:, atom_a) = force(ikind)%overlap(:, atom_a) - f1*force_ab(:)
606 773992 : force(jkind)%overlap(:, atom_b) = force(jkind)%overlap(:, atom_b) + f1*force_ab(:)
607 193498 : IF (use_virial .AND. dr > 1.e-3_dp) THEN
608 99969 : IF (iatom == jatom) f1 = 1.0_dp
609 99969 : CALL virial_pair_force(virial%pv_virial, -f1, force_ab, rij)
610 99969 : IF (atprop%stress) THEN
611 64044 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp*f1, force_ab, rij)
612 64044 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp*f1, force_ab, rij)
613 : END IF
614 : END IF
615 : END IF
616 : ! update S matrix
617 940555 : IF (iatom <= jatom) THEN
618 9328748 : sblock(:, :) = sblock(:, :) + sint(:, :, 1)
619 : ELSE
620 7331711 : sblock(:, :) = sblock(:, :) + TRANSPOSE(sint(:, :, 1))
621 : END IF
622 940555 : IF (calculate_forces) THEN
623 773992 : DO i = 2, 4
624 773992 : IF (iatom <= jatom) THEN
625 8160408 : dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) + sint(:, :, i)
626 : ELSE
627 6108969 : dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) - TRANSPOSE(sint(:, :, i))
628 : END IF
629 : END DO
630 : END IF
631 :
632 : ! Calculate Pi = Pia * Pib (Eq. 11)
633 940555 : rcovab = rcova + rcovb
634 940555 : rrab = SQRT(dr/rcovab)
635 2906698 : DO i = 1, nsa
636 2906698 : pia(i) = 1._dp + kpolya(i)*rrab
637 : END DO
638 2906703 : DO i = 1, nsb
639 2906703 : pib(i) = 1._dp + kpolyb(i)*rrab
640 : END DO
641 940555 : IF (calculate_forces) THEN
642 193498 : IF (dr > 1.e-6_dp) THEN
643 191450 : drx = 0.5_dp/rrab/rcovab
644 : ELSE
645 : drx = 0.0_dp
646 : END IF
647 616081 : dpia(1:nsa) = drx*kpolya(1:nsa)
648 616083 : dpib(1:nsb) = drx*kpolyb(1:nsb)
649 : END IF
650 :
651 : ! diagonal block
652 940555 : diagblock = .FALSE.
653 940555 : IF (iatom == jatom .AND. dr < 0.001_dp) diagblock = .TRUE.
654 : !
655 : ! Eq. 10
656 : !
657 : IF (diagblock) THEN
658 58521 : DO i = 1, natorb_a
659 44079 : na = naoa(i)
660 58521 : fblock(i, i) = fblock(i, i) + huckel(na, iatom)
661 : END DO
662 : ELSE
663 3890236 : DO j = 1, natorb_b
664 2964123 : nb = naob(j)
665 16540796 : DO i = 1, natorb_a
666 12650560 : na = naoa(i)
667 12650560 : hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
668 15614683 : IF (iatom <= jatom) THEN
669 7080170 : fblock(i, j) = fblock(i, j) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
670 : ELSE
671 5570390 : fblock(j, i) = fblock(j, i) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
672 : END IF
673 : END DO
674 : END DO
675 : END IF
676 940555 : IF (calculate_forces) THEN
677 193498 : f0 = 1.0_dp
678 193498 : IF (irow == iatom) f0 = -1.0_dp
679 : ! Derivative wrt coordination number
680 193498 : fhua = 0.0_dp
681 193498 : fhub = 0.0_dp
682 193498 : fhud = 0.0_dp
683 193498 : IF (diagblock) THEN
684 8280 : DO i = 1, natorb_a
685 6232 : la = laoa(i)
686 6232 : na = naoa(i)
687 8280 : fhud = fhud + pblock(i, i)*kcnlk(la, ikind)*hena(na)
688 : END DO
689 : ELSE
690 902491 : DO j = 1, natorb_b
691 711041 : lb = laob(j)
692 711041 : nb = naob(j)
693 4736811 : DO i = 1, natorb_a
694 3834320 : la = laoa(i)
695 3834320 : na = naoa(i)
696 3834320 : hij = 0.5_dp*pia(na)*pib(nb)
697 4545361 : IF (iatom <= jatom) THEN
698 2205265 : fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(la, ikind)*hena(na)
699 2205265 : fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(lb, jkind)*henb(nb)
700 : ELSE
701 1629055 : fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(la, ikind)*hena(na)
702 1629055 : fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(lb, jkind)*henb(nb)
703 : END IF
704 : END DO
705 : END DO
706 191450 : IF (iatom /= jatom) THEN
707 172110 : fhua = 2.0_dp*fhua
708 172110 : fhub = 2.0_dp*fhub
709 : END IF
710 : END IF
711 : ! iatom
712 193498 : atom_a = atom_of_kind(iatom)
713 10886952 : DO i = 1, dcnum(iatom)%neighbors
714 10693454 : katom = dcnum(iatom)%nlist(i)
715 10693454 : kkind = kind_of(katom)
716 10693454 : atom_c = atom_of_kind(katom)
717 42773816 : rik = dcnum(iatom)%rik(:, i)
718 42773816 : drk = SQRT(SUM(rik(:)**2))
719 10886952 : IF (drk > 1.e-3_dp) THEN
720 42773816 : fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
721 42773816 : force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdika(:)
722 42773816 : force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdika(:)
723 42773816 : fdikb(:) = fhud*dcnum(iatom)%dvals(i)*rik(:)/drk
724 42773816 : force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdikb(:)
725 42773816 : force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdikb(:)
726 10693454 : IF (use_virial) THEN
727 20544948 : fdik = fdika + fdikb
728 5136237 : CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
729 5136237 : IF (atprop%stress) THEN
730 1477368 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fdik, rik)
731 1477368 : CALL virial_pair_force(atprop%atstress(:, :, katom), -0.5_dp, fdik, rik)
732 : END IF
733 : END IF
734 : END IF
735 : END DO
736 : ! jatom
737 193498 : atom_b = atom_of_kind(jatom)
738 10881412 : DO i = 1, dcnum(jatom)%neighbors
739 10687914 : katom = dcnum(jatom)%nlist(i)
740 10687914 : kkind = kind_of(katom)
741 10687914 : atom_c = atom_of_kind(katom)
742 42751656 : rik = dcnum(jatom)%rik(:, i)
743 42751656 : drk = SQRT(SUM(rik(:)**2))
744 10881412 : IF (drk > 1.e-3_dp) THEN
745 42751656 : fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
746 42751656 : force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) - fdik(:)
747 42751656 : force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdik(:)
748 10687914 : IF (use_virial) THEN
749 5134568 : CALL virial_pair_force(virial%pv_virial, -1._dp, fdik, rik)
750 5134568 : IF (atprop%stress) THEN
751 1476450 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fdik, rik)
752 1476450 : CALL virial_pair_force(atprop%atstress(:, :, katom), -0.5_dp, fdik, rik)
753 : END IF
754 : END IF
755 : END IF
756 : END DO
757 193498 : IF (diagblock) THEN
758 2048 : force_ab = 0._dp
759 : ELSE
760 : ! force from R dendent Huckel element
761 191450 : n1 = SIZE(fblock, 1)
762 191450 : n2 = SIZE(fblock, 2)
763 765800 : ALLOCATE (dfblock(n1, n2))
764 4723321 : dfblock = 0.0_dp
765 902491 : DO j = 1, natorb_b
766 711041 : lb = laob(j)
767 711041 : nb = naob(j)
768 4736811 : DO i = 1, natorb_a
769 3834320 : la = laoa(i)
770 3834320 : na = naoa(i)
771 3834320 : dhij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*(dpia(na)*pib(nb) + pia(na)*dpib(nb))
772 4545361 : IF (iatom <= jatom) THEN
773 2205265 : dfblock(i, j) = dfblock(i, j) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
774 : ELSE
775 1629055 : dfblock(j, i) = dfblock(j, i) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
776 : END IF
777 : END DO
778 : END DO
779 4723321 : dfp = f0*SUM(dfblock(:, :)*pblock(:, :))
780 765800 : DO ir = 1, 3
781 574350 : foab = 2.0_dp*dfp*rij(ir)/dr
782 : ! force from overlap matrix contribution to H
783 2707473 : DO j = 1, natorb_b
784 2133123 : lb = laob(j)
785 2133123 : nb = naob(j)
786 14210433 : DO i = 1, natorb_a
787 11502960 : la = laoa(i)
788 11502960 : na = naoa(i)
789 11502960 : hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
790 13636083 : IF (iatom <= jatom) THEN
791 6615795 : foab = foab + 2.0_dp*hij*sint(i, j, ir + 1)*pblock(i, j)*kijab(i, j, ikind, jkind)
792 : ELSE
793 4887165 : foab = foab - 2.0_dp*hij*sint(i, j, ir + 1)*pblock(j, i)*kijab(i, j, ikind, jkind)
794 : END IF
795 : END DO
796 : END DO
797 765800 : force_ab(ir) = foab
798 : END DO
799 191450 : DEALLOCATE (dfblock)
800 : END IF
801 : END IF
802 :
803 940555 : IF (calculate_forces) THEN
804 193498 : atom_a = atom_of_kind(iatom)
805 193498 : atom_b = atom_of_kind(jatom)
806 499303 : IF (irow == iatom) force_ab = -force_ab
807 773992 : force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - force_ab(:)
808 773992 : force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) + force_ab(:)
809 193498 : IF (use_virial) THEN
810 100601 : f1 = 1.0_dp
811 100601 : IF (iatom == jatom) f1 = 0.5_dp
812 100601 : CALL virial_pair_force(virial%pv_virial, -f1, force_ab, rij)
813 100601 : IF (atprop%stress) THEN
814 64548 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp*f1, force_ab, rij)
815 64548 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp*f1, force_ab, rij)
816 : END IF
817 : END IF
818 : END IF
819 :
820 940555 : DEALLOCATE (oint, owork, sint)
821 :
822 : ! repulsive potential
823 5646514 : IF (dr > 0.001_dp) THEN
824 926113 : erepij = zneffa*zneffb/dr*EXP(-SQRT(alphaa*alphab)*dr**kf)
825 926113 : erep = erep + erepij
826 926113 : IF (atprop%energy) THEN
827 128088 : atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*erepij
828 128088 : atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*erepij
829 : END IF
830 926113 : IF (calculate_forces .AND. (iatom /= jatom .OR. dr > 0.001_dp)) THEN
831 191450 : derepij = -(1.0_dp/dr + SQRT(alphaa*alphab)*kf*dr**(kf - 1.0_dp))*erepij
832 191450 : force_rr(1) = derepij*rij(1)/dr
833 191450 : force_rr(2) = derepij*rij(2)/dr
834 191450 : force_rr(3) = derepij*rij(3)/dr
835 191450 : atom_a = atom_of_kind(iatom)
836 191450 : atom_b = atom_of_kind(jatom)
837 765800 : force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - force_rr(:)
838 765800 : force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + force_rr(:)
839 191450 : IF (use_virial) THEN
840 99969 : f1 = 1.0_dp
841 99969 : IF (iatom == jatom) f1 = 0.5_dp
842 99969 : CALL virial_pair_force(virial%pv_virial, -f1, force_rr, rij)
843 99969 : IF (atprop%stress) THEN
844 64044 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp*f1, force_rr, rij)
845 64044 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp*f1, force_rr, rij)
846 : END IF
847 : END IF
848 : END IF
849 : END IF
850 :
851 : END DO
852 3184 : CALL neighbor_list_iterator_release(nl_iterator)
853 :
854 6368 : DO i = 1, SIZE(matrix_h, 1)
855 53188 : DO img = 1, nimg
856 46820 : CALL dbcsr_finalize(matrix_h(i, img)%matrix)
857 50004 : CALL dbcsr_finalize(matrix_s(i, img)%matrix)
858 : END DO
859 : END DO
860 :
861 3184 : exb = 0.0_dp
862 3184 : IF (xb_inter) THEN
863 3184 : CALL xb_neighbors(neighbor_atoms, para_env)
864 : CALL xb_interaction(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
865 3184 : calculate_forces, use_virial, force, virial, atprop)
866 : END IF
867 :
868 3184 : enonbonded = 0.0_dp
869 3184 : IF (do_nonbonded) THEN
870 : ! nonbonded interactions
871 34 : NULLIFY (sab_xtb_nonbond)
872 34 : CALL get_qs_env(qs_env=qs_env, sab_xtb_nonbond=sab_xtb_nonbond)
873 : CALL nonbonded_correction(enonbonded, force, qs_env, xtb_control, sab_xtb_nonbond, &
874 34 : atomic_kind_set, calculate_forces, use_virial, virial, atprop, atom_of_kind)
875 : END IF
876 : ! set repulsive energy
877 3184 : erep = erep + exb + enonbonded
878 3184 : IF (xb_inter) THEN
879 3184 : CALL para_env%sum(exb)
880 3184 : energy%xtb_xb_inter = exb
881 : END IF
882 3184 : IF (do_nonbonded) THEN
883 34 : CALL para_env%sum(enonbonded)
884 34 : energy%xtb_nonbonded = enonbonded
885 : END IF
886 3184 : CALL para_env%sum(erep)
887 3184 : energy%repulsive = erep
888 :
889 : ! deallocate coordination numbers
890 3184 : DEALLOCATE (cnumbers)
891 3184 : IF (calculate_forces) THEN
892 4218 : DO iatom = 1, natom
893 4218 : DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
894 : END DO
895 : END IF
896 3184 : DEALLOCATE (dcnum)
897 :
898 : ! deallocate Huckel parameters
899 3184 : DEALLOCATE (huckel)
900 : ! deallocate KAB parameters
901 3184 : DEALLOCATE (kijab)
902 :
903 3184 : CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
904 3184 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
905 : qs_env%input, "DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN"), cp_p_file)) THEN
906 : iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN", &
907 0 : extension=".Log")
908 0 : CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
909 0 : after = MIN(MAX(after, 1), 16)
910 0 : DO img = 1, nimg
911 : CALL cp_dbcsr_write_sparse_matrix(matrix_h(1, img)%matrix, 4, after, qs_env, para_env, &
912 0 : output_unit=iw, omit_headers=omit_headers)
913 : END DO
914 0 : CALL cp_print_key_finished_output(iw, logger, qs_env%input, "DFT%PRINT%AO_MATRICES/CORE_HAMILTONIAN")
915 : END IF
916 :
917 3184 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
918 : qs_env%input, "DFT%PRINT%AO_MATRICES/OVERLAP"), cp_p_file)) THEN
919 : iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/OVERLAP", &
920 0 : extension=".Log")
921 0 : CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
922 0 : after = MIN(MAX(after, 1), 16)
923 0 : DO img = 1, nimg
924 : CALL cp_dbcsr_write_sparse_matrix(matrix_s(1, img)%matrix, 4, after, qs_env, para_env, &
925 0 : output_unit=iw, omit_headers=omit_headers)
926 0 : IF (BTEST(cp_print_key_should_output(logger%iter_info, &
927 0 : qs_env%input, "DFT%PRINT%AO_MATRICES/DERIVATIVES"), cp_p_file)) THEN
928 0 : DO i = 2, SIZE(matrix_s, 1)
929 : CALL cp_dbcsr_write_sparse_matrix(matrix_s(i, img)%matrix, 4, after, qs_env, para_env, &
930 0 : output_unit=iw, omit_headers=omit_headers)
931 : END DO
932 : END IF
933 : END DO
934 0 : CALL cp_print_key_finished_output(iw, logger, qs_env%input, "DFT%PRINT%AO_MATRICES/OVERLAP")
935 : END IF
936 :
937 : ! *** Overlap condition number
938 3184 : IF (.NOT. calculate_forces) THEN
939 2756 : IF (cp_print_key_should_output(logger%iter_info, qs_env%input, &
940 : "DFT%PRINT%OVERLAP_CONDITION") .NE. 0) THEN
941 : iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%OVERLAP_CONDITION", &
942 4 : extension=".Log")
943 4 : CALL section_vals_val_get(qs_env%input, "DFT%PRINT%OVERLAP_CONDITION%1-NORM", l_val=norml1)
944 4 : CALL section_vals_val_get(qs_env%input, "DFT%PRINT%OVERLAP_CONDITION%DIAGONALIZATION", l_val=norml2)
945 4 : CALL section_vals_val_get(qs_env%input, "DFT%PRINT%OVERLAP_CONDITION%ARNOLDI", l_val=use_arnoldi)
946 4 : CALL get_qs_env(qs_env=qs_env, blacs_env=blacs_env)
947 4 : CALL overlap_condnum(matrix_s, condnum, iw, norml1, norml2, use_arnoldi, blacs_env)
948 : END IF
949 : END IF
950 :
951 3184 : DEALLOCATE (basis_set_list)
952 3184 : IF (calculate_forces) THEN
953 428 : IF (SIZE(matrix_p, 1) == 2) THEN
954 432 : DO img = 1, nimg
955 : CALL dbcsr_add(matrix_p(1, img)%matrix, matrix_p(2, img)%matrix, alpha_scalar=1.0_dp, &
956 432 : beta_scalar=-1.0_dp)
957 : END DO
958 : END IF
959 : END IF
960 :
961 3184 : IF (xb_inter) THEN
962 11012 : DO ikind = 1, nkind
963 7828 : IF (ASSOCIATED(neighbor_atoms(ikind)%coord)) THEN
964 58 : DEALLOCATE (neighbor_atoms(ikind)%coord)
965 : END IF
966 7828 : IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
967 58 : DEALLOCATE (neighbor_atoms(ikind)%rab)
968 : END IF
969 11012 : IF (ASSOCIATED(neighbor_atoms(ikind)%katom)) THEN
970 58 : DEALLOCATE (neighbor_atoms(ikind)%katom)
971 : END IF
972 : END DO
973 3184 : DEALLOCATE (neighbor_atoms)
974 3184 : DEALLOCATE (kx, rcab)
975 : END IF
976 :
977 3184 : CALL timestop(handle)
978 :
979 15920 : END SUBROUTINE build_xtb_matrices
980 :
981 : ! **************************************************************************************************
982 : !> \brief ...
983 : !> \param qs_env ...
984 : !> \param p_matrix ...
985 : ! **************************************************************************************************
986 16 : SUBROUTINE xtb_hab_force(qs_env, p_matrix)
987 :
988 : TYPE(qs_environment_type), POINTER :: qs_env
989 : TYPE(dbcsr_type), POINTER :: p_matrix
990 :
991 : CHARACTER(LEN=*), PARAMETER :: routineN = 'xtb_hab_force'
992 :
993 : INTEGER :: atom_a, atom_b, atom_c, handle, i, iatom, ic, icol, ikind, img, ir, irow, iset, &
994 : j, jatom, jkind, jset, katom, kkind, la, lb, ldsab, lmaxa, lmaxb, maxder, maxs, n1, n2, &
995 : na, natom, natorb_a, natorb_b, nb, ncoa, ncob, nderivatives, nimg, nkind, nsa, nsb, &
996 : nseta, nsetb, nshell, sgfa, sgfb, za, zb
997 32 : INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, atomnumber, kind_of
998 : INTEGER, DIMENSION(25) :: laoa, laob, lval, naoa, naob
999 : INTEGER, DIMENSION(3) :: cell
1000 16 : INTEGER, DIMENSION(:), POINTER :: la_max, la_min, lb_max, lb_min, npgfa, &
1001 16 : npgfb, nsgfa, nsgfb
1002 16 : INTEGER, DIMENSION(:, :), POINTER :: first_sgfa, first_sgfb
1003 : LOGICAL :: defined, diagblock, floating_a, found, &
1004 : ghost_a, use_virial
1005 16 : LOGICAL, ALLOCATABLE, DIMENSION(:) :: floating, ghost
1006 : REAL(KIND=dp) :: alphaa, alphab, dfp, dhij, dr, drk, drx, ena, enb, etaa, etab, f0, fen, &
1007 : fhua, fhub, fhud, foab, hij, k2sh, kab, kcnd, kcnp, kcns, kd, ken, kf, kg, kia, kjb, kp, &
1008 : ks, ksp, kx2, kxr, rcova, rcovab, rcovb, rrab, zneffa, zneffb
1009 16 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: cnumbers
1010 32 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: dfblock, huckel, kcnlk, owork
1011 16 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: oint, sint
1012 16 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :, :) :: kijab
1013 : REAL(KIND=dp), DIMENSION(0:3) :: kl
1014 : REAL(KIND=dp), DIMENSION(3) :: fdik, fdika, fdikb, force_ab, rij, rik
1015 : REAL(KIND=dp), DIMENSION(5) :: dpia, dpib, hena, henb, kappaa, kappab, &
1016 : kpolya, kpolyb, pia, pib
1017 16 : REAL(KIND=dp), DIMENSION(:), POINTER :: set_radius_a, set_radius_b
1018 16 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: fblock, pblock, rpgfa, rpgfb, sblock, &
1019 16 : scon_a, scon_b, zeta, zetb
1020 16 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1021 64 : TYPE(block_p_type), DIMENSION(2:4) :: dsblocks
1022 : TYPE(cp_logger_type), POINTER :: logger
1023 16 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_h, matrix_s
1024 16 : TYPE(dcnum_type), ALLOCATABLE, DIMENSION(:) :: dcnum
1025 : TYPE(dft_control_type), POINTER :: dft_control
1026 16 : TYPE(gto_basis_set_p_type), DIMENSION(:), POINTER :: basis_set_list
1027 : TYPE(gto_basis_set_type), POINTER :: basis_set_a, basis_set_b
1028 : TYPE(mp_para_env_type), POINTER :: para_env
1029 : TYPE(neighbor_list_iterator_p_type), &
1030 16 : DIMENSION(:), POINTER :: nl_iterator
1031 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1032 16 : POINTER :: sab_orb
1033 16 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1034 : TYPE(qs_dispersion_type), POINTER :: dispersion_env
1035 16 : TYPE(qs_force_type), DIMENSION(:), POINTER :: force
1036 16 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1037 : TYPE(qs_ks_env_type), POINTER :: ks_env
1038 : TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b
1039 : TYPE(xtb_control_type), POINTER :: xtb_control
1040 :
1041 16 : CALL timeset(routineN, handle)
1042 :
1043 16 : NULLIFY (logger)
1044 16 : logger => cp_get_default_logger()
1045 :
1046 16 : NULLIFY (matrix_h, matrix_s, atomic_kind_set, qs_kind_set, sab_orb)
1047 :
1048 : CALL get_qs_env(qs_env=qs_env, &
1049 : atomic_kind_set=atomic_kind_set, &
1050 : qs_kind_set=qs_kind_set, &
1051 : dft_control=dft_control, &
1052 : para_env=para_env, &
1053 16 : sab_orb=sab_orb)
1054 :
1055 16 : nkind = SIZE(atomic_kind_set)
1056 16 : xtb_control => dft_control%qs_control%xtb_control
1057 16 : nimg = dft_control%nimages
1058 16 : nderivatives = 1
1059 16 : maxder = ncoset(nderivatives)
1060 :
1061 : ! global parameters (Table 2 from Ref.)
1062 16 : ks = xtb_control%ks
1063 16 : kp = xtb_control%kp
1064 16 : kd = xtb_control%kd
1065 16 : ksp = xtb_control%ksp
1066 16 : k2sh = xtb_control%k2sh
1067 16 : kg = xtb_control%kg
1068 16 : kf = xtb_control%kf
1069 16 : kcns = xtb_control%kcns
1070 16 : kcnp = xtb_control%kcnp
1071 16 : kcnd = xtb_control%kcnd
1072 16 : ken = xtb_control%ken
1073 16 : kxr = xtb_control%kxr
1074 16 : kx2 = xtb_control%kx2
1075 :
1076 16 : NULLIFY (particle_set)
1077 16 : CALL get_qs_env(qs_env=qs_env, particle_set=particle_set)
1078 16 : natom = SIZE(particle_set)
1079 16 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind)
1080 16 : CALL get_qs_kind_set(qs_kind_set=qs_kind_set, maxsgf=maxs, basis_type="ORB")
1081 :
1082 16 : NULLIFY (force)
1083 16 : CALL get_qs_env(qs_env=qs_env, force=force)
1084 16 : use_virial = .FALSE.
1085 16 : CPASSERT(nimg == 1)
1086 :
1087 : ! set up basis set lists
1088 86 : ALLOCATE (basis_set_list(nkind))
1089 16 : CALL basis_set_list_setup(basis_set_list, "ORB", qs_kind_set)
1090 :
1091 : ! allocate overlap matrix
1092 16 : CALL get_qs_env(qs_env=qs_env, ks_env=ks_env)
1093 16 : CALL dbcsr_allocate_matrix_set(matrix_s, maxder, nimg)
1094 : CALL create_sab_matrix(ks_env, matrix_s, "xTB OVERLAP MATRIX", basis_set_list, basis_set_list, &
1095 16 : sab_orb, .TRUE.)
1096 : ! initialize H matrix
1097 16 : CALL dbcsr_allocate_matrix_set(matrix_h, 1, nimg)
1098 32 : DO img = 1, nimg
1099 16 : ALLOCATE (matrix_h(1, img)%matrix)
1100 : CALL dbcsr_create(matrix_h(1, img)%matrix, template=matrix_s(1, 1)%matrix, &
1101 16 : name="HAMILTONIAN MATRIX")
1102 32 : CALL cp_dbcsr_alloc_block_from_nbl(matrix_h(1, img)%matrix, sab_orb)
1103 : END DO
1104 :
1105 : ! Calculate coordination numbers
1106 : ! needed for effective atomic energy levels (Eq. 12)
1107 : ! code taken from D3 dispersion energy
1108 48 : ALLOCATE (cnumbers(natom))
1109 256 : cnumbers = 0._dp
1110 48 : ALLOCATE (dcnum(natom))
1111 256 : dcnum(:)%neighbors = 0
1112 256 : DO iatom = 1, natom
1113 256 : ALLOCATE (dcnum(iatom)%nlist(10), dcnum(iatom)%dvals(10), dcnum(iatom)%rik(3, 10))
1114 : END DO
1115 :
1116 112 : ALLOCATE (ghost(nkind), floating(nkind), atomnumber(nkind))
1117 54 : DO ikind = 1, nkind
1118 38 : CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
1119 38 : CALL get_qs_kind(qs_kind_set(ikind), ghost=ghost_a, floating=floating_a)
1120 38 : ghost(ikind) = ghost_a
1121 38 : floating(ikind) = floating_a
1122 92 : atomnumber(ikind) = za
1123 : END DO
1124 16 : CALL get_qs_env(qs_env=qs_env, dispersion_env=dispersion_env)
1125 : CALL d3_cnumber(qs_env, dispersion_env, cnumbers, dcnum, ghost, floating, atomnumber, &
1126 16 : .TRUE., .FALSE.)
1127 16 : DEALLOCATE (ghost, floating, atomnumber)
1128 16 : CALL para_env%sum(cnumbers)
1129 16 : CALL dcnum_distribute(dcnum, para_env)
1130 :
1131 : ! Calculate Huckel parameters
1132 : ! Eq 12
1133 : ! huckel(nshell,natom)
1134 48 : ALLOCATE (kcnlk(0:3, nkind))
1135 54 : DO ikind = 1, nkind
1136 38 : CALL get_atomic_kind(atomic_kind_set(ikind), z=za)
1137 54 : IF (metal(za)) THEN
1138 0 : kcnlk(0:3, ikind) = 0.0_dp
1139 38 : ELSEIF (early3d(za)) THEN
1140 0 : kcnlk(0, ikind) = kcns
1141 0 : kcnlk(1, ikind) = kcnp
1142 0 : kcnlk(2, ikind) = 0.005_dp
1143 0 : kcnlk(3, ikind) = 0.0_dp
1144 : ELSE
1145 38 : kcnlk(0, ikind) = kcns
1146 38 : kcnlk(1, ikind) = kcnp
1147 38 : kcnlk(2, ikind) = kcnd
1148 38 : kcnlk(3, ikind) = 0.0_dp
1149 : END IF
1150 : END DO
1151 48 : ALLOCATE (huckel(5, natom))
1152 16 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
1153 256 : DO iatom = 1, natom
1154 240 : ikind = kind_of(iatom)
1155 240 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1156 240 : CALL get_xtb_atom_param(xtb_atom_a, nshell=nshell, lval=lval, hen=hena)
1157 1440 : huckel(:, iatom) = 0.0_dp
1158 976 : DO i = 1, nshell
1159 720 : huckel(i, iatom) = hena(i)*(1._dp + kcnlk(lval(i), ikind)*cnumbers(iatom))
1160 : END DO
1161 : END DO
1162 :
1163 : ! Calculate KAB parameters and Huckel parameters and electronegativity correction
1164 16 : kl(0) = ks
1165 16 : kl(1) = kp
1166 16 : kl(2) = kd
1167 16 : kl(3) = 0.0_dp
1168 96 : ALLOCATE (kijab(maxs, maxs, nkind, nkind))
1169 2028 : kijab = 0.0_dp
1170 54 : DO ikind = 1, nkind
1171 38 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1172 38 : CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
1173 38 : IF (.NOT. defined .OR. natorb_a < 1) CYCLE
1174 38 : CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, electronegativity=ena)
1175 186 : DO jkind = 1, nkind
1176 94 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1177 94 : CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
1178 94 : IF (.NOT. defined .OR. natorb_b < 1) CYCLE
1179 94 : CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, electronegativity=enb)
1180 : ! get Fen = (1+ken*deltaEN^2)
1181 94 : fen = 1.0_dp + ken*(ena - enb)**2
1182 : ! Kab
1183 94 : kab = xtb_set_kab(za, zb, xtb_control)
1184 526 : DO j = 1, natorb_b
1185 300 : lb = laob(j)
1186 300 : nb = naob(j)
1187 1354 : DO i = 1, natorb_a
1188 960 : la = laoa(i)
1189 960 : na = naoa(i)
1190 960 : kia = kl(la)
1191 960 : kjb = kl(lb)
1192 960 : IF (zb == 1 .AND. nb == 2) kjb = k2sh
1193 960 : IF (za == 1 .AND. na == 2) kia = k2sh
1194 1260 : IF ((zb == 1 .AND. nb == 2) .OR. (za == 1 .AND. na == 2)) THEN
1195 224 : kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)
1196 : ELSE
1197 736 : IF ((la == 0 .AND. lb == 1) .OR. (la == 1 .AND. lb == 0)) THEN
1198 336 : kijab(i, j, ikind, jkind) = ksp*kab*fen
1199 : ELSE
1200 400 : kijab(i, j, ikind, jkind) = 0.5_dp*(kia + kjb)*kab*fen
1201 : END IF
1202 : END IF
1203 : END DO
1204 : END DO
1205 : END DO
1206 : END DO
1207 :
1208 : ! loop over all atom pairs with a non-zero overlap (sab_orb)
1209 16 : CALL neighbor_list_iterator_create(nl_iterator, sab_orb)
1210 13003 : DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
1211 : CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
1212 12987 : iatom=iatom, jatom=jatom, r=rij, cell=cell)
1213 12987 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
1214 12987 : CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
1215 12987 : IF (.NOT. defined .OR. natorb_a < 1) CYCLE
1216 12987 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
1217 12987 : CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
1218 12987 : IF (.NOT. defined .OR. natorb_b < 1) CYCLE
1219 :
1220 51948 : dr = SQRT(SUM(rij(:)**2))
1221 :
1222 : ! atomic parameters
1223 : CALL get_xtb_atom_param(xtb_atom_a, z=za, nao=naoa, lao=laoa, rcov=rcova, eta=etaa, &
1224 : lmax=lmaxa, nshell=nsa, alpha=alphaa, zneff=zneffa, kpoly=kpolya, &
1225 12987 : kappa=kappaa, hen=hena)
1226 : CALL get_xtb_atom_param(xtb_atom_b, z=zb, nao=naob, lao=laob, rcov=rcovb, eta=etab, &
1227 : lmax=lmaxb, nshell=nsb, alpha=alphab, zneff=zneffb, kpoly=kpolyb, &
1228 12987 : kappa=kappab, hen=henb)
1229 :
1230 12987 : ic = 1
1231 :
1232 12987 : icol = MAX(iatom, jatom)
1233 12987 : irow = MIN(iatom, jatom)
1234 12987 : NULLIFY (sblock, fblock)
1235 : CALL dbcsr_get_block_p(matrix=matrix_s(1, ic)%matrix, &
1236 12987 : row=irow, col=icol, BLOCK=sblock, found=found)
1237 12987 : CPASSERT(found)
1238 : CALL dbcsr_get_block_p(matrix=matrix_h(1, ic)%matrix, &
1239 12987 : row=irow, col=icol, BLOCK=fblock, found=found)
1240 12987 : CPASSERT(found)
1241 :
1242 12987 : NULLIFY (pblock)
1243 : CALL dbcsr_get_block_p(matrix=p_matrix, &
1244 12987 : row=irow, col=icol, block=pblock, found=found)
1245 12987 : CPASSERT(ASSOCIATED(pblock))
1246 51948 : DO i = 2, 4
1247 38961 : NULLIFY (dsblocks(i)%block)
1248 : CALL dbcsr_get_block_p(matrix=matrix_s(i, ic)%matrix, &
1249 38961 : row=irow, col=icol, BLOCK=dsblocks(i)%block, found=found)
1250 51948 : CPASSERT(found)
1251 : END DO
1252 :
1253 : ! overlap
1254 12987 : basis_set_a => basis_set_list(ikind)%gto_basis_set
1255 12987 : IF (.NOT. ASSOCIATED(basis_set_a)) CYCLE
1256 12987 : basis_set_b => basis_set_list(jkind)%gto_basis_set
1257 12987 : IF (.NOT. ASSOCIATED(basis_set_b)) CYCLE
1258 12987 : atom_a = atom_of_kind(iatom)
1259 12987 : atom_b = atom_of_kind(jatom)
1260 : ! basis ikind
1261 12987 : first_sgfa => basis_set_a%first_sgf
1262 12987 : la_max => basis_set_a%lmax
1263 12987 : la_min => basis_set_a%lmin
1264 12987 : npgfa => basis_set_a%npgf
1265 12987 : nseta = basis_set_a%nset
1266 12987 : nsgfa => basis_set_a%nsgf_set
1267 12987 : rpgfa => basis_set_a%pgf_radius
1268 12987 : set_radius_a => basis_set_a%set_radius
1269 12987 : scon_a => basis_set_a%scon
1270 12987 : zeta => basis_set_a%zet
1271 : ! basis jkind
1272 12987 : first_sgfb => basis_set_b%first_sgf
1273 12987 : lb_max => basis_set_b%lmax
1274 12987 : lb_min => basis_set_b%lmin
1275 12987 : npgfb => basis_set_b%npgf
1276 12987 : nsetb = basis_set_b%nset
1277 12987 : nsgfb => basis_set_b%nsgf_set
1278 12987 : rpgfb => basis_set_b%pgf_radius
1279 12987 : set_radius_b => basis_set_b%set_radius
1280 12987 : scon_b => basis_set_b%scon
1281 12987 : zetb => basis_set_b%zet
1282 :
1283 12987 : ldsab = get_memory_usage(qs_kind_set, "ORB", "ORB")
1284 103896 : ALLOCATE (oint(ldsab, ldsab, maxder), owork(ldsab, ldsab))
1285 64935 : ALLOCATE (sint(natorb_a, natorb_b, maxder))
1286 515591 : sint = 0.0_dp
1287 :
1288 38961 : DO iset = 1, nseta
1289 25974 : ncoa = npgfa(iset)*ncoset(la_max(iset))
1290 25974 : n1 = npgfa(iset)*(ncoset(la_max(iset)) - ncoset(la_min(iset) - 1))
1291 25974 : sgfa = first_sgfa(1, iset)
1292 90909 : DO jset = 1, nsetb
1293 51948 : IF (set_radius_a(iset) + set_radius_b(jset) < dr) CYCLE
1294 45815 : ncob = npgfb(jset)*ncoset(lb_max(jset))
1295 45815 : n2 = npgfb(jset)*(ncoset(lb_max(jset)) - ncoset(lb_min(jset) - 1))
1296 45815 : sgfb = first_sgfb(1, jset)
1297 : CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
1298 : lb_max(jset), lb_min(jset), npgfb(jset), rpgfb(:, jset), zetb(:, jset), &
1299 45815 : rij, sab=oint(:, :, 1), dab=oint(:, :, 2:4))
1300 : ! Contraction
1301 255049 : DO i = 1, 4
1302 : CALL contraction(oint(:, :, i), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
1303 183260 : cb=scon_b(:, sgfb:), nb=n2, mb=nsgfb(jset), fscale=1.0_dp, trans=.FALSE.)
1304 235208 : CALL block_add("IN", owork, nsgfa(iset), nsgfb(jset), sint(:, :, i), sgfa, sgfb, trans=.FALSE.)
1305 : END DO
1306 : END DO
1307 : END DO
1308 : ! update S matrix
1309 12987 : IF (iatom <= jatom) THEN
1310 61008 : sblock(:, :) = sblock(:, :) + sint(:, :, 1)
1311 : ELSE
1312 59865 : sblock(:, :) = sblock(:, :) + TRANSPOSE(sint(:, :, 1))
1313 : END IF
1314 51948 : DO i = 2, 4
1315 51948 : IF (iatom <= jatom) THEN
1316 183024 : dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) + sint(:, :, i)
1317 : ELSE
1318 179595 : dsblocks(i)%block(:, :) = dsblocks(i)%block(:, :) - TRANSPOSE(sint(:, :, i))
1319 : END IF
1320 : END DO
1321 :
1322 : ! Calculate Pi = Pia * Pib (Eq. 11)
1323 12987 : rcovab = rcova + rcovb
1324 12987 : rrab = SQRT(dr/rcovab)
1325 38961 : DO i = 1, nsa
1326 38961 : pia(i) = 1._dp + kpolya(i)*rrab
1327 : END DO
1328 38961 : DO i = 1, nsb
1329 38961 : pib(i) = 1._dp + kpolyb(i)*rrab
1330 : END DO
1331 12987 : IF (dr > 1.e-6_dp) THEN
1332 12867 : drx = 0.5_dp/rrab/rcovab
1333 : ELSE
1334 : drx = 0.0_dp
1335 : END IF
1336 38961 : dpia(1:nsa) = drx*kpolya(1:nsa)
1337 38961 : dpib(1:nsb) = drx*kpolyb(1:nsb)
1338 :
1339 : ! diagonal block
1340 12987 : diagblock = .FALSE.
1341 12987 : IF (iatom == jatom .AND. dr < 0.001_dp) diagblock = .TRUE.
1342 : !
1343 : ! Eq. 10
1344 : !
1345 : IF (diagblock) THEN
1346 444 : DO i = 1, natorb_a
1347 324 : na = naoa(i)
1348 444 : fblock(i, i) = fblock(i, i) + huckel(na, iatom)
1349 : END DO
1350 : ELSE
1351 44819 : DO j = 1, natorb_b
1352 31952 : nb = naob(j)
1353 124223 : DO i = 1, natorb_a
1354 79404 : na = naoa(i)
1355 79404 : hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
1356 111356 : IF (iatom <= jatom) THEN
1357 39648 : fblock(i, j) = fblock(i, j) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1358 : ELSE
1359 39756 : fblock(j, i) = fblock(j, i) + hij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1360 : END IF
1361 : END DO
1362 : END DO
1363 : END IF
1364 :
1365 12987 : f0 = 1.0_dp
1366 12987 : IF (irow == iatom) f0 = -1.0_dp
1367 : ! Derivative wrt coordination number
1368 12987 : fhua = 0.0_dp
1369 12987 : fhub = 0.0_dp
1370 12987 : fhud = 0.0_dp
1371 12987 : IF (diagblock) THEN
1372 444 : DO i = 1, natorb_a
1373 324 : la = laoa(i)
1374 324 : na = naoa(i)
1375 444 : fhud = fhud + pblock(i, i)*kcnlk(la, ikind)*hena(na)
1376 : END DO
1377 : ELSE
1378 44819 : DO j = 1, natorb_b
1379 31952 : lb = laob(j)
1380 31952 : nb = naob(j)
1381 124223 : DO i = 1, natorb_a
1382 79404 : la = laoa(i)
1383 79404 : na = naoa(i)
1384 79404 : hij = 0.5_dp*pia(na)*pib(nb)
1385 111356 : IF (iatom <= jatom) THEN
1386 39648 : fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(la, ikind)*hena(na)
1387 39648 : fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(i, j)*kcnlk(lb, jkind)*henb(nb)
1388 : ELSE
1389 39756 : fhua = fhua + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(la, ikind)*hena(na)
1390 39756 : fhub = fhub + hij*kijab(i, j, ikind, jkind)*sint(i, j, 1)*pblock(j, i)*kcnlk(lb, jkind)*henb(nb)
1391 : END IF
1392 : END DO
1393 : END DO
1394 12867 : IF (iatom /= jatom) THEN
1395 12825 : fhua = 2.0_dp*fhua
1396 12825 : fhub = 2.0_dp*fhub
1397 : END IF
1398 : END IF
1399 : ! iatom
1400 12987 : atom_a = atom_of_kind(iatom)
1401 305732 : DO i = 1, dcnum(iatom)%neighbors
1402 292745 : katom = dcnum(iatom)%nlist(i)
1403 292745 : kkind = kind_of(katom)
1404 292745 : atom_c = atom_of_kind(katom)
1405 1170980 : rik = dcnum(iatom)%rik(:, i)
1406 1170980 : drk = SQRT(SUM(rik(:)**2))
1407 305732 : IF (drk > 1.e-3_dp) THEN
1408 1170980 : fdika(:) = fhua*dcnum(iatom)%dvals(i)*rik(:)/drk
1409 1170980 : force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdika(:)
1410 1170980 : force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdika(:)
1411 1170980 : fdikb(:) = fhud*dcnum(iatom)%dvals(i)*rik(:)/drk
1412 1170980 : force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - fdikb(:)
1413 1170980 : force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdikb(:)
1414 : END IF
1415 : END DO
1416 : ! jatom
1417 12987 : atom_b = atom_of_kind(jatom)
1418 304187 : DO i = 1, dcnum(jatom)%neighbors
1419 291200 : katom = dcnum(jatom)%nlist(i)
1420 291200 : kkind = kind_of(katom)
1421 291200 : atom_c = atom_of_kind(katom)
1422 1164800 : rik = dcnum(jatom)%rik(:, i)
1423 1164800 : drk = SQRT(SUM(rik(:)**2))
1424 304187 : IF (drk > 1.e-3_dp) THEN
1425 1164800 : fdik(:) = fhub*dcnum(jatom)%dvals(i)*rik(:)/drk
1426 1164800 : force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) - fdik(:)
1427 1164800 : force(kkind)%all_potential(:, atom_c) = force(kkind)%all_potential(:, atom_c) + fdik(:)
1428 : END IF
1429 : END DO
1430 12987 : IF (diagblock) THEN
1431 120 : force_ab = 0._dp
1432 : ELSE
1433 : ! force from R dendent Huckel element
1434 12867 : n1 = SIZE(fblock, 1)
1435 12867 : n2 = SIZE(fblock, 2)
1436 51468 : ALLOCATE (dfblock(n1, n2))
1437 119445 : dfblock = 0.0_dp
1438 44819 : DO j = 1, natorb_b
1439 31952 : lb = laob(j)
1440 31952 : nb = naob(j)
1441 124223 : DO i = 1, natorb_a
1442 79404 : la = laoa(i)
1443 79404 : na = naoa(i)
1444 79404 : dhij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*(dpia(na)*pib(nb) + pia(na)*dpib(nb))
1445 111356 : IF (iatom <= jatom) THEN
1446 39648 : dfblock(i, j) = dfblock(i, j) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1447 : ELSE
1448 39756 : dfblock(j, i) = dfblock(j, i) + dhij*sint(i, j, 1)*kijab(i, j, ikind, jkind)
1449 : END IF
1450 : END DO
1451 : END DO
1452 119445 : dfp = f0*SUM(dfblock(:, :)*pblock(:, :))
1453 51468 : DO ir = 1, 3
1454 38601 : foab = 2.0_dp*dfp*rij(ir)/dr
1455 : ! force from overlap matrix contribution to H
1456 134457 : DO j = 1, natorb_b
1457 95856 : lb = laob(j)
1458 95856 : nb = naob(j)
1459 372669 : DO i = 1, natorb_a
1460 238212 : la = laoa(i)
1461 238212 : na = naoa(i)
1462 238212 : hij = 0.5_dp*(huckel(na, iatom) + huckel(nb, jatom))*pia(na)*pib(nb)
1463 334068 : IF (iatom <= jatom) THEN
1464 118944 : foab = foab + 2.0_dp*hij*sint(i, j, ir + 1)*pblock(i, j)*kijab(i, j, ikind, jkind)
1465 : ELSE
1466 119268 : foab = foab - 2.0_dp*hij*sint(i, j, ir + 1)*pblock(j, i)*kijab(i, j, ikind, jkind)
1467 : END IF
1468 : END DO
1469 : END DO
1470 51468 : force_ab(ir) = foab
1471 : END DO
1472 12867 : DEALLOCATE (dfblock)
1473 : END IF
1474 :
1475 12987 : atom_a = atom_of_kind(iatom)
1476 12987 : atom_b = atom_of_kind(jatom)
1477 32565 : IF (irow == iatom) force_ab = -force_ab
1478 51948 : force(ikind)%all_potential(:, atom_a) = force(ikind)%all_potential(:, atom_a) - force_ab(:)
1479 51948 : force(jkind)%all_potential(:, atom_b) = force(jkind)%all_potential(:, atom_b) + force_ab(:)
1480 :
1481 77938 : DEALLOCATE (oint, owork, sint)
1482 :
1483 : END DO
1484 16 : CALL neighbor_list_iterator_release(nl_iterator)
1485 :
1486 32 : DO i = 1, SIZE(matrix_h, 1)
1487 48 : DO img = 1, nimg
1488 16 : CALL dbcsr_finalize(matrix_h(i, img)%matrix)
1489 32 : CALL dbcsr_finalize(matrix_s(i, img)%matrix)
1490 : END DO
1491 : END DO
1492 16 : CALL dbcsr_deallocate_matrix_set(matrix_s)
1493 16 : CALL dbcsr_deallocate_matrix_set(matrix_h)
1494 :
1495 : ! deallocate coordination numbers
1496 16 : DEALLOCATE (cnumbers)
1497 256 : DO iatom = 1, natom
1498 256 : DEALLOCATE (dcnum(iatom)%nlist, dcnum(iatom)%dvals, dcnum(iatom)%rik)
1499 : END DO
1500 16 : DEALLOCATE (dcnum)
1501 :
1502 : ! deallocate Huckel parameters
1503 16 : DEALLOCATE (huckel)
1504 : ! deallocate KAB parameters
1505 16 : DEALLOCATE (kijab)
1506 :
1507 16 : DEALLOCATE (basis_set_list)
1508 :
1509 16 : CALL timestop(handle)
1510 :
1511 64 : END SUBROUTINE xtb_hab_force
1512 :
1513 : ! **************************************************************************************************
1514 : !> \brief ...
1515 : !> \param qs_env ...
1516 : !> \param calculate_forces ...
1517 : !> \param just_energy ...
1518 : !> \param ext_ks_matrix ...
1519 : ! **************************************************************************************************
1520 23020 : SUBROUTINE build_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
1521 : TYPE(qs_environment_type), POINTER :: qs_env
1522 : LOGICAL, INTENT(in) :: calculate_forces, just_energy
1523 : TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
1524 : POINTER :: ext_ks_matrix
1525 :
1526 : CHARACTER(len=*), PARAMETER :: routineN = 'build_xtb_ks_matrix'
1527 :
1528 : INTEGER :: atom_a, handle, iatom, ikind, img, &
1529 : iounit, is, ispin, na, natom, natorb, &
1530 : nimg, nkind, ns, nsgf, nspins
1531 : INTEGER, DIMENSION(25) :: lao
1532 : INTEGER, DIMENSION(5) :: occ
1533 : LOGICAL :: do_efield, pass_check
1534 : REAL(KIND=dp) :: achrg, chmax, pc_ener, qmmm_el
1535 23020 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: mcharge
1536 23020 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: aocg, charges
1537 23020 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
1538 : TYPE(cp_logger_type), POINTER :: logger
1539 23020 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p1, mo_derivs, p_matrix
1540 23020 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, matrix_h, matrix_p, matrix_s
1541 : TYPE(dbcsr_type), POINTER :: mo_coeff, s_matrix
1542 : TYPE(dft_control_type), POINTER :: dft_control
1543 : TYPE(mp_para_env_type), POINTER :: para_env
1544 23020 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1545 : TYPE(qs_energy_type), POINTER :: energy
1546 23020 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
1547 : TYPE(qs_ks_env_type), POINTER :: ks_env
1548 : TYPE(qs_rho_type), POINTER :: rho
1549 : TYPE(qs_scf_env_type), POINTER :: scf_env
1550 : TYPE(section_vals_type), POINTER :: scf_section
1551 : TYPE(xtb_atom_type), POINTER :: xtb_kind
1552 :
1553 23020 : CALL timeset(routineN, handle)
1554 :
1555 23020 : NULLIFY (dft_control, logger, scf_section, matrix_p, particle_set, ks_env, &
1556 23020 : ks_matrix, rho, energy)
1557 23020 : CPASSERT(ASSOCIATED(qs_env))
1558 :
1559 23020 : logger => cp_get_default_logger()
1560 23020 : iounit = cp_logger_get_default_io_unit(logger)
1561 :
1562 : CALL get_qs_env(qs_env, &
1563 : dft_control=dft_control, &
1564 : atomic_kind_set=atomic_kind_set, &
1565 : qs_kind_set=qs_kind_set, &
1566 : matrix_h_kp=matrix_h, &
1567 : para_env=para_env, &
1568 : ks_env=ks_env, &
1569 : matrix_ks_kp=ks_matrix, &
1570 : rho=rho, &
1571 23020 : energy=energy)
1572 :
1573 23020 : IF (PRESENT(ext_ks_matrix)) THEN
1574 : ! remap pointer to allow for non-kpoint external ks matrix
1575 : ! ext_ks_matrix is used in linear response code
1576 16 : ns = SIZE(ext_ks_matrix)
1577 16 : ks_matrix(1:ns, 1:1) => ext_ks_matrix(1:ns)
1578 : END IF
1579 :
1580 23020 : energy%hartree = 0.0_dp
1581 23020 : energy%qmmm_el = 0.0_dp
1582 23020 : energy%efield = 0.0_dp
1583 :
1584 23020 : scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
1585 23020 : nspins = dft_control%nspins
1586 23020 : nimg = dft_control%nimages
1587 23020 : CPASSERT(ASSOCIATED(matrix_h))
1588 23020 : CPASSERT(ASSOCIATED(rho))
1589 23020 : CPASSERT(SIZE(ks_matrix) > 0)
1590 :
1591 48192 : DO ispin = 1, nspins
1592 434174 : DO img = 1, nimg
1593 : ! copy the core matrix into the fock matrix
1594 411154 : CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
1595 : END DO
1596 : END DO
1597 :
1598 23020 : IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
1599 : dft_control%apply_efield_field) THEN
1600 : do_efield = .TRUE.
1601 : ELSE
1602 17128 : do_efield = .FALSE.
1603 : END IF
1604 :
1605 23020 : IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield) THEN
1606 : ! Mulliken charges
1607 21138 : CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, matrix_s_kp=matrix_s)
1608 21138 : CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
1609 21138 : natom = SIZE(particle_set)
1610 105690 : ALLOCATE (mcharge(natom), charges(natom, 5))
1611 1146428 : charges = 0.0_dp
1612 21138 : nkind = SIZE(atomic_kind_set)
1613 21138 : CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
1614 84552 : ALLOCATE (aocg(nsgf, natom))
1615 1091628 : aocg = 0.0_dp
1616 21138 : IF (nimg > 1) THEN
1617 2644 : CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
1618 : ELSE
1619 18494 : p_matrix => matrix_p(:, 1)
1620 18494 : s_matrix => matrix_s(1, 1)%matrix
1621 18494 : CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1622 : END IF
1623 76960 : DO ikind = 1, nkind
1624 55822 : CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
1625 55822 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1626 55822 : CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, occupation=occ)
1627 336702 : DO iatom = 1, na
1628 203920 : atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1629 1223520 : charges(atom_a, :) = REAL(occ(:), KIND=dp)
1630 909932 : DO is = 1, natorb
1631 650190 : ns = lao(is) + 1
1632 854110 : charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1633 : END DO
1634 : END DO
1635 : END DO
1636 21138 : DEALLOCATE (aocg)
1637 : ! charge mixing
1638 21138 : IF (dft_control%qs_control%do_ls_scf) THEN
1639 : !
1640 : ELSE
1641 20930 : CALL get_qs_env(qs_env=qs_env, scf_env=scf_env)
1642 : CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
1643 20930 : charges, para_env, scf_env%iter_count)
1644 : END IF
1645 :
1646 246196 : DO iatom = 1, natom
1647 1246540 : mcharge(iatom) = SUM(charges(iatom, :))
1648 : END DO
1649 : END IF
1650 :
1651 23020 : IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
1652 : CALL build_xtb_coulomb(qs_env, ks_matrix, rho, charges, mcharge, energy, &
1653 21138 : calculate_forces, just_energy)
1654 : END IF
1655 :
1656 23020 : IF (do_efield) THEN
1657 5892 : CALL efield_tb_matrix(qs_env, ks_matrix, rho, mcharge, energy, calculate_forces, just_energy)
1658 : END IF
1659 :
1660 23020 : IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
1661 21138 : IF (dft_control%qs_control%xtb_control%check_atomic_charges) THEN
1662 20280 : pass_check = .TRUE.
1663 73404 : DO ikind = 1, nkind
1664 53124 : CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
1665 53124 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1666 53124 : CALL get_xtb_atom_param(xtb_kind, chmax=chmax)
1667 326124 : DO iatom = 1, na
1668 199596 : atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1669 199596 : achrg = mcharge(atom_a)
1670 252720 : IF (ABS(achrg) > chmax) THEN
1671 0 : IF (iounit > 0) THEN
1672 0 : WRITE (iounit, "(A,A,I3,I6,A,F4.2,A,F6.2)") " Charge outside chemical range:", &
1673 0 : " Kind Atom=", ikind, atom_a, " Limit=", chmax, " Charge=", achrg
1674 : END IF
1675 : pass_check = .FALSE.
1676 : END IF
1677 : END DO
1678 : END DO
1679 20280 : IF (.NOT. pass_check) THEN
1680 : CALL cp_warn(__LOCATION__, "Atomic charges outside chemical range were detected."// &
1681 : " Switch-off CHECK_ATOMIC_CHARGES keyword in the &xTB section"// &
1682 0 : " if you want to force to continue the calculation.")
1683 0 : CPABORT("xTB Charges")
1684 : END IF
1685 : END IF
1686 : END IF
1687 :
1688 23020 : IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield) THEN
1689 21138 : DEALLOCATE (mcharge, charges)
1690 : END IF
1691 :
1692 23020 : IF (qs_env%qmmm) THEN
1693 5146 : CPASSERT(SIZE(ks_matrix, 2) == 1)
1694 10292 : DO ispin = 1, nspins
1695 : ! If QM/MM sumup the 1el Hamiltonian
1696 : CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
1697 5146 : 1.0_dp, 1.0_dp)
1698 5146 : CALL qs_rho_get(rho, rho_ao=matrix_p1)
1699 : ! Compute QM/MM Energy
1700 : CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
1701 5146 : matrix_p1(ispin)%matrix, qmmm_el)
1702 10292 : energy%qmmm_el = energy%qmmm_el + qmmm_el
1703 : END DO
1704 5146 : pc_ener = qs_env%ks_qmmm_env%pc_ener
1705 5146 : energy%qmmm_el = energy%qmmm_el + pc_ener
1706 : END IF
1707 :
1708 : energy%total = energy%core + energy%hartree + energy%efield + energy%qmmm_el + &
1709 23020 : energy%repulsive + energy%dispersion + energy%dftb3
1710 :
1711 : iounit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DETAILED_ENERGY", &
1712 23020 : extension=".scfLog")
1713 23020 : IF (iounit > 0) THEN
1714 : WRITE (UNIT=iounit, FMT="(/,(T9,A,T60,F20.10))") &
1715 0 : "Repulsive pair potential energy: ", energy%repulsive, &
1716 0 : "Zeroth order Hamiltonian energy: ", energy%core, &
1717 0 : "Charge fluctuation energy: ", energy%hartree, &
1718 0 : "London dispersion energy: ", energy%dispersion
1719 0 : IF (dft_control%qs_control%xtb_control%xb_interaction) &
1720 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
1721 0 : "Correction for halogen bonding: ", energy%xtb_xb_inter
1722 0 : IF (dft_control%qs_control%xtb_control%do_nonbonded) &
1723 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
1724 0 : "Correction for nonbonded interactions: ", energy%xtb_nonbonded
1725 0 : IF (ABS(energy%efield) > 1.e-12_dp) THEN
1726 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
1727 0 : "Electric field interaction energy: ", energy%efield
1728 : END IF
1729 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
1730 0 : "DFTB3 3rd Order Energy Correction ", energy%dftb3
1731 0 : IF (qs_env%qmmm) THEN
1732 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
1733 0 : "QM/MM Electrostatic energy: ", energy%qmmm_el
1734 : END IF
1735 : END IF
1736 : CALL cp_print_key_finished_output(iounit, logger, scf_section, &
1737 23020 : "PRINT%DETAILED_ENERGY")
1738 : ! here we compute dE/dC if needed. Assumes dE/dC is H_{ks}C
1739 23020 : IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy) THEN
1740 7234 : CPASSERT(SIZE(ks_matrix, 2) == 1)
1741 : BLOCK
1742 7234 : TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
1743 7234 : CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
1744 14516 : DO ispin = 1, SIZE(mo_derivs)
1745 7282 : CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
1746 7282 : IF (.NOT. mo_array(ispin)%use_mo_coeff_b) THEN
1747 0 : CPABORT("")
1748 : END IF
1749 : CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
1750 14516 : 0.0_dp, mo_derivs(ispin)%matrix)
1751 : END DO
1752 : END BLOCK
1753 : END IF
1754 :
1755 23020 : CALL timestop(handle)
1756 :
1757 46040 : END SUBROUTINE build_xtb_ks_matrix
1758 :
1759 : ! **************************************************************************************************
1760 : !> \brief Distributes the neighbor atom information to all processors
1761 : !>
1762 : !> \param neighbor_atoms ...
1763 : !> \param para_env ...
1764 : !> \par History
1765 : !> 1.2019 JGH
1766 : !> \version 1.1
1767 : ! **************************************************************************************************
1768 3184 : SUBROUTINE xb_neighbors(neighbor_atoms, para_env)
1769 : TYPE(neighbor_atoms_type), DIMENSION(:), &
1770 : INTENT(INOUT) :: neighbor_atoms
1771 : TYPE(mp_para_env_type), POINTER :: para_env
1772 :
1773 : INTEGER :: iatom, ikind, natom, nkind
1774 3184 : INTEGER, ALLOCATABLE, DIMENSION(:) :: matom
1775 3184 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: dmloc
1776 3184 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: coord
1777 :
1778 3184 : nkind = SIZE(neighbor_atoms)
1779 11012 : DO ikind = 1, nkind
1780 11012 : IF (ASSOCIATED(neighbor_atoms(ikind)%rab)) THEN
1781 58 : natom = SIZE(neighbor_atoms(ikind)%rab)
1782 406 : ALLOCATE (dmloc(2*natom), matom(natom), coord(3, natom))
1783 174 : dmloc = 0.0_dp
1784 116 : DO iatom = 1, natom
1785 58 : dmloc(2*iatom - 1) = neighbor_atoms(ikind)%rab(iatom)
1786 116 : dmloc(2*iatom) = REAL(para_env%mepos, KIND=dp)
1787 : END DO
1788 58 : CALL para_env%minloc(dmloc)
1789 290 : coord = 0.0_dp
1790 116 : matom = 0
1791 116 : DO iatom = 1, natom
1792 58 : neighbor_atoms(ikind)%rab(iatom) = dmloc(2*iatom - 1)
1793 116 : IF (NINT(dmloc(2*iatom)) == para_env%mepos) THEN
1794 116 : coord(1:3, iatom) = neighbor_atoms(ikind)%coord(1:3, iatom)
1795 29 : matom(iatom) = neighbor_atoms(ikind)%katom(iatom)
1796 : END IF
1797 : END DO
1798 58 : CALL para_env%sum(coord)
1799 290 : neighbor_atoms(ikind)%coord(1:3, :) = coord(1:3, :)
1800 58 : CALL para_env%sum(matom)
1801 116 : neighbor_atoms(ikind)%katom(:) = matom(:)
1802 58 : DEALLOCATE (dmloc, matom, coord)
1803 : END IF
1804 : END DO
1805 :
1806 3184 : END SUBROUTINE xb_neighbors
1807 : ! **************************************************************************************************
1808 : !> \brief Computes a correction for nonbonded interactions based on a generic potential
1809 : !>
1810 : !> \param enonbonded energy contribution
1811 : !> \param force ...
1812 : !> \param qs_env ...
1813 : !> \param xtb_control ...
1814 : !> \param sab_xtb_nonbond ...
1815 : !> \param atomic_kind_set ...
1816 : !> \param calculate_forces ...
1817 : !> \param use_virial ...
1818 : !> \param virial ...
1819 : !> \param atprop ...
1820 : !> \param atom_of_kind ..
1821 : !> \par History
1822 : !> 12.2018 JGH
1823 : !> \version 1.1
1824 : ! **************************************************************************************************
1825 68 : SUBROUTINE nonbonded_correction(enonbonded, force, qs_env, xtb_control, sab_xtb_nonbond, &
1826 34 : atomic_kind_set, calculate_forces, use_virial, virial, atprop, atom_of_kind)
1827 : REAL(dp), INTENT(INOUT) :: enonbonded
1828 : TYPE(qs_force_type), DIMENSION(:), INTENT(INOUT), &
1829 : POINTER :: force
1830 : TYPE(qs_environment_type), POINTER :: qs_env
1831 : TYPE(xtb_control_type), POINTER :: xtb_control
1832 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1833 : INTENT(IN), POINTER :: sab_xtb_nonbond
1834 : TYPE(atomic_kind_type), DIMENSION(:), INTENT(IN), &
1835 : POINTER :: atomic_kind_set
1836 : LOGICAL, INTENT(IN) :: calculate_forces, use_virial
1837 : TYPE(virial_type), INTENT(IN), POINTER :: virial
1838 : TYPE(atprop_type), INTENT(IN), POINTER :: atprop
1839 : INTEGER, DIMENSION(:), INTENT(IN) :: atom_of_kind
1840 :
1841 : CHARACTER(len=*), PARAMETER :: routineN = 'nonbonded_correction'
1842 :
1843 : CHARACTER(LEN=default_string_length) :: def_error, this_error
1844 : INTEGER :: atom_i, atom_j, handle, iatom, ikind, &
1845 : jatom, jkind, kk, ntype
1846 : INTEGER, DIMENSION(3) :: cell
1847 : LOGICAL :: do_ewald
1848 : REAL(KIND=dp) :: dedf, dr, dx, energy_cutoff, err, fval, &
1849 : lerr, rcut
1850 : REAL(KIND=dp), DIMENSION(3) :: fij, rij
1851 : TYPE(ewald_environment_type), POINTER :: ewald_env
1852 : TYPE(neighbor_list_iterator_p_type), &
1853 34 : DIMENSION(:), POINTER :: nl_iterator
1854 : TYPE(pair_potential_p_type), POINTER :: nonbonded
1855 : TYPE(pair_potential_pp_type), POINTER :: potparm
1856 : TYPE(pair_potential_single_type), POINTER :: pot
1857 : TYPE(section_vals_type), POINTER :: nonbonded_section
1858 :
1859 34 : CALL timeset(routineN, handle)
1860 :
1861 : NULLIFY (nonbonded)
1862 34 : NULLIFY (potparm)
1863 34 : NULLIFY (ewald_env)
1864 34 : nonbonded => xtb_control%nonbonded
1865 34 : do_ewald = xtb_control%do_ewald
1866 34 : CALL get_qs_env(qs_env=qs_env, ewald_env=ewald_env)
1867 :
1868 34 : ntype = SIZE(atomic_kind_set)
1869 34 : CALL pair_potential_pp_create(potparm, ntype)
1870 : !Assign input and potential info to potparm_nonbond
1871 34 : CALL force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
1872 : !Initialize genetic potential
1873 34 : CALL init_genpot(potparm, ntype)
1874 :
1875 34 : NULLIFY (pot)
1876 34 : enonbonded = 0._dp
1877 34 : energy_cutoff = 0._dp
1878 :
1879 34 : CALL neighbor_list_iterator_create(nl_iterator, sab_xtb_nonbond)
1880 227 : DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
1881 : CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
1882 193 : iatom=iatom, jatom=jatom, r=rij, cell=cell)
1883 193 : pot => potparm%pot(ikind, jkind)%pot
1884 193 : dr = SQRT(rij(1)**2 + rij(2)**2 + rij(3)**2)
1885 193 : rcut = SQRT(pot%rcutsq)
1886 193 : IF (dr <= rcut .AND. dr > 1.E-3_dp) THEN
1887 25 : fval = 1.0_dp
1888 25 : IF (ikind == jkind) fval = 0.5_dp
1889 : ! splines not implemented
1890 25 : enonbonded = enonbonded + fval*ener_pot(pot, dr, energy_cutoff)
1891 25 : IF (atprop%energy) THEN
1892 16 : atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
1893 16 : atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*fval*ener_pot(pot, dr, energy_cutoff)
1894 : END IF
1895 : END IF
1896 :
1897 193 : IF (calculate_forces) THEN
1898 :
1899 93 : kk = SIZE(pot%type)
1900 93 : IF (kk /= 1) THEN
1901 0 : CALL cp_warn(__LOCATION__, "Generic potential with type > 1 not implemented.")
1902 0 : CPABORT("pot type")
1903 : END IF
1904 : ! rmin and rmax and rcut
1905 93 : IF ((pot%set(kk)%rmin /= not_initialized) .AND. (dr < pot%set(kk)%rmin)) CYCLE
1906 : ! An upper boundary for the potential definition was defined
1907 93 : IF ((pot%set(kk)%rmax /= not_initialized) .AND. (dr >= pot%set(kk)%rmax)) CYCLE
1908 : ! If within limits let's compute the potential...
1909 93 : IF (dr <= rcut .AND. dr > 1.E-3_dp) THEN
1910 :
1911 9 : NULLIFY (nonbonded_section)
1912 9 : nonbonded_section => section_vals_get_subs_vals(qs_env%input, "DFT%QS%xTB%NONBONDED")
1913 9 : CALL section_vals_val_get(nonbonded_section, "DX", r_val=dx)
1914 9 : CALL section_vals_val_get(nonbonded_section, "ERROR_LIMIT", r_val=lerr)
1915 :
1916 9 : dedf = fval*evalfd(pot%set(kk)%gp%myid, 1, pot%set(kk)%gp%values, dx, err)
1917 9 : IF (ABS(err) > lerr) THEN
1918 1 : WRITE (this_error, "(A,G12.6,A)") "(", err, ")"
1919 1 : WRITE (def_error, "(A,G12.6,A)") "(", lerr, ")"
1920 1 : CALL compress(this_error, .TRUE.)
1921 1 : CALL compress(def_error, .TRUE.)
1922 : CALL cp_warn(__LOCATION__, &
1923 : 'ASSERTION (cond) failed at line '//cp_to_string(__LINE__)// &
1924 : ' Error '//TRIM(this_error)//' in computing numerical derivatives larger then'// &
1925 1 : TRIM(def_error)//' .')
1926 : END IF
1927 :
1928 9 : atom_i = atom_of_kind(iatom)
1929 9 : atom_j = atom_of_kind(jatom)
1930 :
1931 36 : fij(1:3) = dedf*rij(1:3)/pot%set(kk)%gp%values(1)
1932 :
1933 36 : force(ikind)%repulsive(:, atom_i) = force(ikind)%repulsive(:, atom_i) - fij(:)
1934 36 : force(jkind)%repulsive(:, atom_j) = force(jkind)%repulsive(:, atom_j) + fij(:)
1935 :
1936 9 : IF (use_virial) THEN
1937 8 : CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
1938 8 : IF (atprop%stress) THEN
1939 8 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fij, rij)
1940 8 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fij, rij)
1941 : END IF
1942 : END IF
1943 :
1944 : END IF
1945 : END IF
1946 193 : NULLIFY (pot)
1947 : END DO
1948 34 : CALL neighbor_list_iterator_release(nl_iterator)
1949 34 : CALL finalizef()
1950 :
1951 34 : IF (ASSOCIATED(potparm)) THEN
1952 34 : CALL pair_potential_pp_release(potparm)
1953 : END IF
1954 :
1955 34 : CALL timestop(handle)
1956 :
1957 34 : END SUBROUTINE nonbonded_correction
1958 : ! **************************************************************************************************
1959 : !> \brief ...
1960 : !> \param atomic_kind_set ...
1961 : !> \param nonbonded ...
1962 : !> \param potparm ...
1963 : !> \param ewald_env ...
1964 : !> \param do_ewald ...
1965 : ! **************************************************************************************************
1966 34 : SUBROUTINE force_field_pack_nonbond_pot_correction(atomic_kind_set, nonbonded, potparm, ewald_env, do_ewald)
1967 :
1968 : ! routine based on force_field_pack_nonbond
1969 : TYPE(atomic_kind_type), DIMENSION(:), INTENT(IN), &
1970 : POINTER :: atomic_kind_set
1971 : TYPE(pair_potential_p_type), INTENT(IN), POINTER :: nonbonded
1972 : TYPE(pair_potential_pp_type), INTENT(INOUT), &
1973 : POINTER :: potparm
1974 : TYPE(ewald_environment_type), INTENT(IN), POINTER :: ewald_env
1975 : LOGICAL, INTENT(IN) :: do_ewald
1976 :
1977 : CHARACTER(LEN=default_string_length) :: name_atm_a, name_atm_a_local, &
1978 : name_atm_b, name_atm_b_local
1979 : INTEGER :: ikind, ingp, iw, jkind
1980 : LOGICAL :: found
1981 : REAL(KIND=dp) :: ewald_rcut
1982 : TYPE(atomic_kind_type), POINTER :: atomic_kind
1983 : TYPE(cp_logger_type), POINTER :: logger
1984 : TYPE(pair_potential_single_type), POINTER :: pot
1985 :
1986 34 : NULLIFY (pot, logger)
1987 :
1988 34 : logger => cp_get_default_logger()
1989 34 : iw = cp_logger_get_default_io_unit(logger)
1990 :
1991 170 : DO ikind = 1, SIZE(atomic_kind_set)
1992 136 : atomic_kind => atomic_kind_set(ikind)
1993 136 : CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_a_local)
1994 510 : DO jkind = ikind, SIZE(atomic_kind_set)
1995 340 : atomic_kind => atomic_kind_set(jkind)
1996 340 : CALL get_atomic_kind(atomic_kind=atomic_kind, name=name_atm_b_local)
1997 340 : found = .FALSE.
1998 340 : name_atm_a = name_atm_a_local
1999 340 : name_atm_b = name_atm_b_local
2000 340 : CALL uppercase(name_atm_a)
2001 340 : CALL uppercase(name_atm_b)
2002 340 : pot => potparm%pot(ikind, jkind)%pot
2003 340 : IF (ASSOCIATED(nonbonded)) THEN
2004 680 : DO ingp = 1, SIZE(nonbonded%pot)
2005 340 : IF ((TRIM(nonbonded%pot(ingp)%pot%at1) == "*") .OR. &
2006 : (TRIM(nonbonded%pot(ingp)%pot%at2) == "*")) CYCLE
2007 :
2008 : !IF (iw > 0) WRITE (iw, *) "TESTING ", TRIM(name_atm_a), TRIM(name_atm_b), &
2009 : ! " with ", TRIM(nonbonded%pot(ingp)%pot%at1), &
2010 : ! TRIM(nonbonded%pot(ingp)%pot%at2)
2011 : IF ((((name_atm_a) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
2012 340 : ((name_atm_b) == (nonbonded%pot(ingp)%pot%at2))) .OR. &
2013 : (((name_atm_b) == (nonbonded%pot(ingp)%pot%at1)) .AND. &
2014 340 : ((name_atm_a) == (nonbonded%pot(ingp)%pot%at2)))) THEN
2015 34 : CALL pair_potential_single_copy(nonbonded%pot(ingp)%pot, pot)
2016 : ! multiple potential not implemented, simply overwriting
2017 34 : IF (found) &
2018 : CALL cp_warn(__LOCATION__, &
2019 : "Multiple NONBONDED declaration: "//TRIM(name_atm_a)// &
2020 0 : " and "//TRIM(name_atm_b)//" OVERWRITING! ")
2021 : !IF (iw > 0) WRITE (iw, *) " FOUND ", TRIM(name_atm_a), " ", TRIM(name_atm_b)
2022 : found = .TRUE.
2023 : END IF
2024 : END DO
2025 : END IF
2026 476 : IF (.NOT. found) THEN
2027 306 : CALL pair_potential_single_clean(pot)
2028 : !IF (iw > 0) WRITE (iw, *) " NOTFOUND ", TRIM(name_atm_a), " ", TRIM(name_atm_b)
2029 : END IF
2030 : END DO !jkind
2031 : END DO !ikind
2032 :
2033 : ! Cutoff is defined always as the maximum between the FF and Ewald
2034 34 : IF (do_ewald) THEN
2035 16 : CALL ewald_env_get(ewald_env, rcut=ewald_rcut)
2036 16 : pot%rcutsq = MAX(pot%rcutsq, ewald_rcut*ewald_rcut)
2037 : !IF (iw > 0) WRITE (iw, *) " RCUT ", SQRT(pot%rcutsq), ewald_rcut
2038 : END IF
2039 :
2040 34 : END SUBROUTINE force_field_pack_nonbond_pot_correction
2041 : ! **************************************************************************************************
2042 : !> \brief Computes the interaction term between Br/I/At and donor atoms
2043 : !>
2044 : !> \param exb ...
2045 : !> \param neighbor_atoms ...
2046 : !> \param atom_of_kind ...
2047 : !> \param kind_of ...
2048 : !> \param sab_xb ...
2049 : !> \param kx ...
2050 : !> \param kx2 ...
2051 : !> \param rcab ...
2052 : !> \param calculate_forces ...
2053 : !> \param use_virial ...
2054 : !> \param force ...
2055 : !> \param virial ...
2056 : !> \param atprop ...
2057 : !> \par History
2058 : !> 12.2018 JGH
2059 : !> \version 1.1
2060 : ! **************************************************************************************************
2061 3184 : SUBROUTINE xb_interaction(exb, neighbor_atoms, atom_of_kind, kind_of, sab_xb, kx, kx2, rcab, &
2062 : calculate_forces, use_virial, force, virial, atprop)
2063 : REAL(dp), INTENT(INOUT) :: exb
2064 : TYPE(neighbor_atoms_type), DIMENSION(:), &
2065 : INTENT(IN) :: neighbor_atoms
2066 : INTEGER, DIMENSION(:), INTENT(IN) :: atom_of_kind, kind_of
2067 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
2068 : POINTER :: sab_xb
2069 : REAL(dp), DIMENSION(:), INTENT(IN) :: kx
2070 : REAL(dp), INTENT(IN) :: kx2
2071 : REAL(dp), DIMENSION(:, :), INTENT(IN) :: rcab
2072 : LOGICAL, INTENT(IN) :: calculate_forces, use_virial
2073 : TYPE(qs_force_type), DIMENSION(:), POINTER :: force
2074 : TYPE(virial_type), POINTER :: virial
2075 : TYPE(atprop_type), POINTER :: atprop
2076 :
2077 : INTEGER :: atom_a, atom_b, atom_c, iatom, ikind, &
2078 : jatom, jkind, katom, kkind
2079 : INTEGER, DIMENSION(3) :: cell
2080 : REAL(KIND=dp) :: alp, aterm, cosa, daterm, ddab, ddax, &
2081 : ddbx, ddr, ddr12, ddr6, deval, dr, &
2082 : drab, drax, drbx, eval, xy
2083 : REAL(KIND=dp), DIMENSION(3) :: fia, fij, fja, ria, rij, rja
2084 : TYPE(neighbor_list_iterator_p_type), &
2085 3184 : DIMENSION(:), POINTER :: nl_iterator
2086 :
2087 : ! exonent in angular term
2088 3184 : alp = 6.0_dp
2089 : ! loop over all atom pairs
2090 3184 : CALL neighbor_list_iterator_create(nl_iterator, sab_xb)
2091 3196 : DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
2092 : CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
2093 12 : iatom=iatom, jatom=jatom, r=rij, cell=cell)
2094 : ! ikind, iatom : Halogen
2095 : ! jkind, jatom : Donor
2096 12 : atom_a = atom_of_kind(iatom)
2097 12 : katom = neighbor_atoms(ikind)%katom(atom_a)
2098 12 : IF (katom == 0) CYCLE
2099 12 : dr = SQRT(rij(1)**2 + rij(2)**2 + rij(3)**2)
2100 12 : ddr = rcab(ikind, jkind)/dr
2101 12 : ddr6 = ddr**6
2102 12 : ddr12 = ddr6*ddr6
2103 12 : eval = kx(ikind)*(ddr12 - kx2*ddr6)/(1.0_dp + ddr12)
2104 : ! angle
2105 48 : ria(1:3) = neighbor_atoms(ikind)%coord(1:3, atom_a)
2106 48 : rja(1:3) = rij(1:3) - ria(1:3)
2107 12 : drax = ria(1)**2 + ria(2)**2 + ria(3)**2
2108 12 : drbx = dr*dr
2109 12 : drab = rja(1)**2 + rja(2)**2 + rja(3)**2
2110 12 : xy = SQRT(drbx*drax)
2111 : ! cos angle B-X-A
2112 12 : cosa = (drbx + drax - drab)/xy
2113 12 : aterm = (0.5_dp - 0.25_dp*cosa)**alp
2114 : !
2115 12 : exb = exb + aterm*eval
2116 12 : IF (atprop%energy) THEN
2117 0 : atprop%atecc(iatom) = atprop%atecc(iatom) + 0.5_dp*aterm*eval
2118 0 : atprop%atecc(jatom) = atprop%atecc(jatom) + 0.5_dp*aterm*eval
2119 : END IF
2120 : !
2121 3196 : IF (calculate_forces) THEN
2122 6 : kkind = kind_of(katom)
2123 6 : atom_b = atom_of_kind(jatom)
2124 6 : atom_c = atom_of_kind(katom)
2125 : !
2126 6 : deval = 6.0_dp*kx(ikind)*ddr6*(kx2*ddr12 + 2.0_dp*ddr6 - kx2)/(1.0_dp + ddr12)**2
2127 6 : deval = -rcab(ikind, jkind)*deval/(dr*dr)/ddr
2128 24 : fij(1:3) = aterm*deval*rij(1:3)/dr
2129 24 : force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:)
2130 24 : force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:)
2131 6 : IF (use_virial) THEN
2132 0 : CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
2133 0 : IF (atprop%stress) THEN
2134 0 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fij, rij)
2135 0 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fij, rij)
2136 : END IF
2137 : END IF
2138 : !
2139 6 : fij(1:3) = 0.0_dp
2140 6 : fia(1:3) = 0.0_dp
2141 6 : fja(1:3) = 0.0_dp
2142 6 : daterm = -0.25_dp*alp*(0.5_dp - 0.25_dp*cosa)**(alp - 1.0_dp)
2143 6 : ddbx = 0.5_dp*(drab - drax + drbx)/xy/drbx
2144 6 : ddax = 0.5_dp*(drab + drax - drbx)/xy/drax
2145 6 : ddab = -1._dp/xy
2146 24 : fij(1:3) = 2.0_dp*daterm*ddbx*rij(1:3)*eval
2147 24 : fia(1:3) = 2.0_dp*daterm*ddax*ria(1:3)*eval
2148 24 : fja(1:3) = 2.0_dp*daterm*ddab*rja(1:3)*eval
2149 24 : force(ikind)%repulsive(:, atom_a) = force(ikind)%repulsive(:, atom_a) - fij(:) - fia(:)
2150 24 : force(jkind)%repulsive(:, atom_b) = force(jkind)%repulsive(:, atom_b) + fij(:) + fja(:)
2151 24 : force(kkind)%repulsive(:, atom_c) = force(kkind)%repulsive(:, atom_c) + fia(:) - fja(:)
2152 6 : IF (use_virial) THEN
2153 0 : CALL virial_pair_force(virial%pv_virial, -1._dp, fij, rij)
2154 0 : CALL virial_pair_force(virial%pv_virial, -1._dp, fia, ria)
2155 0 : CALL virial_pair_force(virial%pv_virial, -1._dp, fja, rja)
2156 0 : IF (atprop%stress) THEN
2157 0 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fij, rij)
2158 0 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fij, rij)
2159 0 : CALL virial_pair_force(atprop%atstress(:, :, iatom), -0.5_dp, fia, ria)
2160 0 : CALL virial_pair_force(atprop%atstress(:, :, katom), -0.5_dp, fia, ria)
2161 0 : CALL virial_pair_force(atprop%atstress(:, :, jatom), -0.5_dp, fja, rja)
2162 0 : CALL virial_pair_force(atprop%atstress(:, :, katom), -0.5_dp, fja, rja)
2163 : END IF
2164 : END IF
2165 : END IF
2166 : END DO
2167 3184 : CALL neighbor_list_iterator_release(nl_iterator)
2168 :
2169 3184 : END SUBROUTINE xb_interaction
2170 :
2171 : ! **************************************************************************************************
2172 : !> \brief ...
2173 : !> \param z ...
2174 : !> \return ...
2175 : ! **************************************************************************************************
2176 7866 : FUNCTION metal(z) RESULT(ismetal)
2177 : INTEGER :: z
2178 : LOGICAL :: ismetal
2179 :
2180 7866 : SELECT CASE (z)
2181 : CASE DEFAULT
2182 7816 : ismetal = .TRUE.
2183 : CASE (1:2, 6:10, 14:18, 32:36, 50:54, 82:86)
2184 7866 : ismetal = .FALSE.
2185 : END SELECT
2186 :
2187 7866 : END FUNCTION metal
2188 :
2189 : ! **************************************************************************************************
2190 : !> \brief ...
2191 : !> \param z ...
2192 : !> \return ...
2193 : ! **************************************************************************************************
2194 7816 : FUNCTION early3d(z) RESULT(isearly3d)
2195 : INTEGER :: z
2196 : LOGICAL :: isearly3d
2197 :
2198 7816 : isearly3d = .FALSE.
2199 7816 : IF (z >= 21 .AND. z <= 24) isearly3d = .TRUE.
2200 :
2201 7816 : END FUNCTION early3d
2202 :
2203 0 : END MODULE xtb_matrices
2204 :
|