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
190 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: unoccupied_evals_stm
191 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs_stm
194 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
195 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_p, matrix_s
203 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
209 print_section, sprint_section, &
213 CALL timeset(routinen, handle)
219 CALL get_qs_env(qs_env, dft_control=dft_control)
220 SELECT CASE (trim(tb_type))
223 gfn_type = dft_control%qs_control%xtb_control%gfn_type
224 gfn0 = (gfn_type == 0)
225 vdip = dft_control%qs_control%xtb_control%var_dipole
227 cpabort(
"unknown TB type")
230 cpassert(
ASSOCIATED(qs_env))
231 NULLIFY (rho, para_env, matrix_s, matrix_p)
232 CALL get_qs_env(qs_env, scf_env=scf_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
233 rho=rho, natom=natom, para_env=para_env, &
234 particle_set=particle_set, do_kpoints=do_kpoints, matrix_s_kp=matrix_s)
235 nspins = dft_control%nspins
238 ALLOCATE (charges(natom, nspins), mcharge(natom))
242 ALLOCATE (zcharge(natom))
243 nkind =
SIZE(atomic_kind_set)
246 SELECT CASE (trim(tb_type))
248 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
251 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
254 cpabort(
"unknown TB type")
257 iat = atomic_kind_set(ikind)%atom_list(iatom)
258 mcharge(iat) = zeff - sum(charges(iat, 1:nspins))
270 extension=
".mulliken", log_filename=.false.)
271 IF (unit_nr > 0)
THEN
272 WRITE (unit=unit_nr, fmt=
"(/,/,T2,A)")
"MULLIKEN POPULATION ANALYSIS"
273 IF (nspins == 1)
THEN
274 WRITE (unit=unit_nr, fmt=
"(/,T2,A,T70,A)") &
275 " # Atom Element Kind Atomic population",
" Net charge"
279 SELECT CASE (tb_type)
281 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
284 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
287 cpabort(
"unknown TB type")
289 ana = adjustr(trim(adjustl(aname)))
291 iat = atomic_kind_set(ikind)%atom_list(iatom)
292 WRITE (unit=unit_nr, &
293 fmt=
"(T2,I7,5X,A6,I6,T39,F12.6,T69,F12.6)") &
294 iat, adjustl(ana), ikind, charges(iat, 1), mcharge(iat)
297 WRITE (unit=unit_nr, &
298 fmt=
"(T2,A,T39,F12.6,T69,F12.6,/)") &
299 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
301 WRITE (unit=unit_nr, fmt=
"(/,T2,A)") &
302 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
306 SELECT CASE (tb_type)
308 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
311 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
314 cpabort(
"unknown TB type")
316 ana = adjustr(trim(adjustl(aname)))
318 iat = atomic_kind_set(ikind)%atom_list(iatom)
319 WRITE (unit=unit_nr, &
320 fmt=
"(T2,I6,3X,A6,I6,T29,4(1X,F12.6))") &
321 iat, adjustl(ana), ikind, charges(iat, 1:2), mcharge(iat), &
322 charges(iat, 1) - charges(iat, 2)
325 WRITE (unit=unit_nr, &
326 fmt=
"(T2,A,T29,4(1X,F12.6),/)") &
327 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
337 SELECT CASE (tb_type)
339 cpwarn(
"Lowdin population analysis not implemented for DFTB method.")
342 log_filename=.false.)
345 IF (print_it) print_level = 2
347 IF (print_it) print_level = 3
349 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
355 cpabort(
"unknown TB type")
363 extension=
".eeq", log_filename=.false.)
364 CALL eeq_print(qs_env, unit_nr, print_level, ext=gfn0)
373 cpwarn(
"Hirshfeld charges not available for TB methods.")
382 cpwarn(
"MAO analysis not available for TB methods.")
391 cpwarn(
"ED analysis not available for TB methods.")
399 extension=
".data", middle_name=
"tb_dipole", log_filename=.false.)
404 cpassert(
ASSOCIATED(echarge))
407 mcharge(1:natom) = echarge(1:natom) - mcharge(1:natom)
409 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
411 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
416 DEALLOCATE (charges, mcharge)
419 IF (.NOT. no_mos)
THEN
423 IF (.NOT. do_kpoints)
THEN
424 SELECT CASE (tb_type)
429 CALL write_mos_molden(mos, qs_kind_set, particle_set, sprint_section, cell=cell, &
430 qs_env=qs_env, calc_energies=.true.)
432 cpabort(
"Unknown TB type")
439 IF (.NOT. no_mos)
THEN
442 IF (explicit .AND. .NOT. qs_env%run_rtp)
CALL wfn_mix_tb(qs_env, dft_section, scf_env)
445 IF (.NOT. no_mos)
THEN
458 IF (.NOT. no_mos)
THEN
462 cpwarn(
"Projected density of states not implemented for k-points.")
464 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
465 DO ispin = 1, dft_control%nspins
467 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
468 eigenvalues=mo_eigenvalues)
469 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
470 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
472 mo_coeff_deriv => null()
475 do_rotation=.true., &
476 co_rotate_dbcsr=mo_coeff_deriv)
479 IF (dft_control%nspins == 2)
THEN
481 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
484 qs_kind_set, particle_set, qs_env, dft_section)
492 SELECT CASE (tb_type)
500 cpabort(
"unknown TB type")
508 cpwarn(
"Energy Windows not implemented for k-points.")
511 CALL rebuild_pw_env(qs_env)
517 cpwarn(
"Energy Windows not implemented for TB methods.")
526 CALL rebuild_pw_env(qs_env)
529 CALL print_e_density(qs_env, zcharge, print_key)
531 cpwarn(
"Electronic density cube file not implemented for TB methods.")
540 CALL rebuild_pw_env(qs_env)
543 CALL print_density_cubes(qs_env, zcharge, print_key, total_density=.true.)
545 cpwarn(
"Total density cube file not implemented for TB methods.")
554 CALL rebuild_pw_env(qs_env)
557 CALL print_density_cubes(qs_env, zcharge, print_key, v_hartree=.true.)
559 cpwarn(
"Hartree potential cube file not implemented for TB methods.")
568 CALL rebuild_pw_env(qs_env)
571 CALL print_density_cubes(qs_env, zcharge, print_key, efield=.true.)
573 cpwarn(
"Efield cube file not implemented for TB methods.")
582 CALL rebuild_pw_env(qs_env)
585 CALL print_elf(qs_env, zcharge, print_key)
587 cpwarn(
"ELF not implemented for TB methods.")
592 IF (.NOT. no_mos)
THEN
597 CALL rebuild_pw_env(qs_env)
600 CALL print_mo_cubes(qs_env, zcharge, print_key)
602 cpwarn(
"Printing of MO cube files not implemented for TB methods.")
608 IF (.NOT. no_mos)
THEN
613 CALL rebuild_pw_env(qs_env)
617 cpwarn(
"STM not implemented for k-point calculations!")
620 cpassert(.NOT. dft_control%restricted)
621 CALL get_qs_env(qs_env, mos=mos, mo_derivs=mo_derivs, &
622 scf_control=scf_control, matrix_ks=ks_rmpv)
623 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
624 DO ispin = 1, dft_control%nspins
625 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
626 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
629 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
630 IF (nlumo_stm > 0)
THEN
631 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
632 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
633 CALL make_lumo_tb(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
639 CALL th_stm_image(qs_env, print_key, particles, unoccupied_orbs_stm, &
640 unoccupied_evals_stm)
642 IF (nlumo_stm > 0)
THEN
643 DO ispin = 1, dft_control%nspins
644 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
646 DEALLOCATE (unoccupied_evals_stm)
655 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks)
662 after = min(max(after, 1), 16)
663 DO ispin = 1, dft_control%nspins
664 DO img = 1,
SIZE(matrix_p, 2)
666 para_env, output_unit=iw, omit_headers=omit_headers)
674 "AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file))
THEN
678 after = min(max(after, 1), 16)
679 DO ispin = 1, dft_control%nspins
680 DO img = 1,
SIZE(matrix_ks, 2)
682 output_unit=iw, omit_headers=omit_headers)
695 cpwarn(
"XC potential cube file not available for TB methods.")
704 cpwarn(
"Electric field gradient not implemented for TB methods.")
713 cpwarn(
"Kinetic energy not available for TB methods.")
722 cpwarn(
"Xray diffraction spectrum not implemented for TB methods.")
731 cpwarn(
"Hyperfine Coupling not implemented for TB methods.")
740 cpwarn(
"DFT+U method not implemented for TB methods.")
751 CALL timestop(handle)
762 SUBROUTINE tb_dipole(qs_env, input, unit_nr, charges)
766 INTEGER,
INTENT(in) :: unit_nr
767 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: charges
769 CHARACTER(LEN=default_string_length) :: description, dipole_type
770 COMPLEX(KIND=dp) :: dzeta, dzphase(3), zeta, zphase(3)
771 COMPLEX(KIND=dp),
DIMENSION(3) :: dggamma, ggamma
772 INTEGER :: i, iat, ikind, j, nat, reference
774 REAL(kind=
dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
775 dtheta, gvec(3), q, rcc(3), ria(3), theta, tmp(3), via(3)
776 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
782 NULLIFY (atomic_kind_set, cell, results)
783 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
784 particle_set=particle_set, cell=cell, results=results)
789 description =
'[DIPOLE]'
793 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
796 dipole_deriv = 0.0_dp
799 dipole_type =
"periodic (Berry phase)"
802 charge_tot = sum(charges)
803 ria =
twopi*matmul(cell%h_inv, rcc)
804 zphase = cmplx(cos(ria), sin(ria),
dp)**charge_tot
806 dria =
twopi*matmul(cell%h_inv, drcc)
807 dzphase = charge_tot*cmplx(-sin(ria), cos(ria),
dp)**(charge_tot - 1.0_dp)*dria
811 DO ikind = 1,
SIZE(atomic_kind_set)
814 iat = atomic_kind_set(ikind)%atom_list(i)
815 ria = particle_set(iat)%r(:)
817 via = particle_set(iat)%v(:)
820 gvec =
twopi*cell%h_inv(j, :)
821 theta = sum(ria(:)*gvec(:))
822 dtheta = sum(via(:)*gvec(:))
823 zeta = cmplx(cos(theta), sin(theta), kind=
dp)**(-q)
824 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=
dp)**(-q - 1.0_dp)*dtheta
825 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
826 ggamma(j) = ggamma(j)*zeta
830 dggamma = dggamma*zphase + ggamma*dzphase
831 ggamma = ggamma*zphase
832 IF (all(real(ggamma, kind=
dp) /= 0.0_dp))
THEN
833 tmp = aimag(ggamma)/real(ggamma, kind=
dp)
835 dci = -(1.0_dp/(1.0_dp + tmp**2))* &
836 (aimag(dggamma)*real(ggamma, kind=
dp) - aimag(ggamma)*real(dggamma, kind=
dp))/(real(ggamma, kind=
dp))**2
837 dipole = matmul(cell%hmat, ci)/
twopi
838 dipole_deriv = matmul(cell%hmat, dci)/
twopi
841 dipole_type =
"non-periodic"
842 DO i = 1,
SIZE(particle_set)
844 ria = particle_set(i)%r(:)
846 dipole = dipole + q*(ria - rcc)
847 dipole_deriv(:) = dipole_deriv(:) + q*(particle_set(i)%v(:) - drcc)
851 CALL put_results(results=results, description=description, &
853 IF (unit_nr > 0)
THEN
854 WRITE (unit_nr,
'(/,T2,A,T31,A50)') &
855 'TB_DIPOLE| Dipole type', adjustr(trim(dipole_type))
856 WRITE (unit_nr,
"(T2,A,T30,3(1X,F16.8))")
"TB_DIPOLE| Ref. Point [Bohr]", rcc
857 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
858 'TB_DIPOLE| Moment [a.u.]', dipole(1:3)
859 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
860 'TB_DIPOLE| Moment [Debye]', dipole(1:3)*
debye
861 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
862 'TB_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
865 END SUBROUTINE tb_dipole
876 SUBROUTINE wfn_mix_tb(qs_env, dft_section, scf_env)
882 INTEGER :: ispin, nao, nmo, output_unit
883 REAL(
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
886 TYPE(
cp_fm_type) :: ks_tmp, mo_tmp, s_tmp, work
887 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumos
890 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
894 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
898 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks, &
899 particle_set=particle_set, atomic_kind_set=atomic_kind_set, &
900 qs_kind_set=qs_kind_set, mos=mos, para_env=para_env)
904 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao)
907 template_fmstruct=mo_coeff%matrix_struct)
912 ALLOCATE (lumos(
SIZE(mos)))
917 DO ispin = 1,
SIZE(mos)
918 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, nmo=nmo)
919 CALL cp_fm_struct_create(fmstruct=ao_lumo_struct, nrow_global=nao, ncol_global=nao - nmo, &
920 template_fmstruct=mo_coeff%matrix_struct)
922 CALL cp_fm_create(lumos(ispin), matrix_struct=ao_lumo_struct)
934 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
935 unoccupied_orbs=lumos, scf_env=scf_env, matrix_s=matrix_s)
944 END SUBROUTINE wfn_mix_tb
955 SUBROUTINE make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
959 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
960 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_evals
962 INTEGER,
INTENT(OUT) :: nlumos
964 INTEGER :: homo, iounit, ispin, n, nao, nmo
969 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
976 NULLIFY (mos, ks_rmpv, scf_control, dft_control, para_env, blacs_env)
980 scf_control=scf_control, &
981 dft_control=dft_control, &
989 DO ispin = 1, dft_control%nspins
990 NULLIFY (unoccupied_evals(ispin)%array)
992 IF (iounit > 0)
WRITE (iounit, *)
" "
993 IF (iounit > 0)
WRITE (iounit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
994 IF (iounit > 0)
WRITE (iounit, fmt=
'(1X,A)')
"-----------------------------------------------------"
995 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
997 nlumos = max(1, min(nlumo, nao - nmo))
998 IF (nlumo == -1) nlumos = nao - nmo
999 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
1001 nrow_global=n, ncol_global=nlumos)
1002 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
1007 NULLIFY (local_preconditioner)
1008 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
1009 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1012 NULLIFY (local_preconditioner)
1016 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1017 matrix_c_fm=unoccupied_orbs(ispin), &
1018 matrix_orthogonal_space_fm=mo_coeff, &
1019 eps_gradient=scf_control%eps_lumos, &
1021 iter_max=scf_control%max_iter_lumos, &
1022 size_ortho_space=nmo)
1025 unoccupied_evals(ispin)%array, scr=iounit, &
1036 SUBROUTINE rebuild_pw_env(qs_env)
1040 LOGICAL :: skip_load_balance_distributed
1048 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=new_pw_env)
1049 IF (.NOT.
ASSOCIATED(new_pw_env))
THEN
1054 CALL get_qs_env(qs_env, pw_env=new_pw_env, dft_control=dft_control, cell=cell)
1056 new_pw_env%cell_hmat = cell%hmat
1061 IF (.NOT.
ASSOCIATED(task_list))
THEN
1065 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1067 reorder_rs_grid_ranks=.true., &
1068 skip_load_balance_distributed=skip_load_balance_distributed)
1070 CALL qs_rho_rebuild(rho, qs_env=qs_env, rebuild_ao=.false., rebuild_grids=.true.)
1072 END SUBROUTINE rebuild_pw_env
1080 SUBROUTINE print_e_density(qs_env, zcharge, cube_section)
1083 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1086 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1087 INTEGER :: iounit, ispin, unit_nr
1088 LOGICAL :: append_cube, mpi_io
1089 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
1092 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1104 CALL get_qs_env(qs_env, dft_control=dft_control)
1107 my_pos_cube =
"REWIND"
1108 IF (append_cube) my_pos_cube =
"APPEND"
1114 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1115 NULLIFY (rho_r, rho_g, tot_rho_r)
1117 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1118 DO ispin = 1, dft_control%nspins
1119 rho_ao => rho_ao_kp(ispin, :)
1122 rho_gspace=rho_g(ispin), &
1123 total_rho=tot_rho_r(ispin), &
1126 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1131 IF (dft_control%nspins > 1)
THEN
1132 IF (iounit > 0)
THEN
1133 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,2F15.6)") &
1134 "Integrated alpha and beta electronic density:", tot_rho_r(1:2)
1136 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1137 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1140 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
1141 CALL pw_copy(rho_r(1), rho_elec_rspace)
1142 CALL pw_axpy(rho_r(2), rho_elec_rspace)
1143 filename =
"ELECTRON_DENSITY"
1146 extension=
".cube", middle_name=trim(filename), &
1147 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1149 IF (iounit > 0)
THEN
1150 IF (.NOT. mpi_io)
THEN
1151 INQUIRE (unit=unit_nr, name=filename)
1153 filename = mpi_filename
1155 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1156 "The sum of alpha and beta density is written in cube file format to the file:", adjustr(trim(filename))
1158 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
1159 particles=particles, zeff=zcharge, stride=
section_get_ivals(cube_section,
"STRIDE"), &
1162 CALL pw_copy(rho_r(1), rho_elec_rspace)
1163 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
1164 filename =
"SPIN_DENSITY"
1167 extension=
".cube", middle_name=trim(filename), &
1168 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1170 IF (iounit > 0)
THEN
1171 IF (.NOT. mpi_io)
THEN
1172 INQUIRE (unit=unit_nr, name=filename)
1174 filename = mpi_filename
1176 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1177 "The spin density is written in cube file format to the file:", adjustr(trim(filename))
1179 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
1180 particles=particles, zeff=zcharge, &
1183 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
1186 IF (iounit > 0)
THEN
1187 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1188 "Integrated electronic density:", tot_rho_r(1)
1190 filename =
"ELECTRON_DENSITY"
1193 extension=
".cube", middle_name=trim(filename), &
1194 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1196 IF (iounit > 0)
THEN
1197 IF (.NOT. mpi_io)
THEN
1198 INQUIRE (unit=unit_nr, name=filename)
1200 filename = mpi_filename
1202 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1203 "The electron density is written in cube file format to the file:", adjustr(trim(filename))
1206 particles=particles, zeff=zcharge, &
1211 END SUBROUTINE print_e_density
1221 SUBROUTINE print_density_cubes(qs_env, zcharge, cube_section, total_density, v_hartree, efield)
1223 TYPE(qs_environment_type),
POINTER :: qs_env
1224 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1225 TYPE(section_vals_type),
POINTER :: cube_section
1226 LOGICAL,
INTENT(IN),
OPTIONAL :: total_density, v_hartree, efield
1228 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = [
"x",
"y",
"z"]
1230 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1231 INTEGER :: id, iounit, ispin, nd(3), unit_nr
1232 LOGICAL :: append_cube, mpi_io, my_efield, &
1233 my_total_density, my_v_hartree
1234 REAL(kind=dp) :: total_rho_core_rspace, udvol
1235 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1236 TYPE(cell_type),
POINTER :: cell
1237 TYPE(cp_logger_type),
POINTER :: logger
1238 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1239 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1240 TYPE(dft_control_type),
POINTER :: dft_control
1241 TYPE(particle_list_type),
POINTER :: particles
1242 TYPE(pw_c1d_gs_type) :: rho_core
1243 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1244 TYPE(pw_env_type),
POINTER :: pw_env
1245 TYPE(pw_poisson_parameter_type) :: poisson_params
1246 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1247 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1248 TYPE(pw_r3d_rs_type) :: rho_tot_rspace
1249 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1250 TYPE(qs_ks_env_type),
POINTER :: ks_env
1251 TYPE(qs_rho_type),
POINTER :: rho
1252 TYPE(qs_subsys_type),
POINTER :: subsys
1254 CALL get_qs_env(qs_env, cell=cell, dft_control=dft_control)
1256 append_cube = section_get_lval(cube_section,
"APPEND")
1257 my_pos_cube =
"REWIND"
1258 IF (append_cube) my_pos_cube =
"APPEND"
1260 IF (
PRESENT(total_density))
THEN
1261 my_total_density = total_density
1263 my_total_density = .false.
1265 IF (
PRESENT(v_hartree))
THEN
1266 my_v_hartree = v_hartree
1268 my_v_hartree = .false.
1270 IF (
PRESENT(efield))
THEN
1276 logger => cp_get_default_logger()
1277 iounit = cp_logger_get_default_io_unit(logger)
1280 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1281 NULLIFY (rho_r, rho_g, tot_rho_r)
1282 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1283 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1284 DO ispin = 1, dft_control%nspins
1285 rho_ao => rho_ao_kp(ispin, :)
1286 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1288 rho_gspace=rho_g(ispin), &
1289 total_rho=tot_rho_r(ispin), &
1292 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1294 CALL get_qs_env(qs_env, subsys=subsys)
1295 CALL qs_subsys_get(subsys, particles=particles)
1297 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1298 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1299 CALL auxbas_pw_pool%create_pw(pw=rho_core)
1300 CALL calculate_rho_core(rho_core, total_rho_core_rspace, qs_env)
1302 IF (iounit > 0)
THEN
1303 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1304 "Integrated electronic density:", sum(tot_rho_r(:))
1305 WRITE (unit=iounit, fmt=
"(T2,A,T66,F15.6)") &
1306 "Integrated core density:", total_rho_core_rspace
1309 CALL auxbas_pw_pool%create_pw(pw=rho_tot_rspace)
1310 CALL pw_transfer(rho_core, rho_tot_rspace)
1311 DO ispin = 1, dft_control%nspins
1312 CALL pw_axpy(rho_r(ispin), rho_tot_rspace)
1315 IF (my_total_density)
THEN
1316 filename =
"TOTAL_DENSITY"
1318 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1319 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1320 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1321 IF (iounit > 0)
THEN
1322 IF (.NOT. mpi_io)
THEN
1323 INQUIRE (unit=unit_nr, name=filename)
1325 filename = mpi_filename
1327 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1328 "The total density is written in cube file format to the file:", adjustr(trim(filename))
1330 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"TOTAL DENSITY", &
1331 particles=particles, zeff=zcharge, &
1332 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1333 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1335 IF (my_v_hartree .OR. my_efield)
THEN
1337 TYPE(pw_c1d_gs_type) :: rho_tot_gspace
1338 CALL auxbas_pw_pool%create_pw(pw=rho_tot_gspace)
1339 CALL pw_transfer(rho_tot_rspace, rho_tot_gspace)
1340 poisson_params%solver = pw_poisson_analytic
1341 poisson_params%periodic = cell%perd
1342 poisson_params%ewald_type = do_ewald_none
1344 TYPE(greens_fn_type) :: green_fft
1345 TYPE(pw_grid_type),
POINTER :: pwdummy
1347 CALL pw_green_create(green_fft, poisson_params, cell%hmat, auxbas_pw_pool, pwdummy, pwdummy)
1348 rho_tot_gspace%array(:) = rho_tot_gspace%array(:)*green_fft%influence_fn%array(:)
1349 CALL pw_green_release(green_fft, auxbas_pw_pool)
1351 IF (my_v_hartree)
THEN
1353 TYPE(pw_r3d_rs_type) :: vhartree
1354 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1355 CALL pw_transfer(rho_tot_gspace, vhartree)
1356 filename =
"V_HARTREE"
1358 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1359 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1360 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1361 IF (iounit > 0)
THEN
1362 IF (.NOT. mpi_io)
THEN
1363 INQUIRE (unit=unit_nr, name=filename)
1365 filename = mpi_filename
1367 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1368 "The Hartree potential is written in cube file format to the file:", adjustr(trim(filename))
1370 CALL cp_pw_to_cube(vhartree, unit_nr,
"Hartree Potential", &
1371 particles=particles, zeff=zcharge, &
1372 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1373 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1374 CALL auxbas_pw_pool%give_back_pw(vhartree)
1379 TYPE(pw_c1d_gs_type) :: vhartree
1380 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1381 udvol = 1.0_dp/rho_tot_rspace%pw_grid%dvol
1383 CALL pw_transfer(rho_tot_gspace, vhartree)
1386 CALL pw_derive(vhartree, nd)
1387 CALL pw_transfer(vhartree, rho_tot_rspace)
1388 CALL pw_scale(rho_tot_rspace, udvol)
1390 filename =
"EFIELD_"//cdir(id)
1392 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1393 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1394 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1395 IF (iounit > 0)
THEN
1396 IF (.NOT. mpi_io)
THEN
1397 INQUIRE (unit=unit_nr, name=filename)
1399 filename = mpi_filename
1401 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1402 "The Efield is written in cube file format to the file:", adjustr(trim(filename))
1404 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"EFIELD "//cdir(id), &
1405 particles=particles, zeff=zcharge, &
1406 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1407 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1409 CALL auxbas_pw_pool%give_back_pw(vhartree)
1412 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1416 CALL auxbas_pw_pool%give_back_pw(rho_tot_rspace)
1417 CALL auxbas_pw_pool%give_back_pw(rho_core)
1419 END SUBROUTINE print_density_cubes
1427 SUBROUTINE print_elf(qs_env, zcharge, elf_section)
1429 TYPE(qs_environment_type),
POINTER :: qs_env
1430 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1431 TYPE(section_vals_type),
POINTER :: elf_section
1433 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1435 INTEGER :: iounit, ispin, unit_nr
1436 LOGICAL :: append_cube, mpi_io
1437 REAL(kind=dp) :: rho_cutoff
1438 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1439 TYPE(cp_logger_type),
POINTER :: logger
1440 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1441 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1442 TYPE(dft_control_type),
POINTER :: dft_control
1443 TYPE(particle_list_type),
POINTER :: particles
1444 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1445 TYPE(pw_env_type),
POINTER :: pw_env
1446 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1447 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1448 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: elf_r
1449 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1450 TYPE(qs_ks_env_type),
POINTER :: ks_env
1451 TYPE(qs_rho_type),
POINTER :: rho
1452 TYPE(qs_subsys_type),
POINTER :: subsys
1454 logger => cp_get_default_logger()
1455 iounit = cp_logger_get_default_io_unit(logger)
1458 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env, rho=rho)
1459 NULLIFY (rho_r, rho_g, tot_rho_r)
1460 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1461 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1462 DO ispin = 1, dft_control%nspins
1463 rho_ao => rho_ao_kp(ispin, :)
1464 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1466 rho_gspace=rho_g(ispin), &
1467 total_rho=tot_rho_r(ispin), &
1470 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1472 CALL get_qs_env(qs_env, subsys=subsys)
1473 CALL qs_subsys_get(subsys, particles=particles)
1475 ALLOCATE (elf_r(dft_control%nspins))
1476 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1477 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1478 DO ispin = 1, dft_control%nspins
1479 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1480 CALL pw_zero(elf_r(ispin))
1483 IF (iounit > 0)
THEN
1484 WRITE (unit=iounit, fmt=
"(/,T2,A)") &
1485 "ELF is computed on the real space grid -----"
1487 rho_cutoff = section_get_rval(elf_section,
"density_cutoff")
1488 CALL qs_elf_calc(qs_env, elf_r, rho_cutoff)
1491 append_cube = section_get_lval(elf_section,
"APPEND")
1492 my_pos_cube =
"REWIND"
1493 IF (append_cube) my_pos_cube =
"APPEND"
1494 DO ispin = 1, dft_control%nspins
1495 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1496 WRITE (title, *)
"ELF spin ", ispin
1498 unit_nr = cp_print_key_unit_nr(logger, elf_section,
'', extension=
".cube", &
1499 middle_name=trim(filename), file_position=my_pos_cube, &
1500 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1501 IF (iounit > 0)
THEN
1502 IF (.NOT. mpi_io)
THEN
1503 INQUIRE (unit=unit_nr, name=filename)
1505 filename = mpi_filename
1507 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1508 "ELF is written in cube file format to the file:", adjustr(trim(filename))
1511 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, zeff=zcharge, &
1512 stride=section_get_ivals(elf_section,
"STRIDE"), mpi_io=mpi_io)
1513 CALL cp_print_key_finished_output(unit_nr, logger, elf_section,
'', mpi_io=mpi_io)
1515 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1520 END SUBROUTINE print_elf
1527 SUBROUTINE print_mo_cubes(qs_env, zcharge, cube_section)
1529 TYPE(qs_environment_type),
POINTER :: qs_env
1530 REAL(kind=dp),
DIMENSION(:),
INTENT(IN) :: zcharge
1531 TYPE(section_vals_type),
POINTER :: cube_section
1533 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1534 INTEGER :: homo, i, ifirst, ilast, iounit, ir, &
1535 ispin, ivector, n_rep, nhomo, nlist, &
1536 nlumo, nmo, shomo, unit_nr
1537 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1538 LOGICAL :: append_cube, mpi_io, write_cube
1539 REAL(kind=dp) :: homo_lumo(2, 2)
1540 REAL(kind=dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
1541 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1542 TYPE(cell_type),
POINTER :: cell
1543 TYPE(cp_fm_type),
POINTER :: mo_coeff
1544 TYPE(cp_logger_type),
POINTER :: logger
1545 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
1546 TYPE(dft_control_type),
POINTER :: dft_control
1547 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1548 TYPE(particle_list_type),
POINTER :: particles
1549 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1550 TYPE(pw_c1d_gs_type) :: wf_g
1551 TYPE(pw_env_type),
POINTER :: pw_env
1552 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1553 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1554 TYPE(pw_r3d_rs_type) :: wf_r
1555 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1556 TYPE(qs_subsys_type),
POINTER :: subsys
1557 TYPE(scf_control_type),
POINTER :: scf_control
1559 logger => cp_get_default_logger()
1560 iounit = cp_logger_get_default_io_unit(logger)
1562 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv, scf_control=scf_control)
1563 CALL get_qs_env(qs_env, dft_control=dft_control, mo_derivs=mo_derivs)
1564 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
1565 NULLIFY (mo_eigenvalues)
1567 DO ispin = 1, dft_control%nspins
1568 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=shomo)
1569 homo_lumo(ispin, 1) = mo_eigenvalues(shomo)
1570 homo = max(homo, shomo)
1572 write_cube = section_get_lval(cube_section,
"WRITE_CUBE")
1573 nlumo = section_get_ival(cube_section,
"NLUMO")
1574 nhomo = section_get_ival(cube_section,
"NHOMO")
1575 NULLIFY (list_index)
1576 CALL section_vals_val_get(cube_section,
"HOMO_LIST", n_rep_val=n_rep)
1581 CALL section_vals_val_get(cube_section,
"HOMO_LIST", i_rep_val=ir, i_vals=
list)
1582 IF (
ASSOCIATED(
list))
THEN
1583 CALL reallocate(list_index, 1, nlist +
SIZE(
list))
1584 DO i = 1,
SIZE(
list)
1585 list_index(i + nlist) =
list(i)
1587 nlist = nlist +
SIZE(
list)
1590 nhomo = maxval(list_index)
1592 IF (nhomo == -1) nhomo = homo
1593 nlist = homo - max(1, homo - nhomo + 1) + 1
1594 ALLOCATE (list_index(nlist))
1596 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1600 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1601 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1602 CALL auxbas_pw_pool%create_pw(wf_r)
1603 CALL auxbas_pw_pool%create_pw(wf_g)
1605 CALL get_qs_env(qs_env, subsys=subsys)
1606 CALL qs_subsys_get(subsys, particles=particles)
1608 append_cube = section_get_lval(cube_section,
"APPEND")
1609 my_pos_cube =
"REWIND"
1610 IF (append_cube)
THEN
1611 my_pos_cube =
"APPEND"
1614 CALL get_qs_env(qs_env=qs_env, &
1615 atomic_kind_set=atomic_kind_set, &
1616 qs_kind_set=qs_kind_set, &
1618 particle_set=particle_set)
1620 IF (nhomo >= 0)
THEN
1621 DO ispin = 1, dft_control%nspins
1623 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1624 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1625 IF (write_cube)
THEN
1627 ivector = list_index(i)
1628 IF (ivector > homo) cycle
1629 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1630 cell, dft_control, particle_set, pw_env)
1631 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1633 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1634 middle_name=trim(filename), file_position=my_pos_cube, &
1635 log_filename=.false., mpi_io=mpi_io)
1636 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1637 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1638 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1639 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1645 IF (nlumo /= 0)
THEN
1646 DO ispin = 1, dft_control%nspins
1648 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1649 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1650 IF (write_cube)
THEN
1652 IF (nlumo == -1)
THEN
1655 ilast = ifirst + nlumo - 1
1656 ilast = min(nmo, ilast)
1658 DO ivector = ifirst, ilast
1659 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, &
1660 qs_kind_set, cell, dft_control, particle_set, pw_env)
1661 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1663 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1664 middle_name=trim(filename), file_position=my_pos_cube, &
1665 log_filename=.false., mpi_io=mpi_io)
1666 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. LUMO + ", ivector - ifirst
1667 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, zeff=zcharge, &
1668 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1669 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1675 CALL auxbas_pw_pool%give_back_pw(wf_g)
1676 CALL auxbas_pw_pool%give_back_pw(wf_r)
1677 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1679 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, 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)
...
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, 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(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, 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.