101 TYPE(
dbcsr_type),
POINTER :: matrix_h, matrix_s
102 INTEGER,
INTENT(IN) :: output_unit
105 CHARACTER(len=*),
PARAMETER :: routinen =
'generate_extended_space'
107 INTEGER :: handle, homo, i_first, i_last, imo, iter, j, jj, max_iter, n, nao, nmat, nmat2, &
108 nmo, nmo_converged, nmo_not_converged, nset, nset_conv, nset_not_conv
109 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iconv, inotconv
110 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: iconv_set, inotconv_set
111 LOGICAL :: converged, do_apply_preconditioner
112 REAL(
dp) :: lambda, max_norm, min_norm, t1, t2
113 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: ritz_coeff, vnorm
114 REAL(
dp),
DIMENSION(:),
POINTER :: eig_not_conv, eigenvalues, evals
116 TYPE(
cp_fm_type) :: c_conv, c_notconv, c_out, h_block, h_fm, &
117 m_hc, m_sc, m_tmp, mt_tmp, s_block, &
118 s_fm, v_block, w_block
119 TYPE(
cp_fm_type),
POINTER :: c_pz, c_z, mo_coeff
122 CALL timeset(routinen, handle)
124 NULLIFY (mo_coeff, mo_coeff_b, eigenvalues)
126 do_apply_preconditioner = .false.
128 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b, eigenvalues=eigenvalues, &
129 nao=nao, nmo=nmo, homo=homo)
130 IF (do_apply_preconditioner)
THEN
131 max_iter = bdav_env%max_iter
137 NULLIFY (evals, eig_not_conv)
139 IF (output_unit > 0)
THEN
140 WRITE (output_unit,
"(T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
141 " Cycle ",
" conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
144 ALLOCATE (iconv(nmo))
145 ALLOCATE (inotconv(nmo))
146 ALLOCATE (ritz_coeff(nmo))
147 ALLOCATE (vnorm(nmo))
150 DO iter = 1, max_iter
154 CALL cp_fm_create(m_hc, mo_coeff%matrix_struct, name=
"hc")
156 CALL cp_fm_create(m_sc, mo_coeff%matrix_struct, name=
"sc")
160 context=mo_coeff%matrix_struct%context, &
161 para_env=mo_coeff%matrix_struct%para_env)
162 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"matrix_tmp")
165 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, 1.0_dp, mo_coeff, m_hc, 0.0_dp, m_tmp)
170 c_z => bdav_env%matrix_z
171 c_pz => bdav_env%matrix_pz
178 nmo_not_converged = 0
182 max_norm = max(max_norm, vnorm(imo))
183 min_norm = min(min_norm, vnorm(imo))
188 IF (vnorm(imo) <= bdav_env%eps_iter)
THEN
189 nmo_converged = nmo_converged + 1
190 iconv(nmo_converged) = imo
192 nmo_not_converged = nmo_not_converged + 1
193 inotconv(nmo_not_converged) = imo
197 IF (nmo_converged > 0)
THEN
198 ALLOCATE (iconv_set(nmo_converged, 2))
199 ALLOCATE (inotconv_set(nmo_not_converged, 2))
202 DO j = 1, nmo_converged
205 IF (imo == i_last + 1)
THEN
207 iconv_set(nset, 2) = imo
211 iconv_set(nset, 1) = imo
212 iconv_set(nset, 2) = imo
219 DO j = 1, nmo_not_converged
222 IF (imo == i_last + 1)
THEN
224 inotconv_set(nset, 2) = imo
228 inotconv_set(nset, 1) = imo
229 inotconv_set(nset, 2) = imo
238 IF (real(nmo_converged,
dp)/real(nmo,
dp) > bdav_env%conv_percent)
THEN
240 DEALLOCATE (iconv_set)
241 DEALLOCATE (inotconv_set)
243 IF (output_unit > 0)
THEN
244 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
245 iter, nmo_converged, max_norm, min_norm, t2 - t1
247 WRITE (output_unit, *)
" Reached convergence in ", iter, &
248 " Davidson iterations"
254 IF (nmo_converged > 0)
THEN
256 context=mo_coeff%matrix_struct%context, &
257 para_env=mo_coeff%matrix_struct%para_env)
259 CALL cp_fm_create(h_fm, fm_struct_tmp, name=
"matrix_tmp")
261 CALL cp_fm_create(s_fm, fm_struct_tmp, name=
"matrix_tmp")
271 CALL cp_fm_create(c_out, fm_struct_tmp, name=
"matrix_tmp")
278 context=mo_coeff%matrix_struct%context, &
279 para_env=mo_coeff%matrix_struct%para_env)
283 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"m_tmp_nxmc")
289 context=mo_coeff%matrix_struct%context, &
290 para_env=mo_coeff%matrix_struct%para_env)
291 CALL cp_fm_create(c_notconv, fm_struct_tmp, name=
"c_notconv")
293 IF (nmo_converged > 0)
THEN
305 i_first = iconv_set(j, 1)
306 i_last = iconv_set(j, 2)
307 n = i_last - i_first + 1
311 CALL cp_fm_symm(
'L',
'U', nao, nmo_converged, 1.0_dp, s_fm, c_conv, 0.0_dp, m_tmp)
312 CALL parallel_gemm(
'N',
'T', nao, nao, nmo_converged, 1.0_dp, m_tmp, m_tmp, 0.0_dp, c_out)
315 lambda = 100.0_dp*abs(eigenvalues(homo))
323 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"m_tmp_nxm")
325 IF (nmo_converged > 0)
THEN
326 ALLOCATE (eig_not_conv(nmo_not_converged))
328 DO j = 1, nset_not_conv
329 i_first = inotconv_set(j, 1)
330 i_last = inotconv_set(j, 2)
331 n = i_last - i_first + 1
333 eig_not_conv(jj:jj + n - 1) = ritz_coeff(i_first:i_last)
336 CALL parallel_gemm(
'N',
'N', nao, nmo_not_converged, nao, 1.0_dp, c_out, c_notconv, 0.0_dp, m_hc)
337 CALL cp_fm_symm(
'L',
'U', nao, nmo_not_converged, 1.0_dp, s_fm, c_notconv, 0.0_dp, m_sc)
342 DEALLOCATE (eig_not_conv)
349 IF (do_apply_preconditioner)
THEN
360 CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nmo_not_converged, ncol_global=nmo_not_converged, &
361 context=mo_coeff%matrix_struct%context, &
362 para_env=mo_coeff%matrix_struct%para_env)
364 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"m_tmp_mxm")
365 CALL cp_fm_create(mt_tmp, fm_struct_tmp, name=
"mt_tmp_mxm")
368 nmat = nmo_not_converged
369 nmat2 = 2*nmo_not_converged
371 context=mo_coeff%matrix_struct%context, &
372 para_env=mo_coeff%matrix_struct%para_env)
378 ALLOCATE (evals(nmat2))
386 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_notconv, m_hc, 0.0_dp, m_tmp)
390 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_sc, 0.0_dp, m_tmp)
395 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_hc, 0.0_dp, m_tmp)
403 IF (nmo_converged > 0)
THEN
404 CALL parallel_gemm(
'N',
'N', nao, nmat, nao, 1.0_dp, c_out, c_pz, 0.0_dp, m_hc)
405 CALL cp_fm_symm(
'L',
'U', nao, nmo_not_converged, 1.0_dp, s_fm, c_pz, 0.0_dp, m_sc)
416 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_sc, 0.0_dp, m_tmp)
419 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_hc, 0.0_dp, m_tmp)
425 CALL reduce_extended_space(s_block, h_block, v_block, w_block, evals, nmat2)
429 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, c_notconv, m_tmp, 0.0_dp, m_hc)
431 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, c_pz, m_tmp, 1.0_dp, m_hc)
441 IF (nmo_converged > 0)
THEN
444 DEALLOCATE (c_z, c_pz)
446 DO j = 1, nset_not_conv
447 i_first = inotconv_set(j, 1)
448 i_last = inotconv_set(j, 2)
449 n = i_last - i_first + 1
451 eigenvalues(i_first:i_last) = evals(jj:jj + n - 1)
454 DEALLOCATE (iconv_set)
455 DEALLOCATE (inotconv_set)
458 eigenvalues(1:nmo) = evals(1:nmo)
467 IF (output_unit > 0)
THEN
468 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
469 iter, nmo_converged, max_norm, min_norm, t2 - t1
476 DEALLOCATE (inotconv)
477 DEALLOCATE (ritz_coeff)
480 CALL timestop(handle)
500 eps_iter, eps_iter_empty, preconditioner)
504 TYPE(
cp_cfm_type),
INTENT(IN) :: matrix_h, matrix_s
505 INTEGER,
INTENT(IN) :: output_unit
506 REAL(kind=
dp),
INTENT(IN) :: eps_iter, eps_iter_empty
509 CHARACTER(len=*),
PARAMETER :: routinen =
'generate_extended_space_c'
510 REAL(kind=
dp),
PARAMETER :: eps_exhaust = 1.0e-12_dp, &
513 COMPLEX(KIND=dp) :: lambda_c
514 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: cdiag, scaling
515 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: colbuf, submat_buffer
516 INTEGER :: handle, homo, i_first, i_last, imo, iter, j, jj, max_iter, n, nao, ncol_z, nmat, &
517 nmat2, nmo, nmo_converged, nmo_not_converged, nset, nset_conv, nset_not_conv
518 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iconv, inotconv
519 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: iconv_set, inotconv_set
520 LOGICAL :: converged, do_apply_preconditioner, &
522 REAL(kind=
dp) :: eps_iter_col, lambda, max_norm, &
524 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ritz_coeff, vnorm, vnorm_pz
525 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eig_not_conv, eigenvalues, evals, &
527 TYPE(
cp_cfm_type) :: c_conv, c_mz, c_new, c_notconv, c_out, &
528 c_pzo, c_pzw, c_z, h_block, h_fm, &
529 m_hc, m_sc, m_tmp, s_block, v_block, &
543 CALL timeset(routinen, handle)
545 NULLIFY (eigenvalues, evals, eig_not_conv, cmo, occupation, fm_struct_tmp)
547 do_apply_preconditioner = .false.
549 CALL get_mo_set(mo_set=mos, cmo_coeff=cmo, eigenvalues=eigenvalues, &
550 occupation_numbers=occupation, nao=nao, nmo=nmo, homo=homo)
551 IF (do_apply_preconditioner)
THEN
552 max_iter = bdav_env%max_iter
558 IF (output_unit > 0)
THEN
559 WRITE (output_unit,
"(T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
560 " Cycle ",
" conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
563 ALLOCATE (iconv(nmo))
564 ALLOCATE (inotconv(nmo))
565 ALLOCATE (ritz_coeff(nmo))
566 ALLOCATE (vnorm(nmo))
567 ALLOCATE (cdiag(nmo))
571 DO iter = 1, max_iter
581 context=cmo%matrix_struct%context, &
582 para_env=cmo%matrix_struct%para_env)
588 ritz_coeff(1:nmo) = real(cdiag(1:nmo), kind=
dp)
594 IF (
ALLOCATED(scaling))
DEALLOCATE (scaling)
595 ALLOCATE (scaling(nmo))
596 scaling(:) = cmplx(ritz_coeff, 0.0_dp, kind=
dp)
602 nmo_not_converged = 0
606 max_norm = max(max_norm, vnorm(imo))
607 min_norm = min(min_norm, vnorm(imo))
616 IF (occupation(imo) < occ_tol)
THEN
617 eps_iter_col = eps_iter_empty
619 eps_iter_col = eps_iter
621 IF (vnorm(imo) <= eps_iter_col)
THEN
622 nmo_converged = nmo_converged + 1
623 iconv(nmo_converged) = imo
625 nmo_not_converged = nmo_not_converged + 1
626 inotconv(nmo_not_converged) = imo
640 IF (iter == 1 .AND. nmo_not_converged == 0)
THEN
641 nmo_not_converged = nmo
649 IF (nmo_converged > 0)
THEN
650 ALLOCATE (iconv_set(nmo_converged, 2))
651 ALLOCATE (inotconv_set(nmo_not_converged, 2))
654 DO j = 1, nmo_converged
657 IF (imo == i_last + 1)
THEN
659 iconv_set(nset, 2) = imo
663 iconv_set(nset, 1) = imo
664 iconv_set(nset, 2) = imo
671 DO j = 1, nmo_not_converged
674 IF (imo == i_last + 1)
THEN
676 inotconv_set(nset, 2) = imo
680 inotconv_set(nset, 1) = imo
681 inotconv_set(nset, 2) = imo
698 IF (iter > 1 .AND. real(nmo_converged,
dp)/real(nmo,
dp) > bdav_env%conv_percent)
THEN
700 DEALLOCATE (iconv_set)
701 DEALLOCATE (inotconv_set)
703 IF (output_unit > 0)
THEN
704 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
705 iter, nmo_converged, max_norm, min_norm, t2 - t1
707 WRITE (output_unit, *)
" Reached convergence in ", iter, &
708 " Davidson iterations"
714 ncol_z = nmo_not_converged
716 IF (nmo_converged > 0)
THEN
719 context=cmo%matrix_struct%context, &
720 para_env=cmo%matrix_struct%para_env)
728 context=cmo%matrix_struct%context, &
729 para_env=cmo%matrix_struct%para_env)
735 i_first = iconv_set(j, 1)
736 i_last = iconv_set(j, 2)
737 n = i_last - i_first + 1
738 ALLOCATE (submat_buffer(nao, n))
740 n_rows=nao, n_cols=n)
742 DEALLOCATE (submat_buffer)
745 CALL cp_cfm_gemm(
'N',
'N', nao, nmo_converged, nao,
z_one, matrix_s, c_conv, &
752 lambda = 100.0_dp*abs(eigenvalues(homo))
753 lambda_c = cmplx(lambda, 0.0_dp, kind=
dp)
759 context=cmo%matrix_struct%context, &
760 para_env=cmo%matrix_struct%para_env)
761 CALL cp_cfm_create(c_notconv, fm_struct_tmp, name=
"c_notconv")
764 IF (nmo_converged > 0)
THEN
767 context=cmo%matrix_struct%context, &
768 para_env=cmo%matrix_struct%para_env)
774 ALLOCATE (eig_not_conv(ncol_z))
776 DO j = 1, nset_not_conv
777 i_first = inotconv_set(j, 1)
778 i_last = inotconv_set(j, 2)
779 n = i_last - i_first + 1
780 ALLOCATE (submat_buffer(nao, n))
782 n_rows=nao, n_cols=n)
784 DEALLOCATE (submat_buffer)
785 eig_not_conv(jj:jj + n - 1) = ritz_coeff(i_first:i_last)
792 IF (
ALLOCATED(scaling))
DEALLOCATE (scaling)
793 ALLOCATE (scaling(ncol_z))
794 scaling(:) = cmplx(eig_not_conv, 0.0_dp, kind=
dp)
797 DEALLOCATE (eig_not_conv)
807 IF (do_apply_preconditioner)
THEN
809 IF (nmo_converged == 0)
THEN
825 ALLOCATE (colbuf(nao, ncol_z))
827 DO j = 1, nset_not_conv
828 i_first = inotconv_set(j, 1)
829 i_last = inotconv_set(j, 2)
830 n = i_last - i_first + 1
838 DO j = 1, nset_not_conv
839 i_first = inotconv_set(j, 1)
840 i_last = inotconv_set(j, 2)
841 n = i_last - i_first + 1
870 ALLOCATE (vnorm_pz(ncol_z))
872 IF (any(vnorm_pz < eps_exhaust))
THEN
875 IF (
ALLOCATED(scaling))
DEALLOCATE (scaling)
876 ALLOCATE (scaling(ncol_z))
877 scaling(:) = cmplx(1.0_dp/vnorm_pz, 0.0_dp, kind=
dp)
883 context=cmo%matrix_struct%context, &
884 para_env=cmo%matrix_struct%para_env)
892 IF (any(vnorm_pz < eps_exhaust))
THEN
895 IF (
ALLOCATED(scaling))
DEALLOCATE (scaling)
896 ALLOCATE (scaling(ncol_z))
897 scaling(:) = cmplx(1.0_dp/vnorm_pz, 0.0_dp, kind=
dp)
901 DEALLOCATE (vnorm_pz)
907 context=cmo%matrix_struct%context, &
908 para_env=cmo%matrix_struct%para_env)
914 ALLOCATE (evals(nmat2))
919 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_notconv, m_hc,
z_zero, h_block, &
920 c_first_row=1, c_first_col=1)
921 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_notconv, m_sc,
z_zero, s_block, &
922 c_first_row=1, c_first_col=1)
925 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_mz, m_sc,
z_zero, s_block, &
926 c_first_row=1 + nmat, c_first_col=1)
928 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_mz, m_hc,
z_zero, h_block, &
929 c_first_row=1 + nmat, c_first_col=1)
934 IF (nmo_converged > 0)
THEN
949 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_notconv, m_sc,
z_zero, s_block, &
950 c_first_row=1, c_first_col=1 + nmat)
951 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_notconv, m_hc,
z_zero, h_block, &
952 c_first_row=1, c_first_col=1 + nmat)
955 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_mz, m_sc,
z_zero, s_block, &
956 c_first_row=1 + nmat, c_first_col=1 + nmat)
958 CALL cp_cfm_gemm(
'C',
'N', nmat, nmat, nao,
z_one, c_mz, m_hc,
z_zero, h_block, &
959 c_first_row=1 + nmat, c_first_col=1 + nmat)
964 CALL cp_cfm_geeig(h_block, s_block, v_block, evals, w_block)
968 context=cmo%matrix_struct%context, &
969 para_env=cmo%matrix_struct%para_env)
972 CALL cp_cfm_gemm(
'N',
'N', nao, nmat, nmat,
z_one, c_notconv, v_block,
z_zero, c_new, &
973 b_first_row=1, b_first_col=1)
974 CALL cp_cfm_gemm(
'N',
'N', nao, nmat, nmat,
z_one, c_mz, v_block,
z_one, c_new, &
975 b_first_row=1 + nmat, b_first_col=1)
986 IF (nmo_converged > 0)
THEN
988 DO j = 1, nset_not_conv
989 i_first = inotconv_set(j, 1)
990 i_last = inotconv_set(j, 2)
991 n = i_last - i_first + 1
992 ALLOCATE (submat_buffer(nao, n))
994 n_rows=nao, n_cols=n)
996 DEALLOCATE (submat_buffer)
997 eigenvalues(i_first:i_last) = evals(jj:jj + n - 1)
1000 DEALLOCATE (iconv_set)
1001 DEALLOCATE (inotconv_set)
1004 eigenvalues(1:nmo) = evals(1:nmo)
1010 IF (output_unit > 0)
THEN
1011 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1012 iter, nmo_converged, max_norm, min_norm, t2 - t1
1022 IF (nmo_converged > 0)
THEN
1031 IF (
ALLOCATED(iconv_set))
DEALLOCATE (iconv_set)
1032 IF (
ALLOCATED(inotconv_set))
DEALLOCATE (inotconv_set)
1037 CALL cp_cfm_create(h_fm, matrix_h%matrix_struct, name=
"fb_h")
1038 CALL cp_cfm_create(c_out, matrix_h%matrix_struct, name=
"fb_s")
1039 CALL cp_cfm_create(c_new, matrix_h%matrix_struct, name=
"fb_work")
1042 CALL cp_cfm_geeig(h_fm, c_out, cmo, eigenvalues, c_new)
1049 DEALLOCATE (inotconv)
1050 DEALLOCATE (ritz_coeff)
1053 IF (
ALLOCATED(scaling))
DEALLOCATE (scaling)
1055 CALL timestop(handle)
1072 TYPE(
dbcsr_type),
POINTER :: matrix_h, matrix_s
1073 INTEGER,
INTENT(IN) :: output_unit
1076 CHARACTER(len=*),
PARAMETER :: routinen =
'generate_extended_space_sparse'
1078 INTEGER :: col_offset, handle, homo, i_first, i_last, imo, iteration, j, jj, k, max_iter, n, &
1079 nao, nmat, nmat2, nmo, nmo_converged, nmo_not_converged, nset, nset_conv, nset_not_conv
1080 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iconv, inotconv
1081 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: iconv_set, inotconv_set
1082 LOGICAL :: converged, do_apply_preconditioner
1083 REAL(
dp) :: lambda, max_norm, min_norm, t1, t2
1084 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_not_conv, evals, ritz_coeff, vnorm
1085 REAL(
dp),
DIMENSION(:),
POINTER :: eigenvalues
1086 REAL(
dp),
DIMENSION(:, :),
POINTER :: block
1088 TYPE(
cp_fm_type) :: h_block, matrix_mm_fm, matrix_mmt_fm, &
1089 matrix_nm_fm, matrix_z_fm, mo_conv_fm, &
1090 s_block, v_block, w_block
1091 TYPE(
cp_fm_type),
POINTER :: mo_coeff, mo_notconv_fm
1093 TYPE(
dbcsr_type),
POINTER :: c_out, matrix_hc, matrix_mm, matrix_pz, &
1094 matrix_sc, matrix_z, mo_coeff_b, &
1095 mo_conv, mo_notconv, smo_conv
1098 CALL timeset(routinen, handle)
1100 do_apply_preconditioner = .false.
1103 NULLIFY (mo_coeff, mo_coeff_b, matrix_hc, matrix_sc, matrix_z, matrix_pz, matrix_mm)
1104 NULLIFY (mo_notconv_fm, mo_conv, mo_notconv, smo_conv, c_out)
1105 NULLIFY (fm_struct_tmp)
1106 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b, &
1107 eigenvalues=eigenvalues, homo=homo, nao=nao, nmo=nmo)
1108 IF (do_apply_preconditioner)
THEN
1109 max_iter = bdav_env%max_iter
1115 IF (output_unit > 0)
THEN
1116 WRITE (output_unit,
"(T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
1117 " Cycle ",
" conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
1121 ALLOCATE (ritz_coeff(nmo))
1122 ALLOCATE (iconv(nmo))
1123 ALLOCATE (inotconv(nmo))
1124 ALLOCATE (vnorm(nmo))
1127 DO iteration = 1, max_iter
1128 NULLIFY (c_out, mo_conv, mo_notconv_fm, mo_notconv)
1133 matrix_type=dbcsr_type_no_symmetry)
1137 matrix_type=dbcsr_type_no_symmetry)
1139 CALL dbcsr_get_info(mo_coeff_b, nfullrows_total=n, nfullcols_total=k, group=group)
1140 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_h, mo_coeff_b, 0.0_dp, matrix_hc, last_column=k)
1141 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, mo_coeff_b, 0.0_dp, matrix_sc, last_column=k)
1150 sym=dbcsr_type_no_symmetry)
1152 CALL dbcsr_multiply(
't',
'n', 1.0_dp, mo_coeff_b, matrix_hc, 0.0_dp, matrix_mm, last_column=k)
1154 CALL mo_coeff%matrix_struct%para_env%sum(ritz_coeff)
1160 matrix_type=dbcsr_type_no_symmetry)
1163 CALL dbcsr_add(matrix_z, matrix_hc, -1.0_dp, 1.0_dp)
1170 DO j = 1,
SIZE(block, 2)
1171 vnorm(col_offset + j - 1) = vnorm(col_offset + j - 1) + sum(block(:, j)**2)
1175 CALL group%sum(vnorm)
1180 nmo_not_converged = 0
1184 max_norm = max(max_norm, vnorm(imo))
1185 min_norm = min(min_norm, vnorm(imo))
1191 IF (vnorm(imo) <= bdav_env%eps_iter)
THEN
1192 nmo_converged = nmo_converged + 1
1193 iconv(nmo_converged) = imo
1195 nmo_not_converged = nmo_not_converged + 1
1196 inotconv(nmo_not_converged) = imo
1200 IF (nmo_converged > 0)
THEN
1201 ALLOCATE (iconv_set(nmo_converged, 2))
1202 ALLOCATE (inotconv_set(nmo_not_converged, 2))
1205 DO j = 1, nmo_converged
1208 IF (imo == i_last + 1)
THEN
1210 iconv_set(nset, 2) = imo
1214 iconv_set(nset, 1) = imo
1215 iconv_set(nset, 2) = imo
1220 i_last = inotconv(1)
1222 DO j = 1, nmo_not_converged
1225 IF (imo == i_last + 1)
THEN
1227 inotconv_set(nset, 2) = imo
1231 inotconv_set(nset, 1) = imo
1232 inotconv_set(nset, 2) = imo
1235 nset_not_conv = nset
1243 IF (real(nmo_converged,
dp)/real(nmo,
dp) > bdav_env%conv_percent)
THEN
1244 DEALLOCATE (iconv_set)
1246 DEALLOCATE (inotconv_set)
1250 IF (output_unit > 0)
THEN
1251 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1252 iteration, nmo_converged, max_norm, min_norm, t2 - t1
1254 WRITE (output_unit, *)
" Reached convergence in ", iteration, &
1255 " Davidson iterations"
1261 IF (nmo_converged > 0)
THEN
1265 context=mo_coeff%matrix_struct%context, &
1266 para_env=mo_coeff%matrix_struct%para_env)
1267 CALL cp_fm_create(mo_conv_fm, fm_struct_tmp, name=
"mo_conv_fm")
1274 i_first = iconv_set(j, 1)
1275 i_last = iconv_set(j, 2)
1276 n = i_last - i_first + 1
1285 matrix_type=dbcsr_type_symmetric)
1290 sym=dbcsr_type_no_symmetry)
1294 sym=dbcsr_type_no_symmetry)
1298 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, mo_conv, 0.0_dp, smo_conv, last_column=nmo_converged)
1299 CALL dbcsr_multiply(
'n',
't', 1.0_dp, smo_conv, smo_conv, 0.0_dp, c_out, last_column=nao)
1301 lambda = 100.0_dp*abs(eigenvalues(homo))
1302 CALL dbcsr_add(c_out, matrix_h, lambda, 1.0_dp)
1310 context=mo_coeff%matrix_struct%context, &
1311 para_env=mo_coeff%matrix_struct%para_env)
1312 ALLOCATE (mo_notconv_fm)
1313 CALL cp_fm_create(mo_notconv_fm, fm_struct_tmp, name=
"mo_notconv_fm")
1317 ALLOCATE (eig_not_conv(nmo_not_converged))
1320 DO j = 1, nset_not_conv
1321 i_first = inotconv_set(j, 1)
1322 i_last = inotconv_set(j, 2)
1323 n = i_last - i_first + 1
1325 eig_not_conv(jj:jj + n - 1) = ritz_coeff(i_first:i_last)
1332 sym=dbcsr_type_no_symmetry)
1336 sym=dbcsr_type_no_symmetry)
1340 sym=dbcsr_type_no_symmetry)
1344 sym=dbcsr_type_no_symmetry)
1348 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, c_out, mo_notconv, 0.0_dp, matrix_hc, &
1349 last_column=nmo_not_converged)
1350 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, mo_notconv, 0.0_dp, matrix_sc, &
1351 last_column=nmo_not_converged)
1355 CALL dbcsr_add(matrix_z, matrix_hc, -1.0_dp, 1.0_dp)
1357 DEALLOCATE (eig_not_conv)
1362 sym=dbcsr_type_no_symmetry)
1364 CALL dbcsr_multiply(
't',
'n', 1.0_dp, mo_notconv, matrix_hc, 0.0_dp, matrix_mm, &
1365 last_column=nmo_not_converged)
1368 mo_notconv => mo_coeff_b
1369 mo_notconv_fm => mo_coeff
1377 matrix_type=dbcsr_type_no_symmetry)
1379 IF (do_apply_preconditioner)
THEN
1390 nmat = nmo_not_converged
1392 context=mo_coeff%matrix_struct%context, &
1393 para_env=mo_coeff%matrix_struct%para_env)
1394 CALL cp_fm_create(matrix_mm_fm, fm_struct_tmp, name=
"m_tmp_mxm")
1395 CALL cp_fm_create(matrix_mmt_fm, fm_struct_tmp, name=
"mt_tmp_mxm")
1399 nmat2 = 2*nmo_not_converged
1401 context=mo_coeff%matrix_struct%context, &
1402 para_env=mo_coeff%matrix_struct%para_env)
1408 ALLOCATE (evals(nmat2))
1418 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_sc, 0.0_dp, matrix_mm, last_column=nmat)
1427 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_hc, 0.0_dp, matrix_mm, last_column=nmat)
1437 CALL dbcsr_get_info(matrix_pz, nfullrows_total=n, nfullcols_total=k)
1438 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, c_out, matrix_pz, 0.0_dp, matrix_hc, last_column=k)
1439 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, matrix_pz, 0.0_dp, matrix_sc, last_column=k)
1442 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_sc, 0.0_dp, matrix_mm, last_column=k)
1448 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_hc, 0.0_dp, matrix_mm, last_column=k)
1457 CALL reduce_extended_space(s_block, h_block, v_block, w_block, evals, nmat2)
1461 context=mo_coeff%matrix_struct%context, &
1462 para_env=mo_coeff%matrix_struct%para_env)
1463 CALL cp_fm_create(matrix_nm_fm, fm_struct_tmp, name=
"m_nxm")
1464 CALL cp_fm_create(matrix_z_fm, fm_struct_tmp, name=
"m_nxm")
1470 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, mo_notconv_fm, matrix_mm_fm, 0.0_dp, matrix_nm_fm)
1472 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, matrix_z_fm, matrix_mm_fm, 1.0_dp, matrix_nm_fm)
1484 IF (nmo_converged > 0)
THEN
1486 DO j = 1, nset_not_conv
1487 i_first = inotconv_set(j, 1)
1488 i_last = inotconv_set(j, 2)
1489 n = i_last - i_first + 1
1491 eigenvalues(i_first:i_last) = evals(jj:jj + n - 1)
1494 DEALLOCATE (iconv_set)
1495 DEALLOCATE (inotconv_set)
1500 DEALLOCATE (mo_notconv_fm)
1503 eigenvalues(1:nmo) = evals(1:nmo)
1511 IF (output_unit > 0)
THEN
1512 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1513 iteration, nmo_converged, max_norm, min_norm, t2 - t1
1519 DEALLOCATE (ritz_coeff)
1521 DEALLOCATE (inotconv)
1524 CALL timestop(handle)