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
147 SUBROUTINE tddfpt(qs_env, calc_forces, rixs_env)
149 LOGICAL,
INTENT(IN) :: calc_forces
152 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt'
154 INTEGER :: handle, ispin, istate, log_unit, mult, &
155 my_state, nao, nocc, nspins, &
156 nstate_max, nstates, nvirt, old_state
157 INTEGER,
DIMENSION(maxspins) :: nactive
158 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
159 do_hfxsr, do_rixs, do_sf, do_soc, &
160 lmult_tmp, state_change
161 REAL(kind=
dp) :: gsmin, gsval, xsval
162 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
167 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: my_mos
168 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
170 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
172 matrix_s_aux_fit_vs_orb
177 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
180 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
184 lri_section, soc_section, &
185 tddfpt_print_section, tddfpt_section, &
195 CALL timeset(routinen, handle)
201 NULLIFY (tddfpt_section, tddfpt_control)
204 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
205 lri_section, hfxsr_section)
208 extension=
".tddfptLog")
211 blacs_env=blacs_env, &
213 dft_control=dft_control, &
214 matrix_ks=matrix_ks, &
222 NULLIFY (rixs_control, valence_state)
223 rixs_control => dft_control%rixs_control
224 tddfpt_control => rixs_control%tddfpt2_control
225 valence_state => rixs_env%valence_state
228 tddfpt_control => dft_control%tddfpt2_control
231 tddfpt_control%do_hfx = do_hfx
232 tddfpt_control%do_admm = do_admm
233 tddfpt_control%do_hfxsr = do_hfxsr
234 tddfpt_control%hfxsr_primbas = 0
235 tddfpt_control%hfxsr_re_int = .true.
236 tddfpt_control%do_hfxlr = do_hfxlr
237 tddfpt_control%do_exck = do_exck
239 IF (tddfpt_control%do_hfxlr)
THEN
251 lmult_tmp = tddfpt_control%rks_triplets
252 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
262 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
269 IF (tddfpt_control%do_smearing)
THEN
276 IF ((tddfpt_control%do_lrigpw) .AND. &
278 CALL cp_abort(__location__,
"LRI only implemented for full kernel")
281 IF (
ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
289 nspins =
SIZE(gs_mos)
292 mult = abs(
SIZE(gs_mos(1)%evals_occ) -
SIZE(gs_mos(2)%evals_occ)) + 1
294 CALL cp_warn(__location__,
"There is a convergence issue for multiplicity >= 3")
296 IF (tddfpt_control%rks_triplets)
THEN
304 ALLOCATE (my_mos(nspins))
306 my_mos(ispin) = gs_mos(ispin)%mos_occ
309 kernel=tddfpt_control%kernel)
314 IF (dft_control%qs_control%xtb)
THEN
315 cpabort(
"TDDFPT: xTB only works with sTDA Kernel")
318 IF (tddfpt_control%do_hfxsr)
THEN
321 i_val=tddfpt_control%hfxsr_primbas)
324 primitive=tddfpt_control%hfxsr_primbas)
326 ALLOCATE (full_kernel_env%admm_control)
332 full_kernel_env%hfxsr_section => hfxsr_section
335 full_kernel_env%admm_control,
"TDA_HFX")
336 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
337 matrix_s_aux_fit=matrix_s_aux_fit, &
338 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
340 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
342 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
343 qs_kind_set=qs_kind_set, particle_set=particle_set, &
345 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
346 qs_kind_set, particle_set, dft_control, cell, orb_basis=
"TDA_HFX")
350 nstates = tddfpt_control%nstates
360 nstate_max = nocc*nvirt
361 IF (nstates > nstate_max)
THEN
362 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
363 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
365 tddfpt_control%nstates = nstate_max
368 do_hfxlr, do_exck, do_sf, qs_env, sub_env)
371 kernel_env%full_kernel => full_kernel_env
372 kernel_env%admm_kernel => kernel_env_admm_aux
373 NULLIFY (kernel_env%stda_kernel)
386 DO ispin = 1,
SIZE(gs_mos)
388 ncol_global=nactive(ispin))
394 nstates = tddfpt_control%nstates
399 work_matrices, tddfpt_control)
401 kernel_env%stda_kernel => stda_kernel
402 NULLIFY (kernel_env%full_kernel)
403 NULLIFY (kernel_env%admm_kernel)
406 nstates = tddfpt_control%nstates
409 NULLIFY (kernel_env%full_kernel)
410 NULLIFY (kernel_env%admm_kernel)
411 NULLIFY (kernel_env%stda_kernel)
416 ALLOCATE (evects(1, nstates))
418 ALLOCATE (evects(nspins, nstates))
420 ALLOCATE (evals(nstates))
421 ALLOCATE (s_evects(
SIZE(evects, 1), nstates))
423 DO istate = 1, nstates
424 DO ispin = 1,
SIZE(evects, 1)
426 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
427 s_evects(ispin, istate))
431 IF (.NOT. do_soc)
THEN
434 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
435 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
436 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
439 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
440 tddfpt_control, logger, tddfpt_print_section, &
441 evects, evals, ostrength, &
442 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
443 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
448 IF (calc_forces)
THEN
450 tddfpt_print_section, gs_mos, &
451 kernel_env, sub_env, work_matrices)
455 IF (qs_env%excited_state)
THEN
456 IF (sub_env%is_split)
THEN
457 CALL cp_abort(__location__, &
458 "Excited state forces not possible when states"// &
459 " are distributed to different CPU pools.")
462 IF (
ASSOCIATED(matrix_ks_oep))
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
464 state_change = .false.
465 IF (ex_env%state > 0)
THEN
466 my_state = ex_env%state
467 ELSEIF (ex_env%state < 0)
THEN
469 ALLOCATE (my_mos(nspins))
471 my_mos(ispin) = gs_mos(ispin)%mos_occ
473 my_state = abs(ex_env%state)
474 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
476 IF (my_state /= abs(ex_env%state))
THEN
477 state_change = .true.
478 old_state = abs(ex_env%state)
480 ex_env%state = -my_state
482 CALL cp_warn(__location__, &
483 "Active excited state not assigned. Use the first state.")
486 cpassert(my_state > 0)
487 IF (my_state > nstates)
THEN
488 CALL cp_warn(__location__, &
489 "There were not enough excited states calculated.")
490 cpabort(
"excited state potential energy surface")
494 ex_env%evalue = evals(my_state)
497 ALLOCATE (ex_env%evect(
SIZE(evects, 1)))
498 DO ispin = 1,
SIZE(evects, 1)
500 matrix_struct=matrix_struct)
502 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
505 IF (log_unit > 0)
THEN
506 gsval = ex_env%wfn_history%gsval
507 gsmin = ex_env%wfn_history%gsmin
508 xsval = ex_env%wfn_history%xsval
509 WRITE (log_unit,
"(1X,A,T40,F10.6,A,T62,F10.6,A)")
"Ground state orbital alignment:", &
510 gsmin,
"[MinVal]", gsval,
"[Average]"
511 WRITE (log_unit,
"(1X,A,T71,F10.6)")
"Excitation vector alignment:", xsval
512 IF (state_change)
THEN
513 WRITE (log_unit,
"(1X,A,I5,T60,A14,T76,I5)") &
514 "Target state has been changed from state ", &
515 old_state,
" to new state ", my_state
517 WRITE (log_unit,
"(1X,A,I4,A,F12.5,A)")
"Calculate properties for state:", &
518 my_state,
" with excitation energy ", ex_env%evalue*
evolt,
" eV"
522 IF (calc_forces)
THEN
524 sub_env, work_matrices)
531 valence_state%nstates = nstates
532 ALLOCATE (valence_state%evals(
SIZE(evals)))
533 valence_state%evals(:) = evals(:)
535 ALLOCATE (valence_state%evects(nspins, nstates))
536 ALLOCATE (valence_state%mos_occ(nspins))
539 DO istate = 1, nstates
541 matrix_struct=matrix_struct)
542 CALL cp_fm_create(valence_state%evects(ispin, istate), matrix_struct)
543 CALL cp_fm_to_fm(evects(ispin, istate), valence_state%evects(ispin, istate))
547 matrix_struct=matrix_struct)
548 CALL cp_fm_create(valence_state%mos_occ(ispin), matrix_struct)
549 CALL cp_fm_to_fm(gs_mos(ispin)%mos_occ, valence_state%mos_occ(ispin))
559 tddfpt_print_section, &
562 DEALLOCATE (evals, ostrength)
566 IF (tddfpt_control%do_lrigpw)
THEN
568 DEALLOCATE (kernel_env%full_kernel%lri_env)
570 DEALLOCATE (kernel_env%full_kernel%lri_density)
578 cpabort(
'Unknown kernel type')
585 DO ispin = nspins, 1, -1
590 IF (
ASSOCIATED(matrix_ks_oep)) &
593 CALL timestop(handle)
610 SUBROUTINE tddfpt_input(qs_env, do_hfx, do_admm, do_exck, do_hfxsr, do_hfxlr, &
611 xc_section, tddfpt_print_section, lri_section, hfxsr_section)
613 LOGICAL,
INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
616 lri_section, hfxsr_section
618 CHARACTER(len=20) :: nstates_str
619 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
620 explicit_root, expot, exvdw, exwfn, &
622 REAL(kind=
dp) :: c_hf
625 tddfpt_section, xc_root, xc_sub
628 NULLIFY (dft_control, input)
629 CALL get_qs_env(qs_env, dft_control=dft_control, input=input)
630 tddfpt_control => dft_control%tddfpt2_control
633 IF (dft_control%nimages > 1) cpabort(
"k-points not implemented for TDDFPT")
635 IF (tddfpt_control%nstates <= 0)
THEN
637 CALL cp_warn(__location__,
"TDDFPT calculation was requested for "// &
638 trim(nstates_str)//
" excited states: nothing to do.")
642 NULLIFY (tddfpt_section, tddfpt_print_section)
651 IF (explicit_root)
THEN
657 CALL cp_warn(__location__,
"TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
658 cpabort(
"TDDFPT Input")
665 CALL cp_warn(__location__,
"TDDFPT Kernel with GCP_POTENTIAL not possible.")
666 cpabort(
"TDDFPT Input")
673 CALL cp_warn(__location__,
"TDDFPT Kernel with VDW_POTENTIAL not possible.")
674 cpabort(
"TDDFPT Input")
681 CALL cp_warn(__location__,
"TDDFPT Kernel with WF_CORRELATION not possible.")
682 cpabort(
"TDDFPT Input")
689 CALL cp_warn(__location__,
"TDDFPT Kernel with XC_POTENTIAL not possible.")
690 cpabort(
"TDDFPT Input")
699 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk))
THEN
700 CALL cp_warn(__location__,
"TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
701 cpabort(
"TDDFPT Input")
710 xc_section => xc_root
715 do_hfx = (c_hf /= 0.0_dp)
721 IF (.NOT. same_hfx)
THEN
722 cpabort(
"TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
726 do_admm = do_hfx .AND. dft_control%do_admm
729 CALL cp_abort(__location__, &
730 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
731 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
754 do_hfx = (c_hf /= 0.0_dp)
756 do_admm = do_hfx .AND. dft_control%do_admm
770 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1)
THEN
771 tddfpt_control%rks_triplets = .false.
772 CALL cp_warn(__location__,
"Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
776 IF (tddfpt_control%do_lrigpw)
THEN
781 NULLIFY (hfxsr_section)
785 IF (.NOT. found)
THEN
786 cpabort(
"HFXSR option needs &HF section defined")
788 CALL section_vals_val_get(hfxsr_section,
"INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
789 IF (.NOT. found)
THEN
794 IF (.NOT. found)
THEN
795 CALL section_vals_val_set(hfxsr_section,
"INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
799 CALL cp_abort(__location__,
"Short range TDA kernel with RI not possible")
812 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
813 INTEGER,
INTENT(IN) :: log_unit
818 CHARACTER(LEN=4) :: ktype
821 lsd = (dft_control%nspins > 1)
824 IF (log_unit > 0)
THEN
825 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
826 CALL xc_write(log_unit, xc_section, lsd)
827 IF (tddfpt_control%do_hfx)
THEN
828 IF (tddfpt_control%do_admm)
THEN
829 WRITE (log_unit,
"(T2,A,T62,A19)")
"KERNEL|",
"ADMM Exact Exchange"
830 IF (tddfpt_control%admm_xc_correction)
THEN
831 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Apply ADMM Kernel XC Correction"
833 IF (tddfpt_control%admm_symm)
THEN
834 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Symmetric ADMM Kernel"
837 WRITE (log_unit,
"(T2,A,T67,A14)")
"KERNEL|",
"Exact Exchange"
840 IF (tddfpt_control%do_hfxsr)
THEN
841 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Short range HFX approximation"
843 IF (tddfpt_control%do_hfxlr)
THEN
844 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Long range HFX approximation"
846 IF (tddfpt_control%do_lrigpw)
THEN
847 WRITE (log_unit,
"(T2,A,T42,A39)")
"KERNEL|",
"LRI approximation of transition density"
852 IF (log_unit > 0)
THEN
853 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
854 IF (tddfpt_control%stda_control%do_ewald)
THEN
855 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses Ewald summation"
857 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses direct summation (MIC)"
859 IF (tddfpt_control%stda_control%do_exchange)
THEN
860 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Exact exchange term",
"YES"
861 WRITE (log_unit,
"(T2,A,T71,F10.3)")
"KERNEL| Short range HFX fraction:", &
862 tddfpt_control%stda_control%hfx_fraction
864 WRITE (log_unit,
"(T2,A,T79,A2)")
"KERNEL| Exact exchange term",
"NO"
866 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"KERNEL| Transition density filter", &
867 tddfpt_control%stda_control%eps_td_filter
871 IF (log_unit > 0)
THEN
872 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
878 IF (log_unit > 0)
THEN
879 IF (tddfpt_control%rks_triplets)
THEN
880 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Triplet"
884 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin symmetry of excitations",
"Unrestricted"
887 WRITE (log_unit,
"(T2,A,T72,A9)")
"KERNEL| Spin flip",
"Collinear"
890 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin flip",
"Noncollinear"
893 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Singlet"
895 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of states calculated", tddfpt_control%nstates
896 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of Davidson iterations", tddfpt_control%niters
897 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"TDDFPT| Davidson iteration convergence", tddfpt_control%conv
898 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
901 END SUBROUTINE kernel_info
929 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
930 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
931 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
935 INTEGER :: nstates, nspins
940 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
941 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
945 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
950 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ostrength
951 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
956 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_energies'
958 CHARACTER(len=20) :: nstates_str
959 INTEGER :: energy_unit, handle, iter, log_unit, &
960 niters, nocc, nstate_max, &
962 LOGICAL :: do_admm, do_exck, do_soc, explicit
963 REAL(kind=
dp) :: conv
966 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_oep
970 CALL timeset(routinen, handle)
972 NULLIFY (admm_env, matrix_ks_oep)
973 do_admm = tddfpt_control%do_admm
974 IF (do_admm)
CALL get_qs_env(qs_env, admm_env=admm_env)
980 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
981 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
982 is_rks_triplets=tddfpt_control%rks_triplets, &
983 qs_env=qs_env, sub_env=sub_env, &
984 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
988 IF (tddfpt_control%admm_xc_correction)
THEN
990 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
991 xc_section=admm_env%xc_section_primary, &
992 is_rks_triplets=tddfpt_control%rks_triplets, &
996 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
997 xc_section=xc_section, &
998 is_rks_triplets=tddfpt_control%rks_triplets, &
1003 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1004 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
1005 local_rho_set=sub_env%local_rho_set_admm, &
1006 qs_env=qs_env, sub_env=sub_env, &
1007 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
1008 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
1009 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
1012 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
1013 xc_section=admm_env%xc_section_aux, &
1014 is_rks_triplets=tddfpt_control%rks_triplets, &
1016 kernel_env%full_kernel => full_kernel_env
1017 kernel_env%admm_kernel => kernel_env_admm_aux
1021 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1022 xc_section=xc_section, &
1023 is_rks_triplets=tddfpt_control%rks_triplets, &
1025 kernel_env%full_kernel => full_kernel_env
1026 NULLIFY (kernel_env%admm_kernel)
1029 do_exck = tddfpt_control%do_exck
1030 kernel_env%full_kernel%do_exck = do_exck
1033 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
1034 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
1039 IF (tddfpt_control%do_lrigpw)
THEN
1042 tddfpt_print_section)
1054 nstate_max = nocc*nvirt
1055 IF ((
SIZE(gs_mos, 1) == 2) .AND. (tddfpt_control%spinflip ==
no_sf_tddfpt))
THEN
1058 nstate_max = nocc*nvirt + nstate_max
1060 IF (nstates > nstate_max)
THEN
1061 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
1062 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
1063 nstates = nstate_max
1070 IF (tddfpt_control%is_restart .AND. .NOT. do_soc)
THEN
1078 tddfpt_section=tddfpt_section, &
1079 tddfpt_print_section=tddfpt_print_section, &
1080 fm_pool_ao_mo_occ=work_matrices%fm_pool_ao_mo_occ, &
1081 blacs_env_global=blacs_env)
1089 "GUESS_VECTORS", extension=
".tddfptLog")
1091 gs_mos=gs_mos, log_unit=log_unit)
1093 tddfpt_print_section,
"GUESS_VECTORS")
1096 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1102 niters = tddfpt_control%niters
1103 IF (niters > 0)
THEN
1105 "ITERATION_INFO", extension=
".tddfptLog")
1107 tddfpt_print_section, &
1108 "DETAILED_ENERGY", &
1109 extension=
".tddfptLog")
1111 IF (log_unit > 0)
THEN
1112 WRITE (log_unit,
"(1X,A)")
"", &
1113 "-------------------------------------------------------------------------------", &
1114 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1115 "-------------------------------------------------------------------------------"
1117 WRITE (log_unit,
'(/,T11,A,T27,A,T40,A,T62,A)')
"Step",
"Time",
"Convergence",
"Conv. states"
1118 WRITE (log_unit,
'(1X,79("-"))')
1128 s_evects=s_evects, &
1130 tddfpt_control=tddfpt_control, &
1131 matrix_ks=matrix_ks, &
1133 kernel_env=kernel_env, &
1136 iter_unit=log_unit, &
1137 energy_unit=energy_unit, &
1138 tddfpt_print_section=tddfpt_print_section, &
1139 work_matrices=work_matrices)
1146 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1148 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters)
EXIT
1152 IF (log_unit > 0)
THEN
1153 WRITE (log_unit,
'(1X,25("-"),1X,A,1X,25("-"))')
"Restart Davidson iterations"
1159 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1164 tddfpt_print_section=tddfpt_print_section)
1169 IF (log_unit > 0)
THEN
1171 IF (conv <= tddfpt_control%conv)
THEN
1172 WRITE (log_unit,
"(1X,A)")
"", &
1173 "-------------------------------------------------------------------------------", &
1174 "- TDDFPT run converged in "//trim(nstates_str)//
" iteration(s) ", &
1175 "-------------------------------------------------------------------------------"
1177 WRITE (log_unit,
"(1X,A)")
"", &
1178 "-------------------------------------------------------------------------------", &
1179 "- TDDFPT run did NOT converge after "//trim(nstates_str)//
" iteration(s) ", &
1180 "-------------------------------------------------------------------------------"
1185 tddfpt_print_section,
"DETAILED_ENERGY")
1187 tddfpt_print_section,
"ITERATION_INFO")
1189 CALL cp_warn(__location__, &
1190 "Skipping TDDFPT wavefunction optimization")
1193 IF (
ASSOCIATED(matrix_ks_oep))
THEN
1195 CALL cp_warn(__location__, &
1196 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1197 "when computed using an orbital energy correction XC-potential together with "// &
1198 "the velocity form of dipole transition integrals")
1206 tddfpt_print_section, &
1214 tddfpt_print_section, &
1215 matrix_s(1)%matrix, &
1219 ALLOCATE (ostrength(nstates))
1226 dipole_op_mos_occ, &
1227 tddfpt_control%dipole_form)
1233 matrix_s(1)%matrix, &
1234 tddfpt_control%spinflip, &
1235 min_amplitude=tddfpt_control%min_excitation_amplitude)
1240 matrix_s(1)%matrix, &
1241 tddfpt_print_section)
1242 IF (tddfpt_control%do_exciton_descriptors)
THEN
1247 matrix_s(1)%matrix, &
1248 tddfpt_control%do_directional_exciton_descriptors, &
1252 IF (tddfpt_control%do_lrigpw)
THEN
1255 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1258 CALL timestop(handle)
1290 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1291 tddfpt_control, logger, tddfpt_print_section, &
1292 evects, evals, ostrength, &
1293 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1294 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1295 kernel_env_admm_aux)
1298 INTEGER,
INTENT(in) :: nstates
1303 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1304 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
1308 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1313 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1314 LOGICAL,
INTENT(in) :: lmult_tmp
1318 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_energies'
1320 INTEGER :: handle, ispin, istate, log_unit, mult, &
1323 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_mult, ostrength_mult
1324 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mult
1326 CALL timeset(routinen, handle)
1330 extension=
".tddfptLog")
1333 nspins =
SIZE(gs_mos)
1334 ALLOCATE (evects_mult(nspins, nstates))
1335 ALLOCATE (evals_mult(nstates))
1340 IF (log_unit > 0)
THEN
1341 WRITE (log_unit,
"(1X,A)")
"", &
1342 "-------------------------------------------------------------------------------", &
1343 "- TDDFPT SINGLET ENERGIES -", &
1344 "-------------------------------------------------------------------------------"
1348 IF (log_unit > 0)
THEN
1349 WRITE (log_unit,
"(1X,A)")
"", &
1350 "-------------------------------------------------------------------------------", &
1351 "- TDDFPT TRIPLET ENERGIES -", &
1352 "-------------------------------------------------------------------------------"
1357 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1358 tddfpt_print_section, evects_mult, evals_mult, &
1359 gs_mos, tddfpt_section, s_evects, matrix_s, &
1360 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1361 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1362 kernel_env_admm_aux)
1370 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1371 tddfpt_control%do_exck, do_sf, qs_env, sub_env)
1374 DO istate = 1, nstates
1375 DO ispin = 1, nspins
1380 DO istate = 1, nstates
1381 DO ispin = 1, nspins
1383 work_matrices%fm_pool_ao_mo_occ(ispin)%pool, &
1384 s_evects(ispin, istate))
1388 tddfpt_control%rks_triplets = lmult_tmp
1392 IF (log_unit > 0)
THEN
1393 WRITE (log_unit,
"(1X,A)")
"", &
1394 " singlet excitations finished ", &
1396 "-------------------------------------------------------------------------------", &
1397 "- TDDFPT TRIPLET ENERGIES -", &
1398 "-------------------------------------------------------------------------------"
1402 IF (log_unit > 0)
THEN
1403 WRITE (log_unit,
"(1X,A)")
"", &
1404 " triplet excitations finished ", &
1406 "-------------------------------------------------------------------------------", &
1407 "- TDDFPT SINGLET ENERGIES -", &
1408 "-------------------------------------------------------------------------------"
1413 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1414 tddfpt_print_section, evects, evals, &
1415 gs_mos, tddfpt_section, s_evects, matrix_s, &
1416 kernel_env, matrix_ks, sub_env, ostrength, &
1417 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1418 kernel_env_admm_aux)
1423 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos)
1425 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos)
1429 DO ispin = 1,
SIZE(evects_mult, 1)
1430 DO istate = 1,
SIZE(evects_mult, 2)
1434 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1436 CALL timestop(handle)
1438 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, 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_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_guess_vectors(tddfpt_control, nspins, evects, evals, gs_mos, log_unit)
Generate missed guess vectors.
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.