36 #include "./base/base_uses.f90"
41 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'libint_2c_3c'
52 REAL(
dp) :: zetainv = 0.0_dp, etainv = 0.0_dp, zetapetainv = 0.0_dp, rho = 0.0_dp
53 REAL(
dp),
DIMENSION(3) :: w = 0.0_dp
54 REAL(
dp),
DIMENSION(prim_data_f_size) :: fm = 0.0_dp
59 REAL(
dp) :: zetainv = 0.0_dp, etainv = 0.0_dp, zetapetainv = 0.0_dp, rho = 0.0_dp
60 REAL(
dp),
DIMENSION(3) :: q = 0.0_dp, w = 0.0_dp
61 REAL(
dp),
DIMENSION(prim_data_f_size) :: fm = 0.0_dp
66 TYPE :: libint_potential_type
68 REAL(
dp) :: omega = 0.0_dp
69 REAL(
dp) :: cutoff_radius = 0.0_dp
70 CHARACTER(default_path_length) :: filename =
""
71 REAL(
dp) :: scale_coulomb = 0.0_dp
72 REAL(
dp) :: scale_longrange = 0.0_dp
109 SUBROUTINE eri_3center(int_abc, la_min, la_max, npgfa, zeta, rpgfa, ra, &
110 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
111 lc_min, lc_max, npgfc, zetc, rpgfc, rc, &
112 dab, dac, dbc, lib, potential_parameter, &
115 REAL(
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: int_abc
116 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
117 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
118 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
119 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
120 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
121 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
122 INTEGER,
INTENT(IN) :: lc_min, lc_max, npgfc
123 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetc, rpgfc
124 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rc
125 REAL(kind=
dp),
INTENT(IN) :: dab, dac, dbc
126 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
127 TYPE(libint_potential_type),
INTENT(IN) :: potential_parameter
128 REAL(
dp),
INTENT(INOUT),
OPTIONAL :: int_abc_ext
130 INTEGER :: a_mysize(1), a_offset, a_start, b_offset, b_start, c_offset, c_start, i, ipgf, j, &
131 jpgf, k, kpgf, li, lj, lk, ncoa, ncob, ncoc, op, p1, p2, p3
132 REAL(
dp) :: dr_ab, dr_ac, dr_bc, zeti, zetj, zetk
133 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
134 TYPE(params_3c),
POINTER :: params
136 NULLIFY (params, p_work)
143 op = potential_parameter%potential_type
153 IF (
PRESENT(int_abc_ext))
THEN
164 a_start = (ipgf - 1)*
ncoset(la_max)
169 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
172 b_start = (jpgf - 1)*
ncoset(lb_max)
177 IF (rpgfb(jpgf) + rpgfc(kpgf) + dr_bc < dbc) cycle
178 IF (rpgfa(ipgf) + rpgfc(kpgf) + dr_ac < dac) cycle
181 c_start = (kpgf - 1)*
ncoset(lc_max)
184 CALL set_params_3c(lib, ra, rb, rc, zeti, zetj, zetk, la_max, lb_max, lc_max, &
185 potential_parameter=potential_parameter, params_out=params)
187 DO li = la_min, la_max
188 a_offset = a_start +
ncoset(li - 1)
190 DO lj = max(li, lb_min), lb_max
191 b_offset = b_start +
ncoset(lj - 1)
193 DO lk = lc_min, lc_max
194 c_offset = c_start +
ncoset(lk - 1)
197 a_mysize(1) = ncoa*ncob*ncoc
200 IF (
PRESENT(int_abc_ext))
THEN
204 p2 = (p1 + j - 1)*ncoa
207 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
208 int_abc_ext = max(int_abc_ext, abs(p_work(p3)))
216 p2 = (p1 + j - 1)*ncoa
219 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
230 CALL set_params_3c(lib, rb, ra, rc, params_in=params)
232 DO lj = lb_min, lb_max
233 b_offset = b_start +
ncoset(lj - 1)
235 DO li = max(lj + 1, la_min), la_max
236 a_offset = a_start +
ncoset(li - 1)
238 DO lk = lc_min, lc_max
239 c_offset = c_start +
ncoset(lk - 1)
242 a_mysize(1) = ncoa*ncob*ncoc
245 IF (
PRESENT(int_abc_ext))
THEN
249 p2 = (p1 + i - 1)*ncob
252 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
253 int_abc_ext = max(int_abc_ext, abs(p_work(p3)))
261 p2 = (p1 + i - 1)*ncob
264 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
301 SUBROUTINE set_params_3c(lib, ri, rj, rk, zeti, zetj, zetk, li_max, lj_max, lk_max, &
302 potential_parameter, params_in, params_out)
304 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
305 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ri, rj, rk
306 REAL(
dp),
INTENT(IN),
OPTIONAL :: zeti, zetj, zetk
307 INTEGER,
INTENT(IN),
OPTIONAL :: li_max, lj_max, lk_max
308 TYPE(libint_potential_type),
INTENT(IN),
OPTIONAL :: potential_parameter
309 TYPE(params_3c),
OPTIONAL,
POINTER :: params_in, params_out
313 REAL(
dp) :: gammaq, omega2, omega_corr, omega_corr2, &
314 prefac, r, s1234, t, tmp
315 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
316 TYPE(params_3c),
POINTER :: params
327 IF (
PRESENT(params_in))
THEN
336 params%m_max = li_max + lj_max + lk_max
338 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/gammaq
339 params%ZetapEtaInv = 1._dp/(zetk + gammaq)
341 params%Q = (zeti*ri + zetj*rj)*params%EtaInv
342 params%W = (zetk*rk + gammaq*params%Q)*params%ZetapEtaInv
343 params%Rho = zetk*gammaq/(zetk + gammaq)
346 SELECT CASE (potential_parameter%potential_type)
348 t = params%Rho*sum((params%Q - rk)**2)
349 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
350 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
352 CALL fgamma(params%m_max, t, params%Fm)
353 params%Fm = prefac*params%Fm
355 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
356 t = params%Rho*sum((params%Q - rk)**2)
357 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
358 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
361 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
362 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
363 params%Fm = prefac*params%Fm
365 t = params%Rho*sum((params%Q - rk)**2)
366 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
367 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
369 CALL fgamma(params%m_max, t, params%Fm)
371 omega2 = potential_parameter%omega**2
372 omega_corr2 = omega2/(omega2 + params%Rho)
373 omega_corr = sqrt(omega_corr2)
377 CALL fgamma(params%m_max, t, fm)
379 DO l = 1, params%m_max + 1
380 params%Fm(l) = params%Fm(l) + fm(l)*tmp
381 tmp = tmp*omega_corr2
383 params%Fm = prefac*params%Fm
385 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2) &
386 - gammaq*zetk*params%ZetapEtaInv*sum((params%Q - rk)**2))
387 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*s1234
389 params%Fm(:) = prefac
391 cpabort(
"Requested operator NYI")
397 params%ZetapEtaInv, params%Rho, rk, params%Q, params%W, &
398 params%m_max, params%Fm)
400 END SUBROUTINE set_params_3c
438 la_min, la_max, npgfa, zeta, rpgfa, ra, &
439 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
440 lc_min, lc_max, npgfc, zetc, rpgfc, rc, &
441 dab, dac, dbc, lib, potential_parameter, &
442 der_abc_1_ext, der_abc_2_ext)
444 REAL(
dp),
DIMENSION(:, :, :, :),
INTENT(INOUT) :: der_abc_1, der_abc_2
445 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
446 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
447 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
448 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
449 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
450 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
451 INTEGER,
INTENT(IN) :: lc_min, lc_max, npgfc
452 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetc, rpgfc
453 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rc
454 REAL(kind=
dp),
INTENT(IN) :: dab, dac, dbc
455 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
456 TYPE(libint_potential_type),
INTENT(IN) :: potential_parameter
457 REAL(
dp),
DIMENSION(3),
INTENT(OUT),
OPTIONAL :: der_abc_1_ext, der_abc_2_ext
459 INTEGER :: a_mysize(1), a_offset, a_start, b_offset, b_start, c_offset, c_start, i, i_deriv, &
460 ipgf, j, jpgf, k, kpgf, li, lj, lk, ncoa, ncob, ncoc, op, p1, p2, p3
461 INTEGER,
DIMENSION(3) :: permute_1, permute_2
463 REAL(
dp) :: dr_ab, dr_ac, dr_bc, zeti, zetj, zetk
464 REAL(
dp),
DIMENSION(3) :: der_abc_1_ext_prv, der_abc_2_ext_prv
465 REAL(
dp),
DIMENSION(:, :),
POINTER :: p_deriv
466 TYPE(params_3c),
POINTER :: params
468 NULLIFY (params, p_deriv)
471 permute_1 = [4, 5, 6]
472 permute_2 = [7, 8, 9]
478 op = potential_parameter%potential_type
489 IF (
PRESENT(der_abc_1_ext) .OR.
PRESENT(der_abc_2_ext)) do_ext = .true.
490 der_abc_1_ext_prv = 0.0_dp
491 der_abc_2_ext_prv = 0.0_dp
500 a_start = (ipgf - 1)*
ncoset(la_max)
505 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
508 b_start = (jpgf - 1)*
ncoset(lb_max)
513 IF (rpgfb(jpgf) + rpgfc(kpgf) + dr_bc < dbc) cycle
514 IF (rpgfa(ipgf) + rpgfc(kpgf) + dr_ac < dac) cycle
517 c_start = (kpgf - 1)*
ncoset(lc_max)
520 CALL set_params_3c_deriv(lib, ra, rb, rc, zeti, zetj, zetk, la_max, lb_max, lc_max, &
521 potential_parameter=potential_parameter, params_out=params)
523 DO li = la_min, la_max
524 a_offset = a_start +
ncoset(li - 1)
526 DO lj = max(li, lb_min), lb_max
527 b_offset = b_start +
ncoset(lj - 1)
529 DO lk = lc_min, lc_max
530 c_offset = c_start +
ncoset(lk - 1)
533 a_mysize(1) = ncoa*ncob*ncoc
542 p2 = (p1 + j - 1)*ncoa
546 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
547 p_deriv(p3, permute_2(i_deriv))
548 der_abc_1_ext_prv(i_deriv) = max(der_abc_1_ext_prv(i_deriv), &
549 abs(p_deriv(p3, permute_2(i_deriv))))
551 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
552 p_deriv(p3, permute_1(i_deriv))
553 der_abc_2_ext_prv(i_deriv) = max(der_abc_2_ext_prv(i_deriv), &
554 abs(p_deriv(p3, permute_1(i_deriv))))
565 p2 = (p1 + j - 1)*ncoa
569 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
570 p_deriv(p3, permute_2(i_deriv))
572 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
573 p_deriv(p3, permute_1(i_deriv))
586 CALL set_params_3c_deriv(lib, rb, ra, rc, zetj, zeti, zetk, params_in=params)
588 DO lj = lb_min, lb_max
589 b_offset = b_start +
ncoset(lj - 1)
591 DO li = max(lj + 1, la_min), la_max
592 a_offset = a_start +
ncoset(li - 1)
594 DO lk = lc_min, lc_max
595 c_offset = c_start +
ncoset(lk - 1)
598 a_mysize(1) = ncoa*ncob*ncoc
606 p2 = (p1 + i - 1)*ncob
610 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
611 p_deriv(p3, permute_1(i_deriv))
613 der_abc_1_ext_prv(i_deriv) = max(der_abc_1_ext_prv(i_deriv), &
614 abs(p_deriv(p3, permute_1(i_deriv))))
616 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
617 p_deriv(p3, permute_2(i_deriv))
619 der_abc_2_ext_prv(i_deriv) = max(der_abc_2_ext_prv(i_deriv), &
620 abs(p_deriv(p3, permute_2(i_deriv))))
630 p2 = (p1 + i - 1)*ncob
634 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
635 p_deriv(p3, permute_1(i_deriv))
637 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
638 p_deriv(p3, permute_2(i_deriv))
654 IF (
PRESENT(der_abc_1_ext)) der_abc_1_ext = der_abc_1_ext_prv
655 IF (
PRESENT(der_abc_2_ext)) der_abc_2_ext = der_abc_2_ext_prv
680 SUBROUTINE set_params_3c_deriv(lib, ri, rj, rk, zeti, zetj, zetk, li_max, lj_max, lk_max, &
681 potential_parameter, params_in, params_out)
683 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
684 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ri, rj, rk
685 REAL(
dp),
INTENT(IN) :: zeti, zetj, zetk
686 INTEGER,
INTENT(IN),
OPTIONAL :: li_max, lj_max, lk_max
687 TYPE(libint_potential_type),
INTENT(IN),
OPTIONAL :: potential_parameter
688 TYPE(params_3c),
OPTIONAL,
POINTER :: params_in, params_out
692 REAL(
dp) :: gammaq, omega2, omega_corr, omega_corr2, &
693 prefac, r, s1234, t, tmp
694 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
695 TYPE(params_3c),
POINTER :: params
697 IF (
PRESENT(params_in))
THEN
703 params%m_max = li_max + lj_max + lk_max + 1
705 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/gammaq
706 params%ZetapEtaInv = 1._dp/(zetk + gammaq)
708 params%Q = (zeti*ri + zetj*rj)*params%EtaInv
709 params%W = (zetk*rk + gammaq*params%Q)*params%ZetapEtaInv
710 params%Rho = zetk*gammaq/(zetk + gammaq)
713 SELECT CASE (potential_parameter%potential_type)
715 t = params%Rho*sum((params%Q - rk)**2)
716 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
717 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
719 CALL fgamma(params%m_max, t, params%Fm)
720 params%Fm = prefac*params%Fm
722 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
723 t = params%Rho*sum((params%Q - rk)**2)
724 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
725 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
728 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
729 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
730 params%Fm = prefac*params%Fm
732 t = params%Rho*sum((params%Q - rk)**2)
733 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
734 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
736 CALL fgamma(params%m_max, t, params%Fm)
738 omega2 = potential_parameter%omega**2
739 omega_corr2 = omega2/(omega2 + params%Rho)
740 omega_corr = sqrt(omega_corr2)
744 CALL fgamma(params%m_max, t, fm)
746 DO l = 1, params%m_max + 1
747 params%Fm(l) = params%Fm(l) + fm(l)*tmp
748 tmp = tmp*omega_corr2
750 params%Fm = prefac*params%Fm
752 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2) &
753 - gammaq*zetk*params%ZetapEtaInv*sum((params%Q - rk)**2))
754 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*s1234
756 params%Fm(:) = prefac
758 cpabort(
"Requested operator NYI")
764 params%Q, params%W, zetk, 0.0_dp, zetj, zeti, params%ZetaInv, &
765 params%EtaInv, params%ZetapEtaInv, params%Rho, params%m_max, params%Fm)
767 END SUBROUTINE set_params_3c_deriv
792 SUBROUTINE eri_2center(int_ab, la_min, la_max, npgfa, zeta, rpgfa, ra, &
793 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
794 dab, lib, potential_parameter)
796 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: int_ab
797 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
798 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
799 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
800 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
801 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
802 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
803 REAL(
dp),
INTENT(IN) :: dab
804 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
805 TYPE(libint_potential_type),
INTENT(IN) :: potential_parameter
807 INTEGER :: a_mysize(1), a_offset, a_start, &
808 b_offset, b_start, i, ipgf, j, jpgf, &
809 li, lj, ncoa, ncob, p1, p2
810 REAL(
dp) :: dr_ab, zeti, zetj
811 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
827 a_start = (ipgf - 1)*
ncoset(la_max)
831 b_start = (jpgf - 1)*
ncoset(lb_max)
834 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
836 CALL set_params_2c(lib, ra, rb, zeti, zetj, la_max, lb_max, potential_parameter)
838 DO li = la_min, la_max
839 a_offset = a_start +
ncoset(li - 1)
841 DO lj = lb_min, lb_max
842 b_offset = b_start +
ncoset(lj - 1)
845 a_mysize(1) = ncoa*ncob
852 int_ab(a_offset + i, b_offset + j) = p_work(p2)
875 SUBROUTINE set_params_2c(lib, rj, rk, zetj, zetk, lj_max, lk_max, potential_parameter)
877 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
878 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rj, rk
879 REAL(
dp),
INTENT(IN) :: zetj, zetk
880 INTEGER,
INTENT(IN) :: lj_max, lk_max
881 TYPE(libint_potential_type),
INTENT(IN) :: potential_parameter
885 REAL(
dp) :: omega2, omega_corr, omega_corr2, prefac, &
887 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
888 TYPE(params_2c) :: params
899 op = potential_parameter%potential_type
900 params%m_max = lj_max + lk_max
901 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/zetj
902 params%ZetapEtaInv = 1._dp/(zetk + zetj)
904 params%W = (zetk*rk + zetj*rj)*params%ZetapEtaInv
905 params%Rho = zetk*zetj/(zetk + zetj)
910 t = params%Rho*sum((rj - rk)**2)
911 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
912 CALL fgamma(params%m_max, t, params%Fm)
913 params%Fm = prefac*params%Fm
915 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
916 t = params%Rho*sum((rj - rk)**2)
917 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
920 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
921 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
922 params%Fm = prefac*params%Fm
924 t = params%Rho*sum((rj - rk)**2)
925 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
927 CALL fgamma(params%m_max, t, params%Fm)
929 omega2 = potential_parameter%omega**2
930 omega_corr2 = omega2/(omega2 + params%Rho)
931 omega_corr = sqrt(omega_corr2)
935 CALL fgamma(params%m_max, t, fm)
937 DO l = 1, params%m_max + 1
938 params%Fm(l) = params%Fm(l) + fm(l)*tmp
939 tmp = tmp*omega_corr2
941 params%Fm = prefac*params%Fm
944 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*exp(-zetj*zetk*params%ZetapEtaInv*sum((rk - rj)**2))
945 params%Fm(:) = prefac
947 cpabort(
"Requested operator NYI")
951 params%ZetapEtaInv, params%Rho, rk, rj, params%W, &
952 params%m_max, params%Fm)
954 END SUBROUTINE set_params_2c
963 TYPE(libint_potential_type),
INTENT(IN) :: potential1, potential2
966 IF (potential1%potential_type /= potential2%potential_type)
THEN
970 SELECT CASE (potential1%potential_type)
972 IF (potential1%omega /= potential2%omega) equals = .false.
974 IF (potential1%cutoff_radius /= potential2%cutoff_radius) equals = .false.
1003 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
1004 dab, lib, potential_parameter)
1006 REAL(
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: der_ab
1007 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
1008 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
1009 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
1010 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
1011 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
1012 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
1013 REAL(
dp),
INTENT(IN) :: dab
1014 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
1015 TYPE(libint_potential_type),
INTENT(IN) :: potential_parameter
1017 INTEGER :: a_mysize(1), a_offset, a_start, &
1018 b_offset, b_start, i, i_deriv, ipgf, &
1019 j, jpgf, li, lj, ncoa, ncob, p1, p2
1020 INTEGER,
DIMENSION(3) :: permute
1021 REAL(
dp) :: dr_ab, zeti, zetj
1022 REAL(
dp),
DIMENSION(:, :),
POINTER :: p_deriv
1034 dr_ab = 1000000.0_dp
1040 a_start = (ipgf - 1)*
ncoset(la_max)
1044 b_start = (jpgf - 1)*
ncoset(lb_max)
1047 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
1049 CALL set_params_2c_deriv(lib, ra, rb, zeti, zetj, la_max, lb_max, potential_parameter)
1051 DO li = la_min, la_max
1052 a_offset = a_start +
ncoset(li - 1)
1054 DO lj = lb_min, lb_max
1055 b_offset = b_start +
ncoset(lj - 1)
1058 a_mysize(1) = ncoa*ncob
1066 der_ab(a_offset + i, b_offset + j, i_deriv) = p_deriv(p2, permute(i_deriv))
1071 DEALLOCATE (p_deriv)
1091 SUBROUTINE set_params_2c_deriv(lib, rj, rk, zetj, zetk, lj_max, lk_max, potential_parameter)
1093 TYPE(cp_libint_t),
INTENT(INOUT) :: lib
1094 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rj, rk
1095 REAL(
dp),
INTENT(IN) :: zetj, zetk
1096 INTEGER,
INTENT(IN) :: lj_max, lk_max
1097 TYPE(libint_potential_type),
INTENT(IN) :: potential_parameter
1100 LOGICAL :: use_gamma
1101 REAL(
dp) :: omega2, omega_corr, omega_corr2, prefac, &
1103 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
1104 TYPE(params_2c) :: params
1115 op = potential_parameter%potential_type
1116 params%m_max = lj_max + lk_max + 1
1117 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/zetj
1118 params%ZetapEtaInv = 1._dp/(zetk + zetj)
1120 params%W = (zetk*rk + zetj*rj)*params%ZetapEtaInv
1121 params%Rho = zetk*zetj/(zetk + zetj)
1126 t = params%Rho*sum((rj - rk)**2)
1127 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1128 CALL fgamma(params%m_max, t, params%Fm)
1129 params%Fm = prefac*params%Fm
1131 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
1132 t = params%Rho*sum((rj - rk)**2)
1133 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1136 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
1137 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
1138 params%Fm = prefac*params%Fm
1140 t = params%Rho*sum((rj - rk)**2)
1141 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1143 CALL fgamma(params%m_max, t, params%Fm)
1145 omega2 = potential_parameter%omega**2
1146 omega_corr2 = omega2/(omega2 + params%Rho)
1147 omega_corr = sqrt(omega_corr2)
1151 CALL fgamma(params%m_max, t, fm)
1153 DO l = 1, params%m_max + 1
1154 params%Fm(l) = params%Fm(l) + fm(l)*tmp
1155 tmp = tmp*omega_corr2
1157 params%Fm = prefac*params%Fm
1160 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*exp(-zetj*zetk*params%ZetapEtaInv*sum((rk - rj)**2))
1161 params%Fm(:) = prefac
1163 cpabort(
"Requested operator NYI")
1166 CALL cp_libint_set_params_eri_deriv(lib, rk, rk, rj, rj, rk, rj, params%W, zetk, 0.0_dp, &
1167 zetj, 0.0_dp, params%ZetaInv, params%EtaInv, &
1168 params%ZetapEtaInv, params%Rho, &
1169 params%m_max, params%Fm)
1171 END SUBROUTINE set_params_2c_deriv
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
subroutine, public fgamma_0(nmax, t, f)
Calculation of the incomplete Gamma function F(t) for multicenter integrals over Gaussian functions....
Defines the basic variable types.
integer, parameter, public dp
integer, parameter, public default_path_length
2- and 3-center electron repulsion integral routines based on libint2 Currently available operators: ...
subroutine, public eri_2center(int_ab, la_min, la_max, npgfa, zeta, rpgfa, ra, lb_min, lb_max, npgfb, zetb, rpgfb, rb, dab, lib, potential_parameter)
Computes the 2-center electron repulsion integrals (a|b) for a given set of cartesian gaussian orbita...
pure logical function, public compare_potential_types(potential1, potential2)
Helper function to compare libint_potential_types.
subroutine, public eri_3center(int_abc, la_min, la_max, npgfa, zeta, rpgfa, ra, lb_min, lb_max, npgfb, zetb, rpgfb, rb, lc_min, lc_max, npgfc, zetc, rpgfc, rc, dab, dac, dbc, lib, potential_parameter, int_abc_ext)
Computes the 3-center electron repulsion integrals (ab|c) for a given set of cartesian gaussian orbit...
real(kind=dp), parameter, public cutoff_screen_factor
subroutine, public eri_2center_derivs(der_ab, la_min, la_max, npgfa, zeta, rpgfa, ra, lb_min, lb_max, npgfb, zetb, rpgfb, rb, dab, lib, potential_parameter)
Computes the 2-center derivatives of the electron repulsion integrals (a|b) for a given set of cartes...
subroutine, public eri_3center_derivs(der_abc_1, der_abc_2, la_min, la_max, npgfa, zeta, rpgfa, ra, lb_min, lb_max, npgfb, zetb, rpgfb, rb, lc_min, lc_max, npgfc, zetc, rpgfc, rc, dab, dac, dbc, lib, potential_parameter, der_abc_1_ext, der_abc_2_ext)
Computes the derivatives of the 3-center electron repulsion integrals (ab|c) for a given set of carte...
Interface to the Libint-Library or a c++ wrapper.
subroutine, public cp_libint_set_params_eri_deriv(libint, A, B, C, D, P, Q, W, zeta_A, zeta_B, zeta_C, zeta_D, ZetaInv, EtaInv, ZetapEtaInv, Rho, m_max, F)
subroutine, public cp_libint_get_2eri_derivs(n_b, n_a, lib, p_work, a_mysize)
...
subroutine, public cp_libint_get_3eris(n_c, n_b, n_a, lib, p_work, a_mysize)
...
subroutine, public cp_libint_get_2eris(n_b, n_a, lib, p_work, a_mysize)
...
integer, parameter, public prim_data_f_size
subroutine, public cp_libint_get_3eri_derivs(n_c, n_b, n_a, lib, p_work, a_mysize)
...
subroutine, public cp_libint_set_params_eri(libint, A, B, C, D, ZetaInv, EtaInv, ZetapEtaInv, Rho, P, Q, W, m_max, F)
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public ncoset
This module computes the basic integrals for the truncated coulomb operator.
subroutine, public t_c_g0_n(RES, use_gamma, R, T, NDERIV)
...
integer function, public get_lmax_init()
Returns the value of nderiv_init so that one can check if opening the potential file is worhtwhile.