72 integer,
intent(in) :: n, m(0:n-1), s(0:2*n-1)
73 real(wp),
intent(in) :: z, a, c
74 complex(wp),
intent(in) :: k(0:2*n-1)
78 complex(wp) :: i(0:n*(npp+1)), f(0:n*(npp+1)-1), fg(0:n*(npp+1)-1), g(0:(n+1)*(npp+1)-1), j(0:n*(npp+1)-1)
79 complex(wp) :: t(0:npp, 0:n*(npp + 1)-1)
81 real(wp) :: b(0:n*(npp+1)-1, 0:n*(npp+1))
84 integer :: o, p, q, lvl
107 do p = lbound(b, 1), ubound(b, 1)
110 b(p, q) = b(p - 1, q - 1) + b(p - 1, q)
134 do p = 1, (n - lvl)*(npp + 1) - 1
135 f(p) = (m(lvl) + 1 - p) * f(p - 1) / a
141 do p = 0, (n - lvl)*(npp + 1) - 1
144 fg(p) = fg(p) + b(p,q) * f(p - q) * i(q)
154 u = u + s(2*lvl+1)*k(2*lvl+1) + s(2*lvl+0)*k(2*lvl+0) +
imu*c
155 v = v + z*s(2*lvl+1)/abs(k(2*lvl+1)) + z*s(2*lvl+0)/abs(k(2*lvl+0))
157 g(0) =
imu*a / (u*a + v)
158 g(1) =
imu*v / ((u*a + v)*(u*a + v))
160 do p = 2, (n - lvl + 1)*(npp + 1) - 1
161 g(p) = g(p - 1) * (-p) * u / (u*a + v)
167 do p = 0, (n - lvl)*(npp + 1) - 1
172 do p = 0, (n - lvl)*(npp + 1) - o - 1
175 t(o, p) = t(o, p) + b(p + 1, q) * g(p + 1 - q) * t(o - 1, q)
182 do p = 0, (n - lvl - 1)*(npp + 1)
185 j(p) = j(p) + t(o, p)
191 do p = 0, (n - lvl - 1)*(npp + 1)
194 i(p) = i(p) + b(p, q) * g(p - q) * j(q)
232 integer,
intent(in) :: n, m(1:n), s(1:2*n), l(1:2*n)
233 real(wp),
intent(in) :: z, a, c
234 complex(wp),
intent(in) :: k(1:2*n)
236 integer :: nn(2*n), ms(n), p
237 complex(wp) :: an(2*n), bn(2*n), factor(2*n)
240 real(wp) :: total_phase, total_exponent, kr, ki
241 complex(wp) :: integ, err
251 an(p) = 1 + l(p) - z*s(p)*
imu/k(p)
252 bn(p) = -l(p) - z*s(p)*
imu/k(p)
256 do while (.not. at_end)
260 ms(p) = m(p) - nn(2*p-1) - nn(2*p-0)
268 integ = integ * factor(p)
282 factor(p) = factor(p) * (an(p) + nn(p) - 1) * (bn(p) + nn(p) - 1) / (2 *
imu * s(p) * nn(p) * k(p))
298 total_phase = total_phase + s(p)*(kr*a + z*log(2*kr*a)/kr -
pi*l(p)/2 +
cphase(z, l(p), kr))
301 total_exponent = total_exponent + s(p)*(-ki*a + z*log(2*ki*a)/ki)
306 val = val * cmplx(cos(total_phase), sin(total_phase), wp) * exp(total_exponent - n*c*a)
357 use ieee_arithmetic,
only: ieee_value, ieee_quiet_nan
358 use mpi_gbl,
only: mpi_xermsg
364 integer,
intent(in) :: n, sa, sb, m(:), l(:)
365 real(wp),
intent(in) :: z, a, c, r0
366 complex(wp),
intent(in) :: k(:)
369 integer :: order(n), mp(n), lp(2*n), sp(2*n), p, signs
370 real(wp) :: b, rs(n), f(2, 2), g(2, 2)
371 complex(wp) :: kp(2*n), err, integ, ix, ia, h(2, 2)
373 character(len=100) :: msg
380 if (
ion_ion_analytic .and. n == 1 .and. m(1) == 0 .and. l(1) == l(2) .and. aimag(k(1)) == 0 .and. aimag(k(2)) == 0)
then
381 call coul(z, l(1), real(k(1))**2/2, a, f(1,1), f(2,1), g(1,1), g(2,1))
382 call coul(z, l(2), real(k(2))**2/2, a, f(1,2), f(2,2), g(1,2), g(2,2))
383 h(:, 1) = cmplx(g(:, 1), sa*f(:, 1), wp)
384 h(:, 2) = cmplx(g(:, 2), sb*f(:, 2), wp)
385 val = (h(2,2)*h(1,1) - h(1,2)*h(2,1))/(real(k(2))**2 - real(k(1))**2)
390 if (a < r0 .and. n == 1)
then
394 if (abs(ix) > 1e-10 .and. abs(ia - ix) >
coultol * abs(ix))
then
405 if (abs(ix) > 1e-10 .and. abs(ia - ix) > abs(ix))
then
409 write (*,
'(5x,A,3(I0,1x))', advance =
'no')
'Warning: Giving up Coul-Green integ '
410 write (*,
'(3(A,I0,SP))', advance =
'no')
'm = ', m,
', sa = ', sa,
', sb = ', sb
411 write (*,
'(A,*(I0,","))', advance =
'no')
', l = ', l
412 write (*,
'(A,SP,*(F0.4,","))', advance =
'no')
' E = ', real(k**2/2, wp)
413 write (*,
'(SP,2(A,2E10.4),A)')
' Ix = ', ix,
'i, Ia = ', ia,
'i'
432 do signs = 0, 2**(n - 1) - 1
459 if (order(p) > 1) sp(2*p - 1) = merge(merge(-1, +1, btest(signs, order(p) - 2)), +1, acc(order(p) - 1))
460 if (order(p) < n) sp(2*p - 0) = merge(merge(-1, +1, btest(signs, order(p) - 1)), +1, acc(order(p) + 1))
462 acc(order(p)) = .true.
464 kp(2*p - 1) = k(order(p) - 0)
465 kp(2*p - 0) = k(order(p) + 1)
467 lp(2*p - 1) = l(order(p) - 0)
468 lp(2*p - 0) = l(order(p) + 1)
484 val = val *
imu / k(p)
491 call nested_cgreen_correct_romberg(z, a, b, c, n, sa, sb, m, l, k, val)
493 call nested_cgreen_correct_levin(z, a, b, c, n, sa, sb, m, l, k, val)
495 write (msg,
'(a,i0)')
'Unknown numerical integration algorithm ',
num_integ_algo
496 call mpi_xermsg(
'multidip_integ',
'nested_cgreen_integ', trim(msg), 1, 1)