78#include "./base/base_uses.f90"
84 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_mo_io'
108 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
111 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
115 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_mo_set_to_restart'
116 CHARACTER(LEN=30),
DIMENSION(2),
PARAMETER :: &
117 keys = (/
"SCF%PRINT%RESTART_HISTORY",
"SCF%PRINT%RESTART "/)
119 INTEGER :: handle, ikey, ires, ispin
122 CALL timeset(routinen, handle)
131 IF (mo_array(1)%use_mo_coeff_b)
THEN
134 DO ispin = 1,
SIZE(mo_array)
135 IF (.NOT.
ASSOCIATED(mo_array(ispin)%mo_coeff_b))
THEN
139 mo_array(ispin)%mo_coeff)
143 DO ikey = 1,
SIZE(keys)
145 dft_section, keys(ikey)),
cp_p_file))
THEN
147 extension=
".wfn", file_status=
"REPLACE", file_action=
"WRITE", &
148 do_backup=.true., file_form=
"UNFORMATTED")
149 IF (
PRESENT(matrix_ks))
THEN
150 CALL write_mo_set_low(mo_array, particle_set=particle_set, qs_kind_set=qs_kind_set, &
151 ires=ires, matrix_ks=matrix_ks)
153 CALL write_mo_set_low(mo_array, particle_set=particle_set, qs_kind_set=qs_kind_set, &
161 CALL timestop(handle)
175 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
177 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: tmpl_matrix
179 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_dm_binary_restart'
181 CHARACTER(LEN=default_path_length) :: file_name, project_name
182 INTEGER :: handle, ispin, unit_nr
183 LOGICAL :: do_dm_restart
184 REAL(kind=
dp) :: cs_pos
188 CALL timeset(routinen, handle)
190 IF (logger%para_env%is_source())
THEN
196 project_name = logger%iter_info%project_name
198 NULLIFY (matrix_p_tmp)
200 IF (do_dm_restart)
THEN
201 ALLOCATE (matrix_p_tmp)
202 DO ispin = 1,
SIZE(mo_array)
203 CALL dbcsr_create(matrix_p_tmp, template=tmpl_matrix(ispin)%matrix, name=
"DM RESTART")
205 IF (.NOT.
ASSOCIATED(mo_array(ispin)%mo_coeff_b)) cpabort(
"mo_coeff_b NOT ASSOCIATED")
209 use_dbcsr=.true., retain_sparsity=.false.)
211 WRITE (file_name,
'(A,I0,A)') trim(project_name)//
"_SCF_DM_SPIN_", ispin,
"_RESTART.dm"
213 IF (unit_nr > 0)
THEN
214 WRITE (unit_nr,
'(T2,A,E20.8)')
"Writing restart DM "//trim(file_name)//
" with checksum: ", cs_pos
220 DEALLOCATE (matrix_p_tmp)
223 CALL timestop(handle)
237 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
238 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: rt_mos
241 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
243 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_rt_mos_to_restart'
244 CHARACTER(LEN=43),
DIMENSION(2),
PARAMETER :: keys = (/ &
245 "REAL_TIME_PROPAGATION%PRINT%RESTART_HISTORY", &
246 "REAL_TIME_PROPAGATION%PRINT%RESTART "/)
248 INTEGER :: handle, ikey, ires
251 CALL timeset(routinen, handle)
259 DO ikey = 1,
SIZE(keys)
262 dft_section, keys(ikey)),
cp_p_file))
THEN
264 extension=
".rtpwfn", file_status=
"REPLACE", file_action=
"WRITE", &
265 do_backup=.true., file_form=
"UNFORMATTED")
266 CALL write_mo_set_low(mo_array, qs_kind_set=qs_kind_set, particle_set=particle_set, &
267 ires=ires, rt_mos=rt_mos)
273 CALL timestop(handle)
288 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(IN) :: mo_array
289 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
297 CHARACTER(LEN=*),
PARAMETER :: routinen =
'write_mo_set_low'
299 INTEGER :: handle, iatom, ikind, imat, iset, &
300 ishell, ispin, lmax, lshell, &
301 max_block, nao, natom, nmo, nset, &
302 nset_max, nshell_max, nspin
303 INTEGER,
DIMENSION(:),
POINTER :: nset_info, nshell
304 INTEGER,
DIMENSION(:, :),
POINTER :: l, nshell_info
305 INTEGER,
DIMENSION(:, :, :),
POINTER :: nso_info
306 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, mo_occupation_numbers
311 CALL timeset(routinen, handle)
314 NULLIFY (mo_eigenvalues)
315 NULLIFY (mo_occupation_numbers)
317 nspin =
SIZE(mo_array)
318 nao = mo_array(1)%nao
322 natom =
SIZE(particle_set, 1)
327 NULLIFY (orb_basis_set, dftb_parameter)
328 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
330 basis_set=orb_basis_set, &
331 dftb_parameter=dftb_parameter)
332 IF (
ASSOCIATED(orb_basis_set))
THEN
337 nset_max = max(nset_max, nset)
339 nshell_max = max(nshell_max, nshell(iset))
341 ELSEIF (
ASSOCIATED(dftb_parameter))
THEN
343 nset_max = max(nset_max, 1)
344 nshell_max = max(nshell_max, lmax + 1)
351 ALLOCATE (nso_info(nshell_max, nset_max, natom))
352 nso_info(:, :, :) = 0
354 ALLOCATE (nshell_info(nset_max, natom))
355 nshell_info(:, :) = 0
357 ALLOCATE (nset_info(natom))
361 NULLIFY (orb_basis_set, dftb_parameter)
362 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
364 basis_set=orb_basis_set, dftb_parameter=dftb_parameter)
365 IF (
ASSOCIATED(orb_basis_set))
THEN
370 nset_info(iatom) = nset
372 nshell_info(iset, iatom) = nshell(iset)
373 DO ishell = 1, nshell(iset)
374 lshell = l(ishell, iset)
375 nso_info(ishell, iset, iatom) =
nso(lshell)
378 ELSEIF (
ASSOCIATED(dftb_parameter))
THEN
381 nshell_info(1, iatom) = lmax + 1
382 DO ishell = 1, lmax + 1
384 nso_info(ishell, 1, iatom) =
nso(lshell)
392 WRITE (ires) natom, nspin, nao, nset_max, nshell_max
393 WRITE (ires) nset_info
394 WRITE (ires) nshell_info
395 WRITE (ires) nso_info
397 DEALLOCATE (nset_info)
399 DEALLOCATE (nshell_info)
401 DEALLOCATE (nso_info)
407 mo_coeff => mo_array(ispin)%mo_coeff
408 nmo = mo_array(ispin)%nmo
410 mo_eigenvalues => mo_array(ispin)%eigenvalues
411 mo_occupation_numbers => mo_array(ispin)%occupation_numbers
412 IF (
PRESENT(matrix_ks))
THEN
415 ks_matrix=matrix_ks(ispin)%matrix, &
416 evals_arg=mo_eigenvalues)
420 mo_array(ispin)%homo, &
421 mo_array(ispin)%lfomo, &
422 mo_array(ispin)%nelectron
423 WRITE (ires) mo_eigenvalues(1:nmo), mo_occupation_numbers(1:nmo)
426 IF (
PRESENT(rt_mos))
THEN
427 DO imat = 2*ispin - 1, 2*ispin
435 CALL timestop(handle)
450 CHARACTER(LEN=default_path_length),
INTENT(OUT) :: filename
451 LOGICAL,
INTENT(OUT) :: exist
454 LOGICAL,
INTENT(IN),
OPTIONAL :: kp, xas, rtp
457 LOGICAL :: my_kp, my_rtp, my_xas
463 IF (
PRESENT(kp)) my_kp = kp
464 IF (
PRESENT(xas)) my_xas = xas
465 IF (
PRESENT(rtp)) my_rtp = rtp
469 IF (n_rep_val > 0)
THEN
476 extension=
"", my_local=.false.)
477 ELSE IF (my_rtp)
THEN
481 extension=
".rtpwfn", my_local=.false.)
486 extension=
".kp", my_local=.false.)
491 extension=
".wfn", my_local=.false.)
494 IF (.NOT. my_xas)
THEN
495 INQUIRE (file=filename, exist=exist)
514 para_env, id_nr, multiplicity, dft_section, natom_mismatch, &
517 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mo_array
518 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
521 INTEGER,
INTENT(IN) :: id_nr, multiplicity
523 LOGICAL,
INTENT(OUT),
OPTIONAL :: natom_mismatch
524 LOGICAL,
INTENT(IN),
OPTIONAL :: cdft
525 INTEGER,
INTENT(IN),
OPTIONAL :: out_unit
527 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_mo_set_from_restart'
529 CHARACTER(LEN=default_path_length) :: file_name
530 INTEGER :: handle, ispin, my_out_unit, natom, &
532 LOGICAL :: exist, my_cdft
535 CALL timeset(routinen, handle)
538 IF (
PRESENT(cdft)) my_cdft = cdft
540 IF (
PRESENT(out_unit)) my_out_unit = out_unit
542 nspin =
SIZE(mo_array)
545 IF (para_env%is_source())
THEN
547 natom =
SIZE(particle_set, 1)
551 file_name = trim(file_name)//
".bak-"//adjustl(
cp_to_string(id_nr))
555 file_action=
"READ", &
556 file_form=
"UNFORMATTED", &
558 unit_number=restart_unit)
563 particle_set=particle_set, natom=natom, &
564 rst_unit=restart_unit, multiplicity=multiplicity, natom_mismatch=natom_mismatch)
566 IF (
PRESENT(natom_mismatch))
THEN
568 CALL para_env%bcast(natom_mismatch)
569 IF (natom_mismatch)
THEN
570 IF (para_env%is_source())
CALL close_file(unit_number=restart_unit)
571 CALL timestop(handle)
577 IF (para_env%is_source())
THEN
578 IF (my_out_unit > 0)
THEN
579 WRITE (unit=my_out_unit, fmt=
"(T2,A)") &
580 "WFN_RESTART| Restart file "//trim(file_name)//
" read"
586 IF (.NOT. my_cdft)
THEN
589 dft_section, 4, 0, final_mos=.false.)
593 CALL timestop(handle)
610 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mo_array
611 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: rt_mos
612 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
615 INTEGER,
INTENT(IN) :: id_nr, multiplicity
618 CHARACTER(LEN=*),
PARAMETER :: routinen =
'read_rt_mos_from_restart'
620 CHARACTER(LEN=default_path_length) :: file_name
621 INTEGER :: handle, ispin, natom, nspin, &
622 restart_unit, unit_nr
626 CALL timeset(routinen, handle)
629 nspin =
SIZE(mo_array)
632 IF (para_env%is_source())
THEN
634 natom =
SIZE(particle_set, 1)
638 file_name = trim(file_name)//
".bak-"//adjustl(
cp_to_string(id_nr))
642 IF (unit_nr > 0)
THEN
643 WRITE (unit_nr,
'(T2,A)')
"Read RTP restart from the file: "//trim(file_name)
647 file_action=
"READ", &
648 file_form=
"UNFORMATTED", &
650 unit_number=restart_unit)
655 particle_set=particle_set, qs_kind_set=qs_kind_set, natom=natom, &
656 rst_unit=restart_unit, multiplicity=multiplicity)
659 IF (para_env%is_source())
CALL close_file(unit_number=restart_unit)
663 dft_section, 4, 0, final_mos=.false.)
666 CALL timestop(handle)
686 multiplicity, rt_mos, natom_mismatch)
688 TYPE(
mo_set_type),
DIMENSION(:),
INTENT(INOUT) :: mos
690 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
692 INTEGER,
INTENT(IN) :: natom, rst_unit
693 INTEGER,
INTENT(in),
OPTIONAL :: multiplicity
694 TYPE(
cp_fm_type),
DIMENSION(:),
OPTIONAL,
POINTER :: rt_mos
695 LOGICAL,
INTENT(OUT),
OPTIONAL :: natom_mismatch
697 INTEGER :: homo, homo_read, i, iatom, ikind, imat, irow, iset, iset_read, ishell, &
698 ishell_read, iso, ispin, lfomo_read, lmax, lshell, my_mult, nao, nao_read, natom_read, &
699 nelectron, nelectron_read, nmo, nmo_read, nnshell, nset, nset_max, nshell_max, nspin, &
700 nspin_read, offset_read
701 INTEGER,
DIMENSION(:),
POINTER :: nset_info, nshell
702 INTEGER,
DIMENSION(:, :),
POINTER :: l, nshell_info
703 INTEGER,
DIMENSION(:, :, :),
POINTER :: nso_info, offset_info
704 LOGICAL :: minbas, natom_match, use_this
705 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eig_read, occ_read
706 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: vecbuffer, vecbuffer_read
716 IF (
PRESENT(multiplicity)) my_mult = multiplicity
718 IF (para_env%is_source())
THEN
719 READ (rst_unit) natom_read, nspin_read, nao_read, nset_max, nshell_max
720 IF (
PRESENT(rt_mos))
THEN
721 IF (nspin_read /= nspin)
THEN
722 cpabort(
"To change nspin is not possible. ")
726 IF (nspin_read /= nspin)
THEN
728 "READ RESTART : WARNING : nspin is not equal "
731 IF (nspin_read > nspin)
THEN
732 cpabort(
"Reducing nspin is not possible. ")
736 natom_match = (natom_read == natom)
738 IF (natom_match)
THEN
741 ALLOCATE (nso_info(nshell_max, nset_max, natom_read))
742 ALLOCATE (nshell_info(nset_max, natom_read))
743 ALLOCATE (nset_info(natom_read))
744 ALLOCATE (offset_info(nshell_max, nset_max, natom_read))
746 IF (nao_read /= nao)
THEN
748 " READ RESTART : WARNING : DIFFERENT # AOs ", nao, nao_read
749 IF (
PRESENT(rt_mos)) &
750 cpabort(
"To change basis is not possible. ")
753 READ (rst_unit) nset_info
754 READ (rst_unit) nshell_info
755 READ (rst_unit) nso_info
759 DO iset = 1, nset_info(iatom)
760 DO ishell = 1, nshell_info(iset, iatom)
761 offset_info(ishell, iset, iatom) = i
762 i = i + nso_info(ishell, iset, iatom)
767 ALLOCATE (vecbuffer_read(1, nao_read))
773 CALL para_env%bcast(natom_match)
774 IF (
PRESENT(natom_mismatch)) natom_mismatch = .NOT. natom_match
776 IF (.NOT. natom_match)
THEN
777 IF (
PRESENT(natom_mismatch))
THEN
779 " READ RESTART : WARNING : DIFFERENT natom, returning ", natom, natom_read
782 cpabort(
"Incorrect number of atoms in restart file. ")
786 CALL para_env%bcast(nspin_read)
788 ALLOCATE (vecbuffer(1, nao))
793 homo = mos(ispin)%homo
794 mos(ispin)%eigenvalues(:) = 0.0_dp
795 mos(ispin)%occupation_numbers(:) = 0.0_dp
798 IF (para_env%is_source() .AND. (nmo > 0))
THEN
799 READ (rst_unit) nmo_read, homo_read, lfomo_read, nelectron_read
800 ALLOCATE (eig_read(nmo_read), occ_read(nmo_read))
804 nmo = min(nmo, nmo_read)
805 IF (nmo_read < nmo) &
806 CALL cp_warn(__location__, &
807 "The number of MOs on the restart unit is smaller than the number of "// &
808 "the allocated MOs. The MO set will be padded with zeros!")
809 IF (nmo_read > nmo) &
810 CALL cp_warn(__location__, &
811 "The number of MOs on the restart unit is greater than the number of "// &
812 "the allocated MOs. The read MO set will be truncated!")
814 READ (rst_unit) eig_read(1:nmo_read), occ_read(1:nmo_read)
815 mos(ispin)%eigenvalues(1:nmo) = eig_read(1:nmo)
816 mos(ispin)%occupation_numbers(1:nmo) = occ_read(1:nmo)
817 DEALLOCATE (eig_read, occ_read)
819 mos(ispin)%homo = homo_read
820 mos(ispin)%lfomo = lfomo_read
821 IF (homo_read > nmo)
THEN
822 IF (nelectron_read == mos(ispin)%nelectron)
THEN
823 CALL cp_warn(__location__, &
824 "The number of occupied MOs on the restart unit is larger than "// &
825 "the allocated MOs. The read MO set will be truncated and the occupation numbers recalculated!")
830 cpabort(
"Number of occupied MOs on restart unit larger than allocated MOs. ")
835 CALL para_env%bcast(nmo)
836 CALL para_env%bcast(mos(ispin)%homo)
837 CALL para_env%bcast(mos(ispin)%lfomo)
838 CALL para_env%bcast(mos(ispin)%nelectron)
839 CALL para_env%bcast(mos(ispin)%eigenvalues)
840 CALL para_env%bcast(mos(ispin)%occupation_numbers)
842 IF (
PRESENT(rt_mos))
THEN
843 DO imat = 2*ispin - 1, 2*ispin
845 IF (para_env%is_source())
THEN
846 READ (rst_unit) vecbuffer
848 vecbuffer(1, :) = 0.0_dp
850 CALL para_env%bcast(vecbuffer)
852 vecbuffer, 1, i, nao, 1, transpose=.true.)
857 IF (para_env%is_source())
THEN
858 READ (rst_unit) vecbuffer_read
863 NULLIFY (orb_basis_set, dftb_parameter, l, nshell)
864 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
866 basis_set=orb_basis_set, dftb_parameter=dftb_parameter)
867 IF (
ASSOCIATED(orb_basis_set))
THEN
873 ELSEIF (
ASSOCIATED(dftb_parameter))
THEN
890 nnshell = nshell(iset)
892 DO ishell = 1, nnshell
896 lshell = l(ishell, iset)
898 IF (iset_read > nset_info(iatom)) use_this = .false.
900 IF (
nso(lshell) == nso_info(ishell_read, iset_read, iatom))
THEN
901 offset_read = offset_info(ishell_read, iset_read, iatom)
902 ishell_read = ishell_read + 1
903 IF (ishell_read > nshell_info(iset, iatom))
THEN
905 iset_read = iset_read + 1
911 DO iso = 1,
nso(lshell)
913 IF (offset_read - 1 + iso .LT. 1 .OR. offset_read - 1 + iso .GT. nao_read)
THEN
914 vecbuffer(1, irow) = 0.0_dp
916 vecbuffer(1, irow) = vecbuffer_read(1, offset_read - 1 + iso)
919 vecbuffer(1, irow) = 0.0_dp
930 vecbuffer(1, :) = 0.0_dp
934 CALL para_env%bcast(vecbuffer)
936 vecbuffer, 1, i, nao, 1, transpose=.true.)
940 IF (para_env%is_source())
THEN
943 DO i = nmo + 1, nmo_read
944 READ (rst_unit) vecbuffer_read
949 IF (.NOT.
PRESENT(rt_mos))
THEN
950 IF (ispin == 1 .AND. nspin_read < nspin)
THEN
952 mos(ispin + 1)%homo = mos(ispin)%homo
953 mos(ispin + 1)%lfomo = mos(ispin)%lfomo
954 nelectron = mos(ispin)%nelectron
955 IF (my_mult .NE. 1)
THEN
956 CALL cp_abort(__location__, &
957 "Restarting an LSD calculation from an LDA wfn only works for multiplicity=1 (singlets).")
959 IF (mos(ispin + 1)%nelectron < 0)
THEN
960 cpabort(
"LSD: too few electrons for this multiplisity. ")
962 mos(ispin + 1)%eigenvalues = mos(ispin)%eigenvalues
963 mos(ispin)%occupation_numbers = mos(ispin)%occupation_numbers/2.0_dp
964 mos(ispin + 1)%occupation_numbers = mos(ispin)%occupation_numbers
965 CALL cp_fm_to_fm(mos(ispin)%mo_coeff, mos(ispin + 1)%mo_coeff)
971 DEALLOCATE (vecbuffer)
973 IF (para_env%is_source())
THEN
974 DEALLOCATE (vecbuffer_read)
975 DEALLOCATE (offset_info)
976 DEALLOCATE (nso_info)
977 DEALLOCATE (nshell_info)
978 DEALLOCATE (nset_info)
1009 dft_section, before, kpoint, final_mos, spin, &
1010 solver_method, rtp, cpart, sim_step, umo_set)
1013 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1016 INTEGER,
INTENT(IN) :: before, kpoint
1017 LOGICAL,
INTENT(IN),
OPTIONAL :: final_mos
1018 CHARACTER(LEN=*),
INTENT(IN),
OPTIONAL :: spin
1019 CHARACTER(LEN=2),
INTENT(IN),
OPTIONAL :: solver_method
1020 LOGICAL,
INTENT(IN),
OPTIONAL :: rtp
1021 INTEGER,
INTENT(IN),
OPTIONAL :: cpart, sim_step
1022 TYPE(
mo_set_type),
INTENT(IN),
OPTIONAL :: umo_set
1024 CHARACTER(LEN=12) :: symbol
1025 CHARACTER(LEN=12),
DIMENSION(:),
POINTER :: bcgf_symbol
1026 CHARACTER(LEN=14) :: fmtstr5
1027 CHARACTER(LEN=15) :: energy_str, orbital_str, step_string
1028 CHARACTER(LEN=2) :: element_symbol, my_solver_method
1029 CHARACTER(LEN=2*default_string_length) :: name
1030 CHARACTER(LEN=21) :: vector_str
1031 CHARACTER(LEN=22) :: fmtstr4
1032 CHARACTER(LEN=24) :: fmtstr2
1033 CHARACTER(LEN=25) :: fmtstr1
1034 CHARACTER(LEN=29) :: fmtstr6
1035 CHARACTER(LEN=4) :: reim
1036 CHARACTER(LEN=40) :: fmtstr3
1037 CHARACTER(LEN=6),
DIMENSION(:),
POINTER :: bsgf_symbol
1038 INTEGER :: after, first_mo, from, homo, iatom, icgf, ico, icol, ikind, imo, irow, iset, &
1039 isgf, ishell, iso, iw, jcol, last_mo, left, lmax, lshell, nao, natom, ncgf, ncol, nmo, &
1040 nset, nsgf, numo, right, scf_step, to, width
1041 INTEGER,
DIMENSION(:),
POINTER :: mo_index_range, nshell
1042 INTEGER,
DIMENSION(:, :),
POINTER :: l
1043 LOGICAL :: ionode, my_final, my_rtp, &
1044 print_cartesian, print_eigvals, &
1045 print_eigvecs, print_occup, &
1047 REAL(kind=
dp) :: gap, maxocc
1048 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mo_eigenvalues, mo_occupation_numbers
1049 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: cmatrix, smatrix
1050 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, occupation_numbers
1051 TYPE(
cp_fm_type),
POINTER :: mo_coeff, umo_coeff
1056 NULLIFY (bcgf_symbol)
1057 NULLIFY (bsgf_symbol)
1059 NULLIFY (mo_index_range)
1064 ionode = logger%para_env%is_source()
1071 after = min(max(after, 1), 16)
1074 IF (
PRESENT(final_mos))
THEN
1075 my_final = final_mos
1082 IF (
PRESENT(rtp))
THEN
1087 .OR. (sim_step == 1)
1093 IF ((.NOT. should_output) .OR. (.NOT. (print_eigvals .OR. print_eigvecs .OR. print_occup)))
RETURN
1096 cpassert(
PRESENT(sim_step))
1097 cpassert(
PRESENT(cpart))
1099 IF (cpart == 0)
THEN
1104 print_eigvals = .false.
1106 scf_step = max(0, logger%iter_info%iteration(logger%iter_info%n_rlevel) - 1)
1109 IF (.NOT. my_final)
THEN
1110 IF (.NOT. my_rtp)
THEN
1111 step_string =
" AFTER SCF STEP"
1113 step_string =
" AFTER RTP STEP"
1117 IF (
PRESENT(solver_method))
THEN
1118 my_solver_method = solver_method
1121 my_solver_method =
"TD"
1126 mo_coeff=mo_coeff, &
1127 eigenvalues=eigenvalues, &
1128 occupation_numbers=occupation_numbers, &
1133 IF (
PRESENT(umo_set))
THEN
1135 mo_coeff=umo_coeff, &
1141 ALLOCATE (mo_eigenvalues(nmo))
1142 mo_eigenvalues(:) = 0.0_dp
1143 mo_eigenvalues(1:nmo - numo) = eigenvalues(1:nmo - numo)
1144 ALLOCATE (mo_occupation_numbers(nmo))
1145 mo_occupation_numbers(:) = 0.0_dp
1146 mo_occupation_numbers(1:nmo - numo) = occupation_numbers(1:nmo - numo)
1149 eigenvalues=eigenvalues)
1150 mo_eigenvalues(nmo - numo + 1:nmo) = eigenvalues(1:numo)
1153 IF (print_eigvecs)
THEN
1154 ALLOCATE (smatrix(nao, nmo))
1159 IF (.NOT. ionode)
THEN
1160 DEALLOCATE (smatrix)
1165 ignore_should_output=should_output, &
1170 natom =
SIZE(particle_set)
1175 fmtstr1 =
"(T2,A,21X, ( X,I5, X))"
1176 fmtstr2 =
"(T2,A,21X, (1X,F . ))"
1177 fmtstr3 =
"(T2,A,I5,1X,I5,1X,A,1X,A6, (1X,F . ))"
1179 width = before + after + 3
1180 ncol = int(56/width)
1182 right = max((after - 2), 1)
1183 left = width - right - 5
1185 WRITE (unit=fmtstr1(11:12), fmt=
"(I2)") ncol
1186 WRITE (unit=fmtstr1(14:15), fmt=
"(I2)") left
1187 WRITE (unit=fmtstr1(21:22), fmt=
"(I2)") right
1189 WRITE (unit=fmtstr2(11:12), fmt=
"(I2)") ncol
1190 WRITE (unit=fmtstr2(18:19), fmt=
"(I2)") width - 1
1191 WRITE (unit=fmtstr2(21:22), fmt=
"(I2)") after
1193 WRITE (unit=fmtstr3(27:28), fmt=
"(I2)") ncol
1194 WRITE (unit=fmtstr3(34:35), fmt=
"(I2)") width - 1
1195 WRITE (unit=fmtstr3(37:38), fmt=
"(I2)") after
1197 IF (my_final .OR. (my_solver_method ==
"TD"))
THEN
1198 energy_str =
"EIGENVALUES"
1199 vector_str =
"EIGENVECTORS"
1201 energy_str =
"ENERGIES"
1202 vector_str =
"COEFFICIENTS"
1206 energy_str =
"ZEROS"
1207 vector_str = trim(reim)//
" RTP COEFFICIENTS"
1210 IF (print_eigvecs)
THEN
1212 IF (print_cartesian)
THEN
1214 orbital_str =
"CARTESIAN"
1216 ALLOCATE (cmatrix(ncgf, ncgf))
1223 NULLIFY (orb_basis_set, dftb_parameter)
1224 CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1226 basis_set=orb_basis_set, &
1227 dftb_parameter=dftb_parameter)
1228 IF (
ASSOCIATED(orb_basis_set))
THEN
1234 DO ishell = 1, nshell(iset)
1235 lshell = l(ishell, iset)
1236 CALL dgemm(
"T",
"N",
nco(lshell), nmo,
nso(lshell), 1.0_dp, &
1238 smatrix(isgf, 1), nsgf, 0.0_dp, &
1239 cmatrix(icgf, 1), ncgf)
1240 icgf = icgf +
nco(lshell)
1241 isgf = isgf +
nso(lshell)
1244 ELSE IF (
ASSOCIATED(dftb_parameter))
THEN
1246 DO ishell = 1, lmax + 1
1248 CALL dgemm(
"T",
"N",
nco(lshell), nsgf,
nso(lshell), 1.0_dp, &
1250 smatrix(isgf, 1), nsgf, 0.0_dp, &
1251 cmatrix(icgf, 1), ncgf)
1252 icgf = icgf +
nco(lshell)
1253 isgf = isgf +
nso(lshell)
1263 orbital_str =
"SPHERICAL"
1267 name = trim(energy_str)//
", OCCUPATION NUMBERS, AND "// &
1268 trim(orbital_str)//
" "//trim(vector_str)
1270 IF (.NOT. my_final) &
1271 WRITE (unit=name, fmt=
"(A,1X,I0)") trim(name)//step_string, scf_step
1273 ELSE IF (print_occup .OR. print_eigvals)
THEN
1274 name = trim(energy_str)//
" AND OCCUPATION NUMBERS"
1276 IF (.NOT. my_final) &
1277 WRITE (unit=name, fmt=
"(A,1X,I0)") trim(name)//step_string, scf_step
1281 IF (
PRESENT(spin) .AND. (kpoint > 0))
THEN
1282 WRITE (unit=iw, fmt=
"(/,T2,A,I0)") &
1283 "MO| "//trim(spin)//
" "//trim(name)//
" FOR K POINT ", kpoint
1284 ELSE IF (
PRESENT(spin))
THEN
1285 WRITE (unit=iw, fmt=
"(/,T2,A)") &
1286 "MO| "//trim(spin)//
" "//trim(name)
1287 ELSE IF (kpoint > 0)
THEN
1288 WRITE (unit=iw, fmt=
"(/,T2,A,I0)") &
1289 "MO| "//trim(name)//
" FOR K POINT ", kpoint
1291 WRITE (unit=iw, fmt=
"(/,T2,A)") &
1296 IF ((mo_index_range(1) > 0) .AND. &
1297 (mo_index_range(2) > 0) .AND. &
1298 (mo_index_range(2) >= mo_index_range(1)))
THEN
1299 first_mo = max(1, mo_index_range(1))
1300 last_mo = min(nmo, mo_index_range(2))
1301 IF (first_mo > nmo)
THEN
1302 cpwarn(
"The first MO index is larger than the number of MOs.")
1309 IF (print_eigvecs)
THEN
1313 DO icol = first_mo, last_mo, ncol
1316 to = min((from + ncol - 1), last_mo)
1318 WRITE (unit=iw, fmt=
"(T2,A)")
"MO|"
1319 WRITE (unit=iw, fmt=fmtstr1) &
1320 "MO|", (jcol, jcol=from, to)
1321 WRITE (unit=iw, fmt=fmtstr2) &
1322 "MO|", (mo_eigenvalues(jcol), jcol=from, to)
1323 WRITE (unit=iw, fmt=
"(T2,A)")
"MO|"
1324 WRITE (unit=iw, fmt=fmtstr2) &
1325 "MO|", (mo_occupation_numbers(jcol), jcol=from, to)
1326 WRITE (unit=iw, fmt=
"(T2,A)")
"MO|"
1332 IF (iatom /= 1)
WRITE (unit=iw, fmt=
"(T2,A)")
"MO|"
1334 NULLIFY (orb_basis_set, dftb_parameter)
1336 element_symbol=element_symbol, kind_number=ikind)
1338 basis_set=orb_basis_set, &
1339 dftb_parameter=dftb_parameter)
1341 IF (print_cartesian)
THEN
1343 IF (
ASSOCIATED(orb_basis_set))
THEN
1352 DO ishell = 1, nshell(iset)
1353 lshell = l(ishell, iset)
1354 DO ico = 1,
nco(lshell)
1355 WRITE (unit=iw, fmt=fmtstr3) &
1356 "MO|", irow, iatom, adjustr(element_symbol), bcgf_symbol(icgf), &
1357 (cmatrix(irow, jcol), jcol=from, to)
1363 ELSE IF (
ASSOCIATED(dftb_parameter))
THEN
1366 DO ishell = 1, lmax + 1
1368 DO ico = 1,
nco(lshell)
1371 WRITE (unit=iw, fmt=fmtstr3) &
1372 "MO|", irow, iatom, adjustr(element_symbol), symbol, &
1373 (cmatrix(irow, jcol), jcol=from, to)
1385 IF (
ASSOCIATED(orb_basis_set))
THEN
1393 DO ishell = 1, nshell(iset)
1394 lshell = l(ishell, iset)
1395 DO iso = 1,
nso(lshell)
1396 WRITE (unit=iw, fmt=fmtstr3) &
1397 "MO|", irow, iatom, adjustr(element_symbol), bsgf_symbol(isgf), &
1398 (smatrix(irow, jcol), jcol=from, to)
1404 ELSE IF (
ASSOCIATED(dftb_parameter))
THEN
1407 DO ishell = 1, lmax + 1
1409 DO iso = 1,
nso(lshell)
1410 symbol =
sgf_symbol(1, lshell, -lshell + iso - 1)
1412 WRITE (unit=iw, fmt=fmtstr3) &
1413 "MO|", irow, iatom, adjustr(element_symbol), symbol, &
1414 (smatrix(irow, jcol), jcol=from, to)
1430 WRITE (unit=iw, fmt=
"(T2,A)")
"MO|"
1434 DEALLOCATE (smatrix)
1435 IF (print_cartesian)
THEN
1436 DEALLOCATE (cmatrix)
1439 ELSE IF (print_occup .OR. print_eigvals)
THEN
1441 WRITE (unit=iw, fmt=
"(T2,A)")
"MO|"
1442 fmtstr4 =
"(T2,A,I7,3(1X,F22. ))"
1443 WRITE (unit=fmtstr4(19:20), fmt=
"(I2)") after
1444 IF (my_final .OR. (my_solver_method ==
"TD"))
THEN
1445 WRITE (unit=iw, fmt=
"(A)") &
1446 " MO| Index Eigenvalue [a.u.] Eigenvalue [eV] Occupation"
1448 WRITE (unit=iw, fmt=
"(A)") &
1449 " MO| Index Energy [a.u.] Energy [eV] Occupation"
1451 DO imo = first_mo, last_mo
1452 WRITE (unit=iw, fmt=fmtstr4) &
1453 "MO|", imo, mo_eigenvalues(imo), &
1454 mo_eigenvalues(imo)*
evolt, &
1455 mo_occupation_numbers(imo)
1457 fmtstr5 =
"(A,T59,F22. )"
1458 WRITE (unit=fmtstr5(12:13), fmt=
"(I2)") after
1459 WRITE (unit=iw, fmt=fmtstr5) &
1464 IF (.NOT. my_rtp)
THEN
1465 fmtstr6 =
"(A,T18,F17. ,A,T41,F17. ,A)"
1466 WRITE (unit=fmtstr6(12:13), fmt=
"(I2)") after
1467 WRITE (unit=fmtstr6(25:26), fmt=
"(I2)") after
1468 WRITE (unit=iw, fmt=fmtstr6) &
1469 " MO| E(Fermi):", mo_set%mu,
" a.u.", mo_set%mu*
evolt,
" eV"
1471 IF ((homo > 0) .AND. .NOT. my_rtp)
THEN
1472 IF ((mo_occupation_numbers(homo) == maxocc) .AND. (last_mo > homo))
THEN
1473 gap = mo_eigenvalues(homo + 1) - &
1474 mo_eigenvalues(homo)
1475 WRITE (unit=iw, fmt=fmtstr6) &
1476 " MO| Band gap:", gap,
" a.u.", gap*
evolt,
" eV"
1479 WRITE (unit=iw, fmt=
"(A)")
""
1483 IF (
ALLOCATED(mo_eigenvalues))
DEALLOCATE (mo_eigenvalues)
1484 IF (
ALLOCATED(mo_occupation_numbers))
DEALLOCATE (mo_occupation_numbers)
1487 ignore_should_output=should_output)
static void dgemm(const char transa, const char transb, const int m, const int n, const int k, const double alpha, const double *a, const int lda, const double *b, const int ldb, const double beta, double *c, const int ldc)
Convenient wrapper to hide Fortran nature of dgemm_, swapping a and b.
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)
...
subroutine, public dbcsr_binary_write(matrix, filepath)
...
subroutine, public dbcsr_release(matrix)
...
real(kind=dp) function, public dbcsr_checksum(matrix, pos)
Calculates the checksum of a DBCSR matrix.
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Utility routines to open and close files. Tracking of preconnections.
subroutine, public open_file(file_name, file_status, file_form, file_action, file_position, file_pad, unit_number, debug, skip_get_unit_number, file_access)
Opens the requested file using a free unit number.
subroutine, public close_file(unit_number, file_status, keep_preconnection)
Close an open file given by its logical unit number. Optionally, keep the file and unit preconnected.
represent a full matrix distributed on many processors
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_write_unformatted(fm, unit)
...
subroutine, public cp_fm_set_submatrix(fm, new_values, start_row, start_col, n_rows, n_cols, alpha, beta, transpose)
sets a submatrix of a full matrix fm(start_row:start_row+n_rows,start_col:start_col+n_cols) = alpha*o...
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,...
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
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)
...
character(len=default_path_length) function, public cp_print_key_generate_filename(logger, print_key, middle_name, extension, my_local)
Utility function that returns a unit number to write the print key. Might open a file with a unique f...
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...
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:, :), allocatable, public indco
integer, dimension(:), allocatable, public nso
character(len=12) function, public cgf_symbol(n, lxyz)
Build a Cartesian orbital symbol (orbital labels for printing).
character(len=6) function, public sgf_symbol(n, l, m)
Build a spherical orbital symbol (orbital labels for printing).
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
collects routines that calculate density matrices
Definition of the DFTB parameter types.
Working with the DFTB parameter types.
subroutine, public get_dftb_atom_param(dftb_parameter, name, typ, defined, z, zeff, natorb, lmax, skself, occupation, eta, energy, cutoff, xi, di, rcdisp, dudq)
...
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.
Definition and initialisation of the mo data type.
subroutine, public wfn_restart_file_name(filename, exist, section, logger, kp, xas, rtp)
...
subroutine, public read_mo_set_from_restart(mo_array, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section, natom_mismatch, cdft, out_unit)
...
subroutine, public read_rt_mos_from_restart(mo_array, rt_mos, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section)
...
subroutine, public write_mo_set_to_output_unit(mo_set, qs_kind_set, particle_set, dft_section, before, kpoint, final_mos, spin, solver_method, rtp, cpart, sim_step, umo_set)
Write MO information to output file (eigenvalues, occupation numbers, coefficients)
subroutine, public write_dm_binary_restart(mo_array, dft_section, tmpl_matrix)
calculates density matrix from mo set and writes the density matrix into a binary restart file
subroutine, public write_mo_set_low(mo_array, qs_kind_set, particle_set, ires, rt_mos, matrix_ks)
...
subroutine, public read_mos_restart_low(mos, para_env, qs_kind_set, particle_set, natom, rst_unit, multiplicity, rt_mos, natom_mismatch)
Reading the mos from apreviously defined restart file.
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set, matrix_ks)
...
subroutine, public write_rt_mos_to_restart(mo_array, rt_mos, particle_set, dft_section, qs_kind_set)
...
collects routines that perform operations directly related to MOs
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.