74 complex(wp) function icca (Z, a, b, k, l, kappa, lambda)
result (val)
80 integer,
intent(in) :: lambda, l, b
81 real(wp),
intent(in) :: z, a, kappa, k
83 integer,
parameter :: mmax = 15
84 logical,
parameter :: use_levin = .true.
85 real(wp),
parameter ::
epsrel = 1e-6
88 real(wp) :: ff, ffp, gf, gfp, fn, fnp, gn, gnp, r, dr, a0
89 complex(wp) :: romb(0:mmax, 0:mmax), res
97 if (lambda == 0 .and. l == 0)
then
98 a0 =
pi/(2*min(kappa, k))
100 a0 = (sqrt(kappa**2*max(lambda, l)*max(lambda + 1, l + 1) + z**2) - z)/kappa**2
106 val =
levin_adapt(z, a0, a, 0._wp, b, 0, +1, l, lambda, cmplx(k, 0, wp), cmplx(kappa, 0, wp))
115 call coul(z, lambda, kappa**2/2, a0, fn, fnp, gn, gnp)
116 call coul(z, l, k**2/2, a0, ff, ffp, gf, gfp)
119 res = ff * a0**b * (gn +
imu*fn)/2
124 richardson_iterations:
do m = 1, mmax
133 call coul(z, lambda, kappa**2/2, r, fn, fnp, gn, gnp)
134 call coul(z, l, k**2/2, r, ff, ffp, gf, gfp)
135 res = res + r**b * ff * (gn +
imu*fn)
139 romb(m, 0) = val + res*dr
142 romb(i, n) = (4**n*romb(i, n - 1) - romb(i - 1, n - 1))/(4**n - 1)
148 if (abs(romb(m, m) - romb(m - 1, m - 1)) <
epsrel*abs(romb(m, m)))
then
150 exit richardson_iterations
156 print
'(a,i0,a)',
'Warning: Romberg quadrature failed to converge in ', mmax,
' subdivisions.'
160 end do richardson_iterations
176 complex(wp) function i2cca (Z, a, kf, lf, kn, ln, ki, li)
result (val)
180 real(wp),
intent(in) :: z, a, ki, kn, kf
181 integer,
intent(in) :: li, ln, lf
183 real(wp),
parameter :: c = 0
184 integer,
parameter :: mmax = 13
186 real(wp),
allocatable :: ff(:), fn(:)
187 complex(wp),
allocatable :: hn(:), hi(:)
189 integer :: i, j, qi, qj, m, n, stride
190 complex(wp) :: hlf, hln, hli, romb(0:mmax, 0:mmax)
191 real(wp) :: dr, ri, rj, wt
197 allocate (ff(2**mmax), fn(2**mmax), hn(2**mmax), hi(2**mmax))
202 hlf = coulh(z, +1, lf, kf*kf/2, ri)
203 hln = coulh(z, +1, ln, kn*kn/2, ri)
204 hli = coulh(z, +1, li, ki*ki/2, ri)
218 stride = 2**(mmax - m)
228 if (mod(i, 2) /= 0 .or. mod(j, 2) /= 0)
then
229 wt = 1._wp/(1 + merge(1, 0, i == n) + merge(1, 0, j == n))
230 val = val + wt*ff(qi)*ri*fn(qi)*hn(qj)*rj*hi(qj)
232 val = val + wt*ff(qj)*rj*hn(qj)*fn(qi)*ri*hi(qi)
239 romb(m, 0) = val*dr*dr
242 romb(i, n) = (4**n*romb(i, n - 1) - romb(i - 1, n - 1))/(4**n - 1)
248 val = -2/kn*romb(mmax, mmax)
262 complex(wp) function acca (Z, a, b, k, l, kappa, lambda)
result (val)
267 integer,
intent(in) :: lambda, l, b
268 real(wp),
intent(in) :: z, a, kappa, k
270 real(wp),
parameter :: c = 0
272 val = (
nested_coul_integ(z, a, c, 1, [ b ], [+1, +1], [l, lambda], [cmplx(k, 0, wp), cmplx(kappa, 0, wp)]) &
273 -
nested_coul_integ(z, a, c, 1, [ b ], [-1, +1], [l, lambda], [cmplx(k, 0, wp), cmplx(kappa, 0, wp)])) / (2*
imu)
288 complex(wp) function a2cca (Z, a, kf, lf, kn, ln, ki, li)
result (val)
293 integer,
intent(in) :: li, ln, lf
294 real(wp),
intent(in) :: z, ki, kn, kf, a
296 real(wp),
parameter :: c = 0
301 ks(1) = cmplx(ki, 0, wp); ls(1) = li
302 ks(2) = cmplx(kn, 0, wp); ls(2) = ln
303 ks(3) = cmplx(kf, 0, wp); ls(3) = lf
305 val = (
nested_cgreen_integ(z, a, a, c, 2, +1, +1, [ 1, 1 ], ls, ks) &
306 -
nested_cgreen_integ(z, a, a, c, 2, +1, -1, [ 1, 1 ], ls, ks)) / (2*
imu)
361 complex(wp) function i2cc (Z, kf, lf, kn, ln, ki, li)
result (val)
366 integer,
intent(in) :: li, ln, lf
367 real(wp),
intent(in) :: z, ki, kn, kf
369 real(wp),
parameter :: a = 200, b = 250, c = 0
370 logical,
parameter :: debug = .false.
372 complex(wp) :: i2cca_fni, a2cca_fni, icca_fn, iccb_fn, icca_ni, iccb_ni, acca_fn, acca_ni, a2ccb_fni, accb_fn, accb_ni
373 complex(wp) :: i1, i2, i3, i4
375 i2cca_fni = i2cca(z, a, kf, lf, kn, ln, ki, li)
376 a2cca_fni = a2cca(z, a, kf, lf, kn, ln, ki, li)
378 icca_fn = aimag(icca(z, a, 1, kf, lf, kn, ln))
379 icca_ni = icca(z, a, 1, kn, ln, ki, li)
381 acca_fn = (
nested_coul_integ(z, a, c, 1, [ 1 ], [+1, +1], [ln, lf], [cmplx(kn, 0, wp), cmplx(kf, 0, wp)]) &
382 -
nested_coul_integ(z, a, c, 1, [ 1 ], [+1, -1], [ln, lf], [cmplx(kn, 0, wp), cmplx(kf, 0, wp)])) / (2*
imu)
383 acca_ni =
nested_coul_integ(z, a, c, 1, [ 1 ], [+1, +1], [li, ln], [cmplx(ki, 0, wp), cmplx(kn, 0, wp)])
387 i3 = -2/kn*acca_fn*icca_ni
388 i4 = -2/kn*icca_fn*acca_ni
391 iccb_fn = aimag(icca(z, b, 1, kf, lf, kn, ln))
392 iccb_ni = icca(z, b, 1, kn, ln, ki, li)
393 a2ccb_fni = a2cca(z, b, kf, lf, kn, ln, ki, li)
394 accb_fn = (
nested_coul_integ(z, b, c, 1, [ 1 ], [+1, +1], [ln, lf], [cmplx(kn, 0, wp), cmplx(kf, 0, wp)]) &
395 -
nested_coul_integ(z, b, c, 1, [ 1 ], [+1, -1], [ln, lf], [cmplx(kn, 0, wp), cmplx(kf, 0, wp)])) / (2*
imu)
396 accb_ni =
nested_coul_integ(z, b, c, 1, [ 1 ], [+1, +1], [li, ln], [cmplx(ki, 0, wp), cmplx(kn, 0, wp)])
397 i2 = a2cca_fni - a2ccb_fni + 2/kn*(iccb_fn - icca_fn)*accb_ni + 2/kn*(iccb_ni - icca_ni)*accb_fn
398 i3 = -2/kn*(acca_fn - accb_fn)*icca_ni
399 i4 = -2/kn*icca_fn*(acca_ni - accb_ni)
402 val = i1 + i2 + i3 + i4
405 print
'(a)',
'Calculating I2cc'
406 print
'(4x,f7.4,i4)', ki, li
407 print
'(4x,f7.4,i4)', kn, ln
408 print
'(4x,f7.4,i4)', kf, lf
409 print
'(4x,a,*(e25.15))',
'I1 ', i1
410 print
'(4x,a,*(e25.15))',
'I2 ', i2
411 print
'(4x,a,*(e25.15))',
'I3 ', i3
412 print
'(4x,a,*(e25.15))',
'I4 ', i4
413 print
'(4x,a,*(e25.15))',
'val ', val
530 complex(wp) function m2_h1s (b, ln, kn, lf, kf)
result (M2)
536 real(wp),
intent(in) :: kn, kf
537 integer,
intent(in) :: b, ln, lf
539 real(wp),
parameter :: a = 200
540 real(wp),
parameter :: c = 0
541 integer,
parameter :: mmax = 13
543 real(wp),
allocatable :: flf(:), f1n(:), g1n(:), p1s(:)
545 integer :: i, j, qi, qj, m, n, stride
546 complex(wp) :: ia, ii, ij, hlf, h1n, romb(0:mmax, 0:mmax)
547 real(wp) :: ib, dr, ri, rj, wt, nu, z = 1
552 ia = (
nested_coul_integ(z, a, c, 1, [ b ], [+1, +1], [lf, ln], [cmplx(kf, 0, wp), cmplx(kn, 0, wp)]) &
553 -
nested_coul_integ(z, a, c, 1, [ b ], [-1, +1], [lf, ln], [cmplx(kf, 0, wp), cmplx(kn, 0, wp)])) / (2*
imu)
561 allocate (flf(2**mmax), f1n(2**mmax), g1n(2**mmax), p1s(2**mmax))
566 hlf = coulh(z, +1, lf, kf*kf/2, ri)
567 h1n = coulh(z, +1, ln, kn*kn/2, ri)
571 p1s(i) = 2 * ri**ln * exp(-nu*ri)
581 stride = 2**(mmax - m)
591 if (mod(i, 2) /= 0 .or. mod(j, 2) /= 0)
then
592 wt = 1._wp/(1 + merge(1, 0, i == n) + merge(1, 0, j == n))
593 ii = ii + wt*flf(qi)*ri**b*f1n(qi)*(g1n(qj) +
imu*f1n(qj))*rj*p1s(qj)
595 ii = ii + wt*flf(qj)*rj**b*(g1n(qj) +
imu*f1n(qj))*f1n(qi)*ri*p1s(qi)
602 romb(m, 0) = ii*dr*dr
605 romb(i, n) = (4**n*romb(i, n - 1) - romb(i - 1, n - 1))/(4**n - 1)
611 ii = romb(mmax, mmax)
612 m2 =
imu**(-lf) * exp(
imu*
cphase(z, lf, kf)) * (ii + ij)