14 USE dbcsr_api,
ONLY: dbcsr_copy,&
67 #include "./base/base_uses.f90"
73 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_loop_utils'
91 energy_only, just_energy, exit_inner_loop)
93 TYPE(qs_scf_env_type),
POINTER :: scf_env
94 LOGICAL :: diis_step, energy_only, just_energy, &
100 energy_only = .false.
101 just_energy = .false.
106 scf_env%iter_count = 0
107 exit_inner_loop = .false.
121 SUBROUTINE qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, &
123 TYPE(qs_environment_type),
POINTER :: qs_env
124 TYPE(qs_scf_env_type),
POINTER :: scf_env
125 TYPE(scf_control_type),
POINTER :: scf_control
126 TYPE(section_vals_type),
POINTER :: scf_section
127 LOGICAL :: diis_step, energy_only
129 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_new_mos'
131 INTEGER :: handle, ispin
132 LOGICAL :: has_unit_metric, skip_diag_sub
133 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
134 TYPE(dft_control_type),
POINTER :: dft_control
135 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
136 TYPE(qs_energy_type),
POINTER :: energy
137 TYPE(qs_ks_env_type),
POINTER :: ks_env
138 TYPE(qs_rho_type),
POINTER :: rho
140 CALL timeset(routinen, handle)
142 NULLIFY (energy, ks_env, matrix_ks, matrix_s, rho, mos, dft_control)
145 matrix_s=matrix_s, energy=energy, &
147 matrix_ks=matrix_ks, rho=rho, mos=mos, &
148 dft_control=dft_control, &
149 has_unit_metric=has_unit_metric)
150 scf_env%iter_param = 0.0_dp
154 IF (dft_control%correct_el_density_dip)
THEN
155 scf_env%sum_zeff_corr = qs_env%total_zeff_corr
156 IF (abs(qs_env%total_zeff_corr) > 0.0_dp)
THEN
158 CALL cp_abort(__location__, &
159 "Please use ALGORITHM STANDARD in "// &
160 "SCF%DIAGONALIZATION if "// &
161 "CORE_CORRECTION /= 0.0 and "// &
162 "SURFACE_DIPOLE_CORRECTION TRUE ")
163 ELSEIF (dft_control%roks)
THEN
164 CALL cp_abort(__location__, &
165 "Combination of "// &
166 "CORE_CORRECTION /= 0.0 and "// &
167 "SURFACE_DIPOLE_CORRECTION TRUE "// &
168 "is not implemented with ROKS")
169 ELSEIF (scf_control%diagonalization%mom)
THEN
170 CALL cp_abort(__location__, &
171 "Combination of "// &
172 "CORE_CORRECTION /= 0.0 and "// &
173 "SURFACE_DIPOLE_CORRECTION TRUE "// &
174 "is not implemented with SCF%MOM")
179 SELECT CASE (scf_env%method)
181 CALL cp_abort(__location__, &
182 "unknown scf method: "// &
183 cp_to_string(scf_env%method))
190 IF (abs(qs_env%total_zeff_corr) > 0.0_dp)
THEN
191 CALL cp_abort(__location__, &
192 "CORE_CORRECTION /= 0.0 plus SURFACE_DIPOLE_CORRECTION TRUE "// &
193 "requires SCF%DIAGONALIZATION: ALGORITHM STANDARD")
196 matrix_ks, matrix_s, scf_section, diis_step)
200 IF (dft_control%roks)
THEN
202 scf_control, scf_section, diis_step, &
205 IF (scf_control%diagonalization%mom)
THEN
207 matrix_s, scf_control, scf_section, &
211 matrix_s, scf_control, scf_section, &
214 IF (scf_control%do_diag_sub)
THEN
215 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
216 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
217 IF (.NOT. skip_diag_sub)
THEN
219 ks_env, scf_section, scf_control)
225 IF (dft_control%roks)
THEN
227 scf_control, scf_section, diis_step, &
231 scf_control, scf_section, &
236 CALL do_ot_diag(scf_env, mos, matrix_ks, matrix_s, &
237 scf_control, scf_section, diis_step)
240 IF ((scf_env%krylov_space%eps_std_diag > 0.0_dp) .AND. &
241 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%krylov_space%eps_std_diag))
THEN
242 IF (scf_env%krylov_space%always_check_conv)
THEN
244 scf_control, scf_section, check_moconv_only=.true.)
247 matrix_s, scf_control, scf_section, diis_step)
250 scf_control, scf_section)
252 IF (scf_control%do_diag_sub)
THEN
253 skip_diag_sub = (scf_env%subspace_env%eps_diag_sub > 0.0_dp) .AND. &
254 (scf_env%iter_count == 1 .OR. scf_env%iter_delta > scf_env%subspace_env%eps_diag_sub)
255 IF (.NOT. skip_diag_sub)
THEN
257 ks_env, scf_section, scf_control)
263 scf_section, .false.)
266 CALL qs_scf_loop_do_ot(qs_env, scf_env, scf_control%smear, mos, rho, &
267 qs_env%mo_derivs, energy%total, &
268 matrix_s, energy_only=energy_only, has_unit_metric=has_unit_metric)
272 energy%efermi = 0.0_dp
274 DO ispin = 1,
SIZE(mos)
275 energy%kTS = energy%kTS + mos(ispin)%kTS
276 energy%efermi = energy%efermi + mos(ispin)%mu
278 energy%efermi = energy%efermi/real(
SIZE(mos), kind=
dp)
280 CALL timestop(handle)
293 TYPE(qs_environment_type),
POINTER :: qs_env
294 TYPE(qs_scf_env_type),
POINTER :: scf_env
295 TYPE(scf_control_type),
POINTER :: scf_control
298 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_new_mos_kp'
300 INTEGER :: handle, ispin
301 LOGICAL :: has_unit_metric
302 REAL(
dp) :: diis_error
303 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
304 TYPE(dft_control_type),
POINTER :: dft_control
305 TYPE(kpoint_type),
POINTER :: kpoints
306 TYPE(mo_set_type),
DIMENSION(:, :),
POINTER :: mos
307 TYPE(qs_energy_type),
POINTER :: energy
309 CALL timeset(routinen, handle)
311 NULLIFY (dft_control, kpoints, matrix_ks, matrix_s)
313 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, kpoints=kpoints)
314 scf_env%iter_param = 0.0_dp
316 IF (dft_control%roks) &
317 cpabort(
"KP code: ROKS method not available: ")
319 SELECT CASE (scf_env%method)
321 CALL cp_abort(__location__, &
322 "KP code: Unknown scf method: "// &
323 cp_to_string(scf_env%method))
326 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks, matrix_s_kp=matrix_s)
328 diis_step, diis_error, qs_env)
330 scf_env%iter_param = diis_error
331 scf_env%iter_method =
"DIIS/Diag."
333 IF (scf_env%mixing_method == 0)
THEN
334 scf_env%iter_method =
"NoMix/Diag."
335 ELSE IF (scf_env%mixing_method == 1)
THEN
336 scf_env%iter_param = scf_env%p_mix_alpha
337 scf_env%iter_method =
"P_Mix/Diag."
338 ELSEIF (scf_env%mixing_method > 1)
THEN
339 scf_env%iter_param = scf_env%mixing_store%alpha
340 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
344 CALL get_qs_env(qs_env=qs_env, has_unit_metric=has_unit_metric)
345 cpassert(has_unit_metric)
347 CALL cp_abort(__location__, &
348 "KP code: Scf method not available: "// &
349 cp_to_string(scf_env%method))
354 CALL cp_abort(__location__, &
355 "KP code: Scf method not available: "// &
356 cp_to_string(scf_env%method))
361 energy%efermi = 0.0_dp
362 mos => kpoints%kp_env(1)%kpoint_env%mos
363 DO ispin = 1,
SIZE(mos, 2)
364 energy%kTS = energy%kTS + mos(1, ispin)%kTS
365 energy%efermi = energy%efermi + mos(1, ispin)%mu
367 energy%efermi = energy%efermi/real(
SIZE(mos, 2), kind=
dp)
369 CALL timestop(handle)
390 SUBROUTINE qs_scf_loop_do_ot(qs_env, scf_env, smear, mos, rho, mo_derivs, total_energy, &
391 matrix_s, energy_only, has_unit_metric)
393 TYPE(qs_environment_type),
POINTER :: qs_env
394 TYPE(qs_scf_env_type),
POINTER :: scf_env
395 TYPE(smear_type),
POINTER :: smear
396 TYPE(mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
397 TYPE(qs_rho_type),
POINTER :: rho
398 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mo_derivs
399 REAL(kind=
dp),
INTENT(IN) :: total_energy
400 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_s
401 LOGICAL,
INTENT(INOUT) :: energy_only
402 LOGICAL,
INTENT(IN) :: has_unit_metric
404 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_loop_do_ot'
406 INTEGER :: handle, ispin
407 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
408 TYPE(dbcsr_type),
POINTER :: orthogonality_metric
410 CALL timeset(routinen, handle)
415 IF (has_unit_metric)
THEN
416 NULLIFY (orthogonality_metric)
418 orthogonality_metric => matrix_s(1)%matrix
424 CALL ot_scf_mini(mos, mo_derivs, smear, orthogonality_metric, &
425 total_energy, energy_only, scf_env%iter_delta, &
428 DO ispin = 1,
SIZE(mos)
429 CALL set_mo_occupation(mo_set=mos(ispin), smear=smear)
432 DO ispin = 1,
SIZE(mos)
433 CALL calculate_density_matrix(mos(ispin), &
434 rho_ao(ispin)%matrix, &
438 scf_env%iter_method = scf_env%qs_ot_env(1)%OT_METHOD_FULL
439 scf_env%iter_param = scf_env%qs_ot_env(1)%ds_min
440 qs_env%broyden_adaptive_sigma = scf_env%qs_ot_env(1)%broyden_adaptive_sigma
442 CALL timestop(handle)
444 END SUBROUTINE qs_scf_loop_do_ot
454 TYPE(qs_scf_env_type),
POINTER :: scf_env
455 TYPE(qs_rho_type),
POINTER :: rho
456 TYPE(mp_para_env_type),
POINTER :: para_env
459 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
465 SELECT CASE (scf_env%mixing_method)
468 scf_env%mixing_store, rho_ao_kp, para_env, scf_env%iter_delta, scf_env%iter_count, &
474 delta=scf_env%iter_delta)
477 CALL cp_abort(__location__, &
478 "unknown scf mixing method: "// &
479 cp_to_string(scf_env%mixing_method))
494 outer_loop_converged, exit_outer_loop)
495 TYPE(qs_environment_type),
POINTER :: qs_env
496 TYPE(qs_scf_env_type),
POINTER :: scf_env
497 TYPE(scf_control_type),
POINTER :: scf_control
498 LOGICAL :: should_stop, outer_loop_converged, &
501 REAL(kind=
dp) :: outer_loop_eps
503 outer_loop_converged = .true.
504 IF (scf_control%outer_scf%have_scf)
THEN
506 scf_env%outer_scf%iter_count = scf_env%outer_scf%iter_count + 1
507 outer_loop_converged = .false.
511 outer_loop_eps = sqrt(maxval(scf_env%outer_scf%gradient(:, scf_env%outer_scf%iter_count)**2))
513 IF (outer_loop_eps < scf_control%outer_scf%eps_scf) outer_loop_converged = .true.
516 exit_outer_loop = should_stop .OR. outer_loop_converged .OR. &
517 scf_env%outer_scf%iter_count > scf_control%outer_scf%max_scf
532 exit_inner_loop, inner_loop_converged, output_unit)
533 TYPE(qs_environment_type),
POINTER :: qs_env
534 TYPE(qs_scf_env_type),
POINTER :: scf_env
535 TYPE(scf_control_type),
POINTER :: scf_control
536 LOGICAL :: should_stop, exit_inner_loop, &
538 INTEGER :: output_unit
540 inner_loop_converged = .false.
541 exit_inner_loop = .false.
544 start_time=qs_env%start_time)
545 IF (scf_env%iter_delta < scf_control%eps_scf)
THEN
546 IF (output_unit > 0)
THEN
547 WRITE (unit=output_unit, fmt=
"(/,T3,A,I5,A/)") &
548 "*** SCF run converged in ", scf_env%iter_count,
" steps ***"
550 inner_loop_converged = .true.
551 exit_inner_loop = .true.
552 ELSE IF (should_stop .OR. scf_env%iter_count >= scf_control%max_scf)
THEN
553 inner_loop_converged = .false.
554 exit_inner_loop = .true.
555 IF (output_unit > 0)
THEN
556 WRITE (unit=output_unit, fmt=
"(/,T3,A,I5,A/)") &
557 "Leaving inner SCF loop after reaching ", scf_env%iter_count,
" steps."
571 SUBROUTINE qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
572 TYPE(qs_scf_env_type),
POINTER :: scf_env
573 TYPE(qs_rho_type),
POINTER :: rho
574 TYPE(dft_control_type),
POINTER :: dft_control
575 TYPE(mp_para_env_type),
POINTER :: para_env
578 CHARACTER(len=default_string_length) :: name
579 INTEGER :: ic, ispin, nc
580 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
584 IF (scf_env%mixing_method > 0)
THEN
586 nc =
SIZE(scf_env%p_mix_new, 2)
587 SELECT CASE (scf_env%mixing_method)
590 rho_ao_kp, para_env, scf_env%iter_delta, &
591 scf_env%iter_count, diis=diis_step, &
594 DO ispin = 1, dft_control%nspins
595 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name)
596 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
602 DO ispin = 1, dft_control%nspins
603 CALL dbcsr_get_info(rho_ao_kp(ispin, ic)%matrix, name=name)
604 CALL dbcsr_copy(rho_ao_kp(ispin, ic)%matrix, scf_env%p_mix_new(ispin, ic)%matrix, name=name)
609 END SUBROUTINE qs_scf_undo_mixing
620 TYPE(qs_rho_type),
POINTER :: rho
621 TYPE(qs_environment_type),
POINTER :: qs_env
622 TYPE(qs_scf_env_type),
POINTER :: scf_env
623 TYPE(qs_ks_env_type),
POINTER :: ks_env
624 LOGICAL,
INTENT(IN) :: mix_rho
626 TYPE(mp_para_env_type),
POINTER :: para_env
634 CALL gspace_mixing(qs_env, scf_env%mixing_method, scf_env%mixing_store, rho, &
635 para_env, scf_env%iter_count)
650 TYPE(qs_scf_env_type),
POINTER :: scf_env
651 TYPE(qs_environment_type),
POINTER :: qs_env
653 INTEGER,
INTENT(IN) :: output_unit
655 LOGICAL :: do_kpoints
656 TYPE(dft_control_type),
POINTER :: dft_control
657 TYPE(mp_para_env_type),
POINTER :: para_env
658 TYPE(qs_energy_type),
POINTER :: energy
659 TYPE(qs_ks_env_type),
POINTER :: ks_env
660 TYPE(qs_rho_type),
POINTER :: rho
662 NULLIFY (energy, rho, dft_control, ks_env)
664 CALL get_qs_env(qs_env=qs_env, energy=energy, ks_env=ks_env, &
665 rho=rho, dft_control=dft_control, para_env=para_env, &
666 do_kpoints=do_kpoints)
668 CALL cleanup_scf_loop(scf_env)
674 CALL qs_scf_undo_mixing(scf_env, rho, dft_control, para_env, diis_step)
689 SUBROUTINE cleanup_scf_loop(scf_env)
690 TYPE(qs_scf_env_type),
INTENT(INOUT) :: scf_env
692 CHARACTER(len=*),
PARAMETER :: routinen =
'cleanup_scf_loop'
694 INTEGER :: handle, ispin
696 CALL timeset(routinen, handle)
698 SELECT CASE (scf_env%method)
700 DO ispin = 1,
SIZE(scf_env%qs_ot_env)
703 DEALLOCATE (scf_env%qs_ot_env)
715 CALL cp_abort(__location__, &
716 "unknown scf method method:"// &
717 cp_to_string(scf_env%method))
720 CALL timestop(handle)
722 END SUBROUTINE cleanup_scf_loop
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Routines to handle the external control of CP2K.
subroutine, public external_control(should_stop, flag, globenv, target_time, start_time, force_check)
External manipulations during a run : when the <PROJECT_NAME>.EXIT_$runtype command is sent the progr...
various routines to log and control the output. The idea is that decisions about where to log should ...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Types and basic routines needed for a kpoint calculation.
Interface to the message passing library MPI.
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public broyden_mixing_nr
integer, parameter, public no_mixing_nr
integer, parameter, public direct_mixing_nr
integer, parameter, public multisecant_mixing_nr
integer, parameter, public pulay_mixing_nr
integer, parameter, public gspace_mixing_nr
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 fb_env_do_diag(fb_env, qs_env, matrix_ks, matrix_s, scf_section, diis_step)
Do filtered matrix method diagonalisation.
subroutine, public gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
methods for deltaSCF calculations
subroutine, public do_mom_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
do an SCF iteration, then compute occupation numbers of the new molecular orbitals according to their...
basic functionality for using ot in the scf routines.
subroutine, public ot_scf_mini(mo_array, matrix_dedc, smear, matrix_s, energy, energy_only, delta, qs_ot_env)
...
subroutine, public ot_scf_destroy(qs_ot_env)
...
Routines for performing an outer scf loop.
subroutine, public outer_loop_gradient(qs_env, scf_env)
computes the gradient wrt to the outer loop variables
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
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...
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public do_ot_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to iterative diagonalization using OT with S matrix; basically,...
subroutine, public do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block davidson space approach
subroutine, public do_roks_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, orthogonal_basis)
Solve a set restricted open Kohn-Sham (ROKS) equations based on the alpha and beta Kohn-Sham matrices...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
subroutine, public do_scf_diag_subspace(qs_env, scf_env, subspace_env, mos, rho, ks_env, scf_section, scf_control)
inner loop within MOS subspace, to refine occupation and density, before next diagonalization of the ...
subroutine, public do_block_krylov_diag(scf_env, mos, matrix_ks, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block Krylov-space approach
subroutine, public do_special_diag(scf_env, mos, matrix_ks, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization without S matrix basically, in goes the ks matrix ...
subroutine, public do_general_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
...
Utility routines for qs_scf.
subroutine, public qs_scf_new_mos(qs_env, scf_env, scf_control, scf_section, diis_step, energy_only)
takes known energy and derivatives and produces new wfns and or density matrix
subroutine, public qs_scf_inner_finalize(scf_env, qs_env, diis_step, output_unit)
Performs the necessary steps before leaving innner scf loop.
subroutine, public qs_scf_check_inner_exit(qs_env, scf_env, scf_control, should_stop, exit_inner_loop, inner_loop_converged, output_unit)
checks whether exit conditions for inner loop are satisfied
subroutine, public qs_scf_set_loop_flags(scf_env, diis_step, energy_only, just_energy, exit_inner_loop)
computes properties for a given hamiltonian using the current wfn
subroutine, public qs_scf_rho_update(rho, qs_env, scf_env, ks_env, mix_rho)
Performs the updates rho (takes care of mixing as well)
subroutine, public qs_scf_new_mos_kp(qs_env, scf_env, scf_control, diis_step)
Updates MOs and density matrix using diagonalization Kpoint code.
subroutine, public qs_scf_check_outer_exit(qs_env, scf_env, scf_control, should_stop, outer_loop_converged, exit_outer_loop)
checks whether exit conditions for outer loop are satisfied
subroutine, public qs_scf_density_mixing(scf_env, rho, para_env, diis_step)
Performs the requested density mixing if any needed.
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public scf_env_density_mixing(p_mix_new, mixing_store, rho_ao, para_env, iter_delta, iter_count, diis, invert)
perform (if requested) a density mixing
subroutine, public qs_scf_print_summary(output_unit, qs_env)
writes a summary of information after scf
module that contains the definitions of the scf types
integer, parameter, public ot_diag_method_nr
integer, parameter, public filter_matrix_diag_method_nr
integer, parameter, public block_davidson_diag_method_nr
integer, parameter, public ot_method_nr
integer, parameter, public special_diag_method_nr
integer, parameter, public block_krylov_diag_method_nr
integer, parameter, public general_diag_method_nr
parameters that control an scf iteration