94#include "./base/base_uses.f90"
100 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_soc'
102 LOGICAL,
PARAMETER,
PRIVATE :: debug_this_module = .false.
104 INTEGER,
PARAMETER,
PRIVATE :: nderivs = 3
105 INTEGER,
PARAMETER,
PRIVATE :: maxspins = 2
108 TYPE dbcsr_soc_package_type
109 TYPE(dbcsr_type),
POINTER :: dbcsr_sg => null()
110 TYPE(dbcsr_type),
POINTER :: dbcsr_tp => null()
111 TYPE(dbcsr_type),
POINTER :: dbcsr_sc => null()
112 TYPE(dbcsr_type),
POINTER :: dbcsr_sf => null()
113 TYPE(dbcsr_type),
POINTER :: dbcsr_prod => null()
114 TYPE(dbcsr_type),
POINTER :: dbcsr_ovlp => null()
115 TYPE(dbcsr_type),
POINTER :: dbcsr_tmp => null()
116 TYPE(dbcsr_type),
POINTER :: dbcsr_work => null()
117 END TYPE dbcsr_soc_package_type
139 SUBROUTINE tddfpt_soc(qs_env, evals_a, evals_b, evects_a, evects_b, gs_mos)
142 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: evals_a, evals_b
143 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects_a, evects_b
147 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc'
149 INTEGER :: handle, istate, log_unit
154 CALL timeset(routinen, handle)
157 IF (logger%para_env%is_source())
THEN
163 IF (log_unit > 0)
THEN
164 WRITE (log_unit,
"(1X,A)")
"", &
165 "-------------------------------------------------------------------------------", &
166 "- START SOC CALCULATIONS -", &
167 "-------------------------------------------------------------------------------"
170 NULLIFY (dft_control)
171 CALL get_qs_env(qs_env, dft_control=dft_control)
172 do_os = dft_control%uks .OR. dft_control%roks
173 IF (do_os) cpabort(
"SOC only implemented for closed shell.")
175 IF (log_unit > 0)
THEN
176 WRITE (log_unit,
'(A)')
" Starting from TDDFPT Excited States:"
177 WRITE (log_unit,
'(A)')
" STATE SINGLET/eV TRIPLET/eV"
178 DO istate = 1,
SIZE(evals_a)
179 WRITE (log_unit,
'(6X,I3,11X,F10.5,6X,F10.5)') istate, evals_a(istate)*
evolt, evals_b(istate)*
evolt
183 IF (log_unit > 0)
WRITE (log_unit,
'(A)')
" Starting restricted closed shell:"
184 CALL tddfpt_soc_rcs(qs_env, evals_a, evals_b, evects_a, evects_b, log_unit, gs_mos)
186 IF (log_unit > 0)
THEN
187 WRITE (log_unit,
'(A,/,A)')
"SOC Calculation terminated", &
188 "Returning to TDDFPT for Force calculation and deallocations"
191 CALL timestop(handle)
208 SUBROUTINE tddfpt_soc_rcs(qs_env, evals_sing, evals_trip, evects_sing, evects_trip, log_unit, gs_mos)
211 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN),
TARGET :: evals_sing, evals_trip
212 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects_sing, evects_trip
217 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_soc_rcs'
219 CHARACTER(len=3) :: mult
220 INTEGER :: dipole_form, group, handle, iex, ii, &
221 isg, istate, itp, jj, nactive, nao, &
222 nex, npcols, nprows, nsg, ntot, ntp
223 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: evects_sort
224 INTEGER,
DIMENSION(:),
POINTER :: col_blk_size, col_dist, row_blk_size, &
225 row_dist, row_dist_new
226 INTEGER,
DIMENSION(:, :),
POINTER :: pgrid
227 LOGICAL :: print_ev, print_some, print_splitting, &
229 REAL(
dp) :: eps_filter, soc_gst, sqrt2, unit_scale
230 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) ::
diag, tmp_evals
231 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: img_tmp, real_tmp
232 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: gstp_block, mo_soc_x, mo_soc_y, mo_soc_z
236 vec_struct, work_struct
237 TYPE(
cp_fm_type) :: gstp_fm, img_fm, prod_fm, real_fm, &
238 tmp_fm, vec_soc_x, vec_soc_y, &
240 TYPE(
cp_fm_type),
POINTER :: gs_coeffs, tp_coeffs
244 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
245 TYPE(
dbcsr_type),
POINTER :: dbcsr_dummy, dbcsr_ovlp, dbcsr_prod, &
246 dbcsr_sg, dbcsr_tmp, dbcsr_tp, &
247 dbcsr_work, orb_soc_x, orb_soc_y, &
255 CALL timeset(routinen, handle)
257 NULLIFY (logger, pgrid, row_dist, row_dist_new)
258 NULLIFY (col_dist, col_blk_size, row_blk_size, matrix_s)
259 NULLIFY (gstp_struct, tddfpt_print_section, soc_print_section, soc_section)
268 nsg =
SIZE(evals_sing)
269 ntp =
SIZE(evals_trip)
271 ntot = 1 + nsg + 3*ntp
274 CALL inititialize_soc(qs_env, soc_atom_env, soc_env, &
275 evects_sing, evects_trip, dipole_form, gs_mos)
277 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
278 nactive = gs_mos(1)%nmo_active
286 NULLIFY (tp_coeffs, orb_soc_x, orb_soc_y, orb_soc_z)
287 tp_coeffs => soc_env%b_coeff
288 soc_env%evals_a => evals_sing
289 soc_env%evals_b => evals_trip
290 orb_soc_x => soc_env%orb_soc(1)%matrix
291 orb_soc_y => soc_env%orb_soc(2)%matrix
292 orb_soc_z => soc_env%orb_soc(3)%matrix
295 NULLIFY (full_struct)
296 CALL cp_fm_struct_create(full_struct, context=blacs_env, para_env=para_env, nrow_global=ntot, ncol_global=ntot)
309 CALL cp_fm_set_element(real_fm, 1 + itp + ntp + nsg, 1 + itp + ntp + nsg, evals_trip(itp))
310 CALL cp_fm_set_element(real_fm, 1 + itp + 2*ntp + nsg, 1 + itp + 2*ntp + nsg, evals_trip(itp))
314 CALL get_qs_env(qs_env, dbcsr_dist=dbcsr_dist)
316 npcols=npcols, nprows=nprows)
317 ALLOCATE (col_dist(nex), row_dist_new(nex))
319 col_dist(iex) =
modulo(npcols - iex, npcols)
320 row_dist_new(iex) =
modulo(nprows - iex, nprows)
322 ALLOCATE (coeffs_dist, prod_dist)
329 ALLOCATE (col_blk_size(nex))
330 col_blk_size = nactive
333 CALL dbcsr_get_info(matrix_s(1)%matrix, row_blk_size=row_blk_size)
336 ALLOCATE (dbcsr_sg, dbcsr_tp, dbcsr_work, dbcsr_ovlp, dbcsr_tmp, dbcsr_prod)
337 CALL dbcsr_create(matrix=dbcsr_sg, name=
"SINGLETS", matrix_type=dbcsr_type_no_symmetry, &
338 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
339 CALL dbcsr_create(matrix=dbcsr_tp, name=
"TRIPLETS", matrix_type=dbcsr_type_no_symmetry, &
340 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
341 CALL dbcsr_create(matrix=dbcsr_work, name=
"WORK", matrix_type=dbcsr_type_no_symmetry, &
342 dist=coeffs_dist, row_blk_size=row_blk_size, col_blk_size=col_blk_size)
343 CALL dbcsr_create(matrix=dbcsr_prod, name=
"PROD", matrix_type=dbcsr_type_no_symmetry, &
344 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
345 CALL dbcsr_create(matrix=dbcsr_ovlp, name=
"OVLP", matrix_type=dbcsr_type_no_symmetry, &
346 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
349 CALL dbcsr_create(matrix=dbcsr_tmp, name=
"TMP", matrix_type=dbcsr_type_no_symmetry, &
350 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
353 IF (debug_this_module)
THEN
354 ALLOCATE (dbcsr_dummy)
355 CALL dbcsr_create(matrix=dbcsr_dummy, name=
"DUMMY", matrix_type=dbcsr_type_no_symmetry, &
356 dist=prod_dist, row_blk_size=col_blk_size, col_blk_size=col_blk_size)
361 dbcsr_soc_package%dbcsr_sg => dbcsr_sg
362 dbcsr_soc_package%dbcsr_tp => dbcsr_tp
363 dbcsr_soc_package%dbcsr_work => dbcsr_work
364 dbcsr_soc_package%dbcsr_ovlp => dbcsr_ovlp
365 dbcsr_soc_package%dbcsr_prod => dbcsr_prod
366 dbcsr_soc_package%dbcsr_tmp => dbcsr_tmp
373 gs_coeffs => gs_mos(1)%mos_active
380 nrow_global=nactive, ncol_global=nactive)
384 nrow_global=nex, ncol_global=nex)
388 IF (log_unit > 0 .AND. debug_this_module)
THEN
389 WRITE (log_unit,
'(A)')
"Starting Precomputations"
400 ALLOCATE (
diag(nactive))
401 ALLOCATE (mo_soc_x(nactive, nactive), mo_soc_y(nactive, nactive), mo_soc_z(nactive, nactive))
406 nactive, nao, 1.0_dp, &
407 gs_coeffs, vec_soc_x, &
413 nactive, nao, 1.0_dp, &
414 gs_coeffs, vec_soc_y, &
420 nactive, nao, 1.0_dp, &
421 gs_coeffs, vec_soc_z, &
428 IF (log_unit > 0 .AND. debug_this_module)
THEN
429 WRITE (log_unit,
'(A)')
"Starting Ground-State contributions..."
435 nrow_global=ntp*nactive, ncol_global=nactive)
437 ALLOCATE (gstp_block(nactive, nactive))
443 nactive, nao, -1.0_dp, &
444 tp_coeffs, vec_soc_x, &
450 start_row=(itp - 1)*nactive + 1, start_col=1, &
451 n_rows=nactive, n_cols=nactive)
460 IF (debug_this_module .AND. (log_unit > 0))
THEN
461 WRITE (log_unit,
"(A,2F18.6)")
"<0|H_x|T^-1> in Hartree / cm^-1", soc_gst, soc_gst*
wavenumbers
462 WRITE (log_unit,
"(A,2F18.6)")
"<0|H_x|T^+1> in Hartree / cm^-1", soc_gst, soc_gst*
wavenumbers
468 nactive, nao, -1.0_dp, &
469 tp_coeffs, vec_soc_y, &
473 CALL cp_fm_get_submatrix(fm=gstp_fm, target_m=gstp_block, start_row=(itp - 1)*nactive + 1, &
474 start_col=1, n_rows=nactive, n_cols=nactive)
483 IF (debug_this_module .AND. (log_unit > 0))
THEN
484 WRITE (log_unit,
"(A,2F18.6)")
"<0|H_y|T^-1> in Hartree / cm^-1", soc_gst, soc_gst*
wavenumbers
485 WRITE (log_unit,
"(A,2F18.6)")
"<0|H_y|T^+1> in Hartree / cm^-1", soc_gst, soc_gst*
wavenumbers
491 nactive, nao, -1.0_dp, &
492 tp_coeffs, vec_soc_z, &
497 target_m=gstp_block, &
498 start_row=(itp - 1)*nactive + 1, &
503 soc_gst = sqrt2*sum(
diag)
507 IF (debug_this_module .AND. (log_unit > 0))
THEN
508 WRITE (log_unit,
"(A,2F18.6)")
"<0|H_z|T> in Hartree / cm^-1", soc_gst, soc_gst*
wavenumbers
524 DEALLOCATE (gstp_block)
526 IF (log_unit > 0 .AND. debug_this_module)
THEN
527 WRITE (log_unit,
'(A)')
"Starting Singlet-Triplet contributions..."
534 matrix_s(1)%matrix, &
537 filter_eps=eps_filter)
541 0.0_dp, dbcsr_ovlp, &
542 filter_eps=eps_filter)
550 filter_eps=eps_filter)
553 dbcsr_work, 0.0_dp, &
555 filter_eps=eps_filter)
563 pref_trace=-1.0_dp, &
564 pref_overall=-0.5_dp*sqrt2)
576 t_firstcol=1 + nsg + 1)
578 IF (debug_this_module)
THEN
579 WRITE (log_unit,
"(/,A)")
"<S|H_x|T^-1> in Hartree / cm^-1"
594 t_firstcol=1 + nsg + 2*ntp + 1)
596 IF (debug_this_module)
THEN
597 WRITE (log_unit,
"(/,A)")
"<S|H_x|T^+1> in Hartree / cm^-1"
606 orb_soc_y, dbcsr_tp, &
607 0.0_dp, dbcsr_work, &
608 filter_eps=eps_filter)
610 dbcsr_sg, dbcsr_work, &
611 0.0_dp, dbcsr_prod, &
612 filter_eps=eps_filter)
619 pref_trace=-1.0_dp, &
620 pref_overall=-0.5_dp*sqrt2)
631 t_firstcol=1 + nsg + 1)
633 IF (debug_this_module)
THEN
634 WRITE (log_unit,
"(/,A)")
"<S|H_y|T^-1> in Hartree / cm^-1"
648 t_firstcol=1 + nsg + 2*ntp + 1)
650 IF (debug_this_module)
THEN
651 WRITE (log_unit,
"(/,A)")
"<S|H_y|T^+1> in Hartree / cm^-1"
659 orb_soc_z, dbcsr_tp, &
660 0.0_dp, dbcsr_work, &
661 filter_eps=eps_filter)
663 dbcsr_sg, dbcsr_work, &
664 0.0_dp, dbcsr_prod, &
665 filter_eps=eps_filter)
671 pref_trace=-1.0_dp, &
683 t_firstcol=1 + nsg + ntp + 1)
685 IF (debug_this_module)
THEN
686 WRITE (log_unit,
"(/,A)")
"<S|H_z|T^0> in Hartree / cm^-1"
692 IF (log_unit > 0 .AND. debug_this_module)
THEN
693 WRITE (log_unit,
'(A)')
"Starting Triplet-Triplet contributions..."
699 matrix_s(1)%matrix, &
702 filter_eps=eps_filter)
704 dbcsr_tp, dbcsr_work, &
705 0.0_dp, dbcsr_ovlp, &
706 filter_eps=eps_filter)
710 orb_soc_x, dbcsr_tp, &
711 0.0_dp, dbcsr_work, &
712 filter_eps=eps_filter)
714 dbcsr_tp, dbcsr_work, &
715 0.0_dp, dbcsr_prod, &
716 filter_eps=eps_filter)
723 pref_overall=-0.5_dp*sqrt2)
733 t_firstrow=1 + nsg + ntp + 1, &
734 t_firstcol=1 + nsg + 2*ntp + 1)
736 IF (debug_this_module)
THEN
737 WRITE (log_unit,
"(/,A)")
"<T^0|H_x|T^+1> in Hartree / cm^-1"
752 t_firstrow=1 + nsg + 1, &
753 t_firstcol=1 + nsg + ntp + 1)
755 IF (debug_this_module)
THEN
756 WRITE (log_unit,
"(/,A)")
"<T^-1|H_x|T^0> in Hartree / cm^-1"
764 orb_soc_y, dbcsr_tp, &
765 0.0_dp, dbcsr_work, &
766 filter_eps=eps_filter)
768 dbcsr_tp, dbcsr_work, &
769 0.0_dp, dbcsr_prod, &
770 filter_eps=eps_filter)
777 pref_overall=0.5_dp*sqrt2)
786 s_firstcol=1, t_firstrow=1 + nsg + ntp + 1, &
787 t_firstcol=1 + nsg + 2*ntp + 1)
789 IF (debug_this_module)
THEN
790 WRITE (log_unit,
"(/,A)")
"<T^0|H_y|T^+1> in Hartree / cm^-1"
804 s_firstcol=1, t_firstrow=1 + nsg + 1, &
805 t_firstcol=1 + nsg + ntp + 1)
807 IF (debug_this_module)
THEN
808 WRITE (log_unit,
"(/,A)")
"<T^0|H_y|T^+1> in Hartree / cm^-1"
816 orb_soc_z, dbcsr_tp, &
817 0.0_dp, dbcsr_work, &
818 filter_eps=eps_filter)
820 dbcsr_tp, dbcsr_work, &
821 0.0_dp, dbcsr_prod, &
822 filter_eps=eps_filter)
839 t_firstrow=1 + nsg + 2*ntp + 1, &
840 t_firstcol=1 + nsg + 2*ntp + 1)
842 IF (debug_this_module)
THEN
843 WRITE (log_unit,
"(/,A)")
"<T^+1|H_z|T^+1> in Hartree / cm^-1"
857 t_firstrow=1 + nsg + 1, &
858 t_firstcol=1 + nsg + 1)
860 IF (debug_this_module)
THEN
861 WRITE (log_unit,
"(/,A)")
"<T^-1|H_z|T^-1> in Hartree / cm^-1"
871 DEALLOCATE (
diag, mo_soc_x, mo_soc_y, mo_soc_z)
873 IF (log_unit > 0)
THEN
874 WRITE (log_unit,
'(A)')
"Diagonlzing SOC-Matrix"
882 IF (logger%para_env%is_source())
THEN
884 tddfpt_print_section, &
886 extension=
".socme", &
887 file_form=
"FORMATTED", &
888 file_action=
"WRITE", &
889 file_status=
"UNKNOWN")
904 ELSE IF (print_ev)
THEN
907 cpwarn(
"No output unit was selected, printout will be in Hartree!")
914 IF (log_unit > 0)
THEN
915 WRITE (log_unit,
'(A)')
"____________________________________________________"
916 WRITE (log_unit,
'(A)')
" FULL SOC-Matrix "
918 WRITE (log_unit,
'(A)')
"STATE STATE REAL-PART[eV] IMG-PART[eV] "
919 ELSE IF (print_wn)
THEN
920 WRITE (log_unit,
'(A)')
"STATE STATE REAL-PART[cm-1] IMG-PART[cm-1]"
922 WRITE (log_unit,
'(A)')
"STATE STATE REAL-PART[Hartree] IMG-PART[Hartree]"
924 WRITE (log_unit,
'(A)')
"____________________________________________________"
926 ALLOCATE (real_tmp(ntot, ntot), img_tmp(ntot, ntot))
933 IF (log_unit > 0)
THEN
936 WRITE (unit=log_unit, fmt=
"(I3,5X,I3,5X,f16.8,5X,f16.8)") ii, jj, &
937 real_tmp(ii, jj)*unit_scale, &
938 img_tmp(ii, jj)*unit_scale
941 WRITE (log_unit,
'(A)')
" END SOC-MATRIX "
942 WRITE (log_unit,
'(A)')
"____________________________________________________"
943 WRITE (log_unit,
'(A)')
"____________________________________________________"
945 DEALLOCATE (real_tmp, img_tmp)
952 ALLOCATE (tmp_evals(ntot))
957 ALLOCATE (soc_env%soc_evals(ntot - 1))
958 soc_env%soc_evals(:) = tmp_evals(2:ntot) - tmp_evals(1)
961 IF (logger%para_env%is_source())
THEN
967 IF (log_unit > 0)
THEN
968 WRITE (log_unit,
'(A27,6X,F18.10)')
"Ground state stabilisation:", (soc_env%soc_evals(1)*unit_scale)
969 IF (debug_this_module)
THEN
970 WRITE (log_unit,
'(A)')
"Calculation Dipole Moments"
975 soc_env%evals_a => evals_sing
976 soc_env%evals_b => evals_trip
977 CALL soc_dipol(qs_env, dbcsr_soc_package, soc_env, &
978 evecs_cfm, eps_filter, dipole_form, gs_mos, &
979 evects_sing, evects_trip)
983 IF (logger%para_env%is_source())
THEN
989 IF (log_unit > 0)
THEN
990 WRITE (log_unit,
'(A)')
"------------------------------------------------------------------------------"
991 WRITE (log_unit,
'(A)')
"- SOC CORRECTED SPECTRUM -"
992 WRITE (log_unit,
'(A)')
"------------------------------------------------------------------------------"
994 WRITE (log_unit,
'(A)')
"- STATE SOC-corrected exc. energies [eV] Oscillator strengths [a.u.] -"
995 ELSE IF (print_wn)
THEN
996 WRITE (log_unit,
'(A)')
"- STATE SOC-corrected exc. energies [cm-1] Oscillator strengths [a.u.]-"
998 WRITE (log_unit,
'(A)')
"- STATE SOC-corrected exc.energies [Hartree] Oscillator strengths [a.u.]-"
1000 WRITE (log_unit,
'(A)')
"------------------------------------------------------------------------------"
1001 DO istate = 1,
SIZE(soc_env%soc_evals)
1002 WRITE (log_unit,
'(6X,I5,11X,2F16.5)') istate, soc_env%soc_evals(istate)*unit_scale, &
1003 soc_env%soc_osc(istate)
1006 WRITE (log_unit,
'(A,F18.8)')
"TDDFT+SOC : CheckSum (eV) ", sum(soc_env%soc_evals)*
evolt
1012 IF (print_splitting .OR. debug_this_module)
THEN
1014 IF (log_unit > 0)
THEN
1015 WRITE (log_unit,
'(A)')
"-----------------------------------------------------------------------------"
1016 WRITE (log_unit,
'(A)')
"- Splittings -"
1017 WRITE (log_unit,
'(A)')
"-----------------------------------------------------------------------------"
1019 WRITE (log_unit,
'(A)')
"- STATE exc.energies[eV] splittings[eV] -"
1020 ELSE IF (print_wn)
THEN
1021 WRITE (log_unit,
'(A)')
"- STATE exc.energies[cm-1] splittings[cm-1] -"
1023 WRITE (log_unit,
'(A)')
"- STATE exc.energies[Hartree] splittings[Hartree] -"
1025 WRITE (log_unit,
'(A)')
"-----------------------------------------------------------------------------"
1027 DO iex = 1,
SIZE(soc_env%soc_evals)
1028 IF (evects_sort(iex + 1) > nsg + ntp*2 + 1)
THEN
1030 ELSE IF (evects_sort(iex + 1) > nsg + ntp + 1)
THEN
1032 ELSE IF (evects_sort(iex + 1) > nsg + 1)
THEN
1037 IF (mult ==
"T-1")
THEN
1038 WRITE (log_unit,
"(5X,A,I5,6X,F18.10,6X,F18.10)") mult, &
1039 evects_sort(iex + 1) - (1 + nsg), soc_env%soc_evals(iex)*unit_scale, &
1040 (soc_env%soc_evals(iex) - evals_trip(evects_sort(iex + 1) - (1 + nsg)))*unit_scale
1041 ELSE IF (mult ==
"T0")
THEN
1042 WRITE (log_unit,
"(5X,A,I5,6X,F18.10,6X,F18.10)") mult, &
1043 evects_sort(iex + 1) - (1 + nsg + ntp), soc_env%soc_evals(iex)*unit_scale, &
1044 (soc_env%soc_evals(iex) - evals_trip(evects_sort(iex + 1) - (1 + nsg + ntp)))*unit_scale
1045 ELSE IF (mult ==
"T+1")
THEN
1046 WRITE (log_unit,
"(5X,A,I5,6X,F18.10,6X,F18.10)") mult, &
1047 evects_sort(iex + 1) - (1 + nsg + ntp*2), soc_env%soc_evals(iex)*unit_scale, &
1048 (soc_env%soc_evals(iex) - evals_trip(evects_sort(iex + 1) - (1 + nsg + ntp*2)))*unit_scale
1049 ELSE IF (mult ==
"S ")
THEN
1050 WRITE (log_unit,
"(5X,A,I5,6X,F18.10,6X,F18.10)") mult, &
1051 evects_sort(iex + 1), soc_env%soc_evals(iex)*unit_scale, &
1052 (soc_env%soc_evals(iex) - evals_sing(evects_sort(iex + 1) - 1))*unit_scale
1055 WRITE (log_unit,
'(A)')
"----------------------------------------------------------------------------"
1056 DEALLOCATE (evects_sort)
1073 IF (debug_this_module)
THEN
1075 DEALLOCATE (dbcsr_dummy)
1078 DEALLOCATE (dbcsr_work, dbcsr_prod, dbcsr_ovlp, dbcsr_tmp)
1079 DEALLOCATE (coeffs_dist, prod_dist, col_dist, col_blk_size, row_dist_new)
1080 DEALLOCATE (dbcsr_sg, dbcsr_tp, tmp_evals)
1082 CALL timestop(handle)
1084 END SUBROUTINE tddfpt_soc_rcs
1096 SUBROUTINE inititialize_soc(qs_env, soc_atom_env, soc_env, &
1097 evects_a, evects_b, &
1098 dipole_form, gs_mos)
1103 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects_a, evects_b
1104 INTEGER :: dipole_form
1106 INTENT(in) :: gs_mos
1108 CHARACTER(LEN=*),
PARAMETER :: routinen =
'inititialize_soc'
1110 CHARACTER(len=default_string_length), &
1111 ALLOCATABLE,
DIMENSION(:, :) :: grid_info
1112 CHARACTER(len=default_string_length), &
1113 DIMENSION(:),
POINTER :: k_list
1114 INTEGER :: handle, i, ikind, irep, ispin, nactive, &
1115 nao, natom, nkind, nrep, nspins, &
1117 LOGICAL :: all_potential_present, do_os
1120 TYPE(
cp_fm_type),
POINTER :: a_coeff, b_coeff
1126 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1130 CALL timeset(routinen, handle)
1132 NULLIFY (qs_kind_set, particle_set, blacs_env, para_env, &
1133 a_coeff, b_coeff, tddfpt_control, soc_section)
1140 CALL get_qs_env(qs_env, qs_kind_set=qs_kind_set, &
1141 mos=mos, natom=natom, &
1142 particle_set=particle_set, blacs_env=blacs_env, &
1143 para_env=para_env, matrix_s=matrix_s, &
1144 dft_control=dft_control)
1147 tddfpt_control => dft_control%tddfpt2_control
1148 dipole_form = tddfpt_control%dipole_form
1154 ALLOCATE (grid_info(nrep, 3))
1160 grid_info(irep, :) = k_list
1165 nspins =
SIZE(evects_a, 1)
1166 DO ispin = 1, nspins
1167 CALL cp_fm_get_info(evects_a(ispin, 1), nrow_global=nao, ncol_global=nactive)
1172 nstates =
SIZE(evects_a, 2)
1174 a_coeff => soc_env%a_coeff
1175 b_coeff => soc_env%b_coeff
1179 nrow_global=nao, ncol_global=nspins*nactive*nstates)
1187 ALLOCATE (soc_env%orb_soc(3))
1189 ALLOCATE (soc_env%orb_soc(i)%matrix)
1196 soc_atom_env%nspins = 2
1198 soc_atom_env%nspins = 1
1201 nkind =
SIZE(qs_kind_set)
1202 ALLOCATE (soc_atom_env%grid_atom_set(nkind))
1203 ALLOCATE (soc_atom_env%harmonics_atom_set(nkind))
1204 ALLOCATE (soc_atom_env%orb_sphi_so(nkind))
1206 CALL get_qs_kind_set(qs_kind_set, all_potential_present=all_potential_present)
1207 IF (.NOT. all_potential_present)
THEN
1213 CALL init_atom_grid(soc_atom_env, grid_info, qs_env)
1216 NULLIFY (soc_atom_env%orb_sphi_so(ikind)%array)
1217 CALL compute_sphi_so(ikind,
"ORB", soc_atom_env%orb_sphi_so(ikind)%array, qs_env)
1220 DEALLOCATE (grid_info)
1222 CALL timestop(handle)
1224 END SUBROUTINE inititialize_soc
1233 SUBROUTINE init_atom_grid(soc_atom_env, grid_info, qs_env)
1236 CHARACTER(len=default_string_length), &
1237 ALLOCATABLE,
DIMENSION(:, :) :: grid_info
1240 CHARACTER(LEN=*),
PARAMETER :: routinen =
'init_atom_grid'
1242 CHARACTER(LEN=default_string_length) :: kind_name
1243 INTEGER :: handle, igrid, ikind, il, iso, iso1, iso2, l1, l1l2, l2, la, lc1, lc2, lcleb, ll, &
1244 llmax, lp, m1, m2, max_s_harm, max_s_set, maxl, maxlgto, maxs, mm, mp, na, nr, &
1246 REAL(
dp) :: kind_radius
1247 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: rga
1248 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: my_cg
1254 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1256 CALL timeset(routinen, handle)
1258 NULLIFY (my_cg, qs_kind_set, dft_control, qs_control)
1259 NULLIFY (grid_atom, harmonics, tmp_basis)
1263 qs_kind_set=qs_kind_set, &
1264 dft_control=dft_control)
1267 qs_control => dft_control%qs_control
1270 IF (maxlgto < 0)
THEN
1271 cpabort(
"tmp_basis is not Present!")
1276 max_s_harm =
nsoset(llmax)
1277 max_s_set =
nsoset(maxlgto)
1282 CALL reallocate(my_cg, 1, max_s_set, 1, max_s_set, 1, max_s_harm)
1284 ALLOCATE (rga(lcleb, 2))
1294 IF (l1 + l2 > llmax)
THEN
1301 IF (m1*m2 < 0 .OR. (m1*m2 == 0 .AND. (m1 < 0 .OR. m2 < 0)))
THEN
1308 DO lp = mod(l1 + l2, 2), l1l2, 2
1310 IF (abs(mp) <= lp)
THEN
1312 iso =
nsoset(lp - 1) + lp + 1 + mp
1314 iso =
nsoset(lp - 1) + lp + 1 - abs(mp)
1316 my_cg(iso1, iso2, iso) = rga(il, 1)
1318 IF (mp /= mm .AND. abs(mm) <= lp)
THEN
1320 iso =
nsoset(lp - 1) + lp + 1 + mm
1322 iso =
nsoset(lp - 1) + lp + 1 - abs(mm)
1324 my_cg(iso1, iso2, iso) = rga(il, 2)
1336 quadrature = qs_control%gapw_control%quadrature
1338 DO ikind = 1,
SIZE(soc_atom_env%grid_atom_set)
1341 NULLIFY (soc_atom_env%grid_atom_set(ikind)%grid_atom)
1342 NULLIFY (soc_atom_env%harmonics_atom_set(ikind)%harmonics_atom)
1345 soc_atom_env%harmonics_atom_set(ikind)%harmonics_atom)
1347 NULLIFY (grid_atom, harmonics)
1348 grid_atom => soc_atom_env%grid_atom_set(ikind)%grid_atom
1349 harmonics => soc_atom_env%harmonics_atom_set(ikind)%harmonics_atom
1358 DO igrid = 1,
SIZE(grid_info, 1)
1359 IF (grid_info(igrid, 1) == kind_name)
THEN
1360 READ (grid_info(igrid, 2), *, iostat=stat) na
1361 IF (stat /= 0) cpabort(
"The 'na' value for the GRID keyword must be an integer")
1362 READ (grid_info(igrid, 3), *, iostat=stat) nr
1363 IF (stat /= 0) cpabort(
"The 'nr' value for the GRID keyword must be an integer")
1371 grid_atom%ng_sphere = na
1376 basis_set=tmp_basis, &
1380 kind_radius=kind_radius)
1393 CALL get_maxl_cg(harmonics, tmp_basis, llmax, max_s_harm)
1399 CALL timestop(handle)
1401 END SUBROUTINE init_atom_grid
1415 SUBROUTINE soc_dipol(qs_env, dbcsr_soc_package, soc_env, &
1416 soc_evecs_cfm, eps_filter, dipole_form, gs_mos, &
1417 evects_sing, evects_trip)
1419 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
1422 REAL(
dp),
INTENT(IN) :: eps_filter
1423 INTEGER :: dipole_form
1426 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects_sing, evects_trip
1428 CHARACTER(len=*),
PARAMETER :: routinen =
'soc_dipol'
1430 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:, :) :: transdip
1431 INTEGER :: handle, i, nosc, ntot
1432 REAL(
dp),
DIMENSION(:),
POINTER :: osc_str, soc_evals
1434 TYPE(
cp_cfm_type) :: dip_cfm, work1_cfm, work2_cfm
1436 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: amew_dip
1439 CALL timeset(routinen, handle)
1441 NULLIFY (para_env, blacs_env, dip_struct, full_struct, osc_str)
1444 CALL get_qs_env(qs_env, para_env=para_env, blacs_env=blacs_env)
1446 soc_evals => soc_env%soc_evals
1447 nosc =
SIZE(soc_evals)
1449 ALLOCATE (soc_env%soc_osc(nosc))
1450 osc_str => soc_env%soc_osc
1455 context=blacs_env, para_env=para_env, &
1456 nrow_global=ntot, ncol_global=1)
1463 ALLOCATE (transdip(ntot, 1))
1465 CALL get_rcs_amew_op(amew_dip, soc_env, dbcsr_soc_package, &
1466 eps_filter, qs_env, gs_mos, &
1467 evects_sing, evects_trip)
1472 CALL cp_fm_to_cfm(msourcer=amew_dip(i), mtarget=work1_cfm)
1493 osc_str(:) = osc_str(:) + real(transdip(2:ntot, 1))**2 + aimag(transdip(2:ntot, 1))**2
1499 osc_str(:) = 2.0_dp/3.0_dp*soc_evals(:)*osc_str(:)
1501 osc_str(:) = 2.0_dp/3.0_dp*soc_evals(:)*osc_str(:)
1512 DEALLOCATE (amew_dip, transdip)
1514 CALL timestop(handle)
1516 END SUBROUTINE soc_dipol
1529 SUBROUTINE get_rcs_amew_op(amew_op, soc_env, dbcsr_soc_package, eps_filter, qs_env, gs_mos, &
1530 evects_sing, evects_trip)
1532 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:), &
1533 INTENT(OUT) :: amew_op
1535 TYPE(dbcsr_soc_package_type) :: dbcsr_soc_package
1536 REAL(
dp),
INTENT(IN) :: eps_filter
1540 TYPE(
cp_fm_type),
DIMENSION(:, :),
INTENT(IN) :: evects_sing, evects_trip
1542 CHARACTER(len=*),
PARAMETER :: routinen =
'get_rcs_amew_op'
1544 INTEGER :: dim_op, handle, i, isg, nactive, nao, &
1547 REAL(
dp) :: op, sqrt2
1548 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) ::
diag, gs_diag, gsgs_op
1549 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: mo_op, sggs_block
1552 std_struct, tmp_struct
1553 TYPE(
cp_fm_type) :: gs_fm, sggs_fm, tmp_fm, vec_op, work_fm
1555 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: ao_op, matrix_s
1556 TYPE(
dbcsr_type),
POINTER :: ao_op_i, dbcsr_ovlp, dbcsr_prod, &
1557 dbcsr_sg, dbcsr_tmp, dbcsr_tp, &
1561 CALL timeset(routinen, handle)
1565 NULLIFY (para_env, blacs_env)
1566 NULLIFY (full_struct, gsgs_struct, std_struct, tmp_struct, sggs_struct)
1567 NULLIFY (ao_op_i, ao_op)
1568 NULLIFY (dbcsr_tp, dbcsr_sg, dbcsr_ovlp, dbcsr_work, dbcsr_tmp, dbcsr_prod)
1572 IF (
ASSOCIATED(soc_env%dipmat))
THEN
1573 ao_op => soc_env%dipmat
1576 ao_op => soc_env%dipmat_ao
1579 nsg =
SIZE(soc_env%evals_a)
1580 ntp = nsg; nex = nsg
1581 ntot = 1 + nsg + 3*ntp
1583 CALL get_qs_env(qs_env, matrix_s=matrix_s, para_env=para_env, blacs_env=blacs_env)
1584 sqrt2 = sqrt(2.0_dp)
1585 dim_op =
SIZE(ao_op)
1587 dbcsr_sg => dbcsr_soc_package%dbcsr_sg
1588 dbcsr_tp => dbcsr_soc_package%dbcsr_tp
1589 dbcsr_work => dbcsr_soc_package%dbcsr_work
1590 dbcsr_prod => dbcsr_soc_package%dbcsr_prod
1591 dbcsr_ovlp => dbcsr_soc_package%dbcsr_ovlp
1592 dbcsr_tmp => dbcsr_soc_package%dbcsr_tmp
1596 context=blacs_env, para_env=para_env, &
1597 nrow_global=ntot, ncol_global=ntot)
1598 ALLOCATE (amew_op(dim_op))
1600 CALL cp_fm_create(amew_op(i), full_struct, set_zero=.true.)
1604 nactive = gs_mos(1)%nmo_active
1605 gs_coeffs => gs_mos(1)%mos_active
1606 CALL cp_fm_get_info(gs_coeffs, matrix_struct=std_struct, nrow_global=nao)
1609 context=blacs_env, para_env=para_env, &
1610 nrow_global=nactive, ncol_global=nactive)
1615 ALLOCATE (gsgs_op(dim_op))
1616 ALLOCATE (gs_diag(nactive))
1620 ao_op_i => ao_op(i)%matrix
1623 1.0_dp, gs_coeffs, work_fm, 0.0_dp, gs_fm)
1625 gsgs_op(i) = 2.0_dp*sum(gs_diag)
1628 DEALLOCATE (gs_diag)
1637 context=blacs_env, para_env=para_env, &
1638 nrow_global=nex, ncol_global=nex)
1640 context=blacs_env, para_env=para_env, &
1641 nrow_global=nactive*nsg, ncol_global=nactive)
1647 ALLOCATE (
diag(nactive))
1648 ALLOCATE (mo_op(nactive, nactive))
1649 ALLOCATE (sggs_block(nactive, nactive))
1655 ao_op_i => ao_op(i)%matrix
1666 CALL dip_vel_op(soc_env, qs_env, evects_sing, dbcsr_prod, i, .false., &
1670 1.0_dp, soc_env%a_coeff, vec_op, 0.0_dp, sggs_fm)
1675 target_m=sggs_block, &
1676 start_row=(isg - 1)*nactive + 1, &
1681 op = sqrt2*sum(
diag)
1688 matrix_s(1)%matrix, dbcsr_sg, &
1689 0.0_dp, dbcsr_work, &
1690 filter_eps=eps_filter)
1692 dbcsr_sg, dbcsr_work, &
1693 0.0_dp, dbcsr_ovlp, &
1694 filter_eps=eps_filter)
1697 CALL dip_vel_op(soc_env, qs_env, evects_sing, dbcsr_prod, i, .false.)
1701 ao_op_i, dbcsr_sg, &
1702 0.0_dp, dbcsr_work, &
1703 filter_eps=eps_filter)
1705 dbcsr_sg, dbcsr_work, &
1706 0.0_dp, dbcsr_prod, &
1707 filter_eps=eps_filter)
1715 pref_trace=-1.0_dp, &
1716 pref_overall=1.0_dp, &
1717 pref_diags=gsgs_op(i), &
1722 mtarget=amew_op(i), &
1733 matrix_s(1)%matrix, &
1736 filter_eps=eps_filter)
1738 dbcsr_tp, dbcsr_work, &
1739 0.0_dp, dbcsr_ovlp, &
1740 filter_eps=eps_filter)
1744 CALL dip_vel_op(soc_env, qs_env, evects_trip, dbcsr_prod, i, .true.)
1747 ao_op_i, dbcsr_tp, &
1748 0.0_dp, dbcsr_work, &
1749 filter_eps=eps_filter)
1751 dbcsr_tp, dbcsr_work, &
1752 0.0_dp, dbcsr_prod, &
1753 filter_eps=eps_filter)
1760 pref_trace=-1.0_dp, &
1761 pref_overall=1.0_dp, &
1762 pref_diags=gsgs_op(i), &
1768 mtarget=amew_op(i), &
1773 t_firstrow=1 + nsg + 1, &
1774 t_firstcol=1 + nsg + 1)
1778 mtarget=amew_op(i), &
1783 t_firstrow=1 + nsg + ntp + 1, &
1784 t_firstcol=1 + nsg + ntp + 1)
1787 mtarget=amew_op(i), &
1792 t_firstrow=1 + nsg + 2*ntp + 1, &
1793 t_firstcol=1 + nsg + 2*ntp + 1)
1810 DEALLOCATE (sggs_block)
1811 DEALLOCATE (
diag, gsgs_op, mo_op)
1812 CALL timestop(handle)
1814 END SUBROUTINE get_rcs_amew_op
static GRID_HOST_DEVICE int modulo(int a, int m)
Equivalent of Fortran's MODULO, which always return a positive number. https://gcc....
subroutine, public get_gto_basis_set(gto_basis_set, name, aliases, norm_type, kind_radius, ncgf, nset, nsgf, cgf_symbol, sgf_symbol, norm_cgf, set_radius, lmax, lmin, lx, ly, lz, m, ncgf_set, npgf, nsgf_set, nshell, cphi, pgf_radius, sphi, scon, zet, first_cgf, first_sgf, l, last_cgf, last_sgf, n, gcc, maxco, maxl, maxpgf, maxsgf_set, maxshell, maxso, nco_sum, npgf_sum, nshell_sum, maxder, short_kind_radius, npgf_seg_sum)
...
methods related to the blacs parallel environment
used for collecting diagonalization schemes available for cp_cfm_type
subroutine, public cp_cfm_heevd(matrix, eigenvectors, eigenvalues)
Perform a diagonalisation of a complex matrix.
Represents a complex full matrix distributed on many processors.
subroutine, public cp_cfm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
Extract a sub-matrix from the full matrix: op(target_m)(1:n_rows,1:n_cols) = fm(start_row:start_row+n...
subroutine, public cp_cfm_release(matrix)
Releases a full matrix.
subroutine, public cp_fm_to_cfm(msourcer, msourcei, mtarget)
Construct a complex full matrix by taking its real and imaginary parts from two separate real-value f...
subroutine, public cp_cfm_create(matrix, matrix_struct, name, nrow, ncol, set_zero)
Creates a new full matrix with the given structure.
subroutine, public cp_cfm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, matrix_struct, para_env)
Returns information about a full matrix.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_distribution_release(dist)
...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_distribution_new(dist, template, group, pgrid, row_dist, col_dist, reuse_arrays)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_multiply(transa, transb, alpha, matrix_a, matrix_b, beta, matrix_c, first_row, last_row, first_column, last_column, first_k, last_k, retain_sparsity, filter_eps, flop)
...
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
subroutine, public dbcsr_print(matrix, variable_name, unit_nr)
Prints given matrix in matlab format (only present blocks).
subroutine, public dbcsr_reserve_all_blocks(matrix)
Reserves all blocks.
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
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_transpose(matrix, matrixt)
transposes a matrix matrixt = matrix ^ T
subroutine, public cp_fm_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, computes the corresponding full matrix
subroutine, public cp_fm_scale(alpha, matrix_a)
scales a matrix matrix_a = alpha * matrix_b
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_get_diag(matrix, diag)
returns the diagonal elements of a fm
subroutine, public cp_fm_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_get_submatrix(fm, target_m, start_row, start_col, n_rows, n_cols, transpose)
gets a submatrix of a full matrix op(target_m)(1:n_rows,1:n_cols) =fm(start_row:start_row+n_rows,...
subroutine, public cp_fm_set_element(matrix, irow_global, icol_global, alpha)
sets an element of a matrix
various routines to log and control the output. The idea is that decisions about where to log should ...
recursive integer function, public cp_logger_get_default_unit_nr(logger, local, skip_not_ionode)
asks the default unit number of the given logger. try to use cp_logger_get_unit_nr
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)
...
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Generation of the spherical Lebedev grids. All Lebedev grids were generated with a precision of at le...
subroutine, public deallocate_lebedev_grids()
...
type(oh_grid), dimension(nlg), target, public lebedev_grid
integer function, public get_number_of_lebedev_grid(l, n)
Get the number of the Lebedev grid, which has the requested angular momentum quantnum number l or siz...
subroutine, public init_lebedev_grids()
Load the coordinates and weights of the nonredundant Lebedev grid points.
Collection of simple mathematical functions and subroutines.
pure real(kind=dp) function, dimension(min(size(a, 1), size(a, 2))), public get_diag(a)
Return the diagonal elements of matrix a as a vector.
subroutine, public diag(n, a, d, v)
Diagonalize matrix a. The eigenvalues are returned in vector d and the eigenvectors are returned in m...
Utility routines for the memory handling.
Interface to the message passing library MPI.
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nsoset
integer, dimension(:, :), allocatable, public indso
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
real(kind=dp), parameter, public wavenumbers
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
subroutine, public allocate_grid_atom(grid_atom)
Initialize components of the grid_atom_type structure.
subroutine, public create_grid_atom(grid_atom, nr, na, llmax, ll, quadrature)
...
subroutine, public allocate_harmonics_atom(harmonics)
Allocate a spherical harmonics set for the atom grid.
subroutine, public get_maxl_cg(harmonics, orb_basis, llmax, max_s_harm)
...
subroutine, public create_harmonics_atom(harmonics, my_cg, na, llmax, maxs, max_s_harm, ll, wa, azi, pol)
...
Define the quickstep kind type and their sub types.
subroutine, public get_qs_kind(qs_kind, basis_set, basis_type, ncgf, nsgf, all_potential, tnadd_potential, gth_potential, sgp_potential, upf_potential, cneo_potential, se_parameter, dftb_parameter, xtb_parameter, dftb3_param, zatom, zeff, elec_conf, mao, lmax_dftb, alpha_core_charge, ccore_charge, core_charge, core_charge_radius, paw_proj_set, paw_atom, hard_radius, hard0_radius, max_rad_local, covalent_radius, vdw_radius, gpw_type_forced, harmonics, max_iso_not0, max_s_harm, grid_atom, ngrid_ang, ngrid_rad, lmax_rho0, dft_plus_u_atom, l_of_dft_plus_u, n_of_dft_plus_u, u_minus_j, u_of_dft_plus_u, j_of_dft_plus_u, alpha_of_dft_plus_u, beta_of_dft_plus_u, j0_of_dft_plus_u, occupation_of_dft_plus_u, dispersion, bs_occupation, magnetization, no_optimize, addel, laddel, naddel, orbitals, max_scf, eps_scf, smear, u_ramping, u_minus_j_target, eps_u_ramping, init_u_ramping_each_scf, reltmat, ghost, monovalent, floating, name, element_symbol, pao_basis_size, pao_model_file, pao_potentials, pao_descriptors, nelec)
Get attributes of an atomic kind.
subroutine, public get_qs_kind_set(qs_kind_set, all_potential_present, tnadd_potential_present, gth_potential_present, sgp_potential_present, paw_atom_present, dft_plus_u_atom_present, maxcgf, maxsgf, maxco, maxco_proj, maxgtops, maxlgto, maxlprj, maxnset, maxsgf_set, ncgf, npgf, nset, nsgf, nshell, maxpol, maxlppl, maxlppnl, maxppnl, nelectron, maxder, max_ngrid_rad, max_sph_harm, maxg_iso_not0, lmax_rho0, basis_rcut, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
Definition and initialisation of the mo data type.
subroutine, public soc_env_create(soc_env)
...
subroutine, public soc_atom_release(soc_atom_env)
...
subroutine, public soc_atom_create(soc_atom_env)
...
subroutine, public soc_env_release(soc_env)
...
Utilities absorption spectroscopy using TDDFPT with SOC.
subroutine, public soc_dipole_operator(soc_env, tddfpt_control, qs_env, gs_mos)
Build the atomic dipole operator.
subroutine, public resort_evects(evects_cfm, sort)
Used to find out, which state has which spin-multiplicity.
subroutine, public soc_contract_evect(fm_start, fm_res)
...
subroutine, public dip_vel_op(soc_env, qs_env, evec_fm, op, ideriv, tp, gs_coeffs, sggs_fm)
This routine will construct the dipol operator within velocity representation.
subroutine, public tddfpt_soc(qs_env, evals_a, evals_b, evects_a, evects_b, gs_mos)
Perform TDDFPT-SOC calculation.
subroutine, public v_soc_xyz_from_pseudopotential(qs_env, mat_v_soc_xyz)
V^SOC_µν^(α),R = ħ/2 < ϕ_µ cell O | sum_ℓ ΔV_ℓ^SO(r,r') L^(α) | ϕ_ν cell R>, α = x,...
Calculate spherical harmonics.
subroutine, public clebsch_gordon_init(l)
...
subroutine, public clebsch_gordon_deallocate()
...
This module deals with all the integrals done on local atomic grids in xas_tdp. This is mostly used t...
subroutine, public compute_sphi_so(ikind, basis_type, sphi_so, qs_env)
Computes the contraction coefficients to go from spherical orbitals to sgf for a given atomic kind an...
subroutine, public integrate_soc_atoms(matrix_soc, xas_atom_env, qs_env, soc_atom_env)
Computes the SOC matrix elements with respect to the ORB basis set for each atomic kind and put them ...
subroutine, public truncate_radial_grid(grid_atom, max_radius)
Reduces the radial extension of an atomic grid such that it only covers a given radius.
Utilities for X-ray absorption spectroscopy using TDDFPT.
subroutine, public rcs_amew_soc_elements(amew_soc, lr_soc, lr_overlap, domo_soc, pref_trace, pref_overall, pref_diags, symmetric)
Computes the rcs SOC matrix elements between excited states AMEWs based on the LR orbitals.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
Represent a complex full matrix.
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...
stores all the informations relevant to an mpi environment
Provides all information about a quickstep kind.
Ground state molecular orbitals.