54#include "./base/base_uses.f90"
60 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_methods'
61 REAL(KIND=
dp),
PARAMETER :: ratio = 0.25_dp
73 MODULE PROCEDURE combine_ks_matrices_1, &
95 iter_delta, iter_count, diis, invert)
96 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_mix_new
100 REAL(kind=
dp),
INTENT(INOUT) :: iter_delta
101 INTEGER,
INTENT(IN) :: iter_count
102 LOGICAL,
INTENT(in),
OPTIONAL :: diis, invert
104 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_density_mixing'
106 INTEGER :: handle, ic, ispin
107 LOGICAL :: my_diis, my_invert
108 REAL(kind=
dp) :: my_p_mix, tmp
110 CALL timeset(routinen, handle)
113 IF (
PRESENT(diis)) my_diis = diis
115 IF (
PRESENT(invert)) my_invert = invert
116 my_p_mix = mixing_store%alpha
117 IF (my_diis .OR. iter_count < mixing_store%nskip_mixing)
THEN
122 cpassert(
ASSOCIATED(p_mix_new))
123 DO ic = 1,
SIZE(p_mix_new, 2)
124 DO ispin = 1,
SIZE(p_mix_new, 1)
126 cpassert(my_p_mix /= 0.0_dp)
127 IF (my_p_mix /= 1.0_dp)
THEN
128 CALL dbcsr_add(matrix_a=p_mix_new(ispin, ic)%matrix, &
129 alpha_scalar=1.0_dp/my_p_mix, &
130 matrix_b=rho_ao(ispin, ic)%matrix, &
131 beta_scalar=(my_p_mix - 1.0_dp)/my_p_mix)
134 CALL cp_sm_mix(m1=p_mix_new(ispin, ic)%matrix, &
135 m2=rho_ao(ispin, ic)%matrix, &
139 iter_delta = max(iter_delta, tmp)
144 CALL timestop(handle)
165 cholesky_method, do_level_shift, &
166 level_shift, matrix_u_fm, use_jacobi)
170 INTEGER,
INTENT(inout) :: cholesky_method
171 LOGICAL,
INTENT(in) :: do_level_shift
172 REAL(kind=
dp),
INTENT(in) :: level_shift
173 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
174 LOGICAL,
INTENT(in) :: use_jacobi
176 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver'
178 INTEGER :: handle, homo, nao, nmo
179 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
182 CALL timeset(routinen, handle)
185 NULLIFY (mo_eigenvalues)
193 eigenvalues=mo_eigenvalues, &
196 SELECT CASE (cholesky_method)
200 IF (do_level_shift)
THEN
201 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, &
202 level_shift=level_shift, is_triangular=.true., matrix_u_fm=matrix_u_fm)
207 IF (do_level_shift)
THEN
208 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
214 "SOLVE", pos=
"RIGHT")
216 "SOLVE", pos=
"LEFT", transa=
"T")
218 IF (do_level_shift)
THEN
219 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, &
220 level_shift=level_shift, is_triangular=.true., matrix_u_fm=matrix_u_fm)
226 IF (do_level_shift)
THEN
227 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
234 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nao, alpha=1.0_dp)
236 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nao, alpha=1.0_dp)
238 IF (do_level_shift)
THEN
239 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, &
240 level_shift=level_shift, is_triangular=.true., matrix_u_fm=matrix_u_fm)
245 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nmo, alpha=1.0_dp)
248 IF (do_level_shift)
THEN
249 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
259 CALL timestop(handle)
271 TYPE(
cp_fm_type),
INTENT(INOUT) :: matrix_ks_fm
276 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_generalized'
278 INTEGER :: handle, nmo
279 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
284 CALL timeset(routinen, handle)
287 NULLIFY (mo_eigenvalues)
289 CALL get_mo_set(mo_set=mo_set, nmo=nmo, eigenvalues=mo_eigenvalues, mo_coeff=mo_coeff)
297 CALL cp_fm_geeig(matrix_ks_fm, s_fm, mo_coeff, mo_eigenvalues, work)
301 CALL timestop(handle)
316 TYPE(
cp_fm_type),
INTENT(INOUT) :: matrix_ks_fm
319 TYPE(
dbcsr_type),
INTENT(INOUT) :: ksbuf1, ksbuf2
321 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_dbcsr'
323 INTEGER :: handle, nao, nmo
324 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
328 CALL timeset(routinen, handle)
331 NULLIFY (mo_eigenvalues)
336 eigenvalues=mo_eigenvalues, &
341 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, ksbuf2, ortho_dbcsr, 0.0_dp, ksbuf1)
342 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, ortho_dbcsr, ksbuf1, 0.0_dp, ksbuf2)
346 CALL cp_fm_create(all_evecs, matrix_ks_fm%matrix_struct)
351 CALL cp_fm_to_fm(msource=all_evecs, mtarget=nmo_evecs, ncol=nmo)
358 CALL timestop(handle)
379 level_shift, matrix_u_fm, use_jacobi, jacobi_threshold, &
380 ortho_red, work_red, matrix_ks_fm_red, matrix_u_fm_red)
384 LOGICAL,
INTENT(IN) :: do_level_shift
385 REAL(kind=
dp),
INTENT(IN) :: level_shift
386 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
387 LOGICAL,
INTENT(IN) :: use_jacobi
388 REAL(kind=
dp),
INTENT(IN) :: jacobi_threshold
389 TYPE(
cp_fm_type),
INTENT(INOUT),
OPTIONAL :: ortho_red, work_red, matrix_ks_fm_red, &
392 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_symm'
394 INTEGER :: handle, homo, nao, nao_red, nelectron, &
396 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
397 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
401 CALL timeset(routinen, handle)
404 NULLIFY (mo_eigenvalues)
412 nelectron=nelectron, &
413 eigenvalues=mo_eigenvalues, &
418 CALL cp_fm_symm(
"L",
"U", nao, homo, 1.0_dp, matrix_ks_fm, mo_coeff, 0.0_dp, work)
419 CALL parallel_gemm(
"T",
"N", homo, nao - homo, nao, 1.0_dp, work, mo_coeff, &
420 0.0_dp, matrix_ks_fm, b_first_col=homo + 1, c_first_col=homo + 1)
424 jacobi_threshold, homo + 1)
427 IF (
PRESENT(work_red) .AND.
PRESENT(ortho_red) .AND.
PRESENT(matrix_ks_fm_red))
THEN
429 CALL cp_fm_symm(
"L",
"U", nao, nao_red, 1.0_dp, matrix_ks_fm, ortho_red, 0.0_dp, work_red)
430 CALL parallel_gemm(
"T",
"N", nao_red, nao_red, nao, 1.0_dp, ortho_red, work_red, 0.0_dp, matrix_ks_fm_red)
432 IF (do_level_shift)
THEN
433 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm_red, mo_coeff=mo_coeff, homo=homo, &
434 level_shift=level_shift, is_triangular=.false., matrix_u_fm=matrix_u_fm_red)
437 CALL cp_fm_create(work_red2, matrix_ks_fm_red%matrix_struct)
438 ALLOCATE (eigenvalues(nao_red))
440 mo_eigenvalues(1:min(nao_red, nmo)) = eigenvalues(1:min(nao_red, nmo))
441 CALL parallel_gemm(
"N",
"N", nao, nmo, nao_red, 1.0_dp, ortho_red, work_red2, 0.0_dp, &
445 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, matrix_ks_fm, ortho, 0.0_dp, work)
446 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, ortho, work, 0.0_dp, matrix_ks_fm)
447 IF (do_level_shift)
THEN
448 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, &
449 level_shift=level_shift, is_triangular=.false., matrix_u_fm=matrix_u_fm)
452 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, &
456 IF (do_level_shift)
THEN
457 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
462 CALL timestop(handle)
479 level_shift, use_jacobi, jacobi_threshold)
484 LOGICAL,
INTENT(IN) :: do_level_shift
485 REAL(kind=
dp),
INTENT(IN) :: level_shift
486 LOGICAL,
INTENT(IN) :: use_jacobi
487 REAL(kind=
dp),
INTENT(IN) :: jacobi_threshold
489 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_simple'
491 INTEGER :: handle, homo, nao, nelectron, nmo
492 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
495 CALL timeset(routinen, handle)
498 NULLIFY (mo_eigenvalues)
504 nelectron=nelectron, &
505 eigenvalues=mo_eigenvalues, &
508 IF (do_level_shift)
THEN
510 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks, mo_coeff=mo_coeff, homo=homo, &
511 level_shift=level_shift, is_triangular=.false.)
515 CALL cp_fm_symm(
"L",
"U", nao, homo, 1.0_dp, matrix_ks, mo_coeff, 0.0_dp, work)
516 CALL parallel_gemm(
"T",
"N", homo, nao - homo, nao, 1.0_dp, work, mo_coeff, &
517 0.0_dp, matrix_ks, b_first_col=homo + 1, c_first_col=homo + 1)
519 CALL cp_fm_block_jacobi(matrix_ks, mo_coeff, mo_eigenvalues, jacobi_threshold, homo + 1)
528 IF (do_level_shift)
THEN
529 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
532 CALL timestop(handle)
553 SUBROUTINE cp_sm_mix(m1, m2, p_mix, delta, para_env, m3)
556 REAL(kind=
dp),
INTENT(IN) :: p_mix
557 REAL(kind=
dp),
INTENT(OUT) :: delta
561 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_sm_mix'
563 INTEGER :: handle, i, iblock_col, iblock_row, j
565 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: p_delta_block, p_new_block, p_old_block
568 CALL timeset(routinen, handle)
575 block=p_old_block, found=found)
576 cpassert(
ASSOCIATED(p_old_block))
577 IF (
PRESENT(m3))
THEN
579 block=p_delta_block, found=found)
580 cpassert(
ASSOCIATED(p_delta_block))
582 DO j = 1,
SIZE(p_new_block, 2)
583 DO i = 1,
SIZE(p_new_block, 1)
584 p_delta_block(i, j) = p_new_block(i, j) - p_old_block(i, j)
585 delta = max(delta, abs(p_delta_block(i, j)))
589 DO j = 1,
SIZE(p_new_block, 2)
590 DO i = 1,
SIZE(p_new_block, 1)
591 p_new_block(i, j) = p_new_block(i, j) - p_old_block(i, j)
592 delta = max(delta, abs(p_new_block(i, j)))
593 p_new_block(i, j) = p_old_block(i, j) + p_mix*p_new_block(i, j)
600 CALL para_env%max(delta)
602 CALL timestop(handle)
614 SUBROUTINE combine_ks_matrices_1(ksa, ksb, occa, occb, roks_parameter)
626 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: occa, occb
627 REAL(KIND=
dp),
DIMENSION(0:2, 0:2, 1:2), &
628 INTENT(IN) :: roks_parameter
630 CHARACTER(LEN=*),
PARAMETER :: routineN =
'combine_ks_matrices_1'
632 INTEGER :: handle, i, icol_global, icol_local, &
633 irow_global, irow_local, j, &
634 ncol_local, nrow_local
635 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
636 LOGICAL :: compatible_matrices
637 REAL(KIND=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
643 CALL timeset(routinen, handle)
646 matrix_struct=ksa_struct, &
647 nrow_local=nrow_local, &
648 ncol_local=ncol_local, &
649 row_indices=row_indices, &
650 col_indices=col_indices, &
654 matrix_struct=ksb_struct, &
658 cpassert(compatible_matrices)
660 IF (sum(occb) == 0.0_dp) fb = 0.0_dp
662 DO icol_local = 1, ncol_local
663 icol_global = col_indices(icol_local)
664 j = int(occa(icol_global)) + int(occb(icol_global))
665 DO irow_local = 1, nrow_local
666 irow_global = row_indices(irow_local)
667 i = int(occa(irow_global)) + int(occb(irow_global))
668 fa(irow_local, icol_local) = &
669 roks_parameter(i, j, 1)*fa(irow_local, icol_local) + &
670 roks_parameter(i, j, 2)*fb(irow_local, icol_local)
674 CALL timestop(handle)
676 END SUBROUTINE combine_ks_matrices_1
688 SUBROUTINE combine_ks_matrices_2(ksa, ksb, occa, occb, f, nalpha, nbeta)
700 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: occa, occb
701 REAL(KIND=
dp),
INTENT(IN) :: f
702 INTEGER,
INTENT(IN) :: nalpha, nbeta
704 CHARACTER(LEN=*),
PARAMETER :: routineN =
'combine_ks_matrices_2'
706 INTEGER :: handle, icol_global, icol_local, &
707 irow_global, irow_local, ncol_local, &
709 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
710 LOGICAL :: compatible_matrices
711 REAL(KIND=
dp) :: beta, t1, t2, ta, tb
712 REAL(KIND=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
718 CALL timeset(routinen, handle)
721 matrix_struct=ksa_struct, &
722 nrow_local=nrow_local, &
723 ncol_local=ncol_local, &
724 row_indices=row_indices, &
725 col_indices=col_indices, &
729 matrix_struct=ksb_struct, &
733 cpassert(compatible_matrices)
735 beta = 1.0_dp/(1.0_dp - f)
737 DO icol_local = 1, ncol_local
739 icol_global = col_indices(icol_local)
741 DO irow_local = 1, nrow_local
743 irow_global = row_indices(irow_local)
745 t1 = 0.5_dp*(fa(irow_local, icol_local) + fb(irow_local, icol_local))
747 IF ((0 < irow_global) .AND. (irow_global <= nbeta))
THEN
748 IF ((0 < icol_global) .AND. (icol_global <= nbeta))
THEN
750 fa(irow_local, icol_local) = t1
751 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
753 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
754 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
755 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
756 fa(irow_local, icol_local) = t1 + (beta - 1.0_dp)*t2
759 fa(irow_local, icol_local) = t1
761 ELSE IF ((nbeta < irow_global) .AND. (irow_global <= nalpha))
THEN
762 IF ((0 < irow_global) .AND. (irow_global <= nbeta))
THEN
764 ta = 0.5_dp*(f - real(occa(irow_global), kind=
dp))/f
765 tb = 0.5_dp*(f - real(occb(irow_global), kind=
dp))/f
766 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
767 fa(irow_local, icol_local) = t1 + (beta - 1.0_dp)*t2
768 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
770 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
771 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
772 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
773 IF (irow_global == icol_global)
THEN
774 fa(irow_local, icol_local) = t1 - t2
776 fa(irow_local, icol_local) = t1 - 0.5_dp*t2
780 ta = 0.5_dp*(f - real(occa(irow_global), kind=
dp))/f
781 tb = 0.5_dp*(f - real(occb(irow_global), kind=
dp))/f
782 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
783 fa(irow_local, icol_local) = t1 - t2
786 IF ((0 < irow_global) .AND. (irow_global < nbeta))
THEN
788 fa(irow_local, icol_local) = t1
789 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
791 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
792 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
793 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
794 fa(irow_local, icol_local) = t1 - t2
797 fa(irow_local, icol_local) = t1
804 CALL timestop(handle)
806 END SUBROUTINE combine_ks_matrices_2
821 PURE SUBROUTINE correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
823 REAL(kind=
dp),
DIMENSION(:),
INTENT(inout) :: mo_eigenvalues
824 INTEGER,
INTENT(in) :: homo, nmo
825 REAL(kind=
dp),
INTENT(in) :: level_shift
829 DO imo = homo + 1, nmo
830 mo_eigenvalues(imo) = mo_eigenvalues(imo) - level_shift
833 END SUBROUTINE correct_mo_eigenvalues
848 SUBROUTINE shift_unocc_mos(matrix_ks_fm, mo_coeff, homo, &
849 level_shift, is_triangular, matrix_u_fm)
851 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_ks_fm, mo_coeff
852 INTEGER,
INTENT(in) :: homo
853 REAL(kind=
dp),
INTENT(in) :: level_shift
854 LOGICAL,
INTENT(in) :: is_triangular
855 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
857 CHARACTER(len=*),
PARAMETER :: routineN =
'shift_unocc_mos'
859 INTEGER :: handle, nao, nao_red, nmo
860 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: weights
864 CALL timeset(routinen, handle)
866 IF (
PRESENT(matrix_u_fm))
THEN
868 CALL cp_fm_get_info(matrix_u_fm, nrow_global=nao_red, ncol_global=nao)
874 NULLIFY (ao_mo_fmstruct)
876 para_env=mo_coeff%matrix_struct%para_env, context=mo_coeff%matrix_struct%context)
884 IF (
PRESENT(matrix_u_fm))
THEN
885 IF (is_triangular)
THEN
888 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nmo, alpha=1.0_dp)
890 CALL parallel_gemm(
"N",
"N", nao_red, nmo, nao, 1.0_dp, matrix_u_fm, mo_coeff, 0.0_dp, u_mo)
902 ALLOCATE (weights(nmo))
903 weights(1:homo) = 0.0_dp
904 weights(homo + 1:nmo) = level_shift
911 CALL parallel_gemm(
"N",
"T", nao_red, nao_red, nmo, 1.0_dp, u_mo, u_mo_scaled, 1.0_dp, matrix_ks_fm)
916 CALL timestop(handle)
918 END SUBROUTINE shift_unocc_mos
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_desymmetrize(matrix_a, matrix_b)
...
subroutine, public dbcsr_get_block_p(matrix, row, col, block, found, row_size, col_size)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset, transposed)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
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.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_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...
subroutine, public cp_fm_triangular_multiply(triangular_matrix, matrix_b, side, transpose_tr, invert_tr, uplo_tr, unit_diag_tr, n_rows, n_cols, alpha)
multiplies in place by a triangular matrix: matrix_b = alpha op(triangular_matrix) matrix_b or (if si...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
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_block_jacobi(matrix, eigenvectors, eigval, thresh, start_sec_block)
...
subroutine, public cp_fm_geeig(amatrix, bmatrix, eigenvectors, eigenvalues, work)
General Eigenvalue Problem AX = BXE. Use cuSOLVERMp directly when requested and large enough; otherwi...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
logical function, public cp_fm_struct_equivalent(fmstruct1, fmstruct2)
returns true if the two matrix structures are equivalent, false otherwise.
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_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_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
basic linear algebra operations for full matrixes
module that contains the definitions of the scf types
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.
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)
...
subroutine, public eigensolver_generalized(matrix_ks_fm, matrix_s, mo_set, work)
Solve the generalized eigenvalue problem.
subroutine, public cp_sm_mix(m1, m2, p_mix, delta, para_env, m3)
Perform a mixing of the given matrixes into the first matrix m1 = m2 + p_mix (m1-m2)
keeps the information about the structure of a full matrix
stores all the informations relevant to an mpi environment