203#include "./base/base_uses.f90"
209 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_gpw'
240 CHARACTER(6),
OPTIONAL :: wf_type
241 LOGICAL,
OPTIONAL :: do_mp2
243 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_gpw'
245 INTEGER :: handle, homo, ispin, min_lumos, n_rep, &
246 nchk_nmoloc, nhomo, nlumo, nlumo_stm, &
247 nlumos, nmo, nspins, output_unit, &
249 INTEGER,
DIMENSION(:, :, :),
POINTER :: marked_states
250 LOGICAL :: check_write, compute_lumos, do_homo, do_kpoints,
do_mixed, do_mo_cubes, do_stm, &
251 do_wannier_cubes, has_homo, has_lumo, loc_explicit, loc_print_explicit, my_do_mp2, &
252 my_localized_wfn, p_loc, p_loc_homo, p_loc_lumo, p_loc_mixed
254 REAL(kind=
dp) :: gap, homo_lumo(2, 2), total_zeff_corr
255 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
258 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: mixed_evals, occupied_evals, &
259 unoccupied_evals, unoccupied_evals_stm
260 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: mixed_orbs, occupied_orbs
261 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
262 TARGET :: homo_localized, lumo_localized, &
264 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumo_ptr, mo_loc_history, &
265 unoccupied_orbs, unoccupied_orbs_stm
268 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_p_mp2, matrix_s, &
270 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: kinetic_m, rho_ao
282 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
290 localize_section, print_key, &
293 CALL timeset(routinen, handle)
300 IF (
PRESENT(do_mp2)) my_do_mp2 = do_mp2
301 IF (
PRESENT(wf_type))
THEN
302 IF (output_unit > 0)
THEN
303 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
304 WRITE (unit=output_unit, fmt=
'(/,(T3,A,T19,A,T25,A))')
"Properties from ", wf_type,
" density"
305 WRITE (unit=output_unit, fmt=
'(/,(T1,A))') repeat(
"-", 40)
312 my_localized_wfn = .false.
313 NULLIFY (admm_env, dft_control, pw_env, auxbas_pw_pool, pw_pools, mos, rho, &
314 mo_coeff, ks_rmpv, matrix_s, qs_loc_env_homo, qs_loc_env_lumo, scf_control, &
315 unoccupied_orbs, mo_eigenvalues, unoccupied_evals, &
316 unoccupied_evals_stm, molecule_set, mo_derivs, &
317 subsys, particles, input, print_key, kinetic_m, marked_states, &
318 mixed_evals, qs_loc_env_mixed)
319 NULLIFY (lumo_ptr, rho_ao)
326 p_loc_mixed = .false.
328 cpassert(
ASSOCIATED(scf_env))
329 cpassert(
ASSOCIATED(qs_env))
332 dft_control=dft_control, &
333 molecule_set=molecule_set, &
334 scf_control=scf_control, &
335 do_kpoints=do_kpoints, &
340 particle_set=particle_set, &
341 atomic_kind_set=atomic_kind_set, &
342 qs_kind_set=qs_kind_set)
349 CALL get_qs_env(qs_env, matrix_p_mp2=matrix_p_mp2)
350 DO ispin = 1, dft_control%nspins
351 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, 1.0_dp)
356 CALL update_hartree_with_mp2(rho, qs_env)
359 CALL write_available_results(qs_env, scf_env)
363 "DFT%PRINT%KINETIC_ENERGY") /= 0)
THEN
365 cpassert(
ASSOCIATED(kinetic_m))
366 cpassert(
ASSOCIATED(kinetic_m(1, 1)%matrix))
370 IF (unit_nr > 0)
THEN
371 WRITE (unit_nr,
'(T3,A,T55,F25.14)')
"Electronic kinetic energy:", e_kin
374 "DFT%PRINT%KINETIC_ENERGY")
378 CALL qs_scf_post_charges(input, logger, qs_env)
391 IF (loc_print_explicit)
THEN
411 IF (loc_explicit)
THEN
421 p_loc_mixed = .false.
425 IF (n_rep == 0 .AND. p_loc_lumo)
THEN
426 CALL cp_abort(__location__,
"No LIST_UNOCCUPIED was specified, "// &
427 "therefore localization of unoccupied states will be skipped!")
440 IF (loc_print_explicit)
THEN
444 do_wannier_cubes = .false.
450 IF (((do_mo_cubes .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
451 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
453 CALL auxbas_pw_pool%create_pw(wf_r)
454 CALL auxbas_pw_pool%create_pw(wf_g)
457 IF (dft_control%restricted)
THEN
461 nspins = dft_control%nspins
464 IF (dft_control%restricted .AND. (do_mo_cubes .OR. p_loc_homo))
THEN
465 CALL cp_abort(__location__,
"Unclear how we define MOs / localization in the restricted case ... ")
470 cpwarn_if(do_mo_cubes,
"Print MO cubes not implemented for k-point calculations")
475 IF ((do_mo_cubes .AND. nhomo /= 0) .OR. do_stm)
THEN
477 IF (dft_control%do_admm)
THEN
479 CALL make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env=admm_env)
481 IF (dft_control%hairy_probes)
THEN
482 scf_control%smear%do_smear = .false.
483 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs, &
485 probe=dft_control%probe)
487 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
490 DO ispin = 1, dft_control%nspins
491 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
492 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
496 IF (do_mo_cubes .AND. nhomo /= 0)
THEN
499 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
500 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
501 CALL qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
502 mo_coeff, wf_g, wf_r, particles, homo, ispin)
513 cpwarn(
"Localization not implemented for k-point calculations!")
514 ELSEIF (dft_control%restricted &
517 cpabort(
"ROKS works only with LOCALIZE METHOD NONE or JACOBI")
519 ALLOCATE (occupied_orbs(dft_control%nspins))
520 ALLOCATE (occupied_evals(dft_control%nspins))
521 ALLOCATE (homo_localized(dft_control%nspins))
522 DO ispin = 1, dft_control%nspins
523 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
524 eigenvalues=mo_eigenvalues)
525 occupied_orbs(ispin) = mo_coeff
526 occupied_evals(ispin)%array => mo_eigenvalues
527 CALL cp_fm_create(homo_localized(ispin), occupied_orbs(ispin)%matrix_struct)
528 CALL cp_fm_to_fm(occupied_orbs(ispin), homo_localized(ispin))
531 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
534 ALLOCATE (qs_loc_env_homo)
537 CALL qs_loc_init(qs_env, qs_loc_env_homo, localize_section, homo_localized, do_homo, &
538 do_mo_cubes, mo_loc_history=mo_loc_history)
540 wf_r, wf_g, particles, occupied_orbs, occupied_evals, marked_states)
543 IF (qs_loc_env_homo%localized_wfn_control%use_history)
THEN
545 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
550 homo_localized, do_homo)
552 DEALLOCATE (occupied_orbs)
553 DEALLOCATE (occupied_evals)
555 IF (qs_loc_env_homo%do_localize)
THEN
556 CALL loc_dipole(input, dft_control, qs_loc_env_homo, logger, qs_env)
563 IF (do_mo_cubes .OR. p_loc_lumo)
THEN
565 cpwarn(
"Localization and MO related output not implemented for k-point calculations!")
568 compute_lumos = do_mo_cubes .AND. nlumo /= 0
569 compute_lumos = compute_lumos .OR. p_loc_lumo
571 DO ispin = 1, dft_control%nspins
572 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo)
573 compute_lumos = compute_lumos .AND. homo == nmo
576 IF (do_mo_cubes .AND. .NOT. compute_lumos)
THEN
579 DO ispin = 1, dft_control%nspins
581 CALL get_mo_set(mo_set=mos(ispin), homo=homo, nmo=nmo, eigenvalues=mo_eigenvalues)
582 IF (nlumo > nmo - homo)
THEN
585 IF (nlumo == -1)
THEN
588 IF (output_unit > 0)
WRITE (output_unit, *)
" "
589 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest eigenvalues of the unoccupied subspace spin ", ispin
590 IF (output_unit > 0)
WRITE (output_unit, *)
"---------------------------------------------"
591 IF (output_unit > 0)
WRITE (output_unit,
'(4(1X,1F16.8))') mo_eigenvalues(homo + 1:homo + nlumo)
594 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff)
595 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
596 mo_coeff, wf_g, wf_r, particles, nlumo, homo, ispin, lumo=homo + 1)
602 IF (compute_lumos)
THEN
605 IF (nlumo == 0) check_write = .false.
608 ALLOCATE (qs_loc_env_lumo)
611 min_lumos = max(maxval(qs_loc_env_lumo%localized_wfn_control%loc_states(:, :)), nlumo)
614 ALLOCATE (unoccupied_orbs(dft_control%nspins))
615 ALLOCATE (unoccupied_evals(dft_control%nspins))
616 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, min_lumos, nlumos)
617 lumo_ptr => unoccupied_orbs
618 DO ispin = 1, dft_control%nspins
620 homo_lumo(ispin, 2) = unoccupied_evals(ispin)%array(1)
622 IF (check_write)
THEN
623 IF (p_loc_lumo .AND. nlumo /= -1) nlumos = min(nlumo, nlumos)
625 CALL qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
626 unoccupied_orbs(ispin), wf_g, wf_r, particles, nlumos, homo, ispin)
631 ALLOCATE (lumo_localized(dft_control%nspins))
632 DO ispin = 1, dft_control%nspins
633 CALL cp_fm_create(lumo_localized(ispin), unoccupied_orbs(ispin)%matrix_struct)
634 CALL cp_fm_to_fm(unoccupied_orbs(ispin), lumo_localized(ispin))
636 CALL qs_loc_init(qs_env, qs_loc_env_lumo, localize_section, lumo_localized, do_homo, do_mo_cubes, &
637 evals=unoccupied_evals)
638 CALL qs_loc_env_init(qs_loc_env_lumo, qs_loc_env_lumo%localized_wfn_control, qs_env, &
639 loc_coeff=unoccupied_orbs)
641 lumo_localized, wf_r, wf_g, particles, &
642 unoccupied_orbs, unoccupied_evals, marked_states)
643 CALL loc_write_restart(qs_loc_env_lumo, loc_print_section, mos, homo_localized, do_homo, &
644 evals=unoccupied_evals)
645 lumo_ptr => lumo_localized
649 IF (has_homo .AND. has_lumo)
THEN
650 IF (output_unit > 0)
WRITE (output_unit, *)
" "
651 DO ispin = 1, dft_control%nspins
652 IF (.NOT. scf_control%smear%do_smear)
THEN
653 gap = homo_lumo(ispin, 2) - homo_lumo(ispin, 1)
654 IF (output_unit > 0)
WRITE (output_unit,
'(T2,A,F12.6)') &
655 "HOMO - LUMO gap [eV] :", gap*
evolt
661 IF (p_loc_mixed)
THEN
663 cpwarn(
"Localization not implemented for k-point calculations!")
664 ELSEIF (dft_control%restricted)
THEN
665 IF (output_unit > 0)
WRITE (output_unit, *) &
666 " Unclear how we define MOs / localization in the restricted case... skipping"
669 ALLOCATE (mixed_orbs(dft_control%nspins))
670 ALLOCATE (mixed_evals(dft_control%nspins))
671 ALLOCATE (mixed_localized(dft_control%nspins))
672 DO ispin = 1, dft_control%nspins
673 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
674 eigenvalues=mo_eigenvalues)
675 mixed_orbs(ispin) = mo_coeff
676 mixed_evals(ispin)%array => mo_eigenvalues
677 CALL cp_fm_create(mixed_localized(ispin), mixed_orbs(ispin)%matrix_struct)
678 CALL cp_fm_to_fm(mixed_orbs(ispin), mixed_localized(ispin))
681 CALL get_qs_env(qs_env, mo_loc_history=mo_loc_history)
684 total_zeff_corr = scf_env%sum_zeff_corr
685 ALLOCATE (qs_loc_env_mixed)
688 CALL qs_loc_init(qs_env, qs_loc_env_mixed, localize_section, mixed_localized, do_homo, &
689 do_mo_cubes, mo_loc_history=mo_loc_history, tot_zeff_corr=total_zeff_corr, &
692 DO ispin = 1, dft_control%nspins
693 CALL cp_fm_get_info(mixed_localized(ispin), ncol_global=nchk_nmoloc)
697 wf_r, wf_g, particles, mixed_orbs, mixed_evals, marked_states)
700 IF (qs_loc_env_mixed%localized_wfn_control%use_history)
THEN
702 CALL set_qs_env(qs_env, mo_loc_history=mo_loc_history)
709 DEALLOCATE (mixed_orbs)
710 DEALLOCATE (mixed_evals)
720 IF (((do_mo_cubes .OR. do_wannier_cubes) .AND. (nlumo /= 0 .OR. nhomo /= 0)) .OR. p_loc)
THEN
721 CALL auxbas_pw_pool%give_back_pw(wf_r)
722 CALL auxbas_pw_pool%give_back_pw(wf_g)
726 IF (.NOT. do_kpoints)
THEN
729 DEALLOCATE (qs_loc_env_homo)
733 DEALLOCATE (qs_loc_env_lumo)
735 IF (p_loc_mixed)
THEN
737 DEALLOCATE (qs_loc_env_mixed)
745 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env)
746 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, &
747 output_unit, unoccupied_orbs=lumo_ptr, scf_env=scf_env, &
748 matrix_s=matrix_s, marked_states=marked_states)
752 IF (
ASSOCIATED(marked_states))
THEN
753 DEALLOCATE (marked_states)
757 IF (.NOT. do_kpoints)
THEN
758 IF (compute_lumos)
THEN
759 DO ispin = 1, dft_control%nspins
760 DEALLOCATE (unoccupied_evals(ispin)%array)
763 DEALLOCATE (unoccupied_evals)
764 DEALLOCATE (unoccupied_orbs)
771 cpwarn(
"STM not implemented for k-point calculations!")
773 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
774 IF (nlumo_stm > 0)
THEN
775 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
776 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
777 CALL make_lumo_gpw(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
781 CALL th_stm_image(qs_env, stm_section, particles, unoccupied_orbs_stm, &
782 unoccupied_evals_stm)
784 IF (nlumo_stm > 0)
THEN
785 DO ispin = 1, dft_control%nspins
786 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
788 DEALLOCATE (unoccupied_evals_stm)
795 CALL qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
798 CALL qs_scf_post_efg(input, logger, qs_env)
801 CALL qs_scf_post_et(input, qs_env, dft_control)
804 CALL qs_scf_post_epr(input, logger, qs_env)
807 CALL qs_scf_post_molopt(input, logger, qs_env)
810 CALL qs_scf_post_elf(input, logger, qs_env)
817 DO ispin = 1, dft_control%nspins
818 CALL dbcsr_add(rho_ao(ispin, 1)%matrix, matrix_p_mp2(ispin)%matrix, 1.0_dp, -1.0_dp)
824 CALL timestop(handle)
837 SUBROUTINE make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
841 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_orbs
843 INTEGER,
INTENT(IN) :: nlumo
844 INTEGER,
INTENT(OUT) :: nlumos
846 CHARACTER(len=*),
PARAMETER :: routinen =
'make_lumo_gpw'
848 INTEGER :: handle, homo, ispin, n, nao, nmo, &
855 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
862 CALL timeset(routinen, handle)
864 NULLIFY (mos, ks_rmpv, scf_control, dft_control, admm_env, para_env, blacs_env)
868 scf_control=scf_control, &
869 dft_control=dft_control, &
878 DO ispin = 1, dft_control%nspins
879 NULLIFY (unoccupied_evals(ispin)%array)
881 IF (output_unit > 0)
WRITE (output_unit, *)
" "
882 IF (output_unit > 0)
WRITE (output_unit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
883 IF (output_unit > 0)
WRITE (output_unit, fmt=
'(1X,A)')
"-----------------------------------------------------"
884 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
886 nlumos = max(1, min(nlumo, nao - nmo))
887 IF (nlumo == -1) nlumos = nao - nmo
888 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
890 nrow_global=n, ncol_global=nlumos)
891 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
896 NULLIFY (local_preconditioner)
897 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
898 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
901 NULLIFY (local_preconditioner)
906 IF (dft_control%do_admm)
THEN
910 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
911 matrix_c_fm=unoccupied_orbs(ispin), &
912 matrix_orthogonal_space_fm=mo_coeff, &
913 eps_gradient=scf_control%eps_lumos, &
915 iter_max=scf_control%max_iter_lumos, &
916 size_ortho_space=nmo)
919 unoccupied_evals(ispin)%array, scr=output_unit, &
920 ionode=output_unit > 0)
923 IF (dft_control%do_admm)
THEN
929 CALL timestop(handle)
938 SUBROUTINE qs_scf_post_charges(input, logger, qs_env)
943 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_charges'
945 INTEGER :: handle, print_level, unit_nr
946 LOGICAL :: do_kpoints, print_it
949 CALL timeset(routinen, handle)
951 CALL get_qs_env(qs_env=qs_env, do_kpoints=do_kpoints)
959 log_filename=.false.)
962 IF (print_it) print_level = 2
964 IF (print_it) print_level = 3
966 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
979 unit_nr =
cp_print_key_unit_nr(logger, input,
"PROPERTIES%FIT_CHARGE", extension=
".Fitcharge", &
980 log_filename=.false.)
982 CALL get_ddapc(qs_env, .false., density_fit_section, iwc=unit_nr)
986 CALL timestop(handle)
988 END SUBROUTINE qs_scf_post_charges
1004 SUBROUTINE qs_scf_post_occ_cubes(input, dft_section, dft_control, logger, qs_env, &
1005 mo_coeff, wf_g, wf_r, particles, homo, ispin)
1014 INTEGER,
INTENT(IN) :: homo, ispin
1016 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_occ_cubes'
1018 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1019 INTEGER :: handle, i, ir, ivector, n_rep, nhomo, &
1021 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1022 LOGICAL :: append_cube, mpi_io
1027 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1029 CALL timeset(routinen, handle)
1031 NULLIFY (list_index)
1037 my_pos_cube =
"REWIND"
1038 IF (append_cube)
THEN
1039 my_pos_cube =
"APPEND"
1048 IF (
ASSOCIATED(
list))
THEN
1050 DO i = 1,
SIZE(
list)
1051 list_index(i + nlist) =
list(i)
1053 nlist = nlist +
SIZE(
list)
1058 IF (nhomo == -1) nhomo = homo
1059 nlist = homo - max(1, homo - nhomo + 1) + 1
1060 ALLOCATE (list_index(nlist))
1062 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1066 ivector = list_index(i)
1068 atomic_kind_set=atomic_kind_set, &
1069 qs_kind_set=qs_kind_set, &
1071 particle_set=particle_set, &
1074 cell, dft_control, particle_set, pw_env)
1075 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1078 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1080 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1081 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1083 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1087 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1090 CALL timestop(handle)
1092 END SUBROUTINE qs_scf_post_occ_cubes
1110 SUBROUTINE qs_scf_post_unocc_cubes(input, dft_section, dft_control, logger, qs_env, &
1111 unoccupied_orbs, wf_g, wf_r, particles, nlumos, homo, ispin, lumo)
1117 TYPE(
cp_fm_type),
INTENT(IN) :: unoccupied_orbs
1121 INTEGER,
INTENT(IN) :: nlumos, homo, ispin
1122 INTEGER,
INTENT(IN),
OPTIONAL :: lumo
1124 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_unocc_cubes'
1126 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1127 INTEGER :: handle, ifirst, index_mo, ivector, &
1129 LOGICAL :: append_cube, mpi_io
1134 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1136 CALL timeset(routinen, handle)
1140 NULLIFY (qs_kind_set, particle_set, pw_env, cell)
1142 my_pos_cube =
"REWIND"
1143 IF (append_cube)
THEN
1144 my_pos_cube =
"APPEND"
1147 IF (
PRESENT(lumo)) ifirst = lumo
1148 DO ivector = ifirst, ifirst + nlumos - 1
1150 atomic_kind_set=atomic_kind_set, &
1151 qs_kind_set=qs_kind_set, &
1153 particle_set=particle_set, &
1156 qs_kind_set, cell, dft_control, particle_set, pw_env)
1158 IF (ifirst == 1)
THEN
1159 index_mo = homo + ivector
1163 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", index_mo,
"_", ispin
1167 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1169 WRITE (title, *)
"WAVEFUNCTION ", index_mo,
" spin ", ispin,
" i.e. LUMO + ", ifirst + ivector - 2
1170 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1172 max_file_size_mb=
section_get_rval(dft_section,
"PRINT%MO_CUBES%MAX_FILE_SIZE_MB"), &
1178 CALL timestop(handle)
1180 END SUBROUTINE qs_scf_post_unocc_cubes
1193 INTEGER,
INTENT(IN) :: output_unit
1195 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_moments'
1197 CHARACTER(LEN=default_path_length) :: filename
1198 INTEGER :: handle, maxmom, reference, unit_nr
1199 LOGICAL :: com_nl, do_kpoints, magnetic, periodic, &
1200 second_ref_point, vel_reprs
1201 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
1204 CALL timeset(routinen, handle)
1207 subsection_name=
"DFT%PRINT%MOMENTS")
1212 keyword_name=
"DFT%PRINT%MOMENTS%MAX_MOMENT")
1214 keyword_name=
"DFT%PRINT%MOMENTS%PERIODIC")
1216 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE")
1218 keyword_name=
"DFT%PRINT%MOMENTS%MAGNETIC")
1220 keyword_name=
"DFT%PRINT%MOMENTS%VEL_REPRS")
1222 keyword_name=
"DFT%PRINT%MOMENTS%COM_NL")
1224 keyword_name=
"DFT%PRINT%MOMENTS%SECOND_REFERENCE_POINT")
1229 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1230 middle_name=
"moments", log_filename=.false.)
1232 IF (output_unit > 0)
THEN
1233 IF (unit_nr /= output_unit)
THEN
1234 INQUIRE (unit=unit_nr, name=filename)
1235 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1236 "MOMENTS",
"The electric/magnetic moments are written to file:", &
1239 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1243 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1245 IF (do_kpoints)
THEN
1246 cpwarn(
"Moments not implemented for k-point calculations!")
1251 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1256 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1258 IF (second_ref_point)
THEN
1260 keyword_name=
"DFT%PRINT%MOMENTS%REFERENCE_2")
1265 print_key_path=
"DFT%PRINT%MOMENTS", extension=
".dat", &
1266 middle_name=
"moments_refpoint_2", log_filename=.false.)
1268 IF (output_unit > 0)
THEN
1269 IF (unit_nr /= output_unit)
THEN
1270 INQUIRE (unit=unit_nr, name=filename)
1271 WRITE (unit=output_unit, fmt=
"(/,T2,A,2(/,T3,A),/)") &
1272 "MOMENTS",
"The electric/magnetic moments for the second reference point are written to file:", &
1275 WRITE (unit=output_unit, fmt=
"(/,T2,A)")
"ELECTRIC/MAGNETIC MOMENTS"
1278 IF (do_kpoints)
THEN
1279 cpwarn(
"Moments not implemented for k-point calculations!")
1284 CALL qs_moment_locop(qs_env, magnetic, maxmom, reference, ref_point, unit_nr, vel_reprs, com_nl)
1288 basis_section=input, print_key_path=
"DFT%PRINT%MOMENTS")
1293 CALL timestop(handle)
1305 SUBROUTINE qs_scf_post_xray(input, dft_section, logger, qs_env, output_unit)
1310 INTEGER,
INTENT(IN) :: output_unit
1312 CHARACTER(LEN=*),
PARAMETER :: routinen =
'qs_scf_post_xray'
1314 CHARACTER(LEN=default_path_length) :: filename
1315 INTEGER :: handle, unit_nr
1316 REAL(kind=
dp) :: q_max
1319 CALL timeset(routinen, handle)
1322 subsection_name=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1326 keyword_name=
"PRINT%XRAY_DIFFRACTION_SPECTRUM%Q_MAX")
1328 basis_section=input, &
1329 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM", &
1331 middle_name=
"xrd", &
1332 log_filename=.false.)
1333 IF (output_unit > 0)
THEN
1334 INQUIRE (unit=unit_nr, name=filename)
1335 WRITE (unit=output_unit, fmt=
"(/,/,T2,A)") &
1336 "X-RAY DIFFRACTION SPECTRUM"
1337 IF (unit_nr /= output_unit)
THEN
1338 WRITE (unit=output_unit, fmt=
"(/,T3,A,/,/,T3,A,/)") &
1339 "The coherent X-ray diffraction spectrum is written to the file:", &
1344 unit_number=unit_nr, &
1348 basis_section=input, &
1349 print_key_path=
"DFT%PRINT%XRAY_DIFFRACTION_SPECTRUM")
1352 CALL timestop(handle)
1354 END SUBROUTINE qs_scf_post_xray
1362 SUBROUTINE qs_scf_post_efg(input, logger, qs_env)
1367 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_efg'
1372 CALL timeset(routinen, handle)
1375 subsection_name=
"DFT%PRINT%ELECTRIC_FIELD_GRADIENT")
1381 CALL timestop(handle)
1383 END SUBROUTINE qs_scf_post_efg
1391 SUBROUTINE qs_scf_post_et(input, qs_env, dft_control)
1396 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_et'
1398 INTEGER :: handle, ispin
1400 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: my_mos
1403 CALL timeset(routinen, handle)
1409 IF (qs_env%et_coupling%first_run)
THEN
1411 ALLOCATE (my_mos(dft_control%nspins))
1412 ALLOCATE (qs_env%et_coupling%et_mo_coeff(dft_control%nspins))
1413 DO ispin = 1, dft_control%nspins
1415 matrix_struct=qs_env%mos(ispin)%mo_coeff%matrix_struct, &
1416 name=
"FIRST_RUN_COEFF"//trim(adjustl(
cp_to_string(ispin)))//
"MATRIX")
1425 CALL timestop(handle)
1427 END SUBROUTINE qs_scf_post_et
1438 SUBROUTINE qs_scf_post_elf(input, logger, qs_env)
1443 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_elf'
1445 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1447 INTEGER :: handle, ispin, output_unit, unit_nr
1448 LOGICAL :: append_cube, gapw, mpi_io
1449 REAL(
dp) :: rho_cutoff
1459 CALL timeset(routinen, handle)
1466 NULLIFY (dft_control, pw_env, auxbas_pw_pool, pw_pools, particles, subsys)
1467 CALL get_qs_env(qs_env, dft_control=dft_control, pw_env=pw_env, subsys=subsys)
1470 gapw = dft_control%qs_control%gapw
1471 IF (.NOT. gapw)
THEN
1473 ALLOCATE (elf_r(dft_control%nspins))
1474 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1476 DO ispin = 1, dft_control%nspins
1477 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1481 IF (output_unit > 0)
THEN
1482 WRITE (unit=output_unit, fmt=
"(/,T15,A,/)") &
1483 " ----- ELF is computed on the real space grid -----"
1490 my_pos_cube =
"REWIND"
1491 IF (append_cube)
THEN
1492 my_pos_cube =
"APPEND"
1495 DO ispin = 1, dft_control%nspins
1496 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1497 WRITE (title, *)
"ELF spin ", ispin
1500 middle_name=trim(filename), file_position=my_pos_cube, log_filename=.false., &
1501 mpi_io=mpi_io, fout=mpi_filename)
1502 IF (output_unit > 0)
THEN
1503 IF (.NOT. mpi_io)
THEN
1504 INQUIRE (unit=unit_nr, name=filename)
1506 filename = mpi_filename
1508 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
1509 "ELF is written in cube file format to the file:", &
1513 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, &
1517 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1525 cpwarn(
"ELF not implemented for GAPW calculations!")
1530 CALL timestop(handle)
1532 END SUBROUTINE qs_scf_post_elf
1544 SUBROUTINE qs_scf_post_molopt(input, logger, qs_env)
1549 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_molopt'
1551 INTEGER :: handle, nao, unit_nr
1552 REAL(kind=
dp) :: s_cond_number
1553 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues
1562 CALL timeset(routinen, handle)
1565 subsection_name=
"DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
1569 CALL get_qs_env(qs_env, energy=energy, matrix_s=matrix_s, mos=mos)
1572 CALL get_mo_set(mo_set=mos(1), mo_coeff=mo_coeff, nao=nao)
1574 nrow_global=nao, ncol_global=nao, &
1575 template_fmstruct=mo_coeff%matrix_struct)
1576 CALL cp_fm_create(fm_s, matrix_struct=ao_ao_fmstruct, &
1578 CALL cp_fm_create(fm_work, matrix_struct=ao_ao_fmstruct, &
1581 ALLOCATE (eigenvalues(nao))
1589 s_cond_number = maxval(abs(eigenvalues))/max(minval(abs(eigenvalues)), epsilon(0.0_dp))
1592 extension=
".molopt")
1594 IF (unit_nr > 0)
THEN
1597 WRITE (unit_nr,
'(T2,A28,2A25)')
"",
"Tot. Ener.",
"S Cond. Numb."
1598 WRITE (unit_nr,
'(T2,A28,2E25.17)')
"BASIS_MOLOPT_QUANTITIES", energy%total, s_cond_number
1602 "DFT%PRINT%BASIS_MOLOPT_QUANTITIES")
1606 CALL timestop(handle)
1608 END SUBROUTINE qs_scf_post_molopt
1616 SUBROUTINE qs_scf_post_epr(input, logger, qs_env)
1621 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_epr'
1626 CALL timeset(routinen, handle)
1629 subsection_name=
"DFT%PRINT%HYPERFINE_COUPLING_TENSOR")
1635 CALL timestop(handle)
1637 END SUBROUTINE qs_scf_post_epr
1646 SUBROUTINE write_available_results(qs_env, scf_env)
1650 CHARACTER(len=*),
PARAMETER :: routinen =
'write_available_results'
1654 CALL timeset(routinen, handle)
1662 CALL timestop(handle)
1664 END SUBROUTINE write_available_results
1677 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_dependent_results'
1679 INTEGER :: handle, homo, ispin, nmo, output_unit
1680 LOGICAL :: all_equal, do_kpoints, explicit
1681 REAL(kind=
dp) :: maxocc, s_square, s_square_ideal, &
1682 total_abs_spin_dens, total_spin_dens
1683 REAL(kind=
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues, occupation_numbers
1689 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
1702 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1711 CALL timeset(routinen, handle)
1713 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, mo_coeff, &
1714 mo_coeff_deriv, mo_eigenvalues, mos, atomic_kind_set, qs_kind_set, &
1715 particle_set, rho, ks_rmpv, matrix_s, scf_control, dft_section, &
1716 molecule_set, input, particles, subsys, rho_r)
1721 cpassert(
ASSOCIATED(qs_env))
1723 dft_control=dft_control, &
1724 molecule_set=molecule_set, &
1725 atomic_kind_set=atomic_kind_set, &
1726 particle_set=particle_set, &
1727 qs_kind_set=qs_kind_set, &
1728 admm_env=admm_env, &
1729 scf_control=scf_control, &
1738 CALL get_qs_env(qs_env, do_kpoints=do_kpoints)
1742 IF (.NOT. qs_env%run_rtp)
THEN
1749 IF (.NOT. do_kpoints)
THEN
1750 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
1756 dft_section,
"PRINT%CHARGEMOL"), &
1765 IF (do_kpoints)
THEN
1776 IF (do_kpoints)
THEN
1777 cpwarn(
"Projected density of states (pDOS) is not implemented for k points")
1782 DO ispin = 1, dft_control%nspins
1784 IF (dft_control%do_admm)
THEN
1787 IF (
PRESENT(scf_env))
THEN
1789 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1790 eigenvalues=mo_eigenvalues)
1791 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
1792 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
1794 mo_coeff_deriv => null()
1797 do_rotation=.true., &
1798 co_rotate_dbcsr=mo_coeff_deriv)
1802 IF (dft_control%nspins == 2)
THEN
1804 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
1807 qs_kind_set, particle_set, qs_env, dft_section)
1810 IF (dft_control%do_admm)
THEN
1819 IF (dft_control%nspins == 2)
THEN
1821 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1822 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1824 CALL auxbas_pw_pool%create_pw(wf_r)
1826 CALL pw_axpy(rho_r(2), wf_r, alpha=-1._dp)
1828 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(/,(T3,A,T61,F20.10))') &
1829 "Integrated spin density: ", total_spin_dens
1831 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'((T3,A,T61,F20.10))') &
1832 "Integrated absolute spin density: ", total_abs_spin_dens
1833 CALL auxbas_pw_pool%give_back_pw(wf_r)
1839 IF (do_kpoints)
THEN
1840 cpwarn(
"Spin contamination estimate not implemented for k-points.")
1843 DO ispin = 1, dft_control%nspins
1845 occupation_numbers=occupation_numbers, &
1850 all_equal = all_equal .AND. &
1851 (all(occupation_numbers(1:homo) == maxocc) .AND. &
1852 all(occupation_numbers(homo + 1:nmo) == 0.0_dp))
1855 IF (.NOT. all_equal)
THEN
1856 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
"(T3,A)") &
1857 "WARNING: S**2 computation does not yet treat fractional occupied orbitals"
1860 matrix_s=matrix_s, &
1863 s_square_ideal=s_square_ideal)
1864 IF (output_unit > 0)
WRITE (unit=output_unit, fmt=
'(T3,A,T51,2F15.6)') &
1865 "Ideal and single determinant S**2 : ", s_square_ideal, s_square
1866 energy%s_square = s_square
1871 CALL timestop(handle)
1883 CHARACTER(len=*),
PARAMETER :: routinen =
'write_mo_free_results'
1884 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
1886 CHARACTER(LEN=2) :: element_symbol
1887 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1889 CHARACTER(LEN=default_string_length) :: name, print_density
1890 INTEGER :: after, handle, i, iat, iatom, id, ikind, img, iso, ispin, iw, l, n_rep_hf, nat, &
1891 natom, nd(3), ngto, niso, nkind, np, nr, output_unit, print_level, should_print_bqb, &
1892 should_print_voro, unit_nr, unit_nr_voro
1893 LOGICAL :: append_cube, append_voro, do_hfx, do_kpoints, mpi_io, omit_headers, print_it, &
1894 rho_r_valid, voro_print_txt, write_ks, write_xc, xrd_interface
1896 rho_total, rho_total_rspace, udvol, &
1898 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: zcharge
1899 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: bfun
1900 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: aedens, ccdens, ppdens
1901 REAL(kind=
dp),
DIMENSION(3) :: dr
1902 REAL(kind=
dp),
DIMENSION(:),
POINTER :: my_q0
1908 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ks_rmpv, matrix_vxc, rho_ao
1916 TYPE(
pw_c1d_gs_type),
POINTER :: rho0_s_gs, rho_core, rhoz_cneo_s_gs
1923 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1931 print_key, print_key_bqb, &
1932 print_key_voro, xc_section
1934 CALL timeset(routinen, handle)
1935 NULLIFY (cell, dft_control, pw_env, auxbas_pw_pool, pw_pools, hfx_section, &
1936 atomic_kind_set, qs_kind_set, particle_set, rho, ks_rmpv, rho_ao, rho_r, &
1937 dft_section, xc_section, input, particles, subsys, matrix_vxc, v_hartree_rspace, &
1943 cpassert(
ASSOCIATED(qs_env))
1945 atomic_kind_set=atomic_kind_set, &
1946 qs_kind_set=qs_kind_set, &
1947 particle_set=particle_set, &
1949 para_env=para_env, &
1950 dft_control=dft_control, &
1952 do_kpoints=do_kpoints, &
1960 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
1961 ALLOCATE (zcharge(natom))
1966 iat = atomic_kind_set(ikind)%atom_list(iatom)
1973 "DFT%PRINT%TOT_DENSITY_CUBE"),
cp_p_file))
THEN
1974 NULLIFY (rho_core, rho0_s_gs, rhoz_cneo_s_gs)
1976 my_pos_cube =
"REWIND"
1977 IF (append_cube)
THEN
1978 my_pos_cube =
"APPEND"
1981 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho_core=rho_core, &
1982 rho0_s_gs=rho0_s_gs, rhoz_cneo_s_gs=rhoz_cneo_s_gs)
1983 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
1985 CALL auxbas_pw_pool%create_pw(wf_r)
1986 IF (dft_control%qs_control%gapw)
THEN
1987 IF (dft_control%qs_control%gapw_control%nopaw_as_gpw)
THEN
1988 CALL pw_axpy(rho_core, rho0_s_gs)
1989 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
1990 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
1993 CALL pw_axpy(rho_core, rho0_s_gs, -1.0_dp)
1994 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
1995 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
1998 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
1999 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs)
2002 IF (
ASSOCIATED(rhoz_cneo_s_gs))
THEN
2003 CALL pw_axpy(rhoz_cneo_s_gs, rho0_s_gs, -1.0_dp)
2009 DO ispin = 1, dft_control%nspins
2010 CALL pw_axpy(rho_r(ispin), wf_r)
2012 filename =
"TOTAL_DENSITY"
2015 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
2016 log_filename=.false., mpi_io=mpi_io)
2018 particles=particles, zeff=zcharge, &
2019 stride=
section_get_ivals(dft_section,
"PRINT%TOT_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2021 "DFT%PRINT%TOT_DENSITY_CUBE", mpi_io=mpi_io)
2022 CALL auxbas_pw_pool%give_back_pw(wf_r)
2027 "DFT%PRINT%E_DENSITY_CUBE"),
cp_p_file))
THEN
2029 keyword_name=
"PRINT%E_DENSITY_CUBE%DENSITY_INCLUDE", &
2030 c_val=print_density)
2031 print_density = trim(print_density)
2033 my_pos_cube =
"REWIND"
2034 IF (append_cube)
THEN
2035 my_pos_cube =
"APPEND"
2039 xrd_interface =
section_get_lval(input,
"DFT%PRINT%E_DENSITY_CUBE%XRD_INTERFACE")
2040 IF (xrd_interface)
THEN
2042 IF (dft_control%qs_control%gapw) print_density =
"SOFT_DENSITY"
2044 filename =
"ELECTRON_DENSITY"
2046 extension=
".xrd", middle_name=trim(filename), &
2047 file_position=my_pos_cube, log_filename=.false.)
2049 IF (output_unit > 0)
THEN
2050 INQUIRE (unit=unit_nr, name=filename)
2051 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2052 "The electron density (atomic part) is written to the file:", &
2057 nkind =
SIZE(atomic_kind_set)
2058 IF (unit_nr > 0)
THEN
2059 WRITE (unit_nr, *)
"Atomic (core) densities"
2060 WRITE (unit_nr, *)
"Unit cell"
2061 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(1, 1), cell%hmat(1, 2), cell%hmat(1, 3)
2062 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(2, 1), cell%hmat(2, 2), cell%hmat(2, 3)
2063 WRITE (unit_nr, fmt=
"(3F20.12)") cell%hmat(3, 1), cell%hmat(3, 2), cell%hmat(3, 3)
2064 WRITE (unit_nr, *)
"Atomic types"
2065 WRITE (unit_nr, *) nkind
2068 ALLOCATE (ppdens(ngto, 2, nkind), aedens(ngto, 2, nkind), ccdens(ngto, 2, nkind))
2070 atomic_kind => atomic_kind_set(ikind)
2071 qs_kind => qs_kind_set(ikind)
2072 CALL get_atomic_kind(atomic_kind, name=name, element_symbol=element_symbol)
2074 iunit=output_unit, confine=.true.)
2076 iunit=output_unit, allelectron=.true., confine=.true.)
2077 ccdens(:, 1, ikind) = aedens(:, 1, ikind)
2078 ccdens(:, 2, ikind) = 0._dp
2079 CALL project_function_a(ccdens(1:ngto, 2, ikind), ccdens(1:ngto, 1, ikind), &
2080 ppdens(1:ngto, 2, ikind), ppdens(1:ngto, 1, ikind), 0)
2081 ccdens(:, 2, ikind) = aedens(:, 2, ikind) - ccdens(:, 2, ikind)
2082 IF (unit_nr > 0)
THEN
2083 WRITE (unit_nr, fmt=
"(I6,A10,A20)") ikind, trim(element_symbol), trim(name)
2084 WRITE (unit_nr, fmt=
"(I6)") ngto
2085 WRITE (unit_nr, *)
" Total density"
2086 WRITE (unit_nr, fmt=
"(2G24.12)") (aedens(i, 1, ikind), aedens(i, 2, ikind), i=1, ngto)
2087 WRITE (unit_nr, *)
" Core density"
2088 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2090 NULLIFY (atomic_kind)
2093 IF (dft_control%qs_control%gapw)
THEN
2094 CALL get_qs_env(qs_env=qs_env, rho_atom_set=rho_atom_set)
2096 IF (unit_nr > 0)
THEN
2097 WRITE (unit_nr, *)
"Coordinates and GAPW density"
2099 np = particles%n_els
2101 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2102 CALL get_qs_kind(qs_kind_set(ikind), grid_atom=grid_atom)
2103 rho_atom => rho_atom_set(iat)
2104 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2105 nr =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 1)
2106 niso =
SIZE(rho_atom%rho_rad_h(1)%r_coef, 2)
2111 CALL para_env%sum(nr)
2112 CALL para_env%sum(niso)
2114 ALLOCATE (bfun(nr, niso))
2116 DO ispin = 1, dft_control%nspins
2117 IF (
ASSOCIATED(rho_atom%rho_rad_h(1)%r_coef))
THEN
2118 bfun(:, :) = bfun + rho_atom%rho_rad_h(ispin)%r_coef - rho_atom%rho_rad_s(ispin)%r_coef
2121 CALL para_env%sum(bfun)
2122 ccdens(:, 1, ikind) = ppdens(:, 1, ikind)
2123 ccdens(:, 2, ikind) = 0._dp
2124 IF (unit_nr > 0)
THEN
2125 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2129 CALL project_function_b(ccdens(:, 2, ikind), ccdens(:, 1, ikind), bfun(:, iso), grid_atom, l)
2130 IF (unit_nr > 0)
THEN
2131 WRITE (unit_nr, fmt=
"(3I6)") iso, l, ngto
2132 WRITE (unit_nr, fmt=
"(2G24.12)") (ccdens(i, 1, ikind), ccdens(i, 2, ikind), i=1, ngto)
2138 IF (unit_nr > 0)
THEN
2139 WRITE (unit_nr, *)
"Coordinates"
2140 np = particles%n_els
2142 CALL get_atomic_kind(particles%els(iat)%atomic_kind, kind_number=ikind)
2143 WRITE (unit_nr,
'(I10,I5,3f12.6)') iat, ikind, particles%els(iat)%r
2148 DEALLOCATE (ppdens, aedens, ccdens)
2151 "DFT%PRINT%E_DENSITY_CUBE")
2154 IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_DENSITY")
THEN
2156 cpassert(.NOT. do_kpoints)
2161 auxbas_pw_pool=auxbas_pw_pool, &
2163 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2165 CALL auxbas_pw_pool%create_pw(pw=rho_elec_gspace)
2170 q_max = sqrt(sum((
pi/dr(:))**2))
2172 auxbas_pw_pool=auxbas_pw_pool, &
2173 rhotot_elec_gspace=rho_elec_gspace, &
2175 rho_hard=rho_hard, &
2177 rho_total = rho_hard + rho_soft
2182 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2184 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2186 filename =
"TOTAL_ELECTRON_DENSITY"
2189 extension=
".cube", middle_name=trim(filename), &
2190 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2192 IF (output_unit > 0)
THEN
2193 IF (.NOT. mpi_io)
THEN
2194 INQUIRE (unit=unit_nr, name=filename)
2196 filename = mpi_filename
2198 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2199 "The total electron density is written in cube file format to the file:", &
2201 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2202 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2203 "Soft electronic charge (G-space) :", rho_soft, &
2204 "Hard electronic charge (G-space) :", rho_hard, &
2205 "Total electronic charge (G-space):", rho_total, &
2206 "Total electronic charge (R-space):", rho_total_rspace
2208 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"TOTAL ELECTRON DENSITY", &
2209 particles=particles, zeff=zcharge, &
2210 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2212 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2214 IF (dft_control%nspins > 1)
THEN
2218 auxbas_pw_pool=auxbas_pw_pool, &
2219 rhotot_elec_gspace=rho_elec_gspace, &
2221 rho_hard=rho_hard, &
2222 rho_soft=rho_soft, &
2224 rho_total = rho_hard + rho_soft
2228 CALL pw_scale(rho_elec_gspace, 1.0_dp/volume)
2230 CALL pw_transfer(rho_elec_gspace, rho_elec_rspace)
2232 filename =
"TOTAL_SPIN_DENSITY"
2235 extension=
".cube", middle_name=trim(filename), &
2236 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2238 IF (output_unit > 0)
THEN
2239 IF (.NOT. mpi_io)
THEN
2240 INQUIRE (unit=unit_nr, name=filename)
2242 filename = mpi_filename
2244 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2245 "The total spin density is written in cube file format to the file:", &
2247 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2248 "q(max) [1/Angstrom] :", q_max/
angstrom, &
2249 "Soft part of the spin density (G-space):", rho_soft, &
2250 "Hard part of the spin density (G-space):", rho_hard, &
2251 "Total spin density (G-space) :", rho_total, &
2252 "Total spin density (R-space) :", rho_total_rspace
2254 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"TOTAL SPIN DENSITY", &
2255 particles=particles, zeff=zcharge, &
2256 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2258 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2260 CALL auxbas_pw_pool%give_back_pw(rho_elec_gspace)
2261 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2263 ELSE IF (print_density ==
"SOFT_DENSITY" .OR. .NOT. dft_control%qs_control%gapw)
THEN
2264 IF (dft_control%nspins > 1)
THEN
2268 auxbas_pw_pool=auxbas_pw_pool, &
2270 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
2271 CALL pw_copy(rho_r(1), rho_elec_rspace)
2272 CALL pw_axpy(rho_r(2), rho_elec_rspace)
2273 filename =
"ELECTRON_DENSITY"
2276 extension=
".cube", middle_name=trim(filename), &
2277 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2279 IF (output_unit > 0)
THEN
2280 IF (.NOT. mpi_io)
THEN
2281 INQUIRE (unit=unit_nr, name=filename)
2283 filename = mpi_filename
2285 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2286 "The sum of alpha and beta density is written in cube file format to the file:", &
2289 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
2290 particles=particles, zeff=zcharge, &
2294 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2295 CALL pw_copy(rho_r(1), rho_elec_rspace)
2296 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2297 filename =
"SPIN_DENSITY"
2300 extension=
".cube", middle_name=trim(filename), &
2301 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2303 IF (output_unit > 0)
THEN
2304 IF (.NOT. mpi_io)
THEN
2305 INQUIRE (unit=unit_nr, name=filename)
2307 filename = mpi_filename
2309 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2310 "The spin density is written in cube file format to the file:", &
2313 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2314 particles=particles, zeff=zcharge, &
2315 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2317 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2318 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2320 filename =
"ELECTRON_DENSITY"
2323 extension=
".cube", middle_name=trim(filename), &
2324 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2326 IF (output_unit > 0)
THEN
2327 IF (.NOT. mpi_io)
THEN
2328 INQUIRE (unit=unit_nr, name=filename)
2330 filename = mpi_filename
2332 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2333 "The electron density is written in cube file format to the file:", &
2337 particles=particles, zeff=zcharge, &
2338 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2340 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2343 ELSE IF (dft_control%qs_control%gapw .AND. print_density ==
"TOTAL_HARD_APPROX")
THEN
2344 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, rho0_mpole=rho0_mpole, natom=natom)
2345 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
2346 CALL auxbas_pw_pool%create_pw(rho_elec_rspace)
2349 ALLOCATE (my_q0(natom))
2357 my_q0(iat) = sum(rho0_mpole%mp_rho(iat)%Q0(1:dft_control%nspins))*
norm_factor
2361 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2365 DO ispin = 1, dft_control%nspins
2366 CALL pw_axpy(rho_r(ispin), rho_elec_rspace)
2370 rho_total_rspace = rho_soft + rho_hard
2372 filename =
"ELECTRON_DENSITY"
2375 extension=
".cube", middle_name=trim(filename), &
2376 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2378 IF (output_unit > 0)
THEN
2379 IF (.NOT. mpi_io)
THEN
2380 INQUIRE (unit=unit_nr, name=filename)
2382 filename = mpi_filename
2384 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2385 "The electron density is written in cube file format to the file:", &
2387 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2388 "Soft electronic charge (R-space) :", rho_soft, &
2389 "Hard electronic charge (R-space) :", rho_hard, &
2390 "Total electronic charge (R-space):", rho_total_rspace
2392 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"ELECTRON DENSITY", &
2393 particles=particles, zeff=zcharge, &
2397 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2400 IF (dft_control%nspins > 1)
THEN
2402 my_q0(iat) = (rho0_mpole%mp_rho(iat)%Q0(1) - rho0_mpole%mp_rho(iat)%Q0(2))*
norm_factor
2405 CALL calculate_rho_resp_all(rho_elec_rspace, coeff=my_q0, natom=natom, eta=rho0_mpole%zet0_h, qs_env=qs_env)
2408 CALL pw_axpy(rho_r(1), rho_elec_rspace)
2409 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
2413 rho_total_rspace = rho_soft + rho_hard
2415 filename =
"SPIN_DENSITY"
2418 extension=
".cube", middle_name=trim(filename), &
2419 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
2421 IF (output_unit > 0)
THEN
2422 IF (.NOT. mpi_io)
THEN
2423 INQUIRE (unit=unit_nr, name=filename)
2425 filename = mpi_filename
2427 WRITE (unit=output_unit, fmt=
"(/,T2,A,/,/,T2,A)") &
2428 "The spin density is written in cube file format to the file:", &
2430 WRITE (unit=output_unit, fmt=
"(/,(T2,A,F20.10))") &
2431 "Soft part of the spin density :", rho_soft, &
2432 "Hard part of the spin density :", rho_hard, &
2433 "Total spin density (R-space) :", rho_total_rspace
2435 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
2436 particles=particles, zeff=zcharge, &
2437 stride=
section_get_ivals(dft_section,
"PRINT%E_DENSITY_CUBE%STRIDE"), mpi_io=mpi_io)
2439 "DFT%PRINT%E_DENSITY_CUBE", mpi_io=mpi_io)
2441 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
2447 dft_section,
"PRINT%ENERGY_WINDOWS"),
cp_p_file) .AND. .NOT. do_kpoints)
THEN
2453 "DFT%PRINT%V_HARTREE_CUBE"),
cp_p_file))
THEN
2457 v_hartree_rspace=v_hartree_rspace)
2458 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2459 CALL auxbas_pw_pool%create_pw(aux_r)
2462 my_pos_cube =
"REWIND"
2463 IF (append_cube)
THEN
2464 my_pos_cube =
"APPEND"
2467 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2470 extension=
".cube", middle_name=
"v_hartree", file_position=my_pos_cube, mpi_io=mpi_io)
2471 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2473 CALL pw_copy(v_hartree_rspace, aux_r)
2476 CALL cp_pw_to_cube(aux_r, unit_nr,
"HARTREE POTENTIAL", particles=particles, zeff=zcharge, &
2478 "PRINT%V_HARTREE_CUBE%STRIDE"), mpi_io=mpi_io)
2480 "DFT%PRINT%V_HARTREE_CUBE", mpi_io=mpi_io)
2482 CALL auxbas_pw_pool%give_back_pw(aux_r)
2487 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE"),
cp_p_file))
THEN
2488 IF (dft_control%apply_external_potential)
THEN
2489 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, vee=vee)
2490 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2491 CALL auxbas_pw_pool%create_pw(aux_r)
2493 append_cube =
section_get_lval(input,
"DFT%PRINT%EXTERNAL_POTENTIAL_CUBE%APPEND")
2494 my_pos_cube =
"REWIND"
2495 IF (append_cube)
THEN
2496 my_pos_cube =
"APPEND"
2501 extension=
".cube", middle_name=
"ext_pot", file_position=my_pos_cube, mpi_io=mpi_io)
2505 CALL cp_pw_to_cube(aux_r, unit_nr,
"EXTERNAL POTENTIAL", particles=particles, zeff=zcharge, &
2507 "PRINT%EXTERNAL_POTENTIAL_CUBE%STRIDE"), mpi_io=mpi_io)
2509 "DFT%PRINT%EXTERNAL_POTENTIAL_CUBE", mpi_io=mpi_io)
2511 CALL auxbas_pw_pool%give_back_pw(aux_r)
2517 "DFT%PRINT%EFIELD_CUBE"),
cp_p_file))
THEN
2519 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
2520 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
2521 CALL auxbas_pw_pool%create_pw(aux_r)
2522 CALL auxbas_pw_pool%create_pw(aux_g)
2525 my_pos_cube =
"REWIND"
2526 IF (append_cube)
THEN
2527 my_pos_cube =
"APPEND"
2529 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, &
2530 v_hartree_rspace=v_hartree_rspace)
2532 udvol = 1.0_dp/v_hartree_rspace%pw_grid%dvol
2536 extension=
".cube", middle_name=
"efield_"//cdir(id), file_position=my_pos_cube, &
2547 unit_nr,
"ELECTRIC FIELD", particles=particles, zeff=zcharge, &
2549 "PRINT%EFIELD_CUBE%STRIDE"), mpi_io=mpi_io)
2551 "DFT%PRINT%EFIELD_CUBE", mpi_io=mpi_io)
2554 CALL auxbas_pw_pool%give_back_pw(aux_r)
2555 CALL auxbas_pw_pool%give_back_pw(aux_g)
2559 CALL qs_scf_post_local_energy(input, logger, qs_env)
2562 CALL qs_scf_post_local_stress(input, logger, qs_env)
2565 CALL qs_scf_post_ps_implicit(input, logger, qs_env)
2573 "DFT%PRINT%AO_MATRICES/DENSITY"),
cp_p_file))
THEN
2578 after = min(max(after, 1), 16)
2579 DO ispin = 1, dft_control%nspins
2580 DO img = 1, dft_control%nimages
2582 para_env, output_unit=iw, omit_headers=omit_headers)
2586 "DFT%PRINT%AO_MATRICES/DENSITY")
2591 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file)
2593 "DFT%PRINT%AO_MATRICES/MATRIX_VXC"),
cp_p_file)
2595 IF (write_ks .OR. write_xc)
THEN
2596 IF (write_xc) qs_env%requires_matrix_vxc = .true.
2599 just_energy=.false.)
2600 IF (write_xc) qs_env%requires_matrix_vxc = .false.
2607 CALL get_qs_env(qs_env=qs_env, matrix_ks_kp=ks_rmpv)
2609 after = min(max(after, 1), 16)
2610 DO ispin = 1, dft_control%nspins
2611 DO img = 1, dft_control%nimages
2613 para_env, output_unit=iw, omit_headers=omit_headers)
2617 "DFT%PRINT%AO_MATRICES/KOHN_SHAM_MATRIX")
2622 IF (.NOT. dft_control%qs_control%pao)
THEN
2630 CALL write_adjacency_matrix(qs_env, input)
2634 CALL get_qs_env(qs_env=qs_env, matrix_vxc_kp=matrix_vxc)
2635 cpassert(
ASSOCIATED(matrix_vxc))
2639 after = min(max(after, 1), 16)
2640 DO ispin = 1, dft_control%nspins
2641 DO img = 1, dft_control%nimages
2643 para_env, output_unit=iw, omit_headers=omit_headers)
2647 "DFT%PRINT%AO_MATRICES/MATRIX_VXC")
2652 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR"),
cp_p_file))
THEN
2658 after = min(max(after, 1), 16)
2661 para_env, output_unit=iw, omit_headers=omit_headers)
2665 "DFT%PRINT%AO_MATRICES/COMMUTATOR_HR")
2671 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MULLIKEN", extension=
".mulliken", log_filename=.false.)
2674 IF (print_it) print_level = 2
2676 IF (print_it) print_level = 3
2687 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
2688 IF (rho_r_valid)
THEN
2689 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%HIRSHFELD", extension=
".hirshfeld", log_filename=.false.)
2690 CALL hirshfeld_charges(qs_env, print_key, unit_nr)
2698 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%EEQ_CHARGES", extension=
".eeq", log_filename=.false.)
2700 CALL eeq_print(qs_env, unit_nr, print_level, ext=.false.)
2708 should_print_voro = 1
2710 should_print_voro = 0
2713 should_print_bqb = 1
2715 should_print_bqb = 0
2717 IF ((should_print_voro /= 0) .OR. (should_print_bqb /= 0))
THEN
2722 CALL qs_rho_get(rho, rho_r_valid=rho_r_valid)
2723 IF (rho_r_valid)
THEN
2725 IF (dft_control%nspins > 1)
THEN
2729 auxbas_pw_pool=auxbas_pw_pool, &
2733 CALL auxbas_pw_pool%create_pw(pw=mb_rho)
2734 CALL pw_copy(rho_r(1), mb_rho)
2735 CALL pw_axpy(rho_r(2), mb_rho)
2742 IF (should_print_voro /= 0)
THEN
2744 IF (voro_print_txt)
THEN
2746 my_pos_voro =
"REWIND"
2747 IF (append_voro)
THEN
2748 my_pos_voro =
"APPEND"
2750 unit_nr_voro =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%VORONOI", extension=
".voronoi", &
2751 file_position=my_pos_voro, log_filename=.false.)
2759 CALL entry_voronoi_or_bqb(should_print_voro, should_print_bqb, print_key_voro, print_key_bqb, &
2760 unit_nr_voro, qs_env, mb_rho)
2762 IF (dft_control%nspins > 1)
THEN
2763 CALL auxbas_pw_pool%give_back_pw(mb_rho)
2767 IF (unit_nr_voro > 0)
THEN
2777 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MAO_ANALYSIS", extension=
".mao", log_filename=.false.)
2785 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%MINBAS_ANALYSIS", extension=
".mao", log_filename=.false.)
2793 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IAO_ANALYSIS", extension=
".iao", log_filename=.false.)
2795 IF (iao_env%do_iao)
THEN
2805 extension=
".mao", log_filename=.false.)
2816 IF (qs_env%x_data(i, 1)%do_hfx_ri)
CALL print_ri_hfx(qs_env%x_data(i, 1)%ri_data, qs_env)
2820 DEALLOCATE (zcharge)
2822 CALL timestop(handle)
2832 SUBROUTINE hirshfeld_charges(qs_env, input_section, unit_nr)
2835 INTEGER,
INTENT(IN) :: unit_nr
2837 INTEGER :: i, iat, ikind, natom, nkind, nspin, &
2838 radius_type, refc, shapef
2839 INTEGER,
DIMENSION(:),
POINTER :: atom_list
2840 LOGICAL :: do_radius, do_sc, paw_atom
2841 REAL(kind=
dp) :: zeff
2842 REAL(kind=
dp),
DIMENSION(:),
POINTER :: radii
2843 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
2846 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
2852 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
2856 NULLIFY (hirshfeld_env)
2860 CALL get_qs_env(qs_env, nkind=nkind, natom=natom)
2861 ALLOCATE (hirshfeld_env%charges(natom))
2870 IF (.NOT.
SIZE(radii) == nkind) &
2871 CALL cp_abort(__location__, &
2872 "Length of keyword HIRSHFELD\ATOMIC_RADII does not "// &
2873 "match number of atomic kinds in the input coordinate file.")
2878 iterative=do_sc, ref_charge=refc, &
2879 radius_type=radius_type)
2881 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, atomic_kind_set=atomic_kind_set)
2887 nspin =
SIZE(matrix_p, 1)
2888 ALLOCATE (charges(natom, nspin))
2893 atomic_kind => atomic_kind_set(ikind)
2895 DO iat = 1,
SIZE(atom_list)
2897 hirshfeld_env%charges(i) = zeff
2901 CALL get_qs_env(qs_env, matrix_s_kp=matrix_s, para_env=para_env)
2904 hirshfeld_env%charges(iat) = sum(charges(iat, :))
2907 cpabort(
"Unknown type of reference charge for Hirshfeld partitioning.")
2911 IF (hirshfeld_env%iterative)
THEN
2918 CALL get_qs_env(qs_env, particle_set=particle_set, dft_control=dft_control)
2919 IF (dft_control%qs_control%gapw)
THEN
2921 CALL get_qs_env(qs_env, rho0_mpole=rho0_mpole)
2924 atomic_kind => particle_set(iat)%atomic_kind
2926 CALL get_qs_kind(qs_kind_set(ikind), paw_atom=paw_atom)
2928 charges(iat, 1:nspin) = charges(iat, 1:nspin) + mp_rho(iat)%q0(1:nspin)
2933 IF (unit_nr > 0)
THEN
2935 qs_kind_set, unit_nr)
2941 DEALLOCATE (charges)
2943 END SUBROUTINE hirshfeld_charges
2953 SUBROUTINE project_function_a(ca, a, cb, b, l)
2955 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
2956 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, cb, b
2957 INTEGER,
INTENT(IN) :: l
2960 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
2961 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, tmat, v
2964 ALLOCATE (smat(n, n), tmat(n, n), v(n, 1), ipiv(n))
2968 v(:, 1) = matmul(tmat, cb)
2969 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
2973 DEALLOCATE (smat, tmat, v, ipiv)
2975 END SUBROUTINE project_function_a
2985 SUBROUTINE project_function_b(ca, a, bfun, grid_atom, l)
2987 REAL(kind=
dp),
DIMENSION(:),
INTENT(OUT) :: ca
2988 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: a, bfun
2990 INTEGER,
INTENT(IN) :: l
2992 INTEGER :: i, info, n, nr
2993 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: ipiv
2994 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: afun
2995 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: smat, v
2999 ALLOCATE (smat(n, n), v(n, 1), ipiv(n), afun(nr))
3003 afun(:) = grid_atom%rad(:)**l*exp(-a(i)*grid_atom%rad2(:))
3004 v(i, 1) = sum(afun(:)*bfun(:)*grid_atom%wr(:))
3006 CALL dgesv(n, 1, smat, n, ipiv, v, n, info)
3010 DEALLOCATE (smat, v, ipiv, afun)
3012 END SUBROUTINE project_function_b
3023 SUBROUTINE qs_scf_post_local_energy(input, logger, qs_env)
3028 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_energy'
3030 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3031 INTEGER :: handle, io_unit, natom, unit_nr
3032 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3041 CALL timeset(routinen, handle)
3044 "DFT%PRINT%LOCAL_ENERGY_CUBE"),
cp_p_file))
THEN
3046 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3047 gapw = dft_control%qs_control%gapw
3048 gapw_xc = dft_control%qs_control%gapw_xc
3049 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3051 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3052 CALL auxbas_pw_pool%create_pw(eden)
3056 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_ENERGY_CUBE%APPEND")
3057 IF (append_cube)
THEN
3058 my_pos_cube =
"APPEND"
3060 my_pos_cube =
"REWIND"
3064 extension=
".cube", middle_name=
"local_energy", &
3065 file_position=my_pos_cube, mpi_io=mpi_io)
3067 unit_nr,
"LOCAL ENERGY", particles=particles, &
3069 "PRINT%LOCAL_ENERGY_CUBE%STRIDE"), mpi_io=mpi_io)
3070 IF (io_unit > 0)
THEN
3071 INQUIRE (unit=unit_nr, name=filename)
3072 IF (gapw .OR. gapw_xc)
THEN
3073 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3074 "The soft part of the local energy is written to the file: ", trim(adjustl(filename))
3076 WRITE (unit=io_unit, fmt=
"(/,T3,A,A)") &
3077 "The local energy is written to the file: ", trim(adjustl(filename))
3081 "DFT%PRINT%LOCAL_ENERGY_CUBE", mpi_io=mpi_io)
3083 CALL auxbas_pw_pool%give_back_pw(eden)
3085 CALL timestop(handle)
3087 END SUBROUTINE qs_scf_post_local_energy
3098 SUBROUTINE qs_scf_post_local_stress(input, logger, qs_env)
3103 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_local_stress'
3105 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3106 INTEGER :: handle, io_unit, natom, unit_nr
3107 LOGICAL :: append_cube, gapw, gapw_xc, mpi_io
3108 REAL(kind=
dp) :: beta
3117 CALL timeset(routinen, handle)
3120 "DFT%PRINT%LOCAL_STRESS_CUBE"),
cp_p_file))
THEN
3122 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control, natom=natom)
3123 gapw = dft_control%qs_control%gapw
3124 gapw_xc = dft_control%qs_control%gapw_xc
3125 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3127 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3128 CALL auxbas_pw_pool%create_pw(stress)
3134 append_cube =
section_get_lval(input,
"DFT%PRINT%LOCAL_STRESS_CUBE%APPEND")
3135 IF (append_cube)
THEN
3136 my_pos_cube =
"APPEND"
3138 my_pos_cube =
"REWIND"
3142 extension=
".cube", middle_name=
"local_stress", &
3143 file_position=my_pos_cube, mpi_io=mpi_io)
3145 unit_nr,
"LOCAL STRESS", particles=particles, &
3147 "PRINT%LOCAL_STRESS_CUBE%STRIDE"), mpi_io=mpi_io)
3148 IF (io_unit > 0)
THEN
3149 INQUIRE (unit=unit_nr, name=filename)
3150 WRITE (unit=io_unit, fmt=
"(/,T3,A)")
"Write 1/3*Tr(sigma) to cube file"
3151 IF (gapw .OR. gapw_xc)
THEN
3152 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3153 "The soft part of the local stress is written to the file: ", trim(adjustl(filename))
3155 WRITE (unit=io_unit, fmt=
"(T3,A,A)") &
3156 "The local stress is written to the file: ", trim(adjustl(filename))
3160 "DFT%PRINT%LOCAL_STRESS_CUBE", mpi_io=mpi_io)
3162 CALL auxbas_pw_pool%give_back_pw(stress)
3165 CALL timestop(handle)
3167 END SUBROUTINE qs_scf_post_local_stress
3178 SUBROUTINE qs_scf_post_ps_implicit(input, logger, qs_env)
3183 CHARACTER(len=*),
PARAMETER :: routinen =
'qs_scf_post_ps_implicit'
3185 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube
3186 INTEGER :: boundary_condition, handle, i, j, &
3187 n_cstr, n_tiles, unit_nr
3188 LOGICAL :: append_cube, do_cstr_charge_cube, do_dielectric_cube, do_dirichlet_bc_cube, &
3189 has_dirichlet_bc, has_implicit_ps, mpi_io, tile_cubes
3199 CALL timeset(routinen, handle)
3201 NULLIFY (pw_env, auxbas_pw_pool, dft_section, particles)
3204 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, subsys=subsys)
3206 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
3208 has_implicit_ps = .false.
3209 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
3214 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE"),
cp_p_file)
3215 IF (has_implicit_ps .AND. do_dielectric_cube)
THEN
3216 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%APPEND")
3217 my_pos_cube =
"REWIND"
3218 IF (append_cube)
THEN
3219 my_pos_cube =
"APPEND"
3223 extension=
".cube", middle_name=
"DIELECTRIC_CONSTANT", file_position=my_pos_cube, &
3225 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3226 CALL auxbas_pw_pool%create_pw(aux_r)
3228 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3229 SELECT CASE (boundary_condition)
3231 CALL pw_copy(poisson_env%implicit_env%dielectric%eps, aux_r)
3233 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3234 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3235 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3236 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3237 poisson_env%implicit_env%dielectric%eps, aux_r)
3240 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIELECTRIC CONSTANT", particles=particles, &
3241 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE%STRIDE"), &
3244 "DFT%PRINT%IMPLICIT_PSOLVER%DIELECTRIC_CUBE", mpi_io=mpi_io)
3246 CALL auxbas_pw_pool%give_back_pw(aux_r)
3251 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE"),
cp_p_file)
3253 has_dirichlet_bc = .false.
3254 IF (has_implicit_ps)
THEN
3255 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3257 has_dirichlet_bc = .true.
3261 IF (has_implicit_ps .AND. do_cstr_charge_cube .AND. has_dirichlet_bc)
THEN
3263 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%APPEND")
3264 my_pos_cube =
"REWIND"
3265 IF (append_cube)
THEN
3266 my_pos_cube =
"APPEND"
3270 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", &
3271 extension=
".cube", middle_name=
"dirichlet_cstr_charge", file_position=my_pos_cube, &
3273 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3274 CALL auxbas_pw_pool%create_pw(aux_r)
3276 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3277 SELECT CASE (boundary_condition)
3279 CALL pw_copy(poisson_env%implicit_env%cstr_charge, aux_r)
3281 CALL pw_shrink(pw_env%poisson_env%parameters%ps_implicit_params%neumann_directions, &
3282 pw_env%poisson_env%implicit_env%dct_env%dests_shrink, &
3283 pw_env%poisson_env%implicit_env%dct_env%srcs_shrink, &
3284 pw_env%poisson_env%implicit_env%dct_env%bounds_local_shftd, &
3285 poisson_env%implicit_env%cstr_charge, aux_r)
3288 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET CONSTRAINT CHARGE", particles=particles, &
3289 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE%STRIDE"), &
3292 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_CSTR_CHARGE_CUBE", mpi_io=mpi_io)
3294 CALL auxbas_pw_pool%give_back_pw(aux_r)
3299 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE"),
cp_p_file)
3300 has_dirichlet_bc = .false.
3301 IF (has_implicit_ps)
THEN
3302 boundary_condition = pw_env%poisson_env%parameters%ps_implicit_params%boundary_condition
3304 has_dirichlet_bc = .true.
3308 IF (has_implicit_ps .AND. has_dirichlet_bc .AND. do_dirichlet_bc_cube)
THEN
3309 append_cube =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%APPEND")
3310 my_pos_cube =
"REWIND"
3311 IF (append_cube)
THEN
3312 my_pos_cube =
"APPEND"
3314 tile_cubes =
section_get_lval(input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%TILE_CUBES")
3316 CALL pw_env_get(pw_env, poisson_env=poisson_env, auxbas_pw_pool=auxbas_pw_pool)
3317 CALL auxbas_pw_pool%create_pw(aux_r)
3320 IF (tile_cubes)
THEN
3322 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3324 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3326 filename =
"dirichlet_cstr_"//trim(adjustl(
cp_to_string(j)))// &
3329 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3330 extension=
".cube", middle_name=filename, file_position=my_pos_cube, &
3333 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, aux_r)
3335 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3336 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3339 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3344 NULLIFY (dirichlet_tile)
3345 ALLOCATE (dirichlet_tile)
3346 CALL auxbas_pw_pool%create_pw(dirichlet_tile)
3349 unit_nr =
cp_print_key_unit_nr(logger, input,
"DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", &
3350 extension=
".cube", middle_name=
"DIRICHLET_CSTR", file_position=my_pos_cube, &
3353 n_cstr =
SIZE(poisson_env%implicit_env%contacts)
3355 n_tiles = poisson_env%implicit_env%contacts(j)%dirichlet_bc%n_tiles
3357 CALL pw_copy(poisson_env%implicit_env%contacts(j)%dirichlet_bc%tiles(i)%tile%tile_pw, dirichlet_tile)
3358 CALL pw_axpy(dirichlet_tile, aux_r)
3362 CALL cp_pw_to_cube(aux_r, unit_nr,
"DIRICHLET TYPE CONSTRAINT", particles=particles, &
3363 stride=
section_get_ivals(dft_section,
"PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE%STRIDE"), &
3366 "DFT%PRINT%IMPLICIT_PSOLVER%DIRICHLET_BC_CUBE", mpi_io=mpi_io)
3367 CALL auxbas_pw_pool%give_back_pw(dirichlet_tile)
3368 DEALLOCATE (dirichlet_tile)
3371 CALL auxbas_pw_pool%give_back_pw(aux_r)
3374 CALL timestop(handle)
3376 END SUBROUTINE qs_scf_post_ps_implicit
3384 SUBROUTINE write_adjacency_matrix(qs_env, input)
3388 CHARACTER(len=*),
PARAMETER :: routinen =
'write_adjacency_matrix'
3390 INTEGER :: adjm_size, colind, handle, iatom, ikind, &
3391 ind, jatom, jkind, k, natom, nkind, &
3392 output_unit, rowind, unit_nr
3393 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: interact_adjm
3394 LOGICAL :: do_adjm_write, do_symmetric
3400 DIMENSION(:),
POINTER :: nl_iterator
3403 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
3406 CALL timeset(routinen, handle)
3408 NULLIFY (dft_section)
3417 IF (do_adjm_write)
THEN
3418 NULLIFY (qs_kind_set, nl_iterator)
3419 NULLIFY (basis_set_list_a, basis_set_list_b, basis_set_a, basis_set_b)
3421 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, sab_orb=nl, natom=natom, para_env=para_env)
3423 nkind =
SIZE(qs_kind_set)
3424 cpassert(
SIZE(nl) > 0)
3426 cpassert(do_symmetric)
3427 ALLOCATE (basis_set_list_a(nkind), basis_set_list_b(nkind))
3431 adjm_size = ((natom + 1)*natom)/2
3432 ALLOCATE (interact_adjm(4*adjm_size))
3435 NULLIFY (nl_iterator)
3439 ikind=ikind, jkind=jkind, &
3440 iatom=iatom, jatom=jatom)
3442 basis_set_a => basis_set_list_a(ikind)%gto_basis_set
3443 IF (.NOT.
ASSOCIATED(basis_set_a)) cycle
3444 basis_set_b => basis_set_list_b(jkind)%gto_basis_set
3445 IF (.NOT.
ASSOCIATED(basis_set_b)) cycle
3448 IF (iatom <= jatom)
THEN
3455 ikind = ikind + jkind
3456 jkind = ikind - jkind
3457 ikind = ikind - jkind
3461 ind = adjm_size - (natom - rowind + 1)*((natom - rowind + 1) + 1)/2 + colind - rowind + 1
3464 interact_adjm((ind - 1)*4 + 1) = rowind
3465 interact_adjm((ind - 1)*4 + 2) = colind
3466 interact_adjm((ind - 1)*4 + 3) = ikind
3467 interact_adjm((ind - 1)*4 + 4) = jkind
3470 CALL para_env%sum(interact_adjm)
3473 extension=
".adjmat", file_form=
"FORMATTED", &
3474 file_status=
"REPLACE")
3475 IF (unit_nr > 0)
THEN
3476 WRITE (unit_nr,
"(1A,2X,1A,5X,1A,4X,A5,3X,A5)")
"#",
"iatom",
"jatom",
"ikind",
"jkind"
3477 DO k = 1, 4*adjm_size, 4
3479 IF (interact_adjm(k) > 0 .AND. interact_adjm(k + 1) > 0)
THEN
3480 WRITE (unit_nr,
"(I8,2X,I8,3X,I6,2X,I6)") interact_adjm(k:k + 3)
3488 DEALLOCATE (basis_set_list_a, basis_set_list_b)
3491 CALL timestop(handle)
3493 END SUBROUTINE write_adjacency_matrix
3501 SUBROUTINE update_hartree_with_mp2(rho, qs_env)
3505 LOGICAL :: use_virial
3515 NULLIFY (auxbas_pw_pool, pw_env, poisson_env, energy, rho_core, v_hartree_rspace, virial)
3516 CALL get_qs_env(qs_env, pw_env=pw_env, energy=energy, &
3517 rho_core=rho_core, virial=virial, &
3518 v_hartree_rspace=v_hartree_rspace)
3520 use_virial = virial%pv_availability .AND. (.NOT. virial%pv_numer)
3522 IF (.NOT. use_virial)
THEN
3524 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
3525 poisson_env=poisson_env)
3526 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
3527 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
3531 v_hartree_gspace, rho_core=rho_core)
3533 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
3534 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
3536 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
3537 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
3540 END SUBROUTINE update_hartree_with_mp2
static double norm_factor(double alpha, int L)
Types and set/get functions for auxiliary density matrix methods.
Contains methods used in the context of density fitting.
subroutine, public admm_uncorrect_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public admm_correct_for_eigenvalues(ispin, admm_env, ks_matrix)
...
subroutine, public sg_overlap(smat, l, pa, pb)
...
calculate the orbitals for a given atomic kind type
subroutine, public calculate_atomic_density(density, atomic_kind, qs_kind, ngto, iunit, optbasis, allelectron, confine)
...
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.
Handles all functions related to the CELL.
various utilities that regard array of different kinds: output, allocation,... maybe it is not a good...
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_write_sparse_matrix(sparse_matrix, before, after, qs_env, para_env, first_row, last_row, first_col, last_col, scale, output_unit, omit_headers)
...
Density Derived atomic point charges from a QM calculation (see Bloechl, J. Chem. Phys....
recursive subroutine, public get_ddapc(qs_env, calc_force, density_fit_section, density_type, qout1, qout2, out_radii, dq_out, ext_rho_tot_g, itype_of_density, iwc)
Computes the Density Derived Atomic Point Charges.
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
subroutine, public cp_fm_init_random(matrix, ncol, start_col)
fills a matrix with random numbers
various routines to log and control the output. The idea is that decisions about where to log should ...
integer function, public cp_logger_get_default_io_unit(logger)
returns the unit nr for the ionode (-1 on all other processors) skips as well checks if the procs cal...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
routines to handle the output, The idea is to remove the decision of wheter to output and what to out...
integer function, public cp_print_key_unit_nr(logger, basis_section, print_key_path, extension, middle_name, local, log_filename, ignore_should_output, file_form, file_position, file_action, file_status, do_backup, on_file, is_new_file, mpi_io, fout)
...
subroutine, public cp_print_key_finished_output(unit_nr, logger, basis_section, print_key_path, local, ignore_should_output, on_file, mpi_io)
should be called after you finish working with a unit obtained with cp_print_key_unit_nr,...
integer, parameter, public cp_p_file
integer function, public cp_print_key_should_output(iteration_info, basis_section, print_key_path, used_print_key, first_time)
returns what should be done with the given property if btest(res,cp_p_store) then the property should...
A wrapper around pw_to_cube() which accepts particle_list_type.
subroutine, public cp_pw_to_cube(pw, unit_nr, title, particles, zeff, stride, max_file_size_mb, zero_tails, silent, mpi_io)
...
the type I Discrete Cosine Transform (DCT-I)
subroutine, public pw_shrink(neumann_directions, dests_shrink, srcs_shrink, bounds_local_shftd, pw_in, pw_shrinked)
shrinks an evenly symmetric pw_r3d_rs_type data to a pw_r3d_rs_type data that is 8 times smaller (the...
Calculate Energy Decomposition analysis.
subroutine, public edmf_analysis(qs_env, input_section, unit_nr)
...
Calculation of charge equilibration method.
subroutine, public eeq_print(qs_env, iounit, print_level, ext)
...
Definition and initialisation of the et_coupling data type.
subroutine, public set_et_coupling_type(et_coupling, et_mo_coeff, rest_mat)
...
subroutine, public print_ri_hfx(ri_data, qs_env)
Print RI-HFX quantities, as required by the PRINT subsection.
Calculate Hirshfeld charges and related functions.
subroutine, public comp_hirshfeld_charges(qs_env, hirshfeld_env, charges)
...
subroutine, public create_shape_function(hirshfeld_env, qs_kind_set, atomic_kind_set, radius, radii_list)
creates kind specific shape functions for Hirshfeld charges
subroutine, public write_hirshfeld_charges(charges, hirshfeld_env, particle_set, qs_kind_set, unit_nr)
...
subroutine, public comp_hirshfeld_i_charges(qs_env, hirshfeld_env, charges, ounit)
...
subroutine, public save_hirshfeld_charges(charges, particle_set, qs_kind_set, qs_env)
saves the Hirshfeld charges to the results structure
The types needed for the calculation of Hirshfeld charges and related functions.
subroutine, public create_hirshfeld_type(hirshfeld_env)
...
subroutine, public set_hirshfeld_info(hirshfeld_env, shape_function_type, iterative, ref_charge, fnorm, radius_type, use_bohr)
Set values of a Hirshfeld env.
subroutine, public release_hirshfeld_type(hirshfeld_env)
...
Calculate intrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_wfn_analysis(qs_env, iao_env, unit_nr, c_iao_coef, mos, bond_centers)
...
Calculate ntrinsic atomic orbitals and analyze wavefunctions.
subroutine, public iao_read_input(iao_env, iao_section, cell)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
Types and basic routines needed for a kpoint calculation.
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Calculate MAO's and analyze wavefunctions.
subroutine, public mao_analysis(qs_env, input_section, unit_nr)
...
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Utility routines for the memory handling.
Interface to the message passing library MPI.
Calculate localized minimal basis and analyze wavefunctions.
subroutine, public minbas_analysis(qs_env, input_section, unit_nr)
...
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section)
Write out the MOs in molden format for visualisation.
Define the data structure for the molecule information.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:, :), allocatable, public indso
represent a simple array based list of the given type
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
real(kind=dp), parameter, public angstrom
Provide various population analyses and print the requested output information.
subroutine, public lowdin_population_analysis(qs_env, output_unit, print_level)
Perform a Lowdin population analysis based on a symmetric orthogonalisation of the density matrix usi...
subroutine, public mulliken_population_analysis(qs_env, output_unit, print_level)
Perform a Mulliken population analysis.
computes preconditioners, and implements methods to apply them currently used in qs_ot
Types containing essential information for running implicit (iterative) Poisson solver.
integer, parameter, public neumann_bc
integer, parameter, public mixed_bc
integer, parameter, public mixed_periodic_bc
integer, parameter, public periodic_bc
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
This module defines the grid data type and some basic operations on it.
subroutine, public get_pw_grid_info(pw_grid, id_nr, mode, vol, dvol, npts, ngpts, ngpts_cut, dr, cutoff, orthorhombic, gvectors, gsquare)
Access to information stored in the pw_grid_type.
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
functions related to the poisson solver on regular grids
integer, parameter, public pw_poisson_implicit
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Write wfx file, works as interface to chargemol and multiwfn.
subroutine, public write_wfx(qs_env, dft_section)
...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_wavefunction(mo_vectors, ivector, rho, rho_gspace, atomic_kind_set, qs_kind_set, cell, dft_control, particle_set, pw_env, basis_type)
maps a given wavefunction on the grid
Calculation of commutator [H,r] matrices.
subroutine, public build_com_hr_matrix(qs_env, matrix_hr)
Calculation of the [H,r] commutators matrices over Cartesian Gaussian functions.
Calculation of the energies concerning the core charge distribution.
Calculation and writing of density of states.
subroutine, public calculate_dos(mos, dft_section)
Compute and write density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section)
Compute and write density of states (kpoints)
Calculates electric field gradients H.M. Petrili, P.E. Blochl, P. Blaha, K. Schwarz,...
subroutine, public qs_efg_calc(qs_env)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public qs_elf_calc(qs_env, elf_r, rho_cutoff)
...
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public energy_windows(qs_env)
...
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
Calculates hyperfine values.
subroutine, public qs_epr_hyp_calc(qs_env)
...
Some utility functions for the calculation of integrals.
subroutine, public basis_set_list_setup(basis_set_list, basis_type, qs_kind_set)
Set up an easy accessible list of the basis sets for all kinds.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, 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, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
routines that build the Kohn-Sham matrix (i.e calculate the coulomb and xc parts
subroutine, public qs_ks_update_qs_env(qs_env, calculate_forces, just_energy, print_active)
updates the Kohn Sham matrix of the given qs_env (facility method)
subroutine, public calc_rho_tot_gspace(rho_tot_gspace, qs_env, rho, skip_nuclear_density)
...
subroutine, public qs_ks_did_change(ks_env, s_mstruct_changed, rho_changed, potential_changed, full_reset)
tells that some of the things relevant to the ks calculation did change. has to be called when change...
subroutine, public loc_dipole(input, dft_control, qs_loc_env, logger, qs_env)
Computes and prints the Dipole (using localized charges)
subroutine, public get_localization_info(qs_env, qs_loc_env, loc_section, mo_local, wf_r, wf_g, particles, coeff, evals, marked_states)
Performs localization of the orbitals.
New version of the module for the localization of the molecular orbitals This should be able to use d...
subroutine, public qs_loc_env_release(qs_loc_env)
...
subroutine, public qs_loc_env_create(qs_loc_env)
...
Some utilities for the construction of the localization environment.
subroutine, public loc_write_restart(qs_loc_env, section, mo_array, coeff_localized, do_homo, evals, do_mixed)
...
subroutine, public qs_loc_env_init(qs_loc_env, localized_wfn_control, qs_env, myspin, do_localize, loc_coeff, mo_loc_history)
allocates the data, and initializes the operators
subroutine, public qs_loc_control_init(qs_loc_env, loc_section, do_homo, do_mixed, do_xas, nloc_xas, spin_xas)
initializes everything needed for localization of the HOMOs
subroutine, public retain_history(mo_loc_history, mo_loc)
copy old mos to new ones, allocating as necessary
subroutine, public qs_loc_init(qs_env, qs_loc_env, localize_section, mos_localized, do_homo, do_mo_cubes, mo_loc_history, evals, tot_zeff_corr, do_mixed)
initializes everything needed for localization of the molecular orbitals
Routines for calculating local energy and stress tensor.
subroutine, public qs_local_stress(qs_env, stress_tensor, beta)
Routine to calculate the local stress.
subroutine, public qs_local_energy(qs_env, energy_density)
Routine to calculate the local energy.
Definition and initialisation of the mo data type.
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
collects routines that perform operations directly related to MOs
subroutine, public make_mo_eig(mos, nspins, ks_rmpv, scf_control, mo_derivs, admm_env, hairy_probes, probe)
Calculate KS eigenvalues starting from OF MOS.
Set occupation of molecular orbitals.
Definition and initialisation of the mo data type.
subroutine, public 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.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public qs_moment_locop(qs_env, magnetic, nmoments, reference, ref_point, unit_number, vel_reprs, com_nl)
...
subroutine, public qs_moment_berry_phase(qs_env, magnetic, nmoments, reference, ref_point, unit_number)
...
Define the neighbor list data types and the corresponding functionality.
subroutine, public neighbor_list_iterator_create(iterator_set, nl, search, nthread)
Neighbor list iterator functions.
subroutine, public neighbor_list_iterator_release(iterator_set)
...
subroutine, public get_neighbor_list_set_p(neighbor_list_sets, nlist, symmetric)
Return the components of the first neighbor list set.
integer function, public neighbor_list_iterate(iterator_set, mepos)
...
subroutine, public get_iterator_info(iterator_set, mepos, ikind, jkind, nkind, ilist, nlist, inode, nnode, iatom, jatom, r, cell)
...
an eigen-space solver for the generalised symmetric eigenvalue problem for sparse matrices,...
subroutine, public ot_eigensolver(matrix_h, matrix_s, matrix_orthogonal_space_fm, matrix_c_fm, preconditioner, eps_gradient, iter_max, size_ortho_space, silent, ot_settings)
...
Calculation and writing of projected density of states The DOS is computed per angular momentum and p...
subroutine, public calculate_projected_dos(mo_set, atomic_kind_set, qs_kind_set, particle_set, qs_env, dft_section, ispin, xas_mittle, external_matrix_shalf)
Compute and write projected density of states.
provides a resp fit for gas phase systems
subroutine, public resp_fit(qs_env)
performs resp fit and generates RESP charges
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
Functions to print the KS and S matrix in the CSR format to file.
subroutine, public write_s_matrix_csr(qs_env, input)
writing the overlap matrix in csr format into a file
subroutine, public write_ks_matrix_csr(qs_env, input)
writing the KS matrix in csr format into a file
subroutine, public write_p_matrix_csr(qs_env, input)
writing the density matrix in csr format into a file
subroutine, public write_hcore_matrix_csr(qs_env, input)
writing the core Hamiltonian matrix in csr format into a file
subroutine, public qs_scf_write_mos(qs_env, scf_env, final_mos)
Write the MO eigenvector, eigenvalues, and occupation numbers to the output unit.
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public make_lumo_gpw(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the lumos, and eigenvalues for the lumos.
subroutine, public write_mo_free_results(qs_env)
Write QS results always available (if switched on through the print_keys) Can be called from ls_scf.
subroutine, public qs_scf_post_moments(input, logger, qs_env, output_unit)
Computes and prints electric moments.
subroutine, public write_mo_dependent_results(qs_env, scf_env)
Write QS results available if MO's are present (if switched on through the print_keys) Writes only MO...
subroutine, public scf_post_calculation_gpw(qs_env, wf_type, do_mp2)
collects possible post - scf calculations and prints info / computes properties.
module that contains the definitions of the scf types
integer, parameter, public ot_method_nr
Does all kind of post scf calculations for GPW/GAPW.
subroutine, public wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, unoccupied_orbs, scf_env, matrix_s, marked_states, for_rtp)
writes a new 'mixed' set of mos to restart file, without touching the current MOs
types that represent a quickstep subsys
subroutine, public qs_subsys_get(subsys, atomic_kinds, atomic_kind_set, particles, particle_set, local_particles, molecules, molecule_set, molecule_kinds, molecule_kind_set, local_molecules, para_env, colvar_p, shell_particles, core_particles, gci, multipoles, natom, nparticle, ncore, nshell, nkind, atprop, virial, results, cell, cell_ref, use_ref_cell, energy, force, qs_kind_set, cp_subsys, nelectron_total, nelectron_spin)
...
Interface to Wannier90 code.
subroutine, public wannier90_interface(input, logger, qs_env)
...
Methods related to (\cal S)^2 (i.e. spin)
subroutine, public compute_s_square(mos, matrix_s, s_square, s_square_ideal, mo_derivs, strength)
Compute the expectation value <(\cal S)^2> of the single determinant defined by the spin up (alpha) a...
parameters that control an scf iteration
Calculation of STM image as post processing of an electronic structure calculation,...
subroutine, public th_stm_image(qs_env, stm_section, particles, unoccupied_orbs, unoccupied_evals)
Driver for the calculation of STM image, as post processing of a ground-state electronic structure ca...
routines for DFT+NEGF calculations (coupling with the quantum transport code OMEN)
subroutine, public qs_scf_post_transport(qs_env)
post scf calculations for transport
The module to read/write TREX IO files for interfacing CP2K with other programs.
subroutine, public write_trexio(qs_env, trexio_section, energy_derivative)
Write a trexio file.
Interface for Voronoi Integration and output of BQB files.
subroutine, public entry_voronoi_or_bqb(do_voro, do_bqb, input_voro, input_bqb, unit_voro, qs_env, rspace_pw)
Does a Voronoi integration of density or stores the density to compressed BQB format.
subroutine, public xray_diffraction_spectrum(qs_env, unit_number, q_max)
Calculate the coherent X-ray diffraction spectrum using the total electronic density in reciprocal sp...
subroutine, public calculate_rhotot_elec_gspace(qs_env, auxbas_pw_pool, rhotot_elec_gspace, q_max, rho_hard, rho_soft, fsign)
The total electronic density in reciprocal space (g-space) is calculated.
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
represent a pointer to a 1d array
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
quantities needed for a Hirshfeld based partitioning of real space
Contains information about kpoints.
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
environment for the poisson solver
to create arrays of pools
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Provides all information about a quickstep kind.
contains all the info needed by quickstep to calculate the spread of a selected set of orbitals and i...
keeps the density in various representations, keeping track of which ones are valid.