(git:cccd2f3)
Loading...
Searching...
No Matches
qs_force.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
9!> \brief Quickstep force driver routine
10!> \author MK (12.06.2002)
11! **************************************************************************************************
16 USE cp_dbcsr_api, ONLY: dbcsr_copy,&
25 USE cp_output_handling, ONLY: cp_p_file,&
29 USE dft_plus_u, ONLY: plus_u
35 USE hfx_exx, ONLY: calculate_exx
43 USE kinds, ONLY: dp
54 USE qs_energy, ONLY: qs_energies
66 USE qs_ks_types, ONLY: qs_ks_env_type,&
68 USE qs_rho_types, ONLY: qs_rho_get,&
85#include "./base/base_uses.f90"
86
87 IMPLICIT NONE
88
89 PRIVATE
90
91! *** Global parameters ***
92
93 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_force'
94
95! *** Public subroutines ***
96
97 PUBLIC :: qs_calc_energy_force
98
99CONTAINS
100
101! **************************************************************************************************
102!> \brief ...
103!> \param qs_env ...
104!> \param calc_force ...
105!> \param consistent_energies ...
106!> \param linres ...
107! **************************************************************************************************
108 SUBROUTINE qs_calc_energy_force(qs_env, calc_force, consistent_energies, linres)
109 TYPE(qs_environment_type), POINTER :: qs_env
110 LOGICAL :: calc_force, consistent_energies, linres
111
112 qs_env%linres_run = linres
113 IF (calc_force) THEN
114 CALL qs_forces(qs_env)
115 ELSE
116 CALL qs_energies(qs_env, calc_forces=.false., &
117 consistent_energies=consistent_energies)
118 END IF
119
120 END SUBROUTINE qs_calc_energy_force
121
122! **************************************************************************************************
123!> \brief Calculate the Quickstep forces.
124!> \param qs_env ...
125!> \date 29.10.2002
126!> \author MK
127!> \version 1.0
128! **************************************************************************************************
129 SUBROUTINE qs_forces(qs_env)
130
131 TYPE(qs_environment_type), POINTER :: qs_env
132
133 CHARACTER(len=*), PARAMETER :: routinen = 'qs_forces'
134
135 INTEGER :: after, handle, i, iatom, ic, ikind, &
136 ispin, iw, natom, nkind, nspin, &
137 output_unit
138 INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of, natom_of_kind
139 LOGICAL :: do_admm, do_exx, do_gw, do_im_time, &
140 has_unit_metric, omit_headers, &
141 perform_ec, reuse_hfx
142 REAL(dp) :: dummy_real, dummy_real2(2)
143 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
144 TYPE(cp_logger_type), POINTER :: logger
145 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_w, rho_ao
146 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_w_kp
147 TYPE(dft_control_type), POINTER :: dft_control
148 TYPE(energy_correction_type), POINTER :: ec_env
149 TYPE(lri_environment_type), POINTER :: lri_env
150 TYPE(mp_para_env_type), POINTER :: para_env
151 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
152 TYPE(qs_energy_type), POINTER :: energy
153 TYPE(qs_force_type), DIMENSION(:), POINTER :: force
154 TYPE(qs_ks_env_type), POINTER :: ks_env
155 TYPE(qs_rho_type), POINTER :: rho
156 TYPE(qs_subsys_type), POINTER :: subsys
157 TYPE(section_vals_type), POINTER :: hfx_sections, print_section
158 TYPE(virial_type), POINTER :: virial
159
160 CALL timeset(routinen, handle)
161 NULLIFY (logger)
162 logger => cp_get_default_logger()
163
164 ! rebuild plane wave environment
165 CALL qs_env_rebuild_pw_env(qs_env)
166
167 ! zero out the forces in particle set
168 CALL get_qs_env(qs_env, particle_set=particle_set)
169 natom = SIZE(particle_set)
170 DO iatom = 1, natom
171 particle_set(iatom)%f = 0.0_dp
172 END DO
173
174 ! get atom mapping
175 NULLIFY (atomic_kind_set)
176 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
177 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
178 atom_of_kind=atom_of_kind, &
179 kind_of=kind_of)
180
181 NULLIFY (force, subsys, dft_control)
182 CALL get_qs_env(qs_env, &
183 force=force, &
184 subsys=subsys, &
185 dft_control=dft_control)
186 IF (.NOT. ASSOCIATED(force)) THEN
187 ! *** Allocate the force data structure ***
188 nkind = SIZE(atomic_kind_set)
189 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, natom_of_kind=natom_of_kind)
190 CALL allocate_qs_force(force, natom_of_kind)
191 DEALLOCATE (natom_of_kind)
192 CALL qs_subsys_set(subsys, force=force)
193 END IF
194 CALL zero_qs_force(force)
195
196 ! Check if CDFT potential is needed and save it until forces have been calculated
197 IF (dft_control%qs_control%cdft) THEN
198 dft_control%qs_control%cdft_control%save_pot = .true.
199 END IF
200
201 ! recalculate energy and the response vector for the Z-vector linear equation system if calc_force = .true.
202 CALL qs_energies(qs_env, calc_forces=.true.)
203
204 NULLIFY (para_env)
205 CALL get_qs_env(qs_env, &
206 para_env=para_env)
207
208 ! Now we handle some special cases
209 ! Maybe some of these would be better dealt with in qs_energies?
210 IF (qs_env%run_rtp) THEN
211 NULLIFY (matrix_w, matrix_s, ks_env)
212 CALL get_qs_env(qs_env, &
213 ks_env=ks_env, &
214 matrix_w=matrix_w, &
215 matrix_s=matrix_s)
216 CALL dbcsr_allocate_matrix_set(matrix_w, dft_control%nspins)
217 DO ispin = 1, dft_control%nspins
218 ALLOCATE (matrix_w(ispin)%matrix)
219 CALL dbcsr_copy(matrix_w(ispin)%matrix, matrix_s(1)%matrix, &
220 name="W MATRIX")
221 CALL dbcsr_set(matrix_w(ispin)%matrix, 0.0_dp)
222 END DO
223 CALL set_ks_env(ks_env, matrix_w=matrix_w)
224
225 CALL calc_c_mat_force(qs_env)
226 IF (dft_control%do_admm) CALL rt_admm_force(qs_env)
227 IF (dft_control%rtp_control%velocity_gauge .AND. dft_control%rtp_control%nl_gauge_transform) &
228 CALL velocity_gauge_nl_force(qs_env, particle_set)
229 END IF
230 ! from an eventual Mulliken restraint
231 IF (dft_control%qs_control%mulliken_restraint) THEN
232 NULLIFY (matrix_w, matrix_s, rho)
233 CALL get_qs_env(qs_env, &
234 matrix_w=matrix_w, &
235 matrix_s=matrix_s, &
236 rho=rho)
237 NULLIFY (rho_ao)
238 CALL qs_rho_get(rho, rho_ao=rho_ao)
239 CALL mulliken_restraint(dft_control%qs_control%mulliken_restraint_control, &
240 para_env, matrix_s(1)%matrix, rho_ao, w_matrix=matrix_w)
241 END IF
242 ! Add non-Pulay contribution of DFT+U to W matrix, since it has also to be
243 ! digested with overlap matrix derivatives
244 IF (dft_control%dft_plus_u) THEN
245 NULLIFY (matrix_w_kp)
246 CALL get_qs_env(qs_env, matrix_w_kp=matrix_w_kp)
247 CALL plus_u(qs_env=qs_env, matrix_w=matrix_w_kp)
248 END IF
249
250 ! Write W Matrix to output (if requested)
251 CALL get_qs_env(qs_env, has_unit_metric=has_unit_metric)
252 IF (.NOT. has_unit_metric) THEN
253 NULLIFY (matrix_w_kp)
254 CALL get_qs_env(qs_env, matrix_w_kp=matrix_w_kp)
255 nspin = SIZE(matrix_w_kp, 1)
256 DO ispin = 1, nspin
257 IF (btest(cp_print_key_should_output(logger%iter_info, &
258 qs_env%input, "DFT%PRINT%AO_MATRICES/W_MATRIX"), cp_p_file)) THEN
259 iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/W_MATRIX", &
260 extension=".Log")
261 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
262 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
263 after = min(max(after, 1), 16)
264 DO ic = 1, SIZE(matrix_w_kp, 2)
265 CALL cp_dbcsr_write_sparse_matrix(matrix_w_kp(ispin, ic)%matrix, 4, after, qs_env, &
266 para_env, output_unit=iw, omit_headers=omit_headers)
267 END DO
268 CALL cp_print_key_finished_output(iw, logger, qs_env%input, &
269 "DFT%PRINT%AO_MATRICES/W_MATRIX")
270 END IF
271 END DO
272 END IF
273
274 ! Check if energy correction should be skipped
275 perform_ec = .false.
276 IF (qs_env%energy_correction) THEN
277 CALL get_qs_env(qs_env, ec_env=ec_env)
278 IF (.NOT. ec_env%do_skip) perform_ec = .true.
279 END IF
280
281 ! Compute core forces (also overwrites matrix_w)
282 IF (dft_control%qs_control%semi_empirical) THEN
283 CALL build_se_core_matrix(qs_env=qs_env, para_env=para_env, &
284 calculate_forces=.true.)
285 CALL se_core_core_interaction(qs_env, para_env, calculate_forces=.true.)
286 ELSEIF (dft_control%qs_control%dftb) THEN
287 CALL build_dftb_matrices(qs_env=qs_env, para_env=para_env, &
288 calculate_forces=.true.)
289 CALL calculate_dftb_dispersion(qs_env=qs_env, para_env=para_env, &
290 calculate_forces=.true.)
291 ELSEIF (dft_control%qs_control%xtb) THEN
292 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
293 CALL build_tblite_matrices(qs_env=qs_env, calculate_forces=.true.)
294 ELSE
295 CALL build_xtb_matrices(qs_env=qs_env, calculate_forces=.true.)
296 END IF
297 ELSEIF (perform_ec) THEN
298 ! Calculates core and grid based forces
299 CALL energy_correction(qs_env, ec_init=.false., calculate_forces=.true.)
300 ELSE
301 ! Dispersion energy and forces are calculated in qs_energy?
302 CALL build_core_hamiltonian_matrix(qs_env=qs_env, calculate_forces=.true.)
303 ! The above line reset the core H, which should be re-updated in case a TD field is applied:
304 IF (qs_env%run_rtp) THEN
305 IF (dft_control%apply_efield_field) &
307 IF (dft_control%rtp_control%velocity_gauge) &
308 CALL velocity_gauge_ks_matrix(qs_env, subtract_nl_term=.false.)
309
310 END IF
311 CALL calculate_ecore_self(qs_env)
312 CALL calculate_ecore_overlap(qs_env, para_env, calculate_forces=.true.)
313 CALL calculate_ecore_efield(qs_env, calculate_forces=.true.)
314 !swap external_e_potential before external_c_potential, to ensure
315 !that external potential on grid is loaded before calculating energy of cores
316 CALL external_e_potential(qs_env)
317 IF (.NOT. dft_control%qs_control%gapw) THEN
318 CALL external_c_potential(qs_env, calculate_forces=.true.)
319 END IF
320 ! RIGPW matrices
321 IF (dft_control%qs_control%rigpw) THEN
322 CALL get_qs_env(qs_env=qs_env, lri_env=lri_env)
323 CALL build_ri_matrices(lri_env, qs_env, calculate_forces=.true.)
324 END IF
325 END IF
326
327 ! MP2 Code
328 IF (ASSOCIATED(qs_env%mp2_env)) THEN
329 NULLIFY (energy)
330 CALL get_qs_env(qs_env, energy=energy)
331 CALL qs_scf_compute_properties(qs_env, wf_type='MP2 ', do_mp2=.true.)
332 CALL qs_ks_update_qs_env(qs_env, just_energy=.true.)
333 energy%total = energy%total + energy%mp2
334
335 IF ((qs_env%mp2_env%method == ri_mp2_method_gpw .OR. qs_env%mp2_env%method == ri_mp2_laplace .OR. &
336 qs_env%mp2_env%method == ri_rpa_method_gpw) &
337 .AND. .NOT. qs_env%mp2_env%do_im_time) THEN
338 CALL update_mp2_forces(qs_env)
339 END IF
340
341 !RPA EXX energy and forces
342 IF (qs_env%mp2_env%method == ri_rpa_method_gpw) THEN
343 do_exx = .false.
344 hfx_sections => section_vals_get_subs_vals(qs_env%input, "DFT%XC%WF_CORRELATION%RI_RPA%HF")
345 CALL section_vals_get(hfx_sections, explicit=do_exx)
346 IF (do_exx) THEN
347 do_gw = qs_env%mp2_env%ri_rpa%do_ri_g0w0
348 do_admm = qs_env%mp2_env%ri_rpa%do_admm
349 reuse_hfx = qs_env%mp2_env%ri_rpa%reuse_hfx
350 do_im_time = qs_env%mp2_env%do_im_time
351 output_unit = cp_logger_get_default_io_unit()
352 dummy_real = 0.0_dp
353
354 CALL calculate_exx(qs_env=qs_env, &
355 unit_nr=output_unit, &
356 hfx_sections=hfx_sections, &
357 x_data=qs_env%mp2_env%ri_rpa%x_data, &
358 do_gw=do_gw, &
359 do_admm=do_admm, &
360 calc_forces=.true., &
361 reuse_hfx=reuse_hfx, &
362 do_im_time=do_im_time, &
363 e_ex_from_gw=dummy_real, &
364 e_admm_from_gw=dummy_real2, &
365 t3=dummy_real)
366 END IF
367 END IF
368 ELSEIF (perform_ec) THEN
369 ! energy correction forces postponed
370 ELSEIF (qs_env%harris_method) THEN
371 ! Harris method forces already done in harris_energy_correction
372 ELSE
373 ! Compute grid-based forces
374 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.true.)
375 END IF
376
377 ! Excited state forces
378 ! Solve the response linear equation system for the Z-vector method
379 ! and calculate remaining terms of the force
380 CALL excited_state_energy(qs_env, calculate_forces=.true.)
381
382 ! replicate forces (get current pointer)
383 NULLIFY (force)
384 CALL get_qs_env(qs_env=qs_env, force=force)
385 CALL replicate_qs_force(force, para_env)
386
387 DO iatom = 1, natom
388 ikind = kind_of(iatom)
389 i = atom_of_kind(iatom)
390 ! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
391 ! the force is - dE/dR, what is called force is actually the gradient
392 ! Things should have the right name
393 ! The minus sign below is a hack
394 ! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
395 force(ikind)%other(1:3, i) = -particle_set(iatom)%f(1:3) + force(ikind)%ch_pulay(1:3, i)
396 force(ikind)%total(1:3, i) = force(ikind)%total(1:3, i) + force(ikind)%other(1:3, i)
397 particle_set(iatom)%f = -force(ikind)%total(1:3, i)
398 END DO
399
400 NULLIFY (virial, energy)
401 CALL get_qs_env(qs_env=qs_env, virial=virial, energy=energy)
402 IF (virial%pv_availability) THEN
403 CALL para_env%sum(virial%pv_overlap)
404 CALL para_env%sum(virial%pv_ekinetic)
405 CALL para_env%sum(virial%pv_ppl)
406 CALL para_env%sum(virial%pv_ppnl)
407 CALL para_env%sum(virial%pv_ecore_overlap)
408 CALL para_env%sum(virial%pv_ehartree)
409 CALL para_env%sum(virial%pv_exc)
410 CALL para_env%sum(virial%pv_exx)
411 CALL para_env%sum(virial%pv_vdw)
412 CALL para_env%sum(virial%pv_mp2)
413 CALL para_env%sum(virial%pv_nlcc)
414 CALL para_env%sum(virial%pv_gapw)
415 CALL para_env%sum(virial%pv_lrigpw)
416 CALL para_env%sum(virial%pv_virial)
417 CALL symmetrize_virial(virial)
418 ! Add the volume terms of the virial
419 IF ((.NOT. virial%pv_numer) .AND. &
420 (.NOT. (dft_control%qs_control%dftb .OR. &
421 dft_control%qs_control%xtb .OR. &
422 dft_control%qs_control%semi_empirical))) THEN
423
424 ! Harris energy correction requires volume terms from
425 ! 1) Harris functional contribution, and
426 ! 2) Linear Response solver
427 IF (perform_ec) THEN
428 CALL get_qs_env(qs_env, ec_env=ec_env)
429 energy%hartree = ec_env%ehartree
430 energy%exc = ec_env%exc
431 IF (dft_control%do_admm) THEN
432 energy%exc_aux_fit = ec_env%exc_aux_fit
433 END IF
434 END IF
435 DO i = 1, 3
436 virial%pv_ehartree(i, i) = virial%pv_ehartree(i, i) &
437 - 2.0_dp*(energy%hartree + energy%sccs_pol)
438 virial%pv_virial(i, i) = virial%pv_virial(i, i) - energy%exc &
439 - 2.0_dp*(energy%hartree + energy%sccs_pol)
440 virial%pv_exc(i, i) = virial%pv_exc(i, i) - energy%exc
441 IF (dft_control%do_admm) THEN
442 virial%pv_exc(i, i) = virial%pv_exc(i, i) - energy%exc_aux_fit
443 virial%pv_virial(i, i) = virial%pv_virial(i, i) - energy%exc_aux_fit
444 END IF
445 ! The factor 2 is a hack. It compensates the plus sign in h_stress/pw_poisson_solve.
446 ! The sign in pw_poisson_solve is correct for FIST, but not for QS.
447 ! There should be a more elegant solution to that ...
448 END DO
449 END IF
450 END IF
451
452 IF (dft_control%qs_control%xtb .AND. dft_control%qs_control%xtb_control%do_tblite) THEN
453 CALL tb_reference_cli_compare(qs_env)
454 END IF
455
456 output_unit = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%DERIVATIVES", &
457 extension=".Log")
458 print_section => section_vals_get_subs_vals(qs_env%input, "DFT%PRINT%DERIVATIVES")
459 IF (dft_control%qs_control%semi_empirical) THEN
460 CALL write_forces(force, atomic_kind_set, 2, output_unit=output_unit, &
461 print_section=print_section)
462 ELSE IF (dft_control%qs_control%dftb) THEN
463 CALL write_forces(force, atomic_kind_set, 4, output_unit=output_unit, &
464 print_section=print_section)
465 ELSE IF (dft_control%qs_control%xtb) THEN
466 CALL write_forces(force, atomic_kind_set, 4, output_unit=output_unit, &
467 print_section=print_section)
468 ELSE IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
469 CALL write_forces(force, atomic_kind_set, 1, output_unit=output_unit, &
470 print_section=print_section)
471 ELSE
472 CALL write_forces(force, atomic_kind_set, 0, output_unit=output_unit, &
473 print_section=print_section)
474 END IF
475 CALL cp_print_key_finished_output(output_unit, logger, qs_env%input, &
476 "DFT%PRINT%DERIVATIVES")
477
478 ! deallocate W Matrix:
479 NULLIFY (ks_env, matrix_w_kp)
480 CALL get_qs_env(qs_env=qs_env, &
481 matrix_w_kp=matrix_w_kp, &
482 ks_env=ks_env)
483 CALL dbcsr_deallocate_matrix_set(matrix_w_kp)
484 NULLIFY (matrix_w_kp)
485 CALL set_ks_env(ks_env, matrix_w_kp=matrix_w_kp)
486
487 DEALLOCATE (atom_of_kind, kind_of)
488
489 CALL timestop(handle)
490
491 END SUBROUTINE qs_forces
492
493! **************************************************************************************************
494!> \brief Write a Quickstep force data structure to output unit
495!> \param qs_force ...
496!> \param atomic_kind_set ...
497!> \param ftype ...
498!> \param output_unit ...
499!> \param print_section ...
500!> \date 05.06.2002
501!> \author MK
502!> \version 1.0
503! **************************************************************************************************
504 SUBROUTINE write_forces(qs_force, atomic_kind_set, ftype, output_unit, &
505 print_section)
506
507 TYPE(qs_force_type), DIMENSION(:), POINTER :: qs_force
508 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
509 INTEGER, INTENT(IN) :: ftype, output_unit
510 TYPE(section_vals_type), POINTER :: print_section
511
512 CHARACTER(LEN=13) :: fmtstr5
513 CHARACTER(LEN=15) :: fmtstr4
514 CHARACTER(LEN=20) :: fmtstr3
515 CHARACTER(LEN=35) :: fmtstr2
516 CHARACTER(LEN=48) :: fmtstr1
517 INTEGER :: i, iatom, ikind, my_ftype, natom, ndigits
518 INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
519 REAL(kind=dp), DIMENSION(3) :: grand_total
520
521 IF (output_unit > 0) THEN
522
523 IF (.NOT. ASSOCIATED(qs_force)) THEN
524 CALL cp_abort(__location__, &
525 "The qs_force pointer is not associated "// &
526 "and cannot be printed")
527 END IF
528
529 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind, &
530 kind_of=kind_of, natom=natom)
531
532 ! Variable precision output of the forces
533 CALL section_vals_val_get(print_section, "NDIGITS", &
534 i_val=ndigits)
535
536 fmtstr1 = "(/,/,T2,A,/,/,T3,A,T11,A,T23,A,T40,A1,2( X,A1))"
537 WRITE (unit=fmtstr1(41:42), fmt="(I2)") ndigits + 5
538
539 fmtstr2 = "(/,(T2,I5,4X,I4,T18,A,T34,3F . ))"
540 WRITE (unit=fmtstr2(32:33), fmt="(I2)") ndigits
541 WRITE (unit=fmtstr2(29:30), fmt="(I2)") ndigits + 6
542
543 fmtstr3 = "(/,T3,A,T34,3F . )"
544 WRITE (unit=fmtstr3(18:19), fmt="(I2)") ndigits
545 WRITE (unit=fmtstr3(15:16), fmt="(I2)") ndigits + 6
546
547 fmtstr4 = "((T34,3F . ))"
548 WRITE (unit=fmtstr4(12:13), fmt="(I2)") ndigits
549 WRITE (unit=fmtstr4(9:10), fmt="(I2)") ndigits + 6
550
551 fmtstr5 = "(/T2,A//T3,A)"
552
553 WRITE (unit=output_unit, fmt=fmtstr1) &
554 "FORCES [a.u.]", "Atom", "Kind", "Component", "X", "Y", "Z"
555
556 grand_total(:) = 0.0_dp
557
558 my_ftype = ftype
559
560 SELECT CASE (my_ftype)
561 CASE DEFAULT
562 DO iatom = 1, natom
563 ikind = kind_of(iatom)
564 i = atom_of_kind(iatom)
565 WRITE (unit=output_unit, fmt=fmtstr2) &
566 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
567 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
568 END DO
569 CASE (0)
570 DO iatom = 1, natom
571 ikind = kind_of(iatom)
572 i = atom_of_kind(iatom)
573 WRITE (unit=output_unit, fmt=fmtstr2) &
574 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
575 iatom, ikind, " overlap_admm", qs_force(ikind)%overlap_admm(1:3, i), &
576 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
577 iatom, ikind, " gth_ppl", qs_force(ikind)%gth_ppl(1:3, i), &
578 iatom, ikind, " gth_nlcc", qs_force(ikind)%gth_nlcc(1:3, i), &
579 iatom, ikind, " gth_ppnl", qs_force(ikind)%gth_ppnl(1:3, i), &
580 iatom, ikind, " core_overlap", qs_force(ikind)%core_overlap(1:3, i), &
581 iatom, ikind, " rho_core", qs_force(ikind)%rho_core(1:3, i), &
582 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
583 iatom, ikind, " rho_lri_elec", qs_force(ikind)%rho_lri_elec(1:3, i), &
584 iatom, ikind, " ch_pulay", qs_force(ikind)%ch_pulay(1:3, i), &
585 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
586 iatom, ikind, " gCP", qs_force(ikind)%gcp(1:3, i), &
587 iatom, ikind, " other", qs_force(ikind)%other(1:3, i), &
588 iatom, ikind, " fock_4c", qs_force(ikind)%fock_4c(1:3, i), &
589 iatom, ikind, " ehrenfest", qs_force(ikind)%ehrenfest(1:3, i), &
590 iatom, ikind, " efield", qs_force(ikind)%efield(1:3, i), &
591 iatom, ikind, " eev", qs_force(ikind)%eev(1:3, i), &
592 iatom, ikind, " mp2_non_sep", qs_force(ikind)%mp2_non_sep(1:3, i), &
593 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
594 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
595 END DO
596 CASE (1)
597 DO iatom = 1, natom
598 ikind = kind_of(iatom)
599 i = atom_of_kind(iatom)
600 WRITE (unit=output_unit, fmt=fmtstr2) &
601 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
602 iatom, ikind, " overlap_admm", qs_force(ikind)%overlap_admm(1:3, i), &
603 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
604 iatom, ikind, " gth_ppl", qs_force(ikind)%gth_ppl(1:3, i), &
605 iatom, ikind, " gth_nlcc", qs_force(ikind)%gth_nlcc(1:3, i), &
606 iatom, ikind, " gth_ppnl", qs_force(ikind)%gth_ppnl(1:3, i), &
607 iatom, ikind, " all_potential", qs_force(ikind)%all_potential(1:3, i), &
608 iatom, ikind, "cneo_potential", qs_force(ikind)%cneo_potential(1:3, i), &
609 iatom, ikind, " core_overlap", qs_force(ikind)%core_overlap(1:3, i), &
610 iatom, ikind, " rho_core", qs_force(ikind)%rho_core(1:3, i), &
611 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
612 iatom, ikind, " rho_lri_elec", qs_force(ikind)%rho_lri_elec(1:3, i), &
613 iatom, ikind, " rho_cneo_nuc", qs_force(ikind)%rho_cneo_nuc(1:3, i), &
614 iatom, ikind, " vhxc_atom", qs_force(ikind)%vhxc_atom(1:3, i), &
615 iatom, ikind, " g0s_Vh_elec", qs_force(ikind)%g0s_Vh_elec(1:3, i), &
616 iatom, ikind, " ch_pulay", qs_force(ikind)%ch_pulay(1:3, i), &
617 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
618 iatom, ikind, " gCP", qs_force(ikind)%gcp(1:3, i), &
619 iatom, ikind, " fock_4c", qs_force(ikind)%fock_4c(1:3, i), &
620 iatom, ikind, " ehrenfest", qs_force(ikind)%ehrenfest(1:3, i), &
621 iatom, ikind, " efield", qs_force(ikind)%efield(1:3, i), &
622 iatom, ikind, " eev", qs_force(ikind)%eev(1:3, i), &
623 iatom, ikind, " mp2_non_sep", qs_force(ikind)%mp2_non_sep(1:3, i), &
624 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
625 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
626 END DO
627 CASE (2)
628 DO iatom = 1, natom
629 ikind = kind_of(iatom)
630 i = atom_of_kind(iatom)
631 WRITE (unit=output_unit, fmt=fmtstr2) &
632 iatom, ikind, " all_potential", qs_force(ikind)%all_potential(1:3, i), &
633 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
634 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
635 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
636 END DO
637 CASE (3)
638 DO iatom = 1, natom
639 ikind = kind_of(iatom)
640 i = atom_of_kind(iatom)
641 WRITE (unit=output_unit, fmt=fmtstr2) &
642 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
643 iatom, ikind, "overlap_admm", qs_force(ikind)%overlap_admm(1:3, i), &
644 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
645 iatom, ikind, " gth_ppl", qs_force(ikind)%gth_ppl(1:3, i), &
646 iatom, ikind, " gth_nlcc", qs_force(ikind)%gth_nlcc(1:3, i), &
647 iatom, ikind, " gth_ppnl", qs_force(ikind)%gth_ppnl(1:3, i), &
648 iatom, ikind, " core_overlap", qs_force(ikind)%core_overlap(1:3, i), &
649 iatom, ikind, " rho_core", qs_force(ikind)%rho_core(1:3, i), &
650 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
651 iatom, ikind, " ch_pulay", qs_force(ikind)%ch_pulay(1:3, i), &
652 iatom, ikind, " fock_4c", qs_force(ikind)%fock_4c(1:3, i), &
653 iatom, ikind, " mp2_non_sep", qs_force(ikind)%mp2_non_sep(1:3, i), &
654 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
655 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
656 END DO
657 CASE (4)
658 DO iatom = 1, natom
659 ikind = kind_of(iatom)
660 i = atom_of_kind(iatom)
661 WRITE (unit=output_unit, fmt=fmtstr2) &
662 iatom, ikind, " all_potential", qs_force(ikind)%all_potential(1:3, i), &
663 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
664 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
665 iatom, ikind, " repulsive", qs_force(ikind)%repulsive(1:3, i), &
666 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
667 iatom, ikind, " efield", qs_force(ikind)%efield(1:3, i), &
668 iatom, ikind, " ehrenfest", qs_force(ikind)%ehrenfest(1:3, i), &
669 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
670 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
671 END DO
672 CASE (5)
673 DO iatom = 1, natom
674 ikind = kind_of(iatom)
675 i = atom_of_kind(iatom)
676 WRITE (unit=output_unit, fmt=fmtstr2) &
677 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
678 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
679 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
680 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
681 iatom, ikind, " all potential", qs_force(ikind)%all_potential(1:3, i), &
682 iatom, ikind, " other", qs_force(ikind)%other(1:3, i), &
683 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
684 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
685 END DO
686 END SELECT
687
688 WRITE (unit=output_unit, fmt=fmtstr3) "Sum of total", grand_total(1:3)
689
690 DEALLOCATE (atom_of_kind)
691 DEALLOCATE (kind_of)
692
693 END IF
694
695 END SUBROUTINE write_forces
696
697END MODULE qs_force
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
DBCSR operations in CP2K.
DBCSR output in CP2K.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers)
...
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Add the DFT+U contribution to the Hamiltonian matrix.
Definition dft_plus_u.F:18
subroutine, public plus_u(qs_env, matrix_h, matrix_w)
Add the DFT+U contribution to the Hamiltonian matrix. Wrapper routine for all "+U" methods.
Definition dft_plus_u.F:103
Types needed for a for a Energy Correction.
all routins needed for a nonperiodic electric field
subroutine, public calculate_ecore_efield(qs_env, calculate_forces)
Computes the force and the energy due to a efield on the cores Note: In the velocity gauge,...
subroutine, public efield_potential_lengh_gauge(qs_env)
Replace the original implementation of the electric-electronic interaction in the length gauge....
Routines for an energy correction on top of a Kohn-Sham calculation.
subroutine, public energy_correction(qs_env, ec_init, calculate_forces)
Energy Correction to a Kohn-Sham simulation Available energy corrections: (1) Harris energy functiona...
Routines for total energy and forces of excited states.
subroutine, public excited_state_energy(qs_env, calculate_forces)
Excited state energy and forces.
Routines to calculate EXX in RPA and energy correction methods.
Definition hfx_exx.F:16
subroutine, public calculate_exx(qs_env, unit_nr, hfx_sections, x_data, do_gw, do_admm, calc_forces, reuse_hfx, do_im_time, e_ex_from_gw, e_admm_from_gw, t3)
...
Definition hfx_exx.F:106
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public ri_rpa_method_gpw
integer, parameter, public ri_mp2_method_gpw
integer, parameter, public ri_mp2_laplace
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_get(section_vals, ref_count, n_repetition, n_subs_vals_rep, section, explicit)
returns various attributes about the section_vals
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
Interface to the message passing library MPI.
Routines to calculate CPHF like update and solve Z-vector equation for MP2 gradients (only GPW)
Definition mp2_cphf.F:14
subroutine, public update_mp2_forces(qs_env)
...
Definition mp2_cphf.F:1282
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Definition mulliken.F:13
subroutine, public mulliken_restraint(mulliken_restraint_control, para_env, s_matrix, p_matrix, energy, order_p, ks_matrix, w_matrix)
computes the energy and density matrix derivate of a constraint on the mulliken charges
Definition mulliken.F:73
Define the data structure for the particle information.
Calculation of the energies concerning the core charge distribution.
subroutine, public calculate_ecore_overlap(qs_env, para_env, calculate_forces, molecular, e_overlap_core, atecc)
Calculate the overlap energy of the core charge distribution.
subroutine, public calculate_ecore_self(qs_env, e_self_core, atecc)
Calculate the self energy of the core charge distribution.
Calculation of the core Hamiltonian integral matrix <a|H|b> over Cartesian Gaussian-type functions.
subroutine, public build_core_hamiltonian_matrix(qs_env, calculate_forces)
Cosntruction of the QS Core Hamiltonian Matrix.
Calculation of dispersion in DFTB.
subroutine, public calculate_dftb_dispersion(qs_env, para_env, calculate_forces)
...
Calculation of Overlap and Hamiltonian matrices in DFTB.
subroutine, public build_dftb_matrices(qs_env, para_env, calculate_forces)
...
Perform a QUICKSTEP wavefunction optimization (single point)
Definition qs_energy.F:14
subroutine, public qs_energies(qs_env, consistent_energies, calc_forces)
Driver routine for QUICKSTEP single point wavefunction optimization.
Definition qs_energy.F:70
qs_environment methods that use many other modules
subroutine, public qs_env_rebuild_pw_env(qs_env)
rebuilds the pw_env in the given qs_env, allocating it if necessary
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Routines to handle an external electrostatic field The external field can be generic and is provided ...
subroutine, public external_c_potential(qs_env, calculate_forces)
Computes the force and the energy due to the external potential on the cores.
subroutine, public external_e_potential(qs_env)
Computes the external potential on the grid.
subroutine, public replicate_qs_force(qs_force, para_env)
Replicate and sum up the force.
subroutine, public zero_qs_force(qs_force)
Initialize a Quickstep force data structure.
subroutine, public allocate_qs_force(qs_force, natom_of_kind)
Allocate a Quickstep force data structure.
Quickstep force driver routine.
Definition qs_force.F:12
subroutine, public qs_calc_energy_force(qs_env, calc_force, consistent_energies, linres)
...
Definition qs_force.F:109
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Utility routines for qs_scf.
subroutine, public qs_scf_compute_properties(qs_env, wf_type, do_mp2)
computes properties for a given hamilonian using the current wfn
types that represent a quickstep subsys
subroutine, public qs_subsys_set(subsys, cp_subsys, local_particles, local_molecules, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, nelectron_total, nelectron_spin)
...
Calculates integral matrices for RIGPW method.
subroutine, public build_ri_matrices(lri_env, qs_env, calculate_forces)
creates and initializes an lri_env
Routines needed for EMD.
subroutine, public rt_admm_force(qs_env)
...
subroutine, public calc_c_mat_force(qs_env)
calculates the three additional force contributions needed in EMD P_imag*C , P_imag*B*S^-1*S_der ,...
Routines to perform the RTP in the velocity gauge.
subroutine, public velocity_gauge_nl_force(qs_env, particle_set)
Calculate the force associated to non-local pseudo potential in the velocity gauge.
subroutine, public velocity_gauge_ks_matrix(qs_env, subtract_nl_term)
...
Split and build its own idependent core_core SE interaction module.
subroutine, public se_core_core_interaction(qs_env, para_env, calculate_forces)
Evaluates the core-core interactions for NDDO methods.
Calculation of the Hamiltonian integral matrix <a|H|b> for semi-empirical methods.
subroutine, public build_se_core_matrix(qs_env, para_env, calculate_forces)
...
interface to tblite
subroutine, public build_tblite_matrices(qs_env, calculate_forces)
...
subroutine, public tb_reference_cli_compare(qs_env)
Run native tblite CLI and compare against CP2K/tblite.
subroutine, public symmetrize_virial(virial)
Symmetrize the virial components.
Calculation of Overlap and Hamiltonian matrices in xTB Reference: Stefan Grimme, Christoph Bannwarth,...
subroutine, public build_xtb_matrices(qs_env, calculate_forces)
...
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information on the energy correction functional for KG.
stores all the informations relevant to an mpi environment
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.