(git:ccc2433)
qs_mo_io.F
Go to the documentation of this file.
1 !--------------------------------------------------------------------------------------------------!
2 ! CP2K: A general program to perform molecular dynamics simulations !
3 ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 ! !
5 ! SPDX-License-Identifier: GPL-2.0-or-later !
6 !--------------------------------------------------------------------------------------------------!
7 
8 ! **************************************************************************************************
9 !> \brief Definition and initialisation of the mo data type.
10 !> \par History
11 !> - adapted to the new QS environment data structure (02.04.2002,MK)
12 !> - set_mo_occupation added (17.04.02,MK)
13 !> - correct_mo_eigenvalues added (18.04.02,MK)
14 !> - calculate_density_matrix moved from qs_scf to here (22.04.02,MK)
15 !> - mo_set_p_type added (23.04.02,MK)
16 !> - PRIVATE attribute set for TYPE mo_set_type (23.04.02,MK)
17 !> - started conversion to LSD (1.2003, Joost VandeVondele)
18 !> - Split of from qs_mo_types (07.2014, JGH)
19 !> \author Matthias Krack (09.05.2001,MK)
20 ! **************************************************************************************************
21 MODULE qs_mo_io
22 
23  USE atomic_kind_types, ONLY: atomic_kind_type,&
27  gto_basis_set_type
30  USE cp_files, ONLY: close_file,&
31  open_file
32  USE cp_fm_types, ONLY: cp_fm_get_info,&
36  cp_fm_to_fm,&
37  cp_fm_type,&
41  cp_logger_type,&
42  cp_to_string
43  USE cp_output_handling, ONLY: cp_p_file,&
48  USE dbcsr_api, ONLY: dbcsr_binary_write,&
49  dbcsr_checksum,&
50  dbcsr_create,&
51  dbcsr_p_type,&
52  dbcsr_release,&
53  dbcsr_type
55  section_vals_type,&
57  USE kahan_sum, ONLY: accurate_sum
58  USE kinds, ONLY: default_path_length,&
60  dp
61  USE message_passing, ONLY: mp_para_env_type
62  USE orbital_pointers, ONLY: indco,&
63  nco,&
64  nso
65  USE orbital_symbols, ONLY: cgf_symbol,&
68  USE particle_types, ONLY: particle_type
69  USE physcon, ONLY: evolt
70  USE qs_density_matrices, ONLY: calculate_density_matrix
71  USE qs_dftb_types, ONLY: qs_dftb_atom_type
73  USE qs_kind_types, ONLY: get_qs_kind,&
75  qs_kind_type
76  USE qs_mo_occupation, ONLY: set_mo_occupation
77  USE qs_mo_types, ONLY: get_mo_set,&
78  mo_set_type
79 #include "./base/base_uses.f90"
80 
81  IMPLICIT NONE
82 
83  PRIVATE
84 
85  CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'qs_mo_io'
86 
87  PUBLIC :: wfn_restart_file_name, &
96 
97 CONTAINS
98 
99 ! **************************************************************************************************
100 !> \brief ...
101 !> \param mo_array ...
102 !> \param particle_set ...
103 !> \param dft_section ...
104 !> \param qs_kind_set ...
105 ! **************************************************************************************************
106  SUBROUTINE write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set)
107 
108  TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mo_array
109  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
110  TYPE(section_vals_type), POINTER :: dft_section
111  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
112 
113  CHARACTER(LEN=*), PARAMETER :: routinen = 'write_mo_set_to_restart'
114  CHARACTER(LEN=30), DIMENSION(2), PARAMETER :: &
115  keys = (/"SCF%PRINT%RESTART_HISTORY", "SCF%PRINT%RESTART "/)
116 
117  INTEGER :: handle, ikey, ires, ispin
118  TYPE(cp_logger_type), POINTER :: logger
119 
120  CALL timeset(routinen, handle)
121  logger => cp_get_default_logger()
122 
123  IF (btest(cp_print_key_should_output(logger%iter_info, &
124  dft_section, keys(1)), cp_p_file) .OR. &
125  btest(cp_print_key_should_output(logger%iter_info, &
126  dft_section, keys(2)), cp_p_file)) THEN
127 
128  IF (mo_array(1)%use_mo_coeff_b) THEN
129  ! we are using the dbcsr mo_coeff
130  ! we copy it to the fm for anycase
131  DO ispin = 1, SIZE(mo_array)
132  IF (.NOT. ASSOCIATED(mo_array(ispin)%mo_coeff_b)) THEN
133  cpassert(.false.)
134  END IF
135  CALL copy_dbcsr_to_fm(mo_array(ispin)%mo_coeff_b, &
136  mo_array(ispin)%mo_coeff) !fm->dbcsr
137  END DO
138  END IF
139 
140  DO ikey = 1, SIZE(keys)
141 
142  IF (btest(cp_print_key_should_output(logger%iter_info, &
143  dft_section, keys(ikey)), cp_p_file)) THEN
144 
145  ires = cp_print_key_unit_nr(logger, dft_section, keys(ikey), &
146  extension=".wfn", file_status="REPLACE", file_action="WRITE", &
147  do_backup=.true., file_form="UNFORMATTED")
148 
149  CALL write_mo_set_low(mo_array, particle_set=particle_set, &
150  qs_kind_set=qs_kind_set, ires=ires)
151 
152  CALL cp_print_key_finished_output(ires, logger, dft_section, trim(keys(ikey)))
153  END IF
154  END DO
155  END IF
156 
157  CALL timestop(handle)
158 
159  END SUBROUTINE write_mo_set_to_restart
160 
161 ! **************************************************************************************************
162 !> \brief calculates density matrix from mo set and writes the density matrix
163 !> into a binary restart file
164 !> \param mo_array mos
165 !> \param dft_section dft input section
166 !> \param tmpl_matrix template dbcsr matrix
167 !> \author Mohammad Hossein Bani-Hashemian
168 ! **************************************************************************************************
169  SUBROUTINE write_dm_binary_restart(mo_array, dft_section, tmpl_matrix)
170 
171  TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mo_array
172  TYPE(section_vals_type), POINTER :: dft_section
173  TYPE(dbcsr_p_type), DIMENSION(:), POINTER :: tmpl_matrix
174 
175  CHARACTER(LEN=*), PARAMETER :: routinen = 'write_dm_binary_restart'
176 
177  CHARACTER(LEN=default_path_length) :: file_name, project_name
178  INTEGER :: handle, ispin, unit_nr
179  LOGICAL :: do_dm_restart
180  REAL(kind=dp) :: cs_pos
181  TYPE(cp_logger_type), POINTER :: logger
182  TYPE(dbcsr_type), POINTER :: matrix_p_tmp
183 
184  CALL timeset(routinen, handle)
185  logger => cp_get_default_logger()
186  IF (logger%para_env%is_source()) THEN
187  unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
188  ELSE
189  unit_nr = -1
190  END IF
191 
192  project_name = logger%iter_info%project_name
193  CALL section_vals_val_get(dft_section, "SCF%PRINT%DM_RESTART_WRITE", l_val=do_dm_restart)
194  NULLIFY (matrix_p_tmp)
195 
196  IF (do_dm_restart) THEN
197  ALLOCATE (matrix_p_tmp)
198  DO ispin = 1, SIZE(mo_array)
199  CALL dbcsr_create(matrix_p_tmp, template=tmpl_matrix(ispin)%matrix, name="DM RESTART")
200 
201  IF (.NOT. ASSOCIATED(mo_array(ispin)%mo_coeff_b)) cpabort("mo_coeff_b NOT ASSOCIATED")
202 
203  CALL copy_fm_to_dbcsr(mo_array(ispin)%mo_coeff, mo_array(ispin)%mo_coeff_b)
204  CALL calculate_density_matrix(mo_array(ispin), matrix_p_tmp, &
205  use_dbcsr=.true., retain_sparsity=.false.)
206 
207  WRITE (file_name, '(A,I0,A)') trim(project_name)//"_SCF_DM_SPIN_", ispin, "_RESTART.dm"
208  cs_pos = dbcsr_checksum(matrix_p_tmp, pos=.true.)
209  IF (unit_nr > 0) THEN
210  WRITE (unit_nr, '(T2,A,E20.8)') "Writing restart DM "//trim(file_name)//" with checksum: ", cs_pos
211  END IF
212  CALL dbcsr_binary_write(matrix_p_tmp, file_name)
213 
214  CALL dbcsr_release(matrix_p_tmp)
215  END DO
216  DEALLOCATE (matrix_p_tmp)
217  END IF
218 
219  CALL timestop(handle)
220 
221  END SUBROUTINE write_dm_binary_restart
222 
223 ! **************************************************************************************************
224 !> \brief ...
225 !> \param mo_array ...
226 !> \param rt_mos ...
227 !> \param particle_set ...
228 !> \param dft_section ...
229 !> \param qs_kind_set ...
230 ! **************************************************************************************************
231  SUBROUTINE write_rt_mos_to_restart(mo_array, rt_mos, particle_set, dft_section, &
232  qs_kind_set)
233 
234  TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mo_array
235  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN) :: rt_mos
236  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
237  TYPE(section_vals_type), POINTER :: dft_section
238  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
239 
240  CHARACTER(LEN=*), PARAMETER :: routinen = 'write_rt_mos_to_restart'
241  CHARACTER(LEN=43), DIMENSION(2), PARAMETER :: keys = (/ &
242  "REAL_TIME_PROPAGATION%PRINT%RESTART_HISTORY", &
243  "REAL_TIME_PROPAGATION%PRINT%RESTART "/)
244 
245  INTEGER :: handle, ikey, ires
246  TYPE(cp_logger_type), POINTER :: logger
247 
248  CALL timeset(routinen, handle)
249  logger => cp_get_default_logger()
250 
251  IF (btest(cp_print_key_should_output(logger%iter_info, &
252  dft_section, keys(1)), cp_p_file) .OR. &
253  btest(cp_print_key_should_output(logger%iter_info, &
254  dft_section, keys(2)), cp_p_file)) THEN
255 
256  DO ikey = 1, SIZE(keys)
257 
258  IF (btest(cp_print_key_should_output(logger%iter_info, &
259  dft_section, keys(ikey)), cp_p_file)) THEN
260 
261  ires = cp_print_key_unit_nr(logger, dft_section, keys(ikey), &
262  extension=".rtpwfn", file_status="REPLACE", file_action="WRITE", &
263  do_backup=.true., file_form="UNFORMATTED")
264 
265  CALL write_mo_set_low(mo_array, rt_mos=rt_mos, qs_kind_set=qs_kind_set, &
266  particle_set=particle_set, ires=ires)
267  CALL cp_print_key_finished_output(ires, logger, dft_section, trim(keys(ikey)))
268  END IF
269  END DO
270  END IF
271 
272  CALL timestop(handle)
273 
274  END SUBROUTINE write_rt_mos_to_restart
275 
276 ! **************************************************************************************************
277 !> \brief ...
278 !> \param mo_array ...
279 !> \param qs_kind_set ...
280 !> \param particle_set ...
281 !> \param ires ...
282 !> \param rt_mos ...
283 ! **************************************************************************************************
284  SUBROUTINE write_mo_set_low(mo_array, qs_kind_set, particle_set, ires, rt_mos)
285 
286  TYPE(mo_set_type), DIMENSION(:), INTENT(IN) :: mo_array
287  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
288  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
289  INTEGER :: ires
290  TYPE(cp_fm_type), DIMENSION(:), INTENT(IN), &
291  OPTIONAL :: rt_mos
292 
293  CHARACTER(LEN=*), PARAMETER :: routinen = 'write_mo_set_low'
294 
295  INTEGER :: handle, iatom, ikind, imat, iset, &
296  ishell, ispin, lmax, lshell, &
297  max_block, nao, natom, nmo, nset, &
298  nset_max, nshell_max, nspin
299  INTEGER, DIMENSION(:), POINTER :: nset_info, nshell
300  INTEGER, DIMENSION(:, :), POINTER :: l, nshell_info
301  INTEGER, DIMENSION(:, :, :), POINTER :: nso_info
302  TYPE(gto_basis_set_type), POINTER :: orb_basis_set
303  TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter
304 
305  CALL timeset(routinen, handle)
306  nspin = SIZE(mo_array)
307  nao = mo_array(1)%nao
308 
309  IF (ires > 0) THEN
310  ! *** create some info about the basis set first ***
311  natom = SIZE(particle_set, 1)
312  nset_max = 0
313  nshell_max = 0
314 
315  DO iatom = 1, natom
316  NULLIFY (orb_basis_set, dftb_parameter)
317  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
318  CALL get_qs_kind(qs_kind_set(ikind), &
319  basis_set=orb_basis_set, dftb_parameter=dftb_parameter)
320  IF (ASSOCIATED(orb_basis_set)) THEN
321  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
322  nset=nset, &
323  nshell=nshell, &
324  l=l)
325  nset_max = max(nset_max, nset)
326  DO iset = 1, nset
327  nshell_max = max(nshell_max, nshell(iset))
328  END DO
329  ELSEIF (ASSOCIATED(dftb_parameter)) THEN
330  CALL get_dftb_atom_param(dftb_parameter, lmax=lmax)
331  nset_max = max(nset_max, 1)
332  nshell_max = max(nshell_max, lmax + 1)
333  ELSE
334  ! We assume here an atom without a basis set
335  ! CPABORT("Unknown basis type. ")
336  END IF
337  END DO
338 
339  ALLOCATE (nso_info(nshell_max, nset_max, natom))
340  nso_info(:, :, :) = 0
341 
342  ALLOCATE (nshell_info(nset_max, natom))
343  nshell_info(:, :) = 0
344 
345  ALLOCATE (nset_info(natom))
346  nset_info(:) = 0
347 
348  DO iatom = 1, natom
349  NULLIFY (orb_basis_set, dftb_parameter)
350  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
351  CALL get_qs_kind(qs_kind_set(ikind), &
352  basis_set=orb_basis_set, dftb_parameter=dftb_parameter)
353  IF (ASSOCIATED(orb_basis_set)) THEN
354  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
355  nset=nset, &
356  nshell=nshell, &
357  l=l)
358  nset_info(iatom) = nset
359  DO iset = 1, nset
360  nshell_info(iset, iatom) = nshell(iset)
361  DO ishell = 1, nshell(iset)
362  lshell = l(ishell, iset)
363  nso_info(ishell, iset, iatom) = nso(lshell)
364  END DO
365  END DO
366  ELSEIF (ASSOCIATED(dftb_parameter)) THEN
367  CALL get_dftb_atom_param(dftb_parameter, lmax=lmax)
368  nset_info(iatom) = 1
369  nshell_info(1, iatom) = lmax + 1
370  DO ishell = 1, lmax + 1
371  lshell = ishell - 1
372  nso_info(ishell, 1, iatom) = nso(lshell)
373  END DO
374  ELSE
375  ! We assume here an atom without a basis set
376  ! CPABORT("Unknown basis type. ")
377  END IF
378  END DO
379 
380  WRITE (ires) natom, nspin, nao, nset_max, nshell_max
381  WRITE (ires) nset_info
382  WRITE (ires) nshell_info
383  WRITE (ires) nso_info
384 
385  DEALLOCATE (nset_info)
386 
387  DEALLOCATE (nshell_info)
388 
389  DEALLOCATE (nso_info)
390  END IF
391 
392  ! use the scalapack block size as a default for buffering columns
393  CALL cp_fm_get_info(mo_array(1)%mo_coeff, ncol_block=max_block)
394  DO ispin = 1, nspin
395  nmo = mo_array(ispin)%nmo
396  IF ((ires > 0) .AND. (nmo > 0)) THEN
397  WRITE (ires) nmo, &
398  mo_array(ispin)%homo, &
399  mo_array(ispin)%lfomo, &
400  mo_array(ispin)%nelectron
401  WRITE (ires) mo_array(ispin)%eigenvalues(1:nmo), &
402  mo_array(ispin)%occupation_numbers(1:nmo)
403  END IF
404  IF (PRESENT(rt_mos)) THEN
405  DO imat = 2*ispin - 1, 2*ispin
406  CALL cp_fm_write_unformatted(rt_mos(imat), ires)
407  END DO
408  ELSE
409  CALL cp_fm_write_unformatted(mo_array(ispin)%mo_coeff, ires)
410  END IF
411  END DO
412 
413  CALL timestop(handle)
414 
415  END SUBROUTINE write_mo_set_low
416 
417 ! **************************************************************************************************
418 !> \brief ...
419 !> \param filename ...
420 !> \param exist ...
421 !> \param section ...
422 !> \param logger ...
423 !> \param kp ...
424 !> \param xas ...
425 !> \param rtp ...
426 ! **************************************************************************************************
427  SUBROUTINE wfn_restart_file_name(filename, exist, section, logger, kp, xas, rtp)
428  CHARACTER(LEN=default_path_length), INTENT(OUT) :: filename
429  LOGICAL, INTENT(OUT) :: exist
430  TYPE(section_vals_type), POINTER :: section
431  TYPE(cp_logger_type), POINTER :: logger
432  LOGICAL, INTENT(IN), OPTIONAL :: kp, xas, rtp
433 
434  INTEGER :: n_rep_val
435  LOGICAL :: my_kp, my_rtp, my_xas
436  TYPE(section_vals_type), POINTER :: print_key
437 
438  my_kp = .false.
439  my_xas = .false.
440  my_rtp = .false.
441  IF (PRESENT(kp)) my_kp = kp
442  IF (PRESENT(xas)) my_xas = xas
443  IF (PRESENT(rtp)) my_rtp = rtp
444 
445  exist = .false.
446  CALL section_vals_val_get(section, "WFN_RESTART_FILE_NAME", n_rep_val=n_rep_val)
447  IF (n_rep_val > 0) THEN
448  CALL section_vals_val_get(section, "WFN_RESTART_FILE_NAME", c_val=filename)
449  ELSE
450  IF (my_xas) THEN
451  ! try to read from the filename that is generated automatically from the printkey
452  print_key => section_vals_get_subs_vals(section, "PRINT%RESTART")
453  filename = cp_print_key_generate_filename(logger, print_key, &
454  extension="", my_local=.false.)
455  ELSE IF (my_rtp) THEN
456  ! try to read from the filename that is generated automatically from the printkey
457  print_key => section_vals_get_subs_vals(section, "REAL_TIME_PROPAGATION%PRINT%RESTART")
458  filename = cp_print_key_generate_filename(logger, print_key, &
459  extension=".rtpwfn", my_local=.false.)
460  ELSE IF (my_kp) THEN
461  ! try to read from the filename that is generated automatically from the printkey
462  print_key => section_vals_get_subs_vals(section, "SCF%PRINT%RESTART")
463  filename = cp_print_key_generate_filename(logger, print_key, &
464  extension=".kp", my_local=.false.)
465  ELSE
466  ! try to read from the filename that is generated automatically from the printkey
467  print_key => section_vals_get_subs_vals(section, "SCF%PRINT%RESTART")
468  filename = cp_print_key_generate_filename(logger, print_key, &
469  extension=".wfn", my_local=.false.)
470  END IF
471  END IF
472  IF (.NOT. my_xas) THEN
473  INQUIRE (file=filename, exist=exist)
474  END IF
475 
476  END SUBROUTINE wfn_restart_file_name
477 
478 ! **************************************************************************************************
479 !> \brief ...
480 !> \param mo_array ...
481 !> \param atomic_kind_set ...
482 !> \param qs_kind_set ...
483 !> \param particle_set ...
484 !> \param para_env ...
485 !> \param id_nr ...
486 !> \param multiplicity ...
487 !> \param dft_section ...
488 !> \param natom_mismatch ...
489 !> \param cdft ...
490 !> \param out_unit ...
491 ! **************************************************************************************************
492  SUBROUTINE read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, &
493  para_env, id_nr, multiplicity, dft_section, natom_mismatch, &
494  cdft, out_unit)
495 
496  TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mo_array
497  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
498  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
499  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
500  TYPE(mp_para_env_type), POINTER :: para_env
501  INTEGER, INTENT(IN) :: id_nr, multiplicity
502  TYPE(section_vals_type), POINTER :: dft_section
503  LOGICAL, INTENT(OUT), OPTIONAL :: natom_mismatch
504  LOGICAL, INTENT(IN), OPTIONAL :: cdft
505  INTEGER, INTENT(IN), OPTIONAL :: out_unit
506 
507  CHARACTER(LEN=*), PARAMETER :: routinen = 'read_mo_set_from_restart'
508 
509  CHARACTER(LEN=default_path_length) :: file_name
510  INTEGER :: handle, ispin, my_out_unit, natom, &
511  nspin, restart_unit
512  LOGICAL :: exist, my_cdft
513  TYPE(cp_logger_type), POINTER :: logger
514 
515  CALL timeset(routinen, handle)
516  logger => cp_get_default_logger()
517  my_cdft = .false.
518  IF (PRESENT(cdft)) my_cdft = cdft
519  my_out_unit = -1
520  IF (PRESENT(out_unit)) my_out_unit = out_unit
521 
522  nspin = SIZE(mo_array)
523  restart_unit = -1
524 
525  IF (para_env%is_source()) THEN
526 
527  natom = SIZE(particle_set, 1)
528  CALL wfn_restart_file_name(file_name, exist, dft_section, logger)
529  IF (id_nr /= 0) THEN
530  ! Is it one of the backup files?
531  file_name = trim(file_name)//".bak-"//adjustl(cp_to_string(id_nr))
532  END IF
533 
534  CALL open_file(file_name=file_name, &
535  file_action="READ", &
536  file_form="UNFORMATTED", &
537  file_status="OLD", &
538  unit_number=restart_unit)
539 
540  END IF
541 
542  CALL read_mos_restart_low(mo_array, para_env=para_env, qs_kind_set=qs_kind_set, &
543  particle_set=particle_set, natom=natom, &
544  rst_unit=restart_unit, multiplicity=multiplicity, natom_mismatch=natom_mismatch)
545 
546  IF (PRESENT(natom_mismatch)) THEN
547  ! read_mos_restart_low only the io_node returns natom_mismatch, must broadcast it
548  CALL para_env%bcast(natom_mismatch)
549  IF (natom_mismatch) THEN
550  IF (para_env%is_source()) CALL close_file(unit_number=restart_unit)
551  CALL timestop(handle)
552  RETURN
553  END IF
554  END IF
555 
556  ! Close restart file
557  IF (para_env%is_source()) THEN
558  IF (my_out_unit > 0) THEN
559  WRITE (unit=my_out_unit, fmt="(T2,A)") &
560  "WFN_RESTART| Restart file "//trim(file_name)//" read"
561  END IF
562  CALL close_file(unit_number=restart_unit)
563  END IF
564 
565  ! CDFT has no real dft_section and does not need to print
566  IF (.NOT. my_cdft) THEN
567  DO ispin = 1, nspin
568  CALL write_mo_set_to_output_unit(mo_array(ispin), atomic_kind_set, qs_kind_set, &
569  particle_set, dft_section, 4, 0, final_mos=.false.)
570  END DO
571  END IF
572 
573  CALL timestop(handle)
574 
575  END SUBROUTINE read_mo_set_from_restart
576 
577 ! **************************************************************************************************
578 !> \brief ...
579 !> \param mo_array ...
580 !> \param rt_mos ...
581 !> \param atomic_kind_set ...
582 !> \param qs_kind_set ...
583 !> \param particle_set ...
584 !> \param para_env ...
585 !> \param id_nr ...
586 !> \param multiplicity ...
587 !> \param dft_section ...
588 ! **************************************************************************************************
589  SUBROUTINE read_rt_mos_from_restart(mo_array, rt_mos, atomic_kind_set, qs_kind_set, &
590  particle_set, para_env, id_nr, multiplicity, dft_section)
591 
592  TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mo_array
593  TYPE(cp_fm_type), DIMENSION(:), POINTER :: rt_mos
594  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
595  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
596  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
597  TYPE(mp_para_env_type), POINTER :: para_env
598  INTEGER, INTENT(IN) :: id_nr, multiplicity
599  TYPE(section_vals_type), POINTER :: dft_section
600 
601  CHARACTER(LEN=*), PARAMETER :: routinen = 'read_rt_mos_from_restart'
602 
603  CHARACTER(LEN=default_path_length) :: file_name
604  INTEGER :: handle, ispin, natom, nspin, &
605  restart_unit, unit_nr
606  LOGICAL :: exist
607  TYPE(cp_logger_type), POINTER :: logger
608 
609  CALL timeset(routinen, handle)
610  logger => cp_get_default_logger()
611 
612  nspin = SIZE(mo_array)
613  restart_unit = -1
614 
615  IF (para_env%is_source()) THEN
616 
617  natom = SIZE(particle_set, 1)
618  CALL wfn_restart_file_name(file_name, exist, dft_section, logger, rtp=.true.)
619  IF (id_nr /= 0) THEN
620  ! Is it one of the backup files?
621  file_name = trim(file_name)//".bak-"//adjustl(cp_to_string(id_nr))
622  END IF
623 
624  unit_nr = cp_logger_get_default_unit_nr(logger, local=.true.)
625  IF (unit_nr > 0) THEN
626  WRITE (unit_nr, '(T2,A)') "Read RTP restart from the file: "//trim(file_name)
627  END IF
628 
629  CALL open_file(file_name=file_name, &
630  file_action="READ", &
631  file_form="UNFORMATTED", &
632  file_status="OLD", &
633  unit_number=restart_unit)
634 
635  END IF
636 
637  CALL read_mos_restart_low(mo_array, rt_mos=rt_mos, para_env=para_env, &
638  particle_set=particle_set, qs_kind_set=qs_kind_set, natom=natom, &
639  rst_unit=restart_unit, multiplicity=multiplicity)
640 
641  ! Close restart file
642  IF (para_env%is_source()) CALL close_file(unit_number=restart_unit)
643 
644  DO ispin = 1, nspin
645  CALL write_mo_set_to_output_unit(mo_array(ispin), atomic_kind_set, qs_kind_set, &
646  particle_set, dft_section, 4, 0, final_mos=.false.)
647  END DO
648 
649  CALL timestop(handle)
650 
651  END SUBROUTINE read_rt_mos_from_restart
652 
653 ! **************************************************************************************************
654 !> \brief Reading the mos from apreviously defined restart file
655 !> \param mos ...
656 !> \param para_env ...
657 !> \param qs_kind_set ...
658 !> \param particle_set ...
659 !> \param natom ...
660 !> \param rst_unit ...
661 !> \param multiplicity ...
662 !> \param rt_mos ...
663 !> \param natom_mismatch ...
664 !> \par History
665 !> 12.2007 created [MI]
666 !> \author MI
667 ! **************************************************************************************************
668  SUBROUTINE read_mos_restart_low(mos, para_env, qs_kind_set, particle_set, natom, rst_unit, &
669  multiplicity, rt_mos, natom_mismatch)
670 
671  TYPE(mo_set_type), DIMENSION(:), INTENT(INOUT) :: mos
672  TYPE(mp_para_env_type), POINTER :: para_env
673  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
674  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
675  INTEGER, INTENT(IN) :: natom, rst_unit
676  INTEGER, INTENT(in), OPTIONAL :: multiplicity
677  TYPE(cp_fm_type), DIMENSION(:), OPTIONAL, POINTER :: rt_mos
678  LOGICAL, INTENT(OUT), OPTIONAL :: natom_mismatch
679 
680  INTEGER :: homo, homo_read, i, iatom, ikind, imat, irow, iset, iset_read, ishell, &
681  ishell_read, iso, ispin, lfomo_read, lmax, lshell, my_mult, nao, nao_read, natom_read, &
682  nelectron, nelectron_read, nmo, nmo_read, nnshell, nset, nset_max, nshell_max, nspin, &
683  nspin_read, offset_read
684  INTEGER, DIMENSION(:), POINTER :: nset_info, nshell
685  INTEGER, DIMENSION(:, :), POINTER :: l, nshell_info
686  INTEGER, DIMENSION(:, :, :), POINTER :: nso_info, offset_info
687  LOGICAL :: minbas, natom_match, use_this
688  REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: eig_read, occ_read
689  REAL(kind=dp), DIMENSION(:, :), POINTER :: vecbuffer, vecbuffer_read
690  TYPE(cp_logger_type), POINTER :: logger
691  TYPE(gto_basis_set_type), POINTER :: orb_basis_set
692  TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter
693 
694  logger => cp_get_default_logger()
695 
696  nspin = SIZE(mos)
697  nao = mos(1)%nao
698  my_mult = 0
699  IF (PRESENT(multiplicity)) my_mult = multiplicity
700 
701  IF (para_env%is_source()) THEN
702  READ (rst_unit) natom_read, nspin_read, nao_read, nset_max, nshell_max
703  IF (PRESENT(rt_mos)) THEN
704  IF (nspin_read /= nspin) THEN
705  cpabort("To change nspin is not possible. ")
706  END IF
707  ELSE
708  ! we should allow for restarting with different spin settings
709  IF (nspin_read /= nspin) THEN
710  WRITE (cp_logger_get_default_unit_nr(logger), *) &
711  "READ RESTART : WARNING : nspin is not equal "
712  END IF
713  ! this case needs fixing of homo/lfomo/nelec/occupations ...
714  IF (nspin_read > nspin) THEN
715  cpabort("Reducing nspin is not possible. ")
716  END IF
717  END IF
718 
719  natom_match = (natom_read == natom)
720 
721  IF (natom_match) THEN ! actually do the read read
722 
723  ! Let's make it possible to change the basis set
724  ALLOCATE (nso_info(nshell_max, nset_max, natom_read))
725  ALLOCATE (nshell_info(nset_max, natom_read))
726  ALLOCATE (nset_info(natom_read))
727  ALLOCATE (offset_info(nshell_max, nset_max, natom_read))
728 
729  IF (nao_read /= nao) THEN
730  WRITE (cp_logger_get_default_unit_nr(logger), *) &
731  " READ RESTART : WARNING : DIFFERENT # AOs ", nao, nao_read
732  IF (PRESENT(rt_mos)) &
733  cpabort("To change basis is not possible. ")
734  END IF
735 
736  READ (rst_unit) nset_info
737  READ (rst_unit) nshell_info
738  READ (rst_unit) nso_info
739 
740  i = 1
741  DO iatom = 1, natom
742  DO iset = 1, nset_info(iatom)
743  DO ishell = 1, nshell_info(iset, iatom)
744  offset_info(ishell, iset, iatom) = i
745  i = i + nso_info(ishell, iset, iatom)
746  END DO
747  END DO
748  END DO
749 
750  ALLOCATE (vecbuffer_read(1, nao_read))
751 
752  END IF ! natom_match
753  END IF ! ionode
754 
755  ! make natom_match and natom_mismatch uniform across all nodes
756  CALL para_env%bcast(natom_match)
757  IF (PRESENT(natom_mismatch)) natom_mismatch = .NOT. natom_match
758  ! handle natom_match false
759  IF (.NOT. natom_match) THEN
760  IF (PRESENT(natom_mismatch)) THEN
761  WRITE (cp_logger_get_default_unit_nr(logger), *) &
762  " READ RESTART : WARNING : DIFFERENT natom, returning ", natom, natom_read
763  RETURN
764  ELSE
765  cpabort("Incorrect number of atoms in restart file. ")
766  END IF
767  END IF
768 
769  CALL para_env%bcast(nspin_read)
770 
771  ALLOCATE (vecbuffer(1, nao))
772 
773  DO ispin = 1, nspin
774 
775  nmo = mos(ispin)%nmo
776  homo = mos(ispin)%homo
777  mos(ispin)%eigenvalues(:) = 0.0_dp
778  mos(ispin)%occupation_numbers(:) = 0.0_dp
779  CALL cp_fm_set_all(mos(ispin)%mo_coeff, 0.0_dp)
780 
781  IF (para_env%is_source() .AND. (nmo > 0)) THEN
782  READ (rst_unit) nmo_read, homo_read, lfomo_read, nelectron_read
783  ALLOCATE (eig_read(nmo_read), occ_read(nmo_read))
784  eig_read = 0.0_dp
785  occ_read = 0.0_dp
786 
787  nmo = min(nmo, nmo_read)
788  IF (nmo_read < nmo) &
789  CALL cp_warn(__location__, &
790  "The number of MOs on the restart unit is smaller than the number of "// &
791  "the allocated MOs. The MO set will be padded with zeros!")
792  IF (nmo_read > nmo) &
793  CALL cp_warn(__location__, &
794  "The number of MOs on the restart unit is greater than the number of "// &
795  "the allocated MOs. The read MO set will be truncated!")
796 
797  READ (rst_unit) eig_read(1:nmo_read), occ_read(1:nmo_read)
798  mos(ispin)%eigenvalues(1:nmo) = eig_read(1:nmo)
799  mos(ispin)%occupation_numbers(1:nmo) = occ_read(1:nmo)
800  DEALLOCATE (eig_read, occ_read)
801 
802  mos(ispin)%homo = homo_read
803  mos(ispin)%lfomo = lfomo_read
804  IF (homo_read > nmo) THEN
805  IF (nelectron_read == mos(ispin)%nelectron) THEN
806  CALL cp_warn(__location__, &
807  "The number of occupied MOs on the restart unit is larger than "// &
808  "the allocated MOs. The read MO set will be truncated and the occupation numbers recalculated!")
809  CALL set_mo_occupation(mo_set=mos(ispin))
810  ELSE
811  ! can not make this a warning i.e. homo must be smaller than nmo
812  ! otherwise e.g. set_mo_occupation will go out of bounds
813  cpabort("Number of occupied MOs on restart unit larger than allocated MOs. ")
814  END IF
815  END IF
816  END IF
817 
818  CALL para_env%bcast(nmo)
819  CALL para_env%bcast(mos(ispin)%homo)
820  CALL para_env%bcast(mos(ispin)%lfomo)
821  CALL para_env%bcast(mos(ispin)%nelectron)
822  CALL para_env%bcast(mos(ispin)%eigenvalues)
823  CALL para_env%bcast(mos(ispin)%occupation_numbers)
824 
825  IF (PRESENT(rt_mos)) THEN
826  DO imat = 2*ispin - 1, 2*ispin
827  DO i = 1, nmo
828  IF (para_env%is_source()) THEN
829  READ (rst_unit) vecbuffer
830  ELSE
831  vecbuffer(1, :) = 0.0_dp
832  END IF
833  CALL para_env%bcast(vecbuffer)
834  CALL cp_fm_set_submatrix(rt_mos(imat), &
835  vecbuffer, 1, i, nao, 1, transpose=.true.)
836  END DO
837  END DO
838  ELSE
839  DO i = 1, nmo
840  IF (para_env%is_source()) THEN
841  READ (rst_unit) vecbuffer_read
842  ! now, try to assign the read to the real vector
843  ! in case the basis set changed this involves some guessing
844  irow = 1
845  DO iatom = 1, natom
846  NULLIFY (orb_basis_set, dftb_parameter, l, nshell)
847  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
848  CALL get_qs_kind(qs_kind_set(ikind), &
849  basis_set=orb_basis_set, dftb_parameter=dftb_parameter)
850  IF (ASSOCIATED(orb_basis_set)) THEN
851  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
852  nset=nset, &
853  nshell=nshell, &
854  l=l)
855  minbas = .false.
856  ELSEIF (ASSOCIATED(dftb_parameter)) THEN
857  CALL get_dftb_atom_param(dftb_parameter, lmax=lmax)
858  nset = 1
859  minbas = .true.
860  ELSE
861  ! assume an atom without basis set
862  ! CPABORT("Unknown basis set type. ")
863  nset = 0
864  END IF
865 
866  use_this = .true.
867  iset_read = 1
868  DO iset = 1, nset
869  ishell_read = 1
870  IF (minbas) THEN
871  nnshell = lmax + 1
872  ELSE
873  nnshell = nshell(iset)
874  END IF
875  DO ishell = 1, nnshell
876  IF (minbas) THEN
877  lshell = ishell - 1
878  ELSE
879  lshell = l(ishell, iset)
880  END IF
881  IF (iset_read > nset_info(iatom)) use_this = .false.
882  IF (use_this) THEN ! avoids out of bound access of the lower line if false
883  IF (nso(lshell) == nso_info(ishell_read, iset_read, iatom)) THEN
884  offset_read = offset_info(ishell_read, iset_read, iatom)
885  ishell_read = ishell_read + 1
886  IF (ishell_read > nshell_info(iset, iatom)) THEN
887  ishell_read = 1
888  iset_read = iset_read + 1
889  END IF
890  ELSE
891  use_this = .false.
892  END IF
893  END IF
894  DO iso = 1, nso(lshell)
895  IF (use_this) THEN
896  IF (offset_read - 1 + iso .LT. 1 .OR. offset_read - 1 + iso .GT. nao_read) THEN
897  vecbuffer(1, irow) = 0.0_dp
898  ELSE
899  vecbuffer(1, irow) = vecbuffer_read(1, offset_read - 1 + iso)
900  END IF
901  ELSE
902  vecbuffer(1, irow) = 0.0_dp
903  END IF
904  irow = irow + 1
905  END DO
906  use_this = .true.
907  END DO
908  END DO
909  END DO
910 
911  ELSE
912 
913  vecbuffer(1, :) = 0.0_dp
914 
915  END IF
916 
917  CALL para_env%bcast(vecbuffer)
918  CALL cp_fm_set_submatrix(mos(ispin)%mo_coeff, &
919  vecbuffer, 1, i, nao, 1, transpose=.true.)
920  END DO
921  END IF
922  ! Skip extra MOs if there any
923  IF (para_env%is_source()) THEN
924  !ignore nmo = 0
925  IF (nmo > 0) THEN
926  DO i = nmo + 1, nmo_read
927  READ (rst_unit) vecbuffer_read
928  END DO
929  END IF
930  END IF
931 
932  IF (.NOT. PRESENT(rt_mos)) THEN
933  IF (ispin == 1 .AND. nspin_read < nspin) THEN
934 
935  mos(ispin + 1)%homo = mos(ispin)%homo
936  mos(ispin + 1)%lfomo = mos(ispin)%lfomo
937  nelectron = mos(ispin)%nelectron
938  IF (my_mult .NE. 1) THEN
939  CALL cp_abort(__location__, &
940  "Restarting an LSD calculation from an LDA wfn only works for multiplicity=1 (singlets).")
941  END IF
942  IF (mos(ispin + 1)%nelectron < 0) THEN
943  cpabort("LSD: too few electrons for this multiplisity. ")
944  END IF
945  mos(ispin + 1)%eigenvalues = mos(ispin)%eigenvalues
946  mos(ispin)%occupation_numbers = mos(ispin)%occupation_numbers/2.0_dp
947  mos(ispin + 1)%occupation_numbers = mos(ispin)%occupation_numbers
948  CALL cp_fm_to_fm(mos(ispin)%mo_coeff, mos(ispin + 1)%mo_coeff)
949  EXIT
950  END IF
951  END IF
952  END DO ! ispin
953 
954  DEALLOCATE (vecbuffer)
955 
956  IF (para_env%is_source()) THEN
957  DEALLOCATE (vecbuffer_read)
958  DEALLOCATE (offset_info)
959  DEALLOCATE (nso_info)
960  DEALLOCATE (nshell_info)
961  DEALLOCATE (nset_info)
962  END IF
963 
964  END SUBROUTINE read_mos_restart_low
965 
966 ! **************************************************************************************************
967 !> \brief Write MO information to output file (eigenvalues, occupation numbers, coefficients)
968 !> \param mo_set ...
969 !> \param atomic_kind_set ...
970 !> \param qs_kind_set ...
971 !> \param particle_set ...
972 !> \param dft_section ...
973 !> \param before Digits before the dot
974 !> \param kpoint An integer that labels the current k point, e.g. its index
975 !> \param final_mos ...
976 !> \param spin ...
977 !> \param solver_method ...
978 !> \param rtp ...
979 !> \param cpart ...
980 !> \param sim_step ...
981 !> \param umo_set ...
982 !> \date 15.05.2001
983 !> \par History:
984 !> - Optionally print Cartesian MOs (20.04.2005, MK)
985 !> - Revise printout of MO information (05.05.2021, MK)
986 !> \par Variables
987 !> - after : Number of digits after point.
988 !> - before: Number of digits before point.
989 !> \author Matthias Krack (MK)
990 !> \version 1.1
991 ! **************************************************************************************************
992  SUBROUTINE write_mo_set_to_output_unit(mo_set, atomic_kind_set, qs_kind_set, particle_set, &
993  dft_section, before, kpoint, final_mos, spin, &
994  solver_method, rtp, cpart, sim_step, umo_set)
995 
996  TYPE(mo_set_type), INTENT(IN) :: mo_set
997  TYPE(atomic_kind_type), DIMENSION(:), POINTER :: atomic_kind_set
998  TYPE(qs_kind_type), DIMENSION(:), POINTER :: qs_kind_set
999  TYPE(particle_type), DIMENSION(:), POINTER :: particle_set
1000  TYPE(section_vals_type), POINTER :: dft_section
1001  INTEGER, INTENT(IN) :: before, kpoint
1002  LOGICAL, INTENT(IN), OPTIONAL :: final_mos
1003  CHARACTER(LEN=*), INTENT(IN), OPTIONAL :: spin
1004  CHARACTER(LEN=2), INTENT(IN), OPTIONAL :: solver_method
1005  LOGICAL, INTENT(IN), OPTIONAL :: rtp
1006  INTEGER, INTENT(IN), OPTIONAL :: cpart, sim_step
1007  TYPE(mo_set_type), INTENT(IN), OPTIONAL :: umo_set
1008 
1009  CHARACTER(LEN=12) :: symbol
1010  CHARACTER(LEN=12), DIMENSION(:), POINTER :: bcgf_symbol
1011  CHARACTER(LEN=14) :: fmtstr5
1012  CHARACTER(LEN=15) :: energy_str, orbital_str, step_string
1013  CHARACTER(LEN=2) :: element_symbol, my_solver_method
1014  CHARACTER(LEN=2*default_string_length) :: name
1015  CHARACTER(LEN=21) :: vector_str
1016  CHARACTER(LEN=22) :: fmtstr4
1017  CHARACTER(LEN=24) :: fmtstr2
1018  CHARACTER(LEN=25) :: fmtstr1
1019  CHARACTER(LEN=29) :: fmtstr6
1020  CHARACTER(LEN=4) :: reim
1021  CHARACTER(LEN=40) :: fmtstr3
1022  CHARACTER(LEN=6), DIMENSION(:), POINTER :: bsgf_symbol
1023  INTEGER :: after, first_mo, from, homo, iatom, icgf, ico, icol, ikind, imo, irow, iset, &
1024  isgf, ishell, iso, iw, jcol, last_mo, left, lmax, lshell, nao, natom, ncgf, ncol, nmo, &
1025  nset, nsgf, numo, right, scf_step, to, width
1026  INTEGER, DIMENSION(:), POINTER :: mo_index_range, nshell
1027  INTEGER, DIMENSION(:, :), POINTER :: l
1028  LOGICAL :: ionode, my_final, my_rtp, &
1029  print_cartesian, print_eigvals, &
1030  print_eigvecs, print_occup, &
1031  should_output
1032  REAL(kind=dp) :: gap, maxocc
1033  REAL(kind=dp), ALLOCATABLE, DIMENSION(:) :: mo_eigenvalues, mo_occupation_numbers
1034  REAL(kind=dp), ALLOCATABLE, DIMENSION(:, :) :: cmatrix, smatrix
1035  REAL(kind=dp), DIMENSION(:), POINTER :: eigenvalues, occupation_numbers
1036  TYPE(cp_fm_type), POINTER :: mo_coeff, umo_coeff
1037  TYPE(cp_logger_type), POINTER :: logger
1038  TYPE(gto_basis_set_type), POINTER :: orb_basis_set
1039  TYPE(qs_dftb_atom_type), POINTER :: dftb_parameter
1040 
1041  NULLIFY (bcgf_symbol)
1042  NULLIFY (bsgf_symbol)
1043  NULLIFY (logger)
1044  NULLIFY (mo_index_range)
1045  NULLIFY (nshell)
1046  NULLIFY (mo_coeff)
1047 
1048  logger => cp_get_default_logger()
1049  ionode = logger%para_env%is_source()
1050  CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVALUES", l_val=print_eigvals)
1051  CALL section_vals_val_get(dft_section, "PRINT%MO%EIGENVECTORS", l_val=print_eigvecs)
1052  CALL section_vals_val_get(dft_section, "PRINT%MO%OCCUPATION_NUMBERS", l_val=print_occup)
1053  CALL section_vals_val_get(dft_section, "PRINT%MO%CARTESIAN", l_val=print_cartesian)
1054  CALL section_vals_val_get(dft_section, "PRINT%MO%MO_INDEX_RANGE", i_vals=mo_index_range)
1055  CALL section_vals_val_get(dft_section, "PRINT%MO%NDIGITS", i_val=after)
1056  after = min(max(after, 1), 16)
1057 
1058  ! Do we print the final MO information after SCF convergence is reached (default: no)
1059  IF (PRESENT(final_mos)) THEN
1060  my_final = final_mos
1061  ELSE
1062  my_final = .false.
1063  END IF
1064 
1065  ! complex MOS for RTP, no eigenvalues
1066  my_rtp = .false.
1067  IF (PRESENT(rtp)) THEN
1068  my_rtp = rtp
1069  ! print the first time step if MO print required
1070  should_output = btest(cp_print_key_should_output(logger%iter_info, dft_section, &
1071  "PRINT%MO"), cp_p_file) &
1072  .OR. (sim_step == 1)
1073  ELSE
1074  should_output = btest(cp_print_key_should_output(logger%iter_info, dft_section, &
1075  "PRINT%MO"), cp_p_file) .OR. my_final
1076  END IF
1077 
1078  IF ((.NOT. should_output) .OR. (.NOT. (print_eigvals .OR. print_eigvecs .OR. print_occup))) RETURN
1079 
1080  IF (my_rtp) THEN
1081  cpassert(PRESENT(sim_step))
1082  cpassert(PRESENT(cpart))
1083  scf_step = sim_step
1084  IF (cpart == 0) THEN
1085  reim = "IMAG"
1086  ELSE
1087  reim = "REAL"
1088  END IF
1089  print_eigvals = .false.
1090  ELSE
1091  scf_step = max(0, logger%iter_info%iteration(logger%iter_info%n_rlevel) - 1)
1092  END IF
1093 
1094  IF (.NOT. my_final) THEN
1095  IF (.NOT. my_rtp) THEN
1096  step_string = " AFTER SCF STEP"
1097  ELSE
1098  step_string = " AFTER RTP STEP"
1099  END IF
1100  END IF
1101 
1102  IF (PRESENT(solver_method)) THEN
1103  my_solver_method = solver_method
1104  ELSE
1105  ! Traditional diagonalization is assumed as default solver method
1106  my_solver_method = "TD"
1107  END IF
1108 
1109  ! Retrieve MO information
1110  CALL get_mo_set(mo_set=mo_set, &
1111  mo_coeff=mo_coeff, &
1112  eigenvalues=eigenvalues, &
1113  occupation_numbers=occupation_numbers, &
1114  homo=homo, &
1115  maxocc=maxocc, &
1116  nao=nao, &
1117  nmo=nmo)
1118  IF (PRESENT(umo_set)) THEN
1119  CALL get_mo_set(mo_set=umo_set, &
1120  mo_coeff=umo_coeff, &
1121  nmo=numo)
1122  nmo = nmo + numo
1123  ELSE
1124  numo = 0
1125  END IF
1126  ALLOCATE (mo_eigenvalues(nmo))
1127  mo_eigenvalues(:) = 0.0_dp
1128  mo_eigenvalues(1:nmo - numo) = eigenvalues(1:nmo - numo)
1129  ALLOCATE (mo_occupation_numbers(nmo))
1130  mo_occupation_numbers(:) = 0.0_dp
1131  mo_occupation_numbers(1:nmo - numo) = occupation_numbers(1:nmo - numo)
1132  IF (numo > 0) THEN
1133  CALL get_mo_set(mo_set=umo_set, &
1134  eigenvalues=eigenvalues)
1135  mo_eigenvalues(nmo - numo + 1:nmo) = eigenvalues(1:numo)
1136  END IF
1137 
1138  IF (print_eigvecs) THEN
1139  ALLOCATE (smatrix(nao, nmo))
1140  CALL cp_fm_get_submatrix(mo_coeff, smatrix(1:nao, 1:nmo - numo))
1141  IF (numo > 0) THEN
1142  CALL cp_fm_get_submatrix(umo_coeff, smatrix(1:nao, nmo - numo + 1:nmo))
1143  END IF
1144  IF (.NOT. ionode) THEN
1145  DEALLOCATE (smatrix)
1146  END IF
1147  END IF
1148 
1149  iw = cp_print_key_unit_nr(logger, dft_section, "PRINT%MO", &
1150  ignore_should_output=should_output, &
1151  extension=".MOLog")
1152 
1153  IF (iw > 0) THEN
1154 
1155  CALL get_atomic_kind_set(atomic_kind_set, natom=natom)
1156  CALL get_qs_kind_set(qs_kind_set, ncgf=ncgf, nsgf=nsgf)
1157 
1158  ! Definition of the variable formats
1159 
1160  fmtstr1 = "(T2,A,21X, ( X,I5, X))"
1161  fmtstr2 = "(T2,A,21X, (1X,F . ))"
1162  fmtstr3 = "(T2,A,I5,1X,I5,1X,A,1X,A6, (1X,F . ))"
1163 
1164  width = before + after + 3
1165  ncol = int(56/width)
1166 
1167  right = max((after - 2), 1)
1168  left = width - right - 5
1169 
1170  WRITE (unit=fmtstr1(11:12), fmt="(I2)") ncol
1171  WRITE (unit=fmtstr1(14:15), fmt="(I2)") left
1172  WRITE (unit=fmtstr1(21:22), fmt="(I2)") right
1173 
1174  WRITE (unit=fmtstr2(11:12), fmt="(I2)") ncol
1175  WRITE (unit=fmtstr2(18:19), fmt="(I2)") width - 1
1176  WRITE (unit=fmtstr2(21:22), fmt="(I2)") after
1177 
1178  WRITE (unit=fmtstr3(27:28), fmt="(I2)") ncol
1179  WRITE (unit=fmtstr3(34:35), fmt="(I2)") width - 1
1180  WRITE (unit=fmtstr3(37:38), fmt="(I2)") after
1181 
1182  IF (my_final .OR. (my_solver_method == "TD")) THEN
1183  energy_str = "EIGENVALUES"
1184  vector_str = "EIGENVECTORS"
1185  ELSE
1186  energy_str = "ENERGIES"
1187  vector_str = "COEFFICIENTS"
1188  END IF
1189 
1190  IF (my_rtp) THEN
1191  energy_str = "ZEROS"
1192  vector_str = trim(reim)//" RTP COEFFICIENTS"
1193  END IF
1194 
1195  IF (print_eigvecs) THEN
1196 
1197  IF (print_cartesian) THEN
1198 
1199  orbital_str = "CARTESIAN"
1200 
1201  ALLOCATE (cmatrix(ncgf, ncgf))
1202  cmatrix = 0.0_dp
1203 
1204  ! Transform spherical MOs to Cartesian MOs
1205  icgf = 1
1206  isgf = 1
1207  DO iatom = 1, natom
1208  NULLIFY (orb_basis_set, dftb_parameter)
1209  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, kind_number=ikind)
1210  CALL get_qs_kind(qs_kind_set(ikind), &
1211  basis_set=orb_basis_set, &
1212  dftb_parameter=dftb_parameter)
1213  IF (ASSOCIATED(orb_basis_set)) THEN
1214  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
1215  nset=nset, &
1216  nshell=nshell, &
1217  l=l)
1218  DO iset = 1, nset
1219  DO ishell = 1, nshell(iset)
1220  lshell = l(ishell, iset)
1221  CALL dgemm("T", "N", nco(lshell), nmo, nso(lshell), 1.0_dp, &
1222  orbtramat(lshell)%c2s, nso(lshell), &
1223  smatrix(isgf, 1), nsgf, 0.0_dp, &
1224  cmatrix(icgf, 1), ncgf)
1225  icgf = icgf + nco(lshell)
1226  isgf = isgf + nso(lshell)
1227  END DO
1228  END DO
1229  ELSE IF (ASSOCIATED(dftb_parameter)) THEN
1230  CALL get_dftb_atom_param(dftb_parameter, lmax=lmax)
1231  DO ishell = 1, lmax + 1
1232  lshell = ishell - 1
1233  CALL dgemm("T", "N", nco(lshell), nsgf, nso(lshell), 1.0_dp, &
1234  orbtramat(lshell)%c2s, nso(lshell), &
1235  smatrix(isgf, 1), nsgf, 0.0_dp, &
1236  cmatrix(icgf, 1), ncgf)
1237  icgf = icgf + nco(lshell)
1238  isgf = isgf + nso(lshell)
1239  END DO
1240  ELSE
1241  ! assume atom without basis set
1242  ! CPABORT("Unknown basis set type")
1243  END IF
1244  END DO ! iatom
1245 
1246  ELSE
1247 
1248  orbital_str = "SPHERICAL"
1249 
1250  END IF ! print_cartesian
1251 
1252  name = trim(energy_str)//", OCCUPATION NUMBERS, AND "// &
1253  trim(orbital_str)//" "//trim(vector_str)
1254 
1255  IF (.NOT. my_final) &
1256  WRITE (unit=name, fmt="(A,1X,I0)") trim(name)//step_string, scf_step
1257 
1258  ELSE IF (print_occup .OR. print_eigvals) THEN
1259  name = trim(energy_str)//" AND OCCUPATION NUMBERS"
1260 
1261  IF (.NOT. my_final) &
1262  WRITE (unit=name, fmt="(A,1X,I0)") trim(name)//step_string, scf_step
1263  END IF ! print_eigvecs
1264 
1265  ! Print headline
1266  IF (PRESENT(spin) .AND. (kpoint > 0)) THEN
1267  WRITE (unit=iw, fmt="(/,T2,A,I0)") &
1268  "MO| "//trim(spin)//" "//trim(name)//" FOR K POINT ", kpoint
1269  ELSE IF (PRESENT(spin)) THEN
1270  WRITE (unit=iw, fmt="(/,T2,A)") &
1271  "MO| "//trim(spin)//" "//trim(name)
1272  ELSE IF (kpoint > 0) THEN
1273  WRITE (unit=iw, fmt="(/,T2,A,I0)") &
1274  "MO| "//trim(name)//" FOR K POINT ", kpoint
1275  ELSE
1276  WRITE (unit=iw, fmt="(/,T2,A)") &
1277  "MO| "//trim(name)
1278  END IF
1279 
1280  ! Check if only a subset of the MOs has to be printed
1281  IF ((mo_index_range(1) > 0) .AND. &
1282  (mo_index_range(2) > 0) .AND. &
1283  (mo_index_range(2) >= mo_index_range(1))) THEN
1284  first_mo = max(1, mo_index_range(1))
1285  last_mo = min(nmo, mo_index_range(2))
1286  ELSE
1287  first_mo = 1
1288  last_mo = nmo
1289  END IF
1290 
1291  IF (print_eigvecs) THEN
1292 
1293  ! Print full MO information
1294 
1295  DO icol = first_mo, last_mo, ncol
1296 
1297  from = icol
1298  to = min((from + ncol - 1), last_mo)
1299 
1300  WRITE (unit=iw, fmt="(T2,A)") "MO|"
1301  WRITE (unit=iw, fmt=fmtstr1) &
1302  "MO|", (jcol, jcol=from, to)
1303  WRITE (unit=iw, fmt=fmtstr2) &
1304  "MO|", (mo_eigenvalues(jcol), jcol=from, to)
1305  WRITE (unit=iw, fmt="(T2,A)") "MO|"
1306  WRITE (unit=iw, fmt=fmtstr2) &
1307  "MO|", (mo_occupation_numbers(jcol), jcol=from, to)
1308  WRITE (unit=iw, fmt="(T2,A)") "MO|"
1309 
1310  irow = 1
1311 
1312  DO iatom = 1, natom
1313 
1314  IF (iatom /= 1) WRITE (unit=iw, fmt="(T2,A)") "MO|"
1315 
1316  NULLIFY (orb_basis_set, dftb_parameter)
1317  CALL get_atomic_kind(particle_set(iatom)%atomic_kind, &
1318  element_symbol=element_symbol, kind_number=ikind)
1319  CALL get_qs_kind(qs_kind_set(ikind), &
1320  basis_set=orb_basis_set, &
1321  dftb_parameter=dftb_parameter)
1322 
1323  IF (print_cartesian) THEN
1324 
1325  IF (ASSOCIATED(orb_basis_set)) THEN
1326  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
1327  nset=nset, &
1328  nshell=nshell, &
1329  l=l, &
1330  cgf_symbol=bcgf_symbol)
1331 
1332  icgf = 1
1333  DO iset = 1, nset
1334  DO ishell = 1, nshell(iset)
1335  lshell = l(ishell, iset)
1336  DO ico = 1, nco(lshell)
1337  WRITE (unit=iw, fmt=fmtstr3) &
1338  "MO|", irow, iatom, adjustr(element_symbol), bcgf_symbol(icgf), &
1339  (cmatrix(irow, jcol), jcol=from, to)
1340  icgf = icgf + 1
1341  irow = irow + 1
1342  END DO
1343  END DO
1344  END DO
1345  ELSE IF (ASSOCIATED(dftb_parameter)) THEN
1346  CALL get_dftb_atom_param(dftb_parameter, lmax=lmax)
1347  icgf = 1
1348  DO ishell = 1, lmax + 1
1349  lshell = ishell - 1
1350  DO ico = 1, nco(lshell)
1351  symbol = cgf_symbol(1, indco(1:3, icgf))
1352  symbol(1:2) = " "
1353  WRITE (unit=iw, fmt=fmtstr3) &
1354  "MO|", irow, iatom, adjustr(element_symbol), symbol, &
1355  (cmatrix(irow, jcol), jcol=from, to)
1356  icgf = icgf + 1
1357  irow = irow + 1
1358  END DO
1359  END DO
1360  ELSE
1361  ! assume atom without basis set
1362  ! CPABORT("Unknown basis set type")
1363  END IF
1364 
1365  ELSE
1366 
1367  IF (ASSOCIATED(orb_basis_set)) THEN
1368  CALL get_gto_basis_set(gto_basis_set=orb_basis_set, &
1369  nset=nset, &
1370  nshell=nshell, &
1371  l=l, &
1372  sgf_symbol=bsgf_symbol)
1373  isgf = 1
1374  DO iset = 1, nset
1375  DO ishell = 1, nshell(iset)
1376  lshell = l(ishell, iset)
1377  DO iso = 1, nso(lshell)
1378  WRITE (unit=iw, fmt=fmtstr3) &
1379  "MO|", irow, iatom, adjustr(element_symbol), bsgf_symbol(isgf), &
1380  (smatrix(irow, jcol), jcol=from, to)
1381  isgf = isgf + 1
1382  irow = irow + 1
1383  END DO
1384  END DO
1385  END DO
1386  ELSE IF (ASSOCIATED(dftb_parameter)) THEN
1387  CALL get_dftb_atom_param(dftb_parameter, lmax=lmax)
1388  isgf = 1
1389  DO ishell = 1, lmax + 1
1390  lshell = ishell - 1
1391  DO iso = 1, nso(lshell)
1392  symbol = sgf_symbol(1, lshell, -lshell + iso - 1)
1393  symbol(1:2) = " "
1394  WRITE (unit=iw, fmt=fmtstr3) &
1395  "MO|", irow, iatom, adjustr(element_symbol), symbol, &
1396  (smatrix(irow, jcol), jcol=from, to)
1397  isgf = isgf + 1
1398  irow = irow + 1
1399  END DO
1400  END DO
1401  ELSE
1402  ! assume atom without basis set
1403  ! CPABORT("Unknown basis set type")
1404  END IF
1405 
1406  END IF ! print_cartesian
1407 
1408  END DO ! iatom
1409 
1410  END DO ! icol
1411 
1412  WRITE (unit=iw, fmt="(T2,A)") "MO|"
1413 
1414  ! Release work storage
1415 
1416  DEALLOCATE (smatrix)
1417  IF (print_cartesian) THEN
1418  DEALLOCATE (cmatrix)
1419  END IF
1420 
1421  ELSE IF (print_occup .OR. print_eigvals) THEN
1422 
1423  WRITE (unit=iw, fmt="(T2,A)") "MO|"
1424  fmtstr4 = "(T2,A,I7,3(1X,F22. ))"
1425  WRITE (unit=fmtstr4(19:20), fmt="(I2)") after
1426  IF (my_final .OR. (my_solver_method == "TD")) THEN
1427  WRITE (unit=iw, fmt="(A)") &
1428  " MO| Index Eigenvalue [a.u.] Eigenvalue [eV] Occupation"
1429  ELSE
1430  WRITE (unit=iw, fmt="(A)") &
1431  " MO| Index Energy [a.u.] Energy [eV] Occupation"
1432  END IF
1433  DO imo = first_mo, last_mo
1434  WRITE (unit=iw, fmt=fmtstr4) &
1435  "MO|", imo, mo_eigenvalues(imo), &
1436  mo_eigenvalues(imo)*evolt, &
1437  mo_occupation_numbers(imo)
1438  END DO
1439  fmtstr5 = "(A,T59,F22. )"
1440  WRITE (unit=fmtstr5(12:13), fmt="(I2)") after
1441  WRITE (unit=iw, fmt=fmtstr5) &
1442  " MO| Sum:", accurate_sum(mo_occupation_numbers(:))
1443 
1444  END IF ! print_eigvecs
1445 
1446  IF (.NOT. my_rtp) THEN
1447  fmtstr6 = "(A,T18,F17. ,A,T41,F17. ,A)"
1448  WRITE (unit=fmtstr6(12:13), fmt="(I2)") after
1449  WRITE (unit=fmtstr6(25:26), fmt="(I2)") after
1450  WRITE (unit=iw, fmt=fmtstr6) &
1451  " MO| E(Fermi):", mo_set%mu, " a.u.", mo_set%mu*evolt, " eV"
1452  END IF
1453  IF ((homo > 0) .AND. .NOT. my_rtp) THEN
1454  IF ((mo_occupation_numbers(homo) == maxocc) .AND. (last_mo > homo)) THEN
1455  gap = mo_eigenvalues(homo + 1) - &
1456  mo_eigenvalues(homo)
1457  WRITE (unit=iw, fmt=fmtstr6) &
1458  " MO| Band gap:", gap, " a.u.", gap*evolt, " eV"
1459  END IF
1460  END IF
1461  WRITE (unit=iw, fmt="(A)") ""
1462 
1463  END IF ! iw
1464 
1465  IF (ALLOCATED(mo_eigenvalues)) DEALLOCATE (mo_eigenvalues)
1466  IF (ALLOCATED(mo_occupation_numbers)) DEALLOCATE (mo_occupation_numbers)
1467 
1468  CALL cp_print_key_finished_output(iw, logger, dft_section, "PRINT%MO", &
1469  ignore_should_output=should_output)
1470 
1471  END SUBROUTINE write_mo_set_to_output_unit
1472 
1473 END MODULE qs_mo_io
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_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
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)
...
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.
Definition: cp_files.F:16
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.
Definition: cp_files.F:308
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.
Definition: cp_files.F:119
represent a full matrix distributed on many processors
Definition: cp_fm_types.F:15
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
Definition: cp_fm_types.F:1016
subroutine, public cp_fm_write_unformatted(fm, unit)
...
Definition: cp_fm_types.F:2147
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...
Definition: cp_fm_types.F:768
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
Definition: cp_fm_types.F:535
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,...
Definition: cp_fm_types.F:901
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...
objects that represent the structure of input sections and the data contained in an input section
recursive type(section_vals_type) function, pointer, public section_vals_get_subs_vals(section_vals, subsection_name, i_rep_section, can_return_null)
returns the values of the requested subsection
subroutine, public section_vals_val_get(section_vals, keyword_name, i_rep_section, i_rep_val, n_rep_val, val, l_val, i_val, r_val, c_val, l_vals, i_vals, r_vals, c_vals, explicit)
returns the requested value
sums arrays of real/complex numbers with much reduced round-off as compared to a naive implementation...
Definition: kahan_sum.F:29
Defines the basic variable types.
Definition: kinds.F:23
integer, parameter, public dp
Definition: kinds.F:34
integer, parameter, public default_string_length
Definition: kinds.F:57
integer, parameter, public default_path_length
Definition: kinds.F:58
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
orbital_symbols
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).
Calculation of the spherical harmonics and the corresponding orbital transformation matrices.
type(orbtramat_type), dimension(:), pointer, public orbtramat
Define the data structure for the particle information.
Definition of physical constants:
Definition: physcon.F:68
real(kind=dp), parameter, public evolt
Definition: physcon.F:183
collects routines that calculate density matrices
Definition of the DFTB parameter types.
Definition: qs_dftb_types.F:12
Working with the DFTB parameter types.
Definition: qs_dftb_utils.F:12
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.
Definition: qs_kind_types.F:23
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.
Definition and initialisation of the mo data type.
Definition: qs_mo_io.F:21
subroutine, public wfn_restart_file_name(filename, exist, section, logger, kp, xas, rtp)
...
Definition: qs_mo_io.F:428
subroutine, public write_mo_set_low(mo_array, qs_kind_set, particle_set, ires, rt_mos)
...
Definition: qs_mo_io.F:285
subroutine, public read_rt_mos_from_restart(mo_array, rt_mos, atomic_kind_set, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section)
...
Definition: qs_mo_io.F:591
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
Definition: qs_mo_io.F:170
subroutine, public write_mo_set_to_output_unit(mo_set, atomic_kind_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)
Definition: qs_mo_io.F:995
subroutine, public write_mo_set_to_restart(mo_array, particle_set, dft_section, qs_kind_set)
...
Definition: qs_mo_io.F:107
subroutine, public read_mo_set_from_restart(mo_array, atomic_kind_set, qs_kind_set, particle_set, para_env, id_nr, multiplicity, dft_section, natom_mismatch, cdft, out_unit)
...
Definition: qs_mo_io.F:495
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.
Definition: qs_mo_io.F:670
subroutine, public write_rt_mos_to_restart(mo_array, rt_mos, particle_set, dft_section, qs_kind_set)
...
Definition: qs_mo_io.F:233
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
Definition: qs_mo_types.F:22
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.
Definition: qs_mo_types.F:397