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))
THEN
154 DEALLOCATE (ec%fermi)
156 IF (
ASSOCIATED(ec%m_transf))
THEN
158 DEALLOCATE (ec%m_transf)
159 NULLIFY (ec%m_transf)
161 IF (
ASSOCIATED(ec%m_transf_inv))
THEN
163 DEALLOCATE (ec%m_transf_inv)
164 NULLIFY (ec%m_transf_inv)
167 IF (
ASSOCIATED(ec%block))
THEN
169 DO i = 1,
SIZE(ec%block)
170 IF (
ASSOCIATED(ec%block(i)%atom))
THEN
171 DEALLOCATE (ec%block(i)%atom)
173 IF (
ASSOCIATED(ec%block(i)%mo))
THEN
174 DO j = 1,
SIZE(ec%block(i)%mo)
177 DEALLOCATE (ec%block(i)%mo)
182 DEALLOCATE (ec%block)
199 SUBROUTINE set_block_data(qs_env, et_proj_sec, ec)
204 TYPE(et_cpl),
POINTER :: ec
206 INTEGER :: i, j, k, l, n, n_ao, n_atoms, n_set
207 INTEGER,
DIMENSION(:),
POINTER :: atom_id, atom_nf, atom_ps, n_shell, t
208 INTEGER,
DIMENSION(:, :),
POINTER :: ang_mom_id
212 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
217 NULLIFY (ao_basis_set)
218 NULLIFY (particle_set)
219 NULLIFY (qs_kind_set)
230 NULLIFY (ec%m_transf)
231 NULLIFY (ec%m_transf_inv)
235 CALL get_qs_env(qs_env, particle_set=particle_set, qs_kind_set=qs_kind_set, natom=n_atoms)
240 ALLOCATE (atom_nf(n_atoms))
241 cpassert(
ASSOCIATED(atom_nf))
246 CALL get_qs_kind(qs_kind_set(j), basis_set=ao_basis_set)
247 IF (.NOT.
ASSOCIATED(ao_basis_set))
THEN
248 cpabort(
'Unsupported basis set type. ')
251 nset=n_set, nshell=n_shell, l=ang_mom_id)
254 atom_nf(i) = atom_nf(i) +
nso(ang_mom_id(k, j))
267 ALLOCATE (atom_ps(n_atoms))
268 cpassert(
ASSOCIATED(atom_ps))
270 DO i = 1, n_atoms - 1
271 atom_ps(i + 1) = atom_ps(i) + atom_nf(i)
277 ALLOCATE (ec%block(ec%n_blocks))
278 cpassert(
ASSOCIATED(ec%block))
281 ALLOCATE (t(n_atoms))
282 cpassert(
ASSOCIATED(t))
285 DO i = 1, ec%n_blocks
288 ec%block(i)%n_atoms = 0
289 ec%block(i)%n_electrons = 0
291 NULLIFY (ec%block(i)%atom)
292 NULLIFY (ec%block(i)%mo)
293 NULLIFY (ec%block(i)%hab)
297 keyword_name=
'NELECTRON', i_val=ec%block(i)%n_electrons)
301 keyword_name=
'ATOMS', i_vals=atom_id)
304 DO j = 1,
SIZE(atom_id)
306 IF (atom_id(j) < 1 .OR. atom_id(j) > n_atoms)
THEN
307 cpabort(
'invalid fragment atom ID ('//trim(adjustl(
cp_to_string(atom_id(j))))//
')')
312 DO l = 1, ec%block(k)%n_atoms
313 IF (ec%block(k)%atom(l)%id == atom_id(j))
THEN
314 cpwarn(
'multiple definition of atom'//trim(adjustl(
cp_to_string(atom_id(j)))))
321 IF (.NOT. found)
THEN
322 DO k = 1, ec%block(i)%n_atoms
323 IF (t(k) == atom_id(j))
THEN
324 cpwarn(
'multiple definition of atom'//trim(adjustl(
cp_to_string(atom_id(j)))))
331 IF (.NOT. found)
THEN
332 ec%block(i)%n_atoms = ec%block(i)%n_atoms + 1
333 t(ec%block(i)%n_atoms) = atom_id(j)
338 ALLOCATE (ec%block(i)%atom(ec%block(i)%n_atoms))
339 cpassert(
ASSOCIATED(ec%block(i)%atom))
342 DO j = 1, ec%block(i)%n_atoms
343 ec%block(i)%atom(j)%id = t(j)
344 ec%block(i)%atom(j)%n_ao = atom_nf(ec%block(i)%atom(j)%id)
345 ec%block(i)%atom(j)%ao_pos = atom_ps(ec%block(i)%atom(j)%id)
346 ec%block(i)%n_ao = ec%block(i)%n_ao + ec%block(i)%atom(j)%n_ao
349 ec%n_atoms = ec%n_atoms + ec%block(i)%n_atoms
353 IF (
ASSOCIATED(atom_nf))
THEN
356 IF (
ASSOCIATED(atom_ps))
THEN
359 IF (
ASSOCIATED(t))
THEN
363 END SUBROUTINE set_block_data
372 SUBROUTINE set_fermi(ec, fa, fb)
375 TYPE(et_cpl),
POINTER :: ec
377 REAL(KIND=
dp),
OPTIONAL :: fb
383 IF (
PRESENT(fb))
THEN
385 ALLOCATE (ec%fermi(2))
386 cpassert(
ASSOCIATED(ec%fermi))
392 ALLOCATE (ec%fermi(1))
393 cpassert(
ASSOCIATED(ec%fermi))
398 END SUBROUTINE set_fermi
407 SUBROUTINE reorder_hamiltonian_matrix(ec, mat_h, mat_w)
410 TYPE(et_cpl),
POINTER :: ec
413 INTEGER :: ic, ir, jc, jr, kc, kr, mc, mr, nc, nr
420 cpabort(
'cannot reorder Hamiltonian, working-matrix structure is not equivalent')
426 DO ir = 1, ec%n_blocks
427 DO jr = 1, ec%block(ir)%n_atoms
428 DO kr = 1, ec%block(ir)%atom(jr)%n_ao
431 DO ic = 1, ec%n_blocks
432 DO jc = 1, ec%block(ic)%n_atoms
433 DO kc = 1, ec%block(ic)%atom(jc)%n_ao
434 mr = ec%block(ir)%atom(jr)%ao_pos + kr - 1
435 mc = ec%block(ic)%atom(jc)%ao_pos + kc - 1
450 END SUBROUTINE reorder_hamiltonian_matrix
460 SUBROUTINE get_s_half_inv_matrix(qs_env, mat_t, mat_i, mat_w)
464 TYPE(
cp_fm_type),
INTENT(INOUT) :: mat_t, mat_i
481 CALL get_qs_env(qs_env, scf_control=scf_cntrl)
482 CALL cp_fm_power(mat_t, mat_w, -0.5_dp, scf_cntrl%eps_eigval, n_deps)
483 CALL cp_fm_power(mat_i, mat_w, +0.5_dp, scf_cntrl%eps_eigval, n_deps)
485 IF (n_deps /= 0)
THEN
486 CALL cp_warn(__location__, &
487 "Overlap matrix exhibits linear dependencies. At least some "// &
488 "eigenvalues have been quenched.")
491 END SUBROUTINE get_s_half_inv_matrix
504 SUBROUTINE get_block_hamiltonian(qs_env, ec, fm_s, mat_t, mat_w, n_ao, n_spins)
508 TYPE(et_cpl),
POINTER :: ec
510 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
513 INTEGER :: n_ao, n_spins
523 ALLOCATE (mat_t(n_spins))
528 ALLOCATE (ec%m_transf, ec%m_transf_inv)
529 CALL cp_fm_create(matrix=ec%m_transf, matrix_struct=fm_s, &
530 name=
'S^(-1/2) TRANSFORMATION MATRIX')
531 CALL cp_fm_create(matrix=ec%m_transf_inv, matrix_struct=fm_s, &
532 name=
'S^(+1/2) TRANSFORMATION MATRIX')
533 CALL get_s_half_inv_matrix(qs_env, ec%m_transf, ec%m_transf_inv, mat_w)
538 CALL cp_fm_create(matrix=mat_t(i), matrix_struct=fm_s, &
539 name=
'KS HAMILTONIAN IN SEPARATED ORTHOGONALIZED BASIS SET')
543 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)
544 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))
547 CALL reorder_hamiltonian_matrix(ec, mat_t(i), mat_w)
551 END SUBROUTINE get_block_hamiltonian
560 SUBROUTINE hamiltonian_block_diag(qs_env, ec, mat_h)
564 TYPE(et_cpl),
POINTER :: ec
565 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mat_h
567 INTEGER :: i, j, k, l, n_spins, spin
568 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_e
572 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: dat
583 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
586 ALLOCATE (dat(ec%n_blocks))
587 cpassert(
ALLOCATED(dat))
590 n_spins =
SIZE(mat_h)
591 DO i = 1, ec%n_blocks
592 ALLOCATE (ec%block(i)%mo(n_spins))
593 cpassert(
ASSOCIATED(ec%block(i)%mo))
594 ALLOCATE (ec%block(i)%hab(n_spins, ec%n_blocks))
595 cpassert(
ASSOCIATED(ec%block(i)%hab))
603 DO i = 1, ec%n_blocks
607 nrow_global=ec%block(i)%n_ao, ncol_global=ec%block(i)%n_ao)
609 name=
'H_KS DIAGONAL BLOCK')
611 ALLOCATE (vec_e(ec%block(i)%n_ao))
612 cpassert(
ASSOCIATED(vec_e))
616 dat(i), ec%block(i)%n_ao, &
617 ec%block(i)%n_ao, j, j, 1, 1)
620 CALL cp_fm_create(matrix=mat_u, matrix_struct=fm_s, name=
'UNITARY MATRIX')
625 CALL create_block_mo_set(qs_env, ec, i, spin, mat_u, vec_e)
633 j = j + ec%block(i)%n_ao
639 DO i = 1, ec%n_blocks
641 DO j = 1, ec%n_blocks
646 nrow_global=ec%block(i)%n_ao, ncol_global=ec%block(j)%n_ao)
647 CALL cp_fm_create(matrix=ec%block(i)%hab(spin, j), matrix_struct=fm_s, &
648 name=
'H_KS OFF-DIAGONAL BLOCK')
652 ec%block(i)%hab(spin, j), ec%block(i)%n_ao, &
653 ec%block(j)%n_ao, k, l, 1, 1)
656 CALL cp_fm_create(matrix=mat_u, matrix_struct=fm_s, name=
'FULL WORK MATRIX')
657 CALL parallel_gemm(
"T",
"N", ec%block(i)%n_ao, ec%block(j)%n_ao, ec%block(i)%n_ao, &
658 1.0_dp, dat(i), ec%block(i)%hab(spin, j), 0.0_dp, mat_u)
659 CALL parallel_gemm(
"N",
"N", ec%block(i)%n_ao, ec%block(j)%n_ao, ec%block(j)%n_ao, &
660 1.0_dp, mat_u, dat(j), 0.0_dp, ec%block(i)%hab(spin, j))
668 l = l + ec%block(j)%n_ao
671 k = k + ec%block(i)%n_ao
675 IF (
ALLOCATED(dat))
THEN
683 IF (
ALLOCATED(dat))
THEN
687 END SUBROUTINE hamiltonian_block_diag
698 FUNCTION get_mo_c2_sum(blk_at, mo, id, atom)
RESULT(c2)
701 TYPE(et_cpl_atom),
DIMENSION(:),
POINTER :: blk_at
703 INTEGER,
INTENT(IN) :: id
704 INTEGER,
DIMENSION(:),
POINTER :: atom
707 INTEGER :: i, ir, j, k
723 DO j = 1,
SIZE(blk_at)
724 IF (blk_at(j)%id ==
atom(i))
THEN
730 IF (.NOT. found)
THEN
731 cpabort(
'MO-fraction atom ID not defined in the block')
735 DO k = 1, blk_at(j)%n_ao
736 ir = blk_at(j)%ao_pos + k - 1
743 END FUNCTION get_mo_c2_sum
754 SUBROUTINE print_mo_coeff(output_unit, qs_env, ec, blk, n_spins)
757 INTEGER,
INTENT(IN) :: output_unit
759 TYPE(et_cpl),
POINTER :: ec
760 INTEGER,
INTENT(IN) :: blk, n_spins
762 INTEGER :: j, k, l, m, n, n_ao, n_mo
763 INTEGER,
DIMENSION(:),
POINTER :: list_at, list_mo
764 REAL(KIND=
dp) :: c1, c2
765 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mat_w
766 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
773 NULLIFY (qs_kind_set)
777 'PROPERTIES%ET_COUPLING%PROJECTION%BLOCK')
786 IF (output_unit > 0)
THEN
787 WRITE (output_unit,
'(/,T3,A/)')
'Block state fractions:'
791 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
795 ALLOCATE (mat_w(n_spins))
797 n_mo = ec%block(blk)%n_ao
799 matrix_struct=ec%block(blk)%mo(j)%mo_coeff%matrix_struct, &
800 name=
'BLOCK MOs IN ORTHONORMAL BASIS SET')
801 CALL parallel_gemm(
"N",
"N", n_ao, n_mo, n_ao, 1.0_dp, ec%m_transf_inv, &
802 ec%block(blk)%mo(j)%mo_coeff, 0.0_dp, mat_w(j))
808 i_rep_val=j, i_vals=list_at)
809 IF (
ASSOCIATED(list_at))
THEN
819 i_rep_val=k, i_vals=list_mo)
820 IF (
ASSOCIATED(list_mo))
THEN
823 IF (output_unit > 0)
THEN
824 WRITE (output_unit, *)
828 DO l = 1,
SIZE(list_mo)
830 IF (n_spins > 1)
THEN
831 c1 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(1), &
833 c2 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(2), &
835 IF (output_unit > 0)
THEN
836 WRITE (output_unit,
'(I5,A,I5,2F20.10)') j,
' /', list_mo(l), c1, c2
839 c1 = get_mo_c2_sum(ec%block(blk)%atom, mat_w(1), &
841 IF (output_unit > 0)
THEN
842 WRITE (output_unit,
'(I5,A,I5,F20.10)') j,
' /', list_mo(l), c1
861 END SUBROUTINE print_mo_coeff
874 SUBROUTINE print_states(output_unit, mo, n_spins, label, mx_mo_a, mx_mo_b, fermi)
877 INTEGER,
INTENT(IN) :: output_unit
879 INTEGER,
INTENT(IN) :: n_spins
880 CHARACTER(LEN=*),
INTENT(IN) :: label
881 INTEGER,
INTENT(IN),
OPTIONAL :: mx_mo_a, mx_mo_b
882 LOGICAL,
INTENT(IN),
OPTIONAL :: fermi
884 INTEGER :: i, mx_a, mx_b, n
890 IF (
PRESENT(fermi))
THEN
894 IF (output_unit > 0)
THEN
896 WRITE (output_unit,
'(/,T3,A/)')
'State energies ('//trim(adjustl(label))//
'):'
899 IF (n_spins > 1)
THEN
902 IF (
PRESENT(mx_mo_a))
THEN
903 mx_a = min(mo(1)%nmo, mx_mo_a)
906 IF (
PRESENT(mx_mo_b))
THEN
907 mx_b = min(mo(2)%nmo, mx_mo_b)
912 WRITE (output_unit,
'(T3,I10)', advance=
'no') i
914 WRITE (output_unit,
'(2F12.4)', advance=
'no') &
915 mo(1)%occupation_numbers(i), mo(1)%eigenvalues(i)
917 WRITE (output_unit,
'(A)', advance=
'no')
' '
919 WRITE (output_unit,
'(A)', advance=
'no')
' '
921 WRITE (output_unit,
'(2F12.4)') &
922 mo(2)%occupation_numbers(i), mo(2)%eigenvalues(i)
924 WRITE (output_unit, *)
929 WRITE (output_unit,
'(/,T3,I10,F24.4,I10,F19.4)') &
930 mo(1)%nelectron, mo(1)%mu, &
931 mo(2)%nelectron, mo(2)%mu
938 IF (
PRESENT(mx_mo_a))
THEN
939 mx_a = min(mo(1)%nmo, mx_mo_a)
943 WRITE (output_unit,
'(T3,I10,2F12.4)') &
944 i, mo(1)%occupation_numbers(i), mo(1)%eigenvalues(i)
948 WRITE (output_unit,
'(/,T3,I10,F24.4)') &
949 mo(1)%nelectron, mo(1)%mu
956 END SUBROUTINE print_states
967 SUBROUTINE print_couplings(ec_sec, output_unit, logger, ec, mo)
971 INTEGER,
INTENT(IN) :: output_unit
973 TYPE(et_cpl),
POINTER :: ec
976 CHARACTER(LEN=default_path_length) :: filename, my_pos, title
977 INTEGER :: i, j, k, l, n_states(2), nc, nr, nspins, &
980 REAL(KIND=
dp),
DIMENSION(:, :),
POINTER :: w1, w2
988 n_states(i) = mo(i)%nmo
991 IF (n_states(2) > 0) nspins = 2
994 subsection_name=
"PRINT%COUPLINGS")
1005 IF (output_unit > 0)
THEN
1006 WRITE (output_unit,
'(/,T3,A/)')
'Printing coupling elements to output files'
1009 DO i = 1, ec%n_blocks
1010 DO j = i + 1, ec%n_blocks
1012 nr = ec%block(i)%hab(1, j)%matrix_struct%nrow_global
1013 nc = ec%block(i)%hab(1, j)%matrix_struct%ncol_global
1015 ALLOCATE (w1(nr, nc))
1016 cpassert(
ASSOCIATED(w1))
1018 IF (nspins > 1)
THEN
1019 ALLOCATE (w2(nr, nc))
1020 cpassert(
ASSOCIATED(w2))
1024 IF (output_unit > 0)
THEN
1026 WRITE (filename,
'(a5,I1.1,a1,I1.1)')
"ET_BL_", i,
"-", j
1028 middle_name=trim(filename), file_position=my_pos, log_filename=.false.)
1030 WRITE (title, *)
'Coupling elements [meV] between blocks:', i, j
1032 WRITE (unit_nr, *) trim(title)
1033 IF (nspins > 1)
THEN
1034 WRITE (unit_nr,
'(T3,A8,T13,A8,T28,A,A)')
'State A',
'State B',
'Coupling spin 1',
' Coupling spin 2'
1036 WRITE (unit_nr,
'(T3,A8,T13,A8,T28,A)')
'State A',
'State B',
'Coupling'
1039 DO k = 1, min(ec%block(i)%n_ao, n_states(1))
1040 DO l = 1, min(ec%block(j)%n_ao, n_states(1))
1042 IF (nspins > 1)
THEN
1044 WRITE (unit_nr,
'(T3,I5,T13,I5,T22,E20.6)', advance=
'no') &
1045 k, l, w1(k, l)*
evolt*1000.0_dp
1046 IF ((k <= n_states(2)) .AND. (l <= n_states(2)))
THEN
1047 WRITE (unit_nr,
'(E20.6)') &
1048 w2(k, l)*
evolt*1000.0_dp
1055 WRITE (unit_nr,
'(T3,I5,T13,I5,T22,E20.6)') &
1056 k, l, w1(k, l)*
evolt*1000.0_dp
1066 IF (
ASSOCIATED(w1))
DEALLOCATE (w1)
1067 IF (
ASSOCIATED(w2))
DEALLOCATE (w2)
1073 END SUBROUTINE print_couplings
1083 SUBROUTINE normalize_mo_vectors(qs_env, mo, n_ao, n_mo)
1088 INTEGER,
INTENT(IN) :: n_ao, n_mo
1090 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_t
1110 CALL cp_fm_create(matrix=mat_sc, matrix_struct=mo%mo_coeff%matrix_struct, &
1111 name=
'S*C PRODUCT MATRIX')
1115 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1117 nrow_global=n_mo, ncol_global=n_mo)
1119 name=
'C^T*S*C OVERLAP PRODUCT MATRIX')
1120 CALL parallel_gemm(
'T',
'N', n_mo, n_mo, n_ao, 1.0_dp, mo%mo_coeff, mat_sc, 0.0_dp, mat_t)
1123 ALLOCATE (vec_t(n_mo))
1124 cpassert(
ASSOCIATED(vec_t))
1126 vec_t = 1.0_dp/sqrt(vec_t)
1133 IF (
ASSOCIATED(vec_t))
THEN
1137 END SUBROUTINE normalize_mo_vectors
1150 SUBROUTINE set_mo_coefficients(qs_env, ec, id, mo, mat_u, n_ao, n_mo)
1154 TYPE(et_cpl),
POINTER :: ec
1155 INTEGER,
INTENT(IN) :: id
1158 INTEGER,
INTENT(IN) :: n_ao, n_mo
1160 INTEGER :: ic, ir, jc, jr, mr, nc, nr
1168 CALL cp_fm_create(matrix=mat_w, matrix_struct=mo%mo_coeff%matrix_struct, &
1169 name=
'BLOCK MO-TRANSFORMATION WORKING MATRIX')
1175 DO ir = 1, ec%block(id)%n_atoms
1176 DO jr = 1, ec%block(id)%atom(ir)%n_ao
1179 DO ic = 1, ec%block(id)%n_atoms
1180 DO jc = 1, ec%block(id)%atom(ic)%n_ao
1181 mr = ec%block(id)%atom(ir)%ao_pos + jr - 1
1192 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)
1193 CALL normalize_mo_vectors(qs_env, mo, n_ao, n_mo)
1198 END SUBROUTINE set_mo_coefficients
1210 SUBROUTINE create_block_mo_set(qs_env, ec, id, spin, mat_u, vec_e)
1214 TYPE(et_cpl),
POINTER :: ec
1215 INTEGER,
INTENT(IN) :: id, spin
1217 REAL(KIND=
dp),
DIMENSION(:),
POINTER :: vec_e
1219 INTEGER :: n_ao, n_el, n_mo
1220 REAL(KIND=
dp) :: mx_occ
1226 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1234 NULLIFY (qs_kind_set)
1240 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set)
1244 n_mo = mat_u%matrix_struct%nrow_global
1245 IF (n_mo /= mat_u%matrix_struct%ncol_global)
THEN
1246 cpabort(
'block state matrix is not square')
1248 IF (n_mo /=
SIZE(vec_e))
THEN
1249 cpabort(
'inconsistent number of states / energies')
1253 CALL get_qs_env(qs_env, dft_control=dft_cntrl)
1255 IF (dft_cntrl%nspins > 1)
THEN
1260 n_el = ec%block(id)%n_electrons
1261 IF (dft_cntrl%nspins > 1)
THEN
1263 IF (mod(ec%block(id)%n_electrons, 2) == 1)
THEN
1272 CALL allocate_mo_set(ec%block(id)%mo(spin), n_ao, n_mo, n_el, real(n_el,
dp), mx_occ, 0.0_dp)
1273 mo => ec%block(id)%mo(spin)
1276 ALLOCATE (mo%eigenvalues(n_mo))
1277 cpassert(
ASSOCIATED(mo%eigenvalues))
1278 mo%eigenvalues = vec_e
1281 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1283 nrow_global=n_ao, ncol_global=n_mo)
1284 ALLOCATE (mo%mo_coeff)
1285 CALL cp_fm_create(matrix=mo%mo_coeff, matrix_struct=fm_s, name=
'BLOCK STATES')
1288 CALL set_mo_coefficients(qs_env, ec, id, mo, mat_u, n_ao, n_mo)
1291 ALLOCATE (mo%occupation_numbers(n_mo))
1292 cpassert(
ASSOCIATED(mo%occupation_numbers))
1293 mo%occupation_numbers = 0.0_dp
1296 CALL get_qs_env(qs_env, scf_control=scf_cntrl)
1303 END SUBROUTINE create_block_mo_set
1316 SUBROUTINE save_mo_cube(qs_env, logger, input, mo, ib, im, is)
1323 INTEGER,
INTENT(IN) :: ib, im, is
1325 CHARACTER(LEN=default_path_length) :: filename
1326 CHARACTER(LEN=default_string_length) :: title
1338 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1349 NULLIFY (auxbas_pw_pool)
1351 NULLIFY (atomic_kind_set)
1353 NULLIFY (dft_control)
1354 NULLIFY (particle_set)
1355 NULLIFY (qs_kind_set)
1358 WRITE (filename,
'(A4,I1.1,A1,I5.5,A1,I1.1)')
'BWF_', ib,
'_', im,
'_', is
1361 middle_name=trim(filename), file_position=
'REWIND', log_filename=.false.)
1363 WRITE (title, *)
'WAVEFUNCTION ', im,
' block ', ib,
' spin ', is
1371 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1372 CALL auxbas_pw_pool%create_pw(wf_r)
1373 CALL auxbas_pw_pool%create_pw(wf_g)
1376 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
1377 cell=cell, dft_control=dft_control, particle_set=particle_set)
1379 qs_kind_set, cell, dft_control, particle_set, pw_env)
1380 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1387 CALL auxbas_pw_pool%give_back_pw(wf_r)
1388 CALL auxbas_pw_pool%give_back_pw(wf_g)
1390 END SUBROUTINE save_mo_cube
1399 SUBROUTINE save_el_states(qs_env, ec, n_spins)
1403 TYPE(et_cpl),
POINTER :: ec
1404 INTEGER,
INTENT(IN) :: n_spins
1406 INTEGER :: i, j, k, l, n
1407 INTEGER,
DIMENSION(:),
POINTER :: list
1422 'PROPERTIES%ET_COUPLING%PROJECTION%BLOCK')
1425 DO i = 1, ec%n_blocks
1431 print_sec,
'MO_CUBES'),
cp_p_file))
THEN
1438 mo => ec%block(i)%mo(j)
1448 i_rep_val=k, i_vals=
list)
1449 IF (
ASSOCIATED(
list))
THEN
1450 DO l = 1,
SIZE(
list)
1451 CALL save_mo_cube(qs_env, logger, print_sec, mo, i,
list(l), j)
1463 DO k = max(1, mo%homo - n + 1), mo%homo
1464 CALL save_mo_cube(qs_env, logger, print_sec, mo, i, k, j)
1472 DO k = mo%lfomo, min(mo%lfomo + n - 1, mo%nmo)
1473 CALL save_mo_cube(qs_env, logger, print_sec, mo, i, k, j)
1485 END SUBROUTINE save_el_states
1498 INTEGER :: i, j, k, n_ao, n_atoms, output_unit
1499 LOGICAL :: do_kp, master
1503 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mat_h
1505 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks, mo_der
1507 TYPE(et_cpl),
POINTER :: ec
1511 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1524 NULLIFY (qs_kind_set)
1525 NULLIFY (et_proj_sec)
1528 NULLIFY (ks, mo_der)
1541 'PROGRAM_RUN_INFO', extension=
'.log')
1545 IF (output_unit > 0)
THEN
1551 WRITE (output_unit,
'(/,T2,A)') &
1552 '!-----------------------------------------------------------------------------!'
1553 WRITE (output_unit,
'(T17,A)') &
1554 'Electronic coupling - Projection-operator method'
1559 cpassert(
ASSOCIATED(ec))
1560 CALL set_block_data(qs_env, et_proj_sec, ec)
1563 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, natom=n_atoms)
1569 WRITE (output_unit,
'(/,T3,A,I10)') &
1570 'Number of atoms = ', n_atoms
1571 WRITE (output_unit,
'(T3,A,I10)') &
1572 'Number of fragments = ', ec%n_blocks
1573 WRITE (output_unit,
'(T3,A,I10)') &
1574 'Number of fragment atoms = ', ec%n_atoms
1575 WRITE (output_unit,
'(T3,A,I10)') &
1576 'Number of unassigned atoms = ', n_atoms - ec%n_atoms
1577 WRITE (output_unit,
'(T3,A,I10)') &
1578 'Number of AO basis functions = ', n_ao
1580 DO i = 1, ec%n_blocks
1582 WRITE (output_unit,
'(/,T3,A,I0,A)') &
1584 WRITE (output_unit,
'(T3,A,I10)') &
1585 'Number of block atoms = ', ec%block(i)%n_atoms
1586 WRITE (output_unit,
'(T3,A,I10)') &
1587 'Number of block electrons = ', ec%block(i)%n_electrons
1588 WRITE (output_unit,
'(T3,A,I10)') &
1589 'Number of block AO functions = ', ec%block(i)%n_ao
1591 IF (ec%block(i)%n_atoms < 10)
THEN
1593 WRITE (output_unit,
'(T3,A,10I6)') &
1594 'Block atom IDs = ', &
1595 (ec%block(i)%atom(j)%id, j=1, ec%block(i)%n_atoms)
1599 WRITE (output_unit,
'(T3,A)')
'Block atom IDs ='
1600 DO j = 1, ec%block(i)%n_atoms/10
1601 WRITE (output_unit,
'(T3,A,10I6)')
' ', &
1602 (ec%block(i)%atom((j - 1)*10 + k)%id, k=1, 10)
1604 IF (mod(ec%block(i)%n_atoms, 10) /= 0)
THEN
1605 WRITE (output_unit,
'(T3,A,10I6)')
' ', &
1606 (ec%block(i)%atom(k + 10*(ec%block(i)%n_atoms/10))%id, &
1607 k=1, mod(ec%block(i)%n_atoms, 10))
1617 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1619 nrow_global=n_ao, ncol_global=n_ao)
1620 CALL cp_fm_create(matrix=mat_w, matrix_struct=fm_s, name=
'FULL WORK MATRIX')
1623 CALL get_qs_env(qs_env, dft_control=dft_cntrl, do_kpoints=do_kp)
1624 CALL get_qs_env(qs_env, mos=mo, matrix_ks=ks, mo_derivs=mo_der, scf_control=scf_control)
1625 CALL make_mo_eig(mo, dft_cntrl%nspins, ks, scf_control, mo_der)
1628 cpabort(
'ET_COUPLING not implemented with kpoints')
1632 WRITE (output_unit,
'(T3,A)')
'No K-point sampling (Gamma point only)'
1636 IF (dft_cntrl%nspins == 2)
THEN
1639 WRITE (output_unit,
'(/,T3,A)')
'Spin-polarized calculation'
1645 IF (mo(1)%nao /= mo(2)%nao)
THEN
1646 cpabort(
'different number of alpha/beta AO basis functions')
1649 WRITE (output_unit,
'(/,T3,A,I10)') &
1650 'Number of AO basis functions = ', mo(1)%nao
1651 WRITE (output_unit,
'(T3,A,I10)') &
1652 'Number of alpha states = ', mo(1)%nmo
1653 WRITE (output_unit,
'(T3,A,I10)') &
1654 'Number of beta states = ', mo(2)%nmo
1656 CALL print_states(output_unit, mo, dft_cntrl%nspins,
'the whole system', fermi=.true.)
1657 CALL set_fermi(ec, mo(1)%mu, mo(2)%mu)
1660 CALL get_block_hamiltonian(qs_env, ec, fm_s, mat_h, mat_w, n_ao, dft_cntrl%nspins)
1663 CALL hamiltonian_block_diag(qs_env, ec, mat_h)
1666 DO i = 1, ec%n_blocks
1667 IF (output_unit > 0)
THEN
1668 CALL print_states(output_unit, ec%block(i)%mo, dft_cntrl%nspins, &
1670 mx_mo_a=mo(1)%nmo, mx_mo_b=mo(2)%nmo, fermi=.true.)
1672 CALL print_mo_coeff(output_unit, qs_env, ec, i, dft_cntrl%nspins)
1675 CALL print_couplings(et_proj_sec, output_unit, logger, ec, mo)
1680 WRITE (output_unit,
'(/,T3,A)')
'Spin-restricted calculation'
1687 WRITE (output_unit,
'(/,T3,A,I10)') &
1688 'Number of AO basis functions = ', mo(1)%nao
1689 WRITE (output_unit,
'(T3,A,I10)') &
1690 'Number of states = ', mo(1)%nmo
1692 CALL print_states(output_unit, mo, dft_cntrl%nspins,
'the whole system', fermi=.true.)
1693 CALL set_fermi(ec, mo(1)%mu)
1696 CALL get_block_hamiltonian(qs_env, ec, fm_s, mat_h, mat_w, n_ao, dft_cntrl%nspins)
1699 CALL hamiltonian_block_diag(qs_env, ec, mat_h)
1702 DO i = 1, ec%n_blocks
1703 IF (output_unit > 0)
THEN
1704 CALL print_states(output_unit, ec%block(i)%mo, dft_cntrl%nspins, &
1706 mx_mo_a=mo(1)%nmo, fermi=.true.)
1708 CALL print_mo_coeff(output_unit, qs_env, ec, i, dft_cntrl%nspins)
1711 CALL print_couplings(et_proj_sec, output_unit, logger, ec, mo)
1716 CALL save_el_states(qs_env, ec, dft_cntrl%nspins)
1719 IF (master)
WRITE (output_unit,
'(/,T2,A)') &
1720 '!-----------------------------------------------------------------------------!'
1725 IF (
ALLOCATED(mat_h))
THEN
1726 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, ccon)
...
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_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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
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, zeff, stride, max_file_size_mb, 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, 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, matrix_vhxc, 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.
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, hund_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, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, 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_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, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
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, hairy_probes, probe)
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.