147#include "./base/base_uses.f90"
153 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_tb'
173 CHARACTER(LEN=*) :: tb_type
174 LOGICAL,
INTENT(IN) :: no_mos
176 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_tb'
178 CHARACTER(LEN=6) :: ana
179 CHARACTER(LEN=default_string_length) :: aname
180 INTEGER :: after, gfn_type, handle, homo, iat, iatom, ikind, img, ispin, iw, nat, natom, &
181 nkind, nlumo_stm, nlumos, nspins, print_level, unit_nr
182 LOGICAL :: do_cube, do_dos, do_kpoints, do_pdos, do_pdos_raw, do_projected_dos, explicit, &
183 gfn0, has_homo, omit_headers, print_it, rebuild, vdip
184 REAL(kind=
dp) :: zeff
185 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge, zcharge
186 REAL(kind=
dp),
DIMENSION(2, 2) :: homo_lumo
187 REAL(kind=
dp),
DIMENSION(:),
POINTER :: echarge, mo_eigenvalues
188 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
191 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: unoccupied_evals_stm
192 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs_stm
195 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
196 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_p, matrix_s
204 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
210 print_section, sprint_section, &
214 CALL timeset(routinen, handle)
220 CALL get_qs_env(qs_env, dft_control=dft_control)
221 SELECT CASE (trim(tb_type))
224 gfn_type = dft_control%qs_control%xtb_control%gfn_type
225 gfn0 = (gfn_type == 0)
226 vdip = dft_control%qs_control%xtb_control%var_dipole
228 cpabort(
"unknown TB type")
231 cpassert(
ASSOCIATED(qs_env))
232 NULLIFY (rho, para_env, matrix_s, matrix_p)
233 CALL get_qs_env(qs_env, scf_env=scf_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
234 rho=rho, natom=natom, para_env=para_env, &
235 particle_set=particle_set, do_kpoints=do_kpoints, matrix_s_kp=matrix_s)
236 nspins = dft_control%nspins
239 ALLOCATE (charges(natom, nspins), mcharge(natom))
243 ALLOCATE (zcharge(natom))
244 nkind =
SIZE(atomic_kind_set)
247 SELECT CASE (trim(tb_type))
249 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
252 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
255 cpabort(
"unknown TB type")
258 iat = atomic_kind_set(ikind)%atom_list(iatom)
259 mcharge(iat) = zeff - sum(charges(iat, 1:nspins))
271 extension=
".mulliken", log_filename=.false.)
272 IF (unit_nr > 0)
THEN
273 WRITE (unit=unit_nr, fmt=
"(/,/,T2,A)")
"MULLIKEN POPULATION ANALYSIS"
274 IF (nspins == 1)
THEN
275 WRITE (unit=unit_nr, fmt=
"(/,T2,A,T70,A)") &
276 " # Atom Element Kind Atomic population",
" Net charge"
280 SELECT CASE (tb_type)
282 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
285 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
288 cpabort(
"unknown TB type")
290 ana = adjustr(trim(adjustl(aname)))
292 iat = atomic_kind_set(ikind)%atom_list(iatom)
293 WRITE (unit=unit_nr, &
294 fmt=
"(T2,I7,5X,A6,I6,T39,F12.6,T69,F12.6)") &
295 iat, adjustl(ana), ikind, charges(iat, 1), mcharge(iat)
298 WRITE (unit=unit_nr, &
299 fmt=
"(T2,A,T39,F12.6,T69,F12.6,/)") &
300 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
302 WRITE (unit=unit_nr, fmt=
"(/,T2,A)") &
303 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
307 SELECT CASE (tb_type)
309 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
312 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
315 cpabort(
"unknown TB type")
317 ana = adjustr(trim(adjustl(aname)))
319 iat = atomic_kind_set(ikind)%atom_list(iatom)
320 WRITE (unit=unit_nr, &
321 fmt=
"(T2,I6,3X,A6,I6,T29,4(1X,F12.6))") &
322 iat, adjustl(ana), ikind, charges(iat, 1:2), mcharge(iat), &
323 charges(iat, 1) - charges(iat, 2)
326 WRITE (unit=unit_nr, &
327 fmt=
"(T2,A,T29,4(1X,F12.6),/)") &
328 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
338 SELECT CASE (tb_type)
340 cpwarn(
"Lowdin population analysis not implemented for DFTB method.")
343 log_filename=.false.)
346 IF (print_it) print_level = 2
348 IF (print_it) print_level = 3
350 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
356 cpabort(
"unknown TB type")
364 extension=
".eeq", log_filename=.false.)
365 CALL eeq_print(qs_env, unit_nr, print_level, ext=gfn0)
374 cpwarn(
"Hirshfeld charges not available for TB methods.")
383 cpwarn(
"MAO analysis not available for TB methods.")
392 cpwarn(
"ED analysis not available for TB methods.")
400 extension=
".data", middle_name=
"tb_dipole", log_filename=.false.)
405 cpassert(
ASSOCIATED(echarge))
408 mcharge(1:natom) = echarge(1:natom) - mcharge(1:natom)
410 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
412 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
417 DEALLOCATE (charges, mcharge)
420 IF (.NOT. no_mos)
THEN
424 IF (.NOT. do_kpoints)
THEN
425 SELECT CASE (tb_type)
430 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
431 qs_env=qs_env, calc_energies=.true.)
433 cpabort(
"Unknown TB type")
440 IF (.NOT. no_mos)
THEN
443 IF (explicit .AND. .NOT. qs_env%run_rtp)
CALL wfn_mix_tb(qs_env, dft_section, scf_env)
446 IF (.NOT. no_mos)
THEN
455 CALL calculate_dos(mos, dft_section, smearing_enabled=dft_control%smear)
460 IF (do_projected_dos)
THEN
463 write_pdos=do_pdos, write_pdos_raw=do_pdos_raw)
465 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
466 DO ispin = 1, dft_control%nspins
468 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
469 eigenvalues=mo_eigenvalues)
470 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
471 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
473 mo_coeff_deriv => null()
476 do_rotation=.true., &
477 co_rotate_dbcsr=mo_coeff_deriv)
480 IF (dft_control%nspins == 2)
THEN
482 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin, &
483 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_raw=do_pdos_raw)
486 qs_kind_set, particle_set, qs_env, dft_section, &
487 pdos_print_key=
"PRINT%DOS", write_pdos=do_pdos, write_pdos_raw=do_pdos_raw)
495 SELECT CASE (tb_type)
503 cpabort(
"unknown TB type")
511 cpwarn(
"Energy Windows not implemented for k-points.")
520 cpwarn(
"Energy Windows not implemented for TB methods.")
532 CALL print_e_density(qs_env, zcharge, print_key)
534 cpwarn(
"Electronic density cube file not implemented for TB methods.")
546 CALL print_density_cubes(qs_env, zcharge, print_key, total_density=.true.)
548 cpwarn(
"Total density cube file not implemented for TB methods.")
560 CALL print_density_cubes(qs_env, zcharge, print_key, v_hartree=.true.)
562 cpwarn(
"Hartree potential cube file not implemented for TB methods.")
574 CALL print_density_cubes(qs_env, zcharge, print_key, efield=.true.)
576 cpwarn(
"Efield cube file not implemented for TB methods.")
588 CALL print_elf(qs_env, zcharge, print_key)
590 cpwarn(
"ELF not implemented for TB methods.")
595 IF (.NOT. no_mos)
THEN
603 CALL print_mo_cubes(qs_env, zcharge, print_key)
605 cpwarn(
"Printing of MO cube files not implemented for TB methods.")
611 IF (.NOT. no_mos)
THEN
620 cpwarn(
"STM not implemented for k-point calculations!")
623 cpassert(.NOT. dft_control%restricted)
624 CALL get_qs_env(qs_env, mos=mos, mo_derivs=mo_derivs, &
625 scf_control=scf_control, matrix_ks=ks_rmpv)
626 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
627 DO ispin = 1, dft_control%nspins
628 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
629 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
632 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
633 IF (nlumo_stm > 0)
THEN
634 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
635 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
636 CALL make_lumo_tb(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
642 CALL th_stm_image(qs_env, print_key, particles, unoccupied_orbs_stm, &
643 unoccupied_evals_stm)
645 IF (nlumo_stm > 0)
THEN
646 DO ispin = 1, dft_control%nspins
647 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
649 DEALLOCATE (unoccupied_evals_stm)
658 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks)
665 after = min(max(after, 1), 16)
666 DO ispin = 1, dft_control%nspins
667 DO img = 1,
SIZE(matrix_p, 2)
669 para_env, output_unit=iw, omit_headers=omit_headers)
677 "AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file))
THEN
681 after = min(max(after, 1), 16)
682 DO ispin = 1, dft_control%nspins
683 DO img = 1,
SIZE(matrix_ks, 2)
685 output_unit=iw, omit_headers=omit_headers)
698 cpwarn(
"XC potential cube file not available for TB methods.")
707 cpwarn(
"Electric field gradient not implemented for TB methods.")
716 cpwarn(
"Kinetic energy not available for TB methods.")
725 cpwarn(
"Xray diffraction spectrum not implemented for TB methods.")
734 cpwarn(
"Hyperfine Coupling not implemented for TB methods.")
743 cpwarn(
"DFT+U method not implemented for TB methods.")
754 CALL timestop(handle)
765 SUBROUTINE tb_dipole(qs_env, input, unit_nr, charges)
769 INTEGER,
INTENT(in) :: unit_nr
770 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: charges
772 CHARACTER(LEN=default_string_length) :: description, dipole_type
773 COMPLEX(KIND=dp) :: dzeta, dzphase(3), zeta, zphase(3)
774 COMPLEX(KIND=dp),
DIMENSION(3) :: dggamma, ggamma
775 INTEGER :: i, iat, ikind, j, nat, reference
777 REAL(kind=
dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
778 dtheta, gvec(3), q, rcc(3), ria(3), theta, tmp(3), via(3)
779 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
785 NULLIFY (atomic_kind_set, cell, results)
786 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
787 particle_set=particle_set, cell=cell, results=results)
792 description =
'[DIPOLE]'
796 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
799 dipole_deriv = 0.0_dp
802 dipole_type =
"periodic (Berry phase)"
805 charge_tot = sum(charges)
806 ria =
twopi*matmul(cell%h_inv, rcc)
807 zphase = cmplx(cos(ria), sin(ria),
dp)**charge_tot
809 dria =
twopi*matmul(cell%h_inv, drcc)
810 dzphase = charge_tot*cmplx(-sin(ria), cos(ria),
dp)**(charge_tot - 1.0_dp)*dria
814 DO ikind = 1,
SIZE(atomic_kind_set)
817 iat = atomic_kind_set(ikind)%atom_list(i)
818 ria = particle_set(iat)%r(:)
820 via = particle_set(iat)%v(:)
823 gvec =
twopi*cell%h_inv(j, :)
824 theta = sum(ria(:)*gvec(:))
825 dtheta = sum(via(:)*gvec(:))
826 zeta = cmplx(cos(theta), sin(theta), kind=
dp)**(-q)
827 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=
dp)**(-q - 1.0_dp)*dtheta
828 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
829 ggamma(j) = ggamma(j)*zeta
833 dggamma = dggamma*zphase + ggamma*dzphase
834 ggamma = ggamma*zphase
835 IF (all(real(ggamma, kind=
dp) /= 0.0_dp))
THEN
836 tmp = aimag(ggamma)/real(ggamma, kind=
dp)
838 dci = -(1.0_dp/(1.0_dp + tmp**2))* &
839 (aimag(dggamma)*real(ggamma, kind=
dp) - aimag(ggamma)*real(dggamma, kind=
dp))/(real(ggamma, kind=
dp))**2
840 dipole = matmul(cell%hmat, ci)/
twopi
841 dipole_deriv = matmul(cell%hmat, dci)/
twopi
844 dipole_type =
"non-periodic"
845 DO i = 1,
SIZE(particle_set)
847 ria = particle_set(i)%r(:)
849 dipole = dipole + q*(ria - rcc)
850 dipole_deriv(:) = dipole_deriv(:) + q*(particle_set(i)%v(:) - drcc)
854 CALL put_results(results=results, description=description, &
856 IF (unit_nr > 0)
THEN
857 WRITE (unit_nr,
'(/,T2,A,T31,A50)') &
858 'TB_DIPOLE| Dipole type', adjustr(trim(dipole_type))
859 WRITE (unit_nr,
"(T2,A,T30,3(1X,F16.8))")
"TB_DIPOLE| Ref. Point [Bohr]", rcc
860 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
861 'TB_DIPOLE| Moment [a.u.]', dipole(1:3)
862 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
863 'TB_DIPOLE| Moment [Debye]', dipole(1:3)*
debye
864 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
865 'TB_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
868 END SUBROUTINE tb_dipole
879 SUBROUTINE wfn_mix_tb(qs_env, dft_section, scf_env)
885 INTEGER :: ispin, nao, nmo, output_unit
886 REAL(
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
889 TYPE(
cp_fm_type) :: ks_tmp, mo_tmp, s_tmp, work
890 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumos
893 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
897 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
901 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks, &
902 particle_set=particle_set, atomic_kind_set=atomic_kind_set, &
903 qs_kind_set=qs_kind_set, mos=mos, para_env=para_env)
907 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao)
910 template_fmstruct=mo_coeff%matrix_struct)
915 ALLOCATE (lumos(
SIZE(mos)))
920 DO ispin = 1,
SIZE(mos)
921 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, nmo=nmo)
922 CALL cp_fm_struct_create(fmstruct=ao_lumo_struct, nrow_global=nao, ncol_global=nao - nmo, &
923 template_fmstruct=mo_coeff%matrix_struct)
925 CALL cp_fm_create(lumos(ispin), matrix_struct=ao_lumo_struct)
937 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
938 unoccupied_orbs=lumos, scf_env=scf_env, matrix_s=matrix_s)
947 END SUBROUTINE wfn_mix_tb
958 SUBROUTINE make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
962 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
963 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_evals
965 INTEGER,
INTENT(OUT) :: nlumos
967 INTEGER :: homo, iounit, ispin, n, nao, nmo
972 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
979 NULLIFY (mos, ks_rmpv, scf_control, dft_control, para_env, blacs_env)
983 scf_control=scf_control, &
984 dft_control=dft_control, &
992 DO ispin = 1, dft_control%nspins
993 NULLIFY (unoccupied_evals(ispin)%array)
995 IF (iounit > 0)
WRITE (iounit, *)
" "
996 IF (iounit > 0)
WRITE (iounit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
997 IF (iounit > 0)
WRITE (iounit, fmt=
'(1X,A)')
"-----------------------------------------------------"
998 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
1000 nlumos = max(1, min(nlumo, nao - nmo))
1001 IF (nlumo == -1) nlumos = nao - nmo
1002 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1004 nrow_global=n, ncol_global=nlumos)
1005 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1010 NULLIFY (local_preconditioner)
1011 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1012 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1015 NULLIFY (local_preconditioner)
1019 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1020 matrix_c_fm=unoccupied_orbs(ispin), &
1021 matrix_orthogonal_space_fm=mo_coeff, &
1022 eps_gradient=scf_control%eps_lumos, &
1024 iter_max=scf_control%max_iter_lumos, &
1025 size_ortho_space=nmo)
1028 unoccupied_evals(ispin)%array, scr=iounit, &
1043 LOGICAL :: skip_load_balance_distributed
1051 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=new_pw_env)
1052 IF (.NOT.
ASSOCIATED(new_pw_env))
THEN
1057 CALL get_qs_env(qs_env, pw_env=new_pw_env, dft_control=dft_control, cell=cell)
1059 new_pw_env%cell_hmat = cell%hmat
1064 IF (.NOT.
ASSOCIATED(task_list))
THEN
1068 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1070 reorder_rs_grid_ranks=.true., &
1071 skip_load_balance_distributed=skip_load_balance_distributed)
1073 CALL qs_rho_rebuild(rho, qs_env=qs_env, rebuild_ao=.false., rebuild_grids=.true.)
1083 SUBROUTINE print_e_density(qs_env, zcharge, cube_section)
1086 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1089 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1090 INTEGER :: iounit, ispin, unit_nr
1091 LOGICAL :: append_cube, mpi_io
1092 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
1095 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1107 CALL get_qs_env(qs_env, dft_control=dft_control)
1110 my_pos_cube =
"REWIND"
1111 IF (append_cube) my_pos_cube =
"APPEND"
1117 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1118 NULLIFY (rho_r, rho_g, tot_rho_r)
1120 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1121 DO ispin = 1, dft_control%nspins
1122 rho_ao => rho_ao_kp(ispin, :)
1125 rho_gspace=rho_g(ispin), &
1126 total_rho=tot_rho_r(ispin), &
1129 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1134 IF (dft_control%nspins > 1)
THEN
1135 IF (iounit > 0)
THEN
1136 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,2F15.6)") &
1137 "Integrated alpha and beta electronic density:", tot_rho_r(1:2)
1139 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1140 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1143 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
1144 CALL pw_copy(rho_r(1), rho_elec_rspace)
1145 CALL pw_axpy(rho_r(2), rho_elec_rspace)
1146 filename =
"ELECTRON_DENSITY"
1149 extension=
".cube", middle_name=trim(filename), &
1150 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1152 IF (iounit > 0)
THEN
1153 IF (.NOT. mpi_io)
THEN
1154 INQUIRE (unit=unit_nr, name=filename)
1156 filename = mpi_filename
1158 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1159 "The sum of alpha and beta density is written in cube file format to the file:", adjustr(trim(filename))
1161 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
1162 particles=particles, zeff=zcharge, stride=
section_get_ivals(cube_section,
"STRIDE"), &
1165 CALL pw_copy(rho_r(1), rho_elec_rspace)
1166 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
1167 filename =
"SPIN_DENSITY"
1170 extension=
".cube", middle_name=trim(filename), &
1171 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1173 IF (iounit > 0)
THEN
1174 IF (.NOT. mpi_io)
THEN
1175 INQUIRE (unit=unit_nr, name=filename)
1177 filename = mpi_filename
1179 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1180 "The spin density is written in cube file format to the file:", adjustr(trim(filename))
1182 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
1183 particles=particles, zeff=zcharge, &
1186 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
1189 IF (iounit > 0)
THEN
1190 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1191 "Integrated electronic density:", tot_rho_r(1)
1193 filename =
"ELECTRON_DENSITY"
1196 extension=
".cube", middle_name=trim(filename), &
1197 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1199 IF (iounit > 0)
THEN
1200 IF (.NOT. mpi_io)
THEN
1201 INQUIRE (unit=unit_nr, name=filename)
1203 filename = mpi_filename
1205 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1206 "The electron density is written in cube file format to the file:", adjustr(trim(filename))
1209 particles=particles, zeff=zcharge, &
1214 END SUBROUTINE print_e_density
1224 SUBROUTINE print_density_cubes(qs_env, zcharge, cube_section, total_density, v_hartree, efield)
1226 TYPE(qs_environment_type),
POINTER :: qs_env
1227 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1228 TYPE(section_vals_type),
POINTER :: cube_section
1229 LOGICAL,
INTENT(IN),
OPTIONAL :: total_density, v_hartree, efield
1231 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
1233 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1234 INTEGER :: id, iounit, ispin, nd(3), unit_nr
1235 LOGICAL :: append_cube, mpi_io, my_efield, &
1236 my_total_density, my_v_hartree
1237 REAL(kind=dp) :: total_rho_core_rspace, udvol
1238 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1239 TYPE(cell_type),
POINTER :: cell
1240 TYPE(cp_logger_type),
POINTER :: logger
1241 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1242 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1243 TYPE(dft_control_type),
POINTER :: dft_control
1244 TYPE(particle_list_type),
POINTER :: particles
1245 TYPE(pw_c1d_gs_type) :: rho_core
1246 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1247 TYPE(pw_env_type),
POINTER :: pw_env
1248 TYPE(pw_poisson_parameter_type) :: poisson_params
1249 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1250 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1251 TYPE(pw_r3d_rs_type) :: rho_tot_rspace
1252 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1253 TYPE(qs_ks_env_type),
POINTER :: ks_env
1254 TYPE(qs_rho_type),
POINTER :: rho
1255 TYPE(qs_subsys_type),
POINTER :: subsys
1257 CALL get_qs_env(qs_env, cell=cell, dft_control=dft_control)
1259 append_cube = section_get_lval(cube_section,
"APPEND")
1260 my_pos_cube =
"REWIND"
1261 IF (append_cube) my_pos_cube =
"APPEND"
1263 IF (
PRESENT(total_density))
THEN
1264 my_total_density = total_density
1266 my_total_density = .false.
1268 IF (
PRESENT(v_hartree))
THEN
1269 my_v_hartree = v_hartree
1271 my_v_hartree = .false.
1273 IF (
PRESENT(efield))
THEN
1279 logger => cp_get_default_logger()
1280 iounit = cp_logger_get_default_io_unit(logger)
1283 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1284 NULLIFY (rho_r, rho_g, tot_rho_r)
1285 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1286 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1287 DO ispin = 1, dft_control%nspins
1288 rho_ao => rho_ao_kp(ispin, :)
1289 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1291 rho_gspace=rho_g(ispin), &
1292 total_rho=tot_rho_r(ispin), &
1295 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1297 CALL get_qs_env(qs_env, subsys=subsys)
1298 CALL qs_subsys_get(subsys, particles=particles)
1300 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1301 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1302 CALL auxbas_pw_pool%create_pw(pw=rho_core)
1303 CALL calculate_rho_core(rho_core, total_rho_core_rspace, qs_env)
1305 IF (iounit > 0)
THEN
1306 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1307 "Integrated electronic density:", sum(tot_rho_r(:))
1308 WRITE (unit=iounit, fmt=
"(T2,A,T66,F15.6)") &
1309 "Integrated core density:", total_rho_core_rspace
1312 CALL auxbas_pw_pool%create_pw(pw=rho_tot_rspace)
1313 CALL pw_transfer(rho_core, rho_tot_rspace)
1314 DO ispin = 1, dft_control%nspins
1315 CALL pw_axpy(rho_r(ispin), rho_tot_rspace)
1318 IF (my_total_density)
THEN
1319 filename =
"TOTAL_DENSITY"
1321 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1322 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1323 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1324 IF (iounit > 0)
THEN
1325 IF (.NOT. mpi_io)
THEN
1326 INQUIRE (unit=unit_nr, name=filename)
1328 filename = mpi_filename
1330 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1331 "The total density is written in cube file format to the file:", adjustr(trim(filename))
1333 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"TOTAL DENSITY", &
1334 particles=particles, zeff=zcharge, &
1335 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1336 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1338 IF (my_v_hartree .OR. my_efield)
THEN
1340 TYPE(pw_c1d_gs_type) :: rho_tot_gspace
1341 CALL auxbas_pw_pool%create_pw(pw=rho_tot_gspace)
1342 CALL pw_transfer(rho_tot_rspace, rho_tot_gspace)
1343 poisson_params%solver = pw_poisson_analytic
1344 poisson_params%periodic = cell%perd
1345 poisson_params%ewald_type = do_ewald_none
1347 TYPE(greens_fn_type) :: green_fft
1348 TYPE(pw_grid_type),
POINTER :: pwdummy
1350 CALL pw_green_create(green_fft, poisson_params, cell%hmat, auxbas_pw_pool, pwdummy, pwdummy)
1351 rho_tot_gspace%array(:) = rho_tot_gspace%array(:)*green_fft%influence_fn%array(:)
1352 CALL pw_green_release(green_fft, auxbas_pw_pool)
1354 IF (my_v_hartree)
THEN
1356 TYPE(pw_r3d_rs_type) :: vhartree
1357 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1358 CALL pw_transfer(rho_tot_gspace, vhartree)
1359 filename =
"V_HARTREE"
1361 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1362 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1363 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1364 IF (iounit > 0)
THEN
1365 IF (.NOT. mpi_io)
THEN
1366 INQUIRE (unit=unit_nr, name=filename)
1368 filename = mpi_filename
1370 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1371 "The Hartree potential is written in cube file format to the file:", adjustr(trim(filename))
1373 CALL cp_pw_to_cube(vhartree, unit_nr,
"Hartree Potential", &
1374 particles=particles, zeff=zcharge, &
1375 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1376 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1377 CALL auxbas_pw_pool%give_back_pw(vhartree)
1382 TYPE(pw_c1d_gs_type) :: vhartree
1383 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1384 udvol = 1.0_dp/rho_tot_rspace%pw_grid%dvol
1386 CALL pw_transfer(rho_tot_gspace, vhartree)
1389 CALL pw_derive(vhartree, nd)
1390 CALL pw_transfer(vhartree, rho_tot_rspace)
1391 CALL pw_scale(rho_tot_rspace, udvol)
1393 filename =
"EFIELD_"//cdir(id)
1395 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1396 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1397 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1398 IF (iounit > 0)
THEN
1399 IF (.NOT. mpi_io)
THEN
1400 INQUIRE (unit=unit_nr, name=filename)
1402 filename = mpi_filename
1404 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1405 "The Efield is written in cube file format to the file:", adjustr(trim(filename))
1407 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"EFIELD "//cdir(id), &
1408 particles=particles, zeff=zcharge, &
1409 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1410 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1412 CALL auxbas_pw_pool%give_back_pw(vhartree)
1415 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1419 CALL auxbas_pw_pool%give_back_pw(rho_tot_rspace)
1420 CALL auxbas_pw_pool%give_back_pw(rho_core)
1422 END SUBROUTINE print_density_cubes
1430 SUBROUTINE print_elf(qs_env, zcharge, elf_section)
1432 TYPE(qs_environment_type),
POINTER :: qs_env
1433 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1434 TYPE(section_vals_type),
POINTER :: elf_section
1436 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1438 INTEGER :: iounit, ispin, unit_nr
1439 LOGICAL :: append_cube, mpi_io
1440 REAL(kind=dp) :: rho_cutoff
1441 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1442 TYPE(cp_logger_type),
POINTER :: logger
1443 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1444 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1445 TYPE(dft_control_type),
POINTER :: dft_control
1446 TYPE(particle_list_type),
POINTER :: particles
1447 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1448 TYPE(pw_env_type),
POINTER :: pw_env
1449 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1450 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1451 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: elf_r
1452 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1453 TYPE(qs_ks_env_type),
POINTER :: ks_env
1454 TYPE(qs_rho_type),
POINTER :: rho
1455 TYPE(qs_subsys_type),
POINTER :: subsys
1457 logger => cp_get_default_logger()
1458 iounit = cp_logger_get_default_io_unit(logger)
1461 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env, rho=rho)
1462 NULLIFY (rho_r, rho_g, tot_rho_r)
1463 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1464 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1465 DO ispin = 1, dft_control%nspins
1466 rho_ao => rho_ao_kp(ispin, :)
1467 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1469 rho_gspace=rho_g(ispin), &
1470 total_rho=tot_rho_r(ispin), &
1473 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1475 CALL get_qs_env(qs_env, subsys=subsys)
1476 CALL qs_subsys_get(subsys, particles=particles)
1478 ALLOCATE (elf_r(dft_control%nspins))
1479 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1480 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1481 DO ispin = 1, dft_control%nspins
1482 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1483 CALL pw_zero(elf_r(ispin))
1486 IF (iounit > 0)
THEN
1487 WRITE (unit=iounit, fmt=
"(/,T2,A)") &
1488 "ELF is computed on the real space grid -----"
1490 rho_cutoff = section_get_rval(elf_section,
"density_cutoff")
1491 CALL qs_elf_calc(qs_env, elf_r, rho_cutoff)
1494 append_cube = section_get_lval(elf_section,
"APPEND")
1495 my_pos_cube =
"REWIND"
1496 IF (append_cube) my_pos_cube =
"APPEND"
1497 DO ispin = 1, dft_control%nspins
1498 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1499 WRITE (title, *)
"ELF spin ", ispin
1501 unit_nr = cp_print_key_unit_nr(logger, elf_section,
'', extension=
".cube", &
1502 middle_name=trim(filename), file_position=my_pos_cube, &
1503 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1504 IF (iounit > 0)
THEN
1505 IF (.NOT. mpi_io)
THEN
1506 INQUIRE (unit=unit_nr, name=filename)
1508 filename = mpi_filename
1510 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1511 "ELF is written in cube file format to the file:", adjustr(trim(filename))
1514 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
1515 stride=section_get_ivals(elf_section,
"STRIDE"), mpi_io=mpi_io)
1516 CALL cp_print_key_finished_output(unit_nr, logger, elf_section,
'', mpi_io=mpi_io)
1518 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1523 END SUBROUTINE print_elf
1530 SUBROUTINE print_mo_cubes(qs_env, zcharge, cube_section)
1532 TYPE(qs_environment_type),
POINTER :: qs_env
1533 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1534 TYPE(section_vals_type),
POINTER :: cube_section
1536 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1537 INTEGER :: homo, i, ifirst, ilast, iounit, ir, &
1538 ispin, ivector, n_rep, nhomo, nlist, &
1539 nlumo, nmo, shomo, unit_nr
1540 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1541 LOGICAL :: append_cube, mpi_io, write_cube
1542 REAL(kind=dp) :: homo_lumo(2, 2)
1543 REAL(kind=dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
1544 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1545 TYPE(cell_type),
POINTER :: cell
1546 TYPE(cp_fm_type),
POINTER :: mo_coeff
1547 TYPE(cp_logger_type),
POINTER :: logger
1548 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
1549 TYPE(dft_control_type),
POINTER :: dft_control
1550 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1551 TYPE(particle_list_type),
POINTER :: particles
1552 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1553 TYPE(pw_c1d_gs_type) :: wf_g
1554 TYPE(pw_env_type),
POINTER :: pw_env
1555 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1556 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1557 TYPE(pw_r3d_rs_type) :: wf_r
1558 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1559 TYPE(qs_subsys_type),
POINTER :: subsys
1560 TYPE(scf_control_type),
POINTER :: scf_control
1562 logger => cp_get_default_logger()
1563 iounit = cp_logger_get_default_io_unit(logger)
1565 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv, scf_control=scf_control)
1566 CALL get_qs_env(qs_env, dft_control=dft_control, mo_derivs=mo_derivs)
1567 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
1568 NULLIFY (mo_eigenvalues)
1570 DO ispin = 1, dft_control%nspins
1571 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=shomo)
1572 homo_lumo(ispin, 1) = mo_eigenvalues(shomo)
1573 homo = max(homo, shomo)
1575 write_cube = section_get_lval(cube_section,
"WRITE_CUBE")
1576 nlumo = section_get_ival(cube_section,
"NLUMO")
1577 nhomo = section_get_ival(cube_section,
"NHOMO")
1578 NULLIFY (list_index)
1579 CALL section_vals_val_get(cube_section,
"HOMO_LIST", n_rep_val=n_rep)
1584 CALL section_vals_val_get(cube_section,
"HOMO_LIST", i_rep_val=ir, i_vals=
list)
1585 IF (
ASSOCIATED(
list))
THEN
1586 CALL reallocate(list_index, 1, nlist +
SIZE(
list))
1587 DO i = 1,
SIZE(
list)
1588 list_index(i + nlist) =
list(i)
1590 nlist = nlist +
SIZE(
list)
1593 nhomo = maxval(list_index)
1595 IF (nhomo == -1) nhomo = homo
1596 nlist = homo - max(1, homo - nhomo + 1) + 1
1597 ALLOCATE (list_index(nlist))
1599 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1603 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1604 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1605 CALL auxbas_pw_pool%create_pw(wf_r)
1606 CALL auxbas_pw_pool%create_pw(wf_g)
1608 CALL get_qs_env(qs_env, subsys=subsys)
1609 CALL qs_subsys_get(subsys, particles=particles)
1611 append_cube = section_get_lval(cube_section,
"APPEND")
1612 my_pos_cube =
"REWIND"
1613 IF (append_cube)
THEN
1614 my_pos_cube =
"APPEND"
1617 CALL get_qs_env(qs_env=qs_env, &
1618 atomic_kind_set=atomic_kind_set, &
1619 qs_kind_set=qs_kind_set, &
1621 particle_set=particle_set)
1623 IF (nhomo >= 0)
THEN
1624 DO ispin = 1, dft_control%nspins
1626 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1627 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1628 IF (write_cube)
THEN
1630 ivector = list_index(i)
1631 IF (ivector > homo) cycle
1632 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1633 cell, dft_control, particle_set, pw_env)
1634 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1636 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1637 middle_name=trim(filename), file_position=my_pos_cube, &
1638 log_filename=.false., mpi_io=mpi_io)
1639 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1640 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1641 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1642 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1648 IF (nlumo /= 0)
THEN
1649 DO ispin = 1, dft_control%nspins
1651 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1652 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1653 IF (write_cube)
THEN
1655 IF (nlumo == -1)
THEN
1658 ilast = ifirst + nlumo - 1
1659 ilast = min(nmo, ilast)
1661 DO ivector = ifirst, ilast
1662 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, &
1663 qs_kind_set, cell, dft_control, particle_set, pw_env)
1664 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1666 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1667 middle_name=trim(filename), file_position=my_pos_cube, &
1668 log_filename=.false., mpi_io=mpi_io)
1669 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. LUMO + ", ivector - ifirst
1670 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1671 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1672 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1678 CALL auxbas_pw_pool%give_back_pw(wf_g)
1679 CALL auxbas_pw_pool%give_back_pw(wf_r)
1680 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1682 END SUBROUTINE print_mo_cubes
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...
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, cartesian_basis)
...
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_restore(fm_matrix, neig, fm_matrixb, fm_matrixout, op, pos, transa)
apply Cholesky decomposition op can be "SOLVE" (out = U^-1 * in) or "MULTIPLY" (out = U * in) pos can...
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
subroutine, public cp_fm_cholesky_reduce(matrix, matrixb, itype)
reduce a matrix pencil A,B to normal form B has to be cholesky decomposed with cp_fm_cholesky_decompo...
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_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
subroutine, public cp_fm_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)
...
set of type/routines to handle the storage of results in force_envs
subroutine, public cp_results_erase(results, description, nval)
erase a part of result_list
set of type/routines to handle the storage of results in force_envs
Calculation of charge equilibration method.
subroutine, public eeq_print(qs_env, iounit, print_level, ext)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
integer, parameter, public default_path_length
An array-based list which grows on demand. When the internal array is full, a new array of twice the ...
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Definition of mathematical constants and functions.
complex(kind=dp), parameter, public z_one
real(kind=dp), parameter, public twopi
complex(kind=dp), parameter, public z_zero
Utility routines for the memory handling.
Interface to the message passing library MPI.
Functions handling the MOLDEN format. Split from mode_selective.
subroutine, public write_mos_molden(mos, qs_kind_set, particle_set, print_section, cell, unoccupied_orbs, unoccupied_evals, qs_env, calc_energies)
Write out the MOs in molden format for visualisation.
Calculates the moment integrals <a|r^m|b>
subroutine, public get_reference_point(rpoint, drpoint, qs_env, fist_env, reference, ref_point, ifirst, ilast)
...
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
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 debye
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...
computes preconditioners, and implements methods to apply them currently used in qs_ot
methods of pw_env that have dependence on qs_env
subroutine, public pw_env_rebuild(pw_env, qs_env, external_para_env)
rebuilds the pw_env data (necessary if cell or cutoffs change)
subroutine, public pw_env_create(pw_env)
creates a pw_env, if qs_env is given calls pw_env_rebuild
container for various plainwaves related things
subroutine, public pw_env_release(pw_env, para_env)
releases the given pw_env (see doc/ReferenceCounting.html)
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
subroutine, public pw_derive(pw, n)
Calculate the derivative of a plane wave vector.
functions related to the poisson solver on regular grids
subroutine, public pw_green_create(green, poisson_params, cell_hmat, pw_pool, mt_super_ref_pw_grid, dct_pw_grid)
Allocates and sets up the green functions for the fft based poisson solvers.
subroutine, public pw_green_release(gftype, pw_pool)
destroys the type (deallocates data)
integer, parameter, public do_ewald_none
integer, parameter, public pw_poisson_analytic
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
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
Definition of the DFTB parameter types.
Working with the DFTB parameter types.
subroutine, public get_dftb_atom_param(dftb_parameter, name, typ, defined, z, zeff, natorb, lmax, skself, occupation, eta, energy, cutoff, xi, di, rcdisp, dudq)
...
Utilities for broadened DOS and PDOS output.
subroutine, public get_dos_pdos_flags(dos_section, do_dos_output, do_projected_dos, do_pdos, do_pdos_raw)
Resolve projected-DOS requests from a DOS print section.
Calculation and writing of density of states.
subroutine, public calculate_dos(mos, dft_section, unoccupied_evals, smearing_enabled)
Compute and write density of states.
subroutine, public calculate_dos_kp(qs_env, dft_section)
Compute and write density of states (kpoints)
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, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, 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.
subroutine, public set_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, kpoints, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, subsys, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env)
...
subroutine, public get_ks_env(ks_env, v_hartree_rspace, s_mstruct_changed, rho_changed, exc_accint, potential_changed, forces_up_to_date, complex_ks, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, kinetic, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_ks_im_kp, rho, rho_xc, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, vee, neighbor_list_id, sab_orb, sab_all, sac_ae, sac_ppl, sac_lri, sap_ppnl, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_vdw, sab_scp, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, task_list, task_list_soft, kpoints, do_kpoints, atomic_kind_set, qs_kind_set, cell, cell_ref, use_ref_cell, particle_set, energy, force, local_particles, local_molecules, molecule_kind_set, molecule_set, subsys, cp_subsys, virial, results, atprop, nkind, natom, dft_control, dbcsr_dist, distribution_2d, pw_env, para_env, blacs_env, nelectron_total, nelectron_spin)
...
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.
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_kp(qs_env, dft_section, pdos_print_key, write_pdos, write_pdos_raw)
Compute and write broadened projected density of states for k-point calculations.
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, unoccupied_orbs, unoccupied_evals, pdos_print_key, write_pdos, write_pdos_raw)
Compute and write projected density of states.
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(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)
...
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 DFTB.
subroutine, public scf_post_calculation_tb(qs_env, tb_type, no_mos)
collects possible post - scf calculations and prints info / computes properties.
subroutine, public rebuild_pw_env(qs_env)
...
subroutine, public make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
Gets the lumos, and eigenvalues for the lumos.
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)
...
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...
generate the tasks lists used by collocate and integrate routines
subroutine, public generate_qs_task_list(ks_env, task_list, basis_type, reorder_rs_grid_ranks, skip_load_balance_distributed, pw_env_external, sab_orb_external, ext_kpoints)
...
subroutine, public allocate_task_list(task_list)
allocates and initialised the components of the task_list_type
Calculation of charge response in xTB (EEQ only) Reference: Stefan Grimme, Christoph Bannwarth,...
subroutine, public build_xtb_qresp(qs_env, qresp)
...
Definition of the xTB parameter types.
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
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...
contains arbitrary information which need to be stored
stores all the informations relevant to an mpi environment
represent a list of objects
contained for different pw related things
contains all the informations needed by the fft based poisson solvers
parameters for the poisson solver independet of input_section
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.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
keeps the density in various representations, keeping track of which ones are valid.