Line data Source code
1 : !--------------------------------------------------------------------------------------------------!
2 : ! CP2K: A general program to perform molecular dynamics simulations !
3 : ! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4 : ! !
5 : ! SPDX-License-Identifier: GPL-2.0-or-later !
6 : !--------------------------------------------------------------------------------------------------!
7 :
8 : !-----------------------------------------------------------------------------!
9 : ! Calculates atomic integrals over unnormalized spherical Gaussian functions
10 : !-----------------------------------------------------------------------------!
11 : !
12 : ! phi(r) = r^l * exp[-p*r^2] Ylm
13 : !
14 : !-----------------------------------------------------------------------------!
15 : ! Calculates atomic integrals over normalized Slater type functions
16 : !-----------------------------------------------------------------------------!
17 : !
18 : ! phi(r) = N(nlm) r^(n-1) * exp[-p*r] Ylm
19 : ! N(nlm) = [(2n)!]^(-1/2) (2p)^(n+1/2)
20 : !
21 : !-----------------------------------------------------------------------------!
22 : ! Calculates atomic integrals over spherical numerical functions
23 : !-----------------------------------------------------------------------------!
24 : !
25 : ! phi(r) = R(r) Ylm
26 : !
27 : !-----------------------------------------------------------------------------!
28 : MODULE ai_onecenter
29 :
30 : USE kinds, ONLY: dp
31 : USE mathconstants, ONLY: dfac,&
32 : fac,&
33 : gamma0,&
34 : gamma1,&
35 : pi
36 : #include "../base/base_uses.f90"
37 :
38 : IMPLICIT NONE
39 :
40 : PRIVATE
41 :
42 : CHARACTER(len=*), PARAMETER, PRIVATE :: moduleN = 'ai_onecenter'
43 :
44 : PUBLIC :: sg_overlap, sg_kinetic, sg_nuclear, sg_erf, sg_gpot, &
45 : sg_proj_ol, sg_coulomb, sg_exchange, sg_kinnuc, &
46 : sg_erfc, sg_conf
47 : PUBLIC :: sto_overlap, sto_kinetic, sto_nuclear
48 :
49 : CONTAINS
50 :
51 : !------------------------------------------------------------------------------
52 : !
53 : ! S(l,pq) = pi^(1/2)*(2*l+1)!! / 2^(l+2) / (p+q)^(l+1.5)
54 : !
55 : !------------------------------------------------------------------------------
56 : ! **************************************************************************************************
57 : !> \brief ...
58 : !> \param smat ...
59 : !> \param l ...
60 : !> \param pa ...
61 : !> \param pb ...
62 : ! **************************************************************************************************
63 27683 : SUBROUTINE sg_overlap(smat, l, pa, pb)
64 :
65 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: smat
66 : INTEGER, INTENT(IN) :: l
67 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
68 :
69 : INTEGER :: ip, iq, m, n
70 : REAL(KIND=dp) :: el, spi
71 :
72 27683 : n = SIZE(pa)
73 27683 : m = SIZE(pb)
74 :
75 27683 : CPASSERT(.NOT. (n > SIZE(smat, 1) .OR. m > SIZE(smat, 2)))
76 :
77 27683 : spi = SQRT(pi)/2.0_dp**(l + 2)*dfac(2*l + 1)
78 27683 : el = REAL(l, dp) + 1.5_dp
79 :
80 167659 : DO iq = 1, m
81 2256059 : DO ip = 1, n
82 2228376 : smat(ip, iq) = spi/(pa(ip) + pb(iq))**el
83 : END DO
84 : END DO
85 :
86 27683 : END SUBROUTINE sg_overlap
87 :
88 : !------------------------------------------------------------------------------
89 : !
90 : ! T(l,pq) = (2l+3)!! pi^(1/2)/2^(l+2) [pq/(p+q)^(l+2.5)]
91 : !
92 : !------------------------------------------------------------------------------
93 : ! **************************************************************************************************
94 : !> \brief ...
95 : !> \param kmat ...
96 : !> \param l ...
97 : !> \param pa ...
98 : !> \param pb ...
99 : ! **************************************************************************************************
100 27620 : SUBROUTINE sg_kinetic(kmat, l, pa, pb)
101 :
102 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: kmat
103 : INTEGER, INTENT(IN) :: l
104 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
105 :
106 : INTEGER :: ip, iq, m, n
107 : REAL(KIND=dp) :: spi
108 :
109 27620 : n = SIZE(pa)
110 27620 : m = SIZE(pb)
111 :
112 27620 : CPASSERT(.NOT. (n > SIZE(kmat, 1) .OR. m > SIZE(kmat, 2)))
113 :
114 27620 : spi = dfac(2*l + 3)*SQRT(pi)/2.0_dp**(l + 2)
115 166917 : DO iq = 1, m
116 2246994 : DO ip = 1, n
117 2219374 : kmat(ip, iq) = spi*pa(ip)*pb(iq)/(pa(ip) + pb(iq))**(l + 2.5_dp)
118 : END DO
119 : END DO
120 :
121 27620 : END SUBROUTINE sg_kinetic
122 :
123 : !------------------------------------------------------------------------------
124 : !
125 : ! U(l,pq) = l!/2 / (p+q)^(l+1)
126 : !
127 : !------------------------------------------------------------------------------
128 : ! **************************************************************************************************
129 : !> \brief ...
130 : !> \param umat ...
131 : !> \param l ...
132 : !> \param pa ...
133 : !> \param pb ...
134 : ! **************************************************************************************************
135 8819 : SUBROUTINE sg_nuclear(umat, l, pa, pb)
136 :
137 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: umat
138 : INTEGER, INTENT(IN) :: l
139 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
140 :
141 : INTEGER :: ip, iq, m, n
142 : REAL(KIND=dp) :: tld
143 :
144 8819 : n = SIZE(pa)
145 8819 : m = SIZE(pb)
146 :
147 8819 : CPASSERT(.NOT. (n > SIZE(umat, 1) .OR. m > SIZE(umat, 2)))
148 :
149 8819 : tld = 0.5_dp*fac(l)
150 62231 : DO iq = 1, m
151 1603251 : DO ip = 1, n
152 1594432 : umat(ip, iq) = tld/(pa(ip) + pb(iq))**(l + 1)
153 : END DO
154 : END DO
155 :
156 8819 : END SUBROUTINE sg_nuclear
157 :
158 : !------------------------------------------------------------------------------
159 : !
160 : ! U(l,pq) = l!/2 / (p+q)^l * [4/(p+q)^2 *pq*(l+1) + 1]
161 : !
162 : !------------------------------------------------------------------------------
163 : ! **************************************************************************************************
164 : !> \brief ...
165 : !> \param umat ...
166 : !> \param l ...
167 : !> \param pa ...
168 : !> \param pb ...
169 : ! **************************************************************************************************
170 272 : SUBROUTINE sg_kinnuc(umat, l, pa, pb)
171 :
172 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: umat
173 : INTEGER, INTENT(IN) :: l
174 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
175 :
176 : INTEGER :: ip, iq, m, n
177 : REAL(KIND=dp) :: ppq, pq, tld
178 :
179 272 : n = SIZE(pa)
180 272 : m = SIZE(pb)
181 :
182 272 : CPASSERT(.NOT. (n > SIZE(umat, 1) .OR. m > SIZE(umat, 2)))
183 :
184 272 : IF (l > 0) THEN
185 200 : tld = 0.5_dp*fac(l)
186 5114 : DO iq = 1, m
187 167900 : DO ip = 1, n
188 162786 : ppq = pa(ip) + pb(iq)
189 162786 : pq = pa(ip)*pb(iq)
190 167700 : umat(ip, iq) = tld/ppq**l*(4.0_dp/ppq**2*pq*REAL(l + 1, dp) + 1.0_dp)
191 : END DO
192 : END DO
193 : ELSE
194 1836 : DO iq = 1, m
195 55756 : DO ip = 1, n
196 53920 : ppq = pa(ip) + pb(iq)
197 53920 : pq = pa(ip)*pb(iq)
198 55684 : umat(ip, iq) = 2.0_dp*pq/ppq**2
199 : END DO
200 : END DO
201 : END IF
202 :
203 272 : END SUBROUTINE sg_kinnuc
204 :
205 : !------------------------------------------------------------------------------
206 : !
207 : ! z = a/(p+q)
208 : !
209 : ! UP(l,pq,a) = Gamma(l+3/2)*a/SQRT(Pi)/(p+q)^(l+3/2)*
210 : ! Hypergeom([1/2, 3/2 + l], [3/2], -z)
211 : !
212 : ! UP(l,pq,a) = a/2^(l+1)/(p+q)^(l+3/2)/(1+z)^(l+1/2) * F(z,l)
213 : !
214 : ! F(z,0) = 1
215 : ! F(z,1) = 3 + 2*z
216 : ! F(z,2) = 15 + 20*z + 8*z^2
217 : ! F(z,3) = 35 + 70*z + 56*z^2 + 16*z^3
218 : ! F(z,4) = 315 + 840*z + 1008*z^2 + 576*z^3 + 128*z^4
219 : !
220 : !------------------------------------------------------------------------------
221 : ! **************************************************************************************************
222 : !> \brief ...
223 : !> \param upmat ...
224 : !> \param l ...
225 : !> \param a ...
226 : !> \param pa ...
227 : !> \param pb ...
228 : ! **************************************************************************************************
229 24353 : SUBROUTINE sg_erf(upmat, l, a, pa, pb)
230 :
231 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: upmat
232 : INTEGER, INTENT(IN) :: l
233 : REAL(KIND=dp), INTENT(IN) :: a
234 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
235 :
236 : INTEGER :: handle, ip, iq, m, n
237 : REAL(KIND=dp) :: a2, fpol, pq, tld, z, z2
238 :
239 24353 : CALL timeset("sg_erf", handle)
240 :
241 24353 : n = SIZE(pa)
242 24353 : m = SIZE(pb)
243 :
244 24353 : CPASSERT(.NOT. (n > SIZE(upmat, 1) .OR. m > SIZE(upmat, 2)))
245 :
246 24353 : a2 = a*a
247 24353 : tld = a/2._dp**(l + 1)
248 136281 : DO iq = 1, m
249 1404189 : DO ip = 1, n
250 1267908 : pq = pa(ip) + pb(iq)
251 1267908 : z = a2/pq
252 1379836 : upmat(ip, iq) = tld/(1._dp + z)**(l + 0.5_dp)/pq**(l + 1.5_dp)
253 : END DO
254 : END DO
255 :
256 136281 : DO iq = 1, m
257 24353 : SELECT CASE (l)
258 : CASE DEFAULT
259 0 : CPABORT("")
260 : CASE (0)
261 : ! nothing left to do
262 : CASE (1)
263 320146 : DO ip = 1, n
264 286185 : pq = pa(ip) + pb(iq)
265 286185 : z = a2/pq
266 286185 : fpol = 2.0_dp*z + 3.0_dp
267 320146 : upmat(ip, iq) = upmat(ip, iq)*fpol
268 : END DO
269 : CASE (2)
270 213350 : DO ip = 1, n
271 196679 : pq = pa(ip) + pb(iq)
272 196679 : z = a2/pq
273 196679 : fpol = 8.0_dp*z*z + 20.0_dp*z + 15.0_dp
274 213350 : upmat(ip, iq) = upmat(ip, iq)*fpol
275 : END DO
276 : CASE (3)
277 148464 : DO ip = 1, n
278 142876 : pq = pa(ip) + pb(iq)
279 142876 : z = a2/pq
280 142876 : fpol = 16.0_dp*z*z*z + 56.0_dp*z*z + 70.0_dp*z + 35.0_dp
281 142876 : fpol = 3._dp*fpol
282 148464 : upmat(ip, iq) = upmat(ip, iq)*fpol
283 : END DO
284 : CASE (4)
285 145780 : DO ip = 1, n
286 140578 : pq = pa(ip) + pb(iq)
287 140578 : z = a2/pq
288 140578 : fpol = 128.0_dp*z*z*z*z + 576.0_dp*z*z*z + 1008.0_dp*z*z + 840.0_dp*z + 315.0_dp
289 140578 : fpol = 3._dp*fpol
290 145780 : upmat(ip, iq) = upmat(ip, iq)*fpol
291 : END DO
292 : CASE (5)
293 145776 : DO ip = 1, n
294 140576 : pq = pa(ip) + pb(iq)
295 140576 : z = a2/pq
296 140576 : fpol = 256.0_dp*z*z*z*z*z + 1408.0_dp*z*z*z*z + 3168.0_dp*z*z*z + 3696.0_dp*z*z + 2310.0_dp*z + 693.0_dp
297 140576 : fpol = 15._dp*fpol
298 145776 : upmat(ip, iq) = upmat(ip, iq)*fpol
299 : END DO
300 : CASE (6)
301 111928 : DO ip = 1, n
302 0 : pq = pa(ip) + pb(iq)
303 0 : z = a2/pq
304 0 : z2 = z*z
305 : fpol = 1024.0_dp*z2*z2*z2 + 6656.0_dp*z*z2*z2 + 18304.0_dp*z2*z2 + 27456.0_dp*z2*z + &
306 0 : 24024.0_dp*z2 + 12012.0_dp*z + 3003.0_dp
307 0 : fpol = 45._dp*fpol
308 0 : upmat(ip, iq) = upmat(ip, iq)*fpol
309 : END DO
310 : END SELECT
311 : END DO
312 :
313 24353 : CALL timestop(handle)
314 :
315 24353 : END SUBROUTINE sg_erf
316 :
317 : !------------------------------------------------------------------------------
318 : !
319 : ! Overlap with Projectors P(l,k,rc) for k=0,1,..
320 : !
321 : ! P(l,k,rc) = SQRT(2)/SQRT(Gamma[l+2k+1.5])/rc^(l+2k+1.5) r^(l+2k) exp[-0.5(r/rc)^2]
322 : !
323 : ! SP(l,k,p,rc) = 2^(l+k+1) / SQRT(gamma[l+2k+1.5]) / rc^(l+2k+1.5)
324 : ! * Gamma(l+k+1.5) / (2p+1/rc^2)^(l+k+1.5)
325 : !
326 : !------------------------------------------------------------------------------
327 : ! **************************************************************************************************
328 : !> \brief ...
329 : !> \param spmat ...
330 : !> \param l ...
331 : !> \param p ...
332 : !> \param k ...
333 : !> \param rc ...
334 : ! **************************************************************************************************
335 10617 : SUBROUTINE sg_proj_ol(spmat, l, p, k, rc)
336 :
337 : REAL(KIND=dp), DIMENSION(:), INTENT(OUT) :: spmat
338 : INTEGER, INTENT(IN) :: l
339 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: p
340 : INTEGER, INTENT(IN) :: k
341 : REAL(KIND=dp), INTENT(IN) :: rc
342 :
343 : REAL(KIND=dp) :: orc, pf
344 :
345 10617 : CPASSERT(SIZE(spmat) >= SIZE(p))
346 :
347 10617 : pf = 2._dp**(l + k + 1)*gamma1(l + k + 1)/rc**(l + 2*k + 1.5_dp)/SQRT(gamma1(l + 2*k + 1))
348 10617 : orc = 1._dp/(rc*rc)
349 73137 : spmat(:) = pf/(2._dp*p(:) + orc)**(l + k + 1.5_dp)
350 :
351 10617 : END SUBROUTINE sg_proj_ol
352 :
353 : !------------------------------------------------------------------------------
354 : !
355 : ! Matrix elements for Gaussian potentials
356 : !
357 : ! V(k,rc) = (r/rc)^2k exp[-1/2(r/rc)^2]
358 : !
359 : ! VP(l,k,p+q,rc) = 2^(l+k+0.5) * rc^(2l+3) * Gamma(l+k+1.5) / (1+2rc^2(p+q))^(l+k+1.5)
360 : !
361 : !------------------------------------------------------------------------------
362 : ! **************************************************************************************************
363 : !> \brief ...
364 : !> \param vpmat ...
365 : !> \param k ...
366 : !> \param rc ...
367 : !> \param l ...
368 : !> \param pa ...
369 : !> \param pb ...
370 : ! **************************************************************************************************
371 42410 : SUBROUTINE sg_gpot(vpmat, k, rc, l, pa, pb)
372 :
373 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: vpmat
374 : INTEGER, INTENT(IN) :: k
375 : REAL(KIND=dp), INTENT(IN) :: rc
376 : INTEGER, INTENT(IN) :: l
377 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
378 :
379 : INTEGER :: ip, iq, m, n
380 : REAL(KIND=dp) :: tld
381 :
382 42410 : n = SIZE(pa)
383 42410 : m = SIZE(pb)
384 :
385 42410 : CPASSERT(.NOT. (n > SIZE(vpmat, 1) .OR. m > SIZE(vpmat, 2)))
386 :
387 42410 : tld = gamma1(l + k + 1)*rc**(2*l + 3)*2._dp**(l + k + 0.5)
388 :
389 247578 : DO iq = 1, m
390 2692934 : DO ip = 1, n
391 2650524 : vpmat(ip, iq) = tld/(1._dp + 2._dp*rc*rc*(pa(ip) + pb(iq)))**(l + k + 1.5_dp)
392 : END DO
393 : END DO
394 :
395 42410 : END SUBROUTINE sg_gpot
396 :
397 : !------------------------------------------------------------------------------
398 : !
399 : ! G(l,k,pq) = <a|[r/rc]^2k|b>
400 : ! = 0.5*Gamma(l+k+1.5)/rc^(2k)/(p+q)^(l+k+1.5)
401 : !
402 : !------------------------------------------------------------------------------
403 : ! **************************************************************************************************
404 : !> \brief ...
405 : !> \param gmat ...
406 : !> \param rc ...
407 : !> \param k ...
408 : !> \param l ...
409 : !> \param pa ...
410 : !> \param pb ...
411 : ! **************************************************************************************************
412 75 : SUBROUTINE sg_conf(gmat, rc, k, l, pa, pb)
413 :
414 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: gmat
415 : REAL(KIND=dp), INTENT(IN) :: rc
416 : INTEGER, INTENT(IN) :: k, l
417 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
418 :
419 : INTEGER :: ip, iq, m, n
420 : REAL(KIND=dp) :: tld
421 :
422 75 : n = SIZE(pa)
423 75 : m = SIZE(pb)
424 :
425 75 : CPASSERT(.NOT. (n > SIZE(gmat, 1) .OR. m > SIZE(gmat, 2)))
426 :
427 75 : tld = 0.5_dp/rc**(2*k)*gamma1(l + k + 1)
428 375 : DO iq = 1, m
429 1575 : DO ip = 1, n
430 1500 : gmat(ip, iq) = tld/(pa(ip) + pb(iq))**(l + k + 1.5_dp)
431 : END DO
432 : END DO
433 :
434 75 : END SUBROUTINE sg_conf
435 :
436 : !------------------------------------------------------------------------------
437 : !
438 : ! (plql,rl'sl')
439 : !
440 : !------------------------------------------------------------------------------
441 : ! **************************************************************************************************
442 : !> \brief ...
443 : !> \param eri ...
444 : !> \param nu ...
445 : !> \param pa ...
446 : !> \param lab ...
447 : !> \param pc ...
448 : !> \param lcd ...
449 : ! **************************************************************************************************
450 1218 : SUBROUTINE sg_coulomb(eri, nu, pa, lab, pc, lcd)
451 :
452 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: eri
453 : INTEGER, INTENT(IN) :: nu
454 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa
455 : INTEGER, INTENT(IN) :: lab
456 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pc
457 : INTEGER, INTENT(IN) :: lcd
458 :
459 : INTEGER :: handle, ia, ib, ic, id, jab, jcd, na, nc
460 : REAL(KIND=dp) :: cc1, cc2, ee, p, q, r, s, vab1, vab3, &
461 : vcd1, vcd3, xab, xcd
462 :
463 1218 : CALL timeset("sg_coulomb", handle)
464 :
465 1218 : na = SIZE(pa)
466 1218 : nc = SIZE(pc)
467 1218 : ee = SQRT(2.0_dp*pi)/2.0_dp**(2*(lab + lcd) + 6)
468 1218 : jab = 0
469 12782 : DO ia = 1, na
470 11564 : p = pa(ia)
471 141744 : DO ib = ia, na
472 128962 : jab = jab + 1
473 128962 : q = pa(ib)
474 128962 : xab = 0.5_dp*(p + q)
475 128962 : vab1 = vgau(2*lab - nu + 1, xab)
476 128962 : vab3 = vgau(2*lab + nu + 2, xab)
477 128962 : jcd = 0
478 3272892 : DO ic = 1, nc
479 3132366 : r = pc(ic)
480 45753440 : DO id = ic, nc
481 42492112 : jcd = jcd + 1
482 42492112 : s = pc(id)
483 42492112 : xcd = 0.5_dp*(r + s)
484 42492112 : vcd1 = vgau(2*lcd + nu + 2, xcd)
485 42492112 : vcd3 = vgau(2*lcd - nu + 1, xcd)
486 42492112 : cc1 = cgau(2*lab - nu + 1, 2*lcd + nu + 2, xab/xcd)
487 42492112 : cc2 = cgau(2*lcd - nu + 1, 2*lab + nu + 2, xcd/xab)
488 :
489 45624478 : eri(jab, jcd) = ee*(cc1*vab1*vcd1 + cc2*vab3*vcd3)
490 :
491 : END DO
492 : END DO
493 : END DO
494 : END DO
495 :
496 1218 : CALL timestop(handle)
497 :
498 1218 : END SUBROUTINE sg_coulomb
499 :
500 : !------------------------------------------------------------------------------
501 : !
502 : ! (plql',rlsl')
503 : !
504 : !------------------------------------------------------------------------------
505 : ! **************************************************************************************************
506 : !> \brief ...
507 : !> \param eri ...
508 : !> \param nu ...
509 : !> \param pa ...
510 : !> \param lac ...
511 : !> \param pb ...
512 : !> \param lbd ...
513 : ! **************************************************************************************************
514 2128 : SUBROUTINE sg_exchange(eri, nu, pa, lac, pb, lbd)
515 :
516 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: eri
517 : INTEGER, INTENT(IN) :: nu
518 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa
519 : INTEGER, INTENT(IN) :: lac
520 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pb
521 : INTEGER, INTENT(IN) :: lbd
522 :
523 : INTEGER :: handle, ia, ib, ic, id, jac, jbd, na, nb
524 : REAL(KIND=dp) :: cc1, cc2, cc3, cc4, ee, p, q, r, s, &
525 : v1pr, v1ps, v1qr, v1qs, v2pr, v2ps, &
526 : v2qr, v2qs, xab, xad, xbc, xcd
527 :
528 2128 : CALL timeset("sg_exchange", handle)
529 :
530 40295595 : eri = 0.0_dp
531 2128 : na = SIZE(pa)
532 2128 : nb = SIZE(pb)
533 2128 : ee = SQRT(2.0_dp*pi)/2.0_dp**(2*(lac + lbd) + 7)
534 2128 : jac = 0
535 15842 : DO ia = 1, na
536 13714 : p = pa(ia)
537 162070 : DO ic = ia, na
538 146228 : jac = jac + 1
539 146228 : q = pa(ic)
540 146228 : jbd = 0
541 3424067 : DO ib = 1, nb
542 3264125 : r = pb(ib)
543 3264125 : xab = 0.5_dp*(p + r)
544 3264125 : xbc = 0.5_dp*(q + r)
545 43482700 : DO id = ib, nb
546 40072347 : jbd = jbd + 1
547 40072347 : s = pb(id)
548 40072347 : xcd = 0.5_dp*(q + s)
549 40072347 : xad = 0.5_dp*(p + s)
550 40072347 : v1pr = vgau(lac + lbd - nu + 1, xab)
551 40072347 : v1qs = vgau(lac + lbd - nu + 1, xcd)
552 40072347 : v1ps = vgau(lac + lbd - nu + 1, xad)
553 40072347 : v1qr = vgau(lac + lbd - nu + 1, xbc)
554 40072347 : v2qs = vgau(lac + lbd + nu + 2, xcd)
555 40072347 : v2pr = vgau(lac + lbd + nu + 2, xab)
556 40072347 : v2qr = vgau(lac + lbd + nu + 2, xbc)
557 40072347 : v2ps = vgau(lac + lbd + nu + 2, xad)
558 40072347 : cc1 = cgau(lac + lbd - nu + 1, lac + lbd + nu + 2, xab/xcd)
559 40072347 : cc2 = cgau(lac + lbd - nu + 1, lac + lbd + nu + 2, xcd/xab)
560 40072347 : cc3 = cgau(lac + lbd - nu + 1, lac + lbd + nu + 2, xad/xbc)
561 40072347 : cc4 = cgau(lac + lbd - nu + 1, lac + lbd + nu + 2, xbc/xad)
562 :
563 : eri(jac, jbd) = ee*(v1pr*v2qs*cc1 + v1qs*v2pr*cc2 + &
564 43336472 : v1ps*v2qr*cc3 + v1qr*v2ps*cc4)
565 :
566 : END DO
567 : END DO
568 : END DO
569 : END DO
570 :
571 2128 : CALL timestop(handle)
572 :
573 2128 : END SUBROUTINE sg_exchange
574 :
575 : !------------------------------------------------------------------------------
576 : !
577 : ! erfc(a*x)/x = 1/x - erf(a*x)/x
578 : !
579 : !------------------------------------------------------------------------------
580 : ! **************************************************************************************************
581 : !> \brief ...
582 : !> \param umat ...
583 : !> \param l ...
584 : !> \param a ...
585 : !> \param pa ...
586 : !> \param pb ...
587 : ! **************************************************************************************************
588 192 : SUBROUTINE sg_erfc(umat, l, a, pa, pb)
589 :
590 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: umat
591 : INTEGER, INTENT(IN) :: l
592 : REAL(KIND=dp), INTENT(IN) :: a
593 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa, pb
594 :
595 : INTEGER :: ip, iq, m, n
596 : REAL(KIND=dp) :: tld
597 :
598 192 : n = SIZE(pa)
599 192 : m = SIZE(pb)
600 :
601 192 : CPASSERT(.NOT. (n > SIZE(umat, 1) .OR. m > SIZE(umat, 2)))
602 :
603 192 : CALL sg_erf(umat, l, a, pa, pb)
604 :
605 192 : tld = 0.5_dp*fac(l)
606 1108 : DO iq = 1, m
607 12104 : DO ip = 1, n
608 11912 : umat(ip, iq) = tld/(pa(ip) + pb(iq))**(l + 1) - umat(ip, iq)
609 : END DO
610 : END DO
611 :
612 192 : END SUBROUTINE sg_erfc
613 :
614 : ! ***************************************************************************************************
615 :
616 : ! **************************************************************************************************
617 : !> \brief ...
618 : !> \param n ...
619 : !> \param x ...
620 : !> \return ...
621 : ! **************************************************************************************************
622 405820924 : ELEMENTAL FUNCTION vgau(n, x) RESULT(v)
623 : INTEGER, INTENT(IN) :: n
624 : REAL(KIND=dp), INTENT(IN) :: x
625 : REAL(KIND=dp) :: v
626 :
627 405820924 : v = dfac(n - 1)/x**(0.5_dp*(n + 1))
628 :
629 405820924 : END FUNCTION vgau
630 :
631 : ! **************************************************************************************************
632 : !> \brief ...
633 : !> \param a ...
634 : !> \param b ...
635 : !> \param t ...
636 : !> \return ...
637 : ! **************************************************************************************************
638 245273612 : ELEMENTAL FUNCTION cgau(a, b, t) RESULT(c)
639 : INTEGER, INTENT(IN) :: a, b
640 : REAL(KIND=dp), INTENT(IN) :: t
641 : REAL(KIND=dp) :: c
642 :
643 : INTEGER :: l
644 :
645 245273612 : c = 0.0_dp
646 761069194 : DO l = 0, (a - 1)/2
647 761069194 : c = c + (t/(1.0_dp + t))**l*dfac(2*l + b - 1)/dfac(2*l)
648 : END DO
649 245273612 : c = c*(1.0_dp + t)**(-0.5_dp*(b + 1))/dfac(b - 1)
650 :
651 245273612 : END FUNCTION cgau
652 :
653 : !------------------------------------------------------------------------------
654 : !
655 : ! S(l,pn,qm) = ( V[2n,p]*V[2m,q] )^(-1/2) * V[n+m,(p+q)/2]
656 : !
657 : !------------------------------------------------------------------------------
658 : ! **************************************************************************************************
659 : !> \brief ...
660 : !> \param smat ...
661 : !> \param na ...
662 : !> \param pa ...
663 : !> \param nb ...
664 : !> \param pb ...
665 : ! **************************************************************************************************
666 7296 : SUBROUTINE sto_overlap(smat, na, pa, nb, pb)
667 :
668 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: smat
669 : INTEGER, DIMENSION(:), INTENT(IN) :: na
670 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa
671 : INTEGER, DIMENSION(:), INTENT(IN) :: nb
672 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pb
673 :
674 : INTEGER :: ip, iq, m, n
675 : REAL(KIND=dp) :: vp, vpq, vq
676 :
677 7296 : n = SIZE(pa)
678 7296 : m = SIZE(pb)
679 :
680 7296 : CPASSERT(.NOT. (n > SIZE(smat, 1) .OR. m > SIZE(smat, 2)))
681 :
682 11558 : DO iq = 1, m
683 4262 : vq = vsto(2*nb(iq), pb(iq))
684 23464 : DO ip = 1, n
685 11906 : vp = vsto(2*na(ip), pa(ip))
686 11906 : vpq = vsto(na(ip) + nb(iq), 0.5_dp*(pa(ip) + pb(iq)))
687 16168 : smat(ip, iq) = vpq/SQRT(vp*vq)
688 : END DO
689 : END DO
690 :
691 7296 : END SUBROUTINE sto_overlap
692 :
693 : !------------------------------------------------------------------------------
694 : !
695 : ! T(l,pn,qm) = 0.5*p*q*( V[2n,p]*V[2m,q] )^(-1/2) * V[n+m,(p+q)/2]
696 : ! -(W[l,n,p]+W[l,m,q]) * V[n+m-1,(p+q)/2]
697 : ! +W[l,n,p]*W[l,m,q] * V[n+m-2,(p+q)/2]
698 : !
699 : !------------------------------------------------------------------------------
700 : ! **************************************************************************************************
701 : !> \brief ...
702 : !> \param kmat ...
703 : !> \param l ...
704 : !> \param na ...
705 : !> \param pa ...
706 : !> \param nb ...
707 : !> \param pb ...
708 : ! **************************************************************************************************
709 7296 : SUBROUTINE sto_kinetic(kmat, l, na, pa, nb, pb)
710 :
711 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: kmat
712 : INTEGER, INTENT(IN) :: l
713 : INTEGER, DIMENSION(:), INTENT(IN) :: na
714 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa
715 : INTEGER, DIMENSION(:), INTENT(IN) :: nb
716 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pb
717 :
718 : INTEGER :: ip, iq, m, n
719 : REAL(KIND=dp) :: vp, vpq, vpq1, vpq2, vq, wp, wq
720 :
721 7296 : n = SIZE(pa)
722 7296 : m = SIZE(pb)
723 :
724 7296 : CPASSERT(.NOT. (n > SIZE(kmat, 1) .OR. m > SIZE(kmat, 2)))
725 :
726 11558 : DO iq = 1, m
727 4262 : vq = vsto(2*nb(iq), pb(iq))
728 4262 : wq = wsto(l, nb(iq), pb(iq))
729 23464 : DO ip = 1, n
730 11906 : vp = vsto(2*na(ip), pa(ip))
731 11906 : vpq = vsto(na(ip) + nb(iq), 0.5_dp*(pa(ip) + pb(iq)))
732 11906 : vpq1 = vsto(na(ip) + nb(iq) - 1, 0.5_dp*(pa(ip) + pb(iq)))
733 11906 : vpq2 = vsto(na(ip) + nb(iq) - 2, 0.5_dp*(pa(ip) + pb(iq)))
734 11906 : wp = wsto(l, na(ip), pa(ip))
735 : kmat(ip, iq) = 0.5_dp*pa(ip)*pb(iq)/SQRT(vp*vq)* &
736 16168 : (vpq - (wp + wq)*vpq1 + wp*wq*vpq2)
737 : END DO
738 : END DO
739 :
740 7296 : END SUBROUTINE sto_kinetic
741 :
742 : !------------------------------------------------------------------------------
743 : !
744 : ! U(l,pq) = 2( V[2n,p]*V[2m,q] )^(-1/2) * V[n+m-1,(p+q)/2]
745 : !
746 : !------------------------------------------------------------------------------
747 : ! **************************************************************************************************
748 : !> \brief ...
749 : !> \param umat ...
750 : !> \param na ...
751 : !> \param pa ...
752 : !> \param nb ...
753 : !> \param pb ...
754 : ! **************************************************************************************************
755 8244 : SUBROUTINE sto_nuclear(umat, na, pa, nb, pb)
756 :
757 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: umat
758 : INTEGER, DIMENSION(:), INTENT(IN) :: na
759 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa
760 : INTEGER, DIMENSION(:), INTENT(IN) :: nb
761 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pb
762 :
763 : INTEGER :: ip, iq, m, n
764 : REAL(KIND=dp) :: vp, vpq1, vq
765 :
766 8244 : n = SIZE(pa)
767 8244 : m = SIZE(pb)
768 :
769 8244 : CPASSERT(.NOT. (n > SIZE(umat, 1) .OR. m > SIZE(umat, 2)))
770 :
771 12758 : DO iq = 1, m
772 4514 : vq = vsto(2*nb(iq), pb(iq))
773 24916 : DO ip = 1, n
774 12158 : vp = vsto(2*na(ip), pa(ip))
775 12158 : vpq1 = vsto(na(ip) + nb(iq) - 1, 0.5_dp*(pa(ip) + pb(iq)))
776 16672 : umat(ip, iq) = 2._dp/SQRT(vp*vq)*vpq1
777 : END DO
778 : END DO
779 :
780 8244 : END SUBROUTINE sto_nuclear
781 :
782 : !------------------------------------------------------------------------------
783 : !
784 : ! G(l,k,pq) = <aln|[r/rc]^2k|blm>
785 : ! = N(aln)*N(blm) (a+b)^(-(n+m+2k+1))/rc^2k * GAMMA(n+m+2k+1)
786 : !
787 : !------------------------------------------------------------------------------
788 : ! **************************************************************************************************
789 : !> \brief ...
790 : !> \param gmat ...
791 : !> \param rc ...
792 : !> \param k ...
793 : !> \param na ...
794 : !> \param pa ...
795 : !> \param nb ...
796 : !> \param pb ...
797 : ! **************************************************************************************************
798 0 : SUBROUTINE sto_conf(gmat, rc, k, na, pa, nb, pb)
799 :
800 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: gmat
801 : REAL(KIND=dp), INTENT(IN) :: rc
802 : INTEGER, INTENT(IN) :: k
803 : INTEGER, DIMENSION(:), INTENT(IN) :: na
804 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pa
805 : INTEGER, DIMENSION(:), INTENT(IN) :: nb
806 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: pb
807 :
808 : INTEGER :: ip, iq, m, n
809 :
810 0 : n = SIZE(pa)
811 0 : m = SIZE(pb)
812 :
813 0 : CPASSERT(.NOT. (n > SIZE(gmat, 1) .OR. m > SIZE(gmat, 2)))
814 :
815 0 : DO iq = 1, m
816 0 : DO ip = 1, n
817 : gmat(ip, iq) = (2._dp*pa(ip))**(na(ip) + 0.5_dp)/SQRT(fac(2*na(ip))) &
818 : *(2._dp*pb(iq))**(nb(iq) + 0.5_dp)/SQRT(fac(2*nb(iq))) &
819 : /rc**(2*k)/(pa(ip) + pb(iq))**(na(ip) + nb(iq) + 2*k + 1) &
820 0 : *gamma0(na(ip) + nb(iq) + 2*k + 1)
821 : END DO
822 : END DO
823 :
824 0 : END SUBROUTINE sto_conf
825 :
826 : ! **************************************************************************************************
827 :
828 : ! **************************************************************************************************
829 : !> \brief ...
830 : !> \param n ...
831 : !> \param x ...
832 : !> \return ...
833 : ! **************************************************************************************************
834 108790 : ELEMENTAL FUNCTION vsto(n, x) RESULT(v)
835 : INTEGER, INTENT(IN) :: n
836 : REAL(KIND=dp), INTENT(IN) :: x
837 : REAL(KIND=dp) :: v
838 :
839 108790 : v = fac(n)/x**(n + 1)
840 :
841 108790 : END FUNCTION vsto
842 :
843 : ! **************************************************************************************************
844 : !> \brief ...
845 : !> \param n ...
846 : !> \param m ...
847 : !> \param x ...
848 : !> \return ...
849 : ! **************************************************************************************************
850 16168 : ELEMENTAL FUNCTION wsto(n, m, x) RESULT(w)
851 : INTEGER, INTENT(IN) :: n, m
852 : REAL(KIND=dp), INTENT(IN) :: x
853 : REAL(KIND=dp) :: w
854 :
855 16168 : w = 2._dp*REAL(m - n - 1, dp)/x
856 :
857 16168 : END FUNCTION wsto
858 : !------------------------------------------------------------------------------
859 : !
860 : ! S(l,pq) = INT(u^2 Ra(u) Rb(u))du
861 : !
862 : !------------------------------------------------------------------------------
863 : ! **************************************************************************************************
864 : !> \brief ...
865 : !> \param smat ...
866 : !> \param ra ...
867 : !> \param rb ...
868 : !> \param wr ...
869 : ! **************************************************************************************************
870 0 : SUBROUTINE num_overlap(smat, ra, rb, wr)
871 :
872 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: smat
873 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, rb
874 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: wr
875 :
876 : INTEGER :: ip, iq, m, n
877 :
878 0 : n = SIZE(ra, 2)
879 0 : m = SIZE(rb, 2)
880 :
881 0 : CPASSERT(.NOT. (n > SIZE(smat, 1) .OR. m > SIZE(smat, 2)))
882 :
883 0 : DO iq = 1, m
884 0 : DO ip = 1, n
885 0 : smat(ip, iq) = SUM(ra(:, ip)*rb(:, iq)*wr(:))
886 : END DO
887 : END DO
888 :
889 0 : END SUBROUTINE num_overlap
890 :
891 : !------------------------------------------------------------------------------
892 : !
893 : ! T(l,pq) = 0.5 INT( u^2 dRa(u) dRb(u) + l(l+1) Ra(u) Rb(u))du
894 : !
895 : !------------------------------------------------------------------------------
896 : ! **************************************************************************************************
897 : !> \brief ...
898 : !> \param kmat ...
899 : !> \param l ...
900 : !> \param ra ...
901 : !> \param dra ...
902 : !> \param rb ...
903 : !> \param drb ...
904 : !> \param r ...
905 : !> \param wr ...
906 : ! **************************************************************************************************
907 0 : SUBROUTINE num_kinetic(kmat, l, ra, dra, rb, drb, r, wr)
908 :
909 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: kmat
910 : INTEGER, INTENT(IN) :: l
911 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, dra, rb, drb
912 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
913 :
914 : INTEGER :: ip, iq, m, n
915 :
916 0 : n = SIZE(ra, 2)
917 0 : m = SIZE(rb, 2)
918 :
919 0 : CPASSERT(.NOT. (n > SIZE(kmat, 1) .OR. m > SIZE(kmat, 2)))
920 :
921 0 : DO iq = 1, m
922 0 : DO ip = 1, n
923 : kmat(ip, iq) = 0.5_dp*SUM(wr(:)*dra(:, ip)*drb(:, iq) &
924 0 : + wr(:)*REAL(l*(l + 1), dp)*ra(:, ip)*rb(:, iq)/r(:)**2)
925 : END DO
926 : END DO
927 :
928 0 : END SUBROUTINE num_kinetic
929 :
930 : !------------------------------------------------------------------------------
931 : !
932 : ! U(l,pq) = INT(u Ra(u) Rb(u))du
933 : !
934 : !------------------------------------------------------------------------------
935 : ! **************************************************************************************************
936 : !> \brief ...
937 : !> \param umat ...
938 : !> \param ra ...
939 : !> \param rb ...
940 : !> \param r ...
941 : !> \param wr ...
942 : ! **************************************************************************************************
943 0 : SUBROUTINE num_nuclear(umat, ra, rb, r, wr)
944 :
945 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: umat
946 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, rb
947 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
948 :
949 : INTEGER :: ip, iq, m, n
950 :
951 0 : n = SIZE(ra, 2)
952 0 : m = SIZE(rb, 2)
953 :
954 0 : CPASSERT(.NOT. (n > SIZE(umat, 1) .OR. m > SIZE(umat, 2)))
955 :
956 0 : DO iq = 1, m
957 0 : DO ip = 1, n
958 0 : umat(ip, iq) = SUM(wr(:)*ra(:, ip)*rb(:, iq)/r(:))
959 : END DO
960 : END DO
961 :
962 0 : END SUBROUTINE num_nuclear
963 :
964 : !------------------------------------------------------------------------------
965 : !
966 : ! U(l,pq) = INT(u dRa(u) dRb(u))du + l(l+1) * INT(Ra(u) Rb(u) / u)du
967 : !
968 : !------------------------------------------------------------------------------
969 : ! **************************************************************************************************
970 : !> \brief ...
971 : !> \param umat ...
972 : !> \param l ...
973 : !> \param ra ...
974 : !> \param dra ...
975 : !> \param rb ...
976 : !> \param drb ...
977 : !> \param r ...
978 : !> \param wr ...
979 : ! **************************************************************************************************
980 0 : SUBROUTINE num_kinnuc(umat, l, ra, dra, rb, drb, r, wr)
981 :
982 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: umat
983 : INTEGER, INTENT(IN) :: l
984 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, dra, rb, drb
985 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
986 :
987 : INTEGER :: ip, iq, m, n
988 :
989 0 : n = SIZE(ra, 2)
990 0 : m = SIZE(rb, 2)
991 :
992 0 : CPASSERT(.NOT. (n > SIZE(umat, 1) .OR. m > SIZE(umat, 2)))
993 :
994 0 : DO iq = 1, m
995 0 : DO ip = 1, n
996 : umat(ip, iq) = SUM(wr(:)*dra(:, ip)*drb(:, iq)/r(:) &
997 0 : + wr(:)*REAL(l*(l + 1), dp)*ra(:, ip)*rb(:, iq)/r(:)**3)
998 : END DO
999 : END DO
1000 :
1001 0 : END SUBROUTINE num_kinnuc
1002 :
1003 : !------------------------------------------------------------------------------
1004 : !
1005 : ! U(l,pq) = INT(u erf(a*u) Ra(u) Rb(u))du
1006 : !
1007 : !------------------------------------------------------------------------------
1008 : ! **************************************************************************************************
1009 : !> \brief ...
1010 : !> \param upmat ...
1011 : !> \param a ...
1012 : !> \param ra ...
1013 : !> \param rb ...
1014 : !> \param r ...
1015 : !> \param wr ...
1016 : ! **************************************************************************************************
1017 0 : SUBROUTINE num_erf(upmat, a, ra, rb, r, wr)
1018 :
1019 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: upmat
1020 : REAL(KIND=dp), INTENT(IN) :: a
1021 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, rb
1022 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
1023 :
1024 : INTEGER :: ip, iq, k, m, n
1025 :
1026 0 : n = SIZE(ra, 2)
1027 0 : m = SIZE(rb, 2)
1028 :
1029 0 : CPASSERT(.NOT. (n > SIZE(upmat, 1) .OR. m > SIZE(upmat, 2)))
1030 :
1031 0 : DO iq = 1, m
1032 0 : DO ip = 1, n
1033 0 : upmat(ip, iq) = 0._dp
1034 0 : DO k = 1, SIZE(r)
1035 : upmat(ip, iq) = upmat(ip, iq) + &
1036 0 : (wr(k)*ra(k, ip)*rb(k, iq)*erf(a*r(k))/r(k))
1037 : END DO
1038 : END DO
1039 : END DO
1040 :
1041 0 : END SUBROUTINE num_erf
1042 :
1043 : !------------------------------------------------------------------------------
1044 : !
1045 : ! Overlap with Projectors P(l,k,rc) for k=0,1,..
1046 : !
1047 : ! P(l,k,rc) = SQRT(2)/SQRT(Gamma[l+2k+1.5])/rc^(l+2k+1.5) r^(l+2k) exp[-0.5(r/rc)^2]
1048 : !
1049 : ! SP(l,k,p,rc) = INT(u^2 R(u) P(u))du
1050 : !
1051 : !------------------------------------------------------------------------------
1052 : ! **************************************************************************************************
1053 : !> \brief ...
1054 : !> \param spmat ...
1055 : !> \param l ...
1056 : !> \param ra ...
1057 : !> \param k ...
1058 : !> \param rc ...
1059 : !> \param r ...
1060 : !> \param wr ...
1061 : ! **************************************************************************************************
1062 0 : SUBROUTINE num_proj_ol(spmat, l, ra, k, rc, r, wr)
1063 :
1064 : REAL(KIND=dp), DIMENSION(:), INTENT(OUT) :: spmat
1065 : INTEGER, INTENT(IN) :: l
1066 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra
1067 : INTEGER, INTENT(IN) :: k
1068 : REAL(KIND=dp), INTENT(IN) :: rc
1069 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
1070 :
1071 : INTEGER :: ip, n
1072 : REAL(KIND=dp) :: pf
1073 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: pro
1074 :
1075 0 : n = SIZE(ra, 2)
1076 0 : CPASSERT(SIZE(spmat) >= n)
1077 :
1078 0 : ALLOCATE (pro(n))
1079 :
1080 0 : pf = SQRT(2._dp)/SQRT(gamma1(l + 2*k + 1))/rc**(l + 2*k + 1.5_dp)
1081 0 : pro(:) = pf*r(:)**(l + 2*k)*EXP(-0.5_dp*(r(:)/rc)**2)
1082 :
1083 0 : DO ip = 1, n
1084 0 : spmat(ip) = SUM(wr(:)*pro(:)*ra(:, ip))
1085 : END DO
1086 :
1087 0 : DEALLOCATE (pro)
1088 :
1089 0 : END SUBROUTINE num_proj_ol
1090 :
1091 : !------------------------------------------------------------------------------
1092 : !
1093 : ! Matrix elements for Gaussian potentials
1094 : !
1095 : ! V(k,rc) = (r/rc)^2k exp[-1/2(r/rc)^2]
1096 : !
1097 : ! VP(l,k,p+q,rc) = INT(u^2 V(u) Ra(u) Rb(u))du
1098 : !
1099 : !------------------------------------------------------------------------------
1100 : ! **************************************************************************************************
1101 : !> \brief ...
1102 : !> \param vpmat ...
1103 : !> \param k ...
1104 : !> \param rc ...
1105 : !> \param ra ...
1106 : !> \param rb ...
1107 : !> \param r ...
1108 : !> \param wr ...
1109 : ! **************************************************************************************************
1110 0 : SUBROUTINE num_gpot(vpmat, k, rc, ra, rb, r, wr)
1111 :
1112 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: vpmat
1113 : INTEGER, INTENT(IN) :: k
1114 : REAL(KIND=dp), INTENT(IN) :: rc
1115 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, rb
1116 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
1117 :
1118 : INTEGER :: ip, iq, m, n
1119 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: op
1120 :
1121 0 : n = SIZE(ra, 2)
1122 0 : m = SIZE(rb, 2)
1123 :
1124 0 : CPASSERT(.NOT. (n > SIZE(vpmat, 1) .OR. m > SIZE(vpmat, 2)))
1125 :
1126 0 : ALLOCATE (op(n))
1127 :
1128 0 : op(:) = (r(:)/rc)**(2*k)*EXP(-0.5_dp*(r(:)/rc)**2)
1129 :
1130 0 : DO iq = 1, m
1131 0 : DO ip = 1, n
1132 0 : vpmat(ip, iq) = SUM(wr(:)*ra(:, ip)*rb(:, iq)*op(:))
1133 : END DO
1134 : END DO
1135 :
1136 0 : DEALLOCATE (op)
1137 :
1138 0 : END SUBROUTINE num_gpot
1139 :
1140 : !------------------------------------------------------------------------------
1141 : !
1142 : ! G(l,k,pq) = <a|[r/rc]^2k|b>
1143 : ! = INT(u^2 [u/rc]^2k Ra(u) Rb(u))du
1144 : !
1145 : !------------------------------------------------------------------------------
1146 : ! **************************************************************************************************
1147 : !> \brief ...
1148 : !> \param gmat ...
1149 : !> \param rc ...
1150 : !> \param k ...
1151 : !> \param ra ...
1152 : !> \param rb ...
1153 : !> \param r ...
1154 : !> \param wr ...
1155 : ! **************************************************************************************************
1156 0 : SUBROUTINE num_conf(gmat, rc, k, ra, rb, r, wr)
1157 :
1158 : REAL(KIND=dp), DIMENSION(:, :), INTENT(OUT) :: gmat
1159 : REAL(KIND=dp), INTENT(IN) :: rc
1160 : INTEGER, INTENT(IN) :: k
1161 : REAL(KIND=dp), DIMENSION(:, :), INTENT(IN) :: ra, rb
1162 : REAL(KIND=dp), DIMENSION(:), INTENT(IN) :: r, wr
1163 :
1164 : INTEGER :: ip, iq, m, n
1165 0 : REAL(KIND=dp), ALLOCATABLE, DIMENSION(:) :: op
1166 :
1167 0 : n = SIZE(ra, 2)
1168 0 : m = SIZE(rb, 2)
1169 :
1170 0 : CPASSERT(.NOT. (n > SIZE(gmat, 1) .OR. m > SIZE(gmat, 2)))
1171 :
1172 0 : ALLOCATE (op(n))
1173 :
1174 0 : op(:) = (r(:)/rc)**(2*k)
1175 :
1176 0 : DO iq = 1, m
1177 0 : DO ip = 1, n
1178 0 : gmat(ip, iq) = SUM(wr(:)*ra(:, ip)*rb(:, iq)*op(:))
1179 : END DO
1180 : END DO
1181 :
1182 0 : DEALLOCATE (op)
1183 :
1184 0 : END SUBROUTINE num_conf
1185 :
1186 : END MODULE ai_onecenter
|