75 integrate_v_rspace_diagonal,&
76 integrate_v_rspace_one_center
99#include "./base/base_uses.f90"
112 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'qs_linres_kernel'
132 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
INTENT(IN) :: rho1_ao_kp
133 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: v1_ao_kp
135 CHARACTER(LEN=*),
PARAMETER :: routinen =
'apply_hxc_kernel_kp'
137 INTEGER :: handle, img, ispin, nimages, nspins
139 REAL(kind=
dp) :: energy_hartree
142 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: rho1_work
150 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho0_r, rho1_r, v_hxc, v_xc, v_xc_tau
153 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
156 CALL timeset(routinen, handle)
158 NULLIFY (admm_env, auxbas_pw_pool, dft_control, hfx_section, input, poisson_env, pw_env, rho, rho1, &
159 rho1_g, rho1_work, rho_atom_set, rho1_atom_set, v1_ao_spin, v_hxc, v_xc, &
160 v_xc_tau, xc_section)
161 CALL get_qs_env(qs_env=qs_env, admm_env=admm_env, dft_control=dft_control, input=input, &
162 pw_env=pw_env, rho=rho)
164 IF (dft_control%qs_control%semi_empirical .OR. dft_control%qs_control%dftb .OR. &
165 dft_control%qs_control%xtb)
THEN
166 cpabort(
"The periodic AO Hartree-XC kernel is only available for DFT")
168 IF (dft_control%qs_control%gapw .OR. dft_control%qs_control%gapw_xc .OR. &
169 dft_control%qs_control%lrigpw .OR. dft_control%qs_control%rigpw)
THEN
170 cpabort(
"The periodic AO Hartree-XC kernel currently requires GPW")
172 IF (dft_control%do_admm)
THEN
173 cpabort(
"The periodic AO Hartree-XC kernel currently excludes ADMM")
178 cpabort(
"The periodic AO Hartree-XC kernel currently excludes exact exchange")
181 nspins = dft_control%nspins
182 nimages = dft_control%nimages
183 cpassert(all(shape(rho1_ao_kp) == [nspins, nimages]))
185 IF (.NOT.
ASSOCIATED(v1_ao_kp))
THEN
189 ALLOCATE (v1_ao_kp(ispin, img)%matrix)
190 CALL dbcsr_copy(v1_ao_kp(ispin, img)%matrix, rho1_ao_kp(ispin, img)%matrix, &
191 name=
"K-point Hartree-XC response")
195 cpassert(all(shape(v1_ao_kp) == [nspins, nimages]))
199 CALL dbcsr_set(v1_ao_kp(ispin, img)%matrix, 0.0_dp)
205 CALL qs_rho_rebuild(rho1_store, qs_env, rebuild_ao=.true., rebuild_grids=.true.)
209 CALL dbcsr_copy(rho1_work(ispin, img)%matrix, rho1_ao_kp(ispin, img)%matrix)
215 IF (.NOT.
ASSOCIATED(kpp1_env%deriv_set))
THEN
216 ALLOCATE (kpp1_env%deriv_set, kpp1_env%rho_set)
217 CALL qs_fxc_prep(qs_env, rho, kpp1_env%rho_set, kpp1_env%deriv_set, &
218 xc_section, pw_env, is_triplet=.false.)
221 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, poisson_env=poisson_env)
222 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
223 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
224 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
226 CALL pw_copy(rho1_g(1), rho1_tot_gspace)
228 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
230 energy_hartree = 0.0_dp
231 CALL pw_poisson_solve(poisson_env, rho1_tot_gspace, energy_hartree, v_hartree_gspace)
232 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
233 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
235 CALL qs_fxc_apply(qs_env, kpp1_env%deriv_set, kpp1_env%rho_set, rho1, &
236 rho_atom_set, xc_section, .false., v_xc, v_xc_tau, rho1_atom_set)
240 CALL qs_fxc_nlvdw_apply(qs_env, xc_section, qs_env%dispersion_env, rho0_r, rho1_r, v_xc)
245 CALL pw_scale(v_hxc(ispin), v_hxc(ispin)%pw_grid%dvol)
246 CALL pw_axpy(v_hartree_rspace, v_hxc(ispin))
247 v1_ao_spin => v1_ao_kp(ispin, :)
248 CALL integrate_v_rspace(v_rspace=v_hxc(ispin), hmat_kp=v1_ao_spin, &
249 qs_env=qs_env, calculate_forces=.false.)
251 IF (
ASSOCIATED(v_xc_tau))
THEN
253 CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
254 v1_ao_spin => v1_ao_kp(ispin, :)
255 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), hmat_kp=v1_ao_spin, &
256 qs_env=qs_env, compute_tau=.true., calculate_forces=.false.)
261 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
262 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
263 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
264 DO ispin = 1,
SIZE(v_hxc)
265 CALL auxbas_pw_pool%give_back_pw(v_hxc(ispin))
268 IF (
ASSOCIATED(v_xc_tau))
THEN
269 DO ispin = 1,
SIZE(v_xc_tau)
270 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
272 DEALLOCATE (v_xc_tau)
276 CALL timestop(handle)
290 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: c0
291 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(INOUT) :: av
293 INTEGER :: ispin, ncol
296 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
297 IF (dft_control%qs_control%semi_empirical)
THEN
298 cpabort(
"Linear response not available with SE methods")
299 ELSE IF (dft_control%qs_control%dftb)
THEN
300 cpabort(
"Linear response not available with DFTB")
301 ELSE IF (dft_control%qs_control%xtb)
THEN
302 CALL apply_op_2_xtb(qs_env, p_env)
304 CALL apply_op_2_dft(qs_env, p_env)
310 DO ispin = 1,
SIZE(c0)
315 ncol=ncol, alpha=1.0_dp, beta=1.0_dp)
325 SUBROUTINE apply_op_2_dft(qs_env, p_env)
329 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_op_2_dft'
331 INTEGER :: handle, ikind, ispin, nkind, ns, nspins
332 LOGICAL :: do_onecenter, gapw, gapw_xc, lr_triplet, &
334 REAL(kind=
dp) :: alpha, ekin_mol, energy_hartree, &
339 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: k1mat, rho1_ao, rho_ao
340 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, psmat
354 TYPE(
pw_r3d_rs_type),
DIMENSION(:),
POINTER :: rho0_r, rho1_r, rho_r, v_rspace_new, &
357 TYPE(
qs_rho_type),
POINTER :: rho, rho0, rho1, rho1_xc, rho1a, &
359 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
362 CALL timeset(routinen, handle)
364 NULLIFY (auxbas_pw_pool, pw_env, v_rspace_new, para_env, v_xc, &
365 rho1_ao, rho_ao, poisson_env, input, rho, dft_control, logger, &
369 energy_hartree = 0.0_dp
370 energy_hartree_1c = 0.0_dp
372 cpassert(
ASSOCIATED(p_env%kpp1))
373 cpassert(
ASSOCIATED(p_env%kpp1_env))
374 kpp1_env => p_env%kpp1_env
383 linres_control=linres_control, &
384 dft_control=dft_control)
386 gapw = dft_control%qs_control%gapw
387 gapw_xc = dft_control%qs_control%gapw_xc
388 do_onecenter = gapw .OR. gapw_xc
389 lr_triplet = linres_control%lr_triplet
392 rho1_xc => p_env%rho1_xc
393 cpassert(
ASSOCIATED(rho1))
395 cpassert(
ASSOCIATED(rho1_xc))
398 CALL qs_rho_get(rho, rho_ao=rho_ao, rho_r=rho_r)
399 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
401 nspins =
SIZE(p_env%kpp1)
402 lrigpw = dft_control%qs_control%lrigpw
406 lri_density=lri_density, &
407 atomic_kind_set=atomic_kind_set)
410 IF (dft_control%do_admm)
THEN
411 xc_section => admm_env%xc_section_primary
419 cpassert(
ASSOCIATED(pw_env))
420 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool, &
421 poisson_env=poisson_env)
422 CALL auxbas_pw_pool%create_pw(v_hartree_gspace)
423 CALL auxbas_pw_pool%create_pw(v_hartree_rspace)
425 IF (gapw .OR. gapw_xc)
THEN
430 CALL auxbas_pw_pool%create_pw(rho1_tot_gspace)
433 CALL pw_copy(rho1_g(1), rho1_tot_gspace)
435 CALL pw_axpy(rho1_g(ispin), rho1_tot_gspace)
438 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rho0_s_gs, rho1_tot_gspace)
439 IF (
ASSOCIATED(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs))
THEN
440 CALL pw_axpy(p_env%local_rho_set%rho0_mpole%rhoz_cneo_s_gs, rho1_tot_gspace)
444 IF (.NOT. (nspins == 1 .AND. lr_triplet))
THEN
448 CALL pw_transfer(v_hartree_gspace, v_hartree_rspace)
451 CALL auxbas_pw_pool%give_back_pw(rho1_tot_gspace)
464 NULLIFY (rho_atom_set, rho1_atom_set)
465 IF (do_onecenter)
THEN
466 CALL get_qs_env(qs_env, rho_atom_set=rho_atom_set)
467 rho1_atom_set => p_env%local_rho_set%rho_atom_set
469 CALL qs_fxc_apply(qs_env, kpp1_env%deriv_set, kpp1_env%rho_set, rho1a, rho_atom_set, &
470 xc_section, do_onecenter, v_xc, v_xc_tau, rho1_atom_set)
474 CALL qs_fxc_nlvdw_apply(qs_env, xc_section, qs_env%dispersion_env, rho0_r, rho1_r, v_xc)
479 CALL pw_scale(v_hartree_rspace, v_hartree_rspace%pw_grid%dvol)
481 CALL pw_scale(v_rspace_new(ispin), v_rspace_new(ispin)%pw_grid%dvol)
482 IF (
ASSOCIATED(v_xc_tau))
CALL pw_scale(v_xc_tau(ispin), v_xc_tau(ispin)%pw_grid%dvol)
486 IF (dft_control%do_admm)
THEN
488 IF (.NOT.
ASSOCIATED(kpp1_env%deriv_set_admm))
THEN
489 cpassert(.NOT. lr_triplet)
490 xc_section_aux => admm_env%xc_section_aux
492 ALLOCATE (kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm)
493 CALL qs_fxc_prep(qs_env, rho_aux, kpp1_env%rho_set_admm, kpp1_env%deriv_set_admm, &
494 xc_section_aux, pw_env, is_triplet=.false.)
503 CALL dbcsr_set(kpp1_env%v_ao(ispin)%matrix, 0.0_dp)
509 IF (nspins == 1)
THEN
511 IF (.NOT. (lr_triplet))
THEN
512 CALL pw_scale(v_rspace_new(1), 2.0_dp)
513 IF (
ASSOCIATED(v_xc_tau))
CALL pw_scale(v_xc_tau(1), 2.0_dp)
517 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
518 pmat=rho1_ao(ispin), &
519 hmat=kpp1_env%v_ao(ispin), &
521 calculate_forces=.false., gapw=gapw_xc)
523 IF (
ASSOCIATED(v_xc_tau))
THEN
524 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
525 pmat=rho1_ao(ispin), &
526 hmat=kpp1_env%v_ao(ispin), &
528 compute_tau=.true., &
529 calculate_forces=.false., gapw=gapw_xc)
533 IF (.NOT. lr_triplet)
THEN
534 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1), 2.0_dp, 0.0_dp)
536 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
537 pmat=rho_ao(ispin), &
538 hmat=kpp1_env%v_ao(ispin), &
540 calculate_forces=.false., gapw=gapw)
544 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
545 pmat=rho_ao(ispin), &
546 hmat=kpp1_env%v_ao(ispin), &
548 calculate_forces=.false., gapw=gapw_xc)
550 IF (
ASSOCIATED(v_xc_tau))
THEN
551 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
552 pmat=rho_ao(ispin), &
553 hmat=kpp1_env%v_ao(ispin), &
555 compute_tau=.true., &
556 calculate_forces=.false., gapw=gapw_xc)
559 CALL pw_copy(v_hartree_rspace, v_rspace_new(ispin))
560 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
561 pmat=rho_ao(ispin), &
562 hmat=kpp1_env%v_ao(ispin), &
564 calculate_forces=.false., gapw=gapw)
569 IF (nspins == 1)
THEN
570 IF (.NOT. (lr_triplet))
THEN
571 CALL pw_scale(v_rspace_new(1), 2.0_dp)
572 IF (
ASSOCIATED(v_xc_tau))
CALL pw_scale(v_xc_tau(1), 2.0_dp)
576 IF (.NOT. lr_triplet)
THEN
577 CALL pw_axpy(v_hartree_rspace, v_rspace_new(1), 2.0_dp)
580 CALL pw_axpy(v_hartree_rspace, v_rspace_new(ispin), 1.0_dp)
584 IF (
ASSOCIATED(v_xc_tau))
THEN
585 cpabort(
"metaGGA-functionals not supported with LRI!")
588 lri_v_int => lri_density%lri_coefs(ispin)%lri_kinds
591 lri_v_int(ikind)%v_int = 0.0_dp
593 CALL integrate_v_rspace_one_center(v_rspace_new(ispin), qs_env, &
594 lri_v_int, .false.,
"LRI_AUX")
596 CALL para_env%sum(lri_v_int(ikind)%v_int)
599 k1mat(1)%matrix => kpp1_env%v_ao(ispin)%matrix
600 IF (lri_env%exact_1c_terms)
THEN
601 CALL integrate_v_rspace_diagonal(v_rspace_new(ispin), k1mat(1)%matrix, &
602 rho_ao(ispin)%matrix, qs_env, .false.,
"ORB")
607 CALL integrate_v_rspace(v_rspace=v_rspace_new(ispin), &
608 pmat=rho_ao(ispin), &
609 hmat=kpp1_env%v_ao(ispin), &
611 calculate_forces=.false., gapw=gapw)
613 IF (
ASSOCIATED(v_xc_tau))
THEN
614 CALL integrate_v_rspace(v_rspace=v_xc_tau(ispin), &
615 pmat=rho_ao(ispin), &
616 hmat=kpp1_env%v_ao(ispin), &
618 compute_tau=.true., &
619 calculate_forces=.false., gapw=gapw)
625 CALL dbcsr_copy(p_env%kpp1(ispin)%matrix, kpp1_env%v_ao(ispin)%matrix)
629 IF (.NOT. ((nspins == 1 .AND. lr_triplet)))
THEN
631 p_env%hartree_local%ecoul_1c, &
632 p_env%local_rho_set, &
633 para_env, tddft=.true., core_2nd=.true.)
636 calculate_forces=.false., &
637 local_rho_set=p_env%local_rho_set)
641 ns =
SIZE(p_env%kpp1)
642 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
644 psmat(1:ns, 1:1) => rho_ao(1:ns)
645 CALL update_ks_atom(qs_env, ksmat, psmat, forces=.false., tddft=.true., &
646 rho_atom_external=p_env%local_rho_set%rho_atom_set)
647 ELSE IF (gapw_xc)
THEN
648 ns =
SIZE(p_env%kpp1)
649 ksmat(1:ns, 1:1) => p_env%kpp1(1:ns)
651 psmat(1:ns, 1:1) => rho_ao(1:ns)
652 CALL update_ks_atom(qs_env, ksmat, psmat, forces=.false., tddft=.true., &
653 rho_atom_external=p_env%local_rho_set%rho_atom_set)
657 IF (dft_control%qs_control%do_kg .AND. .NOT. (lr_triplet .OR. gapw .OR. gapw_xc))
THEN
666 ks_matrix=p_env%kpp1, &
668 calc_force=.false., &
674 CALL auxbas_pw_pool%give_back_pw(v_hartree_gspace)
675 CALL auxbas_pw_pool%give_back_pw(v_hartree_rspace)
677 CALL auxbas_pw_pool%give_back_pw(v_rspace_new(ispin))
679 DEALLOCATE (v_rspace_new)
680 IF (
ASSOCIATED(v_xc_tau))
THEN
682 CALL auxbas_pw_pool%give_back_pw(v_xc_tau(ispin))
684 DEALLOCATE (v_xc_tau)
687 CALL timestop(handle)
689 END SUBROUTINE apply_op_2_dft
696 SUBROUTINE apply_op_2_xtb(qs_env, p_env)
700 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_op_2_xtb'
702 INTEGER :: atom_a, handle, iatom, ikind, is, ispin, &
703 na, natom, natorb, nkind, ns, nsgf, &
705 INTEGER,
DIMENSION(25) :: lao
706 INTEGER,
DIMENSION(5) :: occ
707 LOGICAL :: lr_triplet
708 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: mcharge, mcharge1
709 REAL(
dp),
ALLOCATABLE,
DIMENSION(:, :) :: aocg, aocg1, charges, charges1
711 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: pmat, rho_ao
712 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_p, matrix_p1, matrix_s
718 TYPE(
qs_kind_type),
DIMENSION(:),
POINTER :: qs_kind_set
723 CALL timeset(routinen, handle)
725 cpassert(
ASSOCIATED(p_env%kpp1_env))
726 cpassert(
ASSOCIATED(p_env%kpp1))
727 kpp1_env => p_env%kpp1_env
730 cpassert(
ASSOCIATED(rho1))
736 linres_control=linres_control, &
737 dft_control=dft_control)
741 lr_triplet = linres_control%lr_triplet
742 cpassert(.NOT. lr_triplet)
744 nspins =
SIZE(p_env%kpp1)
747 CALL dbcsr_set(p_env%kpp1(ispin)%matrix, 0.0_dp)
750 IF (dft_control%qs_control%xtb_control%coulomb_interaction)
THEN
752 CALL get_qs_env(qs_env, particle_set=particle_set, matrix_s_kp=matrix_s)
753 natom =
SIZE(particle_set)
756 ALLOCATE (mcharge(natom), charges(natom, 5))
757 ALLOCATE (mcharge1(natom), charges1(natom, 5))
760 CALL get_qs_env(qs_env, atomic_kind_set=atomic_kind_set, qs_kind_set=qs_kind_set)
761 nkind =
SIZE(atomic_kind_set)
763 ALLOCATE (aocg(nsgf, natom))
765 ALLOCATE (aocg1(nsgf, natom))
767 CALL ao_charges(matrix_p, matrix_s, aocg, para_env)
768 CALL ao_charges(matrix_p1, matrix_s, aocg1, para_env)
769 IF (nspins == 2) aocg1 = 0.5_dp*aocg1
772 CALL get_qs_kind(qs_kind_set(ikind), xtb_parameter=xtb_kind)
775 atom_a = atomic_kind_set(ikind)%atom_list(iatom)
776 charges(atom_a, :) = real(occ(:), kind=
dp)
779 charges(atom_a, ns) = charges(atom_a, ns) - aocg(is, atom_a)
780 charges1(atom_a, ns) = charges1(atom_a, ns) - aocg1(is, atom_a)
784 DEALLOCATE (aocg, aocg1)
786 mcharge(iatom) = sum(charges(iatom, :))
787 mcharge1(iatom) = sum(charges1(iatom, :))
790 pmat => matrix_p1(:, 1)
793 DEALLOCATE (charges, mcharge, charges1, mcharge1)
796 CALL timestop(handle)
798 END SUBROUTINE apply_op_2_xtb
811 CHARACTER(LEN=*),
PARAMETER :: routinen =
'apply_hfx'
813 INTEGER :: handle, ispin, nspins
815 REAL(kind=
dp) :: alpha
817 TYPE(
dbcsr_p_type),
DIMENSION(:),
POINTER :: h1_mat, matrix_s, rho1_ao, work
821 CALL timeset(routinen, handle)
828 dft_control=dft_control)
829 nspins = dft_control%nspins
836 IF (dft_control%do_admm)
THEN
838 cpabort(
"ADMM: Linear Response needs purification_method=none")
841 cpabort(
"ADMM: Linear Response needs scaling_model=none")
844 cpabort(
"ADMM: Linear Response needs admm_method=basis_projection")
847 rho1_ao => p_env%p1_admm
848 h1_mat => p_env%kpp1_admm
857 ALLOCATE (work(ispin)%matrix)
858 CALL dbcsr_create(work(ispin)%matrix, template=h1_mat(ispin)%matrix)
859 CALL dbcsr_copy(work(ispin)%matrix, h1_mat(ispin)%matrix)
860 CALL dbcsr_set(work(ispin)%matrix, 0.0_dp)
863 CALL hfx_matrix(work, rho1_ao, qs_env, hfx_section)
866 IF (nspins == 2) alpha = 1.0_dp
869 CALL dbcsr_add(h1_mat(ispin)%matrix, work(ispin)%matrix, 1.0_dp, alpha)
876 CALL timestop(handle)
892 SUBROUTINE hfx_matrix(matrix_ks, rho_ao, qs_env, hfx_sections, external_x_data, ex)
893 TYPE(
dbcsr_p_type),
DIMENSION(:),
TARGET :: matrix_ks, rho_ao
896 TYPE(
hfx_type),
DIMENSION(:, :),
OPTIONAL,
TARGET :: external_x_data
897 REAL(kind=
dp),
OPTIONAL :: ex
899 CHARACTER(LEN=*),
PARAMETER :: routinen =
'hfx_matrix'
901 INTEGER :: handle, irep, ispin, mspin, n_rep_hf, &
903 LOGICAL :: distribute_fock_matrix, &
904 hfx_treat_lsd_in_core, &
906 REAL(kind=
dp) :: eh1, ehfx
907 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: matrix_ks_kp, rho_ao_kp
909 TYPE(
hfx_type),
DIMENSION(:, :),
POINTER :: x_data
912 CALL timeset(routinen, handle)
914 NULLIFY (dft_control, para_env, matrix_ks_kp, rho_ao_kp, x_data)
917 dft_control=dft_control, &
919 s_mstruct_changed=s_mstruct_changed, &
922 IF (
PRESENT(external_x_data)) x_data => external_x_data
924 cpassert(dft_control%nimages == 1)
925 nspins = dft_control%nspins
932 distribute_fock_matrix = .true.
935 IF (hfx_treat_lsd_in_core) mspin = nspins
937 matrix_ks_kp(1:nspins, 1:1) => matrix_ks(1:nspins)
938 rho_ao_kp(1:nspins, 1:1) => rho_ao(1:nspins)
940 DO irep = 1, n_rep_hf
943 IF (x_data(irep, 1)%do_hfx_ri)
THEN
944 CALL hfx_ri_update_ks(qs_env, x_data(irep, 1)%ri_data, matrix_ks_kp, ehfx, &
945 rho_ao=rho_ao_kp, geometry_did_change=s_mstruct_changed, &
946 nspins=nspins, hf_fraction=x_data(irep, 1)%general_parameter%fraction)
952 s_mstruct_changed, irep, distribute_fock_matrix, ispin=ispin)
960 IF (
PRESENT(ex)) ex = ehfx
962 CALL timestop(handle)
975 CHARACTER(len=*),
PARAMETER :: routinen =
'apply_xc_admm'
977 CHARACTER(LEN=default_string_length) :: basis_type
978 INTEGER :: handle, ispin, ns, nspins
979 REAL(kind=
dp) :: alpha
983 TYPE(
dbcsr_p_type),
DIMENSION(:, :),
POINTER :: ksmat, psmat
988 POINTER :: sab_aux_fit
995 TYPE(
rho_atom_type),
DIMENSION(:),
POINTER :: rho1_atom_set, rho_atom_set
999 CALL timeset(routinen, handle)
1001 CALL get_qs_env(qs_env=qs_env, dft_control=dft_control)
1003 IF (dft_control%do_admm)
THEN
1008 CALL get_qs_env(qs_env=qs_env, linres_control=linres_control)
1009 cpassert(.NOT. dft_control%qs_control%lrigpw)
1010 cpassert(.NOT. linres_control%lr_triplet)
1012 nspins = dft_control%nspins
1015 CALL get_qs_env(qs_env=qs_env, pw_env=pw_env)
1016 cpassert(
ASSOCIATED(pw_env))
1017 CALL pw_env_get(pw_env, auxbas_pw_pool=auxbas_pw_pool)
1020 ALLOCATE (xcmat%matrix)
1021 CALL dbcsr_create(xcmat%matrix, template=matrix_s(1)%matrix)
1023 NULLIFY (v_xc, v_xc_tau)
1025 xc_section => admm_env%xc_section_aux
1026 kpp1_env => p_env%kpp1_env
1028 NULLIFY (rho_atom_set, rho1_atom_set)
1029 basis_type =
"AUX_FIT"
1030 CALL get_qs_env(qs_env, para_env=para_env, qs_kind_set=kind_set)
1031 CALL get_admm_env(admm_env, task_list_aux_fit=task_list)
1032 IF (admm_env%do_gapw)
THEN
1033 kind_set => admm_env%admm_gapw_env%admm_kind_set
1035 do_rho0=.false., kind_set_external=kind_set)
1036 rho_atom_set => admm_env%admm_gapw_env%local_rho_set%rho_atom_set
1037 rho1_atom_set => p_env%local_rho_set_admm%rho_atom_set
1038 basis_type =
"AUX_FIT_SOFT"
1039 task_list => admm_env%admm_gapw_env%task_list
1042 CALL qs_fxc_apply(qs_env, kpp1_env%deriv_set_admm, kpp1_env%rho_set_admm, p_env%rho1_admm, &
1043 rho_atom_set, xc_section, admm_env%do_gapw, v_xc, v_xc_tau, rho1_atom_set, &
1044 kind_set_external=kind_set)
1045 IF (
ASSOCIATED(v_xc_tau))
THEN
1046 cpabort(
"Meta-GGA ADMM functionals not yet supported!")
1050 IF (nspins == 1) alpha = 2.0_dp
1052 DO ispin = 1, nspins
1053 CALL pw_scale(v_xc(ispin), v_xc(ispin)%pw_grid%dvol)
1054 CALL dbcsr_copy(xcmat%matrix, matrix_s(1)%matrix)
1056 CALL integrate_v_rspace(v_rspace=v_xc(ispin), hmat=xcmat, qs_env=qs_env, &
1057 calculate_forces=.false., basis_type=basis_type, &
1058 task_list_external=task_list)
1059 CALL dbcsr_add(p_env%kpp1_admm(ispin)%matrix, xcmat%matrix, 1.0_dp, alpha)
1062 IF (admm_env%do_gapw)
THEN
1064 ns =
SIZE(p_env%kpp1_admm)
1065 ksmat(1:ns, 1:1) => p_env%kpp1_admm(1:ns)
1066 psmat(1:ns, 1:1) => p_env%p1_admm(1:ns)
1067 CALL update_ks_atom(qs_env, ksmat, psmat, forces=.false., tddft=.true., &
1068 rho_atom_external=p_env%local_rho_set_admm%rho_atom_set, &
1069 kind_set_external=admm_env%admm_gapw_env%admm_kind_set, &
1070 oce_external=admm_env%admm_gapw_env%oce, &
1071 sab_external=sab_aux_fit)
1074 DO ispin = 1, nspins
1075 CALL auxbas_pw_pool%give_back_pw(v_xc(ispin))
1083 CALL timestop(handle)
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(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.
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
subroutine, public dbcsr_deallocate_matrix(matrix)
...
subroutine, public dbcsr_copy(matrix_b, matrix_a, name, keep_sparsity, keep_imaginary)
...
subroutine, public dbcsr_set(matrix, alpha)
...
subroutine, public dbcsr_add(matrix_a, matrix_b, alpha_scalar, beta_scalar)
...
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
represent a full matrix distributed on many processors
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
various routines to log and control the output. The idea is that decisions about where to log should ...
type(cp_logger_type) function, pointer, public cp_get_default_logger()
returns the default logger
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...
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.
Routines for a Kim-Gordon-like partitioning into molecular subunits.
subroutine, public kg_ekin_subset(qs_env, ks_matrix, ekin_mol, calc_force, do_kernel, pmat_ext)
Calculates the subsystem Hohenberg-Kohn kinetic energy and the forces.
Types needed for a Kim-Gordon-like partitioning into molecular subunits.
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_string_length
contains the types and subroutines for dealing with the lri_env lri : local resolution of the identit...
routines that build the Kohn-Sham matrix for the LRIGPW and xc parts
subroutine, public calculate_lri_ks_matrix(lri_env, lri_v_int, h_matrix, atomic_kind_set, cell_to_index)
update of LRIGPW KS matrix
Interface to the message passing library MPI.
compute mulliken charges we (currently) define them as c_i = 1/2 [ (PS)_{ii} + (SP)_{ii}...
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 ...
Calculation of non local dispersion functionals Some routines adapted from: Copyright (C) 2001-2009 Q...
subroutine, public qs_fxc_nlvdw_apply(qs_env, xc_section, dispersion_env, rho0_r, rho1_r, fxc_rho)
Second derivative of nl-vdW potential.
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, mimic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, matrix_vhxc, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, xcint_weights, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
Setup Routine for Fxc Potentials.
subroutine, public qs_fxc_apply(qs_env, xc_deriv_set, xc_rho_set, rho1_struct, rho0_atom_set, xc_section, do_onecenter, fxc_rho, fxc_tau, rho1_atom_set, do_scale, is_triplet, spinflip, pw_env_ext, kind_set_external, para_env_external, compute_virial, virial_xc)
...
subroutine, public qs_fxc_prep(qs_env, rho0_struct, xc_rho_set, xc_deriv_set, xc_section, pw_env_ext, is_triplet)
...
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, hund_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, proj_shell_charge, lr_atom, do_mtlr, u_j_loop, ao_coef, 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, do_mtlr_present, basis_type, total_zeff_corr, npgf_seg, cneo_potential_present, nkind_q, natom_q)
Get attributes of an atomic kind set.
module that builds the second order perturbation kernel kpp1 = delta_rho|_P delta_rho|_P E drho(P1) d...
subroutine, public kpp1_check_i_alloc(kpp1_env, qs_env, xc_section)
checks that the intenal storage is allocated, and allocs it if needed
basis types for the calculation of the perturbation of density theory.
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...
subroutine, public apply_op_2(qs_env, p_env, c0, av)
...
subroutine, public apply_xc_admm(qs_env, p_env)
...
subroutine, public hfx_matrix(matrix_ks, rho_ao, qs_env, hfx_sections, external_x_data, ex)
Add the hfx contributions to the Hamiltonian.
subroutine, public apply_hfx(qs_env, p_env)
Update action of TDDFPT operator on trial vectors by adding exact-exchange term.
subroutine, public apply_hxc_kernel_kp(qs_env, kpp1_env, rho1_ao_kp, v1_ao_kp)
Apply the periodic GPW Hartree-XC kernel to a K-point AO density response.
Type definitiona for linear response calculations.
Define the neighbor list data types and the corresponding functionality.
Utility functions for the perturbation calculations.
subroutine, public p_env_finish_kpp1(qs_env, p_env)
...
basis types for the calculation of the perturbation of density theory.
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)
...
methods of the rho structure (defined in qs_rho_types)
subroutine, public qs_rho_update_rho(rho_struct, qs_env, rho_xc_external, local_rho_set, task_list_external, task_list_external_soft, pw_env_external, para_env_external)
updates rho_r and rho_g to the rhorho_ao. if use_kinetic_energy_density also computes tau_r and tau_g...
subroutine, public qs_rho_rebuild(rho, qs_env, rebuild_ao, rebuild_grids, admm, pw_env_external)
rebuilds rho (if necessary allocating and initializing it)
superstucture that hold various representations of the density and keeps track of which ones are vali...
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 qs_rho_release(rho_struct)
releases a rho_struct by decreasing the reference count by one and deallocating if it reaches 0 (to b...
Calculation of Coulomb Hessian contributions in xTB.
subroutine, public xtb_coulomb_hessian(qs_env, ks_matrix, charges1, mcharge1, mcharge, matrix_p1)
...
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, wall, hen, zeta, xi, kappa0, alpg, occupation, ngauss, electronegativity, chmax, en, kqat2, kcn, kq)
...
stores some data used in wavefunction fitting
Provides all information about an atomic kind.
type of a logger, at the moment it contains just a print level starting at which level it should be l...
stores some data used in construction of Kohn-Sham matrix
Contains all the info needed for KG runs...
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 ...
Provides all information about a quickstep kind.
environment that keeps the informations and temporary val to build the kpp1 kernel matrix
General settings for linear response calculations.
Represent a qs system that is perturbed. Can calculate the linear operator and the rhs of the system ...
keeps the density in various representations, keeping track of which ones are valid.