dpoch.f 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. *DECK DPOCH
  2. DOUBLE PRECISION FUNCTION DPOCH (A, X)
  3. C***BEGIN PROLOGUE DPOCH
  4. C***PURPOSE Evaluate a generalization of Pochhammer's symbol.
  5. C***LIBRARY SLATEC (FNLIB)
  6. C***CATEGORY C1, C7A
  7. C***TYPE DOUBLE PRECISION (POCH-S, DPOCH-D)
  8. C***KEYWORDS FNLIB, POCHHAMMER, SPECIAL FUNCTIONS
  9. C***AUTHOR Fullerton, W., (LANL)
  10. C***DESCRIPTION
  11. C
  12. C Evaluate a double precision generalization of Pochhammer's symbol
  13. C (A)-sub-X = GAMMA(A+X)/GAMMA(A) for double precision A and X.
  14. C For X a non-negative integer, POCH(A,X) is just Pochhammer's symbol.
  15. C This is a preliminary version that does not handle wrong arguments
  16. C properly and may not properly handle the case when the result is
  17. C computed to less than half of double precision.
  18. C
  19. C***REFERENCES (NONE)
  20. C***ROUTINES CALLED D9LGMC, DFAC, DGAMMA, DGAMR, DLGAMS, DLNREL, XERMSG
  21. C***REVISION HISTORY (YYMMDD)
  22. C 770701 DATE WRITTEN
  23. C 890531 Changed all specific intrinsics to generic. (WRB)
  24. C 890911 Removed unnecessary intrinsics. (WRB)
  25. C 890911 REVISION DATE from Version 3.2
  26. C 891214 Prologue converted to Version 4.0 format. (BAB)
  27. C 900315 CALLs to XERROR changed to CALLs to XERMSG. (THJ)
  28. C 900727 Added EXTERNAL statement. (WRB)
  29. C***END PROLOGUE DPOCH
  30. DOUBLE PRECISION A, X, ABSA, ABSAX, ALNGA, ALNGAX, AX, B, PI,
  31. 1 SGNGA, SGNGAX, DFAC, DLNREL, D9LGMC, DGAMMA, DGAMR, DCOT
  32. EXTERNAL DGAMMA
  33. SAVE PI
  34. DATA PI / 3.1415926535 8979323846 2643383279 503 D0 /
  35. C***FIRST EXECUTABLE STATEMENT DPOCH
  36. AX = A + X
  37. IF (AX.GT.0.0D0) GO TO 30
  38. IF (AINT(AX).NE.AX) GO TO 30
  39. C
  40. IF (A .GT. 0.0D0 .OR. AINT(A) .NE. A) CALL XERMSG ('SLATEC',
  41. + 'DPOCH', 'A+X IS NON-POSITIVE INTEGER BUT A IS NOT', 2, 2)
  42. C
  43. C WE KNOW HERE THAT BOTH A+X AND A ARE NON-POSITIVE INTEGERS.
  44. C
  45. DPOCH = 1.0D0
  46. IF (X.EQ.0.D0) RETURN
  47. C
  48. N = X
  49. IF (MIN(A+X,A).LT.(-20.0D0)) GO TO 20
  50. C
  51. IA = A
  52. DPOCH = (-1.0D0)**N * DFAC(-IA)/DFAC(-IA-N)
  53. RETURN
  54. C
  55. 20 DPOCH = (-1.0D0)**N * EXP ((A-0.5D0)*DLNREL(X/(A-1.0D0))
  56. 1 + X*LOG(-A+1.0D0-X) - X + D9LGMC(-A+1.0D0) - D9LGMC(-A-X+1.D0))
  57. RETURN
  58. C
  59. C A+X IS NOT ZERO OR A NEGATIVE INTEGER.
  60. C
  61. 30 DPOCH = 0.0D0
  62. IF (A.LE.0.0D0 .AND. AINT(A).EQ.A) RETURN
  63. C
  64. N = ABS(X)
  65. IF (DBLE(N).NE.X .OR. N.GT.20) GO TO 50
  66. C
  67. C X IS A SMALL NON-POSITIVE INTEGER, PRESUMMABLY A COMMON CASE.
  68. C
  69. DPOCH = 1.0D0
  70. IF (N.EQ.0) RETURN
  71. DO 40 I=1,N
  72. DPOCH = DPOCH * (A+I-1)
  73. 40 CONTINUE
  74. RETURN
  75. C
  76. 50 ABSAX = ABS(A+X)
  77. ABSA = ABS(A)
  78. IF (MAX(ABSAX,ABSA).GT.20.0D0) GO TO 60
  79. DPOCH = DGAMMA(A+X) * DGAMR(A)
  80. RETURN
  81. C
  82. 60 IF (ABS(X).GT.0.5D0*ABSA) GO TO 70
  83. C
  84. C ABS(X) IS SMALL AND BOTH ABS(A+X) AND ABS(A) ARE LARGE. THUS,
  85. C A+X AND A MUST HAVE THE SAME SIGN. FOR NEGATIVE A, WE USE
  86. C GAMMA(A+X)/GAMMA(A) = GAMMA(-A+1)/GAMMA(-A-X+1) *
  87. C SIN(PI*A)/SIN(PI*(A+X))
  88. C
  89. B = A
  90. IF (B.LT.0.0D0) B = -A - X + 1.0D0
  91. DPOCH = EXP ((B-0.5D0)*DLNREL(X/B) + X*LOG(B+X) - X
  92. 1 + D9LGMC(B+X) - D9LGMC(B) )
  93. IF (A.LT.0.0D0 .AND. DPOCH.NE.0.0D0) DPOCH =
  94. 1 DPOCH/(COS(PI*X) + DCOT(PI*A)*SIN(PI*X) )
  95. RETURN
  96. C
  97. 70 CALL DLGAMS (A+X, ALNGAX, SGNGAX)
  98. CALL DLGAMS (A, ALNGA, SGNGA)
  99. DPOCH = SGNGAX * SGNGA * EXP(ALNGAX-ALNGA)
  100. C
  101. RETURN
  102. END