Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2026 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : ! **************************************************************************************************
9 : !> \brief Calculation of the overlap integrals over Cartesian Gaussian-type
10 : !> functions.
11 : !> \par Literature
12 : !> S. Obara and A. Saika, J. Chem. Phys. 84, 3963 (1986)
13 : !> \par History
14 : !> - Derivatives added (02.05.2002,MK)
15 : !> - New OS routine with simpler logic (11.07.2014, JGH)
16 : !> \author Matthias Krack (08.10.1999)
17 : ! **************************************************************************************************
18 : MODULE ai_overlap
19 : USE ai_cartesian_operators, ONLY: apply_cartesian_1d,&
20 : apply_cartesian_operator_pair,&
21 : cartesian_ladder,&
22 : cartesian_ladder_map
23 : USE ai_os_rr, ONLY: os_rr_ovlp
24 : USE kinds, ONLY: dp
25 : USE mathconstants, ONLY: pi,&
26 : twopi,&
27 : z_one
28 : USE orbital_pointers, ONLY: coset,&
29 : indco,&
30 : nco,&
31 : ncoset,&
32 : nso
33 : USE orbital_transformation_matrices, ONLY: orbtramat
34 : #include "../base/base_uses.f90"
35 :
36 : IMPLICIT NONE
37 :
38 : PRIVATE
39 :
40 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_overlap'
41 :
42 : ! *** Public subroutines ***
43 : PUBLIC :: overlap, overlap_ab, overlap_aab, overlap_ab_s, overlap_ab_sp, &
44 : overlap_abb
45 :
46 : CONTAINS
47 :
48 : ! **************************************************************************************************
49 : !> \brief Purpose: Calculation of the two-center overlap integrals [a|b] over
50 : !> Cartesian Gaussian-type functions.
51 : !> \param la_max_set Max L on center A
52 : !> \param la_min_set Min L on center A
53 : !> \param npgfa Number of primitives on center A
54 : !> \param rpgfa Range of functions on A, used for screening
55 : !> \param zeta Exponents on center A
56 : !> \param lb_max_set Max L on center B
57 : !> \param lb_min_set Min L on center B
58 : !> \param npgfb Number of primitives on center B
59 : !> \param rpgfb Range of functions on B, used for screening
60 : !> \param zetb Exponents on center B
61 : !> \param rab Distance vector A-B
62 : !> \param dab Distance A-B
63 : !> \param sab Final Integrals, basic and derivatives
64 : !> \param da_max_set Some additional derivative information
65 : !> \param return_derivatives Return integral derivatives
66 : !> \param s Work space
67 : !> \param lds Leading dimension of s
68 : !> \date 19.09.2000
69 : !> \author MK
70 : !> \version 1.0
71 : ! **************************************************************************************************
72 2055200 : SUBROUTINE overlap(la_max_set, la_min_set, npgfa, rpgfa, zeta, &
73 4110400 : lb_max_set, lb_min_set, npgfb, rpgfb, zetb, &
74 2055200 : rab, dab, sab, da_max_set, return_derivatives, s, lds)
75 : INTEGER, INTENT(IN) :: la_max_set, la_min_set, npgfa
76 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfa, zeta
77 : INTEGER, INTENT(IN) :: lb_max_set, lb_min_set, npgfb
78 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfb, zetb
79 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
80 : REAL(KIND=dp), INTENT(IN) :: dab
81 : REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: sab
82 : INTEGER, INTENT(IN) :: da_max_set
83 : LOGICAL, INTENT(IN) :: return_derivatives
84 : INTEGER, INTENT(IN) :: lds
85 : REAL(KIND=dp), DIMENSION(lds, lds, *), &
86 : INTENT(INOUT) :: s
87 :
88 : INTEGER :: ax, axis, ay, az, bx, by, bz, cda, coa, cob, da, da_max, first, first_b, i, ipgf, &
89 : j, jk, jpgf, jstart, k, la_max, la_start, last, last_b, lb_max, lb_start, ldrr, na, nb, &
90 : parent, power(3)
91 2055200 : INTEGER, ALLOCATABLE :: derivative_map(:, :, :)
92 : REAL(KIND=dp) :: f0, zetp
93 2055200 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: rr
94 : REAL(KIND=dp), DIMENSION(3) :: rap, rbp
95 :
96 2055200 : da_max = da_max_set
97 2055200 : la_max = la_max_set + da_max_set
98 :
99 2055200 : lb_max = lb_max_set
100 2055200 : ldrr = MAX(la_max, lb_max) + 1
101 10276000 : ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
102 2055200 : IF (da_max > 0) THEN
103 2557544 : ALLOCATE (derivative_map(4, ncoset(la_max - 1), 3))
104 2557544 : DO axis = 1, 3
105 2557544 : CALL cartesian_ladder_map(la_max - 1, 0, axis, derivative_map(:, :, axis))
106 : END DO
107 : END IF
108 :
109 : ! *** Loop over all pairs of primitive Gaussian-type functions ***
110 :
111 2055200 : na = 0
112 10527612 : DO ipgf = 1, npgfa
113 :
114 8472412 : nb = 0
115 :
116 22873998 : DO jpgf = 1, npgfb
117 :
118 : ! *** Screening ***
119 :
120 14401586 : IF (rpgfa(ipgf) + rpgfb(jpgf) < dab) THEN
121 51350752 : DO j = nb + 1, nb + ncoset(lb_max_set)
122 258651398 : DO i = na + 1, na + ncoset(la_max_set)
123 249293258 : sab(i, j) = 0.0_dp
124 : END DO
125 : END DO
126 9358140 : IF (return_derivatives) THEN
127 20027010 : DO k = 2, ncoset(da_max_set)
128 10668870 : jstart = (k - 1)*SIZE(sab, 1)
129 62639940 : DO j = jstart + nb + 1, jstart + nb + ncoset(lb_max_set)
130 228142932 : DO i = na + 1, na + ncoset(la_max_set)
131 217474062 : sab(i, j) = 0.0_dp
132 : END DO
133 : END DO
134 : END DO
135 : END IF
136 9358140 : nb = nb + ncoset(lb_max_set)
137 9358140 : CYCLE
138 : END IF
139 :
140 : ! *** Calculate some prefactors ***
141 :
142 5043446 : zetp = 1.0_dp/(zeta(ipgf) + zetb(jpgf))
143 :
144 5043446 : f0 = SQRT((pi*zetp)**3)*EXP(-zeta(ipgf)*zetb(jpgf)*zetp*dab*dab)
145 20173784 : rap(:) = zetb(jpgf)*zetp*rab(:)
146 20173784 : rbp(:) = -zeta(ipgf)*zetp*rab(:)
147 :
148 5043446 : CALL os_rr_ovlp(rap, la_max, rbp, lb_max, 1.0_dp/zetp, ldrr, rr)
149 :
150 27949398 : DO cob = 1, ncoset(lb_max)
151 22905952 : bx = indco(1, cob)
152 22905952 : by = indco(2, cob)
153 22905952 : bz = indco(3, cob)
154 195509494 : DO coa = 1, ncoset(la_max)
155 167560096 : ax = indco(1, coa)
156 167560096 : ay = indco(2, coa)
157 167560096 : az = indco(3, coa)
158 190466048 : s(coa, cob, 1) = f0*rr(ax, bx, 1)*rr(ay, by, 2)*rr(az, bz, 3)
159 : END DO
160 : END DO
161 :
162 : ! *** Store the primitive overlap integrals ***
163 :
164 27949398 : DO j = 1, ncoset(lb_max_set)
165 151019308 : DO i = 1, ncoset(la_max_set)
166 145975862 : sab(na + i, nb + j) = s(i, j, 1)
167 : END DO
168 : END DO
169 :
170 : ! *** Calculate the requested derivatives with respect ***
171 : ! *** to the nuclear coordinates of the atomic center a ***
172 :
173 5043446 : IF (return_derivatives) THEN
174 : la_start = 0
175 : lb_start = 0
176 : ELSE
177 0 : la_start = la_min_set
178 0 : lb_start = lb_min_set
179 : END IF
180 :
181 5043446 : first_b = ncoset(lb_start - 1) + 1
182 5043446 : last_b = ncoset(lb_max_set)
183 6785847 : DO da = 1, da_max
184 : ! Intermediate shells must cover lowering in the remaining derivative steps.
185 1742401 : first = ncoset(MAX(0, la_start - da_max + da) - 1) + 1
186 1742401 : last = ncoset(la_max - da)
187 12014850 : DO cda = ncoset(da - 1) + 1, ncoset(da)
188 20916012 : power = indco(:, cda)
189 5229003 : axis = 3
190 5229003 : IF (power(3) == 0) axis = 2
191 5229003 : IF (power(axis) == 0) axis = 1
192 5229003 : power(axis) = power(axis) - 1
193 5229003 : parent = coset(power(1), power(2), power(3))
194 : CALL cartesian_ladder(s(:, first_b:last_b, parent), s(first:last, first_b:last_b, cda), &
195 6971404 : derivative_map(:, first:last, axis), .TRUE., zeta(ipgf), 0.0_dp, .FALSE.)
196 : END DO
197 : END DO
198 :
199 : ! *** Return all the calculated derivatives of the ***
200 : ! *** primitive overlap integrals, if requested ***
201 :
202 5043446 : IF (return_derivatives) THEN
203 10272449 : DO k = 2, ncoset(da_max_set)
204 5229003 : jstart = (k - 1)*SIZE(sab, 1)
205 31419164 : DO j = 1, ncoset(lb_max_set)
206 21146715 : jk = jstart + j
207 132083964 : DO i = 1, ncoset(la_max_set)
208 126854961 : sab(na + i, nb + jk) = s(i, j, k)
209 : END DO
210 : END DO
211 : END DO
212 : END IF
213 :
214 13515858 : nb = nb + ncoset(lb_max_set)
215 :
216 : END DO
217 :
218 10527612 : na = na + ncoset(la_max_set)
219 : END DO
220 :
221 2055200 : DEALLOCATE (rr)
222 :
223 2055200 : END SUBROUTINE overlap
224 :
225 : ! **************************************************************************************************
226 : !> \brief Calculation of the two-center overlap integrals [a|b] over
227 : !> Cartesian Gaussian-type functions. First and second derivatives
228 : !> \param la_max Max L on center A
229 : !> \param la_min Min L on center A
230 : !> \param npgfa Number of primitives on center A
231 : !> \param rpgfa Range of functions on A, used for screening
232 : !> \param zeta Exponents on center A
233 : !> \param lb_max Max L on center B
234 : !> \param lb_min Min L on center B
235 : !> \param npgfb Number of primitives on center B
236 : !> \param rpgfb Range of functions on B, used for screening
237 : !> \param zetb Exponents on center B
238 : !> \param rab Distance vector A-B
239 : !> \param sab Final overlap integrals
240 : !> \param dab First derivative overlap integrals
241 : !> \param ddab Second derivative overlap integrals ordered xx, xy, xz, yy, yz, zz
242 : !> \param rr_work Optional caller-provided one-dimensional overlap recurrence workspace
243 : !> \date 01.07.2014
244 : !> \author JGH
245 : ! **************************************************************************************************
246 18866245 : SUBROUTINE overlap_ab(la_max, la_min, npgfa, rpgfa, zeta, &
247 18866245 : lb_max, lb_min, npgfb, rpgfb, zetb, &
248 18866245 : rab, sab, dab, ddab, rr_work)
249 : INTEGER, INTENT(IN) :: la_max, la_min, npgfa
250 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfa, zeta
251 : INTEGER, INTENT(IN) :: lb_max, lb_min, npgfb
252 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfb, zetb
253 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
254 : REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT), &
255 : OPTIONAL :: sab
256 : REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
257 : OPTIONAL :: dab, ddab
258 : REAL(KIND=dp), DIMENSION(:), INTENT(INOUT), &
259 : OPTIONAL, TARGET :: rr_work
260 :
261 : INTEGER, PARAMETER :: component(2, 1) = RESHAPE([1, 1], [2, 1]), &
262 : pairs(2, 6) = RESHAPE([1, 1, 1, 2, 1, 3, 2, 2, 2, 3, 3, 3], [2, 6])
263 :
264 : INTEGER :: avec(3), bvec(3), coa, cob, ia, ib, icomp, idir, ipgf, jdir, jpgf, kdir, ldrr, &
265 37732490 : lma, lmb, ma, mb, na, nb, ofa, ofb, map_b(4, lb_max + 1, 1), map_a(4, la_max + 1, 1)
266 : REAL(KIND=dp) :: a, b, f0, factor(3), rab2, sval(3), tab, &
267 : xhi, zet
268 18866245 : REAL(KIND=dp), ALLOCATABLE :: drr_a(:, :, :), drr_ab(:, :, :)
269 : REAL(KIND=dp), DIMENSION(3) :: rap, rbp
270 18866245 : REAL(KIND=dp), DIMENSION(:, :, :), POINTER :: rr
271 :
272 : ! Distance of the centers a and b
273 :
274 18866245 : rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
275 18866245 : tab = SQRT(rab2)
276 :
277 : ! Maximum l for auxiliary integrals
278 18866245 : CPASSERT(PRESENT(sab) .OR. PRESENT(dab) .OR. PRESENT(ddab))
279 18866245 : IF (PRESENT(sab)) THEN
280 18569413 : lma = la_max
281 18569413 : lmb = lb_max
282 : END IF
283 18866245 : IF (PRESENT(dab)) THEN
284 4966681 : lma = la_max + 1
285 4966681 : lmb = lb_max
286 : END IF
287 18866245 : IF (PRESENT(ddab)) THEN
288 13855 : lma = la_max + 1
289 13855 : lmb = lb_max + 1
290 : END IF
291 18866245 : ldrr = MAX(lma, lmb) + 1
292 :
293 : ! Allocate or attach the workspace for auxiliary integrals
294 : NULLIFY (rr)
295 18866245 : IF (PRESENT(rr_work)) THEN
296 157518 : CPASSERT(SIZE(rr_work) >= ldrr*ldrr*3)
297 157518 : rr(0:ldrr - 1, 0:ldrr - 1, 1:3) => rr_work(1:ldrr*ldrr*3)
298 : ELSE
299 93543635 : ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
300 : END IF
301 :
302 38732969 : IF (PRESENT(dab) .OR. PRESENT(ddab)) ALLOCATE (drr_a(0:ldrr - 1, 0:ldrr - 1, 3))
303 4966681 : IF (PRESENT(ddab)) THEN
304 41565 : ALLOCATE (drr_ab(0:ldrr - 1, 0:ldrr - 1, 3))
305 13855 : CALL cartesian_ladder_map(la_max, 0, 0, map_a(:, :, 1))
306 13855 : CALL cartesian_ladder_map(lb_max, 0, 0, map_b(:, :, 1))
307 : END IF
308 :
309 : ! Number of integrals, check size of arrays
310 18866245 : ofa = ncoset(la_min - 1)
311 18866245 : ofb = ncoset(lb_min - 1)
312 18866245 : na = ncoset(la_max) - ofa
313 18866245 : nb = ncoset(lb_max) - ofb
314 18866245 : IF (PRESENT(sab)) THEN
315 18569413 : CPASSERT((SIZE(sab, 1) >= na*npgfa))
316 18569413 : CPASSERT((SIZE(sab, 2) >= nb*npgfb))
317 : END IF
318 18866245 : IF (PRESENT(dab)) THEN
319 4966681 : CPASSERT((SIZE(dab, 1) >= na*npgfa))
320 4966681 : CPASSERT((SIZE(dab, 2) >= nb*npgfb))
321 4966681 : CPASSERT((SIZE(dab, 3) >= 3))
322 : END IF
323 18866245 : IF (PRESENT(ddab)) THEN
324 13855 : CPASSERT((SIZE(ddab, 1) >= na*npgfa))
325 13855 : CPASSERT((SIZE(ddab, 2) >= nb*npgfb))
326 13855 : CPASSERT((SIZE(ddab, 3) >= 6))
327 : END IF
328 :
329 : ! Loops over all pairs of primitive Gaussian-type functions
330 18866245 : ma = 0
331 114179650 : DO ipgf = 1, npgfa
332 95313405 : mb = 0
333 648470381 : DO jpgf = 1, npgfb
334 : ! Distance Screening
335 553156976 : IF (rpgfa(ipgf) + rpgfb(jpgf) < tab) THEN
336 4627628707 : IF (PRESENT(sab)) sab(ma + 1:ma + na, mb + 1:mb + nb) = 0.0_dp
337 3587358114 : IF (PRESENT(dab)) dab(ma + 1:ma + na, mb + 1:mb + nb, 1:3) = 0.0_dp
338 430362207 : IF (PRESENT(ddab)) ddab(ma + 1:ma + na, mb + 1:mb + nb, 1:6) = 0.0_dp
339 423653793 : mb = mb + nb
340 423653793 : CYCLE
341 : END IF
342 :
343 : ! Calculate some prefactors
344 129503183 : a = zeta(ipgf)
345 129503183 : b = zetb(jpgf)
346 129503183 : zet = a + b
347 129503183 : xhi = a*b/zet
348 518012732 : rap = b*rab/zet
349 518012732 : rbp = -a*rab/zet
350 :
351 : ! [s|s] integral
352 129503183 : f0 = (pi/zet)**(1.5_dp)*EXP(-xhi*rab2)
353 :
354 : ! Calculate the recurrence relation
355 129503183 : CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
356 129503183 : IF (PRESENT(ddab)) THEN
357 223420 : DO idir = 1, 3
358 : CALL apply_cartesian_operator_pair(rr(:, :, idir), drr_ab(0:la_max, 0:lb_max, idir:idir), &
359 : map_a, map_b, component, [.TRUE., .TRUE.], [a, b], &
360 558550 : [.FALSE., .TRUE.], drr_a(0:la_max, 0:lmb, idir))
361 : END DO
362 129447328 : ELSE IF (PRESENT(dab)) THEN
363 32109437 : CALL apply_cartesian_1d(rr, drr_a, la_max, lmb, .FALSE., .TRUE., a, [0.0_dp, 0.0_dp, 0.0_dp])
364 : END IF
365 :
366 465976551 : DO cob = ofb + 1, ncoset(lb_max)
367 1345893472 : bvec = indco(:, cob)
368 336473368 : ib = mb + cob - ofb
369 1534507102 : DO coa = ofa + 1, ncoset(la_max)
370 4274122204 : avec = indco(:, coa)
371 1068530551 : ia = ma + coa - ofa
372 4274122204 : sval = [(rr(avec(idir), bvec(idir), idir), idir=1, 3)]
373 : ! integrals
374 1068530551 : IF (PRESENT(sab)) THEN
375 1063871290 : sab(ia, ib) = f0*sval(1)*sval(2)*sval(3)
376 : END IF
377 : ! first derivatives
378 1068530551 : IF (PRESENT(dab)) THEN
379 867492952 : DO idir = 1, 3
380 650619714 : jdir = MOD(idir, 3) + 1
381 650619714 : kdir = MOD(idir + 1, 3) + 1
382 867492952 : dab(ia, ib, idir) = f0*drr_a(avec(idir), bvec(idir), idir)*sval(jdir)*sval(kdir)
383 : END DO
384 : END IF
385 : ! Translational invariance gives D_B S = -D_A S and D_A D_A S = -D_A D_B S.
386 1405003919 : IF (PRESENT(ddab)) THEN
387 2444281 : DO icomp = 1, 6
388 2095098 : idir = pairs(1, icomp)
389 2095098 : jdir = pairs(2, icomp)
390 2095098 : factor = sval
391 2095098 : IF (idir == jdir) THEN
392 1047549 : factor(idir) = -drr_ab(avec(idir), bvec(idir), idir)
393 : ELSE
394 1047549 : factor(idir) = drr_a(avec(idir), bvec(idir), idir)
395 1047549 : factor(jdir) = drr_a(avec(jdir), bvec(jdir), jdir)
396 : END IF
397 2444281 : ddab(ia, ib, icomp) = f0*factor(1)*factor(2)*factor(3)
398 : END DO
399 : END IF
400 : !
401 : END DO
402 : END DO
403 :
404 224816588 : mb = mb + nb
405 : END DO
406 114179650 : ma = ma + na
407 : END DO
408 :
409 18866245 : IF (.NOT. PRESENT(rr_work)) DEALLOCATE (rr)
410 : NULLIFY (rr)
411 :
412 18866245 : END SUBROUTINE overlap_ab
413 :
414 : ! **************************************************************************************************
415 : !> \brief Calculation of the two-center overlap integrals [aa|b] over
416 : !> Cartesian Gaussian-type functions.
417 : !> \param la1_max Max L on center A (basis 1)
418 : !> \param la1_min Min L on center A (basis 1)
419 : !> \param npgfa1 Number of primitives on center A (basis 1)
420 : !> \param rpgfa1 Range of functions on A, used for screening (basis 1)
421 : !> \param zeta1 Exponents on center A (basis 1)
422 : !> \param la2_max Max L on center A (basis 2)
423 : !> \param la2_min Min L on center A (basis 2)
424 : !> \param npgfa2 Number of primitives on center A (basis 2)
425 : !> \param rpgfa2 Range of functions on A, used for screening (basis 2)
426 : !> \param zeta2 Exponents on center A (basis 2)
427 : !> \param lb_max Max L on center B
428 : !> \param lb_min Min L on center B
429 : !> \param npgfb Number of primitives on center B
430 : !> \param rpgfb Range of functions on B, used for screening
431 : !> \param zetb Exponents on center B
432 : !> \param rab Distance vector A-B
433 : !> \param saab Final overlap integrals
434 : !> \param daab First derivatives with respect to the shared center of both A functions
435 : !> \param saba Final overlap integrals; different order
436 : !> \param daba Same shared-center derivatives as daab, with A-B-A output ordering
437 : !> \date 01.07.2014
438 : !> \author JGH
439 : ! **************************************************************************************************
440 9695 : SUBROUTINE overlap_aab(la1_max, la1_min, npgfa1, rpgfa1, zeta1, &
441 19390 : la2_max, la2_min, npgfa2, rpgfa2, zeta2, &
442 19390 : lb_max, lb_min, npgfb, rpgfb, zetb, &
443 9695 : rab, saab, daab, saba, daba)
444 : INTEGER, INTENT(IN) :: la1_max, la1_min, npgfa1
445 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfa1, zeta1
446 : INTEGER, INTENT(IN) :: la2_max, la2_min, npgfa2
447 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfa2, zeta2
448 : INTEGER, INTENT(IN) :: lb_max, lb_min, npgfb
449 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfb, zetb
450 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
451 : REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
452 : OPTIONAL :: saab
453 : REAL(KIND=dp), DIMENSION(:, :, :, :), &
454 : INTENT(INOUT), OPTIONAL :: daab
455 : REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
456 : OPTIONAL :: saba
457 : REAL(KIND=dp), DIMENSION(:, :, :, :), &
458 : INTENT(INOUT), OPTIONAL :: daba
459 :
460 : INTEGER :: coa1, coa2, cob, i1pgf, i2pgf, ia1, ia2, &
461 : ib, jpgf, ldrr, lma, lmb, ma1, ma2, &
462 : mb, na1, na2, nb, ofa1, ofa2, ofb
463 : INTEGER, DIMENSION(3) :: a2vec, avec, bvec
464 : REAL(KIND=dp) :: a, b, dum(3), f0, rab2, rpgfa, tab, &
465 : value, xhi, zet
466 9695 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: drr, rr
467 : REAL(KIND=dp), DIMENSION(3) :: rap, rbp
468 :
469 : ! Distance of the centers a and b
470 :
471 9695 : rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
472 9695 : tab = SQRT(rab2)
473 :
474 : ! Maximum l for auxiliary integrals
475 9695 : CPASSERT(PRESENT(saab) .OR. PRESENT(daab) .OR. PRESENT(saba) .OR. PRESENT(daba))
476 9695 : IF (PRESENT(saab) .OR. PRESENT(saba)) THEN
477 9567 : lma = la1_max + la2_max
478 9567 : lmb = lb_max
479 : END IF
480 9695 : IF (PRESENT(daab) .OR. PRESENT(daba)) THEN
481 3525 : lma = la1_max + la2_max + 1
482 3525 : lmb = lb_max
483 : END IF
484 9695 : ldrr = MAX(lma, lmb) + 1
485 :
486 : ! Allocate space for auxiliary integrals
487 48475 : ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
488 23795 : IF (PRESENT(daab) .OR. PRESENT(daba)) ALLOCATE (drr(0:lma - 1, 0:lmb, 3))
489 :
490 : ! Number of integrals, check size of arrays
491 9695 : ofa1 = ncoset(la1_min - 1)
492 9695 : ofa2 = ncoset(la2_min - 1)
493 9695 : ofb = ncoset(lb_min - 1)
494 9695 : na1 = ncoset(la1_max) - ofa1
495 9695 : na2 = ncoset(la2_max) - ofa2
496 9695 : nb = ncoset(lb_max) - ofb
497 9695 : IF (PRESENT(saab)) THEN
498 1570 : CPASSERT((SIZE(saab, 1) >= na1*npgfa1))
499 1570 : CPASSERT((SIZE(saab, 2) >= na2*npgfa2))
500 1570 : CPASSERT((SIZE(saab, 3) >= nb*npgfb))
501 : END IF
502 9695 : IF (PRESENT(daab)) THEN
503 128 : CPASSERT((SIZE(daab, 1) >= na1*npgfa1))
504 128 : CPASSERT((SIZE(daab, 2) >= na2*npgfa2))
505 128 : CPASSERT((SIZE(daab, 3) >= nb*npgfb))
506 128 : CPASSERT((SIZE(daab, 4) >= 3))
507 : END IF
508 9695 : IF (PRESENT(saba)) THEN
509 7997 : CPASSERT((SIZE(saba, 1) >= na1*npgfa1))
510 7997 : CPASSERT((SIZE(saba, 2) >= nb*npgfb))
511 7997 : CPASSERT((SIZE(saba, 3) >= na2*npgfa2))
512 : END IF
513 9695 : IF (PRESENT(daba)) THEN
514 3397 : CPASSERT((SIZE(daba, 1) >= na1*npgfa1))
515 3397 : CPASSERT((SIZE(daba, 2) >= nb*npgfb))
516 3397 : CPASSERT((SIZE(daba, 3) >= na2*npgfa2))
517 3397 : CPASSERT((SIZE(daba, 4) >= 3))
518 : END IF
519 :
520 : ! Loops over all primitive Gaussian-type functions
521 9695 : ma1 = 0
522 72326 : DO i1pgf = 1, npgfa1
523 62631 : ma2 = 0
524 302786 : DO i2pgf = 1, npgfa2
525 240155 : rpgfa = MIN(rpgfa1(i1pgf), rpgfa2(i2pgf))
526 240155 : mb = 0
527 1362964 : DO jpgf = 1, npgfb
528 : ! Distance Screening
529 1122809 : IF (rpgfa + rpgfb(jpgf) < tab) THEN
530 251494 : IF (PRESENT(saab)) saab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb) = 0.0_dp
531 251494 : IF (PRESENT(daab)) daab(ma1 + 1:ma1 + na1, ma2 + 1:ma2 + na2, mb + 1:mb + nb, 1:3) = 0.0_dp
532 12150124 : IF (PRESENT(saba)) saba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2) = 0.0_dp
533 15308095 : IF (PRESENT(daba)) daba(ma1 + 1:ma1 + na1, mb + 1:mb + nb, ma2 + 1:ma2 + na2, 1:3) = 0.0_dp
534 251494 : mb = mb + nb
535 251494 : CYCLE
536 : END IF
537 :
538 : ! Calculate some prefactors
539 871315 : a = zeta1(i1pgf) + zeta2(i2pgf)
540 871315 : b = zetb(jpgf)
541 871315 : zet = a + b
542 871315 : xhi = a*b/zet
543 3485260 : rap = b*rab/zet
544 3485260 : rbp = -a*rab/zet
545 :
546 : ! [ss|s] integral
547 871315 : f0 = (pi/zet)**(1.5_dp)*EXP(-xhi*rab2)
548 :
549 : ! Calculate the recurrence relation
550 871315 : CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
551 871315 : IF (PRESENT(daab) .OR. PRESENT(daba)) THEN
552 : CALL apply_cartesian_1d(rr, drr, la1_max + la2_max, lmb, .FALSE., .TRUE., a, &
553 348900 : [0.0_dp, 0.0_dp, 0.0_dp])
554 : END IF
555 :
556 3125262 : DO cob = ofb + 1, ncoset(lb_max)
557 9015788 : bvec = indco(:, cob)
558 2253947 : ib = mb + cob - ofb
559 15740535 : DO coa2 = ofa2 + 1, ncoset(la2_max)
560 50461092 : a2vec = indco(:, coa2)
561 12615273 : ia2 = ma2 + coa2 - ofa2
562 51499096 : DO coa1 = ofa1 + 1, ncoset(la1_max)
563 146519504 : avec = indco(:, coa1) + a2vec
564 36629876 : ia1 = ma1 + coa1 - ofa1
565 : ! integrals
566 36629876 : IF (PRESENT(saab) .OR. PRESENT(saba)) THEN
567 36598584 : value = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
568 36598584 : IF (PRESENT(saab)) saab(ia1, ia2, ib) = value
569 36598584 : IF (PRESENT(saba)) saba(ia1, ib, ia2) = value
570 : END IF
571 : ! first derivatives
572 49245149 : IF (PRESENT(daab) .OR. PRESENT(daba)) THEN
573 19863985 : dum(1) = f0*drr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
574 19863985 : dum(2) = f0*rr(avec(1), bvec(1), 1)*drr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
575 19863985 : dum(3) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*drr(avec(3), bvec(3), 3)
576 19957861 : IF (PRESENT(daab)) daab(ia1, ia2, ib, 1:3) = dum
577 79362064 : IF (PRESENT(daba)) daba(ia1, ib, ia2, 1:3) = dum
578 : END IF
579 : END DO
580 : END DO
581 : END DO
582 :
583 1111470 : mb = mb + nb
584 : END DO
585 302786 : ma2 = ma2 + na2
586 : END DO
587 72326 : ma1 = ma1 + na1
588 : END DO
589 :
590 9695 : DEALLOCATE (rr)
591 :
592 9695 : END SUBROUTINE overlap_aab
593 :
594 : ! **************************************************************************************************
595 : !> \brief Calculation of the two-center overlap integrals [a|bb] over
596 : !> Cartesian Gaussian-type functions.
597 : !> \param la_max Max L on center A
598 : !> \param la_min Min L on center A
599 : !> \param npgfa Number of primitives on center A
600 : !> \param rpgfa Range of functions on A, used for screening
601 : !> \param zeta Exponents on center A
602 : !> \param lb1_max Max L on center B (basis 1)
603 : !> \param lb1_min Min L on center B (basis 1)
604 : !> \param npgfb1 Number of primitives on center B (basis 1)
605 : !> \param rpgfb1 Range of functions on B, used for screening (basis 1)
606 : !> \param zetb1 Exponents on center B (basis 1)
607 : !> \param lb2_max Max L on center B (basis 2)
608 : !> \param lb2_min Min L on center B (basis 2)
609 : !> \param npgfb2 Number of primitives on center B (basis 2)
610 : !> \param rpgfb2 Range of functions on B, used for screening (basis 2)
611 : !> \param zetb2 Exponents on center B (basis 2)
612 : !> \param rab Distance vector A-B
613 : !> \param sabb Final overlap integrals
614 : !> \param dabb First derivatives with respect to center A
615 : !> \date 01.07.2014
616 : !> \author JGH
617 : ! **************************************************************************************************
618 7997 : SUBROUTINE overlap_abb(la_max, la_min, npgfa, rpgfa, zeta, &
619 15994 : lb1_max, lb1_min, npgfb1, rpgfb1, zetb1, &
620 15994 : lb2_max, lb2_min, npgfb2, rpgfb2, zetb2, &
621 7997 : rab, sabb, dabb)
622 : INTEGER, INTENT(IN) :: la_max, la_min, npgfa
623 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfa, zeta
624 : INTEGER, INTENT(IN) :: lb1_max, lb1_min, npgfb1
625 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfb1, zetb1
626 : INTEGER, INTENT(IN) :: lb2_max, lb2_min, npgfb2
627 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: rpgfb2, zetb2
628 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
629 : REAL(KIND=dp), DIMENSION(:, :, :), INTENT(INOUT), &
630 : OPTIONAL :: sabb
631 : REAL(KIND=dp), DIMENSION(:, :, :, :), &
632 : INTENT(INOUT), OPTIONAL :: dabb
633 :
634 : INTEGER :: coa, cob1, cob2, ia, ib1, ib2, ipgf, &
635 : j1pgf, j2pgf, ldrr, lma, lmb, ma, mb1, &
636 : mb2, na, nb1, nb2, ofa, ofb1, ofb2
637 : INTEGER, DIMENSION(3) :: avec, b2vec, bvec
638 : REAL(KIND=dp) :: a, b, f0, rab2, rpgfb, tab, xhi, zet
639 7997 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :, :) :: drr, rr
640 : REAL(KIND=dp), DIMENSION(3) :: rap, rbp
641 :
642 : ! Distance of the centers a and b
643 :
644 7997 : rab2 = rab(1)*rab(1) + rab(2)*rab(2) + rab(3)*rab(3)
645 7997 : tab = SQRT(rab2)
646 :
647 : ! Maximum l for auxiliary integrals
648 7997 : CPASSERT(PRESENT(sabb) .OR. PRESENT(dabb))
649 7997 : IF (PRESENT(sabb)) THEN
650 7997 : lma = la_max
651 7997 : lmb = lb1_max + lb2_max
652 : END IF
653 7997 : IF (PRESENT(dabb)) THEN
654 3397 : lma = la_max + 1
655 3397 : lmb = lb1_max + lb2_max
656 : END IF
657 7997 : ldrr = MAX(lma, lmb) + 1
658 :
659 : ! Allocate space for auxiliary integrals
660 39985 : ALLOCATE (rr(0:ldrr - 1, 0:ldrr - 1, 3))
661 21585 : IF (PRESENT(dabb)) ALLOCATE (drr(0:lma - 1, 0:lmb, 3))
662 :
663 : ! Number of integrals, check size of arrays
664 7997 : ofa = ncoset(la_min - 1)
665 7997 : ofb1 = ncoset(lb1_min - 1)
666 7997 : ofb2 = ncoset(lb2_min - 1)
667 7997 : na = ncoset(la_max) - ofa
668 7997 : nb1 = ncoset(lb1_max) - ofb1
669 7997 : nb2 = ncoset(lb2_max) - ofb2
670 7997 : IF (PRESENT(sabb)) THEN
671 7997 : CPASSERT((SIZE(sabb, 1) >= na*npgfa))
672 7997 : CPASSERT((SIZE(sabb, 2) >= nb1*npgfb1))
673 7997 : CPASSERT((SIZE(sabb, 3) >= nb2*npgfb2))
674 : END IF
675 7997 : IF (PRESENT(dabb)) THEN
676 3397 : CPASSERT((SIZE(dabb, 1) >= na*npgfa))
677 3397 : CPASSERT((SIZE(dabb, 2) >= nb1*npgfb1))
678 3397 : CPASSERT((SIZE(dabb, 3) >= nb2*npgfb2))
679 3397 : CPASSERT((SIZE(dabb, 4) >= 3))
680 : END IF
681 :
682 : ! Loops over all pairs of primitive Gaussian-type functions
683 7997 : ma = 0
684 60026 : DO ipgf = 1, npgfa
685 52029 : mb1 = 0
686 392532 : DO j1pgf = 1, npgfb1
687 340503 : mb2 = 0
688 1393966 : DO j2pgf = 1, npgfb2
689 : ! Distance Screening
690 1053463 : rpgfb = MIN(rpgfb1(j1pgf), rpgfb2(j2pgf))
691 1053463 : IF (rpgfa(ipgf) + rpgfb < tab) THEN
692 11929000 : IF (PRESENT(sabb)) sabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2) = 0.0_dp
693 15070032 : IF (PRESENT(dabb)) dabb(ma + 1:ma + na, mb1 + 1:mb1 + nb1, mb2 + 1:mb2 + nb2, 1:3) = 0.0_dp
694 253218 : mb2 = mb2 + nb2
695 253218 : CYCLE
696 : END IF
697 :
698 : ! Calculate some prefactors
699 800245 : a = zeta(ipgf)
700 800245 : b = zetb1(j1pgf) + zetb2(j2pgf)
701 800245 : zet = a + b
702 800245 : xhi = a*b/zet
703 3200980 : rap = b*rab/zet
704 3200980 : rbp = -a*rab/zet
705 :
706 : ! [s|s] integral
707 800245 : f0 = (pi/zet)**(1.5_dp)*EXP(-xhi*rab2)
708 :
709 : ! Calculate the recurrence relation
710 800245 : CALL os_rr_ovlp(rap, lma, rbp, lmb, zet, ldrr, rr)
711 800245 : IF (PRESENT(dabb)) THEN
712 : CALL apply_cartesian_1d(rr, drr, la_max, lmb, .FALSE., .TRUE., a, &
713 342382 : [0.0_dp, 0.0_dp, 0.0_dp])
714 : END IF
715 :
716 4903571 : DO cob2 = ofb2 + 1, ncoset(lb2_max)
717 16413304 : b2vec = indco(:, cob2)
718 4103326 : ib2 = mb2 + cob2 - ofb2
719 17227305 : DO cob1 = ofb1 + 1, ncoset(lb1_max)
720 49294936 : bvec = indco(:, cob1) + b2vec
721 12323734 : ib1 = mb1 + cob1 - ofb1
722 52406636 : DO coa = ofa + 1, ncoset(la_max)
723 143918304 : avec = indco(:, coa)
724 35979576 : ia = ma + coa - ofa
725 : ! integrals
726 35979576 : IF (PRESENT(sabb)) THEN
727 35979576 : sabb(ia, ib1, ib2) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
728 : END IF
729 : ! first derivatives
730 48303310 : IF (PRESENT(dabb)) THEN
731 19827139 : dabb(ia, ib1, ib2, 1) = f0*drr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
732 19827139 : dabb(ia, ib1, ib2, 2) = f0*rr(avec(1), bvec(1), 1)*drr(avec(2), bvec(2), 2)*rr(avec(3), bvec(3), 3)
733 19827139 : dabb(ia, ib1, ib2, 3) = f0*rr(avec(1), bvec(1), 1)*rr(avec(2), bvec(2), 2)*drr(avec(3), bvec(3), 3)
734 : END IF
735 : END DO
736 : END DO
737 : END DO
738 :
739 1140748 : mb2 = mb2 + nb2
740 : END DO
741 392532 : mb1 = mb1 + nb1
742 : END DO
743 60026 : ma = ma + na
744 : END DO
745 :
746 7997 : DEALLOCATE (rr)
747 :
748 7997 : END SUBROUTINE overlap_abb
749 :
750 : ! **************************************************************************************************
751 :
752 : ! **************************************************************************************************
753 : !> \brief Calculation of the two-center overlap integrals [a|b] over
754 : !> Spherical Gaussian-type functions.
755 : !> \param la Max L on center A
756 : !> \param zeta Exponents on center A
757 : !> \param lb Max L on center B
758 : !> \param zetb Exponents on center B
759 : !> \param rab Distance vector A-B
760 : !> \param sab Final overlap integrals
761 : !> \date 01.03.2016
762 : !> \author JGH
763 : ! **************************************************************************************************
764 275350 : SUBROUTINE overlap_ab_s(la, zeta, lb, zetb, rab, sab)
765 : INTEGER, INTENT(IN) :: la
766 : REAL(KIND=dp), INTENT(IN) :: zeta
767 : INTEGER, INTENT(IN) :: lb
768 : REAL(KIND=dp), INTENT(IN) :: zetb
769 : REAL(KIND=dp), DIMENSION(3), INTENT(IN) :: rab
770 : REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: sab
771 :
772 : REAL(KIND=dp), PARAMETER :: huge4 = HUGE(1._dp)/4._dp
773 :
774 : INTEGER :: nca, ncb, nsa, nsb
775 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: cab
776 : REAL(KIND=dp), DIMENSION(1) :: rpgf, za, zb
777 275350 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: c2sa, c2sb
778 :
779 275350 : rpgf(1) = huge4
780 275350 : za(1) = zeta
781 275350 : zb(1) = zetb
782 :
783 275350 : nca = nco(la)
784 275350 : ncb = nco(lb)
785 1101400 : ALLOCATE (cab(nca, ncb))
786 275350 : nsa = nso(la)
787 275350 : nsb = nso(lb)
788 :
789 275350 : CALL overlap_ab(la, la, 1, rpgf, za, lb, lb, 1, rpgf, zb, rab, cab)
790 :
791 275350 : c2sa => orbtramat(la)%c2s
792 275350 : c2sb => orbtramat(lb)%c2s
793 275350 : sab(1:nsa, 1:nsb) = MATMUL(c2sa(1:nsa, 1:nca), &
794 11068283 : MATMUL(cab(1:nca, 1:ncb), TRANSPOSE(c2sb(1:nsb, 1:ncb))))
795 :
796 275350 : DEALLOCATE (cab)
797 :
798 275350 : END SUBROUTINE overlap_ab_s
799 :
800 : ! **************************************************************************************************
801 : !> \brief Calculation of the overlap integrals [a|b] over
802 : !> cubic periodic Spherical Gaussian-type functions.
803 : !> \param la Max L on center A
804 : !> \param zeta Exponents on center A
805 : !> \param lb Max L on center B
806 : !> \param zetb Exponents on center B
807 : !> \param alat Lattice constant
808 : !> \param sab Final overlap integrals
809 : !> \date 01.03.2016
810 : !> \author JGH
811 : ! **************************************************************************************************
812 36066 : SUBROUTINE overlap_ab_sp(la, zeta, lb, zetb, alat, sab)
813 : INTEGER, INTENT(IN) :: la
814 : REAL(KIND=dp), INTENT(IN) :: zeta
815 : INTEGER, INTENT(IN) :: lb
816 : REAL(KIND=dp), INTENT(IN) :: zetb, alat
817 : REAL(KIND=dp), DIMENSION(:, :), INTENT(INOUT) :: sab
818 :
819 : COMPLEX(KIND=dp) :: zfg
820 36066 : COMPLEX(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: fun, gun
821 : INTEGER :: ax, ay, az, bx, by, bz, i, ia, ib, l, &
822 : l1, l2, na, nb, nca, ncb, nmax, nsa, &
823 : nsb
824 : REAL(KIND=dp) :: oa, ob, ovol, zm
825 36066 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: fexp, gexp, gval
826 36066 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:, :) :: cab
827 : REAL(KIND=dp), DIMENSION(0:3, 0:3) :: fgsum
828 36066 : REAL(KIND=dp), DIMENSION(:, :), POINTER :: c2sa, c2sb
829 :
830 36066 : nca = nco(la)
831 36066 : ncb = nco(lb)
832 144264 : ALLOCATE (cab(nca, ncb))
833 36066 : cab = 0.0_dp
834 36066 : nsa = nso(la)
835 36066 : nsb = nso(lb)
836 :
837 36066 : zm = MIN(zeta, zetb)
838 36066 : nmax = NINT(1.81_dp*alat*SQRT(zm) + 1.0_dp)
839 : ALLOCATE (fun(-nmax:nmax, 0:la), gun(-nmax:nmax, 0:lb), &
840 396726 : fexp(-nmax:nmax), gexp(-nmax:nmax), gval(-nmax:nmax))
841 :
842 36066 : oa = 1._dp/zeta
843 36066 : ob = 1._dp/zetb
844 522120 : DO i = -nmax, nmax
845 486054 : gval(i) = twopi/alat*REAL(i, KIND=dp)
846 486054 : fexp(i) = SQRT(oa*pi)*EXP(-0.25_dp*oa*gval(i)**2)
847 522120 : gexp(i) = SQRT(ob*pi)*EXP(-0.25_dp*ob*gval(i)**2)
848 : END DO
849 91966 : DO l = 0, la
850 91966 : IF (l == 0) THEN
851 522120 : fun(:, l) = z_one
852 19834 : ELSE IF (l == 1) THEN
853 252786 : fun(:, l) = CMPLX(0.0_dp, 0.5_dp*oa*gval(:), KIND=dp)
854 2073 : ELSE IF (l == 2) THEN
855 29772 : fun(:, l) = CMPLX(-(0.5_dp*oa*gval(:))**2, 0.0_dp, KIND=dp)
856 29772 : fun(:, l) = fun(:, l) + CMPLX(0.5_dp*oa, 0.0_dp, KIND=dp)
857 0 : ELSE IF (l == 3) THEN
858 0 : fun(:, l) = CMPLX(0.0_dp, -(0.5_dp*oa*gval(:))**3, KIND=dp)
859 0 : fun(:, l) = fun(:, l) + CMPLX(0.0_dp, 0.75_dp*oa*oa*gval(:), KIND=dp)
860 : ELSE
861 0 : CPABORT("l value too high")
862 : END IF
863 : END DO
864 91966 : DO l = 0, lb
865 91966 : IF (l == 0) THEN
866 522120 : gun(:, l) = z_one
867 19834 : ELSE IF (l == 1) THEN
868 252786 : gun(:, l) = CMPLX(0.0_dp, 0.5_dp*ob*gval(:), KIND=dp)
869 2073 : ELSE IF (l == 2) THEN
870 29772 : gun(:, l) = CMPLX(-(0.5_dp*ob*gval(:))**2, 0.0_dp, KIND=dp)
871 29772 : gun(:, l) = gun(:, l) + CMPLX(0.5_dp*ob, 0.0_dp, KIND=dp)
872 0 : ELSE IF (l == 3) THEN
873 0 : gun(:, l) = CMPLX(0.0_dp, -(0.5_dp*ob*gval(:))**3, KIND=dp)
874 0 : gun(:, l) = gun(:, l) + CMPLX(0.0_dp, 0.75_dp*ob*ob*gval(:), KIND=dp)
875 : ELSE
876 0 : CPABORT("l value too high")
877 : END IF
878 : END DO
879 :
880 36066 : fgsum = 0.0_dp
881 91966 : DO l1 = 0, la
882 179954 : DO l2 = 0, lb
883 1260466 : zfg = SUM(CONJG(fun(:, l1))*fexp(:)*gun(:, l2)*gexp(:))
884 143888 : fgsum(l1, l2) = REAL(zfg, KIND=dp)
885 : END DO
886 : END DO
887 :
888 36066 : na = ncoset(la - 1)
889 36066 : nb = ncoset(lb - 1)
890 91966 : DO ax = 0, la
891 169773 : DO ay = 0, la - ax
892 77807 : az = la - ax - ay
893 77807 : ia = coset(ax, ay, az) - na
894 257848 : DO bx = 0, lb
895 379135 : DO by = 0, lb - bx
896 177187 : bz = lb - bx - by
897 177187 : ib = coset(bx, by, bz) - nb
898 301328 : cab(ia, ib) = fgsum(ax, bx)*fgsum(ay, by)*fgsum(az, bz)
899 : END DO
900 : END DO
901 : END DO
902 : END DO
903 :
904 36066 : c2sa => orbtramat(la)%c2s
905 36066 : c2sb => orbtramat(lb)%c2s
906 36066 : sab(1:nsa, 1:nsb) = MATMUL(c2sa(1:nsa, 1:nca), &
907 2482203 : MATMUL(cab(1:nca, 1:ncb), TRANSPOSE(c2sb(1:nsb, 1:ncb))))
908 36066 : ovol = 1._dp/(alat**3)
909 276218 : sab(1:nsa, 1:nsb) = ovol*sab(1:nsa, 1:nsb)
910 :
911 36066 : DEALLOCATE (cab, fun, gun, fexp, gexp, gval)
912 :
913 36066 : END SUBROUTINE overlap_ab_sp
914 :
915 311416 : END MODULE ai_overlap
|