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)
578 block=p_old_block, found=found)
579 cpassert(
ASSOCIATED(p_old_block))
580 IF (
PRESENT(m3))
THEN
582 block=p_delta_block, found=found)
583 cpassert(
ASSOCIATED(p_delta_block))
585 DO j = 1,
SIZE(p_new_block, 2)
586 DO i = 1,
SIZE(p_new_block, 1)
587 p_delta_block(i, j) = p_new_block(i, j) - p_old_block(i, j)
588 delta = max(delta, abs(p_delta_block(i, j)))
592 DO j = 1,
SIZE(p_new_block, 2)
593 DO i = 1,
SIZE(p_new_block, 1)
594 p_new_block(i, j) = p_new_block(i, j) - p_old_block(i, j)
595 delta = max(delta, abs(p_new_block(i, j)))
596 p_new_block(i, j) = p_old_block(i, j) + p_mix*p_new_block(i, j)
604 CALL para_env%max(delta)
606 CALL timestop(handle)
618 SUBROUTINE combine_ks_matrices_1(ksa, ksb, occa, occb, roks_parameter)
630 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: occa, occb
631 REAL(KIND=
dp),
DIMENSION(0:2, 0:2, 1:2), &
632 INTENT(IN) :: roks_parameter
634 CHARACTER(LEN=*),
PARAMETER :: routineN =
'combine_ks_matrices_1'
636 INTEGER :: handle, i, icol_global, icol_local, &
637 irow_global, irow_local, j, &
638 ncol_local, nrow_local
639 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
640 LOGICAL :: compatible_matrices
641 REAL(KIND=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
647 CALL timeset(routinen, handle)
650 matrix_struct=ksa_struct, &
651 nrow_local=nrow_local, &
652 ncol_local=ncol_local, &
653 row_indices=row_indices, &
654 col_indices=col_indices, &
658 matrix_struct=ksb_struct, &
662 cpassert(compatible_matrices)
664 IF (sum(occb) == 0.0_dp) fb = 0.0_dp
666 DO icol_local = 1, ncol_local
667 icol_global = col_indices(icol_local)
668 j = int(occa(icol_global)) + int(occb(icol_global))
669 DO irow_local = 1, nrow_local
670 irow_global = row_indices(irow_local)
671 i = int(occa(irow_global)) + int(occb(irow_global))
672 fa(irow_local, icol_local) = &
673 roks_parameter(i, j, 1)*fa(irow_local, icol_local) + &
674 roks_parameter(i, j, 2)*fb(irow_local, icol_local)
678 CALL timestop(handle)
680 END SUBROUTINE combine_ks_matrices_1
692 SUBROUTINE combine_ks_matrices_2(ksa, ksb, occa, occb, f, nalpha, nbeta)
704 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: occa, occb
705 REAL(KIND=
dp),
INTENT(IN) :: f
706 INTEGER,
INTENT(IN) :: nalpha, nbeta
708 CHARACTER(LEN=*),
PARAMETER :: routineN =
'combine_ks_matrices_2'
710 INTEGER :: handle, icol_global, icol_local, &
711 irow_global, irow_local, ncol_local, &
713 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
714 LOGICAL :: compatible_matrices
715 REAL(KIND=
dp) :: beta, t1, t2, ta, tb
716 REAL(KIND=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
722 CALL timeset(routinen, handle)
725 matrix_struct=ksa_struct, &
726 nrow_local=nrow_local, &
727 ncol_local=ncol_local, &
728 row_indices=row_indices, &
729 col_indices=col_indices, &
733 matrix_struct=ksb_struct, &
737 cpassert(compatible_matrices)
739 beta = 1.0_dp/(1.0_dp - f)
741 DO icol_local = 1, ncol_local
743 icol_global = col_indices(icol_local)
745 DO irow_local = 1, nrow_local
747 irow_global = row_indices(irow_local)
749 t1 = 0.5_dp*(fa(irow_local, icol_local) + fb(irow_local, icol_local))
751 IF ((0 < irow_global) .AND. (irow_global <= nbeta))
THEN
752 IF ((0 < icol_global) .AND. (icol_global <= nbeta))
THEN
754 fa(irow_local, icol_local) = t1
755 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
757 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
758 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
759 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
760 fa(irow_local, icol_local) = t1 + (beta - 1.0_dp)*t2
763 fa(irow_local, icol_local) = t1
765 ELSE IF ((nbeta < irow_global) .AND. (irow_global <= nalpha))
THEN
766 IF ((0 < irow_global) .AND. (irow_global <= nbeta))
THEN
768 ta = 0.5_dp*(f - real(occa(irow_global), kind=
dp))/f
769 tb = 0.5_dp*(f - real(occb(irow_global), kind=
dp))/f
770 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
771 fa(irow_local, icol_local) = t1 + (beta - 1.0_dp)*t2
772 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
774 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
775 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
776 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
777 IF (irow_global == icol_global)
THEN
778 fa(irow_local, icol_local) = t1 - t2
780 fa(irow_local, icol_local) = t1 - 0.5_dp*t2
784 ta = 0.5_dp*(f - real(occa(irow_global), kind=
dp))/f
785 tb = 0.5_dp*(f - real(occb(irow_global), kind=
dp))/f
786 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
787 fa(irow_local, icol_local) = t1 - t2
790 IF ((0 < irow_global) .AND. (irow_global < nbeta))
THEN
792 fa(irow_local, icol_local) = t1
793 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
795 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
796 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
797 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
798 fa(irow_local, icol_local) = t1 - t2
801 fa(irow_local, icol_local) = t1
808 CALL timestop(handle)
810 END SUBROUTINE combine_ks_matrices_2
825 PURE SUBROUTINE correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
827 REAL(kind=
dp),
DIMENSION(:),
INTENT(inout) :: mo_eigenvalues
828 INTEGER,
INTENT(in) :: homo, nmo
829 REAL(kind=
dp),
INTENT(in) :: level_shift
833 DO imo = homo + 1, nmo
834 mo_eigenvalues(imo) = mo_eigenvalues(imo) - level_shift
837 END SUBROUTINE correct_mo_eigenvalues
852 SUBROUTINE shift_unocc_mos(matrix_ks_fm, mo_coeff, homo, &
853 level_shift, is_triangular, matrix_u_fm)
855 TYPE(
cp_fm_type),
INTENT(IN) :: matrix_ks_fm, mo_coeff
856 INTEGER,
INTENT(in) :: homo
857 REAL(kind=
dp),
INTENT(in) :: level_shift
858 LOGICAL,
INTENT(in) :: is_triangular
859 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
861 CHARACTER(len=*),
PARAMETER :: routineN =
'shift_unocc_mos'
863 INTEGER :: handle, nao, nao_red, nmo
864 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: weights
868 CALL timeset(routinen, handle)
870 IF (
PRESENT(matrix_u_fm))
THEN
872 CALL cp_fm_get_info(matrix_u_fm, nrow_global=nao_red, ncol_global=nao)
878 NULLIFY (ao_mo_fmstruct)
880 para_env=mo_coeff%matrix_struct%para_env, context=mo_coeff%matrix_struct%context)
888 IF (
PRESENT(matrix_u_fm))
THEN
889 IF (is_triangular)
THEN
892 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nmo, alpha=1.0_dp)
894 CALL parallel_gemm(
"N",
"N", nao_red, nmo, nao, 1.0_dp, matrix_u_fm, mo_coeff, 0.0_dp, u_mo)
906 ALLOCATE (weights(nmo))
907 weights(1:homo) = 0.0_dp
908 weights(homo + 1:nmo) = level_shift
915 CALL parallel_gemm(
"N",
"T", nao_red, nao_red, nmo, 1.0_dp, u_mo, u_mo_scaled, 1.0_dp, matrix_ks_fm)
920 CALL timestop(handle)
922 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, plan, check_plan)
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, cmo_coeff)
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