28 dbcsr_type_antisymmetric,&
144#include "./base/base_uses.f90"
150 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_methods'
152 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
154 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
155 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
175 SUBROUTINE tddfpt(qs_env, calc_forces, rixs_env)
177 LOGICAL,
INTENT(IN) :: calc_forces
180 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt'
182 INTEGER :: handle, ispin, istate, log_unit, mult, &
183 my_state, nao, nocc, nspins, &
184 nstate_max, nstates, nvirt, old_state
185 INTEGER,
DIMENSION(maxspins) :: nactive
186 LOGICAL :: do_admm, do_exck, do_hfx, do_hfxlr, &
187 do_hfxsr, do_kpoints, do_rixs, do_sf, &
188 do_soc, lmult_tmp, state_change
189 REAL(kind=
dp) :: gsmin, gsval, xsval
190 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
195 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: my_active, my_mos
196 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ, evects, s_evects
198 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_ks_oep, matrix_s, &
200 matrix_s_aux_fit_vs_orb
205 TYPE(
mo_set_type),
DIMENSION(:),
POINTER :: mos, mos_aux_fit
208 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
212 lri_section, soc_section, &
213 tddfpt_print_section, tddfpt_section, &
223 CALL timeset(routinen, handle)
228 NULLIFY (tddfpt_section, tddfpt_control)
231 dft_control=dft_control, &
233 do_kpoints = dft_control%nimages > 1
237 NULLIFY (rixs_control, valence_state)
238 rixs_control => dft_control%rixs_control
239 tddfpt_control => rixs_control%tddfpt2_control
240 valence_state => rixs_env%valence_state
243 tddfpt_control => dft_control%tddfpt2_control
247 CALL tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, &
248 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, &
249 lri_section, hfxsr_section)
252 extension=
".tddfptLog")
254 tddfpt_control%do_hfx = do_hfx
255 tddfpt_control%do_admm = do_admm
256 tddfpt_control%do_hfxsr = do_hfxsr
257 tddfpt_control%hfxsr_primbas = 0
258 tddfpt_control%hfxsr_re_int = .true.
259 tddfpt_control%do_hfxlr = do_hfxlr
260 tddfpt_control%do_exck = do_exck
263 IF (tddfpt_control%do_hfxlr)
THEN
275 lmult_tmp = tddfpt_control%rks_triplets
276 tddfpt_control%rks_triplets = .NOT. (tddfpt_control%rks_triplets)
286 CALL kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
289 IF (calc_forces)
THEN
290 cpabort(
"TDDFPT forces are not implemented for k-points")
293 cpabort(
"RIXS/TDDFPT is not implemented for k-points")
296 cpabort(
"TDDFPT-SOC is not implemented for k-points")
298 CALL tddfpt_kpoint_independent_particle(qs_env, logger, tddfpt_control)
301 tddfpt_print_section, &
303 CALL timestop(handle)
308 blacs_env=blacs_env, &
310 matrix_ks=matrix_ks, &
320 IF (tddfpt_control%do_smearing)
THEN
327 IF ((tddfpt_control%do_lrigpw) .AND. &
329 CALL cp_abort(__location__,
"LRI only implemented for full kernel")
332 IF (
ASSOCIATED(matrix_ks_oep)) matrix_ks => matrix_ks_oep
336 CALL init_res_method(qs_env, gs_mos, tddfpt_control, tddfpt_section, log_unit)
344 nspins =
SIZE(gs_mos)
347 mult = abs(
SIZE(gs_mos(1)%evals_occ) -
SIZE(gs_mos(2)%evals_occ)) + 1
349 CALL cp_warn(__location__,
"There is a convergence issue for multiplicity >= 3")
352 IF (tddfpt_control%rks_triplets)
THEN
360 ALLOCATE (my_mos(nspins), my_active(nspins))
362 my_mos(ispin) = gs_mos(ispin)%mos_occ
363 my_active(ispin) = gs_mos(ispin)%mos_active
366 mos_occ=my_mos(:), mos_active=my_active(:), &
367 kernel=tddfpt_control%kernel)
368 DEALLOCATE (my_mos, my_active)
372 IF (dft_control%qs_control%xtb)
THEN
373 cpabort(
"TDDFPT: xTB only works with sTDA Kernel")
376 IF (tddfpt_control%do_hfxsr)
THEN
379 i_val=tddfpt_control%hfxsr_primbas)
382 primitive=tddfpt_control%hfxsr_primbas)
384 ALLOCATE (full_kernel_env%admm_control)
390 full_kernel_env%hfxsr_section => hfxsr_section
393 full_kernel_env%admm_control,
"TDA_HFX")
394 CALL get_admm_env(full_kernel_env%admm_env, mos_aux_fit=mos_aux_fit, &
395 matrix_s_aux_fit=matrix_s_aux_fit, &
396 matrix_s_aux_fit_vs_orb=matrix_s_aux_fit_vs_orb)
398 matrix_s_aux_fit_vs_orb, mos, mos_aux_fit, .true.)
400 CALL get_qs_env(qs_env, cell=cell, atomic_kind_set=atomic_kind_set, &
401 qs_kind_set=qs_kind_set, particle_set=particle_set, &
403 CALL hfx_create(full_kernel_env%x_data, para_env, hfxsr_section, atomic_kind_set, &
404 qs_kind_set, particle_set, dft_control, cell, orb_basis=
"TDA_HFX")
408 nstates = tddfpt_control%nstates
418 nstate_max = nocc*nvirt
419 IF (nstates > nstate_max)
THEN
420 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
421 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
423 tddfpt_control%nstates = nstate_max
426 do_hfx, do_admm, do_hfxlr, do_exck, do_sf, qs_env, sub_env)
429 kernel_env%full_kernel => full_kernel_env
430 kernel_env%admm_kernel => kernel_env_admm_aux
431 NULLIFY (kernel_env%stda_kernel)
443 nactive = tddfpt_control%nactive
448 nstates = tddfpt_control%nstates
452 work_matrices, tddfpt_control)
454 kernel_env%stda_kernel => stda_kernel
455 NULLIFY (kernel_env%full_kernel)
456 NULLIFY (kernel_env%admm_kernel)
459 nstates = tddfpt_control%nstates
461 NULLIFY (kernel_env%full_kernel)
462 NULLIFY (kernel_env%admm_kernel)
463 NULLIFY (kernel_env%stda_kernel)
468 ALLOCATE (evects(1, nstates))
470 ALLOCATE (evects(nspins, nstates))
472 ALLOCATE (evals(nstates))
473 ALLOCATE (s_evects(
SIZE(evects, 1), nstates))
475 DO istate = 1, nstates
476 DO ispin = 1,
SIZE(evects, 1)
478 work_matrices%fm_pool_ao_mo_active(ispin)%pool, &
479 s_evects(ispin, istate))
483 IF (.NOT. do_soc)
THEN
486 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
487 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
488 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
491 CALL tddfpt_soc_energies(qs_env, nstates, work_matrices, &
492 tddfpt_control, logger, tddfpt_print_section, &
493 evects, evals, ostrength, &
494 gs_mos, tddfpt_section, s_evects, matrix_s, kernel_env, matrix_ks, &
495 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
500 IF (calc_forces)
THEN
502 tddfpt_print_section, gs_mos, &
503 kernel_env, sub_env, work_matrices)
507 IF (qs_env%excited_state)
THEN
508 IF (sub_env%is_split)
THEN
509 CALL cp_abort(__location__, &
510 "Excited state forces not possible when states"// &
511 " are distributed to different CPU pools.")
514 IF (
ASSOCIATED(matrix_ks_oep))
CALL get_qs_env(qs_env, matrix_ks=matrix_ks)
516 state_change = .false.
517 IF (ex_env%state > 0)
THEN
518 my_state = ex_env%state
519 ELSE IF (ex_env%state < 0)
THEN
521 ALLOCATE (my_mos(nspins))
523 my_mos(ispin) = gs_mos(ispin)%mos_occ
525 my_state = abs(ex_env%state)
526 CALL assign_state(qs_env, matrix_s, evects, my_mos, ex_env%wfn_history, my_state)
528 IF (my_state /= abs(ex_env%state))
THEN
529 state_change = .true.
530 old_state = abs(ex_env%state)
532 ex_env%state = -my_state
534 CALL cp_warn(__location__, &
535 "Active excited state not assigned. Use the first state.")
538 cpassert(my_state > 0)
539 IF (my_state > nstates)
THEN
540 CALL cp_warn(__location__, &
541 "There were not enough excited states calculated.")
542 cpabort(
"excited state potential energy surface")
546 ex_env%evalue = evals(my_state)
549 ALLOCATE (ex_env%evect(
SIZE(evects, 1)))
550 DO ispin = 1,
SIZE(evects, 1)
552 matrix_struct=matrix_struct)
554 CALL cp_fm_to_fm(evects(ispin, my_state), ex_env%evect(ispin))
557 IF (log_unit > 0)
THEN
558 gsval = ex_env%wfn_history%gsval
559 gsmin = ex_env%wfn_history%gsmin
560 xsval = ex_env%wfn_history%xsval
561 WRITE (log_unit,
"(1X,A,T40,F10.6,A,T62,F10.6,A)")
"Ground state orbital alignment:", &
562 gsmin,
"[MinVal]", gsval,
"[Average]"
563 WRITE (log_unit,
"(1X,A,T71,F10.6)")
"Excitation vector alignment:", xsval
564 IF (state_change)
THEN
565 WRITE (log_unit,
"(1X,A,I5,T60,A14,T76,I5)") &
566 "Target state has been changed from state ", &
567 old_state,
" to new state ", my_state
569 WRITE (log_unit,
"(1X,A,I4,A,F12.5,A)")
"Calculate properties for state:", &
570 my_state,
" with excitation energy ", ex_env%evalue*
evolt,
" eV"
574 IF (calc_forces)
THEN
576 sub_env, work_matrices)
583 valence_state%nstates = nstates
584 ALLOCATE (valence_state%evals(
SIZE(evals)))
585 valence_state%evals(:) = evals(:)
587 ALLOCATE (valence_state%evects(nspins, nstates))
588 ALLOCATE (valence_state%mos_active(nspins))
591 DO istate = 1, nstates
593 matrix_struct=matrix_struct)
594 CALL cp_fm_create(valence_state%evects(ispin, istate), matrix_struct)
595 CALL cp_fm_to_fm(evects(ispin, istate), valence_state%evects(ispin, istate))
599 matrix_struct=matrix_struct)
600 CALL cp_fm_create(valence_state%mos_active(ispin), matrix_struct)
601 CALL cp_fm_to_fm(gs_mos(ispin)%mos_active, valence_state%mos_active(ispin))
611 tddfpt_print_section, &
614 DEALLOCATE (evals, ostrength)
618 IF (tddfpt_control%do_lrigpw)
THEN
620 DEALLOCATE (kernel_env%full_kernel%lri_env)
622 DEALLOCATE (kernel_env%full_kernel%lri_density)
630 cpabort(
'Unknown kernel type')
637 DO ispin = nspins, 1, -1
642 IF (
ASSOCIATED(matrix_ks_oep))
THEN
646 CALL timestop(handle)
665 SUBROUTINE tddfpt_input(qs_env, tddfpt_section, tddfpt_control, do_hfx, do_admm, do_exck, &
666 do_hfxsr, do_hfxlr, xc_section, tddfpt_print_section, lri_section, &
671 LOGICAL,
INTENT(INOUT) :: do_hfx, do_admm, do_exck, do_hfxsr, &
674 lri_section, hfxsr_section
676 CHARACTER(len=20) :: nstates_str
677 LOGICAL :: exar, exf, exgcp, exhf, exhfxk, exk, &
678 explicit, explicit_root, expot, exvdw, &
679 exwfn, found, same_hfx, use_real_wfn
680 REAL(kind=
dp) :: c_hf
684 print_sub, xc_root, xc_sub
686 NULLIFY (dft_control, input, kpoints)
687 CALL get_qs_env(qs_env, dft_control=dft_control, input=input, kpoints=kpoints)
689 IF (dft_control%nimages > 1)
THEN
691 cpabort(
"TDDFPT with k-points currently supports only KERNEL NONE")
694 IF (use_real_wfn)
THEN
695 cpabort(
"K-point TDDFPT requires complex wavefunctions")
698 cpabort(
"Spin-flip TDDFPT is not implemented for k-points")
700 IF (tddfpt_control%do_smearing)
THEN
701 cpabort(
"Smeared-occupation TDDFPT is not implemented for k-points")
703 IF (tddfpt_control%oe_corr /=
oe_none)
THEN
704 cpabort(
"Orbital-energy-corrected TDDFPT is not implemented for k-points")
706 IF (tddfpt_control%dipole_form /= 0 .AND. &
709 cpabort(
"K-point TDDFPT supports only velocity-form or SCF_MOMENT transition dipoles")
713 IF (tddfpt_control%nstates <= 0)
THEN
715 CALL cp_warn(__location__,
"TDDFPT calculation was requested for "// &
716 trim(nstates_str)//
" excited states: nothing to do.")
720 NULLIFY (tddfpt_print_section)
723 IF (dft_control%nimages > 1)
THEN
724 IF (tddfpt_control%do_exciton_descriptors .OR. &
725 tddfpt_control%do_directional_exciton_descriptors)
THEN
726 cpabort(
"Exciton descriptors are not implemented for k-point TDDFPT")
730 IF (explicit) cpabort(
"NTO analysis is not implemented for k-point TDDFPT")
733 IF (explicit) cpabort(
"NAMD_PRINT is not implemented for k-point TDDFPT")
741 IF (explicit_root)
THEN
747 CALL cp_warn(__location__,
"TDDFPT Kernel with ADIABATIC_RESCALING not possible.")
748 cpabort(
"TDDFPT Input")
755 CALL cp_warn(__location__,
"TDDFPT Kernel with GCP_POTENTIAL not possible.")
756 cpabort(
"TDDFPT Input")
763 CALL cp_warn(__location__,
"TDDFPT Kernel with VDW_POTENTIAL not possible.")
764 cpabort(
"TDDFPT Input")
771 CALL cp_warn(__location__,
"TDDFPT Kernel with WF_CORRELATION not possible.")
772 cpabort(
"TDDFPT Input")
779 CALL cp_warn(__location__,
"TDDFPT Kernel with XC_POTENTIAL not possible.")
780 cpabort(
"TDDFPT Input")
789 IF ((exf .AND. exk) .OR. .NOT. (exf .OR. exk))
THEN
790 CALL cp_warn(__location__,
"TDDFPT Kernel needs XC_FUNCTIONAL or XC_KERNEL section.")
791 cpabort(
"TDDFPT Input")
800 xc_section => xc_root
805 do_hfx = (c_hf /= 0.0_dp)
811 IF (.NOT. same_hfx)
THEN
812 cpabort(
"TDDFPT Kernel must use the same HF section as DFT%XC or no HF at all.")
816 do_admm = do_hfx .AND. dft_control%do_admm
819 CALL cp_abort(__location__, &
820 "ADMM is not implemented for a TDDFT kernel XC-functional which is different from "// &
821 "the one used for the ground-state calculation. A ground-state 'admm_env' cannot be reused.")
844 do_hfx = (c_hf /= 0.0_dp)
846 do_admm = do_hfx .AND. dft_control%do_admm
860 IF (tddfpt_control%rks_triplets .AND. dft_control%nspins > 1)
THEN
861 tddfpt_control%rks_triplets = .false.
862 CALL cp_warn(__location__,
"Keyword RKS_TRIPLETS has been ignored for spin-polarised calculations")
866 IF (tddfpt_control%do_lrigpw)
THEN
871 NULLIFY (hfxsr_section)
875 IF (.NOT. found)
THEN
876 cpabort(
"HFXSR option needs &HF section defined")
878 CALL section_vals_val_get(hfxsr_section,
"INTERACTION_POTENTIAL%POTENTIAL_TYPE", explicit=found)
879 IF (.NOT. found)
THEN
884 IF (.NOT. found)
THEN
885 CALL section_vals_val_set(hfxsr_section,
"INTERACTION_POTENTIAL%CUTOFF_RADIUS", r_val=7.5589_dp)
889 CALL cp_abort(__location__,
"Short range TDA kernel with RI not possible")
902 SUBROUTINE kernel_info(log_unit, dft_control, tddfpt_control, xc_section)
903 INTEGER,
INTENT(IN) :: log_unit
908 CHARACTER(LEN=4) :: ktype
911 lsd = (dft_control%nspins > 1)
914 IF (log_unit > 0)
THEN
915 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
916 CALL xc_write(log_unit, xc_section, lsd)
917 IF (tddfpt_control%do_hfx)
THEN
918 IF (tddfpt_control%do_admm)
THEN
919 WRITE (log_unit,
"(T2,A,T62,A19)")
"KERNEL|",
"ADMM Exact Exchange"
920 IF (tddfpt_control%admm_xc_correction)
THEN
921 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Apply ADMM Kernel XC Correction"
923 IF (tddfpt_control%admm_symm)
THEN
924 WRITE (log_unit,
"(T2,A,T60,A21)")
"KERNEL|",
"Symmetric ADMM Kernel"
927 WRITE (log_unit,
"(T2,A,T67,A14)")
"KERNEL|",
"Exact Exchange"
930 IF (tddfpt_control%do_hfxsr)
THEN
931 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Short range HFX approximation"
933 IF (tddfpt_control%do_hfxlr)
THEN
934 WRITE (log_unit,
"(T2,A,T43,A38)")
"KERNEL|",
"Long range HFX approximation"
936 IF (tddfpt_control%do_lrigpw)
THEN
937 WRITE (log_unit,
"(T2,A,T42,A39)")
"KERNEL|",
"LRI approximation of transition density"
942 IF (log_unit > 0)
THEN
943 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
944 IF (tddfpt_control%stda_control%do_ewald)
THEN
945 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses Ewald summation"
947 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Coulomb term uses direct summation (MIC)"
949 IF (tddfpt_control%stda_control%do_exchange)
THEN
950 WRITE (log_unit,
"(T2,A,T78,A3)")
"KERNEL| Exact exchange term",
"YES"
951 WRITE (log_unit,
"(T2,A,T71,F10.3)")
"KERNEL| Short range HFX fraction:", &
952 tddfpt_control%stda_control%hfx_fraction
954 WRITE (log_unit,
"(T2,A,T79,A2)")
"KERNEL| Exact exchange term",
"NO"
956 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"KERNEL| Transition density filter", &
957 tddfpt_control%stda_control%eps_td_filter
961 IF (log_unit > 0)
THEN
962 WRITE (log_unit,
"(T2,A,T77,A4)")
"KERNEL|", trim(ktype)
968 IF (log_unit > 0)
THEN
969 IF (tddfpt_control%rks_triplets)
THEN
970 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Triplet"
974 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin symmetry of excitations",
"Unrestricted"
977 WRITE (log_unit,
"(T2,A,T72,A9)")
"KERNEL| Spin flip",
"Collinear"
980 WRITE (log_unit,
"(T2,A,T69,A12)")
"KERNEL| Spin flip",
"Noncollinear"
983 WRITE (log_unit,
"(T2,A,T74,A7)")
"KERNEL| Spin symmetry of excitations",
"Singlet"
985 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of states calculated", tddfpt_control%nstates
986 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Number of Davidson iterations", tddfpt_control%niters
987 WRITE (log_unit,
"(T2,A,T66,E15.3)")
"TDDFPT| Davidson iteration convergence", tddfpt_control%conv
988 WRITE (log_unit,
"(T2,A,T73,I8)")
"TDDFPT| Max. number of Krylov space vectors", tddfpt_control%nkvs
991 END SUBROUTINE kernel_info
999 SUBROUTINE tddfpt_kpoint_independent_particle(qs_env, logger, tddfpt_control)
1004 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_kpoint_independent_particle'
1006 COMPLEX(KIND=dp),
ALLOCATABLE, &
1007 DIMENSION(:, :, :, :, :) :: kpoint_dipole
1008 INTEGER :: handle, ideriv, ikp, ikp_local, iocc, ispin, istate, itrans, ivirt, log_unit, &
1009 nao, nkp, nkp_local, nspins, nstates, ntrans_kpoint, ntrans_spin, ntrans_total, &
1010 spin_offset, trans_index
1011 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: inds
1012 INTEGER,
DIMENSION(2) :: kp_range
1013 INTEGER,
DIMENSION(:, :, :),
POINTER :: cell_to_index
1014 INTEGER,
DIMENSION(maxspins) :: homo_spin, nao_spin, nmo_spin, nvirt_spin
1015 LOGICAL :: my_kpgrp, use_scf_moment_dipoles
1016 REAL(kind=
dp) :: checksum, dipole_im, dipole_re, fsum, &
1017 gap, oscillator_factor, spin_factor
1018 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: eigenvalues_kp, evals, &
1019 oscillator_strength, transition_energy
1020 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: transition_dipole_im, &
1021 transition_dipole_re
1022 REAL(kind=
dp),
DIMENSION(:),
POINTER :: eigenvalues, wkp
1023 REAL(kind=
dp),
DIMENSION(nderivs) :: transition_dipole_abs
1026 TYPE(
cp_fm_type) :: fm_dummy, fm_tmp, mo_coeff_im_global, &
1027 mo_coeff_re_global, moment_im, &
1029 TYPE(
cp_fm_type),
POINTER :: mo_coeff_im, mo_coeff_re
1030 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: overlap_deriv
1031 TYPE(
dbcsr_type),
POINTER :: cmatrix, rmatrix
1036 TYPE(
mo_set_type),
DIMENSION(:, :),
POINTER :: mos_kp
1037 TYPE(
mp_para_env_type),
POINTER :: para_env, para_env_inter_kp, para_env_kp
1039 POINTER :: sab_kp, sab_orb
1042 CALL timeset(routinen, handle)
1044 NULLIFY (blacs_env, blacs_env_all, cell_to_index, cmatrix, dft_control, eigenvalues, &
1045 fm_struct, kp, kp_env, kpoints, ks_env, mo_coeff_im, mo_coeff_re, &
1046 moment_struct, mos_kp, overlap_deriv, para_env, para_env_inter_kp, para_env_kp, &
1047 rmatrix, sab_kp, sab_orb, wkp)
1048 CALL get_qs_env(qs_env, dft_control=dft_control, kpoints=kpoints, ks_env=ks_env, &
1050 cpassert(
ASSOCIATED(kpoints))
1052 CALL get_kpoint_info(kpoints, nkp=nkp, kp_range=kp_range, kp_env=kp_env, &
1053 para_env=para_env, blacs_env_all=blacs_env_all, &
1054 para_env_inter_kp=para_env_inter_kp, para_env_kp=para_env_kp, &
1055 blacs_env=blacs_env, wkp=wkp, cell_to_index=cell_to_index, &
1057 cpassert(
ASSOCIATED(para_env))
1058 cpassert(
ASSOCIATED(para_env_inter_kp))
1059 cpassert(
ASSOCIATED(para_env_kp))
1060 cpassert(
ASSOCIATED(blacs_env_all))
1061 cpassert(
ASSOCIATED(blacs_env))
1062 cpassert(
ASSOCIATED(kp_env))
1063 cpassert(
ASSOCIATED(ks_env))
1064 cpassert(
ASSOCIATED(sab_orb))
1065 cpassert(
ASSOCIATED(sab_kp))
1066 cpassert(
ASSOCIATED(cell_to_index))
1068 nspins = dft_control%nspins
1072 nkp_local = max(0, kp_range(2) - kp_range(1) + 1)
1073 IF (nkp_local > 0)
THEN
1074 kp => kp_env(1)%kpoint_env
1076 cpassert(
ASSOCIATED(mos_kp))
1077 cpassert(
SIZE(mos_kp, 2) == nspins)
1078 DO ispin = 1, nspins
1079 CALL get_mo_set(mos_kp(1, ispin), nmo=nmo_spin(ispin), homo=homo_spin(ispin), &
1080 nao=nao_spin(ispin))
1083 CALL para_env%max(nmo_spin)
1084 CALL para_env%max(homo_spin)
1085 CALL para_env%max(nao_spin)
1088 DO ispin = 1, nspins
1089 nvirt_spin(ispin) = nmo_spin(ispin) - homo_spin(ispin)
1090 IF (homo_spin(ispin) <= 0 .OR. nvirt_spin(ispin) <= 0)
THEN
1091 cpabort(
"At least one occupied and one unoccupied MO are required for k-point TDDFPT")
1093 ntrans_kpoint = ntrans_kpoint + homo_spin(ispin)*nvirt_spin(ispin)
1095 ntrans_total = nkp*ntrans_kpoint
1096 IF (ntrans_total <= 0)
THEN
1097 cpabort(
"No independent-particle k-point transitions available")
1100 ALLOCATE (transition_energy(ntrans_total), transition_dipole_re(ntrans_total, nderivs), &
1101 transition_dipole_im(ntrans_total, nderivs), oscillator_strength(ntrans_total), &
1103 transition_energy = 0.0_dp
1104 transition_dipole_re = 0.0_dp
1105 transition_dipole_im = 0.0_dp
1106 oscillator_strength = 0.0_dp
1108 IF (use_scf_moment_dipoles)
THEN
1109 CALL cp_warn(__location__,
"SCF_MOMENT k-point dipoles use direct SCF MO matrix "// &
1110 "elements; compare folded energy blocks, not individual degenerate states.")
1114 IF (.NOT. use_scf_moment_dipoles)
THEN
1116 basis_type_a=
"ORB", basis_type_b=
"ORB", sab_nl=sab_orb, &
1117 ext_kpoints=kpoints)
1119 ALLOCATE (rmatrix, cmatrix)
1120 CALL dbcsr_create(rmatrix, template=overlap_deriv(1, 1)%matrix, &
1121 matrix_type=dbcsr_type_symmetric)
1122 CALL dbcsr_create(cmatrix, template=overlap_deriv(1, 1)%matrix, &
1123 matrix_type=dbcsr_type_antisymmetric)
1129 my_kpgrp = (ikp >= kp_range(1) .AND. ikp <= kp_range(2))
1131 ikp_local = ikp - kp_range(1) + 1
1132 kp => kp_env(ikp_local)%kpoint_env
1135 NULLIFY (kp, mos_kp)
1138 DO ispin = 1, nspins
1139 nao = nao_spin(ispin)
1140 ALLOCATE (eigenvalues_kp(nmo_spin(ispin)))
1141 eigenvalues_kp = 0.0_dp
1143 IF (.NOT. use_scf_moment_dipoles)
THEN
1145 para_env=para_env, context=blacs_env_all)
1151 ncol_global=nmo_spin(ispin), para_env=para_env, &
1152 context=blacs_env_all)
1159 CALL get_mo_set(mos_kp(1, ispin), eigenvalues=eigenvalues)
1160 cpassert(
ASSOCIATED(eigenvalues))
1161 IF (para_env_kp%is_source())
THEN
1162 eigenvalues_kp(1:nmo_spin(ispin)) = eigenvalues(1:nmo_spin(ispin))
1164 IF (.NOT. use_scf_moment_dipoles)
THEN
1165 CALL get_mo_set(mos_kp(1, ispin), mo_coeff=mo_coeff_re)
1166 CALL get_mo_set(mos_kp(2, ispin), mo_coeff=mo_coeff_im)
1167 cpassert(
ASSOCIATED(mo_coeff_re))
1168 cpassert(
ASSOCIATED(mo_coeff_im))
1172 ELSE IF (.NOT. use_scf_moment_dipoles)
THEN
1176 CALL para_env%sum(eigenvalues_kp)
1178 spin_factor = 1.0_dp
1179 IF (nspins == 1)
THEN
1180 IF (tddfpt_control%rks_triplets)
THEN
1181 spin_factor = 0.0_dp
1183 spin_factor = 2.0_dp
1187 DO ideriv = 1, nderivs
1188 IF (.NOT. use_scf_moment_dipoles)
THEN
1191 CALL rskp_transform(rmatrix=rmatrix, cmatrix=cmatrix, rsmat=overlap_deriv, &
1192 ispin=ideriv + 1, xkp=kpoints%xkp(:, ikp), &
1193 cell_to_index=cell_to_index, sab_nl=sab_kp)
1196 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1197 1.0_dp, mo_coeff_re_global, fm_tmp, 0.0_dp, moment_re)
1198 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1199 1.0_dp, mo_coeff_im_global, fm_tmp, 0.0_dp, moment_im)
1202 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1203 1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_im)
1204 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1205 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_re)
1208 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1209 1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_im)
1210 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1211 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_re)
1214 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1215 -1.0_dp, mo_coeff_re_global, fm_tmp, 1.0_dp, moment_re)
1216 CALL parallel_gemm(
"T",
"N", nmo_spin(ispin), nmo_spin(ispin), nao, &
1217 -1.0_dp, mo_coeff_im_global, fm_tmp, 1.0_dp, moment_im)
1220 DO iocc = 1, homo_spin(ispin)
1221 DO ivirt = homo_spin(ispin) + 1, nmo_spin(ispin)
1222 trans_index = (ikp - 1)*ntrans_kpoint + spin_offset + &
1223 (iocc - 1)*nvirt_spin(ispin) + ivirt - homo_spin(ispin)
1224 gap = eigenvalues_kp(ivirt) - eigenvalues_kp(iocc)
1225 IF (gap <= 0.0_dp)
THEN
1226 cpabort(
"K-point TDDFPT requires positive occupied-virtual energy gaps")
1228 IF (use_scf_moment_dipoles)
THEN
1229 oscillator_factor = sqrt(spin_factor*wkp(ikp))
1230 dipole_re = real(kpoint_dipole(ispin, ikp, ideriv, iocc, ivirt), kind=
dp)
1231 dipole_im = aimag(kpoint_dipole(ispin, ikp, ideriv, iocc, ivirt))
1233 oscillator_factor = sqrt(spin_factor*wkp(ikp))/gap
1237 transition_dipole_re(trans_index, ideriv) = oscillator_factor*dipole_re
1238 transition_dipole_im(trans_index, ideriv) = oscillator_factor*dipole_im
1243 DO iocc = 1, homo_spin(ispin)
1244 DO ivirt = homo_spin(ispin) + 1, nmo_spin(ispin)
1245 trans_index = (ikp - 1)*ntrans_kpoint + spin_offset + &
1246 (iocc - 1)*nvirt_spin(ispin) + ivirt - homo_spin(ispin)
1247 transition_energy(trans_index) = eigenvalues_kp(ivirt) - eigenvalues_kp(iocc)
1248 oscillator_strength(trans_index) = 2.0_dp/3.0_dp*transition_energy(trans_index)* &
1249 sum(transition_dipole_re(trans_index, :)**2 + &
1250 transition_dipole_im(trans_index, :)**2)
1253 IF (.NOT. use_scf_moment_dipoles)
THEN
1260 DEALLOCATE (eigenvalues_kp)
1261 spin_offset = spin_offset + homo_spin(ispin)*nvirt_spin(ispin)
1265 IF (any(transition_energy <= 0.0_dp))
THEN
1266 cpabort(
"K-point TDDFPT KERNEL NONE requires positive occupied-virtual energy gaps")
1269 CALL sort(transition_energy, ntrans_total, inds)
1270 nstates = min(tddfpt_control%nstates, ntrans_total)
1271 IF (tddfpt_control%nstates > ntrans_total)
THEN
1272 cpwarn(
"Requested more TDDFPT states than independent-particle k-point transitions")
1275 ALLOCATE (evals(nstates))
1276 evals(1:nstates) = transition_energy(1:nstates)
1277 checksum = sqrt(sum(evals**2))
1280 IF (log_unit > 0)
THEN
1281 WRITE (log_unit,
"(1X,A)")
"", &
1282 "-------------------------------------------------------------------------------", &
1283 "- TDDFPT K-point Independent-particle Transitions -", &
1284 "-------------------------------------------------------------------------------"
1285 WRITE (log_unit,
"(1X,A)") &
1286 "Only KERNEL NONE is active for k-point TDDFPT; transition dipole magnitudes are shown."
1287 WRITE (log_unit,
'(/,T10,A,T19,A,T37,A,T69,A)')
"State",
"Excitation", &
1288 "Transition dipole (a.u.)",
"Oscillator"
1289 WRITE (log_unit,
'(T10,A,T19,A,T37,A,T49,A,T61,A,T67,A)')
"number",
"energy (eV)", &
1290 "x",
"y",
"z",
"strength (a.u.)"
1291 WRITE (log_unit,
'(T10,72("-"))')
1295 DO istate = 1, nstates
1296 itrans = inds(istate) - 1
1297 ikp = itrans/ntrans_kpoint + 1
1298 itrans = mod(itrans, ntrans_kpoint)
1300 DO ispin = 1, nspins
1301 ntrans_spin = homo_spin(ispin)*nvirt_spin(ispin)
1302 IF (itrans < spin_offset + ntrans_spin)
THEN
1303 itrans = itrans - spin_offset
1304 iocc = itrans/nvirt_spin(ispin) + 1
1305 ivirt = mod(itrans, nvirt_spin(ispin)) + homo_spin(ispin) + 1
1308 spin_offset = spin_offset + ntrans_spin
1311 IF (log_unit > 0)
THEN
1312 transition_dipole_abs(1:nderivs) = &
1313 sqrt(transition_dipole_re(inds(istate), 1:nderivs)**2 + &
1314 transition_dipole_im(inds(istate), 1:nderivs)**2)
1315 WRITE (log_unit,
'(1X,A,T9,I7,T19,F11.5,T31,3(1X,ES11.4E2),T69,ES12.5E2)') &
1316 "TDDFPT|", istate, evals(istate)*
evolt, transition_dipole_abs, &
1317 oscillator_strength(inds(istate))
1318 fsum = fsum + oscillator_strength(inds(istate))**2
1319 WRITE (log_unit,
'(1X,A,T18,I7,T28,I7,T38,I7,T50,I7,T62,I7,T74,F10.5)') &
1320 "TDDFPT_KPOINT|", istate, ikp, ispin, iocc, ivirt, wkp(ikp)
1324 IF (log_unit > 0)
THEN
1325 WRITE (log_unit,
'(/,T2,A,E16.8)')
'TDDFPT : CheckSum E = ', checksum
1326 WRITE (log_unit,
'(T2,A,E16.8)')
'TDDFPT : CheckSum F = ', sqrt(fsum)
1327 WRITE (log_unit,
"(1X,A)") &
1328 "-------------------------------------------------------------------------------"
1331 IF (use_scf_moment_dipoles)
THEN
1332 DEALLOCATE (kpoint_dipole)
1339 DEALLOCATE (evals, inds, oscillator_strength, transition_dipole_im, transition_dipole_re, &
1342 CALL timestop(handle)
1344 END SUBROUTINE tddfpt_kpoint_independent_particle
1372 tddfpt_control, logger, tddfpt_print_section, evects, evals, &
1373 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1374 sub_env, ostrength, dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1375 kernel_env_admm_aux)
1378 INTEGER :: nstates, nspins
1383 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1384 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals
1388 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1393 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: ostrength
1394 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1399 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_energies'
1401 CHARACTER(len=20) :: nstates_str
1402 INTEGER :: energy_unit, handle, iter, log_unit, &
1403 niters, nocc, nstate_max, &
1405 LOGICAL :: do_admm, do_exck, do_soc, explicit
1406 REAL(kind=
dp) :: conv
1409 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks_oep
1415 CALL timeset(routinen, handle)
1417 CALL get_qs_env(qs_env, dft_control=dft_control)
1419 NULLIFY (admm_env, matrix_ks_oep)
1420 do_admm = tddfpt_control%do_admm
1421 IF (do_admm)
CALL get_qs_env(qs_env, admm_env=admm_env)
1427 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1428 rho_xc_struct=work_matrices%rho_xc_struct_sub, &
1429 is_rks_triplets=tddfpt_control%rks_triplets, &
1430 qs_env=qs_env, sub_env=sub_env, &
1431 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub)
1432 IF (dft_control%qs_control%gapw_xc)
THEN
1433 rho0_struct => work_matrices%rho_xc_struct_sub
1435 rho0_struct => work_matrices%rho_orb_struct_sub
1440 IF (tddfpt_control%admm_xc_correction)
THEN
1442 rho_struct_sub=rho0_struct, &
1443 xc_section=admm_env%xc_section_primary, &
1444 is_rks_triplets=tddfpt_control%rks_triplets, &
1445 sub_env=sub_env, qs_env=qs_env)
1448 rho_struct_sub=rho0_struct, &
1449 xc_section=xc_section, &
1450 is_rks_triplets=tddfpt_control%rks_triplets, &
1451 sub_env=sub_env, qs_env=qs_env)
1455 rho_orb_struct=work_matrices%rho_orb_struct_sub, &
1456 rho_aux_fit_struct=work_matrices%rho_aux_fit_struct_sub, &
1457 local_rho_set=sub_env%local_rho_set_admm, &
1458 qs_env=qs_env, sub_env=sub_env, &
1459 wfm_rho_orb=work_matrices%rho_ao_orb_fm_sub, &
1460 wfm_rho_aux_fit=work_matrices%rho_ao_aux_fit_fm_sub, &
1461 wfm_aux_orb=work_matrices%wfm_aux_orb_sub)
1464 rho_struct_sub=work_matrices%rho_aux_fit_struct_sub, &
1465 xc_section=admm_env%xc_section_aux, &
1466 is_rks_triplets=tddfpt_control%rks_triplets, &
1467 sub_env=sub_env, qs_env=qs_env)
1468 kernel_env%full_kernel => full_kernel_env
1469 kernel_env%admm_kernel => kernel_env_admm_aux
1473 rho_struct_sub=rho0_struct, &
1474 xc_section=xc_section, &
1475 is_rks_triplets=tddfpt_control%rks_triplets, &
1476 sub_env=sub_env, qs_env=qs_env)
1477 kernel_env%full_kernel => full_kernel_env
1478 NULLIFY (kernel_env%admm_kernel)
1481 do_exck = tddfpt_control%do_exck
1482 kernel_env%full_kernel%do_exck = do_exck
1485 CALL create_fxc_kernel(work_matrices%rho_orb_struct_sub, work_matrices%fxc_rspace_sub, &
1486 xc_section, tddfpt_control%rks_triplets, sub_env, qs_env)
1491 IF (tddfpt_control%do_lrigpw)
THEN
1494 tddfpt_print_section)
1506 nstate_max = nocc*nvirt
1507 IF ((
SIZE(gs_mos, 1) == 2) .AND. (tddfpt_control%spinflip ==
no_sf_tddfpt))
THEN
1510 nstate_max = nocc*nvirt + nstate_max
1512 IF (nstates > nstate_max)
THEN
1513 cpwarn(
"NUMBER OF EXCITED STATES COULD LEAD TO PROBLEMS!")
1514 cpwarn(
"Experimental: CHANGED NSTATES TO ITS MAXIMUM VALUE!")
1515 nstates = nstate_max
1522 IF (tddfpt_control%is_restart .AND. .NOT. do_soc)
THEN
1530 tddfpt_section=tddfpt_section, &
1531 tddfpt_print_section=tddfpt_print_section, &
1532 fm_pool_ao_mo_active=work_matrices%fm_pool_ao_mo_active, &
1533 blacs_env_global=blacs_env)
1541 "GUESS_VECTORS", extension=
".tddfptLog")
1543 gs_mos=gs_mos, log_unit=log_unit, tddfpt_control=tddfpt_control, &
1544 fm_pool_ao_mo_active=work_matrices%fm_pool_ao_mo_active, &
1545 qs_env=qs_env, nspins=nspins)
1547 tddfpt_print_section,
"GUESS_VECTORS")
1550 gs_mos, evals, tddfpt_control, work_matrices%S_C0)
1553 niters = tddfpt_control%niters
1554 IF (niters > 0)
THEN
1556 "ITERATION_INFO", extension=
".tddfptLog")
1558 tddfpt_print_section, &
1559 "DETAILED_ENERGY", &
1560 extension=
".tddfptLog")
1562 IF (log_unit > 0)
THEN
1563 WRITE (log_unit,
"(1X,A)")
"", &
1564 "-------------------------------------------------------------------------------", &
1565 "- TDDFPT WAVEFUNCTION OPTIMIZATION -", &
1566 "-------------------------------------------------------------------------------"
1568 WRITE (log_unit,
'(/,T11,A,T27,A,T40,A,T62,A)')
"Step",
"Time",
"Convergence",
"Conv. states"
1569 WRITE (log_unit,
'(1X,79("-"))')
1579 s_evects=s_evects, &
1581 tddfpt_control=tddfpt_control, &
1582 matrix_ks=matrix_ks, &
1584 kernel_env=kernel_env, &
1587 iter_unit=log_unit, &
1588 energy_unit=energy_unit, &
1589 tddfpt_print_section=tddfpt_print_section, &
1590 work_matrices=work_matrices)
1597 CALL cp_iterate(logger%iter_info, increment=0, iter_nr_out=iter)
1599 IF ((conv <= tddfpt_control%conv) .OR. iter >= niters)
EXIT
1603 IF (log_unit > 0)
THEN
1604 WRITE (log_unit,
'(1X,25("-"),1X,A,1X,25("-"))')
"Restart Davidson iterations"
1610 CALL cp_iterate(logger%iter_info, increment=0, last=.true.)
1615 tddfpt_print_section=tddfpt_print_section)
1620 IF (log_unit > 0)
THEN
1622 IF (conv <= tddfpt_control%conv)
THEN
1623 WRITE (log_unit,
"(1X,A)")
"", &
1624 "-------------------------------------------------------------------------------", &
1625 "- TDDFPT run converged in "//trim(nstates_str)//
" iteration(s) ", &
1626 "-------------------------------------------------------------------------------"
1628 WRITE (log_unit,
"(1X,A)")
"", &
1629 "-------------------------------------------------------------------------------", &
1630 "- TDDFPT run did NOT converge after "//trim(nstates_str)//
" iteration(s) ", &
1631 "-------------------------------------------------------------------------------"
1636 tddfpt_print_section,
"DETAILED_ENERGY")
1638 tddfpt_print_section,
"ITERATION_INFO")
1640 CALL cp_warn(__location__, &
1641 "Skipping TDDFPT wavefunction optimization")
1644 IF (
ASSOCIATED(matrix_ks_oep))
THEN
1646 CALL cp_warn(__location__, &
1647 "Transition dipole moments and oscillator strengths are likely to be incorrect "// &
1648 "when computed using an orbital energy correction XC-potential together with "// &
1649 "the velocity form of dipole transition integrals")
1657 tddfpt_print_section, &
1665 tddfpt_print_section, &
1666 matrix_s(1)%matrix, &
1670 ALLOCATE (ostrength(nstates))
1678 dipole_op_mos_occ, &
1679 tddfpt_control%dipole_form)
1685 matrix_s(1)%matrix, &
1686 tddfpt_control%spinflip, &
1687 min_amplitude=tddfpt_control%min_excitation_amplitude)
1692 matrix_s(1)%matrix, &
1693 tddfpt_print_section)
1694 IF (tddfpt_control%do_exciton_descriptors)
THEN
1699 matrix_s(1)%matrix, &
1700 tddfpt_control%do_directional_exciton_descriptors, &
1701 tddfpt_control%do_directional_exciton_crosscorrelation, &
1705 IF (tddfpt_control%do_lrigpw)
THEN
1708 tddfpt_lri_env=kernel_env%full_kernel%lri_env)
1711 CALL timestop(handle)
1743 SUBROUTINE tddfpt_soc_energies(qs_env, nstates, work_matrices, &
1744 tddfpt_control, logger, tddfpt_print_section, &
1745 evects, evals, ostrength, &
1746 gs_mos, tddfpt_section, S_evects, matrix_s, kernel_env, matrix_ks, &
1747 sub_env, dipole_op_mos_occ, lmult_tmp, xc_section, full_kernel_env, &
1748 kernel_env_admm_aux)
1751 INTEGER,
INTENT(in) :: nstates
1756 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects
1757 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals, ostrength
1761 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: s_evects
1766 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: dipole_op_mos_occ
1767 LOGICAL,
INTENT(in) :: lmult_tmp
1771 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_energies'
1773 INTEGER :: handle, ispin, istate, log_unit, mult, &
1776 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: evals_mult, ostrength_mult
1777 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:, :) :: evects_mult
1779 CALL timeset(routinen, handle)
1783 extension=
".tddfptLog")
1786 nspins =
SIZE(gs_mos)
1787 ALLOCATE (evects_mult(nspins, nstates))
1788 ALLOCATE (evals_mult(nstates))
1793 IF (log_unit > 0)
THEN
1794 WRITE (log_unit,
"(1X,A)")
"", &
1795 "-------------------------------------------------------------------------------", &
1796 "- TDDFPT SINGLET ENERGIES -", &
1797 "-------------------------------------------------------------------------------"
1801 IF (log_unit > 0)
THEN
1802 WRITE (log_unit,
"(1X,A)")
"", &
1803 "-------------------------------------------------------------------------------", &
1804 "- TDDFPT TRIPLET ENERGIES -", &
1805 "-------------------------------------------------------------------------------"
1810 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1811 tddfpt_print_section, evects_mult, evals_mult, &
1812 gs_mos, tddfpt_section, s_evects, matrix_s, &
1813 kernel_env, matrix_ks, sub_env, ostrength_mult, &
1814 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1815 kernel_env_admm_aux)
1823 tddfpt_control%do_hfx, &
1824 tddfpt_control%do_admm, tddfpt_control%do_hfxlr, &
1825 tddfpt_control%do_exck, do_sf, qs_env, sub_env)
1828 DO istate = 1, nstates
1829 DO ispin = 1, nspins
1834 DO istate = 1, nstates
1835 DO ispin = 1, nspins
1837 work_matrices%fm_pool_ao_mo_active(ispin)%pool, &
1838 s_evects(ispin, istate))
1842 tddfpt_control%rks_triplets = lmult_tmp
1846 IF (log_unit > 0)
THEN
1847 WRITE (log_unit,
"(1X,A)")
"", &
1848 " singlet excitations finished ", &
1850 "-------------------------------------------------------------------------------", &
1851 "- TDDFPT TRIPLET ENERGIES -", &
1852 "-------------------------------------------------------------------------------"
1856 IF (log_unit > 0)
THEN
1857 WRITE (log_unit,
"(1X,A)")
"", &
1858 " triplet excitations finished ", &
1860 "-------------------------------------------------------------------------------", &
1861 "- TDDFPT SINGLET ENERGIES -", &
1862 "-------------------------------------------------------------------------------"
1867 CALL tddfpt_energies(qs_env, nstates, nspins, work_matrices, tddfpt_control, logger, &
1868 tddfpt_print_section, evects, evals, &
1869 gs_mos, tddfpt_section, s_evects, matrix_s, &
1870 kernel_env, matrix_ks, sub_env, ostrength, &
1871 dipole_op_mos_occ, mult, xc_section, full_kernel_env, &
1872 kernel_env_admm_aux)
1877 CALL tddfpt_soc(qs_env, evals_mult, evals, evects_mult, evects, gs_mos)
1879 CALL tddfpt_soc(qs_env, evals, evals_mult, evects, evects_mult, gs_mos)
1883 DO ispin = 1,
SIZE(evects_mult, 1)
1884 DO istate = 1,
SIZE(evects_mult, 2)
1888 DEALLOCATE (evects_mult, evals_mult, ostrength_mult)
1890 CALL timestop(handle)
1892 END SUBROUTINE tddfpt_soc_energies
1902 SUBROUTINE init_res_method(qs_env, gs_mos, tddfpt_control, tddfpt_section, iounit)
1909 INTEGER,
INTENT(IN) :: iounit
1911 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_res_method'
1913 INTEGER :: handle, i, io, ispin, nao, nmo, nmol, &
1915 INTEGER,
ALLOCATABLE,
DIMENSION(:, :) :: orblist
1916 INTEGER,
DIMENSION(:),
POINTER :: mollist
1917 LOGICAL :: do_res, do_sf, ew1, ew2, ew3, ewcut, lms
1918 REAL(kind=
dp) :: eclow, ecup, eint, emo
1919 REAL(kind=
dp),
DIMENSION(:),
POINTER :: rvint
1924 CALL timeset(routinen, handle)
1936 nspins =
SIZE(gs_mos)
1937 IF (.NOT. do_res)
THEN
1938 DO ispin = 1, nspins
1939 nmo = gs_mos(ispin)%nmo_occ
1940 tddfpt_control%nactive(ispin) = nmo
1941 gs_mos(ispin)%nmo_active = nmo
1942 ALLOCATE (gs_mos(ispin)%index_active(nmo))
1944 gs_mos(ispin)%index_active(i) = i
1948 IF (iounit > 0)
THEN
1949 WRITE (iounit,
"(/,1X,27('='),A,26('='))")
' REDUCED EXCITATION SPACE '
1954 ewcut = (ew1 .OR. ew2 .OR. ew3)
1958 cpassert(
SIZE(rvint) == 2)
1962 ecup = min(ecup, eint)
1964 eclow = max(eclow, eint)
1965 IF (ewcut .AND. (iounit > 0))
THEN
1966 IF (eclow < -1.e8_dp .AND. ecup > 1.e8_dp)
THEN
1967 WRITE (iounit,
"(1X,A,T51,A10,T71,A10)") &
1968 'Orbital Energy Window [eV]',
" -Inf",
" Inf"
1969 ELSE IF (eclow < -1.e8_dp)
THEN
1970 WRITE (iounit,
"(1X,A,T51,A10,T71,F10.4)") &
1971 'Orbital Energy Window [eV]',
" -Inf",
evolt*ecup
1972 ELSE IF (ecup > 1.e8_dp)
THEN
1973 WRITE (iounit,
"(1X,A,T51,F10.4,T71,A10)") &
1974 'Orbital Energy Window [eV]',
evolt*eclow,
" Inf"
1976 WRITE (iounit,
"(1X,A,T51,F10.4,T71,F10.4)") &
1977 'Orbital Energy Window [eV]',
evolt*eclow,
evolt*ecup
1984 nmol =
SIZE(mollist)
1985 WRITE (iounit,
"(1X,A)")
'List of Selected Molecules'
1986 WRITE (iounit,
"(1X,15(I5))") mollist(1:nmol)
1989 DO ispin = 1, nspins
1990 tddfpt_control%nactive(ispin) = gs_mos(ispin)%nmo_occ
1992 nmo = maxval(tddfpt_control%nactive)
1993 ALLOCATE (orblist(nmo, nspins))
1999 DO ispin = 1, nspins
2000 cpassert(.NOT.
ASSOCIATED(gs_mos(ispin)%evals_occ_matrix))
2002 ELSE IF (ewcut)
THEN
2004 DO ispin = 1, nspins
2005 DO i = 1, gs_mos(ispin)%nmo_occ
2006 emo = gs_mos(ispin)%evals_occ(i)
2007 IF (emo > eclow .AND. emo < ecup) orblist(i, ispin) = 1
2017 cpabort(
"RSE TDA: no active orbitals selected.")
2019 DO ispin = 1, nspins
2020 nmo = sum(orblist(:, ispin))
2021 tddfpt_control%nactive(ispin) = nmo
2022 gs_mos(ispin)%nmo_active = nmo
2023 ALLOCATE (gs_mos(ispin)%index_active(nmo))
2025 DO i = 1,
SIZE(orblist, 1)
2026 IF (orblist(i, ispin) == 1)
THEN
2028 gs_mos(ispin)%index_active(io) = i
2032 DEALLOCATE (orblist)
2037 IF (iounit > 0)
THEN
2038 WRITE (iounit,
"(1X,A)")
'List of Selected States'
2039 IF (nspins == 1)
THEN
2040 WRITE (iounit,
"(A,T67,A)")
' Active State Orbital',
'Orbital Energy'
2041 DO i = 1, gs_mos(1)%nmo_active
2042 io = gs_mos(1)%index_active(i)
2043 WRITE (iounit,
"(T8,I6,T21,I6,T61,F20.4)") i, io, gs_mos(1)%evals_occ(io)*
evolt
2046 DO ispin = 1, nspins
2047 WRITE (iounit,
"(1X,A,I2)")
'Spin ', ispin
2048 WRITE (iounit,
"(A,T67,A)")
' Active State Orbital',
'Orbital Energy'
2049 DO i = 1, gs_mos(ispin)%nmo_active
2050 io = gs_mos(ispin)%index_active(i)
2051 WRITE (iounit,
"(T8,I6,T21,I6,T61,F20.4)") i, io, gs_mos(ispin)%evals_occ(io)*
evolt
2059 cpabort(
"Restricted Active Space with spin flip TDA NYA")
2062 IF (iounit > 0)
THEN
2063 WRITE (iounit,
"(1X,79('='))")
2068 DO ispin = 1, nspins
2071 nmo = gs_mos(ispin)%nmo_active
2072 CALL cp_fm_struct_create(fm_struct, template_fmstruct=gs_mos(ispin)%mos_occ%matrix_struct, &
2073 ncol_global=nmo, context=blacs_env)
2074 NULLIFY (gs_mos(ispin)%mos_active)
2075 ALLOCATE (gs_mos(ispin)%mos_active)
2079 IF (gs_mos(ispin)%nmo_active == gs_mos(ispin)%nmo_occ)
THEN
2080 DO i = 1, gs_mos(ispin)%nmo_active
2081 cpassert(i == gs_mos(ispin)%index_active(i))
2084 nao, nmo, 1, 1, 1, 1)
2086 DO i = 1, gs_mos(ispin)%nmo_active
2087 io = gs_mos(ispin)%index_active(i)
2089 nao, 1, 1, io, 1, i)
2094 CALL timestop(handle)
2096 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, lattice_fft)
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_kernel_env(kernel_env, xc_section, is_rks_triplets, rho_struct_sub, sub_env, qs_env)
Create kernel 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 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.
superstucture that hold various representations of the density and keeps track of which ones are vali...
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_exciton_descriptors(log_unit, evects, gs_mos, matrix_s, do_directional_exciton_descriptors, do_directional_exciton_crosscorrelation, qs_env)
Print exciton descriptors, cf. Mewes et al., JCTC 14, 710-725 (2018).
subroutine, public tddfpt_print_excitation_analysis(log_unit, evects, evals, gs_mos, matrix_s, spinflip, min_amplitude)
Print excitation analysis.
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 ...
keeps the density in various representations, keeping track of which ones are valid.
Parallel (sub)group environment.
Ground state molecular orbitals.
Set of temporary ("work") matrices.
Valence state coming from the qs_tddfpt2 routine.