141#include "./base/base_uses.f90"
147 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_scf_post_tb'
167 CHARACTER(LEN=*) :: tb_type
168 LOGICAL,
INTENT(IN) :: no_mos
170 CHARACTER(len=*),
PARAMETER :: routinen =
'scf_post_calculation_tb'
172 CHARACTER(LEN=6) :: ana
173 CHARACTER(LEN=default_string_length) :: aname
174 INTEGER :: after, gfn_type, handle, homo, iat, iatom, ikind, img, ispin, iw, nat, natom, &
175 nkind, nlumo_stm, nlumos, nspins, print_level, unit_nr
176 LOGICAL :: do_cube, do_kpoints, explicit, gfn0, &
177 has_homo, omit_headers, print_it, &
179 REAL(kind=
dp) :: zeff
180 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge
181 REAL(kind=
dp),
DIMENSION(2, 2) :: homo_lumo
182 REAL(kind=
dp),
DIMENSION(:),
POINTER :: echarge, mo_eigenvalues
183 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: charges
185 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
POINTER :: unoccupied_evals_stm
186 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs_stm
189 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
190 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks, matrix_p, matrix_s
198 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
204 print_section, sprint_section, &
208 CALL timeset(routinen, handle)
214 CALL get_qs_env(qs_env, dft_control=dft_control)
215 SELECT CASE (trim(tb_type))
218 gfn_type = dft_control%qs_control%xtb_control%gfn_type
219 gfn0 = (gfn_type == 0)
220 vdip = dft_control%qs_control%xtb_control%var_dipole
222 cpabort(
"unknown TB type")
225 cpassert(
ASSOCIATED(qs_env))
226 NULLIFY (rho, para_env, matrix_s, matrix_p)
227 CALL get_qs_env(qs_env, scf_env=scf_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set, &
228 rho=rho, natom=natom, para_env=para_env, &
229 particle_set=particle_set, do_kpoints=do_kpoints, matrix_s_kp=matrix_s)
230 nspins = dft_control%nspins
233 ALLOCATE (charges(natom, nspins), mcharge(natom))
237 nkind =
SIZE(atomic_kind_set)
240 SELECT CASE (trim(tb_type))
242 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
245 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
248 cpabort(
"unknown TB type")
251 iat = atomic_kind_set(ikind)%atom_list(iatom)
252 mcharge(iat) = zeff - sum(charges(iat, 1:nspins))
263 extension=
".mulliken", log_filename=.false.)
264 IF (unit_nr > 0)
THEN
265 WRITE (unit=unit_nr, fmt=
"(/,/,T2,A)")
"MULLIKEN POPULATION ANALYSIS"
266 IF (nspins == 1)
THEN
267 WRITE (unit=unit_nr, fmt=
"(/,T2,A,T70,A)") &
268 " # Atom Element Kind Atomic population",
" Net charge"
272 SELECT CASE (tb_type)
274 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
277 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
280 cpabort(
"unknown TB type")
282 ana = adjustr(trim(adjustl(aname)))
284 iat = atomic_kind_set(ikind)%atom_list(iatom)
285 WRITE (unit=unit_nr, &
286 fmt=
"(T2,I7,5X,A6,I6,T39,F12.6,T69,F12.6)") &
287 iat, adjustl(ana), ikind, charges(iat, 1), mcharge(iat)
290 WRITE (unit=unit_nr, &
291 fmt=
"(T2,A,T39,F12.6,T69,F12.6,/)") &
292 "# Total charge", sum(charges(:, 1)), sum(mcharge(:))
294 WRITE (unit=unit_nr, fmt=
"(/,T2,A)") &
295 "# Atom Element Kind Atomic population (alpha,beta) Net charge Spin moment"
299 SELECT CASE (tb_type)
301 CALL get_qs_kind(qs_kind_set(ikind), dftb_parameter=dftb_kind)
304 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
307 cpabort(
"unknown TB type")
309 ana = adjustr(trim(adjustl(aname)))
311 iat = atomic_kind_set(ikind)%atom_list(iatom)
312 WRITE (unit=unit_nr, &
313 fmt=
"(T2,I6,3X,A6,I6,T29,4(1X,F12.6))") &
314 iat, adjustl(ana), ikind, charges(iat, 1:2), mcharge(iat), &
315 charges(iat, 1) - charges(iat, 2)
318 WRITE (unit=unit_nr, &
319 fmt=
"(T2,A,T29,4(1X,F12.6),/)") &
320 "# Total charge and spin", sum(charges(:, 1)), sum(charges(:, 2)), sum(mcharge(:))
330 SELECT CASE (tb_type)
332 cpwarn(
"Lowdin population analysis not implemented for DFTB method.")
335 log_filename=.false.)
338 IF (print_it) print_level = 2
340 IF (print_it) print_level = 3
342 cpwarn(
"Lowdin charges not implemented for k-point calculations!")
348 cpabort(
"unknown TB type")
356 extension=
".eeq", log_filename=.false.)
357 CALL eeq_print(qs_env, unit_nr, print_level, ext=gfn0)
366 cpwarn(
"Hirshfeld charges not available for TB methods.")
375 cpwarn(
"MAO analysis not available for TB methods.")
384 cpwarn(
"ED analysis not available for TB methods.")
392 extension=
".data", middle_name=
"tb_dipole", log_filename=.false.)
397 cpassert(
ASSOCIATED(echarge))
400 mcharge(1:natom) = echarge(1:natom) - mcharge(1:natom)
402 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
404 CALL tb_dipole(qs_env, moments_section, unit_nr, mcharge)
409 DEALLOCATE (charges, mcharge)
412 IF (.NOT. no_mos)
THEN
416 IF (.NOT. do_kpoints)
THEN
417 SELECT CASE (tb_type)
424 cpabort(
"Unknown TB type")
431 IF (.NOT. no_mos)
THEN
434 IF (explicit .AND. .NOT. qs_env%run_rtp)
CALL wfn_mix_tb(qs_env, dft_section, scf_env)
437 IF (.NOT. no_mos)
THEN
450 IF (.NOT. no_mos)
THEN
454 cpwarn(
"Projected density of states not implemented for k-points.")
456 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv)
457 DO ispin = 1, dft_control%nspins
459 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
460 eigenvalues=mo_eigenvalues)
461 IF (
ASSOCIATED(qs_env%mo_derivs))
THEN
462 mo_coeff_deriv => qs_env%mo_derivs(ispin)%matrix
464 mo_coeff_deriv => null()
467 do_rotation=.true., &
468 co_rotate_dbcsr=mo_coeff_deriv)
471 IF (dft_control%nspins == 2)
THEN
473 qs_kind_set, particle_set, qs_env, dft_section, ispin=ispin)
476 qs_kind_set, particle_set, qs_env, dft_section)
484 SELECT CASE (tb_type)
492 cpabort(
"unknown TB type")
500 cpwarn(
"Energy Windows not implemented for k-points.")
503 CALL rebuild_pw_env(qs_env)
509 cpwarn(
"Energy Windows not implemented for TB methods.")
518 CALL rebuild_pw_env(qs_env)
521 CALL print_e_density(qs_env, print_key)
523 cpwarn(
"Electronic density cube file not implemented for TB methods.")
532 CALL rebuild_pw_env(qs_env)
535 CALL print_density_cubes(qs_env, print_key, total_density=.true.)
537 cpwarn(
"Total density cube file not implemented for TB methods.")
546 CALL rebuild_pw_env(qs_env)
549 CALL print_density_cubes(qs_env, print_key, v_hartree=.true.)
551 cpwarn(
"Hartree potential cube file not implemented for TB methods.")
560 CALL rebuild_pw_env(qs_env)
563 CALL print_density_cubes(qs_env, print_key, efield=.true.)
565 cpwarn(
"Efield cube file not implemented for TB methods.")
574 CALL rebuild_pw_env(qs_env)
577 CALL print_elf(qs_env, print_key)
579 cpwarn(
"ELF not implemented for TB methods.")
584 IF (.NOT. no_mos)
THEN
589 CALL rebuild_pw_env(qs_env)
592 CALL print_mo_cubes(qs_env, print_key)
594 cpwarn(
"Printing of MO cube files not implemented for TB methods.")
600 IF (.NOT. no_mos)
THEN
605 CALL rebuild_pw_env(qs_env)
609 cpwarn(
"STM not implemented for k-point calculations!")
612 cpassert(.NOT. dft_control%restricted)
613 CALL get_qs_env(qs_env, mos=mos, mo_derivs=mo_derivs, &
614 scf_control=scf_control, matrix_ks=ks_rmpv)
615 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
616 DO ispin = 1, dft_control%nspins
617 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=homo)
618 homo_lumo(ispin, 1) = mo_eigenvalues(homo)
621 NULLIFY (unoccupied_orbs_stm, unoccupied_evals_stm)
622 IF (nlumo_stm > 0)
THEN
623 ALLOCATE (unoccupied_orbs_stm(dft_control%nspins))
624 ALLOCATE (unoccupied_evals_stm(dft_control%nspins))
625 CALL make_lumo_tb(qs_env, scf_env, unoccupied_orbs_stm, unoccupied_evals_stm, &
631 CALL th_stm_image(qs_env, print_key, particles, unoccupied_orbs_stm, &
632 unoccupied_evals_stm)
634 IF (nlumo_stm > 0)
THEN
635 DO ispin = 1, dft_control%nspins
636 DEALLOCATE (unoccupied_evals_stm(ispin)%array)
638 DEALLOCATE (unoccupied_evals_stm)
647 CALL get_qs_env(qs_env, matrix_ks_kp=matrix_ks)
654 after = min(max(after, 1), 16)
655 DO ispin = 1, dft_control%nspins
656 DO img = 1,
SIZE(matrix_p, 2)
658 para_env, output_unit=iw, omit_headers=omit_headers)
666 "AO_MATRICES/KOHN_SHAM_MATRIX"),
cp_p_file))
THEN
670 after = min(max(after, 1), 16)
671 DO ispin = 1, dft_control%nspins
672 DO img = 1,
SIZE(matrix_ks, 2)
674 output_unit=iw, omit_headers=omit_headers)
687 cpwarn(
"XC potential cube file not available for TB methods.")
696 cpwarn(
"Electric field gradient not implemented for TB methods.")
705 cpwarn(
"Kinetic energy not available for TB methods.")
714 cpwarn(
"Xray diffraction spectrum not implemented for TB methods.")
723 cpwarn(
"Hyperfine Coupling not implemented for TB methods.")
732 cpwarn(
"DFT+U method not implemented for TB methods.")
739 CALL timestop(handle)
750 SUBROUTINE tb_dipole(qs_env, input, unit_nr, charges)
754 INTEGER,
INTENT(in) :: unit_nr
755 REAL(kind=
dp),
DIMENSION(:),
INTENT(in) :: charges
757 CHARACTER(LEN=default_string_length) :: description, dipole_type
758 COMPLEX(KIND=dp) :: dzeta, dzphase(3), zeta, zphase(3)
759 COMPLEX(KIND=dp),
DIMENSION(3) :: dggamma, ggamma
760 INTEGER :: i, iat, ikind, j, nat, reference
762 REAL(kind=
dp) :: charge_tot, ci(3), dci(3), dipole(3), dipole_deriv(3), drcc(3), dria(3), &
763 dtheta, gvec(3), q, rcc(3), ria(3), theta, tmp(3), via(3)
764 REAL(kind=
dp),
DIMENSION(:),
POINTER :: ref_point
770 NULLIFY (atomic_kind_set, cell, results)
771 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, &
772 particle_set=particle_set, cell=cell, results=results)
777 description =
'[DIPOLE]'
781 CALL get_reference_point(rcc, drcc, qs_env=qs_env, reference=reference, ref_point=ref_point)
784 dipole_deriv = 0.0_dp
787 dipole_type =
"periodic (Berry phase)"
790 charge_tot = sum(charges)
791 ria =
twopi*matmul(cell%h_inv, rcc)
792 zphase = cmplx(cos(ria), sin(ria),
dp)**charge_tot
794 dria =
twopi*matmul(cell%h_inv, drcc)
795 dzphase = charge_tot*cmplx(-sin(ria), cos(ria),
dp)**(charge_tot - 1.0_dp)*dria
797 ggamma = cmplx(1.0_dp, 0.0_dp, kind=
dp)
798 dggamma = cmplx(0.0_dp, 0.0_dp, kind=
dp)
799 DO ikind = 1,
SIZE(atomic_kind_set)
802 iat = atomic_kind_set(ikind)%atom_list(i)
803 ria = particle_set(iat)%r(:)
805 via = particle_set(iat)%v(:)
808 gvec =
twopi*cell%h_inv(j, :)
809 theta = sum(ria(:)*gvec(:))
810 dtheta = sum(via(:)*gvec(:))
811 zeta = cmplx(cos(theta), sin(theta), kind=
dp)**(-q)
812 dzeta = -q*cmplx(-sin(theta), cos(theta), kind=
dp)**(-q - 1.0_dp)*dtheta
813 dggamma(j) = dggamma(j)*zeta + ggamma(j)*dzeta
814 ggamma(j) = ggamma(j)*zeta
818 dggamma = dggamma*zphase + ggamma*dzphase
819 ggamma = ggamma*zphase
820 IF (all(real(ggamma, kind=
dp) /= 0.0_dp))
THEN
821 tmp = aimag(ggamma)/real(ggamma, kind=
dp)
823 dci = -(1.0_dp/(1.0_dp + tmp**2))* &
824 (aimag(dggamma)*real(ggamma, kind=
dp) - aimag(ggamma)*real(dggamma, kind=
dp))/(real(ggamma, kind=
dp))**2
825 dipole = matmul(cell%hmat, ci)/
twopi
826 dipole_deriv = matmul(cell%hmat, dci)/
twopi
829 dipole_type =
"non-periodic"
830 DO i = 1,
SIZE(particle_set)
832 ria = particle_set(i)%r(:)
834 dipole = dipole + q*(ria - rcc)
835 dipole_deriv(:) = dipole_deriv(:) + q*(particle_set(i)%v(:) - drcc)
839 CALL put_results(results=results, description=description, &
841 IF (unit_nr > 0)
THEN
842 WRITE (unit_nr,
'(/,T2,A,T31,A50)') &
843 'TB_DIPOLE| Dipole type', adjustr(trim(dipole_type))
844 WRITE (unit_nr,
"(T2,A,T30,3(1X,F16.8))")
"TB_DIPOLE| Ref. Point [Bohr]", rcc
845 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
846 'TB_DIPOLE| Moment [a.u.]', dipole(1:3)
847 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
848 'TB_DIPOLE| Moment [Debye]', dipole(1:3)*
debye
849 WRITE (unit_nr,
'(T2,A,T30,3(1X,F16.8))') &
850 'TB_DIPOLE| Derivative [a.u.]', dipole_deriv(1:3)
853 END SUBROUTINE tb_dipole
864 SUBROUTINE wfn_mix_tb(qs_env, dft_section, scf_env)
870 INTEGER :: ispin, nao, nmo, output_unit
871 REAL(
dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
874 TYPE(
cp_fm_type) :: ks_tmp, mo_tmp, s_tmp, work
875 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: lumos
878 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s
882 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
886 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks, &
887 particle_set=particle_set, atomic_kind_set=atomic_kind_set, &
888 qs_kind_set=qs_kind_set, mos=mos, para_env=para_env)
892 CALL get_mo_set(mos(1), mo_coeff=mo_coeff, nao=nao)
895 template_fmstruct=mo_coeff%matrix_struct)
900 ALLOCATE (lumos(
SIZE(mos)))
905 DO ispin = 1,
SIZE(mos)
906 CALL get_mo_set(mos(ispin), mo_coeff=mo_coeff, eigenvalues=mo_eigenvalues, nmo=nmo)
907 CALL cp_fm_struct_create(fmstruct=ao_lumo_struct, nrow_global=nao, ncol_global=nao - nmo, &
908 template_fmstruct=mo_coeff%matrix_struct)
910 CALL cp_fm_create(lumos(ispin), matrix_struct=ao_lumo_struct)
922 CALL wfn_mix(mos, particle_set, dft_section, qs_kind_set, para_env, output_unit, &
923 unoccupied_orbs=lumos, scf_env=scf_env, matrix_s=matrix_s)
932 END SUBROUTINE wfn_mix_tb
943 SUBROUTINE make_lumo_tb(qs_env, scf_env, unoccupied_orbs, unoccupied_evals, nlumo, nlumos)
947 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: unoccupied_orbs
948 TYPE(
cp_1d_r_p_type),
DIMENSION(:),
INTENT(INOUT) :: unoccupied_evals
950 INTEGER,
INTENT(OUT) :: nlumos
952 INTEGER :: homo, iounit, ispin, n, nao, nmo
957 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, matrix_s
964 NULLIFY (mos, ks_rmpv, scf_control, dft_control, para_env, blacs_env)
968 scf_control=scf_control, &
969 dft_control=dft_control, &
977 DO ispin = 1, dft_control%nspins
978 NULLIFY (unoccupied_evals(ispin)%array)
980 IF (iounit > 0)
WRITE (iounit, *)
" "
981 IF (iounit > 0)
WRITE (iounit, *)
" Lowest Eigenvalues of the unoccupied subspace spin ", ispin
982 IF (iounit > 0)
WRITE (iounit, fmt=
'(1X,A)')
"-----------------------------------------------------"
983 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, homo=homo, nao=nao, nmo=nmo)
985 nlumos = max(1, min(nlumo, nao - nmo))
986 IF (nlumo == -1) nlumos = nao - nmo
987 ALLOCATE (unoccupied_evals(ispin)%array(nlumos))
989 nrow_global=n, ncol_global=nlumos)
990 CALL cp_fm_create(unoccupied_orbs(ispin), fm_struct_tmp, name=
"lumos")
995 NULLIFY (local_preconditioner)
996 IF (
ASSOCIATED(scf_env%ot_preconditioner))
THEN
997 local_preconditioner => scf_env%ot_preconditioner(1)%preconditioner
1000 NULLIFY (local_preconditioner)
1004 CALL ot_eigensolver(matrix_h=ks_rmpv(ispin)%matrix, matrix_s=matrix_s(1)%matrix, &
1005 matrix_c_fm=unoccupied_orbs(ispin), &
1006 matrix_orthogonal_space_fm=mo_coeff, &
1007 eps_gradient=scf_control%eps_lumos, &
1009 iter_max=scf_control%max_iter_lumos, &
1010 size_ortho_space=nmo)
1013 unoccupied_evals(ispin)%array, scr=iounit, &
1024 SUBROUTINE rebuild_pw_env(qs_env)
1028 LOGICAL :: skip_load_balance_distributed
1036 CALL get_qs_env(qs_env, ks_env=ks_env, dft_control=dft_control, pw_env=new_pw_env)
1037 IF (.NOT.
ASSOCIATED(new_pw_env))
THEN
1042 CALL get_qs_env(qs_env, pw_env=new_pw_env, dft_control=dft_control, cell=cell)
1044 new_pw_env%cell_hmat = cell%hmat
1049 IF (.NOT.
ASSOCIATED(task_list))
THEN
1053 skip_load_balance_distributed = dft_control%qs_control%skip_load_balance_distributed
1055 reorder_rs_grid_ranks=.true., soft_valid=.false., &
1056 skip_load_balance_distributed=skip_load_balance_distributed)
1058 CALL qs_rho_rebuild(rho, qs_env=qs_env, rebuild_ao=.false., rebuild_grids=.true.)
1060 END SUBROUTINE rebuild_pw_env
1067 SUBROUTINE print_e_density(qs_env, cube_section)
1072 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1073 INTEGER :: iounit, ispin, unit_nr
1074 LOGICAL :: append_cube, mpi_io
1075 REAL(kind=
dp),
DIMENSION(:),
POINTER :: tot_rho_r
1078 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1090 CALL get_qs_env(qs_env, dft_control=dft_control)
1093 my_pos_cube =
"REWIND"
1094 IF (append_cube) my_pos_cube =
"APPEND"
1100 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1101 NULLIFY (rho_r, rho_g, tot_rho_r)
1103 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1104 DO ispin = 1, dft_control%nspins
1105 rho_ao => rho_ao_kp(ispin, :)
1108 rho_gspace=rho_g(ispin), &
1109 total_rho=tot_rho_r(ispin), &
1112 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1117 IF (dft_control%nspins > 1)
THEN
1118 IF (iounit > 0)
THEN
1119 WRITE (unit=iounit, fmt=
"(/,T2,A,T51,2F15.6)") &
1120 "Integrated alpha and beta electronic density:", tot_rho_r(1:2)
1122 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1123 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1126 CALL auxbas_pw_pool%create_pw(pw=rho_elec_rspace)
1127 CALL pw_copy(rho_r(1), rho_elec_rspace)
1128 CALL pw_axpy(rho_r(2), rho_elec_rspace)
1129 filename =
"ELECTRON_DENSITY"
1132 extension=
".cube", middle_name=trim(filename), &
1133 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1135 IF (iounit > 0)
THEN
1136 IF (.NOT. mpi_io)
THEN
1137 INQUIRE (unit=unit_nr, name=filename)
1139 filename = mpi_filename
1141 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1142 "The sum of alpha and beta density is written in cube file format to the file:", adjustr(trim(filename))
1144 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SUM OF ALPHA AND BETA DENSITY", &
1148 CALL pw_copy(rho_r(1), rho_elec_rspace)
1149 CALL pw_axpy(rho_r(2), rho_elec_rspace, alpha=-1.0_dp)
1150 filename =
"SPIN_DENSITY"
1153 extension=
".cube", middle_name=trim(filename), &
1154 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1156 IF (iounit > 0)
THEN
1157 IF (.NOT. mpi_io)
THEN
1158 INQUIRE (unit=unit_nr, name=filename)
1160 filename = mpi_filename
1162 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1163 "The spin density is written in cube file format to the file:", adjustr(trim(filename))
1165 CALL cp_pw_to_cube(rho_elec_rspace, unit_nr,
"SPIN DENSITY", &
1166 particles=particles, &
1169 CALL auxbas_pw_pool%give_back_pw(rho_elec_rspace)
1172 IF (iounit > 0)
THEN
1173 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1174 "Integrated electronic density:", tot_rho_r(1)
1176 filename =
"ELECTRON_DENSITY"
1179 extension=
".cube", middle_name=trim(filename), &
1180 file_position=my_pos_cube, log_filename=.false., mpi_io=mpi_io, &
1182 IF (iounit > 0)
THEN
1183 IF (.NOT. mpi_io)
THEN
1184 INQUIRE (unit=unit_nr, name=filename)
1186 filename = mpi_filename
1188 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1189 "The electron density is written in cube file format to the file:", adjustr(trim(filename))
1192 particles=particles, &
1197 END SUBROUTINE print_e_density
1206 SUBROUTINE print_density_cubes(qs_env, cube_section, total_density, v_hartree, efield)
1208 TYPE(qs_environment_type),
POINTER :: qs_env
1209 TYPE(section_vals_type),
POINTER :: cube_section
1210 LOGICAL,
INTENT(IN),
OPTIONAL :: total_density, v_hartree, efield
1212 CHARACTER(len=1),
DIMENSION(3),
PARAMETER :: cdir = (/
"x",
"y",
"z"/)
1214 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube
1215 INTEGER :: id, iounit, ispin, nd(3), unit_nr
1216 LOGICAL :: append_cube, mpi_io, my_efield, &
1217 my_total_density, my_v_hartree
1218 REAL(kind=dp) :: total_rho_core_rspace, udvol
1219 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1220 TYPE(cell_type),
POINTER :: cell
1221 TYPE(cp_logger_type),
POINTER :: logger
1222 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1223 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1224 TYPE(dft_control_type),
POINTER :: dft_control
1225 TYPE(particle_list_type),
POINTER :: particles
1226 TYPE(pw_c1d_gs_type) :: rho_core
1227 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1228 TYPE(pw_env_type),
POINTER :: pw_env
1229 TYPE(pw_poisson_parameter_type) :: poisson_params
1230 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1231 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1232 TYPE(pw_r3d_rs_type) :: rho_tot_rspace
1233 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1234 TYPE(qs_ks_env_type),
POINTER :: ks_env
1235 TYPE(qs_rho_type),
POINTER :: rho
1236 TYPE(qs_subsys_type),
POINTER :: subsys
1238 CALL get_qs_env(qs_env, cell=cell, dft_control=dft_control)
1240 append_cube = section_get_lval(cube_section,
"APPEND")
1241 my_pos_cube =
"REWIND"
1242 IF (append_cube) my_pos_cube =
"APPEND"
1244 IF (
PRESENT(total_density))
THEN
1245 my_total_density = total_density
1247 my_total_density = .false.
1249 IF (
PRESENT(v_hartree))
THEN
1250 my_v_hartree = v_hartree
1252 my_v_hartree = .false.
1254 IF (
PRESENT(efield))
THEN
1260 logger => cp_get_default_logger()
1261 iounit = cp_logger_get_default_io_unit(logger)
1264 CALL get_qs_env(qs_env, ks_env=ks_env, rho=rho)
1265 NULLIFY (rho_r, rho_g, tot_rho_r)
1266 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1267 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1268 DO ispin = 1, dft_control%nspins
1269 rho_ao => rho_ao_kp(ispin, :)
1270 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1272 rho_gspace=rho_g(ispin), &
1273 total_rho=tot_rho_r(ispin), &
1276 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1278 CALL get_qs_env(qs_env, subsys=subsys)
1279 CALL qs_subsys_get(subsys, particles=particles)
1281 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1282 CALL pw_env_get(pw_env=pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1283 CALL auxbas_pw_pool%create_pw(pw=rho_core)
1284 CALL calculate_rho_core(rho_core, total_rho_core_rspace, qs_env)
1286 IF (iounit > 0)
THEN
1287 WRITE (unit=iounit, fmt=
"(/,T2,A,T66,F15.6)") &
1288 "Integrated electronic density:", sum(tot_rho_r(:))
1289 WRITE (unit=iounit, fmt=
"(T2,A,T66,F15.6)") &
1290 "Integrated core density:", total_rho_core_rspace
1293 CALL auxbas_pw_pool%create_pw(pw=rho_tot_rspace)
1294 CALL pw_transfer(rho_core, rho_tot_rspace)
1295 DO ispin = 1, dft_control%nspins
1296 CALL pw_axpy(rho_r(ispin), rho_tot_rspace)
1299 IF (my_total_density)
THEN
1300 filename =
"TOTAL_DENSITY"
1302 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1303 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1304 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1305 IF (iounit > 0)
THEN
1306 IF (.NOT. mpi_io)
THEN
1307 INQUIRE (unit=unit_nr, name=filename)
1309 filename = mpi_filename
1311 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1312 "The total density is written in cube file format to the file:", adjustr(trim(filename))
1314 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"TOTAL DENSITY", &
1315 particles=particles, &
1316 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1317 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1319 IF (my_v_hartree .OR. my_efield)
THEN
1321 TYPE(pw_c1d_gs_type) :: rho_tot_gspace
1322 CALL auxbas_pw_pool%create_pw(pw=rho_tot_gspace)
1323 CALL pw_transfer(rho_tot_rspace, rho_tot_gspace)
1324 poisson_params%solver = pw_poisson_analytic
1325 poisson_params%periodic = cell%perd
1326 poisson_params%ewald_type = do_ewald_none
1328 TYPE(greens_fn_type) :: green_fft
1329 TYPE(pw_grid_type),
POINTER :: pwdummy
1331 CALL pw_green_create(green_fft, poisson_params, cell%hmat, auxbas_pw_pool, pwdummy, pwdummy)
1332 rho_tot_gspace%array(:) = rho_tot_gspace%array(:)*green_fft%influence_fn%array(:)
1333 CALL pw_green_release(green_fft, auxbas_pw_pool)
1335 IF (my_v_hartree)
THEN
1337 TYPE(pw_r3d_rs_type) :: vhartree
1338 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1339 CALL pw_transfer(rho_tot_gspace, vhartree)
1340 filename =
"V_HARTREE"
1342 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1343 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1344 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1345 IF (iounit > 0)
THEN
1346 IF (.NOT. mpi_io)
THEN
1347 INQUIRE (unit=unit_nr, name=filename)
1349 filename = mpi_filename
1351 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1352 "The Hartree potential is written in cube file format to the file:", adjustr(trim(filename))
1354 CALL cp_pw_to_cube(vhartree, unit_nr,
"Hartree Potential", &
1355 particles=particles, &
1356 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1357 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1358 CALL auxbas_pw_pool%give_back_pw(vhartree)
1363 TYPE(pw_c1d_gs_type) :: vhartree
1364 CALL auxbas_pw_pool%create_pw(pw=vhartree)
1365 udvol = 1.0_dp/rho_tot_rspace%pw_grid%dvol
1367 CALL pw_transfer(rho_tot_gspace, vhartree)
1370 CALL pw_derive(vhartree, nd)
1371 CALL pw_transfer(vhartree, rho_tot_rspace)
1372 CALL pw_scale(rho_tot_rspace, udvol)
1374 filename =
"EFIELD_"//cdir(id)
1376 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', &
1377 extension=
".cube", middle_name=trim(filename), file_position=my_pos_cube, &
1378 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1379 IF (iounit > 0)
THEN
1380 IF (.NOT. mpi_io)
THEN
1381 INQUIRE (unit=unit_nr, name=filename)
1383 filename = mpi_filename
1385 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1386 "The Efield is written in cube file format to the file:", adjustr(trim(filename))
1388 CALL cp_pw_to_cube(rho_tot_rspace, unit_nr,
"EFIELD "//cdir(id), &
1389 particles=particles, &
1390 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1391 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1393 CALL auxbas_pw_pool%give_back_pw(vhartree)
1396 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1400 CALL auxbas_pw_pool%give_back_pw(rho_tot_rspace)
1401 CALL auxbas_pw_pool%give_back_pw(rho_core)
1403 END SUBROUTINE print_density_cubes
1410 SUBROUTINE print_elf(qs_env, elf_section)
1412 TYPE(qs_environment_type),
POINTER :: qs_env
1413 TYPE(section_vals_type),
POINTER :: elf_section
1415 CHARACTER(LEN=default_path_length) :: filename, mpi_filename, my_pos_cube, &
1417 INTEGER :: iounit, ispin, unit_nr
1418 LOGICAL :: append_cube, mpi_io
1419 REAL(kind=dp) :: rho_cutoff
1420 REAL(kind=dp),
DIMENSION(:),
POINTER :: tot_rho_r
1421 TYPE(cp_logger_type),
POINTER :: logger
1422 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: rho_ao
1423 TYPE(dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho_ao_kp
1424 TYPE(dft_control_type),
POINTER :: dft_control
1425 TYPE(particle_list_type),
POINTER :: particles
1426 TYPE(pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g
1427 TYPE(pw_env_type),
POINTER :: pw_env
1428 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1429 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1430 TYPE(pw_r3d_rs_type),
ALLOCATABLE,
DIMENSION(:) :: elf_r
1431 TYPE(pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r
1432 TYPE(qs_ks_env_type),
POINTER :: ks_env
1433 TYPE(qs_rho_type),
POINTER :: rho
1434 TYPE(qs_subsys_type),
POINTER :: subsys
1436 logger => cp_get_default_logger()
1437 iounit = cp_logger_get_default_io_unit(logger)
1440 CALL get_qs_env(qs_env, dft_control=dft_control, ks_env=ks_env, rho=rho)
1441 NULLIFY (rho_r, rho_g, tot_rho_r)
1442 CALL qs_rho_get(rho, rho_ao_kp=rho_ao_kp, &
1443 rho_r=rho_r, rho_g=rho_g, tot_rho_r=tot_rho_r)
1444 DO ispin = 1, dft_control%nspins
1445 rho_ao => rho_ao_kp(ispin, :)
1446 CALL calculate_rho_elec(matrix_p_kp=rho_ao, &
1448 rho_gspace=rho_g(ispin), &
1449 total_rho=tot_rho_r(ispin), &
1452 CALL qs_rho_set(rho, rho_r_valid=.true., rho_g_valid=.true.)
1454 CALL get_qs_env(qs_env, subsys=subsys)
1455 CALL qs_subsys_get(subsys, particles=particles)
1457 ALLOCATE (elf_r(dft_control%nspins))
1458 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1459 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1460 DO ispin = 1, dft_control%nspins
1461 CALL auxbas_pw_pool%create_pw(elf_r(ispin))
1462 CALL pw_zero(elf_r(ispin))
1465 IF (iounit > 0)
THEN
1466 WRITE (unit=iounit, fmt=
"(/,T2,A)") &
1467 "ELF is computed on the real space grid -----"
1469 rho_cutoff = section_get_rval(elf_section,
"density_cutoff")
1470 CALL qs_elf_calc(qs_env, elf_r, rho_cutoff)
1473 append_cube = section_get_lval(elf_section,
"APPEND")
1474 my_pos_cube =
"REWIND"
1475 IF (append_cube) my_pos_cube =
"APPEND"
1476 DO ispin = 1, dft_control%nspins
1477 WRITE (filename,
'(a5,I1.1)')
"ELF_S", ispin
1478 WRITE (title, *)
"ELF spin ", ispin
1480 unit_nr = cp_print_key_unit_nr(logger, elf_section,
'', extension=
".cube", &
1481 middle_name=trim(filename), file_position=my_pos_cube, &
1482 log_filename=.false., mpi_io=mpi_io, fout=mpi_filename)
1483 IF (iounit > 0)
THEN
1484 IF (.NOT. mpi_io)
THEN
1485 INQUIRE (unit=unit_nr, name=filename)
1487 filename = mpi_filename
1489 WRITE (unit=iounit, fmt=
"(T2,A,/,T2,A79)") &
1490 "ELF is written in cube file format to the file:", adjustr(trim(filename))
1493 CALL cp_pw_to_cube(elf_r(ispin), unit_nr, title, particles=particles, &
1494 stride=section_get_ivals(elf_section,
"STRIDE"), mpi_io=mpi_io)
1495 CALL cp_print_key_finished_output(unit_nr, logger, elf_section,
'', mpi_io=mpi_io)
1497 CALL auxbas_pw_pool%give_back_pw(elf_r(ispin))
1502 END SUBROUTINE print_elf
1508 SUBROUTINE print_mo_cubes(qs_env, cube_section)
1510 TYPE(qs_environment_type),
POINTER :: qs_env
1511 TYPE(section_vals_type),
POINTER :: cube_section
1513 CHARACTER(LEN=default_path_length) :: filename, my_pos_cube, title
1514 INTEGER :: homo, i, ifirst, ilast, iounit, ir, &
1515 ispin, ivector, n_rep, nhomo, nlist, &
1516 nlumo, nmo, shomo, unit_nr
1517 INTEGER,
DIMENSION(:),
POINTER ::
list, list_index
1518 LOGICAL :: append_cube, mpi_io, write_cube
1519 REAL(kind=dp) :: homo_lumo(2, 2)
1520 REAL(kind=dp),
DIMENSION(:),
POINTER :: mo_eigenvalues
1521 TYPE(atomic_kind_type),
DIMENSION(:),
POINTER :: atomic_kind_set
1522 TYPE(cell_type),
POINTER :: cell
1523 TYPE(cp_fm_type),
POINTER :: mo_coeff
1524 TYPE(cp_logger_type),
POINTER :: logger
1525 TYPE(dbcsr_p_type),
DIMENSION(:),
POINTER :: ks_rmpv, mo_derivs
1526 TYPE(dft_control_type),
POINTER :: dft_control
1527 TYPE(mo_set_type),
DIMENSION(:),
POINTER :: mos
1528 TYPE(particle_list_type),
POINTER :: particles
1529 TYPE(particle_type),
DIMENSION(:),
POINTER :: particle_set
1530 TYPE(pw_c1d_gs_type) :: wf_g
1531 TYPE(pw_env_type),
POINTER :: pw_env
1532 TYPE(pw_pool_p_type),
DIMENSION(:),
POINTER :: pw_pools
1533 TYPE(pw_pool_type),
POINTER :: auxbas_pw_pool
1534 TYPE(pw_r3d_rs_type) :: wf_r
1535 TYPE(qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1536 TYPE(qs_subsys_type),
POINTER :: subsys
1537 TYPE(scf_control_type),
POINTER :: scf_control
1539 logger => cp_get_default_logger()
1540 iounit = cp_logger_get_default_io_unit(logger)
1542 CALL get_qs_env(qs_env, mos=mos, matrix_ks=ks_rmpv, scf_control=scf_control)
1543 CALL get_qs_env(qs_env, dft_control=dft_control, mo_derivs=mo_derivs)
1544 CALL make_mo_eig(mos, dft_control%nspins, ks_rmpv, scf_control, mo_derivs)
1545 NULLIFY (mo_eigenvalues)
1547 DO ispin = 1, dft_control%nspins
1548 CALL get_mo_set(mo_set=mos(ispin), eigenvalues=mo_eigenvalues, homo=shomo)
1549 homo_lumo(ispin, 1) = mo_eigenvalues(shomo)
1550 homo = max(homo, shomo)
1552 write_cube = section_get_lval(cube_section,
"WRITE_CUBE")
1553 nlumo = section_get_ival(cube_section,
"NLUMO")
1554 nhomo = section_get_ival(cube_section,
"NHOMO")
1555 NULLIFY (list_index)
1556 CALL section_vals_val_get(cube_section,
"HOMO_LIST", n_rep_val=n_rep)
1561 CALL section_vals_val_get(cube_section,
"HOMO_LIST", i_rep_val=ir, i_vals=
list)
1562 IF (
ASSOCIATED(
list))
THEN
1563 CALL reallocate(list_index, 1, nlist +
SIZE(
list))
1564 DO i = 1,
SIZE(
list)
1565 list_index(i + nlist) =
list(i)
1567 nlist = nlist +
SIZE(
list)
1570 nhomo = maxval(list_index)
1572 IF (nhomo == -1) nhomo = homo
1573 nlist = homo - max(1, homo - nhomo + 1) + 1
1574 ALLOCATE (list_index(nlist))
1576 list_index(i) = max(1, homo - nhomo + 1) + i - 1
1580 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1581 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, pw_pools=pw_pools)
1582 CALL auxbas_pw_pool%create_pw(wf_r)
1583 CALL auxbas_pw_pool%create_pw(wf_g)
1585 CALL get_qs_env(qs_env, subsys=subsys)
1586 CALL qs_subsys_get(subsys, particles=particles)
1588 append_cube = section_get_lval(cube_section,
"APPEND")
1589 my_pos_cube =
"REWIND"
1590 IF (append_cube)
THEN
1591 my_pos_cube =
"APPEND"
1594 CALL get_qs_env(qs_env=qs_env, &
1595 atomic_kind_set=atomic_kind_set, &
1596 qs_kind_set=qs_kind_set, &
1598 particle_set=particle_set)
1600 IF (nhomo >= 0)
THEN
1601 DO ispin = 1, dft_control%nspins
1603 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1604 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1605 IF (write_cube)
THEN
1607 ivector = list_index(i)
1608 IF (ivector > homo) cycle
1609 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, qs_kind_set, &
1610 cell, dft_control, particle_set, pw_env)
1611 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1613 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1614 middle_name=trim(filename), file_position=my_pos_cube, &
1615 log_filename=.false., mpi_io=mpi_io)
1616 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. HOMO - ", ivector - homo
1617 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1618 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1619 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1625 IF (nlumo /= 0)
THEN
1626 DO ispin = 1, dft_control%nspins
1628 CALL get_mo_set(mo_set=mos(ispin), mo_coeff=mo_coeff, &
1629 eigenvalues=mo_eigenvalues, homo=homo, nmo=nmo)
1630 IF (write_cube)
THEN
1632 IF (nlumo == -1)
THEN
1635 ilast = ifirst + nlumo - 1
1636 ilast = min(nmo, ilast)
1638 DO ivector = ifirst, ilast
1639 CALL calculate_wavefunction(mo_coeff, ivector, wf_r, wf_g, atomic_kind_set, &
1640 qs_kind_set, cell, dft_control, particle_set, pw_env)
1641 WRITE (filename,
'(a4,I5.5,a1,I1.1)')
"WFN_", ivector,
"_", ispin
1643 unit_nr = cp_print_key_unit_nr(logger, cube_section,
'', extension=
".cube", &
1644 middle_name=trim(filename), file_position=my_pos_cube, &
1645 log_filename=.false., mpi_io=mpi_io)
1646 WRITE (title, *)
"WAVEFUNCTION ", ivector,
" spin ", ispin,
" i.e. LUMO + ", ivector - ifirst
1647 CALL cp_pw_to_cube(wf_r, unit_nr, title, particles=particles, &
1648 stride=section_get_ivals(cube_section,
"STRIDE"), mpi_io=mpi_io)
1649 CALL cp_print_key_finished_output(unit_nr, logger, cube_section,
'', mpi_io=mpi_io)
1655 CALL auxbas_pw_pool%give_back_pw(wf_g)
1656 CALL auxbas_pw_pool%give_back_pw(wf_r)
1657 IF (
ASSOCIATED(list_index))
DEALLOCATE (list_index)
1659 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_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...
subroutine, public cp_fm_cholesky_restore(matrix, neig, matrixb, matrixout, op, pos, transa)
...
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_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
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
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, stride, 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.
real(kind=dp), parameter, public twopi
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, 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, 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, ecoul_1c, rho0_s_rs, rho0_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)
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, 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, 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, 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, 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)
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 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, reorder_rs_grid_ranks, skip_load_balance_distributed, soft_valid, basis_type, 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.