40 USE dbcsr_api,
ONLY: &
41 dbcsr_add, dbcsr_desymmetrize, dbcsr_get_block_p, dbcsr_iterator_blocks_left, &
42 dbcsr_iterator_next_block, dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, &
43 dbcsr_multiply, dbcsr_p_type, dbcsr_type
54 #include "./base/base_uses.f90"
60 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_methods'
61 REAL(KIND=
dp),
PARAMETER :: ratio = 0.25_dp
63 PUBLIC :: combine_ks_matrices, &
71 PRIVATE :: correct_mo_eigenvalues, shift_unocc_mos
73 INTERFACE combine_ks_matrices
74 MODULE PROCEDURE combine_ks_matrices_1, &
76 END INTERFACE combine_ks_matrices
96 iter_delta, iter_count, diis, invert)
97 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: p_mix_new
98 TYPE(mixing_storage_type),
POINTER :: mixing_store
99 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao
100 TYPE(mp_para_env_type),
POINTER :: para_env
101 REAL(kind=
dp),
INTENT(INOUT) :: iter_delta
102 INTEGER,
INTENT(IN) :: iter_count
103 LOGICAL,
INTENT(in),
OPTIONAL :: diis, invert
105 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_env_density_mixing'
107 INTEGER :: handle, ic, ispin
108 LOGICAL :: my_diis, my_invert
109 REAL(kind=
dp) :: my_p_mix, tmp
111 CALL timeset(routinen, handle)
114 IF (
PRESENT(diis)) my_diis = diis
116 IF (
PRESENT(invert)) my_invert = invert
117 my_p_mix = mixing_store%alpha
118 IF (my_diis .OR. iter_count < mixing_store%nskip_mixing)
THEN
123 cpassert(
ASSOCIATED(p_mix_new))
124 DO ic = 1,
SIZE(p_mix_new, 2)
125 DO ispin = 1,
SIZE(p_mix_new, 1)
127 cpassert(my_p_mix /= 0.0_dp)
128 IF (my_p_mix /= 1.0_dp)
THEN
129 CALL dbcsr_add(matrix_a=p_mix_new(ispin, ic)%matrix, &
130 alpha_scalar=1.0_dp/my_p_mix, &
131 matrix_b=rho_ao(ispin, ic)%matrix, &
132 beta_scalar=(my_p_mix - 1.0_dp)/my_p_mix)
135 CALL cp_sm_mix(m1=p_mix_new(ispin, ic)%matrix, &
136 m2=rho_ao(ispin, ic)%matrix, &
140 iter_delta = max(iter_delta, tmp)
145 CALL timestop(handle)
166 cholesky_method, do_level_shift, &
167 level_shift, matrix_u_fm, use_jacobi)
168 TYPE(cp_fm_type),
INTENT(IN) :: matrix_ks_fm
169 TYPE(mo_set_type),
INTENT(IN) :: mo_set
170 TYPE(cp_fm_type),
INTENT(IN) :: ortho, work
171 INTEGER,
INTENT(inout) :: cholesky_method
172 LOGICAL,
INTENT(in) :: do_level_shift
173 REAL(kind=
dp),
INTENT(in) :: level_shift
174 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
175 LOGICAL,
INTENT(in) :: use_jacobi
177 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver'
179 INTEGER :: handle, homo, nao, nmo
180 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
181 TYPE(cp_fm_type),
POINTER :: mo_coeff
183 CALL timeset(routinen, handle)
186 NULLIFY (mo_eigenvalues)
194 eigenvalues=mo_eigenvalues, &
197 SELECT CASE (cholesky_method)
201 IF (do_level_shift) &
202 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, nmo=nmo, nao=nao, &
203 level_shift=level_shift, is_triangular=.true., matrix_u_fm=matrix_u_fm)
207 IF (do_level_shift) &
208 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
213 "SOLVE", pos=
"RIGHT")
215 "SOLVE", pos=
"LEFT", transa=
"T")
217 IF (do_level_shift) &
218 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, nmo=nmo, nao=nao, &
219 level_shift=level_shift, is_triangular=.true., matrix_u_fm=matrix_u_fm)
224 IF (do_level_shift) &
225 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
231 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nao, alpha=1.0_dp)
233 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nao, alpha=1.0_dp)
235 IF (do_level_shift) &
236 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, nmo=nmo, nao=nao, &
237 level_shift=level_shift, is_triangular=.true., matrix_u_fm=matrix_u_fm)
241 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nmo, alpha=1.0_dp)
242 CALL cp_fm_to_fm(work, mo_coeff, nmo, 1, 1)
244 IF (do_level_shift) &
245 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
250 CALL cp_fm_to_fm(mo_coeff, ortho)
254 CALL timestop(handle)
268 TYPE(dbcsr_type),
POINTER :: matrix_ks
269 TYPE(cp_fm_type),
INTENT(IN) :: matrix_ks_fm
270 TYPE(mo_set_type),
INTENT(IN) :: mo_set
271 TYPE(dbcsr_type),
POINTER :: ortho_dbcsr, ksbuf1, ksbuf2
273 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_dbcsr'
275 INTEGER :: handle, nao, nmo
276 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
277 TYPE(cp_fm_type) :: all_evecs, nmo_evecs
278 TYPE(cp_fm_type),
POINTER :: mo_coeff
280 CALL timeset(routinen, handle)
283 NULLIFY (mo_eigenvalues)
288 eigenvalues=mo_eigenvalues, &
292 CALL dbcsr_desymmetrize(matrix_ks, ksbuf2)
293 CALL dbcsr_multiply(
'N',
'N', 1.0_dp, ksbuf2, ortho_dbcsr, 0.0_dp, ksbuf1)
294 CALL dbcsr_multiply(
'T',
'N', 1.0_dp, ortho_dbcsr, ksbuf1, 0.0_dp, ksbuf2)
298 CALL cp_fm_create(all_evecs, matrix_ks_fm%matrix_struct)
303 CALL cp_fm_to_fm(msource=all_evecs, mtarget=nmo_evecs, ncol=nmo)
304 CALL cp_fm_release(all_evecs)
309 CALL cp_fm_release(nmo_evecs)
310 CALL timestop(handle)
327 level_shift, matrix_u_fm, use_jacobi, jacobi_threshold)
328 TYPE(cp_fm_type),
INTENT(IN) :: matrix_ks_fm
329 TYPE(mo_set_type),
INTENT(IN) :: mo_set
330 TYPE(cp_fm_type),
INTENT(IN) :: ortho, work
331 LOGICAL,
INTENT(IN) :: do_level_shift
332 REAL(kind=
dp),
INTENT(IN) :: level_shift
333 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
334 LOGICAL,
INTENT(IN) :: use_jacobi
335 REAL(kind=
dp),
INTENT(IN) :: jacobi_threshold
337 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_symm'
339 INTEGER :: handle, homo, nao, nelectron, nmo
340 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
341 TYPE(cp_fm_type),
POINTER :: mo_coeff
343 CALL timeset(routinen, handle)
346 NULLIFY (mo_eigenvalues)
354 nelectron=nelectron, &
355 eigenvalues=mo_eigenvalues, &
360 CALL cp_fm_symm(
"L",
"U", nao, homo, 1.0_dp, matrix_ks_fm, mo_coeff, 0.0_dp, work)
361 CALL parallel_gemm(
"T",
"N", homo, nao - homo, nao, 1.0_dp, work, mo_coeff, &
362 0.0_dp, matrix_ks_fm, b_first_col=homo + 1, c_first_col=homo + 1)
366 jacobi_threshold, homo + 1)
370 CALL cp_fm_symm(
"L",
"U", nao, nao, 1.0_dp, matrix_ks_fm, ortho, 0.0_dp, work)
371 CALL parallel_gemm(
"T",
"N", nao, nao, nao, 1.0_dp, ortho, work, 0.0_dp, matrix_ks_fm)
373 IF (do_level_shift) &
374 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks_fm, mo_coeff=mo_coeff, homo=homo, nmo=nmo, nao=nao, &
375 level_shift=level_shift, is_triangular=.false., matrix_u_fm=matrix_u_fm)
379 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, ortho, work, 0.0_dp, &
382 IF (do_level_shift) &
383 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
387 CALL timestop(handle)
404 level_shift, use_jacobi, jacobi_threshold)
406 TYPE(cp_fm_type),
INTENT(IN) :: matrix_ks
407 TYPE(mo_set_type),
INTENT(IN) :: mo_set
408 TYPE(cp_fm_type),
INTENT(IN) :: work
409 LOGICAL,
INTENT(IN) :: do_level_shift
410 REAL(kind=
dp),
INTENT(IN) :: level_shift
411 LOGICAL,
INTENT(IN) :: use_jacobi
412 REAL(kind=
dp),
INTENT(IN) :: jacobi_threshold
414 CHARACTER(len=*),
PARAMETER :: routinen =
'eigensolver_simple'
416 INTEGER :: handle, homo, nao, nelectron, nmo
417 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
418 TYPE(cp_fm_type),
POINTER :: mo_coeff
420 CALL timeset(routinen, handle)
423 NULLIFY (mo_eigenvalues)
429 nelectron=nelectron, &
430 eigenvalues=mo_eigenvalues, &
433 IF (do_level_shift)
THEN
435 CALL shift_unocc_mos(matrix_ks_fm=matrix_ks, mo_coeff=mo_coeff, homo=homo, nmo=nmo, nao=nao, &
436 level_shift=level_shift, is_triangular=.false.)
440 CALL cp_fm_symm(
"L",
"U", nao, homo, 1.0_dp, matrix_ks, mo_coeff, 0.0_dp, work)
441 CALL parallel_gemm(
"T",
"N", homo, nao - homo, nao, 1.0_dp, work, mo_coeff, &
442 0.0_dp, matrix_ks, b_first_col=homo + 1, c_first_col=homo + 1)
444 CALL cp_fm_block_jacobi(matrix_ks, mo_coeff, mo_eigenvalues, jacobi_threshold, homo + 1)
449 CALL cp_fm_to_fm(work, mo_coeff, nmo, 1, 1)
453 IF (do_level_shift) &
454 CALL correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
456 CALL timestop(handle)
477 SUBROUTINE cp_sm_mix(m1, m2, p_mix, delta, para_env, m3)
479 TYPE(dbcsr_type),
POINTER :: m1, m2
480 REAL(kind=
dp),
INTENT(IN) :: p_mix
481 REAL(kind=
dp),
INTENT(OUT) :: delta
482 TYPE(mp_para_env_type),
POINTER :: para_env
483 TYPE(dbcsr_type),
OPTIONAL,
POINTER :: m3
485 CHARACTER(len=*),
PARAMETER :: routinen =
'cp_sm_mix'
487 INTEGER :: blk, handle, i, iblock_col, iblock_row, j
489 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: p_delta_block, p_new_block, p_old_block
490 TYPE(dbcsr_iterator_type) :: iter
492 CALL timeset(routinen, handle)
495 CALL dbcsr_iterator_start(iter, m1)
496 DO WHILE (dbcsr_iterator_blocks_left(iter))
497 CALL dbcsr_iterator_next_block(iter, iblock_row, iblock_col, p_new_block, blk)
498 CALL dbcsr_get_block_p(matrix=m2, row=iblock_row, col=iblock_col, &
499 block=p_old_block, found=found)
500 cpassert(
ASSOCIATED(p_old_block))
501 IF (
PRESENT(m3))
THEN
502 CALL dbcsr_get_block_p(matrix=m3, row=iblock_row, col=iblock_col, &
503 block=p_delta_block, found=found)
504 cpassert(
ASSOCIATED(p_delta_block))
506 DO j = 1,
SIZE(p_new_block, 2)
507 DO i = 1,
SIZE(p_new_block, 1)
508 p_delta_block(i, j) = p_new_block(i, j) - p_old_block(i, j)
509 delta = max(delta, abs(p_delta_block(i, j)))
513 DO j = 1,
SIZE(p_new_block, 2)
514 DO i = 1,
SIZE(p_new_block, 1)
515 p_new_block(i, j) = p_new_block(i, j) - p_old_block(i, j)
516 delta = max(delta, abs(p_new_block(i, j)))
517 p_new_block(i, j) = p_old_block(i, j) + p_mix*p_new_block(i, j)
522 CALL dbcsr_iterator_stop(iter)
524 CALL para_env%max(delta)
526 CALL timestop(handle)
538 SUBROUTINE combine_ks_matrices_1(ksa, ksb, occa, occb, roks_parameter)
549 TYPE(cp_fm_type),
INTENT(IN) :: ksa, ksb
550 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: occa, occb
551 REAL(kind=
dp),
DIMENSION(0:2, 0:2, 1:2), &
552 INTENT(IN) :: roks_parameter
554 CHARACTER(LEN=*),
PARAMETER :: routinen =
'combine_ks_matrices_1'
556 INTEGER :: handle, i, icol_global, icol_local, &
557 irow_global, irow_local, j, &
558 ncol_local, nrow_local
559 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
560 LOGICAL :: compatible_matrices
561 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
563 TYPE(cp_fm_struct_type),
POINTER :: ksa_struct, ksb_struct
567 CALL timeset(routinen, handle)
570 matrix_struct=ksa_struct, &
571 nrow_local=nrow_local, &
572 ncol_local=ncol_local, &
573 row_indices=row_indices, &
574 col_indices=col_indices, &
578 matrix_struct=ksb_struct, &
582 cpassert(compatible_matrices)
584 IF (sum(occb) == 0.0_dp) fb = 0.0_dp
586 DO icol_local = 1, ncol_local
587 icol_global = col_indices(icol_local)
588 j = int(occa(icol_global)) + int(occb(icol_global))
589 DO irow_local = 1, nrow_local
590 irow_global = row_indices(irow_local)
591 i = int(occa(irow_global)) + int(occb(irow_global))
592 fa(irow_local, icol_local) = &
593 roks_parameter(i, j, 1)*fa(irow_local, icol_local) + &
594 roks_parameter(i, j, 2)*fb(irow_local, icol_local)
598 CALL timestop(handle)
600 END SUBROUTINE combine_ks_matrices_1
612 SUBROUTINE combine_ks_matrices_2(ksa, ksb, occa, occb, f, nalpha, nbeta)
623 TYPE(cp_fm_type),
INTENT(IN) :: ksa, ksb
624 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: occa, occb
625 REAL(kind=
dp),
INTENT(IN) :: f
626 INTEGER,
INTENT(IN) :: nalpha, nbeta
628 CHARACTER(LEN=*),
PARAMETER :: routinen =
'combine_ks_matrices_2'
630 INTEGER :: handle, icol_global, icol_local, &
631 irow_global, irow_local, ncol_local, &
633 INTEGER,
DIMENSION(:),
POINTER :: col_indices, row_indices
634 LOGICAL :: compatible_matrices
635 REAL(kind=
dp) :: beta, t1, t2, ta, tb
636 REAL(kind=
dp),
CONTIGUOUS,
DIMENSION(:, :), &
638 TYPE(cp_fm_struct_type),
POINTER :: ksa_struct, ksb_struct
642 CALL timeset(routinen, handle)
645 matrix_struct=ksa_struct, &
646 nrow_local=nrow_local, &
647 ncol_local=ncol_local, &
648 row_indices=row_indices, &
649 col_indices=col_indices, &
653 matrix_struct=ksb_struct, &
657 cpassert(compatible_matrices)
659 beta = 1.0_dp/(1.0_dp - f)
661 DO icol_local = 1, ncol_local
663 icol_global = col_indices(icol_local)
665 DO irow_local = 1, nrow_local
667 irow_global = row_indices(irow_local)
669 t1 = 0.5_dp*(fa(irow_local, icol_local) + fb(irow_local, icol_local))
671 IF ((0 < irow_global) .AND. (irow_global <= nbeta))
THEN
672 IF ((0 < icol_global) .AND. (icol_global <= nbeta))
THEN
674 fa(irow_local, icol_local) = t1
675 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
677 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
678 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
679 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
680 fa(irow_local, icol_local) = t1 + (beta - 1.0_dp)*t2
683 fa(irow_local, icol_local) = t1
685 ELSE IF ((nbeta < irow_global) .AND. (irow_global <= nalpha))
THEN
686 IF ((0 < irow_global) .AND. (irow_global <= nbeta))
THEN
688 ta = 0.5_dp*(f - real(occa(irow_global), kind=
dp))/f
689 tb = 0.5_dp*(f - real(occb(irow_global), kind=
dp))/f
690 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
691 fa(irow_local, icol_local) = t1 + (beta - 1.0_dp)*t2
692 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
694 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
695 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
696 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
697 IF (irow_global == icol_global)
THEN
698 fa(irow_local, icol_local) = t1 - t2
700 fa(irow_local, icol_local) = t1 - 0.5_dp*t2
704 ta = 0.5_dp*(f - real(occa(irow_global), kind=
dp))/f
705 tb = 0.5_dp*(f - real(occb(irow_global), kind=
dp))/f
706 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
707 fa(irow_local, icol_local) = t1 - t2
710 IF ((0 < irow_global) .AND. (irow_global < nbeta))
THEN
712 fa(irow_local, icol_local) = t1
713 ELSE IF ((nbeta < icol_global) .AND. (icol_global <= nalpha))
THEN
715 ta = 0.5_dp*(f - real(occa(icol_global), kind=
dp))/f
716 tb = 0.5_dp*(f - real(occb(icol_global), kind=
dp))/f
717 t2 = ta*fa(irow_local, icol_local) + tb*fb(irow_local, icol_local)
718 fa(irow_local, icol_local) = t1 - t2
721 fa(irow_local, icol_local) = t1
728 CALL timestop(handle)
730 END SUBROUTINE combine_ks_matrices_2
745 PURE SUBROUTINE correct_mo_eigenvalues(mo_eigenvalues, homo, nmo, level_shift)
747 REAL(kind=
dp),
DIMENSION(:),
INTENT(inout) :: mo_eigenvalues
748 INTEGER,
INTENT(in) :: homo, nmo
749 REAL(kind=
dp),
INTENT(in) :: level_shift
753 DO imo = homo + 1, nmo
754 mo_eigenvalues(imo) = mo_eigenvalues(imo) - level_shift
757 END SUBROUTINE correct_mo_eigenvalues
774 SUBROUTINE shift_unocc_mos(matrix_ks_fm, mo_coeff, homo, nmo, nao, &
775 level_shift, is_triangular, matrix_u_fm)
777 TYPE(cp_fm_type),
INTENT(IN) :: matrix_ks_fm, mo_coeff
778 INTEGER,
INTENT(in) :: homo, nmo, nao
779 REAL(kind=
dp),
INTENT(in) :: level_shift
780 LOGICAL,
INTENT(in) :: is_triangular
781 TYPE(cp_fm_type),
INTENT(IN),
OPTIONAL :: matrix_u_fm
783 CHARACTER(len=*),
PARAMETER :: routinen =
'shift_unocc_mos'
786 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: weights
787 TYPE(cp_fm_struct_type),
POINTER :: ao_mo_fmstruct
788 TYPE(cp_fm_type) :: u_mo, u_mo_scaled
790 CALL timeset(routinen, handle)
792 NULLIFY (ao_mo_fmstruct)
794 para_env=mo_coeff%matrix_struct%para_env, context=mo_coeff%matrix_struct%context)
802 IF (
PRESENT(matrix_u_fm))
THEN
803 IF (is_triangular)
THEN
804 CALL cp_fm_to_fm(mo_coeff, u_mo)
806 invert_tr=.false., uplo_tr=
"U", n_rows=nao, n_cols=nmo, alpha=1.0_dp)
808 CALL parallel_gemm(
"N",
"N", nao, nmo, nao, 1.0_dp, matrix_u_fm, mo_coeff, 0.0_dp, u_mo)
812 CALL cp_fm_to_fm(mo_coeff, u_mo)
815 CALL cp_fm_to_fm(u_mo, u_mo_scaled)
820 ALLOCATE (weights(nmo))
821 weights(1:homo) = 0.0_dp
822 weights(homo + 1:nmo) = level_shift
829 CALL parallel_gemm(
"N",
"T", nao, nao, nmo, 1.0_dp, u_mo, u_mo_scaled, 1.0_dp, matrix_ks_fm)
831 CALL cp_fm_release(u_mo_scaled)
832 CALL cp_fm_release(u_mo)
834 CALL timestop(handle)
836 END SUBROUTINE shift_unocc_mos
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_upper_to_full(matrix, work)
given an upper triangular matrix 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_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
subroutine, public cp_fm_cholesky_restore(matrix, neig, matrixb, matrixout, op, pos, transa)
...
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_block_jacobi(matrix, eigenvectors, eigval, thresh, start_sec_block)
...
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, use_sp)
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_symm(matrix_ks_fm, mo_set, ortho, work, do_level_shift, level_shift, matrix_u_fm, use_jacobi, jacobi_threshold)
...
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 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)