134#include "./base/base_uses.f90"
140 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_tddfpt2_forces'
172 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_forces_main'
174 INTEGER :: handle, ispin, nspins, spin
178 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe_asymm, matrix_pe_symm, &
179 matrix_s, matrix_s_aux_fit
183 CALL timeset(routinen, handle)
185 CALL get_qs_env(qs_env, dft_control=dft_control)
189 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc)
CALL cite_reference(
sertcan2024)
191 nspins = dft_control%nspins
192 tddfpt_control => dft_control%tddfpt2_control
201 IF (gs_mos(ispin)%nmo_occ /= gs_mos(ispin)%nmo_active)
THEN
202 CALL cp_abort(__location__,
"RES-TDDFPT Forces NYA")
207 IF (
ASSOCIATED(ex_env%cpmos))
THEN
208 DO ispin = 1,
SIZE(ex_env%cpmos)
211 DEALLOCATE (ex_env%cpmos)
213 ALLOCATE (ex_env%cpmos(nspins))
217 CALL cp_fm_get_info(gs_mos(ispin)%mos_occ, matrix_struct=matrix_struct)
221 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s)
222 NULLIFY (matrix_pe_asymm, matrix_pe_symm)
232 ALLOCATE (ex_env%matrix_pe(ispin)%matrix)
233 CALL dbcsr_create(ex_env%matrix_pe(ispin)%matrix, template=matrix_s(1)%matrix)
234 CALL dbcsr_copy(ex_env%matrix_pe(ispin)%matrix, matrix_s(1)%matrix)
235 CALL dbcsr_set(ex_env%matrix_pe(ispin)%matrix, 0.0_dp)
237 ALLOCATE (matrix_pe_symm(ispin)%matrix)
238 CALL dbcsr_create(matrix_pe_symm(ispin)%matrix, template=matrix_s(1)%matrix)
239 CALL dbcsr_copy(matrix_pe_symm(ispin)%matrix, ex_env%matrix_pe(ispin)%matrix)
241 ALLOCATE (matrix_pe_asymm(ispin)%matrix)
242 CALL dbcsr_create(matrix_pe_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
243 matrix_type=dbcsr_type_antisymmetric)
252 CALL tddfpt_resvec1(ex_env%evect(spin), gs_mos(spin)%mos_active, &
253 matrix_s(1)%matrix, ex_env%matrix_pe(ispin)%matrix, ispin, do_sf)
257 IF (dft_control%do_admm)
THEN
259 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
262 ALLOCATE (ex_env%matrix_pe_admm(ispin)%matrix)
263 CALL dbcsr_create(ex_env%matrix_pe_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
264 CALL dbcsr_copy(ex_env%matrix_pe_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
265 CALL dbcsr_set(ex_env%matrix_pe_admm(ispin)%matrix, 0.0_dp)
266 CALL tddfpt_resvec1_admm(ex_env%matrix_pe(ispin)%matrix, &
267 admm_env, ex_env%matrix_pe_admm(ispin)%matrix)
273 ALLOCATE (ex_env%matrix_hz(ispin)%matrix)
274 CALL dbcsr_create(ex_env%matrix_hz(ispin)%matrix, template=matrix_s(1)%matrix)
275 CALL dbcsr_copy(ex_env%matrix_hz(ispin)%matrix, matrix_s(1)%matrix)
276 CALL dbcsr_set(ex_env%matrix_hz(ispin)%matrix, 0.0_dp)
279 IF (dft_control%qs_control%xtb)
THEN
280 CALL tddfpt_resvec2_xtb(qs_env, ex_env%matrix_pe, gs_mos, ex_env%matrix_hz, ex_env%cpmos)
282 CALL tddfpt_resvec2(qs_env, ex_env%matrix_pe, ex_env%matrix_pe_admm, &
283 gs_mos, ex_env%matrix_hz, ex_env%cpmos)
288 DO ispin = 1,
SIZE(ex_env%evect, 1)
289 ALLOCATE (ex_env%matrix_px1(ispin)%matrix)
290 CALL dbcsr_create(ex_env%matrix_px1(ispin)%matrix, template=matrix_s(1)%matrix)
291 CALL dbcsr_copy(ex_env%matrix_px1(ispin)%matrix, matrix_s(1)%matrix)
292 CALL dbcsr_set(ex_env%matrix_px1(ispin)%matrix, 0.0_dp)
294 ALLOCATE (ex_env%matrix_px1_asymm(ispin)%matrix)
295 CALL dbcsr_create(ex_env%matrix_px1_asymm(ispin)%matrix, template=matrix_s(1)%matrix, &
296 matrix_type=dbcsr_type_antisymmetric)
300 IF (tddfpt_control%do_admm)
THEN
302 CALL get_admm_env(admm_env, matrix_s_aux_fit=matrix_s_aux_fit)
305 DO ispin = 1,
SIZE(ex_env%evect, 1)
306 ALLOCATE (ex_env%matrix_px1_admm(ispin)%matrix)
307 CALL dbcsr_create(ex_env%matrix_px1_admm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix)
308 CALL dbcsr_copy(ex_env%matrix_px1_admm(ispin)%matrix, matrix_s_aux_fit(1)%matrix)
309 CALL dbcsr_set(ex_env%matrix_px1_admm(ispin)%matrix, 0.0_dp)
311 ALLOCATE (ex_env%matrix_px1_admm_asymm(ispin)%matrix)
312 CALL dbcsr_create(ex_env%matrix_px1_admm_asymm(ispin)%matrix, template=matrix_s_aux_fit(1)%matrix, &
313 matrix_type=dbcsr_type_antisymmetric)
315 ex_env%matrix_px1_admm_asymm(ispin)%matrix)
319 CALL tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
321 CALL tddfpt_resvec3(qs_env, ex_env%cpmos, work_matrices)
326 CALL timestop(handle)
341 SUBROUTINE tddfpt_forces(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices)
351 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_forces'
354 INTEGER,
ALLOCATABLE,
DIMENSION(:) :: natom_of_kind
355 LOGICAL :: debug_forces
356 REAL(kind=
dp) :: ehartree, exc
359 TYPE(
qs_force_type),
DIMENSION(:),
POINTER :: ks_force, td_force
361 CALL timeset(routinen, handle)
364 debug_forces = ex_env%debug_forces
366 CALL get_qs_env(qs_env, dft_control=dft_control, force=ks_force, &
367 atomic_kind_set=atomic_kind_set)
371 DEALLOCATE (natom_of_kind)
375 IF (dft_control%qs_control%xtb)
THEN
376 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
377 work_matrices, debug_forces)
383 ex_env%vtau_rspace, ex_env%vadmm_rspace, ehartree, exc)
386 CALL tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, &
387 work_matrices, debug_forces)
396 CALL timestop(handle)
398 END SUBROUTINE tddfpt_forces
417 SUBROUTINE tddfpt_force_direct(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, &
427 LOGICAL :: debug_forces
429 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_force_direct'
431 INTEGER :: handle, iounit, ispin, nact, natom, &
434 REAL(kind=
dp) :: evalue
435 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: ftot1, ftot2
436 REAL(kind=
dp),
DIMENSION(3) :: fodeb
438 TYPE(
cp_fm_type),
DIMENSION(:),
POINTER :: evect
440 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_ks, matrix_s, matrix_wx1, &
450 CALL timeset(routinen, handle)
453 IF (logger%para_env%is_source())
THEN
459 evect => ex_env%evect
461 CALL get_qs_env(qs_env=qs_env, ks_env=ks_env, para_env=para_env, &
462 sab_orb=sab_orb, dft_control=dft_control, force=force)
463 NULLIFY (tddfpt_control)
464 tddfpt_control => dft_control%tddfpt2_control
470 nspins = dft_control%nspins
472 IF (debug_forces)
THEN
473 CALL get_qs_env(qs_env, natom=natom, atomic_kind_set=atomic_kind_set)
474 ALLOCATE (ftot1(3, natom))
480 CALL tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
483 NULLIFY (matrix_wx1, matrix_wz)
485 matrix_wx1 => ex_env%matrix_wx1
486 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
494 ALLOCATE (matrix_wz(ispin)%matrix)
495 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
497 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
500 IF (.NOT. (do_sf .AND. (ispin == 1)))
THEN
503 evalue = ex_env%evalue
504 IF (tddfpt_control%oe_corr ==
oe_shift)
THEN
505 evalue = ex_env%evalue - tddfpt_control%ev_shift
511 IF (.NOT. (do_sf .AND. (ispin == 2)))
THEN
513 matrix_wz(ispin)%matrix)
516 IF (nspins == 2)
THEN
517 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
518 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
521 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
525 matrix_name=
"OVERLAP MATRIX", &
526 basis_type_a=
"ORB", basis_type_b=
"ORB", &
527 sab_nl=sab_orb, calculate_forces=.true., &
528 matrix_p=matrix_wz(1)%matrix)
531 IF (debug_forces)
THEN
532 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
533 CALL para_env%sum(fodeb)
534 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: Wx*dS ", fodeb
539 CALL get_qs_env(qs_env=qs_env, matrix_s=matrix_s, matrix_ks=matrix_ks)
543 ALLOCATE (matrix_wz(ispin)%matrix)
544 CALL dbcsr_create(matrix=matrix_wz(ispin)%matrix, template=matrix_s(1)%matrix)
546 CALL dbcsr_set(matrix_wz(ispin)%matrix, 0.0_dp)
549 IF (.NOT. (do_sf .AND. (ispin == 2)))
THEN
550 evalue = ex_env%evalue
551 IF (tddfpt_control%oe_corr ==
oe_shift)
THEN
552 evalue = ex_env%evalue - tddfpt_control%ev_shift
560 matrix_ks(spin)%matrix, matrix_wz(ispin)%matrix, evalue)
563 IF (nspins == 2)
THEN
564 CALL dbcsr_add(matrix_wz(1)%matrix, matrix_wz(2)%matrix, &
565 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
568 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
570 matrix_name=
"OVERLAP MATRIX", &
571 basis_type_a=
"ORB", basis_type_b=
"ORB", &
572 sab_nl=sab_orb, calculate_forces=.true., &
573 matrix_p=matrix_wz(1)%matrix)
576 IF (debug_forces)
THEN
577 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
578 CALL para_env%sum(fodeb)
579 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: xWx*dS ", fodeb
585 IF (
ASSOCIATED(matrix_wx1))
THEN
586 IF (nspins == 2 .AND. .NOT. do_sf)
THEN
587 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
588 alpha_scalar=0.5_dp, beta_scalar=0.5_dp)
589 ELSE IF (nspins == 2 .AND. do_sf)
THEN
590 CALL dbcsr_add(matrix_wx1(1)%matrix, matrix_wx1(2)%matrix, &
591 alpha_scalar=1.0_dp, beta_scalar=1.0_dp)
594 IF (debug_forces) fodeb(1:3) = force(1)%overlap(1:3, 1)
596 matrix_name=
"OVERLAP MATRIX", &
597 basis_type_a=
"ORB", basis_type_b=
"ORB", &
598 sab_nl=sab_orb, calculate_forces=.true., &
599 matrix_p=matrix_wx1(1)%matrix)
601 IF (debug_forces)
THEN
602 fodeb(1:3) = force(1)%overlap(1:3, 1) - fodeb(1:3)
603 CALL para_env%sum(fodeb)
604 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T33,3F16.8)")
"DEBUG:: D^XKP*dS ", fodeb
608 IF (debug_forces)
THEN
609 ALLOCATE (ftot2(3, natom))
611 fodeb(1:3) = ftot2(1:3, 1) - ftot1(1:3, 1)
612 CALL para_env%sum(fodeb)
613 IF (iounit > 0)
WRITE (iounit,
"(T3,A,T30,3F16.8)")
"DEBUG:: Excitation Force", fodeb
614 DEALLOCATE (ftot1, ftot2)
617 CALL timestop(handle)
619 END SUBROUTINE tddfpt_force_direct
631 SUBROUTINE tddfpt_resvec1(evect, mos_active, matrix_s, matrix_pe, spin, do_sf)
633 TYPE(
cp_fm_type),
INTENT(IN) :: evect, mos_active
634 TYPE(
dbcsr_type),
POINTER :: matrix_s, matrix_pe
635 INTEGER,
INTENT(IN) :: spin
636 LOGICAL,
INTENT(IN) :: do_sf
638 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec1'
640 INTEGER :: handle, iounit, nact, nao, norb
646 CALL timeset(routinen, handle)
647 CALL cp_fm_get_info(mos_active, nrow_global=nao, ncol_global=norb)
649 cpassert(norb == nact)
652 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 2)))
THEN
657 IF (.NOT. do_sf .OR. (do_sf .AND. (spin == 1)))
THEN
661 nrow_global=norb, ncol_global=norb)
668 CALL parallel_gemm(
'T',
'N', norb, norb, nao, 1.0_dp, cxmat, evect, 0.0_dp, xxmat)
670 CALL parallel_gemm(
'N',
'N', nao, norb, norb, 1.0_dp, mos_active, xxmat, 0.0_dp, cxmat)
674 ncol=norb, alpha=-1.0_dp, symmetry_mode=1)
680 IF (.NOT. do_sf)
THEN
681 IF (abs(tmp) > 1.e-08_dp)
THEN
683 IF (logger%para_env%is_source())
THEN
688 cpwarn(
"Electron count of excitation density matrix is non-zero.")
690 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
691 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
694 ELSE IF (spin == 1)
THEN
695 IF (abs(tmp + 1) > 1.e-08_dp)
THEN
697 IF (logger%para_env%is_source())
THEN
702 cpwarn(
"Count of occupied occupation number change is not -1.")
704 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
705 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
708 ELSE IF (spin == 2)
THEN
709 IF (abs(tmp - 1) > 1.e-08_dp)
THEN
711 IF (logger%para_env%is_source())
THEN
716 cpwarn(
"Count of unoccupied occupation number change is not 1.")
718 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", tmp
719 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
725 CALL timestop(handle)
727 END SUBROUTINE tddfpt_resvec1
735 SUBROUTINE tddfpt_resvec1_admm(matrix_pe, admm_env, matrix_pe_admm)
741 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec1_admm'
743 INTEGER :: handle, nao, nao_aux
745 CALL timeset(routinen, handle)
747 nao_aux = admm_env%nao_aux_fit
748 nao = admm_env%nao_orb
752 1.0_dp, admm_env%A, admm_env%work_orb_orb, 0.0_dp, &
753 admm_env%work_aux_orb)
755 1.0_dp, admm_env%work_aux_orb, admm_env%A, 0.0_dp, &
756 admm_env%work_aux_aux)
757 CALL copy_fm_to_dbcsr(admm_env%work_aux_aux, matrix_pe_admm, keep_sparsity=.true.)
759 CALL timestop(handle)
761 END SUBROUTINE tddfpt_resvec1_admm
774 SUBROUTINE tddfpt_resvec2(qs_env, matrix_pe, matrix_pe_admm, gs_mos, matrix_hz, cpmos)
777 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: matrix_pe, matrix_pe_admm
781 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: cpmos
783 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec2'
785 CHARACTER(LEN=default_string_length) :: basis_type
786 INTEGER :: handle, iounit, ispin, mspin, n_rep_hf, &
787 nao, nao_aux, natom, norb, nspins
788 LOGICAL :: deriv2_analytic, distribute_fock_matrix, &
789 do_hfx, gapw, gapw_xc, &
790 hfx_treat_lsd_in_core, &
792 REAL(kind=
dp) :: eh1, focc, rhotot, thartree
793 REAL(kind=
dp),
DIMENSION(2) :: total_rho
794 REAL(kind=
dp),
DIMENSION(:),
POINTER :: qlm_tot
800 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: mhz, mpe
804 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
805 TYPE(
local_rho_type),
POINTER :: local_rho_set, local_rho_set_admm
808 POINTER :: sab, sab_aux_fit
811 TYPE(
pw_c1d_gs_type),
DIMENSION(:),
POINTER :: rho_g, rho_g_aux, rhoz_g_aux, trho_g, &
817 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho_r, rho_r_aux, rhoz_r_aux, tau_r, &
818 trho_r, trho_xc_r, v_xc, v_xc_tau
819 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
821 TYPE(
qs_rho_type),
POINTER :: rho, rho_aux_fit, rho_xc, rhoz_aux, trho
822 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
826 CALL timeset(routinen, handle)
829 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env, ks_env=ks_env, &
830 dft_control=dft_control, para_env=para_env)
831 cpassert(
ASSOCIATED(pw_env))
832 nspins = dft_control%nspins
833 gapw = dft_control%qs_control%gapw
834 gapw_xc = dft_control%qs_control%gapw_xc
836 cpassert(.NOT. dft_control%tddfpt2_control%do_exck)
837 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxsr)
838 cpassert(.NOT. dft_control%tddfpt2_control%do_hfxlr)
840 NULLIFY (auxbas_pw_pool, poisson_env)
842 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
843 poisson_env=poisson_env)
845 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
846 CALL auxbas_pw_pool%create_pw(rho_tot_gspace)
847 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
849 ALLOCATE (trho_r(nspins), trho_g(nspins))
851 CALL auxbas_pw_pool%create_pw(trho_r(ispin))
852 CALL auxbas_pw_pool%create_pw(trho_g(ispin))
855 ALLOCATE (trho_xc_r(nspins), trho_xc_g(nspins))
857 CALL auxbas_pw_pool%create_pw(trho_xc_r(ispin))
858 CALL auxbas_pw_pool%create_pw(trho_xc_g(ispin))
863 NULLIFY (hartree_local, local_rho_set)
866 atomic_kind_set=atomic_kind_set, &
868 qs_kind_set=qs_kind_set)
871 qs_kind_set, dft_control, para_env)
872 CALL init_rho0(local_rho_set, qs_env, dft_control%qs_control%gapw_control, &
877 ELSEIF (gapw_xc)
THEN
879 atomic_kind_set=atomic_kind_set, &
880 qs_kind_set=qs_kind_set)
883 qs_kind_set, dft_control, para_env)
891 rho_gspace=trho_g(ispin), &
893 total_rho=total_rho(ispin))
894 CALL pw_axpy(trho_g(ispin), rho_tot_gspace)
897 rho=trho_xc_r(ispin), &
898 rho_gspace=trho_xc_g(ispin), &
899 soft_valid=gapw_xc, &
905 IF (gapw .OR. gapw_xc)
THEN
906 CALL get_qs_env(qs_env=qs_env, oce=oce, sab_orb=sab)
908 qs_kind_set, oce, sab, para_env)
911 rhotot = sum(total_rho)
914 rhotot = rhotot + local_rho_set%rho0_mpole%total_rho0_h
915 CALL pw_axpy(local_rho_set%rho0_mpole%rho0_s_gs, rho_tot_gspace)
916 IF (
ASSOCIATED(local_rho_set%rho0_mpole%rhoz_cneo_s_gs))
THEN
917 CALL pw_axpy(local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho_tot_gspace)
921 IF (abs(rhotot) > 1.e-05_dp)
THEN
923 IF (logger%para_env%is_source())
THEN
928 cpwarn(
"Real space electron count of excitation density is non-zero.")
930 WRITE (iounit,
"(T2,A,T61,G20.10)")
"Measured electron count is ", rhotot
931 WRITE (iounit,
"(T2,A,/)") repeat(
"*", 79)
938 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
939 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
942 local_rho_set, para_env, tddft=.true.)
944 calculate_forces=.false., &
945 local_rho_set=local_rho_set)
950 CALL qs_rho_get(rho, rho_r=rho_r, rho_g=rho_g)
953 IF (dft_control%do_admm)
THEN
955 xc_section => admm_env%xc_section_primary
961 IF (deriv2_analytic)
THEN
962 NULLIFY (v_xc, v_xc_tau, tau_r)
965 CALL qs_fxc_analytic(rho_xc, trho_xc_r, tau_r, xc_section, auxbas_pw_pool, .false., v_xc, v_xc_tau)
967 CALL qs_fxc_analytic(rho, trho_r, tau_r, xc_section, auxbas_pw_pool, .false., v_xc, v_xc_tau)
969 IF (gapw .OR. gapw_xc)
THEN
970 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
971 rho1_atom_set => local_rho_set%rho_atom_set
980 CALL qs_rho_set(trho, rho_r=trho_r, rho_g=trho_g)
981 CALL qs_fxc_fdiff(ks_env, rho, trho, xc_section, 6, .false., v_xc, v_xc_tau)
986 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
987 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
991 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
992 hmat=matrix_hz(ispin), &
993 calculate_forces=.false.)
994 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
995 hmat=matrix_hz(ispin), &
996 gapw=gapw_xc, calculate_forces=.false.)
1000 DO ispin = 1, nspins
1001 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1002 hmat=matrix_hz(ispin), &
1003 gapw=gapw, calculate_forces=.false.)
1004 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_hartree_rspace, &
1005 hmat=matrix_hz(ispin), &
1006 gapw=gapw, calculate_forces=.false.)
1009 IF (gapw .OR. gapw_xc)
THEN
1010 mhz(1:nspins, 1:1) => matrix_hz(1:nspins)
1011 mpe(1:nspins, 1:1) => matrix_pe(1:nspins)
1013 rho_atom_external=local_rho_set%rho_atom_set)
1016 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
1017 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
1018 CALL auxbas_pw_pool%give_back_pw(rho_tot_gspace)
1019 DO ispin = 1, nspins
1020 CALL auxbas_pw_pool%give_back_pw(trho_r(ispin))
1021 CALL auxbas_pw_pool%give_back_pw(trho_g(ispin))
1022 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1024 DEALLOCATE (trho_r, trho_g, v_xc)
1026 DO ispin = 1, nspins
1027 CALL auxbas_pw_pool%give_back_pw(trho_xc_r(ispin))
1028 CALL auxbas_pw_pool%give_back_pw(trho_xc_g(ispin))
1030 DEALLOCATE (trho_xc_r, trho_xc_g)
1032 IF (
ASSOCIATED(v_xc_tau))
THEN
1033 DO ispin = 1, nspins
1034 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
1036 DEALLOCATE (v_xc_tau)
1038 IF (dft_control%do_admm)
THEN
1042 CALL get_admm_env(admm_env, rho_aux_fit=rho_aux_fit, matrix_s_aux_fit=msaux, &
1043 task_list_aux_fit=task_list)
1044 basis_type =
"AUX_FIT"
1047 ALLOCATE (mpe(nspins, 1))
1049 DO ispin = 1, nspins
1050 ALLOCATE (mhz(ispin, 1)%matrix)
1051 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1052 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1053 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1054 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1058 NULLIFY (local_rho_set_admm)
1059 IF (admm_env%do_gapw)
THEN
1060 basis_type =
"AUX_FIT_SOFT"
1061 task_list => admm_env%admm_gapw_env%task_list
1062 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set)
1066 admm_env%admm_gapw_env%admm_kind_set, dft_control, para_env)
1068 rho_atom_set=local_rho_set_admm%rho_atom_set, &
1069 qs_kind_set=admm_env%admm_gapw_env%admm_kind_set, &
1070 oce=admm_env%admm_gapw_env%oce, sab=sab_aux_fit, para_env=para_env)
1072 do_rho0=.false., kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1075 xc_section => admm_env%xc_section_aux
1077 NULLIFY (rho_g_aux, rho_r_aux, rhoz_g_aux, rhoz_r_aux)
1078 CALL qs_rho_get(rho_aux_fit, rho_r=rho_r_aux, rho_g=rho_g_aux)
1080 ALLOCATE (rhoz_r_aux(nspins), rhoz_g_aux(nspins))
1081 DO ispin = 1, nspins
1082 CALL auxbas_pw_pool%create_pw(rhoz_r_aux(ispin))
1083 CALL auxbas_pw_pool%create_pw(rhoz_g_aux(ispin))
1085 DO ispin = 1, nspins
1087 rho=rhoz_r_aux(ispin), rho_gspace=rhoz_g_aux(ispin), &
1088 basis_type=basis_type, &
1089 task_list_external=task_list)
1094 IF (deriv2_analytic)
THEN
1096 CALL qs_fxc_analytic(rho_aux_fit, rhoz_r_aux, tau_r, xc_section, auxbas_pw_pool, .false., v_xc, v_xc_tau)
1098 cpabort(
"NYA 00007")
1102 CALL qs_rho_set(rhoz_aux, rho_r=rhoz_r_aux, rho_g=rhoz_g_aux)
1103 CALL qs_fxc_fdiff(ks_env, rho_aux_fit, rhoz_aux, xc_section, 6, .false., v_xc, v_xc_tau)
1104 DEALLOCATE (rhoz_aux)
1107 DO ispin = 1, nspins
1108 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1109 CALL integrate_v_rspace(qs_env=qs_env, v_rspace=v_xc(ispin), &
1110 hmat=mhz(ispin, 1), basis_type=basis_type, &
1111 calculate_forces=.false., &
1112 task_list_external=task_list)
1114 DO ispin = 1, nspins
1115 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1116 CALL auxbas_pw_pool%give_back_pw(rhoz_r_aux(ispin))
1117 CALL auxbas_pw_pool%give_back_pw(rhoz_g_aux(ispin))
1119 DEALLOCATE (v_xc, rhoz_r_aux, rhoz_g_aux)
1121 IF (admm_env%do_gapw)
THEN
1122 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
1123 rho1_atom_set => local_rho_set_admm%rho_atom_set
1125 para_env, kind_set_external=admm_env%admm_gapw_env%admm_kind_set)
1126 CALL update_ks_atom(qs_env, mhz(:, 1), matrix_pe_admm, forces=.false., tddft=.false., &
1127 rho_atom_external=rho1_atom_set, &
1128 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
1129 oce_external=admm_env%admm_gapw_env%oce, &
1130 sab_external=sab_aux_fit)
1133 nao = admm_env%nao_orb
1134 nao_aux = admm_env%nao_aux_fit
1136 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1137 DO ispin = 1, nspins
1139 admm_env%work_aux_orb, nao)
1141 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1142 admm_env%work_orb_orb)
1146 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1152 IF (admm_env%do_gapw)
THEN
1157 IF (gapw .OR. gapw_xc)
THEN
1167 cpassert(n_rep_hf == 1)
1171 IF (hfx_treat_lsd_in_core) mspin = nspins
1173 CALL get_qs_env(qs_env=qs_env, rho=rho, x_data=x_data, para_env=para_env, &
1174 s_mstruct_changed=s_mstruct_changed)
1175 distribute_fock_matrix = .true.
1176 IF (dft_control%do_admm)
THEN
1180 ALLOCATE (mpe(nspins, 1))
1182 DO ispin = 1, nspins
1183 ALLOCATE (mhz(ispin, 1)%matrix)
1184 CALL dbcsr_create(mhz(ispin, 1)%matrix, template=msaux(1)%matrix)
1185 CALL dbcsr_copy(mhz(ispin, 1)%matrix, msaux(1)%matrix)
1186 CALL dbcsr_set(mhz(ispin, 1)%matrix, 0.0_dp)
1187 mpe(ispin, 1)%matrix => matrix_pe_admm(ispin)%matrix
1189 IF (x_data(1, 1)%do_hfx_ri)
THEN
1191 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1192 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1193 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1198 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1203 cpassert(
ASSOCIATED(admm_env%work_aux_orb))
1204 cpassert(
ASSOCIATED(admm_env%work_orb_orb))
1205 nao = admm_env%nao_orb
1206 nao_aux = admm_env%nao_aux_fit
1208 CALL dbcsr_create(dbwork, template=matrix_hz(1)%matrix)
1209 DO ispin = 1, nspins
1211 admm_env%work_aux_orb, nao)
1213 1.0_dp, admm_env%A, admm_env%work_aux_orb, 0.0_dp, &
1214 admm_env%work_orb_orb)
1215 CALL dbcsr_copy(dbwork, matrix_hz(ispin)%matrix)
1218 CALL dbcsr_add(matrix_hz(ispin)%matrix, dbwork, 1.0_dp, 1.0_dp)
1226 ALLOCATE (mpe(nspins, 1), mhz(nspins, 1))
1227 DO ispin = 1, nspins
1228 mhz(ispin, 1)%matrix => matrix_hz(ispin)%matrix
1229 mpe(ispin, 1)%matrix => matrix_pe(ispin)%matrix
1231 IF (x_data(1, 1)%do_hfx_ri)
THEN
1233 CALL hfx_ri_update_ks(qs_env, x_data(1, 1)%ri_data, mhz, eh1, rho_ao=mpe, &
1234 geometry_did_change=s_mstruct_changed, nspins=nspins, &
1235 hf_fraction=x_data(1, 1)%general_parameter%fraction)
1240 para_env, s_mstruct_changed, 1, distribute_fock_matrix, &
1244 DEALLOCATE (mpe, mhz)
1249 IF (nspins == 2) focc = 2.0_dp
1250 DO ispin = 1, nspins
1251 mos => gs_mos(ispin)%mos_occ
1254 norb, alpha=focc, beta=0.0_dp)
1257 CALL timestop(handle)
1259 END SUBROUTINE tddfpt_resvec2
1269 SUBROUTINE tddfpt_resvec2_xtb(qs_env, matrix_pe, gs_mos, matrix_hz, cpmos)
1276 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: cpmos
1278 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec2_xtb'
1280 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
1281 na, natom, natorb, nkind, norb, ns, &
1283 INTEGER,
DIMENSION(25) :: lao
1284 INTEGER,
DIMENSION(5) :: occ
1285 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge, mcharge1
1286 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, aocg1, charges, charges1
1287 REAL(kind=
dp) :: focc
1291 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_s
1296 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
1300 CALL timeset(routinen, handle)
1302 cpassert(
ASSOCIATED(matrix_pe))
1304 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
1305 nspins = dft_control%nspins
1307 DO ispin = 1, nspins
1308 CALL dbcsr_set(matrix_hz(ispin)%matrix, 0.0_dp)
1311 IF (dft_control%qs_control%xtb_control%coulomb_interaction)
THEN
1313 CALL get_qs_env(qs_env, rho=rho, particle_set=particle_set, &
1314 matrix_s_kp=matrix_s, para_env=para_env)
1315 natom =
SIZE(particle_set)
1317 ALLOCATE (mcharge(natom), charges(natom, 5))
1318 ALLOCATE (mcharge1(natom), charges1(natom, 5))
1321 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
1322 nkind =
SIZE(atomic_kind_set)
1324 ALLOCATE (aocg(nsgf, natom))
1326 ALLOCATE (aocg1(nsgf, natom))
1328 p_matrix => matrix_p(:, 1)
1329 s_matrix => matrix_s(1, 1)%matrix
1330 CALL ao_charges(p_matrix, s_matrix, aocg, para_env)
1331 CALL ao_charges(matrix_pe, s_matrix, aocg1, para_env)
1334 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
1337 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
1338 charges(atom_a, :) = real(occ(:), kind=
dp)
1341 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
1342 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
1346 DEALLOCATE (aocg, aocg1)
1348 mcharge(iatom) = sum(charges(iatom, :))
1349 mcharge1(iatom) = sum(charges1(iatom, :))
1354 DEALLOCATE (charges, mcharge, charges1, mcharge1)
1358 IF (nspins == 2) focc = 1.0_dp
1359 DO ispin = 1, nspins
1360 mos => gs_mos(ispin)%mos_occ
1363 norb, alpha=focc, beta=0.0_dp)
1366 CALL timestop(handle)
1368 END SUBROUTINE tddfpt_resvec2_xtb
1376 SUBROUTINE tddfpt_resvec3(qs_env, cpmos, work)
1379 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: cpmos
1382 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_resvec3'
1384 INTEGER :: handle, ispin, nao, norb, nspins
1391 CALL timeset(routinen, handle)
1393 CALL get_qs_env(qs_env, mos=mos, dft_control=dft_control)
1394 nspins = dft_control%nspins
1396 DO ispin = 1, nspins
1398 associate(rvecs => cpmos(ispin))
1401 CALL cp_fm_struct_create(fmstruct, context=rvecs%matrix_struct%context, nrow_global=norb, &
1402 ncol_global=norb, para_env=rvecs%matrix_struct%para_env)
1406 CALL parallel_gemm(
"T",
"N", norb, norb, nao, 1.0_dp, omos, work%S_C0(ispin), 0.0_dp, umat)
1408 CALL parallel_gemm(
"N",
"T", nao, norb, norb, 1.0_dp, cvec, umat, 0.0_dp, rvecs)
1414 CALL timestop(handle)
1416 END SUBROUTINE tddfpt_resvec3
1430 SUBROUTINE tddfpt_kernel_force(qs_env, ex_env, gs_mos, kernel_env, sub_env, work_matrices, debug_forces)
1432 TYPE(qs_environment_type),
POINTER :: qs_env
1433 TYPE(excited_energy_type),
POINTER :: ex_env
1434 TYPE(tddfpt_ground_state_mos),
DIMENSION(:), &
1436 TYPE(kernel_env_type),
INTENT(IN) :: kernel_env
1437 TYPE(tddfpt_subgroup_env_type) :: sub_env
1438 TYPE(tddfpt_work_matrices) :: work_matrices
1439 LOGICAL,
INTENT(IN) :: debug_forces
1441 CHARACTER(LEN=*),
PARAMETER :: routinen =
'tddfpt_kernel_force'
1444 TYPE(dft_control_type),
POINTER :: dft_control
1445 TYPE(tddfpt2_control_type),
POINTER :: tddfpt_control
1447 CALL timeset(routinen, handle)
1449 CALL get_qs_env(qs_env, dft_control=dft_control)
1450 tddfpt_control => dft_control%tddfpt2_control
1452 IF (tddfpt_control%kernel == tddfpt_kernel_full)
THEN
1454 CALL fhxc_force(qs_env, ex_env, gs_mos, kernel_env%full_kernel, debug_forces)
1455 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_stda)
THEN
1457 CALL stda_force(qs_env, ex_env, gs_mos, kernel_env%stda_kernel, sub_env, work_matrices, debug_forces)
1458 ELSE IF (tddfpt_control%kernel == tddfpt_kernel_none)
THEN
1460 ex_env%matrix_wx1 => null()
1462 cpabort(
'Unknown kernel type')
1465 CALL timestop(handle)
1467 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_create(matrix, matrix_struct, name, use_sp, set_zero)
creates a new full matrix with the given structure
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_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, 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 set_qs_env(qs_env, super_cell, mos, qmmm, qmmm_periodic, 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_fdiff(ks_env, rho0_struct, rho1_struct, xc_section, accuracy, is_triplet, fxc_rho, fxc_tau)
...
subroutine, public qs_fxc_analytic(rho0, rho1_r, tau1_r, xc_section, auxbas_pw_pool, is_triplet, v_xc, v_xc_tau, spinflip)
...
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(qs_env, vh_rspace, vxc_rspace, vtau_rspace, vadmm_rspace, ehartree, exc, h_stress)
calculate the Kohn-Sham reference potential
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 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)
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)
...
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.