46 #include "../base/base_uses.f90"
49 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'ai_operators_r12'
71 SUBROUTINE ab_sint_os(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
73 REAL(KIND=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
74 INTEGER,
INTENT(IN) :: nmax
75 REAL(KIND=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
78 END SUBROUTINE ab_sint_os
108 SUBROUTINE operator2(cps_operator2, la_max, npgfa, zeta, la_min, lc_max, npgfc, zetc, lc_min, &
109 omega, r_cutoff, rac, rac2, vac, v, maxder, vac_plus)
110 PROCEDURE(ab_sint_os),
POINTER :: cps_operator2
111 INTEGER,
INTENT(IN) :: la_max, npgfa
112 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zeta
113 INTEGER,
INTENT(IN) :: la_min, lc_max, npgfc
114 REAL(kind=
dp),
DIMENSION(:),
INTENT(IN) :: zetc
115 INTEGER,
INTENT(IN) :: lc_min
116 REAL(kind=
dp),
INTENT(IN) :: omega, r_cutoff
117 REAL(kind=
dp),
DIMENSION(3),
INTENT(IN) :: rac
118 REAL(kind=
dp),
INTENT(IN) :: rac2
119 REAL(kind=
dp),
DIMENSION(:, :),
INTENT(INOUT) :: vac
120 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
121 INTEGER,
INTENT(IN),
OPTIONAL :: maxder
122 REAL(kind=
dp),
DIMENSION(:, :),
OPTIONAL :: vac_plus
124 CHARACTER(len=*),
PARAMETER :: routinen =
'operator2'
126 INTEGER :: ax, ay, az, coc, cocx, cocy, cocz, cx, &
127 cy, cz, i, ipgf, j, jpgf, la, lc, &
128 maxder_local, n, na, nap, nc, ncp, &
130 REAL(kind=
dp) :: dac, f1, f2, f3, f4, f5, f6, fcx, &
131 fcy, fcz, rho, zetp, zetq, zetw
132 REAL(kind=
dp),
DIMENSION(3) :: raw, rcw
134 CALL timeset(routinen, handle)
139 IF (
PRESENT(maxder))
THEN
140 maxder_local = maxder
144 nmax = la_max + lc_max + 1
164 zetp = 1.0_dp/zeta(ipgf)
165 zetq = 1.0_dp/zetc(jpgf)
166 zetw = 1.0_dp/(zeta(ipgf) + zetc(jpgf))
168 rho = zeta(ipgf)*zetc(jpgf)*zetw
172 CALL cps_operator2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
181 rcw(:) = -zeta(ipgf)*zetw*rac(:)
186 v(1, 2, n) = rcw(1)*v(1, 1, n + 1)
187 v(1, 3, n) = rcw(2)*v(1, 1, n + 1)
188 v(1, 4, n) = rcw(3)*v(1, 1, n + 1)
201 v(1,
coset(0, 0, lc), n) = &
202 rcw(3)*v(1,
coset(0, 0, lc - 1), n + 1) + &
203 f1*real(lc - 1,
dp)*(v(1,
coset(0, 0, lc - 2), n) + &
204 f2*v(1,
coset(0, 0, lc - 2), n + 1))
209 v(1,
coset(0, 1, cz), n) = rcw(2)*v(1,
coset(0, 0, cz), n + 1)
213 v(1,
coset(0, cy, cz), n) = &
214 rcw(2)*v(1,
coset(0, cy - 1, cz), n + 1) + &
215 f1*real(cy - 1,
dp)*(v(1,
coset(0, cy - 2, cz), n) + &
216 f2*v(1,
coset(0, cy - 2, cz), n + 1))
223 v(1,
coset(1, cy, cz), n) = rcw(1)*v(1,
coset(0, cy, cz), n + 1)
227 f6 = f1*real(cx - 1,
dp)
230 v(1,
coset(cx, cy, cz), n) = &
231 rcw(1)*v(1,
coset(cx - 1, cy, cz), n + 1) + &
232 f6*(v(1,
coset(cx - 2, cy, cz), n) + &
233 f2*v(1,
coset(cx - 2, cy, cz), n + 1))
251 raw(:) = zetc(jpgf)*zetw*rac(:)
256 v(2, 1, n) = raw(1)*v(1, 1, n + 1)
257 v(3, 1, n) = raw(2)*v(1, 1, n + 1)
258 v(4, 1, n) = raw(3)*v(1, 1, n + 1)
271 v(
coset(0, 0, la), 1, n) = &
272 raw(3)*v(
coset(0, 0, la - 1), 1, n + 1) + &
273 f3*real(la - 1,
dp)*(v(
coset(0, 0, la - 2), 1, n) + &
274 f4*v(
coset(0, 0, la - 2), 1, n + 1))
279 v(
coset(0, 1, az), 1, n) = raw(2)*v(
coset(0, 0, az), 1, n + 1)
283 v(
coset(0, ay, az), 1, n) = &
284 raw(2)*v(
coset(0, ay - 1, az), 1, n + 1) + &
285 f3*real(ay - 1,
dp)*(v(
coset(0, ay - 2, az), 1, n) + &
286 f4*v(
coset(0, ay - 2, az), 1, n + 1))
293 v(
coset(1, ay, az), 1, n) = raw(1)*v(
coset(0, ay, az), 1, n + 1)
297 f6 = f3*real(ax - 1,
dp)
300 v(
coset(ax, ay, az), 1, n) = &
301 raw(1)*v(
coset(ax - 1, ay, az), 1, n + 1) + &
302 f6*(v(
coset(ax - 2, ay, az), 1, n) + &
303 f4*v(
coset(ax - 2, ay, az), 1, n + 1))
317 coc =
coset(cx, cy, cz)
318 cocx =
coset(max(0, cx - 1), cy, cz)
319 cocy =
coset(cx, max(0, cy - 1), cz)
320 cocz =
coset(cx, cy, max(0, cz - 1))
322 fcx = f5*real(cx,
dp)
323 fcy = f5*real(cy,
dp)
324 fcz = f5*real(cz,
dp)
329 DO n = 1, nmax - 1 - lc
330 v(2, coc, n) = raw(1)*v(1, coc, n + 1) + fcx*v(1, cocx, n + 1)
331 v(3, coc, n) = raw(2)*v(1, coc, n + 1) + fcy*v(1, cocy, n + 1)
332 v(4, coc, n) = raw(3)*v(1, coc, n + 1) + fcz*v(1, cocz, n + 1)
342 DO n = 1, nmax - la - lc
346 v(
coset(0, 0, la), coc, n) = &
347 raw(3)*v(
coset(0, 0, la - 1), coc, n + 1) + &
348 f3*real(la - 1,
dp)*(v(
coset(0, 0, la - 2), coc, n) + &
349 f4*v(
coset(0, 0, la - 2), coc, n + 1)) + &
350 fcz*v(
coset(0, 0, la - 1), cocz, n + 1)
355 v(
coset(0, 1, az), coc, n) = &
356 raw(2)*v(
coset(0, 0, az), coc, n + 1) + &
357 fcy*v(
coset(0, 0, az), cocy, n + 1)
361 v(
coset(0, ay, az), coc, n) = &
362 raw(2)*v(
coset(0, ay - 1, az), coc, n + 1) + &
363 f3*real(ay - 1,
dp)*(v(
coset(0, ay - 2, az), coc, n) + &
364 f4*v(
coset(0, ay - 2, az), coc, n + 1)) + &
365 fcy*v(
coset(0, ay - 1, az), cocy, n + 1)
372 v(
coset(1, ay, az), coc, n) = &
373 raw(1)*v(
coset(0, ay, az), coc, n + 1) + &
374 fcx*v(
coset(0, ay, az), cocx, n + 1)
378 f6 = f3*real(ax - 1,
dp)
381 v(
coset(ax, ay, az), coc, n) = &
382 raw(1)*v(
coset(ax - 1, ay, az), coc, n + 1) + &
383 f6*(v(
coset(ax - 2, ay, az), coc, n) + &
384 f4*v(
coset(ax - 2, ay, az), coc, n + 1)) + &
385 fcx*v(
coset(ax - 1, ay, az), cocx, n + 1)
400 DO j =
ncoset(lc_min - 1) + 1,
ncoset(lc_max - maxder_local)
401 DO i =
ncoset(la_min - 1) + 1,
ncoset(la_max - maxder_local)
402 vac(na + i, nc + j) = v(i, j, 1)
406 IF (
PRESENT(maxder))
THEN
409 vac_plus(nap + i, ncp + j) = v(i, j, 1)
414 nc = nc +
ncoset(lc_max - maxder_local)
415 ncp = ncp +
ncoset(lc_max)
419 na = na +
ncoset(la_max - maxder_local)
420 nap = nap +
ncoset(la_max)
424 CALL timestop(handle)
442 SUBROUTINE cps_coulomb2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
443 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
444 INTEGER,
INTENT(IN) :: nmax
445 REAL(kind=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
449 REAL(kind=
dp) :: f0, t
450 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: f
456 f0 = 2.0_dp*sqrt(
pi**5*zetw)*zetp*zetq
461 CALL fgamma(nmax - 1, t, f)
466 v(1, 1, n) = f0*f(n - 1)
485 SUBROUTINE cps_verf2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
486 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
487 INTEGER,
INTENT(IN) :: nmax
488 REAL(kind=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
492 REAL(kind=
dp) :: arg, comega, f0, t
493 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: f
498 comega = omega**2/(omega**2 + rho)
499 f0 = 2.0_dp*sqrt(
pi**5*zetw*comega)*zetp*zetq
505 CALL fgamma(nmax - 1, arg, f)
510 v(1, 1, n) = f0*f(n - 1)*comega**(n - 1)
530 SUBROUTINE cps_verfc2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
531 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
532 INTEGER,
INTENT(IN) :: nmax
533 REAL(kind=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
537 REAL(kind=
dp) :: argerf, comega, f0, t
538 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: fv, fverf
542 ALLOCATE (fv(0:nmax), fverf(0:nmax))
543 comega = omega**2/(omega**2 + rho)
544 f0 = 2.0_dp*sqrt(
pi**5*zetw)*zetp*zetq
551 CALL fgamma(nmax - 1, t, fv)
552 CALL fgamma(nmax - 1, argerf, fverf)
557 v(1, 1, n) = f0*(fv(n - 1) - sqrt(comega)*comega**(n - 1)*fverf(n - 1))
560 DEALLOCATE (fv, fverf)
577 SUBROUTINE cps_vgauss2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
578 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
579 INTEGER,
INTENT(IN) :: nmax
580 REAL(kind=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
584 REAL(kind=
dp) :: arg, dummy, eta, expt, f0, fsign, t, tau
585 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: f
593 eta = rho/(rho + omega)
594 tau = omega/(rho + omega)
601 CALL fgamma(nmax - 1, arg, f)
603 expt = exp(-omega/(omega + rho)*t)
604 f0 = 2.0_dp*sqrt(
pi**5*zetw**3)/(rho + omega)*expt
607 v(1, 1, 1:nmax) = 0.0_dp
609 fsign = (-1.0_dp)**(n - 1)
611 v(1, 1, n) = v(1, 1, n) + f0*fsign* &
612 fac(n - 1)/
fac(n - j - 1)/
fac(j)*(-tau)**(n - j - 1)*(-eta)**j*f(j)
633 SUBROUTINE cps_gauss2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
634 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
635 INTEGER,
INTENT(IN) :: nmax
636 REAL(kind=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
640 REAL(kind=
dp) :: dummy, expt, f0, t, tau
641 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: f
649 tau = omega/(rho + omega)
652 f0 =
pi**3*sqrt(zetw**3/(rho + omega)**3)*expt
657 v(1, 1, n) = f0*tau**(n - 1)
679 REAL(kind=
dp),
DIMENSION(:, :, :),
INTENT(INOUT) :: v
680 INTEGER,
INTENT(IN) :: nmax
681 REAL(kind=
dp),
INTENT(IN) :: zetp, zetq, zetw, rho, rac2, omega, &
686 REAL(kind=
dp) :: f0, r, t
687 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: f
691 ALLOCATE (f(nmax + 1))
693 r = r_cutoff*sqrt(rho)
695 f0 = 2.0_dp*sqrt(
pi**5*zetw)*zetp*zetq
700 CALL t_c_g0_n(f, use_gamma, r, t, nmax)
701 IF (use_gamma)
CALL fgamma(nmax, t, f)
Calculation of integrals over Cartesian Gaussian-type functions for different r12 operators: 1/r12,...
subroutine, public cps_verfc2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
Calculation of verfc integrals for s-function, i.e, [s|erfc(omega*r12)/r12|s], and the auxiliary inte...
subroutine, public cps_vgauss2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
Calculation of vgauss integrals for s-function, i.e, [s|exp(-omega*r12^2)/r12|s], and the auxiliary i...
subroutine, public cps_gauss2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
Calculation of gauss integrals for s-function, i.e, [s|exp(-omega*r12^2)|s], and the auxiliary integr...
subroutine, public cps_coulomb2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
Calculation of Coulomb integrals for s-function, i.e, [s|1/r12|s], and the auxiliary integrals [s|1/r...
subroutine, public cps_truncated2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
Calculation of truncated Coulomb integrals for s-function, i.e, [s|TC|s] where TC = 1/r12 if r12 <= r...
subroutine, public cps_verf2(v, nmax, zetp, zetq, zetw, rho, rac2, omega, r_cutoff)
Calculation of verf integrals for s-function, i.e, [s|erf(omega*r12)/r12|s], and the auxiliary integr...
subroutine, public operator2(cps_operator2, la_max, npgfa, zeta, la_min, lc_max, npgfc, zetc, lc_min, omega, r_cutoff, rac, rac2, vac, v, maxder, vac_plus)
Calculation of the primitive two-center integrals over Cartesian Gaussian-type functions for differen...
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
subroutine, public fgamma_0(nmax, t, f)
Calculation of the incomplete Gamma function F(t) for multicenter integrals over Gaussian functions....
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public pi
real(kind=dp), dimension(0:maxfac), parameter, public fac
Provides Cartesian and spherical orbital pointers and indices.
integer, dimension(:), allocatable, public ncoset
integer, dimension(:, :, :), allocatable, public coset
This module computes the basic integrals for the truncated coulomb operator.
subroutine, public t_c_g0_n(RES, use_gamma, R, T, NDERIV)
...
integer function, public get_lmax_init()
Returns the value of nderiv_init so that one can check if opening the potential file is worhtwhile.