2
SUBROUTINE CUNK1 (Z, FNU, KODE, MR, N, Y, NZ, TOL, ELIM, ALIM)
3
C***BEGIN PROLOGUE CUNK1
5
C***PURPOSE Subsidiary to CBESK
7
C***TYPE ALL (CUNK1-A, ZUNK1-A)
8
C***AUTHOR Amos, D. E., (SNL)
11
C CUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
12
C RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
13
C UNIFORM ASYMPTOTIC EXPANSION.
14
C MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
15
C NZ=-1 MEANS AN OVERFLOW WILL OCCUR
18
C***ROUTINES CALLED CS1S2, CUCHK, CUNIK, R1MACH
19
C***REVISION HISTORY (YYMMDD)
21
C 910415 Prologue converted to Version 4.0 format. (BAB)
22
C***END PROLOGUE CUNK1
23
COMPLEX CFN, CK, CONE, CRSC, CS, CSCL, CSGN, CSPN, CSR, CSS,
24
* CWRK, CY, CZERO, C1, C2, PHI, RZ, SUM, S1, S2, Y, Z,
25
* ZETA1, ZETA2, ZR, PHID, ZETA1D, ZETA2D, SUMD
26
REAL ALIM, ANG, APHI, ASC, ASCLE, BRY, CPN, C2I, C2M, C2R, ELIM,
27
* FMR, FN, FNF, FNU, PI, RS1, SGN, SPN, TOL, X, R1MACH
28
INTEGER I, IB, IFLAG, IFN, IL, INIT, INU, IUF, K, KDFLG, KFLAG,
29
* KK, KODE, MR, N, NW, NZ, J, IPARD, INITD, IC, M
30
DIMENSION BRY(3), INIT(2), Y(N), SUM(2), PHI(2), ZETA1(2),
31
* ZETA2(2), CY(2), CWRK(16,3), CSS(3), CSR(3)
32
DATA CZERO, CONE / (0.0E0,0.0E0) , (1.0E0,0.0E0) /
33
DATA PI / 3.14159265358979324E0 /
34
C***FIRST EXECUTABLE STATEMENT CUNK1
37
C-----------------------------------------------------------------------
38
C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
40
C-----------------------------------------------------------------------
41
CSCL = CMPLX(1.0E0/TOL,0.0E0)
42
CRSC = CMPLX(TOL,0.0E0)
49
BRY(1) = 1.0E+3*R1MACH(1)/TOL
54
IF (X.LT.0.0E0) ZR = -Z
57
C-----------------------------------------------------------------------
58
C J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
59
C-----------------------------------------------------------------------
63
CALL CUNIK(ZR, FN, 2, 0, TOL, INIT(J), PHI(J), ZETA1(J),
64
* ZETA2(J), SUM(J), CWRK(1,J))
65
IF (KODE.EQ.1) GO TO 20
67
S1 = ZETA1(J) - CFN*(CFN/(ZR+ZETA2(J)))
70
S1 = ZETA1(J) - ZETA2(J)
72
C-----------------------------------------------------------------------
73
C TEST FOR UNDERFLOW AND OVERFLOW
74
C-----------------------------------------------------------------------
76
IF (ABS(RS1).GT.ELIM) GO TO 60
77
IF (KDFLG.EQ.1) KFLAG = 2
78
IF (ABS(RS1).LT.ALIM) GO TO 40
79
C-----------------------------------------------------------------------
80
C REFINE TEST AND SCALE
81
C-----------------------------------------------------------------------
83
RS1 = RS1 + ALOG(APHI)
84
IF (ABS(RS1).GT.ELIM) GO TO 60
85
IF (KDFLG.EQ.1) KFLAG = 1
86
IF (RS1.LT.0.0E0) GO TO 40
87
IF (KDFLG.EQ.1) KFLAG = 3
89
C-----------------------------------------------------------------------
90
C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
92
C-----------------------------------------------------------------------
96
C2M = EXP(C2R)*REAL(CSS(KFLAG))
97
S1 = CMPLX(C2M,0.0E0)*CMPLX(COS(C2I),SIN(C2I))
99
IF (KFLAG.NE.1) GO TO 50
100
CALL CUCHK(S2, NW, BRY(1), TOL)
101
IF (NW.NE.0) GO TO 60
105
IF (KDFLG.EQ.2) GO TO 75
109
IF (RS1.GT.0.0E0) GO TO 290
110
C-----------------------------------------------------------------------
111
C FOR X.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
112
C-----------------------------------------------------------------------
113
IF (X.LT.0.0E0) GO TO 290
118
IF (Y(I-1).EQ.CZERO) GO TO 70
124
RZ = CMPLX(2.0E0,0.0E0)/ZR
125
CK = CMPLX(FN,0.0E0)*RZ
127
IF (N.LT.IB) GO TO 160
128
C-----------------------------------------------------------------------
129
C TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW, SET SEQUENCE TO ZERO
131
C-----------------------------------------------------------------------
134
IF (MR.NE.0) IPARD = 0
136
CALL CUNIK(ZR,FN,2,IPARD,TOL,INITD,PHID,ZETA1D,ZETA2D,SUMD,
138
IF (KODE.EQ.1) GO TO 80
140
S1=ZETA1D-CFN*(CFN/(ZR+ZETA2D))
146
IF (ABS(RS1).GT.ELIM) GO TO 95
147
IF (ABS(RS1).LT.ALIM) GO TO 100
148
C-----------------------------------------------------------------------
149
C REFINE ESTIMATE AND TEST
150
C-----------------------------------------------------------------------
153
IF (ABS(RS1).LT.ELIM) GO TO 100
155
IF (RS1.GT.0.0E0) GO TO 290
156
C-----------------------------------------------------------------------
157
C FOR X.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
158
C-----------------------------------------------------------------------
159
IF (X.LT.0.0E0) GO TO 290
166
C-----------------------------------------------------------------------
167
C RECUR FORWARD FOR REMAINDER OF THE SEQUENCE
168
C-----------------------------------------------------------------------
180
IF (KFLAG.GE.3) GO TO 120
186
IF (C2M.LE.ASCLE) GO TO 120
197
C-----------------------------------------------------------------------
198
C ANALYTIC CONTINUATION FOR RE(Z).LT.0.0E0
199
C-----------------------------------------------------------------------
203
C-----------------------------------------------------------------------
204
C CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
205
C-----------------------------------------------------------------------
206
CSGN = CMPLX(0.0E0,SGN)
213
CSPN = CMPLX(CPN,SPN)
214
IF (MOD(IFN,2).EQ.1) CSPN = -CSPN
223
C-----------------------------------------------------------------------
224
C LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
226
C-----------------------------------------------------------------------
228
IF (N.GT.2) GO TO 175
239
IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 180
240
IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 170
243
CALL CUNIK(ZR, FN, 1, 0, TOL, INITD, PHID, ZETA1D,
244
* ZETA2D, SUMD, CWRK(1,M))
245
IF (KODE.EQ.1) GO TO 190
246
CFN = CMPLX(FN,0.0E0)
247
S1 = -ZETA1D + CFN*(CFN/(ZR+ZETA2D))
250
S1 = -ZETA1D + ZETA2D
252
C-----------------------------------------------------------------------
253
C TEST FOR UNDERFLOW AND OVERFLOW
254
C-----------------------------------------------------------------------
256
IF (ABS(RS1).GT.ELIM) GO TO 250
257
IF (KDFLG.EQ.1) IFLAG = 2
258
IF (ABS(RS1).LT.ALIM) GO TO 210
259
C-----------------------------------------------------------------------
260
C REFINE TEST AND SCALE
261
C-----------------------------------------------------------------------
263
RS1 = RS1 + ALOG(APHI)
264
IF (ABS(RS1).GT.ELIM) GO TO 250
265
IF (KDFLG.EQ.1) IFLAG = 1
266
IF (RS1.LT.0.0E0) GO TO 210
267
IF (KDFLG.EQ.1) IFLAG = 3
272
C2M = EXP(C2R)*REAL(CSS(IFLAG))
273
S1 = CMPLX(C2M,0.0E0)*CMPLX(COS(C2I),SIN(C2I))
275
IF (IFLAG.NE.1) GO TO 220
276
CALL CUCHK(S2, NW, BRY(1), TOL)
277
IF (NW.NE.0) S2 = CMPLX(0.0E0,0.0E0)
282
C-----------------------------------------------------------------------
283
C ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
284
C-----------------------------------------------------------------------
286
IF (KODE.EQ.1) GO TO 240
287
CALL CS1S2(ZR, S1, S2, NW, ASC, ALIM, IUF)
293
IF (C2.NE.CZERO) GO TO 245
297
IF (KDFLG.EQ.2) GO TO 265
301
IF (RS1.GT.0.0E0) GO TO 290
309
C-----------------------------------------------------------------------
310
C RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
311
C K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
312
C INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
313
C-----------------------------------------------------------------------
321
S2 = S1 + CMPLX(FN+FNF,0.0E0)*RZ*S2
327
IF (KODE.EQ.1) GO TO 270
328
CALL CS1S2(ZR, C1, C2, NW, ASC, ALIM, IUF)
334
IF (IFLAG.GE.3) GO TO 280
340
IF (C2M.LE.ASCLE) GO TO 280