46 USE dbcsr_api,
ONLY: &
47 dbcsr_add, dbcsr_copy, dbcsr_create, dbcsr_get_diag, dbcsr_get_info, dbcsr_init_p, &
48 dbcsr_multiply, dbcsr_norm, dbcsr_norm_column, dbcsr_release_p, dbcsr_scale_by_vector, &
49 dbcsr_type, dbcsr_type_no_symmetry, dbcsr_type_real_default, dbcsr_type_symmetric
58 #include "./base/base_uses.f90"
62 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_block_davidson'
80 TYPE(davidson_type) :: bdav_env
81 TYPE(mo_set_type),
INTENT(IN) :: mo_set
82 TYPE(dbcsr_type),
POINTER :: matrix_h, matrix_s
83 INTEGER,
INTENT(IN) :: output_unit
86 CHARACTER(len=*),
PARAMETER :: routinen =
'generate_extended_space'
88 INTEGER :: handle, homo, i_first, i_last, imo, iter, j, jj, max_iter, n, nao, nmat, nmat2, &
89 nmo, nmo_converged, nmo_not_converged, nset, nset_conv, nset_not_conv
90 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iconv, inotconv
91 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: iconv_set, inotconv_set
92 LOGICAL :: converged, do_apply_preconditioner
93 REAL(
dp) :: lambda, max_norm, min_norm, t1, t2
94 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: ritz_coeff, vnorm
95 REAL(
dp),
DIMENSION(:),
POINTER :: eig_not_conv, eigenvalues, evals
96 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_tmp
97 TYPE(cp_fm_type) :: c_conv, c_notconv, c_out, h_block, h_fm, &
98 m_hc, m_sc, m_tmp, mt_tmp, s_block, &
99 s_fm, v_block, w_block
100 TYPE(cp_fm_type),
POINTER :: c_pz, c_z, mo_coeff
101 TYPE(dbcsr_type),
POINTER :: mo_coeff_b
103 CALL timeset(routinen, handle)
105 NULLIFY (mo_coeff, mo_coeff_b, eigenvalues)
107 do_apply_preconditioner = .false.
109 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b, eigenvalues=eigenvalues, &
110 nao=nao, nmo=nmo, homo=homo)
111 IF (do_apply_preconditioner)
THEN
112 max_iter = bdav_env%max_iter
118 NULLIFY (evals, eig_not_conv)
120 IF (output_unit > 0)
THEN
121 WRITE (output_unit,
"(T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
122 " Cycle ",
" conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
125 ALLOCATE (iconv(nmo))
126 ALLOCATE (inotconv(nmo))
127 ALLOCATE (ritz_coeff(nmo))
128 ALLOCATE (vnorm(nmo))
131 DO iter = 1, max_iter
135 CALL cp_fm_create(m_hc, mo_coeff%matrix_struct, name=
"hc")
137 CALL cp_fm_create(m_sc, mo_coeff%matrix_struct, name=
"sc")
141 context=mo_coeff%matrix_struct%context, &
142 para_env=mo_coeff%matrix_struct%para_env)
143 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"matrix_tmp")
146 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, 1.0_dp, mo_coeff, m_hc, 0.0_dp, m_tmp)
148 CALL cp_fm_release(m_tmp)
151 c_z => bdav_env%matrix_z
152 c_pz => bdav_env%matrix_pz
153 CALL cp_fm_to_fm(m_sc, c_z)
159 nmo_not_converged = 0
163 max_norm = max(max_norm, vnorm(imo))
164 min_norm = min(min_norm, vnorm(imo))
169 IF (vnorm(imo) <= bdav_env%eps_iter)
THEN
170 nmo_converged = nmo_converged + 1
171 iconv(nmo_converged) = imo
173 nmo_not_converged = nmo_not_converged + 1
174 inotconv(nmo_not_converged) = imo
178 IF (nmo_converged > 0)
THEN
179 ALLOCATE (iconv_set(nmo_converged, 2))
180 ALLOCATE (inotconv_set(nmo_not_converged, 2))
183 DO j = 1, nmo_converged
186 IF (imo == i_last + 1)
THEN
188 iconv_set(nset, 2) = imo
192 iconv_set(nset, 1) = imo
193 iconv_set(nset, 2) = imo
200 DO j = 1, nmo_not_converged
203 IF (imo == i_last + 1)
THEN
205 inotconv_set(nset, 2) = imo
209 inotconv_set(nset, 1) = imo
210 inotconv_set(nset, 2) = imo
214 CALL cp_fm_release(m_sc)
215 CALL cp_fm_release(m_hc)
219 IF (real(nmo_converged,
dp)/real(nmo,
dp) > bdav_env%conv_percent)
THEN
221 DEALLOCATE (iconv_set)
222 DEALLOCATE (inotconv_set)
224 IF (output_unit > 0)
THEN
225 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
226 iter, nmo_converged, max_norm, min_norm, t2 - t1
228 WRITE (output_unit, *)
" Reached convergence in ", iter, &
229 " Davidson iterations"
235 IF (nmo_converged > 0)
THEN
237 context=mo_coeff%matrix_struct%context, &
238 para_env=mo_coeff%matrix_struct%para_env)
240 CALL cp_fm_create(h_fm, fm_struct_tmp, name=
"matrix_tmp")
242 CALL cp_fm_create(s_fm, fm_struct_tmp, name=
"matrix_tmp")
252 CALL cp_fm_create(c_out, fm_struct_tmp, name=
"matrix_tmp")
259 context=mo_coeff%matrix_struct%context, &
260 para_env=mo_coeff%matrix_struct%para_env)
264 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"m_tmp_nxmc")
270 context=mo_coeff%matrix_struct%context, &
271 para_env=mo_coeff%matrix_struct%para_env)
272 CALL cp_fm_create(c_notconv, fm_struct_tmp, name=
"c_notconv")
274 IF (nmo_converged > 0)
THEN
286 i_first = iconv_set(j, 1)
287 i_last = iconv_set(j, 2)
288 n = i_last - i_first + 1
292 CALL cp_fm_symm(
'L',
'U', nao, nmo_converged, 1.0_dp, s_fm, c_conv, 0.0_dp, m_tmp)
293 CALL parallel_gemm(
'N',
'T', nao, nao, nmo_converged, 1.0_dp, m_tmp, m_tmp, 0.0_dp, c_out)
296 lambda = 100.0_dp*abs(eigenvalues(homo))
298 CALL cp_fm_release(m_tmp)
299 CALL cp_fm_release(h_fm)
304 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"m_tmp_nxm")
306 IF (nmo_converged > 0)
THEN
307 ALLOCATE (eig_not_conv(nmo_not_converged))
309 DO j = 1, nset_not_conv
310 i_first = inotconv_set(j, 1)
311 i_last = inotconv_set(j, 2)
312 n = i_last - i_first + 1
314 eig_not_conv(jj:jj + n - 1) = ritz_coeff(i_first:i_last)
317 CALL parallel_gemm(
'N',
'N', nao, nmo_not_converged, nao, 1.0_dp, c_out, c_notconv, 0.0_dp, m_hc)
318 CALL cp_fm_symm(
'L',
'U', nao, nmo_not_converged, 1.0_dp, s_fm, c_notconv, 0.0_dp, m_sc)
320 CALL cp_fm_to_fm(m_sc, m_tmp)
323 DEALLOCATE (eig_not_conv)
324 CALL cp_fm_to_fm(m_tmp, c_z)
326 CALL cp_fm_to_fm(mo_coeff, c_notconv)
330 IF (do_apply_preconditioner)
THEN
334 CALL cp_fm_to_fm(c_z, c_pz)
337 CALL cp_fm_to_fm(c_z, c_pz)
339 CALL cp_fm_release(m_tmp)
341 CALL cp_fm_struct_create(fm_struct_tmp, nrow_global=nmo_not_converged, ncol_global=nmo_not_converged, &
342 context=mo_coeff%matrix_struct%context, &
343 para_env=mo_coeff%matrix_struct%para_env)
345 CALL cp_fm_create(m_tmp, fm_struct_tmp, name=
"m_tmp_mxm")
346 CALL cp_fm_create(mt_tmp, fm_struct_tmp, name=
"mt_tmp_mxm")
349 nmat = nmo_not_converged
350 nmat2 = 2*nmo_not_converged
352 context=mo_coeff%matrix_struct%context, &
353 para_env=mo_coeff%matrix_struct%para_env)
359 ALLOCATE (evals(nmat2))
367 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_notconv, m_hc, 0.0_dp, m_tmp)
371 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_sc, 0.0_dp, m_tmp)
376 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_hc, 0.0_dp, m_tmp)
381 CALL cp_fm_release(mt_tmp)
384 IF (nmo_converged > 0)
THEN
385 CALL parallel_gemm(
'N',
'N', nao, nmat, nao, 1.0_dp, c_out, c_pz, 0.0_dp, m_hc)
386 CALL cp_fm_symm(
'L',
'U', nao, nmo_not_converged, 1.0_dp, s_fm, c_pz, 0.0_dp, m_sc)
388 CALL cp_fm_release(c_out)
389 CALL cp_fm_release(c_conv)
390 CALL cp_fm_release(s_fm)
397 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_sc, 0.0_dp, m_tmp)
400 CALL parallel_gemm(
'T',
'N', nmat, nmat, nao, 1.0_dp, c_pz, m_hc, 0.0_dp, m_tmp)
403 CALL cp_fm_release(m_sc)
406 CALL reduce_extended_space(s_block, h_block, v_block, w_block, evals, nmat2)
410 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, c_notconv, m_tmp, 0.0_dp, m_hc)
412 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, c_pz, m_tmp, 1.0_dp, m_hc)
414 CALL cp_fm_release(m_tmp)
416 CALL cp_fm_release(c_notconv)
417 CALL cp_fm_release(s_block)
418 CALL cp_fm_release(h_block)
419 CALL cp_fm_release(w_block)
420 CALL cp_fm_release(v_block)
422 IF (nmo_converged > 0)
THEN
423 CALL cp_fm_release(c_z)
424 CALL cp_fm_release(c_pz)
425 DEALLOCATE (c_z, c_pz)
427 DO j = 1, nset_not_conv
428 i_first = inotconv_set(j, 1)
429 i_last = inotconv_set(j, 2)
430 n = i_last - i_first + 1
432 eigenvalues(i_first:i_last) = evals(jj:jj + n - 1)
435 DEALLOCATE (iconv_set)
436 DEALLOCATE (inotconv_set)
438 CALL cp_fm_to_fm(m_hc, mo_coeff)
439 eigenvalues(1:nmo) = evals(1:nmo)
443 CALL cp_fm_release(m_hc)
448 IF (output_unit > 0)
THEN
449 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
450 iter, nmo_converged, max_norm, min_norm, t2 - t1
457 DEALLOCATE (inotconv)
458 DEALLOCATE (ritz_coeff)
461 CALL timestop(handle)
476 TYPE(davidson_type) :: bdav_env
477 TYPE(mo_set_type),
INTENT(IN) :: mo_set
478 TYPE(dbcsr_type),
POINTER :: matrix_h, matrix_s
479 INTEGER,
INTENT(IN) :: output_unit
482 CHARACTER(len=*),
PARAMETER :: routinen =
'generate_extended_space_sparse'
484 INTEGER :: handle, homo, i_first, i_last, imo, iter, j, jj, k, max_iter, n, nao, nmat, &
485 nmat2, nmo, nmo_converged, nmo_not_converged, nset, nset_conv, nset_not_conv
486 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: iconv, inotconv
487 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: iconv_set, inotconv_set
488 LOGICAL :: converged, do_apply_preconditioner
489 REAL(
dp) :: lambda, max_norm, min_norm, t1, t2
490 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_not_conv, evals, ritz_coeff, vnorm
491 REAL(
dp),
DIMENSION(:),
POINTER :: eigenvalues
492 TYPE(cp_fm_struct_type),
POINTER :: fm_struct_tmp
493 TYPE(cp_fm_type) :: h_block, matrix_mm_fm, matrix_mmt_fm, &
494 matrix_nm_fm, matrix_z_fm, mo_conv_fm, &
495 s_block, v_block, w_block
496 TYPE(cp_fm_type),
POINTER :: mo_coeff, mo_notconv_fm
497 TYPE(dbcsr_type),
POINTER :: c_out, matrix_hc, matrix_mm, matrix_pz, &
498 matrix_sc, matrix_z, mo_coeff_b, &
499 mo_conv, mo_notconv, smo_conv
501 CALL timeset(routinen, handle)
503 do_apply_preconditioner = .false.
506 NULLIFY (mo_coeff, mo_coeff_b, matrix_hc, matrix_sc, matrix_z, matrix_pz, matrix_mm)
507 NULLIFY (mo_notconv_fm, mo_conv, mo_notconv, smo_conv, c_out)
508 NULLIFY (fm_struct_tmp)
509 CALL get_mo_set(mo_set=mo_set, mo_coeff=mo_coeff, mo_coeff_b=mo_coeff_b, &
510 eigenvalues=eigenvalues, homo=homo, nao=nao, nmo=nmo)
511 IF (do_apply_preconditioner)
THEN
512 max_iter = bdav_env%max_iter
518 IF (output_unit > 0)
THEN
519 WRITE (output_unit,
"(T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
520 " Cycle ",
" conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
524 ALLOCATE (ritz_coeff(nmo))
525 ALLOCATE (iconv(nmo))
526 ALLOCATE (inotconv(nmo))
527 ALLOCATE (vnorm(nmo))
530 DO iter = 1, max_iter
531 NULLIFY (c_out, mo_conv, mo_notconv_fm, mo_notconv)
533 CALL dbcsr_init_p(matrix_hc)
534 CALL dbcsr_create(matrix_hc, template=mo_coeff_b, &
536 matrix_type=dbcsr_type_no_symmetry, &
537 nze=0, data_type=dbcsr_type_real_default)
538 CALL dbcsr_init_p(matrix_sc)
539 CALL dbcsr_create(matrix_sc, template=mo_coeff_b, &
541 matrix_type=dbcsr_type_no_symmetry, &
542 nze=0, data_type=dbcsr_type_real_default)
544 CALL dbcsr_get_info(mo_coeff_b, nfullrows_total=n, nfullcols_total=k)
545 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_h, mo_coeff_b, 0.0_dp, matrix_hc, last_column=k)
546 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, mo_coeff_b, 0.0_dp, matrix_sc, last_column=k)
553 CALL dbcsr_init_p(matrix_mm)
555 sym=dbcsr_type_no_symmetry)
557 CALL dbcsr_multiply(
't',
'n', 1.0_dp, mo_coeff_b, matrix_hc, 0.0_dp, matrix_mm, last_column=k)
558 CALL dbcsr_get_diag(matrix_mm, ritz_coeff)
559 CALL mo_coeff%matrix_struct%para_env%sum(ritz_coeff)
562 CALL dbcsr_init_p(matrix_z)
563 CALL dbcsr_create(matrix_z, template=mo_coeff_b, &
565 matrix_type=dbcsr_type_no_symmetry, &
566 nze=0, data_type=dbcsr_type_real_default)
567 CALL dbcsr_copy(matrix_z, matrix_sc)
568 CALL dbcsr_scale_by_vector(matrix_z, ritz_coeff, side=
'right')
569 CALL dbcsr_add(matrix_z, matrix_hc, -1.0_dp, 1.0_dp)
573 CALL dbcsr_norm(matrix_z, which_norm=dbcsr_norm_column, norm_vector=vnorm)
575 nmo_not_converged = 0
579 max_norm = max(max_norm, vnorm(imo))
580 min_norm = min(min_norm, vnorm(imo))
586 IF (vnorm(imo) <= bdav_env%eps_iter)
THEN
587 nmo_converged = nmo_converged + 1
588 iconv(nmo_converged) = imo
590 nmo_not_converged = nmo_not_converged + 1
591 inotconv(nmo_not_converged) = imo
595 IF (nmo_converged > 0)
THEN
596 ALLOCATE (iconv_set(nmo_converged, 2))
597 ALLOCATE (inotconv_set(nmo_not_converged, 2))
600 DO j = 1, nmo_converged
603 IF (imo == i_last + 1)
THEN
605 iconv_set(nset, 2) = imo
609 iconv_set(nset, 1) = imo
610 iconv_set(nset, 2) = imo
617 DO j = 1, nmo_not_converged
620 IF (imo == i_last + 1)
THEN
622 inotconv_set(nset, 2) = imo
626 inotconv_set(nset, 1) = imo
627 inotconv_set(nset, 2) = imo
632 CALL dbcsr_release_p(matrix_hc)
633 CALL dbcsr_release_p(matrix_sc)
634 CALL dbcsr_release_p(matrix_z)
635 CALL dbcsr_release_p(matrix_mm)
638 IF (real(nmo_converged,
dp)/real(nmo,
dp) > bdav_env%conv_percent)
THEN
639 DEALLOCATE (iconv_set)
641 DEALLOCATE (inotconv_set)
645 IF (output_unit > 0)
THEN
646 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
647 iter, nmo_converged, max_norm, min_norm, t2 - t1
649 WRITE (output_unit, *)
" Reached convergence in ", iter, &
650 " Davidson iterations"
656 IF (nmo_converged > 0)
THEN
660 context=mo_coeff%matrix_struct%context, &
661 para_env=mo_coeff%matrix_struct%para_env)
662 CALL cp_fm_create(mo_conv_fm, fm_struct_tmp, name=
"mo_conv_fm")
669 i_first = iconv_set(j, 1)
670 i_last = iconv_set(j, 2)
671 n = i_last - i_first + 1
677 CALL dbcsr_init_p(c_out)
678 CALL dbcsr_create(c_out, template=matrix_s, &
680 matrix_type=dbcsr_type_symmetric, &
681 nze=0, data_type=dbcsr_type_real_default)
684 CALL dbcsr_init_p(mo_conv)
686 sym=dbcsr_type_no_symmetry)
688 CALL dbcsr_init_p(smo_conv)
690 sym=dbcsr_type_no_symmetry)
694 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, mo_conv, 0.0_dp, smo_conv, last_column=nmo_converged)
695 CALL dbcsr_multiply(
'n',
't', 1.0_dp, smo_conv, smo_conv, 0.0_dp, c_out, last_column=nao)
697 lambda = 100.0_dp*abs(eigenvalues(homo))
698 CALL dbcsr_add(c_out, matrix_h, lambda, 1.0_dp)
700 CALL dbcsr_release_p(mo_conv)
701 CALL dbcsr_release_p(smo_conv)
702 CALL cp_fm_release(mo_conv_fm)
706 context=mo_coeff%matrix_struct%context, &
707 para_env=mo_coeff%matrix_struct%para_env)
708 ALLOCATE (mo_notconv_fm)
709 CALL cp_fm_create(mo_notconv_fm, fm_struct_tmp, name=
"mo_notconv_fm")
713 ALLOCATE (eig_not_conv(nmo_not_converged))
716 DO j = 1, nset_not_conv
717 i_first = inotconv_set(j, 1)
718 i_last = inotconv_set(j, 2)
719 n = i_last - i_first + 1
721 eig_not_conv(jj:jj + n - 1) = ritz_coeff(i_first:i_last)
726 CALL dbcsr_init_p(mo_notconv)
728 sym=dbcsr_type_no_symmetry)
730 CALL dbcsr_init_p(matrix_hc)
732 sym=dbcsr_type_no_symmetry)
734 CALL dbcsr_init_p(matrix_sc)
736 sym=dbcsr_type_no_symmetry)
738 CALL dbcsr_init_p(matrix_z)
740 sym=dbcsr_type_no_symmetry)
744 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, c_out, mo_notconv, 0.0_dp, matrix_hc, &
745 last_column=nmo_not_converged)
746 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, mo_notconv, 0.0_dp, matrix_sc, &
747 last_column=nmo_not_converged)
749 CALL dbcsr_copy(matrix_z, matrix_sc)
750 CALL dbcsr_scale_by_vector(matrix_z, eig_not_conv, side=
'right')
751 CALL dbcsr_add(matrix_z, matrix_hc, -1.0_dp, 1.0_dp)
753 DEALLOCATE (eig_not_conv)
756 CALL dbcsr_init_p(matrix_mm)
758 sym=dbcsr_type_no_symmetry)
760 CALL dbcsr_multiply(
't',
'n', 1.0_dp, mo_notconv, matrix_hc, 0.0_dp, matrix_mm, &
761 last_column=nmo_not_converged)
764 mo_notconv => mo_coeff_b
765 mo_notconv_fm => mo_coeff
770 CALL dbcsr_init_p(matrix_pz)
771 CALL dbcsr_create(matrix_pz, template=matrix_z, &
773 matrix_type=dbcsr_type_no_symmetry, &
774 nze=0, data_type=dbcsr_type_real_default)
776 IF (do_apply_preconditioner)
THEN
780 CALL dbcsr_copy(matrix_pz, matrix_z)
783 CALL dbcsr_copy(matrix_pz, matrix_z)
787 nmat = nmo_not_converged
789 context=mo_coeff%matrix_struct%context, &
790 para_env=mo_coeff%matrix_struct%para_env)
791 CALL cp_fm_create(matrix_mm_fm, fm_struct_tmp, name=
"m_tmp_mxm")
792 CALL cp_fm_create(matrix_mmt_fm, fm_struct_tmp, name=
"mt_tmp_mxm")
796 nmat2 = 2*nmo_not_converged
798 context=mo_coeff%matrix_struct%context, &
799 para_env=mo_coeff%matrix_struct%para_env)
805 ALLOCATE (evals(nmat2))
815 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_sc, 0.0_dp, matrix_mm, last_column=nmat)
824 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_hc, 0.0_dp, matrix_mm, last_column=nmat)
831 CALL cp_fm_release(matrix_mmt_fm)
834 CALL dbcsr_get_info(matrix_pz, nfullrows_total=n, nfullcols_total=k)
835 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, c_out, matrix_pz, 0.0_dp, matrix_hc, last_column=k)
836 CALL dbcsr_multiply(
'n',
'n', 1.0_dp, matrix_s, matrix_pz, 0.0_dp, matrix_sc, last_column=k)
839 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_sc, 0.0_dp, matrix_mm, last_column=k)
845 CALL dbcsr_multiply(
't',
'n', 1.0_dp, matrix_pz, matrix_hc, 0.0_dp, matrix_mm, last_column=k)
850 CALL dbcsr_release_p(matrix_mm)
851 CALL dbcsr_release_p(matrix_sc)
852 CALL dbcsr_release_p(matrix_hc)
854 CALL reduce_extended_space(s_block, h_block, v_block, w_block, evals, nmat2)
858 context=mo_coeff%matrix_struct%context, &
859 para_env=mo_coeff%matrix_struct%para_env)
860 CALL cp_fm_create(matrix_nm_fm, fm_struct_tmp, name=
"m_nxm")
861 CALL cp_fm_create(matrix_z_fm, fm_struct_tmp, name=
"m_nxm")
867 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, mo_notconv_fm, matrix_mm_fm, 0.0_dp, matrix_nm_fm)
869 CALL parallel_gemm(
'N',
'N', nao, nmat, nmat, 1.0_dp, matrix_z_fm, matrix_mm_fm, 1.0_dp, matrix_nm_fm)
871 CALL dbcsr_release_p(matrix_z)
872 CALL dbcsr_release_p(matrix_pz)
873 CALL cp_fm_release(matrix_z_fm)
874 CALL cp_fm_release(s_block)
875 CALL cp_fm_release(h_block)
876 CALL cp_fm_release(w_block)
877 CALL cp_fm_release(v_block)
878 CALL cp_fm_release(matrix_mm_fm)
881 IF (nmo_converged > 0)
THEN
883 DO j = 1, nset_not_conv
884 i_first = inotconv_set(j, 1)
885 i_last = inotconv_set(j, 2)
886 n = i_last - i_first + 1
888 eigenvalues(i_first:i_last) = evals(jj:jj + n - 1)
891 DEALLOCATE (iconv_set)
892 DEALLOCATE (inotconv_set)
894 CALL dbcsr_release_p(mo_notconv)
895 CALL dbcsr_release_p(c_out)
896 CALL cp_fm_release(mo_notconv_fm)
897 DEALLOCATE (mo_notconv_fm)
899 CALL cp_fm_to_fm(matrix_nm_fm, mo_coeff)
900 eigenvalues(1:nmo) = evals(1:nmo)
904 CALL cp_fm_release(matrix_nm_fm)
908 IF (output_unit > 0)
THEN
909 WRITE (output_unit,
'(T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
910 iter, nmo_converged, max_norm, min_norm, t2 - t1
916 DEALLOCATE (ritz_coeff)
918 DEALLOCATE (inotconv)
921 CALL timestop(handle)
936 SUBROUTINE reduce_extended_space(s_block, h_block, v_block, w_block, evals, ndim)
938 TYPE(cp_fm_type),
INTENT(IN) :: s_block, h_block, v_block, w_block
939 REAL(
dp),
DIMENSION(:) :: evals
942 CHARACTER(len=*),
PARAMETER :: routinen =
'reduce_extended_space'
944 INTEGER :: handle, info
946 CALL timeset(routinen, handle)
948 CALL cp_fm_to_fm(s_block, w_block)
958 CALL cp_fm_power(w_block, s_block, -0.5_dp, 1.0e-5_dp, info)
959 CALL cp_fm_to_fm(w_block, s_block)
960 CALL parallel_gemm(
'N',
'N', ndim, ndim, ndim, 1.0_dp, h_block, s_block, 0.0_dp, w_block)
961 CALL parallel_gemm(
'N',
'N', ndim, ndim, ndim, 1.0_dp, s_block, w_block, 0.0_dp, h_block)
963 CALL parallel_gemm(
'N',
'N', ndim, ndim, ndim, 1.0_dp, s_block, w_block, 0.0_dp, v_block)
966 CALL timestop(handle)
968 END SUBROUTINE reduce_extended_space
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 cp_dbcsr_m_by_n_from_template(matrix, template, m, n, sym, data_type)
Utility function to create an arbitrary shaped dbcsr matrix with the same processor grid as the templ...
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, data_type)
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.
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_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
subroutine, public cp_fm_upper_to_full(matrix, work)
given an upper triangular matrix computes the corresponding full matrix
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_triangular_invert(matrix_a, uplo_tr)
inverts a triangular matrix
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...
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,...
subroutine, public cp_fm_cholesky_restore(matrix, neig, matrixb, matrixout, op, pos, transa)
...
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...
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_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_vectorsnorm(matrix, norm_array)
find the inorm of each column norm_{j}= sqrt( \sum_{i} A_{ij}*A_{ij} )
subroutine, public cp_fm_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the 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, use_sp)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
basic linear algebra operations for full matrixes
computes preconditioners, and implements methods to apply them currently used in qs_ot
module that contains the algorithms to perform an itrative diagonalization by the block-Davidson appr...
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.
module that contains the algorithms to perform an itrative diagonalization by the block-Davidson appr...
subroutine, public generate_extended_space_sparse(bdav_env, mo_set, matrix_h, matrix_s, output_unit, preconditioner)
...
subroutine, public generate_extended_space(bdav_env, mo_set, matrix_h, matrix_s, output_unit, preconditioner)
...