53 REAL(kind=
dp),
INTENT(IN) :: alpha
54 INTEGER,
INTENT(IN) ::
degree
56 REAL(kind=
dp),
INTENT(IN),
OPTIONAL :: eps
59 REAL(kind=
dp),
ALLOCATABLE :: short_range(:)
62 cpassert(alpha > 0.0_dp)
63 cpassert(
SIZE(pot%r) ==
SIZE(pot%vlocal))
64 cpassert(
SIZE(pot%r) >= 3)
65 IF (
PRESENT(eps)) local%eps = eps
66 cpassert(local%eps >= 0.0_dp)
67 ALLOCATE (short_range(
SIZE(pot%vlocal)))
68 short_range(:) = pot%vlocal
70 IF (pot%r(i) > 0.0_dp)
THEN
71 short_range(i) = short_range(i) + pot%zion*erf(sqrt(alpha)*pot%r(i))/pot%r(i)
73 short_range(i) = short_range(i) + 2.0_dp*pot%zion*sqrt(alpha/
pi)
77 DO i =
SIZE(short_range), 1, -1
78 IF (abs(short_range(i)) > local%eps)
THEN
84 scalar%number_of_proj = 1
85 ALLOCATE (scalar%r(n), scalar%rab(n), scalar%lbeta(1))
86 scalar%r(:) = pot%r(:n)
87 scalar%rab(:) = pot%rab(:n)
89 ALLOCATE (scalar%beta(n, 1), scalar%dion(1, 1))
91 scalar%beta(:, 1) = sqrt(
fourpi)*short_range(:n)
96 local%radial%radius = 0.0_dp
97 IF (last > 0) local%radial%radius = pot%r(last)
116 INTEGER,
INTENT(IN) :: la
117 REAL(kind=
dp),
INTENT(IN) :: alpha(:)
118 INTEGER,
INTENT(IN) :: lb
119 REAL(kind=
dp),
INTENT(IN) :: beta(:), rab(3), rac(3)
120 REAL(kind=
dp),
INTENT(OUT) :: v(:, :)
121 REAL(kind=
dp),
INTENT(OUT),
OPTIONAL :: da(:, :, :), db(:, :, :)
123 INTEGER :: a, aa, axis, b, bb, da_max, db_max, &
124 degree, i, ia, ib, ix, iy, iz, j, k, &
125 pa(3), pb(3), shifted(3)
126 REAL(kind=
dp) :: center(3), p, pref, shift_a(3), &
128 REAL(kind=
dp),
ALLOCATABLE :: moments(:, :, :), &
129 polynomial(:, :, :, :), work(:, :)
131 cpassert(la >= 0 .AND. lb >= 0)
132 cpassert(all(alpha > 0.0_dp) .AND. all(beta > 0.0_dp))
133 cpassert(
SIZE(v, 1) ==
SIZE(alpha)*
ncoset(la))
134 cpassert(
SIZE(v, 2) ==
SIZE(beta)*
ncoset(lb))
139 IF (
PRESENT(da))
THEN
140 cpassert(all(shape(da) == [
SIZE(v, 1),
SIZE(v, 2), 3]))
144 IF (
PRESENT(db))
THEN
145 cpassert(all(shape(db) == [
SIZE(v, 1),
SIZE(v, 2), 3]))
152 DO ib = 1,
SIZE(beta)
153 DO ia = 1,
SIZE(alpha)
154 p = alpha(ia) + beta(ib)
155 shift_a = beta(ib)*rab/p
156 shift_b = -alpha(ia)*rab/p
157 center = rac - shift_a
158 pref = exp(-alpha(ia)*beta(ib)/p*sum(rab**2))
159 IF (pref == 0.0_dp) cycle
164 DO b = 0, min(db_max,
degree - a)
167 polynomial(a, b, i + j, axis) = polynomial(a, b, i + j, axis) &
168 +
binomial(a, i)*
binomial(b, j)*shift_a(axis)**(a - i)*shift_b(axis)**(b - j)
178 IF (sum(pa + pb) >
degree) cycle
180 DO iz = 0, pa(3) + pb(3)
181 DO iy = 0, pa(2) + pb(2)
182 DO ix = 0, pa(1) + pb(1)
183 k =
coset(ix, iy, iz)
184 value =
value + polynomial(pa(1), pb(1), ix, 1)*polynomial(pa(2), pb(2), iy, 2) &
185 *polynomial(pa(3), pb(3), iz, 3)*moments(k, 1, 1)
189 work(a, b) = pref*
value
194 bb = (ib - 1)*
ncoset(lb) + b
197 aa = (ia - 1)*
ncoset(la) + a
198 v(aa, bb) = work(a, b)
200 IF (
PRESENT(da))
THEN
202 shifted(axis) = shifted(axis) + 1
203 da(aa, bb, axis) = 2*alpha(ia)*work(
coset(shifted(1), shifted(2), shifted(3)), b)
204 IF (pa(axis) > 0)
THEN
206 shifted(axis) = shifted(axis) - 1
207 da(aa, bb, axis) = da(aa, bb, axis) &
208 - pa(axis)*work(
coset(shifted(1), shifted(2), shifted(3)), b)
211 IF (
PRESENT(db))
THEN
213 shifted(axis) = shifted(axis) + 1
214 db(aa, bb, axis) = 2*beta(ib)*work(a,
coset(shifted(1), shifted(2), shifted(3)))
215 IF (pb(axis) > 0)
THEN
217 shifted(axis) = shifted(axis) - 1
218 db(aa, bb, axis) = db(aa, bb, axis) &
219 - pb(axis)*work(a,
coset(shifted(1), shifted(2), shifted(3)))