(git:339af6c)
Loading...
Searching...
No Matches
qs_ks_methods.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 routines that build the Kohn-Sham matrix (i.e calculate the coulomb
10!> and xc parts
11!> \author Fawzi Mohamed
12!> \par History
13!> - 05.2002 moved from qs_scf (see there the history) [fawzi]
14!> - JGH [30.08.02] multi-grid arrays independent from density and potential
15!> - 10.2002 introduced pools, uses updated rho as input,
16!> removed most temporary variables, renamed may vars,
17!> began conversion to LSD [fawzi]
18!> - 10.2004 moved calculate_w_matrix here [Joost VandeVondele]
19!> introduced energy derivative wrt MOs [Joost VandeVondele]
20!> - SCCS implementation (16.10.2013,MK)
21! **************************************************************************************************
32 USE admm_types, ONLY: admm_type,&
34 USE cell_types, ONLY: cell_type
36 USE cp_dbcsr_api, ONLY: &
38 dbcsr_p_type, dbcsr_release, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric, &
39 dbcsr_type_symmetric
43 USE cp_ddapc, ONLY: qs_ks_ddapc
44 USE cp_fm_types, ONLY: cp_fm_type
48 USE cp_output_handling, ONLY: cp_p_file,&
50 USE dft_plus_u, ONLY: plus_u
53 USE hfx_admm_utils, ONLY: hfx_admm_init,&
56 USE input_constants, ONLY: do_ppl_grid,&
64 USE kinds, ONLY: default_string_length,&
65 dp
66 USE kpoint_types, ONLY: get_kpoint_info,&
72 USE mathlib, ONLY: abnormal_value
74 USE pw_env_types, ONLY: pw_env_get,&
76 USE pw_methods, ONLY: pw_axpy,&
77 pw_copy,&
80 pw_scale,&
87 USE pw_types, ONLY: pw_c1d_gs_type,&
104 USE qs_integrate_potential, ONLY: integrate_ppl_rspace,&
105 integrate_rho_nlcc,&
106 integrate_v_core_rspace
110 USE qs_ks_atom, ONLY: update_ks_atom
113 USE qs_ks_types, ONLY: qs_ks_env_type,&
115 USE qs_ks_utils, ONLY: &
120 USE qs_mo_types, ONLY: get_mo_set,&
124 USE qs_rho_types, ONLY: qs_rho_get,&
126 USE qs_sccs, ONLY: sccs
128 USE qs_vxc, ONLY: qs_vxc_create
136 USE virial_types, ONLY: virial_type
138#include "./base/base_uses.f90"
139
140 IMPLICIT NONE
141
142 PRIVATE
143
144 LOGICAL, PARAMETER :: debug_this_module = .true.
145 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ks_methods'
146
149
150CONTAINS
151
152! **************************************************************************************************
153!> \brief routine where the real calculations are made: the
154!> KS matrix is calculated
155!> \param qs_env the qs_env to update
156!> \param calculate_forces if true calculate the quantities needed
157!> to calculate the forces. Defaults to false.
158!> \param just_energy if true updates the energies but not the
159!> ks matrix. Defaults to false
160!> \param print_active ...
161!> \param ext_ks_matrix ...
162!> \param ext_xc_section ...
163!> \par History
164!> 06.2002 moved from qs_scf to qs_ks_methods, use of ks_env
165!> new did_change scheme [fawzi]
166!> 10.2002 introduced pools, uses updated rho as input, LSD [fawzi]
167!> 10.2004 build_kohn_sham matrix now also computes the derivatives
168!> of the total energy wrt to the MO coefs, if instructed to
169!> do so. This appears useful for orbital dependent functionals
170!> where the KS matrix alone (however this might be defined)
171!> does not contain the info to construct this derivative.
172!> \author Matthias Krack
173!> \note
174!> make rho, energy and qs_charges optional, defaulting
175!> to qs_env components?
176! **************************************************************************************************
177 SUBROUTINE qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, &
178 print_active, ext_ks_matrix, ext_xc_section)
179 TYPE(qs_environment_type), POINTER :: qs_env
180 LOGICAL, INTENT(in) :: calculate_forces, just_energy
181 LOGICAL, INTENT(IN), OPTIONAL :: print_active
182 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
183 POINTER :: ext_ks_matrix
184 TYPE(section_vals_type), OPTIONAL, POINTER :: ext_xc_section
185
186 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_ks_build_kohn_sham_matrix'
187
188 CHARACTER(len=default_string_length) :: name
189 INTEGER :: handle, iatom, img, ispin, nimages, &
190 nspins
191 LOGICAL :: do_adiabatic_rescaling, do_ddapc, do_hfx, do_ppl, dokp, gapw, gapw_xc, &
192 just_energy_xc, lrigpw, my_print, rigpw, use_virial
193 REAL(kind=dp) :: ecore_ppl, edisp, ee_ener, ekin_mol, &
194 mulliken_order_p, vscale
195 REAL(kind=dp), DIMENSION(3, 3) :: h_stress, pv_loc
196 TYPE(admm_type), POINTER :: admm_env
197 TYPE(cdft_control_type), POINTER :: cdft_control
198 TYPE(cell_type), POINTER :: cell
199 TYPE(cp_logger_type), POINTER :: logger
200 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ksmat, matrix_vxc, mo_derivs
201 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, ks_matrix_im, matrix_h, &
202 matrix_h_im, matrix_s, my_rho, rho_ao
203 TYPE(dft_control_type), POINTER :: dft_control
204 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
205 TYPE(harris_type), POINTER :: harris_env
206 TYPE(local_rho_type), POINTER :: local_rho_set
207 TYPE(lri_density_type), POINTER :: lri_density
208 TYPE(lri_environment_type), POINTER :: lri_env
209 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
210 TYPE(mp_para_env_type), POINTER :: para_env
211 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, v_hartree_gspace
212 TYPE(pw_c1d_gs_type), POINTER :: rho_core
213 TYPE(pw_env_type), POINTER :: pw_env
214 TYPE(pw_poisson_type), POINTER :: poisson_env
215 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
216 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, v_rspace_embed, v_rspace_new, &
217 v_rspace_new_aux_fit, v_tau_rspace, &
218 v_tau_rspace_aux_fit
219 TYPE(pw_r3d_rs_type), POINTER :: rho0_s_rs, rho_nlcc, rhoz_cneo_s_rs, v_hartree_rspace, &
220 v_sccs_rspace, v_sic_rspace, v_spin_ddapc_rest_r, vee, vppl_rspace
221 TYPE(qs_energy_type), POINTER :: energy
222 TYPE(qs_ks_env_type), POINTER :: ks_env
223 TYPE(qs_rho_type), POINTER :: rho, rho_struct, rho_xc
224 TYPE(section_vals_type), POINTER :: adiabatic_rescaling_section, &
225 hfx_sections, input, scf_section, &
226 xc_section
227 TYPE(virial_type), POINTER :: virial
228
229 CALL timeset(routinen, handle)
230 NULLIFY (admm_env, cell, dft_control, logger, mo_derivs, my_rho, &
231 rho_struct, para_env, pw_env, virial, vppl_rspace, &
232 adiabatic_rescaling_section, hfx_sections, &
233 input, scf_section, xc_section, matrix_h, matrix_h_im, matrix_s, &
234 auxbas_pw_pool, poisson_env, v_rspace_new, v_rspace_new_aux_fit, &
235 v_tau_rspace, v_tau_rspace_aux_fit, matrix_vxc, vee, rho_nlcc, &
236 ks_env, ks_matrix, ks_matrix_im, rho, energy, rho_xc, rho_r, rho_ao, rho_core)
237
238 cpassert(ASSOCIATED(qs_env))
239
240 logger => cp_get_default_logger()
241 my_print = .true.
242 IF (PRESENT(print_active)) my_print = print_active
243
244 CALL get_qs_env(qs_env, &
245 ks_env=ks_env, &
246 dft_control=dft_control, &
247 matrix_h_kp=matrix_h, &
248 matrix_h_im_kp=matrix_h_im, &
249 matrix_s_kp=matrix_s, &
250 matrix_ks_kp=ks_matrix, &
251 matrix_ks_im_kp=ks_matrix_im, &
252 matrix_vxc=matrix_vxc, &
253 pw_env=pw_env, &
254 cell=cell, &
255 para_env=para_env, &
256 input=input, &
257 virial=virial, &
258 v_hartree_rspace=v_hartree_rspace, &
259 vee=vee, &
260 rho_nlcc=rho_nlcc, &
261 rho=rho, &
262 rho_core=rho_core, &
263 rho_xc=rho_xc, &
264 energy=energy)
265
266 CALL qs_rho_get(rho, rho_r=rho_r, rho_ao_kp=rho_ao)
267
268 nimages = dft_control%nimages
269 nspins = dft_control%nspins
270
271 ! remap pointer to allow for non-kpoint external ks matrix
272 IF (PRESENT(ext_ks_matrix)) ks_matrix(1:nspins, 1:1) => ext_ks_matrix(1:nspins)
273
274 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
275
276 adiabatic_rescaling_section => section_vals_get_subs_vals(input, "DFT%XC%ADIABATIC_RESCALING")
277 CALL section_vals_get(adiabatic_rescaling_section, explicit=do_adiabatic_rescaling)
278 just_energy_xc = just_energy
279 IF (do_adiabatic_rescaling) THEN
280 !! If we perform adiabatic rescaling, the xc potential has to be scaled by the xc- and
281 !! HFX-energy. Thus, let us first calculate the energy
282 just_energy_xc = .true.
283 END IF
284
285 cpassert(ASSOCIATED(matrix_h))
286 cpassert(ASSOCIATED(matrix_s))
287 cpassert(ASSOCIATED(rho))
288 cpassert(ASSOCIATED(pw_env))
289 cpassert(SIZE(ks_matrix, 1) > 0)
290 dokp = (nimages > 1)
291
292 ! Setup the possible usage of DDAPC charges
293 do_ddapc = dft_control%qs_control%ddapc_restraint .OR. &
294 qs_env%cp_ddapc_ewald%do_decoupling .OR. &
295 qs_env%cp_ddapc_ewald%do_qmmm_periodic_decpl .OR. &
296 qs_env%cp_ddapc_ewald%do_solvation
297
298 ! Check if LRIGPW is used
299 lrigpw = dft_control%qs_control%lrigpw
300 rigpw = dft_control%qs_control%rigpw
301 IF (rigpw) THEN
302 cpassert(nimages == 1)
303 END IF
304 IF (lrigpw .AND. rigpw) THEN
305 cpabort(" LRI and RI are not compatible")
306 END IF
307
308 ! Check for GAPW method : additional terms for local densities
309 gapw = dft_control%qs_control%gapw
310 gapw_xc = dft_control%qs_control%gapw_xc
311 IF (gapw_xc .AND. gapw) THEN
312 cpabort(" GAPW and GAPW_XC are not compatible")
313 END IF
314 IF ((gapw .AND. lrigpw) .OR. (gapw_xc .AND. lrigpw)) THEN
315 cpabort(" GAPW/GAPW_XC and LRIGPW are not compatible")
316 END IF
317 IF ((gapw .AND. rigpw) .OR. (gapw_xc .AND. rigpw)) THEN
318 cpabort(" GAPW/GAPW_XC and RIGPW are not compatible")
319 END IF
320
321 do_ppl = dft_control%qs_control%do_ppl_method == do_ppl_grid
322 IF (do_ppl) THEN
323 cpassert(.NOT. gapw)
324 CALL get_qs_env(qs_env=qs_env, vppl=vppl_rspace)
325 END IF
326
327 IF (gapw_xc) THEN
328 cpassert(ASSOCIATED(rho_xc))
329 END IF
330
331 ! gets the tmp grids
332 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
333
334 IF (gapw .AND. (poisson_env%parameters%solver == pw_poisson_implicit)) THEN
335 cpabort("The implicit Poisson solver cannot be used in conjunction with GAPW.")
336 END IF
337
338 ! *** Prepare densities for gapw ***
339 IF (gapw .OR. gapw_xc) THEN
340 CALL prepare_gapw_den(qs_env, do_rho0=(.NOT. gapw_xc))
341 END IF
342
343 ! Calculate the Hartree potential
344 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
345 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
346
347 scf_section => section_vals_get_subs_vals(input, "DFT%SCF")
348 IF (btest(cp_print_key_should_output(logger%iter_info, scf_section, &
349 "PRINT%DETAILED_ENERGY"), &
350 cp_p_file) .AND. &
351 (.NOT. gapw) .AND. (.NOT. gapw_xc) .AND. &
352 (.NOT. (poisson_env%parameters%solver == pw_poisson_implicit))) THEN
353 CALL pw_zero(rho_tot_gspace)
354 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density=.true.)
355 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, energy%e_hartree, &
356 v_hartree_gspace)
357 CALL pw_zero(rho_tot_gspace)
358 CALL pw_zero(v_hartree_gspace)
359 END IF
360
361 ! Get the total density in g-space [ions + electrons]
362 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
363
364 IF (my_print) THEN
365 CALL print_densities(qs_env, rho)
366 END IF
367
368 IF (dft_control%do_sccs) THEN
369 ! Self-consistent continuum solvation (SCCS) model
370 NULLIFY (v_sccs_rspace)
371 ALLOCATE (v_sccs_rspace)
372 CALL auxbas_pw_pool%create_pw(v_sccs_rspace)
373
374 IF (poisson_env%parameters%solver == pw_poisson_implicit) THEN
375 cpabort("The implicit Poisson solver cannot be used together with SCCS.")
376 END IF
377
378 IF (use_virial .AND. calculate_forces) THEN
379 CALL sccs(qs_env, rho_tot_gspace, v_hartree_gspace, v_sccs_rspace, &
380 h_stress=h_stress)
381 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
382 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
383 ELSE
384 CALL sccs(qs_env, rho_tot_gspace, v_hartree_gspace, v_sccs_rspace)
385 END IF
386 ELSE
387 ! Getting the Hartree energy and Hartree potential. Also getting the stress tensor
388 ! from the Hartree term if needed. No nuclear force information here
389 IF (use_virial .AND. calculate_forces) THEN
390 h_stress(:, :) = 0.0_dp
391 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, energy%hartree, &
392 v_hartree_gspace, h_stress=h_stress, &
393 rho_core=rho_core)
394 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
395 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
396 ELSE
397 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, energy%hartree, &
398 v_hartree_gspace, rho_core=rho_core)
399 END IF
400 END IF
401
402 ! In case decouple periodic images and/or apply restraints to charges
403 IF (do_ddapc) THEN
404 CALL qs_ks_ddapc(qs_env, auxbas_pw_pool, rho_tot_gspace, v_hartree_gspace, &
405 v_spin_ddapc_rest_r, energy, calculate_forces, ks_matrix, &
406 just_energy)
407 ELSE
408 dft_control%qs_control%ddapc_explicit_potential = .false.
409 dft_control%qs_control%ddapc_restraint_is_spin = .false.
410 IF (.NOT. just_energy) THEN
411 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
412 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
413 END IF
414 END IF
415 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
416
417 IF (dft_control%correct_surf_dip) THEN
418 IF (dft_control%surf_dip_correct_switch) THEN
419 CALL calc_dipsurf_potential(qs_env, energy)
420 energy%hartree = energy%hartree + energy%surf_dipole
421 END IF
422 END IF
423
424 ! SIC
425 CALL calc_v_sic_rspace(v_sic_rspace, energy, qs_env, dft_control, rho, poisson_env, &
426 just_energy, calculate_forces, auxbas_pw_pool)
427
428 ! Check if CDFT constraint is needed
429 CALL qs_ks_cdft_constraint(qs_env, auxbas_pw_pool, calculate_forces, cdft_control)
430
431 ! Adds the External Potential if requested
432 IF (dft_control%apply_external_potential) THEN
433 ! Compute the energy due to the external potential
434 ee_ener = 0.0_dp
435 DO ispin = 1, nspins
436 ee_ener = ee_ener + pw_integral_ab(rho_r(ispin), vee)
437 END DO
438 IF (.NOT. just_energy) THEN
439 IF (gapw) THEN
440 CALL get_qs_env(qs_env=qs_env, &
441 rho0_s_rs=rho0_s_rs, &
442 rhoz_cneo_s_rs=rhoz_cneo_s_rs)
443 cpassert(ASSOCIATED(rho0_s_rs))
444 IF (ASSOCIATED(rhoz_cneo_s_rs)) THEN
445 CALL pw_axpy(rhoz_cneo_s_rs, rho0_s_rs)
446 END IF
447 ee_ener = ee_ener + pw_integral_ab(rho0_s_rs, vee)
448 IF (ASSOCIATED(rhoz_cneo_s_rs)) THEN
449 CALL pw_axpy(rhoz_cneo_s_rs, rho0_s_rs, -1.0_dp)
450 END IF
451 END IF
452 END IF
453 ! the sign accounts for the charge of the electrons
454 energy%ee = -ee_ener
455 END IF
456
457 ! Adds the QM/MM potential
458 IF (qs_env%qmmm) THEN
459 CALL qmmm_calculate_energy(qs_env=qs_env, &
460 rho=rho_r, &
461 v_qmmm=qs_env%ks_qmmm_env%v_qmmm_rspace, &
462 qmmm_energy=energy%qmmm_el)
463 IF (qs_env%qmmm_env_qm%image_charge) THEN
464 CALL calculate_image_pot(v_hartree_rspace=v_hartree_rspace, &
465 rho_hartree_gspace=rho_tot_gspace, &
466 energy=energy, &
467 qmmm_env=qs_env%qmmm_env_qm, &
468 qs_env=qs_env)
469 IF (.NOT. just_energy) THEN
470 CALL add_image_pot_to_hartree_pot(v_hartree=v_hartree_rspace, &
471 v_metal=qs_env%ks_qmmm_env%v_metal_rspace, &
472 qs_env=qs_env)
473 IF (calculate_forces) THEN
475 potential=v_hartree_rspace, coeff=qs_env%image_coeff, &
476 forces=qs_env%qmmm_env_qm%image_charge_pot%image_forcesMM, &
477 qmmm_env=qs_env%qmmm_env_qm, qs_env=qs_env)
478 END IF
479 END IF
480 CALL qs_env%ks_qmmm_env%v_metal_rspace%release()
481 DEALLOCATE (qs_env%ks_qmmm_env%v_metal_rspace)
482 END IF
483 IF (.NOT. just_energy) THEN
484 CALL qmmm_modify_hartree_pot(v_hartree=v_hartree_rspace, &
485 v_qmmm=qs_env%ks_qmmm_env%v_qmmm_rspace, scale=1.0_dp)
486 END IF
487 END IF
488 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
489
490 ! SMEAGOL interface
491 IF (dft_control%smeagol_control%smeagol_enabled .AND. &
492 dft_control%smeagol_control%run_type == smeagol_runtype_emtransport) THEN
493 cpassert(ASSOCIATED(dft_control%smeagol_control%aux))
494 CALL smeagol_shift_v_hartree(v_hartree_rspace, cell, &
495 dft_control%smeagol_control%aux%HartreeLeadsLeft, &
496 dft_control%smeagol_control%aux%HartreeLeadsRight, &
497 dft_control%smeagol_control%aux%HartreeLeadsBottom, &
498 dft_control%smeagol_control%aux%VBias, &
499 dft_control%smeagol_control%aux%minL, &
500 dft_control%smeagol_control%aux%maxR, &
501 dft_control%smeagol_control%aux%isexplicit_maxR, &
502 dft_control%smeagol_control%aux%isexplicit_HartreeLeadsBottom)
503 END IF
504
505 ! calculate the density matrix for the fitted mo_coeffs
506 IF (dft_control%do_admm) THEN
507 IF (PRESENT(ext_xc_section)) THEN
508 CALL hfx_admm_init(qs_env, calculate_forces, ext_xc_section)
509 ELSE
510 CALL hfx_admm_init(qs_env, calculate_forces)
511 END IF
512
513 IF (dft_control%do_admm_mo) THEN
514 IF (qs_env%run_rtp) THEN
515 CALL rtp_admm_calc_rho_aux(qs_env)
516 ELSE
517 IF (dokp) THEN
518 CALL admm_mo_calc_rho_aux_kp(qs_env)
519 ELSE
520 CALL admm_mo_calc_rho_aux(qs_env)
521 END IF
522 END IF
523 ELSEIF (dft_control%do_admm_dm) THEN
524 CALL admm_dm_calc_rho_aux(qs_env)
525 END IF
526 END IF
527
528 ! only activate stress calculation if
529 IF (use_virial .AND. calculate_forces) virial%pv_calculate = .true.
530
531 ! *** calculate the xc potential on the pw density ***
532 ! *** associates v_rspace_new if the xc potential needs to be computed.
533 ! If we do wavefunction fitting, we need the vxc_potential in the auxiliary basis set
534 IF (dft_control%do_admm) THEN
535 CALL get_qs_env(qs_env, admm_env=admm_env)
536 xc_section => admm_env%xc_section_aux
537 CALL get_admm_env(admm_env, rho_aux_fit=rho_struct)
538
539 ! here we ignore a possible vdW section in admm_env%xc_section_aux
540 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=xc_section, &
541 vxc_rho=v_rspace_new_aux_fit, vxc_tau=v_tau_rspace_aux_fit, exc=energy%exc_aux_fit, &
542 just_energy=just_energy_xc)
543
544 IF (admm_env%do_gapw) THEN
545 !compute the potential due to atomic densities
546 CALL calculate_vxc_atom(qs_env, energy_only=just_energy_xc, exc1=energy%exc1_aux_fit, &
547 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
548 xc_section_external=xc_section, &
549 rho_atom_set_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set)
550
551 END IF
552
553 NULLIFY (rho_struct)
554
555 IF (use_virial .AND. calculate_forces) THEN
556 vscale = 1.0_dp
557 !Note: ADMMS and ADMMP stress tensor only for closed-shell calculations
558 IF (admm_env%do_admms) vscale = admm_env%gsi(1)**(2.0_dp/3.0_dp)
559 IF (admm_env%do_admmp) vscale = admm_env%gsi(1)**2
560 virial%pv_exc = virial%pv_exc - vscale*virial%pv_xc
561 virial%pv_virial = virial%pv_virial - vscale*virial%pv_xc
562 ! virial%pv_xc will be zeroed in the xc routines
563 END IF
564 xc_section => admm_env%xc_section_primary
565 ELSE
566 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
567 ! build ks matrix with an xc section potentially different from the one defined in input
568 IF (PRESENT(ext_xc_section)) xc_section => ext_xc_section
569 END IF
570
571 IF (gapw_xc) THEN
572 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_struct)
573 ELSE
574 CALL get_qs_env(qs_env=qs_env, rho=rho_struct)
575 END IF
576
577 ! zmp
578 IF (dft_control%apply_external_density .OR. dft_control%apply_external_vxc) THEN
579 energy%exc = 0.0_dp
580 CALL calculate_zmp_potential(qs_env, v_rspace_new, rho, exc=energy%exc)
581 ELSE
582 ! Embedding potential
583 IF (dft_control%apply_embed_pot) THEN
584 NULLIFY (v_rspace_embed)
585 energy%embed_corr = 0.0_dp
586 CALL get_embed_potential_energy(qs_env, rho, v_rspace_embed, dft_control, &
587 energy%embed_corr, just_energy)
588 END IF
589 ! Everything else
590 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=xc_section, &
591 vxc_rho=v_rspace_new, vxc_tau=v_tau_rspace, exc=energy%exc, &
592 edisp=edisp, dispersion_env=qs_env%dispersion_env, &
593 just_energy=just_energy_xc)
594 IF (edisp /= 0.0_dp) energy%dispersion = edisp
595 IF (qs_env%requires_matrix_vxc .AND. ASSOCIATED(v_rspace_new)) THEN
596 CALL compute_matrix_vxc(qs_env=qs_env, v_rspace=v_rspace_new, matrix_vxc=matrix_vxc)
597 CALL set_ks_env(ks_env, matrix_vxc=matrix_vxc)
598 END IF
599
600 IF (gapw .OR. gapw_xc) THEN
601 CALL calculate_vxc_atom(qs_env, just_energy_xc, energy%exc1, xc_section_external=xc_section)
602 ! test for not implemented (bug) option
603 IF (use_virial .AND. calculate_forces) THEN
604 IF (ASSOCIATED(v_tau_rspace)) THEN
605 cpabort("MGGA STRESS with GAPW/GAPW_XC not implemneted")
606 END IF
607 END IF
608 END IF
609
610 END IF
611
612 ! set hartree and xc potentials for use in Harris method
613 IF (qs_env%harris_method) THEN
614 CALL get_qs_env(qs_env, harris_env=harris_env)
615 CALL harris_set_potentials(harris_env, v_hartree_rspace, v_rspace_new)
616 END IF
617
618 NULLIFY (rho_struct)
619 IF (use_virial .AND. calculate_forces) THEN
620 virial%pv_exc = virial%pv_exc - virial%pv_xc
621 virial%pv_virial = virial%pv_virial - virial%pv_xc
622 END IF
623
624 ! *** Add Hartree-Fock contribution if required ***
625 hfx_sections => section_vals_get_subs_vals(xc_section, "HF")
626 CALL section_vals_get(hfx_sections, explicit=do_hfx)
627 IF (do_hfx) THEN
628 IF (dokp) THEN
629 CALL hfx_ks_matrix_kp(qs_env, ks_matrix, energy, calculate_forces)
630 ELSE
631 ! ext_xc_section may contain a hfx section
632 CALL hfx_ks_matrix(qs_env, ks_matrix, rho, energy, calculate_forces, &
633 just_energy, v_rspace_new, v_tau_rspace, ext_xc_section=xc_section)
634 END IF
635 END IF !do_hfx
636
637 IF (do_ppl .AND. calculate_forces) THEN
638 cpassert(.NOT. gapw)
639 DO ispin = 1, nspins
640 CALL integrate_ppl_rspace(rho_r(ispin), qs_env)
641 END DO
642 END IF
643
644 IF (ASSOCIATED(rho_nlcc) .AND. calculate_forces) THEN
645 DO ispin = 1, nspins
646 CALL integrate_rho_nlcc(v_rspace_new(ispin), qs_env)
647 IF (dft_control%do_admm) CALL integrate_rho_nlcc(v_rspace_new_aux_fit(ispin), qs_env)
648 END DO
649 END IF
650
651 ! calculate KG correction
652 IF (dft_control%qs_control%do_kg .AND. just_energy) THEN
653
654 cpassert(.NOT. (gapw .OR. gapw_xc))
655 cpassert(nimages == 1)
656 ksmat => ks_matrix(:, 1)
657 CALL kg_ekin_subset(qs_env, ksmat, ekin_mol, calculate_forces, do_kernel=.false.)
658
659 ! subtract kg corr from the total energy
660 energy%exc = energy%exc - ekin_mol
661
662 END IF
663
664 ! *** Single atom contributions ***
665 IF (.NOT. just_energy) THEN
666 IF (calculate_forces) THEN
667 ! Getting nuclear force contribution from the core charge density
668 IF ((poisson_env%parameters%solver == pw_poisson_implicit) .AND. &
669 (poisson_env%parameters%dielectric_params%dielec_core_correction)) THEN
670 block
671 TYPE(pw_r3d_rs_type) :: v_minus_veps
672 CALL auxbas_pw_pool%create_pw(v_minus_veps)
673 CALL pw_copy(v_hartree_rspace, v_minus_veps)
674 CALL pw_axpy(poisson_env%implicit_env%v_eps, v_minus_veps, -v_hartree_rspace%pw_grid%dvol)
675 CALL integrate_v_core_rspace(v_minus_veps, qs_env)
676 CALL auxbas_pw_pool%give_back_pw(v_minus_veps)
677 END block
678 ELSE
679 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env)
680 END IF
681 END IF
682
683 IF (.NOT. do_hfx) THEN
684 ! Initialize the Kohn-Sham matrix with the core Hamiltonian matrix
685 ! (sets ks sparsity equal to matrix_h sparsity)
686 DO ispin = 1, nspins
687 DO img = 1, nimages
688 CALL dbcsr_get_info(ks_matrix(ispin, img)%matrix, name=name) ! keep the name
689 CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix, name=name)
690 END DO
691 END DO
692 ! imaginary part if required
693 IF (qs_env%run_rtp) THEN
694 IF (dft_control%rtp_control%velocity_gauge) THEN
695 cpassert(ASSOCIATED(matrix_h_im))
696 cpassert(ASSOCIATED(ks_matrix_im))
697 DO ispin = 1, nspins
698 DO img = 1, nimages
699 CALL dbcsr_get_info(ks_matrix_im(ispin, img)%matrix, name=name) ! keep the name
700 CALL dbcsr_copy(ks_matrix_im(ispin, img)%matrix, matrix_h_im(1, img)%matrix, name=name)
701 END DO
702 END DO
703 END IF
704 END IF
705 END IF
706
707 IF (use_virial .AND. calculate_forces) THEN
708 pv_loc = virial%pv_virial
709 END IF
710 ! sum up potentials and integrate
711 ! Pointing my_rho to the density matrix rho_ao
712 my_rho => rho_ao
713
714 CALL sum_up_and_integrate(qs_env, ks_matrix, rho, my_rho, vppl_rspace, &
715 v_rspace_new, v_rspace_new_aux_fit, v_tau_rspace, v_tau_rspace_aux_fit, &
716 v_sic_rspace, v_spin_ddapc_rest_r, v_sccs_rspace, v_rspace_embed, &
717 cdft_control, calculate_forces)
718
719 IF (use_virial .AND. calculate_forces) THEN
720 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
721 END IF
722 IF (dft_control%qs_control%do_kg) THEN
723 cpassert(.NOT. (gapw .OR. gapw_xc))
724 cpassert(nimages == 1)
725 ksmat => ks_matrix(:, 1)
726
727 IF (use_virial .AND. calculate_forces) THEN
728 pv_loc = virial%pv_virial
729 END IF
730
731 CALL kg_ekin_subset(qs_env, ksmat, ekin_mol, calculate_forces, do_kernel=.false.)
732 ! subtract kg corr from the total energy
733 energy%exc = energy%exc - ekin_mol
734
735 ! virial corrections
736 IF (use_virial .AND. calculate_forces) THEN
737
738 ! Integral contribution
739 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
740
741 ! GGA contribution
742 virial%pv_exc = virial%pv_exc + virial%pv_xc
743 virial%pv_virial = virial%pv_virial + virial%pv_xc
744 virial%pv_xc = 0.0_dp
745 END IF
746 END IF
747
748 ELSE
749 IF (do_hfx) THEN
750 IF (.false.) THEN
751 cpwarn("KS matrix no longer correct. Check possible problems with property calculations!")
752 END IF
753 END IF
754 END IF ! .NOT. just energy
755
756 IF (dft_control%qs_control%ddapc_explicit_potential) THEN
757 CALL auxbas_pw_pool%give_back_pw(v_spin_ddapc_rest_r)
758 DEALLOCATE (v_spin_ddapc_rest_r)
759 END IF
760
761 IF (calculate_forces .AND. dft_control%qs_control%cdft) THEN
762 IF (.NOT. cdft_control%transfer_pot) THEN
763 DO iatom = 1, SIZE(cdft_control%group)
764 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
765 DEALLOCATE (cdft_control%group(iatom)%weight)
766 END DO
767 IF (cdft_control%atomic_charges) THEN
768 DO iatom = 1, cdft_control%natoms
769 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
770 END DO
771 DEALLOCATE (cdft_control%charge)
772 END IF
773 IF (cdft_control%type == outer_scf_becke_constraint .AND. &
774 cdft_control%becke_control%cavity_confine) THEN
775 IF (.NOT. ASSOCIATED(cdft_control%becke_control%cavity_mat)) THEN
776 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
777 ELSE
778 DEALLOCATE (cdft_control%becke_control%cavity_mat)
779 END IF
780 ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
781 IF (ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)) THEN
782 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
783 END IF
784 END IF
785 IF (ASSOCIATED(cdft_control%charges_fragment)) DEALLOCATE (cdft_control%charges_fragment)
786 cdft_control%save_pot = .false.
787 cdft_control%need_pot = .true.
788 cdft_control%external_control = .false.
789 END IF
790 END IF
791
792 IF (dft_control%do_sccs) THEN
793 CALL auxbas_pw_pool%give_back_pw(v_sccs_rspace)
794 DEALLOCATE (v_sccs_rspace)
795 END IF
796
797 IF (gapw) THEN
798 IF (dft_control%apply_external_potential) THEN
799 ! Integrals of the Hartree potential with g0_soft
800 CALL qmmm_modify_hartree_pot(v_hartree=v_hartree_rspace, &
801 v_qmmm=vee, scale=-1.0_dp)
802 END IF
803 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, calculate_forces)
804 ! Place Vh_1c_gg_integrals after integrate_vhg0_rspace for CNEO calculations
805 ! because vhg0 integral is needed to build the complete nuclear equation
806 CALL get_qs_env(qs_env, ecoul_1c=ecoul_1c, local_rho_set=local_rho_set)
807 CALL vh_1c_gg_integrals(qs_env, energy%hartree_1c, ecoul_1c, local_rho_set, para_env, tddft=.false., &
808 core_2nd=.false.)
809 ! CNEO quantum nuclear core energy (kinetic + Z*erfc(r)/r potential from classical nuclei)
810 energy%core_cneo = 0.0_dp
811 IF (ASSOCIATED(local_rho_set%rhoz_cneo_set)) THEN
812 DO iatom = 1, SIZE(local_rho_set%rhoz_cneo_set)
813 energy%core_cneo = energy%core_cneo + local_rho_set%rhoz_cneo_set(iatom)%e_core
814 END DO
815 END IF
816 END IF
817
818 IF (gapw .OR. gapw_xc) THEN
819 ! Single atom contributions in the KS matrix ***
820 CALL update_ks_atom(qs_env, ks_matrix, rho_ao, calculate_forces)
821 IF (dft_control%do_admm) THEN
822 !Single atom contribution to the AUX matrices
823 !Note: also update ks_aux_fit matrix in case of rtp
824 CALL admm_update_ks_atom(qs_env, calculate_forces)
825 END IF
826 END IF
827
828 !Calculation of Mulliken restraint, if requested
829 CALL qs_ks_mulliken_restraint(energy, dft_control, just_energy, para_env, &
830 ks_matrix, matrix_s, rho, mulliken_order_p)
831
832 ! Add DFT+U contribution, if requested
833 IF (dft_control%dft_plus_u) THEN
834 cpassert(nimages == 1)
835 IF (just_energy) THEN
836 CALL plus_u(qs_env=qs_env)
837 ELSE
838 ksmat => ks_matrix(:, 1)
839 CALL plus_u(qs_env=qs_env, matrix_h=ksmat)
840 END IF
841 ELSE
842 energy%dft_plus_u = 0.0_dp
843 END IF
844
845 ! At this point the ks matrix should be up to date, filter it if requested
846 DO ispin = 1, nspins
847 DO img = 1, nimages
848 CALL dbcsr_filter(ks_matrix(ispin, img)%matrix, &
849 dft_control%qs_control%eps_filter_matrix)
850 END DO
851 END DO
852
853 !** merge the auxiliary KS matrix and the primary one
854 IF (dft_control%do_admm_mo) THEN
855 IF (qs_env%run_rtp) THEN
856 CALL rtp_admm_merge_ks_matrix(qs_env)
857 ELSE
858 CALL admm_mo_merge_ks_matrix(qs_env)
859 END IF
860 ELSEIF (dft_control%do_admm_dm) THEN
861 CALL admm_dm_merge_ks_matrix(qs_env)
862 END IF
863
864 ! External field (nonperiodic case)
865 CALL qs_efield_local_operator(qs_env, just_energy, calculate_forces)
866
867 ! Right now we can compute the orbital derivative here, as it depends currently only on the available
868 ! Kohn-Sham matrix. This might change in the future, in which case more pieces might need to be assembled
869 ! from this routine, notice that this part of the calculation in not linear scaling
870 ! right now this operation is only non-trivial because of occupation numbers and the restricted keyword
871 IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy .AND. .NOT. qs_env%run_rtp) THEN
872 CALL get_qs_env(qs_env, mo_derivs=mo_derivs)
873 cpassert(nimages == 1)
874 ksmat => ks_matrix(:, 1)
875 CALL calc_mo_derivatives(qs_env, ksmat, mo_derivs)
876 END IF
877
878 ! ADMM overlap forces
879 IF (calculate_forces .AND. dft_control%do_admm) THEN
880 IF (dokp) THEN
881 CALL calc_admm_ovlp_forces_kp(qs_env)
882 ELSE
883 CALL calc_admm_ovlp_forces(qs_env)
884 END IF
885 END IF
886
887 ! deal with low spin roks
888 CALL low_spin_roks(energy, qs_env, dft_control, do_hfx, just_energy, &
889 calculate_forces, auxbas_pw_pool)
890
891 ! deal with sic on explicit orbitals
892 CALL sic_explicit_orbitals(energy, qs_env, dft_control, poisson_env, just_energy, &
893 calculate_forces, auxbas_pw_pool)
894
895 ! Periodic external field
896 CALL qs_efield_berry_phase(qs_env, just_energy, calculate_forces)
897
898 ! adds s2_restraint energy and orbital derivatives
899 CALL qs_ks_s2_restraint(dft_control, qs_env, matrix_s, &
900 energy, calculate_forces, just_energy)
901
902 IF (do_ppl) THEN
903 ! update core energy for grid based local pseudopotential
904 ecore_ppl = 0._dp
905 DO ispin = 1, nspins
906 ecore_ppl = ecore_ppl + pw_integral_ab(vppl_rspace, rho_r(ispin))
907 END DO
908 energy%core = energy%core + ecore_ppl
909 END IF
910
911 IF (lrigpw) THEN
912 ! update core energy for ppl_ri method
913 CALL get_qs_env(qs_env, lri_env=lri_env, lri_density=lri_density)
914 IF (lri_env%ppl_ri) THEN
915 ecore_ppl = 0._dp
916 DO ispin = 1, nspins
917 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
918 CALL v_int_ppl_energy(qs_env, lri_v_int, ecore_ppl)
919 END DO
920 energy%core = energy%core + ecore_ppl
921 END IF
922 END IF
923
924 ! Sum all energy terms to obtain the total energy
925 energy%total = energy%core_overlap + energy%core_self + energy%core_cneo + energy%core + &
926 energy%hartree + energy%hartree_1c + energy%exc + energy%exc1 + energy%ex + &
927 energy%dispersion + energy%gcp + energy%qmmm_el + energy%mulliken + &
928 sum(energy%ddapc_restraint) + energy%s2_restraint + &
929 energy%dft_plus_u + energy%kTS + &
930 energy%efield + energy%efield_core + energy%ee + &
931 energy%ee_core + energy%exc_aux_fit + energy%image_charge + &
932 energy%sccs_pol + energy%cdft + energy%exc1_aux_fit
933
934 IF (dft_control%apply_embed_pot) energy%total = energy%total + energy%embed_corr
935
936 IF (abnormal_value(energy%total)) &
937 cpabort("KS energy is an abnormal value (NaN/Inf).")
938
939 ! Print detailed energy
940 IF (my_print) THEN
941 CALL print_detailed_energy(qs_env, dft_control, input, energy, mulliken_order_p)
942 END IF
943
944 CALL timestop(handle)
945
946 END SUBROUTINE qs_ks_build_kohn_sham_matrix
947
948! **************************************************************************************************
949!> \brief ...
950!> \param rho_tot_gspace ...
951!> \param qs_env ...
952!> \param rho ...
953!> \param skip_nuclear_density ...
954! **************************************************************************************************
955 SUBROUTINE calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
956 TYPE(pw_c1d_gs_type), INTENT(INOUT) :: rho_tot_gspace
957 TYPE(qs_environment_type), POINTER :: qs_env
958 TYPE(qs_rho_type), POINTER :: rho
959 LOGICAL, INTENT(IN), OPTIONAL :: skip_nuclear_density
960
961 INTEGER :: ispin
962 LOGICAL :: my_skip
963 TYPE(dft_control_type), POINTER :: dft_control
964 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
965 TYPE(pw_c1d_gs_type), POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
966 TYPE(qs_charges_type), POINTER :: qs_charges
967
968 my_skip = .false.
969 IF (PRESENT(skip_nuclear_density)) my_skip = skip_nuclear_density
970
971 CALL qs_rho_get(rho, rho_g=rho_g)
972 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
973
974 IF (.NOT. my_skip) THEN
975 NULLIFY (rho_core)
976 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
977 IF (dft_control%qs_control%gapw) THEN
978 NULLIFY (rho0_s_gs, rhoz_cneo_s_gs)
979 CALL get_qs_env(qs_env=qs_env, rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
980 cpassert(ASSOCIATED(rho0_s_gs))
981 CALL pw_copy(rho0_s_gs, rho_tot_gspace)
982 IF (ASSOCIATED(rhoz_cneo_s_gs)) THEN
983 CALL pw_axpy(rhoz_cneo_s_gs, rho_tot_gspace)
984 END IF
985 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw) THEN
986 CALL pw_axpy(rho_core, rho_tot_gspace)
987 END IF
988 ELSE
989 CALL pw_copy(rho_core, rho_tot_gspace)
990 END IF
991 DO ispin = 1, dft_control%nspins
992 CALL pw_axpy(rho_g(ispin), rho_tot_gspace)
993 END DO
994 CALL get_qs_env(qs_env=qs_env, qs_charges=qs_charges)
995 qs_charges%total_rho_gspace = pw_integrate_function(rho_tot_gspace, isign=-1)
996 ELSE
997 DO ispin = 1, dft_control%nspins
998 CALL pw_axpy(rho_g(ispin), rho_tot_gspace)
999 END DO
1000 END IF
1001
1002 END SUBROUTINE calc_rho_tot_gspace
1003
1004! **************************************************************************************************
1005!> \brief compute MO derivatives
1006!> \param qs_env the qs_env to update
1007!> \param ks_matrix ...
1008!> \param mo_derivs ...
1009!> \par History
1010!> 01.2014 created, transferred from qs_ks_build_kohn_sham_matrix in
1011!> separate subroutine
1012!> \author Dorothea Golze
1013! **************************************************************************************************
1014 SUBROUTINE calc_mo_derivatives(qs_env, ks_matrix, mo_derivs)
1015 TYPE(qs_environment_type), POINTER :: qs_env
1016 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix, mo_derivs
1017
1018 INTEGER :: ispin
1019 LOGICAL :: uniform_occupation
1020 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
1021 TYPE(cp_fm_type), POINTER :: mo_coeff
1022 TYPE(dbcsr_type) :: mo_derivs2_tmp1, mo_derivs2_tmp2
1023 TYPE(dbcsr_type), POINTER :: mo_coeff_b
1024 TYPE(dft_control_type), POINTER :: dft_control
1025 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
1026
1027 NULLIFY (dft_control, mo_array, mo_coeff, mo_coeff_b, occupation_numbers)
1028
1029 CALL get_qs_env(qs_env, &
1030 dft_control=dft_control, &
1031 mos=mo_array)
1032
1033 DO ispin = 1, SIZE(mo_derivs)
1034
1035 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff, &
1036 mo_coeff_b=mo_coeff_b, occupation_numbers=occupation_numbers)
1037 CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin)%matrix, mo_coeff_b, &
1038 0.0_dp, mo_derivs(ispin)%matrix)
1039
1040 IF (dft_control%restricted) THEN
1041 ! only the first mo_set are actual variables, but we still need both
1042 cpassert(ispin == 1)
1043 cpassert(SIZE(mo_array) == 2)
1044 ! use a temporary array with the same size as the first spin for the second spin
1045
1046 ! uniform_occupation is needed for this case, otherwise we can no
1047 ! reconstruct things in ot, since we irreversibly sum
1048 CALL get_mo_set(mo_set=mo_array(1), uniform_occupation=uniform_occupation)
1049 cpassert(uniform_occupation)
1050 CALL get_mo_set(mo_set=mo_array(2), uniform_occupation=uniform_occupation)
1051 cpassert(uniform_occupation)
1052
1053 ! The beta-spin might have fewer orbitals than alpa-spin...
1054 ! create tempoary matrices with beta_nmo columns
1055 CALL get_mo_set(mo_set=mo_array(2), mo_coeff_b=mo_coeff_b)
1056 CALL dbcsr_create(mo_derivs2_tmp1, template=mo_coeff_b)
1057
1058 ! calculate beta derivatives
1059 CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(2)%matrix, mo_coeff_b, 0.0_dp, mo_derivs2_tmp1)
1060
1061 ! create larger matrix with alpha_nmo columns
1062 CALL dbcsr_create(mo_derivs2_tmp2, template=mo_derivs(1)%matrix)
1063 CALL dbcsr_set(mo_derivs2_tmp2, 0.0_dp)
1064
1065 ! copy into larger matrix, fills the first beta_nmo columns
1066 CALL dbcsr_copy_columns_hack(mo_derivs2_tmp2, mo_derivs2_tmp1, &
1067 mo_array(2)%nmo, 1, 1, &
1068 para_env=mo_array(1)%mo_coeff%matrix_struct%para_env, &
1069 blacs_env=mo_array(1)%mo_coeff%matrix_struct%context)
1070
1071 ! add beta contribution to alpa mo_derivs
1072 CALL dbcsr_add(mo_derivs(1)%matrix, mo_derivs2_tmp2, 1.0_dp, 1.0_dp)
1073 CALL dbcsr_release(mo_derivs2_tmp1)
1074 CALL dbcsr_release(mo_derivs2_tmp2)
1075 END IF
1076 END DO
1077
1078 IF (dft_control%do_admm_mo) THEN
1079 CALL calc_admm_mo_derivatives(qs_env, mo_derivs)
1080 END IF
1081
1082 END SUBROUTINE calc_mo_derivatives
1083
1084! **************************************************************************************************
1085!> \brief updates the Kohn Sham matrix of the given qs_env (facility method)
1086!> \param qs_env the qs_env to update
1087!> \param calculate_forces if true calculate the quantities needed
1088!> to calculate the forces. Defaults to false.
1089!> \param just_energy if true updates the energies but not the
1090!> ks matrix. Defaults to false
1091!> \param print_active ...
1092!> \par History
1093!> 4.2002 created [fawzi]
1094!> 8.2014 kpoints [JGH]
1095!> 10.2014 refractored [Ole Schuett]
1096!> \author Fawzi Mohamed
1097! **************************************************************************************************
1098 SUBROUTINE qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, &
1099 print_active)
1100 TYPE(qs_environment_type), POINTER :: qs_env
1101 LOGICAL, INTENT(IN), OPTIONAL :: calculate_forces, just_energy, &
1102 print_active
1103
1104 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_ks_update_qs_env'
1105
1106 INTEGER :: handle, unit_nr
1107 LOGICAL :: c_forces, do_rebuild, energy_only, &
1108 forces_up_to_date, potential_changed, &
1109 rho_changed, s_mstruct_changed
1110 TYPE(qs_ks_env_type), POINTER :: ks_env
1111
1112 NULLIFY (ks_env)
1113 unit_nr = cp_logger_get_default_io_unit()
1114
1115 c_forces = .false.
1116 energy_only = .false.
1117 IF (PRESENT(just_energy)) energy_only = just_energy
1118 IF (PRESENT(calculate_forces)) c_forces = calculate_forces
1119
1120 IF (c_forces) THEN
1121 CALL timeset(routinen//'_forces', handle)
1122 ELSE
1123 CALL timeset(routinen, handle)
1124 END IF
1125
1126 cpassert(ASSOCIATED(qs_env))
1127
1128 CALL get_qs_env(qs_env, &
1129 ks_env=ks_env, &
1130 rho_changed=rho_changed, &
1131 s_mstruct_changed=s_mstruct_changed, &
1132 potential_changed=potential_changed, &
1133 forces_up_to_date=forces_up_to_date)
1134
1135 do_rebuild = .false.
1136 do_rebuild = do_rebuild .OR. rho_changed
1137 do_rebuild = do_rebuild .OR. s_mstruct_changed
1138 do_rebuild = do_rebuild .OR. potential_changed
1139 do_rebuild = do_rebuild .OR. (c_forces .AND. .NOT. forces_up_to_date)
1140
1141 IF (do_rebuild) THEN
1142 CALL evaluate_core_matrix_traces(qs_env)
1143
1144 ! the ks matrix will be rebuilt so this is fine now
1145 CALL set_ks_env(ks_env, potential_changed=.false.)
1146
1147 CALL rebuild_ks_matrix(qs_env, &
1148 calculate_forces=c_forces, &
1149 just_energy=energy_only, &
1150 print_active=print_active)
1151
1152 IF (.NOT. energy_only) THEN
1153 CALL set_ks_env(ks_env, &
1154 rho_changed=.false., &
1155 s_mstruct_changed=.false., &
1156 forces_up_to_date=forces_up_to_date .OR. c_forces)
1157 END IF
1158 END IF
1159
1160 CALL timestop(handle)
1161
1162 END SUBROUTINE qs_ks_update_qs_env
1163
1164! **************************************************************************************************
1165!> \brief Calculates the traces of the core matrices and the density matrix.
1166!> \param qs_env ...
1167!> \author Ole Schuett
1168! **************************************************************************************************
1170 TYPE(qs_environment_type), POINTER :: qs_env
1171
1172 CHARACTER(LEN=*), PARAMETER :: routinen = 'evaluate_core_matrix_traces'
1173
1174 INTEGER :: handle
1175 REAL(kind=dp) :: energy_core_im
1176 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrixkp_h, matrixkp_t, rho_ao_kp
1177 TYPE(dft_control_type), POINTER :: dft_control
1178 TYPE(qs_energy_type), POINTER :: energy
1179 TYPE(qs_rho_type), POINTER :: rho
1180
1181 CALL timeset(routinen, handle)
1182 NULLIFY (energy, rho, dft_control, rho_ao_kp, matrixkp_t, matrixkp_h)
1183
1184 CALL get_qs_env(qs_env, &
1185 rho=rho, &
1186 energy=energy, &
1187 dft_control=dft_control, &
1188 kinetic_kp=matrixkp_t, &
1189 matrix_h_kp=matrixkp_h)
1190
1191 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1192
1193 CALL calculate_ptrace(matrixkp_h, rho_ao_kp, energy%core, dft_control%nspins)
1194
1195 ! Add the imaginary part in the RTP case
1196 IF (qs_env%run_rtp) THEN
1197 IF (dft_control%rtp_control%velocity_gauge) THEN
1198 CALL get_qs_env(qs_env, matrix_h_im_kp=matrixkp_h)
1199 CALL qs_rho_get(rho, rho_ao_im_kp=rho_ao_kp)
1200 CALL calculate_ptrace(matrixkp_h, rho_ao_kp, energy_core_im, dft_control%nspins)
1201 energy%core = energy%core - energy_core_im
1202 END IF
1203 END IF
1204
1205 ! kinetic energy
1206 IF (ASSOCIATED(matrixkp_t)) &
1207 CALL calculate_ptrace(matrixkp_t, rho_ao_kp, energy%kinetic, dft_control%nspins)
1208
1209 CALL timestop(handle)
1210 END SUBROUTINE evaluate_core_matrix_traces
1211
1212! **************************************************************************************************
1213!> \brief Calculates the traces of the core matrices and the density matrix.
1214!> \param qs_env ...
1215!> \author Johann Pototschnig
1216! **************************************************************************************************
1218 TYPE(qs_environment_type), POINTER :: qs_env
1219
1220 CHARACTER(LEN=*), PARAMETER :: routinen = 'evaluate_core_matrix_p_mix_new'
1221
1222 INTEGER :: handle
1223 REAL(kind=dp) :: energy_core_im
1224 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrixkp_h, matrixkp_t
1225 TYPE(dft_control_type), POINTER :: dft_control
1226 TYPE(qs_energy_type), POINTER :: energy
1227 TYPE(qs_scf_env_type), POINTER :: scf_env
1228
1229 CALL timeset(routinen, handle)
1230 NULLIFY (energy, dft_control, matrixkp_t, matrixkp_h)
1231
1232 CALL get_qs_env(qs_env, &
1233 energy=energy, &
1234 dft_control=dft_control, &
1235 kinetic_kp=matrixkp_t, &
1236 matrix_h_kp=matrixkp_h, &
1237 scf_env=scf_env)
1238
1239 CALL calculate_ptrace(matrixkp_h, scf_env%p_mix_new, energy%core, dft_control%nspins)
1240
1241 ! Add the imaginary part in the RTP case
1242 IF (qs_env%run_rtp) THEN
1243 IF (dft_control%rtp_control%velocity_gauge) THEN
1244 CALL get_qs_env(qs_env, matrix_h_im_kp=matrixkp_h)
1245 CALL calculate_ptrace(matrixkp_h, scf_env%p_mix_new, energy_core_im, dft_control%nspins)
1246 energy%core = energy%core - energy_core_im
1247 END IF
1248 END IF
1249
1250 ! kinetic energy
1251 IF (ASSOCIATED(matrixkp_t)) &
1252 CALL calculate_ptrace(matrixkp_t, scf_env%p_mix_new, energy%kinetic, dft_control%nspins)
1253
1254 CALL timestop(handle)
1255 END SUBROUTINE evaluate_core_matrix_p_mix_new
1256
1257! **************************************************************************************************
1258!> \brief Constructs a new Khon-Sham matrix
1259!> \param qs_env ...
1260!> \param calculate_forces ...
1261!> \param just_energy ...
1262!> \param print_active ...
1263!> \author Ole Schuett
1264! **************************************************************************************************
1265 SUBROUTINE rebuild_ks_matrix(qs_env, calculate_forces, just_energy, print_active)
1266 TYPE(qs_environment_type), POINTER :: qs_env
1267 LOGICAL, INTENT(IN) :: calculate_forces, just_energy
1268 LOGICAL, INTENT(IN), OPTIONAL :: print_active
1269
1270 CHARACTER(LEN=*), PARAMETER :: routinen = 'rebuild_ks_matrix'
1271
1272 INTEGER :: handle
1273 TYPE(dft_control_type), POINTER :: dft_control
1274
1275 CALL timeset(routinen, handle)
1276 NULLIFY (dft_control)
1277
1278 CALL get_qs_env(qs_env, dft_control=dft_control)
1279
1280 IF (dft_control%qs_control%semi_empirical) THEN
1281 CALL build_se_fock_matrix(qs_env, &
1282 calculate_forces=calculate_forces, &
1283 just_energy=just_energy)
1284
1285 ELSEIF (dft_control%qs_control%dftb) THEN
1286 CALL build_dftb_ks_matrix(qs_env, &
1287 calculate_forces=calculate_forces, &
1288 just_energy=just_energy)
1289
1290 ELSEIF (dft_control%qs_control%xtb) THEN
1291 IF (dft_control%qs_control%xtb_control%do_tblite) THEN
1292 CALL build_tblite_ks_matrix(qs_env, &
1293 calculate_forces=calculate_forces, &
1294 just_energy=just_energy)
1295 ELSE
1296 CALL build_xtb_ks_matrix(qs_env, &
1297 calculate_forces=calculate_forces, &
1298 just_energy=just_energy)
1299 END IF
1300 ELSE
1301 CALL qs_ks_build_kohn_sham_matrix(qs_env, &
1302 calculate_forces=calculate_forces, &
1303 just_energy=just_energy, &
1304 print_active=print_active)
1305 END IF
1306
1307 CALL timestop(handle)
1308
1309 END SUBROUTINE rebuild_ks_matrix
1310
1311! **************************************************************************************************
1312!> \brief Allocate ks_matrix if necessary, take current overlap matrix as template
1313!> \param qs_env ...
1314!> \param is_complex ...
1315!> \par History
1316!> refactoring 04.03.2011 [MI]
1317!> \author
1318! **************************************************************************************************
1319
1320 SUBROUTINE qs_ks_allocate_basics(qs_env, is_complex)
1321 TYPE(qs_environment_type), POINTER :: qs_env
1322 LOGICAL, INTENT(in) :: is_complex
1323
1324 CHARACTER(LEN=default_string_length) :: headline
1325 INTEGER :: ic, ispin, nimages, nspins
1326 LOGICAL :: do_kpoints
1327 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, matrixkp_im_ks, matrixkp_ks
1328 TYPE(dbcsr_type), POINTER :: refmatrix
1329 TYPE(dft_control_type), POINTER :: dft_control
1330 TYPE(kpoint_type), POINTER :: kpoints
1331 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1332 POINTER :: sab_orb
1333 TYPE(qs_ks_env_type), POINTER :: ks_env
1334
1335 NULLIFY (dft_control, ks_env, matrix_s_kp, sab_orb, matrixkp_ks, refmatrix, matrixkp_im_ks, kpoints)
1336
1337 CALL get_qs_env(qs_env, &
1338 dft_control=dft_control, &
1339 matrix_s_kp=matrix_s_kp, &
1340 ks_env=ks_env, &
1341 kpoints=kpoints, &
1342 do_kpoints=do_kpoints, &
1343 matrix_ks_kp=matrixkp_ks, &
1344 matrix_ks_im_kp=matrixkp_im_ks)
1345
1346 IF (do_kpoints) THEN
1347 CALL get_kpoint_info(kpoints, sab_nl=sab_orb)
1348 ELSE
1349 CALL get_qs_env(qs_env, sab_orb=sab_orb)
1350 END IF
1351
1352 nspins = dft_control%nspins
1353 nimages = dft_control%nimages
1354
1355 IF (.NOT. ASSOCIATED(matrixkp_ks)) THEN
1356 CALL dbcsr_allocate_matrix_set(matrixkp_ks, nspins, nimages)
1357 refmatrix => matrix_s_kp(1, 1)%matrix
1358 DO ispin = 1, nspins
1359 DO ic = 1, nimages
1360 IF (nspins > 1) THEN
1361 IF (ispin == 1) THEN
1362 headline = "KOHN-SHAM MATRIX FOR ALPHA SPIN"
1363 ELSE
1364 headline = "KOHN-SHAM MATRIX FOR BETA SPIN"
1365 END IF
1366 ELSE
1367 headline = "KOHN-SHAM MATRIX"
1368 END IF
1369 ALLOCATE (matrixkp_ks(ispin, ic)%matrix)
1370 CALL dbcsr_create(matrix=matrixkp_ks(ispin, ic)%matrix, template=refmatrix, &
1371 name=trim(headline), matrix_type=dbcsr_type_symmetric)
1372 CALL cp_dbcsr_alloc_block_from_nbl(matrixkp_ks(ispin, ic)%matrix, sab_orb)
1373 CALL dbcsr_set(matrixkp_ks(ispin, ic)%matrix, 0.0_dp)
1374 END DO
1375 END DO
1376 CALL set_ks_env(ks_env, matrix_ks_kp=matrixkp_ks)
1377 END IF
1378
1379 IF (is_complex) THEN
1380 IF (.NOT. ASSOCIATED(matrixkp_im_ks)) THEN
1381 cpassert(nspins == SIZE(matrixkp_ks, 1))
1382 cpassert(nimages == SIZE(matrixkp_ks, 2))
1383 CALL dbcsr_allocate_matrix_set(matrixkp_im_ks, nspins, nimages)
1384 DO ispin = 1, nspins
1385 DO ic = 1, nimages
1386 IF (nspins > 1) THEN
1387 IF (ispin == 1) THEN
1388 headline = "IMAGINARY KOHN-SHAM MATRIX FOR ALPHA SPIN"
1389 ELSE
1390 headline = "IMAGINARY KOHN-SHAM MATRIX FOR BETA SPIN"
1391 END IF
1392 ELSE
1393 headline = "IMAGINARY KOHN-SHAM MATRIX"
1394 END IF
1395 ALLOCATE (matrixkp_im_ks(ispin, ic)%matrix)
1396 refmatrix => matrixkp_ks(ispin, ic)%matrix ! base on real part, but anti-symmetric
1397 CALL dbcsr_create(matrix=matrixkp_im_ks(ispin, ic)%matrix, template=refmatrix, &
1398 name=trim(headline), matrix_type=dbcsr_type_antisymmetric)
1399 CALL cp_dbcsr_alloc_block_from_nbl(matrixkp_im_ks(ispin, ic)%matrix, sab_orb)
1400 CALL dbcsr_set(matrixkp_im_ks(ispin, ic)%matrix, 0.0_dp)
1401 END DO
1402 END DO
1403 CALL set_ks_env(ks_env, matrix_ks_im_kp=matrixkp_im_ks)
1404 END IF
1405 END IF
1406
1407 END SUBROUTINE qs_ks_allocate_basics
1408
1409END MODULE qs_ks_methods
Contains ADMM methods which only require the density matrix.
subroutine, public admm_dm_merge_ks_matrix(qs_env)
Entry methods: Merges auxiliary Kohn-Sham matrix into primary one.
subroutine, public admm_dm_calc_rho_aux(qs_env)
Entry methods: Calculates auxiliary density matrix from primary one.
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_mo_calc_rho_aux_kp(qs_env)
...
subroutine, public admm_mo_merge_ks_matrix(qs_env)
...
subroutine, public admm_update_ks_atom(qs_env, calculate_forces)
Adds the GAPW exchange contribution to the aux_fit ks matrices.
subroutine, public calc_admm_ovlp_forces_kp(qs_env)
Calculate the forces due to the AUX/ORB basis overlap in ADMM, in the KP case.
subroutine, public admm_mo_calc_rho_aux(qs_env)
...
subroutine, public calc_admm_ovlp_forces(qs_env)
Calculate the forces due to the AUX/ORB basis overlap in ADMM.
subroutine, public calc_admm_mo_derivatives(qs_env, mo_derivs)
Calculate the derivative of the AUX_FIT mo, based on the ORB mo_derivs.
Types and set/get functions for auxiliary density matrix methods.
Definition admm_types.F:15
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Definition admm_types.F:593
Handles all functions related to the CELL.
Definition cell_types.F:15
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_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_filter(matrix, eps)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
subroutine, public dbcsr_copy_columns_hack(matrix_b, matrix_a, ncol, source_start, target_start, para_env, blacs_env)
hack for dbcsr_copy_columns
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
Definition cp_ddapc.F:15
subroutine, public qs_ks_ddapc(qs_env, auxbas_pw_pool, rho_tot_gspace, v_hartree_gspace, v_spin_ddapc_rest_r, energy, calculate_forces, ks_matrix, just_energy)
Set of methods using DDAPC charges.
Definition cp_ddapc.F:81
represent a full matrix distributed on many processors
Definition cp_fm_types.F:15
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, 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
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
Utilities for hfx and admm methods.
subroutine, public hfx_admm_init(qs_env, calculate_forces, ext_xc_section)
...
subroutine, public hfx_ks_matrix(qs_env, matrix_ks, rho, energy, calculate_forces, just_energy, v_rspace_new, v_tau_rspace, ext_xc_section)
Add the hfx contributions to the Hamiltonian.
subroutine, public hfx_ks_matrix_kp(qs_env, matrix_ks, energy, calculate_forces)
Add the HFX K-point contribution to the real-space Hamiltonians.
collects all constants needed in input so that they can be used without circular dependencies
integer, parameter, public smeagol_runtype_emtransport
integer, parameter, public do_ppl_grid
integer, parameter, public outer_scf_becke_constraint
integer, parameter, public outer_scf_hirshfeld_constraint
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
Routines for a Kim-Gordon-like partitioning into molecular subunits.
subroutine, public kg_ekin_subset(qs_env, ks_matrix, ekin_mol, calc_force, do_kernel, pmat_ext)
Calculates the subsystem Hohenberg-Kohn kinetic energy and the forces.
Defines the basic variable types.
Definition kinds.F:23
integer, parameter, public dp
Definition kinds.F:34
integer, parameter, public default_string_length
Definition kinds.F:57
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Calculates integral matrices for LRIGPW method lri : local resolution of the identity.
subroutine, public v_int_ppl_energy(qs_env, lri_v_int, ecore_ppl_ri)
...
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
Collection of simple mathematical functions and subroutines.
Definition mathlib.F:15
logical function, public abnormal_value(a)
determines if a value is not normal (e.g. for Inf and Nan) based on IO to work also under optimizatio...
Definition mathlib.F:159
Interface to the message passing library MPI.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_implicit
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Routines for image charge calculation within QM/MM.
subroutine, public calculate_image_pot(v_hartree_rspace, rho_hartree_gspace, energy, qmmm_env, qs_env)
determines coefficients by solving image_matrix*coeff=-pot_const by Gaussian elimination or in an ite...
subroutine, public integrate_potential_devga_rspace(potential, coeff, forces, qmmm_env, qs_env)
calculates the image forces on the MM atoms
subroutine, public add_image_pot_to_hartree_pot(v_hartree, v_metal, qs_env)
Add potential of metal (image charge pot) to Hartree Potential.
Defines CDFT control structures.
container for information about total charges on the grids
Calculation of the energies concerning the core charge distribution.
Calculation of Overlap and Hamiltonian matrices in DFTB.
subroutine, public build_dftb_ks_matrix(qs_env, calculate_forces, just_energy)
...
Calculates the energy contribution and the mo_derivative of a static periodic electric field.
subroutine, public qs_efield_berry_phase(qs_env, just_energy, calculate_forces)
...
Calculates the energy contribution and the mo_derivative of a static electric field (nonperiodic)
subroutine, public qs_efield_local_operator(qs_env, just_energy, calculate_forces)
...
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, 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.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
Types needed for a for a Harris model calculation.
Harris method environment setup and handling.
subroutine, public harris_set_potentials(harris_env, vh_rspace, vxc_rspace)
...
Integrate single or product functions over a potential on a RS grid.
Set of routines to apply restraints to the KS hamiltonian.
subroutine, public qs_ks_s2_restraint(dft_control, qs_env, matrix_s, energy, calculate_forces, just_energy)
...
subroutine, public qs_ks_mulliken_restraint(energy, dft_control, just_energy, para_env, ks_matrix, matrix_s, rho, mulliken_order_p)
...
subroutine, public qs_ks_cdft_constraint(qs_env, auxbas_pw_pool, calculate_forces, cdft_control)
Apply a CDFT constraint.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
Definition qs_ks_atom.F:12
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
Definition qs_ks_atom.F:110
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public evaluate_core_matrix_p_mix_new(qs_env)
Calculates the traces of the core matrices and the density matrix.
subroutine, public evaluate_core_matrix_traces(qs_env)
Calculates the traces of the core matrices and the density matrix.
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 qs_ks_allocate_basics(qs_env, is_complex)
Allocate ks_matrix if necessary, take current overlap matrix as template.
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
subroutine, public qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, print_active, ext_ks_matrix, ext_xc_section)
routine where the real calculations are made: the KS matrix is calculated
subroutine, public qmmm_calculate_energy(qs_env, rho, v_qmmm, qmmm_energy)
Computes the contribution to the total energy of the QM/MM electrostatic coupling.
subroutine, public qmmm_modify_hartree_pot(v_hartree, v_qmmm, scale)
Modify the hartree potential in order to include the QM/MM correction.
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)
...
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
Definition qs_ks_utils.F:22
subroutine, public print_densities(qs_env, rho)
...
subroutine, public get_embed_potential_energy(qs_env, rho, v_rspace_embed, dft_control, embed_corr, just_energy)
...
subroutine, public low_spin_roks(energy, qs_env, dft_control, do_hfx, just_energy, calculate_forces, auxbas_pw_pool)
do ROKS calculations yielding low spin states
subroutine, public sum_up_and_integrate(qs_env, ks_matrix, rho, my_rho, vppl_rspace, v_rspace_new, v_rspace_new_aux_fit, v_tau_rspace, v_tau_rspace_aux_fit, v_sic_rspace, v_spin_ddapc_rest_r, v_sccs_rspace, v_rspace_embed, cdft_control, calculate_forces)
Sum up all potentials defined on the grid and integrate.
subroutine, public print_detailed_energy(qs_env, dft_control, input, energy, mulliken_order_p)
Print detailed energies.
subroutine, public calculate_zmp_potential(qs_env, v_rspace_new, rho, exc)
Calculate the ZMP potential and energy as in Zhao, Morrison Parr PRA 50i, 2138 (1994) V_c^\lambda def...
subroutine, public calc_v_sic_rspace(v_sic_rspace, energy, qs_env, dft_control, rho, poisson_env, just_energy, calculate_forces, auxbas_pw_pool)
do sic calculations on the spin density
subroutine, public sic_explicit_orbitals(energy, qs_env, dft_control, poisson_env, just_energy, calculate_forces, auxbas_pw_pool)
do sic calculations on explicit orbitals
subroutine, public compute_matrix_vxc(qs_env, v_rspace, matrix_vxc)
compute matrix_vxc, defined via the potential created by qs_vxc_create ignores things like tau functi...
Definition and initialisation of the mo data type.
Definition qs_mo_types.F:22
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
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...
Self-consistent continuum solvation (SCCS) model implementation.
Definition qs_sccs.F:29
subroutine, public sccs(qs_env, rho_tot_gspace, v_hartree_gspace, v_sccs, h_stress)
Self-consistent continuum solvation (SCCS) model implementation.
Definition qs_sccs.F:122
module that contains the definitions of the scf types
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
Definition qs_vxc_atom.F:12
subroutine, public calculate_vxc_atom(qs_env, energy_only, exc1, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external)
...
Definition qs_vxc_atom.F:86
subroutine, public qs_vxc_create(ks_env, rho_struct, xc_section, vxc_rho, vxc_tau, exc, just_energy, edisp, dispersion_env, adiabatic_rescale_factor, pw_env_external)
calculates and allocates the xc potential, already reducing it to the dependence on rho and the one o...
Definition qs_vxc.F:98
Utilities for rtp in combination with admm methods adapted routines from admm_method (author Manuel G...
subroutine, public rtp_admm_merge_ks_matrix(qs_env)
...
subroutine, public rtp_admm_calc_rho_aux(qs_env)
Compute the ADMM density matrix in case of rtp (complex MO's)
Calculation of the Fock matrix for SE methods.
subroutine, public build_se_fock_matrix(qs_env, calculate_forces, just_energy)
Construction of the Fock matrix for NDDO methods.
CP2K+SMEAGOL interface.
subroutine, public smeagol_shift_v_hartree(v_hartree_rspace, cell, hartreeleadsleft, hartreeleadsright, hartreeleadsbottom, vbias, zleft, zright, isexplicit_zright, isexplicit_bottom)
Align Hatree potential of semi-infinite leads to match bulk-transport calculation and apply external ...
subroutine, public calc_dipsurf_potential(qs_env, energy)
compute the surface dipole and the correction to the hartree potential
tblite matrix build
subroutine, public build_tblite_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
...
Calculation of KS matrix in xTB Reference: Stefan Grimme, Christoph Bannwarth, Philip Shushkov JCTC 1...
subroutine, public build_xtb_ks_matrix(qs_env, calculate_forces, just_energy, ext_ks_matrix)
...
stores some data used in wavefunction fitting
Definition admm_types.F:120
Type defining parameters related to the simulation cell.
Definition cell_types.F:60
represent a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information about kpoints.
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Container for information about total charges on the grids.
Contains information on the Harris method.
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.