116#include "./base/base_uses.f90"
122 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_methods'
124 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
126 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
127 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
146 SUBROUTINE tddfpt(qs_env, calc_forces, rixs_env)
148 LOGICAL,
INTENT(IN) :: calc_forces
151 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt'
153 INTEGER :: handle, ispin, istate, log_unit, mult, &
154 my_state, nao, nocc, nspins, &
155 nstate_max, nstates, nvirt, old_state
156 INTEGER,
DIMENSION(maxspins) :: nactive
157 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
158 do_hfxsr, do_rixs, do_soc, lmult_tmp, &
160 REAL(kind=
dp) :: gsmin, gsval, xsval
161 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
166 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: my_mos
167 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
169 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
171 matrix_s_aux_fit_vs_orb
176 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
179 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
183 lri_section, soc_section, &
184 tddfpt_print_section, tddfpt_section, &
194 CALL timeset(routinen, handle)
200 NULLIFY (tddfpt_section, tddfpt_control)
203 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
204 lri_section, hfxsr_section)
207 extension=
".tddfptLog")
210 blacs_env=blacs_env, &
212 dft_control=dft_control, &
213 matrix_ks=matrix_ks, &
221 NULLIFY (rixs_control, valence_state)
222 rixs_control => dft_control%rixs_control
223 tddfpt_control => rixs_control%tddfpt2_control
224 valence_state => rixs_env%valence_state
227 tddfpt_control => dft_control%tddfpt2_control
230 tddfpt_control%do_hfx = do_hfx
231 tddfpt_control%do_admm = do_admm
232 tddfpt_control%do_hfxsr = do_hfxsr
233 tddfpt_control%hfxsr_primbas = 0
234 tddfpt_control%hfxsr_re_int = .true.
235 tddfpt_control%do_hfxlr = do_hfxlr
236 tddfpt_control%do_exck = do_exck
237 IF (tddfpt_control%do_hfxlr)
THEN
249 lmult_tmp = tddfpt_control%rks_triplets
250 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
260 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
267 IF (tddfpt_control%do_smearing)
THEN
274 IF ((tddfpt_control%do_lrigpw) .AND. &
276 CALL cp_abort(__location__,
"LRI only implemented for full kernel")
279 IF (
ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
287 nspins =
SIZE(gs_mos)
290 mult = abs(
SIZE(gs_mos(1)%evals_occ) -
SIZE(gs_mos(2)%evals_occ)) + 1
292 CALL cp_warn(__location__,
"There is a convergence issue for multiplicity >= 3")
294 IF (tddfpt_control%rks_triplets)
THEN
302 ALLOCATE (my_mos(nspins))
304 my_mos(ispin) = gs_mos(ispin)%mos_occ
307 kernel=tddfpt_control%kernel)
312 IF (dft_control%qs_control%xtb)
THEN
313 cpabort(
"TDDFPT: xTB only works with sTDA Kernel")
316 IF (tddfpt_control%do_hfxsr)
THEN
319 i_val=tddfpt_control%hfxsr_primbas)
322 primitive=tddfpt_control%hfxsr_primbas)
324 ALLOCATE (full_kernel_env%admm_control)
330 full_kernel_env%hfxsr_section => hfxsr_section
333 full_kernel_env%admm_control,
"TDA_HFX")
334 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
335 matrix_s_aux_fit=matrix_s_aux_fit, &
336 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
338 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
340 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
341 qs_kind_set=qs_kind_set, particle_set=particle_set, &
343 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
344 qs_kind_set, particle_set, dft_control, cell, orb_basis=
"TDA_HFX")
348 nstates = tddfpt_control%nstates
354 nstate_max = nocc*nvirt
355 IF (nstates > nstate_max)
THEN
356 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
357 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
359 tddfpt_control%nstates = nstate_max
362 do_hfxlr, do_exck, qs_env, sub_env)
365 kernel_env%full_kernel => full_kernel_env
366 kernel_env%admm_kernel => kernel_env_admm_aux
367 NULLIFY (kernel_env%stda_kernel)
380 DO ispin = 1,
SIZE(gs_mos)
382 ncol_global=nactive(ispin))
388 nstates = tddfpt_control%nstates
393 work_matrices, tddfpt_control)
395 kernel_env%stda_kernel => stda_kernel
396 NULLIFY (kernel_env%full_kernel)
397 NULLIFY (kernel_env%admm_kernel)
400 nstates = tddfpt_control%nstates
403 NULLIFY (kernel_env%full_kernel)
404 NULLIFY (kernel_env%admm_kernel)
405 NULLIFY (kernel_env%stda_kernel)
408 ALLOCATE (evects(nspins, nstates))
409 ALLOCATE (evals(nstates))
411 ALLOCATE (s_evects(nspins, nstates))
412 DO istate = 1, nstates
415 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
416 s_evects(ispin, istate))
420 IF (.NOT. do_soc)
THEN
423 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
424 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
425 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
428 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
429 tddfpt_control, logger, tddfpt_print_section, &
430 evects, evals, ostrength, &
431 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
432 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
437 IF (calc_forces)
THEN
439 tddfpt_print_section, gs_mos, &
440 kernel_env, sub_env, work_matrices)
444 IF (qs_env%excited_state)
THEN
445 IF (sub_env%is_split)
THEN
446 CALL cp_abort(__location__, &
447 "Excited state forces not possible when states"// &
448 " are distributed to different CPU pools.")
451 IF (
ASSOCIATED(matrix_ks_oep))
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
453 state_change = .false.
454 IF (ex_env%state > 0)
THEN
455 my_state = ex_env%state
456 ELSEIF (ex_env%state < 0)
THEN
458 ALLOCATE (my_mos(nspins))
460 my_mos(ispin) = gs_mos(ispin)%mos_occ
462 my_state = abs(ex_env%state)
463 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
465 IF (my_state /= abs(ex_env%state))
THEN
466 state_change = .true.
467 old_state = abs(ex_env%state)
469 ex_env%state = -my_state
471 CALL cp_warn(__location__, &
472 "Active excited state not assigned. Use the first state.")
475 cpassert(my_state > 0)
476 IF (my_state > nstates)
THEN
477 CALL cp_warn(__location__, &
478 "There were not enough excited states calculated.")
479 cpabort(
"excited state potential energy surface")
483 ex_env%evalue = evals(my_state)
486 ALLOCATE (ex_env%evect(nspins))
489 matrix_struct=matrix_struct)
491 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
494 IF (log_unit > 0)
THEN
495 gsval = ex_env%wfn_history%gsval
496 gsmin = ex_env%wfn_history%gsmin
497 xsval = ex_env%wfn_history%xsval
498 WRITE (log_unit,
"(1X,A,T40,F10.6,A,T62,F10.6,A)")
"Ground state orbital alignment:", &
499 gsmin,
"[MinVal]", gsval,
"[Average]"
500 WRITE (log_unit,
"(1X,A,T71,F10.6)")
"Excitation vector alignment:", xsval
501 IF (state_change)
THEN
502 WRITE (log_unit,
"(1X,A,I5,T60,A14,T76,I5)") &
503 "Target state has been changed from state ", &
504 old_state,
" to new state ", my_state
506 WRITE (log_unit,
"(1X,A,I4,A,F12.5,A)")
"Calculate properties for state:", &
507 my_state,
" with excitation energy ", ex_env%evalue*
evolt,
" eV"
510 IF (calc_forces)
THEN
512 sub_env, work_matrices)
519 valence_state%nstates = nstates
520 ALLOCATE (valence_state%evals(
SIZE(evals)))
521 valence_state%evals(:) = evals(:)
523 ALLOCATE (valence_state%evects(nspins, nstates))
524 ALLOCATE (valence_state%mos_occ(nspins))
527 DO istate = 1, nstates
529 matrix_struct=matrix_struct)
530 CALL cp_fm_create(valence_state%evects(ispin, istate), matrix_struct)
531 CALL cp_fm_to_fm(evects(ispin, istate), valence_state%evects(ispin, istate))
535 matrix_struct=matrix_struct)
536 CALL cp_fm_create(valence_state%mos_occ(ispin), matrix_struct)
537 CALL cp_fm_to_fm(gs_mos(ispin)%mos_occ, valence_state%mos_occ(ispin))
547 tddfpt_print_section, &
550 DEALLOCATE (evals, ostrength)
554 IF (tddfpt_control%do_lrigpw)
THEN
556 DEALLOCATE (kernel_env%full_kernel%lri_env)
558 DEALLOCATE (kernel_env%full_kernel%lri_density)
566 cpabort(
'Unknown kernel type')
573 DO ispin = nspins, 1, -1
578 IF (
ASSOCIATED(matrix_ks_oep)) &
581 CALL timestop(handle)
598 SUBROUTINE tddfpt_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, &
599 xc_section, tddfpt_print_section, lri_section, hfxsr_section)
601 LOGICAL,
INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
604 lri_section, hfxsr_section
606 CHARACTER(len=20) :: nstates_str
607 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
608 explicit_root, expot, exvdw, exwfn, &
610 REAL(kind=
dp) :: c_hf
613 tddfpt_section, xc_root, xc_sub
616 NULLIFY (dft_control, input)
617 CALL get_qs_env(qs_env, dft_control=dft_control, input=input)
618 tddfpt_control => dft_control%tddfpt2_control
621 IF (dft_control%nimages > 1) cpabort(
"k-points not implemented for TDDFPT")
623 IF (tddfpt_control%nstates <= 0)
THEN
625 CALL cp_warn(__location__,
"TDDFPT calculation was requested for "// &
626 trim(nstates_str)//
" excited states: nothing to do.")
630 NULLIFY (tddfpt_section, tddfpt_print_section)
639 IF (explicit_root)
THEN
645 CALL cp_warn(__location__,
"TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
646 cpabort(
"TDDFPT Input")
653 CALL cp_warn(__location__,
"TDDFPT Kernel with GCP_POTENTIAL not possible.")
654 cpabort(
"TDDFPT Input")
661 CALL cp_warn(__location__,
"TDDFPT Kernel with VDW_POTENTIAL not possible.")
662 cpabort(
"TDDFPT Input")
669 CALL cp_warn(__location__,
"TDDFPT Kernel with WF_CORRELATION not possible.")
670 cpabort(
"TDDFPT Input")
677 CALL cp_warn(__location__,
"TDDFPT Kernel with XC_POTENTIAL not possible.")
678 cpabort(
"TDDFPT Input")
687 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk))
THEN
688 CALL cp_warn(__location__,
"TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
689 cpabort(
"TDDFPT Input")
698 xc_section => xc_root
703 do_hfx = (c_hf /= 0.0_dp)
709 IF (.NOT. same_hfx)
THEN
710 cpabort(
"TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
714 do_admm = do_hfx .AND. dft_control%do_admm
717 CALL cp_abort(__location__, &
718 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
719 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
742 do_hfx = (c_hf /= 0.0_dp)
744 do_admm = do_hfx .AND. dft_control%do_admm
758 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1)
THEN
759 tddfpt_control%rks_triplets = .false.
760 CALL cp_warn(__location__,
"Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
764 IF (tddfpt_control%do_lrigpw)
THEN
769 NULLIFY (hfxsr_section)
773 IF (.NOT. found)
THEN
774 cpabort(
"HFXSR option needs &HF section defined")
776 CALL section_vals_val_get(hfxsr_section,
"INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
777 IF (.NOT. found)
THEN
782 IF (.NOT. found)
THEN
783 CALL section_vals_val_set(hfxsr_section,
"INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
787 CALL cp_abort(__location__,
"Short range TDA kernel with RI not possible")
800 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
801 INTEGER,
INTENT(IN) :: log_unit
806 CHARACTER(LEN=4) :: ktype
809 lsd = (dft_control%nspins > 1)
812 IF (log_unit > 0)
THEN
813 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
814 CALL xc_write(log_unit, xc_section, lsd)
815 IF (tddfpt_control%do_hfx)
THEN
816 IF (tddfpt_control%do_admm)
THEN
817 WRITE (log_unit,
"(T2,A,T62,A19)")
"KERNEL|",
"ADMM Exact Exchange"
818 IF (tddfpt_control%admm_xc_correction)
THEN
819 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Apply ADMM Kernel XC Correction"
821 IF (tddfpt_control%admm_symm)
THEN
822 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Symmetric ADMM Kernel"
825 WRITE (log_unit,
"(T2,A,T67,A14)")
"KERNEL|",
"Exact Exchange"
828 IF (tddfpt_control%do_hfxsr)
THEN
829 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Short range HFX approximation"
831 IF (tddfpt_control%do_hfxlr)
THEN
832 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Long range HFX approximation"
834 IF (tddfpt_control%do_lrigpw)
THEN
835 WRITE (log_unit,
"(T2,A,T42,A39)")
"KERNEL|",
"LRI approximation of transition density"
840 IF (log_unit > 0)
THEN
841 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
842 IF (tddfpt_control%stda_control%do_ewald)
THEN
843 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses Ewald summation"
845 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses direct summation (MIC)"
847 IF (tddfpt_control%stda_control%do_exchange)
THEN
848 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Exact exchange term",
"YES"
849 WRITE (log_unit,
"(T2,A,T71,F10.3)")
"KERNEL| Short range HFX fraction:", &
850 tddfpt_control%stda_control%hfx_fraction
852 WRITE (log_unit,
"(T2,A,T79,A2)")
"KERNEL| Exact exchange term",
"NO"
854 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"KERNEL| Transition density filter", &
855 tddfpt_control%stda_control%eps_td_filter
859 IF (log_unit > 0)
THEN
860 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
866 IF (log_unit > 0)
THEN
867 IF (tddfpt_control%rks_triplets)
THEN
868 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Triplet"
870 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin symmetry of excitations",
"Unrestricted"
872 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Singlet"
874 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of states calculated", tddfpt_control%nstates
875 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of Davidson iterations", tddfpt_control%niters
876 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"TDDFPT| Davidson iteration convergence", tddfpt_control%conv
877 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
880 END SUBROUTINE kernel_info
907 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
908 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
909 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
918 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
919 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
923 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
928 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ostrength
929 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
934 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_energies'
936 CHARACTER(len=20) :: nstates_str
937 INTEGER :: energy_unit, handle, iter, log_unit, &
938 niters, nocc, nstate_max, &
940 LOGICAL :: do_admm, do_exck, do_soc, explicit
941 REAL(kind=
dp) :: conv
944 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_oep
948 CALL timeset(routinen, handle)
950 NULLIFY (admm_env, matrix_ks_oep)
951 do_admm = tddfpt_control%do_admm
952 IF (do_admm)
CALL get_qs_env(qs_env, admm_env=admm_env)
958 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
959 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
960 is_rks_triplets=tddfpt_control%rks_triplets, &
961 qs_env=qs_env, sub_env=sub_env, &
962 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
966 IF (tddfpt_control%admm_xc_correction)
THEN
968 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
969 xc_section=admm_env%xc_section_primary, &
970 is_rks_triplets=tddfpt_control%rks_triplets, &
974 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
975 xc_section=xc_section, &
976 is_rks_triplets=tddfpt_control%rks_triplets, &
981 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
982 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
983 local_rho_set=sub_env%local_rho_set_admm, &
984 qs_env=qs_env, sub_env=sub_env, &
985 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
986 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
987 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
990 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
991 xc_section=admm_env%xc_section_aux, &
992 is_rks_triplets=tddfpt_control%rks_triplets, &
994 kernel_env%full_kernel => full_kernel_env
995 kernel_env%admm_kernel => kernel_env_admm_aux
999 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1000 xc_section=xc_section, &
1001 is_rks_triplets=tddfpt_control%rks_triplets, &
1003 kernel_env%full_kernel => full_kernel_env
1004 NULLIFY (kernel_env%admm_kernel)
1007 do_exck = tddfpt_control%do_exck
1008 kernel_env%full_kernel%do_exck = do_exck
1011 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
1012 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
1017 IF (tddfpt_control%do_lrigpw)
THEN
1020 tddfpt_print_section)
1028 nstate_max = nocc*nvirt
1029 IF (nstates > nstate_max)
THEN
1030 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
1031 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
1032 nstates = nstate_max
1039 IF (tddfpt_control%is_restart .AND. .NOT. do_soc)
THEN
1047 tddfpt_section=tddfpt_section, &
1048 tddfpt_print_section=tddfpt_print_section, &
1049 fm_pool_ao_mo_occ=work_matrices%fm_pool_ao_mo_occ, &
1050 blacs_env_global=blacs_env)
1058 "GUESS_VECTORS", extension=
".tddfptLog")
1060 gs_mos=gs_mos, log_unit=log_unit)
1062 tddfpt_print_section,
"GUESS_VECTORS")
1065 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1071 niters = tddfpt_control%niters
1072 IF (niters > 0)
THEN
1074 "ITERATION_INFO", extension=
".tddfptLog")
1076 tddfpt_print_section, &
1077 "DETAILED_ENERGY", &
1078 extension=
".tddfptLog")
1080 IF (log_unit > 0)
THEN
1081 WRITE (log_unit,
"(1X,A)")
"", &
1082 "-------------------------------------------------------------------------------", &
1083 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1084 "-------------------------------------------------------------------------------"
1086 WRITE (log_unit,
'(/,T11,A,T27,A,T40,A,T62,A)')
"Step",
"Time",
"Convergence",
"Conv. states"
1087 WRITE (log_unit,
'(1X,79("-"))')
1097 s_evects=s_evects, &
1099 tddfpt_control=tddfpt_control, &
1100 matrix_ks=matrix_ks, &
1102 kernel_env=kernel_env, &
1105 iter_unit=log_unit, &
1106 energy_unit=energy_unit, &
1107 tddfpt_print_section=tddfpt_print_section, &
1108 work_matrices=work_matrices)
1115 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1117 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters)
EXIT
1121 IF (log_unit > 0)
THEN
1122 WRITE (log_unit,
'(1X,25("-"),1X,A,1X,25("-"))')
"Restart Davidson iterations"
1128 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1133 tddfpt_print_section=tddfpt_print_section)
1138 IF (log_unit > 0)
THEN
1140 IF (conv <= tddfpt_control%conv)
THEN
1141 WRITE (log_unit,
"(1X,A)")
"", &
1142 "-------------------------------------------------------------------------------", &
1143 "- TDDFPT run converged in "//trim(nstates_str)//
" iteration(s) ", &
1144 "-------------------------------------------------------------------------------"
1146 WRITE (log_unit,
"(1X,A)")
"", &
1147 "-------------------------------------------------------------------------------", &
1148 "- TDDFPT run did NOT converge after "//trim(nstates_str)//
" iteration(s) ", &
1149 "-------------------------------------------------------------------------------"
1154 tddfpt_print_section,
"DETAILED_ENERGY")
1156 tddfpt_print_section,
"ITERATION_INFO")
1158 CALL cp_warn(__location__, &
1159 "Skipping TDDFPT wavefunction optimization")
1162 IF (
ASSOCIATED(matrix_ks_oep))
THEN
1164 CALL cp_warn(__location__, &
1165 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1166 "when computed using an orbital energy correction XC-potential together with "// &
1167 "the velocity form of dipole transition integrals")
1175 tddfpt_print_section, &
1183 tddfpt_print_section, &
1184 matrix_s(1)%matrix, &
1188 ALLOCATE (ostrength(nstates))
1195 dipole_op_mos_occ, &
1196 tddfpt_control%dipole_form)
1202 matrix_s(1)%matrix, &
1203 min_amplitude=tddfpt_control%min_excitation_amplitude)
1208 matrix_s(1)%matrix, &
1209 tddfpt_print_section)
1210 IF (tddfpt_control%do_exciton_descriptors)
THEN
1215 matrix_s(1)%matrix, &
1216 tddfpt_control%do_directional_exciton_descriptors, &
1220 IF (tddfpt_control%do_lrigpw)
THEN
1223 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1226 CALL timestop(handle)
1258 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1259 tddfpt_control, logger, tddfpt_print_section, &
1260 evects, evals, ostrength, &
1261 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1262 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1263 kernel_env_admm_aux)
1266 INTEGER,
INTENT(in) :: nstates
1271 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1272 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
1276 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1281 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1282 LOGICAL,
INTENT(in) :: lmult_tmp
1286 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_energies'
1288 INTEGER :: handle, ispin, istate, log_unit, mult, &
1290 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_mult, ostrength_mult
1291 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mult
1293 CALL timeset(routinen, handle)
1297 extension=
".tddfptLog")
1300 nspins =
SIZE(gs_mos)
1301 ALLOCATE (evects_mult(nspins, nstates))
1302 ALLOCATE (evals_mult(nstates))
1306 IF (log_unit > 0)
THEN
1307 WRITE (log_unit,
"(1X,A)")
"", &
1308 "-------------------------------------------------------------------------------", &
1309 "- TDDFPT SINGLET ENERGIES -", &
1310 "-------------------------------------------------------------------------------"
1314 IF (log_unit > 0)
THEN
1315 WRITE (log_unit,
"(1X,A)")
"", &
1316 "-------------------------------------------------------------------------------", &
1317 "- TDDFPT TRIPLET ENERGIES -", &
1318 "-------------------------------------------------------------------------------"
1323 CALL tddfpt_energies(qs_env, nstates, work_matrices, tddfpt_control, logger, &
1324 tddfpt_print_section, evects_mult, evals_mult, &
1325 gs_mos, tddfpt_section, s_evects, matrix_s, &
1326 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1327 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1328 kernel_env_admm_aux)
1336 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1337 tddfpt_control%do_exck, qs_env, sub_env)
1340 DO istate = 1, nstates
1341 DO ispin = 1, nspins
1346 DO istate = 1, nstates
1347 DO ispin = 1, nspins
1349 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
1350 s_evects(ispin, istate))
1354 tddfpt_control%rks_triplets = lmult_tmp
1358 IF (log_unit > 0)
THEN
1359 WRITE (log_unit,
"(1X,A)")
"", &
1360 " singlet excitations finished ", &
1362 "-------------------------------------------------------------------------------", &
1363 "- TDDFPT TRIPLET ENERGIES -", &
1364 "-------------------------------------------------------------------------------"
1368 IF (log_unit > 0)
THEN
1369 WRITE (log_unit,
"(1X,A)")
"", &
1370 " triplet excitations finished ", &
1372 "-------------------------------------------------------------------------------", &
1373 "- TDDFPT SINGLET ENERGIES -", &
1374 "-------------------------------------------------------------------------------"
1379 CALL tddfpt_energies(qs_env, nstates, work_matrices, tddfpt_control, logger, &
1380 tddfpt_print_section, evects, evals, &
1381 gs_mos, tddfpt_section, s_evects, matrix_s, &
1382 kernel_env, matrix_ks, sub_env, ostrength, &
1383 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1384 kernel_env_admm_aux)
1389 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos)
1391 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos)
1395 DO ispin = 1,
SIZE(evects_mult, 1)
1396 DO istate = 1,
SIZE(evects_mult, 2)
1400 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1402 CALL timestop(handle)
1404 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 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, 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, 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.
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_energies(qs_env, nstates, 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(qs_env, calc_forces, rixs_env)
Perform TDDFPT calculation.
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_print_excitation_analysis(log_unit, evects, evals, gs_mos, matrix_s, min_amplitude)
Print excitation analysis.
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_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_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_create_work_matrices(work_matrices, gs_mos, nstates, do_hfx, do_admm, do_hfxlr, do_exck, qs_env, sub_env)
Allocate work matrices for full kernel.
subroutine, public tddfpt_release_ground_state_mos(gs_mos)
Release molecular orbitals.
subroutine, public tddfpt_guess_vectors(evects, evals, gs_mos, log_unit)
Generate missed guess vectors.
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.