(git:b5558c7)
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-2025 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,&
84#include "./base/base_uses.f90"
85
86 IMPLICIT NONE
87
88 PRIVATE
89
90! *** Global parameters ***
91
92 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_force'
93
94! *** Public subroutines ***
95
96 PUBLIC :: qs_calc_energy_force
97
98CONTAINS
99
100! **************************************************************************************************
101!> \brief ...
102!> \param qs_env ...
103!> \param calc_force ...
104!> \param consistent_energies ...
105!> \param linres ...
106! **************************************************************************************************
107 SUBROUTINE qs_calc_energy_force(qs_env, calc_force, consistent_energies, linres)
108 TYPE(qs_environment_type), POINTER :: qs_env
109 LOGICAL :: calc_force, consistent_energies, linres
110
111 qs_env%linres_run = linres
112 IF (calc_force) THEN
113 CALL qs_forces(qs_env)
114 ELSE
115 CALL qs_energies(qs_env, calc_forces=.false., &
116 consistent_energies=consistent_energies)
117 END IF
118
119 END SUBROUTINE qs_calc_energy_force
120
121! **************************************************************************************************
122!> \brief Calculate the Quickstep forces.
123!> \param qs_env ...
124!> \date 29.10.2002
125!> \author MK
126!> \version 1.0
127! **************************************************************************************************
128 SUBROUTINE qs_forces(qs_env)
129
130 TYPE(qs_environment_type), POINTER :: qs_env
131
132 CHARACTER(len=*), PARAMETER :: routinen = 'qs_forces'
133
134 INTEGER :: after, handle, i, iatom, ic, ikind, &
135 ispin, iw, natom, nkind, nspin, &
136 output_unit
137 INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of, natom_of_kind
138 LOGICAL :: do_admm, do_exx, do_gw, do_im_time, &
139 has_unit_metric, omit_headers, &
140 perform_ec, reuse_hfx
141 REAL(dp) :: dummy_real, dummy_real2(2)
142 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
143 TYPE(cp_logger_type), POINTER :: logger
144 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: matrix_s, matrix_w, rho_ao
145 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_w_kp
146 TYPE(dft_control_type), POINTER :: dft_control
147 TYPE(energy_correction_type), POINTER :: ec_env
148 TYPE(lri_environment_type), POINTER :: lri_env
149 TYPE(mp_para_env_type), POINTER :: para_env
150 TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
151 TYPE(qs_energy_type), POINTER :: energy
152 TYPE(qs_force_type), DIMENSION(:), POINTER :: force
153 TYPE(qs_ks_env_type), POINTER :: ks_env
154 TYPE(qs_rho_type), POINTER :: rho
155 TYPE(qs_subsys_type), POINTER :: subsys
156 TYPE(section_vals_type), POINTER :: hfx_sections, print_section
157 TYPE(virial_type), POINTER :: virial
158
159 CALL timeset(routinen, handle)
160 NULLIFY (logger)
161 logger => cp_get_default_logger()
162
163 ! rebuild plane wave environment
164 CALL qs_env_rebuild_pw_env(qs_env)
165
166 ! zero out the forces in particle set
167 CALL get_qs_env(qs_env, particle_set=particle_set)
168 natom = SIZE(particle_set)
169 DO iatom = 1, natom
170 particle_set(iatom)%f = 0.0_dp
171 END DO
172
173 ! get atom mapping
174 NULLIFY (atomic_kind_set)
175 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
176 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, &
177 atom_of_kind=atom_of_kind, &
178 kind_of=kind_of)
179
180 NULLIFY (force, subsys, dft_control)
181 CALL get_qs_env(qs_env, &
182 force=force, &
183 subsys=subsys, &
184 dft_control=dft_control)
185 IF (.NOT. ASSOCIATED(force)) THEN
186 ! *** Allocate the force data structure ***
187 nkind = SIZE(atomic_kind_set)
188 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, natom_of_kind=natom_of_kind)
189 CALL allocate_qs_force(force, natom_of_kind)
190 DEALLOCATE (natom_of_kind)
191 CALL qs_subsys_set(subsys, force=force)
192 END IF
193 CALL zero_qs_force(force)
194
195 ! Check if CDFT potential is needed and save it until forces have been calculated
196 IF (dft_control%qs_control%cdft) THEN
197 dft_control%qs_control%cdft_control%save_pot = .true.
198 END IF
199
200 ! recalculate energy and the response vector for the Z-vector linear equation system if calc_force = .true.
201 CALL qs_energies(qs_env, calc_forces=.true.)
202
203 NULLIFY (para_env)
204 CALL get_qs_env(qs_env, &
205 para_env=para_env)
206
207 ! Now we handle some special cases
208 ! Maybe some of these would be better dealt with in qs_energies?
209 IF (qs_env%run_rtp) THEN
210 NULLIFY (matrix_w, matrix_s, ks_env)
211 CALL get_qs_env(qs_env, &
212 ks_env=ks_env, &
213 matrix_w=matrix_w, &
214 matrix_s=matrix_s)
215 CALL dbcsr_allocate_matrix_set(matrix_w, dft_control%nspins)
216 DO ispin = 1, dft_control%nspins
217 ALLOCATE (matrix_w(ispin)%matrix)
218 CALL dbcsr_copy(matrix_w(ispin)%matrix, matrix_s(1)%matrix, &
219 name="W MATRIX")
220 CALL dbcsr_set(matrix_w(ispin)%matrix, 0.0_dp)
221 END DO
222 CALL set_ks_env(ks_env, matrix_w=matrix_w)
223
224 CALL calc_c_mat_force(qs_env)
225 IF (dft_control%do_admm) CALL rt_admm_force(qs_env)
226 IF (dft_control%rtp_control%velocity_gauge .AND. dft_control%rtp_control%nl_gauge_transform) &
227 CALL velocity_gauge_nl_force(qs_env, particle_set)
228 END IF
229 ! from an eventual Mulliken restraint
230 IF (dft_control%qs_control%mulliken_restraint) THEN
231 NULLIFY (matrix_w, matrix_s, rho)
232 CALL get_qs_env(qs_env, &
233 matrix_w=matrix_w, &
234 matrix_s=matrix_s, &
235 rho=rho)
236 NULLIFY (rho_ao)
237 CALL qs_rho_get(rho, rho_ao=rho_ao)
238 CALL mulliken_restraint(dft_control%qs_control%mulliken_restraint_control, &
239 para_env, matrix_s(1)%matrix, rho_ao, w_matrix=matrix_w)
240 END IF
241 ! Add non-Pulay contribution of DFT+U to W matrix, since it has also to be
242 ! digested with overlap matrix derivatives
243 IF (dft_control%dft_plus_u) THEN
244 NULLIFY (matrix_w)
245 CALL get_qs_env(qs_env, matrix_w=matrix_w)
246 CALL plus_u(qs_env=qs_env, matrix_w=matrix_w)
247 END IF
248
249 ! Write W Matrix to output (if requested)
250 CALL get_qs_env(qs_env, has_unit_metric=has_unit_metric)
251 IF (.NOT. has_unit_metric) THEN
252 NULLIFY (matrix_w_kp)
253 CALL get_qs_env(qs_env, matrix_w_kp=matrix_w_kp)
254 nspin = SIZE(matrix_w_kp, 1)
255 DO ispin = 1, nspin
256 IF (btest(cp_print_key_should_output(logger%iter_info, &
257 qs_env%input, "DFT%PRINT%AO_MATRICES/W_MATRIX"), cp_p_file)) THEN
258 iw = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%AO_MATRICES/W_MATRIX", &
259 extension=".Log")
260 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%NDIGITS", i_val=after)
261 CALL section_vals_val_get(qs_env%input, "DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
262 after = min(max(after, 1), 16)
263 DO ic = 1, SIZE(matrix_w_kp, 2)
264 CALL cp_dbcsr_write_sparse_matrix(matrix_w_kp(ispin, ic)%matrix, 4, after, qs_env, &
265 para_env, output_unit=iw, omit_headers=omit_headers)
266 END DO
267 CALL cp_print_key_finished_output(iw, logger, qs_env%input, &
268 "DFT%PRINT%AO_MATRICES/W_MATRIX")
269 END IF
270 END DO
271 END IF
272
273 ! Check if energy correction should be skipped
274 perform_ec = .false.
275 IF (qs_env%energy_correction) THEN
276 CALL get_qs_env(qs_env, ec_env=ec_env)
277 IF (.NOT. ec_env%do_skip) perform_ec = .true.
278 END IF
279
280 ! Compute core forces (also overwrites matrix_w)
281 IF (dft_control%qs_control%semi_empirical) THEN
282 CALL build_se_core_matrix(qs_env=qs_env, para_env=para_env, &
283 calculate_forces=.true.)
284 CALL se_core_core_interaction(qs_env, para_env, calculate_forces=.true.)
285 ELSEIF (dft_control%qs_control%dftb) THEN
286 CALL build_dftb_matrices(qs_env=qs_env, para_env=para_env, &
287 calculate_forces=.true.)
288 CALL calculate_dftb_dispersion(qs_env=qs_env, para_env=para_env, &
289 calculate_forces=.true.)
290 ELSEIF (dft_control%qs_control%xtb) THEN
291 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
292 CALL build_tblite_matrices(qs_env=qs_env, calculate_forces=.true.)
293 ELSE
294 CALL build_xtb_matrices(qs_env=qs_env, calculate_forces=.true.)
295 END IF
296 ELSEIF (perform_ec) THEN
297 ! Calculates core and grid based forces
298 CALL energy_correction(qs_env, ec_init=.false., calculate_forces=.true.)
299 ELSE
300 ! Dispersion energy and forces are calculated in qs_energy?
301 CALL build_core_hamiltonian_matrix(qs_env=qs_env, calculate_forces=.true.)
302 ! The above line reset the core H, which should be re-updated in case a TD field is applied:
303 IF (qs_env%run_rtp) THEN
304 IF (dft_control%apply_efield_field) &
306 IF (dft_control%rtp_control%velocity_gauge) &
307 CALL velocity_gauge_ks_matrix(qs_env, subtract_nl_term=.false.)
308
309 END IF
310 CALL calculate_ecore_self(qs_env)
311 CALL calculate_ecore_overlap(qs_env, para_env, calculate_forces=.true.)
312 CALL calculate_ecore_efield(qs_env, calculate_forces=.true.)
313 !swap external_e_potential before external_c_potential, to ensure
314 !that external potential on grid is loaded before calculating energy of cores
315 CALL external_e_potential(qs_env)
316 IF (.NOT. dft_control%qs_control%gapw) THEN
317 CALL external_c_potential(qs_env, calculate_forces=.true.)
318 END IF
319 ! RIGPW matrices
320 IF (dft_control%qs_control%rigpw) THEN
321 CALL get_qs_env(qs_env=qs_env, lri_env=lri_env)
322 CALL build_ri_matrices(lri_env, qs_env, calculate_forces=.true.)
323 END IF
324 END IF
325
326 ! MP2 Code
327 IF (ASSOCIATED(qs_env%mp2_env)) THEN
328 NULLIFY (energy)
329 CALL get_qs_env(qs_env, energy=energy)
330 CALL qs_scf_compute_properties(qs_env, wf_type='MP2 ', do_mp2=.true.)
331 CALL qs_ks_update_qs_env(qs_env, just_energy=.true.)
332 energy%total = energy%total + energy%mp2
333
334 IF ((qs_env%mp2_env%method == ri_mp2_method_gpw .OR. qs_env%mp2_env%method == ri_mp2_laplace .OR. &
335 qs_env%mp2_env%method == ri_rpa_method_gpw) &
336 .AND. .NOT. qs_env%mp2_env%do_im_time) THEN
337 CALL update_mp2_forces(qs_env)
338 END IF
339
340 !RPA EXX energy and forces
341 IF (qs_env%mp2_env%method == ri_rpa_method_gpw) THEN
342 do_exx = .false.
343 hfx_sections => section_vals_get_subs_vals(qs_env%input, "DFT%XC%WF_CORRELATION%RI_RPA%HF")
344 CALL section_vals_get(hfx_sections, explicit=do_exx)
345 IF (do_exx) THEN
346 do_gw = qs_env%mp2_env%ri_rpa%do_ri_g0w0
347 do_admm = qs_env%mp2_env%ri_rpa%do_admm
348 reuse_hfx = qs_env%mp2_env%ri_rpa%reuse_hfx
349 do_im_time = qs_env%mp2_env%do_im_time
350 output_unit = cp_logger_get_default_io_unit()
351 dummy_real = 0.0_dp
352
353 CALL calculate_exx(qs_env=qs_env, &
354 unit_nr=output_unit, &
355 hfx_sections=hfx_sections, &
356 x_data=qs_env%mp2_env%ri_rpa%x_data, &
357 do_gw=do_gw, &
358 do_admm=do_admm, &
359 calc_forces=.true., &
360 reuse_hfx=reuse_hfx, &
361 do_im_time=do_im_time, &
362 e_ex_from_gw=dummy_real, &
363 e_admm_from_gw=dummy_real2, &
364 t3=dummy_real)
365 END IF
366 END IF
367 ELSEIF (perform_ec) THEN
368 ! energy correction forces postponed
369 ELSEIF (qs_env%harris_method) THEN
370 ! Harris method forces already done in harris_energy_correction
371 ELSE
372 ! Compute grid-based forces
373 CALL qs_ks_update_qs_env(qs_env, calculate_forces=.true.)
374 END IF
375
376 ! Excited state forces
377 ! Solve the response linear equation system for the Z-vector method
378 ! and calculate remaining terms of the force
379 CALL excited_state_energy(qs_env, calculate_forces=.true.)
380
381 ! replicate forces (get current pointer)
382 NULLIFY (force)
383 CALL get_qs_env(qs_env=qs_env, force=force)
384 CALL replicate_qs_force(force, para_env)
385
386 DO iatom = 1, natom
387 ikind = kind_of(iatom)
388 i = atom_of_kind(iatom)
389 ! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
390 ! the force is - dE/dR, what is called force is actually the gradient
391 ! Things should have the right name
392 ! The minus sign below is a hack
393 ! XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
394 force(ikind)%other(1:3, i) = -particle_set(iatom)%f(1:3) + force(ikind)%ch_pulay(1:3, i)
395 force(ikind)%total(1:3, i) = force(ikind)%total(1:3, i) + force(ikind)%other(1:3, i)
396 particle_set(iatom)%f = -force(ikind)%total(1:3, i)
397 END DO
398
399 NULLIFY (virial, energy)
400 CALL get_qs_env(qs_env=qs_env, virial=virial, energy=energy)
401 IF (virial%pv_availability) THEN
402 CALL para_env%sum(virial%pv_overlap)
403 CALL para_env%sum(virial%pv_ekinetic)
404 CALL para_env%sum(virial%pv_ppl)
405 CALL para_env%sum(virial%pv_ppnl)
406 CALL para_env%sum(virial%pv_ecore_overlap)
407 CALL para_env%sum(virial%pv_ehartree)
408 CALL para_env%sum(virial%pv_exc)
409 CALL para_env%sum(virial%pv_exx)
410 CALL para_env%sum(virial%pv_vdw)
411 CALL para_env%sum(virial%pv_mp2)
412 CALL para_env%sum(virial%pv_nlcc)
413 CALL para_env%sum(virial%pv_gapw)
414 CALL para_env%sum(virial%pv_lrigpw)
415 CALL para_env%sum(virial%pv_virial)
416 CALL symmetrize_virial(virial)
417 ! Add the volume terms of the virial
418 IF ((.NOT. virial%pv_numer) .AND. &
419 (.NOT. (dft_control%qs_control%dftb .OR. &
420 dft_control%qs_control%xtb .OR. &
421 dft_control%qs_control%semi_empirical))) THEN
422
423 ! Harris energy correction requires volume terms from
424 ! 1) Harris functional contribution, and
425 ! 2) Linear Response solver
426 IF (perform_ec) THEN
427 CALL get_qs_env(qs_env, ec_env=ec_env)
428 energy%hartree = ec_env%ehartree
429 energy%exc = ec_env%exc
430 IF (dft_control%do_admm) THEN
431 energy%exc_aux_fit = ec_env%exc_aux_fit
432 END IF
433 END IF
434 DO i = 1, 3
435 virial%pv_ehartree(i, i) = virial%pv_ehartree(i, i) &
436 - 2.0_dp*(energy%hartree + energy%sccs_pol)
437 virial%pv_virial(i, i) = virial%pv_virial(i, i) - energy%exc &
438 - 2.0_dp*(energy%hartree + energy%sccs_pol)
439 virial%pv_exc(i, i) = virial%pv_exc(i, i) - energy%exc
440 IF (dft_control%do_admm) THEN
441 virial%pv_exc(i, i) = virial%pv_exc(i, i) - energy%exc_aux_fit
442 virial%pv_virial(i, i) = virial%pv_virial(i, i) - energy%exc_aux_fit
443 END IF
444 ! The factor 2 is a hack. It compensates the plus sign in h_stress/pw_poisson_solve.
445 ! The sign in pw_poisson_solve is correct for FIST, but not for QS.
446 ! There should be a more elegant solution to that ...
447 END DO
448 END IF
449 END IF
450
451 output_unit = cp_print_key_unit_nr(logger, qs_env%input, "DFT%PRINT%DERIVATIVES", &
452 extension=".Log")
453 print_section => section_vals_get_subs_vals(qs_env%input, "DFT%PRINT%DERIVATIVES")
454 IF (dft_control%qs_control%semi_empirical) THEN
455 CALL write_forces(force, atomic_kind_set, 2, output_unit=output_unit, &
456 print_section=print_section)
457 ELSE IF (dft_control%qs_control%dftb) THEN
458 CALL write_forces(force, atomic_kind_set, 4, output_unit=output_unit, &
459 print_section=print_section)
460 ELSE IF (dft_control%qs_control%xtb) THEN
461 CALL write_forces(force, atomic_kind_set, 4, output_unit=output_unit, &
462 print_section=print_section)
463 ELSE IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc) THEN
464 CALL write_forces(force, atomic_kind_set, 1, output_unit=output_unit, &
465 print_section=print_section)
466 ELSE
467 CALL write_forces(force, atomic_kind_set, 0, output_unit=output_unit, &
468 print_section=print_section)
469 END IF
470 CALL cp_print_key_finished_output(output_unit, logger, qs_env%input, &
471 "DFT%PRINT%DERIVATIVES")
472
473 ! deallocate W Matrix:
474 NULLIFY (ks_env, matrix_w_kp)
475 CALL get_qs_env(qs_env=qs_env, &
476 matrix_w_kp=matrix_w_kp, &
477 ks_env=ks_env)
478 CALL dbcsr_deallocate_matrix_set(matrix_w_kp)
479 NULLIFY (matrix_w_kp)
480 CALL set_ks_env(ks_env, matrix_w_kp=matrix_w_kp)
481
482 DEALLOCATE (atom_of_kind, kind_of)
483
484 CALL timestop(handle)
485
486 END SUBROUTINE qs_forces
487
488! **************************************************************************************************
489!> \brief Write a Quickstep force data structure to output unit
490!> \param qs_force ...
491!> \param atomic_kind_set ...
492!> \param ftype ...
493!> \param output_unit ...
494!> \param print_section ...
495!> \date 05.06.2002
496!> \author MK
497!> \version 1.0
498! **************************************************************************************************
499 SUBROUTINE write_forces(qs_force, atomic_kind_set, ftype, output_unit, &
500 print_section)
501
502 TYPE(qs_force_type), DIMENSION(:), POINTER :: qs_force
503 TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
504 INTEGER, INTENT(IN) :: ftype, output_unit
505 TYPE(section_vals_type), POINTER :: print_section
506
507 CHARACTER(LEN=13) :: fmtstr5
508 CHARACTER(LEN=15) :: fmtstr4
509 CHARACTER(LEN=20) :: fmtstr3
510 CHARACTER(LEN=35) :: fmtstr2
511 CHARACTER(LEN=48) :: fmtstr1
512 INTEGER :: i, iatom, ikind, my_ftype, natom, ndigits
513 INTEGER, ALLOCATABLE, DIMENSION(:) :: atom_of_kind, kind_of
514 REAL(kind=dp), DIMENSION(3) :: grand_total
515
516 IF (output_unit > 0) THEN
517
518 IF (.NOT. ASSOCIATED(qs_force)) THEN
519 CALL cp_abort(__location__, &
520 "The qs_force pointer is not associated "// &
521 "and cannot be printed")
522 END IF
523
524 CALL get_atomic_kind_set(atomic_kind_set=atomic_kind_set, atom_of_kind=atom_of_kind, &
525 kind_of=kind_of, natom=natom)
526
527 ! Variable precision output of the forces
528 CALL section_vals_val_get(print_section, "NDIGITS", &
529 i_val=ndigits)
530
531 fmtstr1 = "(/,/,T2,A,/,/,T3,A,T11,A,T23,A,T40,A1,2( X,A1))"
532 WRITE (unit=fmtstr1(41:42), fmt="(I2)") ndigits + 5
533
534 fmtstr2 = "(/,(T2,I5,4X,I4,T18,A,T34,3F . ))"
535 WRITE (unit=fmtstr2(32:33), fmt="(I2)") ndigits
536 WRITE (unit=fmtstr2(29:30), fmt="(I2)") ndigits + 6
537
538 fmtstr3 = "(/,T3,A,T34,3F . )"
539 WRITE (unit=fmtstr3(18:19), fmt="(I2)") ndigits
540 WRITE (unit=fmtstr3(15:16), fmt="(I2)") ndigits + 6
541
542 fmtstr4 = "((T34,3F . ))"
543 WRITE (unit=fmtstr4(12:13), fmt="(I2)") ndigits
544 WRITE (unit=fmtstr4(9:10), fmt="(I2)") ndigits + 6
545
546 fmtstr5 = "(/T2,A//T3,A)"
547
548 WRITE (unit=output_unit, fmt=fmtstr1) &
549 "FORCES [a.u.]", "Atom", "Kind", "Component", "X", "Y", "Z"
550
551 grand_total(:) = 0.0_dp
552
553 my_ftype = ftype
554
555 SELECT CASE (my_ftype)
556 CASE DEFAULT
557 DO iatom = 1, natom
558 ikind = kind_of(iatom)
559 i = atom_of_kind(iatom)
560 WRITE (unit=output_unit, fmt=fmtstr2) &
561 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
562 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
563 END DO
564 CASE (0)
565 DO iatom = 1, natom
566 ikind = kind_of(iatom)
567 i = atom_of_kind(iatom)
568 WRITE (unit=output_unit, fmt=fmtstr2) &
569 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
570 iatom, ikind, " overlap_admm", qs_force(ikind)%overlap_admm(1:3, i), &
571 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
572 iatom, ikind, " gth_ppl", qs_force(ikind)%gth_ppl(1:3, i), &
573 iatom, ikind, " gth_nlcc", qs_force(ikind)%gth_nlcc(1:3, i), &
574 iatom, ikind, " gth_ppnl", qs_force(ikind)%gth_ppnl(1:3, i), &
575 iatom, ikind, " core_overlap", qs_force(ikind)%core_overlap(1:3, i), &
576 iatom, ikind, " rho_core", qs_force(ikind)%rho_core(1:3, i), &
577 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
578 iatom, ikind, " rho_lri_elec", qs_force(ikind)%rho_lri_elec(1:3, i), &
579 iatom, ikind, " ch_pulay", qs_force(ikind)%ch_pulay(1:3, i), &
580 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
581 iatom, ikind, " gCP", qs_force(ikind)%gcp(1:3, i), &
582 iatom, ikind, " other", qs_force(ikind)%other(1:3, i), &
583 iatom, ikind, " fock_4c", qs_force(ikind)%fock_4c(1:3, i), &
584 iatom, ikind, " ehrenfest", qs_force(ikind)%ehrenfest(1:3, i), &
585 iatom, ikind, " efield", qs_force(ikind)%efield(1:3, i), &
586 iatom, ikind, " eev", qs_force(ikind)%eev(1:3, i), &
587 iatom, ikind, " mp2_non_sep", qs_force(ikind)%mp2_non_sep(1:3, i), &
588 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
589 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
590 END DO
591 CASE (1)
592 DO iatom = 1, natom
593 ikind = kind_of(iatom)
594 i = atom_of_kind(iatom)
595 WRITE (unit=output_unit, fmt=fmtstr2) &
596 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
597 iatom, ikind, " overlap_admm", qs_force(ikind)%overlap_admm(1:3, i), &
598 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
599 iatom, ikind, " gth_ppl", qs_force(ikind)%gth_ppl(1:3, i), &
600 iatom, ikind, " gth_nlcc", qs_force(ikind)%gth_nlcc(1:3, i), &
601 iatom, ikind, " gth_ppnl", qs_force(ikind)%gth_ppnl(1:3, i), &
602 iatom, ikind, " all_potential", qs_force(ikind)%all_potential(1:3, i), &
603 iatom, ikind, "cneo_potential", qs_force(ikind)%cneo_potential(1:3, i), &
604 iatom, ikind, " core_overlap", qs_force(ikind)%core_overlap(1:3, i), &
605 iatom, ikind, " rho_core", qs_force(ikind)%rho_core(1:3, i), &
606 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
607 iatom, ikind, " rho_lri_elec", qs_force(ikind)%rho_lri_elec(1:3, i), &
608 iatom, ikind, " rho_cneo_nuc", qs_force(ikind)%rho_cneo_nuc(1:3, i), &
609 iatom, ikind, " vhxc_atom", qs_force(ikind)%vhxc_atom(1:3, i), &
610 iatom, ikind, " g0s_Vh_elec", qs_force(ikind)%g0s_Vh_elec(1:3, i), &
611 iatom, ikind, " ch_pulay", qs_force(ikind)%ch_pulay(1:3, i), &
612 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
613 iatom, ikind, " gCP", qs_force(ikind)%gcp(1:3, i), &
614 iatom, ikind, " fock_4c", qs_force(ikind)%fock_4c(1:3, i), &
615 iatom, ikind, " ehrenfest", qs_force(ikind)%ehrenfest(1:3, i), &
616 iatom, ikind, " efield", qs_force(ikind)%efield(1:3, i), &
617 iatom, ikind, " eev", qs_force(ikind)%eev(1:3, i), &
618 iatom, ikind, " mp2_non_sep", qs_force(ikind)%mp2_non_sep(1:3, i), &
619 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
620 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
621 END DO
622 CASE (2)
623 DO iatom = 1, natom
624 ikind = kind_of(iatom)
625 i = atom_of_kind(iatom)
626 WRITE (unit=output_unit, fmt=fmtstr2) &
627 iatom, ikind, " all_potential", qs_force(ikind)%all_potential(1:3, i), &
628 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
629 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
630 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
631 END DO
632 CASE (3)
633 DO iatom = 1, natom
634 ikind = kind_of(iatom)
635 i = atom_of_kind(iatom)
636 WRITE (unit=output_unit, fmt=fmtstr2) &
637 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
638 iatom, ikind, "overlap_admm", qs_force(ikind)%overlap_admm(1:3, i), &
639 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
640 iatom, ikind, " gth_ppl", qs_force(ikind)%gth_ppl(1:3, i), &
641 iatom, ikind, " gth_nlcc", qs_force(ikind)%gth_nlcc(1:3, i), &
642 iatom, ikind, " gth_ppnl", qs_force(ikind)%gth_ppnl(1:3, i), &
643 iatom, ikind, " core_overlap", qs_force(ikind)%core_overlap(1:3, i), &
644 iatom, ikind, " rho_core", qs_force(ikind)%rho_core(1:3, i), &
645 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
646 iatom, ikind, " ch_pulay", qs_force(ikind)%ch_pulay(1:3, i), &
647 iatom, ikind, " fock_4c", qs_force(ikind)%fock_4c(1:3, i), &
648 iatom, ikind, " mp2_non_sep", qs_force(ikind)%mp2_non_sep(1:3, i), &
649 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
650 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
651 END DO
652 CASE (4)
653 DO iatom = 1, natom
654 ikind = kind_of(iatom)
655 i = atom_of_kind(iatom)
656 WRITE (unit=output_unit, fmt=fmtstr2) &
657 iatom, ikind, " all_potential", qs_force(ikind)%all_potential(1:3, i), &
658 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
659 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
660 iatom, ikind, " repulsive", qs_force(ikind)%repulsive(1:3, i), &
661 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
662 iatom, ikind, " efield", qs_force(ikind)%efield(1:3, i), &
663 iatom, ikind, " ehrenfest", qs_force(ikind)%ehrenfest(1:3, i), &
664 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
665 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
666 END DO
667 CASE (5)
668 DO iatom = 1, natom
669 ikind = kind_of(iatom)
670 i = atom_of_kind(iatom)
671 WRITE (unit=output_unit, fmt=fmtstr2) &
672 iatom, ikind, " overlap", qs_force(ikind)%overlap(1:3, i), &
673 iatom, ikind, " kinetic", qs_force(ikind)%kinetic(1:3, i), &
674 iatom, ikind, " rho_elec", qs_force(ikind)%rho_elec(1:3, i), &
675 iatom, ikind, " dispersion", qs_force(ikind)%dispersion(1:3, i), &
676 iatom, ikind, " all potential", qs_force(ikind)%all_potential(1:3, i), &
677 iatom, ikind, " other", qs_force(ikind)%other(1:3, i), &
678 iatom, ikind, " total", qs_force(ikind)%total(1:3, i)
679 grand_total(1:3) = grand_total(1:3) + qs_force(ikind)%total(1:3, i)
680 END DO
681 END SELECT
682
683 WRITE (unit=output_unit, fmt=fmtstr3) "Sum of total", grand_total(1:3)
684
685 DEALLOCATE (atom_of_kind)
686 DEALLOCATE (kind_of)
687
688 END IF
689
690 END SUBROUTINE write_forces
691
692END 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:99
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, 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, 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:108
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, 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, 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 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.