Line data Source code
1 : !!****m* ABINIT/m_bessel2
2 : !! NAME
3 : !! m_bessel2
4 : !!
5 : !! FUNCTION
6 : !! Computes modified Bessel functions of the first and second kind.
7 : !! These routines were taken from https://www.netlib.org/slatec/.
8 : !!
9 : !! COPYRIGHT
10 : !! Copyright (C) 2024-2026 ABINIT group
11 : !! This file is distributed under the terms of the
12 : !! GNU General Public License, see ~abinit/COPYING
13 : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : !!
15 : !! SOURCE
16 :
17 : #if defined HAVE_CONFIG_H
18 : #include "config.h"
19 : #endif
20 :
21 : #include "abi_common.h"
22 :
23 : MODULE m_bessel2
24 :
25 : use defs_basis
26 : use m_errors
27 :
28 : implicit none
29 :
30 : private
31 :
32 : public :: bessel_iv
33 : public :: bessel_kv
34 :
35 : CONTAINS !========================================================================================
36 : !!***
37 :
38 : !!****f* m_bessel2/bessel_iv
39 : !! NAME
40 : !! bessel_iv
41 : !!
42 : !! FUNCTION
43 : !!
44 : !! Compute modified Bessel function of the first kind for any real order
45 : !!
46 : !! INPUTS
47 : !! k= order
48 : !! xr= real part of the value at which to compute the Bessel function
49 : !! xi= real part of the value at which to compute the Bessel function
50 : !!
51 : !! OUTPUT
52 : !! ivr,ivi= real part and imaginary part of the value of the Bessel function
53 : !!
54 : !! SOURCE
55 :
56 0 : subroutine bessel_iv(k,xr,xi,ivr,ivi)
57 :
58 : !Arguments ------------------------------------
59 : real(dp), intent(in) :: k,xr,xi
60 : real(dp), intent(out) :: ivr,ivi
61 : !Local variables ------------------------------
62 : integer :: ierr,nz
63 : real(dp) :: s
64 : real(dp) :: cyi(1),cyik(1),cyr(1),cyrk(1)
65 : !************************************************************************
66 :
67 0 : call zbesi(xr,xi,abs(k),1,1,cyr,cyi,nz,ierr)
68 0 : if (k >= zero) then
69 0 : ivr = cyr(1)
70 0 : ivi = cyi(1)
71 : else
72 0 : s = sin(abs(k)*pi) * two / pi
73 0 : call zbesk(xr,xi,abs(k),1,1,cyrk,cyik,nz,ierr)
74 0 : ivr = cyr(1) + s*cyrk(1)
75 0 : ivi = cyi(1) + s*cyik(1)
76 : end if
77 :
78 0 : end subroutine bessel_iv
79 : !!***
80 :
81 : !----------------------------------------------------------------------
82 :
83 : !!****f* m_bessel2/bessel_kv
84 : !! NAME
85 : !! bessel_iv
86 : !!
87 : !! FUNCTION
88 : !!
89 : !! Compute modified Bessel function of the second kind for any real order
90 : !!
91 : !! INPUTS
92 : !! k= order
93 : !! xr= real part of the value at which to compute the Bessel function
94 : !! xi= real part of the value at which to compute the Bessel function
95 : !!
96 : !! OUTPUT
97 : !! kvr,kvi= real part and imaginary part of the value of the Bessel function
98 : !!
99 : !! SOURCE
100 :
101 0 : subroutine bessel_kv(k,xr,xi,kvr,kvi)
102 :
103 : !Arguments ------------------------------------
104 : real(dp), intent(in) :: k,xi,xr
105 : real(dp), intent(out) :: kvi,kvr
106 : !Local variables ------------------------------
107 : integer :: ierr,nz
108 : real(dp) :: cyi(1),cyr(1)
109 : !************************************************************************
110 :
111 0 : call zbesk(xr,xi,abs(k),1,1,cyr,cyi,nz,ierr)
112 :
113 0 : if (xi == zero) then
114 0 : kvr = cyr(1)
115 0 : kvi = zero
116 : else
117 0 : kvr = cyr(1)
118 0 : kvi = cyi(1)
119 : end if
120 :
121 0 : end subroutine bessel_kv
122 : !!***
123 :
124 : !----------------------------------------------------------------------
125 :
126 0 : SUBROUTINE ZBESI(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
127 : !C***BEGIN PROLOGUE ZBESI
128 : !C***DATE WRITTEN 830501 (YYMMDD)
129 : !C***REVISION DATE 890801 (YYMMDD)
130 : !C***CATEGORY NO. B5K
131 : !C***KEYWORDS I-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
132 : !C MODIFIED BESSEL FUNCTION OF THE FIRST KIND
133 : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
134 : !C***PURPOSE TO COMPUTE I-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
135 : !C***DESCRIPTION
136 : !C
137 : !C ***A DOUBLE PRECISION ROUTINE***
138 : !C ON KODE=1, ZBESI COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
139 : !C BESSEL FUNCTIONS CY(J)=I(FNU+J-1,Z) FOR REAL, NONNEGATIVE
140 : !C ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z IN THE CUT PLANE
141 : !C -PI.LT.ARG(Z).LE.PI. ON KODE=2, ZBESI RETURNS THE SCALED
142 : !C FUNCTIONS
143 : !C
144 : !C CY(J)=EXP(-ABS(X))*I(FNU+J-1,Z) J = 1,...,N , X=REAL(Z)
145 : !C
146 : !C WITH THE EXPONENTIAL GROWTH REMOVED IN BOTH THE LEFT AND
147 : !C RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
148 : !C ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
149 : !C (REF. 1).
150 : !C
151 : !C INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
152 : !C ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI
153 : !C FNU - ORDER OF INITIAL I FUNCTION, FNU.GE.0.0D0
154 : !C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
155 : !C KODE= 1 RETURNS
156 : !C CY(J)=I(FNU+J-1,Z), J=1,...,N
157 : !C = 2 RETURNS
158 : !C CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)), J=1,...,N
159 : !C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
160 : !C
161 : !C OUTPUT CYR,CYI ARE DOUBLE PRECISION
162 : !C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
163 : !C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
164 : !C CY(J)=I(FNU+J-1,Z) OR
165 : !C CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)) J=1,...,N
166 : !C DEPENDING ON KODE, X=REAL(Z)
167 : !C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
168 : !C NZ= 0 , NORMAL RETURN
169 : !C NZ.GT.0 , LAST NZ COMPONENTS OF CY SET TO ZERO
170 : !C TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
171 : !C J = N-NZ+1,...,N
172 : !C IERR - ERROR FLAG
173 : !C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
174 : !C IERR=1, INPUT ERROR - NO COMPUTATION
175 : !C IERR=2, OVERFLOW - NO COMPUTATION, REAL(Z) TOO
176 : !C LARGE ON KODE=1
177 : !C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
178 : !C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
179 : !C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
180 : !C ACCURACY
181 : !C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
182 : !C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
183 : !C CANCE BY ARGUMENT REDUCTION
184 : !C IERR=5, ERROR - NO COMPUTATION,
185 : !C ALGORITHM TERMINATION CONDITION NOT MET
186 : !C
187 : !C***LONG DESCRIPTION
188 : !C
189 : !C THE COMPUTATION IS CARRIED OUT BY THE POWER SERIES FOR
190 : !C SMALL CABS(Z), THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z),
191 : !C THE MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN AND A
192 : !C NEUMANN SERIES FOR IMTERMEDIATE MAGNITUDES, AND THE
193 : !C UNIFORM ASYMPTOTIC EXPANSIONS FOR I(FNU,Z) AND J(FNU,Z)
194 : !C FOR LARGE ORDERS. BACKWARD RECURRENCE IS USED TO GENERATE
195 : !C SEQUENCES OR REDUCE ORDERS WHEN NECESSARY.
196 : !C
197 : !C THE CALCULATIONS ABOVE ARE DONE IN THE RIGHT HALF PLANE AND
198 : !C CONTINUED INTO THE LEFT HALF PLANE BY THE FORMULA
199 : !C
200 : !C I(FNU,Z*EXP(M*PI)) = EXP(M*PI*FNU)*I(FNU,Z) REAL(Z).GT.0.0
201 : !C M = +I OR -I, I**2=-1
202 : !C
203 : !C FOR NEGATIVE ORDERS,THE FORMULA
204 : !C
205 : !C I(-FNU,Z) = I(FNU,Z) + (2/PI)*SIN(PI*FNU)*K(FNU,Z)
206 : !C
207 : !C CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
208 : !C THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
209 : !C INTEGER,THE MAGNITUDE OF I(-FNU,Z)=I(FNU,Z) IS A LARGE
210 : !C NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
211 : !C K(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
212 : !C TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
213 : !C UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
214 : !C OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
215 : !C LARGE MEANS FNU.GT.CABS(Z).
216 : !C
217 : !C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
218 : !C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
219 : !C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
220 : !C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
221 : !C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
222 : !C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
223 : !C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
224 : !C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
225 : !C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
226 : !C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
227 : !C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
228 : !C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
229 : !C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
230 : !C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
231 : !C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
232 : !C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
233 : !C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
234 : !C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
235 : !C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
236 : !C
237 : !C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
238 : !C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
239 : !C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
240 : !C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
241 : !C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
242 : !C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
243 : !C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
244 : !C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
245 : !C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
246 : !C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
247 : !C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
248 : !C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
249 : !C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
250 : !C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
251 : !C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
252 : !C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
253 : !C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
254 : !C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
255 : !C OR -PI/2+P.
256 : !C
257 : !C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
258 : !C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
259 : !C COMMERCE, 1955.
260 : !C
261 : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
262 : !C BY D. E. AMOS, SAND83-0083, MAY, 1983.
263 : !C
264 : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
265 : !C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
266 : !C
267 : !C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
268 : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
269 : !C 1018, MAY, 1985
270 : !C
271 : !C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
272 : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
273 : !C MATH. SOFTWARE, 1986
274 : !C
275 : !C***ROUTINES CALLED ZBINU,I1MACH,D1MACH
276 : !C***END PROLOGUE ZBESI
277 : !C COMPLEX CONE,CSGN,CW,CY,CZERO,Z,ZN
278 : DOUBLE PRECISION AA, ALIM, ARG, CONEI, CONER, CSGNI, CSGNR, CYI, &
279 : & CYR, DIG, ELIM, FNU, FNUL, PI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR, &
280 : & ZR, AZ, BB, FN, ASCLE, RTOL, ATOL, STI
281 : INTEGER I, IERR, INU, K, KODE, K1,K2,N,NZ,NN
282 : DIMENSION CYR(N), CYI(N)
283 : DATA PI /3.14159265358979324D0/
284 : DATA CONER, CONEI /1.0D0,0.0D0/
285 : !C
286 : !C***FIRST EXECUTABLE STATEMENT ZBESI
287 0 : IERR = 0
288 0 : NZ=0
289 0 : IF (FNU.LT.0.0D0) IERR=1
290 0 : IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
291 0 : IF (N.LT.1) IERR=1
292 0 : IF (IERR.NE.0) RETURN
293 : !C-----------------------------------------------------------------------
294 : !C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
295 : !C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
296 : !C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
297 : !C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
298 : !C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
299 : !C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
300 : !C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
301 : !C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
302 : !C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
303 : !C-----------------------------------------------------------------------
304 0 : TOL = DMAX1(D1MACH(4),1.0D-18)
305 0 : K1 = I1MACH(15)
306 0 : K2 = I1MACH(16)
307 0 : R1M5 = D1MACH(5)
308 0 : K = MIN0(IABS(K1),IABS(K2))
309 0 : ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
310 0 : K1 = I1MACH(14) - 1
311 0 : AA = R1M5*DBLE(FLOAT(K1))
312 0 : DIG = DMIN1(AA,18.0D0)
313 0 : AA = AA*2.303D0
314 0 : ALIM = ELIM + DMAX1(-AA,-41.45D0)
315 0 : RL = 1.2D0*DIG + 3.0D0
316 0 : FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
317 : !C-----------------------------------------------------------------------------
318 : !C TEST FOR PROPER RANGE
319 : !C-----------------------------------------------------------------------
320 0 : AZ = AZABS(ZR,ZI)
321 0 : FN = FNU+DBLE(FLOAT(N-1))
322 0 : AA = 0.5D0/TOL
323 0 : BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
324 0 : AA = DMIN1(AA,BB)
325 0 : IF (AZ.GT.AA) GO TO 260
326 0 : IF (FN.GT.AA) GO TO 260
327 0 : AA = DSQRT(AA)
328 0 : IF (AZ.GT.AA) IERR=3
329 0 : IF (FN.GT.AA) IERR=3
330 0 : ZNR = ZR
331 0 : ZNI = ZI
332 0 : CSGNR = CONER
333 0 : CSGNI = CONEI
334 0 : IF (ZR.GE.0.0D0) GO TO 40
335 0 : ZNR = -ZR
336 0 : ZNI = -ZI
337 : !C-----------------------------------------------------------------------
338 : !C CALCULATE CSGN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
339 : !C WHEN FNU IS LARGE
340 : !C-----------------------------------------------------------------------
341 0 : INU = INT(SNGL(FNU))
342 0 : ARG = (FNU-DBLE(FLOAT(INU)))*PI
343 0 : IF (ZI.LT.0.0D0) ARG = -ARG
344 0 : CSGNR = DCOS(ARG)
345 0 : CSGNI = DSIN(ARG)
346 0 : IF (MOD(INU,2).EQ.0) GO TO 40
347 0 : CSGNR = -CSGNR
348 0 : CSGNI = -CSGNI
349 : 40 CONTINUE
350 : CALL ZBINU(ZNR, ZNI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL, &
351 0 : & ELIM, ALIM)
352 0 : IF (NZ.LT.0) GO TO 120
353 0 : IF (ZR.GE.0.0D0) RETURN
354 : !C-----------------------------------------------------------------------
355 : !C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE
356 : !C-----------------------------------------------------------------------
357 0 : NN = N - NZ
358 0 : IF (NN.EQ.0) RETURN
359 0 : RTOL = 1.0D0/TOL
360 0 : ASCLE = D1MACH(1)*RTOL*1.0D+3
361 0 : DO 50 I=1,NN
362 : !C STR = CYR(I)*CSGNR - CYI(I)*CSGNI
363 : !C CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
364 : !C CYR(I) = STR
365 0 : AA = CYR(I)
366 0 : BB = CYI(I)
367 0 : ATOL = 1.0D0
368 0 : IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 55
369 0 : AA = AA*RTOL
370 0 : BB = BB*RTOL
371 0 : ATOL = TOL
372 : 55 CONTINUE
373 0 : STR = AA*CSGNR - BB*CSGNI
374 0 : STI = AA*CSGNI + BB*CSGNR
375 0 : CYR(I) = STR*ATOL
376 0 : CYI(I) = STI*ATOL
377 0 : CSGNR = -CSGNR
378 0 : CSGNI = -CSGNI
379 0 : 50 CONTINUE
380 0 : RETURN
381 : 120 CONTINUE
382 0 : IF(NZ.EQ.(-2)) GO TO 130
383 0 : NZ = 0
384 0 : IERR=2
385 0 : RETURN
386 : 130 CONTINUE
387 0 : NZ=0
388 0 : IERR=5
389 0 : RETURN
390 : 260 CONTINUE
391 0 : NZ=0
392 0 : IERR=4
393 0 : RETURN
394 : END SUBROUTINE ZBESI
395 :
396 :
397 0 : SUBROUTINE ZBESK(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
398 : !C***BEGIN PROLOGUE ZBESK
399 : !C***DATE WRITTEN 830501 (YYMMDD)
400 : !C***REVISION DATE 890801 (YYMMDD)
401 : !C***CATEGORY NO. B5K
402 : !C***KEYWORDS K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
403 : !C MODIFIED BESSEL FUNCTION OF THE SECOND KIND,
404 : !C BESSEL FUNCTION OF THE THIRD KIND
405 : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
406 : !C***PURPOSE TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
407 : !C***DESCRIPTION
408 : !C
409 : !C ***A DOUBLE PRECISION ROUTINE***
410 : !C
411 : !C ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
412 : !C BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE
413 : !C ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0)
414 : !C IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK
415 : !C RETURNS THE SCALED K FUNCTIONS,
416 : !C
417 : !C CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N,
418 : !C
419 : !C WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND
420 : !C RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND
421 : !C NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL
422 : !C FUNCTIONS (REF. 1).
423 : !C
424 : !C INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
425 : !C ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
426 : !C -PI.LT.ARG(Z).LE.PI
427 : !C FNU - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0
428 : !C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
429 : !C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
430 : !C KODE= 1 RETURNS
431 : !C CY(I)=K(FNU+I-1,Z), I=1,...,N
432 : !C = 2 RETURNS
433 : !C CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
434 : !C
435 : !C OUTPUT CYR,CYI ARE DOUBLE PRECISION
436 : !C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
437 : !C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
438 : !C CY(I)=K(FNU+I-1,Z), I=1,...,N OR
439 : !C CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
440 : !C DEPENDING ON KODE
441 : !C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW.
442 : !C NZ= 0 , NORMAL RETURN
443 : !C NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
444 : !C TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
445 : !C I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0
446 : !C NZ STATES ONLY THE NUMBER OF UNDERFLOWS
447 : !C IN THE SEQUENCE.
448 : !C
449 : !C IERR - ERROR FLAG
450 : !C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
451 : !C IERR=1, INPUT ERROR - NO COMPUTATION
452 : !C IERR=2, OVERFLOW - NO COMPUTATION, FNU IS
453 : !C TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
454 : !C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
455 : !C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
456 : !C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
457 : !C ACCURACY
458 : !C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
459 : !C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
460 : !C CANCE BY ARGUMENT REDUCTION
461 : !C IERR=5, ERROR - NO COMPUTATION,
462 : !C ALGORITHM TERMINATION CONDITION NOT MET
463 : !C
464 : !C***LONG DESCRIPTION
465 : !C
466 : !C EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS
467 : !C DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD
468 : !C RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT
469 : !C HALF PLANE BY THE RELATION
470 : !C
471 : !C K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
472 : !C MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
473 : !C
474 : !C WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
475 : !C
476 : !C FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED
477 : !C BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS.
478 : !C
479 : !C FOR NEGATIVE ORDERS, THE FORMULA
480 : !C
481 : !C K(-FNU,Z) = K(FNU,Z)
482 : !C
483 : !C CAN BE USED.
484 : !C
485 : !C CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS
486 : !C AVAILABLE.
487 : !C
488 : !C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
489 : !C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
490 : !C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
491 : !C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
492 : !C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
493 : !C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
494 : !C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
495 : !C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
496 : !C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
497 : !C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
498 : !C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
499 : !C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
500 : !C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
501 : !C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
502 : !C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
503 : !C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
504 : !C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
505 : !C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
506 : !C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
507 : !C
508 : !C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
509 : !C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
510 : !C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
511 : !C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
512 : !C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
513 : !C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
514 : !C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
515 : !C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
516 : !C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
517 : !C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
518 : !C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
519 : !C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
520 : !C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
521 : !C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
522 : !C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
523 : !C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
524 : !C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
525 : !C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
526 : !C OR -PI/2+P.
527 : !C
528 : !C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
529 : !C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
530 : !C COMMERCE, 1955.
531 : !C
532 : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
533 : !C BY D. E. AMOS, SAND83-0083, MAY, 1983.
534 : !C
535 : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
536 : !C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983.
537 : !C
538 : !C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
539 : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
540 : !C 1018, MAY, 1985
541 : !C
542 : !C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
543 : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
544 : !C MATH. SOFTWARE, 1986
545 : !C
546 : !C***ROUTINES CALLED ZACON,ZBKNU,ZBUNK,ZUOIK,AZABS,I1MACH,D1MACH
547 : !C***END PROLOGUE ZBESK
548 : !C
549 : !C COMPLEX CY,Z
550 : DOUBLE PRECISION AA, ALIM, ALN, ARG, AZ, CYI, CYR, DIG, ELIM, FN, &
551 : & FNU, FNUL, RL, R1M5, TOL, UFL, ZI, ZR, BB !D1MACH, AZABS
552 : INTEGER IERR, K, KODE, K1, K2, MR, N, NN, NUF, NW, NZ!, I1MACH
553 : DIMENSION CYR(N), CYI(N)
554 : !C***FIRST EXECUTABLE STATEMENT ZBESK
555 0 : IERR = 0
556 0 : NZ=0
557 0 : IF (ZI.EQ.0.0E0 .AND. ZR.EQ.0.0E0) IERR=1
558 0 : IF (FNU.LT.0.0D0) IERR=1
559 0 : IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
560 0 : IF (N.LT.1) IERR=1
561 0 : IF (IERR.NE.0) RETURN
562 0 : NN = N
563 : !C-----------------------------------------------------------------------
564 : !C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
565 : !C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
566 : !C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
567 : !C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
568 : !C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
569 : !C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
570 : !C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
571 : !C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
572 : !C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
573 : !C-----------------------------------------------------------------------
574 0 : TOL = DMAX1(D1MACH(4),1.0D-18)
575 0 : K1 = I1MACH(15)
576 0 : K2 = I1MACH(16)
577 0 : R1M5 = D1MACH(5)
578 0 : K = MIN0(IABS(K1),IABS(K2))
579 0 : ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
580 0 : K1 = I1MACH(14) - 1
581 0 : AA = R1M5*DBLE(FLOAT(K1))
582 0 : DIG = DMIN1(AA,18.0D0)
583 0 : AA = AA*2.303D0
584 0 : ALIM = ELIM + DMAX1(-AA,-41.45D0)
585 0 : FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
586 0 : RL = 1.2D0*DIG + 3.0D0
587 : !C-----------------------------------------------------------------------------
588 : !C TEST FOR PROPER RANGE
589 : !C-----------------------------------------------------------------------
590 0 : AZ = AZABS(ZR,ZI)
591 0 : FN = FNU + DBLE(FLOAT(NN-1))
592 0 : AA = 0.5D0/TOL
593 0 : BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
594 0 : AA = DMIN1(AA,BB)
595 0 : IF (AZ.GT.AA) GO TO 260
596 0 : IF (FN.GT.AA) GO TO 260
597 0 : AA = DSQRT(AA)
598 0 : IF (AZ.GT.AA) IERR=3
599 0 : IF (FN.GT.AA) IERR=3
600 : !C-----------------------------------------------------------------------
601 : !C OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
602 : !C-----------------------------------------------------------------------
603 : !C UFL = DEXP(-ELIM)
604 0 : UFL = D1MACH(1)*1.0D+3
605 0 : IF (AZ.LT.UFL) GO TO 180
606 0 : IF (FNU.GT.FNUL) GO TO 80
607 0 : IF (FN.LE.1.0D0) GO TO 60
608 0 : IF (FN.GT.2.0D0) GO TO 50
609 0 : IF (AZ.GT.TOL) GO TO 60
610 0 : ARG = 0.5D0*AZ
611 0 : ALN = -FN*DLOG(ARG)
612 0 : IF (ALN.GT.ELIM) GO TO 180
613 0 : GO TO 60
614 : 50 CONTINUE
615 : CALL ZUOIK(ZR, ZI, FNU, KODE, 2, NN, CYR, CYI, NUF, TOL, ELIM, &
616 0 : & ALIM)
617 0 : IF (NUF.LT.0) GO TO 180
618 0 : NZ = NZ + NUF
619 0 : NN = NN - NUF
620 : !C-----------------------------------------------------------------------
621 : !C HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
622 : !C IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
623 : !C-----------------------------------------------------------------------
624 0 : IF (NN.EQ.0) GO TO 100
625 : 60 CONTINUE
626 0 : IF (ZR.LT.0.0D0) GO TO 70
627 : !C-----------------------------------------------------------------------
628 : !C RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0.
629 : !C-----------------------------------------------------------------------
630 0 : CALL ZBKNU(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
631 0 : IF (NW.LT.0) GO TO 200
632 0 : NZ=NW
633 0 : RETURN
634 : !C-----------------------------------------------------------------------
635 : !C LEFT HALF PLANE COMPUTATION
636 : !C PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2.
637 : !C-----------------------------------------------------------------------
638 : 70 CONTINUE
639 0 : IF (NZ.NE.0) GO TO 180
640 0 : MR = 1
641 0 : IF (ZI.LT.0.0D0) MR = -1
642 : CALL ZACON(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, RL, FNUL, &
643 0 : & TOL, ELIM, ALIM)
644 0 : IF (NW.LT.0) GO TO 200
645 0 : NZ=NW
646 0 : RETURN
647 : !C-----------------------------------------------------------------------
648 : !C UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
649 : !C-----------------------------------------------------------------------
650 : 80 CONTINUE
651 0 : MR = 0
652 0 : IF (ZR.GE.0.0D0) GO TO 90
653 0 : MR = 1
654 0 : IF (ZI.LT.0.0D0) MR = -1
655 : 90 CONTINUE
656 : CALL ZBUNK(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, TOL, ELIM, &
657 0 : & ALIM)
658 0 : IF (NW.LT.0) GO TO 200
659 0 : NZ = NZ + NW
660 0 : RETURN
661 : 100 CONTINUE
662 0 : IF (ZR.LT.0.0D0) GO TO 180
663 0 : RETURN
664 : 180 CONTINUE
665 0 : NZ = 0
666 0 : IERR=2
667 0 : RETURN
668 : 200 CONTINUE
669 0 : IF(NW.EQ.(-1)) GO TO 180
670 0 : NZ=0
671 0 : IERR=5
672 0 : RETURN
673 : 260 CONTINUE
674 0 : NZ=0
675 0 : IERR=4
676 0 : RETURN
677 : END SUBROUTINE ZBESK
678 :
679 0 : DOUBLE PRECISION FUNCTION AZABS(ZR, ZI)
680 : !C***BEGIN PROLOGUE AZABS
681 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
682 : !C
683 : !C AZABS COMPUTES THE ABSOLUTE VALUE OR MAGNITUDE OF A DOUBLE
684 : !C PRECISION COMPLEX VARIABLE CMPLX(ZR,ZI)
685 : !C
686 : !C***ROUTINES CALLED (NONE)
687 : !C***END PROLOGUE AZABS
688 : DOUBLE PRECISION ZR, ZI, U, V, Q, S
689 0 : U = DABS(ZR)
690 0 : V = DABS(ZI)
691 0 : S = U + V
692 : !C-----------------------------------------------------------------------
693 : !C S*1.0D0 MAKES AN UNNORMALIZED UNDERFLOW ON CDC MACHINES INTO A
694 : !C TRUE FLOATING ZERO
695 : !C-----------------------------------------------------------------------
696 0 : S = S*1.0D+0
697 0 : IF (S.EQ.0.0D+0) GO TO 20
698 0 : IF (U.GT.V) GO TO 10
699 0 : Q = U/V
700 0 : AZABS = V*DSQRT(1.D+0+Q*Q)
701 0 : RETURN
702 0 : 10 Q = V/U
703 0 : AZABS = U*DSQRT(1.D+0+Q*Q)
704 0 : RETURN
705 0 : 20 AZABS = 0.0D+0
706 : RETURN
707 : END FUNCTION AZABS
708 :
709 :
710 :
711 0 : SUBROUTINE ZACON(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, FNUL, &
712 : & TOL, ELIM, ALIM)
713 : !C***BEGIN PROLOGUE ZACON
714 : !C***REFER TO ZBESK,ZBESH
715 : !C
716 : !C ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA
717 : !C
718 : !C K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
719 : !C MP=PI*MR*CMPLX(0.0,1.0)
720 : !C
721 : !C TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
722 : !C HALF Z PLANE
723 : !C
724 : !C***ROUTINES CALLED ZBINU,ZBKNU,ZS1S2,D1MACH,AZABS,ZMLT
725 : !C***END PROLOGUE ZACON
726 : !C COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST,
727 : !C *S1,S2,Y,Z,ZN
728 : DOUBLE PRECISION ALIM, ARG, ASCLE, AS2, AZN, BRY, BSCLE, CKI, &
729 : & CKR, CONER, CPN, CSCL, CSCR, CSGNI, CSGNR, CSPNI, CSPNR, &
730 : & CSR, CSRR, CSSR, CYI, CYR, C1I, C1M, C1R, C2I, C2R, ELIM, FMR, &
731 : & FN, FNU, FNUL, PI, PTI, PTR, RAZN, RL, RZI, RZR, SC1I, SC1R, &
732 : & SC2I, SC2R, SGN, SPN, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, &
733 : & YY, ZEROR, ZI, ZNI, ZNR, ZR!, D1MACH, AZABS
734 : INTEGER I, INU, IUF, KFLAG, KODE, MR, N, NN, NW, NZ
735 : DIMENSION YR(N), YI(N), CYR(2), CYI(2), CSSR(3), CSRR(3), BRY(3)
736 : DATA PI / 3.14159265358979324D0 /
737 : DATA ZEROR,CONER / 0.0D0,1.0D0 /
738 0 : NZ = 0
739 0 : ZNR = -ZR
740 0 : ZNI = -ZI
741 0 : NN = N
742 : CALL ZBINU(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, FNUL, TOL, &
743 0 : & ELIM, ALIM)
744 0 : IF (NW.LT.0) GO TO 90
745 : !C-----------------------------------------------------------------------
746 : !C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
747 : !C-----------------------------------------------------------------------
748 0 : NN = MIN0(2,N)
749 0 : CALL ZBKNU(ZNR, ZNI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
750 0 : IF (NW.NE.0) GO TO 90
751 0 : S1R = CYR(1)
752 0 : S1I = CYI(1)
753 0 : FMR = DBLE(FLOAT(MR))
754 0 : SGN = -DSIGN(PI,FMR)
755 0 : CSGNR = ZEROR
756 0 : CSGNI = SGN
757 0 : IF (KODE.EQ.1) GO TO 10
758 0 : YY = -ZNI
759 0 : CPN = DCOS(YY)
760 0 : SPN = DSIN(YY)
761 0 : CALL ZMLT(CSGNR, CSGNI, CPN, SPN, CSGNR, CSGNI)
762 : 10 CONTINUE
763 : !C-----------------------------------------------------------------------
764 : !C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
765 : !C WHEN FNU IS LARGE
766 : !C-----------------------------------------------------------------------
767 0 : INU = INT(SNGL(FNU))
768 0 : ARG = (FNU-DBLE(FLOAT(INU)))*SGN
769 0 : CPN = DCOS(ARG)
770 0 : SPN = DSIN(ARG)
771 0 : CSPNR = CPN
772 0 : CSPNI = SPN
773 0 : IF (MOD(INU,2).EQ.0) GO TO 20
774 0 : CSPNR = -CSPNR
775 0 : CSPNI = -CSPNI
776 : 20 CONTINUE
777 0 : IUF = 0
778 0 : C1R = S1R
779 0 : C1I = S1I
780 0 : C2R = YR(1)
781 0 : C2I = YI(1)
782 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
783 0 : IF (KODE.EQ.1) GO TO 30
784 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
785 0 : NZ = NZ + NW
786 0 : SC1R = C1R
787 0 : SC1I = C1I
788 : 30 CONTINUE
789 0 : CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
790 0 : CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
791 0 : YR(1) = STR + PTR
792 0 : YI(1) = STI + PTI
793 0 : IF (N.EQ.1) RETURN
794 0 : CSPNR = -CSPNR
795 0 : CSPNI = -CSPNI
796 0 : S2R = CYR(2)
797 0 : S2I = CYI(2)
798 0 : C1R = S2R
799 0 : C1I = S2I
800 0 : C2R = YR(2)
801 0 : C2I = YI(2)
802 0 : IF (KODE.EQ.1) GO TO 40
803 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
804 0 : NZ = NZ + NW
805 0 : SC2R = C1R
806 0 : SC2I = C1I
807 : 40 CONTINUE
808 0 : CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
809 0 : CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
810 0 : YR(2) = STR + PTR
811 0 : YI(2) = STI + PTI
812 0 : IF (N.EQ.2) RETURN
813 0 : CSPNR = -CSPNR
814 0 : CSPNI = -CSPNI
815 0 : AZN = AZABS(ZNR,ZNI)
816 0 : RAZN = 1.0D0/AZN
817 0 : STR = ZNR*RAZN
818 0 : STI = -ZNI*RAZN
819 0 : RZR = (STR+STR)*RAZN
820 0 : RZI = (STI+STI)*RAZN
821 0 : FN = FNU + 1.0D0
822 0 : CKR = FN*RZR
823 0 : CKI = FN*RZI
824 : !C-----------------------------------------------------------------------
825 : !C SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
826 : !C-----------------------------------------------------------------------
827 0 : CSCL = 1.0D0/TOL
828 0 : CSCR = TOL
829 0 : CSSR(1) = CSCL
830 0 : CSSR(2) = CONER
831 0 : CSSR(3) = CSCR
832 0 : CSRR(1) = CSCR
833 0 : CSRR(2) = CONER
834 0 : CSRR(3) = CSCL
835 0 : BRY(1) = ASCLE
836 0 : BRY(2) = 1.0D0/ASCLE
837 0 : BRY(3) = D1MACH(2)
838 0 : AS2 = AZABS(S2R,S2I)
839 0 : KFLAG = 2
840 0 : IF (AS2.GT.BRY(1)) GO TO 50
841 : KFLAG = 1
842 0 : GO TO 60
843 : 50 CONTINUE
844 0 : IF (AS2.LT.BRY(2)) GO TO 60
845 0 : KFLAG = 3
846 : 60 CONTINUE
847 0 : BSCLE = BRY(KFLAG)
848 0 : S1R = S1R*CSSR(KFLAG)
849 0 : S1I = S1I*CSSR(KFLAG)
850 0 : S2R = S2R*CSSR(KFLAG)
851 0 : S2I = S2I*CSSR(KFLAG)
852 0 : CSR = CSRR(KFLAG)
853 0 : DO 80 I=3,N
854 0 : STR = S2R
855 0 : STI = S2I
856 0 : S2R = CKR*STR - CKI*STI + S1R
857 0 : S2I = CKR*STI + CKI*STR + S1I
858 0 : S1R = STR
859 0 : S1I = STI
860 0 : C1R = S2R*CSR
861 0 : C1I = S2I*CSR
862 0 : STR = C1R
863 0 : STI = C1I
864 0 : C2R = YR(I)
865 0 : C2I = YI(I)
866 0 : IF (KODE.EQ.1) GO TO 70
867 0 : IF (IUF.LT.0) GO TO 70
868 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
869 0 : NZ = NZ + NW
870 0 : SC1R = SC2R
871 0 : SC1I = SC2I
872 0 : SC2R = C1R
873 0 : SC2I = C1I
874 0 : IF (IUF.NE.3) GO TO 70
875 0 : IUF = -4
876 0 : S1R = SC1R*CSSR(KFLAG)
877 0 : S1I = SC1I*CSSR(KFLAG)
878 0 : S2R = SC2R*CSSR(KFLAG)
879 0 : S2I = SC2I*CSSR(KFLAG)
880 0 : STR = SC2R
881 0 : STI = SC2I
882 : 70 CONTINUE
883 0 : PTR = CSPNR*C1R - CSPNI*C1I
884 0 : PTI = CSPNR*C1I + CSPNI*C1R
885 0 : YR(I) = PTR + CSGNR*C2R - CSGNI*C2I
886 0 : YI(I) = PTI + CSGNR*C2I + CSGNI*C2R
887 0 : CKR = CKR + RZR
888 0 : CKI = CKI + RZI
889 0 : CSPNR = -CSPNR
890 0 : CSPNI = -CSPNI
891 0 : IF (KFLAG.GE.3) GO TO 80
892 0 : PTR = DABS(C1R)
893 0 : PTI = DABS(C1I)
894 0 : C1M = DMAX1(PTR,PTI)
895 0 : IF (C1M.LE.BSCLE) GO TO 80
896 0 : KFLAG = KFLAG + 1
897 0 : BSCLE = BRY(KFLAG)
898 0 : S1R = S1R*CSR
899 0 : S1I = S1I*CSR
900 : S2R = STR
901 : S2I = STI
902 0 : S1R = S1R*CSSR(KFLAG)
903 0 : S1I = S1I*CSSR(KFLAG)
904 0 : S2R = S2R*CSSR(KFLAG)
905 0 : S2I = S2I*CSSR(KFLAG)
906 0 : CSR = CSRR(KFLAG)
907 0 : 80 CONTINUE
908 0 : RETURN
909 : 90 CONTINUE
910 0 : NZ = -1
911 0 : IF(NW.EQ.(-2)) NZ=-2
912 : RETURN
913 : END SUBROUTINE ZACON
914 :
915 0 : SUBROUTINE ZBINU(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, &
916 : & TOL, ELIM, ALIM)
917 : !C***BEGIN PROLOGUE ZBINU
918 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
919 : !C
920 : !C ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
921 : !C
922 : !C***ROUTINES CALLED AZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
923 : !C***END PROLOGUE ZBINU
924 : DOUBLE PRECISION ALIM, AZ, CWI, CWR, CYI, CYR, DFNU, ELIM, FNU, &
925 : & FNUL, RL, TOL, ZEROI, ZEROR, ZI, ZR!, AZABS
926 : INTEGER I, INW, KODE, N, NLAST, NN, NUI, NW, NZ
927 : DIMENSION CYR(N), CYI(N), CWR(2), CWI(2)
928 : DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
929 : !C
930 0 : NZ = 0
931 0 : AZ = AZABS(ZR,ZI)
932 0 : NN = N
933 0 : DFNU = FNU + DBLE(FLOAT(N-1))
934 0 : IF (AZ.LE.2.0D0) GO TO 10
935 0 : IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
936 : 10 CONTINUE
937 : !C-----------------------------------------------------------------------
938 : !C POWER SERIES
939 : !C-----------------------------------------------------------------------
940 0 : CALL ZSERI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
941 0 : INW = IABS(NW)
942 0 : NZ = NZ + INW
943 0 : NN = NN - INW
944 0 : IF (NN.EQ.0) RETURN
945 0 : IF (NW.GE.0) GO TO 120
946 0 : DFNU = FNU + DBLE(FLOAT(NN-1))
947 : 20 CONTINUE
948 0 : IF (AZ.LT.RL) GO TO 40
949 0 : IF (DFNU.LE.1.0D0) GO TO 30
950 0 : IF (AZ+AZ.LT.DFNU*DFNU) GO TO 50
951 : !C-----------------------------------------------------------------------
952 : !C ASYMPTOTIC EXPANSION FOR LARGE Z
953 : !C-----------------------------------------------------------------------
954 : 30 CONTINUE
955 : CALL ZASYI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, RL, TOL, ELIM, &
956 0 : & ALIM)
957 0 : IF (NW.LT.0) GO TO 130
958 0 : GO TO 120
959 : 40 CONTINUE
960 0 : IF (DFNU.LE.1.0D0) GO TO 70
961 : 50 CONTINUE
962 : !C-----------------------------------------------------------------------
963 : !C OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
964 : !C-----------------------------------------------------------------------
965 : CALL ZUOIK(ZR, ZI, FNU, KODE, 1, NN, CYR, CYI, NW, TOL, ELIM, &
966 0 : & ALIM)
967 0 : IF (NW.LT.0) GO TO 130
968 0 : NZ = NZ + NW
969 0 : NN = NN - NW
970 0 : IF (NN.EQ.0) RETURN
971 0 : DFNU = FNU+DBLE(FLOAT(NN-1))
972 0 : IF (DFNU.GT.FNUL) GO TO 110
973 0 : IF (AZ.GT.FNUL) GO TO 110
974 : 60 CONTINUE
975 0 : IF (AZ.GT.RL) GO TO 80
976 : 70 CONTINUE
977 : !C-----------------------------------------------------------------------
978 : !C MILLER ALGORITHM NORMALIZED BY THE SERIES
979 : !C-----------------------------------------------------------------------
980 0 : CALL ZMLRI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL)
981 0 : IF(NW.LT.0) GO TO 130
982 0 : GO TO 120
983 : 80 CONTINUE
984 : !C-----------------------------------------------------------------------
985 : !C MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
986 : !C-----------------------------------------------------------------------
987 : !C-----------------------------------------------------------------------
988 : !C OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
989 : !C-----------------------------------------------------------------------
990 : CALL ZUOIK(ZR, ZI, FNU, KODE, 2, 2, CWR, CWI, NW, TOL, ELIM, &
991 0 : & ALIM)
992 0 : IF (NW.GE.0) GO TO 100
993 0 : NZ = NN
994 0 : DO 90 I=1,NN
995 0 : CYR(I) = ZEROR
996 0 : CYI(I) = ZEROI
997 0 : 90 CONTINUE
998 0 : RETURN
999 : 100 CONTINUE
1000 0 : IF (NW.GT.0) GO TO 130
1001 : CALL ZWRSK(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, CWR, CWI, TOL, &
1002 0 : & ELIM, ALIM)
1003 0 : IF (NW.LT.0) GO TO 130
1004 0 : GO TO 120
1005 : 110 CONTINUE
1006 : !C-----------------------------------------------------------------------
1007 : !C INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
1008 : !C-----------------------------------------------------------------------
1009 0 : NUI = INT(SNGL(FNUL-DFNU)) + 1
1010 0 : NUI = MAX0(NUI,0)
1011 : CALL ZBUNI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, NUI, NLAST, FNUL, &
1012 0 : & TOL, ELIM, ALIM)
1013 0 : IF (NW.LT.0) GO TO 130
1014 0 : NZ = NZ + NW
1015 0 : IF (NLAST.EQ.0) GO TO 120
1016 0 : NN = NLAST
1017 0 : GO TO 60
1018 : 120 CONTINUE
1019 0 : RETURN
1020 : 130 CONTINUE
1021 0 : NZ = -1
1022 0 : IF(NW.EQ.(-2)) NZ=-2
1023 : RETURN
1024 : END SUBROUTINE ZBINU
1025 :
1026 0 : SUBROUTINE ZSERI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, &
1027 : & ALIM)
1028 : !C***BEGIN PROLOGUE ZSERI
1029 : !C***REFER TO ZBESI,ZBESK
1030 : !C
1031 : !C ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
1032 : !C MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE
1033 : !C REGION CABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
1034 : !C NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
1035 : !C DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
1036 : !C CONDITION CABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
1037 : !C COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
1038 : !C
1039 : !C***ROUTINES CALLED DGAMLN,D1MACH,ZUCHK,AZABS,ZDIV,AZLOG,ZMLT
1040 : !C***END PROLOGUE ZSERI
1041 : !C COMPLEX AK1,CK,COEF,CONE,CRSC,CSCL,CZ,CZERO,HZ,RZ,S1,S2,Y,Z
1042 : DOUBLE PRECISION AA, ACZ, AK, AK1I, AK1R, ALIM, ARM, ASCLE, ATOL, &
1043 : & AZ, CKI, CKR, COEFI, COEFR, CONEI, CONER, CRSCR, CZI, CZR, DFNU, &
1044 : & ELIM, FNU, FNUP, HZI, HZR, RAZ, RS, RTR1, RZI, RZR, S, SS, STI, &
1045 : & STR, S1I, S1R, S2I, S2R, TOL, YI, YR, WI, WR, ZEROI, ZEROR, ZI, &
1046 : & ZR!, DGAMLN, D1MACH, AZABS
1047 : INTEGER I, IB, IDUM, IFLAG, IL, K, KODE, L, M, N, NN, NZ, NW
1048 : DIMENSION YR(N), YI(N), WR(2), WI(2)
1049 : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
1050 : !C
1051 0 : NZ = 0
1052 0 : AZ = AZABS(ZR,ZI)
1053 0 : IF (AZ.EQ.0.0D0) GO TO 160
1054 0 : ARM = 1.0D+3*D1MACH(1)
1055 0 : RTR1 = DSQRT(ARM)
1056 0 : CRSCR = 1.0D0
1057 0 : IFLAG = 0
1058 0 : IF (AZ.LT.ARM) GO TO 150
1059 0 : HZR = 0.5D0*ZR
1060 0 : HZI = 0.5D0*ZI
1061 0 : CZR = ZEROR
1062 0 : CZI = ZEROI
1063 0 : IF (AZ.LE.RTR1) GO TO 10
1064 0 : CALL ZMLT(HZR, HZI, HZR, HZI, CZR, CZI)
1065 : 10 CONTINUE
1066 0 : ACZ = AZABS(CZR,CZI)
1067 0 : NN = N
1068 0 : CALL AZLOG(HZR, HZI, CKR, CKI, IDUM)
1069 : 20 CONTINUE
1070 0 : DFNU = FNU + DBLE(FLOAT(NN-1))
1071 0 : FNUP = DFNU + 1.0D0
1072 : !C-----------------------------------------------------------------------
1073 : !C UNDERFLOW TEST
1074 : !C-----------------------------------------------------------------------
1075 0 : AK1R = CKR*DFNU
1076 0 : AK1I = CKI*DFNU
1077 0 : AK = DGAMLN(FNUP,IDUM)
1078 0 : AK1R = AK1R - AK
1079 0 : IF (KODE.EQ.2) AK1R = AK1R - ZR
1080 0 : IF (AK1R.GT.(-ELIM)) GO TO 40
1081 : 30 CONTINUE
1082 0 : NZ = NZ + 1
1083 0 : YR(NN) = ZEROR
1084 0 : YI(NN) = ZEROI
1085 0 : IF (ACZ.GT.DFNU) GO TO 190
1086 0 : NN = NN - 1
1087 0 : IF (NN.EQ.0) RETURN
1088 0 : GO TO 20
1089 : 40 CONTINUE
1090 0 : IF (AK1R.GT.(-ALIM)) GO TO 50
1091 0 : IFLAG = 1
1092 0 : SS = 1.0D0/TOL
1093 0 : CRSCR = TOL
1094 0 : ASCLE = ARM*SS
1095 : 50 CONTINUE
1096 0 : AA = DEXP(AK1R)
1097 0 : IF (IFLAG.EQ.1) AA = AA*SS
1098 0 : COEFR = AA*DCOS(AK1I)
1099 0 : COEFI = AA*DSIN(AK1I)
1100 0 : ATOL = TOL*ACZ/FNUP
1101 0 : IL = MIN0(2,NN)
1102 0 : DO 90 I=1,IL
1103 0 : DFNU = FNU + DBLE(FLOAT(NN-I))
1104 0 : FNUP = DFNU + 1.0D0
1105 0 : S1R = CONER
1106 0 : S1I = CONEI
1107 0 : IF (ACZ.LT.TOL*FNUP) GO TO 70
1108 0 : AK1R = CONER
1109 0 : AK1I = CONEI
1110 0 : AK = FNUP + 2.0D0
1111 0 : S = FNUP
1112 0 : AA = 2.0D0
1113 : 60 CONTINUE
1114 0 : RS = 1.0D0/S
1115 0 : STR = AK1R*CZR - AK1I*CZI
1116 0 : STI = AK1R*CZI + AK1I*CZR
1117 0 : AK1R = STR*RS
1118 0 : AK1I = STI*RS
1119 0 : S1R = S1R + AK1R
1120 0 : S1I = S1I + AK1I
1121 0 : S = S + AK
1122 0 : AK = AK + 2.0D0
1123 0 : AA = AA*ACZ*RS
1124 0 : IF (AA.GT.ATOL) GO TO 60
1125 : 70 CONTINUE
1126 0 : S2R = S1R*COEFR - S1I*COEFI
1127 0 : S2I = S1R*COEFI + S1I*COEFR
1128 0 : WR(I) = S2R
1129 0 : WI(I) = S2I
1130 0 : IF (IFLAG.EQ.0) GO TO 80
1131 0 : CALL ZUCHK(S2R, S2I, NW, ASCLE, TOL)
1132 : IF (NW.NE.0) GO TO 30
1133 : 80 CONTINUE
1134 0 : M = NN - I + 1
1135 0 : YR(M) = S2R*CRSCR
1136 0 : YI(M) = S2I*CRSCR
1137 0 : IF (I.EQ.IL) GO TO 90
1138 0 : CALL ZDIV(COEFR, COEFI, HZR, HZI, STR, STI)
1139 0 : COEFR = STR*DFNU
1140 0 : COEFI = STI*DFNU
1141 0 : 90 CONTINUE
1142 0 : IF (NN.LE.2) RETURN
1143 0 : K = NN - 2
1144 0 : AK = DBLE(FLOAT(K))
1145 0 : RAZ = 1.0D0/AZ
1146 0 : STR = ZR*RAZ
1147 0 : STI = -ZI*RAZ
1148 0 : RZR = (STR+STR)*RAZ
1149 0 : RZI = (STI+STI)*RAZ
1150 0 : IF (IFLAG.EQ.1) GO TO 120
1151 : IB = 3
1152 : 100 CONTINUE
1153 0 : DO 110 I=IB,NN
1154 0 : YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
1155 0 : YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
1156 0 : AK = AK - 1.0D0
1157 0 : K = K - 1
1158 0 : 110 CONTINUE
1159 0 : RETURN
1160 : !C-----------------------------------------------------------------------
1161 : !C RECUR BACKWARD WITH SCALED VALUES
1162 : !C-----------------------------------------------------------------------
1163 : 120 CONTINUE
1164 : !C-----------------------------------------------------------------------
1165 : !C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
1166 : !C UNDERFLOW LIMIT = ASCLE = D1MACH(1)*SS*1.0D+3
1167 : !C-----------------------------------------------------------------------
1168 0 : S1R = WR(1)
1169 0 : S1I = WI(1)
1170 0 : S2R = WR(2)
1171 0 : S2I = WI(2)
1172 0 : DO 130 L=3,NN
1173 : CKR = S2R
1174 : CKI = S2I
1175 0 : S2R = S1R + (AK+FNU)*(RZR*CKR-RZI*CKI)
1176 0 : S2I = S1I + (AK+FNU)*(RZR*CKI+RZI*CKR)
1177 0 : S1R = CKR
1178 0 : S1I = CKI
1179 0 : CKR = S2R*CRSCR
1180 0 : CKI = S2I*CRSCR
1181 0 : YR(K) = CKR
1182 0 : YI(K) = CKI
1183 0 : AK = AK - 1.0D0
1184 0 : K = K - 1
1185 0 : IF (AZABS(CKR,CKI).GT.ASCLE) GO TO 140
1186 0 : 130 CONTINUE
1187 0 : RETURN
1188 : 140 CONTINUE
1189 0 : IB = L + 1
1190 0 : IF (IB.GT.NN) RETURN
1191 0 : GO TO 100
1192 : 150 CONTINUE
1193 0 : NZ = N
1194 0 : IF (FNU.EQ.0.0D0) NZ = NZ - 1
1195 : 160 CONTINUE
1196 0 : YR(1) = ZEROR
1197 0 : YI(1) = ZEROI
1198 0 : IF (FNU.NE.0.0D0) GO TO 170
1199 0 : YR(1) = CONER
1200 0 : YI(1) = CONEI
1201 : 170 CONTINUE
1202 0 : IF (N.EQ.1) RETURN
1203 0 : DO 180 I=2,N
1204 0 : YR(I) = ZEROR
1205 0 : YI(I) = ZEROI
1206 0 : 180 CONTINUE
1207 0 : RETURN
1208 : !C-----------------------------------------------------------------------
1209 : !C RETURN WITH NZ.LT.0 IF CABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
1210 : !C THE CALCULATION IN CBINU WITH N=N-IABS(NZ)
1211 : !C-----------------------------------------------------------------------
1212 : 190 CONTINUE
1213 0 : NZ = -NZ
1214 0 : RETURN
1215 : END SUBROUTINE ZSERI
1216 :
1217 :
1218 0 : DOUBLE PRECISION FUNCTION D1MACH(I)
1219 : INTEGER I
1220 : !C
1221 : !C DOUBLE-PRECISION MACHINE CONSTANTS
1222 : !C D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
1223 : !C D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
1224 : !C D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.
1225 : !C D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.
1226 : !C D1MACH( 5) = LOG10(B)
1227 : !C
1228 : INTEGER SMALL(2)
1229 : INTEGER LARGE(2)
1230 : INTEGER RIGHT(2)
1231 : INTEGER DIVER(2)
1232 : INTEGER LOG10(2)
1233 : INTEGER SC, CRAY1(38), J
1234 : COMMON /D9MACH/ CRAY1
1235 : SAVE SMALL, LARGE, RIGHT, DIVER, LOG10, SC
1236 : DOUBLE PRECISION DMACH(5)
1237 : EQUIVALENCE (DMACH(1),SMALL(1))
1238 : EQUIVALENCE (DMACH(2),LARGE(1))
1239 : EQUIVALENCE (DMACH(3),RIGHT(1))
1240 : EQUIVALENCE (DMACH(4),DIVER(1))
1241 : EQUIVALENCE (DMACH(5),LOG10(1))
1242 : !C THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES.
1243 : !C R1MACH CAN HANDLE AUTO-DOUBLE COMPILING, BUT THIS VERSION OF
1244 : !C D1MACH DOES NOT, BECAUSE WE DO NOT HAVE QUAD CONSTANTS FOR
1245 : !C MANY MACHINES YET.
1246 : !C TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
1247 : !C ON THE NEXT LINE
1248 : DATA SC/0/
1249 : !C AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
1250 : !C CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
1251 : !C mail netlib@research.bell-labs.com
1252 : !C send old1mach from blas
1253 : !C PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
1254 : !C
1255 : !C MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
1256 : !C DATA SMALL(1),SMALL(2) / O402400000000, O000000000000 /
1257 : !C DATA LARGE(1),LARGE(2) / O376777777777, O777777777777 /
1258 : !C DATA RIGHT(1),RIGHT(2) / O604400000000, O000000000000 /
1259 : !C DATA DIVER(1),DIVER(2) / O606400000000, O000000000000 /
1260 : !C DATA LOG10(1),LOG10(2) / O776464202324, O117571775714 /, SC/987/
1261 : !C
1262 : !C MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
1263 : !C 32-BIT INTEGERS.
1264 : !C DATA SMALL(1),SMALL(2) / 8388608, 0 /
1265 : !C DATA LARGE(1),LARGE(2) / 2147483647, -1 /
1266 : !C DATA RIGHT(1),RIGHT(2) / 612368384, 0 /
1267 : !C DATA DIVER(1),DIVER(2) / 620756992, 0 /
1268 : !C DATA LOG10(1),LOG10(2) / 1067065498, -2063872008 /, SC/987/
1269 : !C
1270 : !C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
1271 : !C DATA SMALL(1),SMALL(2) / O000040000000, O000000000000 /
1272 : !C DATA LARGE(1),LARGE(2) / O377777777777, O777777777777 /
1273 : !C DATA RIGHT(1),RIGHT(2) / O170540000000, O000000000000 /
1274 : !C DATA DIVER(1),DIVER(2) / O170640000000, O000000000000 /
1275 : !C DATA LOG10(1),LOG10(2) / O177746420232, O411757177572 /, SC/987/
1276 : !C
1277 : !C ON FIRST CALL, IF NO DATA UNCOMMENTED, TEST MACHINE TYPES.
1278 0 : IF (SC .NE. 987) THEN
1279 : DMACH(1) = 1.D13
1280 : IF ( SMALL(1) .EQ. 1117925532 &
1281 : & .AND. SMALL(2) .EQ. -448790528) THEN
1282 : !* *** IEEE BIG ENDIAN ***
1283 : SMALL(1) = 1048576
1284 : SMALL(2) = 0
1285 : LARGE(1) = 2146435071
1286 : LARGE(2) = -1
1287 : RIGHT(1) = 1017118720
1288 : RIGHT(2) = 0
1289 : DIVER(1) = 1018167296
1290 : DIVER(2) = 0
1291 : LOG10(1) = 1070810131
1292 : LOG10(2) = 1352628735
1293 : ELSE IF ( SMALL(2) .EQ. 1117925532 &
1294 : & .AND. SMALL(1) .EQ. -448790528) THEN
1295 : !* *** IEEE LITTLE ENDIAN ***
1296 0 : SMALL(2) = 1048576
1297 0 : SMALL(1) = 0
1298 0 : LARGE(2) = 2146435071
1299 0 : LARGE(1) = -1
1300 0 : RIGHT(2) = 1017118720
1301 0 : RIGHT(1) = 0
1302 0 : DIVER(2) = 1018167296
1303 0 : DIVER(1) = 0
1304 0 : LOG10(2) = 1070810131
1305 0 : LOG10(1) = 1352628735
1306 : ELSE IF ( SMALL(1) .EQ. -2065213935 &
1307 : & .AND. SMALL(2) .EQ. 10752) THEN
1308 : !* *** VAX WITH D_FLOATING ***
1309 : SMALL(1) = 128
1310 : SMALL(2) = 0
1311 : LARGE(1) = -32769
1312 : LARGE(2) = -1
1313 : RIGHT(1) = 9344
1314 : RIGHT(2) = 0
1315 : DIVER(1) = 9472
1316 : DIVER(2) = 0
1317 : LOG10(1) = 546979738
1318 : LOG10(2) = -805796613
1319 : ELSE IF ( SMALL(1) .EQ. 1267827943 &
1320 : & .AND. SMALL(2) .EQ. 704643072) THEN
1321 : !* *** IBM MAINFRAME ***
1322 : SMALL(1) = 1048576
1323 : SMALL(2) = 0
1324 : LARGE(1) = 2147483647
1325 : LARGE(2) = -1
1326 : RIGHT(1) = 856686592
1327 : RIGHT(2) = 0
1328 : DIVER(1) = 873463808
1329 : DIVER(2) = 0
1330 : LOG10(1) = 1091781651
1331 : LOG10(2) = 1352628735
1332 : ELSE IF ( SMALL(1) .EQ. 1120022684 &
1333 : & .AND. SMALL(2) .EQ. -448790528) THEN
1334 : !* *** CONVEX C-1 ***
1335 : SMALL(1) = 1048576
1336 : SMALL(2) = 0
1337 : LARGE(1) = 2147483647
1338 : LARGE(2) = -1
1339 : RIGHT(1) = 1019215872
1340 : RIGHT(2) = 0
1341 : DIVER(1) = 1020264448
1342 : DIVER(2) = 0
1343 : LOG10(1) = 1072907283
1344 : LOG10(2) = 1352628735
1345 : ELSE IF ( SMALL(1) .EQ. 815547074 &
1346 : & .AND. SMALL(2) .EQ. 58688) THEN
1347 : !* *** VAX G-FLOATING ***
1348 : SMALL(1) = 16
1349 : SMALL(2) = 0
1350 : LARGE(1) = -32769
1351 : LARGE(2) = -1
1352 : RIGHT(1) = 15552
1353 : RIGHT(2) = 0
1354 : DIVER(1) = 15568
1355 : DIVER(2) = 0
1356 : LOG10(1) = 1142112243
1357 : LOG10(2) = 2046775455
1358 : ELSE
1359 : DMACH(2) = 1.D27 + 1
1360 : DMACH(3) = 1.D27
1361 : LARGE(2) = LARGE(2) - RIGHT(2)
1362 : IF (LARGE(2) .EQ. 64 .AND. SMALL(2) .EQ. 0) THEN
1363 : CRAY1(1) = 67291416
1364 : DO 10 J = 1, 20
1365 : CRAY1(J+1) = CRAY1(J) + CRAY1(J)
1366 : 10 CONTINUE
1367 : CRAY1(22) = CRAY1(21) + 321322
1368 : DO 20 J = 22, 37
1369 : CRAY1(J+1) = CRAY1(J) + CRAY1(J)
1370 : 20 CONTINUE
1371 : IF (CRAY1(38) .EQ. SMALL(1)) THEN
1372 : !* *** CRAY ***
1373 : CALL I1MCRY(SMALL(1), J, 8285, 8388608, 0)
1374 : SMALL(2) = 0
1375 : CALL I1MCRY(LARGE(1), J, 24574, 16777215, 16777215)
1376 : CALL I1MCRY(LARGE(2), J, 0, 16777215, 16777214)
1377 : CALL I1MCRY(RIGHT(1), J, 16291, 8388608, 0)
1378 : RIGHT(2) = 0
1379 : CALL I1MCRY(DIVER(1), J, 16292, 8388608, 0)
1380 : DIVER(2) = 0
1381 : CALL I1MCRY(LOG10(1), J, 16383, 10100890, 8715215)
1382 : CALL I1MCRY(LOG10(2), J, 0, 16226447, 9001388)
1383 : ELSE
1384 : WRITE(std_out,9000)
1385 : STOP 779
1386 : END IF
1387 : ELSE
1388 : WRITE(std_out,9000)
1389 : STOP 779
1390 : END IF
1391 : END IF
1392 0 : SC = 987
1393 : END IF
1394 : !* SANITY CHECK
1395 0 : IF (DMACH(4) .GE. 1.0D0) STOP 778
1396 0 : IF (I .LT. 1 .OR. I .GT. 5) THEN
1397 0 : WRITE(std_out,*) 'D1MACH(I): I =',I,' is out of bounds.'
1398 0 : STOP
1399 : END IF
1400 0 : D1MACH = DMACH(I)
1401 : RETURN
1402 : 9000 FORMAT(/' Adjust D1MACH by uncommenting data statements'/ &
1403 : &' appropriate for your machine.')
1404 : !* /* Standard C source for D1MACH -- remove the * in column 1 */
1405 : !*#include <stdio.h>
1406 : !*#include <float.h>
1407 : !*#include <math.h>
1408 : !*double d1mach_(long *i)
1409 : !*{
1410 : !* switch(*i){
1411 : !* case 1: return DBL_MIN;
1412 : !* case 2: return DBL_MAX;
1413 : !* case 3: return DBL_EPSILON/FLT_RADIX;
1414 : !* case 4: return DBL_EPSILON;
1415 : !* case 5: return log10(FLT_RADIX);
1416 : !* }
1417 : !* fprintf(stderr, "invalid argument: d1mach(%ld)\n", *i);
1418 : !* exit(1); return 0; /* some compilers demand return values */
1419 : !*}
1420 : END FUNCTION D1MACH
1421 :
1422 :
1423 : SUBROUTINE I1MCRY(A, A1, B, C, D)
1424 : !**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
1425 : INTEGER A, A1, B, C, D
1426 : A1 = 16777216*B + C
1427 : A = 16777216*A1 + D
1428 : END SUBROUTINE I1MCRY
1429 :
1430 0 : SUBROUTINE ZMLT(AR, AI, BR, BI, CR, CI)
1431 : !C***BEGIN PROLOGUE ZMLT
1432 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
1433 : !C
1434 : !C DOUBLE PRECISION COMPLEX MULTIPLY, C=A*B.
1435 : !C
1436 : !C***ROUTINES CALLED (NONE)
1437 : !C***END PROLOGUE ZMLT
1438 : DOUBLE PRECISION AR, AI, BR, BI, CR, CI, CA, CB
1439 0 : CA = AR*BR - AI*BI
1440 0 : CB = AR*BI + AI*BR
1441 0 : CR = CA
1442 0 : CI = CB
1443 0 : RETURN
1444 : END SUBROUTINE ZMLT
1445 :
1446 0 : SUBROUTINE AZLOG(AR, AI, BR, BI, IERR)
1447 : !C***BEGIN PROLOGUE AZLOG
1448 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
1449 : !C
1450 : !C DOUBLE PRECISION COMPLEX LOGARITHM B=CLOG(A)
1451 : !C IERR=0,NORMAL RETURN IERR=1, Z=CMPLX(0.0,0.0)
1452 : !C***ROUTINES CALLED AZABS
1453 : !C***END PROLOGUE AZLOG
1454 : DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DHPI
1455 : !DOUBLE PRECISION AZABS
1456 : INTEGER IERR
1457 : DATA DPI , DHPI / 3.141592653589793238462643383D+0, &
1458 : & 1.570796326794896619231321696D+0/
1459 : !C
1460 0 : IERR=0
1461 0 : IF (AR.EQ.0.0D+0) GO TO 10
1462 0 : IF (AI.EQ.0.0D+0) GO TO 20
1463 0 : DTHETA = DATAN(AI/AR)
1464 0 : IF (DTHETA.LE.0.0D+0) GO TO 40
1465 0 : IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
1466 0 : GO TO 50
1467 0 : 10 IF (AI.EQ.0.0D+0) GO TO 60
1468 0 : BI = DHPI
1469 0 : BR = DLOG(DABS(AI))
1470 0 : IF (AI.LT.0.0D+0) BI = -BI
1471 0 : RETURN
1472 0 : 20 IF (AR.GT.0.0D+0) GO TO 30
1473 0 : BR = DLOG(DABS(AR))
1474 0 : BI = DPI
1475 0 : RETURN
1476 0 : 30 BR = DLOG(AR)
1477 0 : BI = 0.0D+0
1478 0 : RETURN
1479 0 : 40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
1480 0 : 50 ZM = AZABS(AR,AI)
1481 0 : BR = DLOG(ZM)
1482 0 : BI = DTHETA
1483 0 : RETURN
1484 : 60 CONTINUE
1485 0 : IERR=1
1486 0 : RETURN
1487 : END SUBROUTINE AZLOG
1488 :
1489 :
1490 0 : DOUBLE PRECISION FUNCTION DGAMLN(Z,IERR)
1491 : !C***BEGIN PROLOGUE DGAMLN
1492 : !C***DATE WRITTEN 830501 (YYMMDD)
1493 : !C***REVISION DATE 830501 (YYMMDD)
1494 : !C***CATEGORY NO. B5F
1495 : !C***KEYWORDS GAMMA FUNCTION,LOGARITHM OF GAMMA FUNCTION
1496 : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
1497 : !C***PURPOSE TO COMPUTE THE LOGARITHM OF THE GAMMA FUNCTION
1498 : !C***DESCRIPTION
1499 : !C
1500 : !C **** A DOUBLE PRECISION ROUTINE ****
1501 : !C DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR
1502 : !C Z.GT.0. THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES
1503 : !C GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION
1504 : !C G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN. THE FUNCTION WAS MADE AS
1505 : !C PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE
1506 : !C 10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18)
1507 : !C LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.
1508 : !C
1509 : !C SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100
1510 : !C VALUES IS USED FOR SPEED OF EXECUTION.
1511 : !C
1512 : !C DESCRIPTION OF ARGUMENTS
1513 : !C
1514 : !C INPUT Z IS D0UBLE PRECISION
1515 : !C Z - ARGUMENT, Z.GT.0.0D0
1516 : !C
1517 : !C OUTPUT DGAMLN IS DOUBLE PRECISION
1518 : !C DGAMLN - NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
1519 : !C IERR - ERROR FLAG
1520 : !C IERR=0, NORMAL RETURN, COMPUTATION COMPLETED
1521 : !C IERR=1, Z.LE.0.0D0, NO COMPUTATION
1522 : !C
1523 : !C
1524 : !C***REFERENCES COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
1525 : !C BY D. E. AMOS, SAND83-0083, MAY, 1983.
1526 : !C***ROUTINES CALLED I1MACH,D1MACH
1527 : !C***END PROLOGUE DGAMLN
1528 : DOUBLE PRECISION CF, CON, FLN, FZ, GLN, RLN, S, TLG, TRM, TST, &
1529 : & T1, WDTOL, Z, ZDMY, ZINC, ZM, ZMIN, ZP, ZSQ!, D1MACH
1530 : INTEGER I, IERR, I1M, K, MZ, NZ!, I1MACH
1531 : DIMENSION CF(22), GLN(100)
1532 : !C LNGAMMA(N), N=1,100
1533 : DATA GLN(1), GLN(2), GLN(3), GLN(4), GLN(5), GLN(6), GLN(7),&
1534 : & GLN(8), GLN(9), GLN(10), GLN(11), GLN(12), GLN(13), GLN(14), &
1535 : & GLN(15), GLN(16), GLN(17), GLN(18), GLN(19), GLN(20), &
1536 : & GLN(21), GLN(22)/ &
1537 : & 0.00000000000000000D+00, 0.00000000000000000D+00, &
1538 : & 6.93147180559945309D-01, 1.79175946922805500D+00, &
1539 : & 3.17805383034794562D+00, 4.78749174278204599D+00, &
1540 : & 6.57925121201010100D+00, 8.52516136106541430D+00, &
1541 : & 1.06046029027452502D+01, 1.28018274800814696D+01, &
1542 : & 1.51044125730755153D+01, 1.75023078458738858D+01, &
1543 : & 1.99872144956618861D+01, 2.25521638531234229D+01, &
1544 : & 2.51912211827386815D+01, 2.78992713838408916D+01, &
1545 : & 3.06718601060806728D+01, 3.35050734501368889D+01, &
1546 : & 3.63954452080330536D+01, 3.93398841871994940D+01, &
1547 : & 4.23356164607534850D+01, 4.53801388984769080D+01/
1548 : DATA GLN(23), GLN(24), GLN(25), GLN(26), GLN(27), GLN(28), &
1549 : & GLN(29), GLN(30), GLN(31), GLN(32), GLN(33), GLN(34), &
1550 : & GLN(35), GLN(36), GLN(37), GLN(38), GLN(39), GLN(40), &
1551 : & GLN(41), GLN(42), GLN(43), GLN(44)/ &
1552 : & 4.84711813518352239D+01, 5.16066755677643736D+01, &
1553 : & 5.47847293981123192D+01, 5.80036052229805199D+01, &
1554 : & 6.12617017610020020D+01, 6.45575386270063311D+01, &
1555 : & 6.78897431371815350D+01, 7.12570389671680090D+01, &
1556 : & 7.46582363488301644D+01, 7.80922235533153106D+01, &
1557 : & 8.15579594561150372D+01, 8.50544670175815174D+01, &
1558 : & 8.85808275421976788D+01, 9.21361756036870925D+01, &
1559 : & 9.57196945421432025D+01, 9.93306124547874269D+01, &
1560 : & 1.02968198614513813D+02, 1.06631760260643459D+02, &
1561 : & 1.10320639714757395D+02, 1.14034211781461703D+02, &
1562 : & 1.17771881399745072D+02, 1.21533081515438634D+02/
1563 : DATA GLN(45), GLN(46), GLN(47), GLN(48), GLN(49), GLN(50), &
1564 : & GLN(51), GLN(52), GLN(53), GLN(54), GLN(55), GLN(56), &
1565 : & GLN(57), GLN(58), GLN(59), GLN(60), GLN(61), GLN(62), &
1566 : & GLN(63), GLN(64), GLN(65), GLN(66)/ &
1567 : & 1.25317271149356895D+02, 1.29123933639127215D+02, &
1568 : & 1.32952575035616310D+02, 1.36802722637326368D+02, &
1569 : & 1.40673923648234259D+02, 1.44565743946344886D+02, &
1570 : & 1.48477766951773032D+02, 1.52409592584497358D+02, &
1571 : & 1.56360836303078785D+02, 1.60331128216630907D+02, &
1572 : & 1.64320112263195181D+02, 1.68327445448427652D+02, &
1573 : & 1.72352797139162802D+02, 1.76395848406997352D+02, &
1574 : & 1.80456291417543771D+02, 1.84533828861449491D+02, &
1575 : & 1.88628173423671591D+02, 1.92739047287844902D+02, &
1576 : & 1.96866181672889994D+02, 2.01009316399281527D+02, &
1577 : & 2.05168199482641199D+02, 2.09342586752536836D+02/
1578 : DATA GLN(67), GLN(68), GLN(69), GLN(70), GLN(71), GLN(72), &
1579 : & GLN(73), GLN(74), GLN(75), GLN(76), GLN(77), GLN(78), &
1580 : & GLN(79), GLN(80), GLN(81), GLN(82), GLN(83), GLN(84), &
1581 : & GLN(85), GLN(86), GLN(87), GLN(88)/ &
1582 : & 2.13532241494563261D+02, 2.17736934113954227D+02, &
1583 : & 2.21956441819130334D+02, 2.26190548323727593D+02, &
1584 : & 2.30439043565776952D+02, 2.34701723442818268D+02, &
1585 : & 2.38978389561834323D+02, 2.43268849002982714D+02, &
1586 : & 2.47572914096186884D+02, 2.51890402209723194D+02, &
1587 : & 2.56221135550009525D+02, 2.60564940971863209D+02, &
1588 : & 2.64921649798552801D+02, 2.69291097651019823D+02, &
1589 : & 2.73673124285693704D+02, 2.78067573440366143D+02, &
1590 : & 2.82474292687630396D+02, 2.86893133295426994D+02, &
1591 : & 2.91323950094270308D+02, 2.95766601350760624D+02, &
1592 : & 3.00220948647014132D+02, 3.04686856765668715D+02/
1593 : DATA GLN(89), GLN(90), GLN(91), GLN(92), GLN(93), GLN(94), &
1594 : & GLN(95), GLN(96), GLN(97), GLN(98), GLN(99), GLN(100)/&
1595 : & 3.09164193580146922D+02, 3.13652829949879062D+02, &
1596 : & 3.18152639620209327D+02, 3.22663499126726177D+02, &
1597 : & 3.27185287703775217D+02, 3.31717887196928473D+02, &
1598 : & 3.36261181979198477D+02, 3.40815058870799018D+02, &
1599 : & 3.45379407062266854D+02, 3.49954118040770237D+02, &
1600 : & 3.54539085519440809D+02, 3.59134205369575399D+02/
1601 : !C COEFFICIENTS OF ASYMPTOTIC EXPANSION
1602 : DATA CF(1), CF(2), CF(3), CF(4), CF(5), CF(6), CF(7), CF(8), &
1603 : & CF(9), CF(10), CF(11), CF(12), CF(13), CF(14), CF(15), &
1604 : & CF(16), CF(17), CF(18), CF(19), CF(20), CF(21), CF(22)/ &
1605 : & 8.33333333333333333D-02, -2.77777777777777778D-03, &
1606 : & 7.93650793650793651D-04, -5.95238095238095238D-04, &
1607 : & 8.41750841750841751D-04, -1.91752691752691753D-03, &
1608 : & 6.41025641025641026D-03, -2.95506535947712418D-02, &
1609 : & 1.79644372368830573D-01, -1.39243221690590112D+00, &
1610 : & 1.34028640441683920D+01, -1.56848284626002017D+02, &
1611 : & 2.19310333333333333D+03, -3.61087712537249894D+04, &
1612 : & 6.91472268851313067D+05, -1.52382215394074162D+07, &
1613 : & 3.82900751391414141D+08, -1.08822660357843911D+10, &
1614 : & 3.47320283765002252D+11, -1.23696021422692745D+13, &
1615 : & 4.88788064793079335D+14, -2.13203339609193739D+16/
1616 : !C
1617 : !C LN(2*PI)
1618 : DATA CON / 1.83787706640934548D+00/
1619 : !C
1620 : !C***FIRST EXECUTABLE STATEMENT DGAMLN
1621 0 : IERR=0
1622 0 : IF (Z.LE.0.0D0) GO TO 70
1623 0 : IF (Z.GT.101.0D0) GO TO 10
1624 0 : NZ = INT(SNGL(Z))
1625 0 : FZ = Z - FLOAT(NZ)
1626 0 : IF (FZ.GT.0.0D0) GO TO 10
1627 0 : IF (NZ.GT.100) GO TO 10
1628 0 : DGAMLN = GLN(NZ)
1629 0 : RETURN
1630 : 10 CONTINUE
1631 0 : WDTOL = D1MACH(4)
1632 0 : WDTOL = DMAX1(WDTOL,0.5D-18)
1633 0 : I1M = I1MACH(14)
1634 0 : RLN = D1MACH(5)*FLOAT(I1M)
1635 0 : FLN = DMIN1(RLN,20.0D0)
1636 0 : FLN = DMAX1(FLN,3.0D0)
1637 0 : FLN = FLN - 3.0D0
1638 0 : ZM = 1.8000D0 + 0.3875D0*FLN
1639 0 : MZ = INT(SNGL(ZM)) + 1
1640 0 : ZMIN = FLOAT(MZ)
1641 0 : ZDMY = Z
1642 0 : ZINC = 0.0D0
1643 0 : IF (Z.GE.ZMIN) GO TO 20
1644 0 : ZINC = ZMIN - FLOAT(NZ)
1645 0 : ZDMY = Z + ZINC
1646 : 20 CONTINUE
1647 0 : ZP = 1.0D0/ZDMY
1648 0 : T1 = CF(1)*ZP
1649 0 : S = T1
1650 0 : IF (ZP.LT.WDTOL) GO TO 40
1651 0 : ZSQ = ZP*ZP
1652 0 : TST = T1*WDTOL
1653 0 : DO 30 K=2,22
1654 0 : ZP = ZP*ZSQ
1655 0 : TRM = CF(K)*ZP
1656 0 : IF (DABS(TRM).LT.TST) GO TO 40
1657 0 : S = S + TRM
1658 0 : 30 CONTINUE
1659 : 40 CONTINUE
1660 0 : IF (ZINC.NE.0.0D0) GO TO 50
1661 0 : TLG = DLOG(Z)
1662 0 : DGAMLN = Z*(TLG-1.0D0) + 0.5D0*(CON-TLG) + S
1663 0 : RETURN
1664 : 50 CONTINUE
1665 0 : ZP = 1.0D0
1666 0 : NZ = INT(SNGL(ZINC))
1667 0 : DO 60 I=1,NZ
1668 0 : ZP = ZP*(Z+FLOAT(I-1))
1669 0 : 60 CONTINUE
1670 0 : TLG = DLOG(ZDMY)
1671 0 : DGAMLN = ZDMY*(TLG-1.0D0) - DLOG(ZP) + 0.5D0*(CON-TLG) + S
1672 0 : RETURN
1673 : !C
1674 : !C
1675 : 70 CONTINUE
1676 0 : IERR=1
1677 0 : RETURN
1678 : END FUNCTION DGAMLN
1679 :
1680 0 : INTEGER FUNCTION I1MACH(I)
1681 : INTEGER I
1682 : !C
1683 : !C I1MACH( 1) = THE STANDARD INPUT UNIT.
1684 : !C I1MACH( 2) = THE STANDARD OUTPUT UNIT.
1685 : !C I1MACH( 3) = THE STANDARD PUNCH UNIT.
1686 : !C I1MACH( 4) = THE STANDARD ERROR MESSAGE UNIT.
1687 : !C I1MACH( 5) = THE NUMBER OF BITS PER INTEGER STORAGE UNIT.
1688 : !C I1MACH( 6) = THE NUMBER OF CHARACTERS PER CHARACTER STORAGE UNIT.
1689 : !C INTEGERS HAVE FORM SIGN ( X(S-1)*A**(S-1) + ... + X(1)*A + X(0) )
1690 : !C I1MACH( 7) = A, THE BASE.
1691 : !C I1MACH( 8) = S, THE NUMBER OF BASE-A DIGITS.
1692 : !C I1MACH( 9) = A**S - 1, THE LARGEST MAGNITUDE.
1693 : !C FLOATS HAVE FORM SIGN (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
1694 : !C WHERE EMIN .LE. E .LE. EMAX.
1695 : !C I1MACH(10) = B, THE BASE.
1696 : !C SINGLE-PRECISION
1697 : !C I1MACH(11) = T, THE NUMBER OF BASE-B DIGITS.
1698 : !C I1MACH(12) = EMIN, THE SMALLEST EXPONENT E.
1699 : !C I1MACH(13) = EMAX, THE LARGEST EXPONENT E.
1700 : !C DOUBLE-PRECISION
1701 : !C I1MACH(14) = T, THE NUMBER OF BASE-B DIGITS.
1702 : !C I1MACH(15) = EMIN, THE SMALLEST EXPONENT E.
1703 : !C I1MACH(16) = EMAX, THE LARGEST EXPONENT E.
1704 : !C
1705 : INTEGER IMACH(16), OUTPUT, SC, SMALL(2)
1706 : SAVE IMACH, SC
1707 : REAL RMACH
1708 : EQUIVALENCE (IMACH(4),OUTPUT), (RMACH,SMALL(1))
1709 : INTEGER I3, J, K, T3E(3)
1710 : DATA T3E(1) / 9777664 /
1711 : DATA T3E(2) / 5323660 /
1712 : DATA T3E(3) / 46980 /
1713 : !C THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES,
1714 : !C INCLUDING AUTO-DOUBLE COMPILERS.
1715 : !C TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
1716 : !C ON THE NEXT LINE
1717 : DATA SC/0/
1718 : !C AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
1719 : !C CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
1720 : !C mail netlib@research.bell-labs.com
1721 : !C send old1mach from blas
1722 : !C PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
1723 : !C
1724 : !C MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
1725 : !C
1726 : !C DATA IMACH( 1) / 5 /
1727 : !C DATA IMACH( 2) / 6 /
1728 : !C DATA IMACH( 3) / 43 /
1729 : !C DATA IMACH( 4) / 6 /
1730 : !C DATA IMACH( 5) / 36 /
1731 : !C DATA IMACH( 6) / 4 /
1732 : !C DATA IMACH( 7) / 2 /
1733 : !C DATA IMACH( 8) / 35 /
1734 : !C DATA IMACH( 9) / O377777777777 /
1735 : !C DATA IMACH(10) / 2 /
1736 : !C DATA IMACH(11) / 27 /
1737 : !C DATA IMACH(12) / -127 /
1738 : !C DATA IMACH(13) / 127 /
1739 : !C DATA IMACH(14) / 63 /
1740 : !C DATA IMACH(15) / -127 /
1741 : !C DATA IMACH(16) / 127 /, SC/987/
1742 : !C
1743 : !C MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
1744 : !C 32-BIT INTEGER ARITHMETIC.
1745 : !C
1746 : !C DATA IMACH( 1) / 5 /
1747 : !C DATA IMACH( 2) / 6 /
1748 : !C DATA IMACH( 3) / 7 /
1749 : !C DATA IMACH( 4) / 6 /
1750 : !C DATA IMACH( 5) / 32 /
1751 : !C DATA IMACH( 6) / 4 /
1752 : !C DATA IMACH( 7) / 2 /
1753 : !C DATA IMACH( 8) / 31 /
1754 : !C DATA IMACH( 9) / 2147483647 /
1755 : !C DATA IMACH(10) / 2 /
1756 : !C DATA IMACH(11) / 24 /
1757 : !C DATA IMACH(12) / -127 /
1758 : !C DATA IMACH(13) / 127 /
1759 : !C DATA IMACH(14) / 56 /
1760 : !C DATA IMACH(15) / -127 /
1761 : !C DATA IMACH(16) / 127 /, SC/987/
1762 : !C
1763 : !C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
1764 : !C
1765 : !C NOTE THAT THE PUNCH UNIT, I1MACH(3), HAS BEEN SET TO 7
1766 : !C WHICH IS APPROPRIATE FOR THE UNIVAC-FOR SYSTEM.
1767 : !C IF YOU HAVE THE UNIVAC-FTN SYSTEM, SET IT TO 1.
1768 : !C
1769 : !C DATA IMACH( 1) / 5 /
1770 : !C DATA IMACH( 2) / 6 /
1771 : !C DATA IMACH( 3) / 7 /
1772 : !C DATA IMACH( 4) / 6 /
1773 : !C DATA IMACH( 5) / 36 /
1774 : !C DATA IMACH( 6) / 6 /
1775 : !C DATA IMACH( 7) / 2 /
1776 : !C DATA IMACH( 8) / 35 /
1777 : !C DATA IMACH( 9) / O377777777777 /
1778 : !C DATA IMACH(10) / 2 /
1779 : !C DATA IMACH(11) / 27 /
1780 : !C DATA IMACH(12) / -128 /
1781 : !C DATA IMACH(13) / 127 /
1782 : !C DATA IMACH(14) / 60 /
1783 : !C DATA IMACH(15) /-1024 /
1784 : !C DATA IMACH(16) / 1023 /, SC/987/
1785 : !C
1786 0 : IF (SC .NE. 987) THEN
1787 : !* *** CHECK FOR AUTODOUBLE ***
1788 : SMALL(2) = 0
1789 : RMACH = 1E13
1790 : IF (SMALL(2) .NE. 0) THEN
1791 : !* *** AUTODOUBLED ***
1792 : IF ( (SMALL(1) .EQ. 1117925532 &
1793 : & .AND. SMALL(2) .EQ. -448790528) &
1794 : & .OR. (SMALL(2) .EQ. 1117925532 &
1795 : & .AND. SMALL(1) .EQ. -448790528)) THEN
1796 : !* *** IEEE ***
1797 : IMACH(10) = 2
1798 : IMACH(14) = 53
1799 : IMACH(15) = -1021
1800 : IMACH(16) = 1024
1801 : ELSE IF ( SMALL(1) .EQ. -2065213935 &
1802 : & .AND. SMALL(2) .EQ. 10752) THEN
1803 : !* *** VAX WITH D_FLOATING ***
1804 : IMACH(10) = 2
1805 : IMACH(14) = 56
1806 : IMACH(15) = -127
1807 : IMACH(16) = 127
1808 : ELSE IF ( SMALL(1) .EQ. 1267827943 &
1809 : & .AND. SMALL(2) .EQ. 704643072) THEN
1810 : !* *** IBM MAINFRAME ***
1811 : IMACH(10) = 16
1812 : IMACH(14) = 14
1813 : IMACH(15) = -64
1814 : IMACH(16) = 63
1815 : ELSE
1816 : WRITE(std_out,9010)
1817 : STOP 777
1818 : END IF
1819 : IMACH(11) = IMACH(14)
1820 : IMACH(12) = IMACH(15)
1821 : IMACH(13) = IMACH(16)
1822 : ELSE
1823 : RMACH = 1234567.
1824 : IF (SMALL(1) .EQ. 1234613304) THEN
1825 : !* *** IEEE ***
1826 0 : IMACH(10) = 2
1827 0 : IMACH(11) = 24
1828 0 : IMACH(12) = -125
1829 0 : IMACH(13) = 128
1830 0 : IMACH(14) = 53
1831 0 : IMACH(15) = -1021
1832 0 : IMACH(16) = 1024
1833 0 : SC = 987
1834 : ELSE IF (SMALL(1) .EQ. -1271379306) THEN
1835 : !* *** VAX ***
1836 : IMACH(10) = 2
1837 : IMACH(11) = 24
1838 : IMACH(12) = -127
1839 : IMACH(13) = 127
1840 : IMACH(14) = 56
1841 : IMACH(15) = -127
1842 : IMACH(16) = 127
1843 : SC = 987
1844 : ELSE IF (SMALL(1) .EQ. 1175639687) THEN
1845 : !* *** IBM MAINFRAME ***
1846 : IMACH(10) = 16
1847 : IMACH(11) = 6
1848 : IMACH(12) = -64
1849 : IMACH(13) = 63
1850 : IMACH(14) = 14
1851 : IMACH(15) = -64
1852 : IMACH(16) = 63
1853 : SC = 987
1854 : ELSE IF (SMALL(1) .EQ. 1251390520) THEN
1855 : !* *** CONVEX C-1 ***
1856 : IMACH(10) = 2
1857 : IMACH(11) = 24
1858 : IMACH(12) = -128
1859 : IMACH(13) = 127
1860 : IMACH(14) = 53
1861 : IMACH(15) = -1024
1862 : IMACH(16) = 1023
1863 : ELSE
1864 : DO 10 I3 = 1, 3
1865 : J = SMALL(1) / 10000000
1866 : K = SMALL(1) - 10000000*J
1867 : IF (K .NE. T3E(I3)) GO TO 20
1868 : SMALL(1) = J
1869 : 10 CONTINUE
1870 : !* *** CRAY T3E ***
1871 : IMACH( 1) = 5
1872 : IMACH( 2) = 6
1873 : IMACH( 3) = 0
1874 : IMACH( 4) = 0
1875 : IMACH( 5) = 64
1876 : IMACH( 6) = 8
1877 : IMACH( 7) = 2
1878 : IMACH( 8) = 63
1879 : CALL I1MCR1(IMACH(9), K, 32767, 16777215, 16777215)
1880 : IMACH(10) = 2
1881 : IMACH(11) = 53
1882 : IMACH(12) = -1021
1883 : IMACH(13) = 1024
1884 : IMACH(14) = 53
1885 : IMACH(15) = -1021
1886 : IMACH(16) = 1024
1887 : GO TO 35
1888 : 20 CALL I1MCR1(J, K, 16405, 9876536, 0)
1889 : IF (SMALL(1) .NE. J) THEN
1890 : WRITE(std_out,9020)
1891 : STOP 777
1892 : END IF
1893 : !* *** CRAY 1, XMP, 2, AND 3 ***
1894 : IMACH(1) = 5
1895 : IMACH(2) = 6
1896 : IMACH(3) = 102
1897 : IMACH(4) = 6
1898 : IMACH(5) = 46
1899 : IMACH(6) = 8
1900 : IMACH(7) = 2
1901 : IMACH(8) = 45
1902 : CALL I1MCR1(IMACH(9), K, 0, 4194303, 16777215)
1903 : IMACH(10) = 2
1904 : IMACH(11) = 47
1905 : IMACH(12) = -8188
1906 : IMACH(13) = 8189
1907 : IMACH(14) = 94
1908 : IMACH(15) = -8141
1909 : IMACH(16) = 8189
1910 : GO TO 35
1911 : END IF
1912 : END IF
1913 0 : IMACH( 1) = 5
1914 0 : IMACH( 2) = 6
1915 0 : IMACH( 3) = 7
1916 0 : IMACH( 4) = 6
1917 0 : IMACH( 5) = 32
1918 0 : IMACH( 6) = 4
1919 0 : IMACH( 7) = 2
1920 0 : IMACH( 8) = 31
1921 0 : IMACH( 9) = 2147483647
1922 : 35 SC = 987
1923 : END IF
1924 : 9010 FORMAT(/' Adjust autodoubled I1MACH by uncommenting data'/ &
1925 : & ' statements appropriate for your machine and setting'/ &
1926 : & ' IMACH(I) = IMACH(I+3) for I = 11, 12, and 13.')
1927 : 9020 FORMAT(/' Adjust I1MACH by uncommenting data statements'/ &
1928 : & ' appropriate for your machine.')
1929 0 : IF (I .LT. 1 .OR. I .GT. 16) GO TO 40
1930 0 : I1MACH = IMACH(I)
1931 0 : RETURN
1932 0 : 40 WRITE(std_out,*) 'I1MACH(I): I =',I,' is out of bounds.'
1933 0 : STOP
1934 : !* /* C source for I1MACH -- remove the * in column 1 */
1935 : !* /* Note that some values may need changing. */
1936 : !*#include <stdio.h>
1937 : !*#include <float.h>
1938 : !*#include <limits.h>
1939 : !*#include <math.h>
1940 : !*
1941 : !*long i1mach_(long *i)
1942 : !*{
1943 : !* switch(*i){
1944 : !* case 1: return 5; /* standard input */
1945 : !* case 2: return 6; /* standard output */
1946 : !* case 3: return 7; /* standard punch */
1947 : !* case 4: return 0; /* standard error */
1948 : !* case 5: return 32; /* bits per integer */
1949 : !* case 6: return sizeof(int);
1950 : !* case 7: return 2; /* base for integers */
1951 : !* case 8: return 31; /* digits of integer base */
1952 : !* case 9: return LONG_MAX;
1953 : !* case 10: return FLT_RADIX;
1954 : !* case 11: return FLT_MANT_DIG;
1955 : !* case 12: return FLT_MIN_EXP;
1956 : !* case 13: return FLT_MAX_EXP;
1957 : !* case 14: return DBL_MANT_DIG;
1958 : !* case 15: return DBL_MIN_EXP;
1959 : !* case 16: return DBL_MAX_EXP;
1960 : !* }
1961 : !* fprintf(stderr, "invalid argument: i1mach(%ld)\n", *i);
1962 : !* exit(1);return 0; /* some compilers demand return values */
1963 : !*}
1964 : END FUNCTION I1MACH
1965 :
1966 : SUBROUTINE I1MCR1(A, A1, B, C, D)
1967 : !**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
1968 : INTEGER A, A1, B, C, D
1969 : A1 = 16777216*B + C
1970 : A = 16777216*A1 + D
1971 : END SUBROUTINE I1MCR1
1972 :
1973 0 : SUBROUTINE ZUCHK(YR, YI, NZ, ASCLE, TOL)
1974 : !C***BEGIN PROLOGUE ZUCHK
1975 : !C***REFER TO ZSERI,ZUOIK,ZUNK1,ZUNK2,ZUNI1,ZUNI2,ZKSCL
1976 : !C
1977 : !C Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN
1978 : !C EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE
1979 : !C IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW
1980 : !C WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED
1981 : !C IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE
1982 : !C OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE
1983 : !C ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.
1984 : !C
1985 : !C***ROUTINES CALLED (NONE)
1986 : !C***END PROLOGUE ZUCHK
1987 : !C
1988 : !C COMPLEX Y
1989 : DOUBLE PRECISION ASCLE, SS, ST, TOL, WR, WI, YR, YI
1990 : INTEGER NZ
1991 0 : NZ = 0
1992 0 : WR = DABS(YR)
1993 0 : WI = DABS(YI)
1994 0 : ST = DMIN1(WR,WI)
1995 0 : IF (ST.GT.ASCLE) RETURN
1996 0 : SS = DMAX1(WR,WI)
1997 0 : ST = ST/TOL
1998 0 : IF (SS.LT.ST) NZ = 1
1999 : RETURN
2000 : END SUBROUTINE ZUCHK
2001 :
2002 0 : SUBROUTINE ZDIV(AR, AI, BR, BI, CR, CI)
2003 : !C***BEGIN PROLOGUE ZDIV
2004 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
2005 : !C
2006 : !C DOUBLE PRECISION COMPLEX DIVIDE C=A/B.
2007 : !C
2008 : !C***ROUTINES CALLED AZABS
2009 : !C***END PROLOGUE ZDIV
2010 : DOUBLE PRECISION AR, AI, BR, BI, CR, CI, BM, CA, CB, CC, CD
2011 : !DOUBLE PRECISION AZABS
2012 0 : BM = 1.0D0/AZABS(BR,BI)
2013 0 : CC = BR*BM
2014 0 : CD = BI*BM
2015 0 : CA = (AR*CC+AI*CD)*BM
2016 0 : CB = (AI*CC-AR*CD)*BM
2017 0 : CR = CA
2018 0 : CI = CB
2019 0 : RETURN
2020 : END SUBROUTINE ZDIV
2021 :
2022 :
2023 0 : SUBROUTINE ZASYI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, RL, TOL, ELIM, &
2024 : & ALIM)
2025 : !C***BEGIN PROLOGUE ZASYI
2026 : !C***REFER TO ZBESI,ZBESK
2027 : !C
2028 : !C ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
2029 : !C MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
2030 : !C REGION CABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
2031 : !C NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
2032 : !C
2033 : !C***ROUTINES CALLED D1MACH,AZABS,ZDIV,AZEXP,ZMLT,AZSQRT
2034 : !C***END PROLOGUE ZASYI
2035 : !C COMPLEX AK1,CK,CONE,CS1,CS2,CZ,CZERO,DK,EZ,P1,RZ,S2,Y,Z
2036 : DOUBLE PRECISION AA, AEZ, AK, AK1I, AK1R, ALIM, ARG, ARM, ATOL, &
2037 : & AZ, BB, BK, CKI, CKR, CONEI, CONER, CS1I, CS1R, CS2I, CS2R, CZI, &
2038 : & CZR, DFNU, DKI, DKR, DNU2, ELIM, EZI, EZR, FDN, FNU, PI, P1I, &
2039 : & P1R, RAZ, RL, RTPI, RTR1, RZI, RZR, S, SGN, SQK, STI, STR, S2I, &
2040 : & S2R, TOL, TZI, TZR, YI, YR, ZEROI, ZEROR, ZI, ZR!, D1MACH, AZABS
2041 : INTEGER I, IB, IL, INU, J, JL, K, KODE, KODED, M, N, NN, NZ
2042 : DIMENSION YR(N), YI(N)
2043 : DATA PI, RTPI /3.14159265358979324D0 , 0.159154943091895336D0 /
2044 : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
2045 : !C
2046 0 : NZ = 0
2047 0 : AZ = AZABS(ZR,ZI)
2048 0 : ARM = 1.0D+3*D1MACH(1)
2049 0 : RTR1 = DSQRT(ARM)
2050 0 : IL = MIN0(2,N)
2051 0 : DFNU = FNU + DBLE(FLOAT(N-IL))
2052 : !C-----------------------------------------------------------------------
2053 : !C OVERFLOW TEST
2054 : !C-----------------------------------------------------------------------
2055 0 : RAZ = 1.0D0/AZ
2056 0 : STR = ZR*RAZ
2057 0 : STI = -ZI*RAZ
2058 0 : AK1R = RTPI*STR*RAZ
2059 0 : AK1I = RTPI*STI*RAZ
2060 0 : CALL AZSQRT(AK1R, AK1I, AK1R, AK1I)
2061 0 : CZR = ZR
2062 0 : CZI = ZI
2063 0 : IF (KODE.NE.2) GO TO 10
2064 0 : CZR = ZEROR
2065 0 : CZI = ZI
2066 : 10 CONTINUE
2067 0 : IF (DABS(CZR).GT.ELIM) GO TO 100
2068 0 : DNU2 = DFNU + DFNU
2069 0 : KODED = 1
2070 0 : IF ((DABS(CZR).GT.ALIM) .AND. (N.GT.2)) GO TO 20
2071 0 : KODED = 0
2072 0 : CALL AZEXP(CZR, CZI, STR, STI)
2073 0 : CALL ZMLT(AK1R, AK1I, STR, STI, AK1R, AK1I)
2074 : 20 CONTINUE
2075 0 : FDN = 0.0D0
2076 0 : IF (DNU2.GT.RTR1) FDN = DNU2*DNU2
2077 0 : EZR = ZR*8.0D0
2078 0 : EZI = ZI*8.0D0
2079 : !C-----------------------------------------------------------------------
2080 : !C WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
2081 : !C FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
2082 : !C EXPANSION FOR THE IMAGINARY PART.
2083 : !C-----------------------------------------------------------------------
2084 0 : AEZ = 8.0D0*AZ
2085 0 : S = TOL/AEZ
2086 0 : JL = INT(SNGL(RL+RL)) + 2
2087 0 : P1R = ZEROR
2088 0 : P1I = ZEROI
2089 0 : IF (ZI.EQ.0.0D0) GO TO 30
2090 : !C-----------------------------------------------------------------------
2091 : !C CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
2092 : !C SIGNIFICANCE WHEN FNU OR N IS LARGE
2093 : !C-----------------------------------------------------------------------
2094 0 : INU = INT(SNGL(FNU))
2095 0 : ARG = (FNU-DBLE(FLOAT(INU)))*PI
2096 0 : INU = INU + N - IL
2097 0 : AK = -DSIN(ARG)
2098 0 : BK = DCOS(ARG)
2099 0 : IF (ZI.LT.0.0D0) BK = -BK
2100 0 : P1R = AK
2101 0 : P1I = BK
2102 0 : IF (MOD(INU,2).EQ.0) GO TO 30
2103 0 : P1R = -P1R
2104 0 : P1I = -P1I
2105 : 30 CONTINUE
2106 0 : DO 70 K=1,IL
2107 0 : SQK = FDN - 1.0D0
2108 0 : ATOL = S*DABS(SQK)
2109 0 : SGN = 1.0D0
2110 0 : CS1R = CONER
2111 0 : CS1I = CONEI
2112 0 : CS2R = CONER
2113 0 : CS2I = CONEI
2114 0 : CKR = CONER
2115 0 : CKI = CONEI
2116 0 : AK = 0.0D0
2117 0 : AA = 1.0D0
2118 0 : BB = AEZ
2119 0 : DKR = EZR
2120 0 : DKI = EZI
2121 0 : DO 40 J=1,JL
2122 0 : CALL ZDIV(CKR, CKI, DKR, DKI, STR, STI)
2123 0 : CKR = STR*SQK
2124 0 : CKI = STI*SQK
2125 0 : CS2R = CS2R + CKR
2126 0 : CS2I = CS2I + CKI
2127 0 : SGN = -SGN
2128 0 : CS1R = CS1R + CKR*SGN
2129 0 : CS1I = CS1I + CKI*SGN
2130 0 : DKR = DKR + EZR
2131 0 : DKI = DKI + EZI
2132 0 : AA = AA*DABS(SQK)/BB
2133 0 : BB = BB + AEZ
2134 0 : AK = AK + 8.0D0
2135 0 : SQK = SQK - AK
2136 0 : IF (AA.LE.ATOL) GO TO 50
2137 0 : 40 CONTINUE
2138 0 : GO TO 110
2139 : 50 CONTINUE
2140 0 : S2R = CS1R
2141 0 : S2I = CS1I
2142 0 : IF (ZR+ZR.GE.ELIM) GO TO 60
2143 0 : TZR = ZR + ZR
2144 0 : TZI = ZI + ZI
2145 0 : CALL AZEXP(-TZR, -TZI, STR, STI)
2146 0 : CALL ZMLT(STR, STI, P1R, P1I, STR, STI)
2147 0 : CALL ZMLT(STR, STI, CS2R, CS2I, STR, STI)
2148 0 : S2R = S2R + STR
2149 0 : S2I = S2I + STI
2150 : 60 CONTINUE
2151 0 : FDN = FDN + 8.0D0*DFNU + 4.0D0
2152 0 : P1R = -P1R
2153 0 : P1I = -P1I
2154 0 : M = N - IL + K
2155 0 : YR(M) = S2R*AK1R - S2I*AK1I
2156 0 : YI(M) = S2R*AK1I + S2I*AK1R
2157 0 : 70 CONTINUE
2158 0 : IF (N.LE.2) RETURN
2159 0 : NN = N
2160 0 : K = NN - 2
2161 0 : AK = DBLE(FLOAT(K))
2162 0 : STR = ZR*RAZ
2163 0 : STI = -ZI*RAZ
2164 0 : RZR = (STR+STR)*RAZ
2165 0 : RZI = (STI+STI)*RAZ
2166 0 : IB = 3
2167 0 : DO 80 I=IB,NN
2168 0 : YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
2169 0 : YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
2170 0 : AK = AK - 1.0D0
2171 0 : K = K - 1
2172 0 : 80 CONTINUE
2173 0 : IF (KODED.EQ.0) RETURN
2174 0 : CALL AZEXP(CZR, CZI, CKR, CKI)
2175 0 : DO 90 I=1,NN
2176 0 : STR = YR(I)*CKR - YI(I)*CKI
2177 0 : YI(I) = YR(I)*CKI + YI(I)*CKR
2178 0 : YR(I) = STR
2179 0 : 90 CONTINUE
2180 0 : RETURN
2181 : 100 CONTINUE
2182 0 : NZ = -1
2183 0 : RETURN
2184 : 110 CONTINUE
2185 0 : NZ=-2
2186 0 : RETURN
2187 : END SUBROUTINE ZASYI
2188 :
2189 0 : SUBROUTINE AZSQRT(AR, AI, BR, BI)
2190 : !C***BEGIN PROLOGUE AZSQRT
2191 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
2192 : !C
2193 : !C DOUBLE PRECISION COMPLEX SQUARE ROOT, B=CSQRT(A)
2194 : !C
2195 : !C***ROUTINES CALLED AZABS
2196 : !C***END PROLOGUE AZSQRT
2197 : DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DRT
2198 : !DOUBLE PRECISION AZABS
2199 : DATA DRT , DPI / 7.071067811865475244008443621D-1, &
2200 : & 3.141592653589793238462643383D+0/
2201 0 : ZM = AZABS(AR,AI)
2202 0 : ZM = DSQRT(ZM)
2203 0 : IF (AR.EQ.0.0D+0) GO TO 10
2204 0 : IF (AI.EQ.0.0D+0) GO TO 20
2205 0 : DTHETA = DATAN(AI/AR)
2206 0 : IF (DTHETA.LE.0.0D+0) GO TO 40
2207 0 : IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
2208 0 : GO TO 50
2209 0 : 10 IF (AI.GT.0.0D+0) GO TO 60
2210 0 : IF (AI.LT.0.0D+0) GO TO 70
2211 0 : BR = 0.0D+0
2212 0 : BI = 0.0D+0
2213 0 : RETURN
2214 0 : 20 IF (AR.GT.0.0D+0) GO TO 30
2215 0 : BR = 0.0D+0
2216 0 : BI = DSQRT(DABS(AR))
2217 0 : RETURN
2218 0 : 30 BR = DSQRT(AR)
2219 0 : BI = 0.0D+0
2220 0 : RETURN
2221 0 : 40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
2222 0 : 50 DTHETA = DTHETA*0.5D+0
2223 0 : BR = ZM*DCOS(DTHETA)
2224 0 : BI = ZM*DSIN(DTHETA)
2225 0 : RETURN
2226 0 : 60 BR = ZM*DRT
2227 0 : BI = ZM*DRT
2228 0 : RETURN
2229 0 : 70 BR = ZM*DRT
2230 0 : BI = -ZM*DRT
2231 0 : RETURN
2232 : END SUBROUTINE AZSQRT
2233 :
2234 0 : SUBROUTINE AZEXP(AR, AI, BR, BI)
2235 : !C***BEGIN PROLOGUE AZEXP
2236 : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
2237 : !C
2238 : !C DOUBLE PRECISION COMPLEX EXPONENTIAL FUNCTION B=EXP(A)
2239 : !C
2240 : !C***ROUTINES CALLED (NONE)
2241 : !C***END PROLOGUE AZEXP
2242 : DOUBLE PRECISION AR, AI, BR, BI, ZM, CA, CB
2243 0 : ZM = DEXP(AR)
2244 0 : CA = ZM*DCOS(AI)
2245 0 : CB = ZM*DSIN(AI)
2246 0 : BR = CA
2247 0 : BI = CB
2248 0 : RETURN
2249 : END SUBROUTINE AZEXP
2250 :
2251 0 : SUBROUTINE ZUOIK(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL, &
2252 : & ELIM, ALIM)
2253 : !C***BEGIN PROLOGUE ZUOIK
2254 : !C***REFER TO ZBESI,ZBESK,ZBESH
2255 : !C
2256 : !C ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
2257 : !C EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
2258 : !C (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
2259 : !C WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
2260 : !C EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
2261 : !C THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
2262 : !C MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
2263 : !C EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
2264 : !C EXP(-ELIM)/TOL
2265 : !C
2266 : !C IKFLG=1 MEANS THE I SEQUENCE IS TESTED
2267 : !C =2 MEANS THE K SEQUENCE IS TESTED
2268 : !C NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
2269 : !C =-1 MEANS AN OVERFLOW WOULD OCCUR
2270 : !C IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
2271 : !C THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
2272 : !C IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
2273 : !C IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
2274 : !C ANOTHER ROUTINE
2275 : !C
2276 : !C***ROUTINES CALLED ZUCHK,ZUNHJ,ZUNIK,D1MACH,AZABS,AZLOG
2277 : !C***END PROLOGUE ZUOIK
2278 : !C COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
2279 : !C *ZR
2280 : DOUBLE PRECISION AARG, AIC, ALIM, APHI, ARGI, ARGR, ASUMI, ASUMR, &
2281 : & ASCLE, AX, AY, BSUMI, BSUMR, CWRKI, CWRKR, CZI, CZR, ELIM, FNN, &
2282 : & FNU, GNN, GNU, PHII, PHIR, RCZ, STR, STI, SUMI, SUMR, TOL, YI, &
2283 : & YR, ZBI, ZBR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI, &
2284 : & ZNI, ZNR, ZR, ZRI, ZRR!, D1MACH, AZABS
2285 : INTEGER I, IDUM, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
2286 : DIMENSION YR(N), YI(N), CWRKR(16), CWRKI(16)
2287 : DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
2288 : DATA AIC / 1.265512123484645396D+00 /
2289 0 : NUF = 0
2290 0 : NN = N
2291 0 : ZRR = ZR
2292 0 : ZRI = ZI
2293 0 : IF (ZR.GE.0.0D0) GO TO 10
2294 0 : ZRR = -ZR
2295 0 : ZRI = -ZI
2296 : 10 CONTINUE
2297 0 : ZBR = ZRR
2298 0 : ZBI = ZRI
2299 0 : AX = DABS(ZR)*1.7321D0
2300 0 : AY = DABS(ZI)
2301 0 : IFORM = 1
2302 0 : IF (AY.GT.AX) IFORM = 2
2303 0 : GNU = DMAX1(FNU,1.0D0)
2304 0 : IF (IKFLG.EQ.1) GO TO 20
2305 0 : FNN = DBLE(FLOAT(NN))
2306 0 : GNN = FNU + FNN - 1.0D0
2307 0 : GNU = DMAX1(GNN,FNN)
2308 : 20 CONTINUE
2309 : !C-----------------------------------------------------------------------
2310 : !C ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
2311 : !C REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
2312 : !C THE SIGN OF THE IMAGINARY PART CORRECT.
2313 : !C-----------------------------------------------------------------------
2314 0 : IF (IFORM.EQ.2) GO TO 30
2315 0 : INIT = 0
2316 : CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII, &
2317 0 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2318 0 : CZR = -ZETA1R + ZETA2R
2319 0 : CZI = -ZETA1I + ZETA2I
2320 0 : GO TO 50
2321 : 30 CONTINUE
2322 0 : ZNR = ZRI
2323 0 : ZNI = -ZRR
2324 0 : IF (ZI.GT.0.0D0) GO TO 40
2325 0 : ZNR = -ZNR
2326 : 40 CONTINUE
2327 : CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
2328 0 : & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2329 0 : CZR = -ZETA1R + ZETA2R
2330 0 : CZI = -ZETA1I + ZETA2I
2331 0 : AARG = AZABS(ARGR,ARGI)
2332 : 50 CONTINUE
2333 0 : IF (KODE.EQ.1) GO TO 60
2334 0 : CZR = CZR - ZBR
2335 0 : CZI = CZI - ZBI
2336 : 60 CONTINUE
2337 0 : IF (IKFLG.EQ.1) GO TO 70
2338 0 : CZR = -CZR
2339 0 : CZI = -CZI
2340 : 70 CONTINUE
2341 0 : APHI = AZABS(PHIR,PHII)
2342 0 : RCZ = CZR
2343 : !C-----------------------------------------------------------------------
2344 : !C OVERFLOW TEST
2345 : !C-----------------------------------------------------------------------
2346 0 : IF (RCZ.GT.ELIM) GO TO 210
2347 0 : IF (RCZ.LT.ALIM) GO TO 80
2348 0 : RCZ = RCZ + DLOG(APHI)
2349 0 : IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
2350 0 : IF (RCZ.GT.ELIM) GO TO 210
2351 0 : GO TO 130
2352 : 80 CONTINUE
2353 : !C-----------------------------------------------------------------------
2354 : !C UNDERFLOW TEST
2355 : !C-----------------------------------------------------------------------
2356 0 : IF (RCZ.LT.(-ELIM)) GO TO 90
2357 0 : IF (RCZ.GT.(-ALIM)) GO TO 130
2358 0 : RCZ = RCZ + DLOG(APHI)
2359 0 : IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
2360 0 : IF (RCZ.GT.(-ELIM)) GO TO 110
2361 : 90 CONTINUE
2362 0 : DO 100 I=1,NN
2363 0 : YR(I) = ZEROR
2364 0 : YI(I) = ZEROI
2365 0 : 100 CONTINUE
2366 0 : NUF = NN
2367 0 : RETURN
2368 : 110 CONTINUE
2369 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
2370 0 : CALL AZLOG(PHIR, PHII, STR, STI, IDUM)
2371 0 : CZR = CZR + STR
2372 0 : CZI = CZI + STI
2373 0 : IF (IFORM.EQ.1) GO TO 120
2374 0 : CALL AZLOG(ARGR, ARGI, STR, STI, IDUM)
2375 0 : CZR = CZR - 0.25D0*STR - AIC
2376 0 : CZI = CZI - 0.25D0*STI
2377 : 120 CONTINUE
2378 0 : AX = DEXP(RCZ)/TOL
2379 0 : AY = CZI
2380 0 : CZR = AX*DCOS(AY)
2381 0 : CZI = AX*DSIN(AY)
2382 0 : CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
2383 : IF (NW.NE.0) GO TO 90
2384 : 130 CONTINUE
2385 0 : IF (IKFLG.EQ.2) RETURN
2386 0 : IF (N.EQ.1) RETURN
2387 : !C-----------------------------------------------------------------------
2388 : !C SET UNDERFLOWS ON I SEQUENCE
2389 : !C-----------------------------------------------------------------------
2390 : 140 CONTINUE
2391 0 : GNU = FNU + DBLE(FLOAT(NN-1))
2392 0 : IF (IFORM.EQ.2) GO TO 150
2393 0 : INIT = 0
2394 : CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII, &
2395 0 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2396 0 : CZR = -ZETA1R + ZETA2R
2397 0 : CZI = -ZETA1I + ZETA2I
2398 0 : GO TO 160
2399 : 150 CONTINUE
2400 : CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
2401 0 : & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2402 0 : CZR = -ZETA1R + ZETA2R
2403 0 : CZI = -ZETA1I + ZETA2I
2404 0 : AARG = AZABS(ARGR,ARGI)
2405 : 160 CONTINUE
2406 0 : IF (KODE.EQ.1) GO TO 170
2407 0 : CZR = CZR - ZBR
2408 0 : CZI = CZI - ZBI
2409 : 170 CONTINUE
2410 0 : APHI = AZABS(PHIR,PHII)
2411 0 : RCZ = CZR
2412 0 : IF (RCZ.LT.(-ELIM)) GO TO 180
2413 0 : IF (RCZ.GT.(-ALIM)) RETURN
2414 0 : RCZ = RCZ + DLOG(APHI)
2415 0 : IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
2416 0 : IF (RCZ.GT.(-ELIM)) GO TO 190
2417 : 180 CONTINUE
2418 0 : YR(NN) = ZEROR
2419 0 : YI(NN) = ZEROI
2420 0 : NN = NN - 1
2421 0 : NUF = NUF + 1
2422 0 : IF (NN.EQ.0) RETURN
2423 0 : GO TO 140
2424 : 190 CONTINUE
2425 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
2426 0 : CALL AZLOG(PHIR, PHII, STR, STI, IDUM)
2427 0 : CZR = CZR + STR
2428 0 : CZI = CZI + STI
2429 0 : IF (IFORM.EQ.1) GO TO 200
2430 0 : CALL AZLOG(ARGR, ARGI, STR, STI, IDUM)
2431 0 : CZR = CZR - 0.25D0*STR - AIC
2432 0 : CZI = CZI - 0.25D0*STI
2433 : 200 CONTINUE
2434 0 : AX = DEXP(RCZ)/TOL
2435 0 : AY = CZI
2436 0 : CZR = AX*DCOS(AY)
2437 0 : CZI = AX*DSIN(AY)
2438 0 : CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
2439 : IF (NW.NE.0) GO TO 180
2440 0 : RETURN
2441 : 210 CONTINUE
2442 0 : NUF = -1
2443 0 : RETURN
2444 : END SUBROUTINE ZUOIK
2445 :
2446 :
2447 0 : SUBROUTINE ZUNIK(ZRR, ZRI, FNU, IKFLG, IPMTR, TOL, INIT, PHIR, &
2448 : & PHII, ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2449 : !C***BEGIN PROLOGUE ZUNIK
2450 : !C***REFER TO ZBESI,ZBESK
2451 : !C
2452 : !C ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC
2453 : !C EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2
2454 : !C RESPECTIVELY BY
2455 : !C
2456 : !C W(FNU,ZR) = PHI*EXP(ZETA)*SUM
2457 : !C
2458 : !C WHERE ZETA=-ZETA1 + ZETA2 OR
2459 : !C ZETA1 - ZETA2
2460 : !C
2461 : !C THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE
2462 : !C SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG=
2463 : !C 1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK
2464 : !C ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI,
2465 : !C ZETA1,ZETA2.
2466 : !C
2467 : !C***ROUTINES CALLED ZDIV,AZLOG,AZSQRT,D1MACH
2468 : !C***END PROLOGUE ZUNIK
2469 : !C COMPLEX CFN,CON,CONE,CRFN,CWRK,CZERO,PHI,S,SR,SUM,T,T2,ZETA1,
2470 : !C *ZETA2,ZN,ZR
2471 : DOUBLE PRECISION AC, C, CON, CONEI, CONER, CRFNI, CRFNR, CWRKI, &
2472 : & CWRKR, FNU, PHII, PHIR, RFN, SI, SR, SRI, SRR, STI, STR, SUMI, &
2473 : & SUMR, TEST, TI, TOL, TR, T2I, T2R, ZEROI, ZEROR, ZETA1I, ZETA1R, &
2474 : & ZETA2I, ZETA2R, ZNI, ZNR, ZRI, ZRR!, D1MACH
2475 : INTEGER I, IDUM, IKFLG, INIT, IPMTR, J, K, L
2476 : DIMENSION C(120), CWRKR(16), CWRKI(16), CON(2)
2477 : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
2478 : DATA CON(1), CON(2) / &
2479 : & 3.98942280401432678D-01, 1.25331413731550025D+00 /
2480 : DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10), &
2481 : & C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18), &
2482 : & C(19), C(20), C(21), C(22), C(23), C(24)/ &
2483 : & 1.00000000000000000D+00, -2.08333333333333333D-01, &
2484 : & 1.25000000000000000D-01, 3.34201388888888889D-01, &
2485 : & -4.01041666666666667D-01, 7.03125000000000000D-02, &
2486 : & -1.02581259645061728D+00, 1.84646267361111111D+00, &
2487 : & -8.91210937500000000D-01, 7.32421875000000000D-02, &
2488 : & 4.66958442342624743D+00, -1.12070026162229938D+01, &
2489 : & 8.78912353515625000D+00, -2.36408691406250000D+00, &
2490 : & 1.12152099609375000D-01, -2.82120725582002449D+01, &
2491 : & 8.46362176746007346D+01, -9.18182415432400174D+01, &
2492 : & 4.25349987453884549D+01, -7.36879435947963170D+00, &
2493 : & 2.27108001708984375D-01, 2.12570130039217123D+02, &
2494 : & -7.65252468141181642D+02, 1.05999045252799988D+03/
2495 : DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32), &
2496 : & C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40), &
2497 : & C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/ &
2498 : & -6.99579627376132541D+02, 2.18190511744211590D+02, &
2499 : & -2.64914304869515555D+01, 5.72501420974731445D-01, &
2500 : & -1.91945766231840700D+03, 8.06172218173730938D+03, &
2501 : & -1.35865500064341374D+04, 1.16553933368645332D+04, &
2502 : & -5.30564697861340311D+03, 1.20090291321635246D+03, &
2503 : & -1.08090919788394656D+02, 1.72772750258445740D+00, &
2504 : & 2.02042913309661486D+04, -9.69805983886375135D+04, &
2505 : & 1.92547001232531532D+05, -2.03400177280415534D+05, &
2506 : & 1.22200464983017460D+05, -4.11926549688975513D+04, &
2507 : & 7.10951430248936372D+03, -4.93915304773088012D+02, &
2508 : & 6.07404200127348304D+00, -2.42919187900551333D+05, &
2509 : & 1.31176361466297720D+06, -2.99801591853810675D+06/
2510 : DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56), &
2511 : & C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64), &
2512 : & C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/ &
2513 : & 3.76327129765640400D+06, -2.81356322658653411D+06, &
2514 : & 1.26836527332162478D+06, -3.31645172484563578D+05, &
2515 : & 4.52187689813627263D+04, -2.49983048181120962D+03, &
2516 : & 2.43805296995560639D+01, 3.28446985307203782D+06, &
2517 : & -1.97068191184322269D+07, 5.09526024926646422D+07, &
2518 : & -7.41051482115326577D+07, 6.63445122747290267D+07, &
2519 : & -3.75671766607633513D+07, 1.32887671664218183D+07, &
2520 : & -2.78561812808645469D+06, 3.08186404612662398D+05, &
2521 : & -1.38860897537170405D+04, 1.10017140269246738D+02, &
2522 : & -4.93292536645099620D+07, 3.25573074185765749D+08, &
2523 : & -9.39462359681578403D+08, 1.55359689957058006D+09,&
2524 : & -1.62108055210833708D+09, 1.10684281682301447D+09/
2525 : DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80), &
2526 : & C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88), &
2527 : & C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/ &
2528 : & -4.95889784275030309D+08, 1.42062907797533095D+08, &
2529 : & -2.44740627257387285D+07, 2.24376817792244943D+06, &
2530 : & -8.40054336030240853D+04, 5.51335896122020586D+02, &
2531 : & 8.14789096118312115D+08, -5.86648149205184723D+09, &
2532 : & 1.86882075092958249D+10, -3.46320433881587779D+10, &
2533 : & 4.12801855797539740D+10, -3.30265997498007231D+10, &
2534 : & 1.79542137311556001D+10, -6.56329379261928433D+09, &
2535 : & 1.55927986487925751D+09, -2.25105661889415278D+08, &
2536 : & 1.73951075539781645D+07, -5.49842327572288687D+05, &
2537 : & 3.03809051092238427D+03, -1.46792612476956167D+10, &
2538 : & 1.14498237732025810D+11, -3.99096175224466498D+11,&
2539 : & 8.19218669548577329D+11, -1.09837515608122331D+12/
2540 : DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104), &
2541 : & C(105), C(106), C(107), C(108), C(109), C(110), C(111), &
2542 : & C(112), C(113), C(114), C(115), C(116), C(117), C(118)/ &
2543 : & 1.00815810686538209D+12, -6.45364869245376503D+11, &
2544 : & 2.87900649906150589D+11, -8.78670721780232657D+10, &
2545 : & 1.76347306068349694D+10, -2.16716498322379509D+09, &
2546 : & 1.43157876718888981D+08, -3.87183344257261262D+06, &
2547 : & 1.82577554742931747D+04, 2.86464035717679043D+11, &
2548 : & -2.40629790002850396D+12, 9.10934118523989896D+12, &
2549 : & -2.05168994109344374D+13, 3.05651255199353206D+13, &
2550 : & -3.16670885847851584D+13, 2.33483640445818409D+13, &
2551 : & -1.23204913055982872D+13, 4.61272578084913197D+12, &
2552 : & -1.19655288019618160D+12, 2.05914503232410016D+11, &
2553 : & -2.18229277575292237D+10, 1.24700929351271032D+09/
2554 : DATA C(119), C(120)/ &
2555 : & -2.91883881222208134D+07, 1.18838426256783253D+05/
2556 : !C
2557 0 : IF (INIT.NE.0) GO TO 40
2558 : !C-----------------------------------------------------------------------
2559 : !C INITIALIZE ALL VARIABLES
2560 : !C-----------------------------------------------------------------------
2561 0 : RFN = 1.0D0/FNU
2562 : !C-----------------------------------------------------------------------
2563 : !C OVERFLOW TEST (ZR/FNU TOO SMALL)
2564 : !C-----------------------------------------------------------------------
2565 0 : TEST = D1MACH(1)*1.0D+3
2566 0 : AC = FNU*TEST
2567 0 : IF (DABS(ZRR).GT.AC .OR. DABS(ZRI).GT.AC) GO TO 15
2568 0 : ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
2569 0 : ZETA1I = 0.0D0
2570 0 : ZETA2R = FNU
2571 0 : ZETA2I = 0.0D0
2572 0 : PHIR = 1.0D0
2573 0 : PHII = 0.0D0
2574 0 : RETURN
2575 : 15 CONTINUE
2576 0 : TR = ZRR*RFN
2577 0 : TI = ZRI*RFN
2578 0 : SR = CONER + (TR*TR-TI*TI)
2579 0 : SI = CONEI + (TR*TI+TI*TR)
2580 0 : CALL AZSQRT(SR, SI, SRR, SRI)
2581 0 : STR = CONER + SRR
2582 0 : STI = CONEI + SRI
2583 0 : CALL ZDIV(STR, STI, TR, TI, ZNR, ZNI)
2584 0 : CALL AZLOG(ZNR, ZNI, STR, STI, IDUM)
2585 0 : ZETA1R = FNU*STR
2586 0 : ZETA1I = FNU*STI
2587 0 : ZETA2R = FNU*SRR
2588 0 : ZETA2I = FNU*SRI
2589 0 : CALL ZDIV(CONER, CONEI, SRR, SRI, TR, TI)
2590 0 : SRR = TR*RFN
2591 0 : SRI = TI*RFN
2592 0 : CALL AZSQRT(SRR, SRI, CWRKR(16), CWRKI(16))
2593 0 : PHIR = CWRKR(16)*CON(IKFLG)
2594 0 : PHII = CWRKI(16)*CON(IKFLG)
2595 0 : IF (IPMTR.NE.0) RETURN
2596 0 : CALL ZDIV(CONER, CONEI, SR, SI, T2R, T2I)
2597 0 : CWRKR(1) = CONER
2598 0 : CWRKI(1) = CONEI
2599 0 : CRFNR = CONER
2600 0 : CRFNI = CONEI
2601 0 : AC = 1.0D0
2602 0 : L = 1
2603 0 : DO 20 K=2,15
2604 0 : SR = ZEROR
2605 0 : SI = ZEROI
2606 0 : DO 10 J=1,K
2607 0 : L = L + 1
2608 0 : STR = SR*T2R - SI*T2I + C(L)
2609 0 : SI = SR*T2I + SI*T2R
2610 0 : SR = STR
2611 0 : 10 CONTINUE
2612 0 : STR = CRFNR*SRR - CRFNI*SRI
2613 0 : CRFNI = CRFNR*SRI + CRFNI*SRR
2614 0 : CRFNR = STR
2615 0 : CWRKR(K) = CRFNR*SR - CRFNI*SI
2616 0 : CWRKI(K) = CRFNR*SI + CRFNI*SR
2617 0 : AC = AC*RFN
2618 0 : TEST = DABS(CWRKR(K)) + DABS(CWRKI(K))
2619 0 : IF (AC.LT.TOL .AND. TEST.LT.TOL) GO TO 30
2620 0 : 20 CONTINUE
2621 0 : K = 15
2622 : 30 CONTINUE
2623 0 : INIT = K
2624 : 40 CONTINUE
2625 0 : IF (IKFLG.EQ.2) GO TO 60
2626 : !C-----------------------------------------------------------------------
2627 : !C COMPUTE SUM FOR THE I FUNCTION
2628 : !C-----------------------------------------------------------------------
2629 0 : SR = ZEROR
2630 0 : SI = ZEROI
2631 0 : DO 50 I=1,INIT
2632 0 : SR = SR + CWRKR(I)
2633 0 : SI = SI + CWRKI(I)
2634 0 : 50 CONTINUE
2635 0 : SUMR = SR
2636 0 : SUMI = SI
2637 0 : PHIR = CWRKR(16)*CON(1)
2638 0 : PHII = CWRKI(16)*CON(1)
2639 0 : RETURN
2640 : 60 CONTINUE
2641 : !C-----------------------------------------------------------------------
2642 : !C COMPUTE SUM FOR THE K FUNCTION
2643 : !C-----------------------------------------------------------------------
2644 0 : SR = ZEROR
2645 0 : SI = ZEROI
2646 0 : TR = CONER
2647 0 : DO 70 I=1,INIT
2648 0 : SR = SR + TR*CWRKR(I)
2649 0 : SI = SI + TR*CWRKI(I)
2650 0 : TR = -TR
2651 0 : 70 CONTINUE
2652 0 : SUMR = SR
2653 0 : SUMI = SI
2654 0 : PHIR = CWRKR(16)*CON(2)
2655 0 : PHII = CWRKI(16)*CON(2)
2656 0 : RETURN
2657 : END SUBROUTINE ZUNIK
2658 :
2659 :
2660 0 : SUBROUTINE ZUNHJ(ZR, ZI, FNU, IPMTR, TOL, PHIR, PHII, ARGR, ARGI, &
2661 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2662 : !C***BEGIN PROLOGUE ZUNHJ
2663 : !C***REFER TO ZBESI,ZBESK
2664 : !C
2665 : !C REFERENCES
2666 : !C HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A.
2667 : !C STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.
2668 : !C
2669 : !C ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC
2670 : !C PRESS, N.Y., 1974, PAGE 420
2671 : !C
2672 : !C ABSTRACT
2673 : !C ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) =
2674 : !C J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU
2675 : !C BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
2676 : !C
2677 : !C C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
2678 : !C
2679 : !C FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS
2680 : !C AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
2681 : !C
2682 : !C (2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
2683 : !C
2684 : !C ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING
2685 : !C PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
2686 : !C
2687 : !C MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND
2688 : !C MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=
2689 : !C 1 COMPUTES ALL EXCEPT ASUM AND BSUM.
2690 : !C
2691 : !C***ROUTINES CALLED AZABS,ZDIV,AZLOG,AZSQRT,D1MACH
2692 : !C***END PROLOGUE ZUNHJ
2693 : !C COMPLEX ARG,ASUM,BSUM,CFNU,CONE,CR,CZERO,DR,P,PHI,PRZTH,PTFN,
2694 : !C *RFN13,RTZTA,RZTH,SUMA,SUMB,TFN,T2,UP,W,W2,Z,ZA,ZB,ZC,ZETA,ZETA1,
2695 : !C *ZETA2,ZTH
2696 : DOUBLE PRECISION ALFA, ANG, AP, AR, ARGI, ARGR, ASUMI, ASUMR, &
2697 : & ATOL, AW2, AZTH, BETA, BR, BSUMI, BSUMR, BTOL, C, CONEI, CONER, &
2698 : & CRI, CRR, DRI, DRR, EX1, EX2, FNU, FN13, FN23, GAMA, GPI, HPI, &
2699 : & PHII, PHIR, PI, PP, PR, PRZTHI, PRZTHR, PTFNI, PTFNR, RAW, RAW2, &
2700 : & RAZTH, RFNU, RFNU2, RFN13, RTZTI, RTZTR, RZTHI, RZTHR, STI, STR, &
2701 : & SUMAI, SUMAR, SUMBI, SUMBR, TEST, TFNI, TFNR, THPI, TOL, TZAI, &
2702 : & TZAR, T2I, T2R, UPI, UPR, WI, WR, W2I, W2R, ZAI, ZAR, ZBI, ZBR, &
2703 : & ZCI, ZCR, ZEROI, ZEROR, ZETAI, ZETAR, ZETA1I, ZETA1R, ZETA2I, &
2704 : & ZETA2R, ZI, ZR, ZTHI, ZTHR, AC !, AZABS, D1MACH
2705 : INTEGER IAS, IBS, IPMTR, IS, J, JR, JU, K, KMAX, KP1, KS, L, LR, &
2706 : & LRP1, L1, L2, M, IDUM
2707 : DIMENSION AR(14), BR(14), C(105), ALFA(180), BETA(210), GAMA(30), &
2708 : & AP(30), PR(30), PI(30), UPR(14), UPI(14), CRR(14), CRI(14), &
2709 : & DRR(14), DRI(14)
2710 : DATA AR(1), AR(2), AR(3), AR(4), AR(5), AR(6), AR(7), AR(8), &
2711 : & AR(9), AR(10), AR(11), AR(12), AR(13), AR(14)/ &
2712 : & 1.00000000000000000D+00, 1.04166666666666667D-01, &
2713 : & 8.35503472222222222D-02, 1.28226574556327160D-01, &
2714 : & 2.91849026464140464D-01, 8.81627267443757652D-01, &
2715 : & 3.32140828186276754D+00, 1.49957629868625547D+01, &
2716 : & 7.89230130115865181D+01, 4.74451538868264323D+02, &
2717 : & 3.20749009089066193D+03, 2.40865496408740049D+04, &
2718 : & 1.98923119169509794D+05, 1.79190200777534383D+06/
2719 : DATA BR(1), BR(2), BR(3), BR(4), BR(5), BR(6), BR(7), BR(8), &
2720 : & BR(9), BR(10), BR(11), BR(12), BR(13), BR(14)/ &
2721 : & 1.00000000000000000D+00, -1.45833333333333333D-01, &
2722 : & -9.87413194444444444D-02, -1.43312053915895062D-01, &
2723 : & -3.17227202678413548D-01, -9.42429147957120249D-01, &
2724 : & -3.51120304082635426D+00, -1.57272636203680451D+01, &
2725 : & -8.22814390971859444D+01, -4.92355370523670524D+02, &
2726 : & -3.31621856854797251D+03, -2.48276742452085896D+04, &
2727 : & -2.04526587315129788D+05, -1.83844491706820990D+06/
2728 : DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10), &
2729 : & C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18), &
2730 : & C(19), C(20), C(21), C(22), C(23), C(24)/ &
2731 : & 1.00000000000000000D+00, -2.08333333333333333D-01, &
2732 : & 1.25000000000000000D-01, 3.34201388888888889D-01, &
2733 : & -4.01041666666666667D-01, 7.03125000000000000D-02, &
2734 : & -1.02581259645061728D+00, 1.84646267361111111D+00, &
2735 : & -8.91210937500000000D-01, 7.32421875000000000D-02, &
2736 : & 4.66958442342624743D+00, -1.12070026162229938D+01, &
2737 : & 8.78912353515625000D+00, -2.36408691406250000D+00, &
2738 : & 1.12152099609375000D-01, -2.82120725582002449D+01, &
2739 : & 8.46362176746007346D+01, -9.18182415432400174D+01, &
2740 : & 4.25349987453884549D+01, -7.36879435947963170D+00, &
2741 : & 2.27108001708984375D-01, 2.12570130039217123D+02, &
2742 : & -7.65252468141181642D+02, 1.05999045252799988D+03/
2743 : DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32), &
2744 : & C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40), &
2745 : & C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/ &
2746 : & -6.99579627376132541D+02, 2.18190511744211590D+02, &
2747 : & -2.64914304869515555D+01, 5.72501420974731445D-01, &
2748 : & -1.91945766231840700D+03, 8.06172218173730938D+03, &
2749 : & -1.35865500064341374D+04, 1.16553933368645332D+04, &
2750 : & -5.30564697861340311D+03, 1.20090291321635246D+03, &
2751 : & -1.08090919788394656D+02, 1.72772750258445740D+00, &
2752 : & 2.02042913309661486D+04, -9.69805983886375135D+04, &
2753 : & 1.92547001232531532D+05, -2.03400177280415534D+05, &
2754 : & 1.22200464983017460D+05, -4.11926549688975513D+04, &
2755 : & 7.10951430248936372D+03, -4.93915304773088012D+02, &
2756 : & 6.07404200127348304D+00, -2.42919187900551333D+05, &
2757 : & 1.31176361466297720D+06, -2.99801591853810675D+06/
2758 : DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56), &
2759 : & C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64), &
2760 : & C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/ &
2761 : & 3.76327129765640400D+06, -2.81356322658653411D+06, &
2762 : & 1.26836527332162478D+06, -3.31645172484563578D+05, &
2763 : & 4.52187689813627263D+04, -2.49983048181120962D+03, &
2764 : & 2.43805296995560639D+01, 3.28446985307203782D+06, &
2765 : & -1.97068191184322269D+07, 5.09526024926646422D+07, &
2766 : & -7.41051482115326577D+07, 6.63445122747290267D+07, &
2767 : & -3.75671766607633513D+07, 1.32887671664218183D+07, &
2768 : & -2.78561812808645469D+06, 3.08186404612662398D+05, &
2769 : & -1.38860897537170405D+04, 1.10017140269246738D+02, &
2770 : & -4.93292536645099620D+07, 3.25573074185765749D+08, &
2771 : & -9.39462359681578403D+08, 1.55359689957058006D+09, &
2772 : & -1.62108055210833708D+09, 1.10684281682301447D+09/
2773 : DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80), &
2774 : & C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88), &
2775 : & C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/ &
2776 : & -4.95889784275030309D+08, 1.42062907797533095D+08, &
2777 : & -2.44740627257387285D+07, 2.24376817792244943D+06, &
2778 : & -8.40054336030240853D+04, 5.51335896122020586D+02, &
2779 : & 8.14789096118312115D+08, -5.86648149205184723D+09, &
2780 : & 1.86882075092958249D+10, -3.46320433881587779D+10, &
2781 : & 4.12801855797539740D+10, -3.30265997498007231D+10, &
2782 : & 1.79542137311556001D+10, -6.56329379261928433D+09, &
2783 : & 1.55927986487925751D+09, -2.25105661889415278D+08, &
2784 : & 1.73951075539781645D+07, -5.49842327572288687D+05, &
2785 : & 3.03809051092238427D+03, -1.46792612476956167D+10, &
2786 : & 1.14498237732025810D+11, -3.99096175224466498D+11, &
2787 : & 8.19218669548577329D+11, -1.09837515608122331D+12/
2788 : DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104), &
2789 : & C(105)/ &
2790 : & 1.00815810686538209D+12, -6.45364869245376503D+11, &
2791 : & 2.87900649906150589D+11, -8.78670721780232657D+10, &
2792 : & 1.76347306068349694D+10, -2.16716498322379509D+09, &
2793 : & 1.43157876718888981D+08, -3.87183344257261262D+06, &
2794 : & 1.82577554742931747D+04/
2795 : DATA ALFA(1), ALFA(2), ALFA(3), ALFA(4), ALFA(5), ALFA(6), &
2796 : & ALFA(7), ALFA(8), ALFA(9), ALFA(10), ALFA(11), ALFA(12), &
2797 : & ALFA(13), ALFA(14), ALFA(15), ALFA(16), ALFA(17), ALFA(18), &
2798 : & ALFA(19), ALFA(20), ALFA(21), ALFA(22)/ &
2799 : & -4.44444444444444444D-03, -9.22077922077922078D-04, &
2800 : & -8.84892884892884893D-05, 1.65927687832449737D-04, &
2801 : & 2.46691372741792910D-04, 2.65995589346254780D-04, &
2802 : & 2.61824297061500945D-04, 2.48730437344655609D-04, &
2803 : & 2.32721040083232098D-04, 2.16362485712365082D-04, &
2804 : & 2.00738858762752355D-04, 1.86267636637545172D-04, &
2805 : & 1.73060775917876493D-04, 1.61091705929015752D-04, &
2806 : & 1.50274774160908134D-04, 1.40503497391269794D-04, &
2807 : & 1.31668816545922806D-04, 1.23667445598253261D-04, &
2808 : & 1.16405271474737902D-04, 1.09798298372713369D-04, &
2809 : & 1.03772410422992823D-04, 9.82626078369363448D-05/
2810 : DATA ALFA(23), ALFA(24), ALFA(25), ALFA(26), ALFA(27), ALFA(28), &
2811 : & ALFA(29), ALFA(30), ALFA(31), ALFA(32), ALFA(33), ALFA(34), &
2812 : & ALFA(35), ALFA(36), ALFA(37), ALFA(38), ALFA(39), ALFA(40), &
2813 : & ALFA(41), ALFA(42), ALFA(43), ALFA(44)/ &
2814 : & 9.32120517249503256D-05, 8.85710852478711718D-05, &
2815 : & 8.42963105715700223D-05, 8.03497548407791151D-05, &
2816 : & 7.66981345359207388D-05, 7.33122157481777809D-05, &
2817 : & 7.01662625163141333D-05, 6.72375633790160292D-05, &
2818 : & 6.93735541354588974D-04, 2.32241745182921654D-04, &
2819 : & -1.41986273556691197D-05, -1.16444931672048640D-04, &
2820 : & -1.50803558053048762D-04, -1.55121924918096223D-04, &
2821 : & -1.46809756646465549D-04, -1.33815503867491367D-04, &
2822 : & -1.19744975684254051D-04, -1.06184319207974020D-04, &
2823 : & -9.37699549891194492D-05, -8.26923045588193274D-05, &
2824 : & -7.29374348155221211D-05, -6.44042357721016283D-05/
2825 : DATA ALFA(45), ALFA(46), ALFA(47), ALFA(48), ALFA(49), ALFA(50), &
2826 : & ALFA(51), ALFA(52), ALFA(53), ALFA(54), ALFA(55), ALFA(56), &
2827 : & ALFA(57), ALFA(58), ALFA(59), ALFA(60), ALFA(61), ALFA(62), &
2828 : & ALFA(63), ALFA(64), ALFA(65), ALFA(66)/ &
2829 : & -5.69611566009369048D-05, -5.04731044303561628D-05, &
2830 : & -4.48134868008882786D-05, -3.98688727717598864D-05, &
2831 : & -3.55400532972042498D-05, -3.17414256609022480D-05, &
2832 : & -2.83996793904174811D-05, -2.54522720634870566D-05, &
2833 : & -2.28459297164724555D-05, -2.05352753106480604D-05, &
2834 : & -1.84816217627666085D-05, -1.66519330021393806D-05, &
2835 : & -1.50179412980119482D-05, -1.35554031379040526D-05, &
2836 : & -1.22434746473858131D-05, -1.10641884811308169D-05, &
2837 : & -3.54211971457743841D-04, -1.56161263945159416D-04, &
2838 : & 3.04465503594936410D-05, 1.30198655773242693D-04, &
2839 : & 1.67471106699712269D-04, 1.70222587683592569D-04/
2840 : DATA ALFA(67), ALFA(68), ALFA(69), ALFA(70), ALFA(71), ALFA(72), &
2841 : & ALFA(73), ALFA(74), ALFA(75), ALFA(76), ALFA(77), ALFA(78), &
2842 : & ALFA(79), ALFA(80), ALFA(81), ALFA(82), ALFA(83), ALFA(84), &
2843 : & ALFA(85), ALFA(86), ALFA(87), ALFA(88)/ &
2844 : & 1.56501427608594704D-04, 1.36339170977445120D-04, &
2845 : & 1.14886692029825128D-04, 9.45869093034688111D-05, &
2846 : & 7.64498419250898258D-05, 6.07570334965197354D-05, &
2847 : & 4.74394299290508799D-05, 3.62757512005344297D-05, &
2848 : & 2.69939714979224901D-05, 1.93210938247939253D-05, &
2849 : & 1.30056674793963203D-05, 7.82620866744496661D-06, &
2850 : & 3.59257485819351583D-06, 1.44040049814251817D-07, &
2851 : & -2.65396769697939116D-06, -4.91346867098485910D-06, &
2852 : & -6.72739296091248287D-06, -8.17269379678657923D-06, &
2853 : & -9.31304715093561232D-06, -1.02011418798016441D-05, &
2854 : -1.08805962510592880D-05, -1.13875481509603555D-05/
2855 : DATA ALFA(89), ALFA(90), ALFA(91), ALFA(92), ALFA(93), ALFA(94), &
2856 : & ALFA(95), ALFA(96), ALFA(97), ALFA(98), ALFA(99), ALFA(100), &
2857 : & ALFA(101), ALFA(102), ALFA(103), ALFA(104), ALFA(105), &
2858 : & ALFA(106), ALFA(107), ALFA(108), ALFA(109), ALFA(110)/ &
2859 : & -1.17519675674556414D-05, -1.19987364870944141D-05, &
2860 : & 3.78194199201772914D-04, 2.02471952761816167D-04, &
2861 : & -6.37938506318862408D-05, -2.38598230603005903D-04, &
2862 : & -3.10916256027361568D-04, -3.13680115247576316D-04, &
2863 : & -2.78950273791323387D-04, -2.28564082619141374D-04, &
2864 : & -1.75245280340846749D-04, -1.25544063060690348D-04, &
2865 : & -8.22982872820208365D-05, -4.62860730588116458D-05, &
2866 : & -1.72334302366962267D-05, 5.60690482304602267D-06, &
2867 : & 2.31395443148286800D-05, 3.62642745856793957D-05, &
2868 : & 4.58006124490188752D-05, 5.24595294959114050D-05, &
2869 : & 5.68396208545815266D-05, 5.94349820393104052D-05/
2870 : DATA ALFA(111), ALFA(112), ALFA(113), ALFA(114), ALFA(115), &
2871 : & ALFA(116), ALFA(117), ALFA(118), ALFA(119), ALFA(120), &
2872 : & ALFA(121), ALFA(122), ALFA(123), ALFA(124), ALFA(125), &
2873 : & ALFA(126), ALFA(127), ALFA(128), ALFA(129), ALFA(130)/ &
2874 : & 6.06478527578421742D-05, 6.08023907788436497D-05, &
2875 : & 6.01577894539460388D-05, 5.89199657344698500D-05, &
2876 : & 5.72515823777593053D-05, 5.52804375585852577D-05, &
2877 : & 5.31063773802880170D-05, 5.08069302012325706D-05, &
2878 : & 4.84418647620094842D-05, 4.60568581607475370D-05, &
2879 : & -6.91141397288294174D-04, -4.29976633058871912D-04, &
2880 : & 1.83067735980039018D-04, 6.60088147542014144D-04, &
2881 : & 8.75964969951185931D-04, 8.77335235958235514D-04, &
2882 : & 7.49369585378990637D-04, 5.63832329756980918D-04, &
2883 : & 3.68059319971443156D-04, 1.88464535514455599D-04/
2884 : DATA ALFA(131), ALFA(132), ALFA(133), ALFA(134), ALFA(135), &
2885 : & ALFA(136), ALFA(137), ALFA(138), ALFA(139), ALFA(140), &
2886 : & ALFA(141), ALFA(142), ALFA(143), ALFA(144), ALFA(145), &
2887 : & ALFA(146), ALFA(147), ALFA(148), ALFA(149), ALFA(150)/ &
2888 : & 3.70663057664904149D-05, -8.28520220232137023D-05, &
2889 : & -1.72751952869172998D-04, -2.36314873605872983D-04, &
2890 : & -2.77966150694906658D-04, -3.02079514155456919D-04, &
2891 : & -3.12594712643820127D-04, -3.12872558758067163D-04, &
2892 : & -3.05678038466324377D-04, -2.93226470614557331D-04, &
2893 : & -2.77255655582934777D-04, -2.59103928467031709D-04, &
2894 : & -2.39784014396480342D-04, -2.20048260045422848D-04, &
2895 : & -2.00443911094971498D-04, -1.81358692210970687D-04, &
2896 : & -1.63057674478657464D-04, -1.45712672175205844D-04, &
2897 : & -1.29425421983924587D-04, -1.14245691942445952D-04/
2898 : DATA ALFA(151), ALFA(152), ALFA(153), ALFA(154), ALFA(155), &
2899 : & ALFA(156), ALFA(157), ALFA(158), ALFA(159), ALFA(160), &
2900 : & ALFA(161), ALFA(162), ALFA(163), ALFA(164), ALFA(165), &
2901 : & ALFA(166), ALFA(167), ALFA(168), ALFA(169), ALFA(170)/ &
2902 : & 1.92821964248775885D-03, 1.35592576302022234D-03, &
2903 : & -7.17858090421302995D-04, -2.58084802575270346D-03, &
2904 : & -3.49271130826168475D-03, -3.46986299340960628D-03, &
2905 : & -2.82285233351310182D-03, -1.88103076404891354D-03, &
2906 : & -8.89531718383947600D-04, 3.87912102631035228D-06, &
2907 : & 7.28688540119691412D-04, 1.26566373053457758D-03, &
2908 : & 1.62518158372674427D-03, 1.83203153216373172D-03, &
2909 : & 1.91588388990527909D-03, 1.90588846755546138D-03, &
2910 : & 1.82798982421825727D-03, 1.70389506421121530D-03, &
2911 : & 1.55097127171097686D-03, 1.38261421852276159D-03/
2912 : DATA ALFA(171), ALFA(172), ALFA(173), ALFA(174), ALFA(175), &
2913 : & ALFA(176), ALFA(177), ALFA(178), ALFA(179), ALFA(180)/ &
2914 : & 1.20881424230064774D-03, 1.03676532638344962D-03, &
2915 : & 8.71437918068619115D-04, 7.16080155297701002D-04, &
2916 : & 5.72637002558129372D-04, 4.42089819465802277D-04, &
2917 : & 3.24724948503090564D-04, 2.20342042730246599D-04, &
2918 : & 1.28412898401353882D-04, 4.82005924552095464D-05/
2919 : DATA BETA(1), BETA(2), BETA(3), BETA(4), BETA(5), BETA(6), &
2920 : & BETA(7), BETA(8), BETA(9), BETA(10), BETA(11), BETA(12), &
2921 : & BETA(13), BETA(14), BETA(15), BETA(16), BETA(17), BETA(18), &
2922 : & BETA(19), BETA(20), BETA(21), BETA(22)/ &
2923 : & 1.79988721413553309D-02, 5.59964911064388073D-03, &
2924 : & 2.88501402231132779D-03, 1.80096606761053941D-03, &
2925 : & 1.24753110589199202D-03, 9.22878876572938311D-04, &
2926 : & 7.14430421727287357D-04, 5.71787281789704872D-04, &
2927 : & 4.69431007606481533D-04, 3.93232835462916638D-04, &
2928 : & 3.34818889318297664D-04, 2.88952148495751517D-04, &
2929 : & 2.52211615549573284D-04, 2.22280580798883327D-04, &
2930 : & 1.97541838033062524D-04, 1.76836855019718004D-04, &
2931 : & 1.59316899661821081D-04, 1.44347930197333986D-04, &
2932 : & 1.31448068119965379D-04, 1.20245444949302884D-04, &
2933 : & 1.10449144504599392D-04, 1.01828770740567258D-04/
2934 : DATA BETA(23), BETA(24), BETA(25), BETA(26), BETA(27), BETA(28), &
2935 : & BETA(29), BETA(30), BETA(31), BETA(32), BETA(33), BETA(34), &
2936 : & BETA(35), BETA(36), BETA(37), BETA(38), BETA(39), BETA(40), &
2937 : & BETA(41), BETA(42), BETA(43), BETA(44)/ &
2938 : & 9.41998224204237509D-05, 8.74130545753834437D-05, &
2939 : & 8.13466262162801467D-05, 7.59002269646219339D-05, &
2940 : & 7.09906300634153481D-05, 6.65482874842468183D-05, &
2941 : & 6.25146958969275078D-05, 5.88403394426251749D-05, &
2942 : & -1.49282953213429172D-03, -8.78204709546389328D-04, &
2943 : & -5.02916549572034614D-04, -2.94822138512746025D-04, &
2944 : & -1.75463996970782828D-04, -1.04008550460816434D-04, &
2945 : & -5.96141953046457895D-05, -3.12038929076098340D-05, &
2946 : & -1.26089735980230047D-05, -2.42892608575730389D-07, &
2947 : & 8.05996165414273571D-06, 1.36507009262147391D-05, &
2948 : & 1.73964125472926261D-05, 1.98672978842133780D-05/
2949 : DATA BETA(45), BETA(46), BETA(47), BETA(48), BETA(49), BETA(50), &
2950 : & BETA(51), BETA(52), BETA(53), BETA(54), BETA(55), BETA(56), &
2951 : & BETA(57), BETA(58), BETA(59), BETA(60), BETA(61), BETA(62), &
2952 : & BETA(63), BETA(64), BETA(65), BETA(66)/ &
2953 : & 2.14463263790822639D-05, 2.23954659232456514D-05, &
2954 : & 2.28967783814712629D-05, 2.30785389811177817D-05, &
2955 : & 2.30321976080909144D-05, 2.28236073720348722D-05, &
2956 : & 2.25005881105292418D-05, 2.20981015361991429D-05, &
2957 : & 2.16418427448103905D-05, 2.11507649256220843D-05, &
2958 : & 2.06388749782170737D-05, 2.01165241997081666D-05, &
2959 : & 1.95913450141179244D-05, 1.90689367910436740D-05, &
2960 : & 1.85533719641636667D-05, 1.80475722259674218D-05, &
2961 : & 5.52213076721292790D-04, 4.47932581552384646D-04, &
2962 : & 2.79520653992020589D-04, 1.52468156198446602D-04, &
2963 : & 6.93271105657043598D-05, 1.76258683069991397D-05/
2964 : DATA BETA(67), BETA(68), BETA(69), BETA(70), BETA(71), BETA(72), &
2965 : & BETA(73), BETA(74), BETA(75), BETA(76), BETA(77), BETA(78), &
2966 : & BETA(79), BETA(80), BETA(81), BETA(82), BETA(83), BETA(84), &
2967 : & BETA(85), BETA(86), BETA(87), BETA(88)/ &
2968 : & -1.35744996343269136D-05, -3.17972413350427135D-05, &
2969 : & -4.18861861696693365D-05, -4.69004889379141029D-05, &
2970 : & -4.87665447413787352D-05, -4.87010031186735069D-05, &
2971 : & -4.74755620890086638D-05, -4.55813058138628452D-05, &
2972 : & -4.33309644511266036D-05, -4.09230193157750364D-05, &
2973 : & -3.84822638603221274D-05, -3.60857167535410501D-05, &
2974 : & -3.37793306123367417D-05, -3.15888560772109621D-05, &
2975 : & -2.95269561750807315D-05, -2.75978914828335759D-05, &
2976 : & -2.58006174666883713D-05, -2.41308356761280200D-05, &
2977 : & -2.25823509518346033D-05, -2.11479656768912971D-05, &
2978 : & -1.98200638885294927D-05, -1.85909870801065077D-05/
2979 : DATA BETA(89), BETA(90), BETA(91), BETA(92), BETA(93), BETA(94), &
2980 : & BETA(95), BETA(96), BETA(97), BETA(98), BETA(99), BETA(100), &
2981 : & BETA(101), BETA(102), BETA(103), BETA(104), BETA(105), &
2982 : & BETA(106), BETA(107), BETA(108), BETA(109), BETA(110)/&
2983 : & -1.74532699844210224D-05, -1.63997823854497997D-05, &
2984 : & -4.74617796559959808D-04, -4.77864567147321487D-04, &
2985 : & -3.20390228067037603D-04, -1.61105016119962282D-04, &
2986 : & -4.25778101285435204D-05, 3.44571294294967503D-05, &
2987 : & 7.97092684075674924D-05, 1.03138236708272200D-04, &
2988 : & 1.12466775262204158D-04, 1.13103642108481389D-04, &
2989 : & 1.08651634848774268D-04, 1.01437951597661973D-04, &
2990 : & 9.29298396593363896D-05, 8.40293133016089978D-05, &
2991 : & 7.52727991349134062D-05, 6.69632521975730872D-05, &
2992 : & 5.92564547323194704D-05, 5.22169308826975567D-05, &
2993 : & 4.58539485165360646D-05, 4.01445513891486808D-05/
2994 : DATA BETA(111), BETA(112), BETA(113), BETA(114), BETA(115), &
2995 : & BETA(116), BETA(117), BETA(118), BETA(119), BETA(120), &
2996 : & BETA(121), BETA(122), BETA(123), BETA(124), BETA(125), &
2997 : & BETA(126), BETA(127), BETA(128), BETA(129), BETA(130)/ &
2998 : & 3.50481730031328081D-05, 3.05157995034346659D-05, &
2999 : & 2.64956119950516039D-05, 2.29363633690998152D-05, &
3000 : & 1.97893056664021636D-05, 1.70091984636412623D-05, &
3001 : & 1.45547428261524004D-05, 1.23886640995878413D-05, &
3002 : & 1.04775876076583236D-05, 8.79179954978479373D-06, &
3003 : & 7.36465810572578444D-04, 8.72790805146193976D-04, &
3004 : & 6.22614862573135066D-04, 2.85998154194304147D-04, &
3005 : & 3.84737672879366102D-06, -1.87906003636971558D-04, &
3006 : & -2.97603646594554535D-04, -3.45998126832656348D-04, &
3007 : & -3.53382470916037712D-04, -3.35715635775048757D-04/
3008 : DATA BETA(131), BETA(132), BETA(133), BETA(134), BETA(135), &
3009 : & BETA(136), BETA(137), BETA(138), BETA(139), BETA(140), &
3010 : & BETA(141), BETA(142), BETA(143), BETA(144), BETA(145), &
3011 : & BETA(146), BETA(147), BETA(148), BETA(149), BETA(150)/ &
3012 : & -3.04321124789039809D-04, -2.66722723047612821D-04, &
3013 : & -2.27654214122819527D-04, -1.89922611854562356D-04, &
3014 : & -1.55058918599093870D-04, -1.23778240761873630D-04, &
3015 : & -9.62926147717644187D-05, -7.25178327714425337D-05, &
3016 : & -5.22070028895633801D-05, -3.50347750511900522D-05, &
3017 : & -2.06489761035551757D-05, -8.70106096849767054D-06, &
3018 : & 1.13698686675100290D-06, 9.16426474122778849D-06, &
3019 : & 1.56477785428872620D-05, 2.08223629482466847D-05, &
3020 : & 2.48923381004595156D-05, 2.80340509574146325D-05, &
3021 : & 3.03987774629861915D-05, 3.21156731406700616D-05/
3022 : DATA BETA(151), BETA(152), BETA(153), BETA(154), BETA(155), &
3023 : & BETA(156), BETA(157), BETA(158), BETA(159), BETA(160), &
3024 : & BETA(161), BETA(162), BETA(163), BETA(164), BETA(165), &
3025 : & BETA(166), BETA(167), BETA(168), BETA(169), BETA(170)/ &
3026 : & -1.80182191963885708D-03, -2.43402962938042533D-03, &
3027 : & -1.83422663549856802D-03, -7.62204596354009765D-04, &
3028 : & 2.39079475256927218D-04, 9.49266117176881141D-04, &
3029 : & 1.34467449701540359D-03, 1.48457495259449178D-03, &
3030 : & 1.44732339830617591D-03, 1.30268261285657186D-03, &
3031 : & 1.10351597375642682D-03, 8.86047440419791759D-04, &
3032 : & 6.73073208165665473D-04, 4.77603872856582378D-04, &
3033 : & 3.05991926358789362D-04, 1.60315694594721630D-04, &
3034 : & 4.00749555270613286D-05, -5.66607461635251611D-05, &
3035 : & -1.32506186772982638D-04, -1.90296187989614057D-04/
3036 : DATA BETA(171), BETA(172), BETA(173), BETA(174), BETA(175), &
3037 : & BETA(176), BETA(177), BETA(178), BETA(179), BETA(180), &
3038 : & BETA(181), BETA(182), BETA(183), BETA(184), BETA(185), &
3039 : & BETA(186), BETA(187), BETA(188), BETA(189), BETA(190)/ &
3040 : & -2.32811450376937408D-04, -2.62628811464668841D-04, &
3041 : & -2.82050469867598672D-04, -2.93081563192861167D-04, &
3042 : & -2.97435962176316616D-04, -2.96557334239348078D-04, &
3043 : & -2.91647363312090861D-04, -2.83696203837734166D-04, &
3044 : & -2.73512317095673346D-04, -2.61750155806768580D-04, &
3045 : & 6.38585891212050914D-03, 9.62374215806377941D-03, &
3046 : & 7.61878061207001043D-03, 2.83219055545628054D-03, &
3047 : & -2.09841352012720090D-03, -5.73826764216626498D-03, &
3048 : & -7.70804244495414620D-03, -8.21011692264844401D-03, &
3049 : & -7.65824520346905413D-03, -6.47209729391045177D-03/
3050 : DATA BETA(191), BETA(192), BETA(193), BETA(194), BETA(195), &
3051 : & BETA(196), BETA(197), BETA(198), BETA(199), BETA(200), &
3052 : & BETA(201), BETA(202), BETA(203), BETA(204), BETA(205), &
3053 : & BETA(206), BETA(207), BETA(208), BETA(209), BETA(210)/ &
3054 : & -4.99132412004966473D-03, -3.45612289713133280D-03, &
3055 : & -2.01785580014170775D-03, -7.59430686781961401D-04, &
3056 : & 2.84173631523859138D-04, 1.10891667586337403D-03, &
3057 : & 1.72901493872728771D-03, 2.16812590802684701D-03, &
3058 : & 2.45357710494539735D-03, 2.61281821058334862D-03, &
3059 : & 2.67141039656276912D-03, 2.65203073395980430D-03, &
3060 : & 2.57411652877287315D-03, 2.45389126236094427D-03, &
3061 : & 2.30460058071795494D-03, 2.13684837686712662D-03, &
3062 : & 1.95896528478870911D-03, 1.77737008679454412D-03, &
3063 : & 1.59690280765839059D-03, 1.42111975664438546D-03/
3064 : DATA GAMA(1), GAMA(2), GAMA(3), GAMA(4), GAMA(5), GAMA(6), &
3065 : & GAMA(7), GAMA(8), GAMA(9), GAMA(10), GAMA(11), GAMA(12), &
3066 : & GAMA(13), GAMA(14), GAMA(15), GAMA(16), GAMA(17), GAMA(18), &
3067 : & GAMA(19), GAMA(20), GAMA(21), GAMA(22)/ &
3068 : & 6.29960524947436582D-01, 2.51984209978974633D-01, &
3069 : & 1.54790300415655846D-01, 1.10713062416159013D-01, &
3070 : & 8.57309395527394825D-02, 6.97161316958684292D-02, &
3071 : & 5.86085671893713576D-02, 5.04698873536310685D-02, &
3072 : & 4.42600580689154809D-02, 3.93720661543509966D-02, &
3073 : & 3.54283195924455368D-02, 3.21818857502098231D-02, &
3074 : & 2.94646240791157679D-02, 2.71581677112934479D-02, &
3075 : & 2.51768272973861779D-02, 2.34570755306078891D-02, &
3076 : & 2.19508390134907203D-02, 2.06210828235646240D-02, &
3077 : & 1.94388240897880846D-02, 1.83810633800683158D-02, &
3078 : & 1.74293213231963172D-02, 1.65685837786612353D-02/
3079 : DATA GAMA(23), GAMA(24), GAMA(25), GAMA(26), GAMA(27), GAMA(28), &
3080 : & GAMA(29), GAMA(30)/ &
3081 : & 1.57865285987918445D-02, 1.50729501494095594D-02, &
3082 : & 1.44193250839954639D-02, 1.38184805735341786D-02, &
3083 : & 1.32643378994276568D-02, 1.27517121970498651D-02, &
3084 : & 1.22761545318762767D-02, 1.18338262398482403D-02/
3085 : DATA EX1, EX2, HPI, GPI, THPI / &
3086 : & 3.33333333333333333D-01, 6.66666666666666667D-01, &
3087 : & 1.57079632679489662D+00, 3.14159265358979324D+00, &
3088 : & 4.71238898038468986D+00/
3089 : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
3090 : !C
3091 0 : RFNU = 1.0D0/FNU
3092 : !C-----------------------------------------------------------------------
3093 : !C OVERFLOW TEST (Z/FNU TOO SMALL)
3094 : !C-----------------------------------------------------------------------
3095 0 : TEST = D1MACH(1)*1.0D+3
3096 0 : AC = FNU*TEST
3097 0 : IF (DABS(ZR).GT.AC .OR. DABS(ZI).GT.AC) GO TO 15
3098 0 : ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
3099 0 : ZETA1I = 0.0D0
3100 0 : ZETA2R = FNU
3101 0 : ZETA2I = 0.0D0
3102 0 : PHIR = 1.0D0
3103 0 : PHII = 0.0D0
3104 0 : ARGR = 1.0D0
3105 0 : ARGI = 0.0D0
3106 0 : RETURN
3107 : 15 CONTINUE
3108 0 : ZBR = ZR*RFNU
3109 0 : ZBI = ZI*RFNU
3110 0 : RFNU2 = RFNU*RFNU
3111 : !C-----------------------------------------------------------------------
3112 : !C COMPUTE IN THE FOURTH QUADRANT
3113 : !C-----------------------------------------------------------------------
3114 0 : FN13 = FNU**EX1
3115 0 : FN23 = FN13*FN13
3116 0 : RFN13 = 1.0D0/FN13
3117 0 : W2R = CONER - ZBR*ZBR + ZBI*ZBI
3118 0 : W2I = CONEI - ZBR*ZBI - ZBR*ZBI
3119 0 : AW2 = AZABS(W2R,W2I)
3120 0 : IF (AW2.GT.0.25D0) GO TO 130
3121 : !C-----------------------------------------------------------------------
3122 : !C POWER SERIES FOR CABS(W2).LE.0.25D0
3123 : !C-----------------------------------------------------------------------
3124 0 : K = 1
3125 0 : PR(1) = CONER
3126 0 : PI(1) = CONEI
3127 0 : SUMAR = GAMA(1)
3128 0 : SUMAI = ZEROI
3129 0 : AP(1) = 1.0D0
3130 0 : IF (AW2.LT.TOL) GO TO 20
3131 0 : DO 10 K=2,30
3132 0 : PR(K) = PR(K-1)*W2R - PI(K-1)*W2I
3133 0 : PI(K) = PR(K-1)*W2I + PI(K-1)*W2R
3134 0 : SUMAR = SUMAR + PR(K)*GAMA(K)
3135 0 : SUMAI = SUMAI + PI(K)*GAMA(K)
3136 0 : AP(K) = AP(K-1)*AW2
3137 0 : IF (AP(K).LT.TOL) GO TO 20
3138 0 : 10 CONTINUE
3139 0 : K = 30
3140 : 20 CONTINUE
3141 0 : KMAX = K
3142 0 : ZETAR = W2R*SUMAR - W2I*SUMAI
3143 0 : ZETAI = W2R*SUMAI + W2I*SUMAR
3144 0 : ARGR = ZETAR*FN23
3145 0 : ARGI = ZETAI*FN23
3146 0 : CALL AZSQRT(SUMAR, SUMAI, ZAR, ZAI)
3147 0 : CALL AZSQRT(W2R, W2I, STR, STI)
3148 0 : ZETA2R = STR*FNU
3149 0 : ZETA2I = STI*FNU
3150 0 : STR = CONER + EX2*(ZETAR*ZAR-ZETAI*ZAI)
3151 0 : STI = CONEI + EX2*(ZETAR*ZAI+ZETAI*ZAR)
3152 0 : ZETA1R = STR*ZETA2R - STI*ZETA2I
3153 0 : ZETA1I = STR*ZETA2I + STI*ZETA2R
3154 0 : ZAR = ZAR + ZAR
3155 0 : ZAI = ZAI + ZAI
3156 0 : CALL AZSQRT(ZAR, ZAI, STR, STI)
3157 0 : PHIR = STR*RFN13
3158 0 : PHII = STI*RFN13
3159 0 : IF (IPMTR.EQ.1) GO TO 120
3160 : !C-----------------------------------------------------------------------
3161 : !C SUM SERIES FOR ASUM AND BSUM
3162 : !C-----------------------------------------------------------------------
3163 0 : SUMBR = ZEROR
3164 0 : SUMBI = ZEROI
3165 0 : DO 30 K=1,KMAX
3166 0 : SUMBR = SUMBR + PR(K)*BETA(K)
3167 0 : SUMBI = SUMBI + PI(K)*BETA(K)
3168 0 : 30 CONTINUE
3169 0 : ASUMR = ZEROR
3170 0 : ASUMI = ZEROI
3171 0 : BSUMR = SUMBR
3172 0 : BSUMI = SUMBI
3173 0 : L1 = 0
3174 0 : L2 = 30
3175 0 : BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
3176 0 : ATOL = TOL
3177 0 : PP = 1.0D0
3178 0 : IAS = 0
3179 0 : IBS = 0
3180 0 : IF (RFNU2.LT.TOL) GO TO 110
3181 0 : DO 100 IS=2,7
3182 0 : ATOL = ATOL/RFNU2
3183 0 : PP = PP*RFNU2
3184 0 : IF (IAS.EQ.1) GO TO 60
3185 0 : SUMAR = ZEROR
3186 0 : SUMAI = ZEROI
3187 0 : DO 40 K=1,KMAX
3188 0 : M = L1 + K
3189 0 : SUMAR = SUMAR + PR(K)*ALFA(M)
3190 0 : SUMAI = SUMAI + PI(K)*ALFA(M)
3191 0 : IF (AP(K).LT.ATOL) GO TO 50
3192 0 : 40 CONTINUE
3193 : 50 CONTINUE
3194 0 : ASUMR = ASUMR + SUMAR*PP
3195 0 : ASUMI = ASUMI + SUMAI*PP
3196 0 : IF (PP.LT.TOL) IAS = 1
3197 : 60 CONTINUE
3198 0 : IF (IBS.EQ.1) GO TO 90
3199 : SUMBR = ZEROR
3200 : SUMBI = ZEROI
3201 0 : DO 70 K=1,KMAX
3202 0 : M = L2 + K
3203 0 : SUMBR = SUMBR + PR(K)*BETA(M)
3204 0 : SUMBI = SUMBI + PI(K)*BETA(M)
3205 0 : IF (AP(K).LT.ATOL) GO TO 80
3206 0 : 70 CONTINUE
3207 : 80 CONTINUE
3208 0 : BSUMR = BSUMR + SUMBR*PP
3209 0 : BSUMI = BSUMI + SUMBI*PP
3210 0 : IF (PP.LT.BTOL) IBS = 1
3211 : 90 CONTINUE
3212 0 : IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 110
3213 0 : L1 = L1 + 30
3214 0 : L2 = L2 + 30
3215 0 : 100 CONTINUE
3216 : 110 CONTINUE
3217 0 : ASUMR = ASUMR + CONER
3218 0 : PP = RFNU*RFN13
3219 0 : BSUMR = BSUMR*PP
3220 0 : BSUMI = BSUMI*PP
3221 : 120 CONTINUE
3222 0 : RETURN
3223 : !C-----------------------------------------------------------------------
3224 : !C CABS(W2).GT.0.25D0
3225 : !C-----------------------------------------------------------------------
3226 : 130 CONTINUE
3227 0 : CALL AZSQRT(W2R, W2I, WR, WI)
3228 0 : IF (WR.LT.0.0D0) WR = 0.0D0
3229 0 : IF (WI.LT.0.0D0) WI = 0.0D0
3230 0 : STR = CONER + WR
3231 0 : STI = WI
3232 0 : CALL ZDIV(STR, STI, ZBR, ZBI, ZAR, ZAI)
3233 0 : CALL AZLOG(ZAR, ZAI, ZCR, ZCI, IDUM)
3234 0 : IF (ZCI.LT.0.0D0) ZCI = 0.0D0
3235 0 : IF (ZCI.GT.HPI) ZCI = HPI
3236 0 : IF (ZCR.LT.0.0D0) ZCR = 0.0D0
3237 0 : ZTHR = (ZCR-WR)*1.5D0
3238 0 : ZTHI = (ZCI-WI)*1.5D0
3239 0 : ZETA1R = ZCR*FNU
3240 0 : ZETA1I = ZCI*FNU
3241 0 : ZETA2R = WR*FNU
3242 0 : ZETA2I = WI*FNU
3243 0 : AZTH = AZABS(ZTHR,ZTHI)
3244 0 : ANG = THPI
3245 0 : IF (ZTHR.GE.0.0D0 .AND. ZTHI.LT.0.0D0) GO TO 140
3246 0 : ANG = HPI
3247 0 : IF (ZTHR.EQ.0.0D0) GO TO 140
3248 0 : ANG = DATAN(ZTHI/ZTHR)
3249 0 : IF (ZTHR.LT.0.0D0) ANG = ANG + GPI
3250 : 140 CONTINUE
3251 0 : PP = AZTH**EX2
3252 0 : ANG = ANG*EX2
3253 0 : ZETAR = PP*DCOS(ANG)
3254 0 : ZETAI = PP*DSIN(ANG)
3255 0 : IF (ZETAI.LT.0.0D0) ZETAI = 0.0D0
3256 0 : ARGR = ZETAR*FN23
3257 0 : ARGI = ZETAI*FN23
3258 0 : CALL ZDIV(ZTHR, ZTHI, ZETAR, ZETAI, RTZTR, RTZTI)
3259 0 : CALL ZDIV(RTZTR, RTZTI, WR, WI, ZAR, ZAI)
3260 0 : TZAR = ZAR + ZAR
3261 0 : TZAI = ZAI + ZAI
3262 0 : CALL AZSQRT(TZAR, TZAI, STR, STI)
3263 0 : PHIR = STR*RFN13
3264 0 : PHII = STI*RFN13
3265 0 : IF (IPMTR.EQ.1) GO TO 120
3266 0 : RAW = 1.0D0/DSQRT(AW2)
3267 0 : STR = WR*RAW
3268 0 : STI = -WI*RAW
3269 0 : TFNR = STR*RFNU*RAW
3270 0 : TFNI = STI*RFNU*RAW
3271 0 : RAZTH = 1.0D0/AZTH
3272 0 : STR = ZTHR*RAZTH
3273 0 : STI = -ZTHI*RAZTH
3274 0 : RZTHR = STR*RAZTH*RFNU
3275 0 : RZTHI = STI*RAZTH*RFNU
3276 0 : ZCR = RZTHR*AR(2)
3277 0 : ZCI = RZTHI*AR(2)
3278 0 : RAW2 = 1.0D0/AW2
3279 0 : STR = W2R*RAW2
3280 0 : STI = -W2I*RAW2
3281 0 : T2R = STR*RAW2
3282 0 : T2I = STI*RAW2
3283 0 : STR = T2R*C(2) + C(3)
3284 0 : STI = T2I*C(2)
3285 0 : UPR(2) = STR*TFNR - STI*TFNI
3286 0 : UPI(2) = STR*TFNI + STI*TFNR
3287 0 : BSUMR = UPR(2) + ZCR
3288 0 : BSUMI = UPI(2) + ZCI
3289 0 : ASUMR = ZEROR
3290 0 : ASUMI = ZEROI
3291 0 : IF (RFNU.LT.TOL) GO TO 220
3292 0 : PRZTHR = RZTHR
3293 0 : PRZTHI = RZTHI
3294 0 : PTFNR = TFNR
3295 0 : PTFNI = TFNI
3296 0 : UPR(1) = CONER
3297 0 : UPI(1) = CONEI
3298 0 : PP = 1.0D0
3299 0 : BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
3300 0 : KS = 0
3301 0 : KP1 = 2
3302 0 : L = 3
3303 0 : IAS = 0
3304 0 : IBS = 0
3305 0 : DO 210 LR=2,12,2
3306 0 : LRP1 = LR + 1
3307 : !C-----------------------------------------------------------------------
3308 : !C COMPUTE TWO ADDITIONAL CR, DR, AND UP FOR TWO MORE TERMS IN
3309 : !C NEXT SUMA AND SUMB
3310 : !C-----------------------------------------------------------------------
3311 0 : DO 160 K=LR,LRP1
3312 0 : KS = KS + 1
3313 0 : KP1 = KP1 + 1
3314 0 : L = L + 1
3315 0 : ZAR = C(L)
3316 0 : ZAI = ZEROI
3317 0 : DO 150 J=2,KP1
3318 0 : L = L + 1
3319 0 : STR = ZAR*T2R - T2I*ZAI + C(L)
3320 0 : ZAI = ZAR*T2I + ZAI*T2R
3321 0 : ZAR = STR
3322 0 : 150 CONTINUE
3323 0 : STR = PTFNR*TFNR - PTFNI*TFNI
3324 0 : PTFNI = PTFNR*TFNI + PTFNI*TFNR
3325 0 : PTFNR = STR
3326 0 : UPR(KP1) = PTFNR*ZAR - PTFNI*ZAI
3327 0 : UPI(KP1) = PTFNI*ZAR + PTFNR*ZAI
3328 0 : CRR(KS) = PRZTHR*BR(KS+1)
3329 0 : CRI(KS) = PRZTHI*BR(KS+1)
3330 0 : STR = PRZTHR*RZTHR - PRZTHI*RZTHI
3331 0 : PRZTHI = PRZTHR*RZTHI + PRZTHI*RZTHR
3332 0 : PRZTHR = STR
3333 0 : DRR(KS) = PRZTHR*AR(KS+2)
3334 0 : DRI(KS) = PRZTHI*AR(KS+2)
3335 0 : 160 CONTINUE
3336 0 : PP = PP*RFNU2
3337 0 : IF (IAS.EQ.1) GO TO 180
3338 0 : SUMAR = UPR(LRP1)
3339 0 : SUMAI = UPI(LRP1)
3340 0 : JU = LRP1
3341 0 : DO 170 JR=1,LR
3342 0 : JU = JU - 1
3343 0 : SUMAR = SUMAR + CRR(JR)*UPR(JU) - CRI(JR)*UPI(JU)
3344 0 : SUMAI = SUMAI + CRR(JR)*UPI(JU) + CRI(JR)*UPR(JU)
3345 0 : 170 CONTINUE
3346 0 : ASUMR = ASUMR + SUMAR
3347 0 : ASUMI = ASUMI + SUMAI
3348 0 : TEST = DABS(SUMAR) + DABS(SUMAI)
3349 0 : IF (PP.LT.TOL .AND. TEST.LT.TOL) IAS = 1
3350 : 180 CONTINUE
3351 0 : IF (IBS.EQ.1) GO TO 200
3352 0 : SUMBR = UPR(LR+2) + UPR(LRP1)*ZCR - UPI(LRP1)*ZCI
3353 0 : SUMBI = UPI(LR+2) + UPR(LRP1)*ZCI + UPI(LRP1)*ZCR
3354 0 : JU = LRP1
3355 0 : DO 190 JR=1,LR
3356 0 : JU = JU - 1
3357 0 : SUMBR = SUMBR + DRR(JR)*UPR(JU) - DRI(JR)*UPI(JU)
3358 0 : SUMBI = SUMBI + DRR(JR)*UPI(JU) + DRI(JR)*UPR(JU)
3359 0 : 190 CONTINUE
3360 0 : BSUMR = BSUMR + SUMBR
3361 0 : BSUMI = BSUMI + SUMBI
3362 0 : TEST = DABS(SUMBR) + DABS(SUMBI)
3363 0 : IF (PP.LT.BTOL .AND. TEST.LT.BTOL) IBS = 1
3364 : 200 CONTINUE
3365 0 : IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 220
3366 0 : 210 CONTINUE
3367 : 220 CONTINUE
3368 0 : ASUMR = ASUMR + CONER
3369 0 : STR = -BSUMR*RFN13
3370 0 : STI = -BSUMI*RFN13
3371 0 : CALL ZDIV(STR, STI, RTZTR, RTZTI, BSUMR, BSUMI)
3372 0 : GO TO 120
3373 : END SUBROUTINE ZUNHJ
3374 :
3375 0 : SUBROUTINE ZMLRI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
3376 : !C***BEGIN PROLOGUE ZMLRI
3377 : !C***REFER TO ZBESI,ZBESK
3378 : !C
3379 : !C ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
3380 : !C MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
3381 : !C
3382 : !C***ROUTINES CALLED DGAMLN,D1MACH,AZABS,AZEXP,AZLOG,ZMLT
3383 : !C***END PROLOGUE ZMLRI
3384 : !C COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
3385 : DOUBLE PRECISION ACK, AK, AP, AT, AZ, BK, CKI, CKR, CNORMI, &
3386 : & CNORMR, CONEI, CONER, FKAP, FKK, FLAM, FNF, FNU, PTI, PTR, P1I, &
3387 : & P1R, P2I, P2R, RAZ, RHO, RHO2, RZI, RZR, SCLE, STI, STR, SUMI, &
3388 : & SUMR, TFNF, TOL, TST, YI, YR, ZEROI, ZEROR, ZI, ZR!, DGAMLN, &
3389 : ! & D1MACH, AZABS
3390 : INTEGER I, IAZ, IDUM, IFNU, INU, ITIME, K, KK, KM, KODE, M, N, NZ
3391 : DIMENSION YR(N), YI(N)
3392 : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
3393 0 : SCLE = D1MACH(1)/TOL
3394 0 : NZ=0
3395 0 : AZ = AZABS(ZR,ZI)
3396 0 : IAZ = INT(SNGL(AZ))
3397 0 : IFNU = INT(SNGL(FNU))
3398 0 : INU = IFNU + N - 1
3399 0 : AT = DBLE(FLOAT(IAZ)) + 1.0D0
3400 0 : RAZ = 1.0D0/AZ
3401 0 : STR = ZR*RAZ
3402 0 : STI = -ZI*RAZ
3403 0 : CKR = STR*AT*RAZ
3404 0 : CKI = STI*AT*RAZ
3405 0 : RZR = (STR+STR)*RAZ
3406 0 : RZI = (STI+STI)*RAZ
3407 0 : P1R = ZEROR
3408 0 : P1I = ZEROI
3409 0 : P2R = CONER
3410 0 : P2I = CONEI
3411 0 : ACK = (AT+1.0D0)*RAZ
3412 0 : RHO = ACK + DSQRT(ACK*ACK-1.0D0)
3413 0 : RHO2 = RHO*RHO
3414 0 : TST = (RHO2+RHO2)/((RHO2-1.0D0)*(RHO-1.0D0))
3415 0 : TST = TST/TOL
3416 : !C-----------------------------------------------------------------------
3417 : !C COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
3418 : !C-----------------------------------------------------------------------
3419 0 : AK = AT
3420 0 : DO 10 I=1,80
3421 0 : PTR = P2R
3422 0 : PTI = P2I
3423 0 : P2R = P1R - (CKR*PTR-CKI*PTI)
3424 0 : P2I = P1I - (CKI*PTR+CKR*PTI)
3425 0 : P1R = PTR
3426 0 : P1I = PTI
3427 0 : CKR = CKR + RZR
3428 0 : CKI = CKI + RZI
3429 0 : AP = AZABS(P2R,P2I)
3430 0 : IF (AP.GT.TST*AK*AK) GO TO 20
3431 0 : AK = AK + 1.0D0
3432 0 : 10 CONTINUE
3433 0 : GO TO 110
3434 : 20 CONTINUE
3435 0 : I = I + 1
3436 0 : K = 0
3437 0 : IF (INU.LT.IAZ) GO TO 40
3438 : !C-----------------------------------------------------------------------
3439 : !C COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
3440 : !C-----------------------------------------------------------------------
3441 0 : P1R = ZEROR
3442 0 : P1I = ZEROI
3443 0 : P2R = CONER
3444 0 : P2I = CONEI
3445 0 : AT = DBLE(FLOAT(INU)) + 1.0D0
3446 : STR = ZR*RAZ
3447 : STI = -ZI*RAZ
3448 0 : CKR = STR*AT*RAZ
3449 0 : CKI = STI*AT*RAZ
3450 0 : ACK = AT*RAZ
3451 0 : TST = DSQRT(ACK/TOL)
3452 0 : ITIME = 1
3453 0 : DO 30 K=1,80
3454 0 : PTR = P2R
3455 0 : PTI = P2I
3456 0 : P2R = P1R - (CKR*PTR-CKI*PTI)
3457 0 : P2I = P1I - (CKR*PTI+CKI*PTR)
3458 0 : P1R = PTR
3459 0 : P1I = PTI
3460 0 : CKR = CKR + RZR
3461 0 : CKI = CKI + RZI
3462 0 : AP = AZABS(P2R,P2I)
3463 0 : IF (AP.LT.TST) GO TO 30
3464 0 : IF (ITIME.EQ.2) GO TO 40
3465 0 : ACK = AZABS(CKR,CKI)
3466 0 : FLAM = ACK + DSQRT(ACK*ACK-1.0D0)
3467 0 : FKAP = AP/AZABS(P1R,P1I)
3468 0 : RHO = DMIN1(FLAM,FKAP)
3469 0 : TST = TST*DSQRT(RHO/(RHO*RHO-1.0D0))
3470 0 : ITIME = 2
3471 0 : 30 CONTINUE
3472 0 : GO TO 110
3473 : 40 CONTINUE
3474 : !C-----------------------------------------------------------------------
3475 : !C BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
3476 : !C-----------------------------------------------------------------------
3477 0 : K = K + 1
3478 0 : KK = MAX0(I+IAZ,K+INU)
3479 0 : FKK = DBLE(FLOAT(KK))
3480 0 : P1R = ZEROR
3481 0 : P1I = ZEROI
3482 : !C-----------------------------------------------------------------------
3483 : !C SCALE P2 AND SUM BY SCLE
3484 : !C-----------------------------------------------------------------------
3485 0 : P2R = SCLE
3486 0 : P2I = ZEROI
3487 0 : FNF = FNU - DBLE(FLOAT(IFNU))
3488 0 : TFNF = FNF + FNF
3489 : BK = DGAMLN(FKK+TFNF+1.0D0,IDUM) - DGAMLN(FKK+1.0D0,IDUM) - &
3490 0 : & DGAMLN(TFNF+1.0D0,IDUM)
3491 0 : BK = DEXP(BK)
3492 0 : SUMR = ZEROR
3493 0 : SUMI = ZEROI
3494 0 : KM = KK - INU
3495 0 : DO 50 I=1,KM
3496 0 : PTR = P2R
3497 0 : PTI = P2I
3498 0 : P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
3499 0 : P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
3500 0 : P1R = PTR
3501 0 : P1I = PTI
3502 0 : AK = 1.0D0 - TFNF/(FKK+TFNF)
3503 0 : ACK = BK*AK
3504 0 : SUMR = SUMR + (ACK+BK)*P1R
3505 0 : SUMI = SUMI + (ACK+BK)*P1I
3506 0 : BK = ACK
3507 0 : FKK = FKK - 1.0D0
3508 0 : 50 CONTINUE
3509 0 : YR(N) = P2R
3510 0 : YI(N) = P2I
3511 0 : IF (N.EQ.1) GO TO 70
3512 0 : DO 60 I=2,N
3513 0 : PTR = P2R
3514 0 : PTI = P2I
3515 0 : P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
3516 0 : P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
3517 0 : P1R = PTR
3518 0 : P1I = PTI
3519 0 : AK = 1.0D0 - TFNF/(FKK+TFNF)
3520 0 : ACK = BK*AK
3521 0 : SUMR = SUMR + (ACK+BK)*P1R
3522 0 : SUMI = SUMI + (ACK+BK)*P1I
3523 0 : BK = ACK
3524 0 : FKK = FKK - 1.0D0
3525 0 : M = N - I + 1
3526 0 : YR(M) = P2R
3527 0 : YI(M) = P2I
3528 0 : 60 CONTINUE
3529 : 70 CONTINUE
3530 0 : IF (IFNU.LE.0) GO TO 90
3531 0 : DO 80 I=1,IFNU
3532 0 : PTR = P2R
3533 0 : PTI = P2I
3534 0 : P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
3535 0 : P2I = P1I + (FKK+FNF)*(RZR*PTI+RZI*PTR)
3536 0 : P1R = PTR
3537 0 : P1I = PTI
3538 0 : AK = 1.0D0 - TFNF/(FKK+TFNF)
3539 0 : ACK = BK*AK
3540 0 : SUMR = SUMR + (ACK+BK)*P1R
3541 0 : SUMI = SUMI + (ACK+BK)*P1I
3542 0 : BK = ACK
3543 0 : FKK = FKK - 1.0D0
3544 0 : 80 CONTINUE
3545 : 90 CONTINUE
3546 0 : PTR = ZR
3547 0 : PTI = ZI
3548 0 : IF (KODE.EQ.2) PTR = ZEROR
3549 0 : CALL AZLOG(RZR, RZI, STR, STI, IDUM)
3550 0 : P1R = -FNF*STR + PTR
3551 0 : P1I = -FNF*STI + PTI
3552 0 : AP = DGAMLN(1.0D0+FNF,IDUM)
3553 0 : PTR = P1R - AP
3554 0 : PTI = P1I
3555 : !C-----------------------------------------------------------------------
3556 : !C THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
3557 : !C IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
3558 : !C-----------------------------------------------------------------------
3559 0 : P2R = P2R + SUMR
3560 0 : P2I = P2I + SUMI
3561 0 : AP = AZABS(P2R,P2I)
3562 0 : P1R = 1.0D0/AP
3563 0 : CALL AZEXP(PTR, PTI, STR, STI)
3564 0 : CKR = STR*P1R
3565 0 : CKI = STI*P1R
3566 0 : PTR = P2R*P1R
3567 0 : PTI = -P2I*P1R
3568 0 : CALL ZMLT(CKR, CKI, PTR, PTI, CNORMR, CNORMI)
3569 0 : DO 100 I=1,N
3570 0 : STR = YR(I)*CNORMR - YI(I)*CNORMI
3571 0 : YI(I) = YR(I)*CNORMI + YI(I)*CNORMR
3572 0 : YR(I) = STR
3573 0 : 100 CONTINUE
3574 : RETURN
3575 : 110 CONTINUE
3576 0 : NZ=-2
3577 0 : RETURN
3578 : END SUBROUTINE ZMLRI
3579 :
3580 0 : SUBROUTINE ZWRSK(ZRR, ZRI, FNU, KODE, N, YR, YI, NZ, CWR, CWI, &
3581 : & TOL, ELIM, ALIM)
3582 : !C***BEGIN PROLOGUE ZWRSK
3583 : !C***REFER TO ZBESI,ZBESK
3584 : !C
3585 : !C ZWRSK COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY
3586 : !C NORMALIZING THE I FUNCTION RATIOS FROM ZRATI BY THE WRONSKIAN
3587 : !C
3588 : !C***ROUTINES CALLED D1MACH,ZBKNU,ZRATI,AZABS
3589 : !C***END PROLOGUE ZWRSK
3590 : !C COMPLEX CINU,CSCL,CT,CW,C1,C2,RCT,ST,Y,ZR
3591 : DOUBLE PRECISION ACT, ACW, ALIM, ASCLE, CINUI, CINUR, CSCLR, CTI, &
3592 : & CTR, CWI, CWR, C1I, C1R, C2I, C2R, ELIM, FNU, PTI, PTR, RACT, &
3593 : & STI, STR, TOL, YI, YR, ZRI, ZRR!, AZABS, D1MACH
3594 : INTEGER I, KODE, N, NW, NZ
3595 : DIMENSION YR(N), YI(N), CWR(2), CWI(2)
3596 : !C-----------------------------------------------------------------------
3597 : !C I(FNU+I-1,Z) BY BACKWARD RECURRENCE FOR RATIOS
3598 : !C Y(I)=I(FNU+I,Z)/I(FNU+I-1,Z) FROM CRATI NORMALIZED BY THE
3599 : !C WRONSKIAN WITH K(FNU,Z) AND K(FNU+1,Z) FROM CBKNU.
3600 : !C-----------------------------------------------------------------------
3601 0 : NZ = 0
3602 0 : CALL ZBKNU(ZRR, ZRI, FNU, KODE, 2, CWR, CWI, NW, TOL, ELIM, ALIM)
3603 0 : IF (NW.NE.0) GO TO 50
3604 0 : CALL ZRATI(ZRR, ZRI, FNU, N, YR, YI, TOL)
3605 : !C-----------------------------------------------------------------------
3606 : !C RECUR FORWARD ON I(FNU+1,Z) = R(FNU,Z)*I(FNU,Z),
3607 : !C R(FNU+J-1,Z)=Y(J), J=1,...,N
3608 : !C-----------------------------------------------------------------------
3609 0 : CINUR = 1.0D0
3610 0 : CINUI = 0.0D0
3611 0 : IF (KODE.EQ.1) GO TO 10
3612 0 : CINUR = DCOS(ZRI)
3613 0 : CINUI = DSIN(ZRI)
3614 : 10 CONTINUE
3615 : !C-----------------------------------------------------------------------
3616 : !C ON LOW EXPONENT MACHINES THE K FUNCTIONS CAN BE CLOSE TO BOTH
3617 : !C THE UNDER AND OVERFLOW LIMITS AND THE NORMALIZATION MUST BE
3618 : !C SCALED TO PREVENT OVER OR UNDERFLOW. CUOIK HAS DETERMINED THAT
3619 : !C THE RESULT IS ON SCALE.
3620 : !C-----------------------------------------------------------------------
3621 0 : ACW = AZABS(CWR(2),CWI(2))
3622 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
3623 0 : CSCLR = 1.0D0
3624 0 : IF (ACW.GT.ASCLE) GO TO 20
3625 0 : CSCLR = 1.0D0/TOL
3626 0 : GO TO 30
3627 : 20 CONTINUE
3628 0 : ASCLE = 1.0D0/ASCLE
3629 0 : IF (ACW.LT.ASCLE) GO TO 30
3630 0 : CSCLR = TOL
3631 : 30 CONTINUE
3632 0 : C1R = CWR(1)*CSCLR
3633 0 : C1I = CWI(1)*CSCLR
3634 0 : C2R = CWR(2)*CSCLR
3635 0 : C2I = CWI(2)*CSCLR
3636 0 : STR = YR(1)
3637 0 : STI = YI(1)
3638 : !C-----------------------------------------------------------------------
3639 : !C CINU=CINU*(CONJG(CT)/CABS(CT))*(1.0D0/CABS(CT) PREVENTS
3640 : !C UNDER- OR OVERFLOW PREMATURELY BY SQUARING CABS(CT)
3641 : !C-----------------------------------------------------------------------
3642 0 : PTR = STR*C1R - STI*C1I
3643 0 : PTI = STR*C1I + STI*C1R
3644 0 : PTR = PTR + C2R
3645 0 : PTI = PTI + C2I
3646 0 : CTR = ZRR*PTR - ZRI*PTI
3647 0 : CTI = ZRR*PTI + ZRI*PTR
3648 0 : ACT = AZABS(CTR,CTI)
3649 0 : RACT = 1.0D0/ACT
3650 0 : CTR = CTR*RACT
3651 0 : CTI = -CTI*RACT
3652 0 : PTR = CINUR*RACT
3653 0 : PTI = CINUI*RACT
3654 0 : CINUR = PTR*CTR - PTI*CTI
3655 0 : CINUI = PTR*CTI + PTI*CTR
3656 0 : YR(1) = CINUR*CSCLR
3657 0 : YI(1) = CINUI*CSCLR
3658 0 : IF (N.EQ.1) RETURN
3659 0 : DO 40 I=2,N
3660 0 : PTR = STR*CINUR - STI*CINUI
3661 0 : CINUI = STR*CINUI + STI*CINUR
3662 0 : CINUR = PTR
3663 0 : STR = YR(I)
3664 0 : STI = YI(I)
3665 0 : YR(I) = CINUR*CSCLR
3666 0 : YI(I) = CINUI*CSCLR
3667 0 : 40 CONTINUE
3668 0 : RETURN
3669 : 50 CONTINUE
3670 0 : NZ = -1
3671 0 : IF(NW.EQ.(-2)) NZ=-2
3672 : RETURN
3673 : END SUBROUTINE ZWRSK
3674 :
3675 0 : SUBROUTINE ZBKNU(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, &
3676 : & ALIM)
3677 : !C***BEGIN PROLOGUE ZBKNU
3678 : !C***REFER TO ZBESI,ZBESK,ZAIRY,ZBESH
3679 : !C
3680 : !C ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
3681 : !C
3682 : !C***ROUTINES CALLED DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,AZABS,ZDIV,
3683 : !C AZEXP,AZLOG,ZMLT,AZSQRT
3684 : !C***END PROLOGUE ZBKNU
3685 : !C
3686 : DOUBLE PRECISION AA, AK, ALIM, ASCLE, A1, A2, BB, BK, BRY, CAZ, &
3687 : & CBI, CBR, CC, CCHI, CCHR, CKI, CKR, COEFI, COEFR, CONEI, CONER, &
3688 : & CRSCR, CSCLR, CSHI, CSHR, CSI, CSR, CSRR, CSSR, CTWOR, &
3689 : & CZEROI, CZEROR, CZI, CZR, DNU, DNU2, DPI, ELIM, ETEST, FC, FHS, &
3690 : & FI, FK, FKS, FMUI, FMUR, FNU, FPI, FR, G1, G2, HPI, PI, PR, PTI, &
3691 : & PTR, P1I, P1R, P2I, P2M, P2R, QI, QR, RAK, RCAZ, RTHPI, RZI, &
3692 : & RZR, R1, S, SMUI, SMUR, SPI, STI, STR, S1I, S1R, S2I, S2R, TM, &
3693 : & TOL, TTH, T1, T2, YI, YR, ZI, ZR, ELM, & ! , DGAMLN, D1MACH, AZABS,
3694 : & CELMR, ZDR, ZDI, AS, ALAS, HELIM, CYR, CYI
3695 : INTEGER I, IFLAG, INU, K, KFLAG, KK, KMAX, KODE, KODED, N, NZ, &
3696 : & IDUM, J, IC, INUB, NW !I1MACH
3697 : DIMENSION YR(N), YI(N), CC(8), CSSR(3), CSRR(3), BRY(3), CYR(2), &
3698 : & CYI(2)
3699 : !C COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
3700 : !C COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
3701 : !C
3702 : DATA KMAX / 30 /
3703 : DATA CZEROR,CZEROI,CONER,CONEI,CTWOR,R1/ &
3704 : & 0.0D0 , 0.0D0 , 1.0D0 , 0.0D0 , 2.0D0 , 2.0D0 /
3705 : DATA DPI, RTHPI, SPI ,HPI, FPI, TTH / &
3706 : & 3.14159265358979324D0, 1.25331413731550025D0, &
3707 : & 1.90985931710274403D0, 1.57079632679489662D0, &
3708 : & 1.89769999331517738D0, 6.66666666666666666D-01/
3709 : DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)/ &
3710 : & 5.77215664901532861D-01, -4.20026350340952355D-02, &
3711 : & -4.21977345555443367D-02, 7.21894324666309954D-03, &
3712 : & -2.15241674114950973D-04, -2.01348547807882387D-05, &
3713 : & 1.13302723198169588D-06, 6.11609510448141582D-09/
3714 : !C
3715 0 : CAZ = AZABS(ZR,ZI)
3716 0 : CSCLR = 1.0D0/TOL
3717 0 : CRSCR = TOL
3718 0 : CSSR(1) = CSCLR
3719 0 : CSSR(2) = 1.0D0
3720 0 : CSSR(3) = CRSCR
3721 0 : CSRR(1) = CRSCR
3722 0 : CSRR(2) = 1.0D0
3723 0 : CSRR(3) = CSCLR
3724 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
3725 0 : BRY(2) = 1.0D0/BRY(1)
3726 0 : BRY(3) = D1MACH(2)
3727 0 : NZ = 0
3728 0 : IFLAG = 0
3729 0 : KODED = KODE
3730 0 : RCAZ = 1.0D0/CAZ
3731 0 : STR = ZR*RCAZ
3732 0 : STI = -ZI*RCAZ
3733 0 : RZR = (STR+STR)*RCAZ
3734 0 : RZI = (STI+STI)*RCAZ
3735 0 : INU = INT(SNGL(FNU+0.5D0))
3736 0 : DNU = FNU - DBLE(FLOAT(INU))
3737 0 : IF (DABS(DNU).EQ.0.5D0) GO TO 110
3738 0 : DNU2 = 0.0D0
3739 0 : IF (DABS(DNU).GT.TOL) DNU2 = DNU*DNU
3740 0 : IF (CAZ.GT.R1) GO TO 110
3741 : !C-----------------------------------------------------------------------
3742 : !C SERIES FOR CABS(Z).LE.R1
3743 : !C-----------------------------------------------------------------------
3744 0 : FC = 1.0D0
3745 0 : CALL AZLOG(RZR, RZI, SMUR, SMUI, IDUM)
3746 0 : FMUR = SMUR*DNU
3747 0 : FMUI = SMUI*DNU
3748 0 : CALL ZSHCH(FMUR, FMUI, CSHR, CSHI, CCHR, CCHI)
3749 0 : IF (DNU.EQ.0.0D0) GO TO 10
3750 0 : FC = DNU*DPI
3751 0 : FC = FC/DSIN(FC)
3752 0 : SMUR = CSHR/DNU
3753 0 : SMUI = CSHI/DNU
3754 : 10 CONTINUE
3755 0 : A2 = 1.0D0 + DNU
3756 : !C-----------------------------------------------------------------------
3757 : !C GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
3758 : !C-----------------------------------------------------------------------
3759 0 : T2 = DEXP(-DGAMLN(A2,IDUM))
3760 0 : T1 = 1.0D0/(T2*FC)
3761 0 : IF (DABS(DNU).GT.0.1D0) GO TO 40
3762 : !C-----------------------------------------------------------------------
3763 : !C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
3764 : !C-----------------------------------------------------------------------
3765 0 : AK = 1.0D0
3766 0 : S = CC(1)
3767 0 : DO 20 K=2,8
3768 0 : AK = AK*DNU2
3769 0 : TM = CC(K)*AK
3770 0 : S = S + TM
3771 0 : IF (DABS(TM).LT.TOL) GO TO 30
3772 0 : 20 CONTINUE
3773 0 : 30 G1 = -S
3774 0 : GO TO 50
3775 : 40 CONTINUE
3776 0 : G1 = (T1-T2)/(DNU+DNU)
3777 : 50 CONTINUE
3778 0 : G2 = (T1+T2)*0.5D0
3779 0 : FR = FC*(CCHR*G1+SMUR*G2)
3780 0 : FI = FC*(CCHI*G1+SMUI*G2)
3781 0 : CALL AZEXP(FMUR, FMUI, STR, STI)
3782 0 : PR = 0.5D0*STR/T2
3783 0 : PI = 0.5D0*STI/T2
3784 0 : CALL ZDIV(0.5D0, 0.0D0, STR, STI, PTR, PTI)
3785 0 : QR = PTR/T1
3786 0 : QI = PTI/T1
3787 0 : S1R = FR
3788 0 : S1I = FI
3789 0 : S2R = PR
3790 0 : S2I = PI
3791 0 : AK = 1.0D0
3792 0 : A1 = 1.0D0
3793 0 : CKR = CONER
3794 0 : CKI = CONEI
3795 0 : BK = 1.0D0 - DNU2
3796 0 : IF (INU.GT.0 .OR. N.GT.1) GO TO 80
3797 : !C-----------------------------------------------------------------------
3798 : !C GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
3799 : !C-----------------------------------------------------------------------
3800 0 : IF (CAZ.LT.TOL) GO TO 70
3801 0 : CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
3802 0 : CZR = 0.25D0*CZR
3803 0 : CZI = 0.25D0*CZI
3804 0 : T1 = 0.25D0*CAZ*CAZ
3805 : 60 CONTINUE
3806 0 : FR = (FR*AK+PR+QR)/BK
3807 0 : FI = (FI*AK+PI+QI)/BK
3808 0 : STR = 1.0D0/(AK-DNU)
3809 0 : PR = PR*STR
3810 0 : PI = PI*STR
3811 0 : STR = 1.0D0/(AK+DNU)
3812 0 : QR = QR*STR
3813 0 : QI = QI*STR
3814 0 : STR = CKR*CZR - CKI*CZI
3815 0 : RAK = 1.0D0/AK
3816 0 : CKI = (CKR*CZI+CKI*CZR)*RAK
3817 0 : CKR = STR*RAK
3818 0 : S1R = CKR*FR - CKI*FI + S1R
3819 0 : S1I = CKR*FI + CKI*FR + S1I
3820 0 : A1 = A1*T1*RAK
3821 0 : BK = BK + AK + AK + 1.0D0
3822 0 : AK = AK + 1.0D0
3823 0 : IF (A1.GT.TOL) GO TO 60
3824 : 70 CONTINUE
3825 0 : YR(1) = S1R
3826 0 : YI(1) = S1I
3827 0 : IF (KODED.EQ.1) RETURN
3828 0 : CALL AZEXP(ZR, ZI, STR, STI)
3829 0 : CALL ZMLT(S1R, S1I, STR, STI, YR(1), YI(1))
3830 0 : RETURN
3831 : !C-----------------------------------------------------------------------
3832 : !C GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
3833 : !C-----------------------------------------------------------------------
3834 : 80 CONTINUE
3835 0 : IF (CAZ.LT.TOL) GO TO 100
3836 0 : CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
3837 0 : CZR = 0.25D0*CZR
3838 0 : CZI = 0.25D0*CZI
3839 0 : T1 = 0.25D0*CAZ*CAZ
3840 : 90 CONTINUE
3841 0 : FR = (FR*AK+PR+QR)/BK
3842 0 : FI = (FI*AK+PI+QI)/BK
3843 0 : STR = 1.0D0/(AK-DNU)
3844 0 : PR = PR*STR
3845 0 : PI = PI*STR
3846 0 : STR = 1.0D0/(AK+DNU)
3847 0 : QR = QR*STR
3848 0 : QI = QI*STR
3849 0 : STR = CKR*CZR - CKI*CZI
3850 0 : RAK = 1.0D0/AK
3851 0 : CKI = (CKR*CZI+CKI*CZR)*RAK
3852 0 : CKR = STR*RAK
3853 0 : S1R = CKR*FR - CKI*FI + S1R
3854 0 : S1I = CKR*FI + CKI*FR + S1I
3855 0 : STR = PR - FR*AK
3856 0 : STI = PI - FI*AK
3857 0 : S2R = CKR*STR - CKI*STI + S2R
3858 0 : S2I = CKR*STI + CKI*STR + S2I
3859 0 : A1 = A1*T1*RAK
3860 0 : BK = BK + AK + AK + 1.0D0
3861 0 : AK = AK + 1.0D0
3862 0 : IF (A1.GT.TOL) GO TO 90
3863 : 100 CONTINUE
3864 0 : KFLAG = 2
3865 0 : A1 = FNU + 1.0D0
3866 0 : AK = A1*DABS(SMUR)
3867 0 : IF (AK.GT.ALIM) KFLAG = 3
3868 0 : STR = CSSR(KFLAG)
3869 0 : P2R = S2R*STR
3870 0 : P2I = S2I*STR
3871 0 : CALL ZMLT(P2R, P2I, RZR, RZI, S2R, S2I)
3872 0 : S1R = S1R*STR
3873 0 : S1I = S1I*STR
3874 0 : IF (KODED.EQ.1) GO TO 210
3875 0 : CALL AZEXP(ZR, ZI, FR, FI)
3876 0 : CALL ZMLT(S1R, S1I, FR, FI, S1R, S1I)
3877 0 : CALL ZMLT(S2R, S2I, FR, FI, S2R, S2I)
3878 0 : GO TO 210
3879 : !C-----------------------------------------------------------------------
3880 : !C IFLAG=0 MEANS NO UNDERFLOW OCCURRED
3881 : !C IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
3882 : !C KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
3883 : !C RECURSION
3884 : !C-----------------------------------------------------------------------
3885 : 110 CONTINUE
3886 0 : CALL AZSQRT(ZR, ZI, STR, STI)
3887 0 : CALL ZDIV(RTHPI, CZEROI, STR, STI, COEFR, COEFI)
3888 0 : KFLAG = 2
3889 0 : IF (KODED.EQ.2) GO TO 120
3890 0 : IF (ZR.GT.ALIM) GO TO 290
3891 : !C BLANK LINE
3892 0 : STR = DEXP(-ZR)*CSSR(KFLAG)
3893 0 : STI = -STR*DSIN(ZI)
3894 0 : STR = STR*DCOS(ZI)
3895 0 : CALL ZMLT(COEFR, COEFI, STR, STI, COEFR, COEFI)
3896 : 120 CONTINUE
3897 0 : IF (DABS(DNU).EQ.0.5D0) GO TO 300
3898 : !C-----------------------------------------------------------------------
3899 : !C MILLER ALGORITHM FOR CABS(Z).GT.R1
3900 : !C-----------------------------------------------------------------------
3901 0 : AK = DCOS(DPI*DNU)
3902 0 : AK = DABS(AK)
3903 0 : IF (AK.EQ.CZEROR) GO TO 300
3904 0 : FHS = DABS(0.25D0-DNU2)
3905 0 : IF (FHS.EQ.CZEROR) GO TO 300
3906 : !C-----------------------------------------------------------------------
3907 : !C COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
3908 : !C DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
3909 : !C 12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
3910 : !C TOL WHERE B IS THE BASE OF THE ARITHMETIC.
3911 : !C-----------------------------------------------------------------------
3912 0 : T1 = DBLE(FLOAT(I1MACH(14)-1))
3913 0 : T1 = T1*D1MACH(5)*3.321928094D0
3914 0 : T1 = DMAX1(T1,12.0D0)
3915 0 : T1 = DMIN1(T1,60.0D0)
3916 0 : T2 = TTH*T1 - 6.0D0
3917 0 : IF (ZR.NE.0.0D0) GO TO 130
3918 0 : T1 = HPI
3919 0 : GO TO 140
3920 : 130 CONTINUE
3921 0 : T1 = DATAN(ZI/ZR)
3922 0 : T1 = DABS(T1)
3923 : 140 CONTINUE
3924 0 : IF (T2.GT.CAZ) GO TO 170
3925 : !C-----------------------------------------------------------------------
3926 : !C FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
3927 : !C-----------------------------------------------------------------------
3928 0 : ETEST = AK/(DPI*CAZ*TOL)
3929 0 : FK = CONER
3930 0 : IF (ETEST.LT.CONER) GO TO 180
3931 0 : FKS = CTWOR
3932 0 : CKR = CAZ + CAZ + CTWOR
3933 0 : P1R = CZEROR
3934 0 : P2R = CONER
3935 0 : DO 150 I=1,KMAX
3936 0 : AK = FHS/FKS
3937 0 : CBR = CKR/(FK+CONER)
3938 0 : PTR = P2R
3939 0 : P2R = CBR*P2R - P1R*AK
3940 0 : P1R = PTR
3941 0 : CKR = CKR + CTWOR
3942 0 : FKS = FKS + FK + FK + CTWOR
3943 0 : FHS = FHS + FK + FK
3944 0 : FK = FK + CONER
3945 0 : STR = DABS(P2R)*FK
3946 0 : IF (ETEST.LT.STR) GO TO 160
3947 0 : 150 CONTINUE
3948 0 : GO TO 310
3949 : 160 CONTINUE
3950 0 : FK = FK + SPI*T1*DSQRT(T2/CAZ)
3951 0 : FHS = DABS(0.25D0-DNU2)
3952 0 : GO TO 180
3953 : 170 CONTINUE
3954 : !C-----------------------------------------------------------------------
3955 : !C COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
3956 : !C-----------------------------------------------------------------------
3957 0 : A2 = DSQRT(CAZ)
3958 0 : AK = FPI*AK/(TOL*DSQRT(A2))
3959 0 : AA = 3.0D0*T1/(1.0D0+CAZ)
3960 0 : BB = 14.7D0*T1/(28.0D0+CAZ)
3961 0 : AK = (DLOG(AK)+CAZ*DCOS(AA)/(1.0D0+0.008D0*CAZ))/DCOS(BB)
3962 0 : FK = 0.12125D0*AK*AK/CAZ + 1.5D0
3963 : 180 CONTINUE
3964 : !C-----------------------------------------------------------------------
3965 : !C BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
3966 : !C-----------------------------------------------------------------------
3967 0 : K = INT(SNGL(FK))
3968 0 : FK = DBLE(FLOAT(K))
3969 0 : FKS = FK*FK
3970 0 : P1R = CZEROR
3971 0 : P1I = CZEROI
3972 0 : P2R = TOL
3973 0 : P2I = CZEROI
3974 0 : CSR = P2R
3975 0 : CSI = P2I
3976 0 : DO 190 I=1,K
3977 0 : A1 = FKS - FK
3978 0 : AK = (FKS+FK)/(A1+FHS)
3979 0 : RAK = 2.0D0/(FK+CONER)
3980 0 : CBR = (FK+ZR)*RAK
3981 0 : CBI = ZI*RAK
3982 0 : PTR = P2R
3983 0 : PTI = P2I
3984 0 : P2R = (PTR*CBR-PTI*CBI-P1R)*AK
3985 0 : P2I = (PTI*CBR+PTR*CBI-P1I)*AK
3986 0 : P1R = PTR
3987 0 : P1I = PTI
3988 0 : CSR = CSR + P2R
3989 0 : CSI = CSI + P2I
3990 0 : FKS = A1 - FK + CONER
3991 0 : FK = FK - CONER
3992 0 : 190 CONTINUE
3993 : !C-----------------------------------------------------------------------
3994 : !C COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
3995 : !C SCALING
3996 : !C-----------------------------------------------------------------------
3997 0 : TM = AZABS(CSR,CSI)
3998 0 : PTR = 1.0D0/TM
3999 0 : S1R = P2R*PTR
4000 0 : S1I = P2I*PTR
4001 0 : CSR = CSR*PTR
4002 0 : CSI = -CSI*PTR
4003 0 : CALL ZMLT(COEFR, COEFI, S1R, S1I, STR, STI)
4004 0 : CALL ZMLT(STR, STI, CSR, CSI, S1R, S1I)
4005 0 : IF (INU.GT.0 .OR. N.GT.1) GO TO 200
4006 0 : ZDR = ZR
4007 0 : ZDI = ZI
4008 0 : IF(IFLAG.EQ.1) GO TO 270
4009 0 : GO TO 240
4010 : 200 CONTINUE
4011 : !C-----------------------------------------------------------------------
4012 : !C COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
4013 : !C-----------------------------------------------------------------------
4014 0 : TM = AZABS(P2R,P2I)
4015 0 : PTR = 1.0D0/TM
4016 0 : P1R = P1R*PTR
4017 0 : P1I = P1I*PTR
4018 0 : P2R = P2R*PTR
4019 0 : P2I = -P2I*PTR
4020 0 : CALL ZMLT(P1R, P1I, P2R, P2I, PTR, PTI)
4021 0 : STR = DNU + 0.5D0 - PTR
4022 0 : STI = -PTI
4023 0 : CALL ZDIV(STR, STI, ZR, ZI, STR, STI)
4024 0 : STR = STR + 1.0D0
4025 0 : CALL ZMLT(STR, STI, S1R, S1I, S2R, S2I)
4026 : !C-----------------------------------------------------------------------
4027 : !C FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
4028 : !C SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
4029 : !C-----------------------------------------------------------------------
4030 : 210 CONTINUE
4031 0 : STR = DNU + 1.0D0
4032 0 : CKR = STR*RZR
4033 0 : CKI = STR*RZI
4034 0 : IF (N.EQ.1) INU = INU - 1
4035 0 : IF (INU.GT.0) GO TO 220
4036 0 : IF (N.GT.1) GO TO 215
4037 0 : S1R = S2R
4038 0 : S1I = S2I
4039 : 215 CONTINUE
4040 0 : ZDR = ZR
4041 0 : ZDI = ZI
4042 0 : IF(IFLAG.EQ.1) GO TO 270
4043 0 : GO TO 240
4044 : 220 CONTINUE
4045 0 : INUB = 1
4046 0 : IF(IFLAG.EQ.1) GO TO 261
4047 : 225 CONTINUE
4048 0 : P1R = CSRR(KFLAG)
4049 0 : ASCLE = BRY(KFLAG)
4050 0 : DO 230 I=INUB,INU
4051 0 : STR = S2R
4052 0 : STI = S2I
4053 0 : S2R = CKR*STR - CKI*STI + S1R
4054 0 : S2I = CKR*STI + CKI*STR + S1I
4055 0 : S1R = STR
4056 0 : S1I = STI
4057 0 : CKR = CKR + RZR
4058 0 : CKI = CKI + RZI
4059 0 : IF (KFLAG.GE.3) GO TO 230
4060 0 : P2R = S2R*P1R
4061 0 : P2I = S2I*P1R
4062 0 : STR = DABS(P2R)
4063 0 : STI = DABS(P2I)
4064 0 : P2M = DMAX1(STR,STI)
4065 0 : IF (P2M.LE.ASCLE) GO TO 230
4066 0 : KFLAG = KFLAG + 1
4067 0 : ASCLE = BRY(KFLAG)
4068 0 : S1R = S1R*P1R
4069 0 : S1I = S1I*P1R
4070 : S2R = P2R
4071 : S2I = P2I
4072 0 : STR = CSSR(KFLAG)
4073 0 : S1R = S1R*STR
4074 0 : S1I = S1I*STR
4075 0 : S2R = S2R*STR
4076 0 : S2I = S2I*STR
4077 0 : P1R = CSRR(KFLAG)
4078 0 : 230 CONTINUE
4079 0 : IF (N.NE.1) GO TO 240
4080 0 : S1R = S2R
4081 0 : S1I = S2I
4082 : 240 CONTINUE
4083 0 : STR = CSRR(KFLAG)
4084 0 : YR(1) = S1R*STR
4085 0 : YI(1) = S1I*STR
4086 0 : IF (N.EQ.1) RETURN
4087 0 : YR(2) = S2R*STR
4088 0 : YI(2) = S2I*STR
4089 0 : IF (N.EQ.2) RETURN
4090 : KK = 2
4091 : 250 CONTINUE
4092 0 : KK = KK + 1
4093 0 : IF (KK.GT.N) RETURN
4094 0 : P1R = CSRR(KFLAG)
4095 0 : ASCLE = BRY(KFLAG)
4096 0 : DO 260 I=KK,N
4097 0 : P2R = S2R
4098 0 : P2I = S2I
4099 0 : S2R = CKR*P2R - CKI*P2I + S1R
4100 0 : S2I = CKI*P2R + CKR*P2I + S1I
4101 0 : S1R = P2R
4102 0 : S1I = P2I
4103 0 : CKR = CKR + RZR
4104 0 : CKI = CKI + RZI
4105 0 : P2R = S2R*P1R
4106 0 : P2I = S2I*P1R
4107 0 : YR(I) = P2R
4108 0 : YI(I) = P2I
4109 0 : IF (KFLAG.GE.3) GO TO 260
4110 0 : STR = DABS(P2R)
4111 0 : STI = DABS(P2I)
4112 0 : P2M = DMAX1(STR,STI)
4113 0 : IF (P2M.LE.ASCLE) GO TO 260
4114 0 : KFLAG = KFLAG + 1
4115 0 : ASCLE = BRY(KFLAG)
4116 0 : S1R = S1R*P1R
4117 0 : S1I = S1I*P1R
4118 : S2R = P2R
4119 : S2I = P2I
4120 0 : STR = CSSR(KFLAG)
4121 0 : S1R = S1R*STR
4122 0 : S1I = S1I*STR
4123 0 : S2R = S2R*STR
4124 0 : S2I = S2I*STR
4125 0 : P1R = CSRR(KFLAG)
4126 0 : 260 CONTINUE
4127 0 : RETURN
4128 : !C-----------------------------------------------------------------------
4129 : !C IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
4130 : !C-----------------------------------------------------------------------
4131 : 261 CONTINUE
4132 0 : HELIM = 0.5D0*ELIM
4133 0 : ELM = DEXP(-ELIM)
4134 0 : CELMR = ELM
4135 0 : ASCLE = BRY(1)
4136 0 : ZDR = ZR
4137 0 : ZDI = ZI
4138 0 : IC = -1
4139 0 : J = 2
4140 0 : DO 262 I=1,INU
4141 0 : STR = S2R
4142 0 : STI = S2I
4143 0 : S2R = STR*CKR-STI*CKI+S1R
4144 0 : S2I = STI*CKR+STR*CKI+S1I
4145 0 : S1R = STR
4146 0 : S1I = STI
4147 0 : CKR = CKR+RZR
4148 0 : CKI = CKI+RZI
4149 0 : AS = AZABS(S2R,S2I)
4150 0 : ALAS = DLOG(AS)
4151 0 : P2R = -ZDR+ALAS
4152 0 : IF(P2R.LT.(-ELIM)) GO TO 263
4153 0 : CALL AZLOG(S2R,S2I,STR,STI,IDUM)
4154 0 : P2R = -ZDR+STR
4155 0 : P2I = -ZDI+STI
4156 0 : P2M = DEXP(P2R)/TOL
4157 0 : P1R = P2M*DCOS(P2I)
4158 0 : P1I = P2M*DSIN(P2I)
4159 0 : CALL ZUCHK(P1R,P1I,NW,ASCLE,TOL)
4160 : IF(NW.NE.0) GO TO 263
4161 0 : J = 3 - J
4162 0 : CYR(J) = P1R
4163 0 : CYI(J) = P1I
4164 0 : IF(IC.EQ.(I-1)) GO TO 264
4165 : IC = I
4166 0 : GO TO 262
4167 : 263 CONTINUE
4168 0 : IF(ALAS.LT.HELIM) GO TO 262
4169 0 : ZDR = ZDR-ELIM
4170 0 : S1R = S1R*CELMR
4171 0 : S1I = S1I*CELMR
4172 0 : S2R = S2R*CELMR
4173 0 : S2I = S2I*CELMR
4174 0 : 262 CONTINUE
4175 0 : IF(N.NE.1) GO TO 270
4176 0 : S1R = S2R
4177 0 : S1I = S2I
4178 0 : GO TO 270
4179 : 264 CONTINUE
4180 0 : KFLAG = 1
4181 0 : INUB = I+1
4182 0 : S2R = CYR(J)
4183 0 : S2I = CYI(J)
4184 0 : J = 3 - J
4185 0 : S1R = CYR(J)
4186 0 : S1I = CYI(J)
4187 0 : IF(INUB.LE.INU) GO TO 225
4188 0 : IF(N.NE.1) GO TO 240
4189 0 : S1R = S2R
4190 0 : S1I = S2I
4191 0 : GO TO 240
4192 : 270 CONTINUE
4193 0 : YR(1) = S1R
4194 0 : YI(1) = S1I
4195 0 : IF(N.EQ.1) GO TO 280
4196 0 : YR(2) = S2R
4197 0 : YI(2) = S2I
4198 : 280 CONTINUE
4199 0 : ASCLE = BRY(1)
4200 0 : CALL ZKSCL(ZDR,ZDI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
4201 0 : INU = N - NZ
4202 0 : IF (INU.LE.0) RETURN
4203 0 : KK = NZ + 1
4204 0 : S1R = YR(KK)
4205 0 : S1I = YI(KK)
4206 0 : YR(KK) = S1R*CSRR(1)
4207 0 : YI(KK) = S1I*CSRR(1)
4208 0 : IF (INU.EQ.1) RETURN
4209 0 : KK = NZ + 2
4210 0 : S2R = YR(KK)
4211 0 : S2I = YI(KK)
4212 0 : YR(KK) = S2R*CSRR(1)
4213 0 : YI(KK) = S2I*CSRR(1)
4214 0 : IF (INU.EQ.2) RETURN
4215 0 : T2 = FNU + DBLE(FLOAT(KK-1))
4216 0 : CKR = T2*RZR
4217 0 : CKI = T2*RZI
4218 0 : KFLAG = 1
4219 0 : GO TO 250
4220 : 290 CONTINUE
4221 : !C-----------------------------------------------------------------------
4222 : !C SCALE BY DEXP(Z), IFLAG = 1 CASES
4223 : !C-----------------------------------------------------------------------
4224 0 : KODED = 2
4225 : IFLAG = 1
4226 : KFLAG = 2
4227 0 : GO TO 120
4228 : !C-----------------------------------------------------------------------
4229 : !C FNU=HALF ODD INTEGER CASE, DNU=-0.5
4230 : !C-----------------------------------------------------------------------
4231 : 300 CONTINUE
4232 0 : S1R = COEFR
4233 0 : S1I = COEFI
4234 0 : S2R = COEFR
4235 0 : S2I = COEFI
4236 0 : GO TO 210
4237 : !C
4238 : !C
4239 : 310 CONTINUE
4240 0 : NZ=-2
4241 0 : RETURN
4242 : END SUBROUTINE ZBKNU
4243 :
4244 0 : SUBROUTINE ZRATI(ZR, ZI, FNU, N, CYR, CYI, TOL)
4245 : !C***BEGIN PROLOGUE ZRATI
4246 : !C***REFER TO ZBESI,ZBESK,ZBESH
4247 : !C
4248 : !C ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
4249 : !C RECURRENCE. THE STARTING INDEX IS DETERMINED BY FORWARD
4250 : !C RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
4251 : !C MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
4252 : !C BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
4253 : !C BY D. J. SOOKNE.
4254 : !C
4255 : !C***ROUTINES CALLED AZABS,ZDIV
4256 : !C***END PROLOGUE ZRATI
4257 : !C COMPLEX Z,CY(1),CONE,CZERO,P1,P2,T1,RZ,PT,CDFNU
4258 : DOUBLE PRECISION AK, AMAGZ, AP1, AP2, ARG, AZ, CDFNUI, CDFNUR, &
4259 : & CONEI, CONER, CYI, CYR, CZEROI, CZEROR, DFNU, FDNU, FLAM, FNU, &
4260 : & FNUP, PTI, PTR, P1I, P1R, P2I, P2R, RAK, RAP1, RHO, RT2, RZI, &
4261 : & RZR, TEST, TEST1, TOL, TTI, TTR, T1I, T1R, ZI, ZR!, AZABS
4262 : INTEGER I, ID, IDNU, INU, ITIME, K, KK, MAGZ, N
4263 : DIMENSION CYR(N), CYI(N)
4264 : DATA CZEROR,CZEROI,CONER,CONEI,RT2/ &
4265 : & 0.0D0, 0.0D0, 1.0D0, 0.0D0, 1.41421356237309505D0 /
4266 0 : AZ = AZABS(ZR,ZI)
4267 0 : INU = INT(SNGL(FNU))
4268 0 : IDNU = INU + N - 1
4269 0 : MAGZ = INT(SNGL(AZ))
4270 0 : AMAGZ = DBLE(FLOAT(MAGZ+1))
4271 0 : FDNU = DBLE(FLOAT(IDNU))
4272 0 : FNUP = DMAX1(AMAGZ,FDNU)
4273 0 : ID = IDNU - MAGZ - 1
4274 0 : ITIME = 1
4275 0 : K = 1
4276 0 : PTR = 1.0D0/AZ
4277 0 : RZR = PTR*(ZR+ZR)*PTR
4278 0 : RZI = -PTR*(ZI+ZI)*PTR
4279 0 : T1R = RZR*FNUP
4280 0 : T1I = RZI*FNUP
4281 0 : P2R = -T1R
4282 0 : P2I = -T1I
4283 0 : P1R = CONER
4284 0 : P1I = CONEI
4285 0 : T1R = T1R + RZR
4286 0 : T1I = T1I + RZI
4287 0 : IF (ID.GT.0) ID = 0
4288 0 : AP2 = AZABS(P2R,P2I)
4289 0 : AP1 = AZABS(P1R,P1I)
4290 : !C-----------------------------------------------------------------------
4291 : !C THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNU
4292 : !C GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
4293 : !C P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
4294 : !C PREMATURELY.
4295 : !C-----------------------------------------------------------------------
4296 0 : ARG = (AP2+AP2)/(AP1*TOL)
4297 0 : TEST1 = DSQRT(ARG)
4298 0 : TEST = TEST1
4299 0 : RAP1 = 1.0D0/AP1
4300 0 : P1R = P1R*RAP1
4301 0 : P1I = P1I*RAP1
4302 0 : P2R = P2R*RAP1
4303 0 : P2I = P2I*RAP1
4304 0 : AP2 = AP2*RAP1
4305 : 10 CONTINUE
4306 0 : K = K + 1
4307 0 : AP1 = AP2
4308 0 : PTR = P2R
4309 0 : PTI = P2I
4310 0 : P2R = P1R - (T1R*PTR-T1I*PTI)
4311 0 : P2I = P1I - (T1R*PTI+T1I*PTR)
4312 0 : P1R = PTR
4313 0 : P1I = PTI
4314 0 : T1R = T1R + RZR
4315 0 : T1I = T1I + RZI
4316 0 : AP2 = AZABS(P2R,P2I)
4317 0 : IF (AP1.LE.TEST) GO TO 10
4318 0 : IF (ITIME.EQ.2) GO TO 20
4319 0 : AK = AZABS(T1R,T1I)*0.5D0
4320 0 : FLAM = AK + DSQRT(AK*AK-1.0D0)
4321 0 : RHO = DMIN1(AP2/AP1,FLAM)
4322 0 : TEST = TEST1*DSQRT(RHO/(RHO*RHO-1.0D0))
4323 0 : ITIME = 2
4324 0 : GO TO 10
4325 : 20 CONTINUE
4326 0 : KK = K + 1 - ID
4327 0 : AK = DBLE(FLOAT(KK))
4328 0 : T1R = AK
4329 0 : T1I = CZEROI
4330 0 : DFNU = FNU + DBLE(FLOAT(N-1))
4331 0 : P1R = 1.0D0/AP2
4332 0 : P1I = CZEROI
4333 0 : P2R = CZEROR
4334 0 : P2I = CZEROI
4335 0 : DO 30 I=1,KK
4336 0 : PTR = P1R
4337 0 : PTI = P1I
4338 0 : RAP1 = DFNU + T1R
4339 0 : TTR = RZR*RAP1
4340 0 : TTI = RZI*RAP1
4341 0 : P1R = (PTR*TTR-PTI*TTI) + P2R
4342 0 : P1I = (PTR*TTI+PTI*TTR) + P2I
4343 0 : P2R = PTR
4344 0 : P2I = PTI
4345 0 : T1R = T1R - CONER
4346 0 : 30 CONTINUE
4347 0 : IF (P1R.NE.CZEROR .OR. P1I.NE.CZEROI) GO TO 40
4348 0 : P1R = TOL
4349 0 : P1I = TOL
4350 : 40 CONTINUE
4351 0 : CALL ZDIV(P2R, P2I, P1R, P1I, CYR(N), CYI(N))
4352 0 : IF (N.EQ.1) RETURN
4353 0 : K = N - 1
4354 0 : AK = DBLE(FLOAT(K))
4355 0 : T1R = AK
4356 : T1I = CZEROI
4357 0 : CDFNUR = FNU*RZR
4358 0 : CDFNUI = FNU*RZI
4359 0 : DO 60 I=2,N
4360 0 : PTR = CDFNUR + (T1R*RZR-T1I*RZI) + CYR(K+1)
4361 0 : PTI = CDFNUI + (T1R*RZI+T1I*RZR) + CYI(K+1)
4362 0 : AK = AZABS(PTR,PTI)
4363 0 : IF (AK.NE.CZEROR) GO TO 50
4364 0 : PTR = TOL
4365 0 : PTI = TOL
4366 0 : AK = TOL*RT2
4367 : 50 CONTINUE
4368 0 : RAK = CONER/AK
4369 0 : CYR(K) = RAK*PTR*RAK
4370 0 : CYI(K) = -RAK*PTI*RAK
4371 0 : T1R = T1R - CONER
4372 0 : K = K - 1
4373 0 : 60 CONTINUE
4374 : RETURN
4375 : END SUBROUTINE ZRATI
4376 :
4377 0 : SUBROUTINE ZBUNI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NUI, NLAST, &
4378 : & FNUL, TOL, ELIM, ALIM)
4379 : !C***BEGIN PROLOGUE ZBUNI
4380 : !C***REFER TO ZBESI,ZBESK
4381 : !C
4382 : !C ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.
4383 : !C FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
4384 : !C FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
4385 : !C ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
4386 : !C ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
4387 : !C
4388 : !C***ROUTINES CALLED ZUNI1,ZUNI2,AZABS,D1MACH
4389 : !C***END PROLOGUE ZBUNI
4390 : !C COMPLEX CSCL,CSCR,CY,RZ,ST,S1,S2,Y,Z
4391 : DOUBLE PRECISION ALIM, AX, AY, CSCLR, CSCRR, CYI, CYR, DFNU, &
4392 : & ELIM, FNU, FNUI, FNUL, GNU, RAZ, RZI, RZR, STI, STR, S1I, S1R, &
4393 : & S2I, S2R, TOL, YI, YR, ZI, ZR, ASCLE, BRY, C1R, C1I, C1M!,AZABS &
4394 : !& D1MACH
4395 : INTEGER I, IFLAG, IFORM, K, KODE, N, NL, NLAST, NUI, NW, NZ
4396 : DIMENSION YR(N), YI(N), CYR(2), CYI(2), BRY(3)
4397 0 : NZ = 0
4398 0 : AX = DABS(ZR)*1.7321D0
4399 0 : AY = DABS(ZI)
4400 0 : IFORM = 1
4401 0 : IF (AY.GT.AX) IFORM = 2
4402 0 : IF (NUI.EQ.0) GO TO 60
4403 0 : FNUI = DBLE(FLOAT(NUI))
4404 0 : DFNU = FNU + DBLE(FLOAT(N-1))
4405 0 : GNU = DFNU + FNUI
4406 0 : IF (IFORM.EQ.2) GO TO 10
4407 : !C-----------------------------------------------------------------------
4408 : !C ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
4409 : !C -PI/3.LE.ARG(Z).LE.PI/3
4410 : !C-----------------------------------------------------------------------
4411 : CALL ZUNI1(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL, &
4412 0 : & ELIM, ALIM)
4413 0 : GO TO 20
4414 : 10 CONTINUE
4415 : !C-----------------------------------------------------------------------
4416 : !C ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
4417 : !C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
4418 : !C AND HPI=PI/2
4419 : !C-----------------------------------------------------------------------
4420 : CALL ZUNI2(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL, &
4421 0 : & ELIM, ALIM)
4422 : 20 CONTINUE
4423 0 : IF (NW.LT.0) GO TO 50
4424 0 : IF (NW.NE.0) GO TO 90
4425 0 : STR = AZABS(CYR(1),CYI(1))
4426 : !C----------------------------------------------------------------------
4427 : !C SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
4428 : !C----------------------------------------------------------------------
4429 0 : BRY(1)=1.0D+3*D1MACH(1)/TOL
4430 0 : BRY(2) = 1.0D0/BRY(1)
4431 0 : BRY(3) = BRY(2)
4432 0 : IFLAG = 2
4433 0 : ASCLE = BRY(2)
4434 0 : CSCLR = 1.0D0
4435 0 : IF (STR.GT.BRY(1)) GO TO 21
4436 0 : IFLAG = 1
4437 0 : ASCLE = BRY(1)
4438 0 : CSCLR = 1.0D0/TOL
4439 0 : GO TO 25
4440 : 21 CONTINUE
4441 0 : IF (STR.LT.BRY(2)) GO TO 25
4442 0 : IFLAG = 3
4443 0 : ASCLE=BRY(3)
4444 0 : CSCLR = TOL
4445 : 25 CONTINUE
4446 0 : CSCRR = 1.0D0/CSCLR
4447 0 : S1R = CYR(2)*CSCLR
4448 0 : S1I = CYI(2)*CSCLR
4449 0 : S2R = CYR(1)*CSCLR
4450 0 : S2I = CYI(1)*CSCLR
4451 0 : RAZ = 1.0D0/AZABS(ZR,ZI)
4452 0 : STR = ZR*RAZ
4453 0 : STI = -ZI*RAZ
4454 0 : RZR = (STR+STR)*RAZ
4455 0 : RZI = (STI+STI)*RAZ
4456 0 : DO 30 I=1,NUI
4457 0 : STR = S2R
4458 0 : STI = S2I
4459 0 : S2R = (DFNU+FNUI)*(RZR*STR-RZI*STI) + S1R
4460 0 : S2I = (DFNU+FNUI)*(RZR*STI+RZI*STR) + S1I
4461 0 : S1R = STR
4462 0 : S1I = STI
4463 0 : FNUI = FNUI - 1.0D0
4464 0 : IF (IFLAG.GE.3) GO TO 30
4465 0 : STR = S2R*CSCRR
4466 0 : STI = S2I*CSCRR
4467 0 : C1R = DABS(STR)
4468 0 : C1I = DABS(STI)
4469 0 : C1M = DMAX1(C1R,C1I)
4470 0 : IF (C1M.LE.ASCLE) GO TO 30
4471 0 : IFLAG = IFLAG+1
4472 0 : ASCLE = BRY(IFLAG)
4473 0 : S1R = S1R*CSCRR
4474 0 : S1I = S1I*CSCRR
4475 0 : S2R = STR
4476 0 : S2I = STI
4477 0 : CSCLR = CSCLR*TOL
4478 0 : CSCRR = 1.0D0/CSCLR
4479 0 : S1R = S1R*CSCLR
4480 0 : S1I = S1I*CSCLR
4481 0 : S2R = S2R*CSCLR
4482 0 : S2I = S2I*CSCLR
4483 0 : 30 CONTINUE
4484 0 : YR(N) = S2R*CSCRR
4485 0 : YI(N) = S2I*CSCRR
4486 0 : IF (N.EQ.1) RETURN
4487 0 : NL = N - 1
4488 0 : FNUI = DBLE(FLOAT(NL))
4489 0 : K = NL
4490 0 : DO 40 I=1,NL
4491 0 : STR = S2R
4492 0 : STI = S2I
4493 0 : S2R = (FNU+FNUI)*(RZR*STR-RZI*STI) + S1R
4494 0 : S2I = (FNU+FNUI)*(RZR*STI+RZI*STR) + S1I
4495 0 : S1R = STR
4496 0 : S1I = STI
4497 0 : STR = S2R*CSCRR
4498 0 : STI = S2I*CSCRR
4499 0 : YR(K) = STR
4500 0 : YI(K) = STI
4501 0 : FNUI = FNUI - 1.0D0
4502 0 : K = K - 1
4503 0 : IF (IFLAG.GE.3) GO TO 40
4504 0 : C1R = DABS(STR)
4505 0 : C1I = DABS(STI)
4506 0 : C1M = DMAX1(C1R,C1I)
4507 0 : IF (C1M.LE.ASCLE) GO TO 40
4508 0 : IFLAG = IFLAG+1
4509 0 : ASCLE = BRY(IFLAG)
4510 0 : S1R = S1R*CSCRR
4511 0 : S1I = S1I*CSCRR
4512 0 : S2R = STR
4513 0 : S2I = STI
4514 0 : CSCLR = CSCLR*TOL
4515 0 : CSCRR = 1.0D0/CSCLR
4516 0 : S1R = S1R*CSCLR
4517 0 : S1I = S1I*CSCLR
4518 0 : S2R = S2R*CSCLR
4519 0 : S2I = S2I*CSCLR
4520 0 : 40 CONTINUE
4521 0 : RETURN
4522 : 50 CONTINUE
4523 0 : NZ = -1
4524 0 : IF(NW.EQ.(-2)) NZ=-2
4525 0 : RETURN
4526 : 60 CONTINUE
4527 0 : IF (IFORM.EQ.2) GO TO 70
4528 : !C-----------------------------------------------------------------------
4529 : !C ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
4530 : !C -PI/3.LE.ARG(Z).LE.PI/3
4531 : !C-----------------------------------------------------------------------
4532 : CALL ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL, &
4533 0 : & ELIM, ALIM)
4534 0 : GO TO 80
4535 : 70 CONTINUE
4536 : !C-----------------------------------------------------------------------
4537 : !C ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
4538 : !C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
4539 : !C AND HPI=PI/2
4540 : !C-----------------------------------------------------------------------
4541 : CALL ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL, &
4542 0 : & ELIM, ALIM)
4543 : 80 CONTINUE
4544 0 : IF (NW.LT.0) GO TO 50
4545 0 : NZ = NW
4546 0 : RETURN
4547 : 90 CONTINUE
4548 0 : NLAST = N
4549 0 : RETURN
4550 : END SUBROUTINE ZBUNI
4551 :
4552 0 : SUBROUTINE ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, &
4553 : & TOL, ELIM, ALIM)
4554 : !C***BEGIN PROLOGUE ZUNI1
4555 : !C***REFER TO ZBESI,ZBESK
4556 : !C
4557 : !C ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC
4558 : !C EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
4559 : !C
4560 : !C FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
4561 : !C EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
4562 : !C NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
4563 : !C FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
4564 : !C Y(I)=CZERO FOR I=NLAST+1,N
4565 : !C
4566 : !C***ROUTINES CALLED ZUCHK,ZUNIK,ZUOIK,D1MACH,AZABS
4567 : !C***END PROLOGUE ZUNI1
4568 : !C COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1,
4569 : !C *S2,Y,Z,ZETA1,ZETA2
4570 : DOUBLE PRECISION ALIM, APHI, ASCLE, BRY, CONER, CRSC, &
4571 : & CSCL, CSRR, CSSR, CWRKI, CWRKR, C1R, C2I, C2M, C2R, ELIM, FN, &
4572 : & FNU, FNUL, PHII, PHIR, RAST, RS1, RZI, RZR, STI, STR, SUMI, &
4573 : & SUMR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, &
4574 : & ZETA1R, ZETA2I, ZETA2R, ZI, ZR, CYR, CYI!, D1MACH, AZABS
4575 : INTEGER I, IFLAG, INIT, K, KODE, M, N, ND, NLAST, NN, NUF, NW, NZ
4576 : DIMENSION BRY(3), YR(N), YI(N), CWRKR(16), CWRKI(16), CSSR(3), &
4577 : & CSRR(3), CYR(2), CYI(2)
4578 : DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
4579 : !C
4580 0 : NZ = 0
4581 0 : ND = N
4582 0 : NLAST = 0
4583 : !C-----------------------------------------------------------------------
4584 : !C COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
4585 : !C NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
4586 : !C EXP(ALIM)=EXP(ELIM)*TOL
4587 : !C-----------------------------------------------------------------------
4588 0 : CSCL = 1.0D0/TOL
4589 0 : CRSC = TOL
4590 0 : CSSR(1) = CSCL
4591 0 : CSSR(2) = CONER
4592 0 : CSSR(3) = CRSC
4593 0 : CSRR(1) = CRSC
4594 0 : CSRR(2) = CONER
4595 0 : CSRR(3) = CSCL
4596 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
4597 : !C-----------------------------------------------------------------------
4598 : !C CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
4599 : !C-----------------------------------------------------------------------
4600 0 : FN = DMAX1(FNU,1.0D0)
4601 0 : INIT = 0
4602 : CALL ZUNIK(ZR, ZI, FN, 1, 1, TOL, INIT, PHIR, PHII, ZETA1R, &
4603 0 : & ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
4604 0 : IF (KODE.EQ.1) GO TO 10
4605 0 : STR = ZR + ZETA2R
4606 0 : STI = ZI + ZETA2I
4607 0 : RAST = FN/AZABS(STR,STI)
4608 0 : STR = STR*RAST*RAST
4609 0 : STI = -STI*RAST*RAST
4610 0 : S1R = -ZETA1R + STR
4611 0 : S1I = -ZETA1I + STI
4612 0 : GO TO 20
4613 : 10 CONTINUE
4614 0 : S1R = -ZETA1R + ZETA2R
4615 0 : S1I = -ZETA1I + ZETA2I
4616 : 20 CONTINUE
4617 0 : RS1 = S1R
4618 0 : IF (DABS(RS1).GT.ELIM) GO TO 130
4619 : 30 CONTINUE
4620 0 : NN = MIN0(2,ND)
4621 0 : DO 80 I=1,NN
4622 0 : FN = FNU + DBLE(FLOAT(ND-I))
4623 0 : INIT = 0
4624 : CALL ZUNIK(ZR, ZI, FN, 1, 0, TOL, INIT, PHIR, PHII, ZETA1R, &
4625 0 : & ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
4626 0 : IF (KODE.EQ.1) GO TO 40
4627 0 : STR = ZR + ZETA2R
4628 0 : STI = ZI + ZETA2I
4629 0 : RAST = FN/AZABS(STR,STI)
4630 0 : STR = STR*RAST*RAST
4631 0 : STI = -STI*RAST*RAST
4632 0 : S1R = -ZETA1R + STR
4633 0 : S1I = -ZETA1I + STI + ZI
4634 0 : GO TO 50
4635 : 40 CONTINUE
4636 0 : S1R = -ZETA1R + ZETA2R
4637 0 : S1I = -ZETA1I + ZETA2I
4638 : 50 CONTINUE
4639 : !C-----------------------------------------------------------------------
4640 : !C TEST FOR UNDERFLOW AND OVERFLOW
4641 : !C-----------------------------------------------------------------------
4642 0 : RS1 = S1R
4643 0 : IF (DABS(RS1).GT.ELIM) GO TO 110
4644 0 : IF (I.EQ.1) IFLAG = 2
4645 0 : IF (DABS(RS1).LT.ALIM) GO TO 60
4646 : !C-----------------------------------------------------------------------
4647 : !C REFINE TEST AND SCALE
4648 : !C-----------------------------------------------------------------------
4649 0 : APHI = AZABS(PHIR,PHII)
4650 0 : RS1 = RS1 + DLOG(APHI)
4651 0 : IF (DABS(RS1).GT.ELIM) GO TO 110
4652 0 : IF (I.EQ.1) IFLAG = 1
4653 0 : IF (RS1.LT.0.0D0) GO TO 60
4654 0 : IF (I.EQ.1) IFLAG = 3
4655 : 60 CONTINUE
4656 : !C-----------------------------------------------------------------------
4657 : !C SCALE S1 IF CABS(S1).LT.ASCLE
4658 : !C-----------------------------------------------------------------------
4659 0 : S2R = PHIR*SUMR - PHII*SUMI
4660 0 : S2I = PHIR*SUMI + PHII*SUMR
4661 0 : STR = DEXP(S1R)*CSSR(IFLAG)
4662 0 : S1R = STR*DCOS(S1I)
4663 0 : S1I = STR*DSIN(S1I)
4664 0 : STR = S2R*S1R - S2I*S1I
4665 0 : S2I = S2R*S1I + S2I*S1R
4666 0 : S2R = STR
4667 0 : IF (IFLAG.NE.1) GO TO 70
4668 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
4669 : IF (NW.NE.0) GO TO 110
4670 : 70 CONTINUE
4671 0 : CYR(I) = S2R
4672 0 : CYI(I) = S2I
4673 0 : M = ND - I + 1
4674 0 : YR(M) = S2R*CSRR(IFLAG)
4675 0 : YI(M) = S2I*CSRR(IFLAG)
4676 0 : 80 CONTINUE
4677 0 : IF (ND.LE.2) GO TO 100
4678 0 : RAST = 1.0D0/AZABS(ZR,ZI)
4679 0 : STR = ZR*RAST
4680 0 : STI = -ZI*RAST
4681 0 : RZR = (STR+STR)*RAST
4682 0 : RZI = (STI+STI)*RAST
4683 0 : BRY(2) = 1.0D0/BRY(1)
4684 0 : BRY(3) = D1MACH(2)
4685 0 : S1R = CYR(1)
4686 0 : S1I = CYI(1)
4687 0 : S2R = CYR(2)
4688 0 : S2I = CYI(2)
4689 0 : C1R = CSRR(IFLAG)
4690 0 : ASCLE = BRY(IFLAG)
4691 0 : K = ND - 2
4692 0 : FN = DBLE(FLOAT(K))
4693 0 : DO 90 I=3,ND
4694 0 : C2R = S2R
4695 0 : C2I = S2I
4696 0 : S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
4697 0 : S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
4698 0 : S1R = C2R
4699 0 : S1I = C2I
4700 0 : C2R = S2R*C1R
4701 0 : C2I = S2I*C1R
4702 0 : YR(K) = C2R
4703 0 : YI(K) = C2I
4704 0 : K = K - 1
4705 0 : FN = FN - 1.0D0
4706 0 : IF (IFLAG.GE.3) GO TO 90
4707 0 : STR = DABS(C2R)
4708 0 : STI = DABS(C2I)
4709 0 : C2M = DMAX1(STR,STI)
4710 0 : IF (C2M.LE.ASCLE) GO TO 90
4711 0 : IFLAG = IFLAG + 1
4712 0 : ASCLE = BRY(IFLAG)
4713 0 : S1R = S1R*C1R
4714 0 : S1I = S1I*C1R
4715 0 : S2R = C2R
4716 0 : S2I = C2I
4717 0 : S1R = S1R*CSSR(IFLAG)
4718 0 : S1I = S1I*CSSR(IFLAG)
4719 0 : S2R = S2R*CSSR(IFLAG)
4720 0 : S2I = S2I*CSSR(IFLAG)
4721 0 : C1R = CSRR(IFLAG)
4722 0 : 90 CONTINUE
4723 : 100 CONTINUE
4724 0 : RETURN
4725 : !C-----------------------------------------------------------------------
4726 : !C SET UNDERFLOW AND UPDATE PARAMETERS
4727 : !C-----------------------------------------------------------------------
4728 : 110 CONTINUE
4729 0 : IF (RS1.GT.0.0D0) GO TO 120
4730 0 : YR(ND) = ZEROR
4731 0 : YI(ND) = ZEROI
4732 0 : NZ = NZ + 1
4733 0 : ND = ND - 1
4734 0 : IF (ND.EQ.0) GO TO 100
4735 0 : CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
4736 0 : IF (NUF.LT.0) GO TO 120
4737 0 : ND = ND - NUF
4738 0 : NZ = NZ + NUF
4739 0 : IF (ND.EQ.0) GO TO 100
4740 0 : FN = FNU + DBLE(FLOAT(ND-1))
4741 0 : IF (FN.GE.FNUL) GO TO 30
4742 0 : NLAST = ND
4743 0 : RETURN
4744 : 120 CONTINUE
4745 0 : NZ = -1
4746 0 : RETURN
4747 : 130 CONTINUE
4748 0 : IF (RS1.GT.0.0D0) GO TO 120
4749 0 : NZ = N
4750 0 : DO 140 I=1,N
4751 0 : YR(I) = ZEROR
4752 0 : YI(I) = ZEROI
4753 0 : 140 CONTINUE
4754 : RETURN
4755 : END SUBROUTINE ZUNI1
4756 :
4757 0 : SUBROUTINE ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, &
4758 : & TOL, ELIM, ALIM)
4759 : !C***BEGIN PROLOGUE ZUNI2
4760 : !C***REFER TO ZBESI,ZBESK
4761 : !C
4762 : !C ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
4763 : !C UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
4764 : !C OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
4765 : !C
4766 : !C FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
4767 : !C EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
4768 : !C NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
4769 : !C FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
4770 : !C Y(I)=CZERO FOR I=NLAST+1,N
4771 : !C
4772 : !C***ROUTINES CALLED ZAIRY,ZUCHK,ZUNHJ,ZUOIK,D1MACH,AZABS
4773 : !C***END PROLOGUE ZUNI2
4774 : !C COMPLEX AI,ARG,ASUM,BSUM,CFN,CI,CID,CIP,CONE,CRSC,CSCL,CSR,CSS,
4775 : !C *CZERO,C1,C2,DAI,PHI,RZ,S1,S2,Y,Z,ZB,ZETA1,ZETA2,ZN
4776 : DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGI, &
4777 : & ARGR, ASCLE, ASUMI, ASUMR, BRY, BSUMI, BSUMR, CIDI, CIPI, CIPR, &
4778 : & CONER, CRSC, CSCL, CSRR, CSSR, C1R, C2I, C2M, C2R, DAII, &
4779 : & DAIR, ELIM, FN, FNU, FNUL, HPI, PHII, PHIR, RAST, RAZ, RS1, RZI, &
4780 : & RZR, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZBI, ZBR, ZEROI, &
4781 : & ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI, ZNI, ZNR, ZR, CYR, &
4782 : & CYI, CAR, SAR !D1MACH, AZABS
4783 : INTEGER I, IFLAG, IN, INU, J, K, KODE, N, NAI, ND, NDAI, NLAST, &
4784 : & NN, NUF, NW, NZ, IDUM
4785 : DIMENSION BRY(3), YR(N), YI(N), CIPR(4), CIPI(4), CSSR(3), &
4786 : & CSRR(3), CYR(2), CYI(2)
4787 : DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
4788 : DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4), &
4789 : & CIPI(4)/ 1.0D0,0.0D0, 0.0D0,1.0D0, -1.0D0,0.0D0, 0.0D0,-1.0D0/
4790 : DATA HPI, AIC / &
4791 : & 1.57079632679489662D+00, 1.265512123484645396D+00/
4792 : !C
4793 0 : NZ = 0
4794 0 : ND = N
4795 0 : NLAST = 0
4796 : !C-----------------------------------------------------------------------
4797 : !C COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
4798 : !C NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
4799 : !C EXP(ALIM)=EXP(ELIM)*TOL
4800 : !C-----------------------------------------------------------------------
4801 0 : CSCL = 1.0D0/TOL
4802 0 : CRSC = TOL
4803 0 : CSSR(1) = CSCL
4804 0 : CSSR(2) = CONER
4805 0 : CSSR(3) = CRSC
4806 0 : CSRR(1) = CRSC
4807 0 : CSRR(2) = CONER
4808 0 : CSRR(3) = CSCL
4809 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
4810 : !C-----------------------------------------------------------------------
4811 : !C ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
4812 : !C-----------------------------------------------------------------------
4813 0 : ZNR = ZI
4814 0 : ZNI = -ZR
4815 0 : ZBR = ZR
4816 0 : ZBI = ZI
4817 0 : CIDI = -CONER
4818 0 : INU = INT(SNGL(FNU))
4819 0 : ANG = HPI*(FNU-DBLE(FLOAT(INU)))
4820 0 : C2R = DCOS(ANG)
4821 0 : C2I = DSIN(ANG)
4822 0 : CAR = C2R
4823 0 : SAR = C2I
4824 0 : IN = INU + N - 1
4825 0 : IN = MOD(IN,4) + 1
4826 0 : STR = C2R*CIPR(IN) - C2I*CIPI(IN)
4827 0 : C2I = C2R*CIPI(IN) + C2I*CIPR(IN)
4828 0 : C2R = STR
4829 0 : IF (ZI.GT.0.0D0) GO TO 10
4830 0 : ZNR = -ZNR
4831 0 : ZBI = -ZBI
4832 0 : CIDI = -CIDI
4833 0 : C2I = -C2I
4834 : 10 CONTINUE
4835 : !C-----------------------------------------------------------------------
4836 : !C CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
4837 : !C-----------------------------------------------------------------------
4838 0 : FN = DMAX1(FNU,1.0D0)
4839 : CALL ZUNHJ(ZNR, ZNI, FN, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
4840 0 : & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
4841 0 : IF (KODE.EQ.1) GO TO 20
4842 0 : STR = ZBR + ZETA2R
4843 0 : STI = ZBI + ZETA2I
4844 0 : RAST = FN/AZABS(STR,STI)
4845 0 : STR = STR*RAST*RAST
4846 0 : STI = -STI*RAST*RAST
4847 0 : S1R = -ZETA1R + STR
4848 0 : S1I = -ZETA1I + STI
4849 0 : GO TO 30
4850 : 20 CONTINUE
4851 0 : S1R = -ZETA1R + ZETA2R
4852 0 : S1I = -ZETA1I + ZETA2I
4853 : 30 CONTINUE
4854 0 : RS1 = S1R
4855 0 : IF (DABS(RS1).GT.ELIM) GO TO 150
4856 : 40 CONTINUE
4857 0 : NN = MIN0(2,ND)
4858 0 : DO 90 I=1,NN
4859 0 : FN = FNU + DBLE(FLOAT(ND-I))
4860 : CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR, PHII, ARGR, ARGI, &
4861 0 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
4862 0 : IF (KODE.EQ.1) GO TO 50
4863 0 : STR = ZBR + ZETA2R
4864 0 : STI = ZBI + ZETA2I
4865 0 : RAST = FN/AZABS(STR,STI)
4866 0 : STR = STR*RAST*RAST
4867 0 : STI = -STI*RAST*RAST
4868 0 : S1R = -ZETA1R + STR
4869 0 : S1I = -ZETA1I + STI + DABS(ZI)
4870 0 : GO TO 60
4871 : 50 CONTINUE
4872 0 : S1R = -ZETA1R + ZETA2R
4873 0 : S1I = -ZETA1I + ZETA2I
4874 : 60 CONTINUE
4875 : !C-----------------------------------------------------------------------
4876 : !C TEST FOR UNDERFLOW AND OVERFLOW
4877 : !C-----------------------------------------------------------------------
4878 0 : RS1 = S1R
4879 0 : IF (DABS(RS1).GT.ELIM) GO TO 120
4880 0 : IF (I.EQ.1) IFLAG = 2
4881 0 : IF (DABS(RS1).LT.ALIM) GO TO 70
4882 : !C-----------------------------------------------------------------------
4883 : !C REFINE TEST AND SCALE
4884 : !C-----------------------------------------------------------------------
4885 : !C-----------------------------------------------------------------------
4886 0 : APHI = AZABS(PHIR,PHII)
4887 0 : AARG = AZABS(ARGR,ARGI)
4888 0 : RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
4889 0 : IF (DABS(RS1).GT.ELIM) GO TO 120
4890 0 : IF (I.EQ.1) IFLAG = 1
4891 0 : IF (RS1.LT.0.0D0) GO TO 70
4892 0 : IF (I.EQ.1) IFLAG = 3
4893 : 70 CONTINUE
4894 : !C-----------------------------------------------------------------------
4895 : !C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
4896 : !C EXPONENT EXTREMES
4897 : !C-----------------------------------------------------------------------
4898 0 : CALL ZAIRY(ARGR, ARGI, 0, 2, AIR, AII, NAI, IDUM)
4899 0 : CALL ZAIRY(ARGR, ARGI, 1, 2, DAIR, DAII, NDAI, IDUM)
4900 0 : STR = DAIR*BSUMR - DAII*BSUMI
4901 0 : STI = DAIR*BSUMI + DAII*BSUMR
4902 0 : STR = STR + (AIR*ASUMR-AII*ASUMI)
4903 0 : STI = STI + (AIR*ASUMI+AII*ASUMR)
4904 0 : S2R = PHIR*STR - PHII*STI
4905 0 : S2I = PHIR*STI + PHII*STR
4906 0 : STR = DEXP(S1R)*CSSR(IFLAG)
4907 0 : S1R = STR*DCOS(S1I)
4908 0 : S1I = STR*DSIN(S1I)
4909 0 : STR = S2R*S1R - S2I*S1I
4910 0 : S2I = S2R*S1I + S2I*S1R
4911 0 : S2R = STR
4912 0 : IF (IFLAG.NE.1) GO TO 80
4913 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
4914 : IF (NW.NE.0) GO TO 120
4915 : 80 CONTINUE
4916 0 : IF (ZI.LE.0.0D0) S2I = -S2I
4917 0 : STR = S2R*C2R - S2I*C2I
4918 0 : S2I = S2R*C2I + S2I*C2R
4919 0 : S2R = STR
4920 0 : CYR(I) = S2R
4921 0 : CYI(I) = S2I
4922 0 : J = ND - I + 1
4923 0 : YR(J) = S2R*CSRR(IFLAG)
4924 0 : YI(J) = S2I*CSRR(IFLAG)
4925 0 : STR = -C2I*CIDI
4926 0 : C2I = C2R*CIDI
4927 0 : C2R = STR
4928 0 : 90 CONTINUE
4929 0 : IF (ND.LE.2) GO TO 110
4930 0 : RAZ = 1.0D0/AZABS(ZR,ZI)
4931 0 : STR = ZR*RAZ
4932 0 : STI = -ZI*RAZ
4933 0 : RZR = (STR+STR)*RAZ
4934 0 : RZI = (STI+STI)*RAZ
4935 0 : BRY(2) = 1.0D0/BRY(1)
4936 0 : BRY(3) = D1MACH(2)
4937 0 : S1R = CYR(1)
4938 0 : S1I = CYI(1)
4939 0 : S2R = CYR(2)
4940 0 : S2I = CYI(2)
4941 0 : C1R = CSRR(IFLAG)
4942 0 : ASCLE = BRY(IFLAG)
4943 0 : K = ND - 2
4944 0 : FN = DBLE(FLOAT(K))
4945 0 : DO 100 I=3,ND
4946 0 : C2R = S2R
4947 0 : C2I = S2I
4948 0 : S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
4949 0 : S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
4950 0 : S1R = C2R
4951 0 : S1I = C2I
4952 0 : C2R = S2R*C1R
4953 0 : C2I = S2I*C1R
4954 0 : YR(K) = C2R
4955 0 : YI(K) = C2I
4956 0 : K = K - 1
4957 0 : FN = FN - 1.0D0
4958 0 : IF (IFLAG.GE.3) GO TO 100
4959 0 : STR = DABS(C2R)
4960 0 : STI = DABS(C2I)
4961 0 : C2M = DMAX1(STR,STI)
4962 0 : IF (C2M.LE.ASCLE) GO TO 100
4963 0 : IFLAG = IFLAG + 1
4964 0 : ASCLE = BRY(IFLAG)
4965 0 : S1R = S1R*C1R
4966 0 : S1I = S1I*C1R
4967 0 : S2R = C2R
4968 0 : S2I = C2I
4969 0 : S1R = S1R*CSSR(IFLAG)
4970 0 : S1I = S1I*CSSR(IFLAG)
4971 0 : S2R = S2R*CSSR(IFLAG)
4972 0 : S2I = S2I*CSSR(IFLAG)
4973 0 : C1R = CSRR(IFLAG)
4974 0 : 100 CONTINUE
4975 : 110 CONTINUE
4976 0 : RETURN
4977 : 120 CONTINUE
4978 0 : IF (RS1.GT.0.0D0) GO TO 140
4979 : !C-----------------------------------------------------------------------
4980 : !C SET UNDERFLOW AND UPDATE PARAMETERS
4981 : !C-----------------------------------------------------------------------
4982 0 : YR(ND) = ZEROR
4983 0 : YI(ND) = ZEROI
4984 0 : NZ = NZ + 1
4985 0 : ND = ND - 1
4986 0 : IF (ND.EQ.0) GO TO 110
4987 0 : CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
4988 0 : IF (NUF.LT.0) GO TO 140
4989 0 : ND = ND - NUF
4990 0 : NZ = NZ + NUF
4991 0 : IF (ND.EQ.0) GO TO 110
4992 0 : FN = FNU + DBLE(FLOAT(ND-1))
4993 0 : IF (FN.LT.FNUL) GO TO 130
4994 : !C FN = CIDI
4995 : !C J = NUF + 1
4996 : !C K = MOD(J,4) + 1
4997 : !C S1R = CIPR(K)
4998 : !C S1I = CIPI(K)
4999 : !C IF (FN.LT.0.0D0) S1I = -S1I
5000 : !C STR = C2R*S1R - C2I*S1I
5001 : !C C2I = C2R*S1I + C2I*S1R
5002 : !C C2R = STR
5003 0 : IN = INU + ND - 1
5004 0 : IN = MOD(IN,4) + 1
5005 0 : C2R = CAR*CIPR(IN) - SAR*CIPI(IN)
5006 0 : C2I = CAR*CIPI(IN) + SAR*CIPR(IN)
5007 0 : IF (ZI.LE.0.0D0) C2I = -C2I
5008 0 : GO TO 40
5009 : 130 CONTINUE
5010 0 : NLAST = ND
5011 0 : RETURN
5012 : 140 CONTINUE
5013 0 : NZ = -1
5014 0 : RETURN
5015 : 150 CONTINUE
5016 0 : IF (RS1.GT.0.0D0) GO TO 140
5017 0 : NZ = N
5018 0 : DO 160 I=1,N
5019 0 : YR(I) = ZEROR
5020 0 : YI(I) = ZEROI
5021 0 : 160 CONTINUE
5022 : RETURN
5023 : END SUBROUTINE ZUNI2
5024 :
5025 0 : SUBROUTINE ZAIRY(ZR, ZI, ID, KODE, AIR, AII, NZ, IERR)
5026 : !C***BEGIN PROLOGUE ZAIRY
5027 : !C***DATE WRITTEN 830501 (YYMMDD)
5028 : !C***REVISION DATE 890801 (YYMMDD)
5029 : !C***CATEGORY NO. B5K
5030 : !C***KEYWORDS AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
5031 : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
5032 : !C***PURPOSE TO COMPUTE AIRY FUNCTIONS AI(Z) AND DAI(Z) FOR COMPLEX Z
5033 : !C***DESCRIPTION
5034 : !C
5035 : !C ***A DOUBLE PRECISION ROUTINE***
5036 : !C ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR
5037 : !C ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
5038 : !C KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)*
5039 : !C DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN
5040 : !C -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN
5041 : !C PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).
5042 : !C
5043 : !C WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTIC IN
5044 : !C THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED
5045 : !C FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS.
5046 : !C DEFINITIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
5047 : !C MATHEMATICAL FUNCTIONS (REF. 1).
5048 : !C
5049 : !C INPUT ZR,ZI ARE DOUBLE PRECISION
5050 : !C ZR,ZI - Z=CMPLX(ZR,ZI)
5051 : !C ID - ORDER OF DERIVATIVE, ID=0 OR ID=1
5052 : !C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
5053 : !C KODE= 1 RETURNS
5054 : !C AI=AI(Z) ON ID=0 OR
5055 : !C AI=DAI(Z)/DZ ON ID=1
5056 : !C = 2 RETURNS
5057 : !C AI=CEXP(ZTA)*AI(Z) ON ID=0 OR
5058 : !C AI=CEXP(ZTA)*DAI(Z)/DZ ON ID=1 WHERE
5059 : !C ZTA=(2/3)*Z*CSQRT(Z)
5060 : !C
5061 : !C OUTPUT AIR,AII ARE DOUBLE PRECISION
5062 : !C AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
5063 : !C KODE
5064 : !C NZ - UNDERFLOW INDICATOR
5065 : !C NZ= 0 , NORMAL RETURN
5066 : !C NZ= 1 , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN
5067 : !C -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1
5068 : !C IERR - ERROR FLAG
5069 : !C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
5070 : !C IERR=1, INPUT ERROR - NO COMPUTATION
5071 : !C IERR=2, OVERFLOW - NO COMPUTATION, REAL(ZTA)
5072 : !C TOO LARGE ON KODE=1
5073 : !C IERR=3, CABS(Z) LARGE - COMPUTATION COMPLETED
5074 : !C LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
5075 : !C PRODUCE LESS THAN HALF OF MACHINE ACCURACY
5076 : !C IERR=4, CABS(Z) TOO LARGE - NO COMPUTATION
5077 : !C COMPLETE LOSS OF ACCURACY BY ARGUMENT
5078 : !C REDUCTION
5079 : !C IERR=5, ERROR - NO COMPUTATION,
5080 : !C ALGORITHM TERMINATION CONDITION NOT MET
5081 : !C
5082 : !C***LONG DESCRIPTION
5083 : !C
5084 : !C AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL
5085 : !C FUNCTIONS BY
5086 : !C
5087 : !C AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA)
5088 : !C C=1.0/(PI*SQRT(3.0))
5089 : !C ZTA=(2/3)*Z**(3/2)
5090 : !C
5091 : !C WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
5092 : !C
5093 : !C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
5094 : !C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
5095 : !C OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
5096 : !C THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
5097 : !C THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
5098 : !C FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
5099 : !C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
5100 : !C ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
5101 : !C ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
5102 : !C FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
5103 : !C LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
5104 : !C MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
5105 : !C AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
5106 : !C PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
5107 : !C PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
5108 : !C ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
5109 : !C NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
5110 : !C DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
5111 : !C EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
5112 : !C NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
5113 : !C PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
5114 : !C MACHINES.
5115 : !C
5116 : !C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
5117 : !C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
5118 : !C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
5119 : !C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
5120 : !C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
5121 : !C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
5122 : !C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
5123 : !C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
5124 : !C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
5125 : !C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
5126 : !C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
5127 : !C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
5128 : !C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
5129 : !C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
5130 : !C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
5131 : !C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
5132 : !C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
5133 : !C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
5134 : !C OR -PI/2+P.
5135 : !C
5136 : !C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
5137 : !C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
5138 : !C COMMERCE, 1955.
5139 : !C
5140 : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
5141 : !C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
5142 : !C
5143 : !C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
5144 : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
5145 : !C 1018, MAY, 1985
5146 : !C
5147 : !C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
5148 : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
5149 : !C MATH. SOFTWARE, 1986
5150 : !C
5151 : !C***ROUTINES CALLED ZACAI,ZBKNU,AZEXP,AZSQRT,I1MACH,D1MACH
5152 : !C***END PROLOGUE ZAIRY
5153 : !C COMPLEX AI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
5154 : DOUBLE PRECISION AA, AD, AII, AIR, AK, ALIM, ATRM, AZ, AZ3, BK, &
5155 : & CC, CK, COEF, CONEI, CONER, CSQI, CSQR, CYI, CYR, C1, C2, DIG, &
5156 : & DK, D1, D2, ELIM, FID, FNU, PTR, RL, R1M5, SFAC, STI, STR, &
5157 : & S1I, S1R, S2I, S2R, TOL, TRM1I, TRM1R, TRM2I, TRM2R, TTH, ZEROI, &
5158 : & ZEROR, ZI, ZR, ZTAI, ZTAR, Z3I, Z3R, BB, ALAZ ! D1MACH, AZABS
5159 : INTEGER ID, IERR, IFLAG, K, KODE, K1, K2, MR, NN, NZ!, I1MACH
5160 : DIMENSION CYR(1), CYI(1)
5161 : DATA TTH, C1, C2, COEF /6.66666666666666667D-01, &
5162 : & 3.55028053887817240D-01,2.58819403792806799D-01, &
5163 : & 1.83776298473930683D-01/
5164 : DATA ZEROR, ZEROI, CONER, CONEI /0.0D0,0.0D0,1.0D0,0.0D0/
5165 : !C***FIRST EXECUTABLE STATEMENT ZAIRY
5166 0 : IERR = 0
5167 0 : NZ=0
5168 0 : IF (ID.LT.0 .OR. ID.GT.1) IERR=1
5169 0 : IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
5170 0 : IF (IERR.NE.0) RETURN
5171 0 : AZ = AZABS(ZR,ZI)
5172 0 : TOL = DMAX1(D1MACH(4),1.0D-18)
5173 0 : FID = DBLE(FLOAT(ID))
5174 0 : IF (AZ.GT.1.0D0) GO TO 70
5175 : !C-----------------------------------------------------------------------
5176 : !C POWER SERIES FOR CABS(Z).LE.1.
5177 : !C-----------------------------------------------------------------------
5178 0 : S1R = CONER
5179 0 : S1I = CONEI
5180 0 : S2R = CONER
5181 0 : S2I = CONEI
5182 0 : IF (AZ.LT.TOL) GO TO 170
5183 0 : AA = AZ*AZ
5184 0 : IF (AA.LT.TOL/AZ) GO TO 40
5185 0 : TRM1R = CONER
5186 0 : TRM1I = CONEI
5187 0 : TRM2R = CONER
5188 0 : TRM2I = CONEI
5189 0 : ATRM = 1.0D0
5190 0 : STR = ZR*ZR - ZI*ZI
5191 0 : STI = ZR*ZI + ZI*ZR
5192 0 : Z3R = STR*ZR - STI*ZI
5193 0 : Z3I = STR*ZI + STI*ZR
5194 0 : AZ3 = AZ*AA
5195 0 : AK = 2.0D0 + FID
5196 0 : BK = 3.0D0 - FID - FID
5197 0 : CK = 4.0D0 - FID
5198 0 : DK = 3.0D0 + FID + FID
5199 0 : D1 = AK*DK
5200 0 : D2 = BK*CK
5201 0 : AD = DMIN1(D1,D2)
5202 0 : AK = 24.0D0 + 9.0D0*FID
5203 0 : BK = 30.0D0 - 9.0D0*FID
5204 0 : DO 30 K=1,25
5205 0 : STR = (TRM1R*Z3R-TRM1I*Z3I)/D1
5206 0 : TRM1I = (TRM1R*Z3I+TRM1I*Z3R)/D1
5207 0 : TRM1R = STR
5208 0 : S1R = S1R + TRM1R
5209 0 : S1I = S1I + TRM1I
5210 0 : STR = (TRM2R*Z3R-TRM2I*Z3I)/D2
5211 0 : TRM2I = (TRM2R*Z3I+TRM2I*Z3R)/D2
5212 0 : TRM2R = STR
5213 0 : S2R = S2R + TRM2R
5214 0 : S2I = S2I + TRM2I
5215 0 : ATRM = ATRM*AZ3/AD
5216 0 : D1 = D1 + AK
5217 0 : D2 = D2 + BK
5218 0 : AD = DMIN1(D1,D2)
5219 0 : IF (ATRM.LT.TOL*AD) GO TO 40
5220 0 : AK = AK + 18.0D0
5221 0 : BK = BK + 18.0D0
5222 0 : 30 CONTINUE
5223 : 40 CONTINUE
5224 0 : IF (ID.EQ.1) GO TO 50
5225 0 : AIR = S1R*C1 - C2*(ZR*S2R-ZI*S2I)
5226 0 : AII = S1I*C1 - C2*(ZR*S2I+ZI*S2R)
5227 0 : IF (KODE.EQ.1) RETURN
5228 0 : CALL AZSQRT(ZR, ZI, STR, STI)
5229 0 : ZTAR = TTH*(ZR*STR-ZI*STI)
5230 0 : ZTAI = TTH*(ZR*STI+ZI*STR)
5231 0 : CALL AZEXP(ZTAR, ZTAI, STR, STI)
5232 0 : PTR = AIR*STR - AII*STI
5233 0 : AII = AIR*STI + AII*STR
5234 0 : AIR = PTR
5235 0 : RETURN
5236 : 50 CONTINUE
5237 0 : AIR = -S2R*C2
5238 0 : AII = -S2I*C2
5239 0 : IF (AZ.LE.TOL) GO TO 60
5240 0 : STR = ZR*S1R - ZI*S1I
5241 0 : STI = ZR*S1I + ZI*S1R
5242 0 : CC = C1/(1.0D0+FID)
5243 0 : AIR = AIR + CC*(STR*ZR-STI*ZI)
5244 0 : AII = AII + CC*(STR*ZI+STI*ZR)
5245 : 60 CONTINUE
5246 0 : IF (KODE.EQ.1) RETURN
5247 0 : CALL AZSQRT(ZR, ZI, STR, STI)
5248 0 : ZTAR = TTH*(ZR*STR-ZI*STI)
5249 0 : ZTAI = TTH*(ZR*STI+ZI*STR)
5250 0 : CALL AZEXP(ZTAR, ZTAI, STR, STI)
5251 0 : PTR = STR*AIR - STI*AII
5252 0 : AII = STR*AII + STI*AIR
5253 0 : AIR = PTR
5254 0 : RETURN
5255 : !C-----------------------------------------------------------------------
5256 : !C CASE FOR CABS(Z).GT.1.0
5257 : !C-----------------------------------------------------------------------
5258 : 70 CONTINUE
5259 0 : FNU = (1.0D0+FID)/3.0D0
5260 : !C-----------------------------------------------------------------------
5261 : !C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
5262 : !C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0D-18.
5263 : !C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
5264 : !C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
5265 : !C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
5266 : !C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
5267 : !C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
5268 : !C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
5269 : !C-----------------------------------------------------------------------
5270 0 : K1 = I1MACH(15)
5271 0 : K2 = I1MACH(16)
5272 0 : R1M5 = D1MACH(5)
5273 0 : K = MIN0(IABS(K1),IABS(K2))
5274 0 : ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
5275 0 : K1 = I1MACH(14) - 1
5276 0 : AA = R1M5*DBLE(FLOAT(K1))
5277 0 : DIG = DMIN1(AA,18.0D0)
5278 0 : AA = AA*2.303D0
5279 0 : ALIM = ELIM + DMAX1(-AA,-41.45D0)
5280 0 : RL = 1.2D0*DIG + 3.0D0
5281 0 : ALAZ = DLOG(AZ)
5282 : !C--------------------------------------------------------------------------
5283 : !C TEST FOR PROPER RANGE
5284 : !C-----------------------------------------------------------------------
5285 0 : AA=0.5D0/TOL
5286 0 : BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
5287 0 : AA=DMIN1(AA,BB)
5288 0 : AA=AA**TTH
5289 0 : IF (AZ.GT.AA) GO TO 260
5290 0 : AA=DSQRT(AA)
5291 0 : IF (AZ.GT.AA) IERR=3
5292 0 : CALL AZSQRT(ZR, ZI, CSQR, CSQI)
5293 0 : ZTAR = TTH*(ZR*CSQR-ZI*CSQI)
5294 0 : ZTAI = TTH*(ZR*CSQI+ZI*CSQR)
5295 : !C-----------------------------------------------------------------------
5296 : !C RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
5297 : !C-----------------------------------------------------------------------
5298 0 : IFLAG = 0
5299 0 : SFAC = 1.0D0
5300 0 : AK = ZTAI
5301 0 : IF (ZR.GE.0.0D0) GO TO 80
5302 0 : BK = ZTAR
5303 0 : CK = -DABS(BK)
5304 0 : ZTAR = CK
5305 0 : ZTAI = AK
5306 : 80 CONTINUE
5307 0 : IF (ZI.NE.0.0D0) GO TO 90
5308 0 : IF (ZR.GT.0.0D0) GO TO 90
5309 0 : ZTAR = 0.0D0
5310 0 : ZTAI = AK
5311 : 90 CONTINUE
5312 0 : AA = ZTAR
5313 0 : IF (AA.GE.0.0D0 .AND. ZR.GT.0.0D0) GO TO 110
5314 0 : IF (KODE.EQ.2) GO TO 100
5315 : !C-----------------------------------------------------------------------
5316 : !C OVERFLOW TEST
5317 : !C-----------------------------------------------------------------------
5318 0 : IF (AA.GT.(-ALIM)) GO TO 100
5319 0 : AA = -AA + 0.25D0*ALAZ
5320 0 : IFLAG = 1
5321 0 : SFAC = TOL
5322 0 : IF (AA.GT.ELIM) GO TO 270
5323 : 100 CONTINUE
5324 : !C-----------------------------------------------------------------------
5325 : !C CBKNU AND CACON RETURN EXP(ZTA)*K(FNU,ZTA) ON KODE=2
5326 : !C-----------------------------------------------------------------------
5327 0 : MR = 1
5328 0 : IF (ZI.LT.0.0D0) MR = -1
5329 : CALL ZACAI(ZTAR, ZTAI, FNU, KODE, MR, 1, CYR, CYI, NN, RL, TOL, &
5330 0 : & ELIM, ALIM)
5331 0 : IF (NN.LT.0) GO TO 280
5332 0 : NZ = NZ + NN
5333 0 : GO TO 130
5334 : 110 CONTINUE
5335 0 : IF (KODE.EQ.2) GO TO 120
5336 : !C-----------------------------------------------------------------------
5337 : !C UNDERFLOW TEST
5338 : !C-----------------------------------------------------------------------
5339 0 : IF (AA.LT.ALIM) GO TO 120
5340 0 : AA = -AA - 0.25D0*ALAZ
5341 0 : IFLAG = 2
5342 0 : SFAC = 1.0D0/TOL
5343 0 : IF (AA.LT.(-ELIM)) GO TO 210
5344 : 120 CONTINUE
5345 : CALL ZBKNU(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, NZ, TOL, ELIM, &
5346 0 : & ALIM)
5347 : 130 CONTINUE
5348 0 : S1R = CYR(1)*COEF
5349 0 : S1I = CYI(1)*COEF
5350 0 : IF (IFLAG.NE.0) GO TO 150
5351 0 : IF (ID.EQ.1) GO TO 140
5352 0 : AIR = CSQR*S1R - CSQI*S1I
5353 0 : AII = CSQR*S1I + CSQI*S1R
5354 0 : RETURN
5355 : 140 CONTINUE
5356 0 : AIR = -(ZR*S1R-ZI*S1I)
5357 0 : AII = -(ZR*S1I+ZI*S1R)
5358 0 : RETURN
5359 : 150 CONTINUE
5360 0 : S1R = S1R*SFAC
5361 0 : S1I = S1I*SFAC
5362 0 : IF (ID.EQ.1) GO TO 160
5363 0 : STR = S1R*CSQR - S1I*CSQI
5364 0 : S1I = S1R*CSQI + S1I*CSQR
5365 0 : S1R = STR
5366 0 : AIR = S1R/SFAC
5367 0 : AII = S1I/SFAC
5368 0 : RETURN
5369 : 160 CONTINUE
5370 0 : STR = -(S1R*ZR-S1I*ZI)
5371 0 : S1I = -(S1R*ZI+S1I*ZR)
5372 0 : S1R = STR
5373 0 : AIR = S1R/SFAC
5374 0 : AII = S1I/SFAC
5375 0 : RETURN
5376 : 170 CONTINUE
5377 0 : AA = 1.0D+3*D1MACH(1)
5378 0 : S1R = ZEROR
5379 0 : S1I = ZEROI
5380 0 : IF (ID.EQ.1) GO TO 190
5381 0 : IF (AZ.LE.AA) GO TO 180
5382 0 : S1R = C2*ZR
5383 0 : S1I = C2*ZI
5384 : 180 CONTINUE
5385 0 : AIR = C1 - S1R
5386 0 : AII = -S1I
5387 0 : RETURN
5388 : 190 CONTINUE
5389 0 : AIR = -C2
5390 : AII = 0.0D0
5391 0 : AA = DSQRT(AA)
5392 0 : IF (AZ.LE.AA) GO TO 200
5393 0 : S1R = 0.5D0*(ZR*ZR-ZI*ZI)
5394 0 : S1I = ZR*ZI
5395 : 200 CONTINUE
5396 0 : AIR = AIR + C1*S1R
5397 0 : AII = AII + C1*S1I
5398 0 : RETURN
5399 : 210 CONTINUE
5400 0 : NZ = 1
5401 0 : AIR = ZEROR
5402 0 : AII = ZEROI
5403 0 : RETURN
5404 : 270 CONTINUE
5405 0 : NZ = 0
5406 0 : IERR=2
5407 0 : RETURN
5408 : 280 CONTINUE
5409 0 : IF(NN.EQ.(-1)) GO TO 270
5410 0 : NZ=0
5411 0 : IERR=5
5412 0 : RETURN
5413 : 260 CONTINUE
5414 0 : IERR=4
5415 0 : NZ=0
5416 0 : RETURN
5417 : END SUBROUTINE ZAIRY
5418 :
5419 :
5420 0 : SUBROUTINE ZACAI(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL, &
5421 : & ELIM, ALIM)
5422 : !C***BEGIN PROLOGUE ZACAI
5423 : !C***REFER TO ZAIRY
5424 : !C
5425 : !C ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA
5426 : !C
5427 : !C K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
5428 : !C MP=PI*MR*CMPLX(0.0,1.0)
5429 : !C
5430 : !C TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
5431 : !C HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1.
5432 : !C ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND
5433 : !C RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON
5434 : !C IS CALLED FROM ZAIRY.
5435 : !C
5436 : !C***ROUTINES CALLED ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,AZABS
5437 : !C***END PROLOGUE ZACAI
5438 : !C COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY
5439 : DOUBLE PRECISION ALIM, ARG, ASCLE, AZ, CSGNR, CSGNI, CSPNR, &
5440 : & CSPNI, C1R, C1I, C2R, C2I, CYR, CYI, DFNU, ELIM, FMR, FNU, PI, &
5441 : & RL, SGN, TOL, YY, YR, YI, ZR, ZI, ZNR, ZNI!, D1MACH, AZABS
5442 : INTEGER INU, IUF, KODE, MR, N, NN, NW, NZ
5443 : DIMENSION YR(N), YI(N), CYR(2), CYI(2)
5444 : DATA PI / 3.14159265358979324D0 /
5445 0 : NZ = 0
5446 0 : ZNR = -ZR
5447 0 : ZNI = -ZI
5448 0 : AZ = AZABS(ZR,ZI)
5449 0 : NN = N
5450 0 : DFNU = FNU + DBLE(FLOAT(N-1))
5451 0 : IF (AZ.LE.2.0D0) GO TO 10
5452 0 : IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
5453 : 10 CONTINUE
5454 : !C-----------------------------------------------------------------------
5455 : !C POWER SERIES FOR THE I FUNCTION
5456 : !C-----------------------------------------------------------------------
5457 0 : CALL ZSERI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL, ELIM, ALIM)
5458 0 : GO TO 40
5459 : 20 CONTINUE
5460 0 : IF (AZ.LT.RL) GO TO 30
5461 : !C-----------------------------------------------------------------------
5462 : !C ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION
5463 : !C-----------------------------------------------------------------------
5464 : CALL ZASYI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM, &
5465 0 : & ALIM)
5466 0 : IF (NW.LT.0) GO TO 80
5467 0 : GO TO 40
5468 : 30 CONTINUE
5469 : !C-----------------------------------------------------------------------
5470 : !C MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
5471 : !C-----------------------------------------------------------------------
5472 0 : CALL ZMLRI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL)
5473 0 : IF(NW.LT.0) GO TO 80
5474 : 40 CONTINUE
5475 : !C-----------------------------------------------------------------------
5476 : !C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
5477 : !C-----------------------------------------------------------------------
5478 0 : CALL ZBKNU(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, NW, TOL, ELIM, ALIM)
5479 0 : IF (NW.NE.0) GO TO 80
5480 0 : FMR = DBLE(FLOAT(MR))
5481 0 : SGN = -DSIGN(PI,FMR)
5482 0 : CSGNR = 0.0D0
5483 0 : CSGNI = SGN
5484 0 : IF (KODE.EQ.1) GO TO 50
5485 0 : YY = -ZNI
5486 0 : CSGNR = -CSGNI*DSIN(YY)
5487 0 : CSGNI = CSGNI*DCOS(YY)
5488 : 50 CONTINUE
5489 : !C-----------------------------------------------------------------------
5490 : !C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
5491 : !C WHEN FNU IS LARGE
5492 : !C-----------------------------------------------------------------------
5493 0 : INU = INT(SNGL(FNU))
5494 0 : ARG = (FNU-DBLE(FLOAT(INU)))*SGN
5495 0 : CSPNR = DCOS(ARG)
5496 0 : CSPNI = DSIN(ARG)
5497 0 : IF (MOD(INU,2).EQ.0) GO TO 60
5498 0 : CSPNR = -CSPNR
5499 0 : CSPNI = -CSPNI
5500 : 60 CONTINUE
5501 0 : C1R = CYR(1)
5502 0 : C1I = CYI(1)
5503 0 : C2R = YR(1)
5504 0 : C2I = YI(1)
5505 0 : IF (KODE.EQ.1) GO TO 70
5506 0 : IUF = 0
5507 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
5508 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
5509 0 : NZ = NZ + NW
5510 : 70 CONTINUE
5511 0 : YR(1) = CSPNR*C1R - CSPNI*C1I + CSGNR*C2R - CSGNI*C2I
5512 0 : YI(1) = CSPNR*C1I + CSPNI*C1R + CSGNR*C2I + CSGNI*C2R
5513 0 : RETURN
5514 : 80 CONTINUE
5515 0 : NZ = -1
5516 0 : IF(NW.EQ.(-2)) NZ=-2
5517 : RETURN
5518 : END SUBROUTINE ZACAI
5519 :
5520 0 : SUBROUTINE ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NZ, ASCLE, ALIM, &
5521 : & IUF)
5522 : !C***BEGIN PROLOGUE ZS1S2
5523 : !C***REFER TO ZBESK,ZAIRY
5524 : !C
5525 : !C ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE
5526 : !C ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON-
5527 : !C TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.
5528 : !C ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF
5529 : !C MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER
5530 : !C OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE
5531 : !C PRECISION ABOVE THE UNDERFLOW LIMIT.
5532 : !C
5533 : !C***ROUTINES CALLED AZABS,AZEXP,AZLOG
5534 : !C***END PROLOGUE ZS1S2
5535 : !C COMPLEX CZERO,C1,S1,S1D,S2,ZR
5536 : DOUBLE PRECISION AA, ALIM, ALN, ASCLE, AS1, AS2, C1I, C1R, S1DI, &
5537 : & S1DR, S1I, S1R, S2I, S2R, ZEROI, ZEROR, ZRI, ZRR!, AZABS
5538 : INTEGER IUF, IDUM, NZ
5539 : DATA ZEROR,ZEROI / 0.0D0 , 0.0D0 /
5540 0 : NZ = 0
5541 0 : AS1 = AZABS(S1R,S1I)
5542 0 : AS2 = AZABS(S2R,S2I)
5543 0 : IF (S1R.EQ.0.0D0 .AND. S1I.EQ.0.0D0) GO TO 10
5544 0 : IF (AS1.EQ.0.0D0) GO TO 10
5545 0 : ALN = -ZRR - ZRR + DLOG(AS1)
5546 0 : S1DR = S1R
5547 0 : S1DI = S1I
5548 0 : S1R = ZEROR
5549 0 : S1I = ZEROI
5550 0 : AS1 = ZEROR
5551 0 : IF (ALN.LT.(-ALIM)) GO TO 10
5552 0 : CALL AZLOG(S1DR, S1DI, C1R, C1I, IDUM)
5553 0 : C1R = C1R - ZRR - ZRR
5554 0 : C1I = C1I - ZRI - ZRI
5555 0 : CALL AZEXP(C1R, C1I, S1R, S1I)
5556 0 : AS1 = AZABS(S1R,S1I)
5557 0 : IUF = IUF + 1
5558 : 10 CONTINUE
5559 0 : AA = DMAX1(AS1,AS2)
5560 0 : IF (AA.GT.ASCLE) RETURN
5561 0 : S1R = ZEROR
5562 0 : S1I = ZEROI
5563 0 : S2R = ZEROR
5564 0 : S2I = ZEROI
5565 0 : NZ = 1
5566 0 : IUF = 0
5567 0 : RETURN
5568 : END SUBROUTINE ZS1S2
5569 :
5570 0 : SUBROUTINE ZSHCH(ZR, ZI, CSHR, CSHI, CCHR, CCHI)
5571 : !C***BEGIN PROLOGUE ZSHCH
5572 : !C***REFER TO ZBESK,ZBESH
5573 : !C
5574 : !C ZSHCH COMPUTES THE COMPLEX HYPERBOLIC FUNCTIONS CSH=SINH(X+I*Y)
5575 : !C AND CCH=COSH(X+I*Y), WHERE I**2=-1.
5576 : !C
5577 : !C***ROUTINES CALLED (NONE)
5578 : !C***END PROLOGUE ZSHCH
5579 : !C
5580 : DOUBLE PRECISION CCHI, CCHR, CH, CN, CSHI, CSHR, SH, SN, ZI, ZR, &
5581 : & DCOSH, DSINH
5582 0 : SH = DSINH(ZR)
5583 0 : CH = DCOSH(ZR)
5584 0 : SN = DSIN(ZI)
5585 0 : CN = DCOS(ZI)
5586 0 : CSHR = SH*CN
5587 0 : CSHI = CH*SN
5588 0 : CCHR = CH*CN
5589 0 : CCHI = SH*SN
5590 0 : RETURN
5591 : END SUBROUTINE ZSHCH
5592 :
5593 0 : SUBROUTINE ZKSCL(ZRR,ZRI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
5594 : !C***BEGIN PROLOGUE ZKSCL
5595 : !C***REFER TO ZBESK
5596 : !C
5597 : !C SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
5598 : !C ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
5599 : !C RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
5600 : !C
5601 : !C***ROUTINES CALLED ZUCHK,AZABS,AZLOG
5602 : !C***END PROLOGUE ZKSCL
5603 : !C COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM
5604 : DOUBLE PRECISION ACS, AS, ASCLE, CKI, CKR, CSI, CSR, CYI, &
5605 : & CYR, ELIM, FN, FNU, RZI, RZR, STR, S1I, S1R, S2I, &
5606 : & S2R, TOL, YI, YR, ZEROI, ZEROR, ZRI, ZRR, & !AZABS, &
5607 : & ZDR, ZDI, CELMR, ELM, HELIM, ALAS
5608 : INTEGER I, IC, IDUM, KK, N, NN, NW, NZ
5609 : DIMENSION YR(N), YI(N), CYR(2), CYI(2)
5610 : DATA ZEROR,ZEROI / 0.0D0 , 0.0D0 /
5611 : !C
5612 0 : NZ = 0
5613 0 : IC = 0
5614 0 : NN = MIN0(2,N)
5615 0 : DO 10 I=1,NN
5616 0 : S1R = YR(I)
5617 0 : S1I = YI(I)
5618 0 : CYR(I) = S1R
5619 0 : CYI(I) = S1I
5620 0 : AS = AZABS(S1R,S1I)
5621 0 : ACS = -ZRR + DLOG(AS)
5622 0 : NZ = NZ + 1
5623 0 : YR(I) = ZEROR
5624 0 : YI(I) = ZEROI
5625 0 : IF (ACS.LT.(-ELIM)) GO TO 10
5626 0 : CALL AZLOG(S1R, S1I, CSR, CSI, IDUM)
5627 0 : CSR = CSR - ZRR
5628 0 : CSI = CSI - ZRI
5629 0 : STR = DEXP(CSR)/TOL
5630 0 : CSR = STR*DCOS(CSI)
5631 0 : CSI = STR*DSIN(CSI)
5632 0 : CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
5633 : IF (NW.NE.0) GO TO 10
5634 0 : YR(I) = CSR
5635 0 : YI(I) = CSI
5636 0 : IC = I
5637 0 : NZ = NZ - 1
5638 0 : 10 CONTINUE
5639 0 : IF (N.EQ.1) RETURN
5640 0 : IF (IC.GT.1) GO TO 20
5641 0 : YR(1) = ZEROR
5642 0 : YI(1) = ZEROI
5643 0 : NZ = 2
5644 : 20 CONTINUE
5645 0 : IF (N.EQ.2) RETURN
5646 0 : IF (NZ.EQ.0) RETURN
5647 0 : FN = FNU + 1.0D0
5648 0 : CKR = FN*RZR
5649 0 : CKI = FN*RZI
5650 0 : S1R = CYR(1)
5651 0 : S1I = CYI(1)
5652 0 : S2R = CYR(2)
5653 0 : S2I = CYI(2)
5654 0 : HELIM = 0.5D0*ELIM
5655 0 : ELM = DEXP(-ELIM)
5656 0 : CELMR = ELM
5657 0 : ZDR = ZRR
5658 0 : ZDI = ZRI
5659 : !C
5660 : !C FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
5661 : !C S2 GETS LARGER THAN EXP(ELIM/2)
5662 : !C
5663 0 : DO 30 I=3,N
5664 0 : KK = I
5665 0 : CSR = S2R
5666 0 : CSI = S2I
5667 0 : S2R = CKR*CSR - CKI*CSI + S1R
5668 0 : S2I = CKI*CSR + CKR*CSI + S1I
5669 0 : S1R = CSR
5670 0 : S1I = CSI
5671 0 : CKR = CKR + RZR
5672 0 : CKI = CKI + RZI
5673 0 : AS = AZABS(S2R,S2I)
5674 0 : ALAS = DLOG(AS)
5675 0 : ACS = -ZDR + ALAS
5676 0 : NZ = NZ + 1
5677 0 : YR(I) = ZEROR
5678 0 : YI(I) = ZEROI
5679 0 : IF (ACS.LT.(-ELIM)) GO TO 25
5680 0 : CALL AZLOG(S2R, S2I, CSR, CSI, IDUM)
5681 0 : CSR = CSR - ZDR
5682 0 : CSI = CSI - ZDI
5683 0 : STR = DEXP(CSR)/TOL
5684 0 : CSR = STR*DCOS(CSI)
5685 0 : CSI = STR*DSIN(CSI)
5686 0 : CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
5687 : IF (NW.NE.0) GO TO 25
5688 0 : YR(I) = CSR
5689 0 : YI(I) = CSI
5690 0 : NZ = NZ - 1
5691 0 : IF (IC.EQ.KK-1) GO TO 40
5692 : IC = KK
5693 0 : GO TO 30
5694 : 25 CONTINUE
5695 0 : IF(ALAS.LT.HELIM) GO TO 30
5696 0 : ZDR = ZDR - ELIM
5697 0 : S1R = S1R*CELMR
5698 0 : S1I = S1I*CELMR
5699 0 : S2R = S2R*CELMR
5700 0 : S2I = S2I*CELMR
5701 0 : 30 CONTINUE
5702 0 : NZ = N
5703 0 : IF(IC.EQ.N) NZ=N-1
5704 0 : GO TO 45
5705 : 40 CONTINUE
5706 0 : NZ = KK - 2
5707 : 45 CONTINUE
5708 0 : DO 50 I=1,NZ
5709 0 : YR(I) = ZEROR
5710 0 : YI(I) = ZEROI
5711 0 : 50 CONTINUE
5712 : RETURN
5713 : END SUBROUTINE ZKSCL
5714 :
5715 0 : SUBROUTINE ZBUNK(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
5716 : & ALIM)
5717 : !C***BEGIN PROLOGUE ZBUNK
5718 : !C***REFER TO ZBESK,ZBESH
5719 : !C
5720 : !C ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL.
5721 : !C ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR K(FNU,Z)
5722 : !C IN ZUNK1 AND THE EXPANSION FOR H(2,FNU,Z) IN ZUNK2
5723 : !C
5724 : !C***ROUTINES CALLED ZUNK1,ZUNK2
5725 : !C***END PROLOGUE ZBUNK
5726 : !C COMPLEX Y,Z
5727 : DOUBLE PRECISION ALIM, AX, AY, ELIM, FNU, TOL, YI, YR, ZI, ZR
5728 : INTEGER KODE, MR, N, NZ
5729 : DIMENSION YR(N), YI(N)
5730 0 : NZ = 0
5731 0 : AX = DABS(ZR)*1.7321D0
5732 0 : AY = DABS(ZI)
5733 0 : IF (AY.GT.AX) GO TO 10
5734 : !C-----------------------------------------------------------------------
5735 : !C ASYMPTOTIC EXPANSION FOR K(FNU,Z) FOR LARGE FNU APPLIED IN
5736 : !C -PI/3.LE.ARG(Z).LE.PI/3
5737 : !C-----------------------------------------------------------------------
5738 0 : CALL ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
5739 0 : GO TO 20
5740 : 10 CONTINUE
5741 : !C-----------------------------------------------------------------------
5742 : !C ASYMPTOTIC EXPANSION FOR H(2,FNU,Z*EXP(M*HPI)) FOR LARGE FNU
5743 : !C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
5744 : !C AND HPI=PI/2
5745 : !C-----------------------------------------------------------------------
5746 0 : CALL ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
5747 : 20 CONTINUE
5748 0 : RETURN
5749 : END SUBROUTINE ZBUNK
5750 :
5751 :
5752 0 : SUBROUTINE ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
5753 : & ALIM)
5754 : !C***BEGIN PROLOGUE ZUNK1
5755 : !C***REFER TO ZBESK
5756 : !C
5757 : !C ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
5758 : !C RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
5759 : !C UNIFORM ASYMPTOTIC EXPANSION.
5760 : !C MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
5761 : !C NZ=-1 MEANS AN OVERFLOW WILL OCCUR
5762 : !C
5763 : !C***ROUTINES CALLED ZKSCL,ZS1S2,ZUCHK,ZUNIK,D1MACH,AZABS
5764 : !C***END PROLOGUE ZUNK1
5765 : !C COMPLEX CFN,CK,CONE,CRSC,CS,CSCL,CSGN,CSPN,CSR,CSS,CWRK,CY,CZERO,
5766 : !C *C1,C2,PHI,PHID,RZ,SUM,SUMD,S1,S2,Y,Z,ZETA1,ZETA1D,ZETA2,ZETA2D,ZR
5767 : DOUBLE PRECISION ALIM, ANG, APHI, ASC, ASCLE, BRY, CKI, CKR, &
5768 : & CONER, CRSC, CSCL, CSGNI, CSPNI, CSPNR, CSR, CSRR, CSSR, &
5769 : & CWRKI, CWRKR, CYI, CYR, C1I, C1R, C2I, C2M, C2R, ELIM, FMR, FN, &
5770 : & FNF, FNU, PHIDI, PHIDR, PHII, PHIR, PI, RAST, RAZR, RS1, RZI, &
5771 : & RZR, SGN, STI, STR, SUMDI, SUMDR, SUMI, SUMR, S1I, S1R, S2I, &
5772 : & S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, &
5773 : & ZET1DI, ZET1DR, ZET2DI, ZET2DR, ZI, ZR, ZRI, ZRR!, D1MACH, AZABS
5774 : INTEGER I, IB, IFLAG, IFN, IL, INIT, INU, IUF, K, KDFLG, KFLAG, &
5775 : & KK, KODE, MR, N, NW, NZ, INITD, IC, IPARD, J, M
5776 : DIMENSION BRY(3), INIT(2), YR(N), YI(N), SUMR(2), SUMI(2), &
5777 : & ZETA1R(2), ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), &
5778 : & CWRKR(16,3), CWRKI(16,3), CSSR(3), CSRR(3), PHIR(2), PHII(2)
5779 : DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
5780 : DATA PI / 3.14159265358979324D0 /
5781 : !C
5782 0 : KDFLG = 1
5783 0 : NZ = 0
5784 : !C-----------------------------------------------------------------------
5785 : !C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
5786 : !C THE UNDERFLOW LIMIT
5787 : !C-----------------------------------------------------------------------
5788 0 : CSCL = 1.0D0/TOL
5789 0 : CRSC = TOL
5790 0 : CSSR(1) = CSCL
5791 0 : CSSR(2) = CONER
5792 0 : CSSR(3) = CRSC
5793 0 : CSRR(1) = CRSC
5794 0 : CSRR(2) = CONER
5795 0 : CSRR(3) = CSCL
5796 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
5797 0 : BRY(2) = 1.0D0/BRY(1)
5798 0 : BRY(3) = D1MACH(2)
5799 0 : ZRR = ZR
5800 0 : ZRI = ZI
5801 0 : IF (ZR.GE.0.0D0) GO TO 10
5802 0 : ZRR = -ZR
5803 0 : ZRI = -ZI
5804 : 10 CONTINUE
5805 0 : J = 2
5806 0 : DO 70 I=1,N
5807 : !C-----------------------------------------------------------------------
5808 : !C J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
5809 : !C-----------------------------------------------------------------------
5810 0 : J = 3 - J
5811 0 : FN = FNU + DBLE(FLOAT(I-1))
5812 0 : INIT(J) = 0
5813 : CALL ZUNIK(ZRR, ZRI, FN, 2, 0, TOL, INIT(J), PHIR(J), PHII(J), &
5814 : & ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), SUMR(J), SUMI(J), &
5815 0 : & CWRKR(1,J), CWRKI(1,J))
5816 0 : IF (KODE.EQ.1) GO TO 20
5817 0 : STR = ZRR + ZETA2R(J)
5818 0 : STI = ZRI + ZETA2I(J)
5819 0 : RAST = FN/AZABS(STR,STI)
5820 0 : STR = STR*RAST*RAST
5821 0 : STI = -STI*RAST*RAST
5822 0 : S1R = ZETA1R(J) - STR
5823 0 : S1I = ZETA1I(J) - STI
5824 0 : GO TO 30
5825 : 20 CONTINUE
5826 0 : S1R = ZETA1R(J) - ZETA2R(J)
5827 0 : S1I = ZETA1I(J) - ZETA2I(J)
5828 : 30 CONTINUE
5829 0 : RS1 = S1R
5830 : !C-----------------------------------------------------------------------
5831 : !C TEST FOR UNDERFLOW AND OVERFLOW
5832 : !C-----------------------------------------------------------------------
5833 0 : IF (DABS(RS1).GT.ELIM) GO TO 60
5834 0 : IF (KDFLG.EQ.1) KFLAG = 2
5835 0 : IF (DABS(RS1).LT.ALIM) GO TO 40
5836 : !C-----------------------------------------------------------------------
5837 : !C REFINE TEST AND SCALE
5838 : !C-----------------------------------------------------------------------
5839 0 : APHI = AZABS(PHIR(J),PHII(J))
5840 0 : RS1 = RS1 + DLOG(APHI)
5841 0 : IF (DABS(RS1).GT.ELIM) GO TO 60
5842 0 : IF (KDFLG.EQ.1) KFLAG = 1
5843 0 : IF (RS1.LT.0.0D0) GO TO 40
5844 0 : IF (KDFLG.EQ.1) KFLAG = 3
5845 : 40 CONTINUE
5846 : !C-----------------------------------------------------------------------
5847 : !C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
5848 : !C EXPONENT EXTREMES
5849 : !C-----------------------------------------------------------------------
5850 0 : S2R = PHIR(J)*SUMR(J) - PHII(J)*SUMI(J)
5851 0 : S2I = PHIR(J)*SUMI(J) + PHII(J)*SUMR(J)
5852 0 : STR = DEXP(S1R)*CSSR(KFLAG)
5853 0 : S1R = STR*DCOS(S1I)
5854 0 : S1I = STR*DSIN(S1I)
5855 0 : STR = S2R*S1R - S2I*S1I
5856 0 : S2I = S1R*S2I + S2R*S1I
5857 0 : S2R = STR
5858 0 : IF (KFLAG.NE.1) GO TO 50
5859 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
5860 0 : IF (NW.NE.0) GO TO 60
5861 : 50 CONTINUE
5862 0 : CYR(KDFLG) = S2R
5863 0 : CYI(KDFLG) = S2I
5864 0 : YR(I) = S2R*CSRR(KFLAG)
5865 0 : YI(I) = S2I*CSRR(KFLAG)
5866 0 : IF (KDFLG.EQ.2) GO TO 75
5867 : KDFLG = 2
5868 0 : GO TO 70
5869 : 60 CONTINUE
5870 0 : IF (RS1.GT.0.0D0) GO TO 300
5871 : !C-----------------------------------------------------------------------
5872 : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
5873 : !C-----------------------------------------------------------------------
5874 0 : IF (ZR.LT.0.0D0) GO TO 300
5875 0 : KDFLG = 1
5876 0 : YR(I)=ZEROR
5877 0 : YI(I)=ZEROI
5878 0 : NZ=NZ+1
5879 0 : IF (I.EQ.1) GO TO 70
5880 0 : IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 70
5881 0 : YR(I-1)=ZEROR
5882 0 : YI(I-1)=ZEROI
5883 0 : NZ=NZ+1
5884 0 : 70 CONTINUE
5885 0 : I = N
5886 : 75 CONTINUE
5887 0 : RAZR = 1.0D0/AZABS(ZRR,ZRI)
5888 0 : STR = ZRR*RAZR
5889 0 : STI = -ZRI*RAZR
5890 0 : RZR = (STR+STR)*RAZR
5891 0 : RZI = (STI+STI)*RAZR
5892 0 : CKR = FN*RZR
5893 0 : CKI = FN*RZI
5894 0 : IB = I + 1
5895 0 : IF (N.LT.IB) GO TO 160
5896 : !C-----------------------------------------------------------------------
5897 : !C TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
5898 : !C ON UNDERFLOW.
5899 : !C-----------------------------------------------------------------------
5900 0 : FN = FNU + DBLE(FLOAT(N-1))
5901 0 : IPARD = 1
5902 0 : IF (MR.NE.0) IPARD = 0
5903 0 : INITD = 0
5904 : CALL ZUNIK(ZRR, ZRI, FN, 2, IPARD, TOL, INITD, PHIDR, PHIDI, &
5905 : & ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, CWRKR(1,3), &
5906 0 : & CWRKI(1,3))
5907 0 : IF (KODE.EQ.1) GO TO 80
5908 0 : STR = ZRR + ZET2DR
5909 0 : STI = ZRI + ZET2DI
5910 0 : RAST = FN/AZABS(STR,STI)
5911 0 : STR = STR*RAST*RAST
5912 0 : STI = -STI*RAST*RAST
5913 0 : S1R = ZET1DR - STR
5914 0 : S1I = ZET1DI - STI
5915 0 : GO TO 90
5916 : 80 CONTINUE
5917 0 : S1R = ZET1DR - ZET2DR
5918 0 : S1I = ZET1DI - ZET2DI
5919 : 90 CONTINUE
5920 0 : RS1 = S1R
5921 0 : IF (DABS(RS1).GT.ELIM) GO TO 95
5922 0 : IF (DABS(RS1).LT.ALIM) GO TO 100
5923 : !C----------------------------------------------------------------------------
5924 : !C REFINE ESTIMATE AND TEST
5925 : !C-------------------------------------------------------------------------
5926 0 : APHI = AZABS(PHIDR,PHIDI)
5927 0 : RS1 = RS1+DLOG(APHI)
5928 0 : IF (DABS(RS1).LT.ELIM) GO TO 100
5929 : 95 CONTINUE
5930 0 : IF (DABS(RS1).GT.0.0D0) GO TO 300
5931 : !C-----------------------------------------------------------------------
5932 : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
5933 : !C-----------------------------------------------------------------------
5934 0 : IF (ZR.LT.0.0D0) GO TO 300
5935 0 : NZ = N
5936 0 : DO 96 I=1,N
5937 0 : YR(I) = ZEROR
5938 0 : YI(I) = ZEROI
5939 0 : 96 CONTINUE
5940 0 : RETURN
5941 : !C---------------------------------------------------------------------------
5942 : !C FORWARD RECUR FOR REMAINDER OF THE SEQUENCE
5943 : !C----------------------------------------------------------------------------
5944 : 100 CONTINUE
5945 0 : S1R = CYR(1)
5946 0 : S1I = CYI(1)
5947 0 : S2R = CYR(2)
5948 0 : S2I = CYI(2)
5949 0 : C1R = CSRR(KFLAG)
5950 0 : ASCLE = BRY(KFLAG)
5951 0 : DO 120 I=IB,N
5952 0 : C2R = S2R
5953 0 : C2I = S2I
5954 0 : S2R = CKR*C2R - CKI*C2I + S1R
5955 0 : S2I = CKR*C2I + CKI*C2R + S1I
5956 0 : S1R = C2R
5957 0 : S1I = C2I
5958 0 : CKR = CKR + RZR
5959 0 : CKI = CKI + RZI
5960 0 : C2R = S2R*C1R
5961 0 : C2I = S2I*C1R
5962 0 : YR(I) = C2R
5963 0 : YI(I) = C2I
5964 0 : IF (KFLAG.GE.3) GO TO 120
5965 0 : STR = DABS(C2R)
5966 0 : STI = DABS(C2I)
5967 0 : C2M = DMAX1(STR,STI)
5968 0 : IF (C2M.LE.ASCLE) GO TO 120
5969 0 : KFLAG = KFLAG + 1
5970 0 : ASCLE = BRY(KFLAG)
5971 0 : S1R = S1R*C1R
5972 0 : S1I = S1I*C1R
5973 : S2R = C2R
5974 : S2I = C2I
5975 0 : S1R = S1R*CSSR(KFLAG)
5976 0 : S1I = S1I*CSSR(KFLAG)
5977 0 : S2R = S2R*CSSR(KFLAG)
5978 0 : S2I = S2I*CSSR(KFLAG)
5979 0 : C1R = CSRR(KFLAG)
5980 0 : 120 CONTINUE
5981 : 160 CONTINUE
5982 0 : IF (MR.EQ.0) RETURN
5983 : !C-----------------------------------------------------------------------
5984 : !C ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
5985 : !C-----------------------------------------------------------------------
5986 0 : NZ = 0
5987 0 : FMR = DBLE(FLOAT(MR))
5988 0 : SGN = -DSIGN(PI,FMR)
5989 : !C-----------------------------------------------------------------------
5990 : !C CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
5991 : !C-----------------------------------------------------------------------
5992 0 : CSGNI = SGN
5993 0 : INU = INT(SNGL(FNU))
5994 0 : FNF = FNU - DBLE(FLOAT(INU))
5995 0 : IFN = INU + N - 1
5996 0 : ANG = FNF*SGN
5997 0 : CSPNR = DCOS(ANG)
5998 0 : CSPNI = DSIN(ANG)
5999 0 : IF (MOD(IFN,2).EQ.0) GO TO 170
6000 0 : CSPNR = -CSPNR
6001 0 : CSPNI = -CSPNI
6002 : 170 CONTINUE
6003 0 : ASC = BRY(1)
6004 0 : IUF = 0
6005 0 : KK = N
6006 0 : KDFLG = 1
6007 0 : IB = IB - 1
6008 0 : IC = IB - 1
6009 0 : DO 270 K=1,N
6010 0 : FN = FNU + DBLE(FLOAT(KK-1))
6011 : !C-----------------------------------------------------------------------
6012 : !C LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
6013 : !C FUNCTION ABOVE
6014 : !C-----------------------------------------------------------------------
6015 0 : M=3
6016 0 : IF (N.GT.2) GO TO 175
6017 : 172 CONTINUE
6018 0 : INITD = INIT(J)
6019 0 : PHIDR = PHIR(J)
6020 0 : PHIDI = PHII(J)
6021 0 : ZET1DR = ZETA1R(J)
6022 0 : ZET1DI = ZETA1I(J)
6023 0 : ZET2DR = ZETA2R(J)
6024 0 : ZET2DI = ZETA2I(J)
6025 0 : SUMDR = SUMR(J)
6026 0 : SUMDI = SUMI(J)
6027 0 : M = J
6028 0 : J = 3 - J
6029 0 : GO TO 180
6030 : 175 CONTINUE
6031 0 : IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 180
6032 0 : IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
6033 0 : INITD = 0
6034 : 180 CONTINUE
6035 : CALL ZUNIK(ZRR, ZRI, FN, 1, 0, TOL, INITD, PHIDR, PHIDI, &
6036 : & ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, &
6037 0 : & CWRKR(1,M), CWRKI(1,M))
6038 0 : IF (KODE.EQ.1) GO TO 200
6039 0 : STR = ZRR + ZET2DR
6040 0 : STI = ZRI + ZET2DI
6041 0 : RAST = FN/AZABS(STR,STI)
6042 0 : STR = STR*RAST*RAST
6043 0 : STI = -STI*RAST*RAST
6044 0 : S1R = -ZET1DR + STR
6045 0 : S1I = -ZET1DI + STI
6046 0 : GO TO 210
6047 : 200 CONTINUE
6048 0 : S1R = -ZET1DR + ZET2DR
6049 0 : S1I = -ZET1DI + ZET2DI
6050 : 210 CONTINUE
6051 : !C-----------------------------------------------------------------------
6052 : !C TEST FOR UNDERFLOW AND OVERFLOW
6053 : !C-----------------------------------------------------------------------
6054 0 : RS1 = S1R
6055 0 : IF (DABS(RS1).GT.ELIM) GO TO 260
6056 0 : IF (KDFLG.EQ.1) IFLAG = 2
6057 0 : IF (DABS(RS1).LT.ALIM) GO TO 220
6058 : !C-----------------------------------------------------------------------
6059 : !C REFINE TEST AND SCALE
6060 : !C-----------------------------------------------------------------------
6061 0 : APHI = AZABS(PHIDR,PHIDI)
6062 0 : RS1 = RS1 + DLOG(APHI)
6063 0 : IF (DABS(RS1).GT.ELIM) GO TO 260
6064 0 : IF (KDFLG.EQ.1) IFLAG = 1
6065 0 : IF (RS1.LT.0.0D0) GO TO 220
6066 0 : IF (KDFLG.EQ.1) IFLAG = 3
6067 : 220 CONTINUE
6068 0 : STR = PHIDR*SUMDR - PHIDI*SUMDI
6069 0 : STI = PHIDR*SUMDI + PHIDI*SUMDR
6070 0 : S2R = -CSGNI*STI
6071 0 : S2I = CSGNI*STR
6072 0 : STR = DEXP(S1R)*CSSR(IFLAG)
6073 0 : S1R = STR*DCOS(S1I)
6074 0 : S1I = STR*DSIN(S1I)
6075 0 : STR = S2R*S1R - S2I*S1I
6076 0 : S2I = S2R*S1I + S2I*S1R
6077 0 : S2R = STR
6078 0 : IF (IFLAG.NE.1) GO TO 230
6079 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
6080 0 : IF (NW.EQ.0) GO TO 230
6081 0 : S2R = ZEROR
6082 0 : S2I = ZEROI
6083 : 230 CONTINUE
6084 0 : CYR(KDFLG) = S2R
6085 0 : CYI(KDFLG) = S2I
6086 0 : C2R = S2R
6087 0 : C2I = S2I
6088 0 : S2R = S2R*CSRR(IFLAG)
6089 0 : S2I = S2I*CSRR(IFLAG)
6090 : !C-----------------------------------------------------------------------
6091 : !C ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
6092 : !C-----------------------------------------------------------------------
6093 0 : S1R = YR(KK)
6094 0 : S1I = YI(KK)
6095 0 : IF (KODE.EQ.1) GO TO 250
6096 0 : CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
6097 0 : NZ = NZ + NW
6098 : 250 CONTINUE
6099 0 : YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
6100 0 : YI(KK) = CSPNR*S1I + CSPNI*S1R + S2I
6101 0 : KK = KK - 1
6102 0 : CSPNR = -CSPNR
6103 0 : CSPNI = -CSPNI
6104 0 : IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
6105 : KDFLG = 1
6106 0 : GO TO 270
6107 : 255 CONTINUE
6108 0 : IF (KDFLG.EQ.2) GO TO 275
6109 : KDFLG = 2
6110 0 : GO TO 270
6111 : 260 CONTINUE
6112 0 : IF (RS1.GT.0.0D0) GO TO 300
6113 0 : S2R = ZEROR
6114 0 : S2I = ZEROI
6115 0 : GO TO 230
6116 0 : 270 CONTINUE
6117 0 : K = N
6118 : 275 CONTINUE
6119 0 : IL = N - K
6120 0 : IF (IL.EQ.0) RETURN
6121 : !C-----------------------------------------------------------------------
6122 : !C RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
6123 : !C K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
6124 : !C INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
6125 : !C-----------------------------------------------------------------------
6126 0 : S1R = CYR(1)
6127 0 : S1I = CYI(1)
6128 0 : S2R = CYR(2)
6129 0 : S2I = CYI(2)
6130 0 : CSR = CSRR(IFLAG)
6131 0 : ASCLE = BRY(IFLAG)
6132 0 : FN = DBLE(FLOAT(INU+IL))
6133 0 : DO 290 I=1,IL
6134 0 : C2R = S2R
6135 0 : C2I = S2I
6136 0 : S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
6137 0 : S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
6138 0 : S1R = C2R
6139 0 : S1I = C2I
6140 0 : FN = FN - 1.0D0
6141 0 : C2R = S2R*CSR
6142 0 : C2I = S2I*CSR
6143 0 : CKR = C2R
6144 0 : CKI = C2I
6145 0 : C1R = YR(KK)
6146 0 : C1I = YI(KK)
6147 0 : IF (KODE.EQ.1) GO TO 280
6148 0 : CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
6149 0 : NZ = NZ + NW
6150 : 280 CONTINUE
6151 0 : YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
6152 0 : YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
6153 0 : KK = KK - 1
6154 0 : CSPNR = -CSPNR
6155 0 : CSPNI = -CSPNI
6156 0 : IF (IFLAG.GE.3) GO TO 290
6157 0 : C2R = DABS(CKR)
6158 0 : C2I = DABS(CKI)
6159 0 : C2M = DMAX1(C2R,C2I)
6160 0 : IF (C2M.LE.ASCLE) GO TO 290
6161 0 : IFLAG = IFLAG + 1
6162 0 : ASCLE = BRY(IFLAG)
6163 0 : S1R = S1R*CSR
6164 0 : S1I = S1I*CSR
6165 : S2R = CKR
6166 : S2I = CKI
6167 0 : S1R = S1R*CSSR(IFLAG)
6168 0 : S1I = S1I*CSSR(IFLAG)
6169 0 : S2R = S2R*CSSR(IFLAG)
6170 0 : S2I = S2I*CSSR(IFLAG)
6171 0 : CSR = CSRR(IFLAG)
6172 0 : 290 CONTINUE
6173 0 : RETURN
6174 : 300 CONTINUE
6175 0 : NZ = -1
6176 0 : RETURN
6177 : END SUBROUTINE ZUNK1
6178 :
6179 0 : SUBROUTINE ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
6180 : & ALIM)
6181 : !C***BEGIN PROLOGUE ZUNK2
6182 : !C***REFER TO ZBESK
6183 : !C
6184 : !C ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
6185 : !C RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
6186 : !C UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN)
6187 : !C WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR
6188 : !C -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT
6189 : !C HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC-
6190 : !C ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
6191 : !C NZ=-1 MEANS AN OVERFLOW WILL OCCUR
6192 : !C
6193 : !C***ROUTINES CALLED ZAIRY,ZKSCL,ZS1S2,ZUCHK,ZUNHJ,D1MACH,AZABS
6194 : !C***END PROLOGUE ZUNK2
6195 : !C COMPLEX AI,ARG,ARGD,ASUM,ASUMD,BSUM,BSUMD,CFN,CI,CIP,CK,CONE,CRSC,
6196 : !C *CR1,CR2,CS,CSCL,CSGN,CSPN,CSR,CSS,CY,CZERO,C1,C2,DAI,PHI,PHID,RZ,
6197 : !C *S1,S2,Y,Z,ZB,ZETA1,ZETA1D,ZETA2,ZETA2D,ZN,ZR
6198 : DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGDI, &
6199 : & ARGDR, ARGI, ARGR, ASC, ASCLE, ASUMDI, ASUMDR, ASUMI, ASUMR, &
6200 : & BRY, BSUMDI, BSUMDR, BSUMI, BSUMR, CAR, CIPI, CIPR, CKI, CKR, &
6201 : & CONER, CRSC, CR1I, CR1R, CR2I, CR2R, CSCL, CSGNI, CSI, &
6202 : & CSPNI, CSPNR, CSR, CSRR, CSSR, CYI, CYR, C1I, C1R, C2I, C2M, &
6203 : & C2R, DAII, DAIR, ELIM, FMR, FN, FNF, FNU, HPI, PHIDI, PHIDR, &
6204 : & PHII, PHIR, PI, PTI, PTR, RAST, RAZR, RS1, RZI, RZR, SAR, SGN, &
6205 : & STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, YY, ZBI, ZBR, ZEROI, &
6206 : & ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZET1DI, ZET1DR, ZET2DI, &
6207 : & ZET2DR, ZI, ZNI, ZNR, ZR, ZRI, ZRR!, D1MACH, AZABS
6208 : INTEGER I, IB, IFLAG, IFN, IL, IN, INU, IUF, K, KDFLG, KFLAG, KK, &
6209 : & KODE, MR, N, NAI, NDAI, NW, NZ, IDUM, J, IPARD, IC
6210 : DIMENSION BRY(3), YR(N), YI(N), ASUMR(2), ASUMI(2), BSUMR(2), &
6211 : & BSUMI(2), PHIR(2), PHII(2), ARGR(2), ARGI(2), ZETA1R(2), &
6212 : & ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), CIPR(4), &
6213 : & CIPI(4), CSSR(3), CSRR(3)
6214 : DATA ZEROR,ZEROI,CONER,CR1R,CR1I,CR2R,CR2I / &
6215 : & 0.0D0, 0.0D0, 1.0D0, &
6216 : & 1.0D0,1.73205080756887729D0 , -0.5D0,-8.66025403784438647D-01 /
6217 : DATA HPI, PI, AIC / &
6218 : & 1.57079632679489662D+00, 3.14159265358979324D+00, &
6219 : & 1.26551212348464539D+00/
6220 : DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4), &
6221 : & CIPI(4) / &
6222 : & 1.0D0,0.0D0 , 0.0D0,-1.0D0 , -1.0D0,0.0D0 , 0.0D0,1.0D0 /
6223 : !C
6224 0 : KDFLG = 1
6225 0 : NZ = 0
6226 : !C-----------------------------------------------------------------------
6227 : !C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
6228 : !C THE UNDERFLOW LIMIT
6229 : !C-----------------------------------------------------------------------
6230 0 : CSCL = 1.0D0/TOL
6231 0 : CRSC = TOL
6232 0 : CSSR(1) = CSCL
6233 0 : CSSR(2) = CONER
6234 0 : CSSR(3) = CRSC
6235 0 : CSRR(1) = CRSC
6236 0 : CSRR(2) = CONER
6237 0 : CSRR(3) = CSCL
6238 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
6239 0 : BRY(2) = 1.0D0/BRY(1)
6240 0 : BRY(3) = D1MACH(2)
6241 0 : ZRR = ZR
6242 0 : ZRI = ZI
6243 0 : IF (ZR.GE.0.0D0) GO TO 10
6244 0 : ZRR = -ZR
6245 0 : ZRI = -ZI
6246 : 10 CONTINUE
6247 0 : YY = ZRI
6248 0 : ZNR = ZRI
6249 0 : ZNI = -ZRR
6250 0 : ZBR = ZRR
6251 0 : ZBI = ZRI
6252 0 : INU = INT(SNGL(FNU))
6253 0 : FNF = FNU - DBLE(FLOAT(INU))
6254 0 : ANG = -HPI*FNF
6255 0 : CAR = DCOS(ANG)
6256 0 : SAR = DSIN(ANG)
6257 0 : C2R = HPI*SAR
6258 0 : C2I = -HPI*CAR
6259 0 : KK = MOD(INU,4) + 1
6260 0 : STR = C2R*CIPR(KK) - C2I*CIPI(KK)
6261 0 : STI = C2R*CIPI(KK) + C2I*CIPR(KK)
6262 0 : CSR = CR1R*STR - CR1I*STI
6263 0 : CSI = CR1R*STI + CR1I*STR
6264 0 : IF (YY.GT.0.0D0) GO TO 20
6265 0 : ZNR = -ZNR
6266 0 : ZBI = -ZBI
6267 : 20 CONTINUE
6268 : !C-----------------------------------------------------------------------
6269 : !C K(FNU,Z) IS COMPUTED FROM H(2,FNU,-I*Z) WHERE Z IS IN THE FIRST
6270 : !C QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
6271 : !C CONJUGATION SINCE THE K FUNCTION IS REAL ON THE POSITIVE REAL AXIS
6272 : !C-----------------------------------------------------------------------
6273 0 : J = 2
6274 0 : DO 80 I=1,N
6275 : !C-----------------------------------------------------------------------
6276 : !C J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
6277 : !C-----------------------------------------------------------------------
6278 0 : J = 3 - J
6279 0 : FN = FNU + DBLE(FLOAT(I-1))
6280 : CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR(J), PHII(J), ARGR(J), &
6281 : & ARGI(J), ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), ASUMR(J), &
6282 0 : & ASUMI(J), BSUMR(J), BSUMI(J))
6283 0 : IF (KODE.EQ.1) GO TO 30
6284 0 : STR = ZBR + ZETA2R(J)
6285 0 : STI = ZBI + ZETA2I(J)
6286 0 : RAST = FN/AZABS(STR,STI)
6287 0 : STR = STR*RAST*RAST
6288 0 : STI = -STI*RAST*RAST
6289 0 : S1R = ZETA1R(J) - STR
6290 0 : S1I = ZETA1I(J) - STI
6291 0 : GO TO 40
6292 : 30 CONTINUE
6293 0 : S1R = ZETA1R(J) - ZETA2R(J)
6294 0 : S1I = ZETA1I(J) - ZETA2I(J)
6295 : 40 CONTINUE
6296 : !C-----------------------------------------------------------------------
6297 : !C TEST FOR UNDERFLOW AND OVERFLOW
6298 : !C-----------------------------------------------------------------------
6299 0 : RS1 = S1R
6300 0 : IF (DABS(RS1).GT.ELIM) GO TO 70
6301 0 : IF (KDFLG.EQ.1) KFLAG = 2
6302 0 : IF (DABS(RS1).LT.ALIM) GO TO 50
6303 : !C-----------------------------------------------------------------------
6304 : !C REFINE TEST AND SCALE
6305 : !C-----------------------------------------------------------------------
6306 0 : APHI = AZABS(PHIR(J),PHII(J))
6307 0 : AARG = AZABS(ARGR(J),ARGI(J))
6308 0 : RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
6309 0 : IF (DABS(RS1).GT.ELIM) GO TO 70
6310 0 : IF (KDFLG.EQ.1) KFLAG = 1
6311 0 : IF (RS1.LT.0.0D0) GO TO 50
6312 0 : IF (KDFLG.EQ.1) KFLAG = 3
6313 : 50 CONTINUE
6314 : !C-----------------------------------------------------------------------
6315 : !C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
6316 : !C EXPONENT EXTREMES
6317 : !C-----------------------------------------------------------------------
6318 0 : C2R = ARGR(J)*CR2R - ARGI(J)*CR2I
6319 0 : C2I = ARGR(J)*CR2I + ARGI(J)*CR2R
6320 0 : CALL ZAIRY(C2R, C2I, 0, 2, AIR, AII, NAI, IDUM)
6321 0 : CALL ZAIRY(C2R, C2I, 1, 2, DAIR, DAII, NDAI, IDUM)
6322 0 : STR = DAIR*BSUMR(J) - DAII*BSUMI(J)
6323 0 : STI = DAIR*BSUMI(J) + DAII*BSUMR(J)
6324 0 : PTR = STR*CR2R - STI*CR2I
6325 0 : PTI = STR*CR2I + STI*CR2R
6326 0 : STR = PTR + (AIR*ASUMR(J)-AII*ASUMI(J))
6327 0 : STI = PTI + (AIR*ASUMI(J)+AII*ASUMR(J))
6328 0 : PTR = STR*PHIR(J) - STI*PHII(J)
6329 0 : PTI = STR*PHII(J) + STI*PHIR(J)
6330 0 : S2R = PTR*CSR - PTI*CSI
6331 0 : S2I = PTR*CSI + PTI*CSR
6332 0 : STR = DEXP(S1R)*CSSR(KFLAG)
6333 0 : S1R = STR*DCOS(S1I)
6334 0 : S1I = STR*DSIN(S1I)
6335 0 : STR = S2R*S1R - S2I*S1I
6336 0 : S2I = S1R*S2I + S2R*S1I
6337 0 : S2R = STR
6338 0 : IF (KFLAG.NE.1) GO TO 60
6339 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
6340 0 : IF (NW.NE.0) GO TO 70
6341 : 60 CONTINUE
6342 0 : IF (YY.LE.0.0D0) S2I = -S2I
6343 0 : CYR(KDFLG) = S2R
6344 0 : CYI(KDFLG) = S2I
6345 0 : YR(I) = S2R*CSRR(KFLAG)
6346 0 : YI(I) = S2I*CSRR(KFLAG)
6347 0 : STR = CSI
6348 0 : CSI = -CSR
6349 0 : CSR = STR
6350 0 : IF (KDFLG.EQ.2) GO TO 85
6351 : KDFLG = 2
6352 0 : GO TO 80
6353 : 70 CONTINUE
6354 0 : IF (RS1.GT.0.0D0) GO TO 320
6355 : !C-----------------------------------------------------------------------
6356 : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
6357 : !C-----------------------------------------------------------------------
6358 0 : IF (ZR.LT.0.0D0) GO TO 320
6359 0 : KDFLG = 1
6360 0 : YR(I)=ZEROR
6361 0 : YI(I)=ZEROI
6362 0 : NZ=NZ+1
6363 0 : STR = CSI
6364 0 : CSI =-CSR
6365 0 : CSR = STR
6366 0 : IF (I.EQ.1) GO TO 80
6367 0 : IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 80
6368 0 : YR(I-1)=ZEROR
6369 0 : YI(I-1)=ZEROI
6370 0 : NZ=NZ+1
6371 0 : 80 CONTINUE
6372 0 : I = N
6373 : 85 CONTINUE
6374 0 : RAZR = 1.0D0/AZABS(ZRR,ZRI)
6375 0 : STR = ZRR*RAZR
6376 0 : STI = -ZRI*RAZR
6377 0 : RZR = (STR+STR)*RAZR
6378 0 : RZI = (STI+STI)*RAZR
6379 0 : CKR = FN*RZR
6380 0 : CKI = FN*RZI
6381 0 : IB = I + 1
6382 0 : IF (N.LT.IB) GO TO 180
6383 : !C-----------------------------------------------------------------------
6384 : !C TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
6385 : !C ON UNDERFLOW.
6386 : !C-----------------------------------------------------------------------
6387 0 : FN = FNU + DBLE(FLOAT(N-1))
6388 0 : IPARD = 1
6389 0 : IF (MR.NE.0) IPARD = 0
6390 : CALL ZUNHJ(ZNR, ZNI, FN, IPARD, TOL, PHIDR, PHIDI, ARGDR, ARGDI, &
6391 0 : & ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, ASUMDI, BSUMDR, BSUMDI)
6392 0 : IF (KODE.EQ.1) GO TO 90
6393 0 : STR = ZBR + ZET2DR
6394 0 : STI = ZBI + ZET2DI
6395 0 : RAST = FN/AZABS(STR,STI)
6396 0 : STR = STR*RAST*RAST
6397 0 : STI = -STI*RAST*RAST
6398 0 : S1R = ZET1DR - STR
6399 0 : S1I = ZET1DI - STI
6400 0 : GO TO 100
6401 : 90 CONTINUE
6402 0 : S1R = ZET1DR - ZET2DR
6403 0 : S1I = ZET1DI - ZET2DI
6404 : 100 CONTINUE
6405 0 : RS1 = S1R
6406 0 : IF (DABS(RS1).GT.ELIM) GO TO 105
6407 0 : IF (DABS(RS1).LT.ALIM) GO TO 120
6408 : !C----------------------------------------------------------------------------
6409 : !C REFINE ESTIMATE AND TEST
6410 : !C-------------------------------------------------------------------------
6411 0 : APHI = AZABS(PHIDR,PHIDI)
6412 0 : RS1 = RS1+DLOG(APHI)
6413 0 : IF (DABS(RS1).LT.ELIM) GO TO 120
6414 : 105 CONTINUE
6415 0 : IF (RS1.GT.0.0D0) GO TO 320
6416 : !C-----------------------------------------------------------------------
6417 : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
6418 : !C-----------------------------------------------------------------------
6419 0 : IF (ZR.LT.0.0D0) GO TO 320
6420 0 : NZ = N
6421 0 : DO 106 I=1,N
6422 0 : YR(I) = ZEROR
6423 0 : YI(I) = ZEROI
6424 0 : 106 CONTINUE
6425 0 : RETURN
6426 : 120 CONTINUE
6427 0 : S1R = CYR(1)
6428 0 : S1I = CYI(1)
6429 0 : S2R = CYR(2)
6430 0 : S2I = CYI(2)
6431 0 : C1R = CSRR(KFLAG)
6432 0 : ASCLE = BRY(KFLAG)
6433 0 : DO 130 I=IB,N
6434 0 : C2R = S2R
6435 0 : C2I = S2I
6436 0 : S2R = CKR*C2R - CKI*C2I + S1R
6437 0 : S2I = CKR*C2I + CKI*C2R + S1I
6438 0 : S1R = C2R
6439 0 : S1I = C2I
6440 0 : CKR = CKR + RZR
6441 0 : CKI = CKI + RZI
6442 0 : C2R = S2R*C1R
6443 0 : C2I = S2I*C1R
6444 0 : YR(I) = C2R
6445 0 : YI(I) = C2I
6446 0 : IF (KFLAG.GE.3) GO TO 130
6447 0 : STR = DABS(C2R)
6448 0 : STI = DABS(C2I)
6449 0 : C2M = DMAX1(STR,STI)
6450 0 : IF (C2M.LE.ASCLE) GO TO 130
6451 0 : KFLAG = KFLAG + 1
6452 0 : ASCLE = BRY(KFLAG)
6453 0 : S1R = S1R*C1R
6454 0 : S1I = S1I*C1R
6455 : S2R = C2R
6456 : S2I = C2I
6457 0 : S1R = S1R*CSSR(KFLAG)
6458 0 : S1I = S1I*CSSR(KFLAG)
6459 0 : S2R = S2R*CSSR(KFLAG)
6460 0 : S2I = S2I*CSSR(KFLAG)
6461 0 : C1R = CSRR(KFLAG)
6462 0 : 130 CONTINUE
6463 : 180 CONTINUE
6464 0 : IF (MR.EQ.0) RETURN
6465 : !C-----------------------------------------------------------------------
6466 : !C ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
6467 : !C-----------------------------------------------------------------------
6468 0 : NZ = 0
6469 0 : FMR = DBLE(FLOAT(MR))
6470 0 : SGN = -DSIGN(PI,FMR)
6471 : !C-----------------------------------------------------------------------
6472 : !C CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
6473 : !C-----------------------------------------------------------------------
6474 0 : CSGNI = SGN
6475 0 : IF (YY.LE.0.0D0) CSGNI = -CSGNI
6476 0 : IFN = INU + N - 1
6477 0 : ANG = FNF*SGN
6478 0 : CSPNR = DCOS(ANG)
6479 0 : CSPNI = DSIN(ANG)
6480 0 : IF (MOD(IFN,2).EQ.0) GO TO 190
6481 0 : CSPNR = -CSPNR
6482 0 : CSPNI = -CSPNI
6483 : 190 CONTINUE
6484 : !C-----------------------------------------------------------------------
6485 : !C CS=COEFF OF THE J FUNCTION TO GET THE I FUNCTION. I(FNU,Z) IS
6486 : !C COMPUTED FROM EXP(I*FNU*HPI)*J(FNU,-I*Z) WHERE Z IS IN THE FIRST
6487 : !C QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
6488 : !C CONJUGATION SINCE THE I FUNCTION IS REAL ON THE POSITIVE REAL AXIS
6489 : !C-----------------------------------------------------------------------
6490 0 : CSR = SAR*CSGNI
6491 0 : CSI = CAR*CSGNI
6492 0 : IN = MOD(IFN,4) + 1
6493 0 : C2R = CIPR(IN)
6494 0 : C2I = CIPI(IN)
6495 0 : STR = CSR*C2R + CSI*C2I
6496 0 : CSI = -CSR*C2I + CSI*C2R
6497 0 : CSR = STR
6498 0 : ASC = BRY(1)
6499 0 : IUF = 0
6500 0 : KK = N
6501 0 : KDFLG = 1
6502 0 : IB = IB - 1
6503 0 : IC = IB - 1
6504 0 : DO 290 K=1,N
6505 0 : FN = FNU + DBLE(FLOAT(KK-1))
6506 : !C-----------------------------------------------------------------------
6507 : !C LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
6508 : !C FUNCTION ABOVE
6509 : !C-----------------------------------------------------------------------
6510 0 : IF (N.GT.2) GO TO 175
6511 : 172 CONTINUE
6512 0 : PHIDR = PHIR(J)
6513 0 : PHIDI = PHII(J)
6514 0 : ARGDR = ARGR(J)
6515 0 : ARGDI = ARGI(J)
6516 0 : ZET1DR = ZETA1R(J)
6517 0 : ZET1DI = ZETA1I(J)
6518 0 : ZET2DR = ZETA2R(J)
6519 0 : ZET2DI = ZETA2I(J)
6520 0 : ASUMDR = ASUMR(J)
6521 0 : ASUMDI = ASUMI(J)
6522 0 : BSUMDR = BSUMR(J)
6523 0 : BSUMDI = BSUMI(J)
6524 0 : J = 3 - J
6525 0 : GO TO 210
6526 : 175 CONTINUE
6527 0 : IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 210
6528 0 : IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
6529 : CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIDR, PHIDI, ARGDR, &
6530 : & ARGDI, ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, &
6531 0 : & ASUMDI, BSUMDR, BSUMDI)
6532 : 210 CONTINUE
6533 0 : IF (KODE.EQ.1) GO TO 220
6534 0 : STR = ZBR + ZET2DR
6535 0 : STI = ZBI + ZET2DI
6536 0 : RAST = FN/AZABS(STR,STI)
6537 0 : STR = STR*RAST*RAST
6538 0 : STI = -STI*RAST*RAST
6539 0 : S1R = -ZET1DR + STR
6540 0 : S1I = -ZET1DI + STI
6541 0 : GO TO 230
6542 : 220 CONTINUE
6543 0 : S1R = -ZET1DR + ZET2DR
6544 0 : S1I = -ZET1DI + ZET2DI
6545 : 230 CONTINUE
6546 : !C-----------------------------------------------------------------------
6547 : !C TEST FOR UNDERFLOW AND OVERFLOW
6548 : !C-----------------------------------------------------------------------
6549 0 : RS1 = S1R
6550 0 : IF (DABS(RS1).GT.ELIM) GO TO 280
6551 0 : IF (KDFLG.EQ.1) IFLAG = 2
6552 0 : IF (DABS(RS1).LT.ALIM) GO TO 240
6553 : !C-----------------------------------------------------------------------
6554 : !C REFINE TEST AND SCALE
6555 : !C-----------------------------------------------------------------------
6556 0 : APHI = AZABS(PHIDR,PHIDI)
6557 0 : AARG = AZABS(ARGDR,ARGDI)
6558 0 : RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
6559 0 : IF (DABS(RS1).GT.ELIM) GO TO 280
6560 0 : IF (KDFLG.EQ.1) IFLAG = 1
6561 0 : IF (RS1.LT.0.0D0) GO TO 240
6562 0 : IF (KDFLG.EQ.1) IFLAG = 3
6563 : 240 CONTINUE
6564 0 : CALL ZAIRY(ARGDR, ARGDI, 0, 2, AIR, AII, NAI, IDUM)
6565 0 : CALL ZAIRY(ARGDR, ARGDI, 1, 2, DAIR, DAII, NDAI, IDUM)
6566 0 : STR = DAIR*BSUMDR - DAII*BSUMDI
6567 0 : STI = DAIR*BSUMDI + DAII*BSUMDR
6568 0 : STR = STR + (AIR*ASUMDR-AII*ASUMDI)
6569 0 : STI = STI + (AIR*ASUMDI+AII*ASUMDR)
6570 0 : PTR = STR*PHIDR - STI*PHIDI
6571 0 : PTI = STR*PHIDI + STI*PHIDR
6572 0 : S2R = PTR*CSR - PTI*CSI
6573 0 : S2I = PTR*CSI + PTI*CSR
6574 0 : STR = DEXP(S1R)*CSSR(IFLAG)
6575 0 : S1R = STR*DCOS(S1I)
6576 0 : S1I = STR*DSIN(S1I)
6577 0 : STR = S2R*S1R - S2I*S1I
6578 0 : S2I = S2R*S1I + S2I*S1R
6579 0 : S2R = STR
6580 0 : IF (IFLAG.NE.1) GO TO 250
6581 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
6582 0 : IF (NW.EQ.0) GO TO 250
6583 0 : S2R = ZEROR
6584 0 : S2I = ZEROI
6585 : 250 CONTINUE
6586 0 : IF (YY.LE.0.0D0) S2I = -S2I
6587 0 : CYR(KDFLG) = S2R
6588 0 : CYI(KDFLG) = S2I
6589 0 : C2R = S2R
6590 0 : C2I = S2I
6591 0 : S2R = S2R*CSRR(IFLAG)
6592 0 : S2I = S2I*CSRR(IFLAG)
6593 : !C-----------------------------------------------------------------------
6594 : !C ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
6595 : !C-----------------------------------------------------------------------
6596 0 : S1R = YR(KK)
6597 0 : S1I = YI(KK)
6598 0 : IF (KODE.EQ.1) GO TO 270
6599 0 : CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
6600 0 : NZ = NZ + NW
6601 : 270 CONTINUE
6602 0 : YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
6603 0 : YI(KK) = S1R*CSPNI + S1I*CSPNR + S2I
6604 0 : KK = KK - 1
6605 0 : CSPNR = -CSPNR
6606 0 : CSPNI = -CSPNI
6607 0 : STR = CSI
6608 0 : CSI = -CSR
6609 0 : CSR = STR
6610 0 : IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
6611 : KDFLG = 1
6612 0 : GO TO 290
6613 : 255 CONTINUE
6614 0 : IF (KDFLG.EQ.2) GO TO 295
6615 : KDFLG = 2
6616 0 : GO TO 290
6617 : 280 CONTINUE
6618 0 : IF (RS1.GT.0.0D0) GO TO 320
6619 0 : S2R = ZEROR
6620 0 : S2I = ZEROI
6621 0 : GO TO 250
6622 0 : 290 CONTINUE
6623 0 : K = N
6624 : 295 CONTINUE
6625 0 : IL = N - K
6626 0 : IF (IL.EQ.0) RETURN
6627 : !C-----------------------------------------------------------------------
6628 : !C RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
6629 : !C K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
6630 : !C INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
6631 : !C-----------------------------------------------------------------------
6632 0 : S1R = CYR(1)
6633 0 : S1I = CYI(1)
6634 0 : S2R = CYR(2)
6635 0 : S2I = CYI(2)
6636 0 : CSR = CSRR(IFLAG)
6637 0 : ASCLE = BRY(IFLAG)
6638 0 : FN = DBLE(FLOAT(INU+IL))
6639 0 : DO 310 I=1,IL
6640 0 : C2R = S2R
6641 0 : C2I = S2I
6642 0 : S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
6643 0 : S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
6644 0 : S1R = C2R
6645 0 : S1I = C2I
6646 0 : FN = FN - 1.0D0
6647 0 : C2R = S2R*CSR
6648 0 : C2I = S2I*CSR
6649 0 : CKR = C2R
6650 0 : CKI = C2I
6651 0 : C1R = YR(KK)
6652 0 : C1I = YI(KK)
6653 0 : IF (KODE.EQ.1) GO TO 300
6654 0 : CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
6655 0 : NZ = NZ + NW
6656 : 300 CONTINUE
6657 0 : YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
6658 0 : YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
6659 0 : KK = KK - 1
6660 0 : CSPNR = -CSPNR
6661 0 : CSPNI = -CSPNI
6662 0 : IF (IFLAG.GE.3) GO TO 310
6663 0 : C2R = DABS(CKR)
6664 0 : C2I = DABS(CKI)
6665 0 : C2M = DMAX1(C2R,C2I)
6666 0 : IF (C2M.LE.ASCLE) GO TO 310
6667 0 : IFLAG = IFLAG + 1
6668 0 : ASCLE = BRY(IFLAG)
6669 0 : S1R = S1R*CSR
6670 0 : S1I = S1I*CSR
6671 : S2R = CKR
6672 : S2I = CKI
6673 0 : S1R = S1R*CSSR(IFLAG)
6674 0 : S1I = S1I*CSSR(IFLAG)
6675 0 : S2R = S2R*CSSR(IFLAG)
6676 0 : S2I = S2I*CSSR(IFLAG)
6677 0 : CSR = CSRR(IFLAG)
6678 0 : 310 CONTINUE
6679 0 : RETURN
6680 : 320 CONTINUE
6681 0 : NZ = -1
6682 0 : RETURN
6683 : END SUBROUTINE ZUNK2
6684 :
6685 : !----------------------------------------------------------------------
6686 :
6687 :
6688 : END MODULE m_bessel2
6689 : !!***
6690 :
|