119#include "./base/base_uses.f90"
124 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'iao_analysis'
129 MODULE PROCEDURE iao_calculate_dmat_diag, &
130 iao_calculate_dmat_full
149 INTEGER,
INTENT(IN) :: unit_nr
150 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
151 OPTIONAL :: c_iao_coef
152 TYPE(
mo_set_type),
DIMENSION(:),
OPTIONAL,
POINTER :: mos
153 REAL(kind=
dp),
DIMENSION(:, :, :),
OPTIONAL :: bond_centers
155 CHARACTER(len=*),
PARAMETER :: routinen =
'iao_wfn_analysis'
157 CHARACTER(LEN=2) :: element_symbol
158 CHARACTER(LEN=default_string_length) :: bname
159 INTEGER :: handle, i, iatom, ikind, isgf, ispin, &
160 nao, natom, nimages, nkind, no, norb, &
161 nref, ns, nsgf, nspin, nvec, nx, order
162 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: first_sgf, last_sgf, nsgfat
163 INTEGER,
DIMENSION(2) :: nocc
164 LOGICAL :: cubes_iao, cubes_ibo, molden_iao, &
165 molden_ibo, uniform_occupation
166 REAL(kind=
dp) :: fin, fout, t1, t2, trace, zval
167 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fdiag
168 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: mcharge
169 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: moments
170 REAL(kind=
dp),
DIMENSION(:),
POINTER :: occupation_numbers
176 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: c_loc_orb, ciao, cloc, cvec, iao_coef
177 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: zij_atom
179 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: sref, sro, sxo
180 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
187 TYPE(
mo_set_type),
ALLOCATABLE,
DIMENSION(:) :: mo_iao, mo_loc
190 POINTER :: sro_list, srr_list, sxo_list
192 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
196 ibo_cc_section, ibo_cubes_section, &
200 cpassert(iao_env%do_iao)
203 CALL get_qs_env(qs_env, dft_control=dft_control)
204 nspin = dft_control%nspins
205 nimages = dft_control%nimages
206 IF (nimages > 1)
THEN
207 IF (unit_nr > 0)
THEN
208 WRITE (unit=unit_nr, fmt=
"(T2,A)") &
209 "K-Points: Intrinsic Atomic Orbitals Analysis not available."
212 IF (nimages > 1)
RETURN
214 CALL timeset(routinen, handle)
216 IF (unit_nr > 0)
THEN
217 WRITE (unit_nr,
'(/,T2,A)')
'!-----------------------------------------------------------------------------!'
218 WRITE (unit=unit_nr, fmt=
"(T24,A)")
"INTRINSIC ATOMIC ORBITALS ANALYSIS"
219 WRITE (unit=unit_nr, fmt=
"(T13,A)")
"G. Knizia, J. Chem. Theory Comput. 9, 4834-4843 (2013)"
220 WRITE (unit_nr,
'(T2,A)')
'!-----------------------------------------------------------------------------!'
225 iao_molden_section => iao_env%iao_molden_section
226 iao_cubes_section => iao_env%iao_cubes_section
227 ibo_molden_section => iao_env%ibo_molden_section
228 ibo_cubes_section => iao_env%ibo_cubes_section
229 ibo_cc_section => iao_env%ibo_cc_section
233 IF (
ASSOCIATED(iao_molden_section))
THEN
237 IF (
ASSOCIATED(iao_cubes_section))
THEN
241 IF (
ASSOCIATED(ibo_molden_section))
THEN
245 IF (
ASSOCIATED(ibo_cubes_section))
THEN
254 smat => matrix_s(1, 1)%matrix
256 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
257 nkind =
SIZE(qs_kind_set)
258 ALLOCATE (ref_basis_set_list(nkind), orb_basis_set_list(nkind))
260 qs_kind => qs_kind_set(ikind)
261 NULLIFY (ref_basis_set_list(ikind)%gto_basis_set)
262 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
263 NULLIFY (refbasis, orbbasis)
264 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orbbasis, basis_type=
"ORB")
265 IF (
ASSOCIATED(orbbasis)) orb_basis_set_list(ikind)%gto_basis_set => orbbasis
266 CALL get_qs_kind(qs_kind=qs_kind, basis_set=refbasis, basis_type=
"MIN")
267 IF (
ASSOCIATED(refbasis)) ref_basis_set_list(ikind)%gto_basis_set => refbasis
271 NULLIFY (srr_list, sro_list)
279 ref_basis_set_list, ref_basis_set_list, srr_list)
281 ref_basis_set_list, orb_basis_set_list, sro_list)
283 IF (
PRESENT(mos))
THEN
289 CALL dbcsr_get_info(sro(1)%matrix, nfullrows_total=nref, nfullcols_total=nao)
293 CALL cp_fm_struct_create(fm_struct, context=mo_coeff%matrix_struct%context, nrow_global=nref, &
294 ncol_global=nao, para_env=mo_coeff%matrix_struct%para_env)
298 CALL cp_fm_struct_create(fm_struct, context=mo_coeff%matrix_struct%context, nrow_global=nao, &
299 ncol_global=nref, para_env=mo_coeff%matrix_struct%para_env)
303 CALL iao_projectors(smat, sref(1)%matrix, sro(1)%matrix, p_orb_ref, p_ref_orb, iao_env%eps_svd)
308 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nmo=norb, uniform_occupation=uniform_occupation, &
309 occupation_numbers=occupation_numbers)
310 IF (uniform_occupation)
THEN
315 IF (occupation_numbers(i) > iao_env%eps_occ)
THEN
325 ALLOCATE (iao_coef(nspin), cvec(nspin))
327 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff)
331 CALL cp_fm_struct_create(fm_struct, ncol_global=nvec, template_fmstruct=mo_coeff%matrix_struct)
337 CALL cp_fm_struct_create(fm_struct, ncol_global=nref, template_fmstruct=mo_coeff%matrix_struct)
341 CALL intrinsic_ao_calc(smat, p_orb_ref, p_ref_orb, cvec(ispin), iao_coef(ispin))
345 IF (iao_env%do_charges)
THEN
347 ALLOCATE (ciao(nspin))
349 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=norb)
352 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, template_fmstruct=mo_coeff%matrix_struct)
357 CALL parallel_gemm(
'T',
'N', nref, norb, nao, 1.0_dp, iao_coef(ispin), smo, 0.0_dp, ciao(ispin))
362 IF (unit_nr > 0)
THEN
363 WRITE (unit_nr,
'(/,T2,A)')
'Intrinsic AO Population Analysis '
365 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
366 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
367 ALLOCATE (mcharge(natom, nspin))
371 uniform_occupation=uniform_occupation, &
372 occupation_numbers=occupation_numbers)
379 IF (unit_nr > 0)
THEN
380 WRITE (unit_nr,
'(T2,A,I2,T66,F15.4)')
'Number of Electrons: Trace(Piao) Spin ', ispin, trace
385 CALL print_atomic_charges(particle_set, qs_kind_set, unit_nr,
"Intrinsic Atomic Orbital Charges", &
386 electronic_charges=mcharge)
399 DEALLOCATE (orb_basis_set_list)
401 IF (iao_env%do_oce)
THEN
403 IF (unit_nr > 0)
THEN
404 WRITE (unit_nr,
'(T2,A)')
"IAO One-Center Expansion: OCE Basis Set"
406 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
407 nkind =
SIZE(qs_kind_set)
408 ALLOCATE (oce_basis_set_list(nkind), orb_basis_set_list(nkind))
410 qs_kind => qs_kind_set(ikind)
411 NULLIFY (orb_basis_set_list(ikind)%gto_basis_set)
413 CALL get_qs_kind(qs_kind=qs_kind, basis_set=orbbasis, basis_type=
"ORB")
414 IF (
ASSOCIATED(orbbasis)) orb_basis_set_list(ikind)%gto_basis_set => orbbasis
417 orbbasis => orb_basis_set_list(ikind)%gto_basis_set
418 cpassert(
ASSOCIATED(orbbasis))
420 CALL create_oce_basis(ocebasis, orbbasis, iao_env%lmax_oce, iao_env%nbas_oce)
423 oce_basis_set_list(ikind)%gto_basis_set => ocebasis
424 IF (unit_nr > 0)
THEN
425 qs_kind => qs_kind_set(ikind)
426 CALL get_qs_kind(qs_kind, zeff=zval, element_symbol=element_symbol)
428 WRITE (unit_nr,
'(T2,A,A,T14,A,I4,T40,A,A30)')
"Kind: ", element_symbol,
"NBasFun: ", nsgf, &
429 "OCE Basis: ", adjustl(trim(bname))
432 IF (unit_nr > 0)
WRITE (unit_nr, *)
434 ALLOCATE (smat_kind(nkind))
436 ocebasis => oce_basis_set_list(ikind)%gto_basis_set
438 ALLOCATE (smat_kind(ikind)%array(nsgf, nsgf))
440 CALL oce_overlap_matrix(smat_kind, oce_basis_set_list)
442 NULLIFY (sxo, sxo_list)
446 oce_basis_set_list, orb_basis_set_list, sxo_list)
450 ALLOCATE (oce_atom(natom, nspin))
451 CALL iao_oce_expansion(qs_env, oce_basis_set_list, smat_kind, sxo, iao_coef, oce_atom, unit_nr)
454 ocebasis => oce_basis_set_list(ikind)%gto_basis_set
457 DEALLOCATE (oce_basis_set_list, orb_basis_set_list)
462 DEALLOCATE (smat_kind(ikind)%array)
464 DEALLOCATE (smat_kind)
467 DEALLOCATE (oce_atom(iatom, ispin)%array)
470 DEALLOCATE (oce_atom)
475 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
477 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
478 IF (unit_nr > 0)
THEN
479 WRITE (unit_nr,
'(T2,A)')
' Write IAO in MOLDEN Format'
481 ALLOCATE (mo_iao(nspin))
484 CALL allocate_mo_set(mo_iao(ispin), nao, nref, nref, 0.0_dp, 1.0_dp, 0.0_dp)
485 CALL init_mo_set(mo_iao(ispin), fm_ref=iao_coef(ispin), name=
"iao_set")
486 CALL cp_fm_to_fm(iao_coef(ispin), mo_iao(ispin)%mo_coeff)
488 mo_iao(ispin)%occupation_numbers = 1.0_dp
491 CALL write_mos_molden(mo_iao, qs_kind_set, particle_set, iao_molden_section, cell=cell, qs_env=qs_env)
498 IF (unit_nr > 0)
THEN
499 WRITE (unit_nr,
'(T2,A)')
' Write IAO as CUBE Files'
502 CALL print_iao_cubes(qs_env, iao_cubes_section, iao_coef, ref_basis_set_list)
506 IF (iao_env%do_bondorbitals)
THEN
507 IF (unit_nr > 0)
THEN
508 WRITE (unit_nr,
'(/,T2,A)')
'Intrinsic Bond Orbital Generation'
511 ALLOCATE (ciao(nspin))
513 CALL get_mo_set(my_mos(ispin), mo_coeff=mo_coeff, nao=nao, nmo=norb)
516 CALL cp_fm_struct_create(fm_struct, nrow_global=nref, template_fmstruct=mo_coeff%matrix_struct)
521 CALL parallel_gemm(
'T',
'N', nref, norb, nao, 1.0_dp, iao_coef(ispin), smo, 0.0_dp, ciao(ispin))
527 ALLOCATE (cloc(nspin), c_loc_orb(nspin))
531 template_fmstruct=ciao(ispin)%matrix_struct)
534 CALL cp_fm_to_fm(ciao(ispin), cloc(ispin), ncol=nocc(ispin))
537 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set, natom=natom)
538 ALLOCATE (first_sgf(natom), last_sgf(natom), nsgfat(natom))
539 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
540 CALL get_particle_set(particle_set, qs_kind_set, first_sgf=first_sgf, last_sgf=last_sgf, &
541 nsgf=nsgfat, basis=ref_basis_set_list)
544 cpabort(
"IAO localization operator NYA")
547 cpabort(
"IAO energy weight localization NYA")
553 ALLOCATE (zij_atom(natom, 1), fdiag(nvec))
556 template_fmstruct=cloc(ispin)%matrix_struct)
559 isgf = first_sgf(iatom)
560 CALL parallel_gemm(
'T',
'N', nvec, nvec, nsgfat(iatom), 1.0_dp, cloc(ispin), cloc(ispin), &
561 0.0_dp, zij_atom(iatom, 1), &
562 a_first_col=1, a_first_row=isgf, b_first_col=1, b_first_row=isgf)
571 fin = fin + sum(fdiag**order)
573 fin = fin**(1._dp/order)
578 isgf = first_sgf(iatom)
579 CALL parallel_gemm(
'T',
'N', nvec, nvec, nsgfat(iatom), 1.0_dp, cloc(ispin), cloc(ispin), &
580 0.0_dp, zij_atom(iatom, 1), &
581 a_first_col=1, a_first_row=isgf, b_first_col=1, b_first_row=isgf)
586 fout = fout + sum(fdiag**order)
588 fout = fout**(1._dp/order)
591 IF (unit_nr > 0)
THEN
592 WRITE (unit_nr,
'(T2,A,F14.8,A,F14.8,A,F8.2)') &
593 'SCDM pre-localization: fin=', fin,
" fout=", fout,
" Time=", t2 - t1
596 CALL pm_localization(zij_atom, cloc(ispin), order, 1.e-12_dp, unit_nr)
602 template_fmstruct=cloc(ispin)%matrix_struct)
605 CALL parallel_gemm(
'N',
'N', nao, nvec, nref, 1.0_dp, iao_coef(ispin), cloc(ispin), &
606 0.0_dp, c_loc_orb(ispin))
609 DEALLOCATE (first_sgf, last_sgf, nsgfat)
612 IF (iao_env%do_center)
THEN
613 IF (unit_nr > 0)
THEN
614 WRITE (unit_nr,
'(T2,A)')
' Calculate Localized Orbital Centers and Spread'
615 IF (iao_env%pos_periodic)
THEN
616 WRITE (unit_nr,
'(T2,A)')
' Use Berry Phase Position Operator'
618 WRITE (unit_nr,
'(T2,A)')
' Use Local Position Operator'
623 ALLOCATE (moments(5, nvec, nspin))
625 IF (iao_env%pos_periodic)
THEN
626 CALL center_spread_berry(qs_env, c_loc_orb, moments)
628 CALL center_spread_loc(qs_env, c_loc_orb, moments)
631 IF (
ASSOCIATED(ibo_cc_section))
THEN
635 IF (
PRESENT(bond_centers))
THEN
636 nx =
SIZE(bond_centers, 1)
637 no =
SIZE(bond_centers, 2)
638 ns =
SIZE(bond_centers, 3)
640 cpassert(ns == nspin)
643 bond_centers(1:nx, 1:nvec, 1:ns) = moments(1:nx, 1:nvec, 1:ns)
649 CALL get_qs_env(qs_env=qs_env, qs_kind_set=qs_kind_set)
650 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set)
651 IF (unit_nr > 0)
THEN
652 WRITE (unit_nr,
'(T2,A)')
' Write IBO in MOLDEN Format'
654 ALLOCATE (mo_loc(nspin))
658 CALL allocate_mo_set(mo_loc(ispin), nao, nvec, nvec, 0.0_dp, 1.0_dp, 0.0_dp)
659 CALL init_mo_set(mo_loc(ispin), fm_ref=c_loc_orb(ispin), name=
"ibo_orb")
660 CALL cp_fm_to_fm(c_loc_orb(ispin), mo_loc(ispin)%mo_coeff)
662 mo_loc(ispin)%occupation_numbers = 1.0_dp
665 CALL write_mos_molden(mo_loc, qs_kind_set, particle_set, ibo_molden_section, cell=cell, qs_env=qs_env)
673 IF (unit_nr > 0)
THEN
674 WRITE (unit_nr,
'(T2,A)')
' Write IBO on CUBE files'
677 CALL print_ibo_cubes(qs_env, ibo_cubes_section, c_loc_orb)
680 IF (
PRESENT(mos) .AND.
ALLOCATED(c_loc_orb))
THEN
683 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff)
685 CALL cp_fm_to_fm(c_loc_orb(ispin), mo_coeff, ncol=nvec)
690 DEALLOCATE (ref_basis_set_list)
692 IF (
PRESENT(c_iao_coef))
THEN
694 ALLOCATE (c_iao_coef(nspin))
696 CALL cp_fm_create(c_iao_coef(ispin), iao_coef(ispin)%matrix_struct)
697 CALL cp_fm_to_fm(iao_coef(ispin), c_iao_coef(ispin))
702 IF (unit_nr > 0)
THEN
703 WRITE (unit_nr,
'(T2,A)') &
704 '!----------------------------END OF IAO ANALYSIS------------------------------!'
707 CALL timestop(handle)
720 SUBROUTINE iao_projectors(smat, sref, s_r_o, p_o_r, p_r_o, eps_svd)
721 TYPE(
dbcsr_type),
INTENT(INOUT) :: smat, sref, s_r_o
722 TYPE(
cp_fm_type),
INTENT(INOUT) :: p_o_r, p_r_o
723 REAL(kind=
dp),
INTENT(IN) :: eps_svd
725 CHARACTER(len=*),
PARAMETER :: routinen =
'iao_projectors'
727 INTEGER :: handle, norb, nref
731 CALL timeset(routinen, handle)
739 template_fmstruct=p_r_o%matrix_struct)
745 CALL parallel_gemm(
'N',
'T', norb, nref, norb, 1.0_dp, fm_inv, fm_sro, 0.0_dp, p_o_r)
751 template_fmstruct=p_r_o%matrix_struct)
757 CALL parallel_gemm(
'N',
'N', nref, norb, nref, 1.0_dp, fm_inv, fm_sro, 0.0_dp, p_r_o)
763 CALL timestop(handle)
765 END SUBROUTINE iao_projectors
775 SUBROUTINE intrinsic_ao_calc(smat, p_o_r, p_r_o, cvec, avec)
777 TYPE(
cp_fm_type),
INTENT(INOUT) :: p_o_r, p_r_o, cvec, avec
779 CHARACTER(len=*),
PARAMETER :: routinen =
'intrinsic_ao_calc'
781 INTEGER :: handle, nao, norb, nref
785 CALL timeset(routinen, handle)
794 template_fmstruct=cvec%matrix_struct)
798 CALL parallel_gemm(
'N',
'N', nref, norb, nao, 1.0_dp, p_r_o, cvec, 0.0_dp, pc)
800 CALL parallel_gemm(
'N',
'N', nao, norb, nref, 1.0_dp, p_o_r, pc, 0.0_dp, ctvec)
809 template_fmstruct=cvec%matrix_struct)
813 CALL parallel_gemm(
'T',
'N', norb, nref, nao, 1.0_dp, sct, p_o_r, 0.0_dp, pc)
816 template_fmstruct=cvec%matrix_struct)
819 CALL parallel_gemm(
'N',
'N', nao, nref, norb, 1.0_dp, ctvec, pc, 0.0_dp, vec1)
821 CALL parallel_gemm(
'T',
'N', norb, nref, nao, 1.0_dp, sc, vec1, 0.0_dp, pc)
822 CALL parallel_gemm(
'N',
'N', nao, nref, norb, 1.0_dp, cvec, pc, 0.0_dp, avec)
824 CALL cp_fm_geadd(1.0_dp,
'N', p_o_r, -1.0_dp, vec1)
828 CALL parallel_gemm(
'T',
'N', norb, nref, nao, 1.0_dp, sc, vec1, 0.0_dp, pc)
829 CALL parallel_gemm(
'N',
'N', nao, nref, norb, -1.0_dp, cvec, pc, 1.0_dp, avec)
840 CALL timestop(handle)
842 END SUBROUTINE intrinsic_ao_calc
851 SUBROUTINE iao_calculate_dmat_diag(cvec, density_matrix, occupation, uniform_occupation)
855 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: occupation
856 LOGICAL,
INTENT(IN) :: uniform_occupation
858 CHARACTER(len=*),
PARAMETER :: routineN =
'iao_calculate_dmat_diag'
860 INTEGER :: handle, ncol
861 REAL(KIND=
dp) :: alpha
864 CALL timeset(routinen, handle)
869 IF (.NOT. uniform_occupation)
THEN
875 matrix_v=cvec, matrix_g=fm_tmp, &
876 ncol=ncol, alpha=alpha)
879 alpha = occupation(1)
881 matrix_v=cvec, ncol=ncol, alpha=alpha)
884 CALL timestop(handle)
886 END SUBROUTINE iao_calculate_dmat_diag
895 SUBROUTINE iao_calculate_dmat_full(cvec, density_matrix, weight, occmat)
899 REAL(KIND=
dp),
DIMENSION(:),
INTENT(IN) :: weight
902 CHARACTER(len=*),
PARAMETER :: routinen =
'iao_calculate_dmat_full'
904 INTEGER :: handle, ic, jc, ncol
905 REAL(kind=
dp) :: alpha
909 CALL timeset(routinen, handle)
914 template_fmstruct=cvec%matrix_struct)
921 CALL cp_fm_to_fm(cvec, fm1, ncol=1, source_start=ic, target_start=1)
923 CALL cp_fm_to_fm(cvec, fm2, ncol=1, source_start=jc, target_start=1)
925 alpha = weight(ic)*alpha
927 alpha=alpha, symmetry_mode=1)
933 CALL timestop(handle)
935 END SUBROUTINE iao_calculate_dmat_full
944 REAL(kind=
dp),
DIMENSION(:) :: charges
946 INTEGER :: i, iblock_col, iblock_row
947 REAL(kind=
dp) :: trace
948 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: p_block
958 cpassert(iblock_row == iblock_col)
960 DO i = 1,
SIZE(p_block, 1)
961 trace = trace + p_block(i, i)
963 charges(iblock_row) = trace
968 CALL group%sum(charges)
979 SUBROUTINE print_iao_cubes(qs_env, print_section, iao_coef, basis_set_list)
982 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: iao_coef
985 CHARACTER(LEN=default_path_length) :: filename, title
986 INTEGER :: i, i_rep, ispin, ivec, iw, j, n_rep, &
987 nat, natom, norb, nspins, nstart
988 INTEGER,
DIMENSION(:),
POINTER :: atom_list, blk_sizes, first_bas, stride
1000 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1007 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1008 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
1012 ALLOCATE (blk_sizes(natom), first_bas(0:natom))
1013 CALL get_particle_set(particle_set, qs_kind_set, nsgf=blk_sizes, basis=basis_set_list)
1016 first_bas(i) = first_bas(i - 1) + blk_sizes(i)
1019 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1020 CALL auxbas_pw_pool%create_pw(wf_r)
1021 CALL auxbas_pw_pool%create_pw(wf_g)
1023 nspins =
SIZE(iao_coef)
1024 nstart = min(1, n_rep)
1026 DO ispin = 1, nspins
1027 DO i_rep = nstart, n_rep
1029 IF (i_rep == 0)
THEN
1033 nat =
SIZE(atom_list)
1036 IF (i_rep == 0)
THEN
1041 cpassert(j >= 1 .AND. j <= natom)
1042 DO ivec = first_bas(j - 1) + 1, first_bas(j)
1043 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"IAO_", ivec,
"_", ispin
1044 WRITE (title, *)
"Intrinsic Atomic Orbitals ", ivec,
" atom ", j,
" spin ", ispin
1047 middle_name=trim(filename), file_position=
"REWIND", log_filename=.false., &
1050 cell, dft_control, particle_set, pw_env)
1051 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
1057 DEALLOCATE (blk_sizes, first_bas)
1058 CALL auxbas_pw_pool%give_back_pw(wf_r)
1059 CALL auxbas_pw_pool%give_back_pw(wf_g)
1061 END SUBROUTINE print_iao_cubes
1069 SUBROUTINE print_ibo_cubes(qs_env, print_section, ibo_coef)
1072 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: ibo_coef
1074 CHARACTER(LEN=default_path_length) :: filename, title
1075 INTEGER :: i, i_rep, ispin, iw, j, n_rep, norb, &
1076 nspins, nstart, nstate
1077 INTEGER,
DIMENSION(:),
POINTER :: state_list, stride
1089 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1092 cpassert(
ASSOCIATED(print_section))
1098 CALL get_qs_env(qs_env=qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1099 subsys=subsys, cell=cell, particle_set=particle_set, pw_env=pw_env, dft_control=dft_control)
1102 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1103 CALL auxbas_pw_pool%create_pw(wf_r)
1104 CALL auxbas_pw_pool%create_pw(wf_g)
1106 nspins =
SIZE(ibo_coef)
1107 nstart = min(1, n_rep)
1109 DO ispin = 1, nspins
1110 DO i_rep = nstart, n_rep
1112 IF (i_rep == 0)
THEN
1116 nstate =
SIZE(state_list)
1119 IF (i_rep == 0)
THEN
1124 cpassert(j >= 1 .AND. j <= norb)
1125 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"IBO_", j,
"_", ispin
1126 WRITE (title, *)
"Intrinsic Atomic Orbitals ", j,
" spin ", ispin
1129 middle_name=trim(filename), file_position=
"REWIND", log_filename=.false., &
1132 cell, dft_control, particle_set, pw_env)
1133 CALL cp_pw_to_cube(wf_r, iw, title, particles=particles, stride=stride, mpi_io=mpi_io)
1139 CALL auxbas_pw_pool%give_back_pw(wf_r)
1140 CALL auxbas_pw_pool%give_back_pw(wf_g)
1142 END SUBROUTINE print_ibo_cubes
1152 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(IN) :: moments
1153 INTEGER,
DIMENSION(:),
INTENT(IN) :: nocc
1155 INTEGER,
INTENT(IN),
OPTIONAL :: iounit
1157 CHARACTER(LEN=default_path_length) :: filename
1158 INTEGER :: is, ispin, iw, nspin
1162 nspin =
SIZE(moments, 3)
1164 IF (
PRESENT(print_section))
THEN
1165 WRITE (filename,
'(A18,I1.1)')
"IBO_CENTERS_SPREAD"
1167 middle_name=trim(filename), file_position=
"REWIND", log_filename=.false.)
1168 ELSEIF (
PRESENT(iounit))
THEN
1175 WRITE (iw,
"(T2,A,i1)")
"Intrinsic Bond Orbitals: Centers and Spread for Spin ", ispin
1176 WRITE (iw,
"(A7,T30,A6,T68,A7)")
"State",
"Center",
"Spreads"
1177 DO is = 1, nocc(ispin)
1178 WRITE (iw,
"(i7,3F15.8,8X,2F10.5)") is, moments(:, is, ispin)
1182 IF (
PRESENT(print_section))
THEN
1194 SUBROUTINE center_spread_loc(qs_env, c_loc_orb, moments)
1196 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: c_loc_orb
1197 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: moments
1199 CHARACTER(len=*),
PARAMETER :: routinen =
'center_spread_loc'
1200 INTEGER,
DIMENSION(6),
PARAMETER ::
list = [1, 2, 3, 4, 7, 9]
1202 INTEGER :: handle, i, iop, iorb, ispin, nao, norb, &
1204 REAL(kind=
dp) :: xmii
1205 REAL(kind=
dp),
DIMENSION(3) :: rpoint
1210 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_s
1213 CALL timeset(routinen, handle)
1215 CALL get_qs_env(qs_env=qs_env, matrix_s_kp=matrix_s)
1216 smat => matrix_s(1, 1)%matrix
1218 nspin =
SIZE(c_loc_orb)
1221 ALLOCATE (dipmat(9))
1223 ALLOCATE (dipmat(i)%matrix)
1225 CALL dbcsr_set(dipmat(i)%matrix, 0.0_dp)
1231 CALL cp_fm_get_info(c_loc_orb(ispin), nrow_global=nao, ncol_global=norb)
1232 CALL cp_fm_create(ocvec, c_loc_orb(ispin)%matrix_struct)
1235 template_fmstruct=c_loc_orb(ispin)%matrix_struct)
1240 omat => dipmat(iop)%matrix
1242 CALL parallel_gemm(
'T',
'N', norb, norb, nao, 1.0_dp, c_loc_orb(ispin), ocvec, &
1247 moments(iop, iorb, ispin) = moments(iop, iorb, ispin) + xmii
1248 moments(4, iorb, ispin) = moments(4, iorb, ispin) - xmii**2
1250 moments(4, iorb, ispin) = moments(4, iorb, ispin) + xmii
1260 DEALLOCATE (dipmat(i)%matrix)
1267 moments(1:3, iorb, ispin) =
pbc(moments(1:3, iorb, ispin), cell)
1271 CALL timestop(handle)
1273 END SUBROUTINE center_spread_loc
1281 SUBROUTINE center_spread_berry(qs_env, c_loc_orb, moments)
1283 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: c_loc_orb
1284 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: moments
1286 CHARACTER(len=*),
PARAMETER :: routinen =
'center_spread_berry'
1288 COMPLEX(KIND=dp) :: z
1289 INTEGER :: dim_op, handle, i, idir, ispin, istate, &
1290 j, jdir, nao, norb, nspin
1291 REAL(
dp),
DIMENSION(3) :: c, cpbc
1292 REAL(
dp),
DIMENSION(6) :: weights
1293 REAL(kind=
dp) :: imagpart, realpart, spread_i, spread_ii
1297 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: zij
1299 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: op_sm_set
1301 CALL timeset(routinen, handle)
1303 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, cell=cell)
1305 IF (cell%orthorhombic)
THEN
1310 ALLOCATE (op_sm_set(2, dim_op))
1313 NULLIFY (op_sm_set(j, i)%matrix)
1314 ALLOCATE (op_sm_set(j, i)%matrix)
1315 CALL dbcsr_copy(op_sm_set(j, i)%matrix, matrix_s(1)%matrix)
1316 CALL dbcsr_set(op_sm_set(j, i)%matrix, 0.0_dp)
1323 nspin =
SIZE(c_loc_orb, 1)
1325 CALL cp_fm_get_info(c_loc_orb(ispin), nrow_global=nao, ncol_global=norb)
1326 CALL cp_fm_create(opvec, c_loc_orb(ispin)%matrix_struct)
1329 template_fmstruct=c_loc_orb(ispin)%matrix_struct)
1330 ALLOCATE (zij(2, dim_op))
1338 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, c_loc_orb(ispin), opvec, 0.0_dp, zij(j, i))
1352 z = cmplx(realpart, imagpart,
dp)
1353 spread_i = spread_i - weights(jdir)* &
1354 log(realpart*realpart + imagpart*imagpart)/
twopi/
twopi
1355 spread_ii = spread_ii + weights(jdir)* &
1356 (1.0_dp - (realpart*realpart + imagpart*imagpart))/
twopi/
twopi
1359 c(idir) = c(idir) + &
1360 (cell%hmat(idir, jdir)/
twopi)*aimag(log(z))
1365 moments(1:3, istate, ispin) = cpbc(1:3)
1366 moments(4, istate, ispin) = spread_i
1367 moments(5, istate, ispin) = spread_ii
1377 DEALLOCATE (op_sm_set(j, i)%matrix)
1380 DEALLOCATE (op_sm_set)
1382 CALL timestop(handle)
1384 END SUBROUTINE center_spread_berry
1396 SUBROUTINE iao_oce_expansion(qs_env, oce_basis_set_list, smat_kind, sxo, iao_coef, oce_atom, unit_nr)
1403 INTEGER,
INTENT(IN) :: unit_nr
1405 CHARACTER(len=*),
PARAMETER :: routinen =
'iao_oce_expansion'
1407 INTEGER :: handle, i, i1, i2, iao, iatom, ikind, &
1408 iset, ishell, ispin, l, m, maxl, n, &
1409 natom, nkind, noce, ns, nset, nsgf, &
1411 INTEGER,
DIMENSION(:),
POINTER :: iao_blk_sizes, nshell, oce_blk_sizes, &
1413 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgf, last_sgf, lval
1415 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ev, vector
1416 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: amat, bmat, filter, oce_comp, prol, vec
1417 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: ablock
1424 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1427 CALL timeset(routinen, handle)
1430 CALL dbcsr_get_info(sxo(1)%matrix, row_blk_size=oce_blk_sizes, col_blk_size=orb_blk_sizes, &
1431 distribution=dbcsr_dist)
1432 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, natom=natom)
1433 CALL get_ks_env(ks_env=ks_env, particle_set=particle_set, qs_kind_set=qs_kind_set)
1434 ALLOCATE (iao_blk_sizes(natom))
1436 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1437 CALL get_qs_kind(qs_kind_set(ikind), nsgf=ns, basis_type=
"MIN")
1438 iao_blk_sizes(iatom) = ns
1441 CALL dbcsr_create(iao_vec, name=
"IAO_VEC", dist=dbcsr_dist, &
1442 matrix_type=dbcsr_type_no_symmetry, row_blk_size=orb_blk_sizes, &
1443 col_blk_size=iao_blk_sizes)
1444 CALL dbcsr_create(sx_vec, name=
"SX_VEC", dist=dbcsr_dist, &
1445 matrix_type=dbcsr_type_no_symmetry, row_blk_size=oce_blk_sizes, &
1446 col_blk_size=iao_blk_sizes)
1449 nkind =
SIZE(smat_kind)
1450 ALLOCATE (sinv_kind(nkind))
1452 noce =
SIZE(smat_kind(ikind)%array, 1)
1453 ALLOCATE (sinv_kind(ikind)%array(noce, noce))
1454 sinv_kind(ikind)%array = smat_kind(ikind)%array
1459 nspin =
SIZE(iao_coef, 1)
1460 ALLOCATE (oce_comp(natom, nspin))
1464 CALL dbcsr_multiply(
"N",
"N", 1.0_dp, sxo(1)%matrix, iao_vec, 0.0_dp, sx_vec, &
1465 retain_sparsity=.true.)
1467 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1469 row=iatom, col=iatom, block=ablock, found=found)
1473 ablock = matmul(sinv_kind(ikind)%array, ablock)
1474 ALLOCATE (amat(n, m), bmat(m, m), ev(m), vec(m, m))
1475 amat(1:n, 1:m) = matmul(smat_kind(ikind)%array(1:n, 1:n), ablock(1:n, 1:m))
1476 bmat(1:m, 1:m) = matmul(transpose(ablock(1:n, 1:m)), amat(1:n, 1:m))
1477 CALL jacobi(bmat, ev, vec)
1478 oce_comp(iatom, ispin) = sum(ev(1:m))/real(m, kind=
dp)
1480 ev(i) = 1._dp/sqrt(ev(i))
1481 bmat(1:m, i) = vec(1:m, i)*ev(i)
1483 bmat(1:m, 1:m) = matmul(bmat(1:m, 1:m), transpose(vec(1:m, 1:m)))
1484 ablock(1:n, 1:m) = matmul(ablock(1:n, 1:m), bmat(1:m, 1:m))
1485 DEALLOCATE (amat, bmat, ev, vec)
1490 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1492 row=iatom, col=iatom, block=ablock, found=found)
1496 ALLOCATE (oce_atom(iatom, ispin)%array(n, m))
1497 oce_atom(iatom, ispin)%array = ablock
1501 CALL group%sum(oce_comp)
1502 IF (unit_nr > 0)
THEN
1504 WRITE (unit_nr,
"(T4,A,I6,T30,A,2F12.4)")
"Atom:", iatom,
" Completeness: ", oce_comp(iatom, 1:nspin)
1505 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1506 oce_basis => oce_basis_set_list(ikind)%gto_basis_set
1507 CALL get_gto_basis_set(oce_basis, nset=nset, nshell=nshell, nsgf=nsgf, maxl=maxl, &
1508 l=lval, first_sgf=first_sgf, last_sgf=last_sgf)
1509 ALLOCATE (filter(nsgf, 0:maxl), vector(nsgf), prol(0:maxl, nspin))
1512 DO ishell = 1, nshell(iset)
1513 l = lval(ishell, iset)
1514 i1 = first_sgf(ishell, iset)
1515 i2 = last_sgf(ishell, iset)
1516 filter(i1:i2, l) = 1.0_dp
1520 n =
SIZE(oce_atom(iatom, 1)%array, 1)
1521 m =
SIZE(oce_atom(iatom, 1)%array, 2)
1527 vector(1:n) = oce_atom(iatom, ispin)%array(1:n, iao)*filter(1:n, l)
1528 prol(l, ispin) = sum(matmul(smat_kind(ikind)%array(1:n, 1:n), vector(1:n))*vector(1:n))
1531 WRITE (unit_nr,
"(T4,I3,T15,A,T39,(6F7.4))") iao,
" l-contributions:", (sum(prol(l, :)), l=0, maxl)
1533 DEALLOCATE (filter, vector, prol)
1538 DEALLOCATE (oce_comp)
1540 DEALLOCATE (sinv_kind(ikind)%array)
1542 DEALLOCATE (sinv_kind)
1543 DEALLOCATE (iao_blk_sizes)
1547 CALL timestop(handle)
1549 END SUBROUTINE iao_oce_expansion
1556 SUBROUTINE oce_overlap_matrix(smat_kind, basis_set_list)
1560 CHARACTER(len=*),
PARAMETER :: routinen =
'oce_overlap_matrix'
1562 INTEGER :: handle, ikind, iset, jset, ldsab, m1, &
1563 m2, n1, n2, ncoa, ncob, nkind, nseta, &
1565 INTEGER,
DIMENSION(:),
POINTER :: la_max, la_min, npgfa, nsgfa
1566 INTEGER,
DIMENSION(:, :),
POINTER :: first_sgfa
1567 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: oint, owork
1568 REAL(kind=
dp),
DIMENSION(3) :: rab
1569 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: rpgfa, scon_a, smat, zeta
1572 CALL timeset(routinen, handle)
1576 nkind =
SIZE(smat_kind)
1579 basis_set => basis_set_list(ikind)%gto_basis_set
1580 cpassert(
ASSOCIATED(basis_set))
1582 ldsab = max(m1, m2, ldsab)
1585 ALLOCATE (oint(ldsab, ldsab), owork(ldsab, ldsab))
1588 basis_set => basis_set_list(ikind)%gto_basis_set
1589 cpassert(
ASSOCIATED(basis_set))
1590 smat => smat_kind(ikind)%array
1593 first_sgfa => basis_set%first_sgf
1594 la_max => basis_set%lmax
1595 la_min => basis_set%lmin
1596 npgfa => basis_set%npgf
1597 nseta = basis_set%nset
1598 nsgfa => basis_set%nsgf_set
1599 rpgfa => basis_set%pgf_radius
1600 scon_a => basis_set%scon
1601 zeta => basis_set%zet
1605 ncoa = npgfa(iset)*
ncoset(la_max(iset))
1606 n1 = npgfa(iset)*(
ncoset(la_max(iset)) -
ncoset(la_min(iset) - 1))
1607 sgfa = first_sgfa(1, iset)
1611 ncob = npgfa(jset)*
ncoset(la_max(jset))
1612 n2 = npgfa(jset)*(
ncoset(la_max(jset)) -
ncoset(la_min(jset) - 1))
1613 sgfb = first_sgfa(1, jset)
1616 CALL overlap_ab(la_max(iset), la_min(iset), npgfa(iset), rpgfa(:, iset), zeta(:, iset), &
1617 la_max(jset), la_min(jset), npgfa(jset), rpgfa(:, jset), zeta(:, jset), &
1618 rab, sab=oint(:, :))
1620 CALL contraction(oint(:, :), owork, ca=scon_a(:, sgfa:), na=n1, ma=nsgfa(iset), &
1621 cb=scon_a(:, sgfb:), nb=n2, mb=nsgfa(jset), fscale=1.0_dp, trans=.false.)
1622 CALL block_add(
"IN", owork, nsgfa(iset), nsgfa(jset), smat, &
1623 sgfa, sgfb, trans=.false.)
1629 DEALLOCATE (oint, owork)
1631 CALL timestop(handle)
1633 END SUBROUTINE oce_overlap_matrix
1647 SUBROUTINE pm_localization(zij_fm_set, vectors, order, accuracy, unit_nr)
1649 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: zij_fm_set
1651 INTEGER,
INTENT(IN) :: order
1652 REAL(kind=
dp),
INTENT(IN) :: accuracy
1653 INTEGER,
INTENT(IN) :: unit_nr
1655 INTEGER,
PARAMETER :: max_sweeps = 250
1657 INTEGER :: iatom, istate, jstate, natom, nstate, &
1659 REAL(kind=
dp) :: aij, bij, ct, ftarget, mii, mij, mjj, &
1660 st, t1, t2, theta, tolerance, tt
1661 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fdiag
1664 CALL cp_fm_create(rmat, zij_fm_set(1, 1)%matrix_struct)
1668 ALLOCATE (fdiag(nstate))
1669 tolerance = 1.0e10_dp
1671 natom =
SIZE(zij_fm_set, 1)
1672 IF (unit_nr > 0)
THEN
1673 WRITE (unit_nr,
'(A,T30,A,T45,A,T63,A,T77,A)') &
1674 " Jacobi Localization ",
"Sweep",
"Functional",
"Gradient",
"Time"
1677 DO sweeps = 1, max_sweeps
1680 DO istate = 1, nstate
1681 DO jstate = istate + 1, nstate
1688 IF (order == 2)
THEN
1689 aij = aij + 4._dp*mij**2 - (mii - mjj)**2
1690 bij = bij + 4._dp*mij*(mii - mjj)
1691 ELSEIF (order == 4)
THEN
1692 aij = aij - mii**4 - mjj**4 + 6._dp*(mii**2 + mjj**2)*mij**2 + &
1693 mii**3*mjj + mii*mjj**3
1694 bij = bij + 4._dp*mij*(mii**3 - mjj**3)
1699 IF ((aij**2 + bij**2) < 1.e-10_dp) cycle
1700 tolerance = tolerance + bij**2
1701 theta = 0.25_dp*atan2(bij, -aij)
1708 CALL cp_fm_rot_cols(zij_fm_set(iatom, 1), istate, jstate, ct, st)
1709 CALL cp_fm_rot_rows(zij_fm_set(iatom, 1), istate, jstate, ct, st)
1716 ftarget = ftarget + sum(fdiag**order)
1718 ftarget = ftarget**(1._dp/order)
1719 tolerance = sqrt(tolerance)
1722 IF (unit_nr > 0)
THEN
1723 WRITE (unit_nr,
'(T31,I4,T39,F16.8,T55,G16.8,T71,F10.2)') sweeps, ftarget, tolerance, tt
1725 IF (tolerance < accuracy)
EXIT
1732 END SUBROUTINE pm_localization
Set of routines to: Contract integrals over primitive Gaussians Decontract (density) matrices Trace m...
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, lb_max, lb_min, npgfb, rpgfb, zetb, rab, sab, dab, ddab)
Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions....
simple routine to print charges for all atomic charge methods (currently mulliken,...
subroutine, public print_atomic_charges(particle_set, qs_kind_set, scr, title, electronic_charges, atomic_charges)
generates a unified output format for atomic charges
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.
Automatic generation of auxiliary basis sets of different kind.
subroutine, public create_oce_basis(oce_basis, orb_basis, lmax_oce, nbas_oce)
...
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, npgf_seg_sum)
...
subroutine, public deallocate_gto_basis_set(gto_basis_set)
...
subroutine, public init_orb_basis_set(gto_basis_set)
Initialise a Gaussian-type orbital (GTO) basis set data set.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public knizia2013
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_iterator_next_block(iterator, row, column, block, block_number_argument_has_been_removed, row_size, col_size, row_offset, col_offset)
...
logical function, public dbcsr_iterator_blocks_left(iterator)
...
subroutine, public dbcsr_iterator_stop(iterator)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
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_replicate_all(matrix)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_iterator_start(iterator, matrix, shared, dynamic, dynamic_byrows)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_trace(matrix, trace)
Computes the trace of the given matrix, also known as the sum of its diagonal elements.
subroutine, public dbcsr_reserve_diag_blocks(matrix)
Reserves all diagonal blocks.
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 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,...
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_rot_rows(matrix, irow, jrow, cs, sn)
Applies a planar rotation defined by cs and sn to the i'th and j'th rows.
subroutine, public cp_fm_column_scale(matrixa, scaling)
scales column i of matrix a with scaling(i)
subroutine, public cp_fm_rot_cols(matrix, icol, jcol, cs, sn)
Applies a planar rotation defined by cs and sn to the i'th and j'th columnns.
subroutine, public cp_fm_geadd(alpha, trans, matrix_a, beta, matrix_b)
interface to BLACS geadd: matrix_b = beta*matrix_b + alpha*opt(matrix_a) where opt(matrix_a) can be e...
subroutine, public cp_fm_invert(matrix_a, matrix_inverse, det_a, eps_svd, eigval)
Inverts a cp_fm_type matrix, optionally returning the determinant of the input matrix.
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_get_diag(matrix, diag)
returns the diagonal elements of a fm
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, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
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,...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
Calculate intrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
...
subroutine, public print_center_spread(moments, nocc, print_section, iounit)
prints charge center and spreads for all orbitals
subroutine, public iao_charges(p_matrix, charges)
compute the atomic charges (orthogonal basis)
Calculate ntrinsic atomic orbitals and analyze wavefunctions.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Machine interface based on Fortran 2003 and POSIX.
real(kind=dp) function, public m_walltime()
returns time from a real-time clock, protected against rolling early/easily
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi
Collection of simple mathematical functions and subroutines.
subroutine, public jacobi(a, d, v)
Jacobi matrix diagonalization. The eigenvalues are returned in vector d and the eigenvectors are retu...
subroutine, public invmat_symm(a, potrf, uplo)
returns inverse of real symmetric, positive definite matrix
Interface to the message passing library MPI.
generate or use from input minimal basis set
subroutine, public create_minbas_set(qs_env, unit_nr, basis_type, primitive)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
Define methods related to particle_type.
subroutine, public get_particle_set(particle_set, qs_kind_set, first_sgf, last_sgf, nsgf, nmao, basis)
Get the components of a particle set.
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
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, mimic, 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, sab_cneo, 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, xcint_weights, 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, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_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, do_rixs, tb_tblite)
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, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, 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_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, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
Some utilities for the construction of the localization environment.
subroutine, public compute_berry_operator(qs_env, cell, op_sm_set, dim_op)
Computes the Berry operator for periodic systems used to define the spread of the MOS Here the matrix...
Localization methods such as 2x2 Jacobi rotations Steepest Decents Conjugate Gradient.
subroutine, public rotate_orbitals(rmat, vectors)
...
subroutine, public initialize_weights(cell, weights)
...
subroutine, public scdm_qrfact(vectors)
...
collects routines that perform operations directly related to MOs
subroutine, public make_basis_lowdin(vmatrix, ncol, matrix_s)
return a set of S orthonormal vectors (C^T S C == 1) where a Loedwin transformation is applied to kee...
Definition and initialisation of the mo data type.
subroutine, public set_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, uniform_occupation, kts, mu, flexible_electron_count)
Set the components of a MO set data structure.
subroutine, public allocate_mo_set(mo_set, nao, nmo, nelectron, n_el_f, maxocc, flexible_electron_count)
Allocates a mo set and partially initializes it (nao,nmo,nelectron, and flexible_electron_count are v...
subroutine, public deallocate_mo_set(mo_set)
Deallocate a wavefunction data structure.
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.
subroutine, public init_mo_set(mo_set, fm_pool, fm_ref, fm_struct, name)
initializes an allocated mo_set. eigenvalues, mo_coeff, occupation_numbers are valid only after this ...
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public build_local_moment_matrix(qs_env, moments, nmoments, ref_point, ref_points, basis_type)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public release_neighbor_list_sets(nlists)
releases an array of neighbor_list_sets
Generate the atomic neighbor lists.
subroutine, public setup_neighbor_list(ab_list, basis_set_a, basis_set_b, qs_env, mic, symmetric, molecular, operator_type)
Build a neighborlist.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix_simple(ks_env, matrix_s, basis_set_list_a, basis_set_list_b, sab_nl)
Calculation of the overlap matrix over Cartesian Gaussian functions.
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 2d array
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
represent a list of objects
contained for different pw related things
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...