28 dbcsr_type_antisymmetric,&
143#include "./base/base_uses.f90"
149 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_methods'
151 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
153 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
154 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
174 SUBROUTINE tddfpt(qs_env, calc_forces, rixs_env)
176 LOGICAL,
INTENT(IN) :: calc_forces
179 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt'
181 INTEGER :: handle, ispin, istate, log_unit, mult, &
182 my_state, nao, nocc, nspins, &
183 nstate_max, nstates, nvirt, old_state
184 INTEGER,
DIMENSION(maxspins) :: nactive
185 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
186 do_hfxsr, do_kpoints, do_rixs, do_sf, &
187 do_soc, lmult_tmp, state_change
188 REAL(kind=
dp) :: gsmin, gsval, xsval
189 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
194 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: my_active, my_mos
195 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
197 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
199 matrix_s_aux_fit_vs_orb
204 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
207 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
211 lri_section, soc_section, &
212 tddfpt_print_section, tddfpt_section, &
222 CALL timeset(routinen, handle)
227 NULLIFY (tddfpt_section, tddfpt_control)
230 dft_control=dft_control, &
232 do_kpoints = dft_control%nimages > 1
236 NULLIFY (rixs_control, valence_state)
237 rixs_control => dft_control%rixs_control
238 tddfpt_control => rixs_control%tddfpt2_control
239 valence_state => rixs_env%valence_state
242 tddfpt_control => dft_control%tddfpt2_control
246 CALL tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, &
247 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
248 lri_section, hfxsr_section)
251 extension=
".tddfptLog")
253 tddfpt_control%do_hfx = do_hfx
254 tddfpt_control%do_admm = do_admm
255 tddfpt_control%do_hfxsr = do_hfxsr
256 tddfpt_control%hfxsr_primbas = 0
257 tddfpt_control%hfxsr_re_int = .true.
258 tddfpt_control%do_hfxlr = do_hfxlr
259 tddfpt_control%do_exck = do_exck
262 IF (tddfpt_control%do_hfxlr)
THEN
274 lmult_tmp = tddfpt_control%rks_triplets
275 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
285 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
288 IF (calc_forces)
THEN
289 cpabort(
"TDDFPT forces are not implemented for k-points")
292 cpabort(
"RIXS/TDDFPT is not implemented for k-points")
295 cpabort(
"TDDFPT-SOC is not implemented for k-points")
297 CALL tddfpt_kpoint_independent_particle(qs_env, logger, tddfpt_control)
300 tddfpt_print_section, &
302 CALL timestop(handle)
307 blacs_env=blacs_env, &
309 matrix_ks=matrix_ks, &
319 IF (tddfpt_control%do_smearing)
THEN
326 IF ((tddfpt_control%do_lrigpw) .AND. &
328 CALL cp_abort(__location__,
"LRI only implemented for full kernel")
331 IF (
ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
335 CALL init_res_method(qs_env, gs_mos, tddfpt_control, tddfpt_section, log_unit)
343 nspins =
SIZE(gs_mos)
346 mult = abs(
SIZE(gs_mos(1)%evals_occ) -
SIZE(gs_mos(2)%evals_occ)) + 1
348 CALL cp_warn(__location__,
"There is a convergence issue for multiplicity >= 3")
351 IF (tddfpt_control%rks_triplets)
THEN
359 ALLOCATE (my_mos(nspins), my_active(nspins))
361 my_mos(ispin) = gs_mos(ispin)%mos_occ
362 my_active(ispin) = gs_mos(ispin)%mos_active
365 mos_occ=my_mos(:), mos_active=my_active(:), &
366 kernel=tddfpt_control%kernel)
367 DEALLOCATE (my_mos, my_active)
371 IF (dft_control%qs_control%xtb)
THEN
372 cpabort(
"TDDFPT: xTB only works with sTDA Kernel")
375 IF (tddfpt_control%do_hfxsr)
THEN
378 i_val=tddfpt_control%hfxsr_primbas)
381 primitive=tddfpt_control%hfxsr_primbas)
383 ALLOCATE (full_kernel_env%admm_control)
389 full_kernel_env%hfxsr_section => hfxsr_section
392 full_kernel_env%admm_control,
"TDA_HFX")
393 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
394 matrix_s_aux_fit=matrix_s_aux_fit, &
395 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
397 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
399 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
400 qs_kind_set=qs_kind_set, particle_set=particle_set, &
402 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
403 qs_kind_set, particle_set, dft_control, cell, orb_basis=
"TDA_HFX")
407 nstates = tddfpt_control%nstates
417 nstate_max = nocc*nvirt
418 IF (nstates > nstate_max)
THEN
419 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
420 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
422 tddfpt_control%nstates = nstate_max
425 do_hfx, do_admm, do_hfxlr, do_exck, do_sf, qs_env, sub_env)
428 kernel_env%full_kernel => full_kernel_env
429 kernel_env%admm_kernel => kernel_env_admm_aux
430 NULLIFY (kernel_env%stda_kernel)
442 nactive = tddfpt_control%nactive
447 nstates = tddfpt_control%nstates
451 work_matrices, tddfpt_control)
453 kernel_env%stda_kernel => stda_kernel
454 NULLIFY (kernel_env%full_kernel)
455 NULLIFY (kernel_env%admm_kernel)
458 nstates = tddfpt_control%nstates
460 NULLIFY (kernel_env%full_kernel)
461 NULLIFY (kernel_env%admm_kernel)
462 NULLIFY (kernel_env%stda_kernel)
467 ALLOCATE (evects(1, nstates))
469 ALLOCATE (evects(nspins, nstates))
471 ALLOCATE (evals(nstates))
472 ALLOCATE (s_evects(
SIZE(evects, 1), nstates))
474 DO istate = 1, nstates
475 DO ispin = 1,
SIZE(evects, 1)
477 work_matrices%fm_pool_ao_mo_active(ispin)%pool, &
478 s_evects(ispin, istate))
482 IF (.NOT. do_soc)
THEN
485 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
486 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
487 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
490 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
491 tddfpt_control, logger, tddfpt_print_section, &
492 evects, evals, ostrength, &
493 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
494 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
499 IF (calc_forces)
THEN
501 tddfpt_print_section, gs_mos, &
502 kernel_env, sub_env, work_matrices)
506 IF (qs_env%excited_state)
THEN
507 IF (sub_env%is_split)
THEN
508 CALL cp_abort(__location__, &
509 "Excited state forces not possible when states"// &
510 " are distributed to different CPU pools.")
513 IF (
ASSOCIATED(matrix_ks_oep))
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
515 state_change = .false.
516 IF (ex_env%state > 0)
THEN
517 my_state = ex_env%state
518 ELSE IF (ex_env%state < 0)
THEN
520 ALLOCATE (my_mos(nspins))
522 my_mos(ispin) = gs_mos(ispin)%mos_occ
524 my_state = abs(ex_env%state)
525 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
527 IF (my_state /= abs(ex_env%state))
THEN
528 state_change = .true.
529 old_state = abs(ex_env%state)
531 ex_env%state = -my_state
533 CALL cp_warn(__location__, &
534 "Active excited state not assigned. Use the first state.")
537 cpassert(my_state > 0)
538 IF (my_state > nstates)
THEN
539 CALL cp_warn(__location__, &
540 "There were not enough excited states calculated.")
541 cpabort(
"excited state potential energy surface")
545 ex_env%evalue = evals(my_state)
548 ALLOCATE (ex_env%evect(
SIZE(evects, 1)))
549 DO ispin = 1,
SIZE(evects, 1)
551 matrix_struct=matrix_struct)
553 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
556 IF (log_unit > 0)
THEN
557 gsval = ex_env%wfn_history%gsval
558 gsmin = ex_env%wfn_history%gsmin
559 xsval = ex_env%wfn_history%xsval
560 WRITE (log_unit,
"(1X,A,T40,F10.6,A,T62,F10.6,A)")
"Ground state orbital alignment:", &
561 gsmin,
"[MinVal]", gsval,
"[Average]"
562 WRITE (log_unit,
"(1X,A,T71,F10.6)")
"Excitation vector alignment:", xsval
563 IF (state_change)
THEN
564 WRITE (log_unit,
"(1X,A,I5,T60,A14,T76,I5)") &
565 "Target state has been changed from state ", &
566 old_state,
" to new state ", my_state
568 WRITE (log_unit,
"(1X,A,I4,A,F12.5,A)")
"Calculate properties for state:", &
569 my_state,
" with excitation energy ", ex_env%evalue*
evolt,
" eV"
573 IF (calc_forces)
THEN
575 sub_env, work_matrices)
582 valence_state%nstates = nstates
583 ALLOCATE (valence_state%evals(
SIZE(evals)))
584 valence_state%evals(:) = evals(:)
586 ALLOCATE (valence_state%evects(nspins, nstates))
587 ALLOCATE (valence_state%mos_active(nspins))
590 DO istate = 1, nstates
592 matrix_struct=matrix_struct)
593 CALL cp_fm_create(valence_state%evects(ispin, istate), matrix_struct)
594 CALL cp_fm_to_fm(evects(ispin, istate), valence_state%evects(ispin, istate))
598 matrix_struct=matrix_struct)
599 CALL cp_fm_create(valence_state%mos_active(ispin), matrix_struct)
600 CALL cp_fm_to_fm(gs_mos(ispin)%mos_active, valence_state%mos_active(ispin))
610 tddfpt_print_section, &
613 DEALLOCATE (evals, ostrength)
617 IF (tddfpt_control%do_lrigpw)
THEN
619 DEALLOCATE (kernel_env%full_kernel%lri_env)
621 DEALLOCATE (kernel_env%full_kernel%lri_density)
629 cpabort(
'Unknown kernel type')
636 DO ispin = nspins, 1, -1
641 IF (
ASSOCIATED(matrix_ks_oep))
THEN
645 CALL timestop(handle)
664 SUBROUTINE tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, &
665 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, lri_section, &
670 LOGICAL,
INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
673 lri_section, hfxsr_section
675 CHARACTER(len=20) :: nstates_str
676 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
677 explicit, explicit_root, expot, exvdw, &
678 exwfn, found, same_hfx, use_real_wfn
679 REAL(kind=
dp) :: c_hf
683 print_sub, xc_root, xc_sub
685 NULLIFY (dft_control, input, kpoints)
686 CALL get_qs_env(qs_env, dft_control=dft_control, input=input, kpoints=kpoints)
688 IF (dft_control%nimages > 1)
THEN
690 cpabort(
"TDDFPT with k-points currently supports only KERNEL NONE")
693 IF (use_real_wfn)
THEN
694 cpabort(
"K-point TDDFPT requires complex wavefunctions")
697 cpabort(
"Spin-flip TDDFPT is not implemented for k-points")
699 IF (tddfpt_control%do_smearing)
THEN
700 cpabort(
"Smeared-occupation TDDFPT is not implemented for k-points")
702 IF (tddfpt_control%oe_corr /=
oe_none)
THEN
703 cpabort(
"Orbital-energy-corrected TDDFPT is not implemented for k-points")
705 IF (tddfpt_control%dipole_form /= 0 .AND. &
708 cpabort(
"K-point TDDFPT supports only velocity-form or SCF_MOMENT transition dipoles")
712 IF (tddfpt_control%nstates <= 0)
THEN
714 CALL cp_warn(__location__,
"TDDFPT calculation was requested for "// &
715 trim(nstates_str)//
" excited states: nothing to do.")
719 NULLIFY (tddfpt_print_section)
722 IF (dft_control%nimages > 1)
THEN
723 IF (tddfpt_control%do_exciton_descriptors .OR. &
724 tddfpt_control%do_directional_exciton_descriptors)
THEN
725 cpabort(
"Exciton descriptors are not implemented for k-point TDDFPT")
729 IF (explicit) cpabort(
"NTO analysis is not implemented for k-point TDDFPT")
732 IF (explicit) cpabort(
"NAMD_PRINT is not implemented for k-point TDDFPT")
740 IF (explicit_root)
THEN
746 CALL cp_warn(__location__,
"TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
747 cpabort(
"TDDFPT Input")
754 CALL cp_warn(__location__,
"TDDFPT Kernel with GCP_POTENTIAL not possible.")
755 cpabort(
"TDDFPT Input")
762 CALL cp_warn(__location__,
"TDDFPT Kernel with VDW_POTENTIAL not possible.")
763 cpabort(
"TDDFPT Input")
770 CALL cp_warn(__location__,
"TDDFPT Kernel with WF_CORRELATION not possible.")
771 cpabort(
"TDDFPT Input")
778 CALL cp_warn(__location__,
"TDDFPT Kernel with XC_POTENTIAL not possible.")
779 cpabort(
"TDDFPT Input")
788 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk))
THEN
789 CALL cp_warn(__location__,
"TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
790 cpabort(
"TDDFPT Input")
799 xc_section => xc_root
804 do_hfx = (c_hf /= 0.0_dp)
810 IF (.NOT. same_hfx)
THEN
811 cpabort(
"TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
815 do_admm = do_hfx .AND. dft_control%do_admm
818 CALL cp_abort(__location__, &
819 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
820 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
843 do_hfx = (c_hf /= 0.0_dp)
845 do_admm = do_hfx .AND. dft_control%do_admm
859 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1)
THEN
860 tddfpt_control%rks_triplets = .false.
861 CALL cp_warn(__location__,
"Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
865 IF (tddfpt_control%do_lrigpw)
THEN
870 NULLIFY (hfxsr_section)
874 IF (.NOT. found)
THEN
875 cpabort(
"HFXSR option needs &HF section defined")
877 CALL section_vals_val_get(hfxsr_section,
"INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
878 IF (.NOT. found)
THEN
883 IF (.NOT. found)
THEN
884 CALL section_vals_val_set(hfxsr_section,
"INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
888 CALL cp_abort(__location__,
"Short range TDA kernel with RI not possible")
901 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
902 INTEGER,
INTENT(IN) :: log_unit
907 CHARACTER(LEN=4) :: ktype
910 lsd = (dft_control%nspins > 1)
913 IF (log_unit > 0)
THEN
914 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
915 CALL xc_write(log_unit, xc_section, lsd)
916 IF (tddfpt_control%do_hfx)
THEN
917 IF (tddfpt_control%do_admm)
THEN
918 WRITE (log_unit,
"(T2,A,T62,A19)")
"KERNEL|",
"ADMM Exact Exchange"
919 IF (tddfpt_control%admm_xc_correction)
THEN
920 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Apply ADMM Kernel XC Correction"
922 IF (tddfpt_control%admm_symm)
THEN
923 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Symmetric ADMM Kernel"
926 WRITE (log_unit,
"(T2,A,T67,A14)")
"KERNEL|",
"Exact Exchange"
929 IF (tddfpt_control%do_hfxsr)
THEN
930 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Short range HFX approximation"
932 IF (tddfpt_control%do_hfxlr)
THEN
933 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Long range HFX approximation"
935 IF (tddfpt_control%do_lrigpw)
THEN
936 WRITE (log_unit,
"(T2,A,T42,A39)")
"KERNEL|",
"LRI approximation of transition density"
941 IF (log_unit > 0)
THEN
942 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
943 IF (tddfpt_control%stda_control%do_ewald)
THEN
944 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses Ewald summation"
946 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses direct summation (MIC)"
948 IF (tddfpt_control%stda_control%do_exchange)
THEN
949 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Exact exchange term",
"YES"
950 WRITE (log_unit,
"(T2,A,T71,F10.3)")
"KERNEL| Short range HFX fraction:", &
951 tddfpt_control%stda_control%hfx_fraction
953 WRITE (log_unit,
"(T2,A,T79,A2)")
"KERNEL| Exact exchange term",
"NO"
955 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"KERNEL| Transition density filter", &
956 tddfpt_control%stda_control%eps_td_filter
960 IF (log_unit > 0)
THEN
961 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
967 IF (log_unit > 0)
THEN
968 IF (tddfpt_control%rks_triplets)
THEN
969 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Triplet"
973 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin symmetry of excitations",
"Unrestricted"
976 WRITE (log_unit,
"(T2,A,T72,A9)")
"KERNEL| Spin flip",
"Collinear"
979 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin flip",
"Noncollinear"
982 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Singlet"
984 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of states calculated", tddfpt_control%nstates
985 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of Davidson iterations", tddfpt_control%niters
986 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"TDDFPT| Davidson iteration convergence", tddfpt_control%conv
987 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
990 END SUBROUTINE kernel_info
998 SUBROUTINE tddfpt_kpoint_independent_particle(qs_env, logger, tddfpt_control)
1003 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_kpoint_independent_particle'
1005 COMPLEX(KIND=dp),
ALLOCATABLE, &
1006 DIMENSION(:, :, :, :, :) :: kpoint_dipole
1007 INTEGER :: handle, ideriv, ikp, ikp_local, iocc, ispin, istate, itrans, ivirt, log_unit, &
1008 nao, nkp, nkp_local, nspins, nstates, ntrans_kpoint, ntrans_spin, ntrans_total, &
1009 spin_offset, trans_index
1010 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: inds
1011 INTEGER,
DIMENSION(2) :: kp_range
1012 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1013 INTEGER,
DIMENSION(maxspins) :: homo_spin, nao_spin, nmo_spin, nvirt_spin
1014 LOGICAL :: my_kpgrp, use_scf_moment_dipoles
1015 REAL(kind=
dp) :: checksum, dipole_im, dipole_re, fsum, &
1016 gap, oscillator_factor, spin_factor
1017 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues_kp, evals, &
1018 oscillator_strength, transition_energy
1019 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: transition_dipole_im, &
1020 transition_dipole_re
1021 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, wkp
1022 REAL(kind=
dp),
DIMENSION(nderivs) :: transition_dipole_abs
1025 TYPE(
cp_fm_type) :: fm_dummy, fm_tmp, mo_coeff_im_global, &
1026 mo_coeff_re_global, moment_im, &
1028 TYPE(
cp_fm_type),
POINTER :: mo_coeff_im, mo_coeff_re
1029 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: overlap_deriv
1030 TYPE(
dbcsr_type),
POINTER :: cmatrix, rmatrix
1035 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos_kp
1036 TYPE(
mp_para_env_type),
POINTER :: para_env, para_env_inter_kp, para_env_kp
1038 POINTER :: sab_kp, sab_orb
1041 CALL timeset(routinen, handle)
1043 NULLIFY (blacs_env, blacs_env_all, cell_to_index, cmatrix, dft_control, eigenvalues, &
1044 fm_struct, kp, kp_env, kpoints, ks_env, mo_coeff_im, mo_coeff_re, &
1045 moment_struct, mos_kp, overlap_deriv, para_env, para_env_inter_kp, para_env_kp, &
1046 rmatrix, sab_kp, sab_orb, wkp)
1047 CALL get_qs_env(qs_env, dft_control=dft_control, kpoints=kpoints, ks_env=ks_env, &
1049 cpassert(
ASSOCIATED(kpoints))
1051 CALL get_kpoint_info(kpoints, nkp=nkp, kp_range=kp_range, kp_env=kp_env, &
1052 para_env=para_env, blacs_env_all=blacs_env_all, &
1053 para_env_inter_kp=para_env_inter_kp, para_env_kp=para_env_kp, &
1054 blacs_env=blacs_env, wkp=wkp, cell_to_index=cell_to_index, &
1056 cpassert(
ASSOCIATED(para_env))
1057 cpassert(
ASSOCIATED(para_env_inter_kp))
1058 cpassert(
ASSOCIATED(para_env_kp))
1059 cpassert(
ASSOCIATED(blacs_env_all))
1060 cpassert(
ASSOCIATED(blacs_env))
1061 cpassert(
ASSOCIATED(kp_env))
1062 cpassert(
ASSOCIATED(ks_env))
1063 cpassert(
ASSOCIATED(sab_orb))
1064 cpassert(
ASSOCIATED(sab_kp))
1065 cpassert(
ASSOCIATED(cell_to_index))
1067 nspins = dft_control%nspins
1071 nkp_local = max(0, kp_range(2) - kp_range(1) + 1)
1072 IF (nkp_local > 0)
THEN
1073 kp => kp_env(1)%kpoint_env
1075 cpassert(
ASSOCIATED(mos_kp))
1076 cpassert(
SIZE(mos_kp, 2) == nspins)
1077 DO ispin = 1, nspins
1078 CALL get_mo_set(mos_kp(1, ispin), nmo=nmo_spin(ispin), homo=homo_spin(ispin), &
1079 nao=nao_spin(ispin))
1082 CALL para_env%max(nmo_spin)
1083 CALL para_env%max(homo_spin)
1084 CALL para_env%max(nao_spin)
1087 DO ispin = 1, nspins
1088 nvirt_spin(ispin) = nmo_spin(ispin) - homo_spin(ispin)
1089 IF (homo_spin(ispin) <= 0 .OR. nvirt_spin(ispin) <= 0)
THEN
1090 cpabort(
"At least one occupied and one unoccupied MO are required for k-point TDDFPT")
1092 ntrans_kpoint = ntrans_kpoint + homo_spin(ispin)*nvirt_spin(ispin)
1094 ntrans_total = nkp*ntrans_kpoint
1095 IF (ntrans_total <= 0)
THEN
1096 cpabort(
"No independent-particle k-point transitions available")
1099 ALLOCATE (transition_energy(ntrans_total), transition_dipole_re(ntrans_total, nderivs), &
1100 transition_dipole_im(ntrans_total, nderivs), oscillator_strength(ntrans_total), &
1102 transition_energy = 0.0_dp
1103 transition_dipole_re = 0.0_dp
1104 transition_dipole_im = 0.0_dp
1105 oscillator_strength = 0.0_dp
1107 IF (use_scf_moment_dipoles)
THEN
1108 CALL cp_warn(__location__,
"SCF_MOMENT k-point dipoles use direct SCF MO matrix "// &
1109 "elements; compare folded energy blocks, not individual degenerate states.")
1113 IF (.NOT. use_scf_moment_dipoles)
THEN
1115 basis_type_a=
"ORB", basis_type_b=
"ORB", sab_nl=sab_orb, &
1116 ext_kpoints=kpoints)
1118 ALLOCATE (rmatrix, cmatrix)
1119 CALL dbcsr_create(rmatrix, template=overlap_deriv(1, 1)%matrix, &
1120 matrix_type=dbcsr_type_symmetric)
1121 CALL dbcsr_create(cmatrix, template=overlap_deriv(1, 1)%matrix, &
1122 matrix_type=dbcsr_type_antisymmetric)
1128 my_kpgrp = (ikp >= kp_range(1) .AND. ikp <= kp_range(2))
1130 ikp_local = ikp - kp_range(1) + 1
1131 kp => kp_env(ikp_local)%kpoint_env
1134 NULLIFY (kp, mos_kp)
1137 DO ispin = 1, nspins
1138 nao = nao_spin(ispin)
1139 ALLOCATE (eigenvalues_kp(nmo_spin(ispin)))
1140 eigenvalues_kp = 0.0_dp
1142 IF (.NOT. use_scf_moment_dipoles)
THEN
1144 para_env=para_env, context=blacs_env_all)
1150 ncol_global=nmo_spin(ispin), para_env=para_env, &
1151 context=blacs_env_all)
1158 CALL get_mo_set(mos_kp(1, ispin), eigenvalues=eigenvalues)
1159 cpassert(
ASSOCIATED(eigenvalues))
1160 IF (para_env_kp%is_source())
THEN
1161 eigenvalues_kp(1:nmo_spin(ispin)) = eigenvalues(1:nmo_spin(ispin))
1163 IF (.NOT. use_scf_moment_dipoles)
THEN
1164 CALL get_mo_set(mos_kp(1, ispin), mo_coeff=mo_coeff_re)
1165 CALL get_mo_set(mos_kp(2, ispin), mo_coeff=mo_coeff_im)
1166 cpassert(
ASSOCIATED(mo_coeff_re))
1167 cpassert(
ASSOCIATED(mo_coeff_im))
1171 ELSE IF (.NOT. use_scf_moment_dipoles)
THEN
1175 CALL para_env%sum(eigenvalues_kp)
1177 spin_factor = 1.0_dp
1178 IF (nspins == 1)
THEN
1179 IF (tddfpt_control%rks_triplets)
THEN
1180 spin_factor = 0.0_dp
1182 spin_factor = 2.0_dp
1186 DO ideriv = 1, nderivs
1187 IF (.NOT. use_scf_moment_dipoles)
THEN
1190 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=overlap_deriv, &
1191 ispin=ideriv + 1, xkp=kpoints%xkp(:, ikp), &
1192 cell_to_index=cell_to_index, sab_nl=sab_kp)
1195 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1196 1.0_dp, mo_coeff_re_global, fm_tmp, 0.0_dp, moment_re)
1197 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1198 1.0_dp, mo_coeff_im_global, fm_tmp, 0.0_dp, moment_im)
1201 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1202 1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_im)
1203 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1204 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_re)
1207 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1208 1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_im)
1209 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1210 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_re)
1213 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1214 -1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_re)
1215 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1216 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_im)
1219 DO iocc = 1, homo_spin(ispin)
1220 DO ivirt = homo_spin(ispin) + 1, nmo_spin(ispin)
1221 trans_index = (ikp - 1)*ntrans_kpoint + spin_offset + &
1222 (iocc - 1)*nvirt_spin(ispin) + ivirt - homo_spin(ispin)
1223 gap = eigenvalues_kp(ivirt) - eigenvalues_kp(iocc)
1224 IF (gap <= 0.0_dp)
THEN
1225 cpabort(
"K-point TDDFPT requires positive occupied-virtual energy gaps")
1227 IF (use_scf_moment_dipoles)
THEN
1228 oscillator_factor = sqrt(spin_factor*wkp(ikp))
1229 dipole_re = real(kpoint_dipole(ispin, ikp, ideriv, iocc, ivirt), kind=
dp)
1230 dipole_im = aimag(kpoint_dipole(ispin, ikp, ideriv, iocc, ivirt))
1232 oscillator_factor = sqrt(spin_factor*wkp(ikp))/gap
1236 transition_dipole_re(trans_index, ideriv) = oscillator_factor*dipole_re
1237 transition_dipole_im(trans_index, ideriv) = oscillator_factor*dipole_im
1242 DO iocc = 1, homo_spin(ispin)
1243 DO ivirt = homo_spin(ispin) + 1, nmo_spin(ispin)
1244 trans_index = (ikp - 1)*ntrans_kpoint + spin_offset + &
1245 (iocc - 1)*nvirt_spin(ispin) + ivirt - homo_spin(ispin)
1246 transition_energy(trans_index) = eigenvalues_kp(ivirt) - eigenvalues_kp(iocc)
1247 oscillator_strength(trans_index) = 2.0_dp/3.0_dp*transition_energy(trans_index)* &
1248 sum(transition_dipole_re(trans_index, :)**2 + &
1249 transition_dipole_im(trans_index, :)**2)
1252 IF (.NOT. use_scf_moment_dipoles)
THEN
1259 DEALLOCATE (eigenvalues_kp)
1260 spin_offset = spin_offset + homo_spin(ispin)*nvirt_spin(ispin)
1264 IF (any(transition_energy <= 0.0_dp))
THEN
1265 cpabort(
"K-point TDDFPT KERNEL NONE requires positive occupied-virtual energy gaps")
1268 CALL sort(transition_energy, ntrans_total, inds)
1269 nstates = min(tddfpt_control%nstates, ntrans_total)
1270 IF (tddfpt_control%nstates > ntrans_total)
THEN
1271 cpwarn(
"Requested more TDDFPT states than independent-particle k-point transitions")
1274 ALLOCATE (evals(nstates))
1275 evals(1:nstates) = transition_energy(1:nstates)
1276 checksum = sqrt(sum(evals**2))
1279 IF (log_unit > 0)
THEN
1280 WRITE (log_unit,
"(1X,A)")
"", &
1281 "-------------------------------------------------------------------------------", &
1282 "- TDDFPT K-point Independent-particle Transitions -", &
1283 "-------------------------------------------------------------------------------"
1284 WRITE (log_unit,
"(1X,A)") &
1285 "Only KERNEL NONE is active for k-point TDDFPT; transition dipole magnitudes are shown."
1286 WRITE (log_unit,
'(/,T10,A,T19,A,T37,A,T69,A)')
"State",
"Excitation", &
1287 "Transition dipole (a.u.)",
"Oscillator"
1288 WRITE (log_unit,
'(T10,A,T19,A,T37,A,T49,A,T61,A,T67,A)')
"number",
"energy (eV)", &
1289 "x",
"y",
"z",
"strength (a.u.)"
1290 WRITE (log_unit,
'(T10,72("-"))')
1294 DO istate = 1, nstates
1295 itrans = inds(istate) - 1
1296 ikp = itrans/ntrans_kpoint + 1
1297 itrans = mod(itrans, ntrans_kpoint)
1299 DO ispin = 1, nspins
1300 ntrans_spin = homo_spin(ispin)*nvirt_spin(ispin)
1301 IF (itrans < spin_offset + ntrans_spin)
THEN
1302 itrans = itrans - spin_offset
1303 iocc = itrans/nvirt_spin(ispin) + 1
1304 ivirt = mod(itrans, nvirt_spin(ispin)) + homo_spin(ispin) + 1
1307 spin_offset = spin_offset + ntrans_spin
1310 IF (log_unit > 0)
THEN
1311 transition_dipole_abs(1:nderivs) = &
1312 sqrt(transition_dipole_re(inds(istate), 1:nderivs)**2 + &
1313 transition_dipole_im(inds(istate), 1:nderivs)**2)
1314 WRITE (log_unit,
'(1X,A,T9,I7,T19,F11.5,T31,3(1X,ES11.4E2),T69,ES12.5E2)') &
1315 "TDDFPT|", istate, evals(istate)*
evolt, transition_dipole_abs, &
1316 oscillator_strength(inds(istate))
1317 fsum = fsum + oscillator_strength(inds(istate))**2
1318 WRITE (log_unit,
'(1X,A,T18,I7,T28,I7,T38,I7,T50,I7,T62,I7,T74,F10.5)') &
1319 "TDDFPT_KPOINT|", istate, ikp, ispin, iocc, ivirt, wkp(ikp)
1323 IF (log_unit > 0)
THEN
1324 WRITE (log_unit,
'(/,T2,A,E16.8)')
'TDDFPT : CheckSum E = ', checksum
1325 WRITE (log_unit,
'(T2,A,E16.8)')
'TDDFPT : CheckSum F = ', sqrt(fsum)
1326 WRITE (log_unit,
"(1X,A)") &
1327 "-------------------------------------------------------------------------------"
1330 IF (use_scf_moment_dipoles)
THEN
1331 DEALLOCATE (kpoint_dipole)
1338 DEALLOCATE (evals, inds, oscillator_strength, transition_dipole_im, transition_dipole_re, &
1341 CALL timestop(handle)
1343 END SUBROUTINE tddfpt_kpoint_independent_particle
1371 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
1372 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1373 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1374 kernel_env_admm_aux)
1377 INTEGER :: nstates, nspins
1382 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1383 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
1387 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1392 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ostrength
1393 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1398 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_energies'
1400 CHARACTER(len=20) :: nstates_str
1401 INTEGER :: energy_unit, handle, iter, log_unit, &
1402 niters, nocc, nstate_max, &
1404 LOGICAL :: do_admm, do_exck, do_soc, explicit
1405 REAL(kind=
dp) :: conv
1408 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_oep
1412 CALL timeset(routinen, handle)
1414 NULLIFY (admm_env, matrix_ks_oep)
1415 do_admm = tddfpt_control%do_admm
1416 IF (do_admm)
CALL get_qs_env(qs_env, admm_env=admm_env)
1422 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1423 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
1424 is_rks_triplets=tddfpt_control%rks_triplets, &
1425 qs_env=qs_env, sub_env=sub_env, &
1426 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
1430 IF (tddfpt_control%admm_xc_correction)
THEN
1432 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1433 xc_section=admm_env%xc_section_primary, &
1434 is_rks_triplets=tddfpt_control%rks_triplets, &
1438 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1439 xc_section=xc_section, &
1440 is_rks_triplets=tddfpt_control%rks_triplets, &
1445 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1446 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
1447 local_rho_set=sub_env%local_rho_set_admm, &
1448 qs_env=qs_env, sub_env=sub_env, &
1449 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
1450 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
1451 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
1454 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
1455 xc_section=admm_env%xc_section_aux, &
1456 is_rks_triplets=tddfpt_control%rks_triplets, &
1458 kernel_env%full_kernel => full_kernel_env
1459 kernel_env%admm_kernel => kernel_env_admm_aux
1463 rho_struct_sub=work_matrices%rho_orb_struct_sub, &
1464 xc_section=xc_section, &
1465 is_rks_triplets=tddfpt_control%rks_triplets, &
1467 kernel_env%full_kernel => full_kernel_env
1468 NULLIFY (kernel_env%admm_kernel)
1471 do_exck = tddfpt_control%do_exck
1472 kernel_env%full_kernel%do_exck = do_exck
1475 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
1476 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
1481 IF (tddfpt_control%do_lrigpw)
THEN
1484 tddfpt_print_section)
1496 nstate_max = nocc*nvirt
1497 IF ((
SIZE(gs_mos, 1) == 2) .AND. (tddfpt_control%spinflip ==
no_sf_tddfpt))
THEN
1500 nstate_max = nocc*nvirt + nstate_max
1502 IF (nstates > nstate_max)
THEN
1503 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
1504 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
1505 nstates = nstate_max
1512 IF (tddfpt_control%is_restart .AND. .NOT. do_soc)
THEN
1520 tddfpt_section=tddfpt_section, &
1521 tddfpt_print_section=tddfpt_print_section, &
1522 fm_pool_ao_mo_active=work_matrices%fm_pool_ao_mo_active, &
1523 blacs_env_global=blacs_env)
1531 "GUESS_VECTORS", extension=
".tddfptLog")
1533 gs_mos=gs_mos, log_unit=log_unit, tddfpt_control=tddfpt_control, &
1534 fm_pool_ao_mo_active=work_matrices%fm_pool_ao_mo_active, &
1535 qs_env=qs_env, nspins=nspins)
1537 tddfpt_print_section,
"GUESS_VECTORS")
1540 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1543 niters = tddfpt_control%niters
1544 IF (niters > 0)
THEN
1546 "ITERATION_INFO", extension=
".tddfptLog")
1548 tddfpt_print_section, &
1549 "DETAILED_ENERGY", &
1550 extension=
".tddfptLog")
1552 IF (log_unit > 0)
THEN
1553 WRITE (log_unit,
"(1X,A)")
"", &
1554 "-------------------------------------------------------------------------------", &
1555 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1556 "-------------------------------------------------------------------------------"
1558 WRITE (log_unit,
'(/,T11,A,T27,A,T40,A,T62,A)')
"Step",
"Time",
"Convergence",
"Conv. states"
1559 WRITE (log_unit,
'(1X,79("-"))')
1569 s_evects=s_evects, &
1571 tddfpt_control=tddfpt_control, &
1572 matrix_ks=matrix_ks, &
1574 kernel_env=kernel_env, &
1577 iter_unit=log_unit, &
1578 energy_unit=energy_unit, &
1579 tddfpt_print_section=tddfpt_print_section, &
1580 work_matrices=work_matrices)
1587 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1589 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters)
EXIT
1593 IF (log_unit > 0)
THEN
1594 WRITE (log_unit,
'(1X,25("-"),1X,A,1X,25("-"))')
"Restart Davidson iterations"
1600 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1605 tddfpt_print_section=tddfpt_print_section)
1610 IF (log_unit > 0)
THEN
1612 IF (conv <= tddfpt_control%conv)
THEN
1613 WRITE (log_unit,
"(1X,A)")
"", &
1614 "-------------------------------------------------------------------------------", &
1615 "- TDDFPT run converged in "//trim(nstates_str)//
" iteration(s) ", &
1616 "-------------------------------------------------------------------------------"
1618 WRITE (log_unit,
"(1X,A)")
"", &
1619 "-------------------------------------------------------------------------------", &
1620 "- TDDFPT run did NOT converge after "//trim(nstates_str)//
" iteration(s) ", &
1621 "-------------------------------------------------------------------------------"
1626 tddfpt_print_section,
"DETAILED_ENERGY")
1628 tddfpt_print_section,
"ITERATION_INFO")
1630 CALL cp_warn(__location__, &
1631 "Skipping TDDFPT wavefunction optimization")
1634 IF (
ASSOCIATED(matrix_ks_oep))
THEN
1636 CALL cp_warn(__location__, &
1637 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1638 "when computed using an orbital energy correction XC-potential together with "// &
1639 "the velocity form of dipole transition integrals")
1647 tddfpt_print_section, &
1655 tddfpt_print_section, &
1656 matrix_s(1)%matrix, &
1660 ALLOCATE (ostrength(nstates))
1668 dipole_op_mos_occ, &
1669 tddfpt_control%dipole_form)
1675 matrix_s(1)%matrix, &
1676 tddfpt_control%spinflip, &
1677 min_amplitude=tddfpt_control%min_excitation_amplitude)
1682 matrix_s(1)%matrix, &
1683 tddfpt_print_section)
1684 IF (tddfpt_control%do_exciton_descriptors)
THEN
1689 matrix_s(1)%matrix, &
1690 tddfpt_control%do_directional_exciton_descriptors, &
1694 IF (tddfpt_control%do_lrigpw)
THEN
1697 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1700 CALL timestop(handle)
1732 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1733 tddfpt_control, logger, tddfpt_print_section, &
1734 evects, evals, ostrength, &
1735 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1736 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1737 kernel_env_admm_aux)
1740 INTEGER,
INTENT(in) :: nstates
1745 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1746 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
1750 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1755 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1756 LOGICAL,
INTENT(in) :: lmult_tmp
1760 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_energies'
1762 INTEGER :: handle, ispin, istate, log_unit, mult, &
1765 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_mult, ostrength_mult
1766 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mult
1768 CALL timeset(routinen, handle)
1772 extension=
".tddfptLog")
1775 nspins =
SIZE(gs_mos)
1776 ALLOCATE (evects_mult(nspins, nstates))
1777 ALLOCATE (evals_mult(nstates))
1782 IF (log_unit > 0)
THEN
1783 WRITE (log_unit,
"(1X,A)")
"", &
1784 "-------------------------------------------------------------------------------", &
1785 "- TDDFPT SINGLET ENERGIES -", &
1786 "-------------------------------------------------------------------------------"
1790 IF (log_unit > 0)
THEN
1791 WRITE (log_unit,
"(1X,A)")
"", &
1792 "-------------------------------------------------------------------------------", &
1793 "- TDDFPT TRIPLET ENERGIES -", &
1794 "-------------------------------------------------------------------------------"
1799 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1800 tddfpt_print_section, evects_mult, evals_mult, &
1801 gs_mos, tddfpt_section, s_evects, matrix_s, &
1802 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1803 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1804 kernel_env_admm_aux)
1812 tddfpt_control%do_hfx, &
1813 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1814 tddfpt_control%do_exck, do_sf, qs_env, sub_env)
1817 DO istate = 1, nstates
1818 DO ispin = 1, nspins
1823 DO istate = 1, nstates
1824 DO ispin = 1, nspins
1826 work_matrices%fm_pool_ao_mo_active(ispin)%pool, &
1827 s_evects(ispin, istate))
1831 tddfpt_control%rks_triplets = lmult_tmp
1835 IF (log_unit > 0)
THEN
1836 WRITE (log_unit,
"(1X,A)")
"", &
1837 " singlet excitations finished ", &
1839 "-------------------------------------------------------------------------------", &
1840 "- TDDFPT TRIPLET ENERGIES -", &
1841 "-------------------------------------------------------------------------------"
1845 IF (log_unit > 0)
THEN
1846 WRITE (log_unit,
"(1X,A)")
"", &
1847 " triplet excitations finished ", &
1849 "-------------------------------------------------------------------------------", &
1850 "- TDDFPT SINGLET ENERGIES -", &
1851 "-------------------------------------------------------------------------------"
1856 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1857 tddfpt_print_section, evects, evals, &
1858 gs_mos, tddfpt_section, s_evects, matrix_s, &
1859 kernel_env, matrix_ks, sub_env, ostrength, &
1860 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1861 kernel_env_admm_aux)
1866 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos)
1868 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos)
1872 DO ispin = 1,
SIZE(evects_mult, 1)
1873 DO istate = 1,
SIZE(evects_mult, 2)
1877 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1879 CALL timestop(handle)
1881 END SUBROUTINE tddfpt_soc_energies
1891 SUBROUTINE init_res_method(qs_env, gs_mos, tddfpt_control, tddfpt_section, iounit)
1898 INTEGER,
INTENT(IN) :: iounit
1900 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_res_method'
1902 INTEGER :: handle, i, io, ispin, nao, nmo, nmol, &
1904 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: orblist
1905 INTEGER,
DIMENSION(:),
POINTER :: mollist
1906 LOGICAL :: do_res, do_sf, ew1, ew2, ew3, ewcut, lms
1907 REAL(kind=
dp) :: eclow, ecup, eint, emo
1908 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rvint
1913 CALL timeset(routinen, handle)
1925 nspins =
SIZE(gs_mos)
1926 IF (.NOT. do_res)
THEN
1927 DO ispin = 1, nspins
1928 nmo = gs_mos(ispin)%nmo_occ
1929 tddfpt_control%nactive(ispin) = nmo
1930 gs_mos(ispin)%nmo_active = nmo
1931 ALLOCATE (gs_mos(ispin)%index_active(nmo))
1933 gs_mos(ispin)%index_active(i) = i
1937 IF (iounit > 0)
THEN
1938 WRITE (iounit,
"(/,1X,27('='),A,26('='))")
' REDUCED EXCITATION SPACE '
1943 ewcut = (ew1 .OR. ew2 .OR. ew3)
1947 cpassert(
SIZE(rvint) == 2)
1951 ecup = min(ecup, eint)
1953 eclow = max(eclow, eint)
1954 IF (ewcut .AND. (iounit > 0))
THEN
1955 IF (eclow < -1.e8_dp .AND. ecup > 1.e8_dp)
THEN
1956 WRITE (iounit,
"(1X,A,T51,A10,T71,A10)") &
1957 'Orbital Energy Window [eV]',
" -Inf",
" Inf"
1958 ELSE IF (eclow < -1.e8_dp)
THEN
1959 WRITE (iounit,
"(1X,A,T51,A10,T71,F10.4)") &
1960 'Orbital Energy Window [eV]',
" -Inf",
evolt*ecup
1961 ELSE IF (ecup > 1.e8_dp)
THEN
1962 WRITE (iounit,
"(1X,A,T51,F10.4,T71,A10)") &
1963 'Orbital Energy Window [eV]',
evolt*eclow,
" Inf"
1965 WRITE (iounit,
"(1X,A,T51,F10.4,T71,F10.4)") &
1966 'Orbital Energy Window [eV]',
evolt*eclow,
evolt*ecup
1973 nmol =
SIZE(mollist)
1974 WRITE (iounit,
"(1X,A)")
'List of Selected Molecules'
1975 WRITE (iounit,
"(1X,15(I5))") mollist(1:nmol)
1978 DO ispin = 1, nspins
1979 tddfpt_control%nactive(ispin) = gs_mos(ispin)%nmo_occ
1981 nmo = maxval(tddfpt_control%nactive)
1982 ALLOCATE (orblist(nmo, nspins))
1988 DO ispin = 1, nspins
1989 cpassert(.NOT.
ASSOCIATED(gs_mos(ispin)%evals_occ_matrix))
1991 ELSE IF (ewcut)
THEN
1993 DO ispin = 1, nspins
1994 DO i = 1, gs_mos(ispin)%nmo_occ
1995 emo = gs_mos(ispin)%evals_occ(i)
1996 IF (emo > eclow .AND. emo < ecup) orblist(i, ispin) = 1
2006 cpabort(
"RSE TDA: no active orbitals selected.")
2008 DO ispin = 1, nspins
2009 nmo = sum(orblist(:, ispin))
2010 tddfpt_control%nactive(ispin) = nmo
2011 gs_mos(ispin)%nmo_active = nmo
2012 ALLOCATE (gs_mos(ispin)%index_active(nmo))
2014 DO i = 1,
SIZE(orblist, 1)
2015 IF (orblist(i, ispin) == 1)
THEN
2017 gs_mos(ispin)%index_active(io) = i
2021 DEALLOCATE (orblist)
2026 IF (iounit > 0)
THEN
2027 WRITE (iounit,
"(1X,A)")
'List of Selected States'
2028 IF (nspins == 1)
THEN
2029 WRITE (iounit,
"(A,T67,A)")
' Active State Orbital',
'Orbital Energy'
2030 DO i = 1, gs_mos(1)%nmo_active
2031 io = gs_mos(1)%index_active(i)
2032 WRITE (iounit,
"(T8,I6,T21,I6,T61,F20.4)") i, io, gs_mos(1)%evals_occ(io)*
evolt
2035 DO ispin = 1, nspins
2036 WRITE (iounit,
"(1X,A,I2)")
'Spin ', ispin
2037 WRITE (iounit,
"(A,T67,A)")
' Active State Orbital',
'Orbital Energy'
2038 DO i = 1, gs_mos(ispin)%nmo_active
2039 io = gs_mos(ispin)%index_active(i)
2040 WRITE (iounit,
"(T8,I6,T21,I6,T61,F20.4)") i, io, gs_mos(ispin)%evals_occ(io)*
evolt
2048 cpabort(
"Restricted Active Space with spin flip TDA NYA")
2051 IF (iounit > 0)
THEN
2052 WRITE (iounit,
"(1X,79('='))")
2057 DO ispin = 1, nspins
2060 nmo = gs_mos(ispin)%nmo_active
2061 CALL cp_fm_struct_create(fm_struct, template_fmstruct=gs_mos(ispin)%mos_occ%matrix_struct, &
2062 ncol_global=nmo, context=blacs_env)
2063 NULLIFY (gs_mos(ispin)%mos_active)
2064 ALLOCATE (gs_mos(ispin)%mos_active)
2068 IF (gs_mos(ispin)%nmo_active == gs_mos(ispin)%nmo_occ)
THEN
2069 DO i = 1, gs_mos(ispin)%nmo_active
2070 cpassert(i == gs_mos(ispin)%index_active(i))
2073 nao, nmo, 1, 1, 1, 1)
2075 DO i = 1, gs_mos(ispin)%nmo_active
2076 io = gs_mos(ispin)%index_active(i)
2078 nao, 1, 1, io, 1, i)
2083 CALL timestop(handle)
2085 END SUBROUTINE init_res_method
Contains ADMM methods which require molecular orbitals.
subroutine, public admm_fit_mo_coeffs(admm_env, matrix_s_aux_fit, matrix_s_mixed, mos, mos_aux_fit, geometry_did_change)
...
Types and set/get functions for auxiliary density matrix methods.
subroutine, public get_admm_env(admm_env, mo_derivs_aux_fit, mos_aux_fit, sab_aux_fit, sab_aux_fit_asymm, sab_aux_fit_vs_orb, matrix_s_aux_fit, matrix_s_aux_fit_kp, matrix_s_aux_fit_vs_orb, matrix_s_aux_fit_vs_orb_kp, task_list_aux_fit, matrix_ks_aux_fit, matrix_ks_aux_fit_kp, matrix_ks_aux_fit_im, matrix_ks_aux_fit_dft, matrix_ks_aux_fit_hfx, matrix_ks_aux_fit_dft_kp, matrix_ks_aux_fit_hfx_kp, rho_aux_fit, rho_aux_fit_buffer, admm_dm)
Get routine for the ADMM env.
Define the atomic kind types and their sub types.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public grimme2016
integer, save, public iannuzzi2005
integer, save, public hernandez2025
integer, save, public grimme2013
Handles all functions related to the CELL.
methods related to the blacs parallel environment
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_set(matrix, alpha)
...
Routines that link DBCSR and CP2K concepts together.
subroutine, public cp_dbcsr_alloc_block_from_nbl(matrix, sab_orb, desymmetrize)
allocate the blocks of a dbcsr based on the neighbor list
DBCSR operations in CP2K.
subroutine, public cp_dbcsr_sm_fm_multiply(matrix, fm_in, fm_out, ncol, alpha, beta)
multiply a dbcsr with a fm matrix
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
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_copy_general(source, destination, para_env)
General copy of a fm matrix to another fm matrix. Uses non-blocking MPI rather than ScaLAPACK.
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_get_element(matrix, irow_global, icol_global, alpha, local)
returns an element of a fm this value is valid on every cpu using this call is expensive
subroutine, public cp_fm_to_fm_submat(msource, mtarget, nrow, ncol, s_firstrow, s_firstcol, t_firstrow, t_firstcol)
copy just a part ot the matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
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
Routines needed for kpoint calculation.
subroutine, public rskp_transform(rmatrix, cmatrix, rsmat, ispin, xkp, cell_to_index, sab_nl, is_complex, rs_sign)
Transformation of real space matrices to a kpoint.
Types and basic routines needed for a kpoint calculation.
subroutine, public get_kpoint_info(kpoint, kp_scheme, nkp_grid, kp_shift, symmetry, verbose, full_grid, use_real_wfn, eps_geo, parallel_group_size, kp_range, nkp, xkp, wkp, para_env, blacs_env_all, para_env_kp, para_env_inter_kp, blacs_env, kp_env, kp_aux_env, mpools, iogrp, nkp_groups, kp_dist, cell_to_index, index_to_cell, sab_nl, sab_nl_nosym, inversion_symmetry_only, symmetry_backend, symmetry_reduction_method, gamma_centered)
Retrieve information from a kpoint environment.
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)
...
basic linear algebra operations for full matrixes
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, mimic, 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, matrix_vhxc, 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, xcint_weights, 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.
subroutine, public get_mo_set(mo_set, maxocc, homo, lfomo, nao, nelectron, n_el_f, nmo, eigenvalues, occupation_numbers, mo_coeff, mo_coeff_b, uniform_occupation, kts, mu, flexible_electron_count)
Get the components of a MO set data structure.
Calculates the moment integrals <a|r^m|b> and <a|r x d/dr|b>
subroutine, public qs_moment_kpoints_scf_mos(qs_env, dipole, rcc, nmo_spin_out)
Calculates interband k-point dipoles in the existing SCF MO basis.
Define the neighbor list data types and the corresponding functionality.
Calculation of overlap matrix, its derivatives and forces.
subroutine, public build_overlap_matrix(ks_env, matrix_s, matrixkp_s, matrix_name, nderivative, basis_type_a, basis_type_b, sab_nl, calculate_forces, matrix_p, matrixkp_p, ext_kpoints)
Calculation of the overlap matrix over Cartesian Gaussian functions.
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, tddfpt_section, tddfpt_control, 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_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)
subroutine, public tddfpt_print_summary(log_unit, evects, evals, gs_mos, ostrength, mult, dipole_op_mos_occ, dipole_form)
Print final TDDFPT excitation energies and oscillator strengths.
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.
integer function, public tddfpt_read_restart(evects, evals, gs_mos, logger, tddfpt_section, tddfpt_print_section, fm_pool_ao_mo_active, blacs_env_global)
Initialise initial guess vectors by reading (un-normalised) Ritz vectors from 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, mos_active, 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(evects, evals, gs_mos, log_unit, tddfpt_control, fm_pool_ao_mo_active, qs_env, nspins)
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,...
All kind of helpful little routines.
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.
Keeps information about a specific k-point.
Contains information about kpoints.
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.
calculation environment to calculate the ks matrix, holds all the needed vars. assumes that the core ...
Parallel (sub)group environment.
Ground state molecular orbitals.
Set of temporary ("work") matrices.
Valence state coming from the qs_tddfpt2 routine.