38#include "./base/base_uses.f90"
43 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'libint_2c_3c'
54 REAL(
dp) :: zetainv = 0.0_dp, etainv = 0.0_dp, zetapetainv = 0.0_dp, rho = 0.0_dp
55 REAL(
dp),
DIMENSION(3) :: w = 0.0_dp
56 REAL(
dp),
DIMENSION(prim_data_f_size) :: fm = 0.0_dp
61 REAL(
dp) :: zetainv = 0.0_dp, etainv = 0.0_dp, zetapetainv = 0.0_dp, rho = 0.0_dp
62 REAL(
dp),
DIMENSION(3) :: q = 0.0_dp, w = 0.0_dp
63 REAL(
dp),
DIMENSION(prim_data_f_size) :: fm = 0.0_dp
103 SUBROUTINE eri_3center(int_abc, la_min, la_max, npgfa, zeta, rpgfa, ra, &
104 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
105 lc_min, lc_max, npgfc, zetc, rpgfc, rc, &
106 dab, dac, dbc, lib, potential_parameter, &
109 REAL(
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: int_abc
110 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
111 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
112 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
113 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
114 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
115 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
116 INTEGER,
INTENT(IN) :: lc_min, lc_max, npgfc
117 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetc, rpgfc
118 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rc
119 REAL(kind=
dp),
INTENT(IN) :: dab, dac, dbc
122 REAL(
dp),
INTENT(INOUT),
OPTIONAL :: int_abc_ext
124 INTEGER :: a_mysize(1), a_offset, a_start, b_offset, b_start, c_offset, c_start, i, ipgf, j, &
125 jpgf, k, kpgf, li, lj, lk, ncoa, ncob, ncoc, op, p1, p2, p3
126 REAL(
dp) :: dr_ab, dr_ac, dr_bc, zeti, zetj, zetk
127 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
128 TYPE(params_3c),
POINTER :: params
130 NULLIFY (params, p_work)
137 op = potential_parameter%potential_type
148 IF (
PRESENT(int_abc_ext))
THEN
159 a_start = (ipgf - 1)*
ncoset(la_max)
164 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
167 b_start = (jpgf - 1)*
ncoset(lb_max)
172 IF (rpgfb(jpgf) + rpgfc(kpgf) + dr_bc < dbc) cycle
173 IF (rpgfa(ipgf) + rpgfc(kpgf) + dr_ac < dac) cycle
176 c_start = (kpgf - 1)*
ncoset(lc_max)
179 CALL set_params_3c(lib, ra, rb, rc, zeti, zetj, zetk, la_max, lb_max, lc_max, &
180 potential_parameter=potential_parameter, params_out=params)
182 DO li = la_min, la_max
183 a_offset = a_start +
ncoset(li - 1)
185 DO lj = max(li, lb_min), lb_max
186 b_offset = b_start +
ncoset(lj - 1)
188 DO lk = lc_min, lc_max
189 c_offset = c_start +
ncoset(lk - 1)
192 a_mysize(1) = ncoa*ncob*ncoc
195 IF (
PRESENT(int_abc_ext))
THEN
199 p2 = (p1 + j - 1)*ncoa
202 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
203 int_abc_ext = max(int_abc_ext, abs(p_work(p3)))
211 p2 = (p1 + j - 1)*ncoa
214 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
225 CALL set_params_3c(lib, rb, ra, rc, params_in=params)
227 DO lj = lb_min, lb_max
228 b_offset = b_start +
ncoset(lj - 1)
230 DO li = max(lj + 1, la_min), la_max
231 a_offset = a_start +
ncoset(li - 1)
233 DO lk = lc_min, lc_max
234 c_offset = c_start +
ncoset(lk - 1)
237 a_mysize(1) = ncoa*ncob*ncoc
240 IF (
PRESENT(int_abc_ext))
THEN
244 p2 = (p1 + i - 1)*ncob
247 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
248 int_abc_ext = max(int_abc_ext, abs(p_work(p3)))
256 p2 = (p1 + i - 1)*ncob
259 int_abc(a_offset + i, b_offset + j, c_offset + k) = p_work(p3)
296 SUBROUTINE set_params_3c(lib, ri, rj, rk, zeti, zetj, zetk, li_max, lj_max, lk_max, &
297 potential_parameter, params_in, params_out)
300 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ri, rj, rk
301 REAL(
dp),
INTENT(IN),
OPTIONAL :: zeti, zetj, zetk
302 INTEGER,
INTENT(IN),
OPTIONAL :: li_max, lj_max, lk_max
304 TYPE(params_3c),
OPTIONAL,
POINTER :: params_in, params_out
308 REAL(
dp) :: gammaq, omega2, omega_corr, omega_corr2, &
309 prefac, r, s1234, t, tmp
310 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
311 TYPE(params_3c),
POINTER :: params
322 IF (
PRESENT(params_in))
THEN
331 params%m_max = li_max + lj_max + lk_max
333 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/gammaq
334 params%ZetapEtaInv = 1._dp/(zetk + gammaq)
336 params%Q = (zeti*ri + zetj*rj)*params%EtaInv
337 params%W = (zetk*rk + gammaq*params%Q)*params%ZetapEtaInv
338 params%Rho = zetk*gammaq/(zetk + gammaq)
341 SELECT CASE (potential_parameter%potential_type)
343 t = params%Rho*sum((params%Q - rk)**2)
344 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
345 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
347 CALL fgamma(params%m_max, t, params%Fm)
348 params%Fm = prefac*params%Fm
350 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
351 t = params%Rho*sum((params%Q - rk)**2)
352 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
353 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
356 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
357 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
358 params%Fm = prefac*params%Fm
360 t = params%Rho*sum((params%Q - rk)**2)
361 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
362 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
364 CALL fgamma(params%m_max, t, params%Fm)
366 omega2 = potential_parameter%omega**2
367 omega_corr2 = omega2/(omega2 + params%Rho)
368 omega_corr = sqrt(omega_corr2)
372 CALL fgamma(params%m_max, t, fm)
374 DO l = 1, params%m_max + 1
375 params%Fm(l) = params%Fm(l) + fm(l)*tmp
376 tmp = tmp*omega_corr2
378 params%Fm = prefac*params%Fm
380 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
381 t = params%Rho*sum((params%Q - rk)**2)
382 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
383 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
386 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
387 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
390 CALL fgamma(params%m_max, t, fm)
391 DO l = 1, params%m_max + 1
392 params%Fm(l) = params%Fm(l) &
393 *(potential_parameter%scale_coulomb + potential_parameter%scale_longrange) &
394 - fm(l)*potential_parameter%scale_longrange
398 omega2 = potential_parameter%omega**2
399 omega_corr2 = omega2/(omega2 + params%Rho)
400 omega_corr = sqrt(omega_corr2)
404 CALL fgamma(params%m_max, t, fm)
406 DO l = 1, params%m_max + 1
407 params%Fm(l) = params%Fm(l) + fm(l)*tmp*potential_parameter%scale_longrange
408 tmp = tmp*omega_corr2
410 params%Fm = prefac*params%Fm
412 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2) &
413 - gammaq*zetk*params%ZetapEtaInv*sum((params%Q - rk)**2))
414 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*s1234
416 params%Fm(:) = prefac
418 cpabort(
"Requested operator NYI")
424 params%ZetapEtaInv, params%Rho, rk, params%Q, params%W, &
425 params%m_max, params%Fm)
427 END SUBROUTINE set_params_3c
465 la_min, la_max, npgfa, zeta, rpgfa, ra, &
466 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
467 lc_min, lc_max, npgfc, zetc, rpgfc, rc, &
468 dab, dac, dbc, lib, potential_parameter, &
469 der_abc_1_ext, der_abc_2_ext)
471 REAL(
dp),
DIMENSION(:, :, :, :),
INTENT(INOUT) :: der_abc_1, der_abc_2
472 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
473 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
474 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
475 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
476 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
477 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
478 INTEGER,
INTENT(IN) :: lc_min, lc_max, npgfc
479 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetc, rpgfc
480 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rc
481 REAL(kind=
dp),
INTENT(IN) :: dab, dac, dbc
484 REAL(
dp),
DIMENSION(3),
INTENT(OUT),
OPTIONAL :: der_abc_1_ext, der_abc_2_ext
486 INTEGER :: a_mysize(1), a_offset, a_start, b_offset, b_start, c_offset, c_start, i, i_deriv, &
487 ipgf, j, jpgf, k, kpgf, li, lj, lk, ncoa, ncob, ncoc, op, p1, p2, p3
488 INTEGER,
DIMENSION(3) :: permute_1, permute_2
490 REAL(
dp) :: dr_ab, dr_ac, dr_bc, zeti, zetj, zetk
491 REAL(
dp),
DIMENSION(3) :: der_abc_1_ext_prv, der_abc_2_ext_prv
492 REAL(
dp),
DIMENSION(:, :),
POINTER :: p_deriv
493 TYPE(params_3c),
POINTER :: params
495 NULLIFY (params, p_deriv)
498 permute_1 = [4, 5, 6]
499 permute_2 = [7, 8, 9]
505 op = potential_parameter%potential_type
517 IF (
PRESENT(der_abc_1_ext) .OR.
PRESENT(der_abc_2_ext)) do_ext = .true.
518 der_abc_1_ext_prv = 0.0_dp
519 der_abc_2_ext_prv = 0.0_dp
528 a_start = (ipgf - 1)*
ncoset(la_max)
533 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
536 b_start = (jpgf - 1)*
ncoset(lb_max)
541 IF (rpgfb(jpgf) + rpgfc(kpgf) + dr_bc < dbc) cycle
542 IF (rpgfa(ipgf) + rpgfc(kpgf) + dr_ac < dac) cycle
545 c_start = (kpgf - 1)*
ncoset(lc_max)
548 CALL set_params_3c_deriv(lib, ra, rb, rc, zeti, zetj, zetk, la_max, lb_max, lc_max, &
549 potential_parameter=potential_parameter, params_out=params)
551 DO li = la_min, la_max
552 a_offset = a_start +
ncoset(li - 1)
554 DO lj = max(li, lb_min), lb_max
555 b_offset = b_start +
ncoset(lj - 1)
557 DO lk = lc_min, lc_max
558 c_offset = c_start +
ncoset(lk - 1)
561 a_mysize(1) = ncoa*ncob*ncoc
570 p2 = (p1 + j - 1)*ncoa
574 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
575 p_deriv(p3, permute_2(i_deriv))
576 der_abc_1_ext_prv(i_deriv) = max(der_abc_1_ext_prv(i_deriv), &
577 abs(p_deriv(p3, permute_2(i_deriv))))
579 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
580 p_deriv(p3, permute_1(i_deriv))
581 der_abc_2_ext_prv(i_deriv) = max(der_abc_2_ext_prv(i_deriv), &
582 abs(p_deriv(p3, permute_1(i_deriv))))
593 p2 = (p1 + j - 1)*ncoa
597 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
598 p_deriv(p3, permute_2(i_deriv))
600 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
601 p_deriv(p3, permute_1(i_deriv))
614 CALL set_params_3c_deriv(lib, rb, ra, rc, zetj, zeti, zetk, params_in=params)
616 DO lj = lb_min, lb_max
617 b_offset = b_start +
ncoset(lj - 1)
619 DO li = max(lj + 1, la_min), la_max
620 a_offset = a_start +
ncoset(li - 1)
622 DO lk = lc_min, lc_max
623 c_offset = c_start +
ncoset(lk - 1)
626 a_mysize(1) = ncoa*ncob*ncoc
634 p2 = (p1 + i - 1)*ncob
638 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
639 p_deriv(p3, permute_1(i_deriv))
641 der_abc_1_ext_prv(i_deriv) = max(der_abc_1_ext_prv(i_deriv), &
642 abs(p_deriv(p3, permute_1(i_deriv))))
644 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
645 p_deriv(p3, permute_2(i_deriv))
647 der_abc_2_ext_prv(i_deriv) = max(der_abc_2_ext_prv(i_deriv), &
648 abs(p_deriv(p3, permute_2(i_deriv))))
658 p2 = (p1 + i - 1)*ncob
662 der_abc_1(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
663 p_deriv(p3, permute_1(i_deriv))
665 der_abc_2(a_offset + i, b_offset + j, c_offset + k, i_deriv) = &
666 p_deriv(p3, permute_2(i_deriv))
682 IF (
PRESENT(der_abc_1_ext)) der_abc_1_ext = der_abc_1_ext_prv
683 IF (
PRESENT(der_abc_2_ext)) der_abc_2_ext = der_abc_2_ext_prv
708 SUBROUTINE set_params_3c_deriv(lib, ri, rj, rk, zeti, zetj, zetk, li_max, lj_max, lk_max, &
709 potential_parameter, params_in, params_out)
712 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ri, rj, rk
713 REAL(
dp),
INTENT(IN) :: zeti, zetj, zetk
714 INTEGER,
INTENT(IN),
OPTIONAL :: li_max, lj_max, lk_max
716 TYPE(params_3c),
OPTIONAL,
POINTER :: params_in, params_out
720 REAL(
dp) :: gammaq, omega2, omega_corr, omega_corr2, &
721 prefac, r, s1234, t, tmp
722 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
723 TYPE(params_3c),
POINTER :: params
725 IF (
PRESENT(params_in))
THEN
731 params%m_max = li_max + lj_max + lk_max + 1
733 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/gammaq
734 params%ZetapEtaInv = 1._dp/(zetk + gammaq)
736 params%Q = (zeti*ri + zetj*rj)*params%EtaInv
737 params%W = (zetk*rk + gammaq*params%Q)*params%ZetapEtaInv
738 params%Rho = zetk*gammaq/(zetk + gammaq)
741 SELECT CASE (potential_parameter%potential_type)
743 t = params%Rho*sum((params%Q - rk)**2)
744 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
745 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
747 CALL fgamma(params%m_max, t, params%Fm)
748 params%Fm = prefac*params%Fm
750 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
751 t = params%Rho*sum((params%Q - rk)**2)
752 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
753 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
756 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
757 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
758 params%Fm = prefac*params%Fm
760 t = params%Rho*sum((params%Q - rk)**2)
761 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
762 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
764 CALL fgamma(params%m_max, t, params%Fm)
766 omega2 = potential_parameter%omega**2
767 omega_corr2 = omega2/(omega2 + params%Rho)
768 omega_corr = sqrt(omega_corr2)
772 CALL fgamma(params%m_max, t, fm)
774 DO l = 1, params%m_max + 1
775 params%Fm(l) = params%Fm(l) + fm(l)*tmp
776 tmp = tmp*omega_corr2
778 params%Fm = prefac*params%Fm
780 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
781 t = params%Rho*sum((params%Q - rk)**2)
782 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2))
783 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)*s1234
786 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
787 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
790 CALL fgamma(params%m_max, t, fm)
791 DO l = 1, params%m_max + 1
792 params%Fm(l) = params%Fm(l) &
793 *(potential_parameter%scale_coulomb + potential_parameter%scale_longrange) &
794 - fm(l)*potential_parameter%scale_longrange
798 omega2 = potential_parameter%omega**2
799 omega_corr2 = omega2/(omega2 + params%Rho)
800 omega_corr = sqrt(omega_corr2)
804 CALL fgamma(params%m_max, t, fm)
806 DO l = 1, params%m_max + 1
807 params%Fm(l) = params%Fm(l) + fm(l)*tmp*potential_parameter%scale_longrange
808 tmp = tmp*omega_corr2
810 params%Fm = prefac*params%Fm
812 s1234 = exp(-zeti*zetj*params%EtaInv*sum((rj - ri)**2) &
813 - gammaq*zetk*params%ZetapEtaInv*sum((params%Q - rk)**2))
814 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*s1234
816 params%Fm(:) = prefac
818 cpabort(
"Requested operator NYI")
824 params%Q, params%W, zetk, 0.0_dp, zetj, zeti, params%ZetaInv, &
825 params%EtaInv, params%ZetapEtaInv, params%Rho, params%m_max, params%Fm)
827 END SUBROUTINE set_params_3c_deriv
852 SUBROUTINE eri_2center(int_ab, la_min, la_max, npgfa, zeta, rpgfa, ra, &
853 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
854 dab, lib, potential_parameter)
856 REAL(
dp),
DIMENSION(:, :),
INTENT(INOUT) :: int_ab
857 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
858 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
859 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
860 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
861 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
862 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
863 REAL(
dp),
INTENT(IN) :: dab
867 INTEGER :: a_mysize(1), a_offset, a_start, &
868 b_offset, b_start, i, ipgf, j, jpgf, &
869 li, lj, ncoa, ncob, p1, p2
870 REAL(
dp) :: dr_ab, zeti, zetj
871 REAL(
dp),
DIMENSION(:),
POINTER :: p_work
888 a_start = (ipgf - 1)*
ncoset(la_max)
892 b_start = (jpgf - 1)*
ncoset(lb_max)
895 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
897 CALL set_params_2c(lib, ra, rb, zeti, zetj, la_max, lb_max, potential_parameter)
899 DO li = la_min, la_max
900 a_offset = a_start +
ncoset(li - 1)
902 DO lj = lb_min, lb_max
903 b_offset = b_start +
ncoset(lj - 1)
906 a_mysize(1) = ncoa*ncob
913 int_ab(a_offset + i, b_offset + j) = p_work(p2)
936 SUBROUTINE set_params_2c(lib, rj, rk, zetj, zetk, lj_max, lk_max, potential_parameter)
939 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rj, rk
940 REAL(
dp),
INTENT(IN) :: zetj, zetk
941 INTEGER,
INTENT(IN) :: lj_max, lk_max
946 REAL(
dp) :: omega2, omega_corr, omega_corr2, prefac, &
948 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
949 TYPE(params_2c) :: params
960 op = potential_parameter%potential_type
961 params%m_max = lj_max + lk_max
962 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/zetj
963 params%ZetapEtaInv = 1._dp/(zetk + zetj)
965 params%W = (zetk*rk + zetj*rj)*params%ZetapEtaInv
966 params%Rho = zetk*zetj/(zetk + zetj)
971 t = params%Rho*sum((rj - rk)**2)
972 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
973 CALL fgamma(params%m_max, t, params%Fm)
974 params%Fm = prefac*params%Fm
976 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
977 t = params%Rho*sum((rj - rk)**2)
978 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
981 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
982 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
983 params%Fm = prefac*params%Fm
985 t = params%Rho*sum((rj - rk)**2)
986 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
988 CALL fgamma(params%m_max, t, params%Fm)
990 omega2 = potential_parameter%omega**2
991 omega_corr2 = omega2/(omega2 + params%Rho)
992 omega_corr = sqrt(omega_corr2)
996 CALL fgamma(params%m_max, t, fm)
998 DO l = 1, params%m_max + 1
999 params%Fm(l) = params%Fm(l) + fm(l)*tmp
1000 tmp = tmp*omega_corr2
1002 params%Fm = prefac*params%Fm
1004 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
1005 t = params%Rho*sum((rj - rk)**2)
1006 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1009 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
1010 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
1013 CALL fgamma(params%m_max, t, fm)
1014 DO l = 1, params%m_max + 1
1015 params%Fm(l) = params%Fm(l) &
1016 *(potential_parameter%scale_coulomb + potential_parameter%scale_longrange) &
1017 - fm(l)*potential_parameter%scale_longrange
1021 omega2 = potential_parameter%omega**2
1022 omega_corr2 = omega2/(omega2 + params%Rho)
1023 omega_corr = sqrt(omega_corr2)
1027 CALL fgamma(params%m_max, t, fm)
1029 DO l = 1, params%m_max + 1
1030 params%Fm(l) = params%Fm(l) + fm(l)*tmp*potential_parameter%scale_longrange
1031 tmp = tmp*omega_corr2
1033 params%Fm = prefac*params%Fm
1036 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*exp(-zetj*zetk*params%ZetapEtaInv*sum((rk - rj)**2))
1037 params%Fm(:) = prefac
1039 cpabort(
"Requested operator NYI")
1043 params%ZetapEtaInv, params%Rho, rk, rj, params%W, &
1044 params%m_max, params%Fm)
1046 END SUBROUTINE set_params_2c
1058 IF (potential1%potential_type /= potential2%potential_type)
THEN
1062 SELECT CASE (potential1%potential_type)
1064 IF (potential1%omega /= potential2%omega) equals = .false.
1066 IF (potential1%cutoff_radius /= potential2%cutoff_radius) equals = .false.
1068 IF (potential1%cutoff_radius /= potential2%cutoff_radius) equals = .false.
1069 IF (potential1%omega /= potential2%omega) equals = .false.
1070 IF (potential1%scale_coulomb /= potential2%scale_coulomb) equals = .false.
1071 IF (potential1%scale_longrange /= potential2%scale_longrange) equals = .false.
1100 lb_min, lb_max, npgfb, zetb, rpgfb, rb, &
1101 dab, lib, potential_parameter)
1103 REAL(
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: der_ab
1104 INTEGER,
INTENT(IN) :: la_min, la_max, npgfa
1105 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zeta, rpgfa
1106 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: ra
1107 INTEGER,
INTENT(IN) :: lb_min, lb_max, npgfb
1108 REAL(
dp),
DIMENSION(:),
INTENT(IN) :: zetb, rpgfb
1109 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rb
1110 REAL(
dp),
INTENT(IN) :: dab
1114 INTEGER :: a_mysize(1), a_offset, a_start, &
1115 b_offset, b_start, i, i_deriv, ipgf, &
1116 j, jpgf, li, lj, ncoa, ncob, p1, p2
1117 INTEGER,
DIMENSION(3) :: permute
1118 REAL(
dp) :: dr_ab, zeti, zetj
1119 REAL(
dp),
DIMENSION(:, :),
POINTER :: p_deriv
1132 dr_ab = 1000000.0_dp
1138 a_start = (ipgf - 1)*
ncoset(la_max)
1142 b_start = (jpgf - 1)*
ncoset(lb_max)
1145 IF (rpgfa(ipgf) + rpgfb(jpgf) + dr_ab < dab) cycle
1147 CALL set_params_2c_deriv(lib, ra, rb, zeti, zetj, la_max, lb_max, potential_parameter)
1149 DO li = la_min, la_max
1150 a_offset = a_start +
ncoset(li - 1)
1152 DO lj = lb_min, lb_max
1153 b_offset = b_start +
ncoset(lj - 1)
1156 a_mysize(1) = ncoa*ncob
1164 der_ab(a_offset + i, b_offset + j, i_deriv) = p_deriv(p2, permute(i_deriv))
1169 DEALLOCATE (p_deriv)
1189 SUBROUTINE set_params_2c_deriv(lib, rj, rk, zetj, zetk, lj_max, lk_max, potential_parameter)
1192 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rj, rk
1193 REAL(
dp),
INTENT(IN) :: zetj, zetk
1194 INTEGER,
INTENT(IN) :: lj_max, lk_max
1198 LOGICAL :: use_gamma
1199 REAL(
dp) :: omega2, omega_corr, omega_corr2, prefac, &
1201 REAL(
dp),
ALLOCATABLE,
DIMENSION(:) :: fm
1202 TYPE(params_2c) :: params
1213 op = potential_parameter%potential_type
1214 params%m_max = lj_max + lk_max + 1
1215 params%ZetaInv = 1._dp/zetk; params%EtaInv = 1._dp/zetj
1216 params%ZetapEtaInv = 1._dp/(zetk + zetj)
1218 params%W = (zetk*rk + zetj*rj)*params%ZetapEtaInv
1219 params%Rho = zetk*zetj/(zetk + zetj)
1224 t = params%Rho*sum((rj - rk)**2)
1225 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1226 CALL fgamma(params%m_max, t, params%Fm)
1227 params%Fm = prefac*params%Fm
1229 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
1230 t = params%Rho*sum((rj - rk)**2)
1231 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1234 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
1235 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
1236 params%Fm = prefac*params%Fm
1238 t = params%Rho*sum((rj - rk)**2)
1239 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1241 CALL fgamma(params%m_max, t, params%Fm)
1243 omega2 = potential_parameter%omega**2
1244 omega_corr2 = omega2/(omega2 + params%Rho)
1245 omega_corr = sqrt(omega_corr2)
1249 CALL fgamma(params%m_max, t, fm)
1251 DO l = 1, params%m_max + 1
1252 params%Fm(l) = params%Fm(l) + fm(l)*tmp
1253 tmp = tmp*omega_corr2
1255 params%Fm = prefac*params%Fm
1257 r = potential_parameter%cutoff_radius*sqrt(params%Rho)
1258 t = params%Rho*sum((rj - rk)**2)
1259 prefac = 2._dp*
pi/params%Rho*sqrt((
pi*params%ZetapEtaInv)**3)
1262 CALL t_c_g0_n(params%Fm, use_gamma, r, t, params%m_max)
1263 IF (use_gamma)
CALL fgamma(params%m_max, t, params%Fm)
1266 CALL fgamma(params%m_max, t, fm)
1267 DO l = 1, params%m_max + 1
1268 params%Fm(l) = params%Fm(l) &
1269 *(potential_parameter%scale_coulomb + potential_parameter%scale_longrange) &
1270 - fm(l)*potential_parameter%scale_longrange
1274 omega2 = potential_parameter%omega**2
1275 omega_corr2 = omega2/(omega2 + params%Rho)
1276 omega_corr = sqrt(omega_corr2)
1280 CALL fgamma(params%m_max, t, fm)
1282 DO l = 1, params%m_max + 1
1283 params%Fm(l) = params%Fm(l) + fm(l)*tmp*potential_parameter%scale_longrange
1284 tmp = tmp*omega_corr2
1286 params%Fm = prefac*params%Fm
1289 prefac = sqrt((
pi*params%ZetapEtaInv)**3)*exp(-zetj*zetk*params%ZetapEtaInv*sum((rk - rj)**2))
1290 params%Fm(:) = prefac
1292 cpabort(
"Requested operator NYI")
1295 CALL cp_libint_set_params_eri_deriv(lib, rk, rk, rj, rj, rk, rj, params%W, zetk, 0.0_dp, &
1296 zetj, 0.0_dp, params%ZetaInv, params%EtaInv, &
1297 params%ZetapEtaInv, params%Rho, &
1298 params%m_max, params%Fm)
1300 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....
Library choices for electronic integral APIs.
Defines the basic variable types.
integer, parameter, public dp
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 Coulomb operator 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_set_params_eri(libint, a, b, c, d, zetainv, etainv, zetapetainv, rho, p, q, w, m_max, f)
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)
...
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.