spenc.f 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. *DECK SPENC
  2. FUNCTION SPENC (X)
  3. C***BEGIN PROLOGUE SPENC
  4. C***PURPOSE Compute a form of Spence's integral due to K. Mitchell.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C5
  7. C***TYPE SINGLE PRECISION (SPENC-S, DSPENC-D)
  8. C***KEYWORDS FNLIB, SPECIAL FUNCTIONS, SPENCE'S INTEGRAL
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C Evaluate a form of Spence's function defined by
  13. C integral from 0 to X of -LOG(1-Y)/Y DY.
  14. C For ABS(X) .LE. 1, the uniformly convergent expansion
  15. C SPENC = sum K=1,infinity X**K / K**2 is valid.
  16. C
  17. C Spence's function can be used to evaluate much more general integral
  18. C forms. For example,
  19. C integral from 0 to Z of LOG(A*X+B)/(C*X+D) DX =
  20. C LOG(ABS(B-A*D/C))*LOG(ABS(A*(C*X+D)/(A*D-B*C)))/C
  21. C - SPENC (A*(C*Z+D)/(A*D-B*C)) / C.
  22. C
  23. C Ref -- K. Mitchell, Philosophical Magazine, 40, p. 351 (1949).
  24. C Stegun and Abromowitz, AMS 55, p. 1004.
  25. C
  26. C
  27. C Series for SPEN on the interval 0. to 5.00000D-01
  28. C with weighted error 6.82E-17
  29. C log weighted error 16.17
  30. C significant figures required 15.22
  31. C decimal places required 16.81
  32. C
  33. C***REFERENCES (NONE)
  34. C***ROUTINES CALLED CSEVL, INITS, R1MACH
  35. C***REVISION HISTORY (YYMMDD)
  36. C 780201 DATE WRITTEN
  37. C 890531 Changed all specific intrinsics to generic. (WRB)
  38. C 890531 REVISION DATE from Version 3.2
  39. C 891214 Prologue converted to Version 4.0 format. (BAB)
  40. C***END PROLOGUE SPENC
  41. DIMENSION SPENCS(19)
  42. LOGICAL FIRST
  43. SAVE SPENCS, PI26, NSPENC, XBIG, FIRST
  44. DATA SPENCS( 1) / .1527365598 892406E0 /
  45. DATA SPENCS( 2) / .0816965805 8051014E0 /
  46. DATA SPENCS( 3) / .0058141571 4077873E0 /
  47. DATA SPENCS( 4) / .0005371619 8145415E0 /
  48. DATA SPENCS( 5) / .0000572470 4675185E0 /
  49. DATA SPENCS( 6) / .0000066745 4612164E0 /
  50. DATA SPENCS( 7) / .0000008276 4673397E0 /
  51. DATA SPENCS( 8) / .0000001073 3156730E0 /
  52. DATA SPENCS( 9) / .0000000144 0077294E0 /
  53. DATA SPENCS(10) / .0000000019 8444202E0 /
  54. DATA SPENCS(11) / .0000000002 7940058E0 /
  55. DATA SPENCS(12) / .0000000000 4003991E0 /
  56. DATA SPENCS(13) / .0000000000 0582346E0 /
  57. DATA SPENCS(14) / .0000000000 0085767E0 /
  58. DATA SPENCS(15) / .0000000000 0012768E0 /
  59. DATA SPENCS(16) / .0000000000 0001918E0 /
  60. DATA SPENCS(17) / .0000000000 0000290E0 /
  61. DATA SPENCS(18) / .0000000000 0000044E0 /
  62. DATA SPENCS(19) / .0000000000 0000006E0 /
  63. DATA PI26 / 1.644934066 848226E0 /
  64. DATA FIRST /.TRUE./
  65. C***FIRST EXECUTABLE STATEMENT SPENC
  66. IF (FIRST) THEN
  67. NSPENC = INITS (SPENCS, 19, 0.1*R1MACH(3))
  68. XBIG = 1.0/R1MACH(3)
  69. ENDIF
  70. FIRST = .FALSE.
  71. C
  72. IF (X.GT.2.0) GO TO 60
  73. IF (X.GT.1.0) GO TO 50
  74. IF (X.GT.0.5) GO TO 40
  75. IF (X.GE.0.0) GO TO 30
  76. IF (X.GT.(-1.)) GO TO 20
  77. C
  78. C HERE IF X .LE. -1.0
  79. C
  80. ALN = LOG(1.0-X)
  81. SPENC = -PI26 - 0.5*ALN*(2.0*LOG(-X)-ALN)
  82. IF (X.GT.(-XBIG)) SPENC = SPENC
  83. 1 + (1.0 + CSEVL (4.0/(1.0-X)-1.0, SPENCS, NSPENC)) / (1.0-X)
  84. RETURN
  85. C
  86. C -1.0 .LT. X .LT. 0.0
  87. C
  88. 20 SPENC = -0.5*LOG(1.0-X)**2
  89. 1 - X*(1.0 + CSEVL (4.0*X/(X-1.0)-1.0, SPENCS, NSPENC)) / (X-1.0)
  90. RETURN
  91. C
  92. C 0.0 .LE. X .LE. 0.5
  93. C
  94. 30 SPENC = X*(1.0 + CSEVL (4.0*X-1.0, SPENCS, NSPENC))
  95. RETURN
  96. C
  97. C 0.5 .LT. X .LE. 1.0
  98. C
  99. 40 SPENC = PI26
  100. IF (X.NE.1.0) SPENC = PI26 - LOG(X)*LOG(1.0-X)
  101. 1 - (1.0-X)*(1.0 + CSEVL (4.0*(1.0-X)-1.0, SPENCS, NSPENC))
  102. RETURN
  103. C
  104. C 1.0 .LT. X .LE. 2.0
  105. C
  106. 50 SPENC = PI26 - 0.5*LOG(X)*LOG((X-1.0)**2/X)
  107. 1 + (X-1.)*(1.0 + CSEVL (4.0*(X-1.)/X-1.0, SPENCS, NSPENC))/X
  108. RETURN
  109. C
  110. C X .GT. 2.0
  111. C
  112. 60 SPENC = 2.0*PI26 - 0.5*LOG(X)**2
  113. IF (X.LT.XBIG) SPENC = SPENC
  114. 1 - (1.0 + CSEVL (4.0/X-1.0, SPENCS, NSPENC))/X
  115. RETURN
  116. C
  117. END