13#include "../base/base_uses.f90"
16 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ai_os_rr'
24 MODULE PROCEDURE os_rr_ovlp_real, os_rr_ovlp_complex
28 MODULE PROCEDURE os_rr_ovlp3_real, os_rr_ovlp3_complex
32 MODULE PROCEDURE os_rr_radial_abm
52 SUBROUTINE os_rr_ovlp_real (rap, la_max, rbp, lb_max, zet, ldrr, rr)
53 REAL (dp),
DIMENSION(3),
INTENT(IN) :: rap
54 INTEGER,
INTENT(IN) :: la_max
55 REAL (dp),
DIMENSION(3),
INTENT(IN) :: rbp
56 INTEGER,
INTENT(IN) :: lb_max
57 REAL(dp),
INTENT(IN) :: zet
58 INTEGER,
INTENT(IN) :: ldrr
59 REAL (dp),
DIMENSION(0:ldrr - 1, 0:ldrr - 1, 3) :: rr
64 CALL os_rr_ovlp_1d_real (rap(idir), la_max, rbp(idir), lb_max, zet, rr(:, :, idir))
66 END SUBROUTINE os_rr_ovlp_real
77 PURE SUBROUTINE os_rr_ovlp_1d_real (rap, la_max, rbp, lb_max, zet, rr)
78 REAL (dp),
INTENT(IN) :: rap, rbp
79 INTEGER,
INTENT(IN) :: la_max, lb_max
80 REAL(dp),
INTENT(IN) :: zet
81 REAL (dp),
INTENT(INOUT) :: rr(0:, 0:)
83 INTEGER :: la, lam1, lap1, lb, lbm1, lbp1
94 rr(lap1, 0) = real(la, dp)*g*rr(lam1, 0) + rap*rr(la, 0)
102 rr(la, 1) = real(la, dp)*g*rr(lam1, 0) + rbp*rr(la, 0)
104 DO lb = 1, lb_max - 1
107 rr(0, lbp1) = real(lb, dp)*g*rr(0, lbm1) + rbp*rr(0, lb)
110 rr(la, lbp1) = g*(real(la, dp)*rr(lam1, lb) + real(lb, dp)*rr(la, lbm1)) + &
115 END SUBROUTINE os_rr_ovlp_1d_real
129 SUBROUTINE os_rr_ovlp3_real (rap, la_max, rbp, lb_max, rcp, lc_max, zet, rr)
130 REAL (dp),
INTENT(IN) :: rap(3), rbp(3), rcp(3)
131 INTEGER,
INTENT(IN) :: la_max, lb_max, lc_max
132 REAL(dp),
INTENT(IN) :: zet
133 REAL (dp),
INTENT(INOUT) :: rr(0:, 0:, 0:, :)
135 INTEGER :: a, b, c, idir
140 CALL os_rr_ovlp_1d_real (rap(idir), la_max, rbp(idir), lb_max, zet, rr(:, :, 0, idir))
144 rr(a, b, c + 1, idir) = rcp(idir)*rr(a, b, c, idir) + &
145 g*(real(a, dp)*rr(max(0, a - 1), b, c, idir) + &
146 REAL(b, dp)*rr(a, MAX(0, b - 1), c, idir) + &
147 REAL(c, dp)*rr(a, b, MAX(0, c - 1), idir))
152 END SUBROUTINE os_rr_ovlp3_real
168 SUBROUTINE os_rr_ovlp_complex (rap, la_max, rbp, lb_max, zet, ldrr, rr)
169 COMPLEX (dp),
DIMENSION(3),
INTENT(IN) :: rap
170 INTEGER,
INTENT(IN) :: la_max
171 COMPLEX (dp),
DIMENSION(3),
INTENT(IN) :: rbp
172 INTEGER,
INTENT(IN) :: lb_max
173 REAL(dp),
INTENT(IN) :: zet
174 INTEGER,
INTENT(IN) :: ldrr
175 COMPLEX (dp),
DIMENSION(0:ldrr - 1, 0:ldrr - 1, 3) :: rr
180 CALL os_rr_ovlp_1d_complex (rap(idir), la_max, rbp(idir), lb_max, zet, rr(:, :, idir))
182 END SUBROUTINE os_rr_ovlp_complex
193 PURE SUBROUTINE os_rr_ovlp_1d_complex (rap, la_max, rbp, lb_max, zet, rr)
194 COMPLEX (dp),
INTENT(IN) :: rap, rbp
195 INTEGER,
INTENT(IN) :: la_max, lb_max
196 REAL(dp),
INTENT(IN) :: zet
197 COMPLEX (dp),
INTENT(INOUT) :: rr(0:, 0:)
199 INTEGER :: la, lam1, lap1, lb, lbm1, lbp1
207 DO la = 1, la_max - 1
210 rr(lap1, 0) = real(la, dp)*g*rr(lam1, 0) + rap*rr(la, 0)
218 rr(la, 1) = real(la, dp)*g*rr(lam1, 0) + rbp*rr(la, 0)
220 DO lb = 1, lb_max - 1
223 rr(0, lbp1) = real(lb, dp)*g*rr(0, lbm1) + rbp*rr(0, lb)
226 rr(la, lbp1) = g*(real(la, dp)*rr(lam1, lb) + real(lb, dp)*rr(la, lbm1)) + &
231 END SUBROUTINE os_rr_ovlp_1d_complex
245 SUBROUTINE os_rr_ovlp3_complex (rap, la_max, rbp, lb_max, rcp, lc_max, zet, rr)
246 COMPLEX (dp),
INTENT(IN) :: rap(3), rbp(3), rcp(3)
247 INTEGER,
INTENT(IN) :: la_max, lb_max, lc_max
248 REAL(dp),
INTENT(IN) :: zet
249 COMPLEX (dp),
INTENT(INOUT) :: rr(0:, 0:, 0:, :)
251 INTEGER :: a, b, c, idir
256 CALL os_rr_ovlp_1d_complex (rap(idir), la_max, rbp(idir), lb_max, zet, rr(:, :, 0, idir))
260 rr(a, b, c + 1, idir) = rcp(idir)*rr(a, b, c, idir) + &
261 g*(real(a, dp)*rr(max(0, a - 1), b, c, idir) + &
262 REAL(b, dp)*rr(a, MAX(0, b - 1), c, idir) + &
263 REAL(c, dp)*rr(a, b, MAX(0, c - 1), idir))
268 END SUBROUTINE os_rr_ovlp3_complex
283 SUBROUTINE os_rr_radial_abm (rap, la_max, rbp, lb_max, rpw, zetp, eta, mmax, rr)
284 REAL(dp),
INTENT(IN) :: rap(3), rbp(3), rpw(3), zetp, eta
285 INTEGER,
INTENT(IN) :: la_max, lb_max, mmax
286 REAL(dp),
INTENT(INOUT) :: rr(:, :, 0:)
288 INTEGER :: axis, degree, ia, ia1, ia2, ib, ib1, ib2, ico, iinner, iouter, la, lb, m, power(3)
289 INTEGER :: lowered(3, ncoset(MAX(la_max, lb_max)))
293 DO ico = 1, ncoset(max(la_max, lb_max))
294 power =
indco(:, ico)
295 lowered(:, ico) = [
coset(max(0, power(1) - 1), power(2), power(3)), &
296 coset(power(1), max(0, power(2) - 1), power(3)), &
297 coset(power(1), power(2), max(0, power(3) - 1))]
300 DO iouter = 0, mmax - la
301 DO iinner = ncoset(la - 1) + 1, ncoset(la)
305 IF (
indco(3, ia) == 0) axis = 2
306 IF (
indco(axis, ia) == 0) axis = 1
307 ia1 = lowered(axis, ia)
308 ia2 = lowered(axis, ia1)
309 degree =
indco(axis, ia) - 1
310 rr(ia, 1, m) = rap(axis)*rr(ia1, 1, m) + &
311 rpw(axis)*rr(ia1, 1, m + 1)
313 rr(ia, 1, m) = rr(ia, 1, m) + g*real(degree, dp)* &
314 (rr(ia2, 1, m) - eta*rr(ia2, 1, m + 1))
320 DO ib = ncoset(lb - 1) + 1, ncoset(lb)
322 IF (
indco(3, ib) == 0) axis = 2
323 IF (
indco(axis, ib) == 0) axis = 1
324 ib1 = lowered(axis, ib)
325 ib2 = lowered(axis, ib1)
326 degree =
indco(axis, ib) - 1
328 DO iouter = 0, mmax - la - lb
329 DO iinner = ncoset(la - 1) + 1, ncoset(la)
332 ia1 = lowered(axis, ia)
333 rr(ia, ib, m) = rbp(axis)*rr(ia, ib1, m) + &
334 rpw(axis)*rr(ia, ib1, m + 1)
336 rr(ia, ib, m) = rr(ia, ib, m) + g*real(degree, dp)* &
337 (rr(ia, ib2, m) - eta*rr(ia, ib2, m + 1))
339 IF (
indco(axis, ia) > 0)
THEN
340 rr(ia, ib, m) = rr(ia, ib, m) + g*real(
indco(axis, ia), dp)* &
341 (rr(ia1, ib1, m) - eta*rr(ia1, ib1, m + 1))
348 END SUBROUTINE os_rr_radial_abm
362 SUBROUTINE os_rr_radial_mab (rap, la_max, rbp, lb_max, rpw, zetp, eta, mmax, rr)
363 REAL(dp),
INTENT(IN) :: rap(3), rbp(3), rpw(3), zetp, eta
364 INTEGER,
INTENT(IN) :: la_max, lb_max, mmax
365 REAL(dp),
INTENT(INOUT) :: rr(0:, :, :)
367 INTEGER :: axis, degree, ia, ia1, ia2, ib, ib1, ib2, ico, iinner, iouter, la, lb, m, power(3)
368 INTEGER :: lowered(3, ncoset(MAX(la_max, lb_max)))
372 DO ico = 1, ncoset(max(la_max, lb_max))
373 power =
indco(:, ico)
374 lowered(:, ico) = [
coset(max(0, power(1) - 1), power(2), power(3)), &
375 coset(power(1), max(0, power(2) - 1), power(3)), &
376 coset(power(1), power(2), max(0, power(3) - 1))]
379 DO iouter = ncoset(la - 1) + 1, ncoset(la)
380 DO iinner = 0, mmax - la
384 IF (
indco(3, ia) == 0) axis = 2
385 IF (
indco(axis, ia) == 0) axis = 1
386 ia1 = lowered(axis, ia)
387 ia2 = lowered(axis, ia1)
388 degree =
indco(axis, ia) - 1
389 rr(m, ia, 1) = rap(axis)*rr(m, ia1, 1) + &
390 rpw(axis)*rr(m + 1, ia1, 1)
392 rr(m, ia, 1) = rr(m, ia, 1) + g*real(degree, dp)* &
393 (rr(m, ia2, 1) - eta*rr(m + 1, ia2, 1))
399 DO ib = ncoset(lb - 1) + 1, ncoset(lb)
401 IF (
indco(3, ib) == 0) axis = 2
402 IF (
indco(axis, ib) == 0) axis = 1
403 ib1 = lowered(axis, ib)
404 ib2 = lowered(axis, ib1)
405 degree =
indco(axis, ib) - 1
407 DO iouter = ncoset(la - 1) + 1, ncoset(la)
408 DO iinner = 0, mmax - la - lb
411 ia1 = lowered(axis, ia)
412 rr(m, ia, ib) = rbp(axis)*rr(m, ia, ib1) + &
413 rpw(axis)*rr(m + 1, ia, ib1)
415 rr(m, ia, ib) = rr(m, ia, ib) + g*real(degree, dp)* &
416 (rr(m, ia, ib2) - eta*rr(m + 1, ia, ib2))
418 IF (
indco(axis, ia) > 0)
THEN
419 rr(m, ia, ib) = rr(m, ia, ib) + g*real(
indco(axis, ia), dp)* &
420 (rr(m, ia1, ib1) - eta*rr(m + 1, ia1, ib1))
427 END SUBROUTINE os_rr_radial_mab
442 SUBROUTINE os_rr_coulomb3(rap, la_max, rbp, lb_max, rcp, lc_max, zetp, zetq, zetw, rr)
443 REAL(
dp),
INTENT(IN) :: rap(3), rbp(3), rcp(3), zetp, zetq, zetw
444 INTEGER,
INTENT(IN) :: la_max, lb_max, lc_max
445 REAL(
dp),
INTENT(INOUT) :: rr(:, :, :, 0:)
447 INTEGER :: axis, ia, ia1, ib, ib1, ic, ic1, ic2, ico, la, lb, lc, m, mmax, power(3)
448 INTEGER :: lowered(3,
ncoset(max(la_max, lb_max, lc_max)))
449 REAL(
dp) :: eta, eta_c, g, g_c, rcw(3), rpw(3)
451 mmax = la_max + lb_max + lc_max
457 CALL os_rr_radial(rap, la_max, rbp, lb_max, rpw, zetp, eta, mmax, rr(:, :, 1, :))
458 IF (lc_max == 0)
RETURN
461 DO ico = 1,
ncoset(max(la_max, lb_max, lc_max))
462 power =
indco(:, ico)
463 lowered(:, ico) = [
coset(max(0, power(1) - 1), power(2), power(3)), &
464 coset(power(1), max(0, power(2) - 1), power(3)), &
465 coset(power(1), power(2), max(0, power(3) - 1))]
470 IF (
indco(3, ic) == 0) axis = 2
471 IF (
indco(axis, ic) == 0) axis = 1
472 ic1 = lowered(axis, ic)
473 ic2 = lowered(axis, ic1)
476 DO m = 0, mmax - la - lb - lc
478 ib1 = lowered(axis, ib)
480 ia1 = lowered(axis, ia)
481 rr(ia, ib, ic, m) = rcw(axis)*rr(ia, ib, ic1, m + 1)
482 IF (
indco(axis, ic) > 1)
THEN
483 rr(ia, ib, ic, m) = rr(ia, ib, ic, m) + g_c*real(
indco(axis, ic) - 1,
dp)* &
484 (rr(ia, ib, ic2, m) - eta_c*rr(ia, ib, ic2, m + 1))
486 IF (
indco(axis, ia) > 0)
THEN
487 rr(ia, ib, ic, m) = rr(ia, ib, ic, m) + &
488 g*real(
indco(axis, ia),
dp)*rr(ia1, ib, ic1, m + 1)
490 IF (
indco(axis, ib) > 0)
THEN
491 rr(ia, ib, ic, m) = rr(ia, ib, ic, m) + &
492 g*real(
indco(axis, ib),
dp)*rr(ia, ib1, ic1, m + 1)
518 SUBROUTINE os_rr_coul(rap, la_max, rbp, lb_max, rcp, zet, ldrr1, ldrr2, rr)
519 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rap
520 INTEGER,
INTENT(IN) :: la_max
521 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rbp
522 INTEGER,
INTENT(IN) :: lb_max
523 REAL(
dp),
DIMENSION(3),
INTENT(IN) :: rcp
524 REAL(
dp),
INTENT(IN) :: zet
525 INTEGER,
INTENT(IN) :: ldrr1, ldrr2
526 REAL(
dp),
DIMENSION(0:ldrr1 - 1, ldrr2, *), &
532 mmax = la_max + lb_max
533 t = zet*dot_product(rcp, rcp)
534 CALL fgamma(mmax, t, rr(0:mmax, 1, 1))
535 CALL os_rr_radial_mab(rap, la_max, rbp, lb_max, -rcp, 1.0_dp/zet, 1.0_dp, mmax, &
subroutine, public os_rr_coul(rap, la_max, rbp, lb_max, rcp, zet, ldrr1, ldrr2, rr)
Calculation of the Obara-Saika recurrence relation for 1/r_C.
subroutine, public os_rr_coulomb3(rap, la_max, rbp, lb_max, rcp, lc_max, zetp, zetq, zetw, rr)
Angular three-center Coulomb recurrence from caller-supplied s/s/s seeds.
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
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :, :), allocatable, public coset
integer, dimension(:, :), allocatable, public indco