28 #include "../base/base_uses.f90"
34 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ai_overlap'
69 SUBROUTINE overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
70 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
71 rab, dab, sab, da_max_set, return_derivatives, s, lds, &
73 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
74 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
75 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
76 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
77 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
78 REAL(kind=
dp),
INTENT(IN) :: dab
79 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
80 INTEGER,
INTENT(IN) :: da_max_set
81 LOGICAL,
INTENT(IN) :: return_derivatives
82 INTEGER,
INTENT(IN) :: lds
83 REAL(kind=
dp),
DIMENSION(lds, lds, *), &
85 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
87 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(IN), &
89 REAL(kind=
dp),
DIMENSION(3),
INTENT(OUT),
OPTIONAL :: force_a
91 INTEGER :: ax, ay, az, bx, by, bz, cda, cdax, cday, cdaz, coa, coamx, coamy, coamz, coapx, &
92 coapy, coapz, cob, cobm2x, cobm2y, cobm2z, cobmx, cobmy, cobmz, da, da_max, dax, day, &
93 daz, i, ipgf, j, jk, jpgf, jstart, k, la, la_max, la_min, la_start, lb, lb_max, lb_min, &
95 LOGICAL :: calculate_force_a
96 REAL(kind=
dp) :: f0, f1, f2, f3, f4, fax, fay, faz, ftz, &
98 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
100 IF (
PRESENT(pab) .AND.
PRESENT(force_a))
THEN
101 calculate_force_a = .true.
104 calculate_force_a = .false.
107 IF (
PRESENT(sdab) .OR. calculate_force_a)
THEN
108 IF (da_max_set == 0)
THEN
110 la_max = la_max_set + 1
111 la_min = max(0, la_min_set - 1)
114 la_max = la_max_set + da_max_set + 1
115 la_min = max(0, la_min_set - da_max_set - 1)
119 la_max = la_max_set + da_max_set
120 la_min = max(0, la_min_set - da_max_set)
139 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab)
THEN
140 DO j = nb + 1, nb +
ncoset(lb_max_set)
141 DO i = na + 1, na +
ncoset(la_max_set)
145 IF (return_derivatives)
THEN
146 DO k = 2,
ncoset(da_max_set)
147 jstart = (k - 1)*
SIZE(sab, 1)
148 DO j = jstart + nb + 1, jstart + nb +
ncoset(lb_max_set)
149 DO i = na + 1, na +
ncoset(la_max_set)
155 nb = nb +
ncoset(lb_max_set)
161 zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
163 f0 = sqrt((
pi*zetp)**3)
169 s(1, 1, 1) = f0*exp(-zeta(ipgf)*f1*dab*dab)
181 s(2, 1, 1) = rap(1)*s(1, 1, 1)
182 s(3, 1, 1) = rap(2)*s(1, 1, 1)
183 s(4, 1, 1) = rap(3)*s(1, 1, 1)
191 s(5, 1, 1) = rap(1)*s(2, 1, 1) + f3
192 s(6, 1, 1) = rap(1)*s(3, 1, 1)
193 s(7, 1, 1) = rap(1)*s(4, 1, 1)
194 s(8, 1, 1) = rap(2)*s(3, 1, 1) + f3
195 s(9, 1, 1) = rap(2)*s(4, 1, 1)
196 s(10, 1, 1) = rap(3)*s(4, 1, 1) + f3
204 s(11, 1, 1) = rap(1)*s(5, 1, 1) + f3*s(2, 1, 1)
205 s(12, 1, 1) = rap(1)*s(6, 1, 1) + f2*s(3, 1, 1)
206 s(13, 1, 1) = rap(1)*s(7, 1, 1) + f2*s(4, 1, 1)
207 s(14, 1, 1) = rap(1)*s(8, 1, 1)
208 s(15, 1, 1) = rap(1)*s(9, 1, 1)
209 s(16, 1, 1) = rap(1)*s(10, 1, 1)
210 s(17, 1, 1) = rap(2)*s(8, 1, 1) + f3*s(3, 1, 1)
211 s(18, 1, 1) = rap(2)*s(9, 1, 1) + f2*s(4, 1, 1)
212 s(19, 1, 1) = rap(2)*s(10, 1, 1)
213 s(20, 1, 1) = rap(3)*s(10, 1, 1) + f3*s(4, 1, 1)
221 s(21, 1, 1) = rap(1)*s(11, 1, 1) + f4*s(5, 1, 1)
222 s(22, 1, 1) = rap(1)*s(12, 1, 1) + f3*s(6, 1, 1)
223 s(23, 1, 1) = rap(1)*s(13, 1, 1) + f3*s(7, 1, 1)
224 s(24, 1, 1) = rap(1)*s(14, 1, 1) + f2*s(8, 1, 1)
225 s(25, 1, 1) = rap(1)*s(15, 1, 1) + f2*s(9, 1, 1)
226 s(26, 1, 1) = rap(1)*s(16, 1, 1) + f2*s(10, 1, 1)
227 s(27, 1, 1) = rap(1)*s(17, 1, 1)
228 s(28, 1, 1) = rap(1)*s(18, 1, 1)
229 s(29, 1, 1) = rap(1)*s(19, 1, 1)
230 s(30, 1, 1) = rap(1)*s(20, 1, 1)
231 s(31, 1, 1) = rap(2)*s(17, 1, 1) + f4*s(8, 1, 1)
232 s(32, 1, 1) = rap(2)*s(18, 1, 1) + f3*s(9, 1, 1)
233 s(33, 1, 1) = rap(2)*s(19, 1, 1) + f2*s(10, 1, 1)
234 s(34, 1, 1) = rap(2)*s(20, 1, 1)
235 s(35, 1, 1) = rap(3)*s(20, 1, 1) + f4*s(10, 1, 1)
243 s(
coset(0, 0, la), 1, 1) = &
244 rap(3)*s(
coset(0, 0, la - 1), 1, 1) + &
245 f2*real(la - 1,
dp)*s(
coset(0, 0, la - 2), 1, 1)
250 s(
coset(0, 1, az), 1, 1) = rap(2)*s(
coset(0, 0, az), 1, 1)
253 s(
coset(0, ay, az), 1, 1) = &
254 rap(2)*s(
coset(0, ay - 1, az), 1, 1) + &
255 f2*real(ay - 1,
dp)*s(
coset(0, ay - 2, az), 1, 1)
262 s(
coset(1, ay, az), 1, 1) = rap(1)*s(
coset(0, ay, az), 1, 1)
265 f3 = f2*real(ax - 1,
dp)
268 s(
coset(ax, ay, az), 1, 1) = &
269 rap(1)*s(
coset(ax - 1, ay, az), 1, 1) + &
270 f3*s(
coset(ax - 2, ay, az), 1, 1)
294 rbp(:) = rap(:) - rab(:)
298 IF (lb_max == 1)
THEN
301 la_start = max(0, la_min - 1)
304 DO la = la_start, la_max - 1
308 coa =
coset(ax, ay, az)
309 coapx =
coset(ax + 1, ay, az)
310 coapy =
coset(ax, ay + 1, az)
311 coapz =
coset(ax, ay, az + 1)
312 s(coa, 2, 1) = s(coapx, 1, 1) - rab(1)*s(coa, 1, 1)
313 s(coa, 3, 1) = s(coapy, 1, 1) - rab(2)*s(coa, 1, 1)
314 s(coa, 4, 1) = s(coapz, 1, 1) - rab(3)*s(coa, 1, 1)
324 fax = f2*real(ax,
dp)
325 DO ay = 0, la_max - ax
326 fay = f2*real(ay,
dp)
327 az = la_max - ax - ay
328 faz = f2*real(az,
dp)
329 coa =
coset(ax, ay, az)
330 coamx =
coset(ax - 1, ay, az)
331 coamy =
coset(ax, ay - 1, az)
332 coamz =
coset(ax, ay, az - 1)
333 s(coa, 2, 1) = rbp(1)*s(coa, 1, 1) + fax*s(coamx, 1, 1)
334 s(coa, 3, 1) = rbp(2)*s(coa, 1, 1) + fay*s(coamy, 1, 1)
335 s(coa, 4, 1) = rbp(3)*s(coa, 1, 1) + faz*s(coamz, 1, 1)
347 IF (lb == lb_max)
THEN
350 la_start = max(0, la_min - 1)
353 DO la = la_start, la_max - 1
357 coa =
coset(ax, ay, az)
358 coapx =
coset(ax + 1, ay, az)
359 coapy =
coset(ax, ay + 1, az)
360 coapz =
coset(ax, ay, az + 1)
364 cob =
coset(0, 0, lb)
365 cobmz =
coset(0, 0, lb - 1)
366 s(coa, cob, 1) = s(coapz, cobmz, 1) - rab(3)*s(coa, cobmz, 1)
372 cob =
coset(0, by, bz)
373 cobmy =
coset(0, by - 1, bz)
374 s(coa, cob, 1) = s(coapy, cobmy, 1) - rab(2)*s(coa, cobmy, 1)
382 cob =
coset(bx, by, bz)
383 cobmx =
coset(bx - 1, by, bz)
384 s(coa, cob, 1) = s(coapx, cobmx, 1) - rab(1)*s(coa, cobmx, 1)
398 fax = f2*real(ax,
dp)
399 DO ay = 0, la_max - ax
400 fay = f2*real(ay,
dp)
401 az = la_max - ax - ay
402 faz = f2*real(az,
dp)
403 coa =
coset(ax, ay, az)
404 coamx =
coset(ax - 1, ay, az)
405 coamy =
coset(ax, ay - 1, az)
406 coamz =
coset(ax, ay, az - 1)
410 f3 = f2*real(lb - 1,
dp)
411 cob =
coset(0, 0, lb)
412 cobmz =
coset(0, 0, lb - 1)
413 cobm2z =
coset(0, 0, lb - 2)
414 s(coa, cob, 1) = rbp(3)*s(coa, cobmz, 1) + &
415 faz*s(coamz, cobmz, 1) + &
421 cob =
coset(0, 1, bz)
422 cobmy =
coset(0, 0, bz)
423 s(coa, cob, 1) = rbp(2)*s(coa, cobmy, 1) + &
424 fay*s(coamy, cobmy, 1)
427 f3 = f2*real(by - 1,
dp)
428 cob =
coset(0, by, bz)
429 cobmy =
coset(0, by - 1, bz)
430 cobm2y =
coset(0, by - 2, bz)
431 s(coa, cob, 1) = rbp(2)*s(coa, cobmy, 1) + &
432 fay*s(coamy, cobmy, 1) + &
440 cob =
coset(1, by, bz)
441 cobmx =
coset(0, by, bz)
442 s(coa, cob, 1) = rbp(1)*s(coa, cobmx, 1) + &
443 fax*s(coamx, cobmx, 1)
446 f3 = f2*real(bx - 1,
dp)
449 cob =
coset(bx, by, bz)
450 cobmx =
coset(bx - 1, by, bz)
451 cobm2x =
coset(bx - 2, by, bz)
452 s(coa, cob, 1) = rbp(1)*s(coa, cobmx, 1) + &
453 fax*s(coamx, cobmx, 1) + &
471 rbp(:) = (f1 - 1.0_dp)*rab(:)
475 s(1, 2, 1) = rbp(1)*s(1, 1, 1)
476 s(1, 3, 1) = rbp(2)*s(1, 1, 1)
477 s(1, 4, 1) = rbp(3)*s(1, 1, 1)
485 s(1, 5, 1) = rbp(1)*s(1, 2, 1) + f3
486 s(1, 6, 1) = rbp(1)*s(1, 3, 1)
487 s(1, 7, 1) = rbp(1)*s(1, 4, 1)
488 s(1, 8, 1) = rbp(2)*s(1, 3, 1) + f3
489 s(1, 9, 1) = rbp(2)*s(1, 4, 1)
490 s(1, 10, 1) = rbp(3)*s(1, 4, 1) + f3
498 s(1,
coset(0, 0, lb), 1) = &
499 rbp(3)*s(1,
coset(0, 0, lb - 1), 1) + &
500 f2*real(lb - 1,
dp)*s(1,
coset(0, 0, lb - 2), 1)
505 s(1,
coset(0, 1, bz), 1) = rbp(2)*s(1,
coset(0, 0, bz), 1)
508 s(1,
coset(0, by, bz), 1) = &
509 rbp(2)*s(1,
coset(0, by - 1, bz), 1) + &
510 f2*real(by - 1,
dp)*s(1,
coset(0, by - 2, bz), 1)
517 s(1,
coset(1, by, bz), 1) = rbp(1)*s(1,
coset(0, by, bz), 1)
520 f3 = f2*real(bx - 1,
dp)
523 s(1,
coset(bx, by, bz), 1) = &
524 rbp(1)*s(1,
coset(bx - 1, by, bz), 1) + &
525 f3*s(1,
coset(bx - 2, by, bz), 1)
539 DO j = 1,
ncoset(lb_max_set)
540 DO i = 1,
ncoset(la_max_set)
541 sab(na + i, nb + j) = s(i, j, 1)
548 IF (
PRESENT(sdab) .OR. return_derivatives)
THEN
552 la_start = la_min_set
553 lb_start = lb_min_set
556 DO da = 0, da_max - 1
557 ftz = 2.0_dp*zeta(ipgf)
561 cda =
coset(dax, day, daz)
562 cdax =
coset(dax + 1, day, daz)
563 cday =
coset(dax, day + 1, daz)
564 cdaz =
coset(dax, day, daz + 1)
568 DO la = la_start, la_max - da - 1
575 coa =
coset(ax, ay, az)
576 coamx =
coset(ax - 1, ay, az)
577 coamy =
coset(ax, ay - 1, az)
578 coamz =
coset(ax, ay, az - 1)
579 coapx =
coset(ax + 1, ay, az)
580 coapy =
coset(ax, ay + 1, az)
581 coapz =
coset(ax, ay, az + 1)
582 DO lb = lb_start, lb_max_set
586 cob =
coset(bx, by, bz)
587 s(coa, cob, cdax) = ftz*s(coapx, cob, cda) - &
588 fax*s(coamx, cob, cda)
589 s(coa, cob, cday) = ftz*s(coapy, cob, cda) - &
590 fay*s(coamy, cob, cda)
591 s(coa, cob, cdaz) = ftz*s(coapz, cob, cda) - &
592 faz*s(coamz, cob, cda)
607 IF (return_derivatives)
THEN
608 DO k = 2,
ncoset(da_max_set)
609 jstart = (k - 1)*
SIZE(sab, 1)
610 DO j = 1,
ncoset(lb_max_set)
612 DO i = 1,
ncoset(la_max_set)
613 sab(na + i, nb + jk) = s(i, j, k)
621 IF (calculate_force_a)
THEN
625 force_a(k) = force_a(k) + pab(na + i, nb + j)*s(i, j, k + 1)
635 IF (
PRESENT(sdab))
THEN
636 sdab(nda + 1, nb + 1, 1) = s(1, 1, 1)
638 DO j = 1,
ncoset(lb_max_set)
639 DO i = 1,
ncoset(la_max - 1)
640 sdab(nda + i, nb + j, k) = s(i, j, k)
646 nb = nb +
ncoset(lb_max_set)
650 na = na +
ncoset(la_max_set)
651 nda = nda +
ncoset(la_max - 1)
678 lb_max, lb_min, npgfb, rpgfb, zetb, &
680 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
681 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
682 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
683 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
684 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
685 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
687 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
688 OPTIONAL :: dab, ddab
690 INTEGER :: ax, ay, az, bx, by, bz, coa, cob, ia, &
691 ib, ipgf, jpgf, la, lb, ldrr, lma, &
692 lmb, ma, mb, na, nb, ofa, ofb
693 REAL(kind=
dp) :: a, ambm, ambp, apbm, apbp, b, dumx, &
694 dumy, dumz, f0, rab2, tab, xhi, zet
695 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
696 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
700 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
704 IF (
PRESENT(sab))
THEN
708 IF (
PRESENT(dab))
THEN
712 IF (
PRESENT(ddab))
THEN
716 ldrr = max(lma, lmb) + 1
719 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
726 IF (
PRESENT(sab))
THEN
727 cpassert((
SIZE(sab, 1) >= na*npgfa))
728 cpassert((
SIZE(sab, 2) >= nb*npgfb))
730 IF (
PRESENT(dab))
THEN
731 cpassert((
SIZE(dab, 1) >= na*npgfa))
732 cpassert((
SIZE(dab, 2) >= nb*npgfb))
733 cpassert((
SIZE(dab, 3) >= 3))
735 IF (
PRESENT(ddab))
THEN
736 cpassert((
SIZE(ddab, 1) >= na*npgfa))
737 cpassert((
SIZE(ddab, 2) >= nb*npgfb))
738 cpassert((
SIZE(ddab, 3) >= 6))
747 IF (rpgfa(ipgf) + rpgfb(jpgf) < tab)
THEN
748 IF (
PRESENT(sab)) sab(ma + 1:ma + na, mb + 1:mb + nb) = 0.0_dp
749 IF (
PRESENT(dab)) dab(ma + 1:ma + na, mb + 1:mb + nb, 1:3) = 0.0_dp
750 IF (
PRESENT(ddab)) ddab(ma + 1:ma + na, mb + 1:mb + nb, 1:6) = 0.0_dp
764 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
767 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
769 DO lb = lb_min, lb_max
773 cob =
coset(bx, by, bz) - ofb
775 DO la = la_min, la_max
779 coa =
coset(ax, ay, az) - ofa
782 IF (
PRESENT(sab))
THEN
783 sab(ia, ib) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az, bz, 3)
786 IF (
PRESENT(dab))
THEN
789 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
790 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
791 dab(ia, ib, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
793 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
794 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
795 dab(ia, ib, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
797 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
798 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
799 dab(ia, ib, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
802 IF (
PRESENT(ddab))
THEN
806 apbp = f0*rr(ax + 1, bx + 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
808 apbm = f0*rr(ax + 1, bx - 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
813 ambp = f0*rr(ax - 1, bx + 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
817 IF (ax > 0 .AND. bx > 0)
THEN
818 ambm = f0*rr(ax - 1, bx - 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
822 ddab(ia, ib, 1) = -4.0_dp*a*b*apbm + 2.0_dp*a*real(bx,
dp)*apbm &
823 + 2.0_dp*b*real(ax,
dp)*ambp - real(ax,
dp)*real(bx,
dp)*ambm
825 apbp = f0*rr(ax + 1, bx, 1)*rr(ay, by + 1, 2)*rr(az, bz, 3)
827 apbm = f0*rr(ax + 1, bx, 1)*rr(ay, by - 1, 2)*rr(az, bz, 3)
832 ambp = f0*rr(ax - 1, bx, 1)*rr(ay, by + 1, 2)*rr(az, bz, 3)
836 IF (ax > 0 .AND. by > 0)
THEN
837 ambm = f0*rr(ax - 1, bx, 1)*rr(ay, by - 1, 2)*rr(az, bz, 3)
841 ddab(ia, ib, 2) = -4.0_dp*a*b*apbm + 2.0_dp*a*real(by,
dp)*apbm &
842 + 2.0_dp*b*real(ax,
dp)*ambp - real(ax,
dp)*real(by,
dp)*ambm
844 apbp = f0*rr(ax + 1, bx, 1)*rr(ay, by, 2)*rr(az, bz + 1, 3)
846 apbm = f0*rr(ax + 1, bx, 1)*rr(ay, by, 2)*rr(az, bz - 1, 3)
851 ambp = f0*rr(ax - 1, bx, 1)*rr(ay, by, 2)*rr(az, bz + 1, 3)
855 IF (ax > 0 .AND. bz > 0)
THEN
856 ambm = f0*rr(ax - 1, bx, 1)*rr(ay, by, 2)*rr(az, bz - 1, 3)
860 ddab(ia, ib, 3) = -4.0_dp*a*b*apbm + 2.0_dp*a*real(bz,
dp)*apbm &
861 + 2.0_dp*b*real(ax,
dp)*ambp - real(ax,
dp)*real(bz,
dp)*ambm
863 apbp = f0*rr(ax, bx, 1)*rr(ay + 1, by + 1, 2)*rr(az, bz, 3)
865 apbm = f0*rr(ax, bx, 1)*rr(ay + 1, by - 1, 2)*rr(az, bz, 3)
870 ambp = f0*rr(ax, bx, 1)*rr(ay - 1, by + 1, 2)*rr(az, bz, 3)
874 IF (ay > 0 .AND. by > 0)
THEN
875 ambm = f0*rr(ax, bx, 1)*rr(ay - 1, by - 1, 2)*rr(az, bz, 3)
879 ddab(ia, ib, 4) = -4.0_dp*a*b*apbm + 2.0_dp*a*real(by,
dp)*apbm &
880 + 2.0_dp*b*real(ay,
dp)*ambp - real(ay,
dp)*real(by,
dp)*ambm
882 apbp = f0*rr(ax, bx, 1)*rr(ay + 1, by, 2)*rr(az, bz + 1, 3)
884 apbm = f0*rr(ax, bx, 1)*rr(ay + 1, by, 2)*rr(az, bz - 1, 3)
889 ambp = f0*rr(ax, bx, 1)*rr(ay - 1, by, 2)*rr(az, bz + 1, 3)
893 IF (ay > 0 .AND. bz > 0)
THEN
894 ambm = f0*rr(ax, bx, 1)*rr(ay - 1, by, 2)*rr(az, bz - 1, 3)
898 ddab(ia, ib, 5) = -4.0_dp*a*b*apbm + 2.0_dp*a*real(bz,
dp)*apbm &
899 + 2.0_dp*b*real(ay,
dp)*ambp - real(ay,
dp)*real(bz,
dp)*ambm
901 apbp = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az + 1, bz + 1, 3)
903 apbm = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az + 1, bz - 1, 3)
908 ambp = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az - 1, bz + 1, 3)
912 IF (az > 0 .AND. bz > 0)
THEN
913 ambm = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az - 1, bz - 1, 3)
917 ddab(ia, ib, 6) = -4.0_dp*a*b*apbm + 2.0_dp*a*real(bz,
dp)*apbm &
918 + 2.0_dp*b*real(az,
dp)*ambp - real(az,
dp)*real(bz,
dp)*ambm
964 la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
965 lb_max, lb_min, npgfb, rpgfb, zetb, &
966 rab, saab, daab, saba, daba)
967 INTEGER,
INTENT(IN) :: la1_max, la1_min, npgfa1
968 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa1, zeta1
969 INTEGER,
INTENT(IN) :: la2_max, la2_min, npgfa2
970 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa2, zeta2
971 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
972 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
973 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
974 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
976 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
977 INTENT(INOUT),
OPTIONAL :: daab
978 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
980 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
981 INTENT(INOUT),
OPTIONAL :: daba
983 INTEGER :: ax, ax1, ax2, ay, ay1, ay2, az, az1, az2, bx, by, bz, coa1, coa2, cob, i1pgf, &
984 i2pgf, ia1, ia2, ib, jpgf, la1, la2, lb, ldrr, lma, lmb, ma1, ma2, mb, na1, na2, nb, &
986 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfa, &
988 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
989 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
993 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
997 IF (
PRESENT(saab) .OR.
PRESENT(saba))
THEN
998 lma = la1_max + la2_max
1001 IF (
PRESENT(daab) .OR.
PRESENT(daba))
THEN
1002 lma = la1_max + la2_max + 1
1005 ldrr = max(lma, lmb) + 1
1008 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
1011 ofa1 =
ncoset(la1_min - 1)
1012 ofa2 =
ncoset(la2_min - 1)
1014 na1 =
ncoset(la1_max) - ofa1
1015 na2 =
ncoset(la2_max) - ofa2
1016 nb =
ncoset(lb_max) - ofb
1017 IF (
PRESENT(saab))
THEN
1018 cpassert((
SIZE(saab, 1) >= na1*npgfa1))
1019 cpassert((
SIZE(saab, 2) >= na2*npgfa2))
1020 cpassert((
SIZE(saab, 3) >= nb*npgfb))
1022 IF (
PRESENT(daab))
THEN
1023 cpassert((
SIZE(daab, 1) >= na1*npgfa1))
1024 cpassert((
SIZE(daab, 2) >= na2*npgfa2))
1025 cpassert((
SIZE(daab, 3) >= nb*npgfb))
1026 cpassert((
SIZE(daab, 4) >= 3))
1028 IF (
PRESENT(saba))
THEN
1029 cpassert((
SIZE(saba, 1) >= na1*npgfa1))
1030 cpassert((
SIZE(saba, 2) >= nb*npgfb))
1031 cpassert((
SIZE(saba, 3) >= na2*npgfa2))
1033 IF (
PRESENT(daba))
THEN
1034 cpassert((
SIZE(daba, 1) >= na1*npgfa1))
1035 cpassert((
SIZE(daba, 2) >= nb*npgfb))
1036 cpassert((
SIZE(daba, 3) >= na2*npgfa2))
1037 cpassert((
SIZE(daba, 4) >= 3))
1042 DO i1pgf = 1, npgfa1
1044 DO i2pgf = 1, npgfa2
1045 rpgfa = min(rpgfa1(i1pgf), rpgfa2(i2pgf))
1049 IF (rpgfa + rpgfb(jpgf) < tab)
THEN
1050 IF (
PRESENT(saab)) saab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb) = 0.0_dp
1051 IF (
PRESENT(daab)) daab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb, 1:3) = 0.0_dp
1052 IF (
PRESENT(saba)) saba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2) = 0.0_dp
1053 IF (
PRESENT(daba)) daba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2, 1:3) = 0.0_dp
1059 a = zeta1(i1pgf) + zeta2(i2pgf)
1067 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
1070 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
1072 DO lb = lb_min, lb_max
1076 cob =
coset(bx, by, bz) - ofb
1078 DO la2 = la2_min, la2_max
1080 DO ay2 = 0, la2 - ax2
1081 az2 = la2 - ax2 - ay2
1082 coa2 =
coset(ax2, ay2, az2) - ofa2
1084 DO la1 = la1_min, la1_max
1086 DO ay1 = 0, la1 - ax1
1087 az1 = la1 - ax1 - ay1
1088 coa1 =
coset(ax1, ay1, az1) - ofa1
1091 IF (
PRESENT(saab))
THEN
1092 saab(ia1, ia2, ib) = f0*rr(ax1 + ax2, bx, 1)*rr(ay1 + ay2, by, 2)*rr(az1 + az2, bz, 3)
1094 IF (
PRESENT(saba))
THEN
1095 saba(ia1, ib, ia2) = f0*rr(ax1 + ax2, bx, 1)*rr(ay1 + ay2, by, 2)*rr(az1 + az2, bz, 3)
1098 IF (
PRESENT(daab))
THEN
1104 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
1105 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
1106 daab(ia1, ia2, ib, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
1108 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
1109 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
1110 daab(ia1, ia2, ib, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
1112 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
1113 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
1114 daab(ia1, ia2, ib, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
1116 IF (
PRESENT(daba))
THEN
1122 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
1123 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
1124 daba(ia1, ib, ia2, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
1126 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
1127 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
1128 daba(ia1, ib, ia2, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
1130 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
1131 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
1132 daba(ia1, ib, ia2, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
1181 lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
1182 lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
1184 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
1185 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
1186 INTEGER,
INTENT(IN) :: lb1_max, lb1_min, npgfb1
1187 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb1, zetb1
1188 INTEGER,
INTENT(IN) :: lb2_max, lb2_min, npgfb2
1189 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb2, zetb2
1190 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
1191 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
1193 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
1194 INTENT(INOUT),
OPTIONAL :: dabb
1196 INTEGER :: ax, ay, az, bx, bx1, bx2, by, by1, by2, bz, bz1, bz2, coa, cob1, cob2, ia, ib1, &
1197 ib2, ipgf, j1pgf, j2pgf, la, lb1, lb2, ldrr, lma, lmb, ma, mb1, mb2, na, nb1, nb2, ofa, &
1199 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfb, &
1201 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
1202 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
1206 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
1210 IF (
PRESENT(sabb))
THEN
1212 lmb = lb1_max + lb2_max
1214 IF (
PRESENT(dabb))
THEN
1216 lmb = lb1_max + lb2_max
1218 ldrr = max(lma, lmb) + 1
1221 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
1225 ofb1 =
ncoset(lb1_min - 1)
1226 ofb2 =
ncoset(lb2_min - 1)
1227 na =
ncoset(la_max) - ofa
1228 nb1 =
ncoset(lb1_max) - ofb1
1229 nb2 =
ncoset(lb2_max) - ofb2
1230 IF (
PRESENT(sabb))
THEN
1231 cpassert((
SIZE(sabb, 1) >= na*npgfa))
1232 cpassert((
SIZE(sabb, 2) >= nb1*npgfb1))
1233 cpassert((
SIZE(sabb, 3) >= nb2*npgfb2))
1235 IF (
PRESENT(dabb))
THEN
1236 cpassert((
SIZE(dabb, 1) >= na*npgfa))
1237 cpassert((
SIZE(dabb, 2) >= nb1*npgfb1))
1238 cpassert((
SIZE(dabb, 3) >= nb2*npgfb2))
1239 cpassert((
SIZE(dabb, 4) >= 3))
1246 DO j1pgf = 1, npgfb1
1248 DO j2pgf = 1, npgfb2
1250 rpgfb = min(rpgfb1(j1pgf), rpgfb2(j2pgf))
1251 IF (rpgfa(ipgf) + rpgfb < tab)
THEN
1252 IF (
PRESENT(sabb)) sabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2) = 0.0_dp
1253 IF (
PRESENT(dabb)) dabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, 1:3) = 0.0_dp
1260 b = zetb1(j1pgf) + zetb2(j2pgf)
1267 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
1270 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
1272 DO lb2 = lb2_min, lb2_max
1274 DO by2 = 0, lb2 - bx2
1275 bz2 = lb2 - bx2 - by2
1276 cob2 =
coset(bx2, by2, bz2) - ofb2
1278 DO lb1 = lb1_min, lb1_max
1280 DO by1 = 0, lb1 - bx1
1281 bz1 = lb1 - bx1 - by1
1282 cob1 =
coset(bx1, by1, bz1) - ofb1
1284 DO la = la_min, la_max
1288 coa =
coset(ax, ay, az) - ofa
1291 IF (
PRESENT(sabb))
THEN
1292 sabb(ia, ib1, ib2) = f0*rr(ax, bx1 + bx2, 1)*rr(ay, by1 + by2, 2)*rr(az, bz1 + bz2, 3)
1295 IF (
PRESENT(dabb))
THEN
1301 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
1302 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
1303 dabb(ia, ib1, ib2, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
1305 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
1306 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
1307 dabb(ia, ib1, ib2, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
1309 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
1310 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
1311 dabb(ia, ib1, ib2, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
1364 SUBROUTINE overlap_aaab(la1_max, la1_min, npgfa1, rpgfa1, zeta1, &
1365 la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
1366 la3_max, la3_min, npgfa3, rpgfa3, zeta3, &
1367 lb_max, lb_min, npgfb, rpgfb, zetb, &
1369 INTEGER,
INTENT(IN) :: la1_max, la1_min, npgfa1
1370 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa1, zeta1
1371 INTEGER,
INTENT(IN) :: la2_max, la2_min, npgfa2
1372 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa2, zeta2
1373 INTEGER,
INTENT(IN) :: la3_max, la3_min, npgfa3
1374 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa3, zeta3
1375 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
1376 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
1377 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
1378 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
1379 INTENT(INOUT),
OPTIONAL :: saaab
1380 REAL(kind=
dp),
DIMENSION(:, :, :, :, :), &
1381 INTENT(INOUT),
OPTIONAL :: daaab
1383 INTEGER :: ax, ax1, ax2, ax3, ay, ay1, ay2, ay3, az, az1, az2, az3, bx, by, bz, coa1, coa2, &
1384 coa3, cob, i1pgf, i2pgf, i3pgf, ia1, ia2, ia3, ib, jpgf, la1, la2, la3, lb, ldrr, lma, &
1385 lmb, ma1, ma2, ma3, mb, na1, na2, na3, nb, ofa1, ofa2, ofa3, ofb
1386 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfa, &
1388 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
1389 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
1393 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
1397 IF (
PRESENT(saaab))
THEN
1398 lma = la1_max + la2_max + la3_max
1401 IF (
PRESENT(daaab))
THEN
1402 lma = la1_max + la2_max + la3_max + 1
1405 ldrr = max(lma, lmb) + 1
1408 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
1411 ofa1 =
ncoset(la1_min - 1)
1412 ofa2 =
ncoset(la2_min - 1)
1413 ofa3 =
ncoset(la3_min - 1)
1415 na1 =
ncoset(la1_max) - ofa1
1416 na2 =
ncoset(la2_max) - ofa2
1417 na3 =
ncoset(la3_max) - ofa3
1418 nb =
ncoset(lb_max) - ofb
1419 IF (
PRESENT(saaab))
THEN
1420 cpassert((
SIZE(saaab, 1) >= na1*npgfa1))
1421 cpassert((
SIZE(saaab, 2) >= na2*npgfa2))
1422 cpassert((
SIZE(saaab, 3) >= na3*npgfa3))
1423 cpassert((
SIZE(saaab, 4) >= nb*npgfb))
1425 IF (
PRESENT(daaab))
THEN
1426 cpassert((
SIZE(daaab, 1) >= na1*npgfa1))
1427 cpassert((
SIZE(daaab, 2) >= na2*npgfa2))
1428 cpassert((
SIZE(daaab, 3) >= na3*npgfa3))
1429 cpassert((
SIZE(daaab, 4) >= nb*npgfb))
1430 cpassert((
SIZE(daaab, 5) >= 3))
1435 DO i1pgf = 1, npgfa1
1437 DO i2pgf = 1, npgfa2
1439 DO i3pgf = 1, npgfa3
1440 rpgfa = min(rpgfa1(i1pgf), rpgfa2(i2pgf), rpgfa3(i3pgf))
1444 IF (rpgfa + rpgfb(jpgf) < tab)
THEN
1445 IF (
PRESENT(saaab)) saaab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, ma3 + 1:ma3 + na3, mb + 1:mb + nb) = 0.0_dp
1446 IF (
PRESENT(daaab)) daaab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, ma3 + 1:ma3 + na3, mb + 1:mb + nb, 1:3) = 0.0_dp
1452 a = zeta1(i1pgf) + zeta2(i2pgf) + zeta3(i3pgf)
1460 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
1463 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
1465 DO lb = lb_min, lb_max
1469 cob =
coset(bx, by, bz) - ofb
1471 DO la3 = la3_min, la3_max
1473 DO ay3 = 0, la3 - ax3
1474 az3 = la3 - ax3 - ay3
1475 coa3 =
coset(ax3, ay3, az3) - ofa3
1477 DO la2 = la2_min, la2_max
1479 DO ay2 = 0, la2 - ax2
1480 az2 = la2 - ax2 - ay2
1481 coa2 =
coset(ax2, ay2, az2) - ofa2
1483 DO la1 = la1_min, la1_max
1485 DO ay1 = 0, la1 - ax1
1486 az1 = la1 - ax1 - ay1
1487 coa1 =
coset(ax1, ay1, az1) - ofa1
1490 IF (
PRESENT(saaab))
THEN
1491 saaab(ia1, ia2, ia3, ib) = f0*rr(ax1 + ax2 + ax3, bx, 1)* &
1492 rr(ay1 + ay2 + ay3, by, 2)*rr(az1 + az2 + az3, bz, 3)
1495 IF (
PRESENT(daaab))
THEN
1496 ax = ax1 + ax2 + ax3
1497 ay = ay1 + ay2 + ay3
1498 az = az1 + az2 + az3
1501 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
1502 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
1503 daaab(ia1, ia2, ia3, ib, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
1505 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
1506 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
1507 daaab(ia1, ia2, ia3, ib, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
1509 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
1510 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
1511 daaab(ia1, ia2, ia3, ib, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
1538 END SUBROUTINE overlap_aaab
1568 SUBROUTINE overlap_aabb(la1_max, la1_min, npgfa1, rpgfa1, zeta1, &
1569 la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
1570 lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
1571 lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
1573 INTEGER,
INTENT(IN) :: la1_max, la1_min, npgfa1
1574 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa1, zeta1
1575 INTEGER,
INTENT(IN) :: la2_max, la2_min, npgfa2
1576 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa2, zeta2
1577 INTEGER,
INTENT(IN) :: lb1_max, lb1_min, npgfb1
1578 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb1, zetb1
1579 INTEGER,
INTENT(IN) :: lb2_max, lb2_min, npgfb2
1580 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb2, zetb2
1581 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
1582 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
1583 INTENT(INOUT),
OPTIONAL :: saabb
1584 REAL(kind=
dp),
DIMENSION(:, :, :, :, :), &
1585 INTENT(INOUT),
OPTIONAL :: daabb
1587 INTEGER :: ax, ax1, ax2, ay, ay1, ay2, az, az1, az2, bx, bx1, bx2, by, by1, by2, bz, bz1, &
1588 bz2, coa1, coa2, cob1, cob2, i1pgf, i2pgf, ia1, ia2, ib1, ib2, j1pgf, j2pgf, la1, la2, &
1589 lb1, lb2, ldrr, lma, lmb, ma1, ma2, mb1, mb2, na1, na2, nb1, nb2, ofa1, ofa2, ofb1, ofb2
1590 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfa, &
1591 rpgfb, tab, xhi, zet
1592 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
1593 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
1597 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
1601 IF (
PRESENT(saabb))
THEN
1602 lma = la1_max + la2_max
1603 lmb = lb1_max + lb2_max
1605 IF (
PRESENT(daabb))
THEN
1606 lma = la1_max + la2_max + 1
1607 lmb = lb1_max + lb2_max
1609 ldrr = max(lma, lmb) + 1
1612 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
1615 ofa1 =
ncoset(la1_min - 1)
1616 ofa2 =
ncoset(la2_min - 1)
1617 ofb1 =
ncoset(lb1_min - 1)
1618 ofb2 =
ncoset(lb2_min - 1)
1619 na1 =
ncoset(la1_max) - ofa1
1620 na2 =
ncoset(la2_max) - ofa2
1621 nb1 =
ncoset(lb1_max) - ofb1
1622 nb2 =
ncoset(lb2_max) - ofb2
1623 IF (
PRESENT(saabb))
THEN
1624 cpassert((
SIZE(saabb, 1) >= na1*npgfa1))
1625 cpassert((
SIZE(saabb, 2) >= na2*npgfa2))
1626 cpassert((
SIZE(saabb, 3) >= nb1*npgfb1))
1627 cpassert((
SIZE(saabb, 4) >= nb2*npgfb2))
1629 IF (
PRESENT(daabb))
THEN
1630 cpassert((
SIZE(daabb, 1) >= na1*npgfa1))
1631 cpassert((
SIZE(daabb, 2) >= na2*npgfa2))
1632 cpassert((
SIZE(daabb, 3) >= nb1*npgfb1))
1633 cpassert((
SIZE(daabb, 4) >= nb2*npgfb2))
1634 cpassert((
SIZE(daabb, 5) >= 3))
1639 DO i1pgf = 1, npgfa1
1641 DO i2pgf = 1, npgfa2
1643 rpgfa = min(rpgfa1(i1pgf), rpgfa2(i2pgf))
1644 DO j1pgf = 1, npgfb1
1646 DO j2pgf = 1, npgfb2
1647 rpgfb = min(rpgfb1(j1pgf), rpgfb2(j2pgf))
1649 IF (rpgfa + rpgfb < tab)
THEN
1650 IF (
PRESENT(saabb)) saabb(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2) = 0.0_dp
1651 IF (
PRESENT(daabb)) daabb(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, 1:3) = 0.0_dp
1657 a = zeta1(i1pgf) + zeta2(i2pgf)
1658 b = zetb1(j1pgf) + zetb2(j2pgf)
1665 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
1668 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
1670 DO lb2 = lb2_min, lb2_max
1672 DO by2 = 0, lb2 - bx2
1673 bz2 = lb2 - bx2 - by2
1674 cob2 =
coset(bx2, by2, bz2) - ofb2
1676 DO lb1 = lb1_min, lb1_max
1678 DO by1 = 0, lb1 - bx1
1679 bz1 = lb1 - bx1 - by1
1680 cob1 =
coset(bx1, by1, bz1) - ofb1
1682 DO la2 = la2_min, la2_max
1684 DO ay2 = 0, la2 - ax2
1685 az2 = la2 - ax2 - ay2
1686 coa2 =
coset(ax2, ay2, az2) - ofa2
1688 DO la1 = la1_min, la1_max
1690 DO ay1 = 0, la1 - ax1
1691 az1 = la1 - ax1 - ay1
1692 coa1 =
coset(ax1, ay1, az1) - ofa1
1695 IF (
PRESENT(saabb))
THEN
1696 saabb(ia1, ia2, ib1, ib2) = f0*rr(ax1 + ax2, bx1 + bx2, 1)* &
1697 rr(ay1 + ay2, by1 + by2, 2)*rr(az1 + az2, bz1 + bz2, 3)
1700 IF (
PRESENT(daabb))
THEN
1709 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
1710 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
1711 daabb(ia1, ia2, ib1, ib2, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
1713 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
1714 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
1715 daabb(ia1, ia2, ib1, ib2, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
1717 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
1718 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
1719 daabb(ia1, ia2, ib1, ib2, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
1746 END SUBROUTINE overlap_aabb
1776 SUBROUTINE overlap_abbb(la_max, la_min, npgfa, rpgfa, zeta, &
1777 lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
1778 lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
1779 lb3_max, lb3_min, npgfb3, rpgfb3, zetb3, &
1781 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
1782 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
1783 INTEGER,
INTENT(IN) :: lb1_max, lb1_min, npgfb1
1784 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb1, zetb1
1785 INTEGER,
INTENT(IN) :: lb2_max, lb2_min, npgfb2
1786 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb2, zetb2
1787 INTEGER,
INTENT(IN) :: lb3_max, lb3_min, npgfb3
1788 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb3, zetb3
1789 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
1790 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
1791 INTENT(INOUT),
OPTIONAL :: sabbb
1792 REAL(kind=
dp),
DIMENSION(:, :, :, :, :), &
1793 INTENT(INOUT),
OPTIONAL :: dabbb
1795 INTEGER :: ax, ay, az, bx, bx1, bx2, bx3, by, by1, by2, by3, bz, bz1, bz2, bz3, coa, cob1, &
1796 cob2, cob3, ia, ib1, ib2, ib3, ipgf, j1pgf, j2pgf, j3pgf, la, lb1, lb2, lb3, ldrr, lma, &
1797 lmb, ma, mb1, mb2, mb3, na, nb1, nb2, nb3, ofa, ofb1, ofb2, ofb3
1798 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfb, &
1800 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
1801 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
1805 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
1809 IF (
PRESENT(sabbb))
THEN
1811 lmb = lb1_max + lb2_max + lb3_max
1813 IF (
PRESENT(dabbb))
THEN
1815 lmb = lb1_max + lb2_max + lb3_max
1817 ldrr = max(lma, lmb) + 1
1820 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
1824 ofb1 =
ncoset(lb1_min - 1)
1825 ofb2 =
ncoset(lb2_min - 1)
1826 ofb3 =
ncoset(lb3_min - 1)
1827 na =
ncoset(la_max) - ofa
1828 nb1 =
ncoset(lb1_max) - ofb1
1829 nb2 =
ncoset(lb2_max) - ofb2
1830 nb3 =
ncoset(lb3_max) - ofb3
1831 IF (
PRESENT(sabbb))
THEN
1832 cpassert((
SIZE(sabbb, 1) >= na*npgfa))
1833 cpassert((
SIZE(sabbb, 2) >= nb1*npgfb1))
1834 cpassert((
SIZE(sabbb, 3) >= nb2*npgfb2))
1835 cpassert((
SIZE(sabbb, 4) >= nb3*npgfb3))
1837 IF (
PRESENT(dabbb))
THEN
1838 cpassert((
SIZE(dabbb, 1) >= na*npgfa))
1839 cpassert((
SIZE(dabbb, 2) >= nb1*npgfb1))
1840 cpassert((
SIZE(dabbb, 3) >= nb2*npgfb2))
1841 cpassert((
SIZE(dabbb, 4) >= nb3*npgfb3))
1842 cpassert((
SIZE(dabbb, 5) >= 3))
1849 DO j1pgf = 1, npgfb1
1851 DO j2pgf = 1, npgfb2
1853 DO j3pgf = 1, npgfb3
1855 rpgfb = min(rpgfb1(j1pgf), rpgfb2(j2pgf), rpgfb3(j3pgf))
1856 IF (rpgfa(ipgf) + rpgfb < tab)
THEN
1857 IF (
PRESENT(sabbb)) sabbb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, mb3 + 1:mb3 + nb3) = 0.0_dp
1858 IF (
PRESENT(dabbb)) dabbb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, mb3 + 1:mb3 + nb3, 1:3) = 0.0_dp
1865 b = zetb1(j1pgf) + zetb2(j2pgf) + zetb3(j3pgf)
1872 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
1875 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
1877 DO lb3 = lb3_min, lb3_max
1879 DO by3 = 0, lb3 - bx3
1880 bz3 = lb3 - bx3 - by3
1881 cob3 =
coset(bx3, by3, bz3) - ofb3
1883 DO lb2 = lb2_min, lb2_max
1885 DO by2 = 0, lb2 - bx2
1886 bz2 = lb2 - bx2 - by2
1887 cob2 =
coset(bx2, by2, bz2) - ofb2
1889 DO lb1 = lb1_min, lb1_max
1891 DO by1 = 0, lb1 - bx1
1892 bz1 = lb1 - bx1 - by1
1893 cob1 =
coset(bx1, by1, bz1) - ofb1
1895 DO la = la_min, la_max
1899 coa =
coset(ax, ay, az) - ofa
1902 IF (
PRESENT(sabbb))
THEN
1903 sabbb(ia, ib1, ib2, ib3) = f0*rr(ax, bx1 + bx2 + bx3, 1)* &
1904 rr(ay, by1 + by2 + by3, 2)*rr(az, bz1 + bz2 + bz3, 3)
1907 IF (
PRESENT(dabbb))
THEN
1908 bx = bx1 + bx2 + bx3
1909 by = by1 + by2 + by3
1910 bz = bz1 + bz2 + bz3
1913 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
1914 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
1915 dabbb(ia, ib1, ib2, ib3, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
1917 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
1918 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
1919 dabbb(ia, ib1, ib2, ib3, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
1921 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
1922 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
1923 dabbb(ia, ib1, ib2, ib3, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
1950 END SUBROUTINE overlap_abbb
1965 INTEGER,
INTENT(IN) :: la
1966 REAL(kind=
dp),
INTENT(IN) :: zeta
1967 INTEGER,
INTENT(IN) :: lb
1968 REAL(kind=
dp),
INTENT(IN) :: zetb
1969 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
1970 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
1972 REAL(kind=
dp),
PARAMETER :: huge4 = huge(1._dp)/4._dp
1974 INTEGER :: nca, ncb, nsa, nsb
1975 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: cab
1976 REAL(kind=
dp),
DIMENSION(1) :: rpgf, za, zb
1977 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: c2sa, c2sb
1985 ALLOCATE (cab(nca, ncb))
1989 CALL overlap_ab(la, la, 1, rpgf, za, lb, lb, 1, rpgf, zb, rab, cab)
1993 sab(1:nsa, 1:nsb) = matmul(c2sa(1:nsa, 1:nca), &
1994 matmul(cab(1:nca, 1:ncb), transpose(c2sb(1:nsb, 1:ncb))))
2013 INTEGER,
INTENT(IN) :: la
2014 REAL(kind=
dp),
INTENT(IN) :: zeta
2015 INTEGER,
INTENT(IN) :: lb
2016 REAL(kind=
dp),
INTENT(IN) :: zetb, alat
2017 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
2019 COMPLEX(KIND=dp) :: zfg
2020 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: fun, gun
2021 INTEGER :: ax, ay, az, bx, by, bz, i, ia, ib, l, &
2022 l1, l2, na, nb, nca, ncb, nmax, nsa, &
2024 REAL(kind=
dp) :: oa, ob, ovol, zm
2025 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fexp, gexp, gval
2026 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: cab
2027 REAL(kind=
dp),
DIMENSION(0:3, 0:3) :: fgsum
2028 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: c2sa, c2sb
2032 ALLOCATE (cab(nca, ncb))
2037 zm = min(zeta, zetb)
2038 nmax = nint(1.81_dp*alat*sqrt(zm) + 1.0_dp)
2039 ALLOCATE (fun(-nmax:nmax, 0:la), gun(-nmax:nmax, 0:lb), &
2040 fexp(-nmax:nmax), gexp(-nmax:nmax), gval(-nmax:nmax))
2045 gval(i) =
twopi/alat*real(i, kind=
dp)
2046 fexp(i) = sqrt(oa*
pi)*exp(-0.25_dp*oa*gval(i)**2)
2047 gexp(i) = sqrt(ob*
pi)*exp(-0.25_dp*ob*gval(i)**2)
2051 fun(:, l) = cmplx(1.0_dp, 0.0_dp, kind=
dp)
2052 ELSEIF (l == 1)
THEN
2053 fun(:, l) = cmplx(0.0_dp, 0.5_dp*oa*gval(:), kind=
dp)
2054 ELSEIF (l == 2)
THEN
2055 fun(:, l) = cmplx(-(0.5_dp*oa*gval(:))**2, 0.0_dp, kind=
dp)
2056 fun(:, l) = fun(:, l) + cmplx(0.5_dp*oa, 0.0_dp, kind=
dp)
2057 ELSEIF (l == 3)
THEN
2058 fun(:, l) = cmplx(0.0_dp, -(0.5_dp*oa*gval(:))**3, kind=
dp)
2059 fun(:, l) = fun(:, l) + cmplx(0.0_dp, 0.75_dp*oa*oa*gval(:), kind=
dp)
2061 cpabort(
"l value too high")
2066 gun(:, l) = cmplx(1.0_dp, 0.0_dp, kind=
dp)
2067 ELSEIF (l == 1)
THEN
2068 gun(:, l) = cmplx(0.0_dp, 0.5_dp*ob*gval(:), kind=
dp)
2069 ELSEIF (l == 2)
THEN
2070 gun(:, l) = cmplx(-(0.5_dp*ob*gval(:))**2, 0.0_dp, kind=
dp)
2071 gun(:, l) = gun(:, l) + cmplx(0.5_dp*ob, 0.0_dp, kind=
dp)
2072 ELSEIF (l == 3)
THEN
2073 gun(:, l) = cmplx(0.0_dp, -(0.5_dp*ob*gval(:))**3, kind=
dp)
2074 gun(:, l) = gun(:, l) + cmplx(0.0_dp, 0.75_dp*ob*ob*gval(:), kind=
dp)
2076 cpabort(
"l value too high")
2083 zfg = sum(conjg(fun(:, l1))*fexp(:)*gun(:, l2)*gexp(:))
2084 fgsum(l1, l2) = real(zfg, kind=
dp)
2093 ia =
coset(ax, ay, az) - na
2097 ib =
coset(bx, by, bz) - nb
2098 cab(ia, ib) = fgsum(ax, bx)*fgsum(ay, by)*fgsum(az, bz)
2106 sab(1:nsa, 1:nsb) = matmul(c2sa(1:nsa, 1:nca), &
2107 matmul(cab(1:nca, 1:ncb), transpose(c2sb(1:nsb, 1:ncb))))
2108 ovol = 1._dp/(alat**3)
2109 sab(1:nsa, 1:nsb) = ovol*sab(1:nsa, 1:nsb)
2111 DEALLOCATE (cab, fun, gun, fexp, gexp, gval)
subroutine, public os_rr_ovlp(rap, la_max, rbp, lb_max, zet, ldrr, rr)
Calculation of the basic Obara-Saika recurrence relation.
Calculation of the overlap integrals over Cartesian Gaussian-type functions.
subroutine, public overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, lb_max, lb_min, npgfb, rpgfb, zetb, rab, sab, dab, ddab)
Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions....
subroutine, public overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, lb_max_set, lb_min_set, npgfb, rpgfb, zetb, rab, dab, sab, da_max_set, return_derivatives, s, lds, sdab, pab, force_a)
Purpose: Calculation of the two-center overlap integrals [a|b] over Cartesian Gaussian-type functions...
subroutine, public overlap_ab_s(la, zeta, lb, zetb, rab, sab)
Calculation of the two-center overlap integrals [a|b] over Spherical Gaussian-type functions.
subroutine, public overlap_ab_sp(la, zeta, lb, zetb, alat, sab)
Calculation of the overlap integrals [a|b] over cubic periodic Spherical Gaussian-type functions.
subroutine, public overlap_aab(la1_max, la1_min, npgfa1, rpgfa1, zeta1, la2_max, la2_min, npgfa2, rpgfa2, zeta2, lb_max, lb_min, npgfb, rpgfb, zetb, rab, saab, daab, saba, daba)
Calculation of the two-center overlap integrals [aa|b] over Cartesian Gaussian-type functions.
subroutine, public overlap_abb(la_max, la_min, npgfa, rpgfa, zeta, lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, rab, sabb, dabb)
Calculation of the two-center overlap integrals [a|bb] over Cartesian Gaussian-type functions.
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), parameter, public twopi
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public nco
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :, :), allocatable, public coset
integer, dimension(:), allocatable, public nso