145#include "./base/base_uses.f90"
151 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_tb'
171 CHARACTER(LEN=*) :: tb_type
172 LOGICAL,
INTENT(IN) :: no_mos
174 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_tb'
176 CHARACTER(LEN=6) :: ana
177 CHARACTER(LEN=default_string_length) :: aname
178 INTEGER :: after, gfn_type, handle, homo, iat, iatom, ikind, img, ispin, iw, nat, natom, &
179 nkind, nlumo_stm, nlumos, nspins, print_level, unit_nr
180 LOGICAL :: do_cube, do_kpoints, explicit, gfn0, &
181 has_homo, omit_headers, print_it, &
183 REAL(kind=
dp) :: zeff
184 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge, zcharge
185 REAL(kind=
dp),
DIMENSION(2, 2) :: homo_lumo
186 REAL(kind=
dp),
DIMENSION(:),
POINTER :: echarge, mo_eigenvalues
187 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
189 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: unoccupied_evals_stm
190 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs_stm
193 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
194 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_p, matrix_s
202 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
208 print_section, sprint_section, &
212 CALL timeset(routinen, handle)
218 CALL get_qs_env(qs_env, dft_control=dft_control)
219 SELECT CASE (trim(tb_type))
222 gfn_type = dft_control%qs_control%xtb_control%gfn_type
223 gfn0 = (gfn_type == 0)
224 vdip = dft_control%qs_control%xtb_control%var_dipole
226 cpabort(
"unknown TB type")
229 cpassert(
ASSOCIATED(qs_env))
230 NULLIFY (rho, para_env, matrix_s, matrix_p)
231 CALL get_qs_env(qs_env, scf_env=scf_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
232 rho=rho, natom=natom, para_env=para_env, &
233 particle_set=particle_set, do_kpoints=do_kpoints, matrix_s_kp=matrix_s)
234 nspins = dft_control%nspins
237 ALLOCATE (charges(natom, nspins), mcharge(natom))
241 ALLOCATE (zcharge(natom))
242 nkind =
SIZE(atomic_kind_set)
245 SELECT CASE (trim(tb_type))
247 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
250 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
253 cpabort(
"unknown TB type")
256 iat = atomic_kind_set(ikind)%atom_list(iatom)
257 mcharge(iat) = zeff - sum(charges(iat, 1:nspins))
269 extension=
".mulliken", log_filename=.false.)
270 IF (unit_nr > 0)
THEN
271 WRITE (unit=unit_nr, fmt=
"(/,/,T2,A)")
"MULLIKEN POPULATION ANALYSIS"
272 IF (nspins == 1)
THEN
273 WRITE (unit=unit_nr, fmt=
"(/,T2,A,T70,A)") &
274 " # Atom Element Kind Atomic population",
" Net charge"
278 SELECT CASE (tb_type)
280 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
283 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
286 cpabort(
"unknown TB type")
288 ana = adjustr(trim(adjustl(aname)))
290 iat = atomic_kind_set(ikind)%atom_list(iatom)
291 WRITE (unit=unit_nr, &
292 fmt=
"(T2,I7,5X,A6,I6,T39,F12.6,T69,F12.6)") &
293 iat, adjustl(ana), ikind, charges(iat, 1), mcharge(iat)
296 WRITE (unit=unit_nr, &
297 fmt=
"(T2,A,T39,F12.6,T69,F12.6,/)") &
298 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
300 WRITE (unit=unit_nr, fmt=
"(/,T2,A)") &
301 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
305 SELECT CASE (tb_type)
307 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
310 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
313 cpabort(
"unknown TB type")
315 ana = adjustr(trim(adjustl(aname)))
317 iat = atomic_kind_set(ikind)%atom_list(iatom)
318 WRITE (unit=unit_nr, &
319 fmt=
"(T2,I6,3X,A6,I6,T29,4(1X,F12.6))") &
320 iat, adjustl(ana), ikind, charges(iat, 1:2), mcharge(iat), &
321 charges(iat, 1) - charges(iat, 2)
324 WRITE (unit=unit_nr, &
325 fmt=
"(T2,A,T29,4(1X,F12.6),/)") &
326 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
336 SELECT CASE (tb_type)
338 cpwarn(
"Lowdin population analysis not implemented for DFTB method.")
341 log_filename=.false.)
344 IF (print_it) print_level = 2
346 IF (print_it) print_level = 3
348 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
354 cpabort(
"unknown TB type")
362 extension=
".eeq", log_filename=.false.)
363 CALL eeq_print(qs_env, unit_nr, print_level, ext=gfn0)
372 cpwarn(
"Hirshfeld charges not available for TB methods.")
381 cpwarn(
"MAO analysis not available for TB methods.")
390 cpwarn(
"ED analysis not available for TB methods.")
398 extension=
".data", middle_name=
"tb_dipole", log_filename=.false.)
403 cpassert(
ASSOCIATED(echarge))
406 mcharge(1:natom) = echarge(1:natom) - mcharge(1:natom)
408 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
410 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
415 DEALLOCATE (charges, mcharge)
418 IF (.NOT. no_mos)
THEN
422 IF (.NOT. do_kpoints)
THEN
423 SELECT CASE (tb_type)
430 cpabort(
"Unknown TB type")
437 IF (.NOT. no_mos)
THEN
440 IF (explicit .AND. .NOT. qs_env%run_rtp)
CALL wfn_mix_tb(qs_env, dft_section, scf_env)
443 IF (.NOT. no_mos)
THEN
456 IF (.NOT. no_mos)
THEN
460 cpwarn(
"Projected density of states not implemented for k-points.")
462 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
463 DO ispin = 1, dft_control%nspins
465 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
466 eigenvalues=mo_eigenvalues)
467 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
468 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
470 mo_coeff_deriv => null()
473 do_rotation=.true., &
474 co_rotate_dbcsr=mo_coeff_deriv)
477 IF (dft_control%nspins == 2)
THEN
479 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
482 qs_kind_set, particle_set, qs_env, dft_section)
490 SELECT CASE (tb_type)
498 cpabort(
"unknown TB type")
506 cpwarn(
"Energy Windows not implemented for k-points.")
509 CALL rebuild_pw_env(qs_env)
515 cpwarn(
"Energy Windows not implemented for TB methods.")
524 CALL rebuild_pw_env(qs_env)
527 CALL print_e_density(qs_env, zcharge, print_key)
529 cpwarn(
"Electronic density cube file not implemented for TB methods.")
538 CALL rebuild_pw_env(qs_env)
541 CALL print_density_cubes(qs_env, zcharge, print_key, total_density=.true.)
543 cpwarn(
"Total density cube file not implemented for TB methods.")
552 CALL rebuild_pw_env(qs_env)
555 CALL print_density_cubes(qs_env, zcharge, print_key, v_hartree=.true.)
557 cpwarn(
"Hartree potential cube file not implemented for TB methods.")
566 CALL rebuild_pw_env(qs_env)
569 CALL print_density_cubes(qs_env, zcharge, print_key, efield=.true.)
571 cpwarn(
"Efield cube file not implemented for TB methods.")
580 CALL rebuild_pw_env(qs_env)
583 CALL print_elf(qs_env, zcharge, print_key)
585 cpwarn(
"ELF not implemented for TB methods.")
590 IF (.NOT. no_mos)
THEN
595 CALL rebuild_pw_env(qs_env)
598 CALL print_mo_cubes(qs_env, zcharge, print_key)
600 cpwarn(
"Printing of MO cube files not implemented for TB methods.")
606 IF (.NOT. no_mos)
THEN
611 CALL rebuild_pw_env(qs_env)
615 cpwarn(
"STM not implemented for k-point calculations!")
618 cpassert(.NOT. dft_control%restricted)
619 CALL get_qs_env(qs_env, mos=mos, mo_derivs=mo_derivs, &
620 scf_control=scf_control, matrix_ks=ks_rmpv)
621 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
622 DO ispin = 1, dft_control%nspins
623 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
624 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
627 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
628 IF (nlumo_stm > 0)
THEN
629 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
630 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
631 CALL make_lumo_tb(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
637 CALL th_stm_image(qs_env, print_key, particles, unoccupied_orbs_stm, &
638 unoccupied_evals_stm)
640 IF (nlumo_stm > 0)
THEN
641 DO ispin = 1, dft_control%nspins
642 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
644 DEALLOCATE (unoccupied_evals_stm)
653 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks)
660 after = min(max(after, 1), 16)
661 DO ispin = 1, dft_control%nspins
662 DO img = 1,
SIZE(matrix_p, 2)
664 para_env, output_unit=iw, omit_headers=omit_headers)
672 "AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file))
THEN
676 after = min(max(after, 1), 16)
677 DO ispin = 1, dft_control%nspins
678 DO img = 1,
SIZE(matrix_ks, 2)
680 output_unit=iw, omit_headers=omit_headers)
693 cpwarn(
"XC potential cube file not available for TB methods.")
702 cpwarn(
"Electric field gradient not implemented for TB methods.")
711 cpwarn(
"Kinetic energy not available for TB methods.")
720 cpwarn(
"Xray diffraction spectrum not implemented for TB methods.")
729 cpwarn(
"Hyperfine Coupling not implemented for TB methods.")
738 cpwarn(
"DFT+U method not implemented for TB methods.")
749 CALL timestop(handle)
760 SUBROUTINE tb_dipole(qs_env, input, unit_nr, charges)
764 INTEGER,
INTENT(in) :: unit_nr
765 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: charges
767 CHARACTER(LEN=default_string_length) :: description, dipole_type
768 COMPLEX(KIND=dp) :: dzeta, dzphase(3), zeta, zphase(3)
769 COMPLEX(KIND=dp),
DIMENSION(3) :: dggamma, ggamma
770 INTEGER :: i, iat, ikind, j, nat, reference
772 REAL(kind=
dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
773 dtheta, gvec(3), q, rcc(3), ria(3), theta, tmp(3), via(3)
774 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
780 NULLIFY (atomic_kind_set, cell, results)
781 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
782 particle_set=particle_set, cell=cell, results=results)
787 description =
'[DIPOLE]'
791 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
794 dipole_deriv = 0.0_dp
797 dipole_type =
"periodic (Berry phase)"
800 charge_tot = sum(charges)
801 ria =
twopi*matmul(cell%h_inv, rcc)
802 zphase = cmplx(cos(ria), sin(ria),
dp)**charge_tot
804 dria =
twopi*matmul(cell%h_inv, drcc)
805 dzphase = charge_tot*cmplx(-sin(ria), cos(ria),
dp)**(charge_tot - 1.0_dp)*dria
809 DO ikind = 1,
SIZE(atomic_kind_set)
812 iat = atomic_kind_set(ikind)%atom_list(i)
813 ria = particle_set(iat)%r(:)
815 via = particle_set(iat)%v(:)
818 gvec =
twopi*cell%h_inv(j, :)
819 theta = sum(ria(:)*gvec(:))
820 dtheta = sum(via(:)*gvec(:))
821 zeta = cmplx(cos(theta), sin(theta), kind=
dp)**(-q)
822 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=
dp)**(-q - 1.0_dp)*dtheta
823 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
824 ggamma(j) = ggamma(j)*zeta
828 dggamma = dggamma*zphase + ggamma*dzphase
829 ggamma = ggamma*zphase
830 IF (all(real(ggamma, kind=
dp) /= 0.0_dp))
THEN
831 tmp = aimag(ggamma)/real(ggamma, kind=
dp)
833 dci = -(1.0_dp/(1.0_dp + tmp**2))* &
834 (aimag(dggamma)*real(ggamma, kind=
dp) - aimag(ggamma)*real(dggamma, kind=
dp))/(real(ggamma, kind=
dp))**2
835 dipole = matmul(cell%hmat, ci)/
twopi
836 dipole_deriv = matmul(cell%hmat, dci)/
twopi
839 dipole_type =
"non-periodic"
840 DO i = 1,
SIZE(particle_set)
842 ria = particle_set(i)%r(:)
844 dipole = dipole + q*(ria - rcc)
845 dipole_deriv(:) = dipole_deriv(:) + q*(particle_set(i)%v(:) - drcc)
849 CALL put_results(results=results, description=description, &
851 IF (unit_nr > 0)
THEN
852 WRITE (unit_nr,
'(/,T2,A,T31,A50)') &
853 'TB_DIPOLE| Dipole type', adjustr(trim(dipole_type))
854 WRITE (unit_nr,
"(T2,A,T30,3(1X,F16.8))")
"TB_DIPOLE| Ref. Point [Bohr]", rcc
855 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
856 'TB_DIPOLE| Moment [a.u.]', dipole(1:3)
857 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
858 'TB_DIPOLE| Moment [Debye]', dipole(1:3)*
debye
859 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
860 'TB_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
863 END SUBROUTINE tb_dipole
874 SUBROUTINE wfn_mix_tb(qs_env, dft_section, scf_env)
880 INTEGER :: ispin, nao, nmo, output_unit
881 REAL(
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
884 TYPE(
cp_fm_type) :: ks_tmp, mo_tmp, s_tmp, work
885 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumos
888 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
892 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
896 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks, &
897 particle_set=particle_set, atomic_kind_set=atomic_kind_set, &
898 qs_kind_set=qs_kind_set, mos=mos, para_env=para_env)
902 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao)
905 template_fmstruct=mo_coeff%matrix_struct)
910 ALLOCATE (lumos(
SIZE(mos)))
915 DO ispin = 1,
SIZE(mos)
916 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, nmo=nmo)
917 CALL cp_fm_struct_create(fmstruct=ao_lumo_struct, nrow_global=nao, ncol_global=nao - nmo, &
918 template_fmstruct=mo_coeff%matrix_struct)
920 CALL cp_fm_create(lumos(ispin), matrix_struct=ao_lumo_struct)
932 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
933 unoccupied_orbs=lumos, scf_env=scf_env, matrix_s=matrix_s)
942 END SUBROUTINE wfn_mix_tb
953 SUBROUTINE make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
957 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
958 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_evals
960 INTEGER,
INTENT(OUT) :: nlumos
962 INTEGER :: homo, iounit, ispin, n, nao, nmo
967 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
974 NULLIFY (mos, ks_rmpv, scf_control, dft_control, para_env, blacs_env)
978 scf_control=scf_control, &
979 dft_control=dft_control, &
987 DO ispin = 1, dft_control%nspins
988 NULLIFY (unoccupied_evals(ispin)%array)
990 IF (iounit > 0)
WRITE (iounit, *)
" "
991 IF (iounit > 0)
WRITE (iounit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
992 IF (iounit > 0)
WRITE (iounit, fmt=
'(1X,A)')
"-----------------------------------------------------"
993 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
995 nlumos = max(1, min(nlumo, nao - nmo))
996 IF (nlumo == -1) nlumos = nao - nmo
997 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
999 nrow_global=n, ncol_global=nlumos)
1000 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1005 NULLIFY (local_preconditioner)
1006 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1007 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1010 NULLIFY (local_preconditioner)
1014 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1015 matrix_c_fm=unoccupied_orbs(ispin), &
1016 matrix_orthogonal_space_fm=mo_coeff, &
1017 eps_gradient=scf_control%eps_lumos, &
1019 iter_max=scf_control%max_iter_lumos, &
1020 size_ortho_space=nmo)
1023 unoccupied_evals(ispin)%array, scr=iounit, &
1034 SUBROUTINE rebuild_pw_env(qs_env)
1038 LOGICAL :: skip_load_balance_distributed
1046 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=new_pw_env)
1047 IF (.NOT.
ASSOCIATED(new_pw_env))
THEN
1052 CALL get_qs_env(qs_env, pw_env=new_pw_env, dft_control=dft_control, cell=cell)
1054 new_pw_env%cell_hmat = cell%hmat
1059 IF (.NOT.
ASSOCIATED(task_list))
THEN
1063 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1065 reorder_rs_grid_ranks=.true., &
1066 skip_load_balance_distributed=skip_load_balance_distributed)
1068 CALL qs_rho_rebuild(rho, qs_env=qs_env, rebuild_ao=.false., rebuild_grids=.true.)
1070 END SUBROUTINE rebuild_pw_env
1078 SUBROUTINE print_e_density(qs_env, zcharge, cube_section)
1081 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1084 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1085 INTEGER :: iounit, ispin, unit_nr
1086 LOGICAL :: append_cube, mpi_io
1087 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
1090 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1102 CALL get_qs_env(qs_env, dft_control=dft_control)
1105 my_pos_cube =
"REWIND"
1106 IF (append_cube) my_pos_cube =
"APPEND"
1112 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1113 NULLIFY (rho_r, rho_g, tot_rho_r)
1115 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1116 DO ispin = 1, dft_control%nspins
1117 rho_ao => rho_ao_kp(ispin, :)
1120 rho_gspace=rho_g(ispin), &
1121 total_rho=tot_rho_r(ispin), &
1124 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1129 IF (dft_control%nspins > 1)
THEN
1130 IF (iounit > 0)
THEN
1131 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,2F15.6)") &
1132 "Integrated alpha and beta electronic density:", tot_rho_r(1:2)
1134 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1135 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1138 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
1139 CALL pw_copy(rho_r(1), rho_elec_rspace)
1140 CALL pw_axpy(rho_r(2), rho_elec_rspace)
1141 filename =
"ELECTRON_DENSITY"
1144 extension=
".cube", middle_name=trim(filename), &
1145 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1147 IF (iounit > 0)
THEN
1148 IF (.NOT. mpi_io)
THEN
1149 INQUIRE (unit=unit_nr, name=filename)
1151 filename = mpi_filename
1153 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1154 "The sum of alpha and beta density is written in cube file format to the file:", adjustr(trim(filename))
1156 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
1157 particles=particles, zeff=zcharge, stride=
section_get_ivals(cube_section,
"STRIDE"), &
1160 CALL pw_copy(rho_r(1), rho_elec_rspace)
1161 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
1162 filename =
"SPIN_DENSITY"
1165 extension=
".cube", middle_name=trim(filename), &
1166 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1168 IF (iounit > 0)
THEN
1169 IF (.NOT. mpi_io)
THEN
1170 INQUIRE (unit=unit_nr, name=filename)
1172 filename = mpi_filename
1174 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1175 "The spin density is written in cube file format to the file:", adjustr(trim(filename))
1177 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
1178 particles=particles, zeff=zcharge, &
1181 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
1184 IF (iounit > 0)
THEN
1185 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1186 "Integrated electronic density:", tot_rho_r(1)
1188 filename =
"ELECTRON_DENSITY"
1191 extension=
".cube", middle_name=trim(filename), &
1192 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1194 IF (iounit > 0)
THEN
1195 IF (.NOT. mpi_io)
THEN
1196 INQUIRE (unit=unit_nr, name=filename)
1198 filename = mpi_filename
1200 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1201 "The electron density is written in cube file format to the file:", adjustr(trim(filename))
1204 particles=particles, zeff=zcharge, &
1209 END SUBROUTINE print_e_density
1219 SUBROUTINE print_density_cubes(qs_env, zcharge, cube_section, total_density, v_hartree, efield)
1221 TYPE(qs_environment_type),
POINTER :: qs_env
1222 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1223 TYPE(section_vals_type),
POINTER :: cube_section
1224 LOGICAL,
INTENT(IN),
OPTIONAL :: total_density, v_hartree, efield
1226 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
1228 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1229 INTEGER :: id, iounit, ispin, nd(3), unit_nr
1230 LOGICAL :: append_cube, mpi_io, my_efield, &
1231 my_total_density, my_v_hartree
1232 REAL(kind=dp) :: total_rho_core_rspace, udvol
1233 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1234 TYPE(cell_type),
POINTER :: cell
1235 TYPE(cp_logger_type),
POINTER :: logger
1236 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1237 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1238 TYPE(dft_control_type),
POINTER :: dft_control
1239 TYPE(particle_list_type),
POINTER :: particles
1240 TYPE(pw_c1d_gs_type) :: rho_core
1241 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1242 TYPE(pw_env_type),
POINTER :: pw_env
1243 TYPE(pw_poisson_parameter_type) :: poisson_params
1244 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1245 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1246 TYPE(pw_r3d_rs_type) :: rho_tot_rspace
1247 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1248 TYPE(qs_ks_env_type),
POINTER :: ks_env
1249 TYPE(qs_rho_type),
POINTER :: rho
1250 TYPE(qs_subsys_type),
POINTER :: subsys
1252 CALL get_qs_env(qs_env, cell=cell, dft_control=dft_control)
1254 append_cube = section_get_lval(cube_section,
"APPEND")
1255 my_pos_cube =
"REWIND"
1256 IF (append_cube) my_pos_cube =
"APPEND"
1258 IF (
PRESENT(total_density))
THEN
1259 my_total_density = total_density
1261 my_total_density = .false.
1263 IF (
PRESENT(v_hartree))
THEN
1264 my_v_hartree = v_hartree
1266 my_v_hartree = .false.
1268 IF (
PRESENT(efield))
THEN
1274 logger => cp_get_default_logger()
1275 iounit = cp_logger_get_default_io_unit(logger)
1278 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1279 NULLIFY (rho_r, rho_g, tot_rho_r)
1280 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1281 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1282 DO ispin = 1, dft_control%nspins
1283 rho_ao => rho_ao_kp(ispin, :)
1284 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1286 rho_gspace=rho_g(ispin), &
1287 total_rho=tot_rho_r(ispin), &
1290 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1292 CALL get_qs_env(qs_env, subsys=subsys)
1293 CALL qs_subsys_get(subsys, particles=particles)
1295 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1296 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1297 CALL auxbas_pw_pool%create_pw(pw=rho_core)
1298 CALL calculate_rho_core(rho_core, total_rho_core_rspace, qs_env)
1300 IF (iounit > 0)
THEN
1301 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1302 "Integrated electronic density:", sum(tot_rho_r(:))
1303 WRITE (unit=iounit, fmt=
"(T2,A,T66,F15.6)") &
1304 "Integrated core density:", total_rho_core_rspace
1307 CALL auxbas_pw_pool%create_pw(pw=rho_tot_rspace)
1308 CALL pw_transfer(rho_core, rho_tot_rspace)
1309 DO ispin = 1, dft_control%nspins
1310 CALL pw_axpy(rho_r(ispin), rho_tot_rspace)
1313 IF (my_total_density)
THEN
1314 filename =
"TOTAL_DENSITY"
1316 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1317 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1318 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1319 IF (iounit > 0)
THEN
1320 IF (.NOT. mpi_io)
THEN
1321 INQUIRE (unit=unit_nr, name=filename)
1323 filename = mpi_filename
1325 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1326 "The total density is written in cube file format to the file:", adjustr(trim(filename))
1328 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"TOTAL DENSITY", &
1329 particles=particles, zeff=zcharge, &
1330 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1331 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1333 IF (my_v_hartree .OR. my_efield)
THEN
1335 TYPE(pw_c1d_gs_type) :: rho_tot_gspace
1336 CALL auxbas_pw_pool%create_pw(pw=rho_tot_gspace)
1337 CALL pw_transfer(rho_tot_rspace, rho_tot_gspace)
1338 poisson_params%solver = pw_poisson_analytic
1339 poisson_params%periodic = cell%perd
1340 poisson_params%ewald_type = do_ewald_none
1342 TYPE(greens_fn_type) :: green_fft
1343 TYPE(pw_grid_type),
POINTER :: pwdummy
1345 CALL pw_green_create(green_fft, poisson_params, cell%hmat, auxbas_pw_pool, pwdummy, pwdummy)
1346 rho_tot_gspace%array(:) = rho_tot_gspace%array(:)*green_fft%influence_fn%array(:)
1347 CALL pw_green_release(green_fft, auxbas_pw_pool)
1349 IF (my_v_hartree)
THEN
1351 TYPE(pw_r3d_rs_type) :: vhartree
1352 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1353 CALL pw_transfer(rho_tot_gspace, vhartree)
1354 filename =
"V_HARTREE"
1356 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1357 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1358 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1359 IF (iounit > 0)
THEN
1360 IF (.NOT. mpi_io)
THEN
1361 INQUIRE (unit=unit_nr, name=filename)
1363 filename = mpi_filename
1365 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1366 "The Hartree potential is written in cube file format to the file:", adjustr(trim(filename))
1368 CALL cp_pw_to_cube(vhartree, unit_nr,
"Hartree Potential", &
1369 particles=particles, zeff=zcharge, &
1370 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1371 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1372 CALL auxbas_pw_pool%give_back_pw(vhartree)
1377 TYPE(pw_c1d_gs_type) :: vhartree
1378 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1379 udvol = 1.0_dp/rho_tot_rspace%pw_grid%dvol
1381 CALL pw_transfer(rho_tot_gspace, vhartree)
1384 CALL pw_derive(vhartree, nd)
1385 CALL pw_transfer(vhartree, rho_tot_rspace)
1386 CALL pw_scale(rho_tot_rspace, udvol)
1388 filename =
"EFIELD_"//cdir(id)
1390 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1391 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1392 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1393 IF (iounit > 0)
THEN
1394 IF (.NOT. mpi_io)
THEN
1395 INQUIRE (unit=unit_nr, name=filename)
1397 filename = mpi_filename
1399 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1400 "The Efield is written in cube file format to the file:", adjustr(trim(filename))
1402 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"EFIELD "//cdir(id), &
1403 particles=particles, zeff=zcharge, &
1404 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1405 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1407 CALL auxbas_pw_pool%give_back_pw(vhartree)
1410 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1414 CALL auxbas_pw_pool%give_back_pw(rho_tot_rspace)
1415 CALL auxbas_pw_pool%give_back_pw(rho_core)
1417 END SUBROUTINE print_density_cubes
1425 SUBROUTINE print_elf(qs_env, zcharge, elf_section)
1427 TYPE(qs_environment_type),
POINTER :: qs_env
1428 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1429 TYPE(section_vals_type),
POINTER :: elf_section
1431 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1433 INTEGER :: iounit, ispin, unit_nr
1434 LOGICAL :: append_cube, mpi_io
1435 REAL(kind=dp) :: rho_cutoff
1436 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1437 TYPE(cp_logger_type),
POINTER :: logger
1438 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1439 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1440 TYPE(dft_control_type),
POINTER :: dft_control
1441 TYPE(particle_list_type),
POINTER :: particles
1442 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1443 TYPE(pw_env_type),
POINTER :: pw_env
1444 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1445 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1446 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: elf_r
1447 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1448 TYPE(qs_ks_env_type),
POINTER :: ks_env
1449 TYPE(qs_rho_type),
POINTER :: rho
1450 TYPE(qs_subsys_type),
POINTER :: subsys
1452 logger => cp_get_default_logger()
1453 iounit = cp_logger_get_default_io_unit(logger)
1456 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env, rho=rho)
1457 NULLIFY (rho_r, rho_g, tot_rho_r)
1458 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1459 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1460 DO ispin = 1, dft_control%nspins
1461 rho_ao => rho_ao_kp(ispin, :)
1462 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1464 rho_gspace=rho_g(ispin), &
1465 total_rho=tot_rho_r(ispin), &
1468 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1470 CALL get_qs_env(qs_env, subsys=subsys)
1471 CALL qs_subsys_get(subsys, particles=particles)
1473 ALLOCATE (elf_r(dft_control%nspins))
1474 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1475 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1476 DO ispin = 1, dft_control%nspins
1477 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1478 CALL pw_zero(elf_r(ispin))
1481 IF (iounit > 0)
THEN
1482 WRITE (unit=iounit, fmt=
"(/,T2,A)") &
1483 "ELF is computed on the real space grid -----"
1485 rho_cutoff = section_get_rval(elf_section,
"density_cutoff")
1486 CALL qs_elf_calc(qs_env, elf_r, rho_cutoff)
1489 append_cube = section_get_lval(elf_section,
"APPEND")
1490 my_pos_cube =
"REWIND"
1491 IF (append_cube) my_pos_cube =
"APPEND"
1492 DO ispin = 1, dft_control%nspins
1493 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1494 WRITE (title, *)
"ELF spin ", ispin
1496 unit_nr = cp_print_key_unit_nr(logger, elf_section,
'', extension=
".cube", &
1497 middle_name=trim(filename), file_position=my_pos_cube, &
1498 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1499 IF (iounit > 0)
THEN
1500 IF (.NOT. mpi_io)
THEN
1501 INQUIRE (unit=unit_nr, name=filename)
1503 filename = mpi_filename
1505 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1506 "ELF is written in cube file format to the file:", adjustr(trim(filename))
1509 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
1510 stride=section_get_ivals(elf_section,
"STRIDE"), mpi_io=mpi_io)
1511 CALL cp_print_key_finished_output(unit_nr, logger, elf_section,
'', mpi_io=mpi_io)
1513 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1518 END SUBROUTINE print_elf
1525 SUBROUTINE print_mo_cubes(qs_env, zcharge, cube_section)
1527 TYPE(qs_environment_type),
POINTER :: qs_env
1528 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1529 TYPE(section_vals_type),
POINTER :: cube_section
1531 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1532 INTEGER :: homo, i, ifirst, ilast, iounit, ir, &
1533 ispin, ivector, n_rep, nhomo, nlist, &
1534 nlumo, nmo, shomo, unit_nr
1535 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1536 LOGICAL :: append_cube, mpi_io, write_cube
1537 REAL(kind=dp) :: homo_lumo(2, 2)
1538 REAL(kind=dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
1539 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1540 TYPE(cell_type),
POINTER :: cell
1541 TYPE(cp_fm_type),
POINTER :: mo_coeff
1542 TYPE(cp_logger_type),
POINTER :: logger
1543 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
1544 TYPE(dft_control_type),
POINTER :: dft_control
1545 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1546 TYPE(particle_list_type),
POINTER :: particles
1547 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1548 TYPE(pw_c1d_gs_type) :: wf_g
1549 TYPE(pw_env_type),
POINTER :: pw_env
1550 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1551 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1552 TYPE(pw_r3d_rs_type) :: wf_r
1553 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1554 TYPE(qs_subsys_type),
POINTER :: subsys
1555 TYPE(scf_control_type),
POINTER :: scf_control
1557 logger => cp_get_default_logger()
1558 iounit = cp_logger_get_default_io_unit(logger)
1560 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv, scf_control=scf_control)
1561 CALL get_qs_env(qs_env, dft_control=dft_control, mo_derivs=mo_derivs)
1562 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
1563 NULLIFY (mo_eigenvalues)
1565 DO ispin = 1, dft_control%nspins
1566 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=shomo)
1567 homo_lumo(ispin, 1) = mo_eigenvalues(shomo)
1568 homo = max(homo, shomo)
1570 write_cube = section_get_lval(cube_section,
"WRITE_CUBE")
1571 nlumo = section_get_ival(cube_section,
"NLUMO")
1572 nhomo = section_get_ival(cube_section,
"NHOMO")
1573 NULLIFY (list_index)
1574 CALL section_vals_val_get(cube_section,
"HOMO_LIST", n_rep_val=n_rep)
1579 CALL section_vals_val_get(cube_section,
"HOMO_LIST", i_rep_val=ir, i_vals=
list)
1580 IF (
ASSOCIATED(
list))
THEN
1581 CALL reallocate(list_index, 1, nlist +
SIZE(
list))
1582 DO i = 1,
SIZE(
list)
1583 list_index(i + nlist) =
list(i)
1585 nlist = nlist +
SIZE(
list)
1588 nhomo = maxval(list_index)
1590 IF (nhomo == -1) nhomo = homo
1591 nlist = homo - max(1, homo - nhomo + 1) + 1
1592 ALLOCATE (list_index(nlist))
1594 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1598 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1599 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1600 CALL auxbas_pw_pool%create_pw(wf_r)
1601 CALL auxbas_pw_pool%create_pw(wf_g)
1603 CALL get_qs_env(qs_env, subsys=subsys)
1604 CALL qs_subsys_get(subsys, particles=particles)
1606 append_cube = section_get_lval(cube_section,
"APPEND")
1607 my_pos_cube =
"REWIND"
1608 IF (append_cube)
THEN
1609 my_pos_cube =
"APPEND"
1612 CALL get_qs_env(qs_env=qs_env, &
1613 atomic_kind_set=atomic_kind_set, &
1614 qs_kind_set=qs_kind_set, &
1616 particle_set=particle_set)
1618 IF (nhomo >= 0)
THEN
1619 DO ispin = 1, dft_control%nspins
1621 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1622 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1623 IF (write_cube)
THEN
1625 ivector = list_index(i)
1626 IF (ivector > homo) cycle
1627 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1628 cell, dft_control, particle_set, pw_env)
1629 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1631 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1632 middle_name=trim(filename), file_position=my_pos_cube, &
1633 log_filename=.false., mpi_io=mpi_io)
1634 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1635 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1636 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1637 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1643 IF (nlumo /= 0)
THEN
1644 DO ispin = 1, dft_control%nspins
1646 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1647 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1648 IF (write_cube)
THEN
1650 IF (nlumo == -1)
THEN
1653 ilast = ifirst + nlumo - 1
1654 ilast = min(nmo, ilast)
1656 DO ivector = ifirst, ilast
1657 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, &
1658 qs_kind_set, cell, dft_control, particle_set, pw_env)
1659 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1661 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1662 middle_name=trim(filename), file_position=my_pos_cube, &
1663 log_filename=.false., mpi_io=mpi_io)
1664 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. LUMO + ", ivector - ifirst
1665 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1666 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1667 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1673 CALL auxbas_pw_pool%give_back_pw(wf_g)
1674 CALL auxbas_pw_pool%give_back_pw(wf_r)
1675 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1677 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)
...
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)
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)
...
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)
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, 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, 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, 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, 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, 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(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.
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 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)
...
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.