(git:374b731)
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-2024 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
39 USE cp_ddapc, ONLY: qs_ks_ddapc
40 USE cp_fm_types, ONLY: cp_fm_type
44 USE cp_output_handling, ONLY: cp_p_file,&
46 USE dbcsr_api, ONLY: &
47 dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_filter, dbcsr_get_info, dbcsr_multiply, &
48 dbcsr_p_type, dbcsr_release, dbcsr_set, dbcsr_type, dbcsr_type_antisymmetric, &
49 dbcsr_type_symmetric
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,&
102 USE qs_integrate_potential, ONLY: integrate_ppl_rspace,&
103 integrate_rho_nlcc,&
104 integrate_v_core_rspace
108 USE qs_ks_atom, ONLY: update_ks_atom
111 USE qs_ks_types, ONLY: qs_ks_env_type,&
113 USE qs_ks_utils, ONLY: &
118 USE qs_mo_types, ONLY: get_mo_set,&
122 USE qs_rho_types, ONLY: qs_rho_get,&
124 USE qs_sccs, ONLY: sccs
125 USE qs_vxc, ONLY: qs_vxc_create
131 USE virial_types, ONLY: virial_type
133#include "./base/base_uses.f90"
134
135 IMPLICIT NONE
136
137 PRIVATE
138
139 LOGICAL, PARAMETER :: debug_this_module = .true.
140 CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_ks_methods'
141
144
145CONTAINS
146
147! **************************************************************************************************
148!> \brief routine where the real calculations are made: the
149!> KS matrix is calculated
150!> \param qs_env the qs_env to update
151!> \param calculate_forces if true calculate the quantities needed
152!> to calculate the forces. Defaults to false.
153!> \param just_energy if true updates the energies but not the
154!> ks matrix. Defaults to false
155!> \param print_active ...
156!> \param ext_ks_matrix ...
157!> \par History
158!> 06.2002 moved from qs_scf to qs_ks_methods, use of ks_env
159!> new did_change scheme [fawzi]
160!> 10.2002 introduced pools, uses updated rho as input, LSD [fawzi]
161!> 10.2004 build_kohn_sham matrix now also computes the derivatives
162!> of the total energy wrt to the MO coefs, if instructed to
163!> do so. This appears useful for orbital dependent functionals
164!> where the KS matrix alone (however this might be defined)
165!> does not contain the info to construct this derivative.
166!> \author Matthias Krack
167!> \note
168!> make rho, energy and qs_charges optional, defaulting
169!> to qs_env components?
170! **************************************************************************************************
171 SUBROUTINE qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, &
172 print_active, ext_ks_matrix)
173 TYPE(qs_environment_type), POINTER :: qs_env
174 LOGICAL, INTENT(in) :: calculate_forces, just_energy
175 LOGICAL, INTENT(IN), OPTIONAL :: print_active
176 TYPE(dbcsr_p_type), DIMENSION(:), OPTIONAL, &
177 POINTER :: ext_ks_matrix
178
179 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_ks_build_kohn_sham_matrix'
180
181 CHARACTER(len=default_string_length) :: name
182 INTEGER :: handle, iatom, img, ispin, nimages, ns, &
183 nspins
184 LOGICAL :: do_adiabatic_rescaling, do_ddapc, do_hfx, do_ppl, dokp, gapw, gapw_xc, &
185 hfx_treat_lsd_in_core, just_energy_xc, lrigpw, my_print, rigpw, use_virial
186 REAL(kind=dp) :: ecore_ppl, edisp, ee_ener, ekin_mol, &
187 mulliken_order_p, vscale
188 REAL(kind=dp), DIMENSION(3, 3) :: h_stress, pv_loc
189 TYPE(admm_type), POINTER :: admm_env
190 TYPE(cdft_control_type), POINTER :: cdft_control
191 TYPE(cell_type), POINTER :: cell
192 TYPE(cp_logger_type), POINTER :: logger
193 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ksmat, matrix_vxc, mo_derivs
194 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: ks_matrix, ks_matrix_im, matrix_h, &
195 matrix_h_im, matrix_s, my_rho, rho_ao
196 TYPE(dft_control_type), POINTER :: dft_control
197 TYPE(ecoul_1center_type), DIMENSION(:), POINTER :: ecoul_1c
198 TYPE(local_rho_type), POINTER :: local_rho_set
199 TYPE(lri_density_type), POINTER :: lri_density
200 TYPE(lri_environment_type), POINTER :: lri_env
201 TYPE(lri_kind_type), DIMENSION(:), POINTER :: lri_v_int
202 TYPE(mp_para_env_type), POINTER :: para_env
203 TYPE(pw_c1d_gs_type) :: rho_tot_gspace, v_hartree_gspace
204 TYPE(pw_c1d_gs_type), POINTER :: rho_core
205 TYPE(pw_env_type), POINTER :: pw_env
206 TYPE(pw_poisson_type), POINTER :: poisson_env
207 TYPE(pw_pool_type), POINTER :: auxbas_pw_pool
208 TYPE(pw_r3d_rs_type), DIMENSION(:), POINTER :: rho_r, v_rspace_embed, v_rspace_new, &
209 v_rspace_new_aux_fit, v_tau_rspace, &
210 v_tau_rspace_aux_fit
211 TYPE(pw_r3d_rs_type), POINTER :: rho0_s_rs, rho_nlcc, v_hartree_rspace, &
212 v_sccs_rspace, v_sic_rspace, &
213 v_spin_ddapc_rest_r, vee, vppl_rspace
214 TYPE(qs_energy_type), POINTER :: energy
215 TYPE(qs_ks_env_type), POINTER :: ks_env
216 TYPE(qs_rho_type), POINTER :: rho, rho_struct, rho_xc
217 TYPE(section_vals_type), POINTER :: adiabatic_rescaling_section, &
218 hfx_sections, input, scf_section, &
219 xc_section
220 TYPE(virial_type), POINTER :: virial
221
222 CALL timeset(routinen, handle)
223 NULLIFY (admm_env, cell, dft_control, logger, mo_derivs, my_rho, &
224 rho_struct, para_env, pw_env, virial, vppl_rspace, &
225 adiabatic_rescaling_section, hfx_sections, &
226 input, scf_section, xc_section, matrix_h, matrix_h_im, matrix_s, &
227 auxbas_pw_pool, poisson_env, v_rspace_new, v_rspace_new_aux_fit, &
228 v_tau_rspace, v_tau_rspace_aux_fit, matrix_vxc, vee, rho_nlcc, &
229 ks_env, ks_matrix, ks_matrix_im, rho, energy, rho_xc, rho_r, rho_ao, rho_core)
230
231 cpassert(ASSOCIATED(qs_env))
232
233 logger => cp_get_default_logger()
234 my_print = .true.
235 IF (PRESENT(print_active)) my_print = print_active
236
237 CALL get_qs_env(qs_env, &
238 ks_env=ks_env, &
239 dft_control=dft_control, &
240 matrix_h_kp=matrix_h, &
241 matrix_h_im_kp=matrix_h_im, &
242 matrix_s_kp=matrix_s, &
243 matrix_ks_kp=ks_matrix, &
244 matrix_ks_im_kp=ks_matrix_im, &
245 matrix_vxc=matrix_vxc, &
246 pw_env=pw_env, &
247 cell=cell, &
248 para_env=para_env, &
249 input=input, &
250 virial=virial, &
251 v_hartree_rspace=v_hartree_rspace, &
252 vee=vee, &
253 rho_nlcc=rho_nlcc, &
254 rho=rho, &
255 rho_core=rho_core, &
256 rho_xc=rho_xc, &
257 energy=energy)
258
259 CALL qs_rho_get(rho, rho_r=rho_r, rho_ao_kp=rho_ao)
260
261 IF (PRESENT(ext_ks_matrix)) THEN
262 ! remap pointer to allow for non-kpoint external ks matrix
263 ! ext_ks_matrix is used in linear response code
264 ns = SIZE(ext_ks_matrix)
265 ks_matrix(1:ns, 1:1) => ext_ks_matrix(1:ns)
266 END IF
267
268 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
269
270 hfx_sections => section_vals_get_subs_vals(input, "DFT%XC%HF")
271 CALL section_vals_get(hfx_sections, explicit=do_hfx)
272 IF (do_hfx) THEN
273 CALL section_vals_val_get(hfx_sections, "TREAT_LSD_IN_CORE", l_val=hfx_treat_lsd_in_core, &
274 i_rep_section=1)
275 END IF
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 nimages = dft_control%nimages
286 nspins = dft_control%nspins
287 cpassert(ASSOCIATED(matrix_h))
288 cpassert(ASSOCIATED(matrix_s))
289 cpassert(ASSOCIATED(rho))
290 cpassert(ASSOCIATED(pw_env))
291 cpassert(SIZE(ks_matrix, 1) > 0)
292 dokp = (nimages > 1)
293
294 ! Setup the possible usage of DDAPC charges
295 do_ddapc = dft_control%qs_control%ddapc_restraint .OR. &
296 qs_env%cp_ddapc_ewald%do_decoupling .OR. &
297 qs_env%cp_ddapc_ewald%do_qmmm_periodic_decpl .OR. &
298 qs_env%cp_ddapc_ewald%do_solvation
299
300 ! Check if LRIGPW is used
301 lrigpw = dft_control%qs_control%lrigpw
302 rigpw = dft_control%qs_control%rigpw
303 IF (rigpw) THEN
304 cpassert(nimages == 1)
305 END IF
306 IF (lrigpw .AND. rigpw) THEN
307 cpabort(" LRI and RI are not compatible")
308 END IF
309
310 ! Check for GAPW method : additional terms for local densities
311 gapw = dft_control%qs_control%gapw
312 gapw_xc = dft_control%qs_control%gapw_xc
313 IF (gapw_xc .AND. gapw) THEN
314 cpabort(" GAPW and GAPW_XC are not compatible")
315 END IF
316 IF ((gapw .AND. lrigpw) .OR. (gapw_xc .AND. lrigpw)) THEN
317 cpabort(" GAPW/GAPW_XC and LRIGPW are not compatible")
318 END IF
319 IF ((gapw .AND. rigpw) .OR. (gapw_xc .AND. rigpw)) THEN
320 cpabort(" GAPW/GAPW_XC and RIGPW are not compatible")
321 END IF
322
323 do_ppl = dft_control%qs_control%do_ppl_method == do_ppl_grid
324 IF (do_ppl) THEN
325 cpassert(.NOT. gapw)
326 CALL get_qs_env(qs_env=qs_env, vppl=vppl_rspace)
327 END IF
328
329 IF (gapw_xc) THEN
330 cpassert(ASSOCIATED(rho_xc))
331 END IF
332
333 ! gets the tmp grids
334 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
335
336 IF (gapw .AND. (poisson_env%parameters%solver .EQ. pw_poisson_implicit)) THEN
337 cpabort("The implicit Poisson solver cannot be used in conjunction with GAPW.")
338 END IF
339
340 ! *** Prepare densities for gapw ***
341 IF (gapw .OR. gapw_xc) THEN
342 CALL prepare_gapw_den(qs_env, do_rho0=(.NOT. gapw_xc))
343 END IF
344
345 ! Calculate the Hartree potential
346 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
347 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
348
349 scf_section => section_vals_get_subs_vals(input, "DFT%SCF")
350 IF (btest(cp_print_key_should_output(logger%iter_info, scf_section, &
351 "PRINT%DETAILED_ENERGY"), &
352 cp_p_file) .AND. &
353 (.NOT. gapw) .AND. (.NOT. gapw_xc) .AND. &
354 (.NOT. (poisson_env%parameters%solver .EQ. pw_poisson_implicit))) THEN
355 CALL pw_zero(rho_tot_gspace)
356 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density=.true.)
357 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, energy%e_hartree, &
358 v_hartree_gspace)
359 CALL pw_zero(rho_tot_gspace)
360 CALL pw_zero(v_hartree_gspace)
361 END IF
362
363 ! Get the total density in g-space [ions + electrons]
364 CALL calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho)
365
366 IF (my_print) THEN
367 CALL print_densities(qs_env, rho)
368 END IF
369
370 IF (dft_control%do_sccs) THEN
371 ! Self-consistent continuum solvation (SCCS) model
372 NULLIFY (v_sccs_rspace)
373 ALLOCATE (v_sccs_rspace)
374 CALL auxbas_pw_pool%create_pw(v_sccs_rspace)
375
376 IF (poisson_env%parameters%solver .EQ. pw_poisson_implicit) THEN
377 cpabort("The implicit Poisson solver cannot be used together with SCCS.")
378 END IF
379
380 IF (use_virial .AND. calculate_forces) THEN
381 CALL sccs(qs_env, rho_tot_gspace, v_hartree_gspace, v_sccs_rspace, &
382 h_stress=h_stress)
383 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
384 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
385 ELSE
386 CALL sccs(qs_env, rho_tot_gspace, v_hartree_gspace, v_sccs_rspace)
387 END IF
388 ELSE
389 ! Getting the Hartree energy and Hartree potential. Also getting the stress tensor
390 ! from the Hartree term if needed. No nuclear force information here
391 IF (use_virial .AND. calculate_forces) THEN
392 h_stress(:, :) = 0.0_dp
393 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, energy%hartree, &
394 v_hartree_gspace, h_stress=h_stress, &
395 rho_core=rho_core)
396 virial%pv_ehartree = virial%pv_ehartree + h_stress/real(para_env%num_pe, dp)
397 virial%pv_virial = virial%pv_virial + h_stress/real(para_env%num_pe, dp)
398 ELSE
399 CALL pw_poisson_solve(poisson_env, rho_tot_gspace, energy%hartree, &
400 v_hartree_gspace, rho_core=rho_core)
401 END IF
402 END IF
403
404 ! In case decouple periodic images and/or apply restraints to charges
405 IF (do_ddapc) THEN
406 CALL qs_ks_ddapc(qs_env, auxbas_pw_pool, rho_tot_gspace, v_hartree_gspace, &
407 v_spin_ddapc_rest_r, energy, calculate_forces, ks_matrix, &
408 just_energy)
409 ELSE
410 dft_control%qs_control%ddapc_explicit_potential = .false.
411 dft_control%qs_control%ddapc_restraint_is_spin = .false.
412 IF (.NOT. just_energy) THEN
413 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
414 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
415 END IF
416 END IF
417 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
418
419 IF (dft_control%correct_surf_dip) THEN
420 IF (dft_control%surf_dip_correct_switch) THEN
421 CALL calc_dipsurf_potential(qs_env, energy)
422 energy%hartree = energy%hartree + energy%surf_dipole
423 END IF
424 END IF
425
426 ! SIC
427 CALL calc_v_sic_rspace(v_sic_rspace, energy, qs_env, dft_control, rho, poisson_env, &
428 just_energy, calculate_forces, auxbas_pw_pool)
429
430 IF (gapw) THEN
431 CALL get_qs_env(qs_env, ecoul_1c=ecoul_1c, local_rho_set=local_rho_set)
432 CALL vh_1c_gg_integrals(qs_env, energy%hartree_1c, ecoul_1c, local_rho_set, para_env, tddft=.false., &
433 core_2nd=.false.)
434 END IF
435
436 ! Check if CDFT constraint is needed
437 CALL qs_ks_cdft_constraint(qs_env, auxbas_pw_pool, calculate_forces, cdft_control)
438
439 ! Adds the External Potential if requested
440 IF (dft_control%apply_external_potential) THEN
441 ! Compute the energy due to the external potential
442 ee_ener = 0.0_dp
443 DO ispin = 1, nspins
444 ee_ener = ee_ener + pw_integral_ab(rho_r(ispin), vee)
445 END DO
446 IF (.NOT. just_energy) THEN
447 IF (gapw) THEN
448 CALL get_qs_env(qs_env=qs_env, &
449 rho0_s_rs=rho0_s_rs)
450 cpassert(ASSOCIATED(rho0_s_rs))
451 ee_ener = ee_ener + pw_integral_ab(rho0_s_rs, vee)
452 END IF
453 END IF
454 ! the sign accounts for the charge of the electrons
455 energy%ee = -ee_ener
456 END IF
457
458 ! Adds the QM/MM potential
459 IF (qs_env%qmmm) THEN
460 CALL qmmm_calculate_energy(qs_env=qs_env, &
461 rho=rho_r, &
462 v_qmmm=qs_env%ks_qmmm_env%v_qmmm_rspace, &
463 qmmm_energy=energy%qmmm_el)
464 IF (qs_env%qmmm_env_qm%image_charge) THEN
465 CALL calculate_image_pot(v_hartree_rspace=v_hartree_rspace, &
466 rho_hartree_gspace=rho_tot_gspace, &
467 energy=energy, &
468 qmmm_env=qs_env%qmmm_env_qm, &
469 qs_env=qs_env)
470 IF (.NOT. just_energy) THEN
471 CALL add_image_pot_to_hartree_pot(v_hartree=v_hartree_rspace, &
472 v_metal=qs_env%ks_qmmm_env%v_metal_rspace, &
473 qs_env=qs_env)
474 IF (calculate_forces) THEN
476 potential=v_hartree_rspace, coeff=qs_env%image_coeff, &
477 forces=qs_env%qmmm_env_qm%image_charge_pot%image_forcesMM, &
478 qmmm_env=qs_env%qmmm_env_qm, qs_env=qs_env)
479 END IF
480 END IF
481 CALL qs_env%ks_qmmm_env%v_metal_rspace%release()
482 DEALLOCATE (qs_env%ks_qmmm_env%v_metal_rspace)
483 END IF
484 IF (.NOT. just_energy) THEN
485 CALL qmmm_modify_hartree_pot(v_hartree=v_hartree_rspace, &
486 v_qmmm=qs_env%ks_qmmm_env%v_qmmm_rspace, scale=1.0_dp)
487 END IF
488 END IF
489 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
490
491 ! calculate the density matrix for the fitted mo_coeffs
492 IF (dft_control%do_admm) THEN
493 CALL hfx_admm_init(qs_env, calculate_forces)
494
495 IF (dft_control%do_admm_mo) THEN
496 IF (qs_env%run_rtp) THEN
497 CALL rtp_admm_calc_rho_aux(qs_env)
498 ELSE
499 IF (dokp) THEN
500 CALL admm_mo_calc_rho_aux_kp(qs_env)
501 ELSE
502 CALL admm_mo_calc_rho_aux(qs_env)
503 END IF
504 END IF
505 ELSEIF (dft_control%do_admm_dm) THEN
506 CALL admm_dm_calc_rho_aux(qs_env)
507 END IF
508 END IF
509
510 ! only activate stress calculation if
511 IF (use_virial .AND. calculate_forces) virial%pv_calculate = .true.
512
513 ! *** calculate the xc potential on the pw density ***
514 ! *** associates v_rspace_new if the xc potential needs to be computed.
515 ! If we do wavefunction fitting, we need the vxc_potential in the auxiliary basis set
516 IF (dft_control%do_admm) THEN
517 CALL get_qs_env(qs_env, admm_env=admm_env)
518 xc_section => admm_env%xc_section_aux
519 CALL get_admm_env(admm_env, rho_aux_fit=rho_struct)
520
521 ! here we ignore a possible vdW section in admm_env%xc_section_aux
522 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=xc_section, &
523 vxc_rho=v_rspace_new_aux_fit, vxc_tau=v_tau_rspace_aux_fit, exc=energy%exc_aux_fit, &
524 just_energy=just_energy_xc)
525
526 IF (admm_env%do_gapw) THEN
527 !compute the potential due to atomic densities
528 CALL calculate_vxc_atom(qs_env, energy_only=just_energy_xc, exc1=energy%exc1_aux_fit, &
529 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
530 xc_section_external=xc_section, &
531 rho_atom_set_external=admm_env%admm_gapw_env%local_rho_set%rho_atom_set)
532
533 END IF
534
535 NULLIFY (rho_struct)
536
537 IF (use_virial .AND. calculate_forces) THEN
538 vscale = 1.0_dp
539 !Note: ADMMS and ADMMP stress tensor only for closed-shell calculations
540 IF (admm_env%do_admms) vscale = admm_env%gsi(1)**(2.0_dp/3.0_dp)
541 IF (admm_env%do_admmp) vscale = admm_env%gsi(1)**2
542 virial%pv_exc = virial%pv_exc - vscale*virial%pv_xc
543 virial%pv_virial = virial%pv_virial - vscale*virial%pv_xc
544 ! virial%pv_xc will be zeroed in the xc routines
545 END IF
546 xc_section => admm_env%xc_section_primary
547 ELSE
548 xc_section => section_vals_get_subs_vals(input, "DFT%XC")
549 END IF
550
551 IF (gapw_xc) THEN
552 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_struct)
553 ELSE
554 CALL get_qs_env(qs_env=qs_env, rho=rho_struct)
555 END IF
556
557 ! zmp
558 IF (dft_control%apply_external_density .OR. dft_control%apply_external_vxc) THEN
559 energy%exc = 0.0_dp
560 CALL calculate_zmp_potential(qs_env, v_rspace_new, rho, exc=energy%exc)
561 ELSE
562 ! Embedding potential
563 IF (dft_control%apply_embed_pot) THEN
564 NULLIFY (v_rspace_embed)
565 energy%embed_corr = 0.0_dp
566 CALL get_embed_potential_energy(qs_env, rho, v_rspace_embed, dft_control, &
567 energy%embed_corr, just_energy)
568 END IF
569 ! Everything else
570 CALL qs_vxc_create(ks_env=ks_env, rho_struct=rho_struct, xc_section=xc_section, &
571 vxc_rho=v_rspace_new, vxc_tau=v_tau_rspace, exc=energy%exc, &
572 edisp=edisp, dispersion_env=qs_env%dispersion_env, &
573 just_energy=just_energy_xc)
574 IF (edisp /= 0.0_dp) energy%dispersion = edisp
575 IF (qs_env%requires_matrix_vxc .AND. ASSOCIATED(v_rspace_new)) THEN
576 CALL compute_matrix_vxc(qs_env=qs_env, v_rspace=v_rspace_new, matrix_vxc=matrix_vxc)
577 CALL set_ks_env(ks_env, matrix_vxc=matrix_vxc)
578 END IF
579
580 IF (gapw .OR. gapw_xc) THEN
581 CALL calculate_vxc_atom(qs_env, just_energy_xc, energy%exc1, xc_section_external=xc_section)
582 ! test for not implemented (bug) option
583 IF (use_virial .AND. calculate_forces) THEN
584 IF (ASSOCIATED(v_tau_rspace)) THEN
585 cpabort("MGGA STRESS with GAPW/GAPW_XC not implemneted")
586 END IF
587 END IF
588 END IF
589
590 END IF
591
592 NULLIFY (rho_struct)
593 IF (use_virial .AND. calculate_forces) THEN
594 virial%pv_exc = virial%pv_exc - virial%pv_xc
595 virial%pv_virial = virial%pv_virial - virial%pv_xc
596 END IF
597
598 ! *** Add Hartree-Fock contribution if required ***
599 IF (do_hfx) THEN
600 IF (dokp) THEN
601 CALL hfx_ks_matrix_kp(qs_env, ks_matrix, energy, calculate_forces)
602 ELSE
603 CALL hfx_ks_matrix(qs_env, ks_matrix, rho, energy, calculate_forces, &
604 just_energy, v_rspace_new, v_tau_rspace)
605 END IF
606!! Adiabatic rescaling only if do_hfx; right?????
607 END IF !do_hfx
608
609 IF (do_ppl .AND. calculate_forces) THEN
610 cpassert(.NOT. gapw)
611 DO ispin = 1, nspins
612 CALL integrate_ppl_rspace(rho_r(ispin), qs_env)
613 END DO
614 END IF
615
616 IF (ASSOCIATED(rho_nlcc) .AND. calculate_forces) THEN
617 DO ispin = 1, nspins
618 CALL integrate_rho_nlcc(v_rspace_new(ispin), qs_env)
619 IF (dft_control%do_admm) CALL integrate_rho_nlcc(v_rspace_new_aux_fit(ispin), qs_env)
620 END DO
621 END IF
622
623 ! calculate KG correction
624 IF (dft_control%qs_control%do_kg .AND. just_energy) THEN
625
626 cpassert(.NOT. (gapw .OR. gapw_xc))
627 cpassert(nimages == 1)
628 ksmat => ks_matrix(:, 1)
629 CALL kg_ekin_subset(qs_env, ksmat, ekin_mol, calculate_forces, do_kernel=.false.)
630
631 ! subtract kg corr from the total energy
632 energy%exc = energy%exc - ekin_mol
633
634 END IF
635
636 ! *** Single atom contributions ***
637 IF (.NOT. just_energy) THEN
638 IF (calculate_forces) THEN
639 ! Getting nuclear force contribution from the core charge density
640 IF ((poisson_env%parameters%solver .EQ. pw_poisson_implicit) .AND. &
641 (poisson_env%parameters%dielectric_params%dielec_core_correction)) THEN
642 block
643 TYPE(pw_r3d_rs_type) :: v_minus_veps
644 CALL auxbas_pw_pool%create_pw(v_minus_veps)
645 CALL pw_copy(v_hartree_rspace, v_minus_veps)
646 CALL pw_axpy(poisson_env%implicit_env%v_eps, v_minus_veps, -v_hartree_rspace%pw_grid%dvol)
647 CALL integrate_v_core_rspace(v_minus_veps, qs_env)
648 CALL auxbas_pw_pool%give_back_pw(v_minus_veps)
649 END block
650 ELSE
651 CALL integrate_v_core_rspace(v_hartree_rspace, qs_env)
652 END IF
653 END IF
654
655 IF (.NOT. do_hfx) THEN
656 ! Initialize the Kohn-Sham matrix with the core Hamiltonian matrix
657 ! (sets ks sparsity equal to matrix_h sparsity)
658 DO ispin = 1, nspins
659 DO img = 1, nimages
660 CALL dbcsr_get_info(ks_matrix(ispin, img)%matrix, name=name) ! keep the name
661 CALL dbcsr_copy(ks_matrix(ispin, img)%matrix, matrix_h(1, img)%matrix, name=name)
662 END DO
663 END DO
664 ! imaginary part if required
665 IF (qs_env%run_rtp) THEN
666 IF (dft_control%rtp_control%velocity_gauge) THEN
667 cpassert(ASSOCIATED(matrix_h_im))
668 cpassert(ASSOCIATED(ks_matrix_im))
669 DO ispin = 1, nspins
670 DO img = 1, nimages
671 CALL dbcsr_get_info(ks_matrix_im(ispin, img)%matrix, name=name) ! keep the name
672 CALL dbcsr_copy(ks_matrix_im(ispin, img)%matrix, matrix_h_im(1, img)%matrix, name=name)
673 END DO
674 END DO
675 END IF
676 END IF
677 END IF
678
679 IF (use_virial .AND. calculate_forces) THEN
680 pv_loc = virial%pv_virial
681 END IF
682 ! sum up potentials and integrate
683 ! Pointing my_rho to the density matrix rho_ao
684 my_rho => rho_ao
685
686 CALL sum_up_and_integrate(qs_env, ks_matrix, rho, my_rho, vppl_rspace, &
687 v_rspace_new, v_rspace_new_aux_fit, v_tau_rspace, v_tau_rspace_aux_fit, &
688 v_sic_rspace, v_spin_ddapc_rest_r, v_sccs_rspace, v_rspace_embed, &
689 cdft_control, calculate_forces)
690
691 IF (use_virial .AND. calculate_forces) THEN
692 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
693 END IF
694 IF (dft_control%qs_control%do_kg) THEN
695 cpassert(.NOT. (gapw .OR. gapw_xc))
696 cpassert(nimages == 1)
697 ksmat => ks_matrix(:, 1)
698
699 IF (use_virial .AND. calculate_forces) THEN
700 pv_loc = virial%pv_virial
701 END IF
702
703 CALL kg_ekin_subset(qs_env, ksmat, ekin_mol, calculate_forces, do_kernel=.false.)
704 ! subtract kg corr from the total energy
705 energy%exc = energy%exc - ekin_mol
706
707 ! virial corrections
708 IF (use_virial .AND. calculate_forces) THEN
709
710 ! Integral contribution
711 virial%pv_ehartree = virial%pv_ehartree + (virial%pv_virial - pv_loc)
712
713 ! GGA contribution
714 virial%pv_exc = virial%pv_exc + virial%pv_xc
715 virial%pv_virial = virial%pv_virial + virial%pv_xc
716 virial%pv_xc = 0.0_dp
717 END IF
718 END IF
719
720 ELSE
721 IF (do_hfx) THEN
722 IF (.false.) THEN
723 cpwarn("KS matrix not longer correct. Check possible problems with property calculations!")
724 END IF
725 END IF
726 END IF ! .NOT. just energy
727
728 IF (dft_control%qs_control%ddapc_explicit_potential) THEN
729 CALL auxbas_pw_pool%give_back_pw(v_spin_ddapc_rest_r)
730 DEALLOCATE (v_spin_ddapc_rest_r)
731 END IF
732
733 IF (calculate_forces .AND. dft_control%qs_control%cdft) THEN
734 IF (.NOT. cdft_control%transfer_pot) THEN
735 DO iatom = 1, SIZE(cdft_control%group)
736 CALL auxbas_pw_pool%give_back_pw(cdft_control%group(iatom)%weight)
737 DEALLOCATE (cdft_control%group(iatom)%weight)
738 END DO
739 IF (cdft_control%atomic_charges) THEN
740 DO iatom = 1, cdft_control%natoms
741 CALL auxbas_pw_pool%give_back_pw(cdft_control%charge(iatom))
742 END DO
743 DEALLOCATE (cdft_control%charge)
744 END IF
745 IF (cdft_control%type == outer_scf_becke_constraint .AND. &
746 cdft_control%becke_control%cavity_confine) THEN
747 IF (.NOT. ASSOCIATED(cdft_control%becke_control%cavity_mat)) THEN
748 CALL auxbas_pw_pool%give_back_pw(cdft_control%becke_control%cavity)
749 ELSE
750 DEALLOCATE (cdft_control%becke_control%cavity_mat)
751 END IF
752 ELSE IF (cdft_control%type == outer_scf_hirshfeld_constraint) THEN
753 IF (ASSOCIATED(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)) THEN
754 CALL auxbas_pw_pool%give_back_pw(cdft_control%hirshfeld_control%hirshfeld_env%fnorm)
755 END IF
756 END IF
757 IF (ASSOCIATED(cdft_control%charges_fragment)) DEALLOCATE (cdft_control%charges_fragment)
758 cdft_control%save_pot = .false.
759 cdft_control%need_pot = .true.
760 cdft_control%external_control = .false.
761 END IF
762 END IF
763
764 IF (dft_control%do_sccs) THEN
765 CALL auxbas_pw_pool%give_back_pw(v_sccs_rspace)
766 DEALLOCATE (v_sccs_rspace)
767 END IF
768
769 IF (gapw) THEN
770 IF (dft_control%apply_external_potential) THEN
771 ! Integrals of the Hartree potential with g0_soft
772 CALL qmmm_modify_hartree_pot(v_hartree=v_hartree_rspace, &
773 v_qmmm=vee, scale=-1.0_dp)
774 END IF
775 CALL integrate_vhg0_rspace(qs_env, v_hartree_rspace, para_env, calculate_forces)
776 END IF
777
778 IF (gapw .OR. gapw_xc) THEN
779 ! Single atom contributions in the KS matrix ***
780 CALL update_ks_atom(qs_env, ks_matrix, rho_ao, calculate_forces)
781 IF (dft_control%do_admm) THEN
782 !Single atom contribution to the AUX matrices
783 !Note: also update ks_aux_fit matrix in case of rtp
784 CALL admm_update_ks_atom(qs_env, calculate_forces)
785 END IF
786 END IF
787
788 !Calculation of Mulliken restraint, if requested
789 CALL qs_ks_mulliken_restraint(energy, dft_control, just_energy, para_env, &
790 ks_matrix, matrix_s, rho, mulliken_order_p)
791
792 ! Add DFT+U contribution, if requested
793 IF (dft_control%dft_plus_u) THEN
794 cpassert(nimages == 1)
795 IF (just_energy) THEN
796 CALL plus_u(qs_env=qs_env)
797 ELSE
798 ksmat => ks_matrix(:, 1)
799 CALL plus_u(qs_env=qs_env, matrix_h=ksmat)
800 END IF
801 ELSE
802 energy%dft_plus_u = 0.0_dp
803 END IF
804
805 ! At this point the ks matrix should be up to date, filter it if requested
806 DO ispin = 1, nspins
807 DO img = 1, nimages
808 CALL dbcsr_filter(ks_matrix(ispin, img)%matrix, &
809 dft_control%qs_control%eps_filter_matrix)
810 END DO
811 END DO
812
813 !** merge the auxiliary KS matrix and the primary one
814 IF (dft_control%do_admm_mo) THEN
815 IF (qs_env%run_rtp) THEN
816 CALL rtp_admm_merge_ks_matrix(qs_env)
817 ELSE
818 CALL admm_mo_merge_ks_matrix(qs_env)
819 END IF
820 ELSEIF (dft_control%do_admm_dm) THEN
821 CALL admm_dm_merge_ks_matrix(qs_env)
822 END IF
823
824 ! External field (nonperiodic case)
825 CALL qs_efield_local_operator(qs_env, just_energy, calculate_forces)
826
827 ! Right now we can compute the orbital derivative here, as it depends currently only on the available
828 ! Kohn-Sham matrix. This might change in the future, in which case more pieces might need to be assembled
829 ! from this routine, notice that this part of the calculation in not linear scaling
830 ! right now this operation is only non-trivial because of occupation numbers and the restricted keyword
831 IF (qs_env%requires_mo_derivs .AND. .NOT. just_energy .AND. .NOT. qs_env%run_rtp) THEN
832 CALL get_qs_env(qs_env, mo_derivs=mo_derivs)
833 cpassert(nimages == 1)
834 ksmat => ks_matrix(:, 1)
835 CALL calc_mo_derivatives(qs_env, ksmat, mo_derivs)
836 END IF
837
838 ! ADMM overlap forces
839 IF (calculate_forces .AND. dft_control%do_admm) THEN
840 IF (dokp) THEN
841 CALL calc_admm_ovlp_forces_kp(qs_env)
842 ELSE
843 CALL calc_admm_ovlp_forces(qs_env)
844 END IF
845 END IF
846
847 ! deal with low spin roks
848 CALL low_spin_roks(energy, qs_env, dft_control, do_hfx, just_energy, &
849 calculate_forces, auxbas_pw_pool)
850
851 ! deal with sic on explicit orbitals
852 CALL sic_explicit_orbitals(energy, qs_env, dft_control, poisson_env, just_energy, &
853 calculate_forces, auxbas_pw_pool)
854
855 ! Periodic external field
856 CALL qs_efield_berry_phase(qs_env, just_energy, calculate_forces)
857
858 ! adds s2_restraint energy and orbital derivatives
859 CALL qs_ks_s2_restraint(dft_control, qs_env, matrix_s, &
860 energy, calculate_forces, just_energy)
861
862 IF (do_ppl) THEN
863 ! update core energy for grid based local pseudopotential
864 ecore_ppl = 0._dp
865 DO ispin = 1, nspins
866 ecore_ppl = ecore_ppl + pw_integral_ab(vppl_rspace, rho_r(ispin))
867 END DO
868 energy%core = energy%core + ecore_ppl
869 END IF
870
871 IF (lrigpw) THEN
872 ! update core energy for ppl_ri method
873 CALL get_qs_env(qs_env, lri_env=lri_env, lri_density=lri_density)
874 IF (lri_env%ppl_ri) THEN
875 ecore_ppl = 0._dp
876 DO ispin = 1, nspins
877 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
878 CALL v_int_ppl_energy(qs_env, lri_v_int, ecore_ppl)
879 END DO
880 energy%core = energy%core + ecore_ppl
881 END IF
882 END IF
883
884 ! Sum all energy terms to obtain the total energy
885 energy%total = energy%core_overlap + energy%core_self + energy%core + energy%hartree + &
886 energy%hartree_1c + energy%exc + energy%exc1 + energy%ex + &
887 energy%dispersion + energy%gcp + energy%qmmm_el + energy%mulliken + &
888 sum(energy%ddapc_restraint) + energy%s2_restraint + &
889 energy%dft_plus_u + energy%kTS + &
890 energy%efield + energy%efield_core + energy%ee + &
891 energy%ee_core + energy%exc_aux_fit + energy%image_charge + &
892 energy%sccs_pol + energy%cdft + energy%exc1_aux_fit
893
894 IF (dft_control%apply_embed_pot) energy%total = energy%total + energy%embed_corr
895
896 IF (abnormal_value(energy%total)) &
897 cpabort("KS energy is an abnormal value (NaN/Inf).")
898
899 ! Print detailed energy
900 IF (my_print) THEN
901 CALL print_detailed_energy(qs_env, dft_control, input, energy, mulliken_order_p)
902 END IF
903
904 CALL timestop(handle)
905
906 END SUBROUTINE qs_ks_build_kohn_sham_matrix
907
908! **************************************************************************************************
909!> \brief ...
910!> \param rho_tot_gspace ...
911!> \param qs_env ...
912!> \param rho ...
913!> \param skip_nuclear_density ...
914! **************************************************************************************************
915 SUBROUTINE calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
916 TYPE(pw_c1d_gs_type), INTENT(INOUT) :: rho_tot_gspace
917 TYPE(qs_environment_type), POINTER :: qs_env
918 TYPE(qs_rho_type), POINTER :: rho
919 LOGICAL, INTENT(IN), OPTIONAL :: skip_nuclear_density
920
921 INTEGER :: ispin
922 LOGICAL :: my_skip
923 TYPE(dft_control_type), POINTER :: dft_control
924 TYPE(pw_c1d_gs_type), DIMENSION(:), POINTER :: rho_g
925 TYPE(pw_c1d_gs_type), POINTER :: rho0_s_gs, rho_core
926 TYPE(qs_charges_type), POINTER :: qs_charges
927
928 my_skip = .false.
929 IF (PRESENT(skip_nuclear_density)) my_skip = skip_nuclear_density
930
931 CALL qs_rho_get(rho, rho_g=rho_g)
932 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
933
934 IF (.NOT. my_skip) THEN
935 NULLIFY (rho_core)
936 CALL get_qs_env(qs_env=qs_env, rho_core=rho_core)
937 IF (dft_control%qs_control%gapw) THEN
938 NULLIFY (rho0_s_gs)
939 CALL get_qs_env(qs_env=qs_env, rho0_s_gs=rho0_s_gs)
940 cpassert(ASSOCIATED(rho0_s_gs))
941 CALL pw_copy(rho0_s_gs, rho_tot_gspace)
942 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw) THEN
943 CALL pw_axpy(rho_core, rho_tot_gspace)
944 END IF
945 ELSE
946 CALL pw_copy(rho_core, rho_tot_gspace)
947 END IF
948 DO ispin = 1, dft_control%nspins
949 CALL pw_axpy(rho_g(ispin), rho_tot_gspace)
950 END DO
951 CALL get_qs_env(qs_env=qs_env, qs_charges=qs_charges)
952 qs_charges%total_rho_gspace = pw_integrate_function(rho_tot_gspace, isign=-1)
953 ELSE
954 DO ispin = 1, dft_control%nspins
955 CALL pw_axpy(rho_g(ispin), rho_tot_gspace)
956 END DO
957 END IF
958
959 END SUBROUTINE calc_rho_tot_gspace
960
961! **************************************************************************************************
962!> \brief compute MO derivatives
963!> \param qs_env the qs_env to update
964!> \param ks_matrix ...
965!> \param mo_derivs ...
966!> \par History
967!> 01.2014 created, transferred from qs_ks_build_kohn_sham_matrix in
968!> separate subroutine
969!> \author Dorothea Golze
970! **************************************************************************************************
971 SUBROUTINE calc_mo_derivatives(qs_env, ks_matrix, mo_derivs)
972 TYPE(qs_environment_type), POINTER :: qs_env
973 TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: ks_matrix, mo_derivs
974
975 INTEGER :: ispin
976 LOGICAL :: uniform_occupation
977 REAL(kind=dp), DIMENSION(:), POINTER :: occupation_numbers
978 TYPE(cp_fm_type), POINTER :: mo_coeff
979 TYPE(dbcsr_type) :: mo_derivs2_tmp1, mo_derivs2_tmp2
980 TYPE(dbcsr_type), POINTER :: mo_coeff_b
981 TYPE(dft_control_type), POINTER :: dft_control
982 TYPE(mo_set_type), DIMENSION(:), POINTER :: mo_array
983
984 NULLIFY (dft_control, mo_array, mo_coeff, mo_coeff_b, occupation_numbers)
985
986 CALL get_qs_env(qs_env, &
987 dft_control=dft_control, &
988 mos=mo_array)
989
990 DO ispin = 1, SIZE(mo_derivs)
991
992 CALL get_mo_set(mo_set=mo_array(ispin), mo_coeff=mo_coeff, &
993 mo_coeff_b=mo_coeff_b, occupation_numbers=occupation_numbers)
994 CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(ispin)%matrix, mo_coeff_b, &
995 0.0_dp, mo_derivs(ispin)%matrix)
996
997 IF (dft_control%restricted) THEN
998 ! only the first mo_set are actual variables, but we still need both
999 cpassert(ispin == 1)
1000 cpassert(SIZE(mo_array) == 2)
1001 ! use a temporary array with the same size as the first spin for the second spin
1002
1003 ! uniform_occupation is needed for this case, otherwise we can no
1004 ! reconstruct things in ot, since we irreversibly sum
1005 CALL get_mo_set(mo_set=mo_array(1), uniform_occupation=uniform_occupation)
1006 cpassert(uniform_occupation)
1007 CALL get_mo_set(mo_set=mo_array(2), uniform_occupation=uniform_occupation)
1008 cpassert(uniform_occupation)
1009
1010 ! The beta-spin might have fewer orbitals than alpa-spin...
1011 ! create tempoary matrices with beta_nmo columns
1012 CALL get_mo_set(mo_set=mo_array(2), mo_coeff_b=mo_coeff_b)
1013 CALL dbcsr_create(mo_derivs2_tmp1, template=mo_coeff_b)
1014
1015 ! calculate beta derivatives
1016 CALL dbcsr_multiply('n', 'n', 1.0_dp, ks_matrix(2)%matrix, mo_coeff_b, 0.0_dp, mo_derivs2_tmp1)
1017
1018 ! create larger matrix with alpha_nmo columns
1019 CALL dbcsr_create(mo_derivs2_tmp2, template=mo_derivs(1)%matrix)
1020 CALL dbcsr_set(mo_derivs2_tmp2, 0.0_dp)
1021
1022 ! copy into larger matrix, fills the first beta_nmo columns
1023 CALL dbcsr_copy_columns_hack(mo_derivs2_tmp2, mo_derivs2_tmp1, &
1024 mo_array(2)%nmo, 1, 1, &
1025 para_env=mo_array(1)%mo_coeff%matrix_struct%para_env, &
1026 blacs_env=mo_array(1)%mo_coeff%matrix_struct%context)
1027
1028 ! add beta contribution to alpa mo_derivs
1029 CALL dbcsr_add(mo_derivs(1)%matrix, mo_derivs2_tmp2, 1.0_dp, 1.0_dp)
1030 CALL dbcsr_release(mo_derivs2_tmp1)
1031 CALL dbcsr_release(mo_derivs2_tmp2)
1032 END IF
1033 END DO
1034
1035 IF (dft_control%do_admm_mo) THEN
1036 CALL calc_admm_mo_derivatives(qs_env, mo_derivs)
1037 END IF
1038
1039 END SUBROUTINE calc_mo_derivatives
1040
1041! **************************************************************************************************
1042!> \brief updates the Kohn Sham matrix of the given qs_env (facility method)
1043!> \param qs_env the qs_env to update
1044!> \param calculate_forces if true calculate the quantities needed
1045!> to calculate the forces. Defaults to false.
1046!> \param just_energy if true updates the energies but not the
1047!> ks matrix. Defaults to false
1048!> \param print_active ...
1049!> \par History
1050!> 4.2002 created [fawzi]
1051!> 8.2014 kpoints [JGH]
1052!> 10.2014 refractored [Ole Schuett]
1053!> \author Fawzi Mohamed
1054! **************************************************************************************************
1055 SUBROUTINE qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, &
1056 print_active)
1057 TYPE(qs_environment_type), POINTER :: qs_env
1058 LOGICAL, INTENT(IN), OPTIONAL :: calculate_forces, just_energy, &
1059 print_active
1060
1061 CHARACTER(LEN=*), PARAMETER :: routinen = 'qs_ks_update_qs_env'
1062
1063 INTEGER :: handle, unit_nr
1064 LOGICAL :: c_forces, do_rebuild, energy_only, &
1065 forces_up_to_date, potential_changed, &
1066 rho_changed, s_mstruct_changed
1067 TYPE(qs_ks_env_type), POINTER :: ks_env
1068
1069 NULLIFY (ks_env)
1070 unit_nr = cp_logger_get_default_io_unit()
1071
1072 c_forces = .false.
1073 energy_only = .false.
1074 IF (PRESENT(just_energy)) energy_only = just_energy
1075 IF (PRESENT(calculate_forces)) c_forces = calculate_forces
1076
1077 IF (c_forces) THEN
1078 CALL timeset(routinen//'_forces', handle)
1079 ELSE
1080 CALL timeset(routinen, handle)
1081 END IF
1082
1083 cpassert(ASSOCIATED(qs_env))
1084
1085 CALL get_qs_env(qs_env, &
1086 ks_env=ks_env, &
1087 rho_changed=rho_changed, &
1088 s_mstruct_changed=s_mstruct_changed, &
1089 potential_changed=potential_changed, &
1090 forces_up_to_date=forces_up_to_date)
1091
1092 do_rebuild = .false.
1093 do_rebuild = do_rebuild .OR. rho_changed
1094 do_rebuild = do_rebuild .OR. s_mstruct_changed
1095 do_rebuild = do_rebuild .OR. potential_changed
1096 do_rebuild = do_rebuild .OR. (c_forces .AND. .NOT. forces_up_to_date)
1097
1098 IF (do_rebuild) THEN
1099 CALL evaluate_core_matrix_traces(qs_env)
1100
1101 ! the ks matrix will be rebuilt so this is fine now
1102 CALL set_ks_env(ks_env, potential_changed=.false.)
1103
1104 CALL rebuild_ks_matrix(qs_env, &
1105 calculate_forces=c_forces, &
1106 just_energy=energy_only, &
1107 print_active=print_active)
1108
1109 IF (.NOT. energy_only) THEN
1110 CALL set_ks_env(ks_env, &
1111 rho_changed=.false., &
1112 s_mstruct_changed=.false., &
1113 forces_up_to_date=forces_up_to_date .OR. c_forces)
1114 END IF
1115 END IF
1116
1117 CALL timestop(handle)
1118
1119 END SUBROUTINE qs_ks_update_qs_env
1120
1121! **************************************************************************************************
1122!> \brief Calculates the traces of the core matrices and the density matrix.
1123!> \param qs_env ...
1124!> \author Ole Schuett
1125! **************************************************************************************************
1126 SUBROUTINE evaluate_core_matrix_traces(qs_env)
1127 TYPE(qs_environment_type), POINTER :: qs_env
1128
1129 CHARACTER(LEN=*), PARAMETER :: routinen = 'evaluate_core_matrix_traces'
1130
1131 INTEGER :: handle
1132 REAL(kind=dp) :: energy_core_im
1133 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrixkp_h, matrixkp_t, rho_ao_kp
1134 TYPE(dft_control_type), POINTER :: dft_control
1135 TYPE(qs_energy_type), POINTER :: energy
1136 TYPE(qs_rho_type), POINTER :: rho
1137
1138 CALL timeset(routinen, handle)
1139 NULLIFY (energy, rho, dft_control, rho_ao_kp, matrixkp_t, matrixkp_h)
1140
1141 CALL get_qs_env(qs_env, &
1142 rho=rho, &
1143 energy=energy, &
1144 dft_control=dft_control, &
1145 kinetic_kp=matrixkp_t, &
1146 matrix_h_kp=matrixkp_h)
1147
1148 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp)
1149
1150 CALL calculate_ptrace(matrixkp_h, rho_ao_kp, energy%core, dft_control%nspins)
1151
1152 ! Add the imaginary part in the RTP case
1153 IF (qs_env%run_rtp) THEN
1154 IF (dft_control%rtp_control%velocity_gauge) THEN
1155 CALL get_qs_env(qs_env, matrix_h_im_kp=matrixkp_h)
1156 CALL qs_rho_get(rho, rho_ao_im_kp=rho_ao_kp)
1157 CALL calculate_ptrace(matrixkp_h, rho_ao_kp, energy_core_im, dft_control%nspins)
1158 energy%core = energy%core - energy_core_im
1159 END IF
1160 END IF
1161
1162 ! kinetic energy
1163 IF (ASSOCIATED(matrixkp_t)) &
1164 CALL calculate_ptrace(matrixkp_t, rho_ao_kp, energy%kinetic, dft_control%nspins)
1165
1166 CALL timestop(handle)
1167 END SUBROUTINE evaluate_core_matrix_traces
1168
1169! **************************************************************************************************
1170!> \brief Constructs a new Khon-Sham matrix
1171!> \param qs_env ...
1172!> \param calculate_forces ...
1173!> \param just_energy ...
1174!> \param print_active ...
1175!> \author Ole Schuett
1176! **************************************************************************************************
1177 SUBROUTINE rebuild_ks_matrix(qs_env, calculate_forces, just_energy, print_active)
1178 TYPE(qs_environment_type), POINTER :: qs_env
1179 LOGICAL, INTENT(IN) :: calculate_forces, just_energy
1180 LOGICAL, INTENT(IN), OPTIONAL :: print_active
1181
1182 CHARACTER(LEN=*), PARAMETER :: routinen = 'rebuild_ks_matrix'
1183
1184 INTEGER :: handle
1185 TYPE(dft_control_type), POINTER :: dft_control
1186
1187 CALL timeset(routinen, handle)
1188 NULLIFY (dft_control)
1189
1190 CALL get_qs_env(qs_env, dft_control=dft_control)
1191
1192 IF (dft_control%qs_control%semi_empirical) THEN
1193 CALL build_se_fock_matrix(qs_env, &
1194 calculate_forces=calculate_forces, &
1195 just_energy=just_energy)
1196
1197 ELSEIF (dft_control%qs_control%dftb) THEN
1198 CALL build_dftb_ks_matrix(qs_env, &
1199 calculate_forces=calculate_forces, &
1200 just_energy=just_energy)
1201
1202 ELSEIF (dft_control%qs_control%xtb) THEN
1203 CALL build_xtb_ks_matrix(qs_env, &
1204 calculate_forces=calculate_forces, &
1205 just_energy=just_energy)
1206
1207 ELSE
1208 CALL qs_ks_build_kohn_sham_matrix(qs_env, &
1209 calculate_forces=calculate_forces, &
1210 just_energy=just_energy, &
1211 print_active=print_active)
1212 END IF
1213
1214 CALL timestop(handle)
1215
1216 END SUBROUTINE rebuild_ks_matrix
1217
1218! **************************************************************************************************
1219!> \brief Allocate ks_matrix if necessary, take current overlap matrix as template
1220!> \param qs_env ...
1221!> \param is_complex ...
1222!> \par History
1223!> refactoring 04.03.2011 [MI]
1224!> \author
1225! **************************************************************************************************
1226
1227 SUBROUTINE qs_ks_allocate_basics(qs_env, is_complex)
1228 TYPE(qs_environment_type), POINTER :: qs_env
1229 LOGICAL, INTENT(in) :: is_complex
1230
1231 CHARACTER(LEN=default_string_length) :: headline
1232 INTEGER :: ic, ispin, nimages, nspins
1233 LOGICAL :: do_kpoints
1234 TYPE(dbcsr_p_type), DIMENSION(:, :), POINTER :: matrix_s_kp, matrixkp_im_ks, matrixkp_ks
1235 TYPE(dbcsr_type), POINTER :: refmatrix
1236 TYPE(dft_control_type), POINTER :: dft_control
1237 TYPE(kpoint_type), POINTER :: kpoints
1238 TYPE(neighbor_list_set_p_type), DIMENSION(:), &
1239 POINTER :: sab_orb
1240 TYPE(qs_ks_env_type), POINTER :: ks_env
1241
1242 NULLIFY (dft_control, ks_env, matrix_s_kp, sab_orb, matrixkp_ks, refmatrix, matrixkp_im_ks, kpoints)
1243
1244 CALL get_qs_env(qs_env, &
1245 dft_control=dft_control, &
1246 matrix_s_kp=matrix_s_kp, &
1247 ks_env=ks_env, &
1248 kpoints=kpoints, &
1249 do_kpoints=do_kpoints, &
1250 matrix_ks_kp=matrixkp_ks, &
1251 matrix_ks_im_kp=matrixkp_im_ks)
1252
1253 IF (do_kpoints) THEN
1254 CALL get_kpoint_info(kpoints, sab_nl=sab_orb)
1255 ELSE
1256 CALL get_qs_env(qs_env, sab_orb=sab_orb)
1257 END IF
1258
1259 nspins = dft_control%nspins
1260 nimages = dft_control%nimages
1261
1262 IF (.NOT. ASSOCIATED(matrixkp_ks)) THEN
1263 CALL dbcsr_allocate_matrix_set(matrixkp_ks, nspins, nimages)
1264 refmatrix => matrix_s_kp(1, 1)%matrix
1265 DO ispin = 1, nspins
1266 DO ic = 1, nimages
1267 IF (nspins > 1) THEN
1268 IF (ispin == 1) THEN
1269 headline = "KOHN-SHAM MATRIX FOR ALPHA SPIN"
1270 ELSE
1271 headline = "KOHN-SHAM MATRIX FOR BETA SPIN"
1272 END IF
1273 ELSE
1274 headline = "KOHN-SHAM MATRIX"
1275 END IF
1276 ALLOCATE (matrixkp_ks(ispin, ic)%matrix)
1277 CALL dbcsr_create(matrix=matrixkp_ks(ispin, ic)%matrix, template=refmatrix, &
1278 name=trim(headline), matrix_type=dbcsr_type_symmetric, nze=0)
1279 CALL cp_dbcsr_alloc_block_from_nbl(matrixkp_ks(ispin, ic)%matrix, sab_orb)
1280 CALL dbcsr_set(matrixkp_ks(ispin, ic)%matrix, 0.0_dp)
1281 END DO
1282 END DO
1283 CALL set_ks_env(ks_env, matrix_ks_kp=matrixkp_ks)
1284 END IF
1285
1286 IF (is_complex) THEN
1287 IF (.NOT. ASSOCIATED(matrixkp_im_ks)) THEN
1288 cpassert(nspins .EQ. SIZE(matrixkp_ks, 1))
1289 cpassert(nimages .EQ. SIZE(matrixkp_ks, 2))
1290 CALL dbcsr_allocate_matrix_set(matrixkp_im_ks, nspins, nimages)
1291 DO ispin = 1, nspins
1292 DO ic = 1, nimages
1293 IF (nspins > 1) THEN
1294 IF (ispin == 1) THEN
1295 headline = "IMAGINARY KOHN-SHAM MATRIX FOR ALPHA SPIN"
1296 ELSE
1297 headline = "IMAGINARY KOHN-SHAM MATRIX FOR BETA SPIN"
1298 END IF
1299 ELSE
1300 headline = "IMAGINARY KOHN-SHAM MATRIX"
1301 END IF
1302 ALLOCATE (matrixkp_im_ks(ispin, ic)%matrix)
1303 refmatrix => matrixkp_ks(ispin, ic)%matrix ! base on real part, but anti-symmetric
1304 CALL dbcsr_create(matrix=matrixkp_im_ks(ispin, ic)%matrix, template=refmatrix, &
1305 name=trim(headline), matrix_type=dbcsr_type_antisymmetric, nze=0)
1306 CALL cp_dbcsr_alloc_block_from_nbl(matrixkp_im_ks(ispin, ic)%matrix, sab_orb)
1307 CALL dbcsr_set(matrixkp_im_ks(ispin, ic)%matrix, 0.0_dp)
1308 END DO
1309 END DO
1310 CALL set_ks_env(ks_env, matrix_ks_im_kp=matrixkp_im_ks)
1311 END IF
1312 END IF
1313
1314 END SUBROUTINE qs_ks_allocate_basics
1315
1316END 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...
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:98
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_ks_matrix(qs_env, matrix_ks, rho, energy, calculate_forces, just_energy, v_rspace_new, v_tau_rspace)
Add the hfx contributions to the Hamiltonian.
subroutine, public hfx_admm_init(qs_env, calculate_forces)
...
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 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
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
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:150
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, 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_nonbond, sab_almo, sab_kp, sab_kp_nosym, 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, ecoul_1c, rho0_s_rs, rho0_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, 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, rhs)
Get the QUICKSTEP environment.
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external)
...
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 qs_ks_build_kohn_sham_matrix(qs_env, calculate_forces, just_energy, print_active, ext_ks_matrix)
routine where the real calculations are made: the KS matrix is calculated
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 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_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, 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)
...
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
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, gradient_atom_set, adiabatic_rescale_factor, kind_set_external, rho_atom_set_external, xc_section_external)
...
Definition qs_vxc_atom.F:87
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.
subroutine, public calc_dipsurf_potential(qs_env, energy)
compute the surface dipole and the correction to the hartree potential
Calculation of Overlap and Hamiltonian matrices in xTB Reference: Stefan Grimme, Christoph Bannwarth,...
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:55
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.
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.