clngam.f 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. *DECK CLNGAM
  2. COMPLEX FUNCTION CLNGAM (ZIN)
  3. C***BEGIN PROLOGUE CLNGAM
  4. C***PURPOSE Compute the logarithm of the absolute value of the Gamma
  5. C function.
  6. C***LIBRARY SLATEC (FNLIB)
  7. C***CATEGORY C7A
  8. C***TYPE COMPLEX (ALNGAM-S, DLNGAM-D, CLNGAM-C)
  9. C***KEYWORDS ABSOLUTE VALUE, COMPLETE GAMMA FUNCTION, FNLIB, LOGARITHM,
  10. C SPECIAL FUNCTIONS
  11. C***AUTHOR Fullerton, W., (LANL)
  12. C***DESCRIPTION
  13. C
  14. C CLNGAM computes the natural log of the complex valued gamma function
  15. C at ZIN, where ZIN is a complex number. This is a preliminary version,
  16. C which is not accurate.
  17. C
  18. C***REFERENCES (NONE)
  19. C***ROUTINES CALLED C9LGMC, CARG, CLNREL, R1MACH, XERMSG
  20. C***REVISION HISTORY (YYMMDD)
  21. C 780401 DATE WRITTEN
  22. C 890531 Changed all specific intrinsics to generic. (WRB)
  23. C 890531 REVISION DATE from Version 3.2
  24. C 891214 Prologue converted to Version 4.0 format. (BAB)
  25. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  26. C***END PROLOGUE CLNGAM
  27. COMPLEX ZIN, Z, CORR, CLNREL, C9LGMC
  28. LOGICAL FIRST
  29. SAVE PI, SQ2PIL, BOUND, DXREL, FIRST
  30. DATA PI / 3.1415926535 8979324E0 /
  31. DATA SQ2PIL / 0.9189385332 0467274E0 /
  32. DATA FIRST /.TRUE./
  33. C***FIRST EXECUTABLE STATEMENT CLNGAM
  34. IF (FIRST) THEN
  35. N = -0.30*LOG(R1MACH(3))
  36. C BOUND = N*(0.1*EPS)**(-1/(2*N-1))/(PI*EXP(1))
  37. BOUND = 0.1171*N*(0.1*R1MACH(3))**(-1./(2*N-1))
  38. DXREL = SQRT (R1MACH(4))
  39. ENDIF
  40. FIRST = .FALSE.
  41. C
  42. Z = ZIN
  43. X = REAL(ZIN)
  44. Y = AIMAG(ZIN)
  45. C
  46. CORR = (0.0, 0.0)
  47. CABSZ = ABS(Z)
  48. IF (X.GE.0.0 .AND. CABSZ.GT.BOUND) GO TO 50
  49. IF (X.LT.0.0 .AND. ABS(Y).GT.BOUND) GO TO 50
  50. C
  51. IF (CABSZ.LT.BOUND) GO TO 20
  52. C
  53. C USE THE REFLECTION FORMULA FOR REAL(Z) NEGATIVE, ABS(Z) LARGE, AND
  54. C ABS(AIMAG(Y)) SMALL.
  55. C
  56. IF (Y.GT.0.0) Z = CONJG (Z)
  57. CORR = EXP (-CMPLX(0.0,2.0*PI)*Z)
  58. IF (REAL(CORR) .EQ. 1.0 .AND. AIMAG(CORR) .EQ. 0.0) CALL XERMSG
  59. + ('SLATEC', 'CLNGAM', 'Z IS A NEGATIVE INTEGER', 3, 2)
  60. C
  61. CLNGAM = SQ2PIL + 1.0 - CMPLX(0.0,PI)*(Z-0.5) - CLNREL(-CORR)
  62. 1 + (Z-0.5)*LOG(1.0-Z) - Z - C9LGMC(1.0-Z)
  63. IF (Y.GT.0.0) CLNGAM = CONJG (CLNGAM)
  64. RETURN
  65. C
  66. C USE THE RECURSION RELATION FOR ABS(Z) SMALL.
  67. C
  68. 20 IF (X.GE.(-0.5) .OR. ABS(Y).GT.DXREL) GO TO 30
  69. IF (ABS((Z-AINT(X-0.5))/X) .LT. DXREL) CALL XERMSG ('SLATEC',
  70. + 'CLNGAM',
  71. + 'ANSWER LT HALF PRECISION BECAUSE Z TOO NEAR NEGATIVE INTEGER',
  72. + 1, 1)
  73. C
  74. 30 N = SQRT (BOUND**2 - Y**2) - X + 1.0
  75. ARGSUM = 0.0
  76. CORR = (1.0, 0.0)
  77. DO 40 I=1,N
  78. ARGSUM = ARGSUM + CARG(Z)
  79. CORR = Z*CORR
  80. Z = 1.0 + Z
  81. 40 CONTINUE
  82. C
  83. IF (REAL(CORR) .EQ. 0.0 .AND. AIMAG(CORR) .EQ. 0.0) CALL XERMSG
  84. + ('SLATEC', 'CLNGAM', 'Z IS A NEGATIVE INTEGER', 3, 2)
  85. CORR = -CMPLX (LOG(ABS(CORR)), ARGSUM)
  86. C
  87. C USE STIRLING-S APPROXIMATION FOR LARGE Z.
  88. C
  89. 50 CLNGAM = SQ2PIL + (Z-0.5)*LOG(Z) - Z + CORR + C9LGMC(Z)
  90. RETURN
  91. C
  92. END