113#include "./base/base_uses.f90"
119 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_methods'
121 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
123 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
124 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
144 LOGICAL,
INTENT(IN) :: calc_forces
146 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt'
148 INTEGER :: handle, ispin, istate, log_unit, mult, &
149 my_state, nao, nocc, nspins, &
150 nstate_max, nstates, nvirt, old_state
151 INTEGER,
DIMENSION(maxspins) :: nactive
152 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
153 do_hfxsr, do_soc, lmult_tmp, &
155 REAL(kind=
dp) :: gsmin, gsval, xsval
156 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
161 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: my_mos
162 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
164 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
166 matrix_s_aux_fit_vs_orb
171 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
174 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
177 lri_section, soc_section, &
178 tddfpt_print_section, tddfpt_section, &
187 CALL timeset(routinen, handle)
193 NULLIFY (tddfpt_section)
197 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
198 lri_section, hfxsr_section)
201 extension=
".tddfptLog")
204 blacs_env=blacs_env, &
206 dft_control=dft_control, &
207 matrix_ks=matrix_ks, &
211 tddfpt_control => dft_control%tddfpt2_control
212 tddfpt_control%do_hfx = do_hfx
213 tddfpt_control%do_admm = do_admm
214 tddfpt_control%do_hfxsr = do_hfxsr
215 tddfpt_control%hfxsr_primbas = 0
216 tddfpt_control%hfxsr_re_int = .true.
217 tddfpt_control%do_hfxlr = do_hfxlr
218 tddfpt_control%do_exck = do_exck
219 IF (tddfpt_control%do_hfxlr)
THEN
231 lmult_tmp = tddfpt_control%rks_triplets
232 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
242 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
249 IF (tddfpt_control%do_smearing)
THEN
256 IF ((tddfpt_control%do_lrigpw) .AND. &
258 CALL cp_abort(__location__,
"LRI only implemented for full kernel")
261 IF (
ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
269 nspins =
SIZE(gs_mos)
272 mult = abs(
SIZE(gs_mos(1)%evals_occ) -
SIZE(gs_mos(2)%evals_occ)) + 1
274 CALL cp_warn(__location__,
"There is a convergence issue for multiplicity >= 3")
276 IF (tddfpt_control%rks_triplets)
THEN
284 ALLOCATE (my_mos(nspins))
286 my_mos(ispin) = gs_mos(ispin)%mos_occ
289 kernel=tddfpt_control%kernel)
294 IF (dft_control%qs_control%xtb)
THEN
295 cpabort(
"TDDFPT: xTB only works with sTDA Kernel")
298 IF (tddfpt_control%do_hfxsr)
THEN
301 i_val=tddfpt_control%hfxsr_primbas)
304 primitive=tddfpt_control%hfxsr_primbas)
306 ALLOCATE (full_kernel_env%admm_control)
312 full_kernel_env%hfxsr_section => hfxsr_section
315 full_kernel_env%admm_control,
"TDA_HFX")
316 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
317 matrix_s_aux_fit=matrix_s_aux_fit, &
318 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
320 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
322 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
323 qs_kind_set=qs_kind_set, particle_set=particle_set, &
325 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
326 qs_kind_set, particle_set, dft_control, cell, orb_basis=
"TDA_HFX")
330 nstates = tddfpt_control%nstates
336 nstate_max = nocc*nvirt
337 IF (nstates > nstate_max)
THEN
338 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
339 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
341 tddfpt_control%nstates = nstate_max
344 do_hfxlr, do_exck, qs_env, sub_env)
347 kernel_env%full_kernel => full_kernel_env
348 kernel_env%admm_kernel => kernel_env_admm_aux
349 NULLIFY (kernel_env%stda_kernel)
362 DO ispin = 1,
SIZE(gs_mos)
364 ncol_global=nactive(ispin))
370 nstates = tddfpt_control%nstates
375 work_matrices, tddfpt_control)
377 kernel_env%stda_kernel => stda_kernel
378 NULLIFY (kernel_env%full_kernel)
379 NULLIFY (kernel_env%admm_kernel)
382 nstates = tddfpt_control%nstates
385 NULLIFY (kernel_env%full_kernel)
386 NULLIFY (kernel_env%admm_kernel)
387 NULLIFY (kernel_env%stda_kernel)
390 ALLOCATE (evects(nspins, nstates))
391 ALLOCATE (evals(nstates))
393 ALLOCATE (s_evects(nspins, nstates))
394 DO istate = 1, nstates
397 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
398 s_evects(ispin, istate))
402 IF (.NOT. do_soc)
THEN
405 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
406 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
407 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
410 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
411 tddfpt_control, logger, tddfpt_print_section, &
412 evects, evals, ostrength, &
413 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
414 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
419 IF (calc_forces)
THEN
421 tddfpt_print_section, gs_mos, &
422 kernel_env, sub_env, work_matrices)
426 IF (qs_env%excited_state)
THEN
427 IF (sub_env%is_split)
THEN
428 CALL cp_abort(__location__, &
429 "Excited state forces not possible when states"// &
430 " are distributed to different CPU pools.")
433 IF (
ASSOCIATED(matrix_ks_oep))
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
435 state_change = .false.
436 IF (ex_env%state > 0)
THEN
437 my_state = ex_env%state
438 ELSEIF (ex_env%state < 0)
THEN
440 ALLOCATE (my_mos(nspins))
442 my_mos(ispin) = gs_mos(ispin)%mos_occ
444 my_state = abs(ex_env%state)
445 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
447 IF (my_state /= abs(ex_env%state))
THEN
448 state_change = .true.
449 old_state = abs(ex_env%state)
451 ex_env%state = -my_state
453 CALL cp_warn(__location__, &
454 "Active excited state not assigned. Use the first state.")
457 cpassert(my_state > 0)
458 IF (my_state > nstates)
THEN
459 CALL cp_warn(__location__, &
460 "There were not enough excited states calculated.")
461 cpabort(
"excited state potential energy surface")
465 ex_env%evalue = evals(my_state)
468 ALLOCATE (ex_env%evect(nspins))
471 matrix_struct=matrix_struct)
473 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
476 IF (log_unit > 0)
THEN
477 gsval = ex_env%wfn_history%gsval
478 gsmin = ex_env%wfn_history%gsmin
479 xsval = ex_env%wfn_history%xsval
480 WRITE (log_unit,
"(1X,A,T40,F10.6,A,T62,F10.6,A)")
"Ground state orbital alignment:", &
481 gsmin,
"[MinVal]", gsval,
"[Average]"
482 WRITE (log_unit,
"(1X,A,T71,F10.6)")
"Excitation vector alignment:", xsval
483 IF (state_change)
THEN
484 WRITE (log_unit,
"(1X,A,I5,T60,A14,T76,I5)") &
485 "Target state has been changed from state ", &
486 old_state,
" to new state ", my_state
488 WRITE (log_unit,
"(1X,A,I4,A,F12.5,A)")
"Calculate properties for state:", &
489 my_state,
" with excitation energy ", ex_env%evalue*
evolt,
" eV"
492 IF (calc_forces)
THEN
494 sub_env, work_matrices)
504 tddfpt_print_section, &
507 DEALLOCATE (evals, ostrength)
511 IF (tddfpt_control%do_lrigpw)
THEN
513 DEALLOCATE (kernel_env%full_kernel%lri_env)
515 DEALLOCATE (kernel_env%full_kernel%lri_density)
523 cpabort(
'Unknown kernel type')
530 DO ispin = nspins, 1, -1
535 IF (
ASSOCIATED(matrix_ks_oep)) &
538 CALL timestop(handle)
555 SUBROUTINE tddfpt_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, &
556 xc_section, tddfpt_print_section, lri_section, hfxsr_section)
558 LOGICAL,
INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
561 lri_section, hfxsr_section
563 CHARACTER(len=20) :: nstates_str
564 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
565 explicit_root, expot, exvdw, exwfn, &
567 REAL(kind=
dp) :: c_hf
570 tddfpt_section, xc_root, xc_sub
573 NULLIFY (dft_control, input)
574 CALL get_qs_env(qs_env, dft_control=dft_control, input=input)
575 tddfpt_control => dft_control%tddfpt2_control
578 IF (dft_control%nimages > 1) cpabort(
"k-points not implemented for TDDFPT")
580 IF (tddfpt_control%nstates <= 0)
THEN
582 CALL cp_warn(__location__,
"TDDFPT calculation was requested for "// &
583 trim(nstates_str)//
" excited states: nothing to do.")
587 NULLIFY (tddfpt_section, tddfpt_print_section)
596 IF (explicit_root)
THEN
602 CALL cp_warn(__location__,
"TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
603 cpabort(
"TDDFPT Input")
610 CALL cp_warn(__location__,
"TDDFPT Kernel with GCP_POTENTIAL not possible.")
611 cpabort(
"TDDFPT Input")
618 CALL cp_warn(__location__,
"TDDFPT Kernel with VDW_POTENTIAL not possible.")
619 cpabort(
"TDDFPT Input")
626 CALL cp_warn(__location__,
"TDDFPT Kernel with WF_CORRELATION not possible.")
627 cpabort(
"TDDFPT Input")
634 CALL cp_warn(__location__,
"TDDFPT Kernel with XC_POTENTIAL not possible.")
635 cpabort(
"TDDFPT Input")
644 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk))
THEN
645 CALL cp_warn(__location__,
"TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
646 cpabort(
"TDDFPT Input")
655 xc_section => xc_root
660 do_hfx = (c_hf /= 0.0_dp)
666 IF (.NOT. same_hfx)
THEN
667 cpabort(
"TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
671 do_admm = do_hfx .AND. dft_control%do_admm
674 CALL cp_abort(__location__, &
675 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
676 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
699 do_hfx = (c_hf /= 0.0_dp)
701 do_admm = do_hfx .AND. dft_control%do_admm
715 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1)
THEN
716 tddfpt_control%rks_triplets = .false.
717 CALL cp_warn(__location__,
"Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
721 IF (tddfpt_control%do_lrigpw)
THEN
726 NULLIFY (hfxsr_section)
730 IF (.NOT. found)
THEN
731 cpabort(
"HFXSR option needs &HF section defined")
733 CALL section_vals_val_get(hfxsr_section,
"INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
734 IF (.NOT. found)
THEN
739 IF (.NOT. found)
THEN
740 CALL section_vals_val_set(hfxsr_section,
"INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
744 CALL cp_abort(__location__,
"Short range TDA kernel with RI not possible")
757 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
758 INTEGER,
INTENT(IN) :: log_unit
763 CHARACTER(LEN=4) :: ktype
766 lsd = (dft_control%nspins > 1)
769 IF (log_unit > 0)
THEN
770 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
771 CALL xc_write(log_unit, xc_section, lsd)
772 IF (tddfpt_control%do_hfx)
THEN
773 IF (tddfpt_control%do_admm)
THEN
774 WRITE (log_unit,
"(T2,A,T62,A19)")
"KERNEL|",
"ADMM Exact Exchange"
775 IF (tddfpt_control%admm_xc_correction)
THEN
776 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Apply ADMM Kernel XC Correction"
778 IF (tddfpt_control%admm_symm)
THEN
779 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Symmetric ADMM Kernel"
782 WRITE (log_unit,
"(T2,A,T67,A14)")
"KERNEL|",
"Exact Exchange"
785 IF (tddfpt_control%do_hfxsr)
THEN
786 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Short range HFX approximation"
788 IF (tddfpt_control%do_hfxlr)
THEN
789 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Long range HFX approximation"
791 IF (tddfpt_control%do_lrigpw)
THEN
792 WRITE (log_unit,
"(T2,A,T42,A39)")
"KERNEL|",
"LRI approximation of transition density"
797 IF (log_unit > 0)
THEN
798 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
799 IF (tddfpt_control%stda_control%do_ewald)
THEN
800 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses Ewald summation"
802 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses direct summation (MIC)"
804 IF (tddfpt_control%stda_control%do_exchange)
THEN
805 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Exact exchange term",
"YES"
806 WRITE (log_unit,
"(T2,A,T71,F10.3)")
"KERNEL| Short range HFX fraction:", &
807 tddfpt_control%stda_control%hfx_fraction
809 WRITE (log_unit,
"(T2,A,T79,A2)")
"KERNEL| Exact exchange term",
"NO"
811 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"KERNEL| Transition density filter", &
812 tddfpt_control%stda_control%eps_td_filter
816 IF (log_unit > 0)
THEN
817 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
823 IF (log_unit > 0)
THEN
824 IF (tddfpt_control%rks_triplets)
THEN
825 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Triplet"
827 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin symmetry of excitations",
"Unrestricted"
829 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Singlet"
831 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of states calculated", tddfpt_control%nstates
832 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of Davidson iterations", tddfpt_control%niters
833 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"TDDFPT| Davidson iteration convergence", tddfpt_control%conv
834 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
837 END SUBROUTINE kernel_info
864 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
865 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
866 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
875 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
876 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
880 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
885 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ostrength
886 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
891 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_energies'
893 CHARACTER(len=20) :: nstates_str
894 INTEGER :: energy_unit, handle, iter, log_unit, &
895 niters, nocc, nstate_max, &
897 LOGICAL :: do_admm, do_exck, do_soc, explicit
898 REAL(kind=
dp) :: conv
901 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_oep
905 CALL timeset(routinen, handle)
907 NULLIFY (admm_env, matrix_ks_oep)
908 do_admm = tddfpt_control%do_admm
909 IF (do_admm)
CALL get_qs_env(qs_env, admm_env=admm_env)
915 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
916 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
917 is_rks_triplets=tddfpt_control%rks_triplets, &
918 qs_env=qs_env, sub_env=sub_env, &
919 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
923 IF (tddfpt_control%admm_xc_correction)
THEN
925 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
926 xc_section=admm_env%xc_section_primary, &
927 is_rks_triplets=tddfpt_control%rks_triplets, &
931 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
932 xc_section=xc_section, &
933 is_rks_triplets=tddfpt_control%rks_triplets, &
938 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
939 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
940 local_rho_set=sub_env%local_rho_set_admm, &
941 qs_env=qs_env, sub_env=sub_env, &
942 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
943 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
944 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
947 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
948 xc_section=admm_env%xc_section_aux, &
949 is_rks_triplets=tddfpt_control%rks_triplets, &
951 kernel_env%full_kernel => full_kernel_env
952 kernel_env%admm_kernel => kernel_env_admm_aux
956 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
957 xc_section=xc_section, &
958 is_rks_triplets=tddfpt_control%rks_triplets, &
960 kernel_env%full_kernel => full_kernel_env
961 NULLIFY (kernel_env%admm_kernel)
964 do_exck = tddfpt_control%do_exck
965 kernel_env%full_kernel%do_exck = do_exck
968 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
969 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
974 IF (tddfpt_control%do_lrigpw)
THEN
977 tddfpt_print_section)
985 nstate_max = nocc*nvirt
986 IF (nstates > nstate_max)
THEN
987 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
988 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
996 IF (tddfpt_control%is_restart .AND. .NOT. do_soc)
THEN
1004 tddfpt_section=tddfpt_section, &
1005 tddfpt_print_section=tddfpt_print_section, &
1006 fm_pool_ao_mo_occ=work_matrices%fm_pool_ao_mo_occ, &
1007 blacs_env_global=blacs_env)
1015 "GUESS_VECTORS", extension=
".tddfptLog")
1017 gs_mos=gs_mos, log_unit=log_unit)
1019 tddfpt_print_section,
"GUESS_VECTORS")
1022 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1028 niters = tddfpt_control%niters
1029 IF (niters > 0)
THEN
1031 "ITERATION_INFO", extension=
".tddfptLog")
1033 tddfpt_print_section, &
1034 "DETAILED_ENERGY", &
1035 extension=
".tddfptLog")
1037 IF (log_unit > 0)
THEN
1038 WRITE (log_unit,
"(1X,A)")
"", &
1039 "-------------------------------------------------------------------------------", &
1040 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1041 "-------------------------------------------------------------------------------"
1043 WRITE (log_unit,
'(/,T11,A,T27,A,T40,A,T62,A)')
"Step",
"Time",
"Convergence",
"Conv. states"
1044 WRITE (log_unit,
'(1X,79("-"))')
1054 s_evects=s_evects, &
1056 tddfpt_control=tddfpt_control, &
1057 matrix_ks=matrix_ks, &
1059 kernel_env=kernel_env, &
1062 iter_unit=log_unit, &
1063 energy_unit=energy_unit, &
1064 tddfpt_print_section=tddfpt_print_section, &
1065 work_matrices=work_matrices)
1072 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1074 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters)
EXIT
1078 IF (log_unit > 0)
THEN
1079 WRITE (log_unit,
'(1X,25("-"),1X,A,1X,25("-"))')
"Restart Davidson iterations"
1085 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1090 tddfpt_print_section=tddfpt_print_section)
1095 IF (log_unit > 0)
THEN
1097 IF (conv <= tddfpt_control%conv)
THEN
1098 WRITE (log_unit,
"(1X,A)")
"", &
1099 "-------------------------------------------------------------------------------", &
1100 "- TDDFPT run converged in "//trim(nstates_str)//
" iteration(s) ", &
1101 "-------------------------------------------------------------------------------"
1103 WRITE (log_unit,
"(1X,A)")
"", &
1104 "-------------------------------------------------------------------------------", &
1105 "- TDDFPT run did NOT converge after "//trim(nstates_str)//
" iteration(s) ", &
1106 "-------------------------------------------------------------------------------"
1111 tddfpt_print_section,
"DETAILED_ENERGY")
1113 tddfpt_print_section,
"ITERATION_INFO")
1115 CALL cp_warn(__location__, &
1116 "Skipping TDDFPT wavefunction optimization")
1119 IF (
ASSOCIATED(matrix_ks_oep))
THEN
1121 CALL cp_warn(__location__, &
1122 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1123 "when computed using an orbital energy correction XC-potential together with "// &
1124 "the velocity form of dipole transition integrals")
1132 tddfpt_print_section, &
1140 tddfpt_print_section, &
1141 matrix_s(1)%matrix, &
1145 ALLOCATE (ostrength(nstates))
1152 dipole_op_mos_occ, &
1153 tddfpt_control%dipole_form)
1159 matrix_s(1)%matrix, &
1160 min_amplitude=tddfpt_control%min_excitation_amplitude)
1165 matrix_s(1)%matrix, &
1166 tddfpt_print_section)
1167 IF (tddfpt_control%do_exciton_descriptors)
THEN
1172 matrix_s(1)%matrix, &
1173 tddfpt_control%do_directional_exciton_descriptors, &
1177 IF (tddfpt_control%do_lrigpw)
THEN
1180 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1183 CALL timestop(handle)
1215 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1216 tddfpt_control, logger, tddfpt_print_section, &
1217 evects, evals, ostrength, &
1218 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1219 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1220 kernel_env_admm_aux)
1223 INTEGER,
INTENT(in) :: nstates
1228 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1229 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
1233 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1238 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1239 LOGICAL,
INTENT(in) :: lmult_tmp
1243 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_energies'
1245 INTEGER :: handle, ispin, istate, log_unit, mult, &
1247 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_mult, ostrength_mult
1248 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mult
1250 CALL timeset(routinen, handle)
1254 extension=
".tddfptLog")
1257 nspins =
SIZE(gs_mos)
1258 ALLOCATE (evects_mult(nspins, nstates))
1259 ALLOCATE (evals_mult(nstates))
1263 IF (log_unit > 0)
THEN
1264 WRITE (log_unit,
"(1X,A)")
"", &
1265 "-------------------------------------------------------------------------------", &
1266 "- TDDFPT SINGLET ENERGIES -", &
1267 "-------------------------------------------------------------------------------"
1271 IF (log_unit > 0)
THEN
1272 WRITE (log_unit,
"(1X,A)")
"", &
1273 "-------------------------------------------------------------------------------", &
1274 "- TDDFPT TRIPLET ENERGIES -", &
1275 "-------------------------------------------------------------------------------"
1280 CALL tddfpt_energies(qs_env, nstates, work_matrices, tddfpt_control, logger, &
1281 tddfpt_print_section, evects_mult, evals_mult, &
1282 gs_mos, tddfpt_section, s_evects, matrix_s, &
1283 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1284 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1285 kernel_env_admm_aux)
1293 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1294 tddfpt_control%do_exck, qs_env, sub_env)
1297 DO istate = 1, nstates
1298 DO ispin = 1, nspins
1303 DO istate = 1, nstates
1304 DO ispin = 1, nspins
1306 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
1307 s_evects(ispin, istate))
1311 tddfpt_control%rks_triplets = lmult_tmp
1315 IF (log_unit > 0)
THEN
1316 WRITE (log_unit,
"(1X,A)")
"", &
1317 " singlet excitations finished ", &
1319 "-------------------------------------------------------------------------------", &
1320 "- TDDFPT TRIPLET ENERGIES -", &
1321 "-------------------------------------------------------------------------------"
1325 IF (log_unit > 0)
THEN
1326 WRITE (log_unit,
"(1X,A)")
"", &
1327 " triplet excitations finished ", &
1329 "-------------------------------------------------------------------------------", &
1330 "- TDDFPT SINGLET ENERGIES -", &
1331 "-------------------------------------------------------------------------------"
1336 CALL tddfpt_energies(qs_env, nstates, work_matrices, tddfpt_control, logger, &
1337 tddfpt_print_section, evects, evals, &
1338 gs_mos, tddfpt_section, s_evects, matrix_s, &
1339 kernel_env, matrix_ks, sub_env, ostrength, &
1340 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1341 kernel_env_admm_aux)
1346 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos)
1348 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos)
1352 DO ispin = 1,
SIZE(evects_mult, 1)
1353 DO istate = 1,
SIZE(evects_mult, 2)
1357 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1359 CALL timestop(handle)
1361 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)
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(qs_env, calc_forces)
Perform TDDFPT calculation.
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_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.
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.