22 dbcsr_type_no_symmetry,&
144#include "./base/base_uses.f90"
150 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_initialization'
179 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
182 IF (dft_control%hairy_probes .EQV. .true.)
THEN
185 atomic_kind_set=atomic_kind_set, &
186 qs_kind_set=qs_kind_set, &
187 particle_set=particle_set)
188 np =
SIZE(dft_control%probe)
190 CALL ao_boundaries(probe=dft_control%probe(ip), atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
191 particle_set=particle_set, nao=mos(1)%nao)
195 IF (
PRESENT(scf_control))
THEN
196 my_scf_control => scf_control
198 CALL get_qs_env(qs_env, scf_control=my_scf_control)
202 IF (
PRESENT(scf_section))
THEN
203 my_scf_section => scf_section
208 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
212 CALL qs_scf_ensure_mos(qs_env)
215 CALL qs_scf_ensure_diagonalization(scf_env, my_scf_section, qs_env, &
216 my_scf_control, qs_env%has_unit_metric)
218 CALL qs_scf_ensure_mixing(my_scf_control, my_scf_section, scf_env, dft_control)
220 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
222 CALL qs_scf_ensure_mixing_store(qs_env, scf_env, my_scf_control)
225 IF (dft_control%qs_control%cdft)
THEN
226 CALL qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, &
227 scf_control=my_scf_control)
229 CALL qs_scf_ensure_outer_loop_vars(scf_env, my_scf_control)
232 CALL init_scf_run(scf_env, qs_env, my_scf_section, my_scf_control)
249 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
251 CALL get_qs_env(qs_env, scf_control=scf_control)
255 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
258 scf_control%use_diag = .true.
261 CALL qs_scf_ensure_mos(qs_env)
264 CALL qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
265 scf_control, qs_env%has_unit_metric)
266 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
268 CALL init_scf_run(scf_env, qs_env, scf_section, scf_control)
278 SUBROUTINE qs_scf_ensure_scf_env(qs_env, scf_env)
287 IF (.NOT.
ASSOCIATED(scf_env))
THEN
292 SELECT CASE (scf_env%mixing_method)
294 IF (
ASSOCIATED(scf_env%mixing_store))
THEN
300 IF (
ASSOCIATED(scf_env%mixing_store%rhoin))
THEN
301 IF (
SIZE(rho_g(1)%pw_grid%gsq) /=
SIZE(scf_env%mixing_store%rhoin(1)%cc))
THEN
303 DEALLOCATE (scf_env%mixing_store)
310 END SUBROUTINE qs_scf_ensure_scf_env
318 SUBROUTINE qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvar)
321 INTEGER,
OPTIONAL :: nvar
323 INTEGER :: nhistory, nvariables
325 IF (scf_control%outer_scf%have_scf)
THEN
326 nhistory = scf_control%outer_scf%max_scf + 1
327 IF (
PRESENT(nvar))
THEN
336 ALLOCATE (scf_env%outer_scf%variables(nvariables, nhistory))
337 ALLOCATE (scf_env%outer_scf%count(nhistory))
338 scf_env%outer_scf%count = 0
339 ALLOCATE (scf_env%outer_scf%gradient(nvariables, nhistory))
340 ALLOCATE (scf_env%outer_scf%energy(nhistory))
343 END SUBROUTINE qs_scf_ensure_outer_loop_vars
352 SUBROUTINE qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, scf_control)
358 INTEGER :: nhistory, nvariables
359 LOGICAL :: do_kpoints
360 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient_history, outer_scf_history, &
363 NULLIFY (outer_scf_history, gradient_history, variable_history)
364 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
367 cpabort(
"CDFT calculation not possible with kpoints")
372 IF (.NOT. scf_control%outer_scf%have_scf)
THEN
373 cpabort(
"Section SCF&OUTER_SCF must be active for CDFT calculations.")
376 IF (dft_control%qs_control%cdft_control%constraint_control%have_scf)
THEN
377 nhistory = dft_control%qs_control%cdft_control%constraint_control%max_scf + 1
380 dft_control%qs_control%cdft_control)
383 nvariables =
SIZE(dft_control%qs_control%cdft_control%target)
385 ALLOCATE (dft_control%qs_control%cdft_control%constraint%variables(nvariables, nhistory))
386 ALLOCATE (dft_control%qs_control%cdft_control%constraint%count(nhistory))
387 dft_control%qs_control%cdft_control%constraint%count = 0
388 ALLOCATE (dft_control%qs_control%cdft_control%constraint%gradient(nvariables, nhistory))
389 ALLOCATE (dft_control%qs_control%cdft_control%constraint%energy(nhistory))
390 CALL qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvariables)
395 IF (scf_control%outer_scf%have_scf)
THEN
397 dft_control%qs_control%cdft_control%ot_control%have_scf = .true.
398 dft_control%qs_control%cdft_control%ot_control%max_scf = scf_control%outer_scf%max_scf
399 dft_control%qs_control%cdft_control%ot_control%eps_scf = scf_control%outer_scf%eps_scf
400 dft_control%qs_control%cdft_control%ot_control%step_size = scf_control%outer_scf%step_size
401 dft_control%qs_control%cdft_control%ot_control%type = scf_control%outer_scf%type
402 dft_control%qs_control%cdft_control%ot_control%optimizer = scf_control%outer_scf%optimizer
403 dft_control%qs_control%cdft_control%ot_control%diis_buffer_length = scf_control%outer_scf%diis_buffer_length
404 dft_control%qs_control%cdft_control%ot_control%bisect_trust_count = scf_control%outer_scf%bisect_trust_count
405 CALL cdft_opt_type_copy(dft_control%qs_control%cdft_control%ot_control%cdft_opt_control, &
406 scf_control%outer_scf%cdft_opt_control)
408 nvariables =
SIZE(dft_control%qs_control%cdft_control%target)
409 IF (scf_control%outer_scf%extrapolation_order /= &
410 dft_control%qs_control%cdft_control%constraint_control%extrapolation_order &
411 .OR. nvariables /= 1)
THEN
412 DEALLOCATE (qs_env%outer_scf_history)
413 DEALLOCATE (qs_env%gradient_history)
414 DEALLOCATE (qs_env%variable_history)
415 nhistory = dft_control%qs_control%cdft_control%constraint_control%extrapolation_order
416 ALLOCATE (outer_scf_history(nvariables, nhistory))
417 ALLOCATE (gradient_history(nvariables, 2))
418 gradient_history = 0.0_dp
419 ALLOCATE (variable_history(nvariables, 2))
420 variable_history = 0.0_dp
421 CALL set_qs_env(qs_env, outer_scf_history=outer_scf_history, &
422 gradient_history=gradient_history, variable_history=variable_history)
428 END SUBROUTINE qs_scf_ensure_cdft_loop_vars
440 SUBROUTINE qs_scf_allocate_candidate_density(qs_env, candidate, nspins)
442 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: candidate
443 INTEGER,
INTENT(IN) :: nspins
445 INTEGER :: ic, ispin, nimg
446 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
452 NULLIFY (dft_control, matrix_s, refmatrix, sab_orb)
453 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s, sab_orb=sab_orb, dft_control=dft_control)
455 IF (
ASSOCIATED(candidate))
RETURN
457 refmatrix => matrix_s(1, 1)%matrix
458 nimg = dft_control%nimages
462 ALLOCATE (candidate(ispin, ic)%matrix)
463 CALL dbcsr_create(matrix=candidate(ispin, ic)%matrix, template=refmatrix, &
464 name=
"SCF DENSITY", matrix_type=dbcsr_type_symmetric)
466 CALL dbcsr_set(candidate(ispin, ic)%matrix, 0.0_dp)
470 END SUBROUTINE qs_scf_allocate_candidate_density
478 SUBROUTINE qs_scf_ensure_mixing_store(qs_env, scf_env, scf_control)
485 NULLIFY (dft_control)
486 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
489 CALL qs_scf_allocate_candidate_density(qs_env, scf_env%p_mix_new, dft_control%nspins)
490 ELSE IF (scf_env%mixing_method > 0)
THEN
491 CALL mixing_allocate(qs_env, scf_env%mixing_method, scf_env%p_mix_new, &
492 scf_env%p_delta, dft_control%nspins, &
493 scf_env%mixing_store)
495 NULLIFY (scf_env%p_mix_new)
498 END SUBROUTINE qs_scf_ensure_mixing_store
507 SUBROUTINE qs_scf_ensure_work_matrices(qs_env, scf_env)
512 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_ensure_work_matrices'
514 INTEGER :: handle, is, nao, nrow_block, nw
515 LOGICAL :: do_kpoints
518 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
524 CALL timeset(routinen, handle)
526 NULLIFY (ao_mo_fm_pools, ao_mo_fmstruct, ao_ao_fmstruct, dft_control, matrix_s, mos)
529 dft_control=dft_control, &
530 matrix_s_kp=matrix_s, &
532 scf_control=scf_control, &
533 do_kpoints=do_kpoints)
534 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
541 nrow_block=nrow_block, &
542 ncol_block=nrow_block, &
545 template_fmstruct=ao_mo_fmstruct)
549 IF (.NOT.
ASSOCIATED(scf_env%scf_work1))
THEN
550 nw = dft_control%nspins
551 IF (do_kpoints) nw = 4
552 ALLOCATE (scf_env%scf_work1(nw))
553 DO is = 1,
SIZE(scf_env%scf_work1)
555 matrix_struct=ao_ao_fmstruct, &
556 name=
"SCF-WORK_MATRIX-1-"//trim(adjustl(
cp_to_string(is))))
559 IF ((.NOT.
ASSOCIATED(scf_env%ortho)) .AND. &
561 dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
562 dft_control%qs_control%semi_empirical) .AND. &
565 ALLOCATE (scf_env%ortho)
567 matrix_struct=ao_ao_fmstruct, &
568 name=
"SCF-ORTHO_MATRIX")
571 ref_matrix => matrix_s(1, 1)%matrix
573 CALL dbcsr_create(scf_env%ortho_dbcsr, template=ref_matrix, &
574 matrix_type=dbcsr_type_no_symmetry)
576 CALL dbcsr_create(scf_env%buf1_dbcsr, template=ref_matrix, &
577 matrix_type=dbcsr_type_no_symmetry)
579 CALL dbcsr_create(scf_env%buf2_dbcsr, template=ref_matrix, &
580 matrix_type=dbcsr_type_no_symmetry)
582 (scf_control%level_shift /= 0.0_dp .AND. &
584 ALLOCATE (scf_env%ortho_m1)
586 matrix_struct=ao_ao_fmstruct, &
587 name=
"SCF-ORTHO_MATRIX-1")
590 IF (.NOT.
ASSOCIATED(scf_env%scf_work2))
THEN
591 ALLOCATE (scf_env%scf_work2)
593 matrix_struct=ao_ao_fmstruct, &
594 name=
"SCF-WORK_MATRIX-2")
598 IF (dft_control%dft_plus_u)
THEN
600 IF (.NOT.
ASSOCIATED(scf_env%s_half))
THEN
601 ALLOCATE (scf_env%s_half)
603 matrix_struct=ao_ao_fmstruct, &
604 name=
"S**(1/2) MATRIX")
610 IF (.NOT.
ASSOCIATED(scf_env%scf_work1))
THEN
612 ALLOCATE (scf_env%scf_work1(nw))
613 DO is = 1,
SIZE(scf_env%scf_work1)
615 matrix_struct=ao_ao_fmstruct, &
616 name=
"SCF-WORK_MATRIX-1-"//trim(adjustl(
cp_to_string(is))))
621 IF (.NOT. do_kpoints .AND.
ASSOCIATED(scf_env%scf_work1))
THEN
622 IF (.NOT.
ALLOCATED(scf_env%fm_copy_plan))
THEN
623 ALLOCATE (scf_env%fm_copy_plan(0:
SIZE(scf_env%scf_work1)))
629 CALL timestop(handle)
631 END SUBROUTINE qs_scf_ensure_work_matrices
637 SUBROUTINE qs_scf_ensure_mos(qs_env)
640 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_ensure_mos'
642 INTEGER :: handle, ik, ikk, ispin, nmo, nmo_mat
644 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_last
646 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
650 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_k, mos_last_converged
653 CALL timeset(routinen, handle)
655 NULLIFY (ao_mo_fm_pools, dft_control, mos, xas_env, matrix_s, mos_last_converged, mo_coeff_last)
658 dft_control=dft_control, &
660 matrix_s_kp=matrix_s, &
662 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
663 IF (dft_control%switch_surf_dip)
THEN
664 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
667 nmo_mat = dft_control%nspins
668 IF (dft_control%restricted) nmo_mat = 1
671 cpassert(
ASSOCIATED(mos))
672 DO ispin = 1,
SIZE(mos)
673 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
674 IF (.NOT.
ASSOCIATED(mo_coeff))
THEN
676 fm_pool=ao_mo_fm_pools(ispin)%pool, &
679 IF (.NOT.
ASSOCIATED(mo_coeff_b))
THEN
683 sym=dbcsr_type_no_symmetry)
687 IF (qs_env%requires_mo_derivs)
THEN
689 IF (.NOT.
ASSOCIATED(mo_derivs))
THEN
690 ALLOCATE (mo_derivs(nmo_mat))
691 DO ispin = 1, nmo_mat
692 CALL get_mo_set(mos(ispin), mo_coeff_b=mo_coeff_b)
693 NULLIFY (mo_derivs(ispin)%matrix)
695 CALL dbcsr_create(mo_derivs(ispin)%matrix, template=mo_coeff_b, &
696 name=
"mo_derivs", matrix_type=dbcsr_type_no_symmetry)
706 IF (dft_control%do_admm)
THEN
707 IF (dft_control%restricted) cpabort(
"ROKS with ADMM is not implemented")
711 IF (dft_control%switch_surf_dip)
THEN
712 cpassert(
ASSOCIATED(mos_last_converged))
713 DO ispin = 1,
SIZE(mos_last_converged)
714 CALL get_mo_set(mos_last_converged(ispin), mo_coeff=mo_coeff_last)
715 IF (.NOT.
ASSOCIATED(mo_coeff_last))
THEN
717 fm_ref=mos(ispin)%mo_coeff, &
718 name=
"qs_env%mos_last_converged"//trim(adjustl(
cp_to_string(ispin))))
723 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
724 IF (kpoints%nkp /= 0)
THEN
726 IF (qs_env%requires_mo_derivs)
THEN
727 cpwarn(
"MO derivative methods flag has been switched off for kpoint calculation")
730 qs_env%requires_mo_derivs = .false.
732 IF (dft_control%do_xas_calculation)
THEN
733 cpabort(
"No XAS implemented with kpoints")
735 IF (qs_env%do_rixs)
THEN
736 cpabort(
"RIXS not implemented with kpoints")
738 DO ik = 1,
SIZE(kpoints%kp_env)
739 CALL mpools_get(kpoints%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
740 mos_k => kpoints%kp_env(ik)%kpoint_env%mos
741 ikk = kpoints%kp_range(1) + ik - 1
742 cpassert(
ASSOCIATED(mos_k))
743 DO ispin = 1,
SIZE(mos_k)
744 cpassert(.NOT.
ASSOCIATED(mos_k(ispin)%mo_coeff_b))
745 IF (kpoints%use_real_wfn)
THEN
746 IF (
ASSOCIATED(mos_k(ispin)%mo_coeff)) cycle
748 IF (
ASSOCIATED(mos_k(ispin)%cmo_coeff)) cycle
750 CALL init_mo_set(mos_k(ispin), fm_pool=ao_mo_fm_pools(ispin)%pool, &
753 complex_coeff=.NOT. kpoints%use_real_wfn)
758 CALL timestop(handle)
760 END SUBROUTINE qs_scf_ensure_mos
769 SUBROUTINE qs_scf_ensure_mixing(scf_control, scf_section, scf_env, dft_control)
778 CALL cite_reference(
hu2010)
782 scf_env%p_mix_alpha = 1.0_dp
783 scf_env%skip_diis = scf_control%max_diis < 2 .OR. &
784 scf_control%eps_diis < scf_control%eps_scf
785 IF (scf_control%eps_diis < scf_control%eps_scf)
THEN
786 cpwarn(
"the ADIIS to DIIS switch is disabled, since EPS_DIIS < EPS_SCF")
791 SELECT CASE (scf_control%mixing_method)
794 scf_env%p_mix_alpha = 1.0_dp
797 scf_env%mixing_method = scf_control%mixing_method
799 IF (.NOT.
ASSOCIATED(scf_env%mixing_store))
THEN
800 ALLOCATE (scf_env%mixing_store)
802 dft_control%qs_control%cutoff)
805 cpabort(
"Unknown mixing method")
812 scf_env%p_mix_alpha = 1.0_dp
813 scf_env%skip_diis = .true.
816 IF (scf_control%use_diag .AND. scf_env%mixing_method ==
no_mixing_nr)
THEN
817 cpabort(
"Diagonalization procedures without mixing are not recommendable")
821 scf_env%skip_diis = .true.
822 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
823 IF (scf_env%mixing_store%beta == 0.0_dp)
THEN
824 cpabort(
"Mixing employing the Kerker damping factor needs BETA /= 0.0")
829 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
830 IF (scf_control%eps_diis < scf_control%eps_scf)
THEN
831 scf_env%skip_diis = .true.
832 cpwarn(
"the DIIS scheme is disabled, since EPS_DIIS < EPS_SCF")
836 END SUBROUTINE qs_scf_ensure_mixing
847 SUBROUTINE qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
848 scf_control, has_unit_metric)
853 LOGICAL :: has_unit_metric
855 INTEGER :: ispin, kplocal, nao, nmo
856 INTEGER,
DIMENSION(2) :: kp_range
857 LOGICAL :: do_kpoints, need_coeff_b, not_se_or_tb, &
864 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints, dft_control=dft_control, mos=mos)
865 not_se_or_tb = .NOT. (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
866 dft_control%qs_control%semi_empirical)
867 need_coeff_b = .false.
868 ot_energies = .false.
869 scf_env%needs_ortho = .false.
871 IF (dft_control%smeagol_control%smeagol_enabled .AND. &
874 scf_env%skip_diis = .true.
875 scf_control%use_diag = .false.
877 IF (.NOT. do_kpoints)
THEN
878 cpabort(
"SMEAGOL requires kpoint calculations")
880 cpwarn_if(scf_control%use_ot,
"OT is irrelevant to NEGF method")
883 IF (scf_control%use_diag)
THEN
885 IF (dft_control%restricted)
THEN
886 cpabort(
"OT only for restricted (ROKS)")
888 SELECT CASE (scf_control%diagonalization%method)
890 IF (.NOT. not_se_or_tb)
THEN
891 cpabort(
"TB and SE not possible with block iterative diagonalization")
894 SELECT CASE (scf_control%diagonalization%method)
898 scf_env%needs_ortho = (.NOT. has_unit_metric) .AND. (.NOT. do_kpoints)
901 scf_control%level_shift == 0.0_dp .AND. &
905 scf_env%needs_ortho = .false.
908 IF (has_unit_metric)
THEN
912 IF (dft_control%roks)
THEN
913 cpabort(
"ROKS with OT diagonalization not possible")
916 need_coeff_b = .true.
920 IF (dft_control%roks)
THEN
921 cpabort(
"ROKS with block PF diagonalization not possible")
924 IF (.NOT.
ASSOCIATED(scf_env%krylov_settings))
THEN
932 scf_env%needs_ortho = .NOT. do_kpoints
933 IF (.NOT. do_kpoints)
THEN
940 IF (dft_control%roks)
THEN
941 cpabort(
"Block Davidson not possible with ROKS")
945 IF (.NOT.
ASSOCIATED(scf_env%block_davidson_env))
THEN
946 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
948 kplocal = kp_range(2) - kp_range(1) + 1
950 kplocal*dft_control%nspins, scf_section)
952 need_coeff_b = .false.
954 IF (.NOT.
ASSOCIATED(scf_env%block_davidson_env))
THEN
958 DO ispin = 1, dft_control%nspins
959 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
962 need_coeff_b = .true.
976 cpabort(
"Unknown diagonalization method")
979 IF (scf_control%do_diag_sub)
THEN
980 scf_env%needs_ortho = .true.
981 IF (.NOT.
ASSOCIATED(scf_env%subspace_env))
THEN
983 dft_control%qs_control%cutoff)
987 cpabort(
"No subspace diagonlization with kpoint calculation")
991 ELSE IF (scf_control%use_ot)
THEN
993 need_coeff_b = .true.
995 IF (sum(abs(scf_control%added_mos)) > 0 .AND. &
996 (.NOT. do_kpoints .OR. .NOT. ot_energies))
THEN
997 cpabort(
"OT with ADDED_MOS currently requires complex K points and OT%ENERGIES.")
999 IF (dft_control%restricted .AND. dft_control%nspins /= 2)
THEN
1000 cpabort(
"nspin must be 2 for restricted (ROKS)")
1004 cpabort(
"OT or DIAGONALIZATION have to be set")
1006 DO ispin = 1, dft_control%nspins
1007 mos(ispin)%use_mo_coeff_b = need_coeff_b
1010 END SUBROUTINE qs_scf_ensure_diagonalization
1023 SUBROUTINE init_scf_run(scf_env, qs_env, scf_section, scf_control)
1030 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_scf_run'
1032 INTEGER :: after, handle, homo, ii, ikind, ispin, &
1033 iw, nao, ndep, needed_evals, nmo, &
1035 LOGICAL :: dft_plus_u_atom, do_kpoints, &
1036 init_u_ramping_each_scf, omit_headers, &
1037 s_minus_half_available
1038 REAL(kind=
dp) :: u_ramping
1039 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
1040 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
1047 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s_kp, matrix_w_kp
1052 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1057 CALL timeset(routinen, handle)
1059 NULLIFY (qs_kind_set, matrix_s, dft_control, mos, qs_kind, rho, xas_env, mo_coeff)
1063 cpassert(
ASSOCIATED(scf_env))
1064 cpassert(
ASSOCIATED(qs_env))
1067 s_minus_half_available = .false.
1069 dft_control=dft_control, &
1070 qs_kind_set=qs_kind_set, &
1073 nelectron_total=scf_env%nelectron, &
1074 do_kpoints=do_kpoints, &
1075 para_env=para_env, &
1079 IF (do_kpoints)
THEN
1085 IF (dft_control%qs_control%xtb_control%do_tblite)
THEN
1087 CALL cp_warn(__location__, &
1088 "CP2K/tblite with OT updates the tblite SCC variables directly from the OT density; "// &
1089 "XTB/SCC_MIXER is ignored.")
1090 IF (scf_control%smear%do_smear .AND. &
1091 dft_control%qs_control%xtb_control%tblite_method ==
gfn2xtb)
THEN
1092 CALL cp_warn(__location__, &
1093 "Direct GFN2/tblite smearing has indefinite shell and multipole SCC modes. "// &
1094 "Use SCF/DIAGONALIZATION ALGORITHM OT with XTB/SCC_MIXER TBLITE or CP2K.")
1095 cpabort(
"Use fixed-H OT for GFN2 smearing")
1102 IF (scf_env%needs_ortho)
THEN
1118 ALLOCATE (evals(nao))
1130 IF (evals(ii) > scf_control%eps_eigval)
THEN
1135 needed_evals = nao - ndep
1138 evals(1:ndep) = 0.0_dp
1140 evals(ndep + 1:nao) = 1.0_dp/sqrt(evals(ndep + 1:nao))
1145 nrow_global=nao, ncol_global=needed_evals)
1147 ALLOCATE (scf_env%ortho_red, scf_env%scf_work2_red)
1152 IF (scf_control%level_shift /= 0.0_dp)
THEN
1154 nrow_global=needed_evals, ncol_global=nao)
1156 ALLOCATE (scf_env%ortho_m1_red)
1161 ALLOCATE (scf_env%scf_work1_red(
SIZE(scf_env%scf_work1)))
1162 DO ispin = 1,
SIZE(scf_env%scf_work1)
1164 nrow_global=needed_evals, ncol_global=needed_evals)
1165 CALL cp_fm_create(scf_env%scf_work1_red(ispin), fm_struct)
1170 CALL cp_fm_to_fm(evecs, scf_env%ortho_red, needed_evals, ndep + 1, 1)
1172 IF (scf_control%level_shift /= 0.0_dp)
THEN
1180 DO ispin = 1,
SIZE(mos)
1181 CALL get_mo_set(mos(ispin), nmo=nmo, mo_coeff=mo_coeff, homo=homo, eigenvalues=eigenvalues)
1182 IF (needed_evals < nmo)
THEN
1183 IF (needed_evals < homo)
THEN
1184 CALL cp_abort(__location__, &
1185 "The numerical rank of the overlap matrix is lower than the "// &
1186 "number of orbitals to be occupied! Check the geometry or increase "// &
1187 "EPS_DEFAULT or EPS_PGF_ORB!")
1189 CALL cp_warn(__location__, &
1190 "The numerical rank of the overlap matrix is lower than the number of requested MOs! "// &
1191 "Reduce the number of MOs to the number of available MOs. If necessary, "// &
1192 "request a lower number of MOs or increase EPS_DEFAULT or EPS_PGF_ORB.")
1193 CALL set_mo_set(mos(ispin), nmo=needed_evals)
1196 CALL cp_fm_to_fm(evecs, mo_coeff, min(ndep, max(0, nmo - needed_evals)), 1, needed_evals + 1)
1199 eigenvalues(needed_evals + 1:min(nao, nmo)) = 1.0_dp/scf_control%eps_eigval
1203 CALL parallel_gemm(
"N",
"T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_red, evecs, &
1204 0.0_dp, scf_env%ortho, b_first_col=ndep + 1)
1206 IF (scf_control%level_shift /= 0.0_dp)
THEN
1208 evals(ndep + 1:nao) = 1.0_dp/evals(ndep + 1:nao)
1211 CALL parallel_gemm(
"T",
"T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_m1_red, evecs, &
1212 0.0_dp, scf_env%ortho_m1, b_first_col=ndep + 1)
1217 s_minus_half_available = .true.
1221 qs_env%input,
"DFT%PRINT%AO_MATRICES/ORTHO"),
cp_p_file))
THEN
1225 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
1226 after = min(max(after, 1), 16)
1228 para_env, output_unit=iw, omit_headers=omit_headers)
1230 "DFT%PRINT%AO_MATRICES/ORTHO")
1237 IF (dft_control%dft_plus_u)
THEN
1239 IF (do_kpoints)
THEN
1242 CALL cp_abort(__location__, &
1243 "Lowdin DFT+U with k-points requires STANDARD diagonalization or OT")
1245 CALL get_qs_env(qs_env, kpoints=kpoints, matrix_s_kp=matrix_s_kp, matrix_w_kp=matrix_w_kp)
1246 IF (scf_control%use_ot)
THEN
1247 IF (kpoints%use_real_wfn .OR. dft_control%restricted)
THEN
1248 CALL cp_abort(__location__, &
1249 "Lowdin DFT+U with k-point OT requires complex RKS/UKS wavefunctions")
1252 CALL diag_kp_smat(matrix_s_kp, kpoints, scf_env%scf_work1, lowdin_forces=
ASSOCIATED(matrix_w_kp))
1256 IF (s_minus_half_available)
THEN
1258 scf_env%s_half, nao)
1262 CALL cp_fm_power(scf_env%s_half, fm_w, 0.5_dp, scf_control%eps_eigval, ndep)
1267 DO ikind = 1,
SIZE(qs_kind_set)
1268 qs_kind => qs_kind_set(ikind)
1270 dft_plus_u_atom=dft_plus_u_atom, &
1271 u_ramping=u_ramping, &
1272 init_u_ramping_each_scf=init_u_ramping_each_scf)
1273 IF (dft_plus_u_atom .AND. (u_ramping /= 0.0_dp))
THEN
1274 IF (init_u_ramping_each_scf)
THEN
1275 CALL set_qs_kind(qs_kind=qs_kind, u_minus_j=0.0_dp)
1281 IF (dft_control%dft_plus_u)
THEN
1283 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1284 DO ikind = 1,
SIZE(atomic_kind_set)
1285 qs_kind => qs_kind_set(ikind)
1286 CALL get_qs_kind(qs_kind=qs_kind, dft_plus_u_atom=dft_plus_u_atom)
1287 IF (.NOT. dft_plus_u_atom) cycle
1289 qs_kind=qs_kind_set(ikind), &
1290 which_l=qs_kind%dft_plus_u%l, &
1291 which_n=qs_kind%dft_plus_u%n, &
1292 proj_shell_charge=qs_kind%dft_plus_u%proj_shell_charge, &
1293 ao_coef=qs_kind%dft_plus_u%ao_coef)
1299 IF (scf_control%outer_scf%have_scf)
THEN
1304 IF (
ASSOCIATED(qs_env%xas_env))
THEN
1310 IF (do_kpoints .AND. dft_control%dft_plus_u .AND. dft_control%plus_u_method_id ==
plus_u_lowdin)
THEN
1314 CALL scf_env_initial_rho_setup(scf_env, qs_env=qs_env, &
1315 scf_section=scf_section, scf_control=scf_control)
1319 IF (
ASSOCIATED(qs_env%wf_history))
THEN
1321 IF (.NOT.
ASSOCIATED(qs_env%wf_history%past_states(1)%snapshot))
THEN
1322 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
1323 ALLOCATE (qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1324 CALL qs_rho_create(qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1326 rho_output=qs_env%wf_history%past_states(1)%snapshot%rho_frozen, &
1333 IF (qs_env%qmmm)
THEN
1334 IF (qs_env%qmmm .AND. qs_env%qmmm_env_qm%image_charge)
THEN
1336 qmmm_env=qs_env%qmmm_env_qm)
1341 extension=
".scfLog")
1344 "PRINT%PROGRAM_RUN_INFO")
1346 CALL timestop(handle)
1348 END SUBROUTINE init_scf_run
1360 SUBROUTINE scf_env_initial_rho_setup(scf_env, qs_env, scf_section, scf_control)
1366 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_initial_rho_setup'
1368 INTEGER :: extrapolation_method_nr, handle, ispin, &
1370 LOGICAL :: do_harris, do_kpoints, orthogonal_wf
1371 REAL(kind=
dp),
POINTER :: auxiliary(:, :)
1382 CALL timeset(routinen, handle)
1383 NULLIFY (mo_coeff, rho, dft_control, para_env, mos)
1385 cpassert(
ASSOCIATED(scf_env))
1386 cpassert(
ASSOCIATED(qs_env))
1391 dft_control=dft_control, &
1392 do_kpoints=do_kpoints, &
1395 do_harris = qs_env%harris_method
1397 cpabort(
"EXTERNAL_DENSITY SCF guess is incompatible with HARRIS_METHOD")
1401 IF (
ASSOCIATED(qs_env%wf_history))
THEN
1403 qs_env=qs_env, dt=1.0_dp, &
1404 extrapolation_method_nr=extrapolation_method_nr, &
1405 orthogonal_wf=orthogonal_wf)
1407 IF ((.NOT. orthogonal_wf) .AND. &
1409 (.NOT. do_kpoints) .AND. &
1411 DO ispin = 1,
SIZE(mos)
1412 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1414 IF (dft_control%hairy_probes .EQV. .true.)
THEN
1415 scf_control%smear%do_smear = .false.
1417 smear=scf_control%smear, probe=dft_control%probe)
1420 smear=scf_control%smear)
1426 IF (.NOT. do_harris)
THEN
1428 extension=
".scfLog")
1429 IF (output_unit > 0)
THEN
1430 WRITE (unit=output_unit, fmt=
"(/,T2,A,I0)") &
1431 "Extrapolation method: "// &
1434 WRITE (unit=output_unit, fmt=
"(T2,A,I0,A)") &
1435 "Extrapolation order: ", &
1436 max((min(qs_env%wf_history%memory_depth, qs_env%wf_history%snapshot_count) - 1), 0)
1440 "PRINT%PROGRAM_RUN_INFO")
1444 CALL get_qs_env(qs_env, harris_env=harris_env)
1460 IF (do_kpoints .AND. dft_control%dft_plus_u)
THEN
1464 auxiliary => kpoints%lowdin_q
1467 IF (scf_env%mixing_method > 1)
THEN
1468 IF (dft_control%qs_control%gapw)
THEN
1469 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
1470 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1471 para_env, rho_atom=rho_atom, auxiliary=auxiliary)
1472 ELSE IF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb)
THEN
1474 ELSE IF (dft_control%qs_control%semi_empirical)
THEN
1475 cpabort(
'SE Code not possible')
1477 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1478 para_env, auxiliary=auxiliary)
1482 DO ispin = 1,
SIZE(mos)
1483 IF (mos(ispin)%use_mo_coeff_b)
THEN
1485 mos(ispin)%mo_coeff_b)
1489 CALL timestop(handle)
1491 END SUBROUTINE scf_env_initial_rho_setup
calculate the orbitals for a given atomic kind type
subroutine, public calculate_atomic_orbitals(atomic_kind, qs_kind, agrid, iunit, pmat, fmat, density, wavefunction, wfninfo, confine, xc_section, nocc, which_l, which_n, proj_shell_charge, ao_coef)
...
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public hu2010
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm, plan, check_plan)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_m_by_n_from_row_template(matrix, template, n, sym)
Utility function to create dbcsr matrix, m x n matrix (n arbitrary) with the same processor grid and ...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
subroutine, public write_fm_with_basis_info(blacs_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, output_unit, omit_headers)
Print a spherical matrix of blacs type.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_row_scale(matrixa, scaling)
scales row i of matrix a with scaling(i)
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
subroutine, public cp_fm_column_scale(matrixa, scaling, first_col, source)
Scales columns of the full matrix by corresponding factors.
subroutine, public cp_fm_triangular_invert(matrix_a, uplo_tr)
inverts a triangular matrix
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
integer, parameter, public fm_diag_type_cusolver
logical, save, public direct_generalized_diagonalization
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
integer, save, public diag_type
integer, parameter, public cusolver_n_min
pool for for elements that are retained and released
type(cp_fm_struct_type) function, pointer, public fm_pool_get_el_struct(pool)
returns the structure of the elements in this pool
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_get(fmstruct, para_env, context, descriptor, ncol_block, nrow_block, nrow_global, ncol_global, first_p_pos, row_indices, col_indices, nrow_local, ncol_local, nrow_locals, ncol_locals, local_leading_dimension)
returns the values of various attributes of the matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_to_fm_triangular(msource, mtarget, uplo)
copy just a triangular matrix
various routines to log and control the output. The idea is that decisions about where to log should ...
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...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout, file_access)
...
Add the DFT+U contribution to the Hamiltonian matrix.
subroutine, public lowdin_kp_initial_density(qs_env, fmwork)
Complete the initial density's Lowdin coordinates, including atomic and density restarts.
subroutine, public lowdin_kp_init(qs_env)
Select the AO columns used by the existing orbital-diagonal Lowdin functional.
subroutine, public ao_boundaries(probe, atomic_kind_set, qs_kind_set, particle_set, nao)
...
Defines the basic variable types.
integer, parameter, public dp
Types and basic routines needed for a kpoint calculation.
subroutine, public kpoint_clear_scf_smat(kpoint)
Release overlap matrices cached for a single SCF run.
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, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered, lattice_fft)
Retrieve information from a kpoint environment.
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
Routines for image charge calculation within QM/MM.
subroutine, public conditional_calc_image_matrix(qs_env, qmmm_env)
calculate image matrix T depending on constraints on image atoms in case coefficients are estimated n...
module that contains the algorithms to perform an iterative diagonalization by the block-Davidson app...
subroutine, public block_davidson_env_create(bdav_env, nchannels, scf_section)
creates one Davidson environment per solver channel: for Gamma-point runs a channel is a spin,...
subroutine, public block_davidson_allocate(bdav_env, mo_coeff, nao, nmo)
...
Control parameters for optimizers that work with CDFT constraints.
subroutine, public cdft_opt_type_copy(new, old)
copies settings between two CDFT optimizer control objects retaining both
module that contains the definitions of the scf types
subroutine, public mixing_storage_release(mixing_store)
releases a mixing_storage
integer, parameter, public no_mixing_nr
integer, parameter, public direct_mixing_nr
subroutine, public mixing_storage_create(mixing_store, mixing_section, mixing_method, ecut)
creates a mixing_storage
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, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Routines to handle an external density The external density can be generic and is provided by user in...
subroutine, public read_scf_guess_density(qs_env, filename)
Read a cube density for one-time use as the first SCF input density.
subroutine, public fb_distribution_build(fb_env, qs_env, scf_section)
Build local atoms associated to filter matrix algorithm for each MPI process, trying to balance the l...
subroutine, public fb_env_read_input(fb_env, scf_section)
Read input sections for filter matrix method.
subroutine, public fb_env_build_atomic_halos(fb_env, qs_env, scf_section)
Builds an fb_atomic_halo_list object using information from fb_env.
subroutine, public fb_env_write_info(fb_env, qs_env, scf_section)
Write out parameters used for the filter matrix method to output.
subroutine, public fb_env_build_rcut_auto(fb_env, qs_env)
Automatically generate the cutoff radii of atoms used for constructing the atomic halos,...
logical function, public fb_env_has_data(fb_env)
Checks if a fb_env object is associated with an actual data content or not.
subroutine, public fb_env_create(fb_env)
creates an empty fb_env object
Types needed for a for a Harris model calculation.
Harris method environment setup and handling.
subroutine, public harris_density_update(qs_env, harris_env)
...
Routines to somehow generate an initial guess.
subroutine, public calculate_first_density_matrix(scf_env, qs_env)
can use a variety of methods to come up with an initial density matrix and optionally an initial wave...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, hund_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public set_qs_kind(qs_kind, paw_atom, ghost, floating, hard_radius, hard0_radius, covalent_radius, vdw_radius, lmax_rho0, zeff, no_optimize, dispersion, u_minus_j, hund_j, reltmat, dftb_parameter, xtb_parameter, elec_conf, pao_basis_size)
Set the components of an atomic kind data set.
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...
wrapper for the pools of matrixes
subroutine, public mpools_get(mpools, ao_mo_fm_pools, ao_ao_fm_pool, mo_mo_fm_pools, ao_mosub_fm_pools, mosub_mosub_fm_pools, maxao_maxmo_fm_pool, maxao_maxao_fm_pool, maxmo_maxmo_fm_pool)
returns various attributes of the mpools (notably the pools contained in it)
elemental subroutine, public charge_mixing_init(mixing_store)
initialiation needed when charge mixing is used
subroutine, public mixing_init(mixing_method, rho, mixing_store, para_env, rho_atom, auxiliary)
initialiation needed when gspace mixing is used
subroutine, public mixing_allocate(qs_env, mixing_method, p_mix_new, p_delta, nspins, mixing_store)
allocation needed when density mixing is used
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public set_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, uniform_occupation, kts, mu, flexible_electron_count)
Set the components of a MO set data structure.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name, counter, complex_coeff)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
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, cmo_coeff)
Get the components of a MO set data structure.
Define the neighbor list data types and the corresponding functionality.
Routines for performing an outer scf loop.
subroutine, public outer_loop_switch(scf_env, scf_control, cdft_control, dir)
switch between two outer_scf envs stored in cdft_control
subroutine, public outer_loop_extrapolate(qs_env)
uses the outer_scf_history to extrapolate new values for the variables and updates their value in qs_...
integer function, public outer_loop_variables_count(scf_control, cdft_control)
returns the number of variables that is employed in the outer loop. with a CDFT constraint this value...
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...
subroutine, public duplicate_rho_type(rho_input, rho_output, qs_env)
Duplicates a pointer physically.
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...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public diag_kp_smat(matrix_s, kpoints, fmwork, lowdin_forces)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
subroutine, public diag_subspace_allocate(subspace_env, qs_env, mos)
...
Utility routines for qs_scf.
subroutine, public qs_scf_env_init_basic(qs_env, scf_env)
initializes input parameters if needed for non-scf calclulations using diagonalization
subroutine, public qs_scf_env_initialize(qs_env, scf_env, scf_control, scf_section)
initializes input parameters if needed or restores values from previous runs to fill scf_env with the...
module that contains the algorithms to perform an iterative diagonalization by the block-Lanczos appr...
subroutine, public krylov_workspace_allocate(krylov_space, krylov_settings, mos)
allocates matrices and vectors used in the construction of the krylov space and for the lanczos refin...
subroutine, public qs_scf_initial_info(output_unit, mos, dft_control, ndep)
writes basic information at the beginning of an scf run
module that contains the definitions of the scf types
integer, parameter, public ot_diag_method_nr
subroutine, public diag_subspace_env_create(subspace_env, scf_section, ecut)
creates subspace-rotation environment
integer, parameter, public filter_matrix_diag_method_nr
integer, parameter, public block_davidson_diag_method_nr
integer, parameter, public smeagol_method_nr
subroutine, public krylov_settings_create(krylov_settings, scf_section)
creates the Krylov solver settings
integer, parameter, public ot_method_nr
subroutine, public scf_env_create(scf_env)
allocates and initialize an scf_env
integer, parameter, public special_diag_method_nr
integer, parameter, public block_krylov_diag_method_nr
integer, parameter, public general_diag_method_nr
Storage of past states of the qs_env. Methods to interpolate (or actually normally extrapolate) the n...
character(len=30) function, public wfi_get_method_label(method_nr)
returns a string describing the interpolation method
subroutine, public reorthogonalize_vectors(qs_env, v_matrix, n_col)
reorthogonalizes the mos
subroutine, public wfi_update(wf_history, qs_env, dt)
updates the snapshot buffer, taking a new snapshot
subroutine, public wfi_extrapolate(wf_history, qs_env, dt, extrapolation_method_nr, orthogonal_wf)
calculates the new starting state for the scf for the next wf optimization
parameters that control an scf iteration
define create destroy get and put information in xas_env to calculate the x-ray absorption spectra
Initialize the XAS orbitals for specific core excitations Either the GS orbitals are used as initial ...
subroutine, public xas_initialize_rho(qs_env, scf_env, scf_control)
Once the mos and the occupation numbers are initialized the electronic density of the excited state c...
Provides all information about an atomic kind.
to create arrays of pools
keeps the information about the structure of 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
Contains information on the Harris method.
Provides all information about a quickstep kind.
keeps the density in various representations, keeping track of which ones are valid.