117#include "./base/base_uses.f90"
123 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_methods'
125 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
127 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
128 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
148 SUBROUTINE tddfpt(qs_env, calc_forces, rixs_env)
150 LOGICAL,
INTENT(IN) :: calc_forces
153 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt'
155 INTEGER :: handle, ispin, istate, log_unit, mult, &
156 my_state, nao, nocc, nspins, &
157 nstate_max, nstates, nvirt, old_state
158 INTEGER,
DIMENSION(maxspins) :: nactive
159 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
160 do_hfxsr, do_rixs, do_sf, do_soc, &
161 lmult_tmp, state_change
162 REAL(kind=
dp) :: gsmin, gsval, xsval
163 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
168 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: my_mos
169 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
171 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
173 matrix_s_aux_fit_vs_orb
178 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
181 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
185 lri_section, soc_section, &
186 tddfpt_print_section, tddfpt_section, &
196 CALL timeset(routinen, handle)
202 NULLIFY (tddfpt_section, tddfpt_control)
205 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
206 lri_section, hfxsr_section)
209 extension=
".tddfptLog")
212 blacs_env=blacs_env, &
214 dft_control=dft_control, &
215 matrix_ks=matrix_ks, &
223 NULLIFY (rixs_control, valence_state)
224 rixs_control => dft_control%rixs_control
225 tddfpt_control => rixs_control%tddfpt2_control
226 valence_state => rixs_env%valence_state
229 tddfpt_control => dft_control%tddfpt2_control
232 tddfpt_control%do_hfx = do_hfx
233 tddfpt_control%do_admm = do_admm
234 tddfpt_control%do_hfxsr = do_hfxsr
235 tddfpt_control%hfxsr_primbas = 0
236 tddfpt_control%hfxsr_re_int = .true.
237 tddfpt_control%do_hfxlr = do_hfxlr
238 tddfpt_control%do_exck = do_exck
241 IF (tddfpt_control%do_hfxlr)
THEN
253 lmult_tmp = tddfpt_control%rks_triplets
254 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
264 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
271 IF (tddfpt_control%do_smearing)
THEN
278 IF ((tddfpt_control%do_lrigpw) .AND. &
280 CALL cp_abort(__location__,
"LRI only implemented for full kernel")
283 IF (
ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
291 nspins =
SIZE(gs_mos)
294 mult = abs(
SIZE(gs_mos(1)%evals_occ) -
SIZE(gs_mos(2)%evals_occ)) + 1
296 CALL cp_warn(__location__,
"There is a convergence issue for multiplicity >= 3")
298 IF (tddfpt_control%rks_triplets)
THEN
306 ALLOCATE (my_mos(nspins))
308 my_mos(ispin) = gs_mos(ispin)%mos_occ
311 kernel=tddfpt_control%kernel)
316 IF (dft_control%qs_control%xtb)
THEN
317 cpabort(
"TDDFPT: xTB only works with sTDA Kernel")
320 IF (tddfpt_control%do_hfxsr)
THEN
323 i_val=tddfpt_control%hfxsr_primbas)
326 primitive=tddfpt_control%hfxsr_primbas)
328 ALLOCATE (full_kernel_env%admm_control)
334 full_kernel_env%hfxsr_section => hfxsr_section
337 full_kernel_env%admm_control,
"TDA_HFX")
338 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
339 matrix_s_aux_fit=matrix_s_aux_fit, &
340 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
342 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
344 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
345 qs_kind_set=qs_kind_set, particle_set=particle_set, &
347 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
348 qs_kind_set, particle_set, dft_control, cell, orb_basis=
"TDA_HFX")
352 nstates = tddfpt_control%nstates
362 nstate_max = nocc*nvirt
363 IF (nstates > nstate_max)
THEN
364 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
365 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
367 tddfpt_control%nstates = nstate_max
370 do_hfxlr, do_exck, do_sf, qs_env, sub_env)
373 kernel_env%full_kernel => full_kernel_env
374 kernel_env%admm_kernel => kernel_env_admm_aux
375 NULLIFY (kernel_env%stda_kernel)
388 DO ispin = 1,
SIZE(gs_mos)
390 ncol_global=nactive(ispin))
396 nstates = tddfpt_control%nstates
401 work_matrices, tddfpt_control)
403 kernel_env%stda_kernel => stda_kernel
404 NULLIFY (kernel_env%full_kernel)
405 NULLIFY (kernel_env%admm_kernel)
408 nstates = tddfpt_control%nstates
411 NULLIFY (kernel_env%full_kernel)
412 NULLIFY (kernel_env%admm_kernel)
413 NULLIFY (kernel_env%stda_kernel)
418 ALLOCATE (evects(1, nstates))
420 ALLOCATE (evects(nspins, nstates))
422 ALLOCATE (evals(nstates))
423 ALLOCATE (s_evects(
SIZE(evects, 1), nstates))
425 DO istate = 1, nstates
426 DO ispin = 1,
SIZE(evects, 1)
428 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
429 s_evects(ispin, istate))
433 IF (.NOT. do_soc)
THEN
436 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
437 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
438 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
441 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
442 tddfpt_control, logger, tddfpt_print_section, &
443 evects, evals, ostrength, &
444 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
445 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
450 IF (calc_forces)
THEN
452 tddfpt_print_section, gs_mos, &
453 kernel_env, sub_env, work_matrices)
457 IF (qs_env%excited_state)
THEN
458 IF (sub_env%is_split)
THEN
459 CALL cp_abort(__location__, &
460 "Excited state forces not possible when states"// &
461 " are distributed to different CPU pools.")
464 IF (
ASSOCIATED(matrix_ks_oep))
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
466 state_change = .false.
467 IF (ex_env%state > 0)
THEN
468 my_state = ex_env%state
469 ELSEIF (ex_env%state < 0)
THEN
471 ALLOCATE (my_mos(nspins))
473 my_mos(ispin) = gs_mos(ispin)%mos_occ
475 my_state = abs(ex_env%state)
476 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
478 IF (my_state /= abs(ex_env%state))
THEN
479 state_change = .true.
480 old_state = abs(ex_env%state)
482 ex_env%state = -my_state
484 CALL cp_warn(__location__, &
485 "Active excited state not assigned. Use the first state.")
488 cpassert(my_state > 0)
489 IF (my_state > nstates)
THEN
490 CALL cp_warn(__location__, &
491 "There were not enough excited states calculated.")
492 cpabort(
"excited state potential energy surface")
496 ex_env%evalue = evals(my_state)
499 ALLOCATE (ex_env%evect(
SIZE(evects, 1)))
500 DO ispin = 1,
SIZE(evects, 1)
502 matrix_struct=matrix_struct)
504 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
507 IF (log_unit > 0)
THEN
508 gsval = ex_env%wfn_history%gsval
509 gsmin = ex_env%wfn_history%gsmin
510 xsval = ex_env%wfn_history%xsval
511 WRITE (log_unit,
"(1X,A,T40,F10.6,A,T62,F10.6,A)")
"Ground state orbital alignment:", &
512 gsmin,
"[MinVal]", gsval,
"[Average]"
513 WRITE (log_unit,
"(1X,A,T71,F10.6)")
"Excitation vector alignment:", xsval
514 IF (state_change)
THEN
515 WRITE (log_unit,
"(1X,A,I5,T60,A14,T76,I5)") &
516 "Target state has been changed from state ", &
517 old_state,
" to new state ", my_state
519 WRITE (log_unit,
"(1X,A,I4,A,F12.5,A)")
"Calculate properties for state:", &
520 my_state,
" with excitation energy ", ex_env%evalue*
evolt,
" eV"
524 IF (calc_forces)
THEN
526 sub_env, work_matrices)
533 valence_state%nstates = nstates
534 ALLOCATE (valence_state%evals(
SIZE(evals)))
535 valence_state%evals(:) = evals(:)
537 ALLOCATE (valence_state%evects(nspins, nstates))
538 ALLOCATE (valence_state%mos_occ(nspins))
541 DO istate = 1, nstates
543 matrix_struct=matrix_struct)
544 CALL cp_fm_create(valence_state%evects(ispin, istate), matrix_struct)
545 CALL cp_fm_to_fm(evects(ispin, istate), valence_state%evects(ispin, istate))
549 matrix_struct=matrix_struct)
550 CALL cp_fm_create(valence_state%mos_occ(ispin), matrix_struct)
551 CALL cp_fm_to_fm(gs_mos(ispin)%mos_occ, valence_state%mos_occ(ispin))
561 tddfpt_print_section, &
564 DEALLOCATE (evals, ostrength)
568 IF (tddfpt_control%do_lrigpw)
THEN
570 DEALLOCATE (kernel_env%full_kernel%lri_env)
572 DEALLOCATE (kernel_env%full_kernel%lri_density)
580 cpabort(
'Unknown kernel type')
587 DO ispin = nspins, 1, -1
592 IF (
ASSOCIATED(matrix_ks_oep)) &
595 CALL timestop(handle)
612 SUBROUTINE tddfpt_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, &
613 xc_section, tddfpt_print_section, lri_section, hfxsr_section)
615 LOGICAL,
INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
618 lri_section, hfxsr_section
620 CHARACTER(len=20) :: nstates_str
621 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
622 explicit_root, expot, exvdw, exwfn, &
624 REAL(kind=
dp) :: c_hf
627 tddfpt_section, xc_root, xc_sub
630 NULLIFY (dft_control, input)
631 CALL get_qs_env(qs_env, dft_control=dft_control, input=input)
632 tddfpt_control => dft_control%tddfpt2_control
635 IF (dft_control%nimages > 1) cpabort(
"k-points not implemented for TDDFPT")
637 IF (tddfpt_control%nstates <= 0)
THEN
639 CALL cp_warn(__location__,
"TDDFPT calculation was requested for "// &
640 trim(nstates_str)//
" excited states: nothing to do.")
644 NULLIFY (tddfpt_section, tddfpt_print_section)
653 IF (explicit_root)
THEN
659 CALL cp_warn(__location__,
"TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
660 cpabort(
"TDDFPT Input")
667 CALL cp_warn(__location__,
"TDDFPT Kernel with GCP_POTENTIAL not possible.")
668 cpabort(
"TDDFPT Input")
675 CALL cp_warn(__location__,
"TDDFPT Kernel with VDW_POTENTIAL not possible.")
676 cpabort(
"TDDFPT Input")
683 CALL cp_warn(__location__,
"TDDFPT Kernel with WF_CORRELATION not possible.")
684 cpabort(
"TDDFPT Input")
691 CALL cp_warn(__location__,
"TDDFPT Kernel with XC_POTENTIAL not possible.")
692 cpabort(
"TDDFPT Input")
701 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk))
THEN
702 CALL cp_warn(__location__,
"TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
703 cpabort(
"TDDFPT Input")
712 xc_section => xc_root
717 do_hfx = (c_hf /= 0.0_dp)
723 IF (.NOT. same_hfx)
THEN
724 cpabort(
"TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
728 do_admm = do_hfx .AND. dft_control%do_admm
731 CALL cp_abort(__location__, &
732 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
733 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
756 do_hfx = (c_hf /= 0.0_dp)
758 do_admm = do_hfx .AND. dft_control%do_admm
772 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1)
THEN
773 tddfpt_control%rks_triplets = .false.
774 CALL cp_warn(__location__,
"Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
778 IF (tddfpt_control%do_lrigpw)
THEN
783 NULLIFY (hfxsr_section)
787 IF (.NOT. found)
THEN
788 cpabort(
"HFXSR option needs &HF section defined")
790 CALL section_vals_val_get(hfxsr_section,
"INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
791 IF (.NOT. found)
THEN
796 IF (.NOT. found)
THEN
797 CALL section_vals_val_set(hfxsr_section,
"INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
801 CALL cp_abort(__location__,
"Short range TDA kernel with RI not possible")
814 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
815 INTEGER,
INTENT(IN) :: log_unit
820 CHARACTER(LEN=4) :: ktype
823 lsd = (dft_control%nspins > 1)
826 IF (log_unit > 0)
THEN
827 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
828 CALL xc_write(log_unit, xc_section, lsd)
829 IF (tddfpt_control%do_hfx)
THEN
830 IF (tddfpt_control%do_admm)
THEN
831 WRITE (log_unit,
"(T2,A,T62,A19)")
"KERNEL|",
"ADMM Exact Exchange"
832 IF (tddfpt_control%admm_xc_correction)
THEN
833 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Apply ADMM Kernel XC Correction"
835 IF (tddfpt_control%admm_symm)
THEN
836 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Symmetric ADMM Kernel"
839 WRITE (log_unit,
"(T2,A,T67,A14)")
"KERNEL|",
"Exact Exchange"
842 IF (tddfpt_control%do_hfxsr)
THEN
843 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Short range HFX approximation"
845 IF (tddfpt_control%do_hfxlr)
THEN
846 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Long range HFX approximation"
848 IF (tddfpt_control%do_lrigpw)
THEN
849 WRITE (log_unit,
"(T2,A,T42,A39)")
"KERNEL|",
"LRI approximation of transition density"
854 IF (log_unit > 0)
THEN
855 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
856 IF (tddfpt_control%stda_control%do_ewald)
THEN
857 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses Ewald summation"
859 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses direct summation (MIC)"
861 IF (tddfpt_control%stda_control%do_exchange)
THEN
862 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Exact exchange term",
"YES"
863 WRITE (log_unit,
"(T2,A,T71,F10.3)")
"KERNEL| Short range HFX fraction:", &
864 tddfpt_control%stda_control%hfx_fraction
866 WRITE (log_unit,
"(T2,A,T79,A2)")
"KERNEL| Exact exchange term",
"NO"
868 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"KERNEL| Transition density filter", &
869 tddfpt_control%stda_control%eps_td_filter
873 IF (log_unit > 0)
THEN
874 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
880 IF (log_unit > 0)
THEN
881 IF (tddfpt_control%rks_triplets)
THEN
882 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Triplet"
886 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin symmetry of excitations",
"Unrestricted"
889 WRITE (log_unit,
"(T2,A,T72,A9)")
"KERNEL| Spin flip",
"Collinear"
892 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin flip",
"Noncollinear"
895 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Singlet"
897 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of states calculated", tddfpt_control%nstates
898 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of Davidson iterations", tddfpt_control%niters
899 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"TDDFPT| Davidson iteration convergence", tddfpt_control%conv
900 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
903 END SUBROUTINE kernel_info
931 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
932 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
933 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
937 INTEGER :: nstates, nspins
942 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
943 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
947 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
952 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ostrength
953 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
958 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_energies'
960 CHARACTER(len=20) :: nstates_str
961 INTEGER :: energy_unit, handle, iter, log_unit, &
962 niters, nocc, nstate_max, &
964 LOGICAL :: do_admm, do_exck, do_soc, explicit
965 REAL(kind=
dp) :: conv
968 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_oep
972 CALL timeset(routinen, handle)
974 NULLIFY (admm_env, matrix_ks_oep)
975 do_admm = tddfpt_control%do_admm
976 IF (do_admm)
CALL get_qs_env(qs_env, admm_env=admm_env)
982 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
983 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
984 is_rks_triplets=tddfpt_control%rks_triplets, &
985 qs_env=qs_env, sub_env=sub_env, &
986 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
990 IF (tddfpt_control%admm_xc_correction)
THEN
992 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
993 xc_section=admm_env%xc_section_primary, &
994 is_rks_triplets=tddfpt_control%rks_triplets, &
998 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
999 xc_section=xc_section, &
1000 is_rks_triplets=tddfpt_control%rks_triplets, &
1005 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1006 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
1007 local_rho_set=sub_env%local_rho_set_admm, &
1008 qs_env=qs_env, sub_env=sub_env, &
1009 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
1010 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
1011 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
1014 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
1015 xc_section=admm_env%xc_section_aux, &
1016 is_rks_triplets=tddfpt_control%rks_triplets, &
1018 kernel_env%full_kernel => full_kernel_env
1019 kernel_env%admm_kernel => kernel_env_admm_aux
1023 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1024 xc_section=xc_section, &
1025 is_rks_triplets=tddfpt_control%rks_triplets, &
1027 kernel_env%full_kernel => full_kernel_env
1028 NULLIFY (kernel_env%admm_kernel)
1031 do_exck = tddfpt_control%do_exck
1032 kernel_env%full_kernel%do_exck = do_exck
1035 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
1036 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
1041 IF (tddfpt_control%do_lrigpw)
THEN
1044 tddfpt_print_section)
1056 nstate_max = nocc*nvirt
1057 IF ((
SIZE(gs_mos, 1) == 2) .AND. (tddfpt_control%spinflip ==
no_sf_tddfpt))
THEN
1060 nstate_max = nocc*nvirt + nstate_max
1062 IF (nstates > nstate_max)
THEN
1063 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
1064 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
1065 nstates = nstate_max
1072 IF (tddfpt_control%is_restart .AND. .NOT. do_soc)
THEN
1080 tddfpt_section=tddfpt_section, &
1081 tddfpt_print_section=tddfpt_print_section, &
1082 fm_pool_ao_mo_occ=work_matrices%fm_pool_ao_mo_occ, &
1083 blacs_env_global=blacs_env)
1091 "GUESS_VECTORS", extension=
".tddfptLog")
1093 gs_mos=gs_mos, log_unit=log_unit, tddfpt_control=tddfpt_control, &
1094 qs_env=qs_env, nspins=nspins)
1096 tddfpt_print_section,
"GUESS_VECTORS")
1099 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1105 niters = tddfpt_control%niters
1106 IF (niters > 0)
THEN
1108 "ITERATION_INFO", extension=
".tddfptLog")
1110 tddfpt_print_section, &
1111 "DETAILED_ENERGY", &
1112 extension=
".tddfptLog")
1114 IF (log_unit > 0)
THEN
1115 WRITE (log_unit,
"(1X,A)")
"", &
1116 "-------------------------------------------------------------------------------", &
1117 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1118 "-------------------------------------------------------------------------------"
1120 WRITE (log_unit,
'(/,T11,A,T27,A,T40,A,T62,A)')
"Step",
"Time",
"Convergence",
"Conv. states"
1121 WRITE (log_unit,
'(1X,79("-"))')
1131 s_evects=s_evects, &
1133 tddfpt_control=tddfpt_control, &
1134 matrix_ks=matrix_ks, &
1136 kernel_env=kernel_env, &
1139 iter_unit=log_unit, &
1140 energy_unit=energy_unit, &
1141 tddfpt_print_section=tddfpt_print_section, &
1142 work_matrices=work_matrices)
1149 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1151 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters)
EXIT
1155 IF (log_unit > 0)
THEN
1156 WRITE (log_unit,
'(1X,25("-"),1X,A,1X,25("-"))')
"Restart Davidson iterations"
1162 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1167 tddfpt_print_section=tddfpt_print_section)
1172 IF (log_unit > 0)
THEN
1174 IF (conv <= tddfpt_control%conv)
THEN
1175 WRITE (log_unit,
"(1X,A)")
"", &
1176 "-------------------------------------------------------------------------------", &
1177 "- TDDFPT run converged in "//trim(nstates_str)//
" iteration(s) ", &
1178 "-------------------------------------------------------------------------------"
1180 WRITE (log_unit,
"(1X,A)")
"", &
1181 "-------------------------------------------------------------------------------", &
1182 "- TDDFPT run did NOT converge after "//trim(nstates_str)//
" iteration(s) ", &
1183 "-------------------------------------------------------------------------------"
1188 tddfpt_print_section,
"DETAILED_ENERGY")
1190 tddfpt_print_section,
"ITERATION_INFO")
1192 CALL cp_warn(__location__, &
1193 "Skipping TDDFPT wavefunction optimization")
1196 IF (
ASSOCIATED(matrix_ks_oep))
THEN
1198 CALL cp_warn(__location__, &
1199 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1200 "when computed using an orbital energy correction XC-potential together with "// &
1201 "the velocity form of dipole transition integrals")
1209 tddfpt_print_section, &
1217 tddfpt_print_section, &
1218 matrix_s(1)%matrix, &
1222 ALLOCATE (ostrength(nstates))
1229 dipole_op_mos_occ, &
1230 tddfpt_control%dipole_form)
1236 matrix_s(1)%matrix, &
1237 tddfpt_control%spinflip, &
1238 min_amplitude=tddfpt_control%min_excitation_amplitude)
1243 matrix_s(1)%matrix, &
1244 tddfpt_print_section)
1245 IF (tddfpt_control%do_exciton_descriptors)
THEN
1250 matrix_s(1)%matrix, &
1251 tddfpt_control%do_directional_exciton_descriptors, &
1255 IF (tddfpt_control%do_lrigpw)
THEN
1258 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1261 CALL timestop(handle)
1293 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1294 tddfpt_control, logger, tddfpt_print_section, &
1295 evects, evals, ostrength, &
1296 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1297 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1298 kernel_env_admm_aux)
1301 INTEGER,
INTENT(in) :: nstates
1306 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1307 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
1311 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1316 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1317 LOGICAL,
INTENT(in) :: lmult_tmp
1321 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_energies'
1323 INTEGER :: handle, ispin, istate, log_unit, mult, &
1326 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_mult, ostrength_mult
1327 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mult
1329 CALL timeset(routinen, handle)
1333 extension=
".tddfptLog")
1336 nspins =
SIZE(gs_mos)
1337 ALLOCATE (evects_mult(nspins, nstates))
1338 ALLOCATE (evals_mult(nstates))
1343 IF (log_unit > 0)
THEN
1344 WRITE (log_unit,
"(1X,A)")
"", &
1345 "-------------------------------------------------------------------------------", &
1346 "- TDDFPT SINGLET ENERGIES -", &
1347 "-------------------------------------------------------------------------------"
1351 IF (log_unit > 0)
THEN
1352 WRITE (log_unit,
"(1X,A)")
"", &
1353 "-------------------------------------------------------------------------------", &
1354 "- TDDFPT TRIPLET ENERGIES -", &
1355 "-------------------------------------------------------------------------------"
1360 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1361 tddfpt_print_section, evects_mult, evals_mult, &
1362 gs_mos, tddfpt_section, s_evects, matrix_s, &
1363 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1364 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1365 kernel_env_admm_aux)
1373 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1374 tddfpt_control%do_exck, do_sf, qs_env, sub_env)
1377 DO istate = 1, nstates
1378 DO ispin = 1, nspins
1383 DO istate = 1, nstates
1384 DO ispin = 1, nspins
1386 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
1387 s_evects(ispin, istate))
1391 tddfpt_control%rks_triplets = lmult_tmp
1395 IF (log_unit > 0)
THEN
1396 WRITE (log_unit,
"(1X,A)")
"", &
1397 " singlet excitations finished ", &
1399 "-------------------------------------------------------------------------------", &
1400 "- TDDFPT TRIPLET ENERGIES -", &
1401 "-------------------------------------------------------------------------------"
1405 IF (log_unit > 0)
THEN
1406 WRITE (log_unit,
"(1X,A)")
"", &
1407 " triplet excitations finished ", &
1409 "-------------------------------------------------------------------------------", &
1410 "- TDDFPT SINGLET ENERGIES -", &
1411 "-------------------------------------------------------------------------------"
1416 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1417 tddfpt_print_section, evects, evals, &
1418 gs_mos, tddfpt_section, s_evects, matrix_s, &
1419 kernel_env, matrix_ks, sub_env, ostrength, &
1420 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1421 kernel_env_admm_aux)
1426 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos)
1428 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos)
1432 DO ispin = 1,
SIZE(evects_mult, 1)
1433 DO istate = 1,
SIZE(evects_mult, 2)
1437 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1439 CALL timestop(handle)
1441 END SUBROUTINE tddfpt_soc_energies
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed, mos, mos_aux_fit, geometry_did_change)
...
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public grimme2016
integer, save, public iannuzzi2005
integer, save, public hernandez2025
integer, save, public grimme2013
Handles all functions related to the CELL.
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.
pool for for elements that are retained and released
subroutine, public fm_pool_create_fm(pool, element, name)
returns an element, allocating it if none is in the pool
represent the structure of a full matrix
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)
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,...
subroutine, public cp_iterate(iteration_info, last, iter_nr, increment, iter_nr_out)
adds one to the actual iteration
subroutine, public cp_rm_iter_level(iteration_info, level_name, n_rlevel_att)
Removes an iteration level.
subroutine, public cp_add_iter_level(iteration_info, level_name, n_rlevel_new)
Adds an iteration level.
Types for excited states potential energies.
Utilities for hfx and admm methods.
subroutine, public aux_admm_init(qs_env, mos, admm_env, admm_control, basis_type)
Minimal setup routine for admm_env No forces No k-points No DFT correction terms.
Types and set/get functions for HFX.
subroutine, public hfx_create(x_data, para_env, hfx_section, atomic_kind_set, qs_kind_set, particle_set, dft_control, cell, orb_basis, ri_basis, nelectron_total, nkp_grid)
This routine allocates and initializes all types in hfx_data
subroutine, public compare_hfx_sections(hfx_section1, hfx_section2, is_identical, same_except_frac)
Compares the non-technical parts of two HFX input section and check whether they are the same Ignore ...
Defines the basic variable types.
integer, parameter, public dp
Calculates integral matrices for LRIGPW method lri : local resolution of the identity.
subroutine, public lri_print_stat(qs_env, ltddfpt, tddfpt_lri_env)
...
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
subroutine, public lri_density_release(lri_density)
releases the given lri_density
subroutine, public lri_env_release(lri_env)
releases the given lri_env
Machine interface based on Fortran 2003 and POSIX.
subroutine, public m_flush(lunit)
flushes units if the &GLOBAL flag is set accordingly
Interface to the message passing library MPI.
generate or use from input minimal basis set
subroutine, public create_minbas_set(qs_env, unit_nr, basis_type, primitive)
...
Define the data structure for the particle information.
Definition of physical constants:
real(kind=dp), parameter, public evolt
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public create_fxc_kernel(rho_struct, fxc_rspace, xc_section, is_rks_triplets, sub_env, qs_env)
Create the xc kernel potential for the approximate Fxc kernel model.
subroutine, public create_kernel_env(kernel_env, xc_section, is_rks_triplets, rho_struct_sub, lsd_singlets, do_excitations, sub_env, qs_env)
Create kernel environment.
subroutine, public release_kernel_env(kernel_env)
Release kernel environment.
Define the quickstep kind type and their sub types.
Definition and initialisation of the mo data type.
groups fairly general SCF methods, so that modules other than qs_scf can use them too split off from ...
subroutine, public eigensolver(matrix_ks_fm, mo_set, ortho, work, cholesky_method, do_level_shift, level_shift, matrix_u_fm, use_jacobi)
Diagonalise the Kohn-Sham matrix to get a new set of MO eigen- vectors and MO eigenvalues....
module that contains the definitions of the scf types
subroutine, public assign_state(qs_env, matrix_s, evects, psi0, wfn_history, my_state)
...
subroutine, public tddfpt_construct_aux_fit_density(rho_orb_struct, rho_aux_fit_struct, local_rho_set, qs_env, sub_env, wfm_rho_orb, wfm_rho_aux_fit, wfm_aux_orb)
Project a charge density expressed in primary basis set into the auxiliary basis set.
subroutine, public tddfpt_construct_ground_state_orb_density(rho_orb_struct, rho_xc_struct, is_rks_triplets, qs_env, sub_env, wfm_rho_orb)
Compute the ground-state charge density expressed in primary basis set.
subroutine, public tddfpt_orthonormalize_psi1_psi1(evects, nvects_new, s_evects, matrix_s)
Make new TDDFPT trial vectors orthonormal to all previous trial vectors.
subroutine, public tddfpt_orthogonalize_psi1_psi0(evects, s_c0_c0t, qs_env, gs_mos, evals, tddfpt_control, s_c0)
Make TDDFPT trial vectors orthogonal to all occupied molecular orbitals.
real(kind=dp) function, public tddfpt_davidson_solver(evects, evals, s_evects, gs_mos, tddfpt_control, matrix_ks, qs_env, kernel_env, sub_env, logger, iter_unit, energy_unit, tddfpt_print_section, work_matrices)
Perform Davidson iterations.
subroutine, public tddfpt_forces_main(qs_env, gs_mos, ex_env, kernel_env, sub_env, work_matrices)
Perform TDDFPT gradient calculation. This routine calculates the response vector R of Eq....
subroutine, public tddfpt_print_forces(qs_env, evects, evals, ostrength, print_section, gs_mos, kernel_env, sub_env, work_matrices)
Calculate and print forces of selected excited states.
subroutine, public tddfpt2_lri_init(qs_env, kernel_env, lri_section, tddfpt_print_section)
Initialize LRI environment, basis, neighborlists and matrices.
subroutine, public tddfpt(qs_env, calc_forces, rixs_env)
Perform TDDFPT calculation. If calc_forces then it also builds the response vector for the Z-vector m...
subroutine, public tddfpt_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, lri_section, hfxsr_section)
TDDFPT input.
subroutine, public tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, tddfpt_print_section, evects, evals, gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, kernel_env_admm_aux)
The energy calculation has been moved to its own subroutine.
subroutine, public tddfpt_dipole_operator(dipole_op_mos_occ, tddfpt_control, gs_mos, qs_env)
Compute the action of the dipole operator on the ground state wave function.
subroutine, public tddfpt_print_nto_analysis(qs_env, evects, evals, ostrength, gs_mos, matrix_s, print_section)
Print natural transition orbital analysis.
subroutine, public tddfpt_print_summary(log_unit, evects, evals, ostrength, mult, dipole_op_mos_occ, dipole_form)
Print final TDDFPT excitation energies and oscillator strengths.
subroutine, public tddfpt_print_excitation_analysis(log_unit, evects, evals, gs_mos, matrix_s, spinflip, min_amplitude)
Print excitation analysis.
subroutine, public tddfpt_print_exciton_descriptors(log_unit, evects, gs_mos, matrix_s, do_directional_exciton_descriptors, qs_env)
Print exciton descriptors, cf. Mewes et al., JCTC 14, 710-725 (2018)
integer function, public tddfpt_read_restart(evects, evals, gs_mos, logger, tddfpt_section, tddfpt_print_section, fm_pool_ao_mo_occ, blacs_env_global)
Initialise initial guess vectors by reading (un-normalised) Ritz vectors from a binary restart file.
subroutine, public tddfpt_write_newtonx_output(evects, evals, gs_mos, logger, tddfpt_print_section, matrix_s, s_evects, sub_env)
Write Ritz vectors to a binary restart file.
subroutine, public tddfpt_write_restart(evects, evals, gs_mos, logger, tddfpt_print_section)
Write Ritz vectors to a binary restart file.
subroutine, public tddfpt_smeared_occupation(qs_env, gs_mos, log_unit)
...
subroutine, public tddfpt_soc(qs_env, evals_a, evals_b, evects_a, evects_b, gs_mos)
Perform TDDFPT-SOC calculation.
Simplified Tamm Dancoff approach (sTDA).
subroutine, public stda_init_param(qs_env, stda_kernel, stda_control)
Get the parameters needed for an sTDA calculation.
subroutine, public deallocate_stda_env(stda_kernel)
Deallocate the sTDA environment.
subroutine, public allocate_stda_env(qs_env, stda_kernel, n_ao, nactive)
Allocate the sTDA environment.
Simplified Tamm Dancoff approach (sTDA).
subroutine, public get_lowdin_mo_coefficients(qs_env, sub_env, work)
Calculate Lowdin MO coefficients.
subroutine, public stda_init_matrices(qs_env, stda_kernel, sub_env, work, tddfpt_control)
Calculate sTDA matrices.
subroutine, public tddfpt_sub_env_init(sub_env, qs_env, mos_occ, kernel)
Split MPI communicator to create a set of parallel (sub)groups.
subroutine, public tddfpt_sub_env_release(sub_env)
Release parallel group environment.
subroutine, public hfxsr_create_work_matrices(work_matrices, qs_env, admm_env)
Allocate work matrices for hfxsr.
subroutine, public tddfpt_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, do_hfxlr, do_exck, do_sf, qs_env, sub_env)
Allocate work matrices for full kernel.
subroutine, public tddfpt_release_work_matrices(work_matrices, sub_env)
Release work matrices.
subroutine, public stda_create_work_matrices(work_matrices, gs_mos, nstates, qs_env, sub_env)
Allocate work matrices for sTDA kernel.
subroutine, public tddfpt_guess_vectors(evects, evals, gs_mos, log_unit, tddfpt_control, qs_env, nspins)
Generate missed guess vectors.
subroutine, public tddfpt_release_ground_state_mos(gs_mos)
Release molecular orbitals.
subroutine, public tddfpt_oecorr(qs_env, gs_mos, matrix_ks_oep)
Callculate orbital corrected KS matrix for TDDFPT.
subroutine, public tddfpt_init_mos(qs_env, gs_mos, iounit)
Prepare MOs for TDDFPT Calculations.
Define Resonant Inelastic XRAY Scattering (RIXS) control type and associated create,...
Utilities for string manipulations.
subroutine, public integer_to_string(inumber, string)
Converts an integer number to a string. The WRITE statement will return an error message,...
Writes information on XC functionals to output.
subroutine, public xc_write(iounit, xc_section, lsd)
...
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
Type defining parameters related to the simulation cell.
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 information on the excited states energy.
stores all the informations relevant to an mpi environment
Collection of variables required to evaluate adiabatic TDDFPT kernel.
Type to hold environments for the different kernels.
Provides all information about a quickstep kind.
Parallel (sub)group environment.
Ground state molecular orbitals.
Set of temporary ("work") matrices.
Valence state coming from the qs_tddfpt2 routine.