67 SUBROUTINE overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
68 lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
69 rab, dab, sab, da_max_set, return_derivatives, s, lds)
70 INTEGER,
INTENT(IN) :: la_max_set, la_min_set, npgfa
71 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
72 INTEGER,
INTENT(IN) :: lb_max_set, lb_min_set, npgfb
73 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
74 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
75 REAL(kind=
dp),
INTENT(IN) :: dab
76 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
77 INTEGER,
INTENT(IN) :: da_max_set
78 LOGICAL,
INTENT(IN) :: return_derivatives
79 INTEGER,
INTENT(IN) :: lds
80 REAL(kind=
dp),
DIMENSION(lds, lds, *), &
83 INTEGER :: ax, ay, az, bx, by, bz, cda, cdax, cday, cdaz, coa, coamx, coamy, coamz, coapx, &
84 coapy, coapz, cob, da, da_max, dax, day, daz, i, ipgf, j, jk, jpgf, jstart, k, la, &
85 la_max, la_start, lb, lb_max, lb_start, ldrr, na, nb
86 REAL(kind=
dp) :: f0, fax, fay, faz, ftz, zetp
87 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
88 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
91 la_max = la_max_set + da_max_set
94 ldrr = max(la_max, lb_max) + 1
95 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
108 IF (rpgfa(ipgf) + rpgfb(jpgf) < dab)
THEN
109 DO j = nb + 1, nb +
ncoset(lb_max_set)
110 DO i = na + 1, na +
ncoset(la_max_set)
114 IF (return_derivatives)
THEN
115 DO k = 2,
ncoset(da_max_set)
116 jstart = (k - 1)*
SIZE(sab, 1)
117 DO j = jstart + nb + 1, jstart + nb +
ncoset(lb_max_set)
118 DO i = na + 1, na +
ncoset(la_max_set)
124 nb = nb +
ncoset(lb_max_set)
130 zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
132 f0 = sqrt((
pi*zetp)**3)*exp(-zeta(ipgf)*zetb(jpgf)*zetp*dab*dab)
133 rap(:) = zetb(jpgf)*zetp*rab(:)
134 rbp(:) = -zeta(ipgf)*zetp*rab(:)
136 CALL os_rr_ovlp(rap, la_max, rbp, lb_max, 1.0_dp/zetp, ldrr, rr)
142 cob =
coset(bx, by, bz)
147 coa =
coset(ax, ay, az)
148 s(coa, cob, 1) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az, bz, 3)
158 DO j = 1,
ncoset(lb_max_set)
159 DO i = 1,
ncoset(la_max_set)
160 sab(na + i, nb + j) = s(i, j, 1)
167 IF (return_derivatives)
THEN
171 la_start = la_min_set
172 lb_start = lb_min_set
175 DO da = 0, da_max - 1
176 ftz = 2.0_dp*zeta(ipgf)
180 cda =
coset(dax, day, daz)
181 cdax =
coset(dax + 1, day, daz)
182 cday =
coset(dax, day + 1, daz)
183 cdaz =
coset(dax, day, daz + 1)
187 DO la = la_start, la_max - da - 1
194 coa =
coset(ax, ay, az)
195 coamx =
coset(ax - 1, ay, az)
196 coamy =
coset(ax, ay - 1, az)
197 coamz =
coset(ax, ay, az - 1)
198 coapx =
coset(ax + 1, ay, az)
199 coapy =
coset(ax, ay + 1, az)
200 coapz =
coset(ax, ay, az + 1)
201 DO lb = lb_start, lb_max_set
205 cob =
coset(bx, by, bz)
206 s(coa, cob, cdax) = ftz*s(coapx, cob, cda) - &
207 fax*s(coamx, cob, cda)
208 s(coa, cob, cday) = ftz*s(coapy, cob, cda) - &
209 fay*s(coamy, cob, cda)
210 s(coa, cob, cdaz) = ftz*s(coapz, cob, cda) - &
211 faz*s(coamz, cob, cda)
226 IF (return_derivatives)
THEN
227 DO k = 2,
ncoset(da_max_set)
228 jstart = (k - 1)*
SIZE(sab, 1)
229 DO j = 1,
ncoset(lb_max_set)
231 DO i = 1,
ncoset(la_max_set)
232 sab(na + i, nb + jk) = s(i, j, k)
238 nb = nb +
ncoset(lb_max_set)
242 na = na +
ncoset(la_max_set)
271 lb_max, lb_min, npgfb, rpgfb, zetb, &
272 rab, sab, dab, ddab, rr_work)
273 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
274 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
275 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
276 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
277 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
278 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT), &
280 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
281 OPTIONAL :: dab, ddab
282 REAL(kind=
dp),
DIMENSION(:),
INTENT(INOUT), &
283 OPTIONAL,
TARGET :: rr_work
285 INTEGER :: ax, ay, az, bx, by, bz, coa, cob, ia, &
286 ib, ipgf, jpgf, la, lb, ldrr, lma, &
287 lmb, ma, mb, na, nb, ofa, ofb
288 REAL(kind=
dp) :: a, ambm, ambp, apbm, apbp, b, dumx, &
289 dumy, dumz, f0, rab2, tab, xhi, zet
290 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
291 REAL(kind=
dp),
DIMENSION(:, :, :),
POINTER :: rr
295 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
299 cpassert(
PRESENT(sab) .OR.
PRESENT(dab) .OR.
PRESENT(ddab))
300 IF (
PRESENT(sab))
THEN
304 IF (
PRESENT(dab))
THEN
308 IF (
PRESENT(ddab))
THEN
312 ldrr = max(lma, lmb) + 1
316 IF (
PRESENT(rr_work))
THEN
317 cpassert(
SIZE(rr_work) >= ldrr*ldrr*3)
318 rr(0:ldrr - 1, 0:ldrr - 1, 1:3) => rr_work(1:ldrr*ldrr*3)
320 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
328 IF (
PRESENT(sab))
THEN
329 cpassert((
SIZE(sab, 1) >= na*npgfa))
330 cpassert((
SIZE(sab, 2) >= nb*npgfb))
332 IF (
PRESENT(dab))
THEN
333 cpassert((
SIZE(dab, 1) >= na*npgfa))
334 cpassert((
SIZE(dab, 2) >= nb*npgfb))
335 cpassert((
SIZE(dab, 3) >= 3))
337 IF (
PRESENT(ddab))
THEN
338 cpassert((
SIZE(ddab, 1) >= na*npgfa))
339 cpassert((
SIZE(ddab, 2) >= nb*npgfb))
340 cpassert((
SIZE(ddab, 3) >= 6))
349 IF (rpgfa(ipgf) + rpgfb(jpgf) < tab)
THEN
350 IF (
PRESENT(sab)) sab(ma + 1:ma + na, mb + 1:mb + nb) = 0.0_dp
351 IF (
PRESENT(dab)) dab(ma + 1:ma + na, mb + 1:mb + nb, 1:3) = 0.0_dp
352 IF (
PRESENT(ddab)) ddab(ma + 1:ma + na, mb + 1:mb + nb, 1:6) = 0.0_dp
366 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
369 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
371 DO lb = lb_min, lb_max
375 cob =
coset(bx, by, bz) - ofb
377 DO la = la_min, la_max
381 coa =
coset(ax, ay, az) - ofa
384 IF (
PRESENT(sab))
THEN
385 sab(ia, ib) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az, bz, 3)
388 IF (
PRESENT(dab))
THEN
391 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
392 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
393 dab(ia, ib, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
395 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
396 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
397 dab(ia, ib, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
399 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
400 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
401 dab(ia, ib, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
404 IF (
PRESENT(ddab))
THEN
408 apbp = f0*rr(ax + 1, bx + 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
410 apbm = f0*rr(ax + 1, bx - 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
415 ambp = f0*rr(ax - 1, bx + 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
419 IF (ax > 0 .AND. bx > 0)
THEN
420 ambm = f0*rr(ax - 1, bx - 1, 1)*rr(ay, by, 2)*rr(az, bz, 3)
424 ddab(ia, ib, 1) = -4.0_dp*a*b*apbp + 2.0_dp*a*real(bx,
dp)*apbm &
425 + 2.0_dp*b*real(ax,
dp)*ambp - real(ax,
dp)*real(bx,
dp)*ambm
427 apbp = f0*rr(ax + 1, bx, 1)*rr(ay, by + 1, 2)*rr(az, bz, 3)
429 apbm = f0*rr(ax + 1, bx, 1)*rr(ay, by - 1, 2)*rr(az, bz, 3)
434 ambp = f0*rr(ax - 1, bx, 1)*rr(ay, by + 1, 2)*rr(az, bz, 3)
438 IF (ax > 0 .AND. by > 0)
THEN
439 ambm = f0*rr(ax - 1, bx, 1)*rr(ay, by - 1, 2)*rr(az, bz, 3)
443 ddab(ia, ib, 2) = -4.0_dp*a*b*apbp + 2.0_dp*a*real(by,
dp)*apbm &
444 + 2.0_dp*b*real(ax,
dp)*ambp - real(ax,
dp)*real(by,
dp)*ambm
446 apbp = f0*rr(ax + 1, bx, 1)*rr(ay, by, 2)*rr(az, bz + 1, 3)
448 apbm = f0*rr(ax + 1, bx, 1)*rr(ay, by, 2)*rr(az, bz - 1, 3)
453 ambp = f0*rr(ax - 1, bx, 1)*rr(ay, by, 2)*rr(az, bz + 1, 3)
457 IF (ax > 0 .AND. bz > 0)
THEN
458 ambm = f0*rr(ax - 1, bx, 1)*rr(ay, by, 2)*rr(az, bz - 1, 3)
462 ddab(ia, ib, 3) = -4.0_dp*a*b*apbp + 2.0_dp*a*real(bz,
dp)*apbm &
463 + 2.0_dp*b*real(ax,
dp)*ambp - real(ax,
dp)*real(bz,
dp)*ambm
465 apbp = f0*rr(ax, bx, 1)*rr(ay + 1, by + 1, 2)*rr(az, bz, 3)
467 apbm = f0*rr(ax, bx, 1)*rr(ay + 1, by - 1, 2)*rr(az, bz, 3)
472 ambp = f0*rr(ax, bx, 1)*rr(ay - 1, by + 1, 2)*rr(az, bz, 3)
476 IF (ay > 0 .AND. by > 0)
THEN
477 ambm = f0*rr(ax, bx, 1)*rr(ay - 1, by - 1, 2)*rr(az, bz, 3)
481 ddab(ia, ib, 4) = -4.0_dp*a*b*apbp + 2.0_dp*a*real(by,
dp)*apbm &
482 + 2.0_dp*b*real(ay,
dp)*ambp - real(ay,
dp)*real(by,
dp)*ambm
484 apbp = f0*rr(ax, bx, 1)*rr(ay + 1, by, 2)*rr(az, bz + 1, 3)
486 apbm = f0*rr(ax, bx, 1)*rr(ay + 1, by, 2)*rr(az, bz - 1, 3)
491 ambp = f0*rr(ax, bx, 1)*rr(ay - 1, by, 2)*rr(az, bz + 1, 3)
495 IF (ay > 0 .AND. bz > 0)
THEN
496 ambm = f0*rr(ax, bx, 1)*rr(ay - 1, by, 2)*rr(az, bz - 1, 3)
500 ddab(ia, ib, 5) = -4.0_dp*a*b*apbp + 2.0_dp*a*real(bz,
dp)*apbm &
501 + 2.0_dp*b*real(ay,
dp)*ambp - real(ay,
dp)*real(bz,
dp)*ambm
503 apbp = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az + 1, bz + 1, 3)
505 apbm = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az + 1, bz - 1, 3)
510 ambp = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az - 1, bz + 1, 3)
514 IF (az > 0 .AND. bz > 0)
THEN
515 ambm = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az - 1, bz - 1, 3)
519 ddab(ia, ib, 6) = -4.0_dp*a*b*apbp + 2.0_dp*a*real(bz,
dp)*apbm &
520 + 2.0_dp*b*real(az,
dp)*ambp - real(az,
dp)*real(bz,
dp)*ambm
535 IF (.NOT.
PRESENT(rr_work))
DEALLOCATE (rr)
567 la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
568 lb_max, lb_min, npgfb, rpgfb, zetb, &
569 rab, saab, daab, saba, daba)
570 INTEGER,
INTENT(IN) :: la1_max, la1_min, npgfa1
571 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa1, zeta1
572 INTEGER,
INTENT(IN) :: la2_max, la2_min, npgfa2
573 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa2, zeta2
574 INTEGER,
INTENT(IN) :: lb_max, lb_min, npgfb
575 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb, zetb
576 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
577 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
579 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
580 INTENT(INOUT),
OPTIONAL :: daab
581 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
583 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
584 INTENT(INOUT),
OPTIONAL :: daba
586 INTEGER :: ax, ax1, ax2, ay, ay1, ay2, az, az1, az2, bx, by, bz, coa1, coa2, cob, i1pgf, &
587 i2pgf, ia1, ia2, ib, jpgf, la1, la2, lb, ldrr, lma, lmb, ma1, ma2, mb, na1, na2, nb, &
589 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfa, &
591 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
592 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
596 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
600 cpassert(
PRESENT(saab) .OR.
PRESENT(daab) .OR.
PRESENT(saba) .OR.
PRESENT(daba))
601 IF (
PRESENT(saab) .OR.
PRESENT(saba))
THEN
602 lma = la1_max + la2_max
605 IF (
PRESENT(daab) .OR.
PRESENT(daba))
THEN
606 lma = la1_max + la2_max + 1
609 ldrr = max(lma, lmb) + 1
612 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
615 ofa1 =
ncoset(la1_min - 1)
616 ofa2 =
ncoset(la2_min - 1)
618 na1 =
ncoset(la1_max) - ofa1
619 na2 =
ncoset(la2_max) - ofa2
621 IF (
PRESENT(saab))
THEN
622 cpassert((
SIZE(saab, 1) >= na1*npgfa1))
623 cpassert((
SIZE(saab, 2) >= na2*npgfa2))
624 cpassert((
SIZE(saab, 3) >= nb*npgfb))
626 IF (
PRESENT(daab))
THEN
627 cpassert((
SIZE(daab, 1) >= na1*npgfa1))
628 cpassert((
SIZE(daab, 2) >= na2*npgfa2))
629 cpassert((
SIZE(daab, 3) >= nb*npgfb))
630 cpassert((
SIZE(daab, 4) >= 3))
632 IF (
PRESENT(saba))
THEN
633 cpassert((
SIZE(saba, 1) >= na1*npgfa1))
634 cpassert((
SIZE(saba, 2) >= nb*npgfb))
635 cpassert((
SIZE(saba, 3) >= na2*npgfa2))
637 IF (
PRESENT(daba))
THEN
638 cpassert((
SIZE(daba, 1) >= na1*npgfa1))
639 cpassert((
SIZE(daba, 2) >= nb*npgfb))
640 cpassert((
SIZE(daba, 3) >= na2*npgfa2))
641 cpassert((
SIZE(daba, 4) >= 3))
649 rpgfa = min(rpgfa1(i1pgf), rpgfa2(i2pgf))
653 IF (rpgfa + rpgfb(jpgf) < tab)
THEN
654 IF (
PRESENT(saab)) saab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb) = 0.0_dp
655 IF (
PRESENT(daab)) daab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb, 1:3) = 0.0_dp
656 IF (
PRESENT(saba)) saba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2) = 0.0_dp
657 IF (
PRESENT(daba)) daba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2, 1:3) = 0.0_dp
663 a = zeta1(i1pgf) + zeta2(i2pgf)
671 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
674 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
676 DO lb = lb_min, lb_max
680 cob =
coset(bx, by, bz) - ofb
682 DO la2 = la2_min, la2_max
684 DO ay2 = 0, la2 - ax2
685 az2 = la2 - ax2 - ay2
686 coa2 =
coset(ax2, ay2, az2) - ofa2
688 DO la1 = la1_min, la1_max
690 DO ay1 = 0, la1 - ax1
691 az1 = la1 - ax1 - ay1
692 coa1 =
coset(ax1, ay1, az1) - ofa1
695 IF (
PRESENT(saab))
THEN
696 saab(ia1, ia2, ib) = f0*rr(ax1 + ax2, bx, 1)*rr(ay1 + ay2, by, 2)*rr(az1 + az2, bz, 3)
698 IF (
PRESENT(saba))
THEN
699 saba(ia1, ib, ia2) = f0*rr(ax1 + ax2, bx, 1)*rr(ay1 + ay2, by, 2)*rr(az1 + az2, bz, 3)
702 IF (
PRESENT(daab) .OR.
PRESENT(daba))
THEN
708 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
709 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
710 dumx = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
712 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
713 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
714 dumy = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
716 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
717 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
718 dumz = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
719 IF (
PRESENT(daab))
THEN
720 daab(ia1, ia2, ib, 1) = dumx
721 daab(ia1, ia2, ib, 2) = dumy
722 daab(ia1, ia2, ib, 3) = dumz
724 IF (
PRESENT(daba))
THEN
725 daba(ia1, ib, ia2, 1) = dumx
726 daba(ia1, ib, ia2, 2) = dumy
727 daba(ia1, ib, ia2, 3) = dumz
777 lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
778 lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
780 INTEGER,
INTENT(IN) :: la_max, la_min, npgfa
781 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa, zeta
782 INTEGER,
INTENT(IN) :: lb1_max, lb1_min, npgfb1
783 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb1, zetb1
784 INTEGER,
INTENT(IN) :: lb2_max, lb2_min, npgfb2
785 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb2, zetb2
786 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
787 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT), &
789 REAL(kind=
dp),
DIMENSION(:, :, :, :), &
790 INTENT(INOUT),
OPTIONAL :: dabb
792 INTEGER :: ax, ay, az, bx, bx1, bx2, by, by1, by2, bz, bz1, bz2, coa, cob1, cob2, ia, ib1, &
793 ib2, ipgf, j1pgf, j2pgf, la, lb1, lb2, ldrr, lma, lmb, ma, mb1, mb2, na, nb1, nb2, ofa, &
795 REAL(kind=
dp) :: a, b, dumx, dumy, dumz, f0, rab2, rpgfb, &
797 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
798 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
802 rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
806 cpassert(
PRESENT(sabb) .OR.
PRESENT(dabb))
807 IF (
PRESENT(sabb))
THEN
809 lmb = lb1_max + lb2_max
811 IF (
PRESENT(dabb))
THEN
813 lmb = lb1_max + lb2_max
815 ldrr = max(lma, lmb) + 1
818 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
822 ofb1 =
ncoset(lb1_min - 1)
823 ofb2 =
ncoset(lb2_min - 1)
825 nb1 =
ncoset(lb1_max) - ofb1
826 nb2 =
ncoset(lb2_max) - ofb2
827 IF (
PRESENT(sabb))
THEN
828 cpassert((
SIZE(sabb, 1) >= na*npgfa))
829 cpassert((
SIZE(sabb, 2) >= nb1*npgfb1))
830 cpassert((
SIZE(sabb, 3) >= nb2*npgfb2))
832 IF (
PRESENT(dabb))
THEN
833 cpassert((
SIZE(dabb, 1) >= na*npgfa))
834 cpassert((
SIZE(dabb, 2) >= nb1*npgfb1))
835 cpassert((
SIZE(dabb, 3) >= nb2*npgfb2))
836 cpassert((
SIZE(dabb, 4) >= 3))
847 rpgfb = min(rpgfb1(j1pgf), rpgfb2(j2pgf))
848 IF (rpgfa(ipgf) + rpgfb < tab)
THEN
849 IF (
PRESENT(sabb)) sabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2) = 0.0_dp
850 IF (
PRESENT(dabb)) dabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, 1:3) = 0.0_dp
857 b = zetb1(j1pgf) + zetb2(j2pgf)
864 f0 = (
pi/zet)**(1.5_dp)*exp(-xhi*rab2)
867 CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
869 DO lb2 = lb2_min, lb2_max
871 DO by2 = 0, lb2 - bx2
872 bz2 = lb2 - bx2 - by2
873 cob2 =
coset(bx2, by2, bz2) - ofb2
875 DO lb1 = lb1_min, lb1_max
877 DO by1 = 0, lb1 - bx1
878 bz1 = lb1 - bx1 - by1
879 cob1 =
coset(bx1, by1, bz1) - ofb1
881 DO la = la_min, la_max
885 coa =
coset(ax, ay, az) - ofa
888 IF (
PRESENT(sabb))
THEN
889 sabb(ia, ib1, ib2) = f0*rr(ax, bx1 + bx2, 1)*rr(ay, by1 + by2, 2)*rr(az, bz1 + bz2, 3)
892 IF (
PRESENT(dabb))
THEN
898 dumx = 2.0_dp*a*rr(ax + 1, bx, 1)
899 IF (ax > 0) dumx = dumx - real(ax,
dp)*rr(ax - 1, bx, 1)
900 dabb(ia, ib1, ib2, 1) = f0*dumx*rr(ay, by, 2)*rr(az, bz, 3)
902 dumy = 2.0_dp*a*rr(ay + 1, by, 2)
903 IF (ay > 0) dumy = dumy - real(ay,
dp)*rr(ay - 1, by, 2)
904 dabb(ia, ib1, ib2, 2) = f0*rr(ax, bx, 1)*dumy*rr(az, bz, 3)
906 dumz = 2.0_dp*a*rr(az + 1, bz, 3)
907 IF (az > 0) dumz = dumz - real(az,
dp)*rr(az - 1, bz, 3)
908 dabb(ia, ib1, ib2, 3) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*dumz
995 INTEGER,
INTENT(IN) :: la
996 REAL(kind=
dp),
INTENT(IN) :: zeta
997 INTEGER,
INTENT(IN) :: lb
998 REAL(kind=
dp),
INTENT(IN) :: zetb, alat
999 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: sab
1001 COMPLEX(KIND=dp) :: zfg
1002 COMPLEX(KIND=dp),
ALLOCATABLE,
DIMENSION(:, :) :: fun, gun
1003 INTEGER :: ax, ay, az, bx, by, bz, i, ia, ib, l, &
1004 l1, l2, na, nb, nca, ncb, nmax, nsa, &
1006 REAL(kind=
dp) :: oa, ob, ovol, zm
1007 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fexp, gexp, gval
1008 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :) :: cab
1009 REAL(kind=
dp),
DIMENSION(0:3, 0:3) :: fgsum
1010 REAL(kind=
dp),
DIMENSION(:, :),
POINTER :: c2sa, c2sb
1014 ALLOCATE (cab(nca, ncb))
1019 zm = min(zeta, zetb)
1020 nmax = nint(1.81_dp*alat*sqrt(zm) + 1.0_dp)
1021 ALLOCATE (fun(-nmax:nmax, 0:la), gun(-nmax:nmax, 0:lb), &
1022 fexp(-nmax:nmax), gexp(-nmax:nmax), gval(-nmax:nmax))
1027 gval(i) =
twopi/alat*real(i, kind=
dp)
1028 fexp(i) = sqrt(oa*
pi)*exp(-0.25_dp*oa*gval(i)**2)
1029 gexp(i) = sqrt(ob*
pi)*exp(-0.25_dp*ob*gval(i)**2)
1034 ELSE IF (l == 1)
THEN
1035 fun(:, l) = cmplx(0.0_dp, 0.5_dp*oa*gval(:), kind=
dp)
1036 ELSE IF (l == 2)
THEN
1037 fun(:, l) = cmplx(-(0.5_dp*oa*gval(:))**2, 0.0_dp, kind=
dp)
1038 fun(:, l) = fun(:, l) + cmplx(0.5_dp*oa, 0.0_dp, kind=
dp)
1039 ELSE IF (l == 3)
THEN
1040 fun(:, l) = cmplx(0.0_dp, -(0.5_dp*oa*gval(:))**3, kind=
dp)
1041 fun(:, l) = fun(:, l) + cmplx(0.0_dp, 0.75_dp*oa*oa*gval(:), kind=
dp)
1043 cpabort(
"l value too high")
1049 ELSE IF (l == 1)
THEN
1050 gun(:, l) = cmplx(0.0_dp, 0.5_dp*ob*gval(:), kind=
dp)
1051 ELSE IF (l == 2)
THEN
1052 gun(:, l) = cmplx(-(0.5_dp*ob*gval(:))**2, 0.0_dp, kind=
dp)
1053 gun(:, l) = gun(:, l) + cmplx(0.5_dp*ob, 0.0_dp, kind=
dp)
1054 ELSE IF (l == 3)
THEN
1055 gun(:, l) = cmplx(0.0_dp, -(0.5_dp*ob*gval(:))**3, kind=
dp)
1056 gun(:, l) = gun(:, l) + cmplx(0.0_dp, 0.75_dp*ob*ob*gval(:), kind=
dp)
1058 cpabort(
"l value too high")
1065 zfg = sum(conjg(fun(:, l1))*fexp(:)*gun(:, l2)*gexp(:))
1066 fgsum(l1, l2) = real(zfg, kind=
dp)
1075 ia =
coset(ax, ay, az) - na
1079 ib =
coset(bx, by, bz) - nb
1080 cab(ia, ib) = fgsum(ax, bx)*fgsum(ay, by)*fgsum(az, bz)
1088 sab(1:nsa, 1:nsb) = matmul(c2sa(1:nsa, 1:nca), &
1089 matmul(cab(1:nca, 1:ncb), transpose(c2sb(1:nsb, 1:ncb))))
1090 ovol = 1._dp/(alat**3)
1091 sab(1:nsa, 1:nsb) = ovol*sab(1:nsa, 1:nsb)
1093 DEALLOCATE (cab, fun, gun, fexp, gexp, gval)