MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
bessely.f90
1 module bessely
2  implicit none
3  private
4  public zbesy
5 contains
6 !*****************************************************************
7 !* EVALUATE A Y-BESSEL FUNCTION OF COMPLEX ARGUMENT (SECOND KIND)*
8 !* ------------------------------------------------------------- *
9 !* SAMPLE RUN: *
10 !* (Evaluate Y0 to Y4 for argument Z=(1.0,2.0) ). *
11 !* *
12 !* zr(0) = 1.367419 *
13 !* zi(0) = 1.521507 *
14 !* zr(1) = -1.089470 *
15 !* zi(1) = 1.314951 *
16 !* zr(2) = -0.751245 *
17 !* zi(2) = -0.123950 *
18 !* zr(3) = 0.290153 *
19 !* zi(3) = -0.212119 *
20 !* zr(4) = 0.590344 *
21 !* zi(4) = -0.826960 *
22 !* NZ = 0 *
23 !* Error code: 0 *
24 !* *
25 !* ------------------------------------------------------------- *
26 !* Ref.: From Numath Library By Tuan Dang Trong in Fortran 77 *
27 !* [BIBLI 18]. *
28 !* *
29 !* F90 Release 1.0 By J-P Moreau, Paris *
30 !* (www.jpmoreau.fr) *
31 !*****************************************************************
32 !PROGRAM TEST_ZBESY
33 
34 ! real*8 zr, zi
35 ! real*8 cyr(10), cyi(10), cwr(10), cwi(10)
36 
37 ! n=5
38 ! zr=1.d0; zi=2.d0
39 
40 ! call ZBESY(zr,zi,0.d0,1,n,cyr,cyi,nz,cwr,cwi,ierr)
41 
42 ! print *,' '
43 ! do i=1, n
44 ! write(*,10) i-1, cyr(i)
45 ! write(*,11) i-1, cyi(i)
46 ! end do
47 ! print *,' NZ=', NZ
48 ! print *,' Error code:', ierr
49 ! print *,' '
50 ! stop
51 
52 !10 format(' zr(',I1,') = ',F10.6)
53 !11 format(' zi(',I1,') = ',F10.6)
54 
55 !END
56 
57 
58 SUBROUTINE zbesy(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, CWRKR, CWRKI, IERR)
59 USE utilit
60 !***BEGIN PROLOGUE ZBESY
61 !***DATE WRITTEN 830501 (YYMMDD)
62 !***REVISION DATE 830501 (YYMMDD)
63 !***CATEGORY NO. B5K
64 !***KEYWORDS Y-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT,
65 ! BESSEL FUNCTION OF SECOND KIND
66 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
67 !***PURPOSE TO COMPUTE THE Y-BESSEL FUNCTION OF A COMPLEX ARGUMENT
68 !***DESCRIPTION
69 !
70 ! ***A DOUBLE PRECISION ROUTINE***
71 !
72 ! ON KODE=1, CBESY COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
73 ! BESSEL FUNCTIONS CY(I)=Y(FNU+I-1,Z) FOR REAL, NONNEGATIVE
74 ! ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
75 ! -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESY RETURNS THE SCALED
76 ! FUNCTIONS
77 !
78 ! CY(I)=EXP(-ABS(Y))*Y(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z)
79 !
80 ! WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
81 ! LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
82 ! ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
83 ! (REF. 1).
84 !
85 ! INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
86 ! ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
87 ! -PI.LT.ARG(Z).LE.PI
88 ! FNU - ORDER OF INITIAL Y FUNCTION, FNU.GE.0.0D0
89 ! KODE - A PARAMETER TO INDICATE THE SCALING OPTION
90 ! KODE= 1 RETURNS
91 ! CY(I)=Y(FNU+I-1,Z), I=1,...,N
92 ! = 2 RETURNS
93 ! CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)), I=1,...,N
94 ! WHERE Y=AIMAG(Z)
95 ! N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
96 ! CWRKR, - DOUBLE PRECISION WORK VECTORS OF DIMENSION AT
97 ! CWRKI AT LEAST N
98 !
99 ! OUTPUT CYR,CYI ARE DOUBLE PRECISION
100 ! CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
101 ! CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
102 ! CY(I)=Y(FNU+I-1,Z) OR
103 ! CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)) I=1,...,N
104 ! DEPENDING ON KODE.
105 ! NZ - NZ=0 , A NORMAL RETURN
106 ! NZ.GT.0 , NZ COMPONENTS OF CY SET TO ZERO DUE TO
107 ! UNDERFLOW (GENERALLY ON KODE=2)
108 ! IERR - ERROR FLAG
109 ! IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
110 ! IERR=1, INPUT ERROR - NO COMPUTATION
111 ! IERR=2, OVERFLOW - NO COMPUTATION, FNU IS
112 ! TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
113 ! IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
114 ! BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
115 ! REDUCTION PRODUCE LESS THAN HALF OF MACHINE
116 ! ACCURACY
117 ! IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
118 ! TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
119 ! CANCE BY ARGUMENT REDUCTION
120 ! IERR=5, ERROR - NO COMPUTATION,
121 ! ALGORITHM TERMINATION CONDITION NOT MET
122 !
123 !***LONG DESCRIPTION
124 !
125 ! THE COMPUTATION IS CARRIED OUT BY THE FORMULA
126 !
127 ! Y(FNU,Z)=0.5*(H(1,FNU,Z)-H(2,FNU,Z))/I
128 !
129 ! WHERE I**2 = -1 AND THE HANKEL BESSEL FUNCTIONS H(1,FNU,Z)
130 ! AND H(2,FNU,Z) ARE CALCULATED IN CBESH.
131 !
132 ! FOR NEGATIVE ORDERS,THE FORMULA
133 !
134 ! Y(-FNU,Z) = Y(FNU,Z)*COS(PI*FNU) + J(FNU,Z)*SIN(PI*FNU)
135 !
136 ! CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO HALF ODD
137 ! INTEGERS THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE
138 ! POSITIVE HALF ODD INTEGER,THE MAGNITUDE OF Y(-FNU,Z)=J(FNU,Z)*
139 ! SIN(PI*FNU) IS A LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS
140 ! NOT A HALF ODD INTEGER, Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A
141 ! LARGE POSITIVE POWER OF TEN AND THE MOST THAT THE SECOND TERM
142 ! CAN BE REDUCED IS BY UNIT ROUNDOFF FROM THE COEFFICIENT. THUS,
143 ! WIDE CHANGES CAN OCCUR WITHIN UNIT ROUNDOFF OF A LARGE HALF
144 ! ODD INTEGER. HERE, LARGE MEANS FNU.GT.CABS(Z).
145 !
146 ! IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
147 ! MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
148 ! LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
149 ! CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
150 ! LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
151 ! IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
152 ! DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
153 ! IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
154 ! LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
155 ! MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
156 ! INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
157 ! RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
158 ! ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
159 ! ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
160 ! ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
161 ! THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
162 ! TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
163 ! IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
164 ! SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
165 !
166 ! THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
167 ! BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
168 ! ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
169 ! SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
170 ! ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
171 ! ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
172 ! CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
173 ! HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
174 ! ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
175 ! SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
176 ! THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
177 ! 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
178 ! THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
179 ! COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
180 ! BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
181 ! COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
182 ! MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
183 ! THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
184 ! OR -PI/2+P.
185 !
186 !***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
187 ! AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
188 ! COMMERCE, 1955.
189 !
190 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
191 ! BY D. E. AMOS, SAND83-0083, MAY, 1983.
192 !
193 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
194 ! AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
195 !
196 ! A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
197 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
198 ! 1018, MAY, 1985
199 !
200 ! A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
201 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
202 ! MATH. SOFTWARE, 1986
203 !
204 !***ROUTINES CALLED ZBESH,I1MACH,D1MACH
205 !***END PROLOGUE ZBESY
206 !
207 ! COMPLEX CWRK,CY,C1,C2,EX,HCI,Z
208  DOUBLE PRECISION cwrki, cwrkr, cyi, cyr, c1i, c1r, c2i, c2r, &
209  elim, exi, exr, ey, fnu, hcii, sti, str, tay, zi, zr, dexp
210  INTEGER i, ierr, k, kode, k1, k2, n, nz, nz1, nz2
211  dimension cyr(1), cyi(1), cwrkr(1), cwrki(1)
212 !***FIRST EXECUTABLE STATEMENT ZBESY
213  ierr = 0
214  nz=0
215  IF (zr.EQ.0.0d0 .AND. zi.EQ.0.0d0) ierr=1
216  IF (fnu.LT.0.0d0) ierr=1
217  IF (kode.LT.1 .OR. kode.GT.2) ierr=1
218  IF (n.LT.1) ierr=1
219  IF (ierr.NE.0) RETURN
220  hcii = 0.5d0
221  CALL zbesh(zr, zi, fnu, kode, 1, n, cyr, cyi, nz1, ierr)
222  IF (ierr.NE.0.AND.ierr.NE.3) GO TO 170
223  CALL zbesh(zr, zi, fnu, kode, 2, n, cwrkr, cwrki, nz2, ierr)
224  IF (ierr.NE.0.AND.ierr.NE.3) GO TO 170
225  nz = min0(nz1,nz2)
226  IF (kode.EQ.2) GO TO 60
227  DO 50 i=1,n
228  str = cwrkr(i) - cyr(i)
229  sti = cwrki(i) - cyi(i)
230  cyr(i) = -sti*hcii
231  cyi(i) = str*hcii
232  50 CONTINUE
233  RETURN
234  60 CONTINUE
235  k1 = i1mach(15)
236  k2 = i1mach(16)
237  k = min0(iabs(k1),iabs(k2))
238 !-----------------------------------------------------------------------
239 ! ELIM IS THE APPROXIMATE EXPONENTIAL UNDER- AND OVERFLOW LIMIT
240 !-----------------------------------------------------------------------
241  elim = 2.303d0*(dble(float(k))*d1mach(5)-3.0d0)
242  exr = dcos(zr)
243  exi = dsin(zr)
244  ey = 0.0d0
245  tay = dabs(zi+zi)
246  IF (tay.LT.elim) ey = dexp(-tay)
247  IF (zi.LT.0.0d0) GO TO 90
248  c1r = exr*ey
249  c1i = exi*ey
250  c2r = exr
251  c2i = -exi
252  70 CONTINUE
253  nz = 0
254  DO 80 i=1,n
255  str = c1r*cyr(i) - c1i*cyi(i)
256  sti = c1r*cyi(i) + c1i*cyr(i)
257  str = -str + c2r*cwrkr(i) - c2i*cwrki(i)
258  sti = -sti + c2r*cwrki(i) + c2i*cwrkr(i)
259  cyr(i) = -sti*hcii
260  cyi(i) = str*hcii
261  IF (str.EQ.0.0d0 .AND. sti.EQ.0.0d0 .AND. ey.EQ.0.0d0) nz = nz + 1
262  80 CONTINUE
263  RETURN
264  90 CONTINUE
265  c1r = exr
266  c1i = exi
267  c2r = exr*ey
268  c2i = -exi*ey
269  GO TO 70
270  170 CONTINUE
271  nz = 0
272  RETURN
273 END
274 
275 
276 SUBROUTINE zbesh(ZR, ZI, FNU, KODE, M, N, CYR, CYI, NZ, IERR)
277 USE utilit
278 USE complex
279 !***BEGIN PROLOGUE ZBESH
280 !***DATE WRITTEN 830501 (YYMMDD)
281 !***REVISION DATE 830501 (YYMMDD)
282 !***CATEGORY NO. B5K
283 !***KEYWORDS H-BESSEL FUNCTIONS,BESSEL FUNCTIONS OF COMPLEX ARGUMENT,
284 ! BESSEL FUNCTIONS OF THIRD KIND,HANKEL FUNCTIONS
285 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
286 !***PURPOSE TO COMPUTE THE H-BESSEL FUNCTIONS OF A COMPLEX ARGUMENT
287 !***DESCRIPTION
288 !
289 ! ***A DOUBLE PRECISION ROUTINE***
290 ! ON KODE=1, ZBESH COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
291 ! HANKEL (BESSEL) FUNCTIONS CY(J)=H(M,FNU+J-1,Z) FOR KINDS M=1
292 ! OR 2, REAL, NONNEGATIVE ORDERS FNU+J-1, J=1,...,N, AND COMPLEX
293 ! Z.NE.CMPLX(0.0,0.0) IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI.
294 ! ON KODE=2, ZBESH RETURNS THE SCALED HANKEL FUNCTIONS
295 !
296 ! CY(I)=EXP(-MM*Z*I)*H(M,FNU+J-1,Z) MM=3-2*M, I**2=-1.
297 !
298 ! WHICH REMOVES THE EXPONENTIAL BEHAVIOR IN BOTH THE UPPER AND
299 ! LOWER HALF PLANES. DEFINITIONS AND NOTATION ARE FOUND IN THE
300 ! NBS HANDBOOK OF MATHEMATICAL FUNCTIONS (REF. 1).
301 !
302 ! INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
303 ! ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
304 ! -PT.LT.ARG(Z).LE.PI
305 ! FNU - ORDER OF INITIAL H FUNCTION, FNU.GE.0.0D0
306 ! KODE - A PARAMETER TO INDICATE THE SCALING OPTION
307 ! KODE= 1 RETURNS
308 ! CY(J)=H(M,FNU+J-1,Z), J=1,...,N
309 ! = 2 RETURNS
310 ! CY(J)=H(M,FNU+J-1,Z)*EXP(-I*Z*(3-2M))
311 ! J=1,...,N , I**2=-1
312 ! M - KIND OF HANKEL FUNCTION, M=1 OR 2
313 ! N - NUMBER OF MEMBERS IN THE SEQUENCE, N.GE.1
314 !
315 ! OUTPUT CYR,CYI ARE DOUBLE PRECISION
316 ! CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
317 ! CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
318 ! CY(J)=H(M,FNU+J-1,Z) OR
319 ! CY(J)=H(M,FNU+J-1,Z)*EXP(-I*Z*(3-2M)) J=1,...,N
320 ! DEPENDING ON KODE, I**2=-1.
321 ! NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
322 ! NZ= 0 , NORMAL RETURN
323 ! NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
324 ! TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
325 ! J=1,...,NZ WHEN Y.GT.0.0 AND M=1 OR
326 ! Y.LT.0.0 AND M=2. FOR THE COMPLMENTARY
327 ! HALF PLANES, NZ STATES ONLY THE NUMBER
328 ! OF UNDERFLOWS.
329 ! IERR - ERROR FLAG
330 ! IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
331 ! IERR=1, INPUT ERROR - NO COMPUTATION
332 ! IERR=2, OVERFLOW - NO COMPUTATION, FNU TOO
333 ! LARGE OR CABS(Z) TOO SMALL OR BOTH
334 ! IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
335 ! BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
336 ! REDUCTION PRODUCE LESS THAN HALF OF MACHINE
337 ! ACCURACY
338 ! IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
339 ! TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
340 ! CANCE BY ARGUMENT REDUCTION
341 ! IERR=5, ERROR - NO COMPUTATION,
342 ! ALGORITHM TERMINATION CONDITION NOT MET
343 !
344 !***LONG DESCRIPTION
345 !
346 ! THE COMPUTATION IS CARRIED OUT BY THE RELATION
347 !
348 ! H(M,FNU,Z)=(1/MP)*EXP(-MP*FNU)*K(FNU,Z*EXP(-MP))
349 ! MP=MM*HPI*I, MM=3-2*M, HPI=PI/2, I**2=-1
350 !
351 ! FOR M=1 OR 2 WHERE THE K BESSEL FUNCTION IS COMPUTED FOR THE
352 ! RIGHT HALF PLANE RE(Z).GE.0.0. THE K FUNCTION IS CONTINUED
353 ! TO THE LEFT HALF PLANE BY THE RELATION
354 !
355 ! K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
356 ! MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
357 !
358 ! WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
359 !
360 ! EXPONENTIAL DECAY OF H(M,FNU,Z) OCCURS IN THE UPPER HALF Z
361 ! PLANE FOR M=1 AND THE LOWER HALF Z PLANE FOR M=2. EXPONENTIAL
362 ! GROWTH OCCURS IN THE COMPLEMENTARY HALF PLANES. SCALING
363 ! BY EXP(-MM*Z*I) REMOVES THE EXPONENTIAL BEHAVIOR IN THE
364 ! WHOLE Z PLANE FOR Z TO INFINITY.
365 !
366 ! FOR NEGATIVE ORDERS,THE FORMULAE
367 !
368 ! H(1,-FNU,Z) = H(1,FNU,Z)*CEXP( PI*FNU*I)
369 ! H(2,-FNU,Z) = H(2,FNU,Z)*CEXP(-PI*FNU*I)
370 ! I**2=-1
371 !
372 ! CAN BE USED.
373 !
374 ! IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
375 ! MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
376 ! LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
377 ! CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
378 ! LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
379 ! IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
380 ! DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
381 ! IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
382 ! LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
383 ! MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
384 ! INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
385 ! RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
386 ! ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
387 ! ARITHMETI! AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
388 ! ARITHMETI! RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
389 ! THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
390 ! TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
391 ! IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
392 ! SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
393 !
394 ! THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
395 ! BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
396 ! ROUNDOFF,1.0D-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
397 ! SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
398 ! ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
399 ! ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
400 ! CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
401 ! HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
402 ! ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
403 ! SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
404 ! THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
405 ! 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
406 ! THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
407 ! COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
408 ! BECAUSE, IN COMPLEX ARITHMETI! WITH PRECISION P, THE SMALLER
409 ! COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
410 ! MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
411 ! THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
412 ! OR -PI/2+P.
413 !
414 !***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
415 ! AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
416 ! COMMERCE, 1955.
417 !
418 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
419 ! BY D. E. AMOS, SAND83-0083, MAY, 1983.
420 !
421 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
422 ! AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
423 !
424 ! A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
425 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
426 ! 1018, MAY, 1985
427 !
428 ! A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
429 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
430 ! MATH. SOFTWARE, 1986
431 !
432 !***ROUTINES CALLED ZACON,ZBKNU,ZBUNK,ZUOIK,ZABS,I1MACH,D1MACH
433 !***END PROLOGUE ZBESH
434 !
435 ! COMPLEX CY,Z,ZN,ZT
436  DOUBLE PRECISION aa, alim, aln, arg, az, cyi, cyr, dig, elim, &
437  fmm, fn, fnu, fnul, hpi, rhpi, rl, r1m5, sgn, str, tol, ufl, zi, &
438  zni, znr, zr, zti, bb
439  INTEGER i, ierr, inu, inuh, ir, k, kode, k1, k2, m, &
440  mm, mr, n, nn, nuf, nw, nz
441  dimension cyr(n), cyi(n)
442 
443  DATA hpi /1.57079632679489662d0/
444 
445 !***FIRST EXECUTABLE STATEMENT ZBESH
446  ierr = 0
447  nz=0
448  IF (zr.EQ.0.0d0 .AND. zi.EQ.0.0d0) ierr=1
449  IF (fnu.LT.0.0d0) ierr=1
450  IF (m.LT.1 .OR. m.GT.2) ierr=1
451  IF (kode.LT.1 .OR. kode.GT.2) ierr=1
452  IF (n.LT.1) ierr=1
453  IF (ierr.NE.0) RETURN
454  nn = n
455 !-----------------------------------------------------------------------
456 ! SET PARAMETERS RELATED TO MACHINE CONSTANTS.
457 ! TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
458 ! ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
459 ! EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
460 ! EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
461 ! UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
462 ! RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
463 ! DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
464 ! FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
465 !-----------------------------------------------------------------------
466  tol = dmax1(d1mach(4),1.0d-18)
467  k1 = i1mach(15)
468  k2 = i1mach(16)
469  r1m5 = d1mach(5)
470  k = min0(iabs(k1),iabs(k2))
471  elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
472  k1 = i1mach(14) - 1
473  aa = r1m5*dble(float(k1))
474  dig = dmin1(aa,18.0d0)
475  aa = aa*2.303d0
476  alim = elim + dmax1(-aa,-41.45d0)
477  fnul = 10.0d0 + 6.0d0*(dig-3.0d0)
478  rl = 1.2d0*dig + 3.0d0
479  fn = fnu + dble(float(nn-1))
480  mm = 3 - m - m
481  fmm = dble(float(mm))
482  znr = fmm*zi
483  zni = -fmm*zr
484 !-----------------------------------------------------------------------
485 ! TEST FOR PROPER RANGE
486 !-----------------------------------------------------------------------
487  az = zabs(zr,zi)
488  aa = 0.5d0/tol
489  bb=dble(float(i1mach(9)))*0.5d0
490  aa = dmin1(aa,bb)
491  IF (az.GT.aa) GO TO 260
492  IF (fn.GT.aa) GO TO 260
493  aa = dsqrt(aa)
494  IF (az.GT.aa) ierr=3
495  IF (fn.GT.aa) ierr=3
496 !-----------------------------------------------------------------------
497 ! OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
498 !-----------------------------------------------------------------------
499  ufl = dexp(-elim)
500  IF (az.LT.ufl) GO TO 230
501  IF (fnu.GT.fnul) GO TO 90
502  IF (fn.LE.1.0d0) GO TO 70
503  IF (fn.GT.2.0d0) GO TO 60
504  IF (az.GT.tol) GO TO 70
505  arg = 0.5d0*az
506  aln = -fn*dlog(arg)
507  IF (aln.GT.elim) GO TO 230
508  GO TO 70
509  60 CONTINUE
510  CALL zuoik(znr, zni, fnu, kode, 2, nn, cyr, cyi, nuf, tol, elim, alim)
511  IF (nuf.LT.0) GO TO 230
512  nz = nz + nuf
513  nn = nn - nuf
514 !-----------------------------------------------------------------------
515 ! HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
516 ! IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
517 !-----------------------------------------------------------------------
518  IF (nn.EQ.0) GO TO 140
519  70 CONTINUE
520  IF ((znr.LT.0.0d0) .OR. (znr.EQ.0.0d0 .AND. zni.LT.0.0d0 .AND. &
521  m.EQ.2)) GO TO 80
522 !-----------------------------------------------------------------------
523 ! RIGHT HALF PLANE COMPUTATION, XN.GE.0. .AND. (XN.NE.0. .OR.
524 ! YN.GE.0. .OR. M=1)
525 !-----------------------------------------------------------------------
526  CALL zbknu(znr, zni, fnu, kode, nn, cyr, cyi, nz, tol, elim, alim)
527  GO TO 110
528 !-----------------------------------------------------------------------
529 ! LEFT HALF PLANE COMPUTATION
530 !-----------------------------------------------------------------------
531  80 CONTINUE
532  mr = -mm
533  CALL zacon(znr, zni, fnu, kode, mr, nn, cyr, cyi, nw, rl, fnul, &
534  tol, elim, alim)
535  IF (nw.LT.0) GO TO 240
536  nz=nw
537  GO TO 110
538  90 CONTINUE
539 !-----------------------------------------------------------------------
540 ! UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
541 !-----------------------------------------------------------------------
542  mr = 0
543  IF ((znr.GE.0.0d0) .AND. (znr.NE.0.0d0 .OR. zni.GE.0.0d0 .OR. &
544  m.NE.2)) GO TO 100
545  mr = -mm
546  IF (znr.NE.0.0d0 .OR. zni.GE.0.0d0) GO TO 100
547  znr = -znr
548  zni = -zni
549  100 CONTINUE
550  CALL zbunk(znr, zni, fnu, kode, mr, nn, cyr, cyi, nw, tol, elim, alim)
551  IF (nw.LT.0) GO TO 240
552  nz = nz + nw
553  110 CONTINUE
554 !-----------------------------------------------------------------------
555 ! H(M,FNU,Z) = -FMM*(I/HPI)*(ZT**FNU)*K(FNU,-Z*ZT)
556 !
557 ! ZT=EXP(-FMM*HPI*I) = CMPLX(0.0,-FMM), FMM=3-2*M, M=1,2
558 !-----------------------------------------------------------------------
559  sgn = dsign(hpi,-fmm)
560 !-----------------------------------------------------------------------
561 ! CALCULATE EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
562 ! WHEN FNU IS LARGE
563 !-----------------------------------------------------------------------
564  inu = int(sngl(fnu))
565  inuh = inu/2
566  ir = inu - 2*inuh
567  arg = (fnu-dble(float(inu-ir)))*sgn
568  rhpi = 1.0d0/sgn
569  zni = rhpi*dcos(arg)
570  znr = -rhpi*dsin(arg)
571  IF (mod(inuh,2).EQ.0) GO TO 120
572  znr = -znr
573  zni = -zni
574  120 CONTINUE
575  zti = -fmm
576  DO 130 i=1,nn
577  str = cyr(i)*znr - cyi(i)*zni
578  cyi(i) = cyr(i)*zni + cyi(i)*znr
579  cyr(i) = str
580  str = -zni*zti
581  zni = znr*zti
582  znr = str
583  130 CONTINUE
584  RETURN
585  140 CONTINUE
586  IF (znr.LT.0.0d0) GO TO 230
587  RETURN
588  230 CONTINUE
589  nz=0
590  ierr=2
591  RETURN
592  240 CONTINUE
593  IF(nw.EQ.(-1)) GO TO 230
594  nz=0
595  ierr=5
596  RETURN
597  260 CONTINUE
598  nz=0
599  ierr=4
600  RETURN
601 END
602 
603 SUBROUTINE zuoik(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL, ELIM, ALIM)
604 USE utilit
605 USE complex
606 !***BEGIN PROLOGUE ZUOIK
607 !***REFER TO ZBESI,ZBESK,ZBESH
608 !
609 ! ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
610 ! EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
611 ! (IN LOGARITHMI! FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
612 ! WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
613 ! EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
614 ! THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
615 ! MULTIPLIERS (IN LOGARITHMI! FORM) IS MADE BASED ON ELIM. HERE
616 ! EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
617 ! EXP(-ELIM)/TOL
618 !
619 ! IKFLG=1 MEANS THE I SEQUENCE IS TESTED
620 ! =2 MEANS THE K SEQUENCE IS TESTED
621 ! NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
622 ! =-1 MEANS AN OVERFLOW WOULD OCCUR
623 ! IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
624 ! THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
625 ! IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
626 ! IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
627 ! ANOTHER ROUTINE
628 !
629 !***ROUTINES CALLED ZUCHK,ZUNHJ,ZUNIK,D1MACH,ZABS,ZLOG
630 !***END PROLOGUE ZUOIK
631 ! COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
632 ! *ZR
633  DOUBLE PRECISION aarg, aic, alim, aphi, argi, argr, asumi, asumr, &
634  ascle, ax, ay, bsumi, bsumr, cwrki, cwrkr, czi, czr, elim, fnn, &
635  fnu, gnn, gnu, phii, phir, rcz, str, sti, sumi, sumr, tol, yi, &
636  yr, zbi, zbr, zeroi, zeror, zeta1i, zeta1r, zeta2i, zeta2r, zi, &
637  zni, znr, zr, zri, zrr
638  INTEGER i, idum, iform, ikflg, init, kode, n, nn, nuf, nw
639  dimension yr(1), yi(1), cwrkr(16), cwrki(16)
640  DATA zeror,zeroi / 0.0d0, 0.0d0 /
641  DATA aic / 1.265512123484645396d+00 /
642  nuf = 0
643  nn = n
644  zrr = zr
645  zri = zi
646  IF (zr.GE.0.0d0) GO TO 10
647  zrr = -zr
648  zri = -zi
649  10 CONTINUE
650  zbr = zrr
651  zbi = zri
652  ax = dabs(zr)*1.7321d0
653  ay = dabs(zi)
654  iform = 1
655  IF (ay.GT.ax) iform = 2
656  gnu = dmax1(fnu,1.0d0)
657  IF (ikflg.EQ.1) GO TO 20
658  fnn = dble(float(nn))
659  gnn = fnu + fnn - 1.0d0
660  gnu = dmax1(gnn,fnn)
661  20 CONTINUE
662 !-----------------------------------------------------------------------
663 ! ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
664 ! REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
665 ! THE SIGN OF THE IMAGINARY PART CORRECT.
666 !-----------------------------------------------------------------------
667  IF (iform.EQ.2) GO TO 30
668  init = 0
669  CALL zunik(zrr, zri, gnu, ikflg, 1, tol, init, phir, phii, &
670  zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
671  czr = -zeta1r + zeta2r
672  czi = -zeta1i + zeta2i
673  GO TO 50
674  30 CONTINUE
675  znr = zri
676  zni = -zrr
677  IF (zi.GT.0.0d0) GO TO 40
678  znr = -znr
679  40 CONTINUE
680  CALL zunhj(znr, zni, gnu, 1, tol, phir, phii, argr, argi, zeta1r, &
681  zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
682  czr = -zeta1r + zeta2r
683  czi = -zeta1i + zeta2i
684  aarg = zabs(argr,argi)
685  50 CONTINUE
686  IF (kode.EQ.1) GO TO 60
687  czr = czr - zbr
688  czi = czi - zbi
689  60 CONTINUE
690  IF (ikflg.EQ.1) GO TO 70
691  czr = -czr
692  czi = -czi
693  70 CONTINUE
694  aphi = zabs(phir,phii)
695  rcz = czr
696 !-----------------------------------------------------------------------
697 ! OVERFLOW TEST
698 !-----------------------------------------------------------------------
699  IF (rcz.GT.elim) GO TO 210
700  IF (rcz.LT.alim) GO TO 80
701  rcz = rcz + dlog(aphi)
702  IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
703  IF (rcz.GT.elim) GO TO 210
704  GO TO 130
705  80 CONTINUE
706 !-----------------------------------------------------------------------
707 ! UNDERFLOW TEST
708 !-----------------------------------------------------------------------
709  IF (rcz.LT.(-elim)) GO TO 90
710  IF (rcz.GT.(-alim)) GO TO 130
711  rcz = rcz + dlog(aphi)
712  IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
713  IF (rcz.GT.(-elim)) GO TO 110
714  90 CONTINUE
715  DO 100 i=1,nn
716  yr(i) = zeror
717  yi(i) = zeroi
718  100 CONTINUE
719  nuf = nn
720  RETURN
721  110 CONTINUE
722  ascle = 1.0d+3*d1mach(1)/tol
723  CALL zlog(phir, phii, str, sti, idum)
724  czr = czr + str
725  czi = czi + sti
726  IF (iform.EQ.1) GO TO 120
727  CALL zlog(argr, argi, str, sti, idum)
728  czr = czr - 0.25d0*str - aic
729  czi = czi - 0.25d0*sti
730  120 CONTINUE
731  ax = dexp(rcz)/tol
732  ay = czi
733  czr = ax*dcos(ay)
734  czi = ax*dsin(ay)
735  CALL zuchk(czr, czi, nw, ascle, tol)
736  IF (nw.NE.0) GO TO 90
737  130 CONTINUE
738  IF (ikflg.EQ.2) RETURN
739  IF (n.EQ.1) RETURN
740 !-----------------------------------------------------------------------
741 ! SET UNDERFLOWS ON I SEQUENCE
742 !-----------------------------------------------------------------------
743  140 CONTINUE
744  gnu = fnu + dble(float(nn-1))
745  IF (iform.EQ.2) GO TO 150
746  init = 0
747  CALL zunik(zrr, zri, gnu, ikflg, 1, tol, init, phir, phii, &
748  zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
749  czr = -zeta1r + zeta2r
750  czi = -zeta1i + zeta2i
751  GO TO 160
752  150 CONTINUE
753  CALL zunhj(znr, zni, gnu, 1, tol, phir, phii, argr, argi, zeta1r, &
754  zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
755  czr = -zeta1r + zeta2r
756  czi = -zeta1i + zeta2i
757  aarg = zabs(argr,argi)
758  160 CONTINUE
759  IF (kode.EQ.1) GO TO 170
760  czr = czr - zbr
761  czi = czi - zbi
762  170 CONTINUE
763  aphi = zabs(phir,phii)
764  rcz = czr
765  IF (rcz.LT.(-elim)) GO TO 180
766  IF (rcz.GT.(-alim)) RETURN
767  rcz = rcz + dlog(aphi)
768  IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
769  IF (rcz.GT.(-elim)) GO TO 190
770  180 CONTINUE
771  yr(nn) = zeror
772  yi(nn) = zeroi
773  nn = nn - 1
774  nuf = nuf + 1
775  IF (nn.EQ.0) RETURN
776  GO TO 140
777  190 CONTINUE
778  ascle = 1.0d+3*d1mach(1)/tol
779  CALL zlog(phir, phii, str, sti, idum)
780  czr = czr + str
781  czi = czi + sti
782  IF (iform.EQ.1) GO TO 200
783  CALL zlog(argr, argi, str, sti, idum)
784  czr = czr - 0.25d0*str - aic
785  czi = czi - 0.25d0*sti
786  200 CONTINUE
787  ax = dexp(rcz)/tol
788  ay = czi
789  czr = ax*dcos(ay)
790  czi = ax*dsin(ay)
791  CALL zuchk(czr, czi, nw, ascle, tol)
792  IF (nw.NE.0) GO TO 180
793  RETURN
794  210 CONTINUE
795  nuf = -1
796  RETURN
797  END
798 
799 SUBROUTINE zbknu(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, ALIM)
800 USE utilit
801 USE complex
802 !***BEGIN PROLOGUE ZBKNU
803 !***REFER TO ZBESI,ZBESK,ZAIRY,ZBESH
804 !
805 ! ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
806 !
807 !***ROUTINES CALLED DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,ZABS,ZDIV,
808 ! ZEXP,ZLOG,ZMLT,ZSQRT
809 !***END PROLOGUE ZBKNU
810 !
811  DOUBLE PRECISION aa, ak, alim, ascle, a1, a2, bb, bk, bry, caz, &
812  cbi, cbr, cc, cchi, cchr, cki, ckr, coefi, coefr, conei, coner, &
813  crscr, csclr, cshi, cshr, csi, csr, csrr, cssr, ctwoi, ctwor, &
814  czeroi, czeror, czi, czr, dnu, dnu2, dpi, elim, etest, fc, fhs, &
815  fi, fk, fks, fmui, fmur, fnu, fpi, fr, g1, g2, hpi, pi, pr, pti,&
816  ptr, p1i, p1r, p2i, p2m, p2r, qi, qr, rak, rcaz, rthpi, rzi, &
817  rzr, r1, s, smui, smur, spi, sti, str, s1i, s1r, s2i, s2r, tm, &
818  tol, tth, t1, t2, yi, yr, zi, zr, elm, celmr, zdr, zdi, &
819  as, alas, helim, cyr, cyi!, DGAMLN
820  INTEGER i, iflag, inu, k, kflag, kk, kmax, kode, koded, n, nz, &
821  idum, j, ic, inub, nw
822  dimension yr(n), yi(n), cc(8), cssr(3), csrr(3), bry(3), cyr(2),&
823  cyi(2)
824 ! COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
825 ! COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
826 
827  DATA kmax / 30 /
828  DATA czeror,czeroi,coner,conei,ctwor,ctwoi,r1/ &
829  0.0d0 , 0.0d0 , 1.0d0 , 0.0d0 , 2.0d0 , 0.0d0 , 2.0d0 /
830  DATA dpi, rthpi, spi ,hpi, fpi, tth / &
831  3.14159265358979324d0, 1.25331413731550025d0, &
832  1.90985931710274403d0, 1.57079632679489662d0, &
833  1.89769999331517738d0, 6.66666666666666666d-01/
834  DATA cc(1), cc(2), cc(3), cc(4), cc(5), cc(6), cc(7), cc(8)/ &
835  5.77215664901532861d-01, -4.20026350340952355d-02, &
836  -4.21977345555443367d-02, 7.21894324666309954d-03, &
837  -2.15241674114950973d-04, -2.01348547807882387d-05, &
838  1.13302723198169588d-06, 6.11609510448141582d-09/
839 
840  caz = zabs(zr,zi)
841  csclr = 1.0d0/tol
842  crscr = tol
843  cssr(1) = csclr
844  cssr(2) = 1.0d0
845  cssr(3) = crscr
846  csrr(1) = crscr
847  csrr(2) = 1.0d0
848  csrr(3) = csclr
849  bry(1) = 1.0d+3*d1mach(1)/tol
850  bry(2) = 1.0d0/bry(1)
851  bry(3) = d1mach(2)
852  nz = 0
853  iflag = 0
854  koded = kode
855  rcaz = 1.0d0/caz
856  str = zr*rcaz
857  sti = -zi*rcaz
858  rzr = (str+str)*rcaz
859  rzi = (sti+sti)*rcaz
860  inu = int(sngl(fnu+0.5d0))
861  dnu = fnu - dble(float(inu))
862  IF (dabs(dnu).EQ.0.5d0) GO TO 110
863  dnu2 = 0.0d0
864  IF (dabs(dnu).GT.tol) dnu2 = dnu*dnu
865  IF (caz.GT.r1) GO TO 110
866 !-----------------------------------------------------------------------
867 ! SERIES FOR CABS(Z).LE.R1
868 !-----------------------------------------------------------------------
869  fc = 1.0d0
870  CALL zlog(rzr, rzi, smur, smui, idum)
871  fmur = smur*dnu
872  fmui = smui*dnu
873  CALL zshch(fmur, fmui, cshr, cshi, cchr, cchi)
874  IF (dnu.EQ.0.0d0) GO TO 10
875  fc = dnu*dpi
876  fc = fc/dsin(fc)
877  smur = cshr/dnu
878  smui = cshi/dnu
879  10 CONTINUE
880  a2 = 1.0d0 + dnu
881 !-----------------------------------------------------------------------
882 ! GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
883 !-----------------------------------------------------------------------
884  t2 = dexp(-dgamln(a2,idum))
885  t1 = 1.0d0/(t2*fc)
886  IF (dabs(dnu).GT.0.1d0) GO TO 40
887 !-----------------------------------------------------------------------
888 ! SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
889 !-----------------------------------------------------------------------
890  ak = 1.0d0
891  s = cc(1)
892  DO 20 k=2,8
893  ak = ak*dnu2
894  tm = cc(k)*ak
895  s = s + tm
896  IF (dabs(tm).LT.tol) GO TO 30
897  20 CONTINUE
898  30 g1 = -s
899  GO TO 50
900  40 CONTINUE
901  g1 = (t1-t2)/(dnu+dnu)
902  50 CONTINUE
903  g2 = (t1+t2)*0.5d0
904  fr = fc*(cchr*g1+smur*g2)
905  fi = fc*(cchi*g1+smui*g2)
906  CALL zexp(fmur, fmui, str, sti)
907  pr = 0.5d0*str/t2
908  pi = 0.5d0*sti/t2
909  CALL zdiv(0.5d0, 0.0d0, str, sti, ptr, pti)
910  qr = ptr/t1
911  qi = pti/t1
912  s1r = fr
913  s1i = fi
914  s2r = pr
915  s2i = pi
916  ak = 1.0d0
917  a1 = 1.0d0
918  ckr = coner
919  cki = conei
920  bk = 1.0d0 - dnu2
921  IF (inu.GT.0 .OR. n.GT.1) GO TO 80
922 !-----------------------------------------------------------------------
923 ! GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
924 !-----------------------------------------------------------------------
925  IF (caz.LT.tol) GO TO 70
926  CALL zmlt(zr, zi, zr, zi, czr, czi)
927  czr = 0.25d0*czr
928  czi = 0.25d0*czi
929  t1 = 0.25d0*caz*caz
930  60 CONTINUE
931  fr = (fr*ak+pr+qr)/bk
932  fi = (fi*ak+pi+qi)/bk
933  str = 1.0d0/(ak-dnu)
934  pr = pr*str
935  pi = pi*str
936  str = 1.0d0/(ak+dnu)
937  qr = qr*str
938  qi = qi*str
939  str = ckr*czr - cki*czi
940  rak = 1.0d0/ak
941  cki = (ckr*czi+cki*czr)*rak
942  ckr = str*rak
943  s1r = ckr*fr - cki*fi + s1r
944  s1i = ckr*fi + cki*fr + s1i
945  a1 = a1*t1*rak
946  bk = bk + ak + ak + 1.0d0
947  ak = ak + 1.0d0
948  IF (a1.GT.tol) GO TO 60
949  70 CONTINUE
950  yr(1) = s1r
951  yi(1) = s1i
952  IF (koded.EQ.1) RETURN
953  CALL zexp(zr, zi, str, sti)
954  CALL zmlt(s1r, s1i, str, sti, yr(1), yi(1))
955  RETURN
956 !-----------------------------------------------------------------------
957 ! GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
958 !-----------------------------------------------------------------------
959  80 CONTINUE
960  IF (caz.LT.tol) GO TO 100
961  CALL zmlt(zr, zi, zr, zi, czr, czi)
962  czr = 0.25d0*czr
963  czi = 0.25d0*czi
964  t1 = 0.25d0*caz*caz
965  90 CONTINUE
966  fr = (fr*ak+pr+qr)/bk
967  fi = (fi*ak+pi+qi)/bk
968  str = 1.0d0/(ak-dnu)
969  pr = pr*str
970  pi = pi*str
971  str = 1.0d0/(ak+dnu)
972  qr = qr*str
973  qi = qi*str
974  str = ckr*czr - cki*czi
975  rak = 1.0d0/ak
976  cki = (ckr*czi+cki*czr)*rak
977  ckr = str*rak
978  s1r = ckr*fr - cki*fi + s1r
979  s1i = ckr*fi + cki*fr + s1i
980  str = pr - fr*ak
981  sti = pi - fi*ak
982  s2r = ckr*str - cki*sti + s2r
983  s2i = ckr*sti + cki*str + s2i
984  a1 = a1*t1*rak
985  bk = bk + ak + ak + 1.0d0
986  ak = ak + 1.0d0
987  IF (a1.GT.tol) GO TO 90
988  100 CONTINUE
989  kflag = 2
990  a1 = fnu + 1.0d0
991  ak = a1*dabs(smur)
992  IF (ak.GT.alim) kflag = 3
993  str = cssr(kflag)
994  p2r = s2r*str
995  p2i = s2i*str
996  CALL zmlt(p2r, p2i, rzr, rzi, s2r, s2i)
997  s1r = s1r*str
998  s1i = s1i*str
999  IF (koded.EQ.1) GO TO 210
1000  CALL zexp(zr, zi, fr, fi)
1001  CALL zmlt(s1r, s1i, fr, fi, s1r, s1i)
1002  CALL zmlt(s2r, s2i, fr, fi, s2r, s2i)
1003  GO TO 210
1004 !-----------------------------------------------------------------------
1005 ! IFLAG=0 MEANS NO UNDERFLOW OCCURRED
1006 ! IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
1007 ! KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
1008 ! RECURSION
1009 !-----------------------------------------------------------------------
1010  110 CONTINUE
1011  CALL zsqrt(zr, zi, str, sti)
1012  CALL zdiv(rthpi, czeroi, str, sti, coefr, coefi)
1013  kflag = 2
1014  IF (koded.EQ.2) GO TO 120
1015  IF (zr.GT.alim) GO TO 290
1016 ! BLANK LINE
1017  str = dexp(-zr)*cssr(kflag)
1018  sti = -str*dsin(zi)
1019  str = str*dcos(zi)
1020  CALL zmlt(coefr, coefi, str, sti, coefr, coefi)
1021  120 CONTINUE
1022  IF (dabs(dnu).EQ.0.5d0) GO TO 300
1023 !-----------------------------------------------------------------------
1024 ! MILLER ALGORITHM FOR CABS(Z).GT.R1
1025 !-----------------------------------------------------------------------
1026  ak = dcos(dpi*dnu)
1027  ak = dabs(ak)
1028  IF (ak.EQ.czeror) GO TO 300
1029  fhs = dabs(0.25d0-dnu2)
1030  IF (fhs.EQ.czeror) GO TO 300
1031 !-----------------------------------------------------------------------
1032 ! COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
1033 ! DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
1034 ! 12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
1035 ! TOL WHERE B IS THE BASE OF THE ARITHMETIC.
1036 !-----------------------------------------------------------------------
1037  t1 = dble(float(i1mach(14)-1))
1038  t1 = t1*d1mach(5)*3.321928094d0
1039  t1 = dmax1(t1,12.0d0)
1040  t1 = dmin1(t1,60.0d0)
1041  t2 = tth*t1 - 6.0d0
1042  IF (zr.NE.0.0d0) GO TO 130
1043  t1 = hpi
1044  GO TO 140
1045  130 CONTINUE
1046  t1 = datan(zi/zr)
1047  t1 = dabs(t1)
1048  140 CONTINUE
1049  IF (t2.GT.caz) GO TO 170
1050 !-----------------------------------------------------------------------
1051 ! FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
1052 !-----------------------------------------------------------------------
1053  etest = ak/(dpi*caz*tol)
1054  fk = coner
1055  IF (etest.LT.coner) GO TO 180
1056  fks = ctwor
1057  ckr = caz + caz + ctwor
1058  p1r = czeror
1059  p2r = coner
1060  DO 150 i=1,kmax
1061  ak = fhs/fks
1062  cbr = ckr/(fk+coner)
1063  ptr = p2r
1064  p2r = cbr*p2r - p1r*ak
1065  p1r = ptr
1066  ckr = ckr + ctwor
1067  fks = fks + fk + fk + ctwor
1068  fhs = fhs + fk + fk
1069  fk = fk + coner
1070  str = dabs(p2r)*fk
1071  IF (etest.LT.str) GO TO 160
1072  150 CONTINUE
1073  GO TO 310
1074  160 CONTINUE
1075  fk = fk + spi*t1*dsqrt(t2/caz)
1076  fhs = dabs(0.25d0-dnu2)
1077  GO TO 180
1078  170 CONTINUE
1079 !-----------------------------------------------------------------------
1080 ! COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
1081 !-----------------------------------------------------------------------
1082  a2 = dsqrt(caz)
1083  ak = fpi*ak/(tol*dsqrt(a2))
1084  aa = 3.0d0*t1/(1.0d0+caz)
1085  bb = 14.7d0*t1/(28.0d0+caz)
1086  ak = (dlog(ak)+caz*dcos(aa)/(1.0d0+0.008d0*caz))/dcos(bb)
1087  fk = 0.12125d0*ak*ak/caz + 1.5d0
1088  180 CONTINUE
1089 !-----------------------------------------------------------------------
1090 ! BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
1091 !-----------------------------------------------------------------------
1092  k = int(sngl(fk))
1093  fk = dble(float(k))
1094  fks = fk*fk
1095  p1r = czeror
1096  p1i = czeroi
1097  p2r = tol
1098  p2i = czeroi
1099  csr = p2r
1100  csi = p2i
1101  DO 190 i=1,k
1102  a1 = fks - fk
1103  ak = (fks+fk)/(a1+fhs)
1104  rak = 2.0d0/(fk+coner)
1105  cbr = (fk+zr)*rak
1106  cbi = zi*rak
1107  ptr = p2r
1108  pti = p2i
1109  p2r = (ptr*cbr-pti*cbi-p1r)*ak
1110  p2i = (pti*cbr+ptr*cbi-p1i)*ak
1111  p1r = ptr
1112  p1i = pti
1113  csr = csr + p2r
1114  csi = csi + p2i
1115  fks = a1 - fk + coner
1116  fk = fk - coner
1117  190 CONTINUE
1118 !-----------------------------------------------------------------------
1119 ! COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
1120 ! SCALING
1121 !-----------------------------------------------------------------------
1122  tm = zabs(csr,csi)
1123  ptr = 1.0d0/tm
1124  s1r = p2r*ptr
1125  s1i = p2i*ptr
1126  csr = csr*ptr
1127  csi = -csi*ptr
1128  CALL zmlt(coefr, coefi, s1r, s1i, str, sti)
1129  CALL zmlt(str, sti, csr, csi, s1r, s1i)
1130  IF (inu.GT.0 .OR. n.GT.1) GO TO 200
1131  zdr = zr
1132  zdi = zi
1133  IF(iflag.EQ.1) GO TO 270
1134  GO TO 240
1135  200 CONTINUE
1136 !-----------------------------------------------------------------------
1137 ! COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
1138 !-----------------------------------------------------------------------
1139  tm = zabs(p2r,p2i)
1140  ptr = 1.0d0/tm
1141  p1r = p1r*ptr
1142  p1i = p1i*ptr
1143  p2r = p2r*ptr
1144  p2i = -p2i*ptr
1145  CALL zmlt(p1r, p1i, p2r, p2i, ptr, pti)
1146  str = dnu + 0.5d0 - ptr
1147  sti = -pti
1148  CALL zdiv(str, sti, zr, zi, str, sti)
1149  str = str + 1.0d0
1150  CALL zmlt(str, sti, s1r, s1i, s2r, s2i)
1151 !-----------------------------------------------------------------------
1152 ! FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
1153 ! SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
1154 !-----------------------------------------------------------------------
1155  210 CONTINUE
1156  str = dnu + 1.0d0
1157  ckr = str*rzr
1158  cki = str*rzi
1159  IF (n.EQ.1) inu = inu - 1
1160  IF (inu.GT.0) GO TO 220
1161  IF (n.GT.1) GO TO 215
1162  s1r = s2r
1163  s1i = s2i
1164  215 CONTINUE
1165  zdr = zr
1166  zdi = zi
1167  IF(iflag.EQ.1) GO TO 270
1168  GO TO 240
1169  220 CONTINUE
1170  inub = 1
1171  IF(iflag.EQ.1) GO TO 261
1172  225 CONTINUE
1173  p1r = csrr(kflag)
1174  ascle = bry(kflag)
1175  DO 230 i=inub,inu
1176  str = s2r
1177  sti = s2i
1178  s2r = ckr*str - cki*sti + s1r
1179  s2i = ckr*sti + cki*str + s1i
1180  s1r = str
1181  s1i = sti
1182  ckr = ckr + rzr
1183  cki = cki + rzi
1184  IF (kflag.GE.3) GO TO 230
1185  p2r = s2r*p1r
1186  p2i = s2i*p1r
1187  str = dabs(p2r)
1188  sti = dabs(p2i)
1189  p2m = dmax1(str,sti)
1190  IF (p2m.LE.ascle) GO TO 230
1191  kflag = kflag + 1
1192  ascle = bry(kflag)
1193  s1r = s1r*p1r
1194  s1i = s1i*p1r
1195  s2r = p2r
1196  s2i = p2i
1197  str = cssr(kflag)
1198  s1r = s1r*str
1199  s1i = s1i*str
1200  s2r = s2r*str
1201  s2i = s2i*str
1202  p1r = csrr(kflag)
1203  230 CONTINUE
1204  IF (n.NE.1) GO TO 240
1205  s1r = s2r
1206  s1i = s2i
1207  240 CONTINUE
1208  str = csrr(kflag)
1209  yr(1) = s1r*str
1210  yi(1) = s1i*str
1211  IF (n.EQ.1) RETURN
1212  yr(2) = s2r*str
1213  yi(2) = s2i*str
1214  IF (n.EQ.2) RETURN
1215  kk = 2
1216  250 CONTINUE
1217  kk = kk + 1
1218  IF (kk.GT.n) RETURN
1219  p1r = csrr(kflag)
1220  ascle = bry(kflag)
1221  DO 260 i=kk,n
1222  p2r = s2r
1223  p2i = s2i
1224  s2r = ckr*p2r - cki*p2i + s1r
1225  s2i = cki*p2r + ckr*p2i + s1i
1226  s1r = p2r
1227  s1i = p2i
1228  ckr = ckr + rzr
1229  cki = cki + rzi
1230  p2r = s2r*p1r
1231  p2i = s2i*p1r
1232  yr(i) = p2r
1233  yi(i) = p2i
1234  IF (kflag.GE.3) GO TO 260
1235  str = dabs(p2r)
1236  sti = dabs(p2i)
1237  p2m = dmax1(str,sti)
1238  IF (p2m.LE.ascle) GO TO 260
1239  kflag = kflag + 1
1240  ascle = bry(kflag)
1241  s1r = s1r*p1r
1242  s1i = s1i*p1r
1243  s2r = p2r
1244  s2i = p2i
1245  str = cssr(kflag)
1246  s1r = s1r*str
1247  s1i = s1i*str
1248  s2r = s2r*str
1249  s2i = s2i*str
1250  p1r = csrr(kflag)
1251  260 CONTINUE
1252  RETURN
1253 !-----------------------------------------------------------------------
1254 ! IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
1255 !-----------------------------------------------------------------------
1256  261 CONTINUE
1257  helim = 0.5d0*elim
1258  elm = dexp(-elim)
1259  celmr = elm
1260  ascle = bry(1)
1261  zdr = zr
1262  zdi = zi
1263  ic = -1
1264  j = 2
1265  DO 262 i=1,inu
1266  str = s2r
1267  sti = s2i
1268  s2r = str*ckr-sti*cki+s1r
1269  s2i = sti*ckr+str*cki+s1i
1270  s1r = str
1271  s1i = sti
1272  ckr = ckr+rzr
1273  cki = cki+rzi
1274  as = zabs(s2r,s2i)
1275  alas = dlog(as)
1276  p2r = -zdr+alas
1277  IF(p2r.LT.(-elim)) GO TO 263
1278  CALL zlog(s2r,s2i,str,sti,idum)
1279  p2r = -zdr+str
1280  p2i = -zdi+sti
1281  p2m = dexp(p2r)/tol
1282  p1r = p2m*dcos(p2i)
1283  p1i = p2m*dsin(p2i)
1284  CALL zuchk(p1r,p1i,nw,ascle,tol)
1285  IF(nw.NE.0) GO TO 263
1286  j = 3 - j
1287  cyr(j) = p1r
1288  cyi(j) = p1i
1289  IF(ic.EQ.(i-1)) GO TO 264
1290  ic = i
1291  GO TO 262
1292  263 CONTINUE
1293  IF(alas.LT.helim) GO TO 262
1294  zdr = zdr-elim
1295  s1r = s1r*celmr
1296  s1i = s1i*celmr
1297  s2r = s2r*celmr
1298  s2i = s2i*celmr
1299  262 CONTINUE
1300  IF(n.NE.1) GO TO 270
1301  s1r = s2r
1302  s1i = s2i
1303  GO TO 270
1304  264 CONTINUE
1305  kflag = 1
1306  inub = i+1
1307  s2r = cyr(j)
1308  s2i = cyi(j)
1309  j = 3 - j
1310  s1r = cyr(j)
1311  s1i = cyi(j)
1312  IF(inub.LE.inu) GO TO 225
1313  IF(n.NE.1) GO TO 240
1314  s1r = s2r
1315  s1i = s2i
1316  GO TO 240
1317  270 CONTINUE
1318  yr(1) = s1r
1319  yi(1) = s1i
1320  IF(n.EQ.1) GO TO 280
1321  yr(2) = s2r
1322  yi(2) = s2i
1323  280 CONTINUE
1324  ascle = bry(1)
1325  CALL zkscl(zdr,zdi,fnu,n,yr,yi,nz,rzr,rzi,ascle,tol,elim)
1326  inu = n - nz
1327  IF (inu.LE.0) RETURN
1328  kk = nz + 1
1329  s1r = yr(kk)
1330  s1i = yi(kk)
1331  yr(kk) = s1r*csrr(1)
1332  yi(kk) = s1i*csrr(1)
1333  IF (inu.EQ.1) RETURN
1334  kk = nz + 2
1335  s2r = yr(kk)
1336  s2i = yi(kk)
1337  yr(kk) = s2r*csrr(1)
1338  yi(kk) = s2i*csrr(1)
1339  IF (inu.EQ.2) RETURN
1340  t2 = fnu + dble(float(kk-1))
1341  ckr = t2*rzr
1342  cki = t2*rzi
1343  kflag = 1
1344  GO TO 250
1345  290 CONTINUE
1346 !-----------------------------------------------------------------------
1347 ! SCALE BY DEXP(Z), IFLAG = 1 CASES
1348 !-----------------------------------------------------------------------
1349  koded = 2
1350  iflag = 1
1351  kflag = 2
1352  GO TO 120
1353 !-----------------------------------------------------------------------
1354 ! FNU=HALF ODD INTEGER CASE, DNU=-0.5
1355 !-----------------------------------------------------------------------
1356  300 CONTINUE
1357  s1r = coefr
1358  s1i = coefi
1359  s2r = coefr
1360  s2i = coefi
1361  GO TO 210
1362 
1363  310 CONTINUE
1364  nz=-2
1365  RETURN
1366 END
1367 
1368 SUBROUTINE zacon(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, FNUL, TOL, ELIM, ALIM)
1369 USE utilit
1370 USE complex
1371 !***BEGIN PROLOGUE ZACON
1372 !***REFER TO ZBESK,ZBESH
1373 !
1374 ! ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA
1375 !
1376 ! K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
1377 ! MP=PI*MR*CMPLX(0.0,1.0)
1378 !
1379 ! TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
1380 ! HALF Z PLANE
1381 !
1382 !***ROUTINES CALLED ZBINU,ZBKNU,ZS1S2,D1MACH,ZABS,ZMLT
1383 !***END PROLOGUE ZACON
1384 ! COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST,
1385 ! *S1,S2,Y,Z,ZN
1386  DOUBLE PRECISION alim, arg, ascle, as2, azn, bry, bscle, cki, &
1387  ckr, conei, coner, cpn, cscl, cscr, csgni, csgnr, cspni, cspnr, &
1388  csr, csrr, cssr, cyi, cyr, c1i, c1m, c1r, c2i, c2r, elim, fmr, &
1389  fn, fnu, fnul, pi, pti, ptr, razn, rl, rzi, rzr, sc1i, sc1r, &
1390  sc2i, sc2r, sgn, spn, sti, str, s1i, s1r, s2i, s2r, tol, yi, yr, &
1391  yy, zeroi, zeror, zi, zni, znr, zr
1392  INTEGER i, inu, iuf, kflag, kode, mr, n, nn, nw, nz
1393  dimension yr(n), yi(n), cyr(2), cyi(2), cssr(3), csrr(3), bry(3)
1394  DATA pi / 3.14159265358979324d0 /
1395  DATA zeror,zeroi,coner,conei / 0.0d0,0.0d0,1.0d0,0.0d0 /
1396  nz = 0
1397  znr = -zr
1398  zni = -zi
1399  nn = n
1400  CALL zbinu(znr, zni, fnu, kode, nn, yr, yi, nw, rl, fnul, tol, elim, alim)
1401  IF (nw.LT.0) GO TO 90
1402 !-----------------------------------------------------------------------
1403 ! ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
1404 !-----------------------------------------------------------------------
1405  nn = min0(2,n)
1406  CALL zbknu(znr, zni, fnu, kode, nn, cyr, cyi, nw, tol, elim, alim)
1407  IF (nw.NE.0) GO TO 90
1408  s1r = cyr(1)
1409  s1i = cyi(1)
1410  fmr = dble(float(mr))
1411  sgn = -dsign(pi,fmr)
1412  csgnr = zeror
1413  csgni = sgn
1414  IF (kode.EQ.1) GO TO 10
1415  yy = -zni
1416  cpn = dcos(yy)
1417  spn = dsin(yy)
1418  CALL zmlt(csgnr, csgni, cpn, spn, csgnr, csgni)
1419  10 CONTINUE
1420 !-----------------------------------------------------------------------
1421 ! CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
1422 ! WHEN FNU IS LARGE
1423 !-----------------------------------------------------------------------
1424  inu = int(sngl(fnu))
1425  arg = (fnu-dble(float(inu)))*sgn
1426  cpn = dcos(arg)
1427  spn = dsin(arg)
1428  cspnr = cpn
1429  cspni = spn
1430  IF (mod(inu,2).EQ.0) GO TO 20
1431  cspnr = -cspnr
1432  cspni = -cspni
1433  20 CONTINUE
1434  iuf = 0
1435  c1r = s1r
1436  c1i = s1i
1437  c2r = yr(1)
1438  c2i = yi(1)
1439  ascle = 1.0d+3*d1mach(1)/tol
1440  IF (kode.EQ.1) GO TO 30
1441  CALL zs1s2(znr, zni, c1r, c1i, c2r, c2i, nw, ascle, alim, iuf)
1442  nz = nz + nw
1443  sc1r = c1r
1444  sc1i = c1i
1445  30 CONTINUE
1446  CALL zmlt(cspnr, cspni, c1r, c1i, str, sti)
1447  CALL zmlt(csgnr, csgni, c2r, c2i, ptr, pti)
1448  yr(1) = str + ptr
1449  yi(1) = sti + pti
1450  IF (n.EQ.1) RETURN
1451  cspnr = -cspnr
1452  cspni = -cspni
1453  s2r = cyr(2)
1454  s2i = cyi(2)
1455  c1r = s2r
1456  c1i = s2i
1457  c2r = yr(2)
1458  c2i = yi(2)
1459  IF (kode.EQ.1) GO TO 40
1460  CALL zs1s2(znr, zni, c1r, c1i, c2r, c2i, nw, ascle, alim, iuf)
1461  nz = nz + nw
1462  sc2r = c1r
1463  sc2i = c1i
1464  40 CONTINUE
1465  CALL zmlt(cspnr, cspni, c1r, c1i, str, sti)
1466  CALL zmlt(csgnr, csgni, c2r, c2i, ptr, pti)
1467  yr(2) = str + ptr
1468  yi(2) = sti + pti
1469  IF (n.EQ.2) RETURN
1470  cspnr = -cspnr
1471  cspni = -cspni
1472  azn = zabs(znr,zni)
1473  razn = 1.0d0/azn
1474  str = znr*razn
1475  sti = -zni*razn
1476  rzr = (str+str)*razn
1477  rzi = (sti+sti)*razn
1478  fn = fnu + 1.0d0
1479  ckr = fn*rzr
1480  cki = fn*rzi
1481 !-----------------------------------------------------------------------
1482 ! SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
1483 !-----------------------------------------------------------------------
1484  cscl = 1.0d0/tol
1485  cscr = tol
1486  cssr(1) = cscl
1487  cssr(2) = coner
1488  cssr(3) = cscr
1489  csrr(1) = cscr
1490  csrr(2) = coner
1491  csrr(3) = cscl
1492  bry(1) = ascle
1493  bry(2) = 1.0d0/ascle
1494  bry(3) = d1mach(2)
1495  as2 = zabs(s2r,s2i)
1496  kflag = 2
1497  IF (as2.GT.bry(1)) GO TO 50
1498  kflag = 1
1499  GO TO 60
1500  50 CONTINUE
1501  IF (as2.LT.bry(2)) GO TO 60
1502  kflag = 3
1503  60 CONTINUE
1504  bscle = bry(kflag)
1505  s1r = s1r*cssr(kflag)
1506  s1i = s1i*cssr(kflag)
1507  s2r = s2r*cssr(kflag)
1508  s2i = s2i*cssr(kflag)
1509  csr = csrr(kflag)
1510  DO 80 i=3,n
1511  str = s2r
1512  sti = s2i
1513  s2r = ckr*str - cki*sti + s1r
1514  s2i = ckr*sti + cki*str + s1i
1515  s1r = str
1516  s1i = sti
1517  c1r = s2r*csr
1518  c1i = s2i*csr
1519  str = c1r
1520  sti = c1i
1521  c2r = yr(i)
1522  c2i = yi(i)
1523  IF (kode.EQ.1) GO TO 70
1524  IF (iuf.LT.0) GO TO 70
1525  CALL zs1s2(znr, zni, c1r, c1i, c2r, c2i, nw, ascle, alim, iuf)
1526  nz = nz + nw
1527  sc1r = sc2r
1528  sc1i = sc2i
1529  sc2r = c1r
1530  sc2i = c1i
1531  IF (iuf.NE.3) GO TO 70
1532  iuf = -4
1533  s1r = sc1r*cssr(kflag)
1534  s1i = sc1i*cssr(kflag)
1535  s2r = sc2r*cssr(kflag)
1536  s2i = sc2i*cssr(kflag)
1537  str = sc2r
1538  sti = sc2i
1539  70 CONTINUE
1540  ptr = cspnr*c1r - cspni*c1i
1541  pti = cspnr*c1i + cspni*c1r
1542  yr(i) = ptr + csgnr*c2r - csgni*c2i
1543  yi(i) = pti + csgnr*c2i + csgni*c2r
1544  ckr = ckr + rzr
1545  cki = cki + rzi
1546  cspnr = -cspnr
1547  cspni = -cspni
1548  IF (kflag.GE.3) GO TO 80
1549  ptr = dabs(c1r)
1550  pti = dabs(c1i)
1551  c1m = dmax1(ptr,pti)
1552  IF (c1m.LE.bscle) GO TO 80
1553  kflag = kflag + 1
1554  bscle = bry(kflag)
1555  s1r = s1r*csr
1556  s1i = s1i*csr
1557  s2r = str
1558  s2i = sti
1559  s1r = s1r*cssr(kflag)
1560  s1i = s1i*cssr(kflag)
1561  s2r = s2r*cssr(kflag)
1562  s2i = s2i*cssr(kflag)
1563  csr = csrr(kflag)
1564  80 CONTINUE
1565  RETURN
1566  90 CONTINUE
1567  nz = -1
1568  IF(nw.EQ.(-2)) nz=-2
1569  RETURN
1570 END
1571 
1572 SUBROUTINE zbunk(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
1573 !***BEGIN PROLOGUE ZBUNK
1574 !***REFER TO ZBESK,ZBESH
1575 !
1576 ! ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL.
1577 ! ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR K(FNU,Z)
1578 ! IN ZUNK1 AND THE EXPANSION FOR H(2,FNU,Z) IN ZUNK2
1579 !
1580 !***ROUTINES CALLED ZUNK1,ZUNK2
1581 !***END PROLOGUE ZBUNK
1582 ! COMPLEX Y,Z
1583  DOUBLE PRECISION alim, ax, ay, elim, fnu, tol, yi, yr, zi, zr
1584  INTEGER kode, mr, n, nz
1585  dimension yr(1), yi(1)
1586  nz = 0
1587  ax = dabs(zr)*1.7321d0
1588  ay = dabs(zi)
1589  IF (ay.GT.ax) GO TO 10
1590 !-----------------------------------------------------------------------
1591 ! ASYMPTOTIC EXPANSION FOR K(FNU,Z) FOR LARGE FNU APPLIED IN
1592 ! -PI/3.LE.ARG(Z).LE.PI/3
1593 !-----------------------------------------------------------------------
1594  CALL zunk1(zr, zi, fnu, kode, mr, n, yr, yi, nz, tol, elim, alim)
1595  GO TO 20
1596  10 CONTINUE
1597 !-----------------------------------------------------------------------
1598 ! ASYMPTOTIC EXPANSION FOR H(2,FNU,Z*EXP(M*HPI)) FOR LARGE FNU
1599 ! APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
1600 ! AND HPI=PI/2
1601 !-----------------------------------------------------------------------
1602  CALL zunk2(zr, zi, fnu, kode, mr, n, yr, yi, nz, tol, elim, alim)
1603  20 CONTINUE
1604  RETURN
1605 END
1606 
1607 SUBROUTINE zunik(ZRR, ZRI, FNU, IKFLG, IPMTR, TOL, INIT, PHIR, &
1608  PHII, ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
1609 USE complex
1610 !***BEGIN PROLOGUE ZUNIK
1611 !***REFER TO ZBESI,ZBESK
1612 !
1613 ! ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC
1614 ! EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2
1615 ! RESPECTIVELY BY
1616 !
1617 ! W(FNU,ZR) = PHI*EXP(ZETA)*SUM
1618 !
1619 ! WHERE ZETA=-ZETA1 + ZETA2 OR
1620 ! ZETA1 - ZETA2
1621 !
1622 ! THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE
1623 ! SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG=
1624 ! 1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK
1625 ! ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI,
1626 ! ZETA1,ZETA2.
1627 !
1628 !***ROUTINES CALLED ZDIV,ZLOG,ZSQRT
1629 !***END PROLOGUE ZUNIK
1630 ! COMPLEX CFN,CON,CONE,CRFN,CWRK,CZERO,PHI,S,SR,SUM,T,T2,ZETA1,
1631 ! *ZETA2,ZN,ZR
1632  DOUBLE PRECISION ac, c, con, conei, coner, crfni, crfnr, cwrki, &
1633  cwrkr, fnu, phii, phir, rfn, si, sr, sri, srr, sti, str, sumi, &
1634  sumr, test, ti, tol, tr, t2i, t2r, zeroi, zeror, zeta1i, zeta1r, &
1635  zeta2i, zeta2r, zni, znr, zri, zrr
1636  INTEGER i, idum, ikflg, init, ipmtr, j, k, l
1637  dimension c(120), cwrkr(16), cwrki(16), con(2)
1638  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
1639  DATA con(1), con(2) / &
1640  3.98942280401432678d-01, 1.25331413731550025d+00 /
1641  DATA c(1), c(2), c(3), c(4), c(5), c(6), c(7), c(8), c(9), c(10), &
1642  c(11), c(12), c(13), c(14), c(15), c(16), c(17), c(18), &
1643  c(19), c(20), c(21), c(22), c(23), c(24)/ &
1644  1.00000000000000000d+00, -2.08333333333333333d-01, &
1645  1.25000000000000000d-01, 3.34201388888888889d-01, &
1646  -4.01041666666666667d-01, 7.03125000000000000d-02, &
1647  -1.02581259645061728d+00, 1.84646267361111111d+00, &
1648  -8.91210937500000000d-01, 7.32421875000000000d-02, &
1649  4.66958442342624743d+00, -1.12070026162229938d+01, &
1650  8.78912353515625000d+00, -2.36408691406250000d+00, &
1651  1.12152099609375000d-01, -2.82120725582002449d+01, &
1652  8.46362176746007346d+01, -9.18182415432400174d+01, &
1653  4.25349987453884549d+01, -7.36879435947963170d+00, &
1654  2.27108001708984375d-01, 2.12570130039217123d+02, &
1655  -7.65252468141181642d+02, 1.05999045252799988d+03/
1656  DATA c(25), c(26), c(27), c(28), c(29), c(30), c(31), c(32), &
1657  c(33), c(34), c(35), c(36), c(37), c(38), c(39), c(40), &
1658  c(41), c(42), c(43), c(44), c(45), c(46), c(47), c(48)/ &
1659  -6.99579627376132541d+02, 2.18190511744211590d+02, &
1660  -2.64914304869515555d+01, 5.72501420974731445d-01, &
1661  -1.91945766231840700d+03, 8.06172218173730938d+03, &
1662  -1.35865500064341374d+04, 1.16553933368645332d+04, &
1663  -5.30564697861340311d+03, 1.20090291321635246d+03, &
1664  -1.08090919788394656d+02, 1.72772750258445740d+00, &
1665  2.02042913309661486d+04, -9.69805983886375135d+04, &
1666  1.92547001232531532d+05, -2.03400177280415534d+05, &
1667  1.22200464983017460d+05, -4.11926549688975513d+04, &
1668  7.10951430248936372d+03, -4.93915304773088012d+02, &
1669  6.07404200127348304d+00, -2.42919187900551333d+05, &
1670  1.31176361466297720d+06, -2.99801591853810675d+06/
1671  DATA c(49), c(50), c(51), c(52), c(53), c(54), c(55), c(56), &
1672  c(57), c(58), c(59), c(60), c(61), c(62), c(63), c(64), &
1673  c(65), c(66), c(67), c(68), c(69), c(70), c(71), c(72)/ &
1674  3.76327129765640400d+06, -2.81356322658653411d+06, &
1675  1.26836527332162478d+06, -3.31645172484563578d+05, &
1676  4.52187689813627263d+04, -2.49983048181120962d+03, &
1677  2.43805296995560639d+01, 3.28446985307203782d+06, &
1678  -1.97068191184322269d+07, 5.09526024926646422d+07, &
1679  -7.41051482115326577d+07, 6.63445122747290267d+07, &
1680  -3.75671766607633513d+07, 1.32887671664218183d+07, &
1681  -2.78561812808645469d+06, 3.08186404612662398d+05, &
1682  -1.38860897537170405d+04, 1.10017140269246738d+02, &
1683  -4.93292536645099620d+07, 3.25573074185765749d+08, &
1684  -9.39462359681578403d+08, 1.55359689957058006d+09, &
1685  -1.62108055210833708d+09, 1.10684281682301447d+09/
1686  DATA c(73), c(74), c(75), c(76), c(77), c(78), c(79), c(80), &
1687  c(81), c(82), c(83), c(84), c(85), c(86), c(87), c(88), &
1688  c(89), c(90), c(91), c(92), c(93), c(94), c(95), c(96)/ &
1689  -4.95889784275030309d+08, 1.42062907797533095d+08, &
1690  -2.44740627257387285d+07, 2.24376817792244943d+06, &
1691  -8.40054336030240853d+04, 5.51335896122020586d+02, &
1692  8.14789096118312115d+08, -5.86648149205184723d+09, &
1693  1.86882075092958249d+10, -3.46320433881587779d+10, &
1694  4.12801855797539740d+10, -3.30265997498007231d+10, &
1695  1.79542137311556001d+10, -6.56329379261928433d+09, &
1696  1.55927986487925751d+09, -2.25105661889415278d+08, &
1697  1.73951075539781645d+07, -5.49842327572288687d+05, &
1698  3.03809051092238427d+03, -1.46792612476956167d+10, &
1699  1.14498237732025810d+11, -3.99096175224466498d+11, &
1700  8.19218669548577329d+11, -1.09837515608122331d+12/
1701  DATA c(97), c(98), c(99), c(100), c(101), c(102), c(103), c(104), &
1702  c(105), c(106), c(107), c(108), c(109), c(110), c(111), &
1703  c(112), c(113), c(114), c(115), c(116), c(117), c(118)/ &
1704  1.00815810686538209d+12, -6.45364869245376503d+11, &
1705  2.87900649906150589d+11, -8.78670721780232657d+10, &
1706  1.76347306068349694d+10, -2.16716498322379509d+09, &
1707  1.43157876718888981d+08, -3.87183344257261262d+06, &
1708  1.82577554742931747d+04, 2.86464035717679043d+11, &
1709  -2.40629790002850396d+12, 9.10934118523989896d+12, &
1710  -2.05168994109344374d+13, 3.05651255199353206d+13, &
1711  -3.16670885847851584d+13, 2.33483640445818409d+13, &
1712  -1.23204913055982872d+13, 4.61272578084913197d+12, &
1713  -1.19655288019618160d+12, 2.05914503232410016d+11, &
1714  -2.18229277575292237d+10, 1.24700929351271032d+09/
1715  DATA c(119), c(120)/ &
1716  -2.91883881222208134d+07, 1.18838426256783253d+05/
1717 
1718  IF (init.NE.0) GO TO 40
1719 !-----------------------------------------------------------------------
1720 ! INITIALIZE ALL VARIABLES
1721 !-----------------------------------------------------------------------
1722  rfn = 1.0d0/fnu
1723  tr = zrr*rfn
1724  ti = zri*rfn
1725  sr = coner + (tr*tr-ti*ti)
1726  si = conei + (tr*ti+ti*tr)
1727  CALL zsqrt(sr, si, srr, sri)
1728  str = coner + srr
1729  sti = conei + sri
1730  CALL zdiv(str, sti, tr, ti, znr, zni)
1731  CALL zlog(znr, zni, str, sti, idum)
1732  zeta1r = fnu*str
1733  zeta1i = fnu*sti
1734  zeta2r = fnu*srr
1735  zeta2i = fnu*sri
1736  CALL zdiv(coner, conei, srr, sri, tr, ti)
1737  srr = tr*rfn
1738  sri = ti*rfn
1739  CALL zsqrt(srr, sri, cwrkr(16), cwrki(16))
1740  phir = cwrkr(16)*con(ikflg)
1741  phii = cwrki(16)*con(ikflg)
1742  IF (ipmtr.NE.0) RETURN
1743  CALL zdiv(coner, conei, sr, si, t2r, t2i)
1744  cwrkr(1) = coner
1745  cwrki(1) = conei
1746  crfnr = coner
1747  crfni = conei
1748  ac = 1.0d0
1749  l = 1
1750  DO 20 k=2,15
1751  sr = zeror
1752  si = zeroi
1753  DO 10 j=1,k
1754  l = l + 1
1755  str = sr*t2r - si*t2i + c(l)
1756  si = sr*t2i + si*t2r
1757  sr = str
1758  10 CONTINUE
1759  str = crfnr*srr - crfni*sri
1760  crfni = crfnr*sri + crfni*srr
1761  crfnr = str
1762  cwrkr(k) = crfnr*sr - crfni*si
1763  cwrki(k) = crfnr*si + crfni*sr
1764  ac = ac*rfn
1765  test = dabs(cwrkr(k)) + dabs(cwrki(k))
1766  IF (ac.LT.tol .AND. test.LT.tol) GO TO 30
1767  20 CONTINUE
1768  k = 15
1769  30 CONTINUE
1770  init = k
1771  40 CONTINUE
1772  IF (ikflg.EQ.2) GO TO 60
1773 !-----------------------------------------------------------------------
1774 ! COMPUTE SUM FOR THE I FUNCTION
1775 !-----------------------------------------------------------------------
1776  sr = zeror
1777  si = zeroi
1778  DO 50 i=1,init
1779  sr = sr + cwrkr(i)
1780  si = si + cwrki(i)
1781  50 CONTINUE
1782  sumr = sr
1783  sumi = si
1784  phir = cwrkr(16)*con(1)
1785  phii = cwrki(16)*con(1)
1786  RETURN
1787  60 CONTINUE
1788 !-----------------------------------------------------------------------
1789 ! COMPUTE SUM FOR THE K FUNCTION
1790 !-----------------------------------------------------------------------
1791  sr = zeror
1792  si = zeroi
1793  tr = coner
1794  DO 70 i=1,init
1795  sr = sr + tr*cwrkr(i)
1796  si = si + tr*cwrki(i)
1797  tr = -tr
1798  70 CONTINUE
1799  sumr = sr
1800  sumi = si
1801  phir = cwrkr(16)*con(2)
1802  phii = cwrki(16)*con(2)
1803  RETURN
1804 END
1805 
1806 SUBROUTINE zunk1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
1807 USE utilit
1808 USE complex
1809 !***BEGIN PROLOGUE ZUNK1
1810 !***REFER TO ZBESK
1811 !
1812 ! ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
1813 ! RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
1814 ! UNIFORM ASYMPTOTIC EXPANSION.
1815 ! MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
1816 ! NZ=-1 MEANS AN OVERFLOW WILL OCCUR
1817 !
1818 !***ROUTINES CALLED ZKSCL,ZS1S2,ZUCHK,ZUNIK,D1MACH,ZABS
1819 !***END PROLOGUE ZUNK1
1820 ! COMPLEX CFN,CK,CONE,CRSC,CS,CSCL,CSGN,CSPN,CSR,CSS,CWRK,CY,CZERO,
1821 ! *C1,C2,PHI,PHID,RZ,SUM,SUMD,S1,S2,Y,Z,ZETA1,ZETA1D,ZETA2,ZETA2D,ZR
1822  DOUBLE PRECISION alim, ang, aphi, asc, ascle, bry, cki, ckr, &
1823  conei, coner, crsc, cscl, csgni, cspni, cspnr, csr, csrr, cssr, &
1824  cwrki, cwrkr, cyi, cyr, c1i, c1r, c2i, c2m, c2r, elim, fmr, fn, &
1825  fnf, fnu, phidi, phidr, phii, phir, pi, rast, razr, rs1, rzi, &
1826  rzr, sgn, sti, str, sumdi, sumdr, sumi, sumr, s1i, s1r, s2i, &
1827  s2r, tol, yi, yr, zeroi, zeror, zeta1i, zeta1r, zeta2i, zeta2r, &
1828  zet1di, zet1dr, zet2di, zet2dr, zi, zr, zri, zrr
1829  INTEGER i, ib, iflag, ifn, il, init, inu, iuf, k, kdflg, kflag, &
1830  kk, kode, mr, n, nw, nz, initd, ic, ipard, j, m
1831  dimension bry(3), init(2), yr(1), yi(1), sumr(2), sumi(2), &
1832  zeta1r(2), zeta1i(2), zeta2r(2), zeta2i(2), cyr(2), cyi(2), &
1833  cwrkr(16,3), cwrki(16,3), cssr(3), csrr(3), phir(2), phii(2)
1834  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
1835  DATA pi / 3.14159265358979324d0 /
1836 
1837  kdflg = 1
1838  nz = 0
1839 !-----------------------------------------------------------------------
1840 ! EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
1841 ! THE UNDERFLOW LIMIT
1842 !-----------------------------------------------------------------------
1843  cscl = 1.0d0/tol
1844  crsc = tol
1845  cssr(1) = cscl
1846  cssr(2) = coner
1847  cssr(3) = crsc
1848  csrr(1) = crsc
1849  csrr(2) = coner
1850  csrr(3) = cscl
1851  bry(1) = 1.0d+3*d1mach(1)/tol
1852  bry(2) = 1.0d0/bry(1)
1853  bry(3) = d1mach(2)
1854  zrr = zr
1855  zri = zi
1856  IF (zr.GE.0.0d0) GO TO 10
1857  zrr = -zr
1858  zri = -zi
1859  10 CONTINUE
1860  j = 2
1861  DO 70 i=1,n
1862 !-----------------------------------------------------------------------
1863 ! J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
1864 !-----------------------------------------------------------------------
1865  j = 3 - j
1866  fn = fnu + dble(float(i-1))
1867  init(j) = 0
1868  CALL zunik(zrr, zri, fn, 2, 0, tol, init(j), phir(j), phii(j), &
1869  zeta1r(j), zeta1i(j), zeta2r(j), zeta2i(j), sumr(j), sumi(j), &
1870  cwrkr(1,j), cwrki(1,j))
1871  IF (kode.EQ.1) GO TO 20
1872  str = zrr + zeta2r(j)
1873  sti = zri + zeta2i(j)
1874  rast = fn/zabs(str,sti)
1875  str = str*rast*rast
1876  sti = -sti*rast*rast
1877  s1r = zeta1r(j) - str
1878  s1i = zeta1i(j) - sti
1879  GO TO 30
1880  20 CONTINUE
1881  s1r = zeta1r(j) - zeta2r(j)
1882  s1i = zeta1i(j) - zeta2i(j)
1883  30 CONTINUE
1884  rs1 = s1r
1885 !-----------------------------------------------------------------------
1886 ! TEST FOR UNDERFLOW AND OVERFLOW
1887 !-----------------------------------------------------------------------
1888  IF (dabs(rs1).GT.elim) GO TO 60
1889  IF (kdflg.EQ.1) kflag = 2
1890  IF (dabs(rs1).LT.alim) GO TO 40
1891 !-----------------------------------------------------------------------
1892 ! REFINE TEST AND SCALE
1893 !-----------------------------------------------------------------------
1894  aphi = zabs(phir(j),phii(j))
1895  rs1 = rs1 + dlog(aphi)
1896  IF (dabs(rs1).GT.elim) GO TO 60
1897  IF (kdflg.EQ.1) kflag = 1
1898  IF (rs1.LT.0.0d0) GO TO 40
1899  IF (kdflg.EQ.1) kflag = 3
1900  40 CONTINUE
1901 !-----------------------------------------------------------------------
1902 ! SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
1903 ! EXPONENT EXTREMES
1904 !-----------------------------------------------------------------------
1905  s2r = phir(j)*sumr(j) - phii(j)*sumi(j)
1906  s2i = phir(j)*sumi(j) + phii(j)*sumr(j)
1907  str = dexp(s1r)*cssr(kflag)
1908  s1r = str*dcos(s1i)
1909  s1i = str*dsin(s1i)
1910  str = s2r*s1r - s2i*s1i
1911  s2i = s1r*s2i + s2r*s1i
1912  s2r = str
1913  IF (kflag.NE.1) GO TO 50
1914  CALL zuchk(s2r, s2i, nw, bry(1), tol)
1915  IF (nw.NE.0) GO TO 60
1916  50 CONTINUE
1917  cyr(kdflg) = s2r
1918  cyi(kdflg) = s2i
1919  yr(i) = s2r*csrr(kflag)
1920  yi(i) = s2i*csrr(kflag)
1921  IF (kdflg.EQ.2) GO TO 75
1922  kdflg = 2
1923  GO TO 70
1924  60 CONTINUE
1925  IF (rs1.GT.0.0d0) GO TO 300
1926 !-----------------------------------------------------------------------
1927 ! FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
1928 !-----------------------------------------------------------------------
1929  IF (zr.LT.0.0d0) GO TO 300
1930  kdflg = 1
1931  yr(i)=zeror
1932  yi(i)=zeroi
1933  nz=nz+1
1934  IF (i.EQ.1) GO TO 70
1935  IF ((yr(i-1).EQ.zeror).AND.(yi(i-1).EQ.zeroi)) GO TO 70
1936  yr(i-1)=zeror
1937  yi(i-1)=zeroi
1938  nz=nz+1
1939  70 CONTINUE
1940  i = n
1941  75 CONTINUE
1942  razr = 1.0d0/zabs(zrr,zri)
1943  str = zrr*razr
1944  sti = -zri*razr
1945  rzr = (str+str)*razr
1946  rzi = (sti+sti)*razr
1947  ckr = fn*rzr
1948  cki = fn*rzi
1949  ib = i + 1
1950  IF (n.LT.ib) GO TO 160
1951 !-----------------------------------------------------------------------
1952 ! TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
1953 ! ON UNDERFLOW.
1954 !-----------------------------------------------------------------------
1955  fn = fnu + dble(float(n-1))
1956  ipard = 1
1957  IF (mr.NE.0) ipard = 0
1958  initd = 0
1959  CALL zunik(zrr, zri, fn, 2, ipard, tol, initd, phidr, phidi, &
1960  zet1dr, zet1di, zet2dr, zet2di, sumdr, sumdi, cwrkr(1,3), &
1961  cwrki(1,3))
1962  IF (kode.EQ.1) GO TO 80
1963  str = zrr + zet2dr
1964  sti = zri + zet2di
1965  rast = fn/zabs(str,sti)
1966  str = str*rast*rast
1967  sti = -sti*rast*rast
1968  s1r = zet1dr - str
1969  s1i = zet1di - sti
1970  GO TO 90
1971  80 CONTINUE
1972  s1r = zet1dr - zet2dr
1973  s1i = zet1di - zet2di
1974  90 CONTINUE
1975  rs1 = s1r
1976  IF (dabs(rs1).GT.elim) GO TO 95
1977  IF (dabs(rs1).LT.alim) GO TO 100
1978 !-----------------------------------------------------------------------
1979 ! REFINE ESTIMATE AND TEST
1980 !-----------------------------------------------------------------------
1981  aphi = zabs(phidr,phidi)
1982  rs1 = rs1+dlog(aphi)
1983  IF (dabs(rs1).LT.elim) GO TO 100
1984  95 CONTINUE
1985  IF (dabs(rs1).GT.0.0d0) GO TO 300
1986 !-----------------------------------------------------------------------
1987 ! FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
1988 !-----------------------------------------------------------------------
1989  IF (zr.LT.0.0d0) GO TO 300
1990  nz = n
1991  DO 96 i=1,n
1992  yr(i) = zeror
1993  yi(i) = zeroi
1994  96 CONTINUE
1995  RETURN
1996 !-----------------------------------------------------------------------
1997 ! FORWARD RECUR FOR REMAINDER OF THE SEQUENCE
1998 !-----------------------------------------------------------------------
1999  100 CONTINUE
2000  s1r = cyr(1)
2001  s1i = cyi(1)
2002  s2r = cyr(2)
2003  s2i = cyi(2)
2004  c1r = csrr(kflag)
2005  ascle = bry(kflag)
2006  DO 120 i=ib,n
2007  c2r = s2r
2008  c2i = s2i
2009  s2r = ckr*c2r - cki*c2i + s1r
2010  s2i = ckr*c2i + cki*c2r + s1i
2011  s1r = c2r
2012  s1i = c2i
2013  ckr = ckr + rzr
2014  cki = cki + rzi
2015  c2r = s2r*c1r
2016  c2i = s2i*c1r
2017  yr(i) = c2r
2018  yi(i) = c2i
2019  IF (kflag.GE.3) GO TO 120
2020  str = dabs(c2r)
2021  sti = dabs(c2i)
2022  c2m = dmax1(str,sti)
2023  IF (c2m.LE.ascle) GO TO 120
2024  kflag = kflag + 1
2025  ascle = bry(kflag)
2026  s1r = s1r*c1r
2027  s1i = s1i*c1r
2028  s2r = c2r
2029  s2i = c2i
2030  s1r = s1r*cssr(kflag)
2031  s1i = s1i*cssr(kflag)
2032  s2r = s2r*cssr(kflag)
2033  s2i = s2i*cssr(kflag)
2034  c1r = csrr(kflag)
2035  120 CONTINUE
2036  160 CONTINUE
2037  IF (mr.EQ.0) RETURN
2038 !-----------------------------------------------------------------------
2039 ! ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
2040 !-----------------------------------------------------------------------
2041  nz = 0
2042  fmr = dble(float(mr))
2043  sgn = -dsign(pi,fmr)
2044 !-----------------------------------------------------------------------
2045 ! CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
2046 !-----------------------------------------------------------------------
2047  csgni = sgn
2048  inu = int(sngl(fnu))
2049  fnf = fnu - dble(float(inu))
2050  ifn = inu + n - 1
2051  ang = fnf*sgn
2052  cspnr = dcos(ang)
2053  cspni = dsin(ang)
2054  IF (mod(ifn,2).EQ.0) GO TO 170
2055  cspnr = -cspnr
2056  cspni = -cspni
2057  170 CONTINUE
2058  asc = bry(1)
2059  iuf = 0
2060  kk = n
2061  kdflg = 1
2062  ib = ib - 1
2063  ic = ib - 1
2064  DO 270 k=1,n
2065  fn = fnu + dble(float(kk-1))
2066 !-----------------------------------------------------------------------
2067 ! LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
2068 ! FUNCTION ABOVE
2069 !-----------------------------------------------------------------------
2070  m=3
2071  IF (n.GT.2) GO TO 175
2072  172 CONTINUE
2073  initd = init(j)
2074  phidr = phir(j)
2075  phidi = phii(j)
2076  zet1dr = zeta1r(j)
2077  zet1di = zeta1i(j)
2078  zet2dr = zeta2r(j)
2079  zet2di = zeta2i(j)
2080  sumdr = sumr(j)
2081  sumdi = sumi(j)
2082  m = j
2083  j = 3 - j
2084  GO TO 180
2085  175 CONTINUE
2086  IF ((kk.EQ.n).AND.(ib.LT.n)) GO TO 180
2087  IF ((kk.EQ.ib).OR.(kk.EQ.ic)) GO TO 172
2088  initd = 0
2089  180 CONTINUE
2090  CALL zunik(zrr, zri, fn, 1, 0, tol, initd, phidr, phidi, &
2091  zet1dr, zet1di, zet2dr, zet2di, sumdr, sumdi, &
2092  cwrkr(1,m), cwrki(1,m))
2093  IF (kode.EQ.1) GO TO 200
2094  str = zrr + zet2dr
2095  sti = zri + zet2di
2096  rast = fn/zabs(str,sti)
2097  str = str*rast*rast
2098  sti = -sti*rast*rast
2099  s1r = -zet1dr + str
2100  s1i = -zet1di + sti
2101  GO TO 210
2102  200 CONTINUE
2103  s1r = -zet1dr + zet2dr
2104  s1i = -zet1di + zet2di
2105  210 CONTINUE
2106 !-----------------------------------------------------------------------
2107 ! TEST FOR UNDERFLOW AND OVERFLOW
2108 !-----------------------------------------------------------------------
2109  rs1 = s1r
2110  IF (dabs(rs1).GT.elim) GO TO 260
2111  IF (kdflg.EQ.1) iflag = 2
2112  IF (dabs(rs1).LT.alim) GO TO 220
2113 !-----------------------------------------------------------------------
2114 ! REFINE TEST AND SCALE
2115 !-----------------------------------------------------------------------
2116  aphi = zabs(phidr,phidi)
2117  rs1 = rs1 + dlog(aphi)
2118  IF (dabs(rs1).GT.elim) GO TO 260
2119  IF (kdflg.EQ.1) iflag = 1
2120  IF (rs1.LT.0.0d0) GO TO 220
2121  IF (kdflg.EQ.1) iflag = 3
2122  220 CONTINUE
2123  str = phidr*sumdr - phidi*sumdi
2124  sti = phidr*sumdi + phidi*sumdr
2125  s2r = -csgni*sti
2126  s2i = csgni*str
2127  str = dexp(s1r)*cssr(iflag)
2128  s1r = str*dcos(s1i)
2129  s1i = str*dsin(s1i)
2130  str = s2r*s1r - s2i*s1i
2131  s2i = s2r*s1i + s2i*s1r
2132  s2r = str
2133  IF (iflag.NE.1) GO TO 230
2134  CALL zuchk(s2r, s2i, nw, bry(1), tol)
2135  IF (nw.EQ.0) GO TO 230
2136  s2r = zeror
2137  s2i = zeroi
2138  230 CONTINUE
2139  cyr(kdflg) = s2r
2140  cyi(kdflg) = s2i
2141  c2r = s2r
2142  c2i = s2i
2143  s2r = s2r*csrr(iflag)
2144  s2i = s2i*csrr(iflag)
2145 !-----------------------------------------------------------------------
2146 ! ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
2147 !-----------------------------------------------------------------------
2148  s1r = yr(kk)
2149  s1i = yi(kk)
2150  IF (kode.EQ.1) GO TO 250
2151  CALL zs1s2(zrr, zri, s1r, s1i, s2r, s2i, nw, asc, alim, iuf)
2152  nz = nz + nw
2153  250 CONTINUE
2154  yr(kk) = s1r*cspnr - s1i*cspni + s2r
2155  yi(kk) = cspnr*s1i + cspni*s1r + s2i
2156  kk = kk - 1
2157  cspnr = -cspnr
2158  cspni = -cspni
2159  IF (c2r.NE.0.0d0 .OR. c2i.NE.0.0d0) GO TO 255
2160  kdflg = 1
2161  GO TO 270
2162  255 CONTINUE
2163  IF (kdflg.EQ.2) GO TO 275
2164  kdflg = 2
2165  GO TO 270
2166  260 CONTINUE
2167  IF (rs1.GT.0.0d0) GO TO 300
2168  s2r = zeror
2169  s2i = zeroi
2170  GO TO 230
2171  270 CONTINUE
2172  k = n
2173  275 CONTINUE
2174  il = n - k
2175  IF (il.EQ.0) RETURN
2176 !-----------------------------------------------------------------------
2177 ! RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
2178 ! K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
2179 ! INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
2180 !-----------------------------------------------------------------------
2181  s1r = cyr(1)
2182  s1i = cyi(1)
2183  s2r = cyr(2)
2184  s2i = cyi(2)
2185  csr = csrr(iflag)
2186  ascle = bry(iflag)
2187  fn = dble(float(inu+il))
2188  DO 290 i=1,il
2189  c2r = s2r
2190  c2i = s2i
2191  s2r = s1r + (fn+fnf)*(rzr*c2r-rzi*c2i)
2192  s2i = s1i + (fn+fnf)*(rzr*c2i+rzi*c2r)
2193  s1r = c2r
2194  s1i = c2i
2195  fn = fn - 1.0d0
2196  c2r = s2r*csr
2197  c2i = s2i*csr
2198  ckr = c2r
2199  cki = c2i
2200  c1r = yr(kk)
2201  c1i = yi(kk)
2202  IF (kode.EQ.1) GO TO 280
2203  CALL zs1s2(zrr, zri, c1r, c1i, c2r, c2i, nw, asc, alim, iuf)
2204  nz = nz + nw
2205  280 CONTINUE
2206  yr(kk) = c1r*cspnr - c1i*cspni + c2r
2207  yi(kk) = c1r*cspni + c1i*cspnr + c2i
2208  kk = kk - 1
2209  cspnr = -cspnr
2210  cspni = -cspni
2211  IF (iflag.GE.3) GO TO 290
2212  c2r = dabs(ckr)
2213  c2i = dabs(cki)
2214  c2m = dmax1(c2r,c2i)
2215  IF (c2m.LE.ascle) GO TO 290
2216  iflag = iflag + 1
2217  ascle = bry(iflag)
2218  s1r = s1r*csr
2219  s1i = s1i*csr
2220  s2r = ckr
2221  s2i = cki
2222  s1r = s1r*cssr(iflag)
2223  s1i = s1i*cssr(iflag)
2224  s2r = s2r*cssr(iflag)
2225  s2i = s2i*cssr(iflag)
2226  csr = csrr(iflag)
2227  290 CONTINUE
2228  RETURN
2229  300 CONTINUE
2230  nz = -1
2231  RETURN
2232 END
2233 
2234 SUBROUTINE zunk2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
2235 USE utilit
2236 USE complex
2237 !***BEGIN PROLOGUE ZUNK2
2238 !***REFER TO ZBESK
2239 !
2240 ! ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
2241 ! RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
2242 ! UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN)
2243 ! WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR
2244 ! -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT
2245 ! HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC-
2246 ! ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
2247 ! NZ=-1 MEANS AN OVERFLOW WILL OCCUR
2248 !
2249 !***ROUTINES CALLED ZAIRY,ZKSCL,ZS1S2,ZUCHK,ZUNHJ,D1MACH,ZABS
2250 !***END PROLOGUE ZUNK2
2251 ! COMPLEX AI,ARG,ARGD,ASUM,ASUMD,BSUM,BSUMD,CFN,CI,CIP,CK,CONE,CRSC,
2252 ! *CR1,CR2,CS,CSCL,CSGN,CSPN,CSR,CSS,CY,CZERO,C1,C2,DAI,PHI,PHID,RZ,
2253 ! *S1,S2,Y,Z,ZB,ZETA1,ZETA1D,ZETA2,ZETA2D,ZN,ZR
2254  DOUBLE PRECISION aarg, aic, aii, air, alim, ang, aphi, argdi, &
2255  argdr, argi, argr, asc, ascle, asumdi, asumdr, asumi, asumr, &
2256  bry, bsumdi, bsumdr, bsumi, bsumr, car, cipi, cipr, cki, ckr, &
2257  conei, coner, crsc, cr1i, cr1r, cr2i, cr2r, cscl, csgni, csi, &
2258  cspni, cspnr, csr, csrr, cssr, cyi, cyr, c1i, c1r, c2i, c2m, &
2259  c2r, daii, dair, elim, fmr, fn, fnf, fnu, hpi, phidi, phidr, &
2260  phii, phir, pi, pti, ptr, rast, razr, rs1, rzi, rzr, sar, sgn, &
2261  sti, str, s1i, s1r, s2i, s2r, tol, yi, yr, yy, zbi, zbr, zeroi, &
2262  zeror, zeta1i, zeta1r, zeta2i, zeta2r, zet1di, zet1dr, zet2di, &
2263  zet2dr, zi, zni, znr, zr, zri, zrr
2264  INTEGER i, ib, iflag, ifn, il, in, inu, iuf, k, kdflg, kflag, kk, &
2265  kode, mr, n, nai, ndai, nw, nz, idum, j, ipard, ic
2266  dimension bry(3), yr(1), yi(1), asumr(2), asumi(2), bsumr(2), &
2267  bsumi(2), phir(2), phii(2), argr(2), argi(2), zeta1r(2), &
2268  zeta1i(2), zeta2r(2), zeta2i(2), cyr(2), cyi(2), cipr(4), &
2269  cipi(4), cssr(3), csrr(3)
2270  DATA zeror,zeroi,coner,conei,cr1r,cr1i,cr2r,cr2i / &
2271  0.0d0, 0.0d0, 1.0d0, 0.0d0, &
2272  1.0d0,1.73205080756887729d0 , -0.5d0,-8.66025403784438647d-01 /
2273  DATA hpi, pi, aic / &
2274  1.57079632679489662d+00, 3.14159265358979324d+00, &
2275  1.26551212348464539d+00/
2276  DATA cipr(1),cipi(1),cipr(2),cipi(2),cipr(3),cipi(3),cipr(4), &
2277  cipi(4) / &
2278  1.0d0,0.0d0 , 0.0d0,-1.0d0 , -1.0d0,0.0d0 , 0.0d0,1.0d0 /
2279 
2280  kdflg = 1
2281  nz = 0
2282 !-----------------------------------------------------------------------
2283 ! EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
2284 ! THE UNDERFLOW LIMIT
2285 !-----------------------------------------------------------------------
2286  cscl = 1.0d0/tol
2287  crsc = tol
2288  cssr(1) = cscl
2289  cssr(2) = coner
2290  cssr(3) = crsc
2291  csrr(1) = crsc
2292  csrr(2) = coner
2293  csrr(3) = cscl
2294  bry(1) = 1.0d+3*d1mach(1)/tol
2295  bry(2) = 1.0d0/bry(1)
2296  bry(3) = d1mach(2)
2297  zrr = zr
2298  zri = zi
2299  IF (zr.GE.0.0d0) GO TO 10
2300  zrr = -zr
2301  zri = -zi
2302  10 CONTINUE
2303  yy = zri
2304  znr = zri
2305  zni = -zrr
2306  zbr = zrr
2307  zbi = zri
2308  inu = int(sngl(fnu))
2309  fnf = fnu - dble(float(inu))
2310  ang = -hpi*fnf
2311  car = dcos(ang)
2312  sar = dsin(ang)
2313  c2r = hpi*sar
2314  c2i = -hpi*car
2315  kk = mod(inu,4) + 1
2316  str = c2r*cipr(kk) - c2i*cipi(kk)
2317  sti = c2r*cipi(kk) + c2i*cipr(kk)
2318  csr = cr1r*str - cr1i*sti
2319  csi = cr1r*sti + cr1i*str
2320  IF (yy.GT.0.0d0) GO TO 20
2321  znr = -znr
2322  zbi = -zbi
2323  20 CONTINUE
2324 !-----------------------------------------------------------------------
2325 ! K(FNU,Z) IS COMPUTED FROM H(2,FNU,-I*Z) WHERE Z IS IN THE FIRST
2326 ! QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
2327 ! CONJUGATION SINCE THE K FUNCTION IS REAL ON THE POSITIVE REAL AXIS
2328 !-----------------------------------------------------------------------
2329  j = 2
2330  DO 80 i=1,n
2331 !-----------------------------------------------------------------------
2332 ! J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
2333 !-----------------------------------------------------------------------
2334  j = 3 - j
2335  fn = fnu + dble(float(i-1))
2336  CALL zunhj(znr, zni, fn, 0, tol, phir(j), phii(j), argr(j), &
2337  argi(j), zeta1r(j), zeta1i(j), zeta2r(j), zeta2i(j), asumr(j), &
2338  asumi(j), bsumr(j), bsumi(j))
2339  IF (kode.EQ.1) GO TO 30
2340  str = zbr + zeta2r(j)
2341  sti = zbi + zeta2i(j)
2342  rast = fn/zabs(str,sti)
2343  str = str*rast*rast
2344  sti = -sti*rast*rast
2345  s1r = zeta1r(j) - str
2346  s1i = zeta1i(j) - sti
2347  GO TO 40
2348  30 CONTINUE
2349  s1r = zeta1r(j) - zeta2r(j)
2350  s1i = zeta1i(j) - zeta2i(j)
2351  40 CONTINUE
2352 !-----------------------------------------------------------------------
2353 ! TEST FOR UNDERFLOW AND OVERFLOW
2354 !-----------------------------------------------------------------------
2355  rs1 = s1r
2356  IF (dabs(rs1).GT.elim) GO TO 70
2357  IF (kdflg.EQ.1) kflag = 2
2358  IF (dabs(rs1).LT.alim) GO TO 50
2359 !-----------------------------------------------------------------------
2360 ! REFINE TEST AND SCALE
2361 !-----------------------------------------------------------------------
2362  aphi = zabs(phir(j),phii(j))
2363  aarg = zabs(argr(j),argi(j))
2364  rs1 = rs1 + dlog(aphi) - 0.25d0*dlog(aarg) - aic
2365  IF (dabs(rs1).GT.elim) GO TO 70
2366  IF (kdflg.EQ.1) kflag = 1
2367  IF (rs1.LT.0.0d0) GO TO 50
2368  IF (kdflg.EQ.1) kflag = 3
2369  50 CONTINUE
2370 !-----------------------------------------------------------------------
2371 ! SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
2372 ! EXPONENT EXTREMES
2373 !-----------------------------------------------------------------------
2374  c2r = argr(j)*cr2r - argi(j)*cr2i
2375  c2i = argr(j)*cr2i + argi(j)*cr2r
2376  CALL zairy(c2r, c2i, 0, 2, air, aii, nai, idum)
2377  CALL zairy(c2r, c2i, 1, 2, dair, daii, ndai, idum)
2378  str = dair*bsumr(j) - daii*bsumi(j)
2379  sti = dair*bsumi(j) + daii*bsumr(j)
2380  ptr = str*cr2r - sti*cr2i
2381  pti = str*cr2i + sti*cr2r
2382  str = ptr + (air*asumr(j)-aii*asumi(j))
2383  sti = pti + (air*asumi(j)+aii*asumr(j))
2384  ptr = str*phir(j) - sti*phii(j)
2385  pti = str*phii(j) + sti*phir(j)
2386  s2r = ptr*csr - pti*csi
2387  s2i = ptr*csi + pti*csr
2388  str = dexp(s1r)*cssr(kflag)
2389  s1r = str*dcos(s1i)
2390  s1i = str*dsin(s1i)
2391  str = s2r*s1r - s2i*s1i
2392  s2i = s1r*s2i + s2r*s1i
2393  s2r = str
2394  IF (kflag.NE.1) GO TO 60
2395  CALL zuchk(s2r, s2i, nw, bry(1), tol)
2396  IF (nw.NE.0) GO TO 70
2397  60 CONTINUE
2398  IF (yy.LE.0.0d0) s2i = -s2i
2399  cyr(kdflg) = s2r
2400  cyi(kdflg) = s2i
2401  yr(i) = s2r*csrr(kflag)
2402  yi(i) = s2i*csrr(kflag)
2403  str = csi
2404  csi = -csr
2405  csr = str
2406  IF (kdflg.EQ.2) GO TO 85
2407  kdflg = 2
2408  GO TO 80
2409  70 CONTINUE
2410  IF (rs1.GT.0.0d0) GO TO 320
2411 !-----------------------------------------------------------------------
2412 ! FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
2413 !-----------------------------------------------------------------------
2414  IF (zr.LT.0.0d0) GO TO 320
2415  kdflg = 1
2416  yr(i)=zeror
2417  yi(i)=zeroi
2418  nz=nz+1
2419  str = csi
2420  csi =-csr
2421  csr = str
2422  IF (i.EQ.1) GO TO 80
2423  IF ((yr(i-1).EQ.zeror).AND.(yi(i-1).EQ.zeroi)) GO TO 80
2424  yr(i-1)=zeror
2425  yi(i-1)=zeroi
2426  nz=nz+1
2427  80 CONTINUE
2428  i = n
2429  85 CONTINUE
2430  razr = 1.0d0/zabs(zrr,zri)
2431  str = zrr*razr
2432  sti = -zri*razr
2433  rzr = (str+str)*razr
2434  rzi = (sti+sti)*razr
2435  ckr = fn*rzr
2436  cki = fn*rzi
2437  ib = i + 1
2438  IF (n.LT.ib) GO TO 180
2439 !-----------------------------------------------------------------------
2440 ! TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
2441 ! ON UNDERFLOW.
2442 !-----------------------------------------------------------------------
2443  fn = fnu + dble(float(n-1))
2444  ipard = 1
2445  IF (mr.NE.0) ipard = 0
2446  CALL zunhj(znr, zni, fn, ipard, tol, phidr, phidi, argdr, argdi, &
2447  zet1dr, zet1di, zet2dr, zet2di, asumdr, asumdi, bsumdr, bsumdi)
2448  IF (kode.EQ.1) GO TO 90
2449  str = zbr + zet2dr
2450  sti = zbi + zet2di
2451  rast = fn/zabs(str,sti)
2452  str = str*rast*rast
2453  sti = -sti*rast*rast
2454  s1r = zet1dr - str
2455  s1i = zet1di - sti
2456  GO TO 100
2457  90 CONTINUE
2458  s1r = zet1dr - zet2dr
2459  s1i = zet1di - zet2di
2460  100 CONTINUE
2461  rs1 = s1r
2462  IF (dabs(rs1).GT.elim) GO TO 105
2463  IF (dabs(rs1).LT.alim) GO TO 120
2464 !-----------------------------------------------------------------------
2465 ! REFINE ESTIMATE AND TEST
2466 !-----------------------------------------------------------------------
2467  aphi = zabs(phidr,phidi)
2468  rs1 = rs1+dlog(aphi)
2469  IF (dabs(rs1).LT.elim) GO TO 120
2470  105 CONTINUE
2471  IF (rs1.GT.0.0d0) GO TO 320
2472 !-----------------------------------------------------------------------
2473 ! FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
2474 !-----------------------------------------------------------------------
2475  IF (zr.LT.0.0d0) GO TO 320
2476  nz = n
2477  DO 106 i=1,n
2478  yr(i) = zeror
2479  yi(i) = zeroi
2480  106 CONTINUE
2481  RETURN
2482  120 CONTINUE
2483  s1r = cyr(1)
2484  s1i = cyi(1)
2485  s2r = cyr(2)
2486  s2i = cyi(2)
2487  c1r = csrr(kflag)
2488  ascle = bry(kflag)
2489  DO 130 i=ib,n
2490  c2r = s2r
2491  c2i = s2i
2492  s2r = ckr*c2r - cki*c2i + s1r
2493  s2i = ckr*c2i + cki*c2r + s1i
2494  s1r = c2r
2495  s1i = c2i
2496  ckr = ckr + rzr
2497  cki = cki + rzi
2498  c2r = s2r*c1r
2499  c2i = s2i*c1r
2500  yr(i) = c2r
2501  yi(i) = c2i
2502  IF (kflag.GE.3) GO TO 130
2503  str = dabs(c2r)
2504  sti = dabs(c2i)
2505  c2m = dmax1(str,sti)
2506  IF (c2m.LE.ascle) GO TO 130
2507  kflag = kflag + 1
2508  ascle = bry(kflag)
2509  s1r = s1r*c1r
2510  s1i = s1i*c1r
2511  s2r = c2r
2512  s2i = c2i
2513  s1r = s1r*cssr(kflag)
2514  s1i = s1i*cssr(kflag)
2515  s2r = s2r*cssr(kflag)
2516  s2i = s2i*cssr(kflag)
2517  c1r = csrr(kflag)
2518  130 CONTINUE
2519  180 CONTINUE
2520  IF (mr.EQ.0) RETURN
2521 !-----------------------------------------------------------------------
2522 ! ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
2523 !-----------------------------------------------------------------------
2524  nz = 0
2525  fmr = dble(float(mr))
2526  sgn = -dsign(pi,fmr)
2527 !-----------------------------------------------------------------------
2528 ! CSPN AND CSGN ARE COEFF OF K AND I FUNCIONS RESP.
2529 !-----------------------------------------------------------------------
2530  csgni = sgn
2531  IF (yy.LE.0.0d0) csgni = -csgni
2532  ifn = inu + n - 1
2533  ang = fnf*sgn
2534  cspnr = dcos(ang)
2535  cspni = dsin(ang)
2536  IF (mod(ifn,2).EQ.0) GO TO 190
2537  cspnr = -cspnr
2538  cspni = -cspni
2539  190 CONTINUE
2540 !-----------------------------------------------------------------------
2541 ! CS=COEFF OF THE J FUNCTION TO GET THE I FUNCTION. I(FNU,Z) IS
2542 ! COMPUTED FROM EXP(I*FNU*HPI)*J(FNU,-I*Z) WHERE Z IS IN THE FIRST
2543 ! QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
2544 ! CONJUGATION SINCE THE I FUNCTION IS REAL ON THE POSITIVE REAL AXIS
2545 !-----------------------------------------------------------------------
2546  csr = sar*csgni
2547  csi = car*csgni
2548  in = mod(ifn,4) + 1
2549  c2r = cipr(in)
2550  c2i = cipi(in)
2551  str = csr*c2r + csi*c2i
2552  csi = -csr*c2i + csi*c2r
2553  csr = str
2554  asc = bry(1)
2555  iuf = 0
2556  kk = n
2557  kdflg = 1
2558  ib = ib - 1
2559  ic = ib - 1
2560  DO 290 k=1,n
2561  fn = fnu + dble(float(kk-1))
2562 !-----------------------------------------------------------------------
2563 ! LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
2564 ! FUNCTION ABOVE
2565 !-----------------------------------------------------------------------
2566  IF (n.GT.2) GO TO 175
2567  172 CONTINUE
2568  phidr = phir(j)
2569  phidi = phii(j)
2570  argdr = argr(j)
2571  argdi = argi(j)
2572  zet1dr = zeta1r(j)
2573  zet1di = zeta1i(j)
2574  zet2dr = zeta2r(j)
2575  zet2di = zeta2i(j)
2576  asumdr = asumr(j)
2577  asumdi = asumi(j)
2578  bsumdr = bsumr(j)
2579  bsumdi = bsumi(j)
2580  j = 3 - j
2581  GO TO 210
2582  175 CONTINUE
2583  IF ((kk.EQ.n).AND.(ib.LT.n)) GO TO 210
2584  IF ((kk.EQ.ib).OR.(kk.EQ.ic)) GO TO 172
2585  CALL zunhj(znr, zni, fn, 0, tol, phidr, phidi, argdr, &
2586  argdi, zet1dr, zet1di, zet2dr, zet2di, asumdr, &
2587  asumdi, bsumdr, bsumdi)
2588  210 CONTINUE
2589  IF (kode.EQ.1) GO TO 220
2590  str = zbr + zet2dr
2591  sti = zbi + zet2di
2592  rast = fn/zabs(str,sti)
2593  str = str*rast*rast
2594  sti = -sti*rast*rast
2595  s1r = -zet1dr + str
2596  s1i = -zet1di + sti
2597  GO TO 230
2598  220 CONTINUE
2599  s1r = -zet1dr + zet2dr
2600  s1i = -zet1di + zet2di
2601  230 CONTINUE
2602 !-----------------------------------------------------------------------
2603 ! TEST FOR UNDERFLOW AND OVERFLOW
2604 !-----------------------------------------------------------------------
2605  rs1 = s1r
2606  IF (dabs(rs1).GT.elim) GO TO 280
2607  IF (kdflg.EQ.1) iflag = 2
2608  IF (dabs(rs1).LT.alim) GO TO 240
2609 !-----------------------------------------------------------------------
2610 ! REFINE TEST AND SCALE
2611 !-----------------------------------------------------------------------
2612  aphi = zabs(phidr,phidi)
2613  aarg = zabs(argdr,argdi)
2614  rs1 = rs1 + dlog(aphi) - 0.25d0*dlog(aarg) - aic
2615  IF (dabs(rs1).GT.elim) GO TO 280
2616  IF (kdflg.EQ.1) iflag = 1
2617  IF (rs1.LT.0.0d0) GO TO 240
2618  IF (kdflg.EQ.1) iflag = 3
2619  240 CONTINUE
2620  CALL zairy(argdr, argdi, 0, 2, air, aii, nai, idum)
2621  CALL zairy(argdr, argdi, 1, 2, dair, daii, ndai, idum)
2622  str = dair*bsumdr - daii*bsumdi
2623  sti = dair*bsumdi + daii*bsumdr
2624  str = str + (air*asumdr-aii*asumdi)
2625  sti = sti + (air*asumdi+aii*asumdr)
2626  ptr = str*phidr - sti*phidi
2627  pti = str*phidi + sti*phidr
2628  s2r = ptr*csr - pti*csi
2629  s2i = ptr*csi + pti*csr
2630  str = dexp(s1r)*cssr(iflag)
2631  s1r = str*dcos(s1i)
2632  s1i = str*dsin(s1i)
2633  str = s2r*s1r - s2i*s1i
2634  s2i = s2r*s1i + s2i*s1r
2635  s2r = str
2636  IF (iflag.NE.1) GO TO 250
2637  CALL zuchk(s2r, s2i, nw, bry(1), tol)
2638  IF (nw.EQ.0) GO TO 250
2639  s2r = zeror
2640  s2i = zeroi
2641  250 CONTINUE
2642  IF (yy.LE.0.0d0) s2i = -s2i
2643  cyr(kdflg) = s2r
2644  cyi(kdflg) = s2i
2645  c2r = s2r
2646  c2i = s2i
2647  s2r = s2r*csrr(iflag)
2648  s2i = s2i*csrr(iflag)
2649 !-----------------------------------------------------------------------
2650 ! ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
2651 !-----------------------------------------------------------------------
2652  s1r = yr(kk)
2653  s1i = yi(kk)
2654  IF (kode.EQ.1) GO TO 270
2655  CALL zs1s2(zrr, zri, s1r, s1i, s2r, s2i, nw, asc, alim, iuf)
2656  nz = nz + nw
2657  270 CONTINUE
2658  yr(kk) = s1r*cspnr - s1i*cspni + s2r
2659  yi(kk) = s1r*cspni + s1i*cspnr + s2i
2660  kk = kk - 1
2661  cspnr = -cspnr
2662  cspni = -cspni
2663  str = csi
2664  csi = -csr
2665  csr = str
2666  IF (c2r.NE.0.0d0 .OR. c2i.NE.0.0d0) GO TO 255
2667  kdflg = 1
2668  GO TO 290
2669  255 CONTINUE
2670  IF (kdflg.EQ.2) GO TO 295
2671  kdflg = 2
2672  GO TO 290
2673  280 CONTINUE
2674  IF (rs1.GT.0.0d0) GO TO 320
2675  s2r = zeror
2676  s2i = zeroi
2677  GO TO 250
2678  290 CONTINUE
2679  k = n
2680  295 CONTINUE
2681  il = n - k
2682  IF (il.EQ.0) RETURN
2683 !-----------------------------------------------------------------------
2684 ! RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
2685 ! K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
2686 ! INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
2687 !-----------------------------------------------------------------------
2688  s1r = cyr(1)
2689  s1i = cyi(1)
2690  s2r = cyr(2)
2691  s2i = cyi(2)
2692  csr = csrr(iflag)
2693  ascle = bry(iflag)
2694  fn = dble(float(inu+il))
2695  DO 310 i=1,il
2696  c2r = s2r
2697  c2i = s2i
2698  s2r = s1r + (fn+fnf)*(rzr*c2r-rzi*c2i)
2699  s2i = s1i + (fn+fnf)*(rzr*c2i+rzi*c2r)
2700  s1r = c2r
2701  s1i = c2i
2702  fn = fn - 1.0d0
2703  c2r = s2r*csr
2704  c2i = s2i*csr
2705  ckr = c2r
2706  cki = c2i
2707  c1r = yr(kk)
2708  c1i = yi(kk)
2709  IF (kode.EQ.1) GO TO 300
2710  CALL zs1s2(zrr, zri, c1r, c1i, c2r, c2i, nw, asc, alim, iuf)
2711  nz = nz + nw
2712  300 CONTINUE
2713  yr(kk) = c1r*cspnr - c1i*cspni + c2r
2714  yi(kk) = c1r*cspni + c1i*cspnr + c2i
2715  kk = kk - 1
2716  cspnr = -cspnr
2717  cspni = -cspni
2718  IF (iflag.GE.3) GO TO 310
2719  c2r = dabs(ckr)
2720  c2i = dabs(cki)
2721  c2m = dmax1(c2r,c2i)
2722  IF (c2m.LE.ascle) GO TO 310
2723  iflag = iflag + 1
2724  ascle = bry(iflag)
2725  s1r = s1r*csr
2726  s1i = s1i*csr
2727  s2r = ckr
2728  s2i = cki
2729  s1r = s1r*cssr(iflag)
2730  s1i = s1i*cssr(iflag)
2731  s2r = s2r*cssr(iflag)
2732  s2i = s2i*cssr(iflag)
2733  csr = csrr(iflag)
2734  310 CONTINUE
2735  RETURN
2736  320 CONTINUE
2737  nz = -1
2738  RETURN
2739 END
2740 
2741 SUBROUTINE zunhj(ZR, ZI, FNU, IPMTR, TOL, PHIR, PHII, ARGR, ARGI, &
2742  ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2743 USE complex
2744 !***BEGIN PROLOGUE ZUNHJ
2745 !***REFER TO ZBESI,ZBESK
2746 !
2747 ! REFERENCES
2748 ! HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A.
2749 ! STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.
2750 !
2751 ! ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC
2752 ! PRESS, N.Y., 1974, PAGE 420
2753 !
2754 ! ABSTRACT
2755 ! ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) =
2756 ! J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU
2757 ! BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
2758 !
2759 ! C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
2760 !
2761 ! FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS
2762 ! AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
2763 !
2764 ! (2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
2765 !
2766 ! ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING
2767 ! PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
2768 !
2769 ! MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND
2770 ! MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=
2771 ! 1 COMPUTES ALL EXCEPT ASUM AND BSUM.
2772 !
2773 !***ROUTINES CALLED ZABS,ZDIV,ZLOG,ZSQRT
2774 !***END PROLOGUE ZUNHJ
2775 ! COMPLEX ARG,ASUM,BSUM,CFNU,CONE,CR,CZERO,DR,P,PHI,PRZTH,PTFN,
2776 ! *RFN13,RTZTA,RZTH,SUMA,SUMB,TFN,T2,UP,W,W2,Z,ZA,ZB,ZC,ZETA,ZETA1,
2777 ! *ZETA2,ZTH
2778  DOUBLE PRECISION alfa, ang, ap, ar, argi, argr, asumi, asumr, &
2779  atol, aw2, azth, beta, br, bsumi, bsumr, btol, c, conei, coner, &
2780  cri, crr, dri, drr, ex1, ex2, fnu, fn13, fn23, gama, gpi, hpi, &
2781  phii, phir, pi, pp, pr, przthi, przthr, ptfni, ptfnr, raw, raw2, &
2782  razth, rfnu, rfnu2, rfn13, rtzti, rtztr, rzthi, rzthr, sti, str, &
2783  sumai, sumar, sumbi, sumbr, test, tfni, tfnr, thpi, tol, tzai, &
2784  tzar, t2i, t2r, upi, upr, wi, wr, w2i, w2r, zai, zar, zbi, zbr, &
2785  zci, zcr, zeroi, zeror, zetai, zetar, zeta1i, zeta1r, zeta2i, &
2786  zeta2r, zi, zr, zthi, zthr
2787  INTEGER ias, ibs, ipmtr, is, j, jr, ju, k, kmax, kp1, ks, l, lr, &
2788  lrp1, l1, l2, m, idum
2789  dimension ar(14), br(14), c(105), alfa(180), beta(210), gama(30), &
2790  ap(30), pr(30), pi(30), upr(14), upi(14), crr(14), cri(14), &
2791  drr(14), dri(14)
2792  DATA ar(1), ar(2), ar(3), ar(4), ar(5), ar(6), ar(7), ar(8), &
2793  ar(9), ar(10), ar(11), ar(12), ar(13), ar(14)/ &
2794  1.00000000000000000d+00, 1.04166666666666667d-01, &
2795  8.35503472222222222d-02, 1.28226574556327160d-01, &
2796  2.91849026464140464d-01, 8.81627267443757652d-01, &
2797  3.32140828186276754d+00, 1.49957629868625547d+01, &
2798  7.89230130115865181d+01, 4.74451538868264323d+02, &
2799  3.20749009089066193d+03, 2.40865496408740049d+04, &
2800  1.98923119169509794d+05, 1.79190200777534383d+06/
2801  DATA br(1), br(2), br(3), br(4), br(5), br(6), br(7), br(8), &
2802  br(9), br(10), br(11), br(12), br(13), br(14)/ &
2803  1.00000000000000000d+00, -1.45833333333333333d-01, &
2804  -9.87413194444444444d-02, -1.43312053915895062d-01, &
2805  -3.17227202678413548d-01, -9.42429147957120249d-01, &
2806  -3.51120304082635426d+00, -1.57272636203680451d+01, &
2807  -8.22814390971859444d+01, -4.92355370523670524d+02, &
2808  -3.31621856854797251d+03, -2.48276742452085896d+04, &
2809  -2.04526587315129788d+05, -1.83844491706820990d+06/
2810  DATA c(1), c(2), c(3), c(4), c(5), c(6), c(7), c(8), c(9), c(10), &
2811  c(11), c(12), c(13), c(14), c(15), c(16), c(17), c(18), &
2812  c(19), c(20), c(21), c(22), c(23), c(24)/ &
2813  1.00000000000000000d+00, -2.08333333333333333d-01, &
2814  1.25000000000000000d-01, 3.34201388888888889d-01, &
2815  -4.01041666666666667d-01, 7.03125000000000000d-02, &
2816  -1.02581259645061728d+00, 1.84646267361111111d+00, &
2817  -8.91210937500000000d-01, 7.32421875000000000d-02, &
2818  4.66958442342624743d+00, -1.12070026162229938d+01, &
2819  8.78912353515625000d+00, -2.36408691406250000d+00, &
2820  1.12152099609375000d-01, -2.82120725582002449d+01, &
2821  8.46362176746007346d+01, -9.18182415432400174d+01, &
2822  4.25349987453884549d+01, -7.36879435947963170d+00, &
2823  2.27108001708984375d-01, 2.12570130039217123d+02, &
2824  -7.65252468141181642d+02, 1.05999045252799988d+03/
2825  DATA c(25), c(26), c(27), c(28), c(29), c(30), c(31), c(32), &
2826  c(33), c(34), c(35), c(36), c(37), c(38), c(39), c(40), &
2827  c(41), c(42), c(43), c(44), c(45), c(46), c(47), c(48)/ &
2828  -6.99579627376132541d+02, 2.18190511744211590d+02, &
2829  -2.64914304869515555d+01, 5.72501420974731445d-01, &
2830  -1.91945766231840700d+03, 8.06172218173730938d+03, &
2831  -1.35865500064341374d+04, 1.16553933368645332d+04, &
2832  -5.30564697861340311d+03, 1.20090291321635246d+03, &
2833  -1.08090919788394656d+02, 1.72772750258445740d+00, &
2834  2.02042913309661486d+04, -9.69805983886375135d+04, &
2835  1.92547001232531532d+05, -2.03400177280415534d+05, &
2836  1.22200464983017460d+05, -4.11926549688975513d+04, &
2837  7.10951430248936372d+03, -4.93915304773088012d+02, &
2838  6.07404200127348304d+00, -2.42919187900551333d+05, &
2839  1.31176361466297720d+06, -2.99801591853810675d+06/
2840  DATA c(49), c(50), c(51), c(52), c(53), c(54), c(55), c(56), &
2841  c(57), c(58), c(59), c(60), c(61), c(62), c(63), c(64), &
2842  c(65), c(66), c(67), c(68), c(69), c(70), c(71), c(72)/ &
2843  3.76327129765640400d+06, -2.81356322658653411d+06, &
2844  1.26836527332162478d+06, -3.31645172484563578d+05, &
2845  4.52187689813627263d+04, -2.49983048181120962d+03, &
2846  2.43805296995560639d+01, 3.28446985307203782d+06, &
2847  -1.97068191184322269d+07, 5.09526024926646422d+07, &
2848  -7.41051482115326577d+07, 6.63445122747290267d+07, &
2849  -3.75671766607633513d+07, 1.32887671664218183d+07, &
2850  -2.78561812808645469d+06, 3.08186404612662398d+05, &
2851  -1.38860897537170405d+04, 1.10017140269246738d+02, &
2852  -4.93292536645099620d+07, 3.25573074185765749d+08, &
2853  -9.39462359681578403d+08, 1.55359689957058006d+09, &
2854  -1.62108055210833708d+09, 1.10684281682301447d+09/
2855  DATA c(73), c(74), c(75), c(76), c(77), c(78), c(79), c(80), &
2856  c(81), c(82), c(83), c(84), c(85), c(86), c(87), c(88), &
2857  c(89), c(90), c(91), c(92), c(93), c(94), c(95), c(96)/ &
2858  -4.95889784275030309d+08, 1.42062907797533095d+08, &
2859  -2.44740627257387285d+07, 2.24376817792244943d+06, &
2860  -8.40054336030240853d+04, 5.51335896122020586d+02, &
2861  8.14789096118312115d+08, -5.86648149205184723d+09, &
2862  1.86882075092958249d+10, -3.46320433881587779d+10, &
2863  4.12801855797539740d+10, -3.30265997498007231d+10, &
2864  1.79542137311556001d+10, -6.56329379261928433d+09, &
2865  1.55927986487925751d+09, -2.25105661889415278d+08, &
2866  1.73951075539781645d+07, -5.49842327572288687d+05, &
2867  3.03809051092238427d+03, -1.46792612476956167d+10, &
2868  1.14498237732025810d+11, -3.99096175224466498d+11, &
2869  8.19218669548577329d+11, -1.09837515608122331d+12/
2870  DATA c(97), c(98), c(99), c(100), c(101), c(102), c(103), c(104), &
2871  c(105)/ &
2872  1.00815810686538209d+12, -6.45364869245376503d+11, &
2873  2.87900649906150589d+11, -8.78670721780232657d+10, &
2874  1.76347306068349694d+10, -2.16716498322379509d+09, &
2875  1.43157876718888981d+08, -3.87183344257261262d+06, &
2876  1.82577554742931747d+04/
2877  DATA alfa(1), alfa(2), alfa(3), alfa(4), alfa(5), alfa(6), &
2878  alfa(7), alfa(8), alfa(9), alfa(10), alfa(11), alfa(12), &
2879  alfa(13), alfa(14), alfa(15), alfa(16), alfa(17), alfa(18), &
2880  alfa(19), alfa(20), alfa(21), alfa(22)/ &
2881  -4.44444444444444444d-03, -9.22077922077922078d-04, &
2882  -8.84892884892884893d-05, 1.65927687832449737d-04, &
2883  2.46691372741792910d-04, 2.65995589346254780d-04, &
2884  2.61824297061500945d-04, 2.48730437344655609d-04, &
2885  2.32721040083232098d-04, 2.16362485712365082d-04, &
2886  2.00738858762752355d-04, 1.86267636637545172d-04, &
2887  1.73060775917876493d-04, 1.61091705929015752d-04, &
2888  1.50274774160908134d-04, 1.40503497391269794d-04, &
2889  1.31668816545922806d-04, 1.23667445598253261d-04, &
2890  1.16405271474737902d-04, 1.09798298372713369d-04, &
2891  1.03772410422992823d-04, 9.82626078369363448d-05/
2892  DATA alfa(23), alfa(24), alfa(25), alfa(26), alfa(27), alfa(28), &
2893  alfa(29), alfa(30), alfa(31), alfa(32), alfa(33), alfa(34), &
2894  alfa(35), alfa(36), alfa(37), alfa(38), alfa(39), alfa(40), &
2895  alfa(41), alfa(42), alfa(43), alfa(44)/ &
2896  9.32120517249503256d-05, 8.85710852478711718d-05, &
2897  8.42963105715700223d-05, 8.03497548407791151d-05, &
2898  7.66981345359207388d-05, 7.33122157481777809d-05, &
2899  7.01662625163141333d-05, 6.72375633790160292d-05, &
2900  6.93735541354588974d-04, 2.32241745182921654d-04, &
2901  -1.41986273556691197d-05, -1.16444931672048640d-04, &
2902  -1.50803558053048762d-04, -1.55121924918096223d-04, &
2903  -1.46809756646465549d-04, -1.33815503867491367d-04, &
2904  -1.19744975684254051d-04, -1.06184319207974020d-04, &
2905  -9.37699549891194492d-05, -8.26923045588193274d-05, &
2906  -7.29374348155221211d-05, -6.44042357721016283d-05/
2907  DATA alfa(45), alfa(46), alfa(47), alfa(48), alfa(49), alfa(50), &
2908  alfa(51), alfa(52), alfa(53), alfa(54), alfa(55), alfa(56), &
2909  alfa(57), alfa(58), alfa(59), alfa(60), alfa(61), alfa(62), &
2910  alfa(63), alfa(64), alfa(65), alfa(66)/ &
2911  -5.69611566009369048d-05, -5.04731044303561628d-05, &
2912  -4.48134868008882786d-05, -3.98688727717598864d-05, &
2913  -3.55400532972042498d-05, -3.17414256609022480d-05, &
2914  -2.83996793904174811d-05, -2.54522720634870566d-05, &
2915  -2.28459297164724555d-05, -2.05352753106480604d-05, &
2916  -1.84816217627666085d-05, -1.66519330021393806d-05, &
2917  -1.50179412980119482d-05, -1.35554031379040526d-05, &
2918  -1.22434746473858131d-05, -1.10641884811308169d-05, &
2919  -3.54211971457743841d-04, -1.56161263945159416d-04, &
2920  3.04465503594936410d-05, 1.30198655773242693d-04, &
2921  1.67471106699712269d-04, 1.70222587683592569d-04/
2922  DATA alfa(67), alfa(68), alfa(69), alfa(70), alfa(71), alfa(72), &
2923  alfa(73), alfa(74), alfa(75), alfa(76), alfa(77), alfa(78), &
2924  alfa(79), alfa(80), alfa(81), alfa(82), alfa(83), alfa(84), &
2925  alfa(85), alfa(86), alfa(87), alfa(88)/ &
2926  1.56501427608594704d-04, 1.36339170977445120d-04, &
2927  1.14886692029825128d-04, 9.45869093034688111d-05, &
2928  7.64498419250898258d-05, 6.07570334965197354d-05, &
2929  4.74394299290508799d-05, 3.62757512005344297d-05, &
2930  2.69939714979224901d-05, 1.93210938247939253d-05, &
2931  1.30056674793963203d-05, 7.82620866744496661d-06, &
2932  3.59257485819351583d-06, 1.44040049814251817d-07, &
2933  -2.65396769697939116d-06, -4.91346867098485910d-06, &
2934  -6.72739296091248287d-06, -8.17269379678657923d-06, &
2935  -9.31304715093561232d-06, -1.02011418798016441d-05, &
2936  -1.08805962510592880d-05, -1.13875481509603555d-05/
2937  DATA alfa(89), alfa(90), alfa(91), alfa(92), alfa(93), alfa(94), &
2938  alfa(95), alfa(96), alfa(97), alfa(98), alfa(99), alfa(100), &
2939  alfa(101), alfa(102), alfa(103), alfa(104), alfa(105), &
2940  alfa(106), alfa(107), alfa(108), alfa(109), alfa(110)/ &
2941  -1.17519675674556414d-05, -1.19987364870944141d-05, &
2942  3.78194199201772914d-04, 2.02471952761816167d-04, &
2943  -6.37938506318862408d-05, -2.38598230603005903d-04, &
2944  -3.10916256027361568d-04, -3.13680115247576316d-04, &
2945  -2.78950273791323387d-04, -2.28564082619141374d-04, &
2946  -1.75245280340846749d-04, -1.25544063060690348d-04, &
2947  -8.22982872820208365d-05, -4.62860730588116458d-05, &
2948  -1.72334302366962267d-05, 5.60690482304602267d-06, &
2949  2.31395443148286800d-05, 3.62642745856793957d-05, &
2950  4.58006124490188752d-05, 5.24595294959114050d-05, &
2951  5.68396208545815266d-05, 5.94349820393104052d-05/
2952  DATA alfa(111), alfa(112), alfa(113), alfa(114), alfa(115), &
2953  alfa(116), alfa(117), alfa(118), alfa(119), alfa(120), &
2954  alfa(121), alfa(122), alfa(123), alfa(124), alfa(125), &
2955  alfa(126), alfa(127), alfa(128), alfa(129), alfa(130)/ &
2956  6.06478527578421742d-05, 6.08023907788436497d-05, &
2957  6.01577894539460388d-05, 5.89199657344698500d-05, &
2958  5.72515823777593053d-05, 5.52804375585852577d-05, &
2959  5.31063773802880170d-05, 5.08069302012325706d-05, &
2960  4.84418647620094842d-05, 4.60568581607475370d-05, &
2961  -6.91141397288294174d-04, -4.29976633058871912d-04, &
2962  1.83067735980039018d-04, 6.60088147542014144d-04, &
2963  8.75964969951185931d-04, 8.77335235958235514d-04, &
2964  7.49369585378990637d-04, 5.63832329756980918d-04, &
2965  3.68059319971443156d-04, 1.88464535514455599d-04/
2966  DATA alfa(131), alfa(132), alfa(133), alfa(134), alfa(135), &
2967  alfa(136), alfa(137), alfa(138), alfa(139), alfa(140), &
2968  alfa(141), alfa(142), alfa(143), alfa(144), alfa(145), &
2969  alfa(146), alfa(147), alfa(148), alfa(149), alfa(150)/ &
2970  3.70663057664904149d-05, -8.28520220232137023d-05, &
2971  -1.72751952869172998d-04, -2.36314873605872983d-04, &
2972  -2.77966150694906658d-04, -3.02079514155456919d-04, &
2973  -3.12594712643820127d-04, -3.12872558758067163d-04, &
2974  -3.05678038466324377d-04, -2.93226470614557331d-04, &
2975  -2.77255655582934777d-04, -2.59103928467031709d-04, &
2976  -2.39784014396480342d-04, -2.20048260045422848d-04, &
2977  -2.00443911094971498d-04, -1.81358692210970687d-04, &
2978  -1.63057674478657464d-04, -1.45712672175205844d-04, &
2979  -1.29425421983924587d-04, -1.14245691942445952d-04/
2980  DATA alfa(151), alfa(152), alfa(153), alfa(154), alfa(155), &
2981  alfa(156), alfa(157), alfa(158), alfa(159), alfa(160), &
2982  alfa(161), alfa(162), alfa(163), alfa(164), alfa(165), &
2983  alfa(166), alfa(167), alfa(168), alfa(169), alfa(170)/ &
2984  1.92821964248775885d-03, 1.35592576302022234d-03, &
2985  -7.17858090421302995d-04, -2.58084802575270346d-03, &
2986  -3.49271130826168475d-03, -3.46986299340960628d-03, &
2987  -2.82285233351310182d-03, -1.88103076404891354d-03, &
2988  -8.89531718383947600d-04, 3.87912102631035228d-06, &
2989  7.28688540119691412d-04, 1.26566373053457758d-03, &
2990  1.62518158372674427d-03, 1.83203153216373172d-03, &
2991  1.91588388990527909d-03, 1.90588846755546138d-03, &
2992  1.82798982421825727d-03, 1.70389506421121530d-03, &
2993  1.55097127171097686d-03, 1.38261421852276159d-03/
2994  DATA alfa(171), alfa(172), alfa(173), alfa(174), alfa(175), &
2995  alfa(176), alfa(177), alfa(178), alfa(179), alfa(180)/ &
2996  1.20881424230064774d-03, 1.03676532638344962d-03, &
2997  8.71437918068619115d-04, 7.16080155297701002d-04, &
2998  5.72637002558129372d-04, 4.42089819465802277d-04, &
2999  3.24724948503090564d-04, 2.20342042730246599d-04, &
3000  1.28412898401353882d-04, 4.82005924552095464d-05/
3001  DATA beta(1), beta(2), beta(3), beta(4), beta(5), beta(6), &
3002  beta(7), beta(8), beta(9), beta(10), beta(11), beta(12), &
3003  beta(13), beta(14), beta(15), beta(16), beta(17), beta(18), &
3004  beta(19), beta(20), beta(21), beta(22)/ &
3005  1.79988721413553309d-02, 5.59964911064388073d-03, &
3006  2.88501402231132779d-03, 1.80096606761053941d-03, &
3007  1.24753110589199202d-03, 9.22878876572938311d-04, &
3008  7.14430421727287357d-04, 5.71787281789704872d-04, &
3009  4.69431007606481533d-04, 3.93232835462916638d-04, &
3010  3.34818889318297664d-04, 2.88952148495751517d-04, &
3011  2.52211615549573284d-04, 2.22280580798883327d-04, &
3012  1.97541838033062524d-04, 1.76836855019718004d-04, &
3013  1.59316899661821081d-04, 1.44347930197333986d-04, &
3014  1.31448068119965379d-04, 1.20245444949302884d-04, &
3015  1.10449144504599392d-04, 1.01828770740567258d-04/
3016  DATA beta(23), beta(24), beta(25), beta(26), beta(27), beta(28), &
3017  beta(29), beta(30), beta(31), beta(32), beta(33), beta(34), &
3018  beta(35), beta(36), beta(37), beta(38), beta(39), beta(40), &
3019  beta(41), beta(42), beta(43), beta(44)/ &
3020  9.41998224204237509d-05, 8.74130545753834437d-05, &
3021  8.13466262162801467d-05, 7.59002269646219339d-05, &
3022  7.09906300634153481d-05, 6.65482874842468183d-05, &
3023  6.25146958969275078d-05, 5.88403394426251749d-05, &
3024  -1.49282953213429172d-03, -8.78204709546389328d-04, &
3025  -5.02916549572034614d-04, -2.94822138512746025d-04, &
3026  -1.75463996970782828d-04, -1.04008550460816434d-04, &
3027  -5.96141953046457895d-05, -3.12038929076098340d-05, &
3028  -1.26089735980230047d-05, -2.42892608575730389d-07, &
3029  8.05996165414273571d-06, 1.36507009262147391d-05, &
3030  1.73964125472926261d-05, 1.98672978842133780d-05/
3031  DATA beta(45), beta(46), beta(47), beta(48), beta(49), beta(50), &
3032  beta(51), beta(52), beta(53), beta(54), beta(55), beta(56), &
3033  beta(57), beta(58), beta(59), beta(60), beta(61), beta(62), &
3034  beta(63), beta(64), beta(65), beta(66)/ &
3035  2.14463263790822639d-05, 2.23954659232456514d-05, &
3036  2.28967783814712629d-05, 2.30785389811177817d-05, &
3037  2.30321976080909144d-05, 2.28236073720348722d-05, &
3038  2.25005881105292418d-05, 2.20981015361991429d-05, &
3039  2.16418427448103905d-05, 2.11507649256220843d-05, &
3040  2.06388749782170737d-05, 2.01165241997081666d-05, &
3041  1.95913450141179244d-05, 1.90689367910436740d-05, &
3042  1.85533719641636667d-05, 1.80475722259674218d-05, &
3043  5.52213076721292790d-04, 4.47932581552384646d-04, &
3044  2.79520653992020589d-04, 1.52468156198446602d-04, &
3045  6.93271105657043598d-05, 1.76258683069991397d-05/
3046  DATA beta(67), beta(68), beta(69), beta(70), beta(71), beta(72), &
3047  beta(73), beta(74), beta(75), beta(76), beta(77), beta(78), &
3048  beta(79), beta(80), beta(81), beta(82), beta(83), beta(84), &
3049  beta(85), beta(86), beta(87), beta(88)/ &
3050  -1.35744996343269136d-05, -3.17972413350427135d-05, &
3051  -4.18861861696693365d-05, -4.69004889379141029d-05, &
3052  -4.87665447413787352d-05, -4.87010031186735069d-05, &
3053  -4.74755620890086638d-05, -4.55813058138628452d-05, &
3054  -4.33309644511266036d-05, -4.09230193157750364d-05, &
3055  -3.84822638603221274d-05, -3.60857167535410501d-05, &
3056  -3.37793306123367417d-05, -3.15888560772109621d-05, &
3057  -2.95269561750807315d-05, -2.75978914828335759d-05, &
3058  -2.58006174666883713d-05, -2.41308356761280200d-05, &
3059  -2.25823509518346033d-05, -2.11479656768912971d-05, &
3060  -1.98200638885294927d-05, -1.85909870801065077d-05/
3061  DATA beta(89), beta(90), beta(91), beta(92), beta(93), beta(94), &
3062  beta(95), beta(96), beta(97), beta(98), beta(99), beta(100), &
3063  beta(101), beta(102), beta(103), beta(104), beta(105), &
3064  beta(106), beta(107), beta(108), beta(109), beta(110)/ &
3065  -1.74532699844210224d-05, -1.63997823854497997d-05, &
3066  -4.74617796559959808d-04, -4.77864567147321487d-04, &
3067  -3.20390228067037603d-04, -1.61105016119962282d-04, &
3068  -4.25778101285435204d-05, 3.44571294294967503d-05, &
3069  7.97092684075674924d-05, 1.03138236708272200d-04, &
3070  1.12466775262204158d-04, 1.13103642108481389d-04, &
3071  1.08651634848774268d-04, 1.01437951597661973d-04, &
3072  9.29298396593363896d-05, 8.40293133016089978d-05, &
3073  7.52727991349134062d-05, 6.69632521975730872d-05, &
3074  5.92564547323194704d-05, 5.22169308826975567d-05, &
3075  4.58539485165360646d-05, 4.01445513891486808d-05/
3076  DATA beta(111), beta(112), beta(113), beta(114), beta(115), &
3077  beta(116), beta(117), beta(118), beta(119), beta(120), &
3078  beta(121), beta(122), beta(123), beta(124), beta(125), &
3079  beta(126), beta(127), beta(128), beta(129), beta(130)/ &
3080  3.50481730031328081d-05, 3.05157995034346659d-05, &
3081  2.64956119950516039d-05, 2.29363633690998152d-05, &
3082  1.97893056664021636d-05, 1.70091984636412623d-05, &
3083  1.45547428261524004d-05, 1.23886640995878413d-05, &
3084  1.04775876076583236d-05, 8.79179954978479373d-06, &
3085  7.36465810572578444d-04, 8.72790805146193976d-04, &
3086  6.22614862573135066d-04, 2.85998154194304147d-04, &
3087  3.84737672879366102d-06, -1.87906003636971558d-04, &
3088  -2.97603646594554535d-04, -3.45998126832656348d-04, &
3089  -3.53382470916037712d-04, -3.35715635775048757d-04/
3090  DATA beta(131), beta(132), beta(133), beta(134), beta(135), &
3091  beta(136), beta(137), beta(138), beta(139), beta(140), &
3092  beta(141), beta(142), beta(143), beta(144), beta(145), &
3093  beta(146), beta(147), beta(148), beta(149), beta(150)/ &
3094  -3.04321124789039809d-04, -2.66722723047612821d-04, &
3095  -2.27654214122819527d-04, -1.89922611854562356d-04, &
3096  -1.55058918599093870d-04, -1.23778240761873630d-04, &
3097  -9.62926147717644187d-05, -7.25178327714425337d-05, &
3098  -5.22070028895633801d-05, -3.50347750511900522d-05, &
3099  -2.06489761035551757d-05, -8.70106096849767054d-06, &
3100  1.13698686675100290d-06, 9.16426474122778849d-06, &
3101  1.56477785428872620d-05, 2.08223629482466847d-05, &
3102  2.48923381004595156d-05, 2.80340509574146325d-05, &
3103  3.03987774629861915d-05, 3.21156731406700616d-05/
3104  DATA beta(151), beta(152), beta(153), beta(154), beta(155), &
3105  beta(156), beta(157), beta(158), beta(159), beta(160), &
3106  beta(161), beta(162), beta(163), beta(164), beta(165), &
3107  beta(166), beta(167), beta(168), beta(169), beta(170)/ &
3108  -1.80182191963885708d-03, -2.43402962938042533d-03, &
3109  -1.83422663549856802d-03, -7.62204596354009765d-04, &
3110  2.39079475256927218d-04, 9.49266117176881141d-04, &
3111  1.34467449701540359d-03, 1.48457495259449178d-03, &
3112  1.44732339830617591d-03, 1.30268261285657186d-03, &
3113  1.10351597375642682d-03, 8.86047440419791759d-04, &
3114  6.73073208165665473d-04, 4.77603872856582378d-04, &
3115  3.05991926358789362d-04, 1.60315694594721630d-04, &
3116  4.00749555270613286d-05, -5.66607461635251611d-05, &
3117  -1.32506186772982638d-04, -1.90296187989614057d-04/
3118  DATA beta(171), beta(172), beta(173), beta(174), beta(175), &
3119  beta(176), beta(177), beta(178), beta(179), beta(180), &
3120  beta(181), beta(182), beta(183), beta(184), beta(185), &
3121  beta(186), beta(187), beta(188), beta(189), beta(190)/ &
3122  -2.32811450376937408d-04, -2.62628811464668841d-04, &
3123  -2.82050469867598672d-04, -2.93081563192861167d-04, &
3124  -2.97435962176316616d-04, -2.96557334239348078d-04, &
3125  -2.91647363312090861d-04, -2.83696203837734166d-04, &
3126  -2.73512317095673346d-04, -2.61750155806768580d-04, &
3127  6.38585891212050914d-03, 9.62374215806377941d-03, &
3128  7.61878061207001043d-03, 2.83219055545628054d-03, &
3129  -2.09841352012720090d-03, -5.73826764216626498d-03, &
3130  -7.70804244495414620d-03, -8.21011692264844401d-03, &
3131  -7.65824520346905413d-03, -6.47209729391045177d-03/
3132  DATA beta(191), beta(192), beta(193), beta(194), beta(195), &
3133  beta(196), beta(197), beta(198), beta(199), beta(200), &
3134  beta(201), beta(202), beta(203), beta(204), beta(205), &
3135  beta(206), beta(207), beta(208), beta(209), beta(210)/ &
3136  -4.99132412004966473d-03, -3.45612289713133280d-03, &
3137  -2.01785580014170775d-03, -7.59430686781961401d-04, &
3138  2.84173631523859138d-04, 1.10891667586337403d-03, &
3139  1.72901493872728771d-03, 2.16812590802684701d-03, &
3140  2.45357710494539735d-03, 2.61281821058334862d-03, &
3141  2.67141039656276912d-03, 2.65203073395980430d-03, &
3142  2.57411652877287315d-03, 2.45389126236094427d-03, &
3143  2.30460058071795494d-03, 2.13684837686712662d-03, &
3144  1.95896528478870911d-03, 1.77737008679454412d-03, &
3145  1.59690280765839059d-03, 1.42111975664438546d-03/
3146  DATA gama(1), gama(2), gama(3), gama(4), gama(5), gama(6), &
3147  gama(7), gama(8), gama(9), gama(10), gama(11), gama(12), &
3148  gama(13), gama(14), gama(15), gama(16), gama(17), gama(18), &
3149  gama(19), gama(20), gama(21), gama(22)/ &
3150  6.29960524947436582d-01, 2.51984209978974633d-01, &
3151  1.54790300415655846d-01, 1.10713062416159013d-01, &
3152  8.57309395527394825d-02, 6.97161316958684292d-02, &
3153  5.86085671893713576d-02, 5.04698873536310685d-02, &
3154  4.42600580689154809d-02, 3.93720661543509966d-02, &
3155  3.54283195924455368d-02, 3.21818857502098231d-02, &
3156  2.94646240791157679d-02, 2.71581677112934479d-02, &
3157  2.51768272973861779d-02, 2.34570755306078891d-02, &
3158  2.19508390134907203d-02, 2.06210828235646240d-02, &
3159  1.94388240897880846d-02, 1.83810633800683158d-02, &
3160  1.74293213231963172d-02, 1.65685837786612353d-02/
3161  DATA gama(23), gama(24), gama(25), gama(26), gama(27), gama(28), &
3162  gama(29), gama(30)/ &
3163  1.57865285987918445d-02, 1.50729501494095594d-02, &
3164  1.44193250839954639d-02, 1.38184805735341786d-02, &
3165  1.32643378994276568d-02, 1.27517121970498651d-02, &
3166  1.22761545318762767d-02, 1.18338262398482403d-02/
3167  DATA ex1, ex2, hpi, gpi, thpi / &
3168  3.33333333333333333d-01, 6.66666666666666667d-01, &
3169  1.57079632679489662d+00, 3.14159265358979324d+00, &
3170  4.71238898038468986d+00/
3171  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
3172 
3173  rfnu = 1.0d0/fnu
3174  zbr = zr*rfnu
3175  zbi = zi*rfnu
3176  rfnu2 = rfnu*rfnu
3177 !-----------------------------------------------------------------------
3178 ! COMPUTE IN THE FOURTH QUADRANT
3179 !-----------------------------------------------------------------------
3180  fn13 = fnu**ex1
3181  fn23 = fn13*fn13
3182  rfn13 = 1.0d0/fn13
3183  w2r = coner - zbr*zbr + zbi*zbi
3184  w2i = conei - zbr*zbi - zbr*zbi
3185  aw2 = zabs(w2r,w2i)
3186  IF (aw2.GT.0.25d0) GO TO 130
3187 !-----------------------------------------------------------------------
3188 ! POWER SERIES FOR CABS(W2).LE.0.25D0
3189 !-----------------------------------------------------------------------
3190  k = 1
3191  pr(1) = coner
3192  pi(1) = conei
3193  sumar = gama(1)
3194  sumai = zeroi
3195  ap(1) = 1.0d0
3196  IF (aw2.LT.tol) GO TO 20
3197  DO 10 k=2,30
3198  pr(k) = pr(k-1)*w2r - pi(k-1)*w2i
3199  pi(k) = pr(k-1)*w2i + pi(k-1)*w2r
3200  sumar = sumar + pr(k)*gama(k)
3201  sumai = sumai + pi(k)*gama(k)
3202  ap(k) = ap(k-1)*aw2
3203  IF (ap(k).LT.tol) GO TO 20
3204  10 CONTINUE
3205  k = 30
3206  20 CONTINUE
3207  kmax = k
3208  zetar = w2r*sumar - w2i*sumai
3209  zetai = w2r*sumai + w2i*sumar
3210  argr = zetar*fn23
3211  argi = zetai*fn23
3212  CALL zsqrt(sumar, sumai, zar, zai)
3213  CALL zsqrt(w2r, w2i, str, sti)
3214  zeta2r = str*fnu
3215  zeta2i = sti*fnu
3216  str = coner + ex2*(zetar*zar-zetai*zai)
3217  sti = conei + ex2*(zetar*zai+zetai*zar)
3218  zeta1r = str*zeta2r - sti*zeta2i
3219  zeta1i = str*zeta2i + sti*zeta2r
3220  zar = zar + zar
3221  zai = zai + zai
3222  CALL zsqrt(zar, zai, str, sti)
3223  phir = str*rfn13
3224  phii = sti*rfn13
3225  IF (ipmtr.EQ.1) GO TO 120
3226 !-----------------------------------------------------------------------
3227 ! SUM SERIES FOR ASUM AND BSUM
3228 !-----------------------------------------------------------------------
3229  sumbr = zeror
3230  sumbi = zeroi
3231  DO 30 k=1,kmax
3232  sumbr = sumbr + pr(k)*beta(k)
3233  sumbi = sumbi + pi(k)*beta(k)
3234  30 CONTINUE
3235  asumr = zeror
3236  asumi = zeroi
3237  bsumr = sumbr
3238  bsumi = sumbi
3239  l1 = 0
3240  l2 = 30
3241  btol = tol*(dabs(bsumr)+dabs(bsumi))
3242  atol = tol
3243  pp = 1.0d0
3244  ias = 0
3245  ibs = 0
3246  IF (rfnu2.LT.tol) GO TO 110
3247  DO 100 is=2,7
3248  atol = atol/rfnu2
3249  pp = pp*rfnu2
3250  IF (ias.EQ.1) GO TO 60
3251  sumar = zeror
3252  sumai = zeroi
3253  DO 40 k=1,kmax
3254  m = l1 + k
3255  sumar = sumar + pr(k)*alfa(m)
3256  sumai = sumai + pi(k)*alfa(m)
3257  IF (ap(k).LT.atol) GO TO 50
3258  40 CONTINUE
3259  50 CONTINUE
3260  asumr = asumr + sumar*pp
3261  asumi = asumi + sumai*pp
3262  IF (pp.LT.tol) ias = 1
3263  60 CONTINUE
3264  IF (ibs.EQ.1) GO TO 90
3265  sumbr = zeror
3266  sumbi = zeroi
3267  DO 70 k=1,kmax
3268  m = l2 + k
3269  sumbr = sumbr + pr(k)*beta(m)
3270  sumbi = sumbi + pi(k)*beta(m)
3271  IF (ap(k).LT.atol) GO TO 80
3272  70 CONTINUE
3273  80 CONTINUE
3274  bsumr = bsumr + sumbr*pp
3275  bsumi = bsumi + sumbi*pp
3276  IF (pp.LT.btol) ibs = 1
3277  90 CONTINUE
3278  IF (ias.EQ.1 .AND. ibs.EQ.1) GO TO 110
3279  l1 = l1 + 30
3280  l2 = l2 + 30
3281  100 CONTINUE
3282  110 CONTINUE
3283  asumr = asumr + coner
3284  pp = rfnu*rfn13
3285  bsumr = bsumr*pp
3286  bsumi = bsumi*pp
3287  120 CONTINUE
3288  RETURN
3289 !-----------------------------------------------------------------------
3290 ! CABS(W2).GT.0.25D0
3291 !-----------------------------------------------------------------------
3292  130 CONTINUE
3293  CALL zsqrt(w2r, w2i, wr, wi)
3294  IF (wr.LT.0.0d0) wr = 0.0d0
3295  IF (wi.LT.0.0d0) wi = 0.0d0
3296  str = coner + wr
3297  sti = wi
3298  CALL zdiv(str, sti, zbr, zbi, zar, zai)
3299  CALL zlog(zar, zai, zcr, zci, idum)
3300  IF (zci.LT.0.0d0) zci = 0.0d0
3301  IF (zci.GT.hpi) zci = hpi
3302  IF (zcr.LT.0.0d0) zcr = 0.0d0
3303  zthr = (zcr-wr)*1.5d0
3304  zthi = (zci-wi)*1.5d0
3305  zeta1r = zcr*fnu
3306  zeta1i = zci*fnu
3307  zeta2r = wr*fnu
3308  zeta2i = wi*fnu
3309  azth = zabs(zthr,zthi)
3310  ang = thpi
3311  IF (zthr.GE.0.0d0 .AND. zthi.LT.0.0d0) GO TO 140
3312  ang = hpi
3313  IF (zthr.EQ.0.0d0) GO TO 140
3314  ang = datan(zthi/zthr)
3315  IF (zthr.LT.0.0d0) ang = ang + gpi
3316  140 CONTINUE
3317  pp = azth**ex2
3318  ang = ang*ex2
3319  zetar = pp*dcos(ang)
3320  zetai = pp*dsin(ang)
3321  IF (zetai.LT.0.0d0) zetai = 0.0d0
3322  argr = zetar*fn23
3323  argi = zetai*fn23
3324  CALL zdiv(zthr, zthi, zetar, zetai, rtztr, rtzti)
3325  CALL zdiv(rtztr, rtzti, wr, wi, zar, zai)
3326  tzar = zar + zar
3327  tzai = zai + zai
3328  CALL zsqrt(tzar, tzai, str, sti)
3329  phir = str*rfn13
3330  phii = sti*rfn13
3331  IF (ipmtr.EQ.1) GO TO 120
3332  raw = 1.0d0/dsqrt(aw2)
3333  str = wr*raw
3334  sti = -wi*raw
3335  tfnr = str*rfnu*raw
3336  tfni = sti*rfnu*raw
3337  razth = 1.0d0/azth
3338  str = zthr*razth
3339  sti = -zthi*razth
3340  rzthr = str*razth*rfnu
3341  rzthi = sti*razth*rfnu
3342  zcr = rzthr*ar(2)
3343  zci = rzthi*ar(2)
3344  raw2 = 1.0d0/aw2
3345  str = w2r*raw2
3346  sti = -w2i*raw2
3347  t2r = str*raw2
3348  t2i = sti*raw2
3349  str = t2r*c(2) + c(3)
3350  sti = t2i*c(2)
3351  upr(2) = str*tfnr - sti*tfni
3352  upi(2) = str*tfni + sti*tfnr
3353  bsumr = upr(2) + zcr
3354  bsumi = upi(2) + zci
3355  asumr = zeror
3356  asumi = zeroi
3357  IF (rfnu.LT.tol) GO TO 220
3358  przthr = rzthr
3359  przthi = rzthi
3360  ptfnr = tfnr
3361  ptfni = tfni
3362  upr(1) = coner
3363  upi(1) = conei
3364  pp = 1.0d0
3365  btol = tol*(dabs(bsumr)+dabs(bsumi))
3366  ks = 0
3367  kp1 = 2
3368  l = 3
3369  ias = 0
3370  ibs = 0
3371  DO 210 lr=2,12,2
3372  lrp1 = lr + 1
3373 !-----------------------------------------------------------------------
3374 ! COMPUTE TWO ADDITIONAL CR, DR, AND UP FOR TWO MORE TERMS IN
3375 ! NEXT SUMA AND SUMB
3376 !-----------------------------------------------------------------------
3377  DO 160 k=lr,lrp1
3378  ks = ks + 1
3379  kp1 = kp1 + 1
3380  l = l + 1
3381  zar = c(l)
3382  zai = zeroi
3383  DO 150 j=2,kp1
3384  l = l + 1
3385  str = zar*t2r - t2i*zai + c(l)
3386  zai = zar*t2i + zai*t2r
3387  zar = str
3388  150 CONTINUE
3389  str = ptfnr*tfnr - ptfni*tfni
3390  ptfni = ptfnr*tfni + ptfni*tfnr
3391  ptfnr = str
3392  upr(kp1) = ptfnr*zar - ptfni*zai
3393  upi(kp1) = ptfni*zar + ptfnr*zai
3394  crr(ks) = przthr*br(ks+1)
3395  cri(ks) = przthi*br(ks+1)
3396  str = przthr*rzthr - przthi*rzthi
3397  przthi = przthr*rzthi + przthi*rzthr
3398  przthr = str
3399  drr(ks) = przthr*ar(ks+2)
3400  dri(ks) = przthi*ar(ks+2)
3401  160 CONTINUE
3402  pp = pp*rfnu2
3403  IF (ias.EQ.1) GO TO 180
3404  sumar = upr(lrp1)
3405  sumai = upi(lrp1)
3406  ju = lrp1
3407  DO 170 jr=1,lr
3408  ju = ju - 1
3409  sumar = sumar + crr(jr)*upr(ju) - cri(jr)*upi(ju)
3410  sumai = sumai + crr(jr)*upi(ju) + cri(jr)*upr(ju)
3411  170 CONTINUE
3412  asumr = asumr + sumar
3413  asumi = asumi + sumai
3414  test = dabs(sumar) + dabs(sumai)
3415  IF (pp.LT.tol .AND. test.LT.tol) ias = 1
3416  180 CONTINUE
3417  IF (ibs.EQ.1) GO TO 200
3418  sumbr = upr(lr+2) + upr(lrp1)*zcr - upi(lrp1)*zci
3419  sumbi = upi(lr+2) + upr(lrp1)*zci + upi(lrp1)*zcr
3420  ju = lrp1
3421  DO 190 jr=1,lr
3422  ju = ju - 1
3423  sumbr = sumbr + drr(jr)*upr(ju) - dri(jr)*upi(ju)
3424  sumbi = sumbi + drr(jr)*upi(ju) + dri(jr)*upr(ju)
3425  190 CONTINUE
3426  bsumr = bsumr + sumbr
3427  bsumi = bsumi + sumbi
3428  test = dabs(sumbr) + dabs(sumbi)
3429  IF (pp.LT.btol .AND. test.LT.btol) ibs = 1
3430  200 CONTINUE
3431  IF (ias.EQ.1 .AND. ibs.EQ.1) GO TO 220
3432  210 CONTINUE
3433  220 CONTINUE
3434  asumr = asumr + coner
3435  str = -bsumr*rfn13
3436  sti = -bsumi*rfn13
3437  CALL zdiv(str, sti, rtztr, rtzti, bsumr, bsumi)
3438  GO TO 120
3439 END
3440 
3441 SUBROUTINE zuchk(YR, YI, NZ, ASCLE, TOL)
3442 !***BEGIN PROLOGUE ZUCHK
3443 !***REFER TO ZSERI,ZUOIK,ZUNK1,ZUNK2,ZUNI1,ZUNI2,ZKSCL
3444 !
3445 ! Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN
3446 ! EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE
3447 ! IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW
3448 ! WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED
3449 ! IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE
3450 ! OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE
3451 ! ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.
3452 !
3453 !***ROUTINES CALLED (NONE)
3454 !***END PROLOGUE ZUCHK
3455 !
3456 ! COMPLEX Y
3457  DOUBLE PRECISION ascle, ss, st, tol, wr, wi, yr, yi
3458  INTEGER nz
3459  nz = 0
3460  wr = dabs(yr)
3461  wi = dabs(yi)
3462  st = dmin1(wr,wi)
3463  IF (st.GT.ascle) RETURN
3464  ss = dmax1(wr,wi)
3465  st = st/tol
3466  IF (ss.LT.st) nz = 1
3467  RETURN
3468 END
3469 
3470 SUBROUTINE zbinu(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL, ELIM, ALIM)
3471 USE complex
3472 !***BEGIN PROLOGUE ZBINU
3473 !***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
3474 
3475 ! ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
3476 
3477 !***ROUTINES CALLED ZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
3478 !***END PROLOGUE ZBINU
3479  DOUBLE PRECISION alim, az, cwi, cwr, cyi, cyr, dfnu, elim, fnu, &
3480  fnul, rl, tol, zeroi, zeror, zi, zr
3481  INTEGER i, inw, kode, n, nlast, nn, nui, nw, nz
3482  dimension cyr(1), cyi(1), cwr(2), cwi(2)
3483  DATA zeror,zeroi / 0.0d0, 0.0d0 /
3484 
3485  nz = 0
3486  az = zabs(zr,zi)
3487  nn = n
3488  dfnu = fnu + dble(float(n-1))
3489  IF (az.LE.2.0d0) GO TO 10
3490  IF (az*az*0.25d0.GT.dfnu+1.0d0) GO TO 20
3491  10 CONTINUE
3492 !-----------------------------------------------------------------------
3493 ! POWER SERIES
3494 !-----------------------------------------------------------------------
3495  CALL zseri(zr, zi, fnu, kode, nn, cyr, cyi, nw, tol, elim, alim)
3496  inw = iabs(nw)
3497  nz = nz + inw
3498  nn = nn - inw
3499  IF (nn.EQ.0) RETURN
3500  IF (nw.GE.0) GO TO 120
3501  dfnu = fnu + dble(float(nn-1))
3502  20 CONTINUE
3503  IF (az.LT.rl) GO TO 40
3504  IF (dfnu.LE.1.0d0) GO TO 30
3505  IF (az+az.LT.dfnu*dfnu) GO TO 50
3506 !-----------------------------------------------------------------------
3507 ! ASYMPTOTIC EXPANSION FOR LARGE Z
3508 !-----------------------------------------------------------------------
3509  30 CONTINUE
3510  CALL zasyi(zr, zi, fnu, kode, nn, cyr, cyi, nw, rl, tol, elim, alim)
3511  IF (nw.LT.0) GO TO 130
3512  GO TO 120
3513  40 CONTINUE
3514  IF (dfnu.LE.1.0d0) GO TO 70
3515  50 CONTINUE
3516 !-----------------------------------------------------------------------
3517 ! OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
3518 !-----------------------------------------------------------------------
3519  CALL zuoik(zr, zi, fnu, kode, 1, nn, cyr, cyi, nw, tol, elim, alim)
3520  IF (nw.LT.0) GO TO 130
3521  nz = nz + nw
3522  nn = nn - nw
3523  IF (nn.EQ.0) RETURN
3524  dfnu = fnu+dble(float(nn-1))
3525  IF (dfnu.GT.fnul) GO TO 110
3526  IF (az.GT.fnul) GO TO 110
3527  60 CONTINUE
3528  IF (az.GT.rl) GO TO 80
3529  70 CONTINUE
3530 !-----------------------------------------------------------------------
3531 ! MILLER ALGORITHM NORMALIZED BY THE SERIES
3532 !-----------------------------------------------------------------------
3533  CALL zmlri(zr, zi, fnu, kode, nn, cyr, cyi, nw, tol)
3534  IF(nw.LT.0) GO TO 130
3535  GO TO 120
3536  80 CONTINUE
3537 !-----------------------------------------------------------------------
3538 ! MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
3539 !-----------------------------------------------------------------------
3540 !-----------------------------------------------------------------------
3541 ! OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
3542 !-----------------------------------------------------------------------
3543  CALL zuoik(zr, zi, fnu, kode, 2, 2, cwr, cwi, nw, tol, elim, alim)
3544  IF (nw.GE.0) GO TO 100
3545  nz = nn
3546  DO 90 i=1,nn
3547  cyr(i) = zeror
3548  cyi(i) = zeroi
3549  90 CONTINUE
3550  RETURN
3551  100 CONTINUE
3552  IF (nw.GT.0) GO TO 130
3553  CALL zwrsk(zr, zi, fnu, kode, nn, cyr, cyi, nw, cwr, cwi, tol, elim, alim)
3554  IF (nw.LT.0) GO TO 130
3555  GO TO 120
3556  110 CONTINUE
3557 !-----------------------------------------------------------------------
3558 ! INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
3559 !-----------------------------------------------------------------------
3560  nui = int(sngl(fnul-dfnu)) + 1
3561  nui = max0(nui,0)
3562  CALL zbuni(zr, zi, fnu, kode, nn, cyr, cyi, nw, nui, nlast, fnul, &
3563  tol, elim, alim)
3564  IF (nw.LT.0) GO TO 130
3565  nz = nz + nw
3566  IF (nlast.EQ.0) GO TO 120
3567  nn = nlast
3568  GO TO 60
3569  120 CONTINUE
3570  RETURN
3571  130 CONTINUE
3572  nz = -1
3573  IF(nw.EQ.(-2)) nz=-2
3574  RETURN
3575  END
3576 
3577 SUBROUTINE zshch(ZR, ZI, CSHR, CSHI, CCHR, CCHI)
3578 !***BEGIN PROLOGUE ZSHCH
3579 !***REFER TO ZBESK,ZBESH
3580 !
3581 ! ZSHCH COMPUTES THE COMPLEX HYPERBOLI! FUNCTIONS CSH=SINH(X+I*Y)
3582 ! AND CCH=COSH(X+I*Y), WHERE I**2=-1.
3583 !
3584 !***ROUTINES CALLED (NONE)
3585 !***END PROLOGUE ZSHCH
3586 !
3587  DOUBLE PRECISION cchi, cchr, ch, cn, cshi, cshr, sh, sn, zi, zr, dcosh, dsinh
3588  sh = dsinh(zr)
3589  ch = dcosh(zr)
3590  sn = dsin(zi)
3591  cn = dcos(zi)
3592  cshr = sh*cn
3593  cshi = ch*sn
3594  cchr = ch*cn
3595  cchi = sh*sn
3596  RETURN
3597 END
3598 
3599 DOUBLE PRECISION FUNCTION dgamln(Z,IERR)
3600 USE utilit
3601 !***BEGIN PROLOGUE DGAMLN
3602 !***DATE WRITTEN 830501 (YYMMDD)
3603 !***REVISION DATE 830501 (YYMMDD)
3604 !***CATEGORY NO. B5F
3605 !***KEYWORDS GAMMA FUNCTION,LOGARITHM OF GAMMA FUNCTION
3606 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
3607 !***PURPOSE TO COMPUTE THE LOGARITHM OF THE GAMMA FUNCTION
3608 !***DESCRIPTION
3609 !
3610 ! **** A DOUBLE PRECISION ROUTINE ****
3611 ! DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR
3612 ! Z.GT.0. THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES
3613 ! GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION
3614 ! G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN. THE FUNCTION WAS MADE AS
3615 ! PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE
3616 ! 10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18)
3617 ! LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.
3618 !
3619 ! SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100
3620 ! VALUES IS USED FOR SPEED OF EXECUTION.
3621 !
3622 ! DESCRIPTION OF ARGUMENTS
3623 !
3624 ! INPUT Z IS D0UBLE PRECISION
3625 ! Z - ARGUMENT, Z.GT.0.0D0
3626 !
3627 ! OUTPUT DGAMLN IS DOUBLE PRECISION
3628 ! DGAMLN - NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
3629 ! IERR - ERROR FLAG
3630 ! IERR=0, NORMAL RETURN, COMPUTATION COMPLETED
3631 ! IERR=1, Z.LE.0.0D0, NO COMPUTATION
3632 !
3633 !
3634 !***REFERENCES COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
3635 ! BY D. E. AMOS, SAND83-0083, MAY, 1983.
3636 !***ROUTINES CALLED I1MACH,D1MACH
3637 !***END PROLOGUE DGAMLN
3638  DOUBLE PRECISION cf, con, fln, fz, gln, rln, s, tlg, trm, tst, &
3639  t1, wdtol, z, zdmy, zinc, zm, zmin, zp, zsq
3640  INTEGER i, ierr, i1m, k, mz, nz
3641  dimension cf(22), gln(100)
3642 ! LNGAMMA(N), N=1,100
3643  DATA gln(1), gln(2), gln(3), gln(4), gln(5), gln(6), gln(7), &
3644  gln(8), gln(9), gln(10), gln(11), gln(12), gln(13), gln(14), &
3645  gln(15), gln(16), gln(17), gln(18), gln(19), gln(20), &
3646  gln(21), gln(22)/ &
3647  0.00000000000000000d+00, 0.00000000000000000d+00, &
3648  6.93147180559945309d-01, 1.79175946922805500d+00, &
3649  3.17805383034794562d+00, 4.78749174278204599d+00, &
3650  6.57925121201010100d+00, 8.52516136106541430d+00, &
3651  1.06046029027452502d+01, 1.28018274800814696d+01, &
3652  1.51044125730755153d+01, 1.75023078458738858d+01, &
3653  1.99872144956618861d+01, 2.25521638531234229d+01, &
3654  2.51912211827386815d+01, 2.78992713838408916d+01, &
3655  3.06718601060806728d+01, 3.35050734501368889d+01, &
3656  3.63954452080330536d+01, 3.93398841871994940d+01, &
3657  4.23356164607534850d+01, 4.53801388984769080d+01/
3658  DATA gln(23), gln(24), gln(25), gln(26), gln(27), gln(28), &
3659  gln(29), gln(30), gln(31), gln(32), gln(33), gln(34), &
3660  gln(35), gln(36), gln(37), gln(38), gln(39), gln(40), &
3661  gln(41), gln(42), gln(43), gln(44)/ &
3662  4.84711813518352239d+01, 5.16066755677643736d+01, &
3663  5.47847293981123192d+01, 5.80036052229805199d+01, &
3664  6.12617017610020020d+01, 6.45575386270063311d+01, &
3665  6.78897431371815350d+01, 7.12570389671680090d+01, &
3666  7.46582363488301644d+01, 7.80922235533153106d+01, &
3667  8.15579594561150372d+01, 8.50544670175815174d+01, &
3668  8.85808275421976788d+01, 9.21361756036870925d+01, &
3669  9.57196945421432025d+01, 9.93306124547874269d+01, &
3670  1.02968198614513813d+02, 1.06631760260643459d+02, &
3671  1.10320639714757395d+02, 1.14034211781461703d+02, &
3672  1.17771881399745072d+02, 1.21533081515438634d+02/
3673  DATA gln(45), gln(46), gln(47), gln(48), gln(49), gln(50), &
3674  gln(51), gln(52), gln(53), gln(54), gln(55), gln(56), &
3675  gln(57), gln(58), gln(59), gln(60), gln(61), gln(62), &
3676  gln(63), gln(64), gln(65), gln(66)/ &
3677  1.25317271149356895d+02, 1.29123933639127215d+02, &
3678  1.32952575035616310d+02, 1.36802722637326368d+02, &
3679  1.40673923648234259d+02, 1.44565743946344886d+02, &
3680  1.48477766951773032d+02, 1.52409592584497358d+02, &
3681  1.56360836303078785d+02, 1.60331128216630907d+02, &
3682  1.64320112263195181d+02, 1.68327445448427652d+02, &
3683  1.72352797139162802d+02, 1.76395848406997352d+02, &
3684  1.80456291417543771d+02, 1.84533828861449491d+02, &
3685  1.88628173423671591d+02, 1.92739047287844902d+02, &
3686  1.96866181672889994d+02, 2.01009316399281527d+02, &
3687  2.05168199482641199d+02, 2.09342586752536836d+02/
3688  DATA gln(67), gln(68), gln(69), gln(70), gln(71), gln(72), &
3689  gln(73), gln(74), gln(75), gln(76), gln(77), gln(78), &
3690  gln(79), gln(80), gln(81), gln(82), gln(83), gln(84), &
3691  gln(85), gln(86), gln(87), gln(88)/ &
3692  2.13532241494563261d+02, 2.17736934113954227d+02, &
3693  2.21956441819130334d+02, 2.26190548323727593d+02, &
3694  2.30439043565776952d+02, 2.34701723442818268d+02, &
3695  2.38978389561834323d+02, 2.43268849002982714d+02, &
3696  2.47572914096186884d+02, 2.51890402209723194d+02, &
3697  2.56221135550009525d+02, 2.60564940971863209d+02, &
3698  2.64921649798552801d+02, 2.69291097651019823d+02, &
3699  2.73673124285693704d+02, 2.78067573440366143d+02, &
3700  2.82474292687630396d+02, 2.86893133295426994d+02, &
3701  2.91323950094270308d+02, 2.95766601350760624d+02, &
3702  3.00220948647014132d+02, 3.04686856765668715d+02/
3703  DATA gln(89), gln(90), gln(91), gln(92), gln(93), gln(94), &
3704  gln(95), gln(96), gln(97), gln(98), gln(99), gln(100)/ &
3705  3.09164193580146922d+02, 3.13652829949879062d+02, &
3706  3.18152639620209327d+02, 3.22663499126726177d+02, &
3707  3.27185287703775217d+02, 3.31717887196928473d+02, &
3708  3.36261181979198477d+02, 3.40815058870799018d+02, &
3709  3.45379407062266854d+02, 3.49954118040770237d+02, &
3710  3.54539085519440809d+02, 3.59134205369575399d+02/
3711 ! COEFFICIENTS OF ASYMPTOTIC EXPANSION
3712  DATA cf(1), cf(2), cf(3), cf(4), cf(5), cf(6), cf(7), cf(8), &
3713  cf(9), cf(10), cf(11), cf(12), cf(13), cf(14), cf(15), &
3714  cf(16), cf(17), cf(18), cf(19), cf(20), cf(21), cf(22)/ &
3715  8.33333333333333333d-02, -2.77777777777777778d-03, &
3716  7.93650793650793651d-04, -5.95238095238095238d-04, &
3717  8.41750841750841751d-04, -1.91752691752691753d-03, &
3718  6.41025641025641026d-03, -2.95506535947712418d-02, &
3719  1.79644372368830573d-01, -1.39243221690590112d+00, &
3720  1.34028640441683920d+01, -1.56848284626002017d+02, &
3721  2.19310333333333333d+03, -3.61087712537249894d+04, &
3722  6.91472268851313067d+05, -1.52382215394074162d+07, &
3723  3.82900751391414141d+08, -1.08822660357843911d+10, &
3724  3.47320283765002252d+11, -1.23696021422692745d+13, &
3725  4.88788064793079335d+14, -2.13203339609193739d+16/
3726 
3727 ! LN(2*PI)
3728  DATA con / 1.83787706640934548d+00/
3729 
3730 !***FIRST EXECUTABLE STATEMENT DGAMLN
3731  ierr=0
3732  IF (z.LE.0.0d0) GO TO 70
3733  IF (z.GT.101.0d0) GO TO 10
3734  nz = int(sngl(z))
3735  fz = z - float(nz)
3736  IF (fz.GT.0.0d0) GO TO 10
3737  IF (nz.GT.100) GO TO 10
3738  dgamln = gln(nz)
3739  RETURN
3740  10 CONTINUE
3741  wdtol = d1mach(4)
3742  wdtol = dmax1(wdtol,0.5d-18)
3743  i1m = i1mach(14)
3744  rln = d1mach(5)*float(i1m)
3745  fln = dmin1(rln,20.0d0)
3746  fln = dmax1(fln,3.0d0)
3747  fln = fln - 3.0d0
3748  zm = 1.8000d0 + 0.3875d0*fln
3749  mz = int(sngl(zm)) + 1
3750  zmin = float(mz)
3751  zdmy = z
3752  zinc = 0.0d0
3753  IF (z.GE.zmin) GO TO 20
3754  zinc = zmin - float(nz)
3755  zdmy = z + zinc
3756  20 CONTINUE
3757  zp = 1.0d0/zdmy
3758  t1 = cf(1)*zp
3759  s = t1
3760  IF (zp.LT.wdtol) GO TO 40
3761  zsq = zp*zp
3762  tst = t1*wdtol
3763  DO 30 k=2,22
3764  zp = zp*zsq
3765  trm = cf(k)*zp
3766  IF (dabs(trm).LT.tst) GO TO 40
3767  s = s + trm
3768  30 CONTINUE
3769  40 CONTINUE
3770  IF (zinc.NE.0.0d0) GO TO 50
3771  tlg = dlog(z)
3772  dgamln = z*(tlg-1.0d0) + 0.5d0*(con-tlg) + s
3773  RETURN
3774  50 CONTINUE
3775  zp = 1.0d0
3776  nz = int(sngl(zinc))
3777  DO 60 i=1,nz
3778  zp = zp*(z+float(i-1))
3779  60 CONTINUE
3780  tlg = dlog(zdmy)
3781  dgamln = zdmy*(tlg-1.0d0) - dlog(zp) + 0.5d0*(con-tlg) + s
3782  RETURN
3783 
3784  70 CONTINUE
3785  ierr=1
3786  RETURN
3787 END
3788 
3789 SUBROUTINE zkscl(ZRR,ZRI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
3790 USE complex
3791 !***BEGIN PROLOGUE ZKSCL
3792 !***REFER TO ZBESK
3793 !
3794 ! SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
3795 ! ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
3796 ! RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
3797 !
3798 !***ROUTINES CALLED ZUCHK,ZABS,ZLOG
3799 !***END PROLOGUE ZKSCL
3800 ! COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM
3801  DOUBLE PRECISION acs, as, ascle, cki, ckr, csi, csr, cyi, &
3802  cyr, elim, fn, fnu, rzi, rzr, str, s1i, s1r, s2i, s2r, &
3803  tol, yi, yr, zeroi, zeror, zri, zrr, zdr, zdi, celmr, &
3804  elm, helim, alas
3805  INTEGER i, ic, idum, kk, n, nn, nw, nz
3806  dimension yr(1), yi(1), cyr(2), cyi(2)
3807  DATA zeror,zeroi / 0.0d0 , 0.0d0 /
3808 
3809  nz = 0
3810  ic = 0
3811  nn = min0(2,n)
3812  DO 10 i=1,nn
3813  s1r = yr(i)
3814  s1i = yi(i)
3815  cyr(i) = s1r
3816  cyi(i) = s1i
3817  as = zabs(s1r,s1i)
3818  acs = -zrr + dlog(as)
3819  nz = nz + 1
3820  yr(i) = zeror
3821  yi(i) = zeroi
3822  IF (acs.LT.(-elim)) GO TO 10
3823  CALL zlog(s1r, s1i, csr, csi, idum)
3824  csr = csr - zrr
3825  csi = csi - zri
3826  str = dexp(csr)/tol
3827  csr = str*dcos(csi)
3828  csi = str*dsin(csi)
3829  CALL zuchk(csr, csi, nw, ascle, tol)
3830  IF (nw.NE.0) GO TO 10
3831  yr(i) = csr
3832  yi(i) = csi
3833  ic = i
3834  nz = nz - 1
3835  10 CONTINUE
3836  IF (n.EQ.1) RETURN
3837  IF (ic.GT.1) GO TO 20
3838  yr(1) = zeror
3839  yi(1) = zeroi
3840  nz = 2
3841  20 CONTINUE
3842  IF (n.EQ.2) RETURN
3843  IF (nz.EQ.0) RETURN
3844  fn = fnu + 1.0d0
3845  ckr = fn*rzr
3846  cki = fn*rzi
3847  s1r = cyr(1)
3848  s1i = cyi(1)
3849  s2r = cyr(2)
3850  s2i = cyi(2)
3851  helim = 0.5d0*elim
3852  elm = dexp(-elim)
3853  celmr = elm
3854  zdr = zrr
3855  zdi = zri
3856 
3857 ! FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
3858 ! S2 GETS LARGER THAN EXP(ELIM/2)
3859 
3860  DO 30 i=3,n
3861  kk = i
3862  csr = s2r
3863  csi = s2i
3864  s2r = ckr*csr - cki*csi + s1r
3865  s2i = cki*csr + ckr*csi + s1i
3866  s1r = csr
3867  s1i = csi
3868  ckr = ckr + rzr
3869  cki = cki + rzi
3870  as = zabs(s2r,s2i)
3871  alas = dlog(as)
3872  acs = -zdr + alas
3873  nz = nz + 1
3874  yr(i) = zeror
3875  yi(i) = zeroi
3876  IF (acs.LT.(-elim)) GO TO 25
3877  CALL zlog(s2r, s2i, csr, csi, idum)
3878  csr = csr - zdr
3879  csi = csi - zdi
3880  str = dexp(csr)/tol
3881  csr = str*dcos(csi)
3882  csi = str*dsin(csi)
3883  CALL zuchk(csr, csi, nw, ascle, tol)
3884  IF (nw.NE.0) GO TO 25
3885  yr(i) = csr
3886  yi(i) = csi
3887  nz = nz - 1
3888  IF (ic.EQ.kk-1) GO TO 40
3889  ic = kk
3890  GO TO 30
3891  25 CONTINUE
3892  IF(alas.LT.helim) GO TO 30
3893  zdr = zdr - elim
3894  s1r = s1r*celmr
3895  s1i = s1i*celmr
3896  s2r = s2r*celmr
3897  s2i = s2i*celmr
3898  30 CONTINUE
3899  nz = n
3900  IF(ic.EQ.n) nz=n-1
3901  GO TO 45
3902  40 CONTINUE
3903  nz = kk - 2
3904  45 CONTINUE
3905  DO 50 i=1,nz
3906  yr(i) = zeror
3907  yi(i) = zeroi
3908  50 CONTINUE
3909  RETURN
3910 END
3911 
3912 SUBROUTINE zacai(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL, ELIM, ALIM)
3913 USE utilit
3914 USE complex
3915 !***BEGIN PROLOGUE ZACAI
3916 !***REFER TO ZAIRY
3917 !
3918 ! ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA
3919 !
3920 ! K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
3921 ! MP=PI*MR*CMPLX(0.0,1.0)
3922 !
3923 ! TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
3924 ! HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1.
3925 ! ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND
3926 ! RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON
3927 ! IS CALLED FROM ZAIRY.
3928 !
3929 !***ROUTINES CALLED ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,ZABS
3930 !***END PROLOGUE ZACAI
3931 ! COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY
3932  DOUBLE PRECISION alim, arg, ascle, az, csgnr, csgni, cspnr, &
3933  cspni, c1r, c1i, c2r, c2i, cyr, cyi, dfnu, elim, fmr, fnu, pi, &
3934  rl, sgn, tol, yy, yr, yi, zr, zi, znr, zni
3935  INTEGER inu, iuf, kode, mr, n, nn, nw, nz
3936  dimension yr(1), yi(1), cyr(2), cyi(2)
3937  DATA pi / 3.14159265358979324d0 /
3938  nz = 0
3939  znr = -zr
3940  zni = -zi
3941  az = zabs(zr,zi)
3942  nn = n
3943  dfnu = fnu + dble(float(n-1))
3944  IF (az.LE.2.0d0) GO TO 10
3945  IF (az*az*0.25d0.GT.dfnu+1.0d0) GO TO 20
3946  10 CONTINUE
3947 !-----------------------------------------------------------------------
3948 ! POWER SERIES FOR THE I FUNCTION
3949 !-----------------------------------------------------------------------
3950  CALL zseri(znr, zni, fnu, kode, nn, yr, yi, nw, tol, elim, alim)
3951  GO TO 40
3952  20 CONTINUE
3953  IF (az.LT.rl) GO TO 30
3954 !-----------------------------------------------------------------------
3955 ! ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION
3956 !-----------------------------------------------------------------------
3957  CALL zasyi(znr, zni, fnu, kode, nn, yr, yi, nw, rl, tol, elim, alim)
3958  IF (nw.LT.0) GO TO 80
3959  GO TO 40
3960  30 CONTINUE
3961 !-----------------------------------------------------------------------
3962 ! MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
3963 !-----------------------------------------------------------------------
3964  CALL zmlri(znr, zni, fnu, kode, nn, yr, yi, nw, tol)
3965  IF(nw.LT.0) GO TO 80
3966  40 CONTINUE
3967 !-----------------------------------------------------------------------
3968 ! ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
3969 !-----------------------------------------------------------------------
3970  CALL zbknu(znr, zni, fnu, kode, 1, cyr, cyi, nw, tol, elim, alim)
3971  IF (nw.NE.0) GO TO 80
3972  fmr = dble(float(mr))
3973  sgn = -dsign(pi,fmr)
3974  csgnr = 0.0d0
3975  csgni = sgn
3976  IF (kode.EQ.1) GO TO 50
3977  yy = -zni
3978  csgnr = -csgni*dsin(yy)
3979  csgni = csgni*dcos(yy)
3980  50 CONTINUE
3981 !-----------------------------------------------------------------------
3982 ! CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
3983 ! WHEN FNU IS LARGE
3984 !-----------------------------------------------------------------------
3985  inu = int(sngl(fnu))
3986  arg = (fnu-dble(float(inu)))*sgn
3987  cspnr = dcos(arg)
3988  cspni = dsin(arg)
3989  IF (mod(inu,2).EQ.0) GO TO 60
3990  cspnr = -cspnr
3991  cspni = -cspni
3992  60 CONTINUE
3993  c1r = cyr(1)
3994  c1i = cyi(1)
3995  c2r = yr(1)
3996  c2i = yi(1)
3997  IF (kode.EQ.1) GO TO 70
3998  iuf = 0
3999  ascle = 1.0d+3*d1mach(1)/tol
4000  CALL zs1s2(znr, zni, c1r, c1i, c2r, c2i, nw, ascle, alim, iuf)
4001  nz = nz + nw
4002  70 CONTINUE
4003  yr(1) = cspnr*c1r - cspni*c1i + csgnr*c2r - csgni*c2i
4004  yi(1) = cspnr*c1i + cspni*c1r + csgnr*c2i + csgni*c2r
4005  RETURN
4006  80 CONTINUE
4007  nz = -1
4008  IF(nw.EQ.(-2)) nz=-2
4009  RETURN
4010 END
4011 
4012 SUBROUTINE zs1s2(ZRR, ZRI, S1R, S1I, S2R, S2I, NZ, ASCLE, ALIM, IUF)
4013 USE complex
4014 !***BEGIN PROLOGUE ZS1S2
4015 !***REFER TO ZBESK,ZAIRY
4016 !
4017 ! ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE
4018 ! ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON-
4019 ! TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.
4020 ! ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF
4021 ! MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER
4022 ! OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE
4023 ! PRECISION ABOVE THE UNDERFLOW LIMIT.
4024 !
4025 !***ROUTINES CALLED ZABS,ZEXP,ZLOG
4026 !***END PROLOGUE ZS1S2
4027 ! COMPLEX CZERO,C1,S1,S1D,S2,ZR
4028  DOUBLE PRECISION aa, alim, aln, ascle, as1, as2, c1i, c1r, s1di, &
4029  s1dr, s1i, s1r, s2i, s2r, zeroi, zeror, zri, zrr
4030  INTEGER iuf, idum, nz
4031  DATA zeror,zeroi / 0.0d0 , 0.0d0 /
4032  nz = 0
4033  as1 = zabs(s1r,s1i)
4034  as2 = zabs(s2r,s2i)
4035  IF (s1r.EQ.0.0d0 .AND. s1i.EQ.0.0d0) GO TO 10
4036  IF (as1.EQ.0.0d0) GO TO 10
4037  aln = -zrr - zrr + dlog(as1)
4038  s1dr = s1r
4039  s1di = s1i
4040  s1r = zeror
4041  s1i = zeroi
4042  as1 = zeror
4043  IF (aln.LT.(-alim)) GO TO 10
4044  CALL zlog(s1dr, s1di, c1r, c1i, idum)
4045  c1r = c1r - zrr - zrr
4046  c1i = c1i - zri - zri
4047  CALL zexp(c1r, c1i, s1r, s1i)
4048  as1 = zabs(s1r,s1i)
4049  iuf = iuf + 1
4050  10 CONTINUE
4051  aa = dmax1(as1,as2)
4052  IF (aa.GT.ascle) RETURN
4053  s1r = zeror
4054  s1i = zeroi
4055  s2r = zeror
4056  s2i = zeroi
4057  nz = 1
4058  iuf = 0
4059  RETURN
4060 END
4061 
4062 SUBROUTINE zrati(ZR, ZI, FNU, N, CYR, CYI, TOL)
4063 USE complex
4064 !***BEGIN PROLOGUE ZRATI
4065 !***REFER TO ZBESI,ZBESK,ZBESH
4066 !
4067 ! ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
4068 ! RECURRENCE. THE STARTING INDEX IS DETERMINED BY FORWARD
4069 ! RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
4070 ! MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
4071 ! BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
4072 ! BY D. J. SOOKNE.
4073 !
4074 !***ROUTINES CALLED ZABS,ZDIV
4075 !***END PROLOGUE ZRATI
4076 ! COMPLEX Z,CY(1),CONE,CZERO,P1,P2,T1,RZ,PT,CDFNU
4077  DOUBLE PRECISION ak, amagz, ap1, ap2, arg, az, cdfnui, cdfnur, &
4078  conei, coner, cyi, cyr, czeroi, czeror, dfnu, fdnu, flam, fnu, &
4079  fnup, pti, ptr, p1i, p1r, p2i, p2r, rak, rap1, rho, rt2, rzi, &
4080  rzr, test, test1, tol, tti, ttr, t1i, t1r, zi, zr
4081  INTEGER i, id, idnu, inu, itime, k, kk, magz, n
4082  dimension cyr(1), cyi(1)
4083  DATA czeror,czeroi,coner,conei,rt2 &
4084  /0.0d0, 0.0d0, 1.0d0, 0.0d0, 1.41421356237309505d0/
4085  az = zabs(zr,zi)
4086  inu = int(sngl(fnu))
4087  idnu = inu + n - 1
4088  magz = int(sngl(az))
4089  amagz = dble(float(magz+1))
4090  fdnu = dble(float(idnu))
4091  fnup = dmax1(amagz,fdnu)
4092  id = idnu - magz - 1
4093  itime = 1
4094  k = 1
4095  ptr = 1.0d0/az
4096  rzr = ptr*(zr+zr)*ptr
4097  rzi = -ptr*(zi+zi)*ptr
4098  t1r = rzr*fnup
4099  t1i = rzi*fnup
4100  p2r = -t1r
4101  p2i = -t1i
4102  p1r = coner
4103  p1i = conei
4104  t1r = t1r + rzr
4105  t1i = t1i + rzi
4106  IF (id.GT.0) id = 0
4107  ap2 = zabs(p2r,p2i)
4108  ap1 = zabs(p1r,p1i)
4109 !-----------------------------------------------------------------------
4110 ! THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNU
4111 ! GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
4112 ! P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
4113 ! PREMATURELY.
4114 !-----------------------------------------------------------------------
4115  arg = (ap2+ap2)/(ap1*tol)
4116  test1 = dsqrt(arg)
4117  test = test1
4118  rap1 = 1.0d0/ap1
4119  p1r = p1r*rap1
4120  p1i = p1i*rap1
4121  p2r = p2r*rap1
4122  p2i = p2i*rap1
4123  ap2 = ap2*rap1
4124  10 CONTINUE
4125  k = k + 1
4126  ap1 = ap2
4127  ptr = p2r
4128  pti = p2i
4129  p2r = p1r - (t1r*ptr-t1i*pti)
4130  p2i = p1i - (t1r*pti+t1i*ptr)
4131  p1r = ptr
4132  p1i = pti
4133  t1r = t1r + rzr
4134  t1i = t1i + rzi
4135  ap2 = zabs(p2r,p2i)
4136  IF (ap1.LE.test) GO TO 10
4137  IF (itime.EQ.2) GO TO 20
4138  ak = zabs(t1r,t1i)*0.5d0
4139  flam = ak + dsqrt(ak*ak-1.0d0)
4140  rho = dmin1(ap2/ap1,flam)
4141  test = test1*dsqrt(rho/(rho*rho-1.0d0))
4142  itime = 2
4143  GO TO 10
4144  20 CONTINUE
4145  kk = k + 1 - id
4146  ak = dble(float(kk))
4147  t1r = ak
4148  t1i = czeroi
4149  dfnu = fnu + dble(float(n-1))
4150  p1r = 1.0d0/ap2
4151  p1i = czeroi
4152  p2r = czeror
4153  p2i = czeroi
4154  DO 30 i=1,kk
4155  ptr = p1r
4156  pti = p1i
4157  rap1 = dfnu + t1r
4158  ttr = rzr*rap1
4159  tti = rzi*rap1
4160  p1r = (ptr*ttr-pti*tti) + p2r
4161  p1i = (ptr*tti+pti*ttr) + p2i
4162  p2r = ptr
4163  p2i = pti
4164  t1r = t1r - coner
4165  30 CONTINUE
4166  IF (p1r.NE.czeror .OR. p1i.NE.czeroi) GO TO 40
4167  p1r = tol
4168  p1i = tol
4169  40 CONTINUE
4170  CALL zdiv(p2r, p2i, p1r, p1i, cyr(n), cyi(n))
4171  IF (n.EQ.1) RETURN
4172  k = n - 1
4173  ak = dble(float(k))
4174  t1r = ak
4175  t1i = czeroi
4176  cdfnur = fnu*rzr
4177  cdfnui = fnu*rzi
4178  DO 60 i=2,n
4179  ptr = cdfnur + (t1r*rzr-t1i*rzi) + cyr(k+1)
4180  pti = cdfnui + (t1r*rzi+t1i*rzr) + cyi(k+1)
4181  ak = zabs(ptr,pti)
4182  IF (ak.NE.czeror) GO TO 50
4183  ptr = tol
4184  pti = tol
4185  ak = tol*rt2
4186  50 CONTINUE
4187  rak = coner/ak
4188  cyr(k) = rak*ptr*rak
4189  cyi(k) = -rak*pti*rak
4190  t1r = t1r - coner
4191  k = k - 1
4192  60 CONTINUE
4193  RETURN
4194 END
4195 
4196 SUBROUTINE zairy(ZR, ZI, ID, KODE, AIR, AII, NZ, IERR)
4197 USE utilit
4198 USE complex
4199 !***BEGIN PROLOGUE ZAIRY
4200 !***DATE WRITTEN 830501 (YYMMDD)
4201 !***REVISION DATE 830501 (YYMMDD)
4202 !***CATEGORY NO. B5K
4203 !***KEYWORDS AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
4204 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
4205 !***PURPOSE TO COMPUTE AIRY FUNCTIONS AI(Z) AND DAI(Z) FOR COMPLEX Z
4206 !***DESCRIPTION
4207 !
4208 ! ***A DOUBLE PRECISION ROUTINE***
4209 ! ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR
4210 ! ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
4211 ! KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)*
4212 ! DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN
4213 ! -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN
4214 ! PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).
4215 !
4216 ! WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTI! IN
4217 ! THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED
4218 ! FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS.
4219 ! DEFINTIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
4220 ! MATHEMATICAL FUNCTIONS (REF. 1).
4221 !
4222 ! INPUT ZR,ZI ARE DOUBLE PRECISION
4223 ! ZR,ZI - Z=CMPLX(ZR,ZI)
4224 ! ID - ORDER OF DERIVATIVE, ID=0 OR ID=1
4225 ! KODE - A PARAMETER TO INDICATE THE SCALING OPTION
4226 ! KODE= 1 RETURNS
4227 ! AI=AI(Z) ON ID=0 OR
4228 ! AI=DAI(Z)/DZ ON ID=1
4229 ! = 2 RETURNS
4230 ! AI=CEXP(ZTA)*AI(Z) ON ID=0 OR
4231 ! AI=CEXP(ZTA)*DAI(Z)/DZ ON ID=1 WHERE
4232 ! ZTA=(2/3)*Z*CSQRT(Z)
4233 !
4234 ! OUTPUT AIR,AII ARE DOUBLE PRECISION
4235 ! AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
4236 ! KODE
4237 ! NZ - UNDERFLOW INDICATOR
4238 ! NZ= 0 , NORMAL RETURN
4239 ! NZ= 1 , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN
4240 ! -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1
4241 ! IERR - ERROR FLAG
4242 ! IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
4243 ! IERR=1, INPUT ERROR - NO COMPUTATION
4244 ! IERR=2, OVERFLOW - NO COMPUTATION, REAL(ZTA)
4245 ! TOO LARGE ON KODE=1
4246 ! IERR=3, CABS(Z) LARGE - COMPUTATION COMPLETED
4247 ! LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
4248 ! PRODUCE LESS THAN HALF OF MACHINE ACCURACY
4249 ! IERR=4, CABS(Z) TOO LARGE - NO COMPUTATION
4250 ! COMPLETE LOSS OF ACCURACY BY ARGUMENT
4251 ! REDUCTION
4252 ! IERR=5, ERROR - NO COMPUTATION,
4253 ! ALGORITHM TERMINATION CONDITION NOT MET
4254 !
4255 !***LONG DESCRIPTION
4256 !
4257 ! AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL
4258 ! FUNCTIONS BY
4259 !
4260 ! AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA)
4261 ! C=1.0/(PI*SQRT(3.0))
4262 ! ZTA=(2/3)*Z**(3/2)
4263 !
4264 ! WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
4265 !
4266 ! IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
4267 ! MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
4268 ! OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
4269 ! THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
4270 ! THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
4271 ! FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
4272 ! DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
4273 ! ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
4274 ! ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
4275 ! FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
4276 ! LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
4277 ! MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
4278 ! AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
4279 ! PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
4280 ! PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
4281 ! ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
4282 ! NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
4283 ! DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
4284 ! EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
4285 ! NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
4286 ! PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
4287 ! MACHINES.
4288 !
4289 ! THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
4290 ! BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
4291 ! ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
4292 ! SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
4293 ! ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
4294 ! ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
4295 ! CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
4296 ! HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
4297 ! ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
4298 ! SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
4299 ! THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
4300 ! 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
4301 ! THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
4302 ! COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
4303 ! BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
4304 ! COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
4305 ! MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
4306 ! THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
4307 ! OR -PI/2+P.
4308 !
4309 !***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
4310 ! AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
4311 ! COMMERCE, 1955.
4312 !
4313 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
4314 ! AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
4315 !
4316 ! A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
4317 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
4318 ! 1018, MAY, 1985
4319 !
4320 ! A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
4321 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
4322 ! MATH. SOFTWARE, 1986
4323 !
4324 !***ROUTINES CALLED ZACAI,ZBKNU,ZABS,ZEXP,ZSQRT,I1MACH,D1MACH
4325 !***END PROLOGUE ZAIRY
4326 ! COMPLEX AI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
4327  DOUBLE PRECISION aa, ad, aii, air, ak, alim, atrm, az, az3, bk, &
4328  cc, ck, coef, conei, coner, csqi, csqr, cyi, cyr, c1, c2, dig, &
4329  dk, d1, d2, elim, fid, fnu, ptr, rl, r1m5, sfac, sti, str, &
4330  s1i, s1r, s2i, s2r, tol, trm1i, trm1r, trm2i, trm2r, tth, zeroi, &
4331  zeror, zi, zr, ztai, ztar, z3i, z3r, alaz, bb
4332  INTEGER id, ierr, iflag, k, kode, k1, k2, mr, nn, nz
4333  dimension cyr(1), cyi(1)
4334  DATA tth, c1, c2, coef /6.66666666666666667d-01, &
4335  3.55028053887817240d-01,2.58819403792806799d-01, &
4336  1.83776298473930683d-01/
4337  DATA zeror, zeroi, coner, conei /0.0d0,0.0d0,1.0d0,0.0d0/
4338 !***FIRST EXECUTABLE STATEMENT ZAIRY
4339  ierr = 0
4340  nz=0
4341  IF (id.LT.0 .OR. id.GT.1) ierr=1
4342  IF (kode.LT.1 .OR. kode.GT.2) ierr=1
4343  IF (ierr.NE.0) RETURN
4344  az = zabs(zr,zi)
4345  tol = dmax1(d1mach(4),1.0d-18)
4346  fid = dble(float(id))
4347  IF (az.GT.1.0d0) GO TO 70
4348 !-----------------------------------------------------------------------
4349 ! POWER SERIES FOR CABS(Z).LE.1.
4350 !-----------------------------------------------------------------------
4351  s1r = coner
4352  s1i = conei
4353  s2r = coner
4354  s2i = conei
4355  IF (az.LT.tol) GO TO 170
4356  aa = az*az
4357  IF (aa.LT.tol/az) GO TO 40
4358  trm1r = coner
4359  trm1i = conei
4360  trm2r = coner
4361  trm2i = conei
4362  atrm = 1.0d0
4363  str = zr*zr - zi*zi
4364  sti = zr*zi + zi*zr
4365  z3r = str*zr - sti*zi
4366  z3i = str*zi + sti*zr
4367  az3 = az*aa
4368  ak = 2.0d0 + fid
4369  bk = 3.0d0 - fid - fid
4370  ck = 4.0d0 - fid
4371  dk = 3.0d0 + fid + fid
4372  d1 = ak*dk
4373  d2 = bk*ck
4374  ad = dmin1(d1,d2)
4375  ak = 24.0d0 + 9.0d0*fid
4376  bk = 30.0d0 - 9.0d0*fid
4377  DO 30 k=1,25
4378  str = (trm1r*z3r-trm1i*z3i)/d1
4379  trm1i = (trm1r*z3i+trm1i*z3r)/d1
4380  trm1r = str
4381  s1r = s1r + trm1r
4382  s1i = s1i + trm1i
4383  str = (trm2r*z3r-trm2i*z3i)/d2
4384  trm2i = (trm2r*z3i+trm2i*z3r)/d2
4385  trm2r = str
4386  s2r = s2r + trm2r
4387  s2i = s2i + trm2i
4388  atrm = atrm*az3/ad
4389  d1 = d1 + ak
4390  d2 = d2 + bk
4391  ad = dmin1(d1,d2)
4392  IF (atrm.LT.tol*ad) GO TO 40
4393  ak = ak + 18.0d0
4394  bk = bk + 18.0d0
4395  30 CONTINUE
4396  40 CONTINUE
4397  IF (id.EQ.1) GO TO 50
4398  air = s1r*c1 - c2*(zr*s2r-zi*s2i)
4399  aii = s1i*c1 - c2*(zr*s2i+zi*s2r)
4400  IF (kode.EQ.1) RETURN
4401  CALL zsqrt(zr, zi, str, sti)
4402  ztar = tth*(zr*str-zi*sti)
4403  ztai = tth*(zr*sti+zi*str)
4404  CALL zexp(ztar, ztai, str, sti)
4405  ptr = air*str - aii*sti
4406  aii = air*sti + aii*str
4407  air = ptr
4408  RETURN
4409  50 CONTINUE
4410  air = -s2r*c2
4411  aii = -s2i*c2
4412  IF (az.LE.tol) GO TO 60
4413  str = zr*s1r - zi*s1i
4414  sti = zr*s1i + zi*s1r
4415  cc = c1/(1.0d0+fid)
4416  air = air + cc*(str*zr-sti*zi)
4417  aii = aii + cc*(str*zi+sti*zr)
4418  60 CONTINUE
4419  IF (kode.EQ.1) RETURN
4420  CALL zsqrt(zr, zi, str, sti)
4421  ztar = tth*(zr*str-zi*sti)
4422  ztai = tth*(zr*sti+zi*str)
4423  CALL zexp(ztar, ztai, str, sti)
4424  ptr = str*air - sti*aii
4425  aii = str*aii + sti*air
4426  air = ptr
4427  RETURN
4428 !-----------------------------------------------------------------------
4429 ! CASE FOR CABS(Z).GT.1.0
4430 !-----------------------------------------------------------------------
4431  70 CONTINUE
4432  fnu = (1.0d0+fid)/3.0d0
4433 !-----------------------------------------------------------------------
4434 ! SET PARAMETERS RELATED TO MACHINE CONSTANTS.
4435 ! TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0D-18.
4436 ! ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
4437 ! EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
4438 ! EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
4439 ! UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
4440 ! RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
4441 ! DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
4442 !-----------------------------------------------------------------------
4443  k1 = i1mach(15)
4444  k2 = i1mach(16)
4445  r1m5 = d1mach(5)
4446  k = min0(iabs(k1),iabs(k2))
4447  elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
4448  k1 = i1mach(14) - 1
4449  aa = r1m5*dble(float(k1))
4450  dig = dmin1(aa,18.0d0)
4451  aa = aa*2.303d0
4452  alim = elim + dmax1(-aa,-41.45d0)
4453  rl = 1.2d0*dig + 3.0d0
4454  alaz = dlog(az)
4455 !-----------------------------------------------------------------------
4456 ! TEST FOR PROPER RANGE
4457 !-----------------------------------------------------------------------
4458  aa=0.5d0/tol
4459  bb=dble(float(i1mach(9)))*0.5d0
4460  aa=dmin1(aa,bb)
4461  aa=aa**tth
4462  IF (az.GT.aa) GO TO 260
4463  aa=dsqrt(aa)
4464  IF (az.GT.aa) ierr=3
4465  CALL zsqrt(zr, zi, csqr, csqi)
4466  ztar = tth*(zr*csqr-zi*csqi)
4467  ztai = tth*(zr*csqi+zi*csqr)
4468 !-----------------------------------------------------------------------
4469 ! RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
4470 !-----------------------------------------------------------------------
4471  iflag = 0
4472  sfac = 1.0d0
4473  ak = ztai
4474  IF (zr.GE.0.0d0) GO TO 80
4475  bk = ztar
4476  ck = -dabs(bk)
4477  ztar = ck
4478  ztai = ak
4479  80 CONTINUE
4480  IF (zi.NE.0.0d0) GO TO 90
4481  IF (zr.GT.0.0d0) GO TO 90
4482  ztar = 0.0d0
4483  ztai = ak
4484  90 CONTINUE
4485  aa = ztar
4486  IF (aa.GE.0.0d0 .AND. zr.GT.0.0d0) GO TO 110
4487  IF (kode.EQ.2) GO TO 100
4488 !-----------------------------------------------------------------------
4489 ! OVERFLOW TEST
4490 !-----------------------------------------------------------------------
4491  IF (aa.GT.(-alim)) GO TO 100
4492  aa = -aa + 0.25d0*alaz
4493  iflag = 1
4494  sfac = tol
4495  IF (aa.GT.elim) GO TO 270
4496  100 CONTINUE
4497 !-----------------------------------------------------------------------
4498 ! CBKNU AND CACON RETURN EXP(ZTA)*K(FNU,ZTA) ON KODE=2
4499 !-----------------------------------------------------------------------
4500  mr = 1
4501  IF (zi.LT.0.0d0) mr = -1
4502  CALL zacai(ztar, ztai, fnu, kode, mr, 1, cyr, cyi, nn, rl, tol, &
4503  elim, alim)
4504  IF (nn.LT.0) GO TO 280
4505  nz = nz + nn
4506  GO TO 130
4507  110 CONTINUE
4508  IF (kode.EQ.2) GO TO 120
4509 !-----------------------------------------------------------------------
4510 ! UNDERFLOW TEST
4511 !-----------------------------------------------------------------------
4512  IF (aa.LT.alim) GO TO 120
4513  aa = -aa - 0.25d0*alaz
4514  iflag = 2
4515  sfac = 1.0d0/tol
4516  IF (aa.LT.(-elim)) GO TO 210
4517  120 CONTINUE
4518  CALL zbknu(ztar, ztai, fnu, kode, 1, cyr, cyi, nz, tol, elim, alim)
4519  130 CONTINUE
4520  s1r = cyr(1)*coef
4521  s1i = cyi(1)*coef
4522  IF (iflag.NE.0) GO TO 150
4523  IF (id.EQ.1) GO TO 140
4524  air = csqr*s1r - csqi*s1i
4525  aii = csqr*s1i + csqi*s1r
4526  RETURN
4527  140 CONTINUE
4528  air = -(zr*s1r-zi*s1i)
4529  aii = -(zr*s1i+zi*s1r)
4530  RETURN
4531  150 CONTINUE
4532  s1r = s1r*sfac
4533  s1i = s1i*sfac
4534  IF (id.EQ.1) GO TO 160
4535  str = s1r*csqr - s1i*csqi
4536  s1i = s1r*csqi + s1i*csqr
4537  s1r = str
4538  air = s1r/sfac
4539  aii = s1i/sfac
4540  RETURN
4541  160 CONTINUE
4542  str = -(s1r*zr-s1i*zi)
4543  s1i = -(s1r*zi+s1i*zr)
4544  s1r = str
4545  air = s1r/sfac
4546  aii = s1i/sfac
4547  RETURN
4548  170 CONTINUE
4549  aa = 1.0d+3*d1mach(1)
4550  s1r = zeror
4551  s1i = zeroi
4552  IF (id.EQ.1) GO TO 190
4553  IF (az.LE.aa) GO TO 180
4554  s1r = c2*zr
4555  s1i = c2*zi
4556  180 CONTINUE
4557  air = c1 - s1r
4558  aii = -s1i
4559  RETURN
4560  190 CONTINUE
4561  air = -c2
4562  aii = 0.0d0
4563  aa = dsqrt(aa)
4564  IF (az.LE.aa) GO TO 200
4565  s1r = 0.5d0*(zr*zr-zi*zi)
4566  s1i = zr*zi
4567  200 CONTINUE
4568  air = air + c1*s1r
4569  aii = aii + c1*s1i
4570  RETURN
4571  210 CONTINUE
4572  nz = 1
4573  air = zeror
4574  aii = zeroi
4575  RETURN
4576  270 CONTINUE
4577  nz = 0
4578  ierr=2
4579  RETURN
4580  280 CONTINUE
4581  IF(nn.EQ.(-1)) GO TO 270
4582  nz=0
4583  ierr=5
4584  RETURN
4585  260 CONTINUE
4586  ierr=4
4587  nz=0
4588  RETURN
4589 END
4590 
4591 SUBROUTINE zseri(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, ALIM)
4592 USE utilit
4593 USE complex
4594 !***BEGIN PROLOGUE ZSERI
4595 !***REFER TO ZBESI,ZBESK
4596 !
4597 ! ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
4598 ! MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE
4599 ! REGION CABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
4600 ! NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
4601 ! DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
4602 ! CONDITION CABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
4603 ! COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
4604 !
4605 !***ROUTINES CALLED DGAMLN,D1MACH,ZUCHK,ZABS,ZDIV,ZLOG,ZMLT
4606 !***END PROLOGUE ZSERI
4607 ! COMPLEX AK1,CK,COEF,CONE,CRSC,CSCL,CZ,CZERO,HZ,RZ,S1,S2,Y,Z
4608  DOUBLE PRECISION aa, acz, ak, ak1i, ak1r, alim, arm, ascle, atol, &
4609  az, cki, ckr, coefi, coefr, conei, coner, crscr, czi, czr, dfnu, &
4610  elim, fnu, fnup, hzi, hzr, raz, rs, rtr1, rzi, rzr, s, ss, sti, &
4611  str, s1i, s1r, s2i, s2r, tol, yi, yr, wi, wr, zeroi, zeror, zi, &
4612  zr!, DGAMLN
4613  INTEGER i, ib, idum, iflag, il, k, kode, l, m, n, nn, nz, nw
4614  dimension yr(1), yi(1), wr(2), wi(2)
4615  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
4616 
4617  nz = 0
4618  az = zabs(zr,zi)
4619  IF (az.EQ.0.0d0) GO TO 160
4620  arm = 1.0d+3*d1mach(1)
4621  rtr1 = dsqrt(arm)
4622  crscr = 1.0d0
4623  iflag = 0
4624  IF (az.LT.arm) GO TO 150
4625  hzr = 0.5d0*zr
4626  hzi = 0.5d0*zi
4627  czr = zeror
4628  czi = zeroi
4629  IF (az.LE.rtr1) GO TO 10
4630  CALL zmlt(hzr, hzi, hzr, hzi, czr, czi)
4631  10 CONTINUE
4632  acz = zabs(czr,czi)
4633  nn = n
4634  CALL zlog(hzr, hzi, ckr, cki, idum)
4635  20 CONTINUE
4636  dfnu = fnu + dble(float(nn-1))
4637  fnup = dfnu + 1.0d0
4638 !-----------------------------------------------------------------------
4639 ! UNDERFLOW TEST
4640 !-----------------------------------------------------------------------
4641  ak1r = ckr*dfnu
4642  ak1i = cki*dfnu
4643  ak = dgamln(fnup,idum)
4644  ak1r = ak1r - ak
4645  IF (kode.EQ.2) ak1r = ak1r - zr
4646  IF (ak1r.GT.(-elim)) GO TO 40
4647  30 CONTINUE
4648  nz = nz + 1
4649  yr(nn) = zeror
4650  yi(nn) = zeroi
4651  IF (acz.GT.dfnu) GO TO 190
4652  nn = nn - 1
4653  IF (nn.EQ.0) RETURN
4654  GO TO 20
4655  40 CONTINUE
4656  IF (ak1r.GT.(-alim)) GO TO 50
4657  iflag = 1
4658  ss = 1.0d0/tol
4659  crscr = tol
4660  ascle = arm*ss
4661  50 CONTINUE
4662  aa = dexp(ak1r)
4663  IF (iflag.EQ.1) aa = aa*ss
4664  coefr = aa*dcos(ak1i)
4665  coefi = aa*dsin(ak1i)
4666  atol = tol*acz/fnup
4667  il = min0(2,nn)
4668  DO 90 i=1,il
4669  dfnu = fnu + dble(float(nn-i))
4670  fnup = dfnu + 1.0d0
4671  s1r = coner
4672  s1i = conei
4673  IF (acz.LT.tol*fnup) GO TO 70
4674  ak1r = coner
4675  ak1i = conei
4676  ak = fnup + 2.0d0
4677  s = fnup
4678  aa = 2.0d0
4679  60 CONTINUE
4680  rs = 1.0d0/s
4681  str = ak1r*czr - ak1i*czi
4682  sti = ak1r*czi + ak1i*czr
4683  ak1r = str*rs
4684  ak1i = sti*rs
4685  s1r = s1r + ak1r
4686  s1i = s1i + ak1i
4687  s = s + ak
4688  ak = ak + 2.0d0
4689  aa = aa*acz*rs
4690  IF (aa.GT.atol) GO TO 60
4691  70 CONTINUE
4692  s2r = s1r*coefr - s1i*coefi
4693  s2i = s1r*coefi + s1i*coefr
4694  wr(i) = s2r
4695  wi(i) = s2i
4696  IF (iflag.EQ.0) GO TO 80
4697  CALL zuchk(s2r, s2i, nw, ascle, tol)
4698  IF (nw.NE.0) GO TO 30
4699  80 CONTINUE
4700  m = nn - i + 1
4701  yr(m) = s2r*crscr
4702  yi(m) = s2i*crscr
4703  IF (i.EQ.il) GO TO 90
4704  CALL zdiv(coefr, coefi, hzr, hzi, str, sti)
4705  coefr = str*dfnu
4706  coefi = sti*dfnu
4707  90 CONTINUE
4708  IF (nn.LE.2) RETURN
4709  k = nn - 2
4710  ak = dble(float(k))
4711  raz = 1.0d0/az
4712  str = zr*raz
4713  sti = -zi*raz
4714  rzr = (str+str)*raz
4715  rzi = (sti+sti)*raz
4716  IF (iflag.EQ.1) GO TO 120
4717  ib = 3
4718  100 CONTINUE
4719  DO 110 i=ib,nn
4720  yr(k) = (ak+fnu)*(rzr*yr(k+1)-rzi*yi(k+1)) + yr(k+2)
4721  yi(k) = (ak+fnu)*(rzr*yi(k+1)+rzi*yr(k+1)) + yi(k+2)
4722  ak = ak - 1.0d0
4723  k = k - 1
4724  110 CONTINUE
4725  RETURN
4726 !-----------------------------------------------------------------------
4727 ! RECUR BACKWARD WITH SCALED VALUES
4728 !-----------------------------------------------------------------------
4729  120 CONTINUE
4730 !-----------------------------------------------------------------------
4731 ! EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
4732 ! UNDERFLOW LIMIT = ASCLE = D1MACH(1)*SS*1.0D+3
4733 !-----------------------------------------------------------------------
4734  s1r = wr(1)
4735  s1i = wi(1)
4736  s2r = wr(2)
4737  s2i = wi(2)
4738  DO 130 l=3,nn
4739  ckr = s2r
4740  cki = s2i
4741  s2r = s1r + (ak+fnu)*(rzr*ckr-rzi*cki)
4742  s2i = s1i + (ak+fnu)*(rzr*cki+rzi*ckr)
4743  s1r = ckr
4744  s1i = cki
4745  ckr = s2r*crscr
4746  cki = s2i*crscr
4747  yr(k) = ckr
4748  yi(k) = cki
4749  ak = ak - 1.0d0
4750  k = k - 1
4751  IF (zabs(ckr,cki).GT.ascle) GO TO 140
4752  130 CONTINUE
4753  RETURN
4754  140 CONTINUE
4755  ib = l + 1
4756  IF (ib.GT.nn) RETURN
4757  GO TO 100
4758  150 CONTINUE
4759  nz = n
4760  IF (fnu.EQ.0.0d0) nz = nz - 1
4761  160 CONTINUE
4762  yr(1) = zeror
4763  yi(1) = zeroi
4764  IF (fnu.NE.0.0d0) GO TO 170
4765  yr(1) = coner
4766  yi(1) = conei
4767  170 CONTINUE
4768  IF (n.EQ.1) RETURN
4769  DO 180 i=2,n
4770  yr(i) = zeror
4771  yi(i) = zeroi
4772  180 CONTINUE
4773  RETURN
4774 !-----------------------------------------------------------------------
4775 ! RETURN WITH NZ.LT.0 IF CABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
4776 ! THE CALCULATION IN CBINU WITH N=N-IABS(NZ)
4777 !-----------------------------------------------------------------------
4778  190 CONTINUE
4779  nz = -nz
4780  RETURN
4781  END
4782 
4783 SUBROUTINE zasyi(ZR, ZI, FNU, KODE, N, YR, YI, NZ, RL, TOL, ELIM, ALIM)
4784 USE utilit
4785 USE complex
4786 !***BEGIN PROLOGUE ZASYI
4787 !***REFER TO ZBESI,ZBESK
4788 
4789 ! ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
4790 ! MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
4791 ! REGION CABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
4792 ! NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
4793 !
4794 !***ROUTINES CALLED D1MACH,ZABS,ZDIV,ZEXP,ZMLT,ZSQRT
4795 !***END PROLOGUE ZASYI
4796 ! COMPLEX AK1,CK,CONE,CS1,CS2,CZ,CZERO,DK,EZ,P1,RZ,S2,Y,Z
4797  DOUBLE PRECISION aa, aez, ak, ak1i, ak1r, alim, arg, arm, atol, &
4798  az, bb, bk, cki, ckr, conei, coner, cs1i, cs1r, cs2i, cs2r, czi, &
4799  czr, dfnu, dki, dkr, dnu2, elim, ezi, ezr, fdn, fnu, pi, p1i, &
4800  p1r, raz, rl, rtpi, rtr1, rzi, rzr, s, sgn, sqk, sti, str, s2i, &
4801  s2r, tol, tzi, tzr, yi, yr, zeroi, zeror, zi, zr
4802  INTEGER i, ib, il, inu, j, jl, k, kode, koded, m, n, nn, nz
4803  dimension yr(1), yi(1)
4804  DATA pi, rtpi /3.14159265358979324d0 , 0.159154943091895336d0 /
4805  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
4806 
4807  nz = 0
4808  az = zabs(zr,zi)
4809  arm = 1.0d+3*d1mach(1)
4810  rtr1 = dsqrt(arm)
4811  il = min0(2,n)
4812  dfnu = fnu + dble(float(n-il))
4813 !-----------------------------------------------------------------------
4814 ! OVERFLOW TEST
4815 !-----------------------------------------------------------------------
4816  raz = 1.0d0/az
4817  str = zr*raz
4818  sti = -zi*raz
4819  ak1r = rtpi*str*raz
4820  ak1i = rtpi*sti*raz
4821  CALL zsqrt(ak1r, ak1i, ak1r, ak1i)
4822  czr = zr
4823  czi = zi
4824  IF (kode.NE.2) GO TO 10
4825  czr = zeror
4826  czi = zi
4827  10 CONTINUE
4828  IF (dabs(czr).GT.elim) GO TO 100
4829  dnu2 = dfnu + dfnu
4830  koded = 1
4831  IF ((dabs(czr).GT.alim) .AND. (n.GT.2)) GO TO 20
4832  koded = 0
4833  CALL zexp(czr, czi, str, sti)
4834  CALL zmlt(ak1r, ak1i, str, sti, ak1r, ak1i)
4835  20 CONTINUE
4836  fdn = 0.0d0
4837  IF (dnu2.GT.rtr1) fdn = dnu2*dnu2
4838  ezr = zr*8.0d0
4839  ezi = zi*8.0d0
4840 !-----------------------------------------------------------------------
4841 ! WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
4842 ! FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
4843 ! EXPANSION FOR THE IMAGINARY PART.
4844 !-----------------------------------------------------------------------
4845  aez = 8.0d0*az
4846  s = tol/aez
4847  jl = int(sngl(rl+rl)) + 2
4848  p1r = zeror
4849  p1i = zeroi
4850  IF (zi.EQ.0.0d0) GO TO 30
4851 !-----------------------------------------------------------------------
4852 ! CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
4853 ! SIGNIFICANCE WHEN FNU OR N IS LARGE
4854 !-----------------------------------------------------------------------
4855  inu = int(sngl(fnu))
4856  arg = (fnu-dble(float(inu)))*pi
4857  inu = inu + n - il
4858  ak = -dsin(arg)
4859  bk = dcos(arg)
4860  IF (zi.LT.0.0d0) bk = -bk
4861  p1r = ak
4862  p1i = bk
4863  IF (mod(inu,2).EQ.0) GO TO 30
4864  p1r = -p1r
4865  p1i = -p1i
4866  30 CONTINUE
4867  DO 70 k=1,il
4868  sqk = fdn - 1.0d0
4869  atol = s*dabs(sqk)
4870  sgn = 1.0d0
4871  cs1r = coner
4872  cs1i = conei
4873  cs2r = coner
4874  cs2i = conei
4875  ckr = coner
4876  cki = conei
4877  ak = 0.0d0
4878  aa = 1.0d0
4879  bb = aez
4880  dkr = ezr
4881  dki = ezi
4882  DO 40 j=1,jl
4883  CALL zdiv(ckr, cki, dkr, dki, str, sti)
4884  ckr = str*sqk
4885  cki = sti*sqk
4886  cs2r = cs2r + ckr
4887  cs2i = cs2i + cki
4888  sgn = -sgn
4889  cs1r = cs1r + ckr*sgn
4890  cs1i = cs1i + cki*sgn
4891  dkr = dkr + ezr
4892  dki = dki + ezi
4893  aa = aa*dabs(sqk)/bb
4894  bb = bb + aez
4895  ak = ak + 8.0d0
4896  sqk = sqk - ak
4897  IF (aa.LE.atol) GO TO 50
4898  40 CONTINUE
4899  GO TO 110
4900  50 CONTINUE
4901  s2r = cs1r
4902  s2i = cs1i
4903  IF (zr+zr.GE.elim) GO TO 60
4904  tzr = zr + zr
4905  tzi = zi + zi
4906  CALL zexp(-tzr, -tzi, str, sti)
4907  CALL zmlt(str, sti, p1r, p1i, str, sti)
4908  CALL zmlt(str, sti, cs2r, cs2i, str, sti)
4909  s2r = s2r + str
4910  s2i = s2i + sti
4911  60 CONTINUE
4912  fdn = fdn + 8.0d0*dfnu + 4.0d0
4913  p1r = -p1r
4914  p1i = -p1i
4915  m = n - il + k
4916  yr(m) = s2r*ak1r - s2i*ak1i
4917  yi(m) = s2r*ak1i + s2i*ak1r
4918  70 CONTINUE
4919  IF (n.LE.2) RETURN
4920  nn = n
4921  k = nn - 2
4922  ak = dble(float(k))
4923  str = zr*raz
4924  sti = -zi*raz
4925  rzr = (str+str)*raz
4926  rzi = (sti+sti)*raz
4927  ib = 3
4928  DO 80 i=ib,nn
4929  yr(k) = (ak+fnu)*(rzr*yr(k+1)-rzi*yi(k+1)) + yr(k+2)
4930  yi(k) = (ak+fnu)*(rzr*yi(k+1)+rzi*yr(k+1)) + yi(k+2)
4931  ak = ak - 1.0d0
4932  k = k - 1
4933  80 CONTINUE
4934  IF (koded.EQ.0) RETURN
4935  CALL zexp(czr, czi, ckr, cki)
4936  DO 90 i=1,nn
4937  str = yr(i)*ckr - yi(i)*cki
4938  yi(i) = yr(i)*cki + yi(i)*ckr
4939  yr(i) = str
4940  90 CONTINUE
4941  RETURN
4942  100 CONTINUE
4943  nz = -1
4944  RETURN
4945  110 CONTINUE
4946  nz=-2
4947  RETURN
4948  END
4949 
4950 SUBROUTINE zbuni(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NUI, NLAST, FNUL, TOL, ELIM, ALIM)
4951 USE utilit
4952 USE complex
4953 !***BEGIN PROLOGUE ZBUNI
4954 !***REFER TO ZBESI,ZBESK
4955 !
4956 ! ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.
4957 ! FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
4958 ! FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
4959 ! ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
4960 ! ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
4961 !
4962 !***ROUTINES CALLED ZUNI1,ZUNI2,ZABS,D1MACH
4963 !***END PROLOGUE ZBUNI
4964 ! COMPLEX CSCL,CSCR,CY,RZ,ST,S1,S2,Y,Z
4965  DOUBLE PRECISION alim, ax, ay, csclr, cscrr, cyi, cyr, dfnu, &
4966  elim, fnu, fnui, fnul, gnu, raz, rzi, rzr, sti, str, s1i, s1r, &
4967  s2i, s2r, tol, yi, yr, zi, zr, ascle, bry, c1r, c1i, c1m
4968  INTEGER i, iflag, iform, k, kode, n, nl, nlast, nui, nw, nz
4969  dimension yr(1), yi(1), cyr(2), cyi(2), bry(3)
4970  nz = 0
4971  ax = dabs(zr)*1.7321d0
4972  ay = dabs(zi)
4973  iform = 1
4974  IF (ay.GT.ax) iform = 2
4975  IF (nui.EQ.0) GO TO 60
4976  fnui = dble(float(nui))
4977  dfnu = fnu + dble(float(n-1))
4978  gnu = dfnu + fnui
4979  IF (iform.EQ.2) GO TO 10
4980 !-----------------------------------------------------------------------
4981 ! ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
4982 ! -PI/3.LE.ARG(Z).LE.PI/3
4983 !-----------------------------------------------------------------------
4984  CALL zuni1(zr, zi, gnu, kode, 2, cyr, cyi, nw, nlast, fnul, tol, elim, alim)
4985  GO TO 20
4986  10 CONTINUE
4987 !-----------------------------------------------------------------------
4988 ! ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
4989 ! APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
4990 ! AND HPI=PI/2
4991 !-----------------------------------------------------------------------
4992  CALL zuni2(zr, zi, gnu, kode, 2, cyr, cyi, nw, nlast, fnul, tol, elim, alim)
4993  20 CONTINUE
4994  IF (nw.LT.0) GO TO 50
4995  IF (nw.NE.0) GO TO 90
4996  str = zabs(cyr(1),cyi(1))
4997 !----------------------------------------------------------------------
4998 ! SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
4999 !----------------------------------------------------------------------
5000  bry(1)=1.0d+3*d1mach(1)/tol
5001  bry(2) = 1.0d0/bry(1)
5002  bry(3) = bry(2)
5003  iflag = 2
5004  ascle = bry(2)
5005  csclr = 1.0d0
5006  IF (str.GT.bry(1)) GO TO 21
5007  iflag = 1
5008  ascle = bry(1)
5009  csclr = 1.0d0/tol
5010  GO TO 25
5011  21 CONTINUE
5012  IF (str.LT.bry(2)) GO TO 25
5013  iflag = 3
5014  ascle=bry(3)
5015  csclr = tol
5016  25 CONTINUE
5017  cscrr = 1.0d0/csclr
5018  s1r = cyr(2)*csclr
5019  s1i = cyi(2)*csclr
5020  s2r = cyr(1)*csclr
5021  s2i = cyi(1)*csclr
5022  raz = 1.0d0/zabs(zr,zi)
5023  str = zr*raz
5024  sti = -zi*raz
5025  rzr = (str+str)*raz
5026  rzi = (sti+sti)*raz
5027  DO 30 i=1,nui
5028  str = s2r
5029  sti = s2i
5030  s2r = (dfnu+fnui)*(rzr*str-rzi*sti) + s1r
5031  s2i = (dfnu+fnui)*(rzr*sti+rzi*str) + s1i
5032  s1r = str
5033  s1i = sti
5034  fnui = fnui - 1.0d0
5035  IF (iflag.GE.3) GO TO 30
5036  str = s2r*cscrr
5037  sti = s2i*cscrr
5038  c1r = dabs(str)
5039  c1i = dabs(sti)
5040  c1m = dmax1(c1r,c1i)
5041  IF (c1m.LE.ascle) GO TO 30
5042  iflag = iflag+1
5043  ascle = bry(iflag)
5044  s1r = s1r*cscrr
5045  s1i = s1i*cscrr
5046  s2r = str
5047  s2i = sti
5048  csclr = csclr*tol
5049  cscrr = 1.0d0/csclr
5050  s1r = s1r*csclr
5051  s1i = s1i*csclr
5052  s2r = s2r*csclr
5053  s2i = s2i*csclr
5054  30 CONTINUE
5055  yr(n) = s2r*cscrr
5056  yi(n) = s2i*cscrr
5057  IF (n.EQ.1) RETURN
5058  nl = n - 1
5059  fnui = dble(float(nl))
5060  k = nl
5061  DO 40 i=1,nl
5062  str = s2r
5063  sti = s2i
5064  s2r = (fnu+fnui)*(rzr*str-rzi*sti) + s1r
5065  s2i = (fnu+fnui)*(rzr*sti+rzi*str) + s1i
5066  s1r = str
5067  s1i = sti
5068  str = s2r*cscrr
5069  sti = s2i*cscrr
5070  yr(k) = str
5071  yi(k) = sti
5072  fnui = fnui - 1.0d0
5073  k = k - 1
5074  IF (iflag.GE.3) GO TO 40
5075  c1r = dabs(str)
5076  c1i = dabs(sti)
5077  c1m = dmax1(c1r,c1i)
5078  IF (c1m.LE.ascle) GO TO 40
5079  iflag = iflag+1
5080  ascle = bry(iflag)
5081  s1r = s1r*cscrr
5082  s1i = s1i*cscrr
5083  s2r = str
5084  s2i = sti
5085  csclr = csclr*tol
5086  cscrr = 1.0d0/csclr
5087  s1r = s1r*csclr
5088  s1i = s1i*csclr
5089  s2r = s2r*csclr
5090  s2i = s2i*csclr
5091  40 CONTINUE
5092  RETURN
5093  50 CONTINUE
5094  nz = -1
5095  IF(nw.EQ.(-2)) nz=-2
5096  RETURN
5097  60 CONTINUE
5098  IF (iform.EQ.2) GO TO 70
5099 !-----------------------------------------------------------------------
5100 ! ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
5101 ! -PI/3.LE.ARG(Z).LE.PI/3
5102 !-----------------------------------------------------------------------
5103  CALL zuni1(zr, zi, fnu, kode, n, yr, yi, nw, nlast, fnul, tol, elim, alim)
5104  GO TO 80
5105  70 CONTINUE
5106 !-----------------------------------------------------------------------
5107 ! ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
5108 ! APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
5109 ! AND HPI=PI/2
5110 !-----------------------------------------------------------------------
5111  CALL zuni2(zr, zi, fnu, kode, n, yr, yi, nw, nlast, fnul, tol, elim, alim)
5112  80 CONTINUE
5113  IF (nw.LT.0) GO TO 50
5114  nz = nw
5115  RETURN
5116  90 CONTINUE
5117  nlast = n
5118  RETURN
5119  END
5120 
5121 SUBROUTINE zuni1(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, TOL, ELIM, ALIM)
5122 USE utilit
5123 USE complex
5124 !***BEGIN PROLOGUE ZUNI1
5125 !***REFER TO ZBESI,ZBESK
5126 !
5127 ! ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC
5128 ! EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
5129 !
5130 ! FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
5131 ! EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
5132 ! NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
5133 ! FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
5134 ! Y(I)=CZERO FOR I=NLAST+1,N
5135 !
5136 !***ROUTINES CALLED ZUCHK,ZUNIK,ZUOIK,D1MACH,ZABS
5137 !***END PROLOGUE ZUNI1
5138 ! COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1,
5139 ! *S2,Y,Z,ZETA1,ZETA2
5140  DOUBLE PRECISION alim, aphi, ascle, bry, conei, coner, crsc, &
5141  cscl, csrr, cssr, cwrki, cwrkr, c1r, c2i, c2m, c2r, elim, fn, &
5142  fnu, fnul, phii, phir, rast, rs1, rzi, rzr, sti, str, sumi, &
5143  sumr, s1i, s1r, s2i, s2r, tol, yi, yr, zeroi, zeror, zeta1i, &
5144  zeta1r, zeta2i, zeta2r, zi, zr, cyr, cyi
5145  INTEGER i, iflag, init, k, kode, m, n, nd, nlast, nn, nuf, nw, nz
5146  dimension bry(3), yr(1), yi(1), cwrkr(16), cwrki(16), cssr(3), &
5147  csrr(3), cyr(2), cyi(2)
5148  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
5149 
5150  nz = 0
5151  nd = n
5152  nlast = 0
5153 !-----------------------------------------------------------------------
5154 ! COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
5155 ! NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
5156 ! EXP(ALIM)=EXP(ELIM)*TOL
5157 !-----------------------------------------------------------------------
5158  cscl = 1.0d0/tol
5159  crsc = tol
5160  cssr(1) = cscl
5161  cssr(2) = coner
5162  cssr(3) = crsc
5163  csrr(1) = crsc
5164  csrr(2) = coner
5165  csrr(3) = cscl
5166  bry(1) = 1.0d+3*d1mach(1)/tol
5167 !-----------------------------------------------------------------------
5168 ! CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
5169 !-----------------------------------------------------------------------
5170  fn = dmax1(fnu,1.0d0)
5171  init = 0
5172  CALL zunik(zr, zi, fn, 1, 1, tol, init, phir, phii, zeta1r, &
5173  zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
5174  IF (kode.EQ.1) GO TO 10
5175  str = zr + zeta2r
5176  sti = zi + zeta2i
5177  rast = fn/zabs(str,sti)
5178  str = str*rast*rast
5179  sti = -sti*rast*rast
5180  s1r = -zeta1r + str
5181  s1i = -zeta1i + sti
5182  GO TO 20
5183  10 CONTINUE
5184  s1r = -zeta1r + zeta2r
5185  s1i = -zeta1i + zeta2i
5186  20 CONTINUE
5187  rs1 = s1r
5188  IF (dabs(rs1).GT.elim) GO TO 130
5189  30 CONTINUE
5190  nn = min0(2,nd)
5191  DO 80 i=1,nn
5192  fn = fnu + dble(float(nd-i))
5193  init = 0
5194  CALL zunik(zr, zi, fn, 1, 0, tol, init, phir, phii, zeta1r, &
5195  zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
5196  IF (kode.EQ.1) GO TO 40
5197  str = zr + zeta2r
5198  sti = zi + zeta2i
5199  rast = fn/zabs(str,sti)
5200  str = str*rast*rast
5201  sti = -sti*rast*rast
5202  s1r = -zeta1r + str
5203  s1i = -zeta1i + sti + zi
5204  GO TO 50
5205  40 CONTINUE
5206  s1r = -zeta1r + zeta2r
5207  s1i = -zeta1i + zeta2i
5208  50 CONTINUE
5209 !-----------------------------------------------------------------------
5210 ! TEST FOR UNDERFLOW AND OVERFLOW
5211 !-----------------------------------------------------------------------
5212  rs1 = s1r
5213  IF (dabs(rs1).GT.elim) GO TO 110
5214  IF (i.EQ.1) iflag = 2
5215  IF (dabs(rs1).LT.alim) GO TO 60
5216 !-----------------------------------------------------------------------
5217 ! REFINE TEST AND SCALE
5218 !-----------------------------------------------------------------------
5219  aphi = zabs(phir,phii)
5220  rs1 = rs1 + dlog(aphi)
5221  IF (dabs(rs1).GT.elim) GO TO 110
5222  IF (i.EQ.1) iflag = 1
5223  IF (rs1.LT.0.0d0) GO TO 60
5224  IF (i.EQ.1) iflag = 3
5225  60 CONTINUE
5226 !-----------------------------------------------------------------------
5227 ! SCALE S1 IF CABS(S1).LT.ASCLE
5228 !-----------------------------------------------------------------------
5229  s2r = phir*sumr - phii*sumi
5230  s2i = phir*sumi + phii*sumr
5231  str = dexp(s1r)*cssr(iflag)
5232  s1r = str*dcos(s1i)
5233  s1i = str*dsin(s1i)
5234  str = s2r*s1r - s2i*s1i
5235  s2i = s2r*s1i + s2i*s1r
5236  s2r = str
5237  IF (iflag.NE.1) GO TO 70
5238  CALL zuchk(s2r, s2i, nw, bry(1), tol)
5239  IF (nw.NE.0) GO TO 110
5240  70 CONTINUE
5241  cyr(i) = s2r
5242  cyi(i) = s2i
5243  m = nd - i + 1
5244  yr(m) = s2r*csrr(iflag)
5245  yi(m) = s2i*csrr(iflag)
5246  80 CONTINUE
5247  IF (nd.LE.2) GO TO 100
5248  rast = 1.0d0/zabs(zr,zi)
5249  str = zr*rast
5250  sti = -zi*rast
5251  rzr = (str+str)*rast
5252  rzi = (sti+sti)*rast
5253  bry(2) = 1.0d0/bry(1)
5254  bry(3) = d1mach(2)
5255  s1r = cyr(1)
5256  s1i = cyi(1)
5257  s2r = cyr(2)
5258  s2i = cyi(2)
5259  c1r = csrr(iflag)
5260  ascle = bry(iflag)
5261  k = nd - 2
5262  fn = dble(float(k))
5263  DO 90 i=3,nd
5264  c2r = s2r
5265  c2i = s2i
5266  s2r = s1r + (fnu+fn)*(rzr*c2r-rzi*c2i)
5267  s2i = s1i + (fnu+fn)*(rzr*c2i+rzi*c2r)
5268  s1r = c2r
5269  s1i = c2i
5270  c2r = s2r*c1r
5271  c2i = s2i*c1r
5272  yr(k) = c2r
5273  yi(k) = c2i
5274  k = k - 1
5275  fn = fn - 1.0d0
5276  IF (iflag.GE.3) GO TO 90
5277  str = dabs(c2r)
5278  sti = dabs(c2i)
5279  c2m = dmax1(str,sti)
5280  IF (c2m.LE.ascle) GO TO 90
5281  iflag = iflag + 1
5282  ascle = bry(iflag)
5283  s1r = s1r*c1r
5284  s1i = s1i*c1r
5285  s2r = c2r
5286  s2i = c2i
5287  s1r = s1r*cssr(iflag)
5288  s1i = s1i*cssr(iflag)
5289  s2r = s2r*cssr(iflag)
5290  s2i = s2i*cssr(iflag)
5291  c1r = csrr(iflag)
5292  90 CONTINUE
5293  100 CONTINUE
5294  RETURN
5295 !-----------------------------------------------------------------------
5296 ! SET UNDERFLOW AND UPDATE PARAMETERS
5297 !-----------------------------------------------------------------------
5298  110 CONTINUE
5299  IF (rs1.GT.0.0d0) GO TO 120
5300  yr(nd) = zeror
5301  yi(nd) = zeroi
5302  nz = nz + 1
5303  nd = nd - 1
5304  IF (nd.EQ.0) GO TO 100
5305  CALL zuoik(zr, zi, fnu, kode, 1, nd, yr, yi, nuf, tol, elim, alim)
5306  IF (nuf.LT.0) GO TO 120
5307  nd = nd - nuf
5308  nz = nz + nuf
5309  IF (nd.EQ.0) GO TO 100
5310  fn = fnu + dble(float(nd-1))
5311  IF (fn.GE.fnul) GO TO 30
5312  nlast = nd
5313  RETURN
5314  120 CONTINUE
5315  nz = -1
5316  RETURN
5317  130 CONTINUE
5318  IF (rs1.GT.0.0d0) GO TO 120
5319  nz = n
5320  DO 140 i=1,n
5321  yr(i) = zeror
5322  yi(i) = zeroi
5323  140 CONTINUE
5324  RETURN
5325  END
5326 
5327 SUBROUTINE zuni2(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, TOL, ELIM, ALIM)
5328 USE utilit
5329 USE complex
5330 !***BEGIN PROLOGUE ZUNI2
5331 !***REFER TO ZBESI,ZBESK
5332 !
5333 ! ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
5334 ! UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
5335 ! OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
5336 !
5337 ! FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
5338 ! EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
5339 ! NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
5340 ! FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
5341 ! Y(I)=CZERO FOR I=NLAST+1,N
5342 !
5343 !***ROUTINES CALLED ZAIRY,ZUCHK,ZUNHJ,ZUOIK,D1MACH,ZABS
5344 !***END PROLOGUE ZUNI2
5345 ! COMPLEX AI,ARG,ASUM,BSUM,CFN,CI,CID,CIP,CONE,CRSC,CSCL,CSR,CSS,
5346 ! *CZERO,C1,C2,DAI,PHI,RZ,S1,S2,Y,Z,ZB,ZETA1,ZETA2,ZN
5347  DOUBLE PRECISION aarg, aic, aii, air, alim, ang, aphi, argi, &
5348  argr, ascle, asumi, asumr, bry, bsumi, bsumr, cidi, cipi, cipr, &
5349  conei, coner, crsc, cscl, csrr, cssr, c1r, c2i, c2m, c2r, daii, &
5350  dair, elim, fn, fnu, fnul, hpi, phii, phir, rast, raz, rs1, rzi, &
5351  rzr, sti, str, s1i, s1r, s2i, s2r, tol, yi, yr, zbi, zbr, zeroi, &
5352  zeror, zeta1i, zeta1r, zeta2i, zeta2r, zi, zni, znr, zr, cyr, cyi
5353  INTEGER i, iflag, in, inu, j, k, kode, n, nai, nd, ndai, nlast, &
5354  nn, nuf, nw, nz, idum
5355  dimension bry(3), yr(1), yi(1), cipr(4), cipi(4), cssr(3), &
5356  csrr(3), cyr(2), cyi(2)
5357  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
5358  DATA cipr(1),cipi(1),cipr(2),cipi(2),cipr(3),cipi(3),cipr(4), &
5359  cipi(4)/ 1.0d0,0.0d0, 0.0d0,1.0d0, -1.0d0,0.0d0, 0.0d0,-1.0d0/
5360  DATA hpi, aic /1.57079632679489662d+00, 1.265512123484645396d+00/
5361 
5362  nz = 0
5363  nd = n
5364  nlast = 0
5365 !-----------------------------------------------------------------------
5366 ! COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
5367 ! NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
5368 ! EXP(ALIM)=EXP(ELIM)*TOL
5369 !-----------------------------------------------------------------------
5370  cscl = 1.0d0/tol
5371  crsc = tol
5372  cssr(1) = cscl
5373  cssr(2) = coner
5374  cssr(3) = crsc
5375  csrr(1) = crsc
5376  csrr(2) = coner
5377  csrr(3) = cscl
5378  bry(1) = 1.0d+3*d1mach(1)/tol
5379 !-----------------------------------------------------------------------
5380 ! ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
5381 !-----------------------------------------------------------------------
5382  znr = zi
5383  zni = -zr
5384  zbr = zr
5385  zbi = zi
5386  cidi = -coner
5387  inu = int(sngl(fnu))
5388  ang = hpi*(fnu-dble(float(inu)))
5389  c2r = dcos(ang)
5390  c2i = dsin(ang)
5391  in = inu + n - 1
5392  in = mod(in,4) + 1
5393  str = c2r*cipr(in) - c2i*cipi(in)
5394  c2i = c2r*cipi(in) + c2i*cipr(in)
5395  c2r = str
5396  IF (zi.GT.0.0d0) GO TO 10
5397  znr = -znr
5398  zbi = -zbi
5399  cidi = -cidi
5400  c2i = -c2i
5401  10 CONTINUE
5402 !-----------------------------------------------------------------------
5403 ! CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
5404 !-----------------------------------------------------------------------
5405  fn = dmax1(fnu,1.0d0)
5406  CALL zunhj(znr, zni, fn, 1, tol, phir, phii, argr, argi, zeta1r, &
5407  zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
5408  IF (kode.EQ.1) GO TO 20
5409  str = zbr + zeta2r
5410  sti = zbi + zeta2i
5411  rast = fn/zabs(str,sti)
5412  str = str*rast*rast
5413  sti = -sti*rast*rast
5414  s1r = -zeta1r + str
5415  s1i = -zeta1i + sti
5416  GO TO 30
5417  20 CONTINUE
5418  s1r = -zeta1r + zeta2r
5419  s1i = -zeta1i + zeta2i
5420  30 CONTINUE
5421  rs1 = s1r
5422  IF (dabs(rs1).GT.elim) GO TO 150
5423  40 CONTINUE
5424  nn = min0(2,nd)
5425  DO 90 i=1,nn
5426  fn = fnu + dble(float(nd-i))
5427  CALL zunhj(znr, zni, fn, 0, tol, phir, phii, argr, argi, &
5428  zeta1r, zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
5429  IF (kode.EQ.1) GO TO 50
5430  str = zbr + zeta2r
5431  sti = zbi + zeta2i
5432  rast = fn/zabs(str,sti)
5433  str = str*rast*rast
5434  sti = -sti*rast*rast
5435  s1r = -zeta1r + str
5436  s1i = -zeta1i + sti + dabs(zi)
5437  GO TO 60
5438  50 CONTINUE
5439  s1r = -zeta1r + zeta2r
5440  s1i = -zeta1i + zeta2i
5441  60 CONTINUE
5442 !-----------------------------------------------------------------------
5443 ! TEST FOR UNDERFLOW AND OVERFLOW
5444 !-----------------------------------------------------------------------
5445  rs1 = s1r
5446  IF (dabs(rs1).GT.elim) GO TO 120
5447  IF (i.EQ.1) iflag = 2
5448  IF (dabs(rs1).LT.alim) GO TO 70
5449 !-----------------------------------------------------------------------
5450 ! REFINE TEST AND SCALE
5451 !-----------------------------------------------------------------------
5452  aphi = zabs(phir,phii)
5453  aarg = zabs(argr,argi)
5454  rs1 = rs1 + dlog(aphi) - 0.25d0*dlog(aarg) - aic
5455  IF (dabs(rs1).GT.elim) GO TO 120
5456  IF (i.EQ.1) iflag = 1
5457  IF (rs1.LT.0.0d0) GO TO 70
5458  IF (i.EQ.1) iflag = 3
5459  70 CONTINUE
5460 !-----------------------------------------------------------------------
5461 ! SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
5462 ! EXPONENT EXTREMES
5463 !-----------------------------------------------------------------------
5464  CALL zairy(argr, argi, 0, 2, air, aii, nai, idum)
5465  CALL zairy(argr, argi, 1, 2, dair, daii, ndai, idum)
5466  str = dair*bsumr - daii*bsumi
5467  sti = dair*bsumi + daii*bsumr
5468  str = str + (air*asumr-aii*asumi)
5469  sti = sti + (air*asumi+aii*asumr)
5470  s2r = phir*str - phii*sti
5471  s2i = phir*sti + phii*str
5472  str = dexp(s1r)*cssr(iflag)
5473  s1r = str*dcos(s1i)
5474  s1i = str*dsin(s1i)
5475  str = s2r*s1r - s2i*s1i
5476  s2i = s2r*s1i + s2i*s1r
5477  s2r = str
5478  IF (iflag.NE.1) GO TO 80
5479  CALL zuchk(s2r, s2i, nw, bry(1), tol)
5480  IF (nw.NE.0) GO TO 120
5481  80 CONTINUE
5482  IF (zi.LE.0.0d0) s2i = -s2i
5483  str = s2r*c2r - s2i*c2i
5484  s2i = s2r*c2i + s2i*c2r
5485  s2r = str
5486  cyr(i) = s2r
5487  cyi(i) = s2i
5488  j = nd - i + 1
5489  yr(j) = s2r*csrr(iflag)
5490  yi(j) = s2i*csrr(iflag)
5491  str = -c2i*cidi
5492  c2i = c2r*cidi
5493  c2r = str
5494  90 CONTINUE
5495  IF (nd.LE.2) GO TO 110
5496  raz = 1.0d0/zabs(zr,zi)
5497  str = zr*raz
5498  sti = -zi*raz
5499  rzr = (str+str)*raz
5500  rzi = (sti+sti)*raz
5501  bry(2) = 1.0d0/bry(1)
5502  bry(3) = d1mach(2)
5503  s1r = cyr(1)
5504  s1i = cyi(1)
5505  s2r = cyr(2)
5506  s2i = cyi(2)
5507  c1r = csrr(iflag)
5508  ascle = bry(iflag)
5509  k = nd - 2
5510  fn = dble(float(k))
5511  DO 100 i=3,nd
5512  c2r = s2r
5513  c2i = s2i
5514  s2r = s1r + (fnu+fn)*(rzr*c2r-rzi*c2i)
5515  s2i = s1i + (fnu+fn)*(rzr*c2i+rzi*c2r)
5516  s1r = c2r
5517  s1i = c2i
5518  c2r = s2r*c1r
5519  c2i = s2i*c1r
5520  yr(k) = c2r
5521  yi(k) = c2i
5522  k = k - 1
5523  fn = fn - 1.0d0
5524  IF (iflag.GE.3) GO TO 100
5525  str = dabs(c2r)
5526  sti = dabs(c2i)
5527  c2m = dmax1(str,sti)
5528  IF (c2m.LE.ascle) GO TO 100
5529  iflag = iflag + 1
5530  ascle = bry(iflag)
5531  s1r = s1r*c1r
5532  s1i = s1i*c1r
5533  s2r = c2r
5534  s2i = c2i
5535  s1r = s1r*cssr(iflag)
5536  s1i = s1i*cssr(iflag)
5537  s2r = s2r*cssr(iflag)
5538  s2i = s2i*cssr(iflag)
5539  c1r = csrr(iflag)
5540  100 CONTINUE
5541  110 CONTINUE
5542  RETURN
5543  120 CONTINUE
5544  IF (rs1.GT.0.0d0) GO TO 140
5545 !-----------------------------------------------------------------------
5546 ! SET UNDERFLOW AND UPDATE PARAMETERS
5547 !-----------------------------------------------------------------------
5548  yr(nd) = zeror
5549  yi(nd) = zeroi
5550  nz = nz + 1
5551  nd = nd - 1
5552  IF (nd.EQ.0) GO TO 110
5553  CALL zuoik(zr, zi, fnu, kode, 1, nd, yr, yi, nuf, tol, elim, alim)
5554  IF (nuf.LT.0) GO TO 140
5555  nd = nd - nuf
5556  nz = nz + nuf
5557  IF (nd.EQ.0) GO TO 110
5558  fn = fnu + dble(float(nd-1))
5559  IF (fn.LT.fnul) GO TO 130
5560  fn = cidi
5561  j = nuf + 1
5562  k = mod(j,4) + 1
5563  s1r = cipr(k)
5564  s1i = cipi(k)
5565  IF (fn.LT.0.0d0) s1i = -s1i
5566  str = c2r*s1r - c2i*s1i
5567  c2i = c2r*s1i + c2i*s1r
5568  c2r = str
5569  GO TO 40
5570  130 CONTINUE
5571  nlast = nd
5572  RETURN
5573  140 CONTINUE
5574  nz = -1
5575  RETURN
5576  150 CONTINUE
5577  IF (rs1.GT.0.0d0) GO TO 140
5578  nz = n
5579  DO 160 i=1,n
5580  yr(i) = zeror
5581  yi(i) = zeroi
5582  160 CONTINUE
5583  RETURN
5584  END
5585 
5586 SUBROUTINE zwrsk(ZRR, ZRI, FNU, KODE, N, YR, YI, NZ, CWR, CWI, TOL, ELIM, ALIM)
5587 USE utilit
5588 USE complex
5589 !***BEGIN PROLOGUE ZWRSK
5590 !***REFER TO ZBESI,ZBESK
5591 !
5592 ! ZWRSK COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY
5593 ! NORMALIZING THE I FUNCTION RATIOS FROM ZRATI BY THE WRONSKIAN
5594 !
5595 !***ROUTINES CALLED D1MACH,ZBKNU,ZRATI,ZABS
5596 !***END PROLOGUE ZWRSK
5597 ! COMPLEX CINU,CSCL,CT,CW,C1,C2,RCT,ST,Y,ZR
5598  DOUBLE PRECISION act, acw, alim, ascle, cinui, cinur, csclr, cti, &
5599  ctr, cwi, cwr, c1i, c1r, c2i, c2r, elim, fnu, pti, ptr, ract, &
5600  sti, str, tol, yi, yr, zri, zrr
5601  INTEGER i, kode, n, nw, nz
5602  dimension yr(1), yi(1), cwr(2), cwi(2)
5603 !-----------------------------------------------------------------------
5604 ! I(FNU+I-1,Z) BY BACKWARD RECURRENCE FOR RATIOS
5605 ! Y(I)=I(FNU+I,Z)/I(FNU+I-1,Z) FROM CRATI NORMALIZED BY THE
5606 ! WRONSKIAN WITH K(FNU,Z) AND K(FNU+1,Z) FROM CBKNU.
5607 !-----------------------------------------------------------------------
5608  nz = 0
5609  CALL zbknu(zrr, zri, fnu, kode, 2, cwr, cwi, nw, tol, elim, alim)
5610  IF (nw.NE.0) GO TO 50
5611  CALL zrati(zrr, zri, fnu, n, yr, yi, tol)
5612 !-----------------------------------------------------------------------
5613 ! RECUR FORWARD ON I(FNU+1,Z) = R(FNU,Z)*I(FNU,Z),
5614 ! R(FNU+J-1,Z)=Y(J), J=1,...,N
5615 !-----------------------------------------------------------------------
5616  cinur = 1.0d0
5617  cinui = 0.0d0
5618  IF (kode.EQ.1) GO TO 10
5619  cinur = dcos(zri)
5620  cinui = dsin(zri)
5621  10 CONTINUE
5622 !-----------------------------------------------------------------------
5623 ! ON LOW EXPONENT MACHINES THE K FUNCTIONS CAN BE CLOSE TO BOTH
5624 ! THE UNDER AND OVERFLOW LIMITS AND THE NORMALIZATION MUST BE
5625 ! SCALED TO PREVENT OVER OR UNDERFLOW. CUOIK HAS DETERMINED THAT
5626 ! THE RESULT IS ON SCALE.
5627 !-----------------------------------------------------------------------
5628  acw = zabs(cwr(2),cwi(2))
5629  ascle = 1.0d+3*d1mach(1)/tol
5630  csclr = 1.0d0
5631  IF (acw.GT.ascle) GO TO 20
5632  csclr = 1.0d0/tol
5633  GO TO 30
5634  20 CONTINUE
5635  ascle = 1.0d0/ascle
5636  IF (acw.LT.ascle) GO TO 30
5637  csclr = tol
5638  30 CONTINUE
5639  c1r = cwr(1)*csclr
5640  c1i = cwi(1)*csclr
5641  c2r = cwr(2)*csclr
5642  c2i = cwi(2)*csclr
5643  str = yr(1)
5644  sti = yi(1)
5645 !-----------------------------------------------------------------------
5646 ! CINU=CINU*(CONJG(CT)/CABS(CT))*(1.0D0/CABS(CT) PREVENTS
5647 ! UNDER- OR OVERFLOW PREMATURELY BY SQUARING CABS(CT)
5648 !-----------------------------------------------------------------------
5649  ptr = str*c1r - sti*c1i
5650  pti = str*c1i + sti*c1r
5651  ptr = ptr + c2r
5652  pti = pti + c2i
5653  ctr = zrr*ptr - zri*pti
5654  cti = zrr*pti + zri*ptr
5655  act = zabs(ctr,cti)
5656  ract = 1.0d0/act
5657  ctr = ctr*ract
5658  cti = -cti*ract
5659  ptr = cinur*ract
5660  pti = cinui*ract
5661  cinur = ptr*ctr - pti*cti
5662  cinui = ptr*cti + pti*ctr
5663  yr(1) = cinur*csclr
5664  yi(1) = cinui*csclr
5665  IF (n.EQ.1) RETURN
5666  DO 40 i=2,n
5667  ptr = str*cinur - sti*cinui
5668  cinui = str*cinui + sti*cinur
5669  cinur = ptr
5670  str = yr(i)
5671  sti = yi(i)
5672  yr(i) = cinur*csclr
5673  yi(i) = cinui*csclr
5674  40 CONTINUE
5675  RETURN
5676  50 CONTINUE
5677  nz = -1
5678  IF(nw.EQ.(-2)) nz=-2
5679  RETURN
5680 END
5681 
5682 SUBROUTINE zmlri(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
5683 USE utilit
5684 USE complex
5685 !***BEGIN PROLOGUE ZMLRI
5686 !***REFER TO ZBESI,ZBESK
5687 !
5688 ! ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
5689 ! MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
5690 !
5691 !***ROUTINES CALLED DGAMLN,D1MACH,ZABS,ZEXP,ZLOG,ZMLT
5692 !***END PROLOGUE ZMLRI
5693 ! COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
5694  DOUBLE PRECISION ack, ak, ap, at, az, bk, cki, ckr, cnormi, &
5695  cnormr, conei, coner, fkap, fkk, flam, fnf, fnu, pti, ptr, p1i, &
5696  p1r, p2i, p2r, raz, rho, rho2, rzi, rzr, scle, sti, str, sumi, &
5697  sumr, tfnf, tol, tst, yi, yr, zeroi, zeror, zi, zr!, DGAMLN
5698  INTEGER i, iaz, idum, ifnu, inu, itime, k, kk, km, kode, m, n, nz
5699  dimension yr(1), yi(1)
5700  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
5701  scle = d1mach(1)/tol
5702  nz=0
5703  az = zabs(zr,zi)
5704  iaz = int(sngl(az))
5705  ifnu = int(sngl(fnu))
5706  inu = ifnu + n - 1
5707  at = dble(float(iaz)) + 1.0d0
5708  raz = 1.0d0/az
5709  str = zr*raz
5710  sti = -zi*raz
5711  ckr = str*at*raz
5712  cki = sti*at*raz
5713  rzr = (str+str)*raz
5714  rzi = (sti+sti)*raz
5715  p1r = zeror
5716  p1i = zeroi
5717  p2r = coner
5718  p2i = conei
5719  ack = (at+1.0d0)*raz
5720  rho = ack + dsqrt(ack*ack-1.0d0)
5721  rho2 = rho*rho
5722  tst = (rho2+rho2)/((rho2-1.0d0)*(rho-1.0d0))
5723  tst = tst/tol
5724 !-----------------------------------------------------------------------
5725 ! COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
5726 !-----------------------------------------------------------------------
5727  ak = at
5728  DO 10 i=1,80
5729  ptr = p2r
5730  pti = p2i
5731  p2r = p1r - (ckr*ptr-cki*pti)
5732  p2i = p1i - (cki*ptr+ckr*pti)
5733  p1r = ptr
5734  p1i = pti
5735  ckr = ckr + rzr
5736  cki = cki + rzi
5737  ap = zabs(p2r,p2i)
5738  IF (ap.GT.tst*ak*ak) GO TO 20
5739  ak = ak + 1.0d0
5740  10 CONTINUE
5741  GO TO 110
5742  20 CONTINUE
5743  i = i + 1
5744  k = 0
5745  IF (inu.LT.iaz) GO TO 40
5746 !-----------------------------------------------------------------------
5747 ! COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
5748 !-----------------------------------------------------------------------
5749  p1r = zeror
5750  p1i = zeroi
5751  p2r = coner
5752  p2i = conei
5753  at = dble(float(inu)) + 1.0d0
5754  str = zr*raz
5755  sti = -zi*raz
5756  ckr = str*at*raz
5757  cki = sti*at*raz
5758  ack = at*raz
5759  tst = dsqrt(ack/tol)
5760  itime = 1
5761  DO 30 k=1,80
5762  ptr = p2r
5763  pti = p2i
5764  p2r = p1r - (ckr*ptr-cki*pti)
5765  p2i = p1i - (ckr*pti+cki*ptr)
5766  p1r = ptr
5767  p1i = pti
5768  ckr = ckr + rzr
5769  cki = cki + rzi
5770  ap = zabs(p2r,p2i)
5771  IF (ap.LT.tst) GO TO 30
5772  IF (itime.EQ.2) GO TO 40
5773  ack = zabs(ckr,cki)
5774  flam = ack + dsqrt(ack*ack-1.0d0)
5775  fkap = ap/zabs(p1r,p1i)
5776  rho = dmin1(flam,fkap)
5777  tst = tst*dsqrt(rho/(rho*rho-1.0d0))
5778  itime = 2
5779  30 CONTINUE
5780  GO TO 110
5781  40 CONTINUE
5782 !-----------------------------------------------------------------------
5783 ! BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
5784 !-----------------------------------------------------------------------
5785  k = k + 1
5786  kk = max0(i+iaz,k+inu)
5787  fkk = dble(float(kk))
5788  p1r = zeror
5789  p1i = zeroi
5790 !-----------------------------------------------------------------------
5791 ! SCALE P2 AND SUM BY SCLE
5792 !-----------------------------------------------------------------------
5793  p2r = scle
5794  p2i = zeroi
5795  fnf = fnu - dble(float(ifnu))
5796  tfnf = fnf + fnf
5797  bk = dgamln(fkk+tfnf+1.0d0,idum) - dgamln(fkk+1.0d0,idum) - &
5798  dgamln(tfnf+1.0d0,idum)
5799  bk = dexp(bk)
5800  sumr = zeror
5801  sumi = zeroi
5802  km = kk - inu
5803  DO 50 i=1,km
5804  ptr = p2r
5805  pti = p2i
5806  p2r = p1r + (fkk+fnf)*(rzr*ptr-rzi*pti)
5807  p2i = p1i + (fkk+fnf)*(rzi*ptr+rzr*pti)
5808  p1r = ptr
5809  p1i = pti
5810  ak = 1.0d0 - tfnf/(fkk+tfnf)
5811  ack = bk*ak
5812  sumr = sumr + (ack+bk)*p1r
5813  sumi = sumi + (ack+bk)*p1i
5814  bk = ack
5815  fkk = fkk - 1.0d0
5816  50 CONTINUE
5817  yr(n) = p2r
5818  yi(n) = p2i
5819  IF (n.EQ.1) GO TO 70
5820  DO 60 i=2,n
5821  ptr = p2r
5822  pti = p2i
5823  p2r = p1r + (fkk+fnf)*(rzr*ptr-rzi*pti)
5824  p2i = p1i + (fkk+fnf)*(rzi*ptr+rzr*pti)
5825  p1r = ptr
5826  p1i = pti
5827  ak = 1.0d0 - tfnf/(fkk+tfnf)
5828  ack = bk*ak
5829  sumr = sumr + (ack+bk)*p1r
5830  sumi = sumi + (ack+bk)*p1i
5831  bk = ack
5832  fkk = fkk - 1.0d0
5833  m = n - i + 1
5834  yr(m) = p2r
5835  yi(m) = p2i
5836  60 CONTINUE
5837  70 CONTINUE
5838  IF (ifnu.LE.0) GO TO 90
5839  DO 80 i=1,ifnu
5840  ptr = p2r
5841  pti = p2i
5842  p2r = p1r + (fkk+fnf)*(rzr*ptr-rzi*pti)
5843  p2i = p1i + (fkk+fnf)*(rzr*pti+rzi*ptr)
5844  p1r = ptr
5845  p1i = pti
5846  ak = 1.0d0 - tfnf/(fkk+tfnf)
5847  ack = bk*ak
5848  sumr = sumr + (ack+bk)*p1r
5849  sumi = sumi + (ack+bk)*p1i
5850  bk = ack
5851  fkk = fkk - 1.0d0
5852  80 CONTINUE
5853  90 CONTINUE
5854  ptr = zr
5855  pti = zi
5856  IF (kode.EQ.2) ptr = zeror
5857  CALL zlog(rzr, rzi, str, sti, idum)
5858  p1r = -fnf*str + ptr
5859  p1i = -fnf*sti + pti
5860  ap = dgamln(1.0d0+fnf,idum)
5861  ptr = p1r - ap
5862  pti = p1i
5863 !-----------------------------------------------------------------------
5864 ! THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
5865 ! IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
5866 !-----------------------------------------------------------------------
5867  p2r = p2r + sumr
5868  p2i = p2i + sumi
5869  ap = zabs(p2r,p2i)
5870  p1r = 1.0d0/ap
5871  CALL zexp(ptr, pti, str, sti)
5872  ckr = str*p1r
5873  cki = sti*p1r
5874  ptr = p2r*p1r
5875  pti = -p2i*p1r
5876  CALL zmlt(ckr, cki, ptr, pti, cnormr, cnormi)
5877  DO 100 i=1,n
5878  str = yr(i)*cnormr - yi(i)*cnormi
5879  yi(i) = yr(i)*cnormi + yi(i)*cnormr
5880  yr(i) = str
5881  100 CONTINUE
5882  RETURN
5883  110 CONTINUE
5884  nz=-2
5885  RETURN
5886 END
5887 end module bessely
5888 !end of file tzbesy.f90
int sgn(T val)
signum
Definition: globals.hh:23