71#include "./base/base_uses.f90"
77 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_diis'
107 INTEGER,
INTENT(in) :: nbuffer
109 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_diis_b_create'
115 CALL timeset(routinen, handle)
117 NULLIFY (diis_buffer%b_matrix)
118 NULLIFY (diis_buffer%error)
119 NULLIFY (diis_buffer%param)
120 diis_buffer%nbuffer = nbuffer
121 diis_buffer%ncall = 0
123 CALL timestop(handle)
142 SUBROUTINE qs_diis_b_check_i_alloc(diis_buffer, matrix_struct, nspin, &
147 INTEGER,
INTENT(IN) :: nspin
150 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_check_i_alloc'
152 INTEGER :: handle, ibuffer, ispin, nbuffer, &
158 CALL timeset(routinen, handle)
162 nbuffer = diis_buffer%nbuffer
164 IF (.NOT.
ASSOCIATED(diis_buffer%error))
THEN
165 ALLOCATE (diis_buffer%error(nbuffer, nspin))
168 DO ibuffer = 1, nbuffer
170 name=
"qs_diis_b%error("// &
173 matrix_struct=matrix_struct)
178 IF (.NOT.
ASSOCIATED(diis_buffer%param))
THEN
179 ALLOCATE (diis_buffer%param(nbuffer, nspin))
182 DO ibuffer = 1, nbuffer
184 name=
"qs_diis_b%param("// &
187 matrix_struct=matrix_struct)
192 IF (.NOT.
ASSOCIATED(diis_buffer%b_matrix))
THEN
193 ALLOCATE (diis_buffer%b_matrix(nbuffer + 1, nbuffer + 1))
194 diis_buffer%b_matrix = 0.0_dp
197 IF (output_unit > 0)
THEN
198 WRITE (unit=output_unit, fmt=
"(/,T9,A)") &
199 "DIIS | The SCF DIIS buffer was allocated and initialized"
205 CALL timestop(handle)
207 END SUBROUTINE qs_diis_b_check_i_alloc
231 diis_step, eps_diis, nmixing, s_matrix, scf_section, roks)
234 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
237 REAL(kind=
dp),
INTENT(IN) :: delta
238 REAL(kind=
dp),
INTENT(OUT) :: error_max
239 LOGICAL,
INTENT(OUT) :: diis_step
240 REAL(kind=
dp),
INTENT(IN) :: eps_diis
241 INTEGER,
INTENT(IN),
OPTIONAL :: nmixing
245 LOGICAL,
INTENT(IN),
OPTIONAL :: roks
247 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_step'
248 REAL(kind=
dp),
PARAMETER :: eigenvalue_threshold = 1.0e-12_dp
250 CHARACTER(LEN=2*default_string_length) :: message
251 INTEGER :: handle, homo, ib, imo, ispin, jb, &
252 my_nmixing, nao, nb, nb1, nmo, nspin, &
254 LOGICAL :: eigenvectors_discarded, my_roks
255 REAL(kind=
dp) :: maxocc, tmp
256 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ev, occ
257 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occa, occb
258 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: a, b
260 TYPE(
cp_fm_type),
POINTER :: c, new_errors, old_errors, parameters
265 CALL timeset(routinen, handle)
267 nspin =
SIZE(mo_array)
270 IF (
PRESENT(roks))
THEN
278 IF (
PRESENT(nmixing)) my_nmixing = nmixing
280 NULLIFY (c, new_errors, old_errors, parameters, matrix_struct, a, b, occa, occb)
285 IF (diis_buffer%nbuffer < 1)
THEN
286 CALL timestop(handle)
291 matrix_struct=matrix_struct)
292 CALL qs_diis_b_check_i_alloc(diis_buffer, &
293 matrix_struct=matrix_struct, &
295 scf_section=scf_section)
299 ib =
modulo(diis_buffer%ncall, diis_buffer%nbuffer) + 1
300 diis_buffer%ncall = diis_buffer%ncall + 1
301 nb = min(diis_buffer%ncall, diis_buffer%nbuffer)
310 occupation_numbers=occa, &
313 new_errors => diis_buffer%error(ib, ispin)
314 parameters => diis_buffer%param(ib, ispin)
325 occupation_numbers=occb)
328 occ(imo) = sqrt(occa(imo) + occb(imo))
335 CALL cp_fm_symm(
"L",
"U", nao, homo, 1.0_dp, parameters, sc, 0.0_dp, kc(ispin))
337 IF (
PRESENT(s_matrix))
THEN
340 CALL cp_fm_symm(
"L",
"U", nao, homo, 1.0_dp, new_errors, c, 0.0_dp, sc)
347 CALL parallel_gemm(
"N",
"T", nao, nao, homo, 1.0_dp, sc, kc(ispin), 0.0_dp, new_errors)
348 CALL parallel_gemm(
"N",
"T", nao, nao, homo, 1.0_dp, kc(ispin), sc, -1.0_dp, new_errors)
355 CALL cp_fm_symm(
"L",
"U", nao, homo, maxocc, parameters, c, 0.0_dp, kc(ispin))
357 IF (
PRESENT(s_matrix))
THEN
361 CALL cp_fm_symm(
"L",
"U", nao, homo, 2.0_dp, new_errors, c, 0.0_dp, sc)
363 CALL parallel_gemm(
"N",
"T", nao, nao, homo, 1.0_dp, sc, kc(ispin), 0.0_dp, new_errors)
364 CALL parallel_gemm(
"N",
"T", nao, nao, homo, 1.0_dp, kc(ispin), sc, -1.0_dp, new_errors)
367 CALL parallel_gemm(
"N",
"T", nao, nao, homo, 1.0_dp, c, kc(ispin), 0.0_dp, new_errors)
368 CALL parallel_gemm(
"N",
"T", nao, nao, homo, 1.0_dp, kc(ispin), c, -1.0_dp, new_errors)
374 error_max = max(error_max, tmp)
380 diis_step = ((diis_buffer%ncall >= my_nmixing) .AND. (delta < eps_diis))
384 IF (output_unit > 0)
THEN
385 WRITE (unit=output_unit, fmt=
"(/,T9,A,I4,/,(T9,A,ES12.3))") &
386 "DIIS | Current SCF DIIS buffer size: ", nb, &
387 "DIIS | Maximum SCF DIIS error vector element:", error_max, &
388 "DIIS | Current SCF convergence: ", delta, &
389 "DIIS | Threshold value for a DIIS step: ", eps_diis
390 IF (error_max < eps_diis)
THEN
391 WRITE (unit=output_unit, fmt=
"(T9,A)") &
392 "DIIS | => The SCF DIIS buffer will be updated"
394 WRITE (unit=output_unit, fmt=
"(T9,A)") &
395 "DIIS | => No update of the SCF DIIS buffer"
397 IF (diis_step .AND. (error_max < eps_diis))
THEN
398 WRITE (unit=output_unit, fmt=
"(T9,A,/)") &
399 "DIIS | => A SCF DIIS step will be performed"
401 WRITE (unit=output_unit, fmt=
"(T9,A,/)") &
402 "DIIS | => No SCF DIIS step will be performed"
408 IF (error_max < eps_diis)
THEN
410 b => diis_buffer%b_matrix
415 old_errors => diis_buffer%error(jb, ispin)
416 new_errors => diis_buffer%error(ib, ispin)
418 b(jb, ib) = b(jb, ib) + tmp
420 b(ib, jb) = b(jb, ib)
435 ALLOCATE (a(nb1, nb1))
436 ALLOCATE (b(nb1, nb1))
441 b(1:nb, 1:nb) = diis_buffer%b_matrix(1:nb, 1:nb)
443 b(1:nb, nb1) = -1.0_dp
444 b(nb1, 1:nb) = -1.0_dp
452 a(1:nb1, 1:nb1) = b(1:nb1, 1:nb1)
454 eigenvectors_discarded = .false.
457 IF (abs(ev(jb)) < eigenvalue_threshold)
THEN
458 IF (output_unit > 0)
THEN
459 IF (.NOT. eigenvectors_discarded)
THEN
460 WRITE (unit=output_unit, fmt=
"(T9,A)") &
461 "DIIS | Checking eigenvalues of the DIIS error matrix"
463 WRITE (unit=message, fmt=
"(T9,A,I6,A,ES10.1,A,ES10.1)") &
464 "DIIS | Eigenvalue ", jb,
" = ", ev(jb),
" is smaller than "// &
465 "threshold ", eigenvalue_threshold
467 WRITE (unit=output_unit, fmt=
"(T9,A)") trim(message)
468 eigenvectors_discarded = .true.
470 a(1:nb1, jb) = 0.0_dp
472 a(1:nb1, jb) = a(1:nb1, jb)/ev(jb)
476 IF ((output_unit > 0) .AND. eigenvectors_discarded)
THEN
477 WRITE (unit=output_unit, fmt=
"(T9,A,/)") &
478 "DIIS | The corresponding eigenvectors were discarded"
481 ev(1:nb) = matmul(a(1:nb, 1:nb1), b(nb1, 1:nb1))
488 parameters => diis_buffer%param(jb, ispin)
500 parameters => diis_buffer%param(ib, ispin)
509 CALL timestop(handle)
524 diis_buffer%ncall = 0
547 diis_step, eps_diis, nmixing, s_matrix, threshold)
554 INTEGER,
INTENT(IN) :: unit_nr, iscf
555 LOGICAL,
INTENT(OUT) :: diis_step
556 REAL(kind=
dp),
INTENT(IN) :: eps_diis
557 INTEGER,
INTENT(IN),
OPTIONAL :: nmixing
559 REAL(kind=
dp),
INTENT(IN) :: threshold
561 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_step_4lscf'
562 REAL(kind=
dp),
PARAMETER :: eigenvalue_threshold = 1.0e-12_dp
564 INTEGER :: handle, ib, ispin, jb, my_nmixing, nb, &
566 REAL(kind=
dp) :: error_max, tmp
567 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ev
568 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: a, b
571 TYPE(
dbcsr_type) :: matrix_kserr_t, matrix_tmp
572 TYPE(
dbcsr_type),
POINTER :: new_errors, old_errors, parameters
575 CALL timeset(routinen, handle)
576 IF (ls_scf_env%do_pao)
THEN
577 cpabort(
"LS_SCF%LS_DIIS not compatible with PAO")
579 nspin = ls_scf_env%nspins
582 IF (
PRESENT(nmixing)) my_nmixing = nmixing
583 NULLIFY (new_errors, old_errors, parameters, a, b)
586 IF (diis_buffer%nbuffer < 1)
THEN
587 CALL timestop(handle)
595 CALL qs_diis_b_check_i_alloc_sparse( &
601 ib =
modulo(diis_buffer%ncall, diis_buffer%nbuffer) + 1
602 diis_buffer%ncall = diis_buffer%ncall + 1
603 nb = min(diis_buffer%ncall, diis_buffer%nbuffer)
606 template=ls_scf_env%matrix_ks(1), &
610 template=ls_scf_env%matrix_ks(1), &
616 new_errors => diis_buffer%error(ib, ispin)%matrix
617 parameters => diis_buffer%param(ib, ispin)%matrix
620 matrix_ks(ispin)%matrix)
622 IF (
PRESENT(s_matrix))
THEN
626 1.0_dp, ls_scf_env%matrix_p(ispin), &
628 0.0_dp, matrix_tmp, &
629 filter_eps=threshold)
632 1.0_dp, matrix_ks(ispin)%matrix, &
634 0.0_dp, new_errors, &
635 filter_eps=threshold)
647 1.0_dp, matrix_ks(ispin)%matrix, &
648 ls_scf_env%matrix_p(ispin), &
649 0.0_dp, new_errors, &
650 filter_eps=threshold)
661 error_max = max(error_max, tmp)
667 diis_step = (diis_buffer%ncall >= my_nmixing)
669 IF (unit_nr > 0)
THEN
670 WRITE (unit_nr,
'(A29,I3,A3,4(I3,A1))') &
671 "DIIS: (ncall,nbuffer,ib,nb)=(", iscf,
")=(", &
672 diis_buffer%ncall,
",", diis_buffer%nbuffer,
",", ib,
",", nb,
")"
673 WRITE (unit_nr,
'(A57,I3,A3,L1,A1,F10.8,A1,F4.2,A1,L1,A1)') &
674 "DIIS: (diis_step,error_max,eps_diis,error_max<eps_diis)=(", &
675 iscf,
")=(", diis_step,
",", error_max,
",", eps_diis,
",", &
676 (error_max < eps_diis),
")"
677 WRITE (unit_nr,
'(A75)') &
678 "DIIS: diis_step=T : Perform DIIS error_max<eps_diis=T : Update DIIS buffer"
682 IF (error_max < eps_diis)
THEN
683 b => diis_buffer%b_matrix
687 old_errors => diis_buffer%error(jb, ispin)%matrix
688 new_errors => diis_buffer%error(ib, ispin)%matrix
692 b(jb, ib) = b(jb, ib) + tmp
694 b(ib, jb) = b(jb, ib)
703 ALLOCATE (a(nb1, nb1))
704 ALLOCATE (b(nb1, nb1))
707 b(1:nb, 1:nb) = diis_buffer%b_matrix(1:nb, 1:nb)
708 b(1:nb, nb1) = -1.0_dp
709 b(nb1, 1:nb) = -1.0_dp
713 a(1:nb1, 1:nb1) = b(1:nb1, 1:nb1)
715 IF (abs(ev(jb)) < eigenvalue_threshold)
THEN
716 a(1:nb1, jb) = 0.0_dp
718 a(1:nb1, jb) = a(1:nb1, jb)/ev(jb)
722 ev(1:nb) = matmul(a(1:nb, 1:nb1), b(nb1, 1:nb1))
725 IF (iscf >= ls_scf_env%iter_ini_diis)
THEN
727 IF (unit_nr > 0)
THEN
728 WRITE (unit_nr,
'(A40,I3)')
'DIIS: Updating Kohn-Sham matrix at iscf=', iscf
732 CALL dbcsr_set(matrix_ks(ispin)%matrix, &
735 parameters => diis_buffer%param(jb, ispin)%matrix
736 CALL dbcsr_add(matrix_ks(ispin)%matrix, parameters, &
748 parameters => diis_buffer%param(ib, ispin)%matrix
750 matrix_ks(ispin)%matrix)
755 CALL timestop(handle)
772 SUBROUTINE qs_diis_b_check_i_alloc_sparse(diis_buffer, ls_scf_env, &
777 INTEGER,
INTENT(IN) :: nspin
779 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_check_i_alloc_sparse'
781 INTEGER :: handle, ibuffer, ispin, nbuffer
786 CALL timeset(routinen, handle)
790 nbuffer = diis_buffer%nbuffer
792 IF (.NOT.
ASSOCIATED(diis_buffer%error))
THEN
793 ALLOCATE (diis_buffer%error(nbuffer, nspin))
796 DO ibuffer = 1, nbuffer
797 ALLOCATE (diis_buffer%error(ibuffer, ispin)%matrix)
799 CALL dbcsr_create(diis_buffer%error(ibuffer, ispin)%matrix, &
800 template=ls_scf_env%matrix_ks(1), &
806 IF (.NOT.
ASSOCIATED(diis_buffer%param))
THEN
807 ALLOCATE (diis_buffer%param(nbuffer, nspin))
810 DO ibuffer = 1, nbuffer
811 ALLOCATE (diis_buffer%param(ibuffer, ispin)%matrix)
812 CALL dbcsr_create(diis_buffer%param(ibuffer, ispin)%matrix, &
813 template=ls_scf_env%matrix_ks(1), &
819 IF (.NOT.
ASSOCIATED(diis_buffer%b_matrix))
THEN
820 ALLOCATE (diis_buffer%b_matrix(nbuffer + 1, nbuffer + 1))
822 diis_buffer%b_matrix = 0.0_dp
825 CALL timestop(handle)
827 END SUBROUTINE qs_diis_b_check_i_alloc_sparse
841 diis_buffer%ncall = 0
856 INTEGER,
INTENT(in) :: nbuffer
858 NULLIFY (diis_buffer%b_matrix)
859 NULLIFY (diis_buffer%error)
860 NULLIFY (diis_buffer%param)
861 diis_buffer%nbuffer = nbuffer
862 diis_buffer%ncall = 0
874 INTEGER,
INTENT(in) :: nbuffer
876 NULLIFY (diis_buffer%b_matrix)
877 NULLIFY (diis_buffer%error)
878 NULLIFY (diis_buffer%param)
879 NULLIFY (diis_buffer%smat)
880 diis_buffer%nbuffer = nbuffer
881 diis_buffer%ncall = 0
898 INTEGER,
INTENT(IN) :: nspin, nkp
901 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_check_i_alloc_kp'
903 INTEGER :: handle, ibuffer, ikp, ispin, nbuffer, &
909 CALL timeset(routinen, handle)
913 nbuffer = diis_buffer%nbuffer
915 IF (.NOT.
ASSOCIATED(diis_buffer%error))
THEN
916 ALLOCATE (diis_buffer%error(nbuffer, nspin, nkp))
920 DO ibuffer = 1, nbuffer
922 name=
"qs_diis_b%error("// &
925 matrix_struct=matrix_struct)
931 IF (.NOT.
ASSOCIATED(diis_buffer%param))
THEN
932 ALLOCATE (diis_buffer%param(nbuffer, nspin, nkp))
936 DO ibuffer = 1, nbuffer
938 name=
"qs_diis_b%param("// &
941 matrix_struct=matrix_struct)
947 IF (.NOT.
ASSOCIATED(diis_buffer%smat))
THEN
948 ALLOCATE (diis_buffer%smat(nkp))
951 name=
"kp_cfm_smat("// &
954 matrix_struct=matrix_struct)
958 IF (.NOT.
ASSOCIATED(diis_buffer%b_matrix))
THEN
959 ALLOCATE (diis_buffer%b_matrix(nbuffer + 1, nbuffer + 1))
960 diis_buffer%b_matrix = 0.0_dp
963 IF (output_unit > 0)
THEN
964 WRITE (unit=output_unit, fmt=
"(/,T9,A)") &
965 "DIIS | The SCF DIIS buffer was allocated and initialized"
971 CALL timestop(handle)
983 diis_buffer%ncall = 0
995 INTEGER,
INTENT(OUT) :: ib, nb
997 ib =
modulo(diis_buffer%ncall, diis_buffer%nbuffer) + 1
998 diis_buffer%ncall = diis_buffer%ncall + 1
999 nb = min(diis_buffer%ncall, diis_buffer%nbuffer)
1021 INTEGER,
INTENT(IN) :: ib
1022 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos
1024 INTEGER,
INTENT(IN) :: ispin, ikp, nkp_local
1026 LOGICAL,
INTENT(IN),
OPTIONAL :: real_wfn
1028 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_calc_err_kp'
1030 INTEGER :: handle, homo, nao, nmo, nspin
1031 LOGICAL :: my_real_wfn
1034 TYPE(
cp_cfm_type),
POINTER :: new_errors, parameters, smat
1038 NULLIFY (matrix_struct, imos, rmos, parameters, new_errors, smat)
1040 CALL timeset(routinen, handle)
1041 my_real_wfn = .false.
1042 IF (
PRESENT(real_wfn)) my_real_wfn = real_wfn
1048 IF (diis_buffer%nbuffer < 1)
THEN
1049 CALL timestop(handle)
1052 nspin =
SIZE(mos, 2)
1056 matrix_struct=matrix_struct, &
1057 nspin=nspin, nkp=nkp_local, &
1058 scf_section=scf_section)
1061 CALL get_mo_set(mos(1, ispin), nao=nao, nmo=nmo, homo=homo, mo_coeff=rmos, maxocc=maxocc)
1062 NULLIFY (matrix_struct)
1065 IF (my_real_wfn)
THEN
1067 cmplx(1.0_dp, kind=
dp), rmos)
1069 CALL get_mo_set(mos(2, ispin), mo_coeff=imos)
1073 new_errors => diis_buffer%error(ib, ispin, ikp)
1074 parameters => diis_buffer%param(ib, ispin, ikp)
1075 smat => diis_buffer%smat(ikp)
1082 CALL parallel_gemm(
"N",
"N", nao, homo, nao, cmplx(maxocc, kind=
dp), parameters, cmos, (0.0_dp, 0.0_dp), kc)
1084 CALL parallel_gemm(
"N",
"N", nao, homo, nao, (2.0_dp, 0.0_dp), smat, cmos, (0.0_dp, 0.0_dp), sc)
1087 CALL parallel_gemm(
"N",
"T", nao, nao, homo, (1.0_dp, 0.0_dp), sc, kc, (0.0_dp, 0.0_dp), new_errors)
1088 CALL parallel_gemm(
"N",
"T", nao, nao, homo, (1.0_dp, 0.0_dp), kc, sc, (-1.0_dp, 0.0_dp), new_errors)
1093 CALL timestop(handle)
1115 nspin, nkp, nkp_local, nmixing, scf_section, para_env_inter_kp)
1118 COMPLEX(KIND=dp),
DIMENSION(:),
INTENT(INOUT) :: coeffs
1119 INTEGER,
INTENT(IN) :: ib, nb
1120 REAL(kind=
dp),
INTENT(IN) :: delta
1121 REAL(kind=
dp),
INTENT(OUT) :: error_max
1122 LOGICAL,
INTENT(OUT) :: diis_step
1123 REAL(kind=
dp),
INTENT(IN) :: eps_diis
1124 INTEGER,
INTENT(IN) :: nspin, nkp, nkp_local
1125 INTEGER,
INTENT(IN),
OPTIONAL :: nmixing
1129 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_diis_b_step_kp'
1130 REAL(kind=
dp),
PARAMETER :: eigenvalue_threshold = 1.0e-12_dp
1132 CHARACTER(LEN=2*default_string_length) :: message
1133 COMPLEX(KIND=dp) :: tmp
1134 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: a, b
1135 INTEGER :: handle, ikp, ispin, jb, my_nmixing, nb1, &
1137 LOGICAL :: eigenvectors_discarded
1138 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ev
1145 NULLIFY (matrix_struct, new_errors, logger)
1147 CALL timeset(routinen, handle)
1152 IF (
PRESENT(nmixing)) my_nmixing = nmixing
1157 IF (diis_buffer%nbuffer < 1)
THEN
1158 CALL timestop(handle)
1163 diis_step = ((diis_buffer%ncall >= my_nmixing) .AND. (delta < eps_diis))
1166 CALL cp_cfm_get_info(diis_buffer%error(ib, 1, 1), matrix_struct=matrix_struct)
1170 ALLOCATE (b(nb, nb))
1173 DO ikp = 1, nkp_local
1175 new_errors => diis_buffer%error(ib, ispin, ikp)
1176 CALL cp_cfm_to_fm(diis_buffer%error(jb, ispin, ikp), rerr, ierr)
1180 b(jb, ib) = b(jb, ib) + 1.0_dp/real(nkp,
dp)*tmp
1183 b(ib, jb) = conjg(b(jb, ib))
1191 CALL para_env_inter_kp%sum(b)
1193 error_max = sqrt(real(b(ib, ib))**2 + aimag(b(ib, ib))**2)
1196 extension=
".scfLog")
1197 IF (output_unit > 0)
THEN
1198 WRITE (unit=output_unit, fmt=
"(/,T9,A,I4,/,(T9,A,ES12.3))") &
1199 "DIIS | Current SCF DIIS buffer size: ", nb, &
1200 "DIIS | Maximum SCF DIIS error at last step: ", error_max, &
1201 "DIIS | Current SCF convergence: ", delta, &
1202 "DIIS | Threshold value for a DIIS step: ", eps_diis
1203 IF (error_max < eps_diis)
THEN
1204 WRITE (unit=output_unit, fmt=
"(T9,A)") &
1205 "DIIS | => The SCF DIIS buffer will be updated"
1207 WRITE (unit=output_unit, fmt=
"(T9,A)") &
1208 "DIIS | => No update of the SCF DIIS buffer"
1210 IF (diis_step .AND. (error_max < eps_diis))
THEN
1211 WRITE (unit=output_unit, fmt=
"(T9,A,/)") &
1212 "DIIS | => A SCF DIIS step will be performed"
1214 WRITE (unit=output_unit, fmt=
"(T9,A,/)") &
1215 "DIIS | => No SCF DIIS step will be performed"
1220 IF (error_max < eps_diis)
THEN
1222 diis_buffer%b_matrix(ib, jb) = b(ib, jb)
1223 diis_buffer%b_matrix(jb, ib) = b(jb, ib)
1236 ALLOCATE (a(nb1, nb1))
1237 ALLOCATE (b(nb1, nb1))
1241 b(1:nb, 1:nb) = diis_buffer%b_matrix(1:nb, 1:nb)
1243 b(1:nb, nb1) = -1.0_dp
1244 b(nb1, 1:nb) = -1.0_dp
1245 b(nb1, nb1) = 0.0_dp
1249 a(1:nb1, 1:nb1) = 0.0_dp
1250 CALL diag_complex(b(1:nb1, 1:nb1), a(1:nb1, 1:nb1), ev(1:nb1))
1251 b(1:nb1, 1:nb1) = a(1:nb1, 1:nb1)
1253 eigenvectors_discarded = .false.
1256 IF (abs(ev(jb)) < eigenvalue_threshold)
THEN
1257 IF (output_unit > 0)
THEN
1258 IF (.NOT. eigenvectors_discarded)
THEN
1259 WRITE (unit=output_unit, fmt=
"(T9,A)") &
1260 "DIIS | Checking eigenvalues of the DIIS error matrix"
1262 WRITE (unit=message, fmt=
"(T9,A,I6,A,ES10.1,A,ES10.1)") &
1263 "DIIS | Eigenvalue ", jb,
" = ", ev(jb),
" is smaller than "// &
1264 "threshold ", eigenvalue_threshold
1266 WRITE (unit=output_unit, fmt=
"(T9,A)") trim(message)
1267 eigenvectors_discarded = .true.
1269 a(1:nb1, jb) = 0.0_dp
1271 a(1:nb1, jb) = a(1:nb1, jb)/ev(jb)
1275 IF ((output_unit > 0) .AND. eigenvectors_discarded)
THEN
1276 WRITE (unit=output_unit, fmt=
"(T9,A,/)") &
1277 "DIIS | The corresponding eigenvectors were discarded"
1280 coeffs(1:nb) = -matmul(a(1:nb, 1:nb1), conjg(b(nb1, 1:nb1)))
1290 CALL timestop(handle)
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add_fm(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b). where b is a real matrix (adapted from cp_cf...
subroutine, public cp_cfm_trace(matrix_a, matrix_b, trace)
Returns the trace of matrix_a^T matrix_b, i.e sum_{i,j}(matrix_a(i,j)*matrix_b(i,j)) .
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
subroutine, public cp_cfm_to_fm(msource, mtargetr, mtargeti)
Copy real and imaginary parts of a complex full matrix into separate real-value full matrices.
subroutine, public dbcsr_transposed(transposed, normal, shallow_data_copy, transpose_distribution, use_distribution)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
real(dp) function, public dbcsr_maxabs(matrix)
Compute the maxabs norm of a dbcsr matrix.
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
subroutine, public cp_fm_scale(alpha, matrix_a)
scales a matrix matrix_a = alpha * matrix_b
subroutine, public cp_fm_symm(side, uplo, m, n, alpha, matrix_a, matrix_b, beta, matrix_c)
computes matrix_c = beta * matrix_c + alpha * matrix_a * matrix_b computes matrix_c = beta * matrix_c...
represent the structure of a full matrix
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_maxabsval(matrix, a_max, ir_max, ic_max)
find the maximum absolute value of the matrix element maxval(abs(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
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,...
Types needed for a linear scaling quickstep SCF run based on the density matrix.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Collection of simple mathematical functions and subroutines.
subroutine, public diag_complex(matrix, eigenvectors, eigenvalues)
Diagonalizes a local complex Hermitian matrix using LAPACK. Based on cp_cfm_heevd.
subroutine, public diamat_all(a, eigval, dac)
Diagonalize the symmetric n by n matrix a using the LAPACK library. Only the upper triangle of matrix...
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
buffer for the diis of the scf
Apply the direct inversion in the iterative subspace (DIIS) of Pulay in the framework of an SCF itera...
subroutine, public qs_diis_b_info_kp(diis_buffer, ib, nb)
Update info about the current buffer step ib and the current number of buffers nb.
pure subroutine, public qs_diis_b_create_sparse(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer for LS-SCF calculation.
pure subroutine, public qs_diis_b_clear(diis_buffer)
clears the buffer
subroutine, public qs_diis_b_step_kp(diis_buffer, coeffs, ib, nb, delta, error_max, diis_step, eps_diis, nspin, nkp, nkp_local, nmixing, scf_section, para_env_inter_kp)
Update the SCF DIIS buffer, and if appropriate does a diis step, for k-points.
subroutine, public qs_diis_b_create(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer.
subroutine, public qs_diis_b_step_4lscf(diis_buffer, qs_env, ls_scf_env, unit_nr, iscf, diis_step, eps_diis, nmixing, s_matrix, threshold)
Update the SCF DIIS buffer in linear scaling SCF (LS-SCF), and if appropriate does a diis step.
subroutine, public qs_diis_b_create_kp(diis_buffer, nbuffer)
Allocates an SCF DIIS buffer for k-points.
subroutine, public qs_diis_b_step(diis_buffer, mo_array, kc, sc, delta, error_max, diis_step, eps_diis, nmixing, s_matrix, scf_section, roks)
Update the SCF DIIS buffer, and if appropriate does a diis step.
pure subroutine, public qs_diis_b_clear_sparse(diis_buffer)
clears the DIIS buffer in LS-SCF calculation
pure subroutine, public qs_diis_b_clear_kp(diis_buffer)
clears the buffer
subroutine, public qs_diis_b_check_i_alloc_kp(diis_buffer, matrix_struct, nspin, nkp, scf_section)
Allocate and initialize a DIIS buffer for nao*nao parameter variables and with a buffer size of nbuff...
subroutine, public qs_diis_b_calc_err_kp(diis_buffer, ib, mos, kc, sc, ispin, ikp, nkp_local, scf_section, real_wfn)
Calculate and store the error for a given k-point.
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.
Definition and initialisation of the mo data type.
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.
Utilities for string manipulations.
subroutine, public compress(string, full)
Eliminate multiple space characters in a string. If full is .TRUE., then all spaces are eliminated.
Represent a complex full matrix.
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...
stores all the informations relevant to an mpi environment
build arrau of pointers to diis buffers in the k-point (complex full matrices) case
build array of pointers to diis buffers for sparse matrix case
keeps a buffer with the previous values of s,p,k