20 gto_basis_set_p_type,&
35 USE dbcsr_api,
ONLY: &
36 dbcsr_create, dbcsr_desymmetrize, dbcsr_distribution_type, dbcsr_dot, dbcsr_get_block_p, &
37 dbcsr_get_info, dbcsr_iterator_blocks_left, dbcsr_iterator_next_block, &
38 dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, dbcsr_multiply, &
39 dbcsr_p_type, dbcsr_release, dbcsr_reserve_diag_blocks, dbcsr_set, dbcsr_type, &
40 dbcsr_type_no_symmetry
49 USE lapack,
ONLY: lapack_ssyev,&
60 #include "./base/base_uses.f90"
65 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'mao_methods'
69 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: mat
70 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: eig
91 TYPE(dbcsr_type) :: mao_coef, pmat, smat
92 REAL(kind=
dp),
INTENT(IN) :: eps1
93 INTEGER,
INTENT(IN) :: iolevel, iw
95 INTEGER :: group_handle, i, iatom, info, jatom, &
97 INTEGER,
DIMENSION(:),
POINTER :: col_blk_sizes, mao_blk, row_blk, &
100 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: w, work
101 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: amat, bmat
102 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cblock, pblock, sblock
103 TYPE(dbcsr_distribution_type) :: dbcsr_dist
104 TYPE(dbcsr_iterator_type) :: dbcsr_iter
105 TYPE(mblocks),
ALLOCATABLE,
DIMENSION(:) :: mbl
106 TYPE(mp_comm_type) :: group
108 CALL dbcsr_get_info(mao_coef, nblkrows_total=nblk)
111 NULLIFY (mbl(i)%mat, mbl(i)%eig)
114 CALL dbcsr_iterator_start(dbcsr_iter, mao_coef)
115 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
116 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, cblock)
117 cpassert(iatom == jatom)
119 NULLIFY (pblock, sblock)
120 CALL dbcsr_get_block_p(matrix=pmat, row=iatom, col=jatom, block=pblock, found=found)
122 CALL dbcsr_get_block_p(matrix=smat, row=iatom, col=jatom, block=sblock, found=found)
125 lwork = max(n*n, 100)
126 ALLOCATE (amat(n, n), bmat(n, n), w(n), work(lwork))
127 amat(1:n, 1:n) = pblock(1:n, 1:n)
128 bmat(1:n, 1:n) = sblock(1:n, 1:n)
130 CALL lapack_ssygv(1,
"V",
"U", n, amat, n, bmat, n, w, work, lwork, info)
132 ALLOCATE (mbl(iatom)%mat(n, n), mbl(iatom)%eig(n))
136 mbl(iatom)%eig(i) = w(n - i + 1)
137 mbl(iatom)%mat(1:n, i) = amat(1:n, n - i + 1)
139 cblock(1:n, 1:m) = amat(1:n, n:n - m + 1:-1)
140 DEALLOCATE (amat, bmat, w, work)
142 CALL dbcsr_iterator_stop(dbcsr_iter)
144 IF (eps1 < 10.0_dp)
THEN
145 CALL dbcsr_get_info(mao_coef, row_blk_size=row_blk_sizes, group=group_handle)
146 CALL group%set_handle(group_handle)
147 ALLOCATE (row_blk(nblk), mao_blk(nblk))
149 row_blk = row_blk_sizes
151 IF (
ASSOCIATED(mbl(iatom)%mat))
THEN
155 IF (mbl(iatom)%eig(i) < eps1)
EXIT
158 m = max(m, mbl(iatom)%ma)
163 CALL group%sum(mao_blk)
164 CALL dbcsr_get_info(mao_coef, distribution=dbcsr_dist)
165 CALL dbcsr_release(mao_coef)
166 CALL dbcsr_create(mao_coef, name=
"MAO_COEF", dist=dbcsr_dist, &
167 matrix_type=dbcsr_type_no_symmetry, row_blk_size=row_blk, &
168 col_blk_size=mao_blk, nze=0)
169 CALL dbcsr_reserve_diag_blocks(matrix=mao_coef)
170 DEALLOCATE (mao_blk, row_blk)
172 CALL dbcsr_iterator_start(dbcsr_iter, mao_coef)
173 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
174 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, cblock)
175 cpassert(iatom == jatom)
178 cpassert(n == mbl(iatom)%n .AND. m == mbl(iatom)%ma)
179 cblock(1:n, 1:m) = mbl(iatom)%mat(1:n, 1:m)
181 CALL dbcsr_iterator_stop(dbcsr_iter)
185 IF (iolevel > 2)
THEN
186 CALL dbcsr_get_info(mao_coef, col_blk_size=col_blk_sizes, &
187 row_blk_size=row_blk_sizes, group=group_handle)
188 CALL group%set_handle(group_handle)
190 n = row_blk_sizes(iatom)
191 m = col_blk_sizes(iatom)
194 IF (
ASSOCIATED(mbl(iatom)%mat))
THEN
195 w(1:n) = mbl(iatom)%eig(1:n)
199 WRITE (iw,
'(A,i2,20F8.4)', advance=
"NO")
" Spectrum/Gap ", iatom, w(1:m)
200 WRITE (iw,
'(A,F8.4)')
" || ", w(m + 1)
209 IF (
ASSOCIATED(mbl(i)%mat))
THEN
210 DEALLOCATE (mbl(i)%mat)
212 IF (
ASSOCIATED(mbl(i)%eig))
THEN
213 DEALLOCATE (mbl(i)%eig)
230 TYPE(dbcsr_type) :: mao_coef
231 REAL(kind=
dp),
INTENT(OUT) :: fval
232 TYPE(dbcsr_type) :: qmat, smat, binv
233 LOGICAL,
INTENT(IN) :: reuse
235 REAL(kind=
dp) :: convergence, threshold
236 TYPE(dbcsr_type) :: bmat, scmat, tmat
239 convergence = 1.e-6_dp
241 CALL dbcsr_create(scmat, template=mao_coef)
242 CALL dbcsr_create(bmat, template=binv)
243 CALL dbcsr_create(tmat, template=qmat)
245 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, smat, mao_coef, 0.0_dp, scmat)
246 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef, scmat, 0.0_dp, bmat)
249 norm_convergence=convergence, silent=.true.)
251 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mao_coef, binv, 0.0_dp, scmat)
252 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, scmat, mao_coef, 0.0_dp, tmat)
254 CALL dbcsr_dot(qmat, tmat, fval)
256 CALL dbcsr_release(scmat)
257 CALL dbcsr_release(bmat)
258 CALL dbcsr_release(tmat)
273 TYPE(dbcsr_type) :: mao_coef
274 REAL(kind=
dp),
INTENT(OUT) :: fval
275 TYPE(dbcsr_type) :: mao_grad, qmat, smat, binv
276 LOGICAL,
INTENT(IN) :: reuse
278 REAL(kind=
dp) :: convergence, threshold
279 TYPE(dbcsr_type) :: bmat, scmat, t2mat, tmat
282 convergence = 1.e-6_dp
284 CALL dbcsr_create(scmat, template=mao_coef)
285 CALL dbcsr_create(bmat, template=binv)
286 CALL dbcsr_create(tmat, template=qmat)
287 CALL dbcsr_create(t2mat, template=scmat)
289 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, smat, mao_coef, 0.0_dp, scmat)
290 CALL dbcsr_multiply(
"T",
"N", 1.0_dp, mao_coef, scmat, 0.0_dp, bmat)
293 norm_convergence=convergence, silent=.true.)
295 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, mao_coef, binv, 0.0_dp, scmat)
296 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, scmat, mao_coef, 0.0_dp, tmat)
298 CALL dbcsr_dot(qmat, tmat, fval)
300 CALL dbcsr_multiply(
"N",
"N", 2.0_dp, qmat, scmat, 0.0_dp, mao_grad, &
301 retain_sparsity=.true.)
303 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, qmat, scmat, 0.0_dp, t2mat)
304 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, tmat, t2mat, 0.0_dp, scmat)
305 CALL dbcsr_multiply(
"N",
"N", -2.0_dp, smat, scmat, 1.0_dp, mao_grad, &
306 retain_sparsity=.true.)
308 CALL dbcsr_release(scmat)
309 CALL dbcsr_release(bmat)
310 CALL dbcsr_release(tmat)
311 CALL dbcsr_release(t2mat)
323 TYPE(dbcsr_type) :: mao_coef, smat
325 INTEGER :: i, iatom, info, jatom, lwork, m, n
327 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: w, work
328 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: amat, bmat
329 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cblock, sblock
330 TYPE(dbcsr_iterator_type) :: dbcsr_iter
332 CALL dbcsr_iterator_start(dbcsr_iter, mao_coef)
333 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
334 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, cblock)
335 cpassert(iatom == jatom)
339 CALL dbcsr_get_block_p(matrix=smat, row=iatom, col=jatom, block=sblock, found=found)
341 lwork = max(n*n, 100)
342 ALLOCATE (amat(n, m), bmat(m, m), w(m), work(lwork))
343 amat(1:n, 1:m) = matmul(sblock(1:n, 1:n), cblock(1:n, 1:m))
344 bmat(1:m, 1:m) = matmul(transpose(cblock(1:n, 1:m)), amat(1:n, 1:m))
346 CALL lapack_ssyev(
"V",
"U", m, bmat, m, w, work, lwork, info)
348 cpassert(all(w > 0.0_dp))
351 amat(1:m, i) = bmat(1:m, i)*w(i)
353 bmat(1:m, 1:m) = matmul(amat(1:m, 1:m), transpose(bmat(1:m, 1:m)))
354 cblock(1:n, 1:m) = matmul(cblock(1:n, 1:m), bmat(1:m, 1:m))
355 DEALLOCATE (amat, bmat, w, work)
357 CALL dbcsr_iterator_stop(dbcsr_iter)
368 TYPE(dbcsr_type) :: mao_coef, mao_grad, smat
370 INTEGER :: iatom, jatom, m, n
372 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: amat
373 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: cblock, gblock, sblock
374 TYPE(dbcsr_iterator_type) :: dbcsr_iter
376 CALL dbcsr_iterator_start(dbcsr_iter, mao_coef)
377 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
378 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, cblock)
379 cpassert(iatom == jatom)
383 CALL dbcsr_get_block_p(matrix=smat, row=iatom, col=jatom, block=sblock, found=found)
386 CALL dbcsr_get_block_p(matrix=mao_grad, row=iatom, col=jatom, block=gblock, found=found)
388 ALLOCATE (amat(m, m))
389 amat(1:m, 1:m) = matmul(transpose(cblock(1:n, 1:m)), matmul(sblock(1:n, 1:n), gblock(1:n, 1:m)))
390 gblock(1:n, 1:m) = gblock(1:n, 1:m) - matmul(cblock(1:n, 1:m), amat(1:m, 1:m))
393 CALL dbcsr_iterator_stop(dbcsr_iter)
404 TYPE(dbcsr_type) :: fmat1, fmat2
405 REAL(kind=
dp) :: spro
407 INTEGER :: group_handle, iatom, jatom, m, n
409 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ablock, bblock
410 TYPE(dbcsr_iterator_type) :: dbcsr_iter
411 TYPE(mp_comm_type) :: group
415 CALL dbcsr_iterator_start(dbcsr_iter, fmat1)
416 DO WHILE (dbcsr_iterator_blocks_left(dbcsr_iter))
417 CALL dbcsr_iterator_next_block(dbcsr_iter, iatom, jatom, ablock)
418 cpassert(iatom == jatom)
421 CALL dbcsr_get_block_p(matrix=fmat2, row=iatom, col=jatom, block=bblock, found=found)
423 spro = spro + sum(ablock(1:n, 1:m)*bblock(1:n, 1:m))
425 CALL dbcsr_iterator_stop(dbcsr_iter)
427 CALL dbcsr_get_info(fmat1, group=group_handle)
428 CALL group%set_handle(group_handle)
446 TYPE(dbcsr_type) :: pmat, ksmat, smat
447 TYPE(kpoint_type),
POINTER :: kpoints
448 INTEGER,
INTENT(IN) :: nmos
449 REAL(kind=
dp),
INTENT(IN) :: occ
453 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
454 TYPE(cp_fm_struct_type),
POINTER :: matrix_struct
455 TYPE(cp_fm_type) :: fmksmat, fmsmat, fmvec, fmwork
456 TYPE(dbcsr_type) :: tempmat
460 CALL dbcsr_get_info(smat, nfullrows_total=norb)
462 nrow_global=norb, ncol_global=norb)
467 ALLOCATE (eigenvalues(norb))
470 CALL dbcsr_create(tempmat, template=smat, matrix_type=dbcsr_type_no_symmetry)
473 CALL dbcsr_desymmetrize(smat, tempmat)
475 CALL dbcsr_desymmetrize(ksmat, tempmat)
479 CALL cp_fm_geeig(fmksmat, fmsmat, fmvec, eigenvalues, fmwork)
480 de = eigenvalues(nmos + 1) - eigenvalues(nmos)
481 IF (de < 0.001_dp)
THEN
482 CALL cp_warn(__location__,
"MAO: No band gap at "// &
483 "Gamma point. MAO analysis not reliable.")
488 DEALLOCATE (eigenvalues)
489 CALL dbcsr_release(tempmat)
490 CALL cp_fm_release(fmksmat)
491 CALL cp_fm_release(fmsmat)
492 CALL cp_fm_release(fmvec)
493 CALL cp_fm_release(fmwork)
512 TYPE(qs_environment_type),
POINTER :: qs_env
514 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: mao_basis_set_list, orb_basis_set_list
515 INTEGER,
INTENT(IN),
OPTIONAL :: iunit
516 LOGICAL,
INTENT(IN),
OPTIONAL :: print_basis
518 INTEGER :: ikind, nbas, nkind, unit_nr
519 REAL(kind=
dp) :: eps_pgf_orb
520 TYPE(dft_control_type),
POINTER :: dft_control
521 TYPE(gto_basis_set_type),
POINTER :: basis_set, pbasis
522 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
523 TYPE(qs_kind_type),
POINTER :: qs_kind
526 cpassert(.NOT.
ASSOCIATED(mao_basis_set_list))
527 cpassert(.NOT.
ASSOCIATED(orb_basis_set_list))
530 IF (
PRESENT(iunit))
THEN
536 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
537 nkind =
SIZE(qs_kind_set)
538 ALLOCATE (mao_basis_set_list(nkind), orb_basis_set_list(nkind))
540 NULLIFY (mao_basis_set_list(ikind)%gto_basis_set)
541 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
545 qs_kind => qs_kind_set(ikind)
546 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
547 IF (
ASSOCIATED(basis_set)) orb_basis_set_list(ikind)%gto_basis_set => basis_set
553 qs_kind => qs_kind_set(ikind)
554 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
555 IF (
ASSOCIATED(basis_set)) mao_basis_set_list(ikind)%gto_basis_set => basis_set
559 qs_kind => qs_kind_set(ikind)
560 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"ORB")
562 IF (
ASSOCIATED(basis_set))
THEN
564 CALL get_qs_env(qs_env, dft_control=dft_control)
565 eps_pgf_orb = dft_control%qs_control%eps_pgf_orb
567 pbasis%kind_radius = basis_set%kind_radius
568 mao_basis_set_list(ikind)%gto_basis_set => pbasis
574 qs_kind => qs_kind_set(ikind)
575 CALL get_qs_kind(qs_kind=qs_kind, basis_set=basis_set, basis_type=
"MAO")
576 IF (
ASSOCIATED(basis_set))
THEN
577 basis_set%kind_radius = orb_basis_set_list(ikind)%gto_basis_set%kind_radius
578 mao_basis_set_list(ikind)%gto_basis_set => basis_set
582 cpabort(
"Unknown option for MAO basis")
584 IF (unit_nr > 0)
THEN
586 IF (.NOT.
ASSOCIATED(mao_basis_set_list(ikind)%gto_basis_set))
THEN
587 WRITE (unit=unit_nr, fmt=
"(T2,A,I4)") &
588 "WARNING: No MAO basis set associated with Kind ", ikind
590 nbas = mao_basis_set_list(ikind)%gto_basis_set%nsgf
591 WRITE (unit=unit_nr, fmt=
"(T2,A,I4,T56,A,I10)") &
592 "MAO basis set Kind ", ikind,
" Number of BSF:", nbas
597 IF (
PRESENT(print_basis))
THEN
598 IF (print_basis)
THEN
600 basis_set => mao_basis_set_list(ikind)%gto_basis_set
601 IF (
ASSOCIATED(basis_set))
CALL write_gto_basis_set(basis_set, unit_nr,
"MAO REFERENCE BASIS")
621 qs_kind_set, unit_nr, para_env)
623 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mao_coef, matrix_smm
624 TYPE(gto_basis_set_p_type),
DIMENSION(:),
POINTER :: mao_basis_set_list
625 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
626 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
627 INTEGER,
INTENT(IN) :: unit_nr
628 TYPE(mp_para_env_type),
POINTER :: para_env
630 CHARACTER(len=2) :: element_symbol
631 INTEGER :: ia, iab, iatom, ikind, iset, ishell, &
632 ispin, l, lmax, lshell, m, ma, na, &
635 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: cmask, vec1, vec2
636 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: weight
637 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: block, cmao
638 TYPE(gto_basis_set_type),
POINTER :: basis_set
641 IF (unit_nr > 0)
THEN
642 WRITE (unit_nr,
"(/,A)")
" Analyze angular momentum character of MAOs "
643 WRITE (unit_nr,
"(T7,A,T15,A,T20,A,T40,A,T50,A,T60,A,T70,A,T80,A)") &
644 "ATOM",
"Spin",
"MAO",
"S",
"P",
"D",
"F",
"G"
647 natom =
SIZE(particle_set)
648 nspin =
SIZE(mao_coef)
651 element_symbol=element_symbol, kind_number=ikind)
652 basis_set => mao_basis_set_list(ikind)%gto_basis_set
655 ALLOCATE (cmask(ma), vec1(ma), vec2(ma), weight(0:lmax, na))
657 CALL dbcsr_get_block_p(matrix=matrix_smm(1)%matrix, row=iatom, col=iatom, &
658 block=block, found=found)
660 CALL dbcsr_get_block_p(matrix=mao_coef(ispin)%matrix, row=iatom, col=iatom, &
661 block=cmao, found=found)
666 DO iset = 1, basis_set%nset
667 DO ishell = 1, basis_set%nshell(iset)
668 lshell = basis_set%l(ishell, iset)
669 DO m = -lshell, lshell
671 IF (l == lshell) cmask(iab) = 1.0_dp
676 vec1(1:ma) = cmask*cmao(1:ma, ia)
677 vec2(1:ma) = matmul(block, vec1)
678 weight(l, ia) = sum(vec1(1:ma)*vec2(1:ma))
682 CALL para_env%sum(weight)
683 IF (unit_nr > 0)
THEN
685 IF (ispin == 1 .AND. ia == 1)
THEN
686 WRITE (unit_nr,
"(i6,T9,A2,T17,i2,T20,i3,T31,5F10.4)") &
687 iatom, element_symbol, ispin, ia, weight(0:lmax, ia)
689 WRITE (unit_nr,
"(T17,i2,T20,i3,T31,5F10.4)") ispin, ia, weight(0:lmax, ia)
694 DEALLOCATE (cmask, weight, vec1, vec2)
715 SUBROUTINE mao_build_q(matrix_q, matrix_p, matrix_s, matrix_smm, matrix_smo, smm_list, &
716 electra, eps_filter, nimages, kpoints, matrix_ks, sab_orb)
718 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_q
719 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
720 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_smm, matrix_smo
721 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
723 REAL(kind=
dp),
DIMENSION(2),
INTENT(OUT) :: electra
724 REAL(kind=
dp),
INTENT(IN) :: eps_filter
725 INTEGER,
INTENT(IN),
OPTIONAL :: nimages
726 TYPE(kpoint_type),
OPTIONAL,
POINTER :: kpoints
727 TYPE(dbcsr_p_type),
DIMENSION(:, :),
OPTIONAL, &
729 TYPE(neighbor_list_set_p_type),
DIMENSION(:), &
730 OPTIONAL,
POINTER :: sab_orb
732 INTEGER :: im, ispin, nim, nocc, norb, nspin
733 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
734 REAL(kind=
dp) :: elex, xkp(3)
735 TYPE(dbcsr_type) :: ksmat, pmat, smat, tmat
738 IF (
PRESENT(nimages)) nim = nimages
740 cpassert(
PRESENT(kpoints))
741 cpassert(
PRESENT(matrix_ks))
742 cpassert(
PRESENT(sab_orb))
746 nspin =
SIZE(matrix_p, 1)
748 electra(ispin) = 0.0_dp
750 CALL dbcsr_dot(matrix_p(ispin, im)%matrix, matrix_s(1, im)%matrix, elex)
751 electra(ispin) = electra(ispin) + elex
759 ALLOCATE (matrix_q(ispin)%matrix)
760 CALL dbcsr_create(matrix_q(ispin)%matrix, template=matrix_smm(1)%matrix)
764 CALL dbcsr_create(tmat, template=matrix_smo(1)%matrix, matrix_type=dbcsr_type_no_symmetry)
768 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_smo(1)%matrix, matrix_p(ispin, 1)%matrix, &
769 0.0_dp, tmat, filter_eps=eps_filter)
770 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, tmat, matrix_smo(1)%matrix, &
771 0.0_dp, matrix_q(ispin)%matrix, filter_eps=eps_filter)
774 CALL dbcsr_create(pmat, template=matrix_s(1, 1)%matrix)
775 CALL dbcsr_create(smat, template=matrix_s(1, 1)%matrix)
776 CALL dbcsr_create(ksmat, template=matrix_s(1, 1)%matrix)
780 NULLIFY (cell_to_index)
785 CALL dbcsr_set(ksmat, 0.0_dp)
786 CALL rskp_transform(rmatrix=ksmat, rsmat=matrix_ks, ispin=ispin, &
787 xkp=xkp, cell_to_index=cell_to_index, sab_nl=sab_orb)
788 CALL dbcsr_set(smat, 0.0_dp)
790 xkp=xkp, cell_to_index=cell_to_index, sab_nl=sab_orb)
791 norb = nint(electra(ispin))
792 nocc = mod(2, nspin) + 1
794 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, matrix_smo(1)%matrix, pmat, &
795 0.0_dp, tmat, filter_eps=eps_filter)
796 CALL dbcsr_multiply(
"N",
"T", 1.0_dp, tmat, matrix_smo(1)%matrix, &
797 0.0_dp, matrix_q(ispin)%matrix, filter_eps=eps_filter)
798 CALL dbcsr_release(pmat)
799 CALL dbcsr_release(smat)
800 CALL dbcsr_release(ksmat)
804 CALL dbcsr_release(tmat)
Define the atomic kind types and their sub types.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
subroutine, public add_basis_set_to_container(container, basis_set, basis_set_type)
...
subroutine, public create_primitive_basis_set(basis_set, pbasis)
...
subroutine, public write_gto_basis_set(gto_basis_set, output_unit, header)
Write a Gaussian-type orbital (GTO) basis set data set to the output unit.
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius)
...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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 copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
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.
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_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Routines useful for iterative matrix calculations.
subroutine, public invert_hotelling(matrix_inverse, matrix, threshold, use_inv_as_guess, norm_convergence, filter_eps, accelerator_order, max_iter_lanczos, eps_lanczos, silent)
invert a symmetric positive definite matrix by Hotelling's method explicit symmetrization makes this ...
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.
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.
Interface to the LAPACK F77 library.
Calculate MAO's and analyze wavefunctions.
Calculate MAO's and analyze wavefunctions.
subroutine, public mao_project_gradient(mao_coef, mao_grad, smat)
...
subroutine, public mao_function_gradient(mao_coef, fval, mao_grad, qmat, smat, binv, reuse)
...
subroutine, public mao_reference_basis(qs_env, mao_basis, mao_basis_set_list, orb_basis_set_list, iunit, print_basis)
Define the MAO reference basis set.
subroutine, public mao_orthogonalization(mao_coef, smat)
...
subroutine, public calculate_p_gamma(pmat, ksmat, smat, kpoints, nmos, occ)
Calculate the density matrix at the Gamma point.
subroutine, public mao_initialization(mao_coef, pmat, smat, eps1, iolevel, iw)
...
subroutine, public mao_basis_analysis(mao_coef, matrix_smm, mao_basis_set_list, particle_set, qs_kind_set, unit_nr, para_env)
Analyze the MAO basis, projection on angular functions.
real(kind=dp) function, public mao_scalar_product(fmat1, fmat2)
...
subroutine, public mao_function(mao_coef, fval, qmat, smat, binv, reuse)
...
subroutine, public mao_build_q(matrix_q, matrix_p, matrix_s, matrix_smm, matrix_smo, smm_list, electra, eps_filter, nimages, kpoints, matrix_ks, sab_orb)
Calculte the Q=APA(T) matrix, A=(MAO,ORB) overlap.
Interface to the message passing library MPI.
Define the data structure for the particle information.
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_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, 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, rhs)
Get the QUICKSTEP environment.
Calculate the interaction radii for the operator matrix calculation.
subroutine, public init_interaction_radii_orb_basis(orb_basis_set, eps_pgf_orb, eps_pgf_short)
...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_r3d_rs_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, U_of_dft_plus_u, J_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, J0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, floating, name, element_symbol, pao_basis_size, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
Define the neighbor list data types and the corresponding functionality.