121#include "./base/base_uses.f90"
127 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_diagonalization'
150 matrix_s, scf_control, scf_section, &
155 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
158 LOGICAL,
INTENT(INOUT) :: diis_step
160 INTEGER :: ispin, nspin
161 LOGICAL :: do_level_shift, owns_ortho, use_jacobi
162 REAL(kind=
dp) :: diis_error, eps_diis
166 nspin =
SIZE(matrix_ks)
167 NULLIFY (ortho, ortho_dbcsr)
171 scf_env%scf_work1(ispin))
174 eps_diis = scf_control%eps_diis
176 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis)
THEN
177 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
178 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
179 eps_diis, scf_control%nmixing, &
181 scf_section=scf_section)
186 do_level_shift = ((scf_control%level_shift /= 0.0_dp) .AND. &
187 ((scf_control%density_guess ==
core_guess) .OR. &
188 (scf_env%iter_count > 1)))
190 IF ((scf_env%iter_count > 1) .AND. &
191 (scf_env%iter_delta < scf_control%diagonalization%eps_jacobi))
THEN
198 scf_env%iter_param = diis_error
200 scf_env%iter_method =
"DIIS/Jacobi"
202 scf_env%iter_method =
"DIIS/Diag."
205 IF (scf_env%mixing_method == 0)
THEN
206 scf_env%iter_method =
"NoMix/Diag."
207 ELSE IF (scf_env%mixing_method == 1)
THEN
208 scf_env%iter_param = scf_env%p_mix_alpha
210 scf_env%iter_method =
"P_Mix/Jacobi"
212 scf_env%iter_method =
"P_Mix/Diag."
214 ELSEIF (scf_env%mixing_method > 1)
THEN
215 scf_env%iter_param = scf_env%mixing_store%alpha
217 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Jacobi"
219 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
225 ortho_dbcsr => scf_env%ortho_dbcsr
227 CALL eigensolver_dbcsr(matrix_ks=matrix_ks(ispin)%matrix, matrix_ks_fm=scf_env%scf_work1(ispin), &
229 ortho_dbcsr=ortho_dbcsr, &
230 ksbuf1=scf_env%buf1_dbcsr, ksbuf2=scf_env%buf2_dbcsr)
235 ortho => scf_env%ortho_m1
237 ortho => scf_env%ortho
241 IF (.NOT.
ASSOCIATED(ortho))
THEN
247 IF (do_level_shift)
THEN
248 CALL eigensolver(matrix_ks_fm=scf_env%scf_work1(ispin), &
251 work=scf_env%scf_work2, &
252 cholesky_method=scf_env%cholesky_method, &
253 do_level_shift=do_level_shift, &
254 level_shift=scf_control%level_shift, &
255 matrix_u_fm=scf_env%ortho, &
256 use_jacobi=use_jacobi)
258 CALL eigensolver(matrix_ks_fm=scf_env%scf_work1(ispin), &
261 work=scf_env%scf_work2, &
262 cholesky_method=scf_env%cholesky_method, &
263 do_level_shift=do_level_shift, &
264 level_shift=scf_control%level_shift, &
265 use_jacobi=use_jacobi)
269 IF (owns_ortho)
DEALLOCATE (ortho)
271 ortho => scf_env%ortho
274 IF (.NOT.
ASSOCIATED(ortho))
THEN
279 IF (do_level_shift)
THEN
281 IF (
ASSOCIATED(scf_env%scf_work1_red) .AND.
ASSOCIATED(scf_env%scf_work2_red) &
282 .AND.
ASSOCIATED(scf_env%ortho_red) .AND.
ASSOCIATED(scf_env%ortho_m1_red))
THEN
286 work=scf_env%scf_work2, &
287 do_level_shift=do_level_shift, &
288 level_shift=scf_control%level_shift, &
289 matrix_u_fm=scf_env%ortho_m1, &
290 use_jacobi=use_jacobi, &
291 jacobi_threshold=scf_control%diagonalization%jacobi_threshold, &
292 matrix_ks_fm_red=scf_env%scf_work1_red(ispin), &
293 ortho_red=scf_env%ortho_red, &
294 work_red=scf_env%scf_work2_red, &
295 matrix_u_fm_red=scf_env%ortho_m1_red)
300 work=scf_env%scf_work2, &
301 do_level_shift=do_level_shift, &
302 level_shift=scf_control%level_shift, &
303 matrix_u_fm=scf_env%ortho_m1, &
304 use_jacobi=use_jacobi, &
305 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
310 IF (
ASSOCIATED(scf_env%scf_work1_red) .AND.
ASSOCIATED(scf_env%scf_work2_red) &
311 .AND.
ASSOCIATED(scf_env%ortho_red))
THEN
315 work=scf_env%scf_work2, &
316 do_level_shift=do_level_shift, &
317 level_shift=scf_control%level_shift, &
318 use_jacobi=use_jacobi, &
319 jacobi_threshold=scf_control%diagonalization%jacobi_threshold, &
320 matrix_ks_fm_red=scf_env%scf_work1_red(ispin), &
321 ortho_red=scf_env%ortho_red, &
322 work_red=scf_env%scf_work2_red)
327 work=scf_env%scf_work2, &
328 do_level_shift=do_level_shift, &
329 level_shift=scf_control%level_shift, &
330 use_jacobi=use_jacobi, &
331 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
336 IF (owns_ortho)
DEALLOCATE (ortho)
353 matrix_s, scf_control, scf_section, &
357 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
358 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
361 LOGICAL,
INTENT(INOUT) :: diis_step
365 INTEGER :: ispin, nspin
366 REAL(kind=
dp) :: total_zeff_corr
368 nspin =
SIZE(matrix_ks)
371 matrix_s, scf_control, scf_section, diis_step)
373 total_zeff_corr = 0.0_dp
374 total_zeff_corr = scf_env%sum_zeff_corr
376 IF (abs(total_zeff_corr) > 0.0_dp)
THEN
378 smear=scf_control%smear, tot_zeff_corr=total_zeff_corr)
380 IF (
PRESENT(probe) .EQV. .true.)
THEN
381 scf_control%smear%do_smear = .false.
383 smear=scf_control%smear, &
387 smear=scf_control%smear)
393 scf_env%p_mix_new(ispin, 1)%matrix)
418 diis_step, diis_error, qs_env, probe)
420 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_s
424 LOGICAL,
INTENT(IN) :: update_p
425 LOGICAL,
INTENT(INOUT) :: diis_step
426 REAL(
dp),
INTENT(INOUT),
OPTIONAL :: diis_error
431 CHARACTER(len=*),
PARAMETER :: routinen =
'do_general_diag_kp'
432 COMPLEX(KIND=dp),
PARAMETER :: cone = cmplx(1.0_dp, 0.0_dp, kind=
dp), &
433 czero = cmplx(0.0_dp, 0.0_dp, kind=
dp), ione = cmplx(0.0_dp, 1.0_dp, kind=
dp)
435 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:) :: coeffs
436 INTEGER :: handle, ib, igroup, ik, ikp, indx, &
437 ispin, jb, kplocal, nb, nkp, &
439 INTEGER,
DIMENSION(2) :: kp_range
440 INTEGER,
DIMENSION(:, :),
POINTER :: kp_dist
441 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
442 LOGICAL :: do_diis, my_kpgrp, use_real_wfn
443 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
444 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: xkp
449 TYPE(
cp_fm_type) :: fmdummy, fmlocal, rksmat, rsmat
450 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: fmwork
451 TYPE(
cp_fm_type),
POINTER :: imos, mo_coeff, rmos
452 TYPE(
dbcsr_type),
POINTER :: cmatrix, rmatrix, tmpmat
460 CALL timeset(routinen, handle)
463 CALL get_kpoint_info(kpoints, nkp=nkp, xkp=xkp, use_real_wfn=use_real_wfn, kp_range=kp_range, &
464 nkp_groups=nkp_groups, kp_dist=kp_dist, sab_nl=sab_nl, &
465 cell_to_index=cell_to_index)
466 cpassert(
ASSOCIATED(sab_nl))
467 kplocal = kp_range(2) - kp_range(1) + 1
471 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis .AND. .NOT. use_real_wfn &
472 .AND.
PRESENT(diis_error) .AND.
PRESENT(qs_env)) do_diis = .true.
475 ALLOCATE (rmatrix, cmatrix, tmpmat)
476 CALL dbcsr_create(rmatrix, template=matrix_ks(1, 1)%matrix, &
477 matrix_type=dbcsr_type_symmetric)
478 CALL dbcsr_create(cmatrix, template=matrix_ks(1, 1)%matrix, &
479 matrix_type=dbcsr_type_antisymmetric)
480 CALL dbcsr_create(tmpmat, template=matrix_ks(1, 1)%matrix, &
481 matrix_type=dbcsr_type_no_symmetry)
485 fmwork => scf_env%scf_work1
489 CALL mpools_get(mpools, ao_ao_fm_pools=ao_ao_fm_pools)
494 IF (use_real_wfn)
THEN
501 kp => kpoints%kp_env(1)%kpoint_env
502 CALL get_mo_set(kp%mos(1, 1), mo_coeff=mo_coeff)
507 para_env => kpoints%blacs_env_all%para_env
508 nspin =
SIZE(matrix_ks, 1)
509 ALLOCATE (info(kplocal*nspin*nkp_groups, 4))
515 DO igroup = 1, nkp_groups
517 ik = kp_dist(1, igroup) + ikp - 1
518 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
520 IF (use_real_wfn)
THEN
523 CALL rskp_transform(rmatrix=rmatrix, rsmat=matrix_ks, ispin=ispin, &
524 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
530 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
537 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_ks, ispin=ispin, &
538 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
546 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=matrix_s, ispin=1, &
547 xkp=xkp(1:3, ik), cell_to_index=cell_to_index, sab_nl=sab_nl)
557 IF (use_real_wfn)
THEN
584 CALL get_qs_env(qs_env, para_env=para_env_global)
590 DO igroup = 1, nkp_groups
592 ik = kp_dist(1, igroup) + ikp - 1
593 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
607 kp => kpoints%kp_env(ikp)%kpoint_env
609 ispin, ikp, kplocal, scf_section)
614 ALLOCATE (coeffs(nb))
615 CALL qs_diis_b_step_kp(kpoints%scf_diis_buffer, coeffs, ib, nb, scf_env%iter_delta, diis_error, &
616 diis_step, scf_control%eps_diis, nspin, nkp, kplocal, scf_control%nmixing, &
617 scf_section, para_env_global)
622 kp => kpoints%kp_env(ikp)%kpoint_env
627 CALL cp_cfm_scale_and_add(cone, cksmat, coeffs(jb), kpoints%scf_diis_buffer%param(jb, ispin, ikp))
630 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
631 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
634 scf_control%eps_eigval)
636 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
639 kp%mos(2, ispin)%eigenvalues = eigenvalues
650 DO igroup = 1, nkp_groups
652 ik = kp_dist(1, igroup) + ikp - 1
653 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
656 IF (use_real_wfn)
THEN
674 kp => kpoints%kp_env(ikp)%kpoint_env
675 IF (use_real_wfn)
THEN
676 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=mo_coeff, eigenvalues=eigenvalues)
679 scf_control%eps_eigval)
681 CALL cp_fm_geeig(rksmat, rsmat, mo_coeff, eigenvalues, fmlocal)
684 CALL get_mo_set(kp%mos(1, ispin), mo_coeff=rmos, eigenvalues=eigenvalues)
685 CALL get_mo_set(kp%mos(2, ispin), mo_coeff=imos)
688 scf_control%eps_eigval)
690 CALL cp_cfm_geeig(cksmat, csmat, cmos, eigenvalues, cwork)
693 kp%mos(2, ispin)%eigenvalues = eigenvalues
705 DO igroup = 1, nkp_groups
707 ik = kp_dist(1, igroup) + ikp - 1
708 my_kpgrp = (ik >= kpoints%kp_range(1) .AND. ik <= kpoints%kp_range(2))
710 IF (use_real_wfn)
THEN
728 IF (
PRESENT(probe) .EQV. .true.)
THEN
729 scf_control%smear%do_smear = .false.
739 matrix_s(1, 1)%matrix, sab_nl, fmwork)
746 IF (use_real_wfn)
THEN
757 CALL timestop(handle)
777 ks_env, scf_section, scf_control)
782 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
788 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_scf_diag_subspace'
789 REAL(kind=
dp),
PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
791 INTEGER :: handle, i, iloop, ispin, nao, nmo, &
794 REAL(
dp) :: ene_diff, ene_old, iter_delta, max_val, &
795 sum_band, sum_val, t1, t2
796 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, mo_occupations
797 TYPE(
cp_1d_r_p_type),
ALLOCATABLE,
DIMENSION(:) :: eval_first, occ_first
799 TYPE(
cp_fm_type),
POINTER :: c0, chc, evec, mo_coeff
801 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s, rho_ao
802 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
808 CALL timeset(routinen, handle)
809 NULLIFY (c0, chc, energy, evec, matrix_ks, mo_coeff, mo_eigenvalues, &
810 mo_occupations, dft_control, rho_ao, rho_ao_kp)
818 CALL qs_rho_get(rho, rho_ao=rho_ao, rho_ao_kp=rho_ao_kp)
820 ALLOCATE (eval_first(nspin))
821 ALLOCATE (occ_first(nspin))
825 eigenvalues=mo_eigenvalues, &
826 occupation_numbers=mo_occupations)
827 ALLOCATE (eval_first(ispin)%array(nmo))
828 ALLOCATE (occ_first(ispin)%array(nmo))
829 eval_first(ispin)%array(1:nmo) = mo_eigenvalues(1:nmo)
830 occ_first(ispin)%array(1:nmo) = mo_occupations(1:nmo)
835 CALL dbcsr_copy(subspace_env%p_matrix_store(ispin)%matrix, rho_ao(ispin)%matrix)
836 CALL dbcsr_copy(rho_ao(ispin)%matrix, scf_env%p_mix_new(ispin, 1)%matrix)
839 subspace_env%p_matrix_mix => scf_env%p_mix_new
841 NULLIFY (matrix_ks, energy, para_env, matrix_s)
843 matrix_ks=matrix_ks, &
847 dft_control=dft_control)
851 CALL mixing_allocate(qs_env, subspace_env%mixing_method, scf_env%p_mix_new, &
852 scf_env%p_delta, nspin, subspace_env%mixing_store)
853 IF (dft_control%qs_control%gapw)
THEN
854 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom)
855 CALL mixing_init(subspace_env%mixing_method, rho, subspace_env%mixing_store, &
856 para_env, rho_atom=rho_atom)
857 ELSEIF (dft_control%qs_control%dftb .OR. dft_control%qs_control%xtb)
THEN
859 ELSEIF (dft_control%qs_control%semi_empirical)
THEN
860 cpabort(
'SE Code not possible')
862 CALL mixing_init(subspace_env%mixing_method, rho, subspace_env%mixing_store, para_env)
868 IF (output_unit > 0)
THEN
869 WRITE (output_unit,
"(/T19,A)")
'<<<<<<<<< SUBSPACE ROTATION <<<<<<<<<<'
870 WRITE (output_unit,
"(T4,A,T13,A,T21,A,T38,A,T51,A,T65,A/,T4,A)") &
871 "In-step",
"Time",
"Convergence",
"Band ene.",
"Total ene.",
"Energy diff.", repeat(
"-", 74)
879 DO iloop = 1, subspace_env%max_iter
882 ene_old = energy%total
886 just_energy=.false., print_active=.false.)
891 DO ispin = 1,
SIZE(matrix_ks)
895 eigenvalues=mo_eigenvalues, &
896 occupation_numbers=mo_occupations, &
900 chc => subspace_env%chc_mat(ispin)
901 evec => subspace_env%c_vec(ispin)
902 c0 => subspace_env%c0(ispin)
906 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, rone, c0, work, rzero, chc)
912 CALL parallel_gemm(
'N',
'N', nao, nmo, nmo, rone, c0, evec, rzero, mo_coeff)
915 smear=scf_control%smear)
919 subspace_env%p_matrix_mix(ispin, 1)%matrix)
922 sum_band = sum_band + mo_eigenvalues(i)*mo_occupations(i)
930 scf_env%mixing_store, rho_ao_kp, para_env, iter_delta, iloop)
933 subspace_env%p_matrix_mix, delta=iter_delta)
938 CALL dbcsr_copy(rho_ao(ispin)%matrix, subspace_env%p_matrix_mix(ispin, 1)%matrix)
944 CALL gspace_mixing(qs_env, scf_env%mixing_method, subspace_env%mixing_store, &
945 rho, para_env, scf_env%iter_count)
948 ene_diff = energy%total - ene_old
949 converged = (abs(ene_diff) < subspace_env%eps_ene .AND. &
950 iter_delta < subspace_env%eps_adapt*scf_env%iter_delta)
952 IF (output_unit > 0)
THEN
953 WRITE (output_unit,
"(T4,I5,T11,F8.3,T18,E14.4,T34,F12.5,T46,F16.8,T62,E14.4)") &
954 iloop, t2 - t1, iter_delta, sum_band, energy%total, ene_diff
958 IF (output_unit > 0)
WRITE (output_unit,
"(T10,A,I6,A,/)") &
959 " Reached convergence in ", iloop,
" iterations "
965 NULLIFY (subspace_env%p_matrix_mix)
968 CALL dbcsr_copy(scf_env%p_mix_new(ispin, 1)%matrix, rho_ao(ispin)%matrix)
969 CALL dbcsr_copy(rho_ao(ispin)%matrix, subspace_env%p_matrix_store(ispin)%matrix)
971 DEALLOCATE (eval_first(ispin)%array, occ_first(ispin)%array)
973 DEALLOCATE (eval_first, occ_first)
975 CALL timestop(handle)
991 CHARACTER(LEN=*),
PARAMETER :: routinen =
'diag_subspace_allocate'
993 INTEGER :: handle, i, ispin, nmo, nspin
1000 CALL timeset(routinen, handle)
1002 NULLIFY (sab_orb, matrix_s)
1003 CALL get_qs_env(qs_env=qs_env, sab_orb=sab_orb, &
1008 IF (.NOT.
ASSOCIATED(subspace_env%p_matrix_store))
THEN
1012 ALLOCATE (subspace_env%p_matrix_store(i)%matrix)
1013 CALL dbcsr_create(matrix=subspace_env%p_matrix_store(i)%matrix, template=matrix_s(1)%matrix, &
1014 name=
"DENSITY_STORE", matrix_type=dbcsr_type_symmetric)
1017 CALL dbcsr_set(subspace_env%p_matrix_store(i)%matrix, 0.0_dp)
1022 ALLOCATE (subspace_env%chc_mat(nspin))
1023 ALLOCATE (subspace_env%c_vec(nspin))
1024 ALLOCATE (subspace_env%c0(nspin))
1027 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, nmo=nmo)
1028 CALL cp_fm_create(subspace_env%c0(ispin), mo_coeff%matrix_struct)
1029 NULLIFY (fm_struct_tmp)
1031 para_env=mo_coeff%matrix_struct%para_env, &
1032 context=mo_coeff%matrix_struct%context)
1033 CALL cp_fm_create(subspace_env%chc_mat(ispin), fm_struct_tmp,
"chc")
1034 CALL cp_fm_create(subspace_env%c_vec(ispin), fm_struct_tmp,
"vec")
1038 CALL timestop(handle)
1055 scf_section, diis_step)
1058 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1062 LOGICAL,
INTENT(INOUT) :: diis_step
1064 INTEGER :: ispin, nspin
1065 LOGICAL :: do_level_shift, use_jacobi
1066 REAL(kind=
dp) :: diis_error
1068 nspin =
SIZE(matrix_ks)
1073 IF (scf_env%iter_count > 1 .AND. .NOT. scf_env%skip_diis)
THEN
1074 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
1075 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
1076 scf_control%eps_diis, scf_control%nmixing, &
1077 scf_section=scf_section)
1082 IF ((scf_env%iter_count > 1) .AND. (scf_env%iter_delta < scf_control%diagonalization%eps_jacobi))
THEN
1085 use_jacobi = .false.
1088 do_level_shift = ((scf_control%level_shift /= 0.0_dp) .AND. &
1089 ((scf_control%density_guess ==
core_guess) .OR. (scf_env%iter_count > 1)))
1091 scf_env%iter_param = diis_error
1092 IF (use_jacobi)
THEN
1093 scf_env%iter_method =
"DIIS/Jacobi"
1095 scf_env%iter_method =
"DIIS/Diag."
1098 IF (scf_env%mixing_method == 1)
THEN
1099 scf_env%iter_param = scf_env%p_mix_alpha
1100 IF (use_jacobi)
THEN
1101 scf_env%iter_method =
"P_Mix/Jacobi"
1103 scf_env%iter_method =
"P_Mix/Diag."
1105 ELSEIF (scf_env%mixing_method > 1)
THEN
1106 scf_env%iter_param = scf_env%mixing_store%alpha
1107 IF (use_jacobi)
THEN
1108 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Jacobi"
1110 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
1114 scf_env%iter_delta = 0.0_dp
1118 mo_set=mos(ispin), &
1119 work=scf_env%scf_work2, &
1120 do_level_shift=do_level_shift, &
1121 level_shift=scf_control%level_shift, &
1122 use_jacobi=use_jacobi, &
1123 jacobi_threshold=scf_control%diagonalization%jacobi_threshold)
1127 smear=scf_control%smear)
1132 scf_env%p_mix_new(ispin, 1)%matrix)
1151 scf_control, scf_section, diis_step)
1154 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1155 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
1158 LOGICAL,
INTENT(INOUT) :: diis_step
1160 INTEGER :: homo, ispin, nmo, nspin
1161 REAL(kind=
dp) :: diis_error, eps_iter
1162 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues
1165 NULLIFY (eigenvalues)
1167 nspin =
SIZE(matrix_ks)
1171 scf_env%scf_work1(ispin))
1174 IF ((scf_env%iter_count > 1) .AND. (.NOT. scf_env%skip_diis))
THEN
1175 CALL qs_diis_b_step(scf_env%scf_diis_buffer, mos, scf_env%scf_work1, &
1176 scf_env%scf_work2, scf_env%iter_delta, diis_error, diis_step, &
1177 scf_control%eps_diis, scf_control%nmixing, &
1178 s_matrix=matrix_s, &
1179 scf_section=scf_section)
1184 eps_iter = scf_control%diagonalization%eps_iter
1186 scf_env%iter_param = diis_error
1187 scf_env%iter_method =
"DIIS/OTdiag"
1190 matrix_ks(ispin)%matrix, keep_sparsity=.true.)
1192 eps_iter = max(eps_iter, scf_control%diagonalization%eps_adapt*diis_error)
1194 IF (scf_env%mixing_method == 1)
THEN
1195 scf_env%iter_param = scf_env%p_mix_alpha
1196 scf_env%iter_method =
"P_Mix/OTdiag."
1197 ELSEIF (scf_env%mixing_method > 1)
THEN
1198 scf_env%iter_param = scf_env%mixing_store%alpha
1199 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/OTdiag."
1203 scf_env%iter_delta = 0.0_dp
1207 mo_coeff=mo_coeff, &
1208 eigenvalues=eigenvalues, &
1212 matrix_s=matrix_s(1)%matrix, &
1213 matrix_c_fm=mo_coeff, &
1215 eps_gradient=eps_iter, &
1216 iter_max=scf_control%diagonalization%max_iter, &
1218 ot_settings=scf_control%diagonalization%ot_settings)
1220 evals_arg=eigenvalues, &
1223 mos(ispin)%mo_coeff_b)
1228 smear=scf_control%smear)
1233 scf_env%p_mix_new(ispin, 1)%matrix)
1256 scf_control, scf_section, diis_step, &
1264 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mos
1265 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
1268 LOGICAL,
INTENT(INOUT) :: diis_step
1269 LOGICAL,
INTENT(IN) :: orthogonal_basis
1271 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_roks_diag'
1273 INTEGER :: handle, homoa, homob, imo, nalpha, nao, &
1275 REAL(kind=
dp) :: diis_error, level_shift_loc
1276 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eiga, eigb, occa, occb
1277 TYPE(
cp_fm_type),
POINTER :: ksa, ksb, mo2ao, moa, mob, ortho, work
1281 CALL timeset(routinen, handle)
1284 ortho => scf_env%ortho_m1
1286 ortho => scf_env%ortho
1288 work => scf_env%scf_work2
1290 ksa => scf_env%scf_work1(1)
1291 ksb => scf_env%scf_work1(2)
1304 occupation_numbers=occa, &
1311 occupation_numbers=occb, &
1316 IF ((scf_control%level_shift /= 0.0_dp) .AND. &
1317 ((scf_control%density_guess ==
core_guess) .OR. &
1319 (scf_env%iter_count > 1)))
THEN
1320 level_shift_loc = scf_control%level_shift
1322 level_shift_loc = 0.0_dp
1325 IF ((scf_env%iter_count > 1) .OR. &
1326 (scf_control%density_guess ==
core_guess) .OR. &
1332 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksa, moa, 0.0_dp, work)
1333 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksa)
1335 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksb, moa, 0.0_dp, work)
1336 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksb)
1347 cpabort(
"Unknown ROKS scheme requested")
1353 IF (orthogonal_basis)
THEN
1366 CALL parallel_gemm(
"N",
"T", nao, nao, nao, 1.0_dp, ksa, mo2ao, 0.0_dp, work)
1367 CALL parallel_gemm(
"N",
"N", nao, nao, nao, 1.0_dp, mo2ao, work, 0.0_dp, ksa)
1381 IF (scf_env%iter_count > 1)
THEN
1382 IF (orthogonal_basis)
THEN
1385 kc=scf_env%scf_work1, &
1387 delta=scf_env%iter_delta, &
1388 error_max=diis_error, &
1389 diis_step=diis_step, &
1390 eps_diis=scf_control%eps_diis, &
1391 scf_section=scf_section, &
1393 cpassert(scf_env%iter_delta == scf_env%iter_delta)
1397 kc=scf_env%scf_work1, &
1399 delta=scf_env%iter_delta, &
1400 error_max=diis_error, &
1401 diis_step=diis_step, &
1402 eps_diis=scf_control%eps_diis, &
1403 scf_section=scf_section, &
1404 s_matrix=matrix_s, &
1410 scf_env%iter_param = diis_error
1411 scf_env%iter_method =
"DIIS/Diag."
1413 IF (scf_env%mixing_method == 1)
THEN
1414 scf_env%iter_param = scf_env%p_mix_alpha
1415 scf_env%iter_method =
"P_Mix/Diag."
1416 ELSEIF (scf_env%mixing_method > 1)
THEN
1417 scf_env%iter_param = scf_env%mixing_store%alpha
1418 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Diag."
1422 scf_env%iter_delta = 0.0_dp
1424 IF (level_shift_loc /= 0.0_dp)
THEN
1429 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksa, moa, 0.0_dp, work)
1430 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, moa, work, 0.0_dp, ksa)
1434 DO imo = homob + 1, homoa
1437 DO imo = homoa + 1, nmo
1441 ELSE IF (.NOT. orthogonal_basis)
THEN
1444 SELECT CASE (scf_env%cholesky_method)
1450 "SOLVE", pos=
"RIGHT")
1452 "SOLVE", pos=
"LEFT", transa=
"T")
1456 "MULTIPLY", pos=
"RIGHT")
1458 "MULTIPLY", pos=
"LEFT", transa=
"T")
1460 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, ksa, ortho, 0.0_dp, work)
1461 CALL parallel_gemm(
"N",
"N", nao, nao, nao, 1.0_dp, ortho, work, 0.0_dp, ksa)
1472 IF (level_shift_loc /= 0.0_dp)
THEN
1475 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, moa)
1477 IF (orthogonal_basis)
THEN
1480 SELECT CASE (scf_env%cholesky_method)
1486 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, moa)
1493 IF (level_shift_loc /= 0.0_dp)
THEN
1494 DO imo = homob + 1, homoa
1495 eiga(imo) = eiga(imo) - 0.5_dp*level_shift_loc
1497 DO imo = homoa + 1, nmo
1498 eiga(imo) = eiga(imo) - level_shift_loc
1513 CALL timestop(handle)
1531 scf_control, scf_section, check_moconv_only)
1534 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1538 LOGICAL,
INTENT(IN),
OPTIONAL :: check_moconv_only
1540 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_block_krylov_diag'
1541 REAL(kind=
dp),
PARAMETER :: rone = 1.0_dp, rzero = 0.0_dp
1543 INTEGER :: handle, homo, ispin, iter, nao, nmo, &
1545 LOGICAL :: converged, my_check_moconv_only
1546 REAL(
dp) :: eps_iter, t1, t2
1547 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
1548 TYPE(
cp_fm_type),
POINTER :: c0, c1, chc, evec, ks, mo_coeff, ortho, &
1553 CALL timeset(routinen, handle)
1556 extension=
".scfLog")
1558 my_check_moconv_only = .false.
1559 IF (
PRESENT(check_moconv_only)) my_check_moconv_only = check_moconv_only
1561 NULLIFY (mo_coeff, ortho, work, ks)
1562 NULLIFY (mo_eigenvalues)
1566 ortho => scf_env%ortho_m1
1568 ortho => scf_env%ortho
1570 work => scf_env%scf_work2
1572 DO ispin = 1,
SIZE(matrix_ks)
1574 scf_env%scf_work1(ispin))
1577 IF (scf_env%mixing_method == 1)
THEN
1578 scf_env%iter_param = scf_env%p_mix_alpha
1579 scf_env%iter_method =
"P_Mix/Lanczos"
1582 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Lanc."
1585 DO ispin = 1,
SIZE(matrix_ks)
1587 ks => scf_env%scf_work1(ispin)
1594 eigenvalues=mo_eigenvalues, &
1598 c0 => scf_env%krylov_space%mo_conv(ispin)
1599 c1 => scf_env%krylov_space%mo_refine(ispin)
1600 SELECT CASE (scf_env%cholesky_method)
1607 "SOLVE", pos=
"RIGHT")
1609 "SOLVE", pos=
"LEFT", transa=
"T")
1613 "MULTIPLY", pos=
"RIGHT")
1615 "MULTIPLY", pos=
"LEFT", transa=
"T")
1619 scf_env%krylov_space%nmo_nc = nmo
1620 scf_env%krylov_space%nmo_conv = 0
1623 IF (output_unit > 0)
THEN
1624 WRITE (output_unit,
"(/T15,A)")
'<<<<<<<<< LANCZOS REFINEMENT <<<<<<<<<<'
1625 WRITE (output_unit,
"(T8,A,T15,A,T23,A,T36,A,T49,A,T60,A,/,T8,A)") &
1626 " Spin ",
" Cycle ", &
1627 " conv. MOS ",
" B2MAX ",
" B2MIN ",
" Time", repeat(
"-", 60)
1629 eps_iter = max(scf_env%krylov_space%eps_conv, scf_env%krylov_space%eps_adapt*scf_env%iter_delta)
1633 IF (my_check_moconv_only)
THEN
1636 nao, eps_iter, ispin, check_moconv_only=my_check_moconv_only)
1638 IF (output_unit > 0) &
1639 WRITE (output_unit,
'(T8,I3,T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1640 ispin, iter, scf_env%krylov_space%nmo_conv, &
1641 scf_env%krylov_space%max_res_norm, scf_env%krylov_space%min_res_norm, t2 - t1
1646 DO iter = 1, scf_env%krylov_space%max_iter
1648 nao, eps_iter, ispin)
1650 IF (output_unit > 0)
THEN
1651 WRITE (output_unit,
'(T8,I3,T16,I5,T24,I6,T33,E12.4,2x,E12.4,T60,F8.3)') &
1652 ispin, iter, scf_env%krylov_space%nmo_conv, &
1653 scf_env%krylov_space%max_res_norm, scf_env%krylov_space%min_res_norm, t2 - t1
1656 IF (scf_env%krylov_space%max_res_norm < eps_iter)
THEN
1658 IF (output_unit > 0)
WRITE (output_unit, *) &
1659 " Reached convergence in ", iter,
" iterations "
1664 IF (.NOT. converged .AND. output_unit > 0)
THEN
1665 WRITE (output_unit,
"(T4, A)")
" WARNING Lanczos refinement could "// &
1666 "not converge all the mos:"
1667 WRITE (output_unit,
"(T40,A,T70,I10)")
" number of not converged mos ", &
1668 scf_env%krylov_space%nmo_nc
1669 WRITE (output_unit,
"(T40,A,T70,E10.2)")
" max norm of the residual ", &
1670 scf_env%krylov_space%max_res_norm
1678 chc => scf_env%krylov_space%chc_mat(ispin)
1679 evec => scf_env%krylov_space%c_vec(ispin)
1680 CALL parallel_gemm(
'N',
'N', nao, nmo, nao, rone, ks, c0, rzero, work)
1681 CALL parallel_gemm(
'T',
'N', nmo, nmo, nao, rone, c0, work, rzero, chc)
1685 CALL parallel_gemm(
'N',
'N', nao, nmo, nmo, rone, c0, evec, rzero, c1)
1686 c0 => scf_env%krylov_space%mo_refine(ispin)
1696 smear=scf_control%smear)
1700 scf_env%p_mix_new(ispin, 1)%matrix)
1704 IF (output_unit > 0)
THEN
1705 WRITE (output_unit,
"(T15,A/)")
'<<<<<<<<< END LANCZOS REFINEMENT <<<<<<<<<<'
1711 CALL timestop(handle)
1731 scf_control, scf_section, check_moconv_only)
1735 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
1736 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
1739 LOGICAL,
INTENT(IN),
OPTIONAL :: check_moconv_only
1741 CHARACTER(LEN=*),
PARAMETER :: routinen =
'do_block_davidson_diag'
1743 INTEGER :: handle, ispin, nspins, output_unit
1744 LOGICAL :: do_prec, my_check_moconv_only
1748 CALL timeset(routinen, handle)
1751 extension=
".scfLog")
1753 IF (output_unit > 0) &
1754 WRITE (output_unit,
"(/T15,A)")
'<<<<<<<<< DAVIDSON ITERATIONS <<<<<<<<<<'
1756 IF (scf_env%mixing_method == 1)
THEN
1757 scf_env%iter_param = scf_env%p_mix_alpha
1758 scf_env%iter_method =
"P_Mix/Dav."
1760 scf_env%iter_param = scf_env%mixing_store%alpha
1761 scf_env%iter_method = trim(scf_env%mixing_store%iter_method)//
"/Dav."
1764 my_check_moconv_only = .false.
1765 IF (
PRESENT(check_moconv_only)) my_check_moconv_only = check_moconv_only
1767 IF (scf_env%block_davidson_env(1)%prec_type /= 0 .AND. &
1768 scf_env%iter_count >= scf_env%block_davidson_env(1)%first_prec)
THEN
1772 nspins =
SIZE(matrix_ks)
1774 IF (do_prec .AND. (scf_env%iter_count == scf_env%block_davidson_env(1)%first_prec .OR. &
1775 modulo(scf_env%iter_count, scf_env%block_davidson_env(1)%niter_new_prec) == 0))
THEN
1777 prec_type=scf_env%block_davidson_env(1)%prec_type, nspins=nspins)
1779 scf_env%block_davidson_env(1)%prec_type, &
1780 scf_env%block_davidson_env(1)%solver_type, &
1781 scf_env%block_davidson_env(1)%energy_gap, nspins, &
1782 convert_to_dbcsr=scf_env%block_davidson_env(1)%use_sparse_mos, &
1786 DO ispin = 1, nspins
1787 IF (scf_env%block_davidson_env(ispin)%use_sparse_mos)
THEN
1788 IF (.NOT. do_prec)
THEN
1790 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit)
1793 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit, &
1794 scf_env%ot_preconditioner(ispin)%preconditioner)
1798 IF (.NOT. do_prec)
THEN
1800 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit)
1803 matrix_ks(ispin)%matrix, matrix_s(1)%matrix, output_unit, &
1804 scf_env%ot_preconditioner(ispin)%preconditioner)
1810 smear=scf_control%smear)
1812 DO ispin = 1, nspins
1815 scf_env%p_mix_new(ispin, 1)%matrix)
1818 IF (output_unit > 0)
THEN
1819 WRITE (output_unit,
"(T15,A/)")
'<<<<<<<<< END DAVIDSON ITERATION <<<<<<<<<<'
1825 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, probe)
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, tb_tblite)
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_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, probe)
...
subroutine, public do_general_diag_kp(matrix_ks, matrix_s, kpoints, scf_env, scf_control, update_p, diis_step, diis_error, qs_env, probe)
Kpoint diagonalization routine Transforms matrices to kpoint, distributes kpoint groups,...
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.