136#include "./base/base_uses.f90"
142 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_forces'
174 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_forces_main'
176 INTEGER :: handle, ispin, nspins, spin
180 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe_asymm, matrix_pe_symm, &
181 matrix_s, matrix_s_aux_fit
185 CALL timeset(routinen, handle)
187 CALL get_qs_env(qs_env, dft_control=dft_control)
191 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
CALL cite_reference(
sertcan2024)
193 nspins = dft_control%nspins
194 tddfpt_control => dft_control%tddfpt2_control
203 IF (gs_mos(ispin)%nmo_occ /= gs_mos(ispin)%nmo_active)
THEN
204 CALL cp_abort(__location__,
"RES-TDDFPT Forces NYA")
209 IF (
ASSOCIATED(ex_env%cpmos))
THEN
210 DO ispin = 1,
SIZE(ex_env%cpmos)
213 DEALLOCATE (ex_env%cpmos)
215 ALLOCATE (ex_env%cpmos(nspins))
219 CALL cp_fm_get_info(gs_mos(ispin)%mos_occ, matrix_struct=matrix_struct)
223 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
224 NULLIFY (matrix_pe_asymm, matrix_pe_symm)
234 ALLOCATE (ex_env%matrix_pe(ispin)%matrix)
235 CALL dbcsr_create(ex_env%matrix_pe(ispin)%matrix, template=matrix_s(1)%matrix)
236 CALL dbcsr_copy(ex_env%matrix_pe(ispin)%matrix, matrix_s(1)%matrix)
237 CALL dbcsr_set(ex_env%matrix_pe(ispin)%matrix, 0.0_dp)
239 ALLOCATE (matrix_pe_symm(ispin)%matrix)
240 CALL dbcsr_create(matrix_pe_symm(ispin)%matrix, template=matrix_s(1)%matrix)
241 CALL dbcsr_copy(matrix_pe_symm(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix)
243 ALLOCATE (matrix_pe_asymm(ispin)%matrix)
244 CALL dbcsr_create(matrix_pe_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
245 matrix_type=dbcsr_type_antisymmetric)
254 CALL tddfpt_resvec1(ex_env%evect(spin), gs_mos(spin)%mos_active, &
255 matrix_s(1)%matrix, ex_env%matrix_pe(ispin)%matrix, ispin, do_sf)
259 IF (dft_control%do_admm)
THEN
261 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
264 ALLOCATE (ex_env%matrix_pe_admm(ispin)%matrix)
265 CALL dbcsr_create(ex_env%matrix_pe_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
266 CALL dbcsr_copy(ex_env%matrix_pe_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
267 CALL dbcsr_set(ex_env%matrix_pe_admm(ispin)%matrix, 0.0_dp)
268 CALL tddfpt_resvec1_admm(ex_env%matrix_pe(ispin)%matrix, &
269 admm_env, ex_env%matrix_pe_admm(ispin)%matrix)
275 ALLOCATE (ex_env%matrix_hz(ispin)%matrix)
276 CALL dbcsr_create(ex_env%matrix_hz(ispin)%matrix, template=matrix_s(1)%matrix)
277 CALL dbcsr_copy(ex_env%matrix_hz(ispin)%matrix, matrix_s(1)%matrix)
278 CALL dbcsr_set(ex_env%matrix_hz(ispin)%matrix, 0.0_dp)
281 IF (dft_control%qs_control%xtb)
THEN
282 CALL tddfpt_resvec2_xtb(qs_env, ex_env%matrix_pe, gs_mos, ex_env%matrix_hz, ex_env%cpmos)
284 CALL tddfpt_resvec2(qs_env, ex_env%matrix_pe, ex_env%matrix_pe_admm, &
285 gs_mos, ex_env%matrix_hz, ex_env%cpmos)
290 DO ispin = 1,
SIZE(ex_env%evect, 1)
291 ALLOCATE (ex_env%matrix_px1(ispin)%matrix)
292 CALL dbcsr_create(ex_env%matrix_px1(ispin)%matrix, template=matrix_s(1)%matrix)
293 CALL dbcsr_copy(ex_env%matrix_px1(ispin)%matrix, matrix_s(1)%matrix)
294 CALL dbcsr_set(ex_env%matrix_px1(ispin)%matrix, 0.0_dp)
296 ALLOCATE (ex_env%matrix_px1_asymm(ispin)%matrix)
297 CALL dbcsr_create(ex_env%matrix_px1_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
298 matrix_type=dbcsr_type_antisymmetric)
302 IF (tddfpt_control%do_admm)
THEN
304 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
307 DO ispin = 1,
SIZE(ex_env%evect, 1)
308 ALLOCATE (ex_env%matrix_px1_admm(ispin)%matrix)
309 CALL dbcsr_create(ex_env%matrix_px1_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
310 CALL dbcsr_copy(ex_env%matrix_px1_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
311 CALL dbcsr_set(ex_env%matrix_px1_admm(ispin)%matrix, 0.0_dp)
313 ALLOCATE (ex_env%matrix_px1_admm_asymm(ispin)%matrix)
314 CALL dbcsr_create(ex_env%matrix_px1_admm_asymm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
315 matrix_type=dbcsr_type_antisymmetric)
317 ex_env%matrix_px1_admm_asymm(ispin)%matrix)
321 CALL tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
323 CALL tddfpt_resvec3(qs_env, ex_env%cpmos, work_matrices)
328 CALL timestop(handle)
343 SUBROUTINE tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
353 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_forces'
356 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: natom_of_kind
357 LOGICAL :: debug_forces
358 REAL(kind=
dp) :: ehartree, exc
361 TYPE(
qs_force_type),
DIMENSION(:),
POINTER :: ks_force, td_force
363 CALL timeset(routinen, handle)
366 debug_forces = ex_env%debug_forces
368 CALL get_qs_env(qs_env, dft_control=dft_control, force=ks_force, &
369 atomic_kind_set=atomic_kind_set)
373 DEALLOCATE (natom_of_kind)
377 IF (dft_control%qs_control%xtb)
THEN
378 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
379 work_matrices, debug_forces)
385 ex_env%vtau_rspace, ex_env%vadmm_rspace, ehartree, exc, &
386 vadmm_tau_rspace=ex_env%vadmm_tau_rspace)
389 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
390 work_matrices, debug_forces)
399 CALL timestop(handle)
401 END SUBROUTINE tddfpt_forces
420 SUBROUTINE tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, &
430 LOGICAL :: debug_forces
432 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_force_direct'
434 INTEGER :: handle, iounit, ispin, nact, natom, &
437 REAL(kind=
dp) :: evalue
438 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2
439 REAL(kind=
dp),
DIMENSION(3) :: fodeb
441 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: evect
443 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s, matrix_wx1, &
453 CALL timeset(routinen, handle)
456 IF (logger%para_env%is_source())
THEN
462 evect => ex_env%evect
464 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, para_env=para_env, &
465 sab_orb=sab_orb, dft_control=dft_control, force=force)
466 NULLIFY (tddfpt_control)
467 tddfpt_control => dft_control%tddfpt2_control
473 nspins = dft_control%nspins
475 IF (debug_forces)
THEN
476 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
477 ALLOCATE (ftot1(3, natom))
483 CALL tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
486 NULLIFY (matrix_wx1, matrix_wz)
488 matrix_wx1 => ex_env%matrix_wx1
489 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
497 ALLOCATE (matrix_wz(ispin)%matrix)
498 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
500 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
503 IF (.NOT. (do_sf .AND. (ispin == 1)))
THEN
506 evalue = ex_env%evalue
507 IF (tddfpt_control%oe_corr ==
oe_shift)
THEN
508 evalue = ex_env%evalue - tddfpt_control%ev_shift
514 IF (.NOT. (do_sf .AND. (ispin == 2)))
THEN
516 matrix_wz(ispin)%matrix)
519 IF (nspins == 2)
THEN
520 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
521 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
524 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
528 matrix_name=
"OVERLAP MATRIX", &
529 basis_type_a=
"ORB", basis_type_b=
"ORB", &
530 sab_nl=sab_orb, calculate_forces=.true., &
531 matrix_p=matrix_wz(1)%matrix)
534 IF (debug_forces)
THEN
535 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
536 CALL para_env%sum(fodeb)
537 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wx*dS ", fodeb
542 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
546 ALLOCATE (matrix_wz(ispin)%matrix)
547 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
549 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
552 IF (.NOT. (do_sf .AND. (ispin == 2)))
THEN
553 evalue = ex_env%evalue
554 IF (tddfpt_control%oe_corr ==
oe_shift)
THEN
555 evalue = ex_env%evalue - tddfpt_control%ev_shift
563 matrix_ks(spin)%matrix, matrix_wz(ispin)%matrix, evalue)
566 IF (nspins == 2)
THEN
567 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
568 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
571 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
573 matrix_name=
"OVERLAP MATRIX", &
574 basis_type_a=
"ORB", basis_type_b=
"ORB", &
575 sab_nl=sab_orb, calculate_forces=.true., &
576 matrix_p=matrix_wz(1)%matrix)
579 IF (debug_forces)
THEN
580 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
581 CALL para_env%sum(fodeb)
582 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: xWx*dS ", fodeb
588 IF (
ASSOCIATED(matrix_wx1))
THEN
589 IF (nspins == 2 .AND. .NOT. do_sf)
THEN
590 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
591 alpha_scalar=0.5_dp, beta_scalar=0.5_dp)
592 ELSE IF (nspins == 2 .AND. do_sf)
THEN
593 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
594 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
597 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
599 matrix_name=
"OVERLAP MATRIX", &
600 basis_type_a=
"ORB", basis_type_b=
"ORB", &
601 sab_nl=sab_orb, calculate_forces=.true., &
602 matrix_p=matrix_wx1(1)%matrix)
604 IF (debug_forces)
THEN
605 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
606 CALL para_env%sum(fodeb)
607 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: D^XKP*dS ", fodeb
611 IF (debug_forces)
THEN
612 ALLOCATE (ftot2(3, natom))
614 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
615 CALL para_env%sum(fodeb)
616 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T30,3F16.8)")
"DEBUG:: Excitation Force", fodeb
617 DEALLOCATE (ftot1, ftot2)
620 CALL timestop(handle)
622 END SUBROUTINE tddfpt_force_direct
634 SUBROUTINE tddfpt_resvec1(evect, mos_active, matrix_s, matrix_pe, spin, do_sf)
636 TYPE(
cp_fm_type),
INTENT(IN) :: evect, mos_active
637 TYPE(
dbcsr_type),
POINTER :: matrix_s, matrix_pe
638 INTEGER,
INTENT(IN) :: spin
639 LOGICAL,
INTENT(IN) :: do_sf
641 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec1'
643 INTEGER :: handle, iounit, nact, nao, norb
649 CALL timeset(routinen, handle)
650 CALL cp_fm_get_info(mos_active, nrow_global=nao, ncol_global=norb)
652 cpassert(norb == nact)
655 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 2)))
THEN
660 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 1)))
THEN
664 nrow_global=norb, ncol_global=norb)
671 CALL parallel_gemm(
'T',
'N', norb, norb, nao, 1.0_dp, cxmat, evect, 0.0_dp, xxmat)
673 CALL parallel_gemm(
'N',
'N', nao, norb, norb, 1.0_dp, mos_active, xxmat, 0.0_dp, cxmat)
677 ncol=norb, alpha=-1.0_dp, symmetry_mode=1)
683 IF (.NOT. do_sf)
THEN
684 IF (abs(tmp) > 1.e-08_dp)
THEN
686 IF (logger%para_env%is_source())
THEN
691 cpwarn(
"Electron count of excitation density matrix is non-zero.")
693 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
694 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
697 ELSE IF (spin == 1)
THEN
698 IF (abs(tmp + 1) > 1.e-08_dp)
THEN
700 IF (logger%para_env%is_source())
THEN
705 cpwarn(
"Count of occupied occupation number change is not -1.")
707 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
708 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
711 ELSE IF (spin == 2)
THEN
712 IF (abs(tmp - 1) > 1.e-08_dp)
THEN
714 IF (logger%para_env%is_source())
THEN
719 cpwarn(
"Count of unoccupied occupation number change is not 1.")
721 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
722 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
728 CALL timestop(handle)
730 END SUBROUTINE tddfpt_resvec1
738 SUBROUTINE tddfpt_resvec1_admm(matrix_pe, admm_env, matrix_pe_admm)
744 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec1_admm'
746 INTEGER :: handle, nao, nao_aux
748 CALL timeset(routinen, handle)
750 nao_aux = admm_env%nao_aux_fit
751 nao = admm_env%nao_orb
755 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
756 admm_env%work_aux_orb)
758 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
759 admm_env%work_aux_aux)
760 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_pe_admm, keep_sparsity=.true.)
762 CALL timestop(handle)
764 END SUBROUTINE tddfpt_resvec1_admm
777 SUBROUTINE tddfpt_resvec2(qs_env, matrix_pe, matrix_pe_admm, gs_mos, matrix_hz, cpmos)
780 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe, matrix_pe_admm
784 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: cpmos
786 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec2'
788 CHARACTER(LEN=default_string_length) :: basis_type
789 INTEGER :: handle, iounit, ispin, mspin, n_rep_hf, &
790 nao, nao_aux, natom, norb, nspins
791 LOGICAL :: deriv2_analytic, distribute_fock_matrix, do_hfx, gapw, gapw_xc, &
792 hfx_treat_lsd_in_core, needs_tau_response, s_mstruct_changed
793 REAL(kind=
dp) :: eh1, focc, rhotot, thartree
794 REAL(kind=
dp),
DIMENSION(2) :: total_rho
795 REAL(kind=
dp),
DIMENSION(:),
POINTER :: qlm_tot
801 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mhz, mpe
805 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
806 TYPE(
local_rho_type),
POINTER :: local_rho_set, local_rho_set_admm
809 POINTER :: sab, sab_aux_fit
812 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_g_aux, rhoz_g_aux, &
813 rhoz_tau_g_aux, trho_g, trho_tau_g, &
814 trho_xc_g, trho_xc_tau_g
819 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_r_aux, rhoz_r_aux, &
820 rhoz_tau_r_aux, trho_r, trho_tau_r, &
821 trho_xc_r, trho_xc_tau_r, v_xc, &
824 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
826 TYPE(
qs_rho_type),
POINTER :: rho, rho_aux_fit, rho_xc, rhoz_aux, trho
827 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
833 CALL timeset(routinen, handle)
836 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, ks_env=ks_env, &
837 dft_control=dft_control, para_env=para_env)
838 cpassert(
ASSOCIATED(pw_env))
839 nspins = dft_control%nspins
840 gapw = dft_control%qs_control%gapw
841 gapw_xc = dft_control%qs_control%gapw_xc
843 cpassert(.NOT. dft_control%tddfpt2_control%do_exck)
844 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxsr)
845 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxlr)
847 NULLIFY (auxbas_pw_pool, poisson_env)
849 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
850 poisson_env=poisson_env)
852 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
853 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
854 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
857 IF (dft_control%do_admm)
THEN
859 xc_section => admm_env%xc_section_primary
865 needs_tau_response = needs%tau .OR. needs%tau_spin
867 NULLIFY (trho_tau_r, trho_tau_g, trho_xc_tau_r, trho_xc_tau_g)
868 ALLOCATE (trho_r(nspins), trho_g(nspins))
870 CALL auxbas_pw_pool%create_pw(trho_r(ispin))
871 CALL auxbas_pw_pool%create_pw(trho_g(ispin))
873 IF (needs_tau_response)
THEN
874 ALLOCATE (trho_tau_r(nspins), trho_tau_g(nspins))
876 CALL auxbas_pw_pool%create_pw(trho_tau_r(ispin))
877 CALL auxbas_pw_pool%create_pw(trho_tau_g(ispin))
881 ALLOCATE (trho_xc_r(nspins), trho_xc_g(nspins))
883 CALL auxbas_pw_pool%create_pw(trho_xc_r(ispin))
884 CALL auxbas_pw_pool%create_pw(trho_xc_g(ispin))
886 IF (needs_tau_response)
THEN
887 ALLOCATE (trho_xc_tau_r(nspins), trho_xc_tau_g(nspins))
889 CALL auxbas_pw_pool%create_pw(trho_xc_tau_r(ispin))
890 CALL auxbas_pw_pool%create_pw(trho_xc_tau_g(ispin))
896 NULLIFY (hartree_local, local_rho_set)
899 atomic_kind_set=atomic_kind_set, &
901 qs_kind_set=qs_kind_set)
904 qs_kind_set, dft_control, para_env)
905 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
910 ELSEIF (gapw_xc)
THEN
912 atomic_kind_set=atomic_kind_set, &
913 qs_kind_set=qs_kind_set)
916 qs_kind_set, dft_control, para_env)
924 rho_gspace=trho_g(ispin), &
926 total_rho=total_rho(ispin))
927 IF (needs_tau_response)
THEN
929 rho=trho_tau_r(ispin), &
930 rho_gspace=trho_tau_g(ispin), &
934 CALL pw_axpy(trho_g(ispin), rho_tot_gspace)
937 rho=trho_xc_r(ispin), &
938 rho_gspace=trho_xc_g(ispin), &
939 soft_valid=gapw_xc, &
941 IF (needs_tau_response)
THEN
943 rho=trho_xc_tau_r(ispin), &
944 rho_gspace=trho_xc_tau_g(ispin), &
945 soft_valid=gapw_xc, &
952 IF (gapw .OR. gapw_xc)
THEN
953 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab)
955 qs_kind_set, oce, sab, para_env)
958 rhotot = sum(total_rho)
961 rhotot = rhotot + local_rho_set%rho0_mpole%total_rho0_h
962 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_tot_gspace)
963 IF (
ASSOCIATED(local_rho_set%rho0_mpole%rhoz_cneo_s_gs))
THEN
964 CALL pw_axpy(local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace)
968 IF (abs(rhotot) > 1.e-05_dp)
THEN
970 IF (logger%para_env%is_source())
THEN
975 cpwarn(
"Real space electron count of excitation density is non-zero.")
977 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", rhotot
978 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
985 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
986 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
989 local_rho_set, para_env, tddft=.true.)
991 calculate_forces=.false., &
992 local_rho_set=local_rho_set)
997 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g)
1000 IF (deriv2_analytic)
THEN
1001 NULLIFY (v_xc, v_xc_tau)
1002 CALL get_qs_env(qs_env=qs_env, xcint_weights=weights)
1004 CALL get_qs_env(qs_env=qs_env, rho_xc=rho_xc)
1005 CALL qs_fxc_analytic(rho_xc, trho_xc_r, trho_xc_tau_r, xc_section, weights, auxbas_pw_pool, &
1006 .false., v_xc, v_xc_tau)
1008 CALL qs_fxc_analytic(rho, trho_r, trho_tau_r, xc_section, weights, auxbas_pw_pool, &
1009 .false., v_xc, v_xc_tau)
1011 IF (gapw .OR. gapw_xc)
THEN
1012 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
1013 rho1_atom_set => local_rho_set%rho_atom_set
1018 cpabort(
"NYA 00006")
1019 NULLIFY (v_xc, trho)
1022 CALL qs_rho_set(trho, rho_r=trho_r, rho_g=trho_g)
1023 CALL qs_fxc_fdiff(ks_env, rho, trho, xc_section, 6, .false., v_xc, v_xc_tau)
1027 DO ispin = 1, nspins
1028 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1029 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1032 DO ispin = 1, nspins
1033 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1034 hmat=matrix_hz(ispin), &
1035 calculate_forces=.false.)
1036 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1037 hmat=matrix_hz(ispin), &
1038 gapw=gapw_xc, calculate_forces=.false.)
1042 DO ispin = 1, nspins
1043 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1044 hmat=matrix_hz(ispin), &
1045 gapw=gapw, calculate_forces=.false.)
1046 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1047 hmat=matrix_hz(ispin), &
1048 gapw=gapw, calculate_forces=.false.)
1051 IF (gapw .OR. gapw_xc)
THEN
1052 mhz(1:nspins, 1:1) => matrix_hz(1:nspins)
1053 mpe(1:nspins, 1:1) => matrix_pe(1:nspins)
1055 rho_atom_external=local_rho_set%rho_atom_set)
1058 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
1059 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
1060 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1061 DO ispin = 1, nspins
1062 CALL auxbas_pw_pool%give_back_pw(trho_r(ispin))
1063 CALL auxbas_pw_pool%give_back_pw(trho_g(ispin))
1064 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1066 DEALLOCATE (trho_r, trho_g, v_xc)
1067 IF (
ASSOCIATED(trho_tau_r))
THEN
1068 DO ispin = 1, nspins
1069 CALL auxbas_pw_pool%give_back_pw(trho_tau_r(ispin))
1070 CALL auxbas_pw_pool%give_back_pw(trho_tau_g(ispin))
1072 DEALLOCATE (trho_tau_r, trho_tau_g)
1075 DO ispin = 1, nspins
1076 CALL auxbas_pw_pool%give_back_pw(trho_xc_r(ispin))
1077 CALL auxbas_pw_pool%give_back_pw(trho_xc_g(ispin))
1079 DEALLOCATE (trho_xc_r, trho_xc_g)
1080 IF (
ASSOCIATED(trho_xc_tau_r))
THEN
1081 DO ispin = 1, nspins
1082 CALL auxbas_pw_pool%give_back_pw(trho_xc_tau_r(ispin))
1083 CALL auxbas_pw_pool%give_back_pw(trho_xc_tau_g(ispin))
1085 DEALLOCATE (trho_xc_tau_r, trho_xc_tau_g)
1088 IF (
ASSOCIATED(v_xc_tau))
THEN
1089 DO ispin = 1, nspins
1090 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1092 DEALLOCATE (v_xc_tau)
1094 IF (dft_control%do_admm)
THEN
1098 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=msaux, &
1099 task_list_aux_fit=task_list)
1100 basis_type =
"AUX_FIT"
1103 ALLOCATE (mpe(nspins, 1))
1105 DO ispin = 1, nspins
1106 ALLOCATE (mhz(ispin, 1)%matrix)
1107 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1108 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1109 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1110 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1114 NULLIFY (local_rho_set_admm)
1115 IF (admm_env%do_gapw)
THEN
1116 basis_type =
"AUX_FIT_SOFT"
1117 task_list => admm_env%admm_gapw_env%task_list
1118 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
1122 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
1124 rho_atom_set=local_rho_set_admm%rho_atom_set, &
1125 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
1126 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
1128 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1131 xc_section => admm_env%xc_section_aux
1134 needs_tau_response = needs%tau .OR. needs%tau_spin
1136 NULLIFY (rho_g_aux, rho_r_aux, rhoz_g_aux, rhoz_r_aux, rhoz_tau_g_aux, rhoz_tau_r_aux)
1137 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux)
1139 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
1140 DO ispin = 1, nspins
1141 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
1142 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
1144 IF (needs_tau_response)
THEN
1145 ALLOCATE (rhoz_tau_r_aux(nspins), rhoz_tau_g_aux(nspins))
1146 DO ispin = 1, nspins
1147 CALL auxbas_pw_pool%create_pw(rhoz_tau_r_aux(ispin))
1148 CALL auxbas_pw_pool%create_pw(rhoz_tau_g_aux(ispin))
1151 DO ispin = 1, nspins
1153 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
1154 basis_type=basis_type, &
1155 task_list_external=task_list)
1156 IF (needs_tau_response)
THEN
1158 rho=rhoz_tau_r_aux(ispin), rho_gspace=rhoz_tau_g_aux(ispin), &
1159 basis_type=basis_type, task_list_external=task_list, &
1164 NULLIFY (v_xc, v_xc_tau)
1166 IF (deriv2_analytic)
THEN
1167 CALL get_qs_env(qs_env=qs_env, xcint_weights=weights)
1168 CALL qs_fxc_analytic(rho_aux_fit, rhoz_r_aux, rhoz_tau_r_aux, xc_section, weights, auxbas_pw_pool, &
1169 .false., v_xc, v_xc_tau)
1171 cpabort(
"NYA 00007")
1175 CALL qs_rho_set(rhoz_aux, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux)
1176 CALL qs_fxc_fdiff(ks_env, rho_aux_fit, rhoz_aux, xc_section, 6, .false., v_xc, v_xc_tau)
1177 DEALLOCATE (rhoz_aux)
1180 DO ispin = 1, nspins
1181 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1182 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1183 hmat=mhz(ispin, 1), basis_type=basis_type, &
1184 calculate_forces=.false., &
1185 task_list_external=task_list)
1187 DO ispin = 1, nspins
1188 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1189 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
1190 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
1192 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
1193 IF (
ASSOCIATED(v_xc_tau))
THEN
1194 DO ispin = 1, nspins
1195 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1197 DEALLOCATE (v_xc_tau)
1199 IF (
ASSOCIATED(rhoz_tau_r_aux))
THEN
1200 DO ispin = 1, nspins
1201 CALL auxbas_pw_pool%give_back_pw(rhoz_tau_r_aux(ispin))
1202 CALL auxbas_pw_pool%give_back_pw(rhoz_tau_g_aux(ispin))
1204 DEALLOCATE (rhoz_tau_r_aux, rhoz_tau_g_aux)
1207 IF (admm_env%do_gapw)
THEN
1208 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
1209 rho1_atom_set => local_rho_set_admm%rho_atom_set
1211 para_env, kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1212 CALL update_ks_atom(qs_env, mhz(:, 1), matrix_pe_admm, forces=.false., tddft=.false., &
1213 rho_atom_external=rho1_atom_set, &
1214 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
1215 oce_external=admm_env%admm_gapw_env%oce, &
1216 sab_external=sab_aux_fit)
1219 nao = admm_env%nao_orb
1220 nao_aux = admm_env%nao_aux_fit
1222 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1223 DO ispin = 1, nspins
1225 admm_env%work_aux_orb, nao)
1227 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1228 admm_env%work_orb_orb)
1232 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1238 IF (admm_env%do_gapw)
THEN
1243 IF (gapw .OR. gapw_xc)
THEN
1253 cpassert(n_rep_hf == 1)
1257 IF (hfx_treat_lsd_in_core) mspin = nspins
1259 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, para_env=para_env, &
1260 s_mstruct_changed=s_mstruct_changed)
1261 distribute_fock_matrix = .true.
1262 IF (dft_control%do_admm)
THEN
1266 ALLOCATE (mpe(nspins, 1))
1268 DO ispin = 1, nspins
1269 ALLOCATE (mhz(ispin, 1)%matrix)
1270 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1271 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1272 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1273 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1275 IF (x_data(1, 1)%do_hfx_ri)
THEN
1277 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1278 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1279 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1284 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1289 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
1290 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
1291 nao = admm_env%nao_orb
1292 nao_aux = admm_env%nao_aux_fit
1294 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1295 DO ispin = 1, nspins
1297 admm_env%work_aux_orb, nao)
1299 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1300 admm_env%work_orb_orb)
1301 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
1304 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1312 ALLOCATE (mpe(nspins, 1), mhz(nspins, 1))
1313 DO ispin = 1, nspins
1314 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
1315 mpe(ispin, 1)%matrix => matrix_pe(ispin)%matrix
1317 IF (x_data(1, 1)%do_hfx_ri)
THEN
1319 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1320 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1321 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1326 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1330 DEALLOCATE (mpe, mhz)
1335 IF (nspins == 2) focc = 2.0_dp
1336 DO ispin = 1, nspins
1337 mos => gs_mos(ispin)%mos_occ
1340 norb, alpha=focc, beta=0.0_dp)
1343 CALL timestop(handle)
1345 END SUBROUTINE tddfpt_resvec2
1355 SUBROUTINE tddfpt_resvec2_xtb(qs_env, matrix_pe, gs_mos, matrix_hz, cpmos)
1362 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: cpmos
1364 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec2_xtb'
1366 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
1367 na, natom, natorb, nkind, norb, ns, &
1369 INTEGER,
DIMENSION(25) :: lao
1370 INTEGER,
DIMENSION(5) :: occ
1371 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge, mcharge1
1372 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, aocg1, charges, charges1
1373 REAL(kind=
dp) :: focc
1377 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
1382 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1386 CALL timeset(routinen, handle)
1388 cpassert(
ASSOCIATED(matrix_pe))
1390 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
1391 nspins = dft_control%nspins
1393 DO ispin = 1, nspins
1394 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1397 IF (dft_control%qs_control%xtb_control%coulomb_interaction)
THEN
1399 CALL get_qs_env(qs_env, rho=rho, particle_set=particle_set, &
1400 matrix_s_kp=matrix_s, para_env=para_env)
1401 natom =
SIZE(particle_set)
1403 ALLOCATE (mcharge(natom), charges(natom, 5))
1404 ALLOCATE (mcharge1(natom), charges1(natom, 5))
1407 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1408 nkind =
SIZE(atomic_kind_set)
1410 ALLOCATE (aocg(nsgf, natom))
1412 ALLOCATE (aocg1(nsgf, natom))
1414 p_matrix => matrix_p(:, 1)
1415 s_matrix => matrix_s(1, 1)%matrix
1416 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1417 CALL ao_charges(matrix_pe, s_matrix, aocg1, para_env)
1420 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1423 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1424 charges(atom_a, :) = real(occ(:), kind=
dp)
1427 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1428 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
1432 DEALLOCATE (aocg, aocg1)
1434 mcharge(iatom) = sum(charges(iatom, :))
1435 mcharge1(iatom) = sum(charges1(iatom, :))
1440 DEALLOCATE (charges, mcharge, charges1, mcharge1)
1444 IF (nspins == 2) focc = 1.0_dp
1445 DO ispin = 1, nspins
1446 mos => gs_mos(ispin)%mos_occ
1449 norb, alpha=focc, beta=0.0_dp)
1452 CALL timestop(handle)
1454 END SUBROUTINE tddfpt_resvec2_xtb
1462 SUBROUTINE tddfpt_resvec3(qs_env, cpmos, work)
1465 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: cpmos
1468 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec3'
1470 INTEGER :: handle, ispin, nao, norb, nspins
1477 CALL timeset(routinen, handle)
1479 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1480 nspins = dft_control%nspins
1482 DO ispin = 1, nspins
1484 associate(rvecs => cpmos(ispin))
1487 CALL cp_fm_struct_create(fmstruct, context=rvecs%matrix_struct%context, nrow_global=norb, &
1488 ncol_global=norb, para_env=rvecs%matrix_struct%para_env)
1492 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, omos, work%S_C0(ispin), 0.0_dp, umat)
1494 CALL parallel_gemm(
"N",
"T", nao, norb, norb, 1.0_dp, cvec, umat, 0.0_dp, rvecs)
1500 CALL timestop(handle)
1502 END SUBROUTINE tddfpt_resvec3
1516 SUBROUTINE tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
1518 TYPE(qs_environment_type),
POINTER :: qs_env
1519 TYPE(excited_energy_type),
POINTER :: ex_env
1520 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
1522 TYPE(kernel_env_type),
INTENT(IN) :: kernel_env
1523 TYPE(tddfpt_subgroup_env_type) :: sub_env
1524 TYPE(tddfpt_work_matrices) :: work_matrices
1525 LOGICAL,
INTENT(IN) :: debug_forces
1527 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_kernel_force'
1530 TYPE(dft_control_type),
POINTER :: dft_control
1531 TYPE(tddfpt2_control_type),
POINTER :: tddfpt_control
1533 CALL timeset(routinen, handle)
1535 CALL get_qs_env(qs_env, dft_control=dft_control)
1536 tddfpt_control => dft_control%tddfpt2_control
1538 IF (tddfpt_control%kernel == tddfpt_kernel_full)
THEN
1540 CALL fhxc_force(qs_env, ex_env, gs_mos, kernel_env%full_kernel, debug_forces)
1541 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda)
THEN
1543 CALL stda_force(qs_env, ex_env, gs_mos, kernel_env%stda_kernel, sub_env, work_matrices, debug_forces)
1544 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none)
THEN
1546 ex_env%matrix_wx1 => null()
1548 cpabort(
'Unknown kernel type')
1551 CALL timestop(handle)
1553 END SUBROUTINE tddfpt_kernel_force
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.
subroutine, public get_atomic_kind_set(atomic_kind_set, atom_of_kind, kind_of, natom_of_kind, maxatom, natom, nshell, fist_potential_present, shell_present, shell_adiabatic, shell_check_distance, damping_present)
Get attributes of an atomic kind set.
subroutine, public get_atomic_kind(atomic_kind, fist_potential, element_symbol, name, mass, kind_number, natom, atom_list, rcov, rvdw, z, qeff, apol, cpol, mm_radius, shell, shell_active, damping)
Get attributes of an atomic kind.
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public hehn2024
integer, save, public sertcan2024
integer, save, public hehn2022
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_scale(matrix, alpha_scalar)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_complete_redistribute(matrix, redist)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
subroutine, public dbcsr_dot(matrix_a, matrix_b, trace)
Computes the dot product of two matrices, also known as the trace of their matrix product.
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
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public cp_dbcsr_plus_fm_fm_t(sparse_matrix, matrix_v, matrix_g, ncol, alpha, keep_sparsity, symmetry_mode)
performs the multiplication sparse_matrix+dense_mat*dens_mat^T if matrix_g is not explicitly given,...
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
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_create(matrix, matrix_struct, name, use_sp, nrow, ncol, set_zero)
creates a new full matrix with the given structure
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
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
Types for excited states potential energies.
subroutine, public exstate_potential_release(ex_env)
...
subroutine, public init_coulomb_local(hartree_local, natom)
...
subroutine, public vh_1c_gg_integrals(qs_env, energy_hartree_1c, ecoul_1c, local_rho_set, para_env, tddft, local_rho_set_2nd, core_2nd)
Calculates one center GAPW Hartree energies and matrix elements Hartree potentials are input Takes po...
subroutine, public hartree_local_release(hartree_local)
...
subroutine, public hartree_local_create(hartree_local)
...
Routines to calculate HFX energy and potential.
subroutine, public integrate_four_center(qs_env, x_data, ks_matrix, ehfx, rho_ao, hfx_section, para_env, geometry_did_change, irep, distribute_fock_matrix, ispin, nspins)
computes four center integrals for a full basis set and updates the Kohn-Sham-Matrix and energy....
subroutine, public hfx_ri_update_ks(qs_env, ri_data, ks_matrix, ehfx, mos, rho_ao, geometry_did_change, nspins, hf_fraction)
...
Types and set/get functions for HFX.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii} ]
basic linear algebra operations for full matrixes
Define the data structure for the particle information.
container for various plainwaves related things
subroutine, public pw_env_get(pw_env, pw_pools, cube_info, gridlevel_info, auxbas_pw_pool, auxbas_grid, auxbas_rs_desc, auxbas_rs_grid, rs_descs, rs_grids, xc_pw_pool, vdw_pw_pool, poisson_env, interp_section)
returns the various attributes of the pw env
functions related to the poisson solver on regular grids
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
Calculate the plane wave density by collocating the primitive Gaussian functions (pgf).
subroutine, public calculate_rho_elec(matrix_p, matrix_p_kp, rho, rho_gspace, total_rho, ks_env, soft_valid, compute_tau, compute_grad, basis_type, der_type, idir, task_list_external, pw_env_external)
computes the density corresponding to a given density matrix on the grid
collects routines that calculate density matrices
subroutine, public calculate_xwx_matrix(mos_active, xvec, s_matrix, ks_matrix, w_matrix, eval)
Calculate the excited state W matrix from the MO eigenvectors, KS matrix.
subroutine, public calculate_wx_matrix(mos_active, xvec, ks_matrix, w_matrix)
Calculate the excited state W matrix from the MO eigenvectors, KS matrix.
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, 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 set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, mimic, ewald_env, ewald_pw, mpools, rho_external, external_vxc, mask, scf_control, rel_control, qs_charges, ks_env, ks_qmmm_env, wf_history, scf_env, active_space, input, oce, rho_atom_set, rho0_atom_set, rho0_mpole, run_rtp, rtp, rhoz_set, rhoz_tot, ecoul_1c, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, efield, rhoz_cneo_set, linres_control, xas_env, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, ls_scf_env, do_transport, transport_env, lri_env, lri_density, exstate_env, ec_env, dispersion_env, harris_env, gcp_env, mp2_env, bs_env, kg_env, force, kpoints, wanniercentres, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Set the QUICKSTEP environment.
subroutine, public sum_qs_force(qs_force_out, qs_force_in)
Sum up two qs_force entities qs_force_out = qs_force_out + qs_force_in.
subroutine, public deallocate_qs_force(qs_force)
Deallocate a Quickstep force data structure.
subroutine, public zero_qs_force(qs_force)
Initialize a Quickstep force data structure.
subroutine, public allocate_qs_force(qs_force, natom_of_kind)
Allocate a Quickstep force data structure.
subroutine, public total_qs_force(force, qs_force, atomic_kind_set)
Get current total force.
https://en.wikipedia.org/wiki/Finite_difference_coefficient
subroutine, public qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, weights, auxbas_pw_pool, is_triplet, v_xc, v_xc_tau, spinflip)
...
subroutine, public qs_fxc_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau)
...
subroutine, public prepare_gapw_den(qs_env, local_rho_set, do_rho0, kind_set_external, pw_env_sub)
...
Integrate single or product functions over a potential on a RS grid.
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.
routines that build the Kohn-Sham matrix contributions coming from local atomic densities
subroutine, public update_ks_atom(qs_env, ksmat, pmat, forces, tddft, rho_atom_external, kind_set_external, oce_external, sab_external, kscale, kintegral, kforce, fscale)
The correction to the KS matrix due to the GAPW local terms to the hartree and XC contributions is he...
Calculate the KS reference potentials.
subroutine, public ks_ref_potential_atom(qs_env, local_rho_set, local_rho_set_admm, v_hartree_rspace)
calculate the Kohn-Sham GAPW reference potentials
subroutine, public ks_ref_potential(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, ehartree, exc, h_stress, vadmm_tau_rspace)
calculate the Kohn-Sham reference potential
subroutine, public local_rho_set_create(local_rho_set)
...
subroutine, public local_rho_set_release(local_rho_set)
...
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.
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.
subroutine, public rho0_s_grid_create(pw_env, rho0_mpole)
...
subroutine, public integrate_vhg0_rspace(qs_env, v_rspace, para_env, calculate_forces, local_rho_set, local_rho_set_2nd, atener, kforce, my_pools, my_rs_descs)
...
subroutine, public init_rho0(local_rho_set, qs_env, gapw_control, zcore)
...
subroutine, public get_rho0_mpole(rho0_mpole, g0_h, vg0_h, iat, ikind, lmax_0, l0_ikind, mp_gau_ikind, mp_rho, norm_g0l_h, qlm_gg, qlm_car, qlm_tot, zet0_h, igrid_zet0_s, rpgf0_h, rpgf0_s, max_rpgf0_s, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs)
...
subroutine, public allocate_rho_atom_internals(rho_atom_set, atomic_kind_set, qs_kind_set, dft_control, para_env)
...
subroutine, public calculate_rho_atom_coeff(qs_env, rho_ao, rho_atom_set, qs_kind_set, oce, sab, para_env)
...
superstucture that hold various representations of the density and keeps track of which ones are vali...
subroutine, public qs_rho_set(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
...
subroutine, public qs_rho_get(rho_struct, rho_ao, rho_ao_im, rho_ao_kp, rho_ao_im_kp, rho_r, drho_r, rho_g, drho_g, tau_r, tau_g, rho_r_valid, drho_r_valid, rho_g_valid, drho_g_valid, tau_r_valid, tau_g_valid, tot_rho_r, tot_rho_g, rho_r_sccs, soft_valid, complex_rho_ao)
returns info about the density described by this object. If some representation is not available an e...
subroutine, public qs_rho_create(rho)
Allocates a new instance of rho.
subroutine, public stda_force(qs_env, ex_env, gs_mos, stda_env, sub_env, work, debug_forces)
Simplified Tamm Dancoff approach (sTDA). Kernel contribution to forces.
subroutine, public fhxc_force(qs_env, ex_env, gs_mos, full_kernel, debug_forces)
Calculate direct tddft forces. Calculate the three last terms of the response vector in equation 49 a...
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....
routines that build the integrals of the Vxc potential calculated for the atomic density in the basis...
subroutine, public calculate_xc_2nd_deriv_atom(rho_atom_set, rho1_atom_set, qs_env, xc_section, para_env, do_tddfpt2, do_triplet, do_sf, kind_set_external)
...
type(xc_rho_cflags_type) function, public xc_functionals_get_needs(functionals, lsd, calc_potential)
...
Calculation of Coulomb Hessian contributions in xTB.
subroutine, public xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge)
...
Definition of the xTB parameter types.
subroutine, public get_xtb_atom_param(xtb_parameter, symbol, aname, typ, defined, z, zeff, natorb, lmax, nao, lao, rcut, rcov, kx, eta, xgamma, alpha, zneff, nshell, nval, lval, kpoly, kappa, hen, zeta, xi, kappa0, alpg, occupation, electronegativity, chmax, en, kqat2, kcn, kq)
...
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
keeps the information about the structure of a full matrix
type of a logger, at the moment it contains just a print level starting at which level it should be l...
Contains information on the excited states energy.
stores some data used in construction of Kohn-Sham matrix
stores all the informations relevant to an mpi environment
contained for different pw related things
environment for the poisson solver
Manages a pool of grids (to be used for example as tmp objects), but can also be used to instantiate ...
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.
contains a flag for each component of xc_rho_set, so that you can use it to tell which components you...