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 KS matrix 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_ks_matrix
16 : USE atomic_kind_types, ONLY: atomic_kind_type,&
17 : get_atomic_kind
18 : USE cp_control_types, ONLY: dft_control_type
19 : USE cp_dbcsr_api, ONLY: dbcsr_add,&
20 : dbcsr_copy,&
21 : dbcsr_dot,&
22 : dbcsr_multiply,&
23 : dbcsr_p_type,&
24 : dbcsr_type
25 : USE cp_log_handling, ONLY: cp_get_default_logger,&
26 : cp_logger_get_default_io_unit,&
27 : cp_logger_type
28 : USE cp_output_handling, ONLY: cp_print_key_finished_output,&
29 : cp_print_key_unit_nr
30 : USE efield_tb_methods, ONLY: efield_tb_matrix
31 : USE input_section_types, ONLY: section_vals_get_subs_vals,&
32 : section_vals_type
33 : USE kinds, ONLY: dp
34 : USE message_passing, ONLY: mp_para_env_type
35 : USE mulliken, ONLY: ao_charges
36 : USE particle_types, ONLY: particle_type
37 : USE qs_charge_mixing, ONLY: charge_mixing
38 : USE qs_energy_types, ONLY: qs_energy_type
39 : USE qs_environment_types, ONLY: get_qs_env,&
40 : qs_environment_type
41 : USE qs_kind_types, ONLY: get_qs_kind,&
42 : get_qs_kind_set,&
43 : qs_kind_type
44 : USE qs_ks_types, ONLY: qs_ks_env_type
45 : USE qs_mo_types, ONLY: get_mo_set,&
46 : mo_set_type
47 : USE qs_rho_types, ONLY: qs_rho_get,&
48 : qs_rho_type
49 : USE qs_scf_types, ONLY: qs_scf_env_type
50 : USE xtb_coulomb, ONLY: build_xtb_coulomb
51 : USE xtb_types, ONLY: get_xtb_atom_param,&
52 : xtb_atom_type
53 : #include "./base/base_uses.f90"
54 :
55 : IMPLICIT NONE
56 :
57 : PRIVATE
58 :
59 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'xtb_ks_matrix'
60 :
61 : PUBLIC :: build_xtb_ks_matrix
62 :
63 : CONTAINS
64 :
65 : ! **************************************************************************************************
66 : !> \brief ...
67 : !> \param qs_env ...
68 : !> \param calculate_forces ...
69 : !> \param just_energy ...
70 : !> \param ext_ks_matrix ...
71 : ! **************************************************************************************************
72 24612 : SUBROUTINE build_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
73 : TYPE(qs_environment_type), POINTER :: qs_env
74 : LOGICAL, INTENT(in) :: calculate_forces, just_energy
75 : TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
76 : POINTER :: ext_ks_matrix
77 :
78 : INTEGER :: gfn_type
79 : TYPE(dft_control_type), POINTER :: dft_control
80 :
81 24612 : CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
82 24612 : gfn_type = dft_control%qs_control%xtb_control%gfn_type
83 :
84 1558 : SELECT CASE (gfn_type)
85 : CASE (0)
86 1558 : CPASSERT(.NOT. PRESENT(ext_ks_matrix))
87 1558 : CALL build_gfn0_xtb_ks_matrix(qs_env, calculate_forces, just_energy)
88 : CASE (1)
89 23054 : CALL build_gfn1_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
90 : CASE (2)
91 0 : CPABORT("gfn_type = 2 not yet available")
92 : CASE DEFAULT
93 24612 : CPABORT("Unknown gfn_type")
94 : END SELECT
95 :
96 24612 : END SUBROUTINE build_xtb_ks_matrix
97 :
98 : ! **************************************************************************************************
99 : !> \brief ...
100 : !> \param qs_env ...
101 : !> \param calculate_forces ...
102 : !> \param just_energy ...
103 : ! **************************************************************************************************
104 1558 : SUBROUTINE build_gfn0_xtb_ks_matrix(qs_env, calculate_forces, just_energy)
105 : TYPE(qs_environment_type), POINTER :: qs_env
106 : LOGICAL, INTENT(in) :: calculate_forces, just_energy
107 :
108 : CHARACTER(len=*), PARAMETER :: routineN = 'build_gfn0_xtb_ks_matrix'
109 :
110 : INTEGER :: handle, img, iounit, ispin, natom, nimg, &
111 : nspins
112 : REAL(KIND=dp) :: pc_ener, qmmm_el
113 1558 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
114 : TYPE(cp_logger_type), POINTER :: logger
115 1558 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p1, mo_derivs
116 1558 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, matrix_h
117 : TYPE(dbcsr_type), POINTER :: mo_coeff
118 : TYPE(dft_control_type), POINTER :: dft_control
119 : TYPE(mp_para_env_type), POINTER :: para_env
120 : TYPE(qs_energy_type), POINTER :: energy
121 1558 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
122 : TYPE(qs_ks_env_type), POINTER :: ks_env
123 : TYPE(qs_rho_type), POINTER :: rho
124 : TYPE(section_vals_type), POINTER :: scf_section
125 :
126 1558 : CALL timeset(routineN, handle)
127 :
128 : MARK_USED(calculate_forces)
129 :
130 1558 : NULLIFY (dft_control, logger, scf_section, ks_env, ks_matrix, rho, &
131 1558 : energy)
132 1558 : CPASSERT(ASSOCIATED(qs_env))
133 :
134 1558 : logger => cp_get_default_logger()
135 1558 : iounit = cp_logger_get_default_io_unit(logger)
136 :
137 : CALL get_qs_env(qs_env, &
138 : dft_control=dft_control, &
139 : atomic_kind_set=atomic_kind_set, &
140 : qs_kind_set=qs_kind_set, &
141 : matrix_h_kp=matrix_h, &
142 : para_env=para_env, &
143 : ks_env=ks_env, &
144 : matrix_ks_kp=ks_matrix, &
145 1558 : energy=energy)
146 :
147 1558 : energy%hartree = 0.0_dp
148 1558 : energy%qmmm_el = 0.0_dp
149 :
150 1558 : scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
151 1558 : nspins = dft_control%nspins
152 1558 : nimg = dft_control%nimages
153 1558 : CPASSERT(ASSOCIATED(matrix_h))
154 4674 : CPASSERT(SIZE(ks_matrix) > 0)
155 :
156 3316 : DO ispin = 1, nspins
157 58002 : DO img = 1, nimg
158 : ! copy the core matrix into the fock matrix
159 56444 : CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
160 : END DO
161 : END DO
162 :
163 1558 : IF (qs_env%qmmm) THEN
164 0 : CPABORT("gfn0 QMMM NYA")
165 0 : CALL get_qs_env(qs_env=qs_env, rho=rho, natom=natom)
166 0 : CPASSERT(SIZE(ks_matrix, 2) == 1)
167 0 : DO ispin = 1, nspins
168 : ! If QM/MM sumup the 1el Hamiltonian
169 : CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
170 0 : 1.0_dp, 1.0_dp)
171 0 : CALL qs_rho_get(rho, rho_ao=matrix_p1)
172 : ! Compute QM/MM Energy
173 : CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
174 0 : matrix_p1(ispin)%matrix, qmmm_el)
175 0 : energy%qmmm_el = energy%qmmm_el + qmmm_el
176 : END DO
177 0 : pc_ener = qs_env%ks_qmmm_env%pc_ener
178 0 : energy%qmmm_el = energy%qmmm_el + pc_ener
179 : END IF
180 :
181 : energy%total = energy%core + energy%eeq + energy%efield + energy%qmmm_el + &
182 1558 : energy%repulsive + energy%dispersion + energy%kTS
183 :
184 : iounit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DETAILED_ENERGY", &
185 1558 : extension=".scfLog")
186 1558 : IF (iounit > 0) THEN
187 : WRITE (UNIT=iounit, FMT="(/,(T9,A,T60,F20.10))") &
188 0 : "Repulsive pair potential energy: ", energy%repulsive, &
189 0 : "SRB Correction energy: ", energy%srb, &
190 0 : "Zeroth order Hamiltonian energy: ", energy%core, &
191 0 : "Charge equilibration energy: ", energy%eeq, &
192 0 : "London dispersion energy: ", energy%dispersion
193 0 : IF (dft_control%qs_control%xtb_control%do_nonbonded) &
194 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
195 0 : "Correction for nonbonded interactions: ", energy%xtb_nonbonded
196 0 : IF (ABS(energy%efield) > 1.e-12_dp) THEN
197 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
198 0 : "Electric field interaction energy: ", energy%efield
199 : END IF
200 0 : IF (qs_env%qmmm) THEN
201 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
202 0 : "QM/MM Electrostatic energy: ", energy%qmmm_el
203 : END IF
204 : END IF
205 : CALL cp_print_key_finished_output(iounit, logger, scf_section, &
206 1558 : "PRINT%DETAILED_ENERGY")
207 : ! here we compute dE/dC if needed. Assumes dE/dC is H_{ks}C
208 1558 : IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy) THEN
209 0 : CPASSERT(SIZE(ks_matrix, 2) == 1)
210 : BLOCK
211 0 : TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
212 0 : CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
213 0 : DO ispin = 1, SIZE(mo_derivs)
214 0 : CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
215 0 : IF (.NOT. mo_array(ispin)%use_mo_coeff_b) THEN
216 0 : CPABORT("")
217 : END IF
218 : CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
219 0 : 0.0_dp, mo_derivs(ispin)%matrix)
220 : END DO
221 : END BLOCK
222 : END IF
223 :
224 1558 : CALL timestop(handle)
225 :
226 1558 : END SUBROUTINE build_gfn0_xtb_ks_matrix
227 :
228 : ! **************************************************************************************************
229 : !> \brief ...
230 : !> \param qs_env ...
231 : !> \param calculate_forces ...
232 : !> \param just_energy ...
233 : !> \param ext_ks_matrix ...
234 : ! **************************************************************************************************
235 23054 : SUBROUTINE build_gfn1_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
236 : TYPE(qs_environment_type), POINTER :: qs_env
237 : LOGICAL, INTENT(in) :: calculate_forces, just_energy
238 : TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
239 : POINTER :: ext_ks_matrix
240 :
241 : CHARACTER(len=*), PARAMETER :: routineN = 'build_gfn1_xtb_ks_matrix'
242 :
243 : INTEGER :: atom_a, handle, iatom, ikind, img, &
244 : iounit, is, ispin, na, natom, natorb, &
245 : nimg, nkind, ns, nsgf, nspins
246 : INTEGER, DIMENSION(25) :: lao
247 : INTEGER, DIMENSION(5) :: occ
248 : LOGICAL :: do_efield, pass_check
249 : REAL(KIND=dp) :: achrg, chmax, pc_ener, qmmm_el
250 23054 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: mcharge
251 23054 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: aocg, charges
252 23054 : TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
253 : TYPE(cp_logger_type), POINTER :: logger
254 23054 : TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_p1, mo_derivs, p_matrix
255 23054 : TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, matrix_h, matrix_p, matrix_s
256 : TYPE(dbcsr_type), POINTER :: mo_coeff, s_matrix
257 : TYPE(dft_control_type), POINTER :: dft_control
258 : TYPE(mp_para_env_type), POINTER :: para_env
259 23054 : TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
260 : TYPE(qs_energy_type), POINTER :: energy
261 23054 : TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
262 : TYPE(qs_ks_env_type), POINTER :: ks_env
263 : TYPE(qs_rho_type), POINTER :: rho
264 : TYPE(qs_scf_env_type), POINTER :: scf_env
265 : TYPE(section_vals_type), POINTER :: scf_section
266 : TYPE(xtb_atom_type), POINTER :: xtb_kind
267 :
268 23054 : CALL timeset(routineN, handle)
269 :
270 23054 : NULLIFY (dft_control, logger, scf_section, matrix_p, particle_set, ks_env, &
271 23054 : ks_matrix, rho, energy)
272 23054 : CPASSERT(ASSOCIATED(qs_env))
273 :
274 23054 : logger => cp_get_default_logger()
275 23054 : iounit = cp_logger_get_default_io_unit(logger)
276 :
277 : CALL get_qs_env(qs_env, &
278 : dft_control=dft_control, &
279 : atomic_kind_set=atomic_kind_set, &
280 : qs_kind_set=qs_kind_set, &
281 : matrix_h_kp=matrix_h, &
282 : para_env=para_env, &
283 : ks_env=ks_env, &
284 : matrix_ks_kp=ks_matrix, &
285 : rho=rho, &
286 23054 : energy=energy)
287 :
288 23054 : IF (PRESENT(ext_ks_matrix)) THEN
289 : ! remap pointer to allow for non-kpoint external ks matrix
290 : ! ext_ks_matrix is used in linear response code
291 16 : ns = SIZE(ext_ks_matrix)
292 16 : ks_matrix(1:ns, 1:1) => ext_ks_matrix(1:ns)
293 : END IF
294 :
295 23054 : energy%hartree = 0.0_dp
296 23054 : energy%qmmm_el = 0.0_dp
297 23054 : energy%efield = 0.0_dp
298 :
299 23054 : scf_section => section_vals_get_subs_vals(qs_env%input, "DFT%SCF")
300 23054 : nspins = dft_control%nspins
301 23054 : nimg = dft_control%nimages
302 23054 : CPASSERT(ASSOCIATED(matrix_h))
303 23054 : CPASSERT(ASSOCIATED(rho))
304 69162 : CPASSERT(SIZE(ks_matrix) > 0)
305 :
306 48260 : DO ispin = 1, nspins
307 434276 : DO img = 1, nimg
308 : ! copy the core matrix into the fock matrix
309 411222 : CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix)
310 : END DO
311 : END DO
312 :
313 23054 : IF (dft_control%apply_period_efield .OR. dft_control%apply_efield .OR. &
314 : dft_control%apply_efield_field) THEN
315 : do_efield = .TRUE.
316 : ELSE
317 17160 : do_efield = .FALSE.
318 : END IF
319 :
320 23054 : IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield) THEN
321 : ! Mulliken charges
322 21172 : CALL get_qs_env(qs_env=qs_env, particle_set=particle_set, matrix_s_kp=matrix_s)
323 21172 : CALL qs_rho_get(rho, rho_ao_kp=matrix_p)
324 21172 : natom = SIZE(particle_set)
325 105860 : ALLOCATE (mcharge(natom), charges(natom, 5))
326 1148172 : charges = 0.0_dp
327 21172 : nkind = SIZE(atomic_kind_set)
328 21172 : CALL get_qs_kind_set(qs_kind_set, maxsgf=nsgf)
329 84688 : ALLOCATE (aocg(nsgf, natom))
330 1093202 : aocg = 0.0_dp
331 21172 : IF (nimg > 1) THEN
332 2644 : CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
333 : ELSE
334 18528 : p_matrix => matrix_p(:, 1)
335 18528 : s_matrix => matrix_s(1, 1)%matrix
336 18528 : CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
337 : END IF
338 77090 : DO ikind = 1, nkind
339 55918 : CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
340 55918 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
341 55918 : CALL get_xtb_atom_param(xtb_kind, natorb=natorb, lao=lao, occupation=occ)
342 337236 : DO iatom = 1, na
343 204228 : atom_a = atomic_kind_set(ikind)%atom_list(iatom)
344 1225368 : charges(atom_a, :) = REAL(occ(:), KIND=dp)
345 911196 : DO is = 1, natorb
346 651050 : ns = lao(is) + 1
347 855278 : charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
348 : END DO
349 : END DO
350 : END DO
351 21172 : DEALLOCATE (aocg)
352 : ! charge mixing
353 21172 : IF (dft_control%qs_control%do_ls_scf) THEN
354 : !
355 : ELSE
356 20960 : CALL get_qs_env(qs_env=qs_env, scf_env=scf_env)
357 : CALL charge_mixing(scf_env%mixing_method, scf_env%mixing_store, &
358 20960 : charges, para_env, scf_env%iter_count)
359 : END IF
360 :
361 246572 : DO iatom = 1, natom
362 1248422 : mcharge(iatom) = SUM(charges(iatom, :))
363 : END DO
364 : END IF
365 :
366 23054 : IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
367 : CALL build_xtb_coulomb(qs_env, ks_matrix, rho, charges, mcharge, energy, &
368 21172 : calculate_forces, just_energy)
369 : END IF
370 :
371 23054 : IF (do_efield) THEN
372 5894 : CALL efield_tb_matrix(qs_env, ks_matrix, rho, mcharge, energy, calculate_forces, just_energy)
373 : END IF
374 :
375 23054 : IF (dft_control%qs_control%xtb_control%coulomb_interaction) THEN
376 21172 : IF (dft_control%qs_control%xtb_control%check_atomic_charges) THEN
377 20314 : pass_check = .TRUE.
378 73534 : DO ikind = 1, nkind
379 53220 : CALL get_atomic_kind(atomic_kind_set(ikind), natom=na)
380 53220 : CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
381 53220 : CALL get_xtb_atom_param(xtb_kind, chmax=chmax)
382 326658 : DO iatom = 1, na
383 199904 : atom_a = atomic_kind_set(ikind)%atom_list(iatom)
384 199904 : achrg = mcharge(atom_a)
385 253124 : IF (ABS(achrg) > chmax) THEN
386 0 : IF (iounit > 0) THEN
387 0 : WRITE (iounit, "(A,A,I3,I6,A,F4.2,A,F6.2)") " Charge outside chemical range:", &
388 0 : " Kind Atom=", ikind, atom_a, " Limit=", chmax, " Charge=", achrg
389 : END IF
390 : pass_check = .FALSE.
391 : END IF
392 : END DO
393 : END DO
394 20314 : IF (.NOT. pass_check) THEN
395 : CALL cp_warn(__LOCATION__, "Atomic charges outside chemical range were detected."// &
396 : " Switch-off CHECK_ATOMIC_CHARGES keyword in the &xTB section"// &
397 0 : " if you want to force to continue the calculation.")
398 0 : CPABORT("xTB Charges")
399 : END IF
400 : END IF
401 : END IF
402 :
403 23054 : IF (dft_control%qs_control%xtb_control%coulomb_interaction .OR. do_efield) THEN
404 21172 : DEALLOCATE (mcharge, charges)
405 : END IF
406 :
407 23054 : IF (qs_env%qmmm) THEN
408 5146 : CPASSERT(SIZE(ks_matrix, 2) == 1)
409 10292 : DO ispin = 1, nspins
410 : ! If QM/MM sumup the 1el Hamiltonian
411 : CALL dbcsr_add(ks_matrix(ispin, 1)%matrix, qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
412 5146 : 1.0_dp, 1.0_dp)
413 5146 : CALL qs_rho_get(rho, rho_ao=matrix_p1)
414 : ! Compute QM/MM Energy
415 : CALL dbcsr_dot(qs_env%ks_qmmm_env%matrix_h(1)%matrix, &
416 5146 : matrix_p1(ispin)%matrix, qmmm_el)
417 10292 : energy%qmmm_el = energy%qmmm_el + qmmm_el
418 : END DO
419 5146 : pc_ener = qs_env%ks_qmmm_env%pc_ener
420 5146 : energy%qmmm_el = energy%qmmm_el + pc_ener
421 : END IF
422 :
423 : energy%total = energy%core + energy%hartree + energy%efield + energy%qmmm_el + &
424 23054 : energy%repulsive + energy%dispersion + energy%dftb3 + energy%kTS
425 :
426 : iounit = cp_print_key_unit_nr(logger, scf_section, "PRINT%DETAILED_ENERGY", &
427 23054 : extension=".scfLog")
428 23054 : IF (iounit > 0) THEN
429 : WRITE (UNIT=iounit, FMT="(/,(T9,A,T60,F20.10))") &
430 0 : "Repulsive pair potential energy: ", energy%repulsive, &
431 0 : "Zeroth order Hamiltonian energy: ", energy%core, &
432 0 : "Charge fluctuation energy: ", energy%hartree, &
433 0 : "London dispersion energy: ", energy%dispersion
434 0 : IF (dft_control%qs_control%xtb_control%xb_interaction) &
435 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
436 0 : "Correction for halogen bonding: ", energy%xtb_xb_inter
437 0 : IF (dft_control%qs_control%xtb_control%do_nonbonded) &
438 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
439 0 : "Correction for nonbonded interactions: ", energy%xtb_nonbonded
440 0 : IF (ABS(energy%efield) > 1.e-12_dp) THEN
441 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
442 0 : "Electric field interaction energy: ", energy%efield
443 : END IF
444 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
445 0 : "DFTB3 3rd Order Energy Correction ", energy%dftb3
446 0 : IF (qs_env%qmmm) THEN
447 : WRITE (UNIT=iounit, FMT="(T9,A,T60,F20.10)") &
448 0 : "QM/MM Electrostatic energy: ", energy%qmmm_el
449 : END IF
450 : END IF
451 : CALL cp_print_key_finished_output(iounit, logger, scf_section, &
452 23054 : "PRINT%DETAILED_ENERGY")
453 : ! here we compute dE/dC if needed. Assumes dE/dC is H_{ks}C
454 23054 : IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy) THEN
455 7236 : CPASSERT(SIZE(ks_matrix, 2) == 1)
456 : BLOCK
457 7236 : TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
458 7236 : CALL get_qs_env(qs_env, mo_derivs=mo_derivs, mos=mo_array)
459 14520 : DO ispin = 1, SIZE(mo_derivs)
460 7284 : CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff_b=mo_coeff)
461 7284 : IF (.NOT. mo_array(ispin)%use_mo_coeff_b) THEN
462 0 : CPABORT("")
463 : END IF
464 : CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin, 1)%matrix, mo_coeff, &
465 14520 : 0.0_dp, mo_derivs(ispin)%matrix)
466 : END DO
467 : END BLOCK
468 : END IF
469 :
470 23054 : CALL timestop(handle)
471 :
472 46108 : END SUBROUTINE build_gfn1_xtb_ks_matrix
473 :
474 : END MODULE xtb_ks_matrix
475 :
|