95 FUNCTION exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
RESULT(radius)
96 INTEGER,
INTENT(IN) :: l
97 REAL(kind=
dp),
INTENT(IN) :: alpha, threshold, prefactor
98 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: epsabs, epsrel, rlow
99 REAL(kind=
dp) :: radius
101 INTEGER,
PARAMETER :: itermax = 5000, prec_exp =
sp
102 REAL(kind=
dp),
PARAMETER :: contract(*) = [0.38_dp, 0.62_dp], mineps = 1.0e-12_dp, &
103 next = 2.0_dp, step = 1.0_dp
106 REAL(kind=
dp) :: a, d, dr, eps, r, rd, t
107 REAL(kind=
dp),
DIMENSION(SIZE(contract)) :: g, s
110 cpabort(
"The angular momentum quantum number is negative")
113 IF (alpha == 0.0_dp)
THEN
114 cpabort(
"The Gaussian function exponent is zero")
119 IF (threshold /= 0.0_dp)
THEN
122 cpabort(
"The requested threshold is zero")
126 IF (
PRESENT(rlow)) radius = rlow
127 IF (prefactor == 0.0_dp)
RETURN
130 r = max(sqrt(0.5_dp*real(l,
dp)/a), radius)
132 d = abs(prefactor); g(1) = d
134 g(1) = g(1)*exp(real(-a*r*r, kind=prec_exp))*r**l
141 radius = r*next + step
143 g(1) = d*exp(real(-a*radius*radius, kind=prec_exp))*radius**l
145 r = radius; radius = r*next + step
149 IF (
PRESENT(epsabs))
THEN
151 ELSE IF (.NOT.
PRESENT(epsrel))
THEN
156 IF (
PRESENT(epsrel)) eps = min(eps, epsrel*r)
159 DO i = i + 1, itermax
162 IF ((rd < eps) .OR. (rd == dr))
RETURN
164 g = d*exp(real(-a*s*s, kind=prec_exp))*s**l
165 DO j = 1,
SIZE(contract)
175 IF (i >= itermax)
THEN
176 cpabort(
"Maximum number of iterations reached")
206 FUNCTION exp_radius_very_extended(la_min, la_max, lb_min, lb_max, pab, o1, o2, ra, rb, rp, &
207 zetp, eps, prefactor, cutoff, epsabs)
RESULT(radius)
209 INTEGER,
INTENT(IN) :: la_min, la_max, lb_min, lb_max
210 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL,
POINTER :: pab
211 INTEGER,
OPTIONAL :: o1, o2
212 REAL(kind=
dp),
INTENT(IN) :: ra(3), rb(3), rp(3), zetp, eps, &
214 REAL(kind=
dp),
OPTIONAL :: epsabs
215 REAL(kind=
dp) :: radius
217 INTEGER :: i, ico, j, jco, la(3), lb(3), lxa, lxb, &
219 REAL(kind=
dp) :: bini, binj, coef(0:20), epsin_local, &
220 polycoef(0:60), prefactor_local, &
225 epsin_local = 1.0e-2_dp
226 IF (
PRESENT(epsabs)) epsin_local = epsabs
228 IF (
PRESENT(pab))
THEN
229 prefactor_local = cutoff
232 DO lya = 0, la_max - lxa
233 DO lyb = 0, lb_max - lxb
234 DO lza = max(la_min - lxa - lya, 0), la_max - lxa - lya
235 DO lzb = max(lb_min - lxb - lyb, 0), lb_max - lxb - lyb
238 ico =
coset(lxa, lya, lza)
239 jco =
coset(lxb, lyb, lzb)
240 prefactor_local = max(abs(pab(o1 + ico, o2 + jco)), prefactor_local)
247 prefactor_local = prefactor*prefactor_local
249 prefactor_local = prefactor*max(1.0_dp, cutoff)
257 rad_a = sqrt(sum((ra - rp)**2))
258 rad_b = sqrt(sum((rb - rp)**2))
260 polycoef(0:la_max + lb_max) = 0.0_dp
263 coef(0:la_max + lb_max) = 0.0_dp
270 coef(lxa + lxb - i - j) = coef(lxa + lxb - i - j) + bini*binj*s1*s2
271 binj = (binj*(lxb - j))/(j + 1)
274 bini = (bini*(lxa - i))/(i + 1)
278 polycoef(i) = max(polycoef(i), coef(i))
283 polycoef(0:la_max + lb_max) = polycoef(0:la_max + lb_max)*prefactor_local
285 DO i = 0, la_max + lb_max
286 radius = max(radius,
exp_radius(i, zetp, eps, polycoef(i), epsin_local, rlow=radius))
331 INTEGER,
INTENT(in) :: lda
332 REAL(
dp),
INTENT(in) :: a(lda, *)
333 INTEGER,
INTENT(in) :: ldb
334 REAL(
dp),
INTENT(in) :: b(ldb, *)
335 INTEGER,
INTENT(in) :: m, n
338 INTEGER :: i1, i2, imod, mminus3
339 REAL(
dp) :: t1, t2, t3, t4
350 t1 = t1 + a(i1, i2)*b(i1, i2)
351 t2 = t2 + a(i1 + 1, i2)*b(i1 + 1, i2)
352 t3 = t3 + a(i1 + 2, i2)*b(i1 + 2, i2)
353 t4 = t4 + a(i1 + 3, i2)*b(i1 + 3, i2)
359 DO i1 = 1, mminus3, 4
360 t1 = t1 + a(i1, i2)*b(i1, i2)
361 t2 = t2 + a(i1 + 1, i2)*b(i1 + 1, i2)
362 t3 = t3 + a(i1 + 2, i2)*b(i1 + 2, i2)
363 t4 = t4 + a(i1 + 3, i2)*b(i1 + 3, i2)
365 t1 = t1 + a(m, i2)*b(m, i2)
370 DO i1 = 1, mminus3, 4
371 t1 = t1 + a(i1, i2)*b(i1, i2)
372 t2 = t2 + a(i1 + 1, i2)*b(i1 + 1, i2)
373 t3 = t3 + a(i1 + 2, i2)*b(i1 + 2, i2)
374 t4 = t4 + a(i1 + 3, i2)*b(i1 + 3, i2)
376 t1 = t1 + a(m - 1, i2)*b(m - 1, i2)
377 t2 = t2 + a(m, i2)*b(m, i2)
382 DO i1 = 1, mminus3, 4
383 t1 = t1 + a(i1, i2)*b(i1, i2)
384 t2 = t2 + a(i1 + 1, i2)*b(i1 + 1, i2)
385 t3 = t3 + a(i1 + 2, i2)*b(i1 + 2, i2)
386 t4 = t4 + a(i1 + 3, i2)*b(i1 + 3, i2)
388 t1 = t1 + a(m - 2, i2)*b(m - 2, i2)
389 t2 = t2 + a(m - 1, i2)*b(m - 1, i2)
390 t3 = t3 + a(m, i2)*b(m, i2)
real(kind=dp) function, public exp_radius(l, alpha, threshold, prefactor, epsabs, epsrel, rlow)
The radius of a primitive Gaussian function for a given threshold is calculated. g(r) = prefactor*r**...
real(kind=dp) function, public exp_radius_very_extended(la_min, la_max, lb_min, lb_max, pab, o1, o2, ra, rb, rp, zetp, eps, prefactor, cutoff, epsabs)
computes the radius of the Gaussian outside of which it is smaller than eps
real(kind=dp) function, public gauss_exponent(l, radius, threshold, prefactor)
The exponent of a primitive Gaussian function for a given radius and threshold is calculated.