28 use precisn_gbl,
only: wp
58 subroutine nested_cgreen_correct_romberg (Z, a, b, c, N, sa, sb, m, l, k, v)
63 integer,
intent(in) :: N, sa, sb, m(:), l(:)
64 real(wp),
intent(in) :: Z, a, b, c
65 complex(wp),
intent(in) :: k(:)
66 complex(wp),
intent(inout) :: v
71 complex(wp) :: romb(max_romb_level)
72 complex(wp) :: integ, y, ya, yb, error, prev
77 romb(1) = h * (ya + yb) / 2
79 do level = 2, max_romb_level
88 do i = 1, 2**(level - 2)
93 romb(level) = romb(level - 1)/2 + h*integ
96 do i = level - 1, 1, -1
97 romb(i) = (4**(level - 1) * romb(i + 1) - romb(i)) / (4**(level - 1) - 1)
101 if (.not. romb(1) == romb(1))
then
102 print
'(a)',
'WARNING: NaN encountered during Romberg quadrature'
107 if (abs(romb(1) - prev) <=
epsrel * (abs(romb(1)) + abs(prev)))
then
113 if (level > max_romb_level)
then
114 print
'(A,I0,A)',
'WARNING: Romberg quadrature did not converge in ', max_romb_level,
' subdivisions'
144 use mpi_gbl,
only: mpi_xermsg
147 integer,
intent(in) :: n, sa, sb, m(:), l(:)
148 real(wp),
intent(in) :: z, c, rs(:)
149 complex(wp),
intent(in) :: k(:)
150 logical,
intent(in) :: asy
153 complex(wp) :: h1, h2
155 ek = real(k(1:n+1)**2, wp)/2
159 call mpi_xermsg(
'multidip_romberg',
'nested_cgreen_eval',
'nested_cgreen_eval not implemented for higher orders', 1, 1)
163 h1 =
coulh_asy(z, sa, l(1), ek(1), rs(1))
164 h2 =
coulh_asy(z, sb, l(2), ek(2), rs(1))
166 h1 =
coulh(z, sa, l(1), ek(1), rs(1))
167 h2 =
coulh(z, sb, l(2), ek(2), rs(1))
170 val = h2 * rs(1)**m(1) * exp(-c*rs(1)) * h1
Hard-coded parameters of MULTIDIP.
integer, parameter max_romb_level
Maximal nesting level for Romberg integration.
real(wp) epsrel
Romberg integration relative tolerance for convergence.
Romberg quadrature for numerical integration.
complex(wp) function nested_cgreen_eval(Z, c, N, sa, sb, m, l, k, rs, asy)
Evaluate the Coulomb-Green's integrand.
subroutine nested_cgreen_correct_romberg(Z, a, b, c, N, sa, sb, m, l, k, v)
Numerically correct asymptotic approximation of the Coulomb-Green integral (Romberg integration)
Special functions and objects used by MULTIDIP.
subroutine kahan_add(X, dX, err)
Compensated summation.
complex(wp) function coulh(Z, s, l, Ek, r)
Coulomb-Hankel function.
complex(wp) function coulh_asy(Z, s, l, Ek, r)
Coulomb-Hankel function (asymptotic form)