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 Coulomb Hessian contributions in xTB
10 : !> \author JGH
11 : ! **************************************************************************************************
12 : MODULE xtb_ehess
13 : USE atomic_kind_types, ONLY: atomic_kind_type,&
14 : get_atomic_kind_set
15 : USE cell_types, ONLY: cell_type,&
16 : get_cell,&
17 : pbc
18 : USE cp_control_types, ONLY: dft_control_type,&
19 : xtb_control_type
20 : USE cp_dbcsr_api, ONLY: dbcsr_get_block_p,&
21 : dbcsr_iterator_blocks_left,&
22 : dbcsr_iterator_next_block,&
23 : dbcsr_iterator_start,&
24 : dbcsr_iterator_stop,&
25 : dbcsr_iterator_type,&
26 : dbcsr_p_type
27 : USE distribution_1d_types, ONLY: distribution_1d_type
28 : USE ewald_environment_types, ONLY: ewald_env_get,&
29 : ewald_environment_type
30 : USE ewald_methods_tb, ONLY: tb_ewald_overlap,&
31 : tb_spme_evaluate
32 : USE ewald_pw_types, ONLY: ewald_pw_type
33 : USE kinds, ONLY: dp
34 : USE mathconstants, ONLY: oorootpi,&
35 : pi
36 : USE message_passing, ONLY: mp_para_env_type
37 : USE particle_types, ONLY: particle_type
38 : USE pw_poisson_types, ONLY: do_ewald_ewald,&
39 : do_ewald_none,&
40 : do_ewald_pme,&
41 : do_ewald_spme
42 : USE qs_environment_types, ONLY: get_qs_env,&
43 : qs_environment_type
44 : USE qs_kind_types, ONLY: get_qs_kind,&
45 : qs_kind_type
46 : USE qs_neighbor_list_types, ONLY: get_iterator_info,&
47 : neighbor_list_iterate,&
48 : neighbor_list_iterator_create,&
49 : neighbor_list_iterator_p_type,&
50 : neighbor_list_iterator_release,&
51 : neighbor_list_set_p_type
52 : USE virial_types, ONLY: virial_type
53 : USE xtb_coulomb, ONLY: gamma_rab_sr
54 : USE xtb_types, ONLY: get_xtb_atom_param,&
55 : xtb_atom_type
56 : #include "./base/base_uses.f90"
57 :
58 : IMPLICIT NONE
59 :
60 : PRIVATE
61 :
62 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_ehess'
63 :
64 : PUBLIC :: xtb_coulomb_hessian
65 :
66 : CONTAINS
67 :
68 : ! **************************************************************************************************
69 : !> \brief ...
70 : !> \param qs_env ...
71 : !> \param ks_matrix ...
72 : !> \param charges1 ...
73 : !> \param mcharge1 ...
74 : !> \param mcharge ...
75 : ! **************************************************************************************************
76 134 : SUBROUTINE xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge)
77 :
78 : TYPE(qs_environment_type), POINTER :: qs_env
79 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
80 : REAL(dp), DIMENSION(:, :) :: charges1
81 : REAL(dp), DIMENSION(:) :: mcharge1, mcharge
82 :
83 : CHARACTER(len=*), PARAMETER :: routineN = 'xtb_coulomb_hessian'
84 :
85 : INTEGER :: blk, ewald_type, handle, i, ia, iatom, icol, ikind, irow, is, j, jatom, jkind, &
86 : la, lb, lmaxa, lmaxb, natom, natorb_a, natorb_b, ni, nj, nkind, nmat, za, zb
87 134 : INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
88 : INTEGER, DIMENSION(25) :: laoa, laob
89 : INTEGER, DIMENSION(3) :: cellind, periodic
90 : LOGICAL :: defined, do_ewald, found
91 : REAL(KIND=dp) :: alpha, deth, dr, etaa, etab, gmij, kg, &
92 : rcut, rcuta, rcutb
93 134 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: xgamma
94 134 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: gammab, gcij, gmcharge
95 134 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: gchrg
96 : REAL(KIND=dp), DIMENSION(3) :: rij
97 : REAL(KIND=dp), DIMENSION(5) :: kappaa, kappab
98 134 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: ksblock, sblock
99 134 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
100 : TYPE(cell_type), POINTER :: cell
101 : TYPE(dbcsr_iterator_type) :: iter
102 134 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
103 : TYPE(dft_control_type), POINTER :: dft_control
104 : TYPE(distribution_1d_type), POINTER :: local_particles
105 : TYPE(ewald_environment_type), POINTER :: ewald_env
106 : TYPE(ewald_pw_type), POINTER :: ewald_pw
107 : TYPE(mp_para_env_type), POINTER :: para_env
108 : TYPE(neighbor_list_iterator_p_type), &
109 134 : DIMENSION(:), POINTER :: nl_iterator
110 : TYPE(neighbor_list_set_p_type), DIMENSION(:), &
111 134 : POINTER :: n_list
112 134 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
113 134 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
114 : TYPE(virial_type), POINTER :: virial
115 : TYPE(xtb_atom_type), POINTER :: xtb_atom_a, xtb_atom_b, xtb_kind
116 : TYPE(xtb_control_type), POINTER :: xtb_control
117 :
118 134 : CALL timeset(routineN, handle)
119 :
120 : CALL get_qs_env(qs_env, &
121 : matrix_s_kp=matrix_s, &
122 : qs_kind_set=qs_kind_set, &
123 : particle_set=particle_set, &
124 : cell=cell, &
125 134 : dft_control=dft_control)
126 :
127 134 : xtb_control => dft_control%qs_control%xtb_control
128 :
129 134 : IF (dft_control%nimages /= 1) THEN
130 0 : CPABORT("No kpoints allowed in xTB response calculation")
131 : END IF
132 :
133 134 : CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
134 134 : nmat = 1
135 402 : ALLOCATE (gchrg(natom, 5, nmat))
136 10708 : gchrg = 0._dp
137 402 : ALLOCATE (gmcharge(natom, nmat))
138 2222 : gmcharge = 0._dp
139 :
140 : ! short range contribution (gamma)
141 : ! loop over all atom pairs (sab_xtbe)
142 134 : kg = xtb_control%kg
143 134 : NULLIFY (n_list)
144 134 : IF (xtb_control%old_coulomb_damping) THEN
145 0 : CALL get_qs_env(qs_env=qs_env, sab_orb=n_list)
146 : ELSE
147 134 : CALL get_qs_env(qs_env=qs_env, sab_xtbe=n_list)
148 : END IF
149 134 : CALL neighbor_list_iterator_create(nl_iterator, n_list)
150 197967 : DO WHILE (neighbor_list_iterate(nl_iterator) == 0)
151 : CALL get_iterator_info(nl_iterator, ikind=ikind, jkind=jkind, &
152 197833 : iatom=iatom, jatom=jatom, r=rij, cell=cellind)
153 197833 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
154 197833 : CALL get_xtb_atom_param(xtb_atom_a, defined=defined, natorb=natorb_a)
155 197833 : IF (.NOT. defined .OR. natorb_a < 1) CYCLE
156 197833 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
157 197833 : CALL get_xtb_atom_param(xtb_atom_b, defined=defined, natorb=natorb_b)
158 197833 : IF (.NOT. defined .OR. natorb_b < 1) CYCLE
159 : ! atomic parameters
160 197833 : CALL get_xtb_atom_param(xtb_atom_a, eta=etaa, lmax=lmaxa, kappa=kappaa, rcut=rcuta)
161 197833 : CALL get_xtb_atom_param(xtb_atom_b, eta=etab, lmax=lmaxb, kappa=kappab, rcut=rcutb)
162 : ! gamma matrix
163 197833 : ni = lmaxa + 1
164 197833 : nj = lmaxb + 1
165 791332 : ALLOCATE (gammab(ni, nj))
166 197833 : rcut = rcuta + rcutb
167 791332 : dr = SQRT(SUM(rij(:)**2))
168 197833 : CALL gamma_rab_sr(gammab, dr, ni, kappaa, etaa, nj, kappab, etab, kg, rcut)
169 2010292 : gchrg(iatom, 1:ni, 1) = gchrg(iatom, 1:ni, 1) + MATMUL(gammab, charges1(jatom, 1:nj))
170 197833 : IF (iatom /= jatom) THEN
171 2288907 : gchrg(jatom, 1:nj, 1) = gchrg(jatom, 1:nj, 1) + MATMUL(charges1(iatom, 1:ni), gammab)
172 : END IF
173 791332 : DEALLOCATE (gammab)
174 : END DO
175 134 : CALL neighbor_list_iterator_release(nl_iterator)
176 :
177 : ! 1/R contribution
178 :
179 134 : IF (xtb_control%coulomb_lr) THEN
180 134 : do_ewald = xtb_control%do_ewald
181 134 : IF (do_ewald) THEN
182 : ! Ewald sum
183 54 : NULLIFY (ewald_env, ewald_pw)
184 54 : NULLIFY (virial)
185 : CALL get_qs_env(qs_env=qs_env, &
186 54 : ewald_env=ewald_env, ewald_pw=ewald_pw)
187 54 : CALL get_cell(cell=cell, periodic=periodic, deth=deth)
188 54 : CALL ewald_env_get(ewald_env, alpha=alpha, ewald_type=ewald_type)
189 54 : CALL get_qs_env(qs_env=qs_env, sab_tbe=n_list)
190 54 : CALL tb_ewald_overlap(gmcharge, mcharge1, alpha, n_list, virial, .FALSE.)
191 0 : SELECT CASE (ewald_type)
192 : CASE DEFAULT
193 0 : CPABORT("Invalid Ewald type")
194 : CASE (do_ewald_none)
195 0 : CPABORT("Not allowed with DFTB")
196 : CASE (do_ewald_ewald)
197 0 : CPABORT("Standard Ewald not implemented in DFTB")
198 : CASE (do_ewald_pme)
199 0 : CPABORT("PME not implemented in DFTB")
200 : CASE (do_ewald_spme)
201 : CALL tb_spme_evaluate(ewald_env, ewald_pw, particle_set, cell, &
202 54 : gmcharge, mcharge1, .FALSE., virial, .FALSE.)
203 : END SELECT
204 : ELSE
205 : ! direct sum
206 : CALL get_qs_env(qs_env=qs_env, &
207 80 : local_particles=local_particles)
208 280 : DO ikind = 1, SIZE(local_particles%n_el)
209 420 : DO ia = 1, local_particles%n_el(ikind)
210 140 : iatom = local_particles%list(ikind)%array(ia)
211 520 : DO jatom = 1, iatom - 1
212 720 : rij = particle_set(iatom)%r - particle_set(jatom)%r
213 720 : rij = pbc(rij, cell)
214 720 : dr = SQRT(SUM(rij(:)**2))
215 320 : IF (dr > 1.e-6_dp) THEN
216 180 : gmcharge(iatom, 1) = gmcharge(iatom, 1) + mcharge1(jatom)/dr
217 180 : gmcharge(jatom, 1) = gmcharge(jatom, 1) + mcharge1(iatom)/dr
218 : END IF
219 : END DO
220 : END DO
221 : END DO
222 : END IF
223 : END IF
224 :
225 : ! global sum of gamma*p arrays
226 134 : CALL get_qs_env(qs_env=qs_env, para_env=para_env)
227 134 : CALL para_env%sum(gmcharge(:, 1))
228 134 : CALL para_env%sum(gchrg(:, :, 1))
229 :
230 134 : IF (xtb_control%coulomb_lr) THEN
231 134 : IF (do_ewald) THEN
232 : ! add self charge interaction and background charge contribution
233 1728 : gmcharge(:, 1) = gmcharge(:, 1) - 2._dp*alpha*oorootpi*mcharge1(:)
234 102 : IF (ANY(periodic(:) == 1)) THEN
235 1648 : gmcharge(:, 1) = gmcharge(:, 1) - pi/alpha**2/deth
236 : END IF
237 : END IF
238 : END IF
239 :
240 134 : CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set)
241 134 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
242 :
243 : ! no k-points; all matrices have been transformed to periodic bsf
244 134 : CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
245 37680 : DO WHILE (dbcsr_iterator_blocks_left(iter))
246 37546 : CALL dbcsr_iterator_next_block(iter, irow, icol, sblock, blk)
247 37546 : ikind = kind_of(irow)
248 37546 : jkind = kind_of(icol)
249 :
250 : ! atomic parameters
251 37546 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_atom_a)
252 37546 : CALL get_qs_kind(qs_kind_set(jkind), xtb_parameter=xtb_atom_b)
253 37546 : CALL get_xtb_atom_param(xtb_atom_a, z=za, lao=laoa)
254 37546 : CALL get_xtb_atom_param(xtb_atom_b, z=zb, lao=laob)
255 :
256 37546 : ni = SIZE(sblock, 1)
257 37546 : nj = SIZE(sblock, 2)
258 150184 : ALLOCATE (gcij(ni, nj))
259 154096 : DO i = 1, ni
260 420500 : DO j = 1, nj
261 266404 : la = laoa(i) + 1
262 266404 : lb = laob(j) + 1
263 382954 : gcij(i, j) = gchrg(irow, la, 1) + gchrg(icol, lb, 1)
264 : END DO
265 : END DO
266 37546 : gmij = gmcharge(irow, 1) + gmcharge(icol, 1)
267 75092 : DO is = 1, SIZE(ks_matrix)
268 37546 : NULLIFY (ksblock)
269 : CALL dbcsr_get_block_p(matrix=ks_matrix(is)%matrix, &
270 37546 : row=irow, col=icol, block=ksblock, found=found)
271 37546 : CPASSERT(found)
272 737190 : ksblock = ksblock - gcij*sblock
273 812282 : ksblock = ksblock - gmij*sblock
274 : END DO
275 112772 : DEALLOCATE (gcij)
276 : END DO
277 134 : CALL dbcsr_iterator_stop(iter)
278 :
279 134 : IF (xtb_control%tb3_interaction) THEN
280 134 : CALL get_qs_env(qs_env, nkind=nkind)
281 402 : ALLOCATE (xgamma(nkind))
282 466 : DO ikind = 1, nkind
283 332 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
284 466 : CALL get_xtb_atom_param(xtb_kind, xgamma=xgamma(ikind))
285 : END DO
286 : ! Diagonal 3rd order correction (DFTB3)
287 134 : CALL dftb3_diagonal_hessian(qs_env, ks_matrix, mcharge, mcharge1, xgamma)
288 134 : DEALLOCATE (xgamma)
289 : END IF
290 :
291 134 : IF (qs_env%qmmm .AND. qs_env%qmmm_periodic) THEN
292 0 : CPABORT("QMMM not available in xTB response calculations")
293 : END IF
294 :
295 134 : DEALLOCATE (gmcharge, gchrg)
296 :
297 134 : CALL timestop(handle)
298 :
299 402 : END SUBROUTINE xtb_coulomb_hessian
300 :
301 : ! **************************************************************************************************
302 : !> \brief ...
303 : !> \param qs_env ...
304 : !> \param ks_matrix ...
305 : !> \param mcharge ...
306 : !> \param mcharge1 ...
307 : !> \param xgamma ...
308 : ! **************************************************************************************************
309 134 : SUBROUTINE dftb3_diagonal_hessian(qs_env, ks_matrix, mcharge, mcharge1, xgamma)
310 :
311 : TYPE(qs_environment_type), POINTER :: qs_env
312 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix
313 : REAL(dp), DIMENSION(:) :: mcharge, mcharge1, xgamma
314 :
315 : CHARACTER(len=*), PARAMETER :: routineN = 'dftb3_diagonal_hessian'
316 :
317 : INTEGER :: blk, handle, icol, ikind, irow, is, jkind
318 134 : INTEGER, ALLOCATABLE, DIMENSION(:) :: kind_of
319 : LOGICAL :: found
320 : REAL(KIND=dp) :: gmij, ui, uj
321 134 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: ksblock, sblock
322 134 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
323 : TYPE(dbcsr_iterator_type) :: iter
324 134 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s
325 134 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
326 :
327 134 : CALL timeset(routineN, handle)
328 :
329 134 : CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
330 134 : CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
331 134 : CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, kind_of=kind_of)
332 : ! no k-points; all matrices have been transformed to periodic bsf
333 134 : CALL dbcsr_iterator_start(iter, matrix_s(1, 1)%matrix)
334 37680 : DO WHILE (dbcsr_iterator_blocks_left(iter))
335 37546 : CALL dbcsr_iterator_next_block(iter, irow, icol, sblock, blk)
336 37546 : ikind = kind_of(irow)
337 37546 : ui = xgamma(ikind)
338 37546 : jkind = kind_of(icol)
339 37546 : uj = xgamma(jkind)
340 37546 : gmij = ui*mcharge(irow)*mcharge1(irow) + uj*mcharge(icol)*mcharge1(icol)
341 75226 : DO is = 1, SIZE(ks_matrix)
342 37546 : NULLIFY (ksblock)
343 : CALL dbcsr_get_block_p(matrix=ks_matrix(is)%matrix, &
344 37546 : row=irow, col=icol, block=ksblock, found=found)
345 37546 : CPASSERT(found)
346 812282 : ksblock = ksblock + gmij*sblock
347 : END DO
348 : END DO
349 134 : CALL dbcsr_iterator_stop(iter)
350 :
351 134 : CALL timestop(handle)
352 :
353 268 : END SUBROUTINE dftb3_diagonal_hessian
354 :
355 391031 : END MODULE xtb_ehess
356 :
|