120#include "./base/base_uses.f90"
126 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_diagonalization'
149 matrix_s, scf_control, scf_section, &
154 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
157 LOGICAL,
INTENT(INOUT) :: diis_step
159 INTEGER :: ispin, nspin
160 LOGICAL :: do_level_shift, owns_ortho, use_jacobi
161 REAL(kind=
dp) :: diis_error, eps_diis
165 nspin =
SIZE(matrix_ks)
166 NULLIFY (ortho, ortho_dbcsr)
170 scf_env%scf_work1(ispin))
173 eps_diis = scf_control%eps_diis
175 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis)
THEN
176 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
177 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
178 eps_diis, scf_control%nmixing, &
180 scf_section=scf_section)
185 do_level_shift = ((scf_control%level_shift /= 0.0_dp) .AND. &
186 ((scf_control%density_guess ==
core_guess) .OR. &
187 (scf_env%iter_count > 1)))
189 IF ((scf_env%iter_count > 1) .AND. &
190 (scf_env%iter_delta < scf_control%diagonalization%eps_jacobi))
THEN
197 scf_env%iter_param = diis_error
199 scf_env%iter_method =
"DIIS/Jacobi"
201 scf_env%iter_method =
"DIIS/Diag."
204 IF (scf_env%mixing_method == 0)
THEN
205 scf_env%iter_method =
"NoMix/Diag."
206 ELSE IF (scf_env%mixing_method == 1)
THEN
207 scf_env%iter_param = scf_env%p_mix_alpha
209 scf_env%iter_method =
"P_Mix/Jacobi"
211 scf_env%iter_method =
"P_Mix/Diag."
213 ELSEIF (scf_env%mixing_method > 1)
THEN
214 scf_env%iter_param = scf_env%mixing_store%alpha
216 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Jacobi"
218 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
224 ortho_dbcsr => scf_env%ortho_dbcsr
226 CALL eigensolver_dbcsr(matrix_ks=matrix_ks(ispin)%matrix, matrix_ks_fm=scf_env%scf_work1(ispin), &
228 ortho_dbcsr=ortho_dbcsr, &
229 ksbuf1=scf_env%buf1_dbcsr, ksbuf2=scf_env%buf2_dbcsr)
234 ortho => scf_env%ortho_m1
236 ortho => scf_env%ortho
240 IF (.NOT.
ASSOCIATED(ortho))
THEN
246 IF (do_level_shift)
THEN
247 CALL eigensolver(matrix_ks_fm=scf_env%scf_work1(ispin), &
250 work=scf_env%scf_work2, &
251 cholesky_method=scf_env%cholesky_method, &
252 do_level_shift=do_level_shift, &
253 level_shift=scf_control%level_shift, &
254 matrix_u_fm=scf_env%ortho, &
255 use_jacobi=use_jacobi)
257 CALL eigensolver(matrix_ks_fm=scf_env%scf_work1(ispin), &
260 work=scf_env%scf_work2, &
261 cholesky_method=scf_env%cholesky_method, &
262 do_level_shift=do_level_shift, &
263 level_shift=scf_control%level_shift, &
264 use_jacobi=use_jacobi)
268 IF (owns_ortho)
DEALLOCATE (ortho)
270 ortho => scf_env%ortho
273 IF (.NOT.
ASSOCIATED(ortho))
THEN
278 IF (do_level_shift)
THEN
280 IF (
ASSOCIATED(scf_env%scf_work1_red) .AND.
ASSOCIATED(scf_env%scf_work2_red) &
281 .AND.
ASSOCIATED(scf_env%ortho_red) .AND.
ASSOCIATED(scf_env%ortho_m1_red))
THEN
285 work=scf_env%scf_work2, &
286 do_level_shift=do_level_shift, &
287 level_shift=scf_control%level_shift, &
288 matrix_u_fm=scf_env%ortho_m1, &
289 use_jacobi=use_jacobi, &
290 jacobi_threshold=scf_control%diagonalization%jacobi_threshold, &
291 matrix_ks_fm_red=scf_env%scf_work1_red(ispin), &
292 ortho_red=scf_env%ortho_red, &
293 work_red=scf_env%scf_work2_red, &
294 matrix_u_fm_red=scf_env%ortho_m1_red)
299 work=scf_env%scf_work2, &
300 do_level_shift=do_level_shift, &
301 level_shift=scf_control%level_shift, &
302 matrix_u_fm=scf_env%ortho_m1, &
303 use_jacobi=use_jacobi, &
304 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
309 IF (
ASSOCIATED(scf_env%scf_work1_red) .AND.
ASSOCIATED(scf_env%scf_work2_red) &
310 .AND.
ASSOCIATED(scf_env%ortho_red))
THEN
314 work=scf_env%scf_work2, &
315 do_level_shift=do_level_shift, &
316 level_shift=scf_control%level_shift, &
317 use_jacobi=use_jacobi, &
318 jacobi_threshold=scf_control%diagonalization%jacobi_threshold, &
319 matrix_ks_fm_red=scf_env%scf_work1_red(ispin), &
320 ortho_red=scf_env%ortho_red, &
321 work_red=scf_env%scf_work2_red)
326 work=scf_env%scf_work2, &
327 do_level_shift=do_level_shift, &
328 level_shift=scf_control%level_shift, &
329 use_jacobi=use_jacobi, &
330 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
335 IF (owns_ortho)
DEALLOCATE (ortho)
351 matrix_s, scf_control, scf_section, &
355 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
356 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
359 LOGICAL,
INTENT(INOUT) :: diis_step
361 INTEGER :: ispin, nspin
362 REAL(kind=
dp) :: total_zeff_corr
364 nspin =
SIZE(matrix_ks)
367 matrix_s, scf_control, scf_section, diis_step)
369 total_zeff_corr = 0.0_dp
370 total_zeff_corr = scf_env%sum_zeff_corr
372 IF (abs(total_zeff_corr) > 0.0_dp)
THEN
374 smear=scf_control%smear, tot_zeff_corr=total_zeff_corr)
377 smear=scf_control%smear)
382 scf_env%p_mix_new(ispin, 1)%matrix)
406 diis_step, diis_error, qs_env)
408 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
412 LOGICAL,
INTENT(IN) :: update_p
413 LOGICAL,
INTENT(INOUT) :: diis_step
414 REAL(
dp),
INTENT(INOUT),
OPTIONAL :: diis_error
417 CHARACTER(len=*),
PARAMETER :: routinen =
'do_general_diag_kp'
418 COMPLEX(KIND=dp),
PARAMETER :: cone = cmplx(1.0_dp, 0.0_dp, kind=
dp), &
419 czero = cmplx(0.0_dp, 0.0_dp, kind=
dp), ione = cmplx(0.0_dp, 1.0_dp, kind=
dp)
421 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: coeffs
422 INTEGER :: handle, ib, igroup, ik, ikp, indx, &
423 ispin, jb, kplocal, nb, nkp, &
425 INTEGER,
DIMENSION(2) :: kp_range
426 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
427 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
428 LOGICAL :: do_diis, my_kpgrp, use_real_wfn
429 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
430 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
435 TYPE(
cp_fm_type) :: fmdummy, fmlocal, rksmat, rsmat
436 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: fmwork
437 TYPE(
cp_fm_type),
POINTER :: imos, mo_coeff, rmos
438 TYPE(
dbcsr_type),
POINTER :: cmatrix, rmatrix, tmpmat
446 CALL timeset(routinen, handle)
449 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
450 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_nl, &
451 cell_to_index=cell_to_index)
452 cpassert(
ASSOCIATED(sab_nl))
453 kplocal = kp_range(2) - kp_range(1) + 1
457 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis .AND. .NOT. use_real_wfn &
458 .AND.
PRESENT(diis_error) .AND.
PRESENT(qs_env)) do_diis = .true.
461 ALLOCATE (rmatrix, cmatrix, tmpmat)
462 CALL dbcsr_create(rmatrix, template=matrix_ks(1, 1)%matrix, &
463 matrix_type=dbcsr_type_symmetric)
464 CALL dbcsr_create(cmatrix, template=matrix_ks(1, 1)%matrix, &
465 matrix_type=dbcsr_type_antisymmetric)
466 CALL dbcsr_create(tmpmat, template=matrix_ks(1, 1)%matrix, &
467 matrix_type=dbcsr_type_no_symmetry)
471 fmwork => scf_env%scf_work1
475 CALL mpools_get(mpools, ao_ao_fm_pools=ao_ao_fm_pools)
480 IF (use_real_wfn)
THEN
487 kp => kpoints%kp_env(1)%kpoint_env
488 CALL get_mo_set(kp%mos(1, 1), mo_coeff=mo_coeff)
493 para_env => kpoints%blacs_env_all%para_env
494 nspin =
SIZE(matrix_ks, 1)
495 ALLOCATE (info(kplocal*nspin*nkp_groups, 4))
501 DO igroup = 1, nkp_groups
503 ik = kp_dist(1, igroup) + ikp - 1
504 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
506 IF (use_real_wfn)
THEN
509 CALL rskp_transform(rmatrix=rmatrix, rsmat=matrix_ks, ispin=ispin, &
510 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
516 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
523 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_ks, ispin=ispin, &
524 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
532 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_s, ispin=1, &
533 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
543 IF (use_real_wfn)
THEN
570 CALL get_qs_env(qs_env, para_env=para_env_global)
576 DO igroup = 1, nkp_groups
578 ik = kp_dist(1, igroup) + ikp - 1
579 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
593 kp => kpoints%kp_env(ikp)%kpoint_env
595 ispin, ikp, kplocal, scf_section)
600 ALLOCATE (coeffs(nb))
601 CALL qs_diis_b_step_kp(kpoints%scf_diis_buffer, coeffs, ib, nb, scf_env%iter_delta, diis_error, &
602 diis_step, scf_control%eps_diis, nspin, nkp, kplocal, scf_control%nmixing, &
603 scf_section, para_env_global)
608 kp => kpoints%kp_env(ikp)%kpoint_env
613 CALL cp_cfm_scale_and_add(cone, cksmat, coeffs(jb), kpoints%scf_diis_buffer%param(jb, ispin, ikp))
616 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
617 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
620 scf_control%eps_eigval)
622 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
625 kp%mos(2, ispin)%eigenvalues = eigenvalues
636 DO igroup = 1, nkp_groups
638 ik = kp_dist(1, igroup) + ikp - 1
639 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
642 IF (use_real_wfn)
THEN
660 kp => kpoints%kp_env(ikp)%kpoint_env
661 IF (use_real_wfn)
THEN
662 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=mo_coeff, eigenvalues=eigenvalues)
665 scf_control%eps_eigval)
667 CALL cp_fm_geeig(rksmat, rsmat, mo_coeff, eigenvalues, fmlocal)
670 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
671 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
674 scf_control%eps_eigval)
676 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
679 kp%mos(2, ispin)%eigenvalues = eigenvalues
691 DO igroup = 1, nkp_groups
693 ik = kp_dist(1, igroup) + ikp - 1
694 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
696 IF (use_real_wfn)
THEN
720 matrix_s(1, 1)%matrix, sab_nl, fmwork)
727 IF (use_real_wfn)
THEN
738 CALL timestop(handle)
758 ks_env, scf_section, scf_control)
763 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
769 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_scf_diag_subspace'
770 REAL(kind=
dp),
PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
772 INTEGER :: handle, i, iloop, ispin, nao, nmo, &
775 REAL(
dp) :: ene_diff, ene_old, iter_delta, max_val, &
776 sum_band, sum_val, t1, t2
777 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, mo_occupations
778 TYPE(
cp_1d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: eval_first, occ_first
780 TYPE(
cp_fm_type),
POINTER :: c0, chc, evec, mo_coeff
782 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s, rho_ao
783 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
789 CALL timeset(routinen, handle)
790 NULLIFY (c0, chc, energy, evec, matrix_ks, mo_coeff, mo_eigenvalues, &
791 mo_occupations, dft_control, rho_ao, rho_ao_kp)
799 CALL qs_rho_get(rho, rho_ao=rho_ao, rho_ao_kp=rho_ao_kp)
801 ALLOCATE (eval_first(nspin))
802 ALLOCATE (occ_first(nspin))
806 eigenvalues=mo_eigenvalues, &
807 occupation_numbers=mo_occupations)
808 ALLOCATE (eval_first(ispin)%array(nmo))
809 ALLOCATE (occ_first(ispin)%array(nmo))
810 eval_first(ispin)%array(1:nmo) = mo_eigenvalues(1:nmo)
811 occ_first(ispin)%array(1:nmo) = mo_occupations(1:nmo)
816 CALL dbcsr_copy(subspace_env%p_matrix_store(ispin)%matrix, rho_ao(ispin)%matrix)
817 CALL dbcsr_copy(rho_ao(ispin)%matrix, scf_env%p_mix_new(ispin, 1)%matrix)
820 subspace_env%p_matrix_mix => scf_env%p_mix_new
822 NULLIFY (matrix_ks, energy, para_env, matrix_s)
824 matrix_ks=matrix_ks, &
828 dft_control=dft_control)
832 CALL mixing_allocate(qs_env, subspace_env%mixing_method, scf_env%p_mix_new, &
833 scf_env%p_delta, nspin, subspace_env%mixing_store)
834 IF (dft_control%qs_control%gapw)
THEN
835 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
836 CALL mixing_init(subspace_env%mixing_method, rho, subspace_env%mixing_store, &
837 para_env, rho_atom=rho_atom)
838 ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb)
THEN
840 ELSEIF (dft_control%qs_control%semi_empirical)
THEN
841 cpabort(
'SE Code not possible')
843 CALL mixing_init(subspace_env%mixing_method, rho, subspace_env%mixing_store, para_env)
849 IF (output_unit > 0)
THEN
850 WRITE (output_unit,
"(/T19,A)")
'<<<<<<<<< SUBSPACE ROTATION <<<<<<<<<<'
851 WRITE (output_unit,
"(T4,A,T13,A,T21,A,T38,A,T51,A,T65,A/,T4,A)") &
852 "In-step",
"Time",
"Convergence",
"Band ene.",
"Total ene.",
"Energy diff.", repeat(
"-", 74)
860 DO iloop = 1, subspace_env%max_iter
863 ene_old = energy%total
867 just_energy=.false., print_active=.false.)
872 DO ispin = 1,
SIZE(matrix_ks)
876 eigenvalues=mo_eigenvalues, &
877 occupation_numbers=mo_occupations, &
881 chc => subspace_env%chc_mat(ispin)
882 evec => subspace_env%c_vec(ispin)
883 c0 => subspace_env%c0(ispin)
887 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, rone, c0, work, rzero, chc)
893 CALL parallel_gemm(
'N',
'N', nao, nmo, nmo, rone, c0, evec, rzero, mo_coeff)
896 smear=scf_control%smear)
900 subspace_env%p_matrix_mix(ispin, 1)%matrix)
903 sum_band = sum_band + mo_eigenvalues(i)*mo_occupations(i)
911 scf_env%mixing_store, rho_ao_kp, para_env, iter_delta, iloop)
914 subspace_env%p_matrix_mix, delta=iter_delta)
919 CALL dbcsr_copy(rho_ao(ispin)%matrix, subspace_env%p_matrix_mix(ispin, 1)%matrix)
925 CALL gspace_mixing(qs_env, scf_env%mixing_method, subspace_env%mixing_store, &
926 rho, para_env, scf_env%iter_count)
929 ene_diff = energy%total - ene_old
930 converged = (abs(ene_diff) < subspace_env%eps_ene .AND. &
931 iter_delta < subspace_env%eps_adapt*scf_env%iter_delta)
933 IF (output_unit > 0)
THEN
934 WRITE (output_unit,
"(T4,I5,T11,F8.3,T18,E14.4,T34,F12.5,T46,F16.8,T62,E14.4)") &
935 iloop, t2 - t1, iter_delta, sum_band, energy%total, ene_diff
939 IF (output_unit > 0)
WRITE (output_unit,
"(T10,A,I6,A,/)") &
940 " Reached convergence in ", iloop,
" iterations "
946 NULLIFY (subspace_env%p_matrix_mix)
949 CALL dbcsr_copy(scf_env%p_mix_new(ispin, 1)%matrix, rho_ao(ispin)%matrix)
950 CALL dbcsr_copy(rho_ao(ispin)%matrix, subspace_env%p_matrix_store(ispin)%matrix)
952 DEALLOCATE (eval_first(ispin)%array, occ_first(ispin)%array)
954 DEALLOCATE (eval_first, occ_first)
956 CALL timestop(handle)
972 CHARACTER(LEN=*),
PARAMETER :: routinen =
'diag_subspace_allocate'
974 INTEGER :: handle, i, ispin, nmo, nspin
981 CALL timeset(routinen, handle)
983 NULLIFY (sab_orb, matrix_s)
984 CALL get_qs_env(qs_env=qs_env, sab_orb=sab_orb, &
989 IF (.NOT.
ASSOCIATED(subspace_env%p_matrix_store))
THEN
993 ALLOCATE (subspace_env%p_matrix_store(i)%matrix)
994 CALL dbcsr_create(matrix=subspace_env%p_matrix_store(i)%matrix, template=matrix_s(1)%matrix, &
995 name=
"DENSITY_STORE", matrix_type=dbcsr_type_symmetric)
998 CALL dbcsr_set(subspace_env%p_matrix_store(i)%matrix, 0.0_dp)
1003 ALLOCATE (subspace_env%chc_mat(nspin))
1004 ALLOCATE (subspace_env%c_vec(nspin))
1005 ALLOCATE (subspace_env%c0(nspin))
1008 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1009 CALL cp_fm_create(subspace_env%c0(ispin), mo_coeff%matrix_struct)
1010 NULLIFY (fm_struct_tmp)
1012 para_env=mo_coeff%matrix_struct%para_env, &
1013 context=mo_coeff%matrix_struct%context)
1014 CALL cp_fm_create(subspace_env%chc_mat(ispin), fm_struct_tmp,
"chc")
1015 CALL cp_fm_create(subspace_env%c_vec(ispin), fm_struct_tmp,
"vec")
1019 CALL timestop(handle)
1036 scf_section, diis_step)
1039 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1043 LOGICAL,
INTENT(INOUT) :: diis_step
1045 INTEGER :: ispin, nspin
1046 LOGICAL :: do_level_shift, use_jacobi
1047 REAL(kind=
dp) :: diis_error
1049 nspin =
SIZE(matrix_ks)
1054 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis)
THEN
1055 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
1056 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
1057 scf_control%eps_diis, scf_control%nmixing, &
1058 scf_section=scf_section)
1063 IF ((scf_env%iter_count > 1) .AND. (scf_env%iter_delta < scf_control%diagonalization%eps_jacobi))
THEN
1066 use_jacobi = .false.
1069 do_level_shift = ((scf_control%level_shift /= 0.0_dp) .AND. &
1070 ((scf_control%density_guess ==
core_guess) .OR. (scf_env%iter_count > 1)))
1072 scf_env%iter_param = diis_error
1073 IF (use_jacobi)
THEN
1074 scf_env%iter_method =
"DIIS/Jacobi"
1076 scf_env%iter_method =
"DIIS/Diag."
1079 IF (scf_env%mixing_method == 1)
THEN
1080 scf_env%iter_param = scf_env%p_mix_alpha
1081 IF (use_jacobi)
THEN
1082 scf_env%iter_method =
"P_Mix/Jacobi"
1084 scf_env%iter_method =
"P_Mix/Diag."
1086 ELSEIF (scf_env%mixing_method > 1)
THEN
1087 scf_env%iter_param = scf_env%mixing_store%alpha
1088 IF (use_jacobi)
THEN
1089 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Jacobi"
1091 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
1095 scf_env%iter_delta = 0.0_dp
1099 mo_set=mos(ispin), &
1100 work=scf_env%scf_work2, &
1101 do_level_shift=do_level_shift, &
1102 level_shift=scf_control%level_shift, &
1103 use_jacobi=use_jacobi, &
1104 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
1108 smear=scf_control%smear)
1113 scf_env%p_mix_new(ispin, 1)%matrix)
1132 scf_control, scf_section, diis_step)
1135 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1136 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
1139 LOGICAL,
INTENT(INOUT) :: diis_step
1141 INTEGER :: homo, ispin, nmo, nspin
1142 REAL(kind=
dp) :: diis_error, eps_iter
1143 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
1146 NULLIFY (eigenvalues)
1148 nspin =
SIZE(matrix_ks)
1152 scf_env%scf_work1(ispin))
1155 IF ((scf_env%iter_count > 1) .AND. (.NOT. scf_env%skip_diis))
THEN
1156 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
1157 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
1158 scf_control%eps_diis, scf_control%nmixing, &
1159 s_matrix=matrix_s, &
1160 scf_section=scf_section)
1165 eps_iter = scf_control%diagonalization%eps_iter
1167 scf_env%iter_param = diis_error
1168 scf_env%iter_method =
"DIIS/OTdiag"
1171 matrix_ks(ispin)%matrix, keep_sparsity=.true.)
1173 eps_iter = max(eps_iter, scf_control%diagonalization%eps_adapt*diis_error)
1175 IF (scf_env%mixing_method == 1)
THEN
1176 scf_env%iter_param = scf_env%p_mix_alpha
1177 scf_env%iter_method =
"P_Mix/OTdiag."
1178 ELSEIF (scf_env%mixing_method > 1)
THEN
1179 scf_env%iter_param = scf_env%mixing_store%alpha
1180 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/OTdiag."
1184 scf_env%iter_delta = 0.0_dp
1188 mo_coeff=mo_coeff, &
1189 eigenvalues=eigenvalues, &
1193 matrix_s=matrix_s(1)%matrix, &
1194 matrix_c_fm=mo_coeff, &
1196 eps_gradient=eps_iter, &
1197 iter_max=scf_control%diagonalization%max_iter, &
1199 ot_settings=scf_control%diagonalization%ot_settings)
1201 evals_arg=eigenvalues, &
1204 mos(ispin)%mo_coeff_b)
1209 smear=scf_control%smear)
1214 scf_env%p_mix_new(ispin, 1)%matrix)
1237 scf_control, scf_section, diis_step, &
1245 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
1246 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
1249 LOGICAL,
INTENT(INOUT) :: diis_step
1250 LOGICAL,
INTENT(IN) :: orthogonal_basis
1252 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_roks_diag'
1254 INTEGER :: handle, homoa, homob, imo, nalpha, nao, &
1256 REAL(kind=
dp) :: diis_error, level_shift_loc
1257 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eiga, eigb, occa, occb
1258 TYPE(
cp_fm_type),
POINTER :: ksa, ksb, mo2ao, moa, mob, ortho, work
1262 CALL timeset(routinen, handle)
1265 ortho => scf_env%ortho_m1
1267 ortho => scf_env%ortho
1269 work => scf_env%scf_work2
1271 ksa => scf_env%scf_work1(1)
1272 ksb => scf_env%scf_work1(2)
1285 occupation_numbers=occa, &
1292 occupation_numbers=occb, &
1297 IF ((scf_control%level_shift /= 0.0_dp) .AND. &
1298 ((scf_control%density_guess ==
core_guess) .OR. &
1300 (scf_env%iter_count > 1)))
THEN
1301 level_shift_loc = scf_control%level_shift
1303 level_shift_loc = 0.0_dp
1306 IF ((scf_env%iter_count > 1) .OR. &
1307 (scf_control%density_guess ==
core_guess) .OR. &
1313 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksa, moa, 0.0_dp, work)
1314 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksa)
1316 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksb, moa, 0.0_dp, work)
1317 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksb)
1328 cpabort(
"Unknown ROKS scheme requested")
1334 IF (orthogonal_basis)
THEN
1347 CALL parallel_gemm(
"N",
"T", nao, nao, nao, 1.0_dp, ksa, mo2ao, 0.0_dp, work)
1348 CALL parallel_gemm(
"N",
"N", nao, nao, nao, 1.0_dp, mo2ao, work, 0.0_dp, ksa)
1362 IF (scf_env%iter_count > 1)
THEN
1363 IF (orthogonal_basis)
THEN
1366 kc=scf_env%scf_work1, &
1368 delta=scf_env%iter_delta, &
1369 error_max=diis_error, &
1370 diis_step=diis_step, &
1371 eps_diis=scf_control%eps_diis, &
1372 scf_section=scf_section, &
1374 cpassert(scf_env%iter_delta == scf_env%iter_delta)
1378 kc=scf_env%scf_work1, &
1380 delta=scf_env%iter_delta, &
1381 error_max=diis_error, &
1382 diis_step=diis_step, &
1383 eps_diis=scf_control%eps_diis, &
1384 scf_section=scf_section, &
1385 s_matrix=matrix_s, &
1391 scf_env%iter_param = diis_error
1392 scf_env%iter_method =
"DIIS/Diag."
1394 IF (scf_env%mixing_method == 1)
THEN
1395 scf_env%iter_param = scf_env%p_mix_alpha
1396 scf_env%iter_method =
"P_Mix/Diag."
1397 ELSEIF (scf_env%mixing_method > 1)
THEN
1398 scf_env%iter_param = scf_env%mixing_store%alpha
1399 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
1403 scf_env%iter_delta = 0.0_dp
1405 IF (level_shift_loc /= 0.0_dp)
THEN
1410 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksa, moa, 0.0_dp, work)
1411 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksa)
1415 DO imo = homob + 1, homoa
1418 DO imo = homoa + 1, nmo
1422 ELSE IF (.NOT. orthogonal_basis)
THEN
1425 SELECT CASE (scf_env%cholesky_method)
1431 "SOLVE", pos=
"RIGHT")
1433 "SOLVE", pos=
"LEFT", transa=
"T")
1437 "MULTIPLY", pos=
"RIGHT")
1439 "MULTIPLY", pos=
"LEFT", transa=
"T")
1441 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksa, ortho, 0.0_dp, work)
1442 CALL parallel_gemm(
"N",
"N", nao, nao, nao, 1.0_dp, ortho, work, 0.0_dp, ksa)
1453 IF (level_shift_loc /= 0.0_dp)
THEN
1456 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, moa)
1458 IF (orthogonal_basis)
THEN
1461 SELECT CASE (scf_env%cholesky_method)
1467 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, moa)
1474 IF (level_shift_loc /= 0.0_dp)
THEN
1475 DO imo = homob + 1, homoa
1476 eiga(imo) = eiga(imo) - 0.5_dp*level_shift_loc
1478 DO imo = homoa + 1, nmo
1479 eiga(imo) = eiga(imo) - level_shift_loc
1494 CALL timestop(handle)
1512 scf_control, scf_section, check_moconv_only)
1515 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1519 LOGICAL,
INTENT(IN),
OPTIONAL :: check_moconv_only
1521 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_block_krylov_diag'
1522 REAL(kind=
dp),
PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
1524 INTEGER :: handle, homo, ispin, iter, nao, nmo, &
1526 LOGICAL :: converged, my_check_moconv_only
1527 REAL(
dp) :: eps_iter, t1, t2
1528 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
1529 TYPE(
cp_fm_type),
POINTER :: c0, c1, chc, evec, ks, mo_coeff, ortho, &
1534 CALL timeset(routinen, handle)
1537 extension=
".scfLog")
1539 my_check_moconv_only = .false.
1540 IF (
PRESENT(check_moconv_only)) my_check_moconv_only = check_moconv_only
1542 NULLIFY (mo_coeff, ortho, work, ks)
1543 NULLIFY (mo_eigenvalues)
1547 ortho => scf_env%ortho_m1
1549 ortho => scf_env%ortho
1551 work => scf_env%scf_work2
1553 DO ispin = 1,
SIZE(matrix_ks)
1555 scf_env%scf_work1(ispin))
1558 IF (scf_env%mixing_method == 1)
THEN
1559 scf_env%iter_param = scf_env%p_mix_alpha
1560 scf_env%iter_method =
"P_Mix/Lanczos"
1563 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Lanc."
1566 DO ispin = 1,
SIZE(matrix_ks)
1568 ks => scf_env%scf_work1(ispin)
1575 eigenvalues=mo_eigenvalues, &
1579 c0 => scf_env%krylov_space%mo_conv(ispin)
1580 c1 => scf_env%krylov_space%mo_refine(ispin)
1581 SELECT CASE (scf_env%cholesky_method)
1588 "SOLVE", pos=
"RIGHT")
1590 "SOLVE", pos=
"LEFT", transa=
"T")
1594 "MULTIPLY", pos=
"RIGHT")
1596 "MULTIPLY", pos=
"LEFT", transa=
"T")
1600 scf_env%krylov_space%nmo_nc = nmo
1601 scf_env%krylov_space%nmo_conv = 0
1604 IF (output_unit > 0)
THEN
1605 WRITE (output_unit,
"(/T15,A)")
'<<<<<<<<< LANCZOS REFINEMENT <<<<<<<<<<'
1606 WRITE (output_unit,
"(T8,A,T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
1607 " Spin ",
" Cycle ", &
1608 " conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
1610 eps_iter = max(scf_env%krylov_space%eps_conv, scf_env%krylov_space%eps_adapt*scf_env%iter_delta)
1614 IF (my_check_moconv_only)
THEN
1617 nao, eps_iter, ispin, check_moconv_only=my_check_moconv_only)
1619 IF (output_unit > 0) &
1620 WRITE (output_unit,
'(T8,I3,T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1621 ispin, iter, scf_env%krylov_space%nmo_conv, &
1622 scf_env%krylov_space%max_res_norm, scf_env%krylov_space%min_res_norm, t2 - t1
1627 DO iter = 1, scf_env%krylov_space%max_iter
1629 nao, eps_iter, ispin)
1631 IF (output_unit > 0)
THEN
1632 WRITE (output_unit,
'(T8,I3,T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1633 ispin, iter, scf_env%krylov_space%nmo_conv, &
1634 scf_env%krylov_space%max_res_norm, scf_env%krylov_space%min_res_norm, t2 - t1
1637 IF (scf_env%krylov_space%max_res_norm < eps_iter)
THEN
1639 IF (output_unit > 0)
WRITE (output_unit, *) &
1640 " Reached convergence in ", iter,
" iterations "
1645 IF (.NOT. converged .AND. output_unit > 0)
THEN
1646 WRITE (output_unit,
"(T4, A)")
" WARNING Lanczos refinement could "// &
1647 "not converge all the mos:"
1648 WRITE (output_unit,
"(T40,A,T70,I10)")
" number of not converged mos ", &
1649 scf_env%krylov_space%nmo_nc
1650 WRITE (output_unit,
"(T40,A,T70,E10.2)")
" max norm of the residual ", &
1651 scf_env%krylov_space%max_res_norm
1659 chc => scf_env%krylov_space%chc_mat(ispin)
1660 evec => scf_env%krylov_space%c_vec(ispin)
1661 CALL parallel_gemm(
'N',
'N', nao, nmo, nao, rone, ks, c0, rzero, work)
1662 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, rone, c0, work, rzero, chc)
1666 CALL parallel_gemm(
'N',
'N', nao, nmo, nmo, rone, c0, evec, rzero, c1)
1667 c0 => scf_env%krylov_space%mo_refine(ispin)
1677 smear=scf_control%smear)
1681 scf_env%p_mix_new(ispin, 1)%matrix)
1685 IF (output_unit > 0)
THEN
1686 WRITE (output_unit,
"(T15,A/)")
'<<<<<<<<< END LANCZOS REFINEMENT <<<<<<<<<<'
1692 CALL timestop(handle)
1712 scf_control, scf_section, check_moconv_only)
1716 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1717 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
1720 LOGICAL,
INTENT(IN),
OPTIONAL :: check_moconv_only
1722 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_block_davidson_diag'
1724 INTEGER :: handle, ispin, nspins, output_unit
1725 LOGICAL :: do_prec, my_check_moconv_only
1729 CALL timeset(routinen, handle)
1732 extension=
".scfLog")
1734 IF (output_unit > 0) &
1735 WRITE (output_unit,
"(/T15,A)")
'<<<<<<<<< DAVIDSON ITERATIONS <<<<<<<<<<'
1737 IF (scf_env%mixing_method == 1)
THEN
1738 scf_env%iter_param = scf_env%p_mix_alpha
1739 scf_env%iter_method =
"P_Mix/Dav."
1741 scf_env%iter_param = scf_env%mixing_store%alpha
1742 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Dav."
1745 my_check_moconv_only = .false.
1746 IF (
PRESENT(check_moconv_only)) my_check_moconv_only = check_moconv_only
1748 IF (scf_env%block_davidson_env(1)%prec_type /= 0 .AND. &
1749 scf_env%iter_count >= scf_env%block_davidson_env(1)%first_prec)
THEN
1753 nspins =
SIZE(matrix_ks)
1755 IF (do_prec .AND. (scf_env%iter_count == scf_env%block_davidson_env(1)%first_prec .OR. &
1756 modulo(scf_env%iter_count, scf_env%block_davidson_env(1)%niter_new_prec) == 0))
THEN
1758 prec_type=scf_env%block_davidson_env(1)%prec_type, nspins=nspins)
1760 scf_env%block_davidson_env(1)%prec_type, &
1761 scf_env%block_davidson_env(1)%solver_type, &
1762 scf_env%block_davidson_env(1)%energy_gap, nspins, &
1763 convert_to_dbcsr=scf_env%block_davidson_env(1)%use_sparse_mos, &
1767 DO ispin = 1, nspins
1768 IF (scf_env%block_davidson_env(ispin)%use_sparse_mos)
THEN
1769 IF (.NOT. do_prec)
THEN
1771 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit)
1774 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit, &
1775 scf_env%ot_preconditioner(ispin)%preconditioner)
1779 IF (.NOT. do_prec)
THEN
1781 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit)
1784 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit, &
1785 scf_env%ot_preconditioner(ispin)%preconditioner)
1791 smear=scf_control%smear)
1793 DO ispin = 1, nspins
1796 scf_env%p_mix_new(ispin, 1)%matrix)
1799 IF (output_unit > 0)
THEN
1800 WRITE (output_unit,
"(T15,A/)")
'<<<<<<<<< END DAVIDSON ITERATION <<<<<<<<<<'
1806 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....
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Basic linear algebra operations for complex full matrices.
subroutine, public cp_cfm_scale_and_add(alpha, matrix_a, beta, matrix_b)
Scale and add two BLACS matrices (a = alpha*a + beta*b).
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...
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
subroutine, public cp_cfm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical orthogonalization.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_create(matrix, matrix_struct, name)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_release(matrix)
Releases 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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
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_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
...
subroutine, public cp_fm_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, computes the corresponding full 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_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE Single option version: Cholesky decomposition of B.
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...
subroutine, public cp_fm_geeig_canon(amatrix, bmatrix, eigenvectors, eigenvalues, work, epseig)
General Eigenvalue Problem AX = BXE Use canonical diagonalization : U*s**(-1/2)
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
subroutine, public fm_pool_give_back_fm(pool, element)
returns the element to the 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_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_start_copy_general(source, destination, para_env, info)
Initiates the copy operation: get distribution data, post MPI isend and irecvs.
subroutine, public cp_fm_cleanup_copy_general(info)
Completes the copy operation: wait for comms clean up MPI state.
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_add_to_element(matrix, irow_global, icol_global, alpha)
...
subroutine, public cp_fm_finish_copy_general(destination, info)
Completes the copy operation: wait for comms, unpack, clean up MPI state.
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,...
Defines the basic variable types.
integer, parameter, public dp
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
subroutine, public kpoint_density_transform(kpoint, denmat, wtype, tempmat, sab_nl, fmwork, for_aux_fit, pmat_ext)
generate real space density matrices in DBCSR format
subroutine, public kpoint_density_matrices(kpoint, energy_weighted, for_aux_fit)
Calculate kpoint density matrices (rho(k), owned by kpoint groups)
subroutine, public kpoint_set_mo_occupation(kpoint, smear)
Given the eigenvalues of all kpoints, calculates the occupation numbers.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym)
Retrieve information from a kpoint environment.
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
computes preconditioners, and implements methods to apply them currently used in qs_ot
subroutine, public restart_preconditioner(qs_env, preconditioner, prec_type, nspins)
Allows for a restart of the preconditioner depending on the method it purges all arrays or keeps them...
subroutine, public prepare_preconditioner(qs_env, mos, matrix_ks, matrix_s, ot_preconditioner, prec_type, solver_type, energy_gap, nspins, has_unit_metric, convert_to_dbcsr, chol_type, full_mo_set)
...
collects routines that calculate density matrices
module that contains the definitions of the scf types
integer, parameter, public direct_mixing_nr
integer, parameter, public gspace_mixing_nr
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.
subroutine, public qs_diis_b_calc_err_kp(diis_buffer, ib, mos, kc, sc, ispin, ikp, nkp_local, scf_section)
Calculate and store the error for a given k-point.
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)
Update the SCF DIIS buffer, and if appropriate does a diis step, 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.
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 gspace_mixing(qs_env, mixing_method, mixing_store, rho, para_env, iter_count)
Driver for the g-space mixing, calls the proper routine given the requested method.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
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
subroutine, public self_consistency_check(rho_ao, p_delta, para_env, p_out, delta)
...
collects routines that perform operations directly related to MOs
Set occupation of molecular orbitals.
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.
Define the neighbor list data types and the corresponding functionality.
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
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...
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...
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)
...
Different diagonalization schemes that can be used for the iterative solution of the eigenvalue probl...
subroutine, public general_eigenproblem(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization with S matrix basically, in goes the ks matrix out...
subroutine, public diag_subspace_allocate(subspace_env, qs_env, mos)
...
subroutine, public do_ot_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
the inner loop of scf, specific to iterative diagonalization using OT with S matrix; basically,...
subroutine, public do_block_davidson_diag(qs_env, scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block davidson space approach
subroutine, public do_roks_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step, orthogonal_basis)
Solve a set restricted open Kohn-Sham (ROKS) equations based on the alpha and beta Kohn-Sham matrices...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
subroutine, public do_scf_diag_subspace(qs_env, scf_env, subspace_env, mos, rho, ks_env, scf_section, scf_control)
inner loop within MOS subspace, to refine occupation and density, before next diagonalization of the ...
subroutine, public do_block_krylov_diag(scf_env, mos, matrix_ks, scf_control, scf_section, check_moconv_only)
iterative diagonalization using the block Krylov-space approach
subroutine, public do_special_diag(scf_env, mos, matrix_ks, scf_control, scf_section, diis_step)
the inner loop of scf, specific to diagonalization without S matrix basically, in goes the ks matrix ...
subroutine, public do_general_diag(scf_env, mos, matrix_ks, matrix_s, scf_control, scf_section, diis_step)
...
module that contains the algorithms to perform an itrative diagonalization by the block-Lanczos appro...
subroutine, public lanczos_refinement(krylov_space, ks, c0, c1, eval, nao, eps_iter, ispin, check_moconv_only)
lanczos refinement by blocks of not-converged MOs
subroutine, public lanczos_refinement_2v(krylov_space, ks, c0, c1, eval, nao, eps_iter, ispin, check_moconv_only)
...
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public eigensolver_simple(matrix_ks, mo_set, work, do_level_shift, level_shift, use_jacobi, jacobi_threshold)
...
subroutine, public eigensolver_dbcsr(matrix_ks, matrix_ks_fm, mo_set, ortho_dbcsr, ksbuf1, ksbuf2)
...
subroutine, public scf_env_density_mixing(p_mix_new, mixing_store, rho_ao, para_env, iter_delta, iter_count, diis, invert)
perform (if requested) a density mixing
subroutine, public eigensolver(matrix_ks_fm, mo_set, ortho, work, cholesky_method, do_level_shift, level_shift, matrix_u_fm, use_jacobi)
Diagonalise the Kohn-Sham matrix to get a new set of MO eigen- vectors and MO eigenvalues....
subroutine, public eigensolver_symm(matrix_ks_fm, mo_set, ortho, work, do_level_shift, level_shift, matrix_u_fm, use_jacobi, jacobi_threshold, ortho_red, work_red, matrix_ks_fm_red, matrix_u_fm_red)
...
module that contains the definitions of the scf types
parameters that control an scf iteration
represent a pointer to a 1d array
Represent a complex full matrix.
to create arrays of pools
keeps the information about the structure of a full matrix
Stores the state of a copy between cp_fm_start_copy_general and cp_fm_finish_copy_general.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Keeps information about a specific k-point.
Contains information about kpoints.
stores all the informations relevant to an mpi environment
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
container for the pools of matrixes used by qs
keeps the density in various representations, keeping track of which ones are valid.