79 SUBROUTINE overlap_aabb(la_max_set1, la_min_set1, npgfa1, rpgfa1, zeta1, &
80 la_max_set2, la_min_set2, npgfa2, rpgfa2, zeta2, &
81 lb_max_set1, lb_min_set1, npgfb1, rpgfb1, zetb1, &
82 lb_max_set2, lb_min_set2, npgfb2, rpgfb2, zetb2, &
83 asets_equal, bsets_equal, rab, dab, saabb)
85 INTEGER,
INTENT(IN) :: la_max_set1, la_min_set1, npgfa1
86 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa1, zeta1
87 INTEGER,
INTENT(IN) :: la_max_set2, la_min_set2, npgfa2
88 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfa2, zeta2
89 INTEGER,
INTENT(IN) :: lb_max_set1, lb_min_set1, npgfb1
90 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb1, zetb1
91 INTEGER,
INTENT(IN) :: lb_max_set2, lb_min_set2, npgfb2
92 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: rpgfb2, zetb2
93 LOGICAL,
INTENT(IN) :: asets_equal, bsets_equal
94 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rab
95 REAL(kind=
dp),
INTENT(IN) :: dab
96 REAL(kind=
dp),
DIMENSION(:, :, :, :),
INTENT(OUT) :: saabb
98 CHARACTER(len=*),
PARAMETER :: routinen =
'overlap_aabb'
100 INTEGER :: coa, cob, handle, ia, ib, ipgf, ja, jb, jpgf, jpgf_start, kpgf, la_max, la_min, &
101 lb_max, lb_min, ldrr, lpgf, lpgf_start, ncoa1, ncoa2, ncob1, ncob2
102 INTEGER,
ALLOCATABLE :: map_a(:, :), map_b(:, :)
103 INTEGER,
DIMENSION(3) :: na, nb
104 REAL(kind=
dp) :: f0, zeta, zetb, zetp
105 REAL(kind=
dp),
ALLOCATABLE :: s(:, :)
106 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: rr
107 REAL(kind=
dp),
DIMENSION(3) :: rap, rbp
109 CALL timeset(routinen, handle)
111 la_max = la_max_set1 + la_max_set2
112 la_min = la_min_set1 + la_min_set2
113 lb_max = lb_max_set1 + lb_max_set2
114 lb_min = lb_min_set1 + lb_min_set2
115 ldrr = max(la_max, lb_max) + 1
116 ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
118 ALLOCATE (map_a(
ncoset(la_min_set1 - 1) + 1:
ncoset(la_max_set1), &
120 map_b(
ncoset(lb_min_set1 - 1) + 1:
ncoset(lb_max_set1), &
124 DO ja = lbound(map_a, 2), ubound(map_a, 2)
125 DO ia = lbound(map_a, 1), ubound(map_a, 1)
127 map_a(ia, ja) =
coset(na(1), na(2), na(3))
130 DO jb = lbound(map_b, 2), ubound(map_b, 2)
131 DO ib = lbound(map_b, 1), ubound(map_b, 1)
133 map_b(ib, jb) =
coset(nb(1), nb(2), nb(3))
140 ncoa1 = (ipgf - 1)*
ncoset(la_max_set1)
141 jpgf_start = merge(ipgf, 1, asets_equal)
143 DO jpgf = jpgf_start, npgfa2
145 ncoa2 = (jpgf - 1)*
ncoset(la_max_set2)
146 zeta = zeta1(ipgf) + zeta2(jpgf)
150 ncob1 = (kpgf - 1)*
ncoset(lb_max_set1)
151 lpgf_start = merge(kpgf, 1, bsets_equal)
153 DO lpgf = lpgf_start, npgfb2
154 ncob2 = (lpgf - 1)*
ncoset(lb_max_set2)
157 IF (min(rpgfa1(ipgf), rpgfa2(jpgf)) + &
158 min(rpgfb1(kpgf), rpgfb2(lpgf)) < dab) cycle
160 zetb = zetb1(kpgf) + zetb2(lpgf)
164 zetp = 1.0_dp/(zeta + zetb)
166 f0 = sqrt((
pi*zetp)**3)*exp(-zeta*zetb*zetp*dab*dab)
167 rap(:) = zetb*zetp*rab(:)
168 rbp(:) = -zeta*zetp*rab(:)
170 CALL os_rr_ovlp(rap, la_max, rbp, lb_max, 1.0_dp/zetp, ldrr, rr)
176 s(coa, cob) = f0*rr(na(1), nb(1), 1)*rr(na(2), nb(2), 2)*rr(na(3), nb(3), 3)
181 DO jb =
ncoset(lb_min_set2 - 1) + 1,
ncoset(lb_max_set2)
182 DO ib =
ncoset(lb_min_set1 - 1) + 1,
ncoset(lb_max_set1)
184 DO ja =
ncoset(la_min_set2 - 1) + 1,
ncoset(la_max_set2)
185 DO ia =
ncoset(la_min_set1 - 1) + 1,
ncoset(la_max_set1)
187 saabb(ncoa1 + ia, ncoa2 + ja, ncob1 + ib, ncob2 + jb) = s(coa, cob)
188 IF (asets_equal) saabb(ncoa2 + ja, ncoa1 + ia, ncob1 + ib, ncob2 + jb) = s(coa, cob)
189 IF (bsets_equal) saabb(ncoa1 + ia, ncoa2 + ja, ncob2 + jb, ncob1 + ib) = s(coa, cob)
190 IF (asets_equal .AND. bsets_equal)
THEN
191 saabb(ncoa2 + ja, ncoa1 + ia, ncob2 + jb, ncob1 + ib) = s(coa, cob)
203 DEALLOCATE (rr, s, map_a, map_b)
204 CALL timestop(handle)
subroutine, public overlap_aabb(la_max_set1, la_min_set1, npgfa1, rpgfa1, zeta1, la_max_set2, la_min_set2, npgfa2, rpgfa2, zeta2, lb_max_set1, lb_min_set1, npgfb1, rpgfb1, zetb1, lb_max_set2, lb_min_set2, npgfb2, rpgfb2, zetb2, asets_equal, bsets_equal, rab, dab, saabb)
Purpose: Calculation of the two-center overlap integrals [aa|bb] over Cartesian Gaussian-type functio...