14 #include "./base/base_uses.f90"
29 FUNCTION ipmpar(i)
RESULT(fn_val)
81 INTEGER,
INTENT(IN) :: i
96 fn_val = minexponent(1.0)
98 fn_val = maxexponent(1.0)
100 fn_val = digits(1.0e0_dp)
102 fn_val = minexponent(1.0e0_dp)
104 fn_val = maxexponent(1.0e0_dp)
106 cpabort(
"unknown case")
116 FUNCTION dpmpar(i)
RESULT(fn_val)
132 INTEGER,
INTENT(IN) :: i
135 REAL(dp),
PARAMETER :: one = 1._dp
141 fn_val = epsilon(one)
155 FUNCTION dxparg(l)
RESULT(fn_val)
165 INTEGER,
INTENT(IN) :: l
168 REAL(dp),
PARAMETER :: one = 1._dp
173 fn_val = log(huge(one))
175 fn_val = log(tiny(one))
185 FUNCTION alnrel(a)
RESULT(fn_val)
189 REAL(dp),
INTENT(IN) :: a
192 REAL(dp),
PARAMETER :: half = 0.5e0_dp, one = 1.e0_dp, p1 = -.129418923021993e+01_dp, &
193 p2 = .405303492862024e+00_dp, p3 = -.178874546012214e-01_dp, &
194 q1 = -.162752256355323e+01_dp, q2 = .747811014037616e+00_dp, &
195 q3 = -.845104217945565e-01_dp, two = 2.e0_dp, zero = 0.e0_dp
197 REAL(dp) :: t, t2, w, x
201 IF (abs(a) <= 0.375e0_dp)
THEN
204 w = (((p3*t2 + p2)*t2 + p1)*t2 + one)/(((q3*t2 + q2)*t2 + q1)*t2 + one)
208 IF (a < zero) x = (a + half) + half
219 FUNCTION gam1(a)
RESULT(fn_val)
223 REAL(dp),
INTENT(IN) :: a
226 REAL(dp),
PARAMETER :: p(7) = (/.577215664901533e+00_dp, -.409078193005776e+00_dp, &
227 -.230975380857675e+00_dp, .597275330452234e-01_dp, .766968181649490e-02_dp, &
228 -.514889771323592e-02_dp, .589597428611429e-03_dp/), q(5) = (/.100000000000000e+01_dp, &
229 .427569613095214e+00_dp, .158451672430138e+00_dp, .261132021441447e-01_dp, &
230 .423244297896961e-02_dp/), r(9) = (/-.422784335098468e+00_dp, -.771330383816272e+00_dp, &
231 -.244757765222226e+00_dp, .118378989872749e+00_dp, .930357293360349e-03_dp, &
232 -.118290993445146e-01_dp, .223047661158249e-02_dp, .266505979058923e-03_dp, &
233 -.132674909766242e-03_dp/)
234 REAL(dp),
PARAMETER :: s1 = .273076135303957e+00_dp, s2 = .559398236957378e-01_dp
236 REAL(dp) :: bot, d, t, top, w
240 IF (d > 0.0e0_dp) t = d - 0.5e0_dp
242 IF (t > 0.e0_dp)
THEN
243 top = (((((p(7)*t + p(6))*t + p(5))*t + p(4))*t + p(3))*t + p(2))*t + p(1)
244 bot = (((q(5)*t + q(4))*t + q(3))*t + q(2))*t + 1.0e0_dp
246 IF (d > 0.0e0_dp)
THEN
247 fn_val = (t/a)*((w - 0.5e0_dp) - 0.5e0_dp)
251 ELSE IF (t < 0.e0_dp)
THEN
252 top = (((((((r(9)*t + r(8))*t + r(7))*t + r(6))*t + r(5))*t &
253 + r(4))*t + r(3))*t + r(2))*t + r(1)
254 bot = (s2*t + s1)*t + 1.0e0_dp
256 IF (d > 0.0e0_dp)
THEN
259 fn_val = a*((w + 0.5e0_dp) + 0.5e0_dp)
273 FUNCTION algdiv(a, b)
RESULT(fn_val)
284 REAL(dp),
INTENT(IN) :: a, b
287 REAL(dp),
PARAMETER :: c0 = .833333333333333e-01_dp, c1 = -.277777777760991e-02_dp, &
288 c2 = .793650666825390e-03_dp, c3 = -.595202931351870e-03_dp, &
289 c4 = .837308034031215e-03_dp, c5 = -.165322962780713e-02_dp
291 REAL(dp) :: c, d, h, s11, s3, s5, s7, s9, t, u, v, &
296 c = 1.0e0_dp/(1.0e0_dp + h)
298 d = a + (b - 0.5e0_dp)
302 x = 1.0e0_dp/(1.0e0_dp + h)
303 d = b + (a - 0.5e0_dp)
309 s3 = 1.0e0_dp + (x + x2)
310 s5 = 1.0e0_dp + (x + x2*s3)
311 s7 = 1.0e0_dp + (x + x2*s5)
312 s9 = 1.0e0_dp + (x + x2*s7)
313 s11 = 1.0e0_dp + (x + x2*s9)
318 w = ((((c5*s11*t + c4*s9)*t + c3*s7)*t + c2*s5)*t + c1*s3)*t + c0
324 v = a*(log(b) - 1.0e0_dp)
338 FUNCTION rexp(x)
RESULT(fn_val)
342 REAL(dp),
INTENT(IN) :: x
345 REAL(dp),
PARAMETER :: p1 = .914041914819518e-09_dp, p2 = .238082361044469e-01_dp, &
346 q1 = -.499999999085958e+00_dp, q2 = .107141568980644e+00_dp, &
347 q3 = -.119041179760821e-01_dp, q4 = .595130811860248e-03_dp
351 IF (abs(x) < 0.15e0_dp)
THEN
352 fn_val = x*(((p2*x + p1)*x + 1.0e0_dp)/((((q4*x + q3)*x + q2)*x + q1)*x + 1.0e0_dp))
356 IF (x < 0.0e0_dp)
THEN
357 IF (x > -37.0e0_dp)
THEN
358 fn_val = (exp(x) - 0.5e0_dp) - 0.5e0_dp
364 fn_val = e*(0.5e0_dp + (0.5e0_dp - 1.0e0_dp/e))
379 SUBROUTINE bgrat(a, b, x, y, w, eps, ierr)
386 REAL(dp),
INTENT(IN) :: a, b, x, y
387 REAL(dp),
INTENT(INOUT) :: w
388 REAL(dp),
INTENT(IN) :: eps
389 INTEGER,
INTENT(OUT) :: ierr
391 REAL(dp),
PARAMETER :: half = 0.5e0_dp, one = 1.e0_dp, &
392 quarter = 0.25e0_dp, zero = 0.e0_dp
395 REAL(dp) :: bm1, bp2n, c(30), cn, coef, d(30), dj, &
396 j, l, lnx, n2, nu, q, r, s, sum, t, &
399 bm1 = (b - half) - half
401 IF (y > 0.375e0_dp)
THEN
407 IF (b*z == zero)
THEN
416 r = b*(one + gam1(b))*exp(b*log(z))
417 r = r*exp(a*lnx)*exp(half*bm1*lnx)
418 u = algdiv(b, a) + b*log(nu)
425 CALL grat1(b, z, r, q=q, eps=eps)
428 v = quarter*(one/nu)**2
438 j = (bp2n*(bp2n + one)*j + (z + bp2n + one)*t)*v
441 cn = cn/(n2*(n2 + one))
444 IF (.NOT. (n == 1))
THEN
447 s = s + coef*c(i)*d(n - i)
454 IF (sum <= zero)
THEN
459 IF (abs(dj) <= tol*(sum + l))
EXIT
478 SUBROUTINE grat1(a, x, r, p, q, eps)
483 REAL(dp),
INTENT(IN) :: a, x, r
484 REAL(dp),
INTENT(OUT),
OPTIONAL :: p, q
485 REAL(dp),
INTENT(IN) :: eps
487 REAL(dp),
PARAMETER :: half = 0.5e0_dp, one = 1.e0_dp, &
488 quarter = 0.25e0_dp, three = 3.e0_dp, &
489 two = 2.e0_dp, zero = 0.e0_dp
491 REAL(dp) :: a2n, a2nm1, an, b2n, b2nm1, c, g, h, j, &
492 l, pp, qq, sum, t, tol, w, z
494 IF (a*x == zero)
THEN
502 IF (
PRESENT(p)) p = pp
503 IF (
PRESENT(q)) q = qq
507 IF (x < quarter)
THEN
509 qq = half + (half - pp)
512 pp = half + (half - qq)
514 IF (
PRESENT(p)) p = pp
515 IF (
PRESENT(q)) q = qq
518 IF (x < 1.1e0_dp)
THEN
524 tol = three*eps/(a + one)
529 DO WHILE (abs(t) > tol)
535 j = a*x*((sum/6.0e0_dp - half/(a + two))*x + one/(a + one))
540 IF ((x < quarter .AND. z > -.13394e0_dp) .OR. a < x/2.59e0_dp)
THEN
542 qq = ((half + (half + l))*j - l)*g - h
547 pp = half + (half - qq)
551 pp = w*g*(half + (half - j))
552 qq = half + (half - pp)
564 a2nm1 = x*a2n + c*a2nm1
565 b2nm1 = x*b2n + c*b2nm1
567 a2n = a2nm1 + (c - a)*a2n
568 b2n = b2nm1 + (c - a)*b2n
573 IF (abs(a2n - a2nm1/b2nm1) < tol*a2n)
EXIT
577 pp = half + (half - qq)
580 IF (
PRESENT(p)) p = pp
581 IF (
PRESENT(q)) q = qq
591 FUNCTION esum(mu, x)
RESULT(fn_val)
595 INTEGER,
INTENT(IN) :: mu
596 REAL(dp),
INTENT(IN) :: x
601 IF (x > 0.0e0_dp)
THEN
602 IF (mu > 0 .OR. mu + x < 0.0_dp)
THEN
604 fn_val = exp(w)*exp(x)
610 IF (mu < 0 .OR. mu + x < 0.0_dp)
THEN
612 fn_val = exp(w)*exp(x)
626 FUNCTION rlog1(x)
RESULT(fn_val)
633 REAL(dp),
INTENT(IN) :: x
636 REAL(dp),
PARAMETER :: a = .566749439387324e-01_dp, b = .456512608815524e-01_dp, &
637 p0 = .333333333333333e+00_dp, p1 = -.224696413112536e+00_dp, &
638 p2 = .620886815375787e-02_dp, q1 = -.127408923933623e+01_dp, q2 = .354508718369557e+00_dp
640 REAL(dp) :: r, t, u, up2, w, w1
642 IF (x < -0.39e0_dp .OR. x > 0.57e0_dp)
THEN
643 w = (x + 0.5e0_dp) + 0.5e0_dp
650 IF (x < -0.18e0_dp)
THEN
651 u = (x + 0.3e0_dp)/0.7e0_dp
654 ELSEIF (x > 0.18e0_dp)
THEN
669 w = ((p2*t + p1)*t + p0)/((q2*t + q1)*t + 1.0e0_dp)
670 fn_val = r*(u - 2.0e0_dp*t*w) + w1
679 FUNCTION gamln1(a)
RESULT(fn_val)
683 REAL(dp),
INTENT(IN) :: a
686 REAL(dp),
PARAMETER :: p0 = .577215664901533e+00_dp, p1 = .844203922187225e+00_dp, &
687 p2 = -.168860593646662e+00_dp, p3 = -.780427615533591e+00_dp, &
688 p4 = -.402055799310489e+00_dp, p5 = -.673562214325671e-01_dp, &
689 p6 = -.271935708322958e-02_dp, q1 = .288743195473681e+01_dp, &
690 q2 = .312755088914843e+01_dp, q3 = .156875193295039e+01_dp, q4 = .361951990101499e+00_dp, &
691 q5 = .325038868253937e-01_dp, q6 = .667465618796164e-03_dp, r0 = .422784335098467e+00_dp, &
692 r1 = .848044614534529e+00_dp, r2 = .565221050691933e+00_dp, r3 = .156513060486551e+00_dp, &
693 r4 = .170502484022650e-01_dp, r5 = .497958207639485e-03_dp
694 REAL(dp),
PARAMETER :: s1 = .124313399877507e+01_dp, s2 = .548042109832463e+00_dp, &
695 s3 = .101552187439830e+00_dp, s4 = .713309612391000e-02_dp, s5 = .116165475989616e-03_dp
699 IF (a < 0.6e0_dp)
THEN
700 w = ((((((p6*a + p5)*a + p4)*a + p3)*a + p2)*a + p1)*a + p0)/ &
701 ((((((q6*a + q5)*a + q4)*a + q3)*a + q2)*a + q1)*a + 1.0e0_dp)
704 x = (a - 0.5e0_dp) - 0.5e0_dp
705 w = (((((r5*x + r4)*x + r3)*x + r2)*x + r1)*x + r0)/ &
706 (((((s5*x + s4)*x + s3)*x + s2)*x + s1)*x + 1.0e0_dp)
717 FUNCTION psi(xx)
RESULT(fn_val)
736 REAL(
dp),
INTENT(IN) :: xx
739 REAL(
dp),
PARAMETER :: dx0 = 1.461632144968362341262659542325721325e0_dp, p1(7) = (/ &
740 .895385022981970e-02_dp, .477762828042627e+01_dp, .142441585084029e+03_dp, &
741 .118645200713425e+04_dp, .363351846806499e+04_dp, .413810161269013e+04_dp, &
742 .130560269827897e+04_dp/), p2(4) = (/-.212940445131011e+01_dp, -.701677227766759e+01_dp, &
743 -.448616543918019e+01_dp, -.648157123766197e+00_dp/), piov4 = .785398163397448e0_dp, q1(6)&
744 = (/.448452573429826e+02_dp, .520752771467162e+03_dp, .221000799247830e+04_dp, &
745 .364127349079381e+04_dp, .190831076596300e+04_dp, .691091682714533e-05_dp/)
746 REAL(
dp),
PARAMETER :: q2(4) = (/.322703493791143e+02_dp, .892920700481861e+02_dp, &
747 .546117738103215e+02_dp, .777788548522962e+01_dp/)
749 INTEGER :: i, m, n, nq
750 REAL(
dp) :: aug, den, sgn, upper, w, x, xmax1, xmx0, &
777 xmax1 = min(xmax1, 1.0e0_dp/dpmpar(1))
782 IF (x < 0.5e0_dp)
THEN
787 IF (abs(x) <= xsmall)
THEN
788 IF (x == 0.0e0_dp)
THEN
805 IF (w <= 0.0e0_dp)
THEN
820 w = 4.0e0_dp*(w - nq*.25e0_dp)
827 IF ((n + n) /= nq) w = 1.0e0_dp - w
830 IF ((m + m) /= n) sgn = -sgn
838 aug = sgn*((sin(z)/cos(z))*4.0e0_dp)
843 IF (z == 0.0e0_dp)
THEN
852 aug = sgn*((cos(z)/sin(z))*4.0e0_dp)
857 IF (x <= 3.0e0_dp)
THEN
865 den = (den + q1(i))*x
866 upper = (upper + p1(i + 1))*x
869 den = (upper + p1(7))/(den + q1(6))
871 fn_val = den*xmx0 + aug
886 den = (den + q2(i))*w
887 upper = (upper + p2(i + 1))*w
890 aug = upper/(den + q2(4)) - 0.5e0_dp/x + aug
892 fn_val = aug + log(x)
902 FUNCTION betaln(a0, b0)
RESULT(fn_val)
908 REAL(
dp),
INTENT(IN) :: a0, b0
911 REAL(
dp),
PARAMETER :: e = .918938533204673e0_dp
914 REAL(
dp) :: a, b, c, h, u, v, w, z
923 IF (a >= 8.0e0_dp)
THEN
927 u = -(a - 0.5e0_dp)*log(c)
930 fn_val = (((-0.5e0_dp*log(b) + e) + w) - v) - u
932 fn_val = (((-0.5e0_dp*log(b) + e) + w) - u) - v
937 ELSEIF (a < 1.0e0_dp)
THEN
938 IF (b < 8.0e0_dp)
THEN
939 fn_val = log_gamma(a) + (log_gamma(b) - log_gamma(a + b))
941 fn_val = log_gamma(a) + algdiv(a, b)
946 ELSEIF (a <= 2.0e0_dp)
THEN
947 IF (b <= 2.0e0_dp)
THEN
948 fn_val = log_gamma(a) + log_gamma(b) - gsumln(a, b)
952 IF (b < 8.0e0_dp)
THEN
955 n = int(b - 1.0e0_dp)
961 fn_val = w + log(z) + (log_gamma(a) + (log_gamma(b) - gsumln(a, b)))
964 fn_val = log_gamma(a) + algdiv(a, b)
966 ELSEIF (b <= 1000.0e0_dp)
THEN
967 n = int(a - 1.0e0_dp)
972 w = w*(h/(1.0e0_dp + h))
975 IF (b >= 8.0e0_dp)
THEN
976 fn_val = w + log_gamma(a) + algdiv(a, b)
982 n = int(b - 1.0e0_dp)
988 fn_val = w + log(z) + (log_gamma(a) + (log_gamma(b) - gsumln(a, b)))
992 n = int(a - 1.0e0_dp)
996 w = w*(a/(1.0e0_dp + a/b))
998 fn_val = (log(w) - n*log(b)) + (log_gamma(a) + algdiv(a, b))
1009 FUNCTION gsumln(a, b)
RESULT(fn_val)
1014 REAL(
dp),
INTENT(IN) :: a, b
1020 IF (x <= 0.25e0_dp)
THEN
1021 fn_val = gamln1(1.0e0_dp + x)
1022 ELSEIF (x <= 1.25e0_dp)
THEN
1023 fn_val = gamln1(x) + alnrel(x)
1025 fn_val = gamln1(x - 1.0e0_dp) + log(x*(1.0e0_dp + x))
1035 FUNCTION bcorr(a0, b0)
RESULT(fn_val)
1043 REAL(
dp),
INTENT(IN) :: a0, b0
1046 REAL(
dp),
PARAMETER :: c0 = .833333333333333e-01_dp, c1 = -.277777777760991e-02_dp, &
1047 c2 = .793650666825390e-03_dp, c3 = -.595202931351870e-03_dp, &
1048 c4 = .837308034031215e-03_dp, c5 = -.165322962780713e-02_dp
1050 REAL(
dp) :: a, b, c, h, s11, s3, s5, s7, s9, t, w, &
1057 c = h/(1.0e0_dp + h)
1058 x = 1.0e0_dp/(1.0e0_dp + h)
1063 s3 = 1.0e0_dp + (x + x2)
1064 s5 = 1.0e0_dp + (x + x2*s3)
1065 s7 = 1.0e0_dp + (x + x2*s5)
1066 s9 = 1.0e0_dp + (x + x2*s7)
1067 s11 = 1.0e0_dp + (x + x2*s9)
1072 w = ((((c5*s11*t + c4*s9)*t + c3*s7)*t + c2*s5)*t + c1*s3)*t + c0
1078 fn_val = (((((c5*t + c4)*t + c3)*t + c2)*t + c1)*t + c0)/a + w
1092 SUBROUTINE bratio(a, b, x, y, w, w1, ierr)
1125 REAL(
dp),
INTENT(IN) :: a, b, x, y
1126 REAL(
dp),
INTENT(OUT) :: w, w1
1127 INTEGER,
INTENT(OUT) :: ierr
1129 INTEGER :: ierr1, ind, n
1130 REAL(
dp) :: a0, b0, eps, lambda, t, x0, y0, z
1140 IF (a < 0.0e0_dp .OR. b < 0.0e0_dp)
THEN
1144 IF (a == 0.0e0_dp .AND. b == 0.0e0_dp)
THEN
1148 IF (x < 0.0e0_dp .OR. x > 1.0e0_dp)
THEN
1152 IF (y < 0.0e0_dp .OR. y > 1.0e0_dp)
THEN
1156 z = ((x + y) - 0.5e0_dp) - 0.5e0_dp
1157 IF (abs(z) > 3.0e0_dp*eps)
THEN
1164 IF (x == 0.0e0_dp .OR. a == 0.0e0_dp)
THEN
1165 IF (x == 0.0e0_dp .AND. a == 0.0e0_dp)
THEN
1174 IF (y == 0.0e0_dp .OR. b == 0.0e0_dp)
THEN
1175 IF (y == 0.0e0_dp .AND. b == 0.0e0_dp)
THEN
1184 eps = max(eps, 1.e-15_dp)
1185 IF (max(a, b) < 1.e-3_dp*eps)
THEN
1197 IF (min(a0, b0) > 1.0e0_dp)
GO TO 30
1201 IF (x > 0.5e0_dp)
THEN
1209 IF (b0 < min(eps, eps*a0))
GO TO 80
1210 IF (a0 < min(eps, eps*b0) .AND. b0*x0 <= 1.0e0_dp)
GO TO 90
1211 IF (max(a0, b0) > 1.0e0_dp)
GO TO 20
1212 IF (a0 >= min(0.2e0_dp, b0))
GO TO 100
1213 IF (x0**a0 <= 0.9e0_dp)
GO TO 100
1214 IF (x0 >= 0.3e0_dp)
GO TO 110
1218 20
IF (b0 <= 1.0e0_dp)
GO TO 100
1219 IF (x0 >= 0.3e0_dp)
GO TO 110
1220 IF (x0 < 0.1e0_dp .AND. (x0*b0)**a0 <= 0.7e0_dp)
GO TO 100
1221 IF (b0 > 15.0e0_dp)
GO TO 131
1228 lambda = (a + b)*y - b
1230 lambda = a - (a + b)*x
1233 IF (lambda < 0.0e0_dp)
THEN
1239 lambda = abs(lambda)
1242 IF (b0 < 40.0e0_dp .AND. b0*x0 <= 0.7e0_dp)
GO TO 100
1243 IF (b0 < 40.0e0_dp)
GO TO 140
1244 IF (a0 > b0)
GO TO 50
1245 IF (a0 <= 100.0e0_dp)
GO TO 120
1246 IF (lambda > 0.03e0_dp*a0)
GO TO 120
1248 50
IF (b0 <= 100.0e0_dp)
GO TO 120
1249 IF (lambda > 0.03e0_dp*b0)
GO TO 120
1254 80 w = fpser(a0, b0, x0, eps)
1255 w1 = 0.5e0_dp + (0.5e0_dp - w)
1258 90 w1 = apser(a0, b0, x0, eps)
1259 w = 0.5e0_dp + (0.5e0_dp - w1)
1262 100 w = bpser(a0, b0, x0, eps)
1263 w1 = 0.5e0_dp + (0.5e0_dp - w)
1266 110 w1 = bpser(b0, a0, y0, eps)
1267 w = 0.5e0_dp + (0.5e0_dp - w1)
1270 120 w = bfrac(a0, b0, x0, y0, lambda, 15.0e0_dp*eps)
1271 w1 = 0.5e0_dp + (0.5e0_dp - w)
1274 130 w1 = bup(b0, a0, y0, x0, n, eps)
1276 131
CALL bgrat(b0, a0, y0, x0, w1, eps, ierr1)
1277 IF (ierr1 > 0) cpabort(
"Error in BGRAT")
1278 w = 0.5e0_dp + (0.5e0_dp - w1)
1283 IF (b0 /= 0.0e0_dp)
GO TO 141
1286 141 w = bup(b0, a0, y0, x0, n, eps)
1287 IF (x0 > 0.7e0_dp)
GO TO 150
1288 w = w + bpser(a0, b0, x0, eps)
1289 w1 = 0.5e0_dp + (0.5e0_dp - w)
1292 150
IF (a0 > 15.0e0_dp)
GO TO 151
1294 w = w + bup(a0, b0, x0, y0, n, eps)
1296 151
CALL bgrat(a0, b0, x0, y0, w, eps, ierr1)
1297 w1 = 0.5e0_dp + (0.5e0_dp - w)
1300 180 w = basym(a0, b0, lambda, 100.0e0_dp*eps)
1301 w1 = 0.5e0_dp + (0.5e0_dp - w)
1306 220
IF (ind == 0)
RETURN
1311 END SUBROUTINE bratio
1321 FUNCTION fpser(a, b, x, eps)
RESULT(fn_val)
1330 REAL(
dp),
INTENT(IN) :: a, b, x, eps
1333 REAL(
dp) :: an, c, s, t, tol
1338 IF (a > 1.e-3_dp*eps)
THEN
1341 IF (t < dxparg(1))
RETURN
1347 fn_val = (b/a)*fn_val
1356 DO WHILE (abs(c) > tol)
1363 fn_val = fn_val*(1.0e0_dp + a*s)
1375 FUNCTION apser(a, b, x, eps)
RESULT(fn_val)
1381 REAL(
dp),
INTENT(IN) :: a, b, x, eps
1384 REAL(
dp),
PARAMETER :: g = .577215664901533e0_dp
1386 REAL(
dp) :: aj, bx, c, j, s, t, tol
1390 IF (b*eps > 2.e-2_dp)
THEN
1393 c = log(x) +
psi(b) + g + t
1396 tol = 5.0e0_dp*eps*abs(c)
1403 DO WHILE (abs(aj) > tol)
1421 FUNCTION bpser(a, b, x, eps)
RESULT(fn_val)
1426 REAL(
dp),
INTENT(IN) :: a, b, x, eps
1430 REAL(
dp) :: a0, apb, b0, c, n, sum, t, tol, u, w, z
1433 IF (x == 0.0e0_dp)
RETURN
1439 IF (a0 >= 1.0e0_dp)
THEN
1440 z = a*log(x) - betaln(a, b)
1442 ELSEIF (b0 >= 8.0e0_dp)
THEN
1443 u = gamln1(a0) + algdiv(a0, b0)
1445 fn_val = (a0/a)*exp(z)
1446 ELSEIF (b0 > 1.0e0_dp)
THEN
1450 m = int(b0 - 1.0e0_dp)
1455 c = c*(b0/(a0 + b0))
1463 IF (apb > 1.0e0_dp)
THEN
1464 u = a0 + b0 - 1.e0_dp
1465 t = (1.0e0_dp + gam1(u))/apb
1467 t = 1.0e0_dp + gam1(apb)
1469 fn_val = exp(z)*(a0/a)*(1.0e0_dp + gam1(b0))/t
1475 IF (fn_val == 0.0e0_dp)
RETURN
1478 IF (apb > 1.0e0_dp)
THEN
1480 z = (1.0e0_dp + gam1(u))/apb
1482 z = 1.0e0_dp + gam1(apb)
1485 c = (1.0e0_dp + gam1(a))*(1.0e0_dp + gam1(b))/z
1486 fn_val = fn_val*c*(b/apb)
1491 IF (fn_val == 0.0e0_dp .OR. a <= 0.1e0_dp*eps)
RETURN
1500 c = c*(0.5e0_dp + (0.5e0_dp - b/n))*x
1503 DO WHILE (abs(w) > tol)
1505 c = c*(0.5e0_dp + (0.5e0_dp - b/n))*x
1509 fn_val = fn_val*(1.0e0_dp + a*sum)
1523 FUNCTION bup(a, b, x, y, n, eps)
RESULT(fn_val)
1528 REAL(
dp),
INTENT(IN) :: a, b, x, y
1529 INTEGER,
INTENT(IN) :: n
1530 REAL(
dp),
INTENT(IN) :: eps
1533 INTEGER :: i, k, kp1, mu, nm1
1534 REAL(
dp) :: ap1, apb, d, l, r, t, w
1543 IF (.NOT. (n == 1 .OR. a < 1.0e0_dp .OR. apb < 1.1e0_dp*ap1))
THEN
1544 mu = int(abs(dxparg(1)))
1551 fn_val = brcmp1(mu, a, b, x, y)/a
1552 IF (n == 1 .OR. fn_val == 0.0e0_dp)
RETURN
1559 IF (b > 1.0e0_dp)
THEN
1560 IF (y <= 1.e-4_dp)
THEN
1564 d = ((apb + l)/(ap1 + l))*x*d
1572 r = (b - 1.0e0_dp)*x/y - a
1573 IF (r >= 1.0e0_dp)
THEN
1576 IF (r < t) k = int(r)
1582 d = ((apb + l)/(ap1 + l))*x*d
1598 d = ((apb + l)/(ap1 + l))*x*d
1600 IF (d <= eps*w)
EXIT
1619 FUNCTION bfrac(a, b, x, y, lambda, eps)
RESULT(fn_val)
1624 REAL(
dp),
INTENT(IN) :: a, b, x, y, lambda, eps
1627 REAL(
dp) :: alpha, an, anp1, beta, bn, bnp1, c, c0, &
1628 c1, e, n, p, r, r0, s, t, w, yp1
1630 fn_val = brcomp(a, b, x, y)
1631 IF (fn_val == 0.0e0_dp)
RETURN
1633 c = 1.0e0_dp + lambda
1635 c1 = 1.0e0_dp + 1.0e0_dp/a
1654 alpha = (p*(p + c0)*e*e)*(w*x)
1655 IF (alpha <= 0.0e0_dp)
THEN
1660 e = (1.0e0_dp + t)/(c1 + t + t)
1661 beta = n + w/s + e*(c + n*yp1)
1667 t = alpha*an + beta*anp1
1670 t = alpha*bn + beta*bnp1
1675 IF (abs(r - r0) <= eps*r)
THEN
1699 FUNCTION brcomp(a, b, x, y)
RESULT(fn_val)
1703 REAL(
dp),
INTENT(IN) :: a, b, x, y
1706 REAL(
dp),
PARAMETER :: const = 0.398942280401433e0_dp
1709 REAL(
dp) :: a0, apb, b0, c, e, h, lambda, lnx, lny, &
1717 IF (x == 0.0e0_dp .OR. y == 0.0e0_dp)
RETURN
1719 IF (a0 >= 8.0e0_dp)
THEN
1725 x0 = 1.0e0_dp/(1.0e0_dp + h)
1726 y0 = h/(1.0e0_dp + h)
1727 lambda = (a + b)*y - b
1730 x0 = h/(1.0e0_dp + h)
1731 y0 = 1.0e0_dp/(1.0e0_dp + h)
1732 lambda = a - (a + b)*x
1736 IF (abs(e) > 0.6e0_dp)
THEN
1743 IF (abs(e) > 0.6e0_dp)
THEN
1749 z = exp(-(a*u + b*v))
1750 fn_val = const*sqrt(b*x0)*z*exp(-bcorr(a, b))
1754 IF (x > 0.375e0_dp)
THEN
1755 IF (y > 0.375e0_dp)
THEN
1768 IF (a0 >= 1.0e0_dp)
THEN
1769 z = z - betaln(a, b)
1777 IF (b0 >= 8.0e0_dp)
THEN
1779 u = gamln1(a0) + algdiv(a0, b0)
1780 fn_val = a0*exp(z - u)
1782 IF (b0 <= 1.0e0_dp)
THEN
1787 IF (fn_val == 0.0e0_dp)
RETURN
1790 IF (apb > 1.0e0_dp)
THEN
1792 z = (1.0e0_dp + gam1(u))/apb
1794 z = 1.0e0_dp + gam1(apb)
1797 c = (1.0e0_dp + gam1(a))*(1.0e0_dp + gam1(b))/z
1798 fn_val = fn_val*(a0*c)/(1.0e0_dp + a0/b0)
1805 n = int(b0 - 1.0e0_dp)
1810 c = c*(b0/(a0 + b0))
1818 IF (apb > 1.0e0_dp)
THEN
1819 u = a0 + b0 - 1.e0_dp
1820 t = (1.0e0_dp + gam1(u))/apb
1822 t = 1.0e0_dp + gam1(apb)
1824 fn_val = a0*exp(z)*(1.0e0_dp + gam1(b0))/t
1837 FUNCTION brcmp1(mu, a, b, x, y)
RESULT(fn_val)
1841 INTEGER,
INTENT(IN) :: mu
1842 REAL(
dp),
INTENT(IN) :: a, b, x, y
1845 REAL(
dp),
PARAMETER :: const = 0.398942280401433e0_dp
1848 REAL(
dp) :: a0, apb, b0, c, e, h, lambda, lnx, lny, &
1856 IF (a0 >= 8.0e0_dp)
THEN
1862 x0 = 1.0e0_dp/(1.0e0_dp + h)
1863 y0 = h/(1.0e0_dp + h)
1864 lambda = (a + b)*y - b
1867 x0 = h/(1.0e0_dp + h)
1868 y0 = 1.0e0_dp/(1.0e0_dp + h)
1869 lambda = a - (a + b)*x
1872 IF (abs(e) > 0.6e0_dp)
THEN
1879 IF (abs(e) <= 0.6e0_dp)
THEN
1885 z = esum(mu, -(a*u + b*v))
1886 fn_val = const*sqrt(b*x0)*z*exp(-bcorr(a, b))
1889 IF (x > 0.375e0_dp)
THEN
1890 IF (y > 0.375e0_dp)
THEN
1902 IF (a0 >= 1.0e0_dp)
THEN
1903 z = z - betaln(a, b)
1904 fn_val = esum(mu, z)
1911 IF (b0 >= 8.0e0_dp)
THEN
1914 u = gamln1(a0) + algdiv(a0, b0)
1915 fn_val = a0*esum(mu, z - u)
1918 IF (b0 <= 1.0e0_dp)
THEN
1922 fn_val = esum(mu, z)
1923 IF (fn_val == 0.0e0_dp)
RETURN
1926 IF (apb > 1.0e0_dp)
THEN
1928 z = (1.0e0_dp + gam1(u))/apb
1930 z = 1.0e0_dp + gam1(apb)
1933 c = (1.0e0_dp + gam1(a))*(1.0e0_dp + gam1(b))/z
1934 fn_val = fn_val*(a0*c)/(1.0e0_dp + a0/b0)
1941 n = int(b0 - 1.0e0_dp)
1946 c = c*(b0/(a0 + b0))
1954 IF (apb > 1.0e0_dp)
THEN
1955 u = a0 + b0 - 1.e0_dp
1956 t = (1.0e0_dp + gam1(u))/apb
1958 t = 1.0e0_dp + gam1(apb)
1960 fn_val = a0*esum(mu, z)*(1.0e0_dp + gam1(b0))/t
1972 FUNCTION basym(a, b, lambda, eps)
RESULT(fn_val)
1979 REAL(
dp),
INTENT(IN) :: a, b, lambda, eps
1982 INTEGER,
PARAMETER :: num = 20
1983 REAL(
dp),
PARAMETER :: e0 = 1.12837916709551e0_dp, &
1984 e1 = .353553390593274e0_dp
1986 INTEGER :: i, im1, imj, j, m, mm1, mmj, n, np1
1987 REAL(
dp) :: a0(21), b0(21), bsum, c(21), d(21), &
1988 dsum, f, h, h2, hn, j0, j1, r, r0, r1, &
1989 s, sum, t, t0, t1, u, w, w0, z, z0, &
2004 r0 = 1.0e0_dp/(1.0e0_dp + h)
2006 w0 = 1.0e0_dp/sqrt(b*(1.0e0_dp + h))
2009 r0 = 1.0e0_dp/(1.0e0_dp + h)
2011 w0 = 1.0e0_dp/sqrt(a*(1.0e0_dp + h))
2014 f = a*rlog1(-lambda/a) + b*rlog1(lambda/b)
2016 IF (t == 0.0e0_dp)
RETURN
2018 z = 0.5e0_dp*(z0/e1)
2021 a0(1) = (2.0e0_dp/3.0e0_dp)*r1
2022 c(1) = -0.5e0_dp*a0(1)
2024 j0 = (0.5e0_dp/e0)*erfc_scaled(z0)
2026 sum = j0 + d(1)*w0*j1
2036 a0(n) = 2.0e0_dp*r0*(1.0e0_dp + h*hn)/(n + 2.0e0_dp)
2039 a0(np1) = 2.0e0_dp*r1*s/(n + 3.0e0_dp)
2042 r = -0.5e0_dp*(i + 1.0e0_dp)
2049 bsum = bsum + (j*r - mmj)*a0(j)*b0(mmj)
2051 b0(m) = r*a0(m) + bsum/m
2053 c(i) = b0(i)/(i + 1.0e0_dp)
2059 dsum = dsum + d(imj)*c(j)
2061 d(i) = -(dsum + c(i))
2064 j0 = e1*znm1 + (n - 1.0e0_dp)*j0
2072 sum = sum + (t0 + t1)
2073 IF ((abs(t0) + abs(t1)) <= eps*sum)
EXIT
2076 u = exp(-bcorr(a, b))
real(dp) function, public psi(xx)
...
Defines the basic variable types.
integer, parameter, public dp