44 USE dbcsr_api,
ONLY: dbcsr_p_type
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
142 SUBROUTINE release_ec_data(ec)
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
156 CALL cp_fm_release(matrix=ec%m_transf)
157 DEALLOCATE (ec%m_transf)
158 NULLIFY (ec%m_transf)
160 IF (
ASSOCIATED(ec%m_transf_inv))
THEN
161 CALL cp_fm_release(matrix=ec%m_transf_inv)
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)
177 CALL cp_fm_release(ec%block(i)%hab)
180 DEALLOCATE (ec%block)
188 END SUBROUTINE release_ec_data
197 SUBROUTINE set_block_data(qs_env, et_proj_sec, ec)
200 TYPE(qs_environment_type),
POINTER :: qs_env
201 TYPE(section_vals_type),
POINTER :: et_proj_sec
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
208 TYPE(gto_basis_set_type),
POINTER :: ao_basis_set
209 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
210 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
211 TYPE(section_vals_type),
POINTER :: block_sec
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
404 TYPE(cp_fm_type),
INTENT(IN) :: mat_h, mat_w
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
440 CALL cp_fm_to_fm(mat_w, mat_h)
442 END SUBROUTINE reorder_hamiltonian_matrix
452 SUBROUTINE get_s_half_inv_matrix(qs_env, mat_t, mat_i, mat_w)
455 TYPE(qs_environment_type),
POINTER :: qs_env
456 TYPE(cp_fm_type),
INTENT(IN) :: mat_t, mat_i, mat_w
459 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_s
460 TYPE(scf_control_type),
POINTER :: scf_cntrl
472 CALL get_qs_env(qs_env, scf_control=scf_cntrl)
473 CALL cp_fm_power(mat_t, mat_w, -0.5_dp, scf_cntrl%eps_eigval, n_deps)
474 CALL cp_fm_power(mat_i, mat_w, +0.5_dp, scf_cntrl%eps_eigval, n_deps)
476 IF (n_deps /= 0)
THEN
477 CALL cp_warn(__location__, &
478 "Overlap matrix exhibits linear dependencies. At least some "// &
479 "eigenvalues have been quenched.")
482 END SUBROUTINE get_s_half_inv_matrix
495 SUBROUTINE get_block_hamiltonian(qs_env, ec, fm_s, mat_t, mat_w, n_ao, n_spins)
498 TYPE(qs_environment_type),
POINTER :: qs_env
499 TYPE(et_cpl),
POINTER :: ec
500 TYPE(cp_fm_struct_type),
POINTER :: fm_s
501 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
503 TYPE(cp_fm_type),
INTENT(IN) :: mat_w
504 INTEGER :: n_ao, n_spins
507 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_h
514 ALLOCATE (mat_t(n_spins))
519 ALLOCATE (ec%m_transf, ec%m_transf_inv)
520 CALL cp_fm_create(matrix=ec%m_transf, matrix_struct=fm_s, &
521 name=
'S^(-1/2) TRANSFORMATION MATRIX')
522 CALL cp_fm_create(matrix=ec%m_transf_inv, matrix_struct=fm_s, &
523 name=
'S^(+1/2) TRANSFORMATION MATRIX')
524 CALL get_s_half_inv_matrix(qs_env, ec%m_transf, ec%m_transf_inv, mat_w)
529 CALL cp_fm_create(matrix=mat_t(i), matrix_struct=fm_s, &
530 name=
'KS HAMILTONIAN IN SEPARATED ORTHOGONALIZED BASIS SET')
534 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)
535 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))
538 CALL reorder_hamiltonian_matrix(ec, mat_t(i), mat_w)
542 END SUBROUTINE get_block_hamiltonian
551 SUBROUTINE hamiltonian_block_diag(qs_env, ec, mat_h)
554 TYPE(qs_environment_type),
POINTER :: qs_env
555 TYPE(et_cpl),
POINTER :: ec
556 TYPE(cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mat_h
558 INTEGER :: i, j, k, l, n_spins, spin
559 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_e
560 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
561 TYPE(cp_fm_struct_type),
POINTER :: fm_s
562 TYPE(cp_fm_type) :: mat_u
563 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: dat
564 TYPE(mp_para_env_type),
POINTER :: para_env
574 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
577 ALLOCATE (dat(ec%n_blocks))
578 cpassert(
ALLOCATED(dat))
581 n_spins =
SIZE(mat_h)
582 DO i = 1, ec%n_blocks
583 ALLOCATE (ec%block(i)%mo(n_spins))
584 cpassert(
ASSOCIATED(ec%block(i)%mo))
585 ALLOCATE (ec%block(i)%hab(n_spins, ec%n_blocks))
586 cpassert(
ASSOCIATED(ec%block(i)%hab))
594 DO i = 1, ec%n_blocks
598 nrow_global=ec%block(i)%n_ao, ncol_global=ec%block(i)%n_ao)
600 name=
'H_KS DIAGONAL BLOCK')
602 ALLOCATE (vec_e(ec%block(i)%n_ao))
603 cpassert(
ASSOCIATED(vec_e))
607 dat(i), ec%block(i)%n_ao, &
608 ec%block(i)%n_ao, j, j, 1, 1)
611 CALL cp_fm_create(matrix=mat_u, matrix_struct=fm_s, name=
'UNITARY MATRIX')
613 CALL cp_fm_to_fm(mat_u, dat(i))
616 CALL create_block_mo_set(qs_env, ec, i, spin, mat_u, vec_e)
620 CALL cp_fm_release(matrix=mat_u)
624 j = j + ec%block(i)%n_ao
630 DO i = 1, ec%n_blocks
632 DO j = 1, ec%n_blocks
637 nrow_global=ec%block(i)%n_ao, ncol_global=ec%block(j)%n_ao)
638 CALL cp_fm_create(matrix=ec%block(i)%hab(spin, j), matrix_struct=fm_s, &
639 name=
'H_KS OFF-DIAGONAL BLOCK')
643 ec%block(i)%hab(spin, j), ec%block(i)%n_ao, &
644 ec%block(j)%n_ao, k, l, 1, 1)
647 CALL cp_fm_create(matrix=mat_u, matrix_struct=fm_s, name=
'FULL WORK MATRIX')
648 CALL parallel_gemm(
"T",
"N", ec%block(i)%n_ao, ec%block(j)%n_ao, ec%block(i)%n_ao, &
649 1.0_dp, dat(i), ec%block(i)%hab(spin, j), 0.0_dp, mat_u)
650 CALL parallel_gemm(
"N",
"N", ec%block(i)%n_ao, ec%block(j)%n_ao, ec%block(j)%n_ao, &
651 1.0_dp, mat_u, dat(j), 0.0_dp, ec%block(i)%hab(spin, j))
655 CALL cp_fm_release(matrix=mat_u)
659 l = l + ec%block(j)%n_ao
662 k = k + ec%block(i)%n_ao
666 IF (
ALLOCATED(dat))
THEN
668 CALL cp_fm_release(dat(i))
674 IF (
ALLOCATED(dat)) &
677 END SUBROUTINE hamiltonian_block_diag
688 FUNCTION get_mo_c2_sum(blk_at, mo, id, atom)
RESULT(c2)
691 TYPE(et_cpl_atom),
DIMENSION(:),
POINTER :: blk_at
692 TYPE(cp_fm_type),
INTENT(IN) :: mo
693 INTEGER,
INTENT(IN) :: id
694 INTEGER,
DIMENSION(:),
POINTER :: atom
697 INTEGER :: i, ir, j, k
713 DO j = 1,
SIZE(blk_at)
714 IF (blk_at(j)%id ==
atom(i))
THEN
721 cpabort(
'MO-fraction atom ID not defined in the block')
724 DO k = 1, blk_at(j)%n_ao
725 ir = blk_at(j)%ao_pos + k - 1
732 END FUNCTION get_mo_c2_sum
743 SUBROUTINE print_mo_coeff(output_unit, qs_env, ec, blk, n_spins)
746 INTEGER,
INTENT(IN) :: output_unit
747 TYPE(qs_environment_type),
POINTER :: qs_env
748 TYPE(et_cpl),
POINTER :: ec
749 INTEGER,
INTENT(IN) :: blk, n_spins
751 INTEGER :: j, k, l, m, n, n_ao, n_mo
752 INTEGER,
DIMENSION(:),
POINTER :: list_at, list_mo
753 REAL(KIND=
dp) :: c1, c2
754 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mat_w
755 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
756 TYPE(section_vals_type),
POINTER :: block_sec, print_sec
762 NULLIFY (qs_kind_set)
766 'PROPERTIES%ET_COUPLING%PROJECTION%BLOCK')
775 IF (output_unit > 0) &
776 WRITE (output_unit,
'(/,T3,A/)')
'Block state fractions:'
779 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
783 ALLOCATE (mat_w(n_spins))
785 n_mo = ec%block(blk)%n_ao
787 matrix_struct=ec%block(blk)%mo(j)%mo_coeff%matrix_struct, &
788 name=
'BLOCK MOs IN ORTHONORMAL BASIS SET')
789 CALL parallel_gemm(
"N",
"N", n_ao, n_mo, n_ao, 1.0_dp, ec%m_transf_inv, &
790 ec%block(blk)%mo(j)%mo_coeff, 0.0_dp, mat_w(j))
796 i_rep_val=j, i_vals=list_at)
797 IF (
ASSOCIATED(list_at))
THEN
807 i_rep_val=k, i_vals=list_mo)
808 IF (
ASSOCIATED(list_mo))
THEN
811 IF (output_unit > 0) &
812 WRITE (output_unit, *)
815 DO l = 1,
SIZE(list_mo)
817 IF (n_spins > 1)
THEN
818 c1 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(1), &
820 c2 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(2), &
822 IF (output_unit > 0) &
823 WRITE (output_unit,
'(I5,A,I5,2F20.10)') j,
' /', list_mo(l), c1, c2
825 c1 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(1), &
827 IF (output_unit > 0) &
828 WRITE (output_unit,
'(I5,A,I5,F20.10)') j,
' /', list_mo(l), c1
842 CALL cp_fm_release(mat_w)
846 END SUBROUTINE print_mo_coeff
859 SUBROUTINE print_states(output_unit, mo, n_spins, label, mx_mo_a, mx_mo_b, fermi)
862 INTEGER,
INTENT(IN) :: output_unit
863 TYPE(mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo
864 INTEGER,
INTENT(IN) :: n_spins
865 CHARACTER(LEN=*),
INTENT(IN) :: label
866 INTEGER,
INTENT(IN),
OPTIONAL :: mx_mo_a, mx_mo_b
867 LOGICAL,
INTENT(IN),
OPTIONAL :: fermi
869 INTEGER :: i, mx_a, mx_b, n
875 IF (
PRESENT(fermi)) &
878 IF (output_unit > 0)
THEN
880 WRITE (output_unit,
'(/,T3,A/)')
'State energies ('//trim(adjustl(label))//
'):'
883 IF (n_spins > 1)
THEN
886 IF (
PRESENT(mx_mo_a)) &
887 mx_a = min(mo(1)%nmo, mx_mo_a)
889 IF (
PRESENT(mx_mo_b)) &
890 mx_b = min(mo(2)%nmo, mx_mo_b)
894 WRITE (output_unit,
'(T3,I10)', advance=
'no') i
896 WRITE (output_unit,
'(2F12.4)', advance=
'no') &
897 mo(1)%occupation_numbers(i), mo(1)%eigenvalues(i)
899 WRITE (output_unit,
'(A)', advance=
'no')
' '
901 WRITE (output_unit,
'(A)', advance=
'no')
' '
903 WRITE (output_unit,
'(2F12.4)') &
904 mo(2)%occupation_numbers(i), mo(2)%eigenvalues(i)
906 WRITE (output_unit, *)
911 WRITE (output_unit,
'(/,T3,I10,F24.4,I10,F19.4)') &
912 mo(1)%nelectron, mo(1)%mu, &
913 mo(2)%nelectron, mo(2)%mu
920 IF (
PRESENT(mx_mo_a)) &
921 mx_a = min(mo(1)%nmo, mx_mo_a)
924 WRITE (output_unit,
'(T3,I10,2F12.4)') &
925 i, mo(1)%occupation_numbers(i), mo(1)%eigenvalues(i)
929 WRITE (output_unit,
'(/,T3,I10,F24.4)') &
930 mo(1)%nelectron, mo(1)%mu
937 END SUBROUTINE print_states
948 SUBROUTINE print_couplings(ec_sec, output_unit, logger, ec, mo)
951 TYPE(section_vals_type),
POINTER :: ec_sec
952 INTEGER,
INTENT(IN) :: output_unit
953 TYPE(cp_logger_type),
POINTER :: logger
954 TYPE(et_cpl),
POINTER :: ec
955 TYPE(mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo
957 CHARACTER(LEN=default_path_length) :: filename, my_pos, title
958 INTEGER :: i, j, k, l, n_states(2), nc, nr, nspins, &
961 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: w1, w2
962 TYPE(section_vals_type),
POINTER :: print_key
969 n_states(i) = mo(i)%nmo
972 IF (n_states(2) > 0) nspins = 2
975 subsection_name=
"PRINT%COUPLINGS")
986 IF (output_unit > 0) &
987 WRITE (output_unit,
'(/,T3,A/)')
'Printing coupling elements to output files'
989 DO i = 1, ec%n_blocks
990 DO j = i + 1, ec%n_blocks
992 nr = ec%block(i)%hab(1, j)%matrix_struct%nrow_global
993 nc = ec%block(i)%hab(1, j)%matrix_struct%ncol_global
995 ALLOCATE (w1(nr, nc))
996 cpassert(
ASSOCIATED(w1))
999 ALLOCATE (w2(nr, nc))
1000 cpassert(
ASSOCIATED(w2))
1004 IF (output_unit > 0)
THEN
1006 WRITE (filename,
'(a5,I1.1,a1,I1.1)')
"ET_BL_", i,
"-", j
1008 middle_name=trim(filename), file_position=my_pos, log_filename=.false.)
1010 WRITE (title, *)
'Coupling elements [meV] between blocks:', i, j
1012 WRITE (unit_nr, *) trim(title)
1013 IF (nspins > 1)
THEN
1014 WRITE (unit_nr,
'(T3,A8,T13,A8,T28,A,A)')
'State A',
'State B',
'Coupling spin 1',
' Coupling spin 2'
1016 WRITE (unit_nr,
'(T3,A8,T13,A8,T28,A)')
'State A',
'State B',
'Coupling'
1019 DO k = 1, min(ec%block(i)%n_ao, n_states(1))
1020 DO l = 1, min(ec%block(j)%n_ao, n_states(1))
1022 IF (nspins > 1)
THEN
1024 WRITE (unit_nr,
'(T3,I5,T13,I5,T22,E20.6)', advance=
'no') &
1025 k, l, w1(k, l)*
evolt*1000.0_dp
1026 IF ((k <= n_states(2)) .AND. (l <= n_states(2)))
THEN
1027 WRITE (unit_nr,
'(E20.6)') &
1028 w2(k, l)*
evolt*1000.0_dp
1035 WRITE (unit_nr,
'(T3,I5,T13,I5,T22,E20.6)') &
1036 k, l, w1(k, l)*
evolt*1000.0_dp
1046 IF (
ASSOCIATED(w1))
DEALLOCATE (w1)
1047 IF (
ASSOCIATED(w2))
DEALLOCATE (w2)
1053 END SUBROUTINE print_couplings
1063 SUBROUTINE normalize_mo_vectors(qs_env, mo, n_ao, n_mo)
1066 TYPE(qs_environment_type),
POINTER :: qs_env
1067 TYPE(mo_set_type),
POINTER :: mo
1068 INTEGER,
INTENT(IN) :: n_ao, n_mo
1070 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_t
1071 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1072 TYPE(cp_fm_struct_type),
POINTER :: fm_s
1073 TYPE(cp_fm_type) :: mat_sc, mat_t
1074 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: mat_s
1075 TYPE(mp_para_env_type),
POINTER :: para_env
1090 CALL cp_fm_create(matrix=mat_sc, matrix_struct=mo%mo_coeff%matrix_struct, &
1091 name=
'S*C PRODUCT MATRIX')
1095 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1097 nrow_global=n_mo, ncol_global=n_mo)
1099 name=
'C^T*S*C OVERLAP PRODUCT MATRIX')
1100 CALL parallel_gemm(
'T',
'N', n_mo, n_mo, n_ao, 1.0_dp, mo%mo_coeff, mat_sc, 0.0_dp, mat_t)
1103 ALLOCATE (vec_t(n_mo))
1104 cpassert(
ASSOCIATED(vec_t))
1106 vec_t = 1.0_dp/dsqrt(vec_t)
1111 CALL cp_fm_release(matrix=mat_sc)
1112 CALL cp_fm_release(matrix=mat_t)
1113 IF (
ASSOCIATED(vec_t)) &
1116 END SUBROUTINE normalize_mo_vectors
1129 SUBROUTINE set_mo_coefficients(qs_env, ec, id, mo, mat_u, n_ao, n_mo)
1132 TYPE(qs_environment_type),
POINTER :: qs_env
1133 TYPE(et_cpl),
POINTER :: ec
1134 INTEGER,
INTENT(IN) :: id
1135 TYPE(mo_set_type),
POINTER :: mo
1136 TYPE(cp_fm_type),
INTENT(IN) :: mat_u
1137 INTEGER,
INTENT(IN) :: n_ao, n_mo
1139 INTEGER :: ic, ir, jc, jr, mr, nc, nr
1141 TYPE(cp_fm_type) :: mat_w
1147 CALL cp_fm_create(matrix=mat_w, matrix_struct=mo%mo_coeff%matrix_struct, &
1148 name=
'BLOCK MO-TRANSFORMATION WORKING MATRIX')
1154 DO ir = 1, ec%block(id)%n_atoms
1155 DO jr = 1, ec%block(id)%atom(ir)%n_ao
1158 DO ic = 1, ec%block(id)%n_atoms
1159 DO jc = 1, ec%block(id)%atom(ic)%n_ao
1160 mr = ec%block(id)%atom(ir)%ao_pos + jr - 1
1171 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)
1172 CALL normalize_mo_vectors(qs_env, mo, n_ao, n_mo)
1175 CALL cp_fm_release(matrix=mat_w)
1177 END SUBROUTINE set_mo_coefficients
1189 SUBROUTINE create_block_mo_set(qs_env, ec, id, spin, mat_u, vec_e)
1192 TYPE(qs_environment_type),
POINTER :: qs_env
1193 TYPE(et_cpl),
POINTER :: ec
1194 INTEGER,
INTENT(IN) :: id, spin
1195 TYPE(cp_fm_type),
INTENT(IN) :: mat_u
1196 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_e
1198 INTEGER :: n_ao, n_el, n_mo
1199 REAL(KIND=
dp) :: mx_occ
1200 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1201 TYPE(cp_fm_struct_type),
POINTER :: fm_s
1202 TYPE(dft_control_type),
POINTER :: dft_cntrl
1203 TYPE(mo_set_type),
POINTER :: mo
1204 TYPE(mp_para_env_type),
POINTER :: para_env
1205 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1206 TYPE(scf_control_type),
POINTER :: scf_cntrl
1213 NULLIFY (qs_kind_set)
1219 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1223 n_mo = mat_u%matrix_struct%nrow_global
1224 IF (n_mo /= mat_u%matrix_struct%ncol_global) &
1225 cpabort(
'block state matrix is not square')
1226 IF (n_mo /=
SIZE(vec_e)) &
1227 cpabort(
'inconsistent number of states / energies')
1230 CALL get_qs_env(qs_env, dft_control=dft_cntrl)
1232 IF (dft_cntrl%nspins > 1) &
1236 n_el = ec%block(id)%n_electrons
1237 IF (dft_cntrl%nspins > 1)
THEN
1239 IF (mod(ec%block(id)%n_electrons, 2) == 1)
THEN
1247 CALL allocate_mo_set(ec%block(id)%mo(spin), n_ao, n_mo, n_el, real(n_el,
dp), mx_occ, 0.0_dp)
1248 mo => ec%block(id)%mo(spin)
1251 ALLOCATE (mo%eigenvalues(n_mo))
1252 cpassert(
ASSOCIATED(mo%eigenvalues))
1253 mo%eigenvalues = vec_e
1256 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1258 nrow_global=n_ao, ncol_global=n_mo)
1259 ALLOCATE (mo%mo_coeff)
1260 CALL cp_fm_create(matrix=mo%mo_coeff, matrix_struct=fm_s, name=
'BLOCK STATES')
1263 CALL set_mo_coefficients(qs_env, ec, id, mo, mat_u, n_ao, n_mo)
1266 ALLOCATE (mo%occupation_numbers(n_mo))
1267 cpassert(
ASSOCIATED(mo%occupation_numbers))
1268 mo%occupation_numbers = 0.0_dp
1271 CALL get_qs_env(qs_env, scf_control=scf_cntrl)
1272 CALL set_mo_occupation(mo_set=mo, smear=scf_cntrl%smear)
1278 END SUBROUTINE create_block_mo_set
1291 SUBROUTINE save_mo_cube(qs_env, logger, input, mo, ib, im, is)
1294 TYPE(qs_environment_type),
POINTER :: qs_env
1295 TYPE(cp_logger_type),
POINTER :: logger
1296 TYPE(section_vals_type),
POINTER :: input
1297 TYPE(mo_set_type),
POINTER :: mo
1298 INTEGER,
INTENT(IN) :: ib, im, is
1300 CHARACTER(LEN=default_path_length) :: filename
1301 CHARACTER(LEN=default_string_length) :: title
1303 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1304 TYPE(cell_type),
POINTER :: cell
1305 TYPE(dft_control_type),
POINTER :: dft_control
1306 TYPE(particle_list_type),
POINTER :: particles
1307 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1308 TYPE(pw_c1d_gs_type) :: wf_g
1309 TYPE(pw_env_type),
POINTER :: pw_env
1310 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1311 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1312 TYPE(pw_r3d_rs_type) :: wf_r
1313 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1314 TYPE(qs_subsys_type),
POINTER :: subsys
1324 NULLIFY (auxbas_pw_pool)
1326 NULLIFY (atomic_kind_set)
1328 NULLIFY (dft_control)
1329 NULLIFY (particle_set)
1330 NULLIFY (qs_kind_set)
1333 WRITE (filename,
'(A4,I1.1,A1,I5.5,A1,I1.1)')
'BWF_', ib,
'_', im,
'_', is
1336 middle_name=trim(filename), file_position=
'REWIND', log_filename=.false.)
1338 WRITE (title, *)
'WAVEFUNCTION ', im,
' block ', ib,
' spin ', is
1346 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1347 CALL auxbas_pw_pool%create_pw(wf_r)
1348 CALL auxbas_pw_pool%create_pw(wf_g)
1351 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1352 cell=cell, dft_control=dft_control, particle_set=particle_set)
1354 qs_kind_set, cell, dft_control, particle_set, pw_env)
1355 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1362 CALL auxbas_pw_pool%give_back_pw(wf_r)
1363 CALL auxbas_pw_pool%give_back_pw(wf_g)
1365 END SUBROUTINE save_mo_cube
1374 SUBROUTINE save_el_states(qs_env, ec, n_spins)
1377 TYPE(qs_environment_type),
POINTER :: qs_env
1378 TYPE(et_cpl),
POINTER :: ec
1379 INTEGER,
INTENT(IN) :: n_spins
1381 INTEGER :: i, j, k, l, n
1382 INTEGER,
DIMENSION(:),
POINTER :: list
1383 TYPE(cp_logger_type),
POINTER :: logger
1384 TYPE(mo_set_type),
POINTER :: mo
1385 TYPE(section_vals_type),
POINTER :: block_sec, mo_sec, print_sec
1397 'PROPERTIES%ET_COUPLING%PROJECTION%BLOCK')
1400 DO i = 1, ec%n_blocks
1406 print_sec,
'MO_CUBES'),
cp_p_file))
THEN
1413 mo => ec%block(i)%mo(j)
1423 i_rep_val=k, i_vals=
list)
1424 IF (
ASSOCIATED(
list))
THEN
1425 DO l = 1,
SIZE(
list)
1426 CALL save_mo_cube(qs_env, logger, print_sec, mo, i,
list(l), j)
1438 DO k = max(1, mo%homo - n + 1), mo%homo
1439 CALL save_mo_cube(qs_env, logger, print_sec, mo, i, k, j)
1447 DO k = mo%lfomo, min(mo%lfomo + n - 1, mo%nmo)
1448 CALL save_mo_cube(qs_env, logger, print_sec, mo, i, k, j)
1460 END SUBROUTINE save_el_states
1471 TYPE(qs_environment_type),
POINTER :: qs_env
1473 INTEGER :: i, j, k, n_ao, n_atoms, output_unit
1474 LOGICAL :: do_kp, master
1475 TYPE(cp_blacs_env_type),
POINTER :: blacs_env
1476 TYPE(cp_fm_struct_type),
POINTER :: fm_s
1477 TYPE(cp_fm_type) :: mat_w
1478 TYPE(cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mat_h
1479 TYPE(cp_logger_type),
POINTER :: logger
1480 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks, mo_der
1481 TYPE(dft_control_type),
POINTER :: dft_cntrl
1482 TYPE(et_cpl),
POINTER :: ec
1483 TYPE(kpoint_type),
POINTER :: kpoints
1484 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mo
1485 TYPE(mp_para_env_type),
POINTER :: para_env
1486 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1487 TYPE(scf_control_type),
POINTER :: scf_control
1488 TYPE(section_vals_type),
POINTER :: et_proj_sec
1499 NULLIFY (qs_kind_set)
1500 NULLIFY (et_proj_sec)
1503 NULLIFY (ks, mo_der)
1516 'PROGRAM_RUN_INFO', extension=
'.log')
1520 IF (output_unit > 0) &
1525 WRITE (output_unit,
'(/,T2,A)') &
1526 '!-----------------------------------------------------------------------------!'
1527 WRITE (output_unit,
'(T17,A)') &
1528 'Electronic coupling - Projection-operator method'
1533 cpassert(
ASSOCIATED(ec))
1534 CALL set_block_data(qs_env, et_proj_sec, ec)
1537 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, natom=n_atoms)
1543 WRITE (output_unit,
'(/,T3,A,I10)') &
1544 'Number of atoms = ', n_atoms
1545 WRITE (output_unit,
'(T3,A,I10)') &
1546 'Number of fragments = ', ec%n_blocks
1547 WRITE (output_unit,
'(T3,A,I10)') &
1548 'Number of fragment atoms = ', ec%n_atoms
1549 WRITE (output_unit,
'(T3,A,I10)') &
1550 'Number of unassigned atoms = ', n_atoms - ec%n_atoms
1551 WRITE (output_unit,
'(T3,A,I10)') &
1552 'Number of AO basis functions = ', n_ao
1554 DO i = 1, ec%n_blocks
1556 WRITE (output_unit,
'(/,T3,A,I0,A)') &
1558 WRITE (output_unit,
'(T3,A,I10)') &
1559 'Number of block atoms = ', ec%block(i)%n_atoms
1560 WRITE (output_unit,
'(T3,A,I10)') &
1561 'Number of block electrons = ', ec%block(i)%n_electrons
1562 WRITE (output_unit,
'(T3,A,I10)') &
1563 'Number of block AO functions = ', ec%block(i)%n_ao
1565 IF (ec%block(i)%n_atoms < 10)
THEN
1567 WRITE (output_unit,
'(T3,A,10I6)') &
1568 'Block atom IDs = ', &
1569 (ec%block(i)%atom(j)%id, j=1, ec%block(i)%n_atoms)
1573 WRITE (output_unit,
'(T3,A)')
'Block atom IDs ='
1574 DO j = 1, ec%block(i)%n_atoms/10
1575 WRITE (output_unit,
'(T3,A,10I6)')
' ', &
1576 (ec%block(i)%atom((j - 1)*10 + k)%id, k=1, 10)
1578 IF (mod(ec%block(i)%n_atoms, 10) /= 0)
THEN
1579 WRITE (output_unit,
'(T3,A,10I6)')
' ', &
1580 (ec%block(i)%atom(k + 10*(ec%block(i)%n_atoms/10))%id, &
1581 k=1, mod(ec%block(i)%n_atoms, 10))
1591 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1593 nrow_global=n_ao, ncol_global=n_ao)
1594 CALL cp_fm_create(matrix=mat_w, matrix_struct=fm_s, name=
'FULL WORK MATRIX')
1597 CALL get_qs_env(qs_env, dft_control=dft_cntrl, do_kpoints=do_kp)
1598 CALL get_qs_env(qs_env, mos=mo, matrix_ks=ks, mo_derivs=mo_der, scf_control=scf_control)
1599 CALL make_mo_eig(mo, dft_cntrl%nspins, ks, scf_control, mo_der)
1602 cpabort(
'ET_COUPLING not implemented with kpoints')
1606 WRITE (output_unit,
'(T3,A)')
'No K-point sampling (Gamma point only)'
1609 IF (dft_cntrl%nspins == 2)
THEN
1612 WRITE (output_unit,
'(/,T3,A)')
'Spin-polarized calculation'
1617 IF (mo(1)%nao /= mo(2)%nao) &
1618 cpabort(
'different number of alpha/beta AO basis functions')
1620 WRITE (output_unit,
'(/,T3,A,I10)') &
1621 'Number of AO basis functions = ', mo(1)%nao
1622 WRITE (output_unit,
'(T3,A,I10)') &
1623 'Number of alpha states = ', mo(1)%nmo
1624 WRITE (output_unit,
'(T3,A,I10)') &
1625 'Number of beta states = ', mo(2)%nmo
1627 CALL print_states(output_unit, mo, dft_cntrl%nspins,
'the whole system', fermi=.true.)
1628 CALL set_fermi(ec, mo(1)%mu, mo(2)%mu)
1631 CALL get_block_hamiltonian(qs_env, ec, fm_s, mat_h, mat_w, n_ao, dft_cntrl%nspins)
1634 CALL hamiltonian_block_diag(qs_env, ec, mat_h)
1637 DO i = 1, ec%n_blocks
1638 IF (output_unit > 0)
THEN
1639 CALL print_states(output_unit, ec%block(i)%mo, dft_cntrl%nspins, &
1640 'block '//trim(adjustl(cp_to_string(i)))//
' states', &
1641 mx_mo_a=mo(1)%nmo, mx_mo_b=mo(2)%nmo, fermi=.true.)
1643 CALL print_mo_coeff(output_unit, qs_env, ec, i, dft_cntrl%nspins)
1646 CALL print_couplings(et_proj_sec, output_unit, logger, ec, mo)
1651 WRITE (output_unit,
'(/,T3,A)')
'Spin-restricted calculation'
1657 WRITE (output_unit,
'(/,T3,A,I10)') &
1658 'Number of AO basis functions = ', mo(1)%nao
1659 WRITE (output_unit,
'(T3,A,I10)') &
1660 'Number of states = ', mo(1)%nmo
1662 CALL print_states(output_unit, mo, dft_cntrl%nspins,
'the whole system', fermi=.true.)
1663 CALL set_fermi(ec, mo(1)%mu)
1666 CALL get_block_hamiltonian(qs_env, ec, fm_s, mat_h, mat_w, n_ao, dft_cntrl%nspins)
1669 CALL hamiltonian_block_diag(qs_env, ec, mat_h)
1672 DO i = 1, ec%n_blocks
1673 IF (output_unit > 0)
THEN
1674 CALL print_states(output_unit, ec%block(i)%mo, dft_cntrl%nspins, &
1675 'block '//trim(adjustl(cp_to_string(i)))//
' states', &
1676 mx_mo_a=mo(1)%nmo, fermi=.true.)
1678 CALL print_mo_coeff(output_unit, qs_env, ec, i, dft_cntrl%nspins)
1681 CALL print_couplings(et_proj_sec, output_unit, logger, ec, mo)
1686 CALL save_el_states(qs_env, ec, dft_cntrl%nspins)
1689 IF (master)
WRITE (output_unit,
'(/,T2,A)') &
1690 '!-----------------------------------------------------------------------------!'
1694 CALL cp_fm_release(matrix=mat_w)
1695 IF (
ALLOCATED(mat_h))
THEN
1696 DO i = 1,
SIZE(mat_h)
1697 CALL cp_fm_release(matrix=mat_h(i))
1701 CALL release_ec_data(ec)
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)
...
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, 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, external_vector)
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_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.
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.
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)
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