cpsi.f 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. *DECK CPSI
  2. COMPLEX FUNCTION CPSI (ZIN)
  3. C***BEGIN PROLOGUE CPSI
  4. C***PURPOSE Compute the Psi (or Digamma) function.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C7C
  7. C***TYPE COMPLEX (PSI-S, DPSI-D, CPSI-C)
  8. C***KEYWORDS DIGAMMA FUNCTION, FNLIB, PSI FUNCTION, SPECIAL FUNCTIONS
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C PSI(X) calculates the psi (or digamma) function of X. PSI(X)
  13. C is the logarithmic derivative of the gamma function of X.
  14. C
  15. C***REFERENCES (NONE)
  16. C***ROUTINES CALLED CCOT, R1MACH, XERMSG
  17. C***REVISION HISTORY (YYMMDD)
  18. C 780501 DATE WRITTEN
  19. C 890531 Changed all specific intrinsics to generic. (WRB)
  20. C 890531 REVISION DATE from Version 3.2
  21. C 891214 Prologue converted to Version 4.0 format. (BAB)
  22. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  23. C 900727 Added EXTERNAL statement. (WRB)
  24. C***END PROLOGUE CPSI
  25. COMPLEX ZIN, Z, Z2INV, CORR, CCOT
  26. DIMENSION BERN(13)
  27. LOGICAL FIRST
  28. EXTERNAL CCOT
  29. SAVE BERN, PI, NTERM, BOUND, DXREL, RMIN, RBIG, FIRST
  30. DATA BERN( 1) / .8333333333 3333333 E-1 /
  31. DATA BERN( 2) / -.8333333333 3333333 E-2 /
  32. DATA BERN( 3) / .3968253968 2539683 E-2 /
  33. DATA BERN( 4) / -.4166666666 6666667 E-2 /
  34. DATA BERN( 5) / .7575757575 7575758 E-2 /
  35. DATA BERN( 6) / -.2109279609 2796093 E-1 /
  36. DATA BERN( 7) / .8333333333 3333333 E-1 /
  37. DATA BERN( 8) / -.4432598039 2156863 E0 /
  38. DATA BERN( 9) / .3053954330 2701197 E1 /
  39. DATA BERN(10) / -.2645621212 1212121 E2 /
  40. DATA BERN(11) / .2814601449 2753623 E3 /
  41. DATA BERN(12) / -.3454885393 7728938 E4 /
  42. DATA BERN(13) / .5482758333 3333333 E5 /
  43. DATA PI / 3.141592653 589793 E0 /
  44. DATA FIRST /.TRUE./
  45. C***FIRST EXECUTABLE STATEMENT CPSI
  46. IF (FIRST) THEN
  47. NTERM = -0.30*LOG(R1MACH(3))
  48. C MAYBE BOUND = N*(0.1*EPS)**(-1/(2*N-1)) / (PI*EXP(1))
  49. BOUND = 0.1171*NTERM*(0.1*R1MACH(3))**(-1.0/(2*NTERM-1))
  50. DXREL = SQRT(R1MACH(4))
  51. RMIN = EXP (MAX (LOG(R1MACH(1)), -LOG(R1MACH(2))) + 0.011 )
  52. RBIG = 1.0/R1MACH(3)
  53. ENDIF
  54. FIRST = .FALSE.
  55. C
  56. Z = ZIN
  57. X = REAL(Z)
  58. Y = AIMAG(Z)
  59. IF (Y.LT.0.0) Z = CONJG(Z)
  60. C
  61. CORR = (0.0, 0.0)
  62. CABSZ = ABS(Z)
  63. IF (X.GE.0.0 .AND. CABSZ.GT.BOUND) GO TO 50
  64. IF (X.LT.0.0 .AND. ABS(Y).GT.BOUND) GO TO 50
  65. C
  66. IF (CABSZ.LT.BOUND) GO TO 20
  67. C
  68. C USE THE REFLECTION FORMULA FOR REAL(Z) NEGATIVE, ABS(Z) LARGE, AND
  69. C ABS(AIMAG(Y)) SMALL.
  70. C
  71. CORR = -PI*CCOT(PI*Z)
  72. Z = 1.0 - Z
  73. GO TO 50
  74. C
  75. C USE THE RECURSION RELATION FOR ABS(Z) SMALL.
  76. C
  77. 20 IF (CABSZ .LT. RMIN) CALL XERMSG ('SLATEC', 'CPSI',
  78. + 'CPSI CALLED WITH Z SO NEAR 0 THAT CPSI OVERFLOWS', 2, 2)
  79. C
  80. IF (X.GE.(-0.5) .OR. ABS(Y).GT.DXREL) GO TO 30
  81. IF (ABS((Z-AINT(X-0.5))/X) .LT. DXREL) CALL XERMSG ('SLATEC',
  82. + 'CPSI',
  83. + 'ANSWER LT HALF PRECISION BECAUSE Z TOO NEAR NEGATIVE INTEGER',
  84. + 1, 1)
  85. IF (Y .EQ. 0.0 .AND. X .EQ. AINT(X)) CALL XERMSG ('SLATEC',
  86. + 'CPSI', 'Z IS A NEGATIVE INTEGER', 3, 2)
  87. C
  88. 30 N = SQRT(BOUND**2-Y**2) - X + 1.0
  89. DO 40 I=1,N
  90. CORR = CORR - 1.0/Z
  91. Z = Z + 1.0
  92. 40 CONTINUE
  93. C
  94. C NOW EVALUATE THE ASYMPTOTIC SERIES FOR SUITABLY LARGE Z.
  95. C
  96. 50 IF (CABSZ.GT.RBIG) CPSI = LOG(Z) + CORR
  97. IF (CABSZ.GT.RBIG) GO TO 70
  98. C
  99. CPSI = (0.0, 0.0)
  100. Z2INV = 1.0/Z**2
  101. DO 60 I=1,NTERM
  102. NDX = NTERM + 1 - I
  103. CPSI = BERN(NDX) + Z2INV*CPSI
  104. 60 CONTINUE
  105. CPSI = LOG(Z) - 0.5/Z - CPSI*Z2INV + CORR
  106. C
  107. 70 IF (Y.LT.0.0) CPSI = CONJG(CPSI)
  108. C
  109. RETURN
  110. END