17 dbcsr_type_no_symmetry
122#include "./base/base_uses.f90"
128 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_initialization'
152 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
154 IF (
PRESENT(scf_control))
THEN
155 my_scf_control => scf_control
157 CALL get_qs_env(qs_env, scf_control=my_scf_control)
161 IF (
PRESENT(scf_section))
THEN
162 my_scf_section => scf_section
167 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
171 CALL qs_scf_ensure_mos(qs_env)
174 CALL qs_scf_ensure_diagonalization(scf_env, my_scf_section, qs_env, &
175 my_scf_control, qs_env%has_unit_metric)
177 CALL qs_scf_ensure_mixing(my_scf_control, my_scf_section, scf_env, dft_control)
179 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
181 CALL qs_scf_ensure_mixing_store(qs_env, scf_env)
184 IF (dft_control%qs_control%cdft)
THEN
185 CALL qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, &
186 scf_control=my_scf_control)
188 CALL qs_scf_ensure_outer_loop_vars(scf_env, my_scf_control)
191 CALL init_scf_run(scf_env, qs_env, my_scf_section, my_scf_control)
208 CALL get_qs_env(qs_env, input=input, dft_control=dft_control)
210 CALL get_qs_env(qs_env, scf_control=scf_control)
214 CALL qs_scf_ensure_scf_env(qs_env, scf_env)
217 scf_control%use_diag = .true.
220 CALL qs_scf_ensure_mos(qs_env)
223 CALL qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
224 scf_control, qs_env%has_unit_metric)
225 CALL qs_scf_ensure_work_matrices(qs_env, scf_env)
227 CALL init_scf_run(scf_env, qs_env, scf_section, scf_control)
237 SUBROUTINE qs_scf_ensure_scf_env(qs_env, scf_env)
246 IF (.NOT.
ASSOCIATED(scf_env))
THEN
251 SELECT CASE (scf_env%mixing_method)
253 IF (
ASSOCIATED(scf_env%mixing_store))
THEN
259 IF (
ASSOCIATED(scf_env%mixing_store%rhoin))
THEN
260 IF (
SIZE(rho_g(1)%pw_grid%gsq) /=
SIZE(scf_env%mixing_store%rhoin(1)%cc))
THEN
262 DEALLOCATE (scf_env%mixing_store)
269 END SUBROUTINE qs_scf_ensure_scf_env
277 SUBROUTINE qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvar)
280 INTEGER,
OPTIONAL :: nvar
282 INTEGER :: nhistory, nvariables
284 IF (scf_control%outer_scf%have_scf)
THEN
285 nhistory = scf_control%outer_scf%max_scf + 1
286 IF (
PRESENT(nvar))
THEN
295 ALLOCATE (scf_env%outer_scf%variables(nvariables, nhistory))
296 ALLOCATE (scf_env%outer_scf%count(nhistory))
297 scf_env%outer_scf%count = 0
298 ALLOCATE (scf_env%outer_scf%gradient(nvariables, nhistory))
299 ALLOCATE (scf_env%outer_scf%energy(nhistory))
302 END SUBROUTINE qs_scf_ensure_outer_loop_vars
311 SUBROUTINE qs_scf_ensure_cdft_loop_vars(qs_env, scf_env, dft_control, scf_control)
317 INTEGER :: nhistory, nvariables
318 LOGICAL :: do_kpoints
319 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: gradient_history, outer_scf_history, &
322 NULLIFY (outer_scf_history, gradient_history, variable_history)
323 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
326 cpabort(
"CDFT calculation not possible with kpoints")
330 IF (.NOT. scf_control%outer_scf%have_scf) &
331 cpabort(
"Section SCF&OUTER_SCF must be active for CDFT calculations.")
333 IF (dft_control%qs_control%cdft_control%constraint_control%have_scf)
THEN
334 nhistory = dft_control%qs_control%cdft_control%constraint_control%max_scf + 1
337 dft_control%qs_control%cdft_control)
340 nvariables =
SIZE(dft_control%qs_control%cdft_control%target)
342 ALLOCATE (dft_control%qs_control%cdft_control%constraint%variables(nvariables, nhistory))
343 ALLOCATE (dft_control%qs_control%cdft_control%constraint%count(nhistory))
344 dft_control%qs_control%cdft_control%constraint%count = 0
345 ALLOCATE (dft_control%qs_control%cdft_control%constraint%gradient(nvariables, nhistory))
346 ALLOCATE (dft_control%qs_control%cdft_control%constraint%energy(nhistory))
347 CALL qs_scf_ensure_outer_loop_vars(scf_env, scf_control, nvariables)
352 IF (scf_control%outer_scf%have_scf)
THEN
354 dft_control%qs_control%cdft_control%ot_control%have_scf = .true.
355 dft_control%qs_control%cdft_control%ot_control%max_scf = scf_control%outer_scf%max_scf
356 dft_control%qs_control%cdft_control%ot_control%eps_scf = scf_control%outer_scf%eps_scf
357 dft_control%qs_control%cdft_control%ot_control%step_size = scf_control%outer_scf%step_size
358 dft_control%qs_control%cdft_control%ot_control%type = scf_control%outer_scf%type
359 dft_control%qs_control%cdft_control%ot_control%optimizer = scf_control%outer_scf%optimizer
360 dft_control%qs_control%cdft_control%ot_control%diis_buffer_length = scf_control%outer_scf%diis_buffer_length
361 dft_control%qs_control%cdft_control%ot_control%bisect_trust_count = scf_control%outer_scf%bisect_trust_count
362 CALL cdft_opt_type_copy(dft_control%qs_control%cdft_control%ot_control%cdft_opt_control, &
363 scf_control%outer_scf%cdft_opt_control)
365 nvariables =
SIZE(dft_control%qs_control%cdft_control%target)
366 IF (scf_control%outer_scf%extrapolation_order /= &
367 dft_control%qs_control%cdft_control%constraint_control%extrapolation_order &
368 .OR. nvariables /= 1)
THEN
369 DEALLOCATE (qs_env%outer_scf_history)
370 DEALLOCATE (qs_env%gradient_history)
371 DEALLOCATE (qs_env%variable_history)
372 nhistory = dft_control%qs_control%cdft_control%constraint_control%extrapolation_order
373 ALLOCATE (outer_scf_history(nvariables, nhistory))
374 ALLOCATE (gradient_history(nvariables, 2))
375 gradient_history = 0.0_dp
376 ALLOCATE (variable_history(nvariables, 2))
377 variable_history = 0.0_dp
378 CALL set_qs_env(qs_env, outer_scf_history=outer_scf_history, &
379 gradient_history=gradient_history, variable_history=variable_history)
385 END SUBROUTINE qs_scf_ensure_cdft_loop_vars
392 SUBROUTINE qs_scf_ensure_mixing_store(qs_env, scf_env)
398 NULLIFY (dft_control)
399 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
401 IF (scf_env%mixing_method > 0)
THEN
402 CALL mixing_allocate(qs_env, scf_env%mixing_method, scf_env%p_mix_new, &
403 scf_env%p_delta, dft_control%nspins, &
404 scf_env%mixing_store)
406 NULLIFY (scf_env%p_mix_new)
409 END SUBROUTINE qs_scf_ensure_mixing_store
418 SUBROUTINE qs_scf_ensure_work_matrices(qs_env, scf_env)
423 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_ensure_work_matrices'
425 INTEGER :: handle, is, nao, nrow_block, nw
426 LOGICAL :: do_kpoints
429 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
435 CALL timeset(routinen, handle)
437 NULLIFY (ao_mo_fm_pools, ao_mo_fmstruct, ao_ao_fmstruct, dft_control, matrix_s, mos)
440 dft_control=dft_control, &
441 matrix_s_kp=matrix_s, &
443 scf_control=scf_control, &
444 do_kpoints=do_kpoints)
445 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
452 nrow_block=nrow_block, &
453 ncol_block=nrow_block, &
456 template_fmstruct=ao_mo_fmstruct)
460 IF (.NOT.
ASSOCIATED(scf_env%scf_work1))
THEN
461 nw = dft_control%nspins
462 IF (do_kpoints) nw = 4
463 ALLOCATE (scf_env%scf_work1(nw))
464 DO is = 1,
SIZE(scf_env%scf_work1)
466 matrix_struct=ao_ao_fmstruct, &
467 name=
"SCF-WORK_MATRIX-1-"//trim(adjustl(
cp_to_string(is))))
470 IF ((.NOT.
ASSOCIATED(scf_env%ortho)) .AND. &
474 ALLOCATE (scf_env%ortho)
476 matrix_struct=ao_ao_fmstruct, &
477 name=
"SCF-ORTHO_MATRIX")
480 ref_matrix => matrix_s(1, 1)%matrix
482 CALL dbcsr_create(scf_env%ortho_dbcsr, template=ref_matrix, &
483 matrix_type=dbcsr_type_no_symmetry)
485 CALL dbcsr_create(scf_env%buf1_dbcsr, template=ref_matrix, &
486 matrix_type=dbcsr_type_no_symmetry)
488 CALL dbcsr_create(scf_env%buf2_dbcsr, template=ref_matrix, &
489 matrix_type=dbcsr_type_no_symmetry)
491 (scf_control%level_shift /= 0.0_dp .AND. &
493 ALLOCATE (scf_env%ortho_m1)
495 matrix_struct=ao_ao_fmstruct, &
496 name=
"SCF-ORTHO_MATRIX-1")
499 IF (.NOT.
ASSOCIATED(scf_env%scf_work2))
THEN
500 ALLOCATE (scf_env%scf_work2)
502 matrix_struct=ao_ao_fmstruct, &
503 name=
"SCF-WORK_MATRIX-2")
507 IF (dft_control%dft_plus_u)
THEN
509 IF (.NOT.
ASSOCIATED(scf_env%scf_work2))
THEN
510 ALLOCATE (scf_env%scf_work2)
512 matrix_struct=ao_ao_fmstruct, &
513 name=
"SCF-WORK_MATRIX-2")
515 IF (.NOT.
ASSOCIATED(scf_env%s_half))
THEN
516 ALLOCATE (scf_env%s_half)
518 matrix_struct=ao_ao_fmstruct, &
519 name=
"S**(1/2) MATRIX")
525 IF (.NOT.
ASSOCIATED(scf_env%scf_work1))
THEN
527 ALLOCATE (scf_env%scf_work1(nw))
528 DO is = 1,
SIZE(scf_env%scf_work1)
530 matrix_struct=ao_ao_fmstruct, &
531 name=
"SCF-WORK_MATRIX-1-"//trim(adjustl(
cp_to_string(is))))
538 CALL timestop(handle)
540 END SUBROUTINE qs_scf_ensure_work_matrices
546 SUBROUTINE qs_scf_ensure_mos(qs_env)
549 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_ensure_mos'
551 INTEGER :: handle, ic, ik, ikk, ispin, nmo, nmo_mat
553 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_coeff_last
555 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
559 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_last_converged
560 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos_k
563 CALL timeset(routinen, handle)
565 NULLIFY (ao_mo_fm_pools, dft_control, mos, xas_env, matrix_s, mos_last_converged, mo_coeff_last)
568 dft_control=dft_control, &
570 matrix_s_kp=matrix_s, &
572 CALL mpools_get(qs_env%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
573 IF (dft_control%switch_surf_dip)
THEN
574 CALL get_qs_env(qs_env, mos_last_converged=mos_last_converged)
577 nmo_mat = dft_control%nspins
578 IF (dft_control%restricted) nmo_mat = 1
581 cpassert(
ASSOCIATED(mos))
582 DO ispin = 1,
SIZE(mos)
583 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
584 IF (.NOT.
ASSOCIATED(mo_coeff))
THEN
586 fm_pool=ao_mo_fm_pools(ispin)%pool, &
589 IF (.NOT.
ASSOCIATED(mo_coeff_b))
THEN
593 sym=dbcsr_type_no_symmetry)
597 IF (qs_env%requires_mo_derivs)
THEN
599 IF (.NOT.
ASSOCIATED(mo_derivs))
THEN
600 ALLOCATE (mo_derivs(nmo_mat))
601 DO ispin = 1, nmo_mat
602 CALL get_mo_set(mos(ispin), mo_coeff_b=mo_coeff_b)
603 NULLIFY (mo_derivs(ispin)%matrix)
605 CALL dbcsr_create(mo_derivs(ispin)%matrix, template=mo_coeff_b, &
606 name=
"mo_derivs", matrix_type=dbcsr_type_no_symmetry)
616 IF (dft_control%do_admm)
THEN
617 IF (dft_control%restricted) cpabort(
"ROKS with ADMM is not implemented")
621 IF (dft_control%switch_surf_dip)
THEN
622 cpassert(
ASSOCIATED(mos_last_converged))
623 DO ispin = 1,
SIZE(mos_last_converged)
624 CALL get_mo_set(mos_last_converged(ispin), mo_coeff=mo_coeff_last)
625 IF (.NOT.
ASSOCIATED(mo_coeff_last))
THEN
627 fm_ref=mos(ispin)%mo_coeff, &
628 name=
"qs_env%mos_last_converged"//trim(adjustl(
cp_to_string(ispin))))
633 CALL get_qs_env(qs_env=qs_env, kpoints=kpoints)
634 IF (kpoints%nkp /= 0)
THEN
636 IF (qs_env%requires_mo_derivs)
THEN
637 cpwarn(
"MO derivative methods flag has been switched off for kpoint calculation")
640 qs_env%requires_mo_derivs = .false.
642 IF (dft_control%do_xas_calculation) &
643 cpabort(
"No XAS implemented with kpoints")
644 DO ik = 1,
SIZE(kpoints%kp_env)
645 CALL mpools_get(kpoints%mpools, ao_mo_fm_pools=ao_mo_fm_pools)
646 mos_k => kpoints%kp_env(ik)%kpoint_env%mos
647 ikk = kpoints%kp_range(1) + ik - 1
648 cpassert(
ASSOCIATED(mos_k))
649 DO ispin = 1,
SIZE(mos_k, 2)
650 DO ic = 1,
SIZE(mos_k, 1)
651 CALL get_mo_set(mos_k(ic, ispin), mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b)
652 IF (.NOT.
ASSOCIATED(mo_coeff))
THEN
654 fm_pool=ao_mo_fm_pools(ispin)%pool, &
659 cpassert(.NOT.
ASSOCIATED(mo_coeff_b))
665 CALL timestop(handle)
667 END SUBROUTINE qs_scf_ensure_mos
676 SUBROUTINE qs_scf_ensure_mixing(scf_control, scf_section, scf_env, dft_control)
684 SELECT CASE (scf_control%mixing_method)
687 scf_env%p_mix_alpha = 1.0_dp
689 scf_env%mixing_method = scf_control%mixing_method
691 IF (.NOT.
ASSOCIATED(scf_env%mixing_store))
THEN
692 ALLOCATE (scf_env%mixing_store)
694 dft_control%qs_control%cutoff)
697 cpabort(
"Unknown mixing method")
704 scf_env%p_mix_alpha = 1.0_dp
705 scf_env%skip_diis = .true.
708 IF (scf_control%use_diag .AND. scf_env%mixing_method ==
no_mixing_nr)
THEN
709 cpabort(
"Diagonalization procedures without mixing are not recommendable")
713 scf_env%skip_diis = .true.
714 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
715 IF (scf_env%mixing_store%beta == 0.0_dp)
THEN
716 cpabort(
"Mixing employing the Kerker damping factor needs BETA /= 0.0")
721 scf_env%p_mix_alpha = scf_env%mixing_store%alpha
722 IF (scf_control%eps_diis < scf_control%eps_scf)
THEN
723 scf_env%skip_diis = .true.
724 cpwarn(
"the DIIS scheme is disabled, since EPS_DIIS < EPS_SCF")
728 END SUBROUTINE qs_scf_ensure_mixing
739 SUBROUTINE qs_scf_ensure_diagonalization(scf_env, scf_section, qs_env, &
740 scf_control, has_unit_metric)
745 LOGICAL :: has_unit_metric
747 INTEGER :: ispin, nao, nmo
748 LOGICAL :: do_kpoints, need_coeff_b, not_se_or_tb
753 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints, dft_control=dft_control, mos=mos)
754 not_se_or_tb = .NOT. (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb .OR. &
755 dft_control%qs_control%semi_empirical)
756 need_coeff_b = .false.
757 scf_env%needs_ortho = .false.
759 IF (dft_control%smeagol_control%smeagol_enabled .AND. &
762 scf_env%skip_diis = .true.
763 scf_control%use_diag = .false.
765 IF (.NOT. do_kpoints)
THEN
766 cpabort(
"SMEAGOL requires kpoint calculations")
768 cpwarn_if(scf_control%use_ot,
"OT is irrelevant to NEGF method")
771 IF (scf_control%use_diag)
THEN
773 IF (dft_control%restricted) &
774 cpabort(
"OT only for restricted (ROKS)")
775 SELECT CASE (scf_control%diagonalization%method)
777 IF (.NOT. not_se_or_tb) &
778 cpabort(
"TB and SE not possible with OT diagonalization")
780 SELECT CASE (scf_control%diagonalization%method)
784 scf_env%needs_ortho = (.NOT. has_unit_metric) .AND. (.NOT. do_kpoints)
785 IF (has_unit_metric)
THEN
790 IF (dft_control%roks) &
791 cpabort(
"ROKS with OT diagonalization not possible")
793 cpabort(
"OT diagonalization not possible with kpoint calculations")
795 need_coeff_b = .true.
799 IF (dft_control%roks) &
800 cpabort(
"ROKS with block PF diagonalization not possible")
802 cpabort(
"Block Krylov diagonalization not possible with kpoint calculations")
804 scf_env%needs_ortho = .true.
805 IF (.NOT.
ASSOCIATED(scf_env%krylov_space)) &
811 cpabort(
"Block Davidson diagonalization not possible with kpoint calculations")
813 IF (.NOT.
ASSOCIATED(scf_env%block_davidson_env)) &
816 DO ispin = 1, dft_control%nspins
817 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=nmo)
820 need_coeff_b = .true.
833 cpabort(
"Unknown diagonalization method")
836 IF (scf_control%do_diag_sub)
THEN
837 scf_env%needs_ortho = .true.
838 IF (.NOT.
ASSOCIATED(scf_env%subspace_env)) &
840 dft_control%qs_control%cutoff)
843 cpabort(
"No subspace diagonlization with kpoint calculation")
846 ELSEIF (scf_control%use_ot)
THEN
848 need_coeff_b = .true.
849 IF (sum(abs(scf_control%added_mos)) > 0) &
850 cpabort(
"OT with ADDED_MOS/=0 not implemented")
851 IF (dft_control%restricted .AND. dft_control%nspins .NE. 2) &
852 cpabort(
"nspin must be 2 for restricted (ROKS)")
854 cpabort(
"OT not possible with kpoint calculations")
856 cpabort(
"OT or DIAGONALIZATION have to be set")
858 DO ispin = 1, dft_control%nspins
859 mos(ispin)%use_mo_coeff_b = need_coeff_b
862 END SUBROUTINE qs_scf_ensure_diagonalization
875 SUBROUTINE init_scf_run(scf_env, qs_env, scf_section, scf_control)
882 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_scf_run'
884 INTEGER :: after, handle, homo, ii, ikind, ispin, &
885 iw, nao, ndep, needed_evals, nmo, &
887 LOGICAL :: dft_plus_u_atom, do_kpoints, &
888 init_u_ramping_each_scf, omit_headers, &
889 s_minus_half_available
890 REAL(kind=
dp) :: u_ramping
891 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
892 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
901 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
906 CALL timeset(routinen, handle)
908 NULLIFY (qs_kind_set, matrix_s, dft_control, mos, qs_kind, rho, xas_env, mo_coeff)
912 cpassert(
ASSOCIATED(scf_env))
913 cpassert(
ASSOCIATED(qs_env))
916 s_minus_half_available = .false.
918 dft_control=dft_control, &
919 qs_kind_set=qs_kind_set, &
922 nelectron_total=scf_env%nelectron, &
923 do_kpoints=do_kpoints, &
931 "PRINT%PROGRAM_RUN_INFO")
935 IF (scf_env%needs_ortho)
THEN
951 ALLOCATE (evals(nao))
963 IF (evals(ii) > scf_control%eps_eigval)
THEN
968 needed_evals = nao - ndep
971 evals(1:ndep) = 0.0_dp
973 evals(ndep + 1:nao) = 1.0_dp/sqrt(evals(ndep + 1:nao))
978 nrow_global=nao, ncol_global=needed_evals)
980 ALLOCATE (scf_env%ortho_red, scf_env%scf_work2_red)
985 IF (scf_control%level_shift /= 0.0_dp)
THEN
987 nrow_global=needed_evals, ncol_global=nao)
989 ALLOCATE (scf_env%ortho_m1_red)
994 ALLOCATE (scf_env%scf_work1_red(
SIZE(scf_env%scf_work1)))
995 DO ispin = 1,
SIZE(scf_env%scf_work1)
997 nrow_global=needed_evals, ncol_global=needed_evals)
998 CALL cp_fm_create(scf_env%scf_work1_red(ispin), fm_struct)
1003 CALL cp_fm_to_fm(evecs, scf_env%ortho_red, needed_evals, ndep + 1, 1)
1005 IF (scf_control%level_shift /= 0.0_dp)
THEN
1013 DO ispin = 1,
SIZE(mos)
1014 CALL get_mo_set(mos(ispin), nmo=nmo, mo_coeff=mo_coeff, homo=homo, eigenvalues=eigenvalues)
1015 IF (needed_evals < nmo)
THEN
1016 IF (needed_evals < homo)
THEN
1017 CALL cp_abort(__location__, &
1018 "The numerical rank of the overlap matrix is lower than the "// &
1019 "number of orbitals to be occupied! Check the geometry or increase "// &
1020 "EPS_DEFAULT or EPS_PGF_ORB!")
1022 CALL cp_warn(__location__, &
1023 "The numerical rank of the overlap matrix is lower than the number of requested MOs! "// &
1024 "Reduce the number of MOs to the number of available MOs. If necessary, request a lower number of "// &
1025 "MOs or increase EPS_DEFAULT or EPS_PGF_ORB.")
1026 CALL set_mo_set(mos(ispin), nmo=needed_evals)
1029 CALL cp_fm_to_fm(evecs, mo_coeff, min(ndep, max(0, nmo - needed_evals)), 1, needed_evals + 1)
1032 eigenvalues(needed_evals + 1:min(nao, nmo)) = 1.0_dp/scf_control%eps_eigval
1036 CALL parallel_gemm(
"N",
"T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_red, evecs, &
1037 0.0_dp, scf_env%ortho, b_first_col=ndep + 1)
1039 IF (scf_control%level_shift /= 0.0_dp)
THEN
1041 evals(ndep + 1:nao) = 1.0_dp/evals(ndep + 1:nao)
1044 CALL parallel_gemm(
"T",
"T", nao, nao, needed_evals, 1.0_dp, scf_env%ortho_m1_red, evecs, &
1045 0.0_dp, scf_env%ortho_m1, b_first_col=ndep + 1)
1050 s_minus_half_available = .true.
1054 qs_env%input,
"DFT%PRINT%AO_MATRICES/ORTHO"),
cp_p_file))
THEN
1058 CALL section_vals_val_get(qs_env%input,
"DFT%PRINT%AO_MATRICES%OMIT_HEADERS", l_val=omit_headers)
1059 after = min(max(after, 1), 16)
1061 para_env, output_unit=iw, omit_headers=omit_headers)
1063 "DFT%PRINT%AO_MATRICES/ORTHO")
1070 IF (dft_control%dft_plus_u)
THEN
1073 IF (s_minus_half_available)
THEN
1078 CALL cp_fm_power(scf_env%s_half, scf_env%scf_work2, 0.5_dp, &
1079 scf_control%eps_eigval, ndep)
1082 DO ikind = 1,
SIZE(qs_kind_set)
1083 qs_kind => qs_kind_set(ikind)
1085 dft_plus_u_atom=dft_plus_u_atom, &
1086 u_ramping=u_ramping, &
1087 init_u_ramping_each_scf=init_u_ramping_each_scf)
1088 IF (dft_plus_u_atom .AND. (u_ramping /= 0.0_dp))
THEN
1089 IF (init_u_ramping_each_scf)
THEN
1090 CALL set_qs_kind(qs_kind=qs_kind, u_minus_j=0.0_dp)
1097 extension=
".scfLog")
1098 IF (output_unit > 0)
THEN
1099 WRITE (unit=output_unit, fmt=
"(T2,A,T71,I10)") &
1100 "Number of independent orbital functions:", nao - ndep
1103 "PRINT%PROGRAM_RUN_INFO")
1106 IF (scf_control%outer_scf%have_scf)
THEN
1111 IF (
ASSOCIATED(qs_env%xas_env))
THEN
1118 CALL scf_env_initial_rho_setup(scf_env, qs_env=qs_env, &
1119 scf_section=scf_section, scf_control=scf_control)
1123 IF (
ASSOCIATED(qs_env%wf_history))
THEN
1125 IF (.NOT.
ASSOCIATED(qs_env%wf_history%past_states(1)%snapshot))
THEN
1126 CALL wfi_update(qs_env%wf_history, qs_env=qs_env, dt=1.0_dp)
1127 ALLOCATE (qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1128 CALL qs_rho_create(qs_env%wf_history%past_states(1)%snapshot%rho_frozen)
1130 rho_output=qs_env%wf_history%past_states(1)%snapshot%rho_frozen, &
1137 IF (qs_env%qmmm)
THEN
1138 IF (qs_env%qmmm .AND. qs_env%qmmm_env_qm%image_charge)
THEN
1140 qmmm_env=qs_env%qmmm_env_qm)
1144 CALL timestop(handle)
1146 END SUBROUTINE init_scf_run
1158 SUBROUTINE scf_env_initial_rho_setup(scf_env, qs_env, scf_section, scf_control)
1164 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_initial_rho_setup'
1166 INTEGER :: extrapolation_method_nr, handle, ispin, &
1168 LOGICAL :: do_harris, orthogonal_wf
1178 CALL timeset(routinen, handle)
1179 NULLIFY (mo_coeff, rho, dft_control, para_env, mos)
1181 cpassert(
ASSOCIATED(scf_env))
1182 cpassert(
ASSOCIATED(qs_env))
1187 dft_control=dft_control, &
1190 do_harris = qs_env%harris_method
1193 IF (
ASSOCIATED(qs_env%wf_history))
THEN
1195 qs_env=qs_env, dt=1.0_dp, &
1196 extrapolation_method_nr=extrapolation_method_nr, &
1197 orthogonal_wf=orthogonal_wf)
1199 IF ((.NOT. orthogonal_wf) .AND. &
1202 DO ispin = 1,
SIZE(mos)
1203 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1206 smear=scf_control%smear)
1211 IF (.NOT. do_harris)
THEN
1213 extension=
".scfLog")
1214 IF (output_unit > 0)
THEN
1215 WRITE (unit=output_unit, fmt=
"(/,T2,A,I0)") &
1216 "Extrapolation method: "// &
1219 WRITE (unit=output_unit, fmt=
"(T2,A,I0,A)") &
1220 "Extrapolation order: ", &
1221 max((min(qs_env%wf_history%memory_depth, qs_env%wf_history%snapshot_count) - 1), 0)
1225 "PRINT%PROGRAM_RUN_INFO")
1229 CALL get_qs_env(qs_env, harris_env=harris_env)
1240 IF (scf_env%mixing_method > 1)
THEN
1241 IF (dft_control%qs_control%gapw)
THEN
1242 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
1243 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1244 para_env, rho_atom=rho_atom)
1245 ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb)
THEN
1247 ELSEIF (dft_control%qs_control%semi_empirical)
THEN
1248 cpabort(
'SE Code not possible')
1250 CALL mixing_init(scf_env%mixing_method, rho, scf_env%mixing_store, &
1255 DO ispin = 1,
SIZE(mos)
1256 IF (mos(ispin)%use_mo_coeff_b)
THEN
1258 mos(ispin)%mo_coeff_b)
1262 CALL timestop(handle)
1264 END SUBROUTINE scf_env_initial_rho_setup
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_init_p(matrix)
...
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)
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_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
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)
...
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...
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_to_fm_triangular(msource, mtarget, uplo)
copy just a triangular matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
Defines the basic variable types.
integer, parameter, public dp
Types and basic routines needed for a kpoint calculation.
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
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 itrative diagonalization by the block-Davidson appr...
subroutine, public block_davidson_allocate(bdav_env, mo_coeff, nao, nmo)
...
subroutine, public block_davidson_env_create(bdav_env, nspins, scf_section)
...
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, 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, 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, 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)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, 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, 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)
Set the QUICKSTEP environment.
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, 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, 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, init_u_ramping_each_scf, reltmat, ghost, 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, 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_pools, 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)
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 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.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
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_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 itrative diagonalization by the block-Lanczos appro...
subroutine, public krylov_space_allocate(krylov_space, scf_control, mos)
allocates matrices and vectros used in the construction of the krylov space and for the lanczos refin...
subroutine, public qs_scf_initial_info(output_unit, mos, dft_control)
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 krylov_space_create(krylov_space, scf_section)
creates krylov space
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
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...
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.