1
DOUBLE PRECISION FUNCTION psi(xx)
2
C---------------------------------------------------------------------
4
C EVALUATION OF THE DIGAMMA FUNCTION
8
C PSI(XX) IS ASSIGNED THE VALUE 0 WHEN THE DIGAMMA FUNCTION CANNOT
11
C THE MAIN COMPUTATION INVOLVES EVALUATION OF RATIONAL CHEBYSHEV
12
C APPROXIMATIONS PUBLISHED IN MATH. COMP. 27, 123-127(1973) BY
13
C CODY, STRECOK AND THACHER.
15
C---------------------------------------------------------------------
16
C PSI WAS WRITTEN AT ARGONNE NATIONAL LABORATORY FOR THE FUNPACK
17
C PACKAGE OF SPECIAL FUNCTION SUBROUTINES. PSI WAS MODIFIED BY
19
C---------------------------------------------------------------------
20
C .. Scalar Arguments ..
24
DOUBLE PRECISION aug,den,dx0,piov4,sgn,upper,w,x,xmax1,xmx0,
29
DOUBLE PRECISION p1(7),p2(4),q1(6),q2(4)
31
C .. External Functions ..
32
DOUBLE PRECISION spmpar
34
EXTERNAL spmpar,ipmpar
36
C .. Intrinsic Functions ..
37
INTRINSIC abs,cos,dble,dlog,dmin1,int,sin
39
C .. Data statements ..
40
C---------------------------------------------------------------------
43
C DX0 = ZERO OF PSI TO EXTENDED PRECISION
45
C---------------------------------------------------------------------
46
C---------------------------------------------------------------------
48
C COEFFICIENTS FOR RATIONAL APPROXIMATION OF
49
C PSI(X) / (X - X0), 0.5 .LE. X .LE. 3.0
51
C---------------------------------------------------------------------
52
C---------------------------------------------------------------------
54
C COEFFICIENTS FOR RATIONAL APPROXIMATION OF
55
C PSI(X) - LN(X) + 1 / (2*X), X .GT. 3.0
57
C---------------------------------------------------------------------
58
DATA piov4/.785398163397448D0/
59
DATA dx0/1.461632144968362341262659542325721325D0/
60
DATA p1(1)/.895385022981970D-02/,p1(2)/.477762828042627D+01/,
61
+ p1(3)/.142441585084029D+03/,p1(4)/.118645200713425D+04/,
62
+ p1(5)/.363351846806499D+04/,p1(6)/.413810161269013D+04/,
63
+ p1(7)/.130560269827897D+04/
64
DATA q1(1)/.448452573429826D+02/,q1(2)/.520752771467162D+03/,
65
+ q1(3)/.221000799247830D+04/,q1(4)/.364127349079381D+04/,
66
+ q1(5)/.190831076596300D+04/,q1(6)/.691091682714533D-05/
67
DATA p2(1)/-.212940445131011D+01/,p2(2)/-.701677227766759D+01/,
68
+ p2(3)/-.448616543918019D+01/,p2(4)/-.648157123766197D+00/
69
DATA q2(1)/.322703493791143D+02/,q2(2)/.892920700481861D+02/,
70
+ q2(3)/.546117738103215D+02/,q2(4)/.777788548522962D+01/
72
C .. Executable Statements ..
73
C---------------------------------------------------------------------
75
C MACHINE DEPENDENT CONSTANTS ...
77
C XMAX1 = THE SMALLEST POSITIVE FLOATING POINT CONSTANT
78
C WITH ENTIRELY INTEGER REPRESENTATION. ALSO USED
79
C AS NEGATIVE OF LOWER BOUND ON ACCEPTABLE NEGATIVE
80
C ARGUMENTS AND AS THE POSITIVE ARGUMENT BEYOND WHICH
81
C PSI MAY BE REPRESENTED AS ALOG(X).
83
C XSMALL = ABSOLUTE ARGUMENT BELOW WHICH PI*COTAN(PI*X)
84
C MAY BE REPRESENTED BY 1/X.
86
C---------------------------------------------------------------------
88
xmax1 = dmin1(xmax1,1.0D0/spmpar(1))
90
C---------------------------------------------------------------------
93
IF (x.GE.0.5D0) GO TO 50
94
C---------------------------------------------------------------------
95
C X .LT. 0.5, USE REFLECTION FORMULA
96
C PSI(1-X) = PSI(X) + PI * COTAN(PI*X)
97
C---------------------------------------------------------------------
98
IF (abs(x).GT.xsmall) GO TO 10
99
IF (x.EQ.0.0D0) GO TO 100
100
C---------------------------------------------------------------------
101
C 0 .LT. ABS(X) .LE. XSMALL. USE 1/X AS A SUBSTITUTE
103
C---------------------------------------------------------------------
106
C---------------------------------------------------------------------
107
C REDUCTION OF ARGUMENT FOR COTAN
108
C---------------------------------------------------------------------
111
IF (w.GT.0.0D0) GO TO 20
114
C---------------------------------------------------------------------
115
C MAKE AN ERROR EXIT IF X .LE. -XMAX1
116
C---------------------------------------------------------------------
117
20 IF (w.GE.xmax1) GO TO 100
121
w = 4.0D0* (w-dble(nq)*.25D0)
122
C---------------------------------------------------------------------
123
C W IS NOW RELATED TO THE FRACTIONAL PART OF 4.0 * X.
124
C ADJUST ARGUMENT TO CORRESPOND TO VALUES IN FIRST
125
C QUADRANT AND DETERMINE SIGN
126
C---------------------------------------------------------------------
128
IF ((n+n).NE.nq) w = 1.0D0 - w
131
IF ((m+m).NE.n) sgn = -sgn
132
C---------------------------------------------------------------------
133
C DETERMINE FINAL VALUE FOR -PI*COTAN(PI*X)
134
C---------------------------------------------------------------------
139
C---------------------------------------------------------------------
140
C CHECK FOR SINGULARITY
141
C---------------------------------------------------------------------
142
IF (z.EQ.0.0D0) GO TO 100
143
C---------------------------------------------------------------------
144
C USE COS/SIN AS A SUBSTITUTE FOR COTAN, AND
145
C SIN/COS AS A SUBSTITUTE FOR TAN
146
C---------------------------------------------------------------------
147
aug = sgn* ((cos(z)/sin(z))*4.0D0)
150
30 aug = sgn* ((sin(z)/cos(z))*4.0D0)
152
50 IF (x.GT.3.0D0) GO TO 70
153
C---------------------------------------------------------------------
154
C 0.5 .LE. X .LE. 3.0
155
C---------------------------------------------------------------------
161
upper = (upper+p1(i+1))*x
164
den = (upper+p1(7))/ (den+q1(6))
168
C---------------------------------------------------------------------
169
C IF X .GE. XMAX1, PSI = LN(X)
170
C---------------------------------------------------------------------
171
70 IF (x.GE.xmax1) GO TO 90
172
C---------------------------------------------------------------------
173
C 3.0 .LT. X .LT. XMAX1
174
C---------------------------------------------------------------------
181
upper = (upper+p2(i+1))*w
184
aug = upper/ (den+q2(4)) - 0.5D0/x + aug
185
90 psi = aug + dlog(x)
187
C---------------------------------------------------------------------
189
C---------------------------------------------------------------------