81#include "./base/base_uses.f90"
87 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'et_coupling_proj'
98 INTEGER :: n_atoms = 0
99 INTEGER :: n_blocks = 0
100 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: fermi => null()
101 TYPE(cp_fm_type),
POINTER :: m_transf => null()
102 TYPE(cp_fm_type),
POINTER :: m_transf_inv => null()
103 TYPE(et_cpl_block),
DIMENSION(:),
POINTER :: block => null()
115 INTEGER :: n_atoms = 0
116 INTEGER :: n_electrons = 0
118 TYPE(et_cpl_atom),
DIMENSION(:),
POINTER :: atom => null()
119 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mo => null()
120 TYPE(cp_fm_type),
DIMENSION(:, :),
POINTER :: hab => null()
121 END TYPE et_cpl_block
130 INTEGER :: ao_pos = 0
145 TYPE(et_cpl),
POINTER :: ec
151 IF (
ASSOCIATED(ec))
THEN
153 IF (
ASSOCIATED(ec%fermi)) &
154 DEALLOCATE (ec%fermi)
155 IF (
ASSOCIATED(ec%m_transf))
THEN
157 DEALLOCATE (ec%m_transf)
158 NULLIFY (ec%m_transf)
160 IF (
ASSOCIATED(ec%m_transf_inv))
THEN
162 DEALLOCATE (ec%m_transf_inv)
163 NULLIFY (ec%m_transf_inv)
166 IF (
ASSOCIATED(ec%block))
THEN
168 DO i = 1,
SIZE(ec%block)
169 IF (
ASSOCIATED(ec%block(i)%atom)) &
170 DEALLOCATE (ec%block(i)%atom)
171 IF (
ASSOCIATED(ec%block(i)%mo))
THEN
172 DO j = 1,
SIZE(ec%block(i)%mo)
175 DEALLOCATE (ec%block(i)%mo)
180 DEALLOCATE (ec%block)
197 SUBROUTINE set_block_data(qs_env, et_proj_sec, ec)
202 TYPE(et_cpl),
POINTER :: ec
204 INTEGER :: i, j, k, l, n, n_ao, n_atoms, n_set
205 INTEGER,
DIMENSION(:),
POINTER :: atom_id, atom_nf, atom_ps, n_shell, t
206 INTEGER,
DIMENSION(:, :),
POINTER :: ang_mom_id
210 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
215 NULLIFY (ao_basis_set)
216 NULLIFY (particle_set)
217 NULLIFY (qs_kind_set)
228 NULLIFY (ec%m_transf)
229 NULLIFY (ec%m_transf_inv)
233 CALL get_qs_env(qs_env, particle_set=particle_set, qs_kind_set=qs_kind_set, natom=n_atoms)
238 ALLOCATE (atom_nf(n_atoms))
239 cpassert(
ASSOCIATED(atom_nf))
244 CALL get_qs_kind(qs_kind_set(j), basis_set=ao_basis_set)
245 IF (.NOT.
ASSOCIATED(ao_basis_set)) &
246 cpabort(
'Unsupported basis set type. ')
248 nset=n_set, nshell=n_shell, l=ang_mom_id)
251 atom_nf(i) = atom_nf(i) +
nso(ang_mom_id(k, j))
264 ALLOCATE (atom_ps(n_atoms))
265 cpassert(
ASSOCIATED(atom_ps))
267 DO i = 1, n_atoms - 1
268 atom_ps(i + 1) = atom_ps(i) + atom_nf(i)
274 ALLOCATE (ec%block(ec%n_blocks))
275 cpassert(
ASSOCIATED(ec%block))
278 ALLOCATE (t(n_atoms))
279 cpassert(
ASSOCIATED(t))
282 DO i = 1, ec%n_blocks
285 ec%block(i)%n_atoms = 0
286 ec%block(i)%n_electrons = 0
288 NULLIFY (ec%block(i)%atom)
289 NULLIFY (ec%block(i)%mo)
290 NULLIFY (ec%block(i)%hab)
294 keyword_name=
'NELECTRON', i_val=ec%block(i)%n_electrons)
298 keyword_name=
'ATOMS', i_vals=atom_id)
301 DO j = 1,
SIZE(atom_id)
303 IF (atom_id(j) < 1 .OR. atom_id(j) > n_atoms) &
304 cpabort(
'invalid fragment atom ID ('//trim(adjustl(
cp_to_string(atom_id(j))))//
')')
308 DO l = 1, ec%block(k)%n_atoms
309 IF (ec%block(k)%atom(l)%id == atom_id(j))
THEN
310 cpwarn(
'multiple definition of atom'//trim(adjustl(
cp_to_string(atom_id(j)))))
317 IF (.NOT. found)
THEN
318 DO k = 1, ec%block(i)%n_atoms
319 IF (t(k) == atom_id(j))
THEN
320 cpwarn(
'multiple definition of atom'//trim(adjustl(
cp_to_string(atom_id(j)))))
327 IF (.NOT. found)
THEN
328 ec%block(i)%n_atoms = ec%block(i)%n_atoms + 1
329 t(ec%block(i)%n_atoms) = atom_id(j)
334 ALLOCATE (ec%block(i)%atom(ec%block(i)%n_atoms))
335 cpassert(
ASSOCIATED(ec%block(i)%atom))
338 DO j = 1, ec%block(i)%n_atoms
339 ec%block(i)%atom(j)%id = t(j)
340 ec%block(i)%atom(j)%n_ao = atom_nf(ec%block(i)%atom(j)%id)
341 ec%block(i)%atom(j)%ao_pos = atom_ps(ec%block(i)%atom(j)%id)
342 ec%block(i)%n_ao = ec%block(i)%n_ao + ec%block(i)%atom(j)%n_ao
345 ec%n_atoms = ec%n_atoms + ec%block(i)%n_atoms
349 IF (
ASSOCIATED(atom_nf)) &
351 IF (
ASSOCIATED(atom_ps)) &
356 END SUBROUTINE set_block_data
365 SUBROUTINE set_fermi(ec, fa, fb)
368 TYPE(et_cpl),
POINTER :: ec
370 REAL(KIND=
dp),
OPTIONAL :: fb
376 IF (
PRESENT(fb))
THEN
378 ALLOCATE (ec%fermi(2))
379 cpassert(
ASSOCIATED(ec%fermi))
385 ALLOCATE (ec%fermi(1))
386 cpassert(
ASSOCIATED(ec%fermi))
391 END SUBROUTINE set_fermi
400 SUBROUTINE reorder_hamiltonian_matrix(ec, mat_h, mat_w)
403 TYPE(et_cpl),
POINTER :: ec
406 INTEGER :: ic, ir, jc, jr, kc, kr, mc, mr, nc, nr
413 cpabort(
'cannot reorder Hamiltonian, working-matrix structure is not equivalent')
418 DO ir = 1, ec%n_blocks
419 DO jr = 1, ec%block(ir)%n_atoms
420 DO kr = 1, ec%block(ir)%atom(jr)%n_ao
423 DO ic = 1, ec%n_blocks
424 DO jc = 1, ec%block(ic)%n_atoms
425 DO kc = 1, ec%block(ic)%atom(jc)%n_ao
426 mr = ec%block(ir)%atom(jr)%ao_pos + kr - 1
427 mc = ec%block(ic)%atom(jc)%ao_pos + kc - 1
442 END SUBROUTINE reorder_hamiltonian_matrix
452 SUBROUTINE get_s_half_inv_matrix(qs_env, mat_t, mat_i, mat_w)
456 TYPE(
cp_fm_type),
INTENT(INOUT) :: mat_t, mat_i
473 CALL get_qs_env(qs_env, scf_control=scf_cntrl)
474 CALL cp_fm_power(mat_t, mat_w, -0.5_dp, scf_cntrl%eps_eigval, n_deps)
475 CALL cp_fm_power(mat_i, mat_w, +0.5_dp, scf_cntrl%eps_eigval, n_deps)
477 IF (n_deps /= 0)
THEN
478 CALL cp_warn(__location__, &
479 "Overlap matrix exhibits linear dependencies. At least some "// &
480 "eigenvalues have been quenched.")
483 END SUBROUTINE get_s_half_inv_matrix
496 SUBROUTINE get_block_hamiltonian(qs_env, ec, fm_s, mat_t, mat_w, n_ao, n_spins)
500 TYPE(et_cpl),
POINTER :: ec
502 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
505 INTEGER :: n_ao, n_spins
515 ALLOCATE (mat_t(n_spins))
520 ALLOCATE (ec%m_transf, ec%m_transf_inv)
521 CALL cp_fm_create(matrix=ec%m_transf, matrix_struct=fm_s, &
522 name=
'S^(-1/2) TRANSFORMATION MATRIX')
523 CALL cp_fm_create(matrix=ec%m_transf_inv, matrix_struct=fm_s, &
524 name=
'S^(+1/2) TRANSFORMATION MATRIX')
525 CALL get_s_half_inv_matrix(qs_env, ec%m_transf, ec%m_transf_inv, mat_w)
530 CALL cp_fm_create(matrix=mat_t(i), matrix_struct=fm_s, &
531 name=
'KS HAMILTONIAN IN SEPARATED ORTHOGONALIZED BASIS SET')
535 CALL parallel_gemm(
"N",
"N", n_ao, n_ao, n_ao, 1.0_dp, ec%m_transf, mat_t(i), 0.0_dp, mat_w)
536 CALL parallel_gemm(
"N",
"N", n_ao, n_ao, n_ao, 1.0_dp, mat_w, ec%m_transf, 0.0_dp, mat_t(i))
539 CALL reorder_hamiltonian_matrix(ec, mat_t(i), mat_w)
543 END SUBROUTINE get_block_hamiltonian
552 SUBROUTINE hamiltonian_block_diag(qs_env, ec, mat_h)
556 TYPE(et_cpl),
POINTER :: ec
557 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mat_h
559 INTEGER :: i, j, k, l, n_spins, spin
560 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_e
564 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: dat
575 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
578 ALLOCATE (dat(ec%n_blocks))
579 cpassert(
ALLOCATED(dat))
582 n_spins =
SIZE(mat_h)
583 DO i = 1, ec%n_blocks
584 ALLOCATE (ec%block(i)%mo(n_spins))
585 cpassert(
ASSOCIATED(ec%block(i)%mo))
586 ALLOCATE (ec%block(i)%hab(n_spins, ec%n_blocks))
587 cpassert(
ASSOCIATED(ec%block(i)%hab))
595 DO i = 1, ec%n_blocks
599 nrow_global=ec%block(i)%n_ao, ncol_global=ec%block(i)%n_ao)
601 name=
'H_KS DIAGONAL BLOCK')
603 ALLOCATE (vec_e(ec%block(i)%n_ao))
604 cpassert(
ASSOCIATED(vec_e))
608 dat(i), ec%block(i)%n_ao, &
609 ec%block(i)%n_ao, j, j, 1, 1)
612 CALL cp_fm_create(matrix=mat_u, matrix_struct=fm_s, name=
'UNITARY MATRIX')
617 CALL create_block_mo_set(qs_env, ec, i, spin, mat_u, vec_e)
625 j = j + ec%block(i)%n_ao
631 DO i = 1, ec%n_blocks
633 DO j = 1, ec%n_blocks
638 nrow_global=ec%block(i)%n_ao, ncol_global=ec%block(j)%n_ao)
639 CALL cp_fm_create(matrix=ec%block(i)%hab(spin, j), matrix_struct=fm_s, &
640 name=
'H_KS OFF-DIAGONAL BLOCK')
644 ec%block(i)%hab(spin, j), ec%block(i)%n_ao, &
645 ec%block(j)%n_ao, k, l, 1, 1)
648 CALL cp_fm_create(matrix=mat_u, matrix_struct=fm_s, name=
'FULL WORK MATRIX')
649 CALL parallel_gemm(
"T",
"N", ec%block(i)%n_ao, ec%block(j)%n_ao, ec%block(i)%n_ao, &
650 1.0_dp, dat(i), ec%block(i)%hab(spin, j), 0.0_dp, mat_u)
651 CALL parallel_gemm(
"N",
"N", ec%block(i)%n_ao, ec%block(j)%n_ao, ec%block(j)%n_ao, &
652 1.0_dp, mat_u, dat(j), 0.0_dp, ec%block(i)%hab(spin, j))
660 l = l + ec%block(j)%n_ao
663 k = k + ec%block(i)%n_ao
667 IF (
ALLOCATED(dat))
THEN
675 IF (
ALLOCATED(dat)) &
678 END SUBROUTINE hamiltonian_block_diag
689 FUNCTION get_mo_c2_sum(blk_at, mo, id, atom)
RESULT(c2)
692 TYPE(et_cpl_atom),
DIMENSION(:),
POINTER :: blk_at
694 INTEGER,
INTENT(IN) :: id
695 INTEGER,
DIMENSION(:),
POINTER :: atom
698 INTEGER :: i, ir, j, k
714 DO j = 1,
SIZE(blk_at)
715 IF (blk_at(j)%id ==
atom(i))
THEN
722 cpabort(
'MO-fraction atom ID not defined in the block')
725 DO k = 1, blk_at(j)%n_ao
726 ir = blk_at(j)%ao_pos + k - 1
733 END FUNCTION get_mo_c2_sum
744 SUBROUTINE print_mo_coeff(output_unit, qs_env, ec, blk, n_spins)
747 INTEGER,
INTENT(IN) :: output_unit
749 TYPE(et_cpl),
POINTER :: ec
750 INTEGER,
INTENT(IN) :: blk, n_spins
752 INTEGER :: j, k, l, m, n, n_ao, n_mo
753 INTEGER,
DIMENSION(:),
POINTER :: list_at, list_mo
754 REAL(KIND=
dp) :: c1, c2
755 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mat_w
756 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
763 NULLIFY (qs_kind_set)
767 'PROPERTIES%ET_COUPLING%PROJECTION%BLOCK')
776 IF (output_unit > 0) &
777 WRITE (output_unit,
'(/,T3,A/)')
'Block state fractions:'
780 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
784 ALLOCATE (mat_w(n_spins))
786 n_mo = ec%block(blk)%n_ao
788 matrix_struct=ec%block(blk)%mo(j)%mo_coeff%matrix_struct, &
789 name=
'BLOCK MOs IN ORTHONORMAL BASIS SET')
790 CALL parallel_gemm(
"N",
"N", n_ao, n_mo, n_ao, 1.0_dp, ec%m_transf_inv, &
791 ec%block(blk)%mo(j)%mo_coeff, 0.0_dp, mat_w(j))
797 i_rep_val=j, i_vals=list_at)
798 IF (
ASSOCIATED(list_at))
THEN
808 i_rep_val=k, i_vals=list_mo)
809 IF (
ASSOCIATED(list_mo))
THEN
812 IF (output_unit > 0) &
813 WRITE (output_unit, *)
816 DO l = 1,
SIZE(list_mo)
818 IF (n_spins > 1)
THEN
819 c1 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(1), &
821 c2 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(2), &
823 IF (output_unit > 0) &
824 WRITE (output_unit,
'(I5,A,I5,2F20.10)') j,
' /', list_mo(l), c1, c2
826 c1 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(1), &
828 IF (output_unit > 0) &
829 WRITE (output_unit,
'(I5,A,I5,F20.10)') j,
' /', list_mo(l), c1
847 END SUBROUTINE print_mo_coeff
860 SUBROUTINE print_states(output_unit, mo, n_spins, label, mx_mo_a, mx_mo_b, fermi)
863 INTEGER,
INTENT(IN) :: output_unit
865 INTEGER,
INTENT(IN) :: n_spins
866 CHARACTER(LEN=*),
INTENT(IN) :: label
867 INTEGER,
INTENT(IN),
OPTIONAL :: mx_mo_a, mx_mo_b
868 LOGICAL,
INTENT(IN),
OPTIONAL :: fermi
870 INTEGER :: i, mx_a, mx_b, n
876 IF (
PRESENT(fermi)) &
879 IF (output_unit > 0)
THEN
881 WRITE (output_unit,
'(/,T3,A/)')
'State energies ('//trim(adjustl(label))//
'):'
884 IF (n_spins > 1)
THEN
887 IF (
PRESENT(mx_mo_a)) &
888 mx_a = min(mo(1)%nmo, mx_mo_a)
890 IF (
PRESENT(mx_mo_b)) &
891 mx_b = min(mo(2)%nmo, mx_mo_b)
895 WRITE (output_unit,
'(T3,I10)', advance=
'no') i
897 WRITE (output_unit,
'(2F12.4)', advance=
'no') &
898 mo(1)%occupation_numbers(i), mo(1)%eigenvalues(i)
900 WRITE (output_unit,
'(A)', advance=
'no')
' '
902 WRITE (output_unit,
'(A)', advance=
'no')
' '
904 WRITE (output_unit,
'(2F12.4)') &
905 mo(2)%occupation_numbers(i), mo(2)%eigenvalues(i)
907 WRITE (output_unit, *)
912 WRITE (output_unit,
'(/,T3,I10,F24.4,I10,F19.4)') &
913 mo(1)%nelectron, mo(1)%mu, &
914 mo(2)%nelectron, mo(2)%mu
921 IF (
PRESENT(mx_mo_a)) &
922 mx_a = min(mo(1)%nmo, mx_mo_a)
925 WRITE (output_unit,
'(T3,I10,2F12.4)') &
926 i, mo(1)%occupation_numbers(i), mo(1)%eigenvalues(i)
930 WRITE (output_unit,
'(/,T3,I10,F24.4)') &
931 mo(1)%nelectron, mo(1)%mu
938 END SUBROUTINE print_states
949 SUBROUTINE print_couplings(ec_sec, output_unit, logger, ec, mo)
953 INTEGER,
INTENT(IN) :: output_unit
955 TYPE(et_cpl),
POINTER :: ec
958 CHARACTER(LEN=default_path_length) :: filename, my_pos, title
959 INTEGER :: i, j, k, l, n_states(2), nc, nr, nspins, &
962 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: w1, w2
970 n_states(i) = mo(i)%nmo
973 IF (n_states(2) > 0) nspins = 2
976 subsection_name=
"PRINT%COUPLINGS")
987 IF (output_unit > 0) &
988 WRITE (output_unit,
'(/,T3,A/)')
'Printing coupling elements to output files'
990 DO i = 1, ec%n_blocks
991 DO j = i + 1, ec%n_blocks
993 nr = ec%block(i)%hab(1, j)%matrix_struct%nrow_global
994 nc = ec%block(i)%hab(1, j)%matrix_struct%ncol_global
996 ALLOCATE (w1(nr, nc))
997 cpassert(
ASSOCIATED(w1))
1000 ALLOCATE (w2(nr, nc))
1001 cpassert(
ASSOCIATED(w2))
1005 IF (output_unit > 0)
THEN
1007 WRITE (filename,
'(a5,I1.1,a1,I1.1)')
"ET_BL_", i,
"-", j
1009 middle_name=trim(filename), file_position=my_pos, log_filename=.false.)
1011 WRITE (title, *)
'Coupling elements [meV] between blocks:', i, j
1013 WRITE (unit_nr, *) trim(title)
1014 IF (nspins > 1)
THEN
1015 WRITE (unit_nr,
'(T3,A8,T13,A8,T28,A,A)')
'State A',
'State B',
'Coupling spin 1',
' Coupling spin 2'
1017 WRITE (unit_nr,
'(T3,A8,T13,A8,T28,A)')
'State A',
'State B',
'Coupling'
1020 DO k = 1, min(ec%block(i)%n_ao, n_states(1))
1021 DO l = 1, min(ec%block(j)%n_ao, n_states(1))
1023 IF (nspins > 1)
THEN
1025 WRITE (unit_nr,
'(T3,I5,T13,I5,T22,E20.6)', advance=
'no') &
1026 k, l, w1(k, l)*
evolt*1000.0_dp
1027 IF ((k <= n_states(2)) .AND. (l <= n_states(2)))
THEN
1028 WRITE (unit_nr,
'(E20.6)') &
1029 w2(k, l)*
evolt*1000.0_dp
1036 WRITE (unit_nr,
'(T3,I5,T13,I5,T22,E20.6)') &
1037 k, l, w1(k, l)*
evolt*1000.0_dp
1047 IF (
ASSOCIATED(w1))
DEALLOCATE (w1)
1048 IF (
ASSOCIATED(w2))
DEALLOCATE (w2)
1054 END SUBROUTINE print_couplings
1064 SUBROUTINE normalize_mo_vectors(qs_env, mo, n_ao, n_mo)
1069 INTEGER,
INTENT(IN) :: n_ao, n_mo
1071 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_t
1091 CALL cp_fm_create(matrix=mat_sc, matrix_struct=mo%mo_coeff%matrix_struct, &
1092 name=
'S*C PRODUCT MATRIX')
1096 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1098 nrow_global=n_mo, ncol_global=n_mo)
1100 name=
'C^T*S*C OVERLAP PRODUCT MATRIX')
1101 CALL parallel_gemm(
'T',
'N', n_mo, n_mo, n_ao, 1.0_dp, mo%mo_coeff, mat_sc, 0.0_dp, mat_t)
1104 ALLOCATE (vec_t(n_mo))
1105 cpassert(
ASSOCIATED(vec_t))
1107 vec_t = 1.0_dp/dsqrt(vec_t)
1114 IF (
ASSOCIATED(vec_t)) &
1117 END SUBROUTINE normalize_mo_vectors
1130 SUBROUTINE set_mo_coefficients(qs_env, ec, id, mo, mat_u, n_ao, n_mo)
1134 TYPE(et_cpl),
POINTER :: ec
1135 INTEGER,
INTENT(IN) :: id
1138 INTEGER,
INTENT(IN) :: n_ao, n_mo
1140 INTEGER :: ic, ir, jc, jr, mr, nc, nr
1148 CALL cp_fm_create(matrix=mat_w, matrix_struct=mo%mo_coeff%matrix_struct, &
1149 name=
'BLOCK MO-TRANSFORMATION WORKING MATRIX')
1155 DO ir = 1, ec%block(id)%n_atoms
1156 DO jr = 1, ec%block(id)%atom(ir)%n_ao
1159 DO ic = 1, ec%block(id)%n_atoms
1160 DO jc = 1, ec%block(id)%atom(ic)%n_ao
1161 mr = ec%block(id)%atom(ir)%ao_pos + jr - 1
1172 CALL parallel_gemm(
"N",
"N", n_ao, n_mo, n_ao, 1.0_dp, ec%m_transf, mat_w, 0.0_dp, mo%mo_coeff)
1173 CALL normalize_mo_vectors(qs_env, mo, n_ao, n_mo)
1178 END SUBROUTINE set_mo_coefficients
1190 SUBROUTINE create_block_mo_set(qs_env, ec, id, spin, mat_u, vec_e)
1194 TYPE(et_cpl),
POINTER :: ec
1195 INTEGER,
INTENT(IN) :: id, spin
1197 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_e
1199 INTEGER :: n_ao, n_el, n_mo
1200 REAL(KIND=
dp) :: mx_occ
1206 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1214 NULLIFY (qs_kind_set)
1220 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1224 n_mo = mat_u%matrix_struct%nrow_global
1225 IF (n_mo /= mat_u%matrix_struct%ncol_global) &
1226 cpabort(
'block state matrix is not square')
1227 IF (n_mo /=
SIZE(vec_e)) &
1228 cpabort(
'inconsistent number of states / energies')
1231 CALL get_qs_env(qs_env, dft_control=dft_cntrl)
1233 IF (dft_cntrl%nspins > 1) &
1237 n_el = ec%block(id)%n_electrons
1238 IF (dft_cntrl%nspins > 1)
THEN
1240 IF (mod(ec%block(id)%n_electrons, 2) == 1)
THEN
1248 CALL allocate_mo_set(ec%block(id)%mo(spin), n_ao, n_mo, n_el, real(n_el,
dp), mx_occ, 0.0_dp)
1249 mo => ec%block(id)%mo(spin)
1252 ALLOCATE (mo%eigenvalues(n_mo))
1253 cpassert(
ASSOCIATED(mo%eigenvalues))
1254 mo%eigenvalues = vec_e
1257 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1259 nrow_global=n_ao, ncol_global=n_mo)
1260 ALLOCATE (mo%mo_coeff)
1261 CALL cp_fm_create(matrix=mo%mo_coeff, matrix_struct=fm_s, name=
'BLOCK STATES')
1264 CALL set_mo_coefficients(qs_env, ec, id, mo, mat_u, n_ao, n_mo)
1267 ALLOCATE (mo%occupation_numbers(n_mo))
1268 cpassert(
ASSOCIATED(mo%occupation_numbers))
1269 mo%occupation_numbers = 0.0_dp
1272 CALL get_qs_env(qs_env, scf_control=scf_cntrl)
1279 END SUBROUTINE create_block_mo_set
1292 SUBROUTINE save_mo_cube(qs_env, logger, input, mo, ib, im, is)
1299 INTEGER,
INTENT(IN) :: ib, im, is
1301 CHARACTER(LEN=default_path_length) :: filename
1302 CHARACTER(LEN=default_string_length) :: title
1314 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1325 NULLIFY (auxbas_pw_pool)
1327 NULLIFY (atomic_kind_set)
1329 NULLIFY (dft_control)
1330 NULLIFY (particle_set)
1331 NULLIFY (qs_kind_set)
1334 WRITE (filename,
'(A4,I1.1,A1,I5.5,A1,I1.1)')
'BWF_', ib,
'_', im,
'_', is
1337 middle_name=trim(filename), file_position=
'REWIND', log_filename=.false.)
1339 WRITE (title, *)
'WAVEFUNCTION ', im,
' block ', ib,
' spin ', is
1347 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1348 CALL auxbas_pw_pool%create_pw(wf_r)
1349 CALL auxbas_pw_pool%create_pw(wf_g)
1352 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1353 cell=cell, dft_control=dft_control, particle_set=particle_set)
1355 qs_kind_set, cell, dft_control, particle_set, pw_env)
1356 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1363 CALL auxbas_pw_pool%give_back_pw(wf_r)
1364 CALL auxbas_pw_pool%give_back_pw(wf_g)
1366 END SUBROUTINE save_mo_cube
1375 SUBROUTINE save_el_states(qs_env, ec, n_spins)
1379 TYPE(et_cpl),
POINTER :: ec
1380 INTEGER,
INTENT(IN) :: n_spins
1382 INTEGER :: i, j, k, l, n
1383 INTEGER,
DIMENSION(:),
POINTER :: list
1398 'PROPERTIES%ET_COUPLING%PROJECTION%BLOCK')
1401 DO i = 1, ec%n_blocks
1407 print_sec,
'MO_CUBES'),
cp_p_file))
THEN
1414 mo => ec%block(i)%mo(j)
1424 i_rep_val=k, i_vals=
list)
1425 IF (
ASSOCIATED(
list))
THEN
1426 DO l = 1,
SIZE(
list)
1427 CALL save_mo_cube(qs_env, logger, print_sec, mo, i,
list(l), j)
1439 DO k = max(1, mo%homo - n + 1), mo%homo
1440 CALL save_mo_cube(qs_env, logger, print_sec, mo, i, k, j)
1448 DO k = mo%lfomo, min(mo%lfomo + n - 1, mo%nmo)
1449 CALL save_mo_cube(qs_env, logger, print_sec, mo, i, k, j)
1461 END SUBROUTINE save_el_states
1474 INTEGER :: i, j, k, n_ao, n_atoms, output_unit
1475 LOGICAL :: do_kp, master
1479 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mat_h
1481 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks, mo_der
1483 TYPE(et_cpl),
POINTER :: ec
1487 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1500 NULLIFY (qs_kind_set)
1501 NULLIFY (et_proj_sec)
1504 NULLIFY (ks, mo_der)
1517 'PROGRAM_RUN_INFO', extension=
'.log')
1521 IF (output_unit > 0) &
1526 WRITE (output_unit,
'(/,T2,A)') &
1527 '!-----------------------------------------------------------------------------!'
1528 WRITE (output_unit,
'(T17,A)') &
1529 'Electronic coupling - Projection-operator method'
1534 cpassert(
ASSOCIATED(ec))
1535 CALL set_block_data(qs_env, et_proj_sec, ec)
1538 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, natom=n_atoms)
1544 WRITE (output_unit,
'(/,T3,A,I10)') &
1545 'Number of atoms = ', n_atoms
1546 WRITE (output_unit,
'(T3,A,I10)') &
1547 'Number of fragments = ', ec%n_blocks
1548 WRITE (output_unit,
'(T3,A,I10)') &
1549 'Number of fragment atoms = ', ec%n_atoms
1550 WRITE (output_unit,
'(T3,A,I10)') &
1551 'Number of unassigned atoms = ', n_atoms - ec%n_atoms
1552 WRITE (output_unit,
'(T3,A,I10)') &
1553 'Number of AO basis functions = ', n_ao
1555 DO i = 1, ec%n_blocks
1557 WRITE (output_unit,
'(/,T3,A,I0,A)') &
1559 WRITE (output_unit,
'(T3,A,I10)') &
1560 'Number of block atoms = ', ec%block(i)%n_atoms
1561 WRITE (output_unit,
'(T3,A,I10)') &
1562 'Number of block electrons = ', ec%block(i)%n_electrons
1563 WRITE (output_unit,
'(T3,A,I10)') &
1564 'Number of block AO functions = ', ec%block(i)%n_ao
1566 IF (ec%block(i)%n_atoms < 10)
THEN
1568 WRITE (output_unit,
'(T3,A,10I6)') &
1569 'Block atom IDs = ', &
1570 (ec%block(i)%atom(j)%id, j=1, ec%block(i)%n_atoms)
1574 WRITE (output_unit,
'(T3,A)')
'Block atom IDs ='
1575 DO j = 1, ec%block(i)%n_atoms/10
1576 WRITE (output_unit,
'(T3,A,10I6)')
' ', &
1577 (ec%block(i)%atom((j - 1)*10 + k)%id, k=1, 10)
1579 IF (mod(ec%block(i)%n_atoms, 10) /= 0)
THEN
1580 WRITE (output_unit,
'(T3,A,10I6)')
' ', &
1581 (ec%block(i)%atom(k + 10*(ec%block(i)%n_atoms/10))%id, &
1582 k=1, mod(ec%block(i)%n_atoms, 10))
1592 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1594 nrow_global=n_ao, ncol_global=n_ao)
1595 CALL cp_fm_create(matrix=mat_w, matrix_struct=fm_s, name=
'FULL WORK MATRIX')
1598 CALL get_qs_env(qs_env, dft_control=dft_cntrl, do_kpoints=do_kp)
1599 CALL get_qs_env(qs_env, mos=mo, matrix_ks=ks, mo_derivs=mo_der, scf_control=scf_control)
1600 CALL make_mo_eig(mo, dft_cntrl%nspins, ks, scf_control, mo_der)
1603 cpabort(
'ET_COUPLING not implemented with kpoints')
1607 WRITE (output_unit,
'(T3,A)')
'No K-point sampling (Gamma point only)'
1610 IF (dft_cntrl%nspins == 2)
THEN
1613 WRITE (output_unit,
'(/,T3,A)')
'Spin-polarized calculation'
1618 IF (mo(1)%nao /= mo(2)%nao) &
1619 cpabort(
'different number of alpha/beta AO basis functions')
1621 WRITE (output_unit,
'(/,T3,A,I10)') &
1622 'Number of AO basis functions = ', mo(1)%nao
1623 WRITE (output_unit,
'(T3,A,I10)') &
1624 'Number of alpha states = ', mo(1)%nmo
1625 WRITE (output_unit,
'(T3,A,I10)') &
1626 'Number of beta states = ', mo(2)%nmo
1628 CALL print_states(output_unit, mo, dft_cntrl%nspins,
'the whole system', fermi=.true.)
1629 CALL set_fermi(ec, mo(1)%mu, mo(2)%mu)
1632 CALL get_block_hamiltonian(qs_env, ec, fm_s, mat_h, mat_w, n_ao, dft_cntrl%nspins)
1635 CALL hamiltonian_block_diag(qs_env, ec, mat_h)
1638 DO i = 1, ec%n_blocks
1639 IF (output_unit > 0)
THEN
1640 CALL print_states(output_unit, ec%block(i)%mo, dft_cntrl%nspins, &
1642 mx_mo_a=mo(1)%nmo, mx_mo_b=mo(2)%nmo, fermi=.true.)
1644 CALL print_mo_coeff(output_unit, qs_env, ec, i, dft_cntrl%nspins)
1647 CALL print_couplings(et_proj_sec, output_unit, logger, ec, mo)
1652 WRITE (output_unit,
'(/,T3,A)')
'Spin-restricted calculation'
1658 WRITE (output_unit,
'(/,T3,A,I10)') &
1659 'Number of AO basis functions = ', mo(1)%nao
1660 WRITE (output_unit,
'(T3,A,I10)') &
1661 'Number of states = ', mo(1)%nmo
1663 CALL print_states(output_unit, mo, dft_cntrl%nspins,
'the whole system', fermi=.true.)
1664 CALL set_fermi(ec, mo(1)%mu)
1667 CALL get_block_hamiltonian(qs_env, ec, fm_s, mat_h, mat_w, n_ao, dft_cntrl%nspins)
1670 CALL hamiltonian_block_diag(qs_env, ec, mat_h)
1673 DO i = 1, ec%n_blocks
1674 IF (output_unit > 0)
THEN
1675 CALL print_states(output_unit, ec%block(i)%mo, dft_cntrl%nspins, &
1677 mx_mo_a=mo(1)%nmo, fermi=.true.)
1679 CALL print_mo_coeff(output_unit, qs_env, ec, i, dft_cntrl%nspins)
1682 CALL print_couplings(et_proj_sec, output_unit, logger, ec, mo)
1687 CALL save_el_states(qs_env, ec, dft_cntrl%nspins)
1690 IF (master)
WRITE (output_unit,
'(/,T2,A)') &
1691 '!-----------------------------------------------------------------------------!'
1696 IF (
ALLOCATED(mat_h))
THEN
1697 DO i = 1,
SIZE(mat_h)
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 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)
...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public futera2017
Handles all functions related to the CELL.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
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)
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
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_vectorssum(matrix, sum_array, dir)
summing up all the elements along the matrix's i-th index or
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_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
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
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
subroutine, public cp_fm_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, stride, zero_tails, silent, mpi_io)
...
calculates the electron transfer coupling elements by projection-operator approach Kondov et al....
subroutine release_ec_data(ec)
Release memory allocate for electronic coupling data structures.
subroutine, public calc_et_coupling_proj(qs_env)
calculates the electron transfer coupling elements by projection-operator approach Kondov et al....
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Types and basic routines needed for a kpoint calculation.
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nso
basic linear algebra operations for full matrixes
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
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, 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, 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, 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)
Get the QUICKSTEP environment.
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, 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, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg)
Get attributes of an atomic kind set.
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env)
Calculate KS eigenvalues starting from OF MOS.
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
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.
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)
...
parameters that control an scf iteration
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
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...
Contains information about kpoints.
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
to create arrays of pools
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.