MoDeNa  1.0
Software framework facilitating sequential multi-scale modelling
besselj.f90
1 module besselj
2  implicit none
3  private
4  public zbesj
5 contains
6 !*****************************************************************
7 !* EVALUATE A J-BESSEL FUNCTION OF COMPLEX ARGUMENT (FIRST KIND) *
8 !* ------------------------------------------------------------- *
9 !* SAMPLE RUN: *
10 !* (Evaluate J0 to J4 for argument Z=(1.0,2.0) ). *
11 !* *
12 !* zr(0) = 1.586259 *
13 !* zi(0) = -1.391602 *
14 !* zr(1) = 1.291848 *
15 !* zi(1) = 1.010488 *
16 !* zr(2) = -0.261130 *
17 !* zi(2) = 0.762320 *
18 !* zr(3) = -0.281040 *
19 !* zi(3) = 0.017175 *
20 !* zr(4) = -0.034898 *
21 !* zi(4) = -0.067215 *
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 !Note: to link with Complex.f90 and Utilit.f90.
33 !---------------------------------------------
34 !PROGRAM TEST_ZBESJ
35 !real*8 zr,zi, cyr(10), cyi(10)
36 
37 ! n=5
38 ! zr=1.d0; zi=2.d0
39 ! call ZBESJ(zr,zi,0,1,n,cyr,cyi,nz,ierr)
40 
41 ! print *,' '
42 ! do i=1, n
43 ! write(*,10) i-1, cyr(i)
44 ! write(*,11) i-1, cyi(i)
45 ! end do
46 ! print *,' NZ=', NZ
47 ! print *,' Error code:', ierr
48 ! print *,' '
49 
50 !10 format(' zr(',I1,') = ',F10.6)
51 !11 format(' zi(',I1,') = ',F10.6)
52 !
53 !END
54 
55 SUBROUTINE zbesj(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
56 USE utilit !For I1MACH,D1MACH.
57 USE complex !For ZABS
58 !***BEGIN PROLOGUE ZBESJ
59 !***DATE WRITTEN 830501 (YYMMDD)
60 !***REVISION DATE 830501 (YYMMDD)
61 !***CATEGORY NO. B5K
62 !***KEYWORDS J-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT,
63 ! BESSEL FUNCTION OF FIRST KIND
64 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
65 !***PURPOSE TO COMPUTE THE J-BESSEL FUNCTION OF A COMPLEX ARGUMENT
66 !***DESCRIPTION
67 !
68 ! ***A DOUBLE PRECISION ROUTINE***
69 ! ON KODE=1, CBESJ COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
70 ! BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE
71 ! ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
72 ! -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED
73 ! FUNCTIONS
74 !
75 ! CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z)
76 !
77 ! WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
78 ! LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
79 ! ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
80 ! (REF. 1).
81 !
82 ! INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
83 ! ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI
84 ! FNU - ORDER OF INITIAL J FUNCTION, FNU.GE.0.0D0
85 ! KODE - A PARAMETER TO INDICATE THE SCALING OPTION
86 ! KODE= 1 RETURNS
87 ! CY(I)=J(FNU+I-1,Z), I=1,...,N
88 ! = 2 RETURNS
89 ! CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)), I=1,...,N
90 ! N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
91 !
92 ! OUTPUT CYR,CYI ARE DOUBLE PRECISION
93 ! CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
94 ! CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
95 ! CY(I)=J(FNU+I-1,Z) OR
96 ! CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)) I=1,...,N
97 ! DEPENDING ON KODE, Y=AIMAG(Z).
98 ! NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
99 ! NZ= 0 , NORMAL RETURN
100 ! NZ.GT.0 , LAST NZ COMPONENTS OF CY SET ZERO DUE
101 ! TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
102 ! I = N-NZ+1,...,N
103 ! IERR - ERROR FLAG
104 ! IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
105 ! IERR=1, INPUT ERROR - NO COMPUTATION
106 ! IERR=2, OVERFLOW - NO COMPUTATION, AIMAG(Z)
107 ! TOO LARGE ON KODE=1
108 ! IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
109 ! BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
110 ! REDUCTION PRODUCE LESS THAN HALF OF MACHINE
111 ! ACCURACY
112 ! IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
113 ! TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
114 ! CANCE BY ARGUMENT REDUCTION
115 ! IERR=5, ERROR - NO COMPUTATION,
116 ! ALGORITHM TERMINATION CONDITION NOT MET
117 !
118 !***LONG DESCRIPTION
119 !
120 ! THE COMPUTATION IS CARRIED OUT BY THE FORMULA
121 !
122 ! J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z) AIMAG(Z).GE.0.0
123 !
124 ! J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z) AIMAG(Z).LT.0.0
125 !
126 ! WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION.
127 !
128 ! FOR NEGATIVE ORDERS,THE FORMULA
129 !
130 ! J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU)
131 !
132 ! CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
133 ! THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
134 ! INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A
135 ! LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
136 ! Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
137 ! TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
138 ! UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
139 ! OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
140 ! LARGE MEANS FNU.GT.CABS(Z).
141 !
142 ! IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
143 ! MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
144 ! LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
145 ! CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
146 ! LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
147 ! IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
148 ! DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
149 ! IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
150 ! LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
151 ! MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
152 ! INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
153 ! RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
154 ! ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
155 ! ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
156 ! ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
157 ! THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
158 ! TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
159 ! IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
160 ! SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
161 !
162 ! THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
163 ! BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
164 ! ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
165 ! SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
166 ! ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
167 ! ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
168 ! CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
169 ! HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
170 ! ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
171 ! SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
172 ! THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
173 ! 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
174 ! THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
175 ! COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
176 ! BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
177 ! COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
178 ! MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
179 ! THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
180 ! OR -PI/2+P.
181 !
182 !***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
183 ! AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
184 ! COMMERCE, 1955.
185 !
186 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
187 ! BY D. E. AMOS, SAND83-0083, MAY, 1983.
188 !
189 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
190 ! AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
191 !
192 ! A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
193 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
194 ! 1018, MAY, 1985
195 !
196 ! A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
197 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
198 ! MATH. SOFTWARE, 1986
199 !
200 !***ROUTINES CALLED ZABS,ZBINU,I1MACH,D1MACH
201 !***END PROLOGUE ZBESJ
202 !
203 ! COMPLEX CI,CSGN,CY,Z,ZN
204  DOUBLE PRECISION aa, alim, arg, cii, csgni, csgnr, cyi, cyr, dig, &
205  elim, fnu, fnul, hpi, rl, r1m5, str, tol, zi, zni, znr, zr, &
206  bb, fn, az
207  INTEGER i, ierr, inu, inuh, ir, k, kode, k1, k2, n, nl, nz
208  dimension cyr(1), cyi(1)
209  DATA hpi /1.57079632679489662d0/
210 
211 !***FIRST EXECUTABLE STATEMENT ZBESJ
212  ierr = 0
213  nz=0
214  IF (fnu.LT.0.0d0) ierr=1
215  IF (kode.LT.1 .OR. kode.GT.2) ierr=1
216  IF (n.LT.1) ierr=1
217  IF (ierr.NE.0) RETURN
218 !-----------------------------------------------------------------------
219 ! SET PARAMETERS RELATED TO MACHINE CONSTANTS.
220 ! TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
221 ! ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
222 ! EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
223 ! EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
224 ! UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
225 ! RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
226 ! DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
227 ! FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
228 !-----------------------------------------------------------------------
229  tol = dmax1(d1mach(4),1.0d-18)
230  k1 = i1mach(15)
231  k2 = i1mach(16)
232  r1m5 = d1mach(5)
233  k = min0(iabs(k1),iabs(k2))
234  elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
235  k1 = i1mach(14) - 1
236  aa = r1m5*dble(float(k1))
237  dig = dmin1(aa,18.0d0)
238  aa = aa*2.303d0
239  alim = elim + dmax1(-aa,-41.45d0)
240  rl = 1.2d0*dig + 3.0d0
241  fnul = 10.0d0 + 6.0d0*(dig-3.0d0)
242 !-----------------------------------------------------------------------
243 ! TEST FOR PROPER RANGE
244 !-----------------------------------------------------------------------
245  az = zabs(zr,zi)
246  fn = fnu+dble(float(n-1))
247  aa = 0.5d0/tol
248  bb=dble(float(i1mach(9)))*0.5d0
249  aa = dmin1(aa,bb)
250  IF (az.GT.aa) GO TO 260
251  IF (fn.GT.aa) GO TO 260
252  aa = dsqrt(aa)
253  IF (az.GT.aa) ierr=3
254  IF (fn.GT.aa) ierr=3
255 !-----------------------------------------------------------------------
256 ! CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
257 ! WHEN FNU IS LARGE
258 !-----------------------------------------------------------------------
259  cii = 1.0d0
260  inu = int(sngl(fnu))
261  inuh = inu/2
262  ir = inu - 2*inuh
263  arg = (fnu-dble(float(inu-ir)))*hpi
264  csgnr = dcos(arg)
265  csgni = dsin(arg)
266  IF (mod(inuh,2).EQ.0) GO TO 40
267  csgnr = -csgnr
268  csgni = -csgni
269  40 CONTINUE
270 !-----------------------------------------------------------------------
271 ! ZN IS IN THE RIGHT HALF PLANE
272 !-----------------------------------------------------------------------
273  znr = zi
274  zni = -zr
275  IF (zi.GE.0.0d0) GO TO 50
276  znr = -znr
277  zni = -zni
278  csgni = -csgni
279  cii = -cii
280  50 CONTINUE
281  CALL zbinu(znr, zni, fnu, kode, n, cyr, cyi, nz, rl, fnul, tol, &
282  elim, alim)
283  IF (nz.LT.0) GO TO 130
284  nl = n - nz
285  IF (nl.EQ.0) RETURN
286  DO 60 i=1,nl
287  str = cyr(i)*csgnr - cyi(i)*csgni
288  cyi(i) = cyr(i)*csgni + cyi(i)*csgnr
289  cyr(i) = str
290  str = -csgni*cii
291  csgni = csgnr*cii
292  csgnr = str
293  60 CONTINUE
294  RETURN
295  130 CONTINUE
296  IF(nz.EQ.(-2)) GO TO 140
297  nz = 0
298  ierr = 2
299  RETURN
300  140 CONTINUE
301  nz=0
302  ierr=5
303  RETURN
304  260 CONTINUE
305  nz=0
306  ierr=4
307  RETURN
308  END
309 
310 
311 
312 SUBROUTINE zuchk(YR, YI, NZ, ASCLE, TOL)
313 !***BEGIN PROLOGUE ZUCHK
314 !***REFER TO ZSERI,ZUOIK,ZUNK1,ZUNK2,ZUNI1,ZUNI2,ZKSCL
315 !
316 ! Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN
317 ! EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE
318 ! IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW
319 ! WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED
320 ! IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE
321 ! OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE
322 ! ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.
323 !
324 !***ROUTINES CALLED (NONE)
325 !***END PROLOGUE ZUCHK
326 !
327 ! COMPLEX Y
328  DOUBLE PRECISION ascle, ss, st, tol, wr, wi, yr, yi
329  INTEGER nz
330  nz = 0
331  wr = dabs(yr)
332  wi = dabs(yi)
333  st = dmin1(wr,wi)
334  IF (st.GT.ascle) RETURN
335  ss = dmax1(wr,wi)
336  st = st/tol
337  IF (ss.LT.st) nz = 1
338  RETURN
339 END
340 
341 SUBROUTINE zbinu(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL, ELIM, ALIM)
342 USE complex
343 !***BEGIN PROLOGUE ZBINU
344 !***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
345 
346 ! ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
347 
348 !***ROUTINES CALLED ZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
349 !***END PROLOGUE ZBINU
350  DOUBLE PRECISION alim, az, cwi, cwr, cyi, cyr, dfnu, elim, fnu, &
351  fnul, rl, tol, zeroi, zeror, zi, zr
352  INTEGER i, inw, kode, n, nlast, nn, nui, nw, nz
353  dimension cyr(1), cyi(1), cwr(2), cwi(2)
354  DATA zeror,zeroi / 0.0d0, 0.0d0 /
355 
356  nz = 0
357  az = zabs(zr,zi)
358  nn = n
359  dfnu = fnu + dble(float(n-1))
360  IF (az.LE.2.0d0) GO TO 10
361  IF (az*az*0.25d0.GT.dfnu+1.0d0) GO TO 20
362  10 CONTINUE
363 !-----------------------------------------------------------------------
364 ! POWER SERIES
365 !-----------------------------------------------------------------------
366  CALL zseri(zr, zi, fnu, kode, nn, cyr, cyi, nw, tol, elim, alim)
367  inw = iabs(nw)
368  nz = nz + inw
369  nn = nn - inw
370  IF (nn.EQ.0) RETURN
371  IF (nw.GE.0) GO TO 120
372  dfnu = fnu + dble(float(nn-1))
373  20 CONTINUE
374  IF (az.LT.rl) GO TO 40
375  IF (dfnu.LE.1.0d0) GO TO 30
376  IF (az+az.LT.dfnu*dfnu) GO TO 50
377 !-----------------------------------------------------------------------
378 ! ASYMPTOTIC EXPANSION FOR LARGE Z
379 !-----------------------------------------------------------------------
380  30 CONTINUE
381  CALL zasyi(zr, zi, fnu, kode, nn, cyr, cyi, nw, rl, tol, elim, alim)
382  IF (nw.LT.0) GO TO 130
383  GO TO 120
384  40 CONTINUE
385  IF (dfnu.LE.1.0d0) GO TO 70
386  50 CONTINUE
387 !-----------------------------------------------------------------------
388 ! OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
389 !-----------------------------------------------------------------------
390  CALL zuoik(zr, zi, fnu, kode, 1, nn, cyr, cyi, nw, tol, elim, alim)
391  IF (nw.LT.0) GO TO 130
392  nz = nz + nw
393  nn = nn - nw
394  IF (nn.EQ.0) RETURN
395  dfnu = fnu+dble(float(nn-1))
396  IF (dfnu.GT.fnul) GO TO 110
397  IF (az.GT.fnul) GO TO 110
398  60 CONTINUE
399  IF (az.GT.rl) GO TO 80
400  70 CONTINUE
401 !-----------------------------------------------------------------------
402 ! MILLER ALGORITHM NORMALIZED BY THE SERIES
403 !-----------------------------------------------------------------------
404  CALL zmlri(zr, zi, fnu, kode, nn, cyr, cyi, nw, tol)
405  IF(nw.LT.0) GO TO 130
406  GO TO 120
407  80 CONTINUE
408 !-----------------------------------------------------------------------
409 ! MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
410 !-----------------------------------------------------------------------
411 !-----------------------------------------------------------------------
412 ! OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
413 !-----------------------------------------------------------------------
414  CALL zuoik(zr, zi, fnu, kode, 2, 2, cwr, cwi, nw, tol, elim, alim)
415  IF (nw.GE.0) GO TO 100
416  nz = nn
417  DO 90 i=1,nn
418  cyr(i) = zeror
419  cyi(i) = zeroi
420  90 CONTINUE
421  RETURN
422  100 CONTINUE
423  IF (nw.GT.0) GO TO 130
424  CALL zwrsk(zr, zi, fnu, kode, nn, cyr, cyi, nw, cwr, cwi, tol, elim, alim)
425  IF (nw.LT.0) GO TO 130
426  GO TO 120
427  110 CONTINUE
428 !-----------------------------------------------------------------------
429 ! INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
430 !-----------------------------------------------------------------------
431  nui = int(sngl(fnul-dfnu)) + 1
432  nui = max0(nui,0)
433  CALL zbuni(zr, zi, fnu, kode, nn, cyr, cyi, nw, nui, nlast, fnul, &
434  tol, elim, alim)
435  IF (nw.LT.0) GO TO 130
436  nz = nz + nw
437  IF (nlast.EQ.0) GO TO 120
438  nn = nlast
439  GO TO 60
440  120 CONTINUE
441  RETURN
442  130 CONTINUE
443  nz = -1
444  IF(nw.EQ.(-2)) nz=-2
445  RETURN
446  END
447 
448 SUBROUTINE zseri(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, ALIM)
449 USE utilit
450 USE complex
451 !***BEGIN PROLOGUE ZSERI
452 !***REFER TO ZBESI,ZBESK
453 !
454 ! ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
455 ! MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE
456 ! REGION CABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
457 ! NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
458 ! DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
459 ! CONDITION CABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
460 ! COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
461 !
462 !***ROUTINES CALLED DGAMLN,D1MACH,ZUCHK,ZABS,ZDIV,ZLOG,ZMLT
463 !***END PROLOGUE ZSERI
464 ! COMPLEX AK1,CK,COEF,CONE,CRSC,CSCL,CZ,CZERO,HZ,RZ,S1,S2,Y,Z
465  DOUBLE PRECISION aa, acz, ak, ak1i, ak1r, alim, arm, ascle, atol, &
466  az, cki, ckr, coefi, coefr, conei, coner, crscr, czi, czr, dfnu, &
467  elim, fnu, fnup, hzi, hzr, raz, rs, rtr1, rzi, rzr, s, ss, sti, &
468  str, s1i, s1r, s2i, s2r, tol, yi, yr, wi, wr, zeroi, zeror, zi, &
469  zr!, DGAMLN
470  INTEGER i, ib, idum, iflag, il, k, kode, l, m, n, nn, nz, nw
471  dimension yr(1), yi(1), wr(2), wi(2)
472  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
473 
474  nz = 0
475  az = zabs(zr,zi)
476  IF (az.EQ.0.0d0) GO TO 160
477  arm = 1.0d+3*d1mach(1)
478  rtr1 = dsqrt(arm)
479  crscr = 1.0d0
480  iflag = 0
481  IF (az.LT.arm) GO TO 150
482  hzr = 0.5d0*zr
483  hzi = 0.5d0*zi
484  czr = zeror
485  czi = zeroi
486  IF (az.LE.rtr1) GO TO 10
487  CALL zmlt(hzr, hzi, hzr, hzi, czr, czi)
488  10 CONTINUE
489  acz = zabs(czr,czi)
490  nn = n
491  CALL zlog(hzr, hzi, ckr, cki, idum)
492  20 CONTINUE
493  dfnu = fnu + dble(float(nn-1))
494  fnup = dfnu + 1.0d0
495 !-----------------------------------------------------------------------
496 ! UNDERFLOW TEST
497 !-----------------------------------------------------------------------
498  ak1r = ckr*dfnu
499  ak1i = cki*dfnu
500  ak = dgamln(fnup,idum)
501  ak1r = ak1r - ak
502  IF (kode.EQ.2) ak1r = ak1r - zr
503  IF (ak1r.GT.(-elim)) GO TO 40
504  30 CONTINUE
505  nz = nz + 1
506  yr(nn) = zeror
507  yi(nn) = zeroi
508  IF (acz.GT.dfnu) GO TO 190
509  nn = nn - 1
510  IF (nn.EQ.0) RETURN
511  GO TO 20
512  40 CONTINUE
513  IF (ak1r.GT.(-alim)) GO TO 50
514  iflag = 1
515  ss = 1.0d0/tol
516  crscr = tol
517  ascle = arm*ss
518  50 CONTINUE
519  aa = dexp(ak1r)
520  IF (iflag.EQ.1) aa = aa*ss
521  coefr = aa*dcos(ak1i)
522  coefi = aa*dsin(ak1i)
523  atol = tol*acz/fnup
524  il = min0(2,nn)
525  DO 90 i=1,il
526  dfnu = fnu + dble(float(nn-i))
527  fnup = dfnu + 1.0d0
528  s1r = coner
529  s1i = conei
530  IF (acz.LT.tol*fnup) GO TO 70
531  ak1r = coner
532  ak1i = conei
533  ak = fnup + 2.0d0
534  s = fnup
535  aa = 2.0d0
536  60 CONTINUE
537  rs = 1.0d0/s
538  str = ak1r*czr - ak1i*czi
539  sti = ak1r*czi + ak1i*czr
540  ak1r = str*rs
541  ak1i = sti*rs
542  s1r = s1r + ak1r
543  s1i = s1i + ak1i
544  s = s + ak
545  ak = ak + 2.0d0
546  aa = aa*acz*rs
547  IF (aa.GT.atol) GO TO 60
548  70 CONTINUE
549  s2r = s1r*coefr - s1i*coefi
550  s2i = s1r*coefi + s1i*coefr
551  wr(i) = s2r
552  wi(i) = s2i
553  IF (iflag.EQ.0) GO TO 80
554  CALL zuchk(s2r, s2i, nw, ascle, tol)
555  IF (nw.NE.0) GO TO 30
556  80 CONTINUE
557  m = nn - i + 1
558  yr(m) = s2r*crscr
559  yi(m) = s2i*crscr
560  IF (i.EQ.il) GO TO 90
561  CALL zdiv(coefr, coefi, hzr, hzi, str, sti)
562  coefr = str*dfnu
563  coefi = sti*dfnu
564  90 CONTINUE
565  IF (nn.LE.2) RETURN
566  k = nn - 2
567  ak = dble(float(k))
568  raz = 1.0d0/az
569  str = zr*raz
570  sti = -zi*raz
571  rzr = (str+str)*raz
572  rzi = (sti+sti)*raz
573  IF (iflag.EQ.1) GO TO 120
574  ib = 3
575  100 CONTINUE
576  DO 110 i=ib,nn
577  yr(k) = (ak+fnu)*(rzr*yr(k+1)-rzi*yi(k+1)) + yr(k+2)
578  yi(k) = (ak+fnu)*(rzr*yi(k+1)+rzi*yr(k+1)) + yi(k+2)
579  ak = ak - 1.0d0
580  k = k - 1
581  110 CONTINUE
582  RETURN
583 !-----------------------------------------------------------------------
584 ! RECUR BACKWARD WITH SCALED VALUES
585 !-----------------------------------------------------------------------
586  120 CONTINUE
587 !-----------------------------------------------------------------------
588 ! EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
589 ! UNDERFLOW LIMIT = ASCLE = D1MACH(1)*SS*1.0D+3
590 !-----------------------------------------------------------------------
591  s1r = wr(1)
592  s1i = wi(1)
593  s2r = wr(2)
594  s2i = wi(2)
595  DO 130 l=3,nn
596  ckr = s2r
597  cki = s2i
598  s2r = s1r + (ak+fnu)*(rzr*ckr-rzi*cki)
599  s2i = s1i + (ak+fnu)*(rzr*cki+rzi*ckr)
600  s1r = ckr
601  s1i = cki
602  ckr = s2r*crscr
603  cki = s2i*crscr
604  yr(k) = ckr
605  yi(k) = cki
606  ak = ak - 1.0d0
607  k = k - 1
608  IF (zabs(ckr,cki).GT.ascle) GO TO 140
609  130 CONTINUE
610  RETURN
611  140 CONTINUE
612  ib = l + 1
613  IF (ib.GT.nn) RETURN
614  GO TO 100
615  150 CONTINUE
616  nz = n
617  IF (fnu.EQ.0.0d0) nz = nz - 1
618  160 CONTINUE
619  yr(1) = zeror
620  yi(1) = zeroi
621  IF (fnu.NE.0.0d0) GO TO 170
622  yr(1) = coner
623  yi(1) = conei
624  170 CONTINUE
625  IF (n.EQ.1) RETURN
626  DO 180 i=2,n
627  yr(i) = zeror
628  yi(i) = zeroi
629  180 CONTINUE
630  RETURN
631 !-----------------------------------------------------------------------
632 ! RETURN WITH NZ.LT.0 IF CABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
633 ! THE CALCULATION IN CBINU WITH N=N-IABS(NZ)
634 !-----------------------------------------------------------------------
635  190 CONTINUE
636  nz = -nz
637  RETURN
638  END
639 
640 SUBROUTINE zasyi(ZR, ZI, FNU, KODE, N, YR, YI, NZ, RL, TOL, ELIM, ALIM)
641 USE utilit
642 USE complex
643 !***BEGIN PROLOGUE ZASYI
644 !***REFER TO ZBESI,ZBESK
645 
646 ! ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
647 ! MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
648 ! REGION CABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
649 ! NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
650 !
651 !***ROUTINES CALLED D1MACH,ZABS,ZDIV,ZEXP,ZMLT,ZSQRT
652 !***END PROLOGUE ZASYI
653 ! COMPLEX AK1,CK,CONE,CS1,CS2,CZ,CZERO,DK,EZ,P1,RZ,S2,Y,Z
654  DOUBLE PRECISION aa, aez, ak, ak1i, ak1r, alim, arg, arm, atol, &
655  az, bb, bk, cki, ckr, conei, coner, cs1i, cs1r, cs2i, cs2r, czi, &
656  czr, dfnu, dki, dkr, dnu2, elim, ezi, ezr, fdn, fnu, pi, p1i, &
657  p1r, raz, rl, rtpi, rtr1, rzi, rzr, s, sgn, sqk, sti, str, s2i, &
658  s2r, tol, tzi, tzr, yi, yr, zeroi, zeror, zi, zr
659  INTEGER i, ib, il, inu, j, jl, k, kode, koded, m, n, nn, nz
660  dimension yr(1), yi(1)
661  DATA pi, rtpi /3.14159265358979324d0 , 0.159154943091895336d0 /
662  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
663 
664  nz = 0
665  az = zabs(zr,zi)
666  arm = 1.0d+3*d1mach(1)
667  rtr1 = dsqrt(arm)
668  il = min0(2,n)
669  dfnu = fnu + dble(float(n-il))
670 !-----------------------------------------------------------------------
671 ! OVERFLOW TEST
672 !-----------------------------------------------------------------------
673  raz = 1.0d0/az
674  str = zr*raz
675  sti = -zi*raz
676  ak1r = rtpi*str*raz
677  ak1i = rtpi*sti*raz
678  CALL zsqrt(ak1r, ak1i, ak1r, ak1i)
679  czr = zr
680  czi = zi
681  IF (kode.NE.2) GO TO 10
682  czr = zeror
683  czi = zi
684  10 CONTINUE
685  IF (dabs(czr).GT.elim) GO TO 100
686  dnu2 = dfnu + dfnu
687  koded = 1
688  IF ((dabs(czr).GT.alim) .AND. (n.GT.2)) GO TO 20
689  koded = 0
690  CALL zexp(czr, czi, str, sti)
691  CALL zmlt(ak1r, ak1i, str, sti, ak1r, ak1i)
692  20 CONTINUE
693  fdn = 0.0d0
694  IF (dnu2.GT.rtr1) fdn = dnu2*dnu2
695  ezr = zr*8.0d0
696  ezi = zi*8.0d0
697 !-----------------------------------------------------------------------
698 ! WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
699 ! FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
700 ! EXPANSION FOR THE IMAGINARY PART.
701 !-----------------------------------------------------------------------
702  aez = 8.0d0*az
703  s = tol/aez
704  jl = int(sngl(rl+rl)) + 2
705  p1r = zeror
706  p1i = zeroi
707  IF (zi.EQ.0.0d0) GO TO 30
708 !-----------------------------------------------------------------------
709 ! CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
710 ! SIGNIFICANCE WHEN FNU OR N IS LARGE
711 !-----------------------------------------------------------------------
712  inu = int(sngl(fnu))
713  arg = (fnu-dble(float(inu)))*pi
714  inu = inu + n - il
715  ak = -dsin(arg)
716  bk = dcos(arg)
717  IF (zi.LT.0.0d0) bk = -bk
718  p1r = ak
719  p1i = bk
720  IF (mod(inu,2).EQ.0) GO TO 30
721  p1r = -p1r
722  p1i = -p1i
723  30 CONTINUE
724  DO 70 k=1,il
725  sqk = fdn - 1.0d0
726  atol = s*dabs(sqk)
727  sgn = 1.0d0
728  cs1r = coner
729  cs1i = conei
730  cs2r = coner
731  cs2i = conei
732  ckr = coner
733  cki = conei
734  ak = 0.0d0
735  aa = 1.0d0
736  bb = aez
737  dkr = ezr
738  dki = ezi
739  DO 40 j=1,jl
740  CALL zdiv(ckr, cki, dkr, dki, str, sti)
741  ckr = str*sqk
742  cki = sti*sqk
743  cs2r = cs2r + ckr
744  cs2i = cs2i + cki
745  sgn = -sgn
746  cs1r = cs1r + ckr*sgn
747  cs1i = cs1i + cki*sgn
748  dkr = dkr + ezr
749  dki = dki + ezi
750  aa = aa*dabs(sqk)/bb
751  bb = bb + aez
752  ak = ak + 8.0d0
753  sqk = sqk - ak
754  IF (aa.LE.atol) GO TO 50
755  40 CONTINUE
756  GO TO 110
757  50 CONTINUE
758  s2r = cs1r
759  s2i = cs1i
760  IF (zr+zr.GE.elim) GO TO 60
761  tzr = zr + zr
762  tzi = zi + zi
763  CALL zexp(-tzr, -tzi, str, sti)
764  CALL zmlt(str, sti, p1r, p1i, str, sti)
765  CALL zmlt(str, sti, cs2r, cs2i, str, sti)
766  s2r = s2r + str
767  s2i = s2i + sti
768  60 CONTINUE
769  fdn = fdn + 8.0d0*dfnu + 4.0d0
770  p1r = -p1r
771  p1i = -p1i
772  m = n - il + k
773  yr(m) = s2r*ak1r - s2i*ak1i
774  yi(m) = s2r*ak1i + s2i*ak1r
775  70 CONTINUE
776  IF (n.LE.2) RETURN
777  nn = n
778  k = nn - 2
779  ak = dble(float(k))
780  str = zr*raz
781  sti = -zi*raz
782  rzr = (str+str)*raz
783  rzi = (sti+sti)*raz
784  ib = 3
785  DO 80 i=ib,nn
786  yr(k) = (ak+fnu)*(rzr*yr(k+1)-rzi*yi(k+1)) + yr(k+2)
787  yi(k) = (ak+fnu)*(rzr*yi(k+1)+rzi*yr(k+1)) + yi(k+2)
788  ak = ak - 1.0d0
789  k = k - 1
790  80 CONTINUE
791  IF (koded.EQ.0) RETURN
792  CALL zexp(czr, czi, ckr, cki)
793  DO 90 i=1,nn
794  str = yr(i)*ckr - yi(i)*cki
795  yi(i) = yr(i)*cki + yi(i)*ckr
796  yr(i) = str
797  90 CONTINUE
798  RETURN
799  100 CONTINUE
800  nz = -1
801  RETURN
802  110 CONTINUE
803  nz=-2
804  RETURN
805  END
806 
807 SUBROUTINE zuoik(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL, ELIM, ALIM)
808 USE utilit
809 USE complex
810 !***BEGIN PROLOGUE ZUOIK
811 !***REFER TO ZBESI,ZBESK,ZBESH
812 !
813 ! ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
814 ! EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
815 ! (IN LOGARITHMI! FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
816 ! WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
817 ! EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
818 ! THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
819 ! MULTIPLIERS (IN LOGARITHMI! FORM) IS MADE BASED ON ELIM. HERE
820 ! EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
821 ! EXP(-ELIM)/TOL
822 !
823 ! IKFLG=1 MEANS THE I SEQUENCE IS TESTED
824 ! =2 MEANS THE K SEQUENCE IS TESTED
825 ! NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
826 ! =-1 MEANS AN OVERFLOW WOULD OCCUR
827 ! IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
828 ! THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
829 ! IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
830 ! IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
831 ! ANOTHER ROUTINE
832 !
833 !***ROUTINES CALLED ZUCHK,ZUNHJ,ZUNIK,D1MACH,ZABS,ZLOG
834 !***END PROLOGUE ZUOIK
835 ! COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
836 ! *ZR
837  DOUBLE PRECISION aarg, aic, alim, aphi, argi, argr, asumi, asumr, &
838  ascle, ax, ay, bsumi, bsumr, cwrki, cwrkr, czi, czr, elim, fnn, &
839  fnu, gnn, gnu, phii, phir, rcz, str, sti, sumi, sumr, tol, yi, &
840  yr, zbi, zbr, zeroi, zeror, zeta1i, zeta1r, zeta2i, zeta2r, zi, &
841  zni, znr, zr, zri, zrr
842  INTEGER i, idum, iform, ikflg, init, kode, n, nn, nuf, nw
843  dimension yr(1), yi(1), cwrkr(16), cwrki(16)
844  DATA zeror,zeroi / 0.0d0, 0.0d0 /
845  DATA aic / 1.265512123484645396d+00 /
846  nuf = 0
847  nn = n
848  zrr = zr
849  zri = zi
850  IF (zr.GE.0.0d0) GO TO 10
851  zrr = -zr
852  zri = -zi
853  10 CONTINUE
854  zbr = zrr
855  zbi = zri
856  ax = dabs(zr)*1.7321d0
857  ay = dabs(zi)
858  iform = 1
859  IF (ay.GT.ax) iform = 2
860  gnu = dmax1(fnu,1.0d0)
861  IF (ikflg.EQ.1) GO TO 20
862  fnn = dble(float(nn))
863  gnn = fnu + fnn - 1.0d0
864  gnu = dmax1(gnn,fnn)
865  20 CONTINUE
866 !-----------------------------------------------------------------------
867 ! ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
868 ! REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
869 ! THE SIGN OF THE IMAGINARY PART CORRECT.
870 !-----------------------------------------------------------------------
871  IF (iform.EQ.2) GO TO 30
872  init = 0
873  CALL zunik(zrr, zri, gnu, ikflg, 1, tol, init, phir, phii, &
874  zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
875  czr = -zeta1r + zeta2r
876  czi = -zeta1i + zeta2i
877  GO TO 50
878  30 CONTINUE
879  znr = zri
880  zni = -zrr
881  IF (zi.GT.0.0d0) GO TO 40
882  znr = -znr
883  40 CONTINUE
884  CALL zunhj(znr, zni, gnu, 1, tol, phir, phii, argr, argi, zeta1r, &
885  zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
886  czr = -zeta1r + zeta2r
887  czi = -zeta1i + zeta2i
888  aarg = zabs(argr,argi)
889  50 CONTINUE
890  IF (kode.EQ.1) GO TO 60
891  czr = czr - zbr
892  czi = czi - zbi
893  60 CONTINUE
894  IF (ikflg.EQ.1) GO TO 70
895  czr = -czr
896  czi = -czi
897  70 CONTINUE
898  aphi = zabs(phir,phii)
899  rcz = czr
900 !-----------------------------------------------------------------------
901 ! OVERFLOW TEST
902 !-----------------------------------------------------------------------
903  IF (rcz.GT.elim) GO TO 210
904  IF (rcz.LT.alim) GO TO 80
905  rcz = rcz + dlog(aphi)
906  IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
907  IF (rcz.GT.elim) GO TO 210
908  GO TO 130
909  80 CONTINUE
910 !-----------------------------------------------------------------------
911 ! UNDERFLOW TEST
912 !-----------------------------------------------------------------------
913  IF (rcz.LT.(-elim)) GO TO 90
914  IF (rcz.GT.(-alim)) GO TO 130
915  rcz = rcz + dlog(aphi)
916  IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
917  IF (rcz.GT.(-elim)) GO TO 110
918  90 CONTINUE
919  DO 100 i=1,nn
920  yr(i) = zeror
921  yi(i) = zeroi
922  100 CONTINUE
923  nuf = nn
924  RETURN
925  110 CONTINUE
926  ascle = 1.0d+3*d1mach(1)/tol
927  CALL zlog(phir, phii, str, sti, idum)
928  czr = czr + str
929  czi = czi + sti
930  IF (iform.EQ.1) GO TO 120
931  CALL zlog(argr, argi, str, sti, idum)
932  czr = czr - 0.25d0*str - aic
933  czi = czi - 0.25d0*sti
934  120 CONTINUE
935  ax = dexp(rcz)/tol
936  ay = czi
937  czr = ax*dcos(ay)
938  czi = ax*dsin(ay)
939  CALL zuchk(czr, czi, nw, ascle, tol)
940  IF (nw.NE.0) GO TO 90
941  130 CONTINUE
942  IF (ikflg.EQ.2) RETURN
943  IF (n.EQ.1) RETURN
944 !-----------------------------------------------------------------------
945 ! SET UNDERFLOWS ON I SEQUENCE
946 !-----------------------------------------------------------------------
947  140 CONTINUE
948  gnu = fnu + dble(float(nn-1))
949  IF (iform.EQ.2) GO TO 150
950  init = 0
951  CALL zunik(zrr, zri, gnu, ikflg, 1, tol, init, phir, phii, &
952  zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
953  czr = -zeta1r + zeta2r
954  czi = -zeta1i + zeta2i
955  GO TO 160
956  150 CONTINUE
957  CALL zunhj(znr, zni, gnu, 1, tol, phir, phii, argr, argi, zeta1r, &
958  zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
959  czr = -zeta1r + zeta2r
960  czi = -zeta1i + zeta2i
961  aarg = zabs(argr,argi)
962  160 CONTINUE
963  IF (kode.EQ.1) GO TO 170
964  czr = czr - zbr
965  czi = czi - zbi
966  170 CONTINUE
967  aphi = zabs(phir,phii)
968  rcz = czr
969  IF (rcz.LT.(-elim)) GO TO 180
970  IF (rcz.GT.(-alim)) RETURN
971  rcz = rcz + dlog(aphi)
972  IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
973  IF (rcz.GT.(-elim)) GO TO 190
974  180 CONTINUE
975  yr(nn) = zeror
976  yi(nn) = zeroi
977  nn = nn - 1
978  nuf = nuf + 1
979  IF (nn.EQ.0) RETURN
980  GO TO 140
981  190 CONTINUE
982  ascle = 1.0d+3*d1mach(1)/tol
983  CALL zlog(phir, phii, str, sti, idum)
984  czr = czr + str
985  czi = czi + sti
986  IF (iform.EQ.1) GO TO 200
987  CALL zlog(argr, argi, str, sti, idum)
988  czr = czr - 0.25d0*str - aic
989  czi = czi - 0.25d0*sti
990  200 CONTINUE
991  ax = dexp(rcz)/tol
992  ay = czi
993  czr = ax*dcos(ay)
994  czi = ax*dsin(ay)
995  CALL zuchk(czr, czi, nw, ascle, tol)
996  IF (nw.NE.0) GO TO 180
997  RETURN
998  210 CONTINUE
999  nuf = -1
1000  RETURN
1001  END
1002 
1003 SUBROUTINE zbuni(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NUI, NLAST, FNUL, TOL, ELIM, ALIM)
1004 USE utilit
1005 USE complex
1006 !***BEGIN PROLOGUE ZBUNI
1007 !***REFER TO ZBESI,ZBESK
1008 !
1009 ! ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.
1010 ! FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
1011 ! FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
1012 ! ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
1013 ! ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
1014 !
1015 !***ROUTINES CALLED ZUNI1,ZUNI2,ZABS,D1MACH
1016 !***END PROLOGUE ZBUNI
1017 ! COMPLEX CSCL,CSCR,CY,RZ,ST,S1,S2,Y,Z
1018  DOUBLE PRECISION alim, ax, ay, csclr, cscrr, cyi, cyr, dfnu, &
1019  elim, fnu, fnui, fnul, gnu, raz, rzi, rzr, sti, str, s1i, s1r, &
1020  s2i, s2r, tol, yi, yr, zi, zr, ascle, bry, c1r, c1i, c1m
1021  INTEGER i, iflag, iform, k, kode, n, nl, nlast, nui, nw, nz
1022  dimension yr(1), yi(1), cyr(2), cyi(2), bry(3)
1023  nz = 0
1024  ax = dabs(zr)*1.7321d0
1025  ay = dabs(zi)
1026  iform = 1
1027  IF (ay.GT.ax) iform = 2
1028  IF (nui.EQ.0) GO TO 60
1029  fnui = dble(float(nui))
1030  dfnu = fnu + dble(float(n-1))
1031  gnu = dfnu + fnui
1032  IF (iform.EQ.2) GO TO 10
1033 !-----------------------------------------------------------------------
1034 ! ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
1035 ! -PI/3.LE.ARG(Z).LE.PI/3
1036 !-----------------------------------------------------------------------
1037  CALL zuni1(zr, zi, gnu, kode, 2, cyr, cyi, nw, nlast, fnul, tol, elim, alim)
1038  GO TO 20
1039  10 CONTINUE
1040 !-----------------------------------------------------------------------
1041 ! ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
1042 ! APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
1043 ! AND HPI=PI/2
1044 !-----------------------------------------------------------------------
1045  CALL zuni2(zr, zi, gnu, kode, 2, cyr, cyi, nw, nlast, fnul, tol, elim, alim)
1046  20 CONTINUE
1047  IF (nw.LT.0) GO TO 50
1048  IF (nw.NE.0) GO TO 90
1049  str = zabs(cyr(1),cyi(1))
1050 !----------------------------------------------------------------------
1051 ! SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
1052 !----------------------------------------------------------------------
1053  bry(1)=1.0d+3*d1mach(1)/tol
1054  bry(2) = 1.0d0/bry(1)
1055  bry(3) = bry(2)
1056  iflag = 2
1057  ascle = bry(2)
1058  csclr = 1.0d0
1059  IF (str.GT.bry(1)) GO TO 21
1060  iflag = 1
1061  ascle = bry(1)
1062  csclr = 1.0d0/tol
1063  GO TO 25
1064  21 CONTINUE
1065  IF (str.LT.bry(2)) GO TO 25
1066  iflag = 3
1067  ascle=bry(3)
1068  csclr = tol
1069  25 CONTINUE
1070  cscrr = 1.0d0/csclr
1071  s1r = cyr(2)*csclr
1072  s1i = cyi(2)*csclr
1073  s2r = cyr(1)*csclr
1074  s2i = cyi(1)*csclr
1075  raz = 1.0d0/zabs(zr,zi)
1076  str = zr*raz
1077  sti = -zi*raz
1078  rzr = (str+str)*raz
1079  rzi = (sti+sti)*raz
1080  DO 30 i=1,nui
1081  str = s2r
1082  sti = s2i
1083  s2r = (dfnu+fnui)*(rzr*str-rzi*sti) + s1r
1084  s2i = (dfnu+fnui)*(rzr*sti+rzi*str) + s1i
1085  s1r = str
1086  s1i = sti
1087  fnui = fnui - 1.0d0
1088  IF (iflag.GE.3) GO TO 30
1089  str = s2r*cscrr
1090  sti = s2i*cscrr
1091  c1r = dabs(str)
1092  c1i = dabs(sti)
1093  c1m = dmax1(c1r,c1i)
1094  IF (c1m.LE.ascle) GO TO 30
1095  iflag = iflag+1
1096  ascle = bry(iflag)
1097  s1r = s1r*cscrr
1098  s1i = s1i*cscrr
1099  s2r = str
1100  s2i = sti
1101  csclr = csclr*tol
1102  cscrr = 1.0d0/csclr
1103  s1r = s1r*csclr
1104  s1i = s1i*csclr
1105  s2r = s2r*csclr
1106  s2i = s2i*csclr
1107  30 CONTINUE
1108  yr(n) = s2r*cscrr
1109  yi(n) = s2i*cscrr
1110  IF (n.EQ.1) RETURN
1111  nl = n - 1
1112  fnui = dble(float(nl))
1113  k = nl
1114  DO 40 i=1,nl
1115  str = s2r
1116  sti = s2i
1117  s2r = (fnu+fnui)*(rzr*str-rzi*sti) + s1r
1118  s2i = (fnu+fnui)*(rzr*sti+rzi*str) + s1i
1119  s1r = str
1120  s1i = sti
1121  str = s2r*cscrr
1122  sti = s2i*cscrr
1123  yr(k) = str
1124  yi(k) = sti
1125  fnui = fnui - 1.0d0
1126  k = k - 1
1127  IF (iflag.GE.3) GO TO 40
1128  c1r = dabs(str)
1129  c1i = dabs(sti)
1130  c1m = dmax1(c1r,c1i)
1131  IF (c1m.LE.ascle) GO TO 40
1132  iflag = iflag+1
1133  ascle = bry(iflag)
1134  s1r = s1r*cscrr
1135  s1i = s1i*cscrr
1136  s2r = str
1137  s2i = sti
1138  csclr = csclr*tol
1139  cscrr = 1.0d0/csclr
1140  s1r = s1r*csclr
1141  s1i = s1i*csclr
1142  s2r = s2r*csclr
1143  s2i = s2i*csclr
1144  40 CONTINUE
1145  RETURN
1146  50 CONTINUE
1147  nz = -1
1148  IF(nw.EQ.(-2)) nz=-2
1149  RETURN
1150  60 CONTINUE
1151  IF (iform.EQ.2) GO TO 70
1152 !-----------------------------------------------------------------------
1153 ! ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
1154 ! -PI/3.LE.ARG(Z).LE.PI/3
1155 !-----------------------------------------------------------------------
1156  CALL zuni1(zr, zi, fnu, kode, n, yr, yi, nw, nlast, fnul, tol, elim, alim)
1157  GO TO 80
1158  70 CONTINUE
1159 !-----------------------------------------------------------------------
1160 ! ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
1161 ! APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
1162 ! AND HPI=PI/2
1163 !-----------------------------------------------------------------------
1164  CALL zuni2(zr, zi, fnu, kode, n, yr, yi, nw, nlast, fnul, tol, elim, alim)
1165  80 CONTINUE
1166  IF (nw.LT.0) GO TO 50
1167  nz = nw
1168  RETURN
1169  90 CONTINUE
1170  nlast = n
1171  RETURN
1172  END
1173 
1174 SUBROUTINE zuni1(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, TOL, ELIM, ALIM)
1175 USE utilit
1176 USE complex
1177 !***BEGIN PROLOGUE ZUNI1
1178 !***REFER TO ZBESI,ZBESK
1179 !
1180 ! ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC
1181 ! EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
1182 !
1183 ! FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
1184 ! EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
1185 ! NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
1186 ! FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
1187 ! Y(I)=CZERO FOR I=NLAST+1,N
1188 !
1189 !***ROUTINES CALLED ZUCHK,ZUNIK,ZUOIK,D1MACH,ZABS
1190 !***END PROLOGUE ZUNI1
1191 ! COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1,
1192 ! *S2,Y,Z,ZETA1,ZETA2
1193  DOUBLE PRECISION alim, aphi, ascle, bry, conei, coner, crsc, &
1194  cscl, csrr, cssr, cwrki, cwrkr, c1r, c2i, c2m, c2r, elim, fn, &
1195  fnu, fnul, phii, phir, rast, rs1, rzi, rzr, sti, str, sumi, &
1196  sumr, s1i, s1r, s2i, s2r, tol, yi, yr, zeroi, zeror, zeta1i, &
1197  zeta1r, zeta2i, zeta2r, zi, zr, cyr, cyi
1198  INTEGER i, iflag, init, k, kode, m, n, nd, nlast, nn, nuf, nw, nz
1199  dimension bry(3), yr(1), yi(1), cwrkr(16), cwrki(16), cssr(3), &
1200  csrr(3), cyr(2), cyi(2)
1201  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
1202 
1203  nz = 0
1204  nd = n
1205  nlast = 0
1206 !-----------------------------------------------------------------------
1207 ! COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
1208 ! NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
1209 ! EXP(ALIM)=EXP(ELIM)*TOL
1210 !-----------------------------------------------------------------------
1211  cscl = 1.0d0/tol
1212  crsc = tol
1213  cssr(1) = cscl
1214  cssr(2) = coner
1215  cssr(3) = crsc
1216  csrr(1) = crsc
1217  csrr(2) = coner
1218  csrr(3) = cscl
1219  bry(1) = 1.0d+3*d1mach(1)/tol
1220 !-----------------------------------------------------------------------
1221 ! CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
1222 !-----------------------------------------------------------------------
1223  fn = dmax1(fnu,1.0d0)
1224  init = 0
1225  CALL zunik(zr, zi, fn, 1, 1, tol, init, phir, phii, zeta1r, &
1226  zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
1227  IF (kode.EQ.1) GO TO 10
1228  str = zr + zeta2r
1229  sti = zi + zeta2i
1230  rast = fn/zabs(str,sti)
1231  str = str*rast*rast
1232  sti = -sti*rast*rast
1233  s1r = -zeta1r + str
1234  s1i = -zeta1i + sti
1235  GO TO 20
1236  10 CONTINUE
1237  s1r = -zeta1r + zeta2r
1238  s1i = -zeta1i + zeta2i
1239  20 CONTINUE
1240  rs1 = s1r
1241  IF (dabs(rs1).GT.elim) GO TO 130
1242  30 CONTINUE
1243  nn = min0(2,nd)
1244  DO 80 i=1,nn
1245  fn = fnu + dble(float(nd-i))
1246  init = 0
1247  CALL zunik(zr, zi, fn, 1, 0, tol, init, phir, phii, zeta1r, &
1248  zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
1249  IF (kode.EQ.1) GO TO 40
1250  str = zr + zeta2r
1251  sti = zi + zeta2i
1252  rast = fn/zabs(str,sti)
1253  str = str*rast*rast
1254  sti = -sti*rast*rast
1255  s1r = -zeta1r + str
1256  s1i = -zeta1i + sti + zi
1257  GO TO 50
1258  40 CONTINUE
1259  s1r = -zeta1r + zeta2r
1260  s1i = -zeta1i + zeta2i
1261  50 CONTINUE
1262 !-----------------------------------------------------------------------
1263 ! TEST FOR UNDERFLOW AND OVERFLOW
1264 !-----------------------------------------------------------------------
1265  rs1 = s1r
1266  IF (dabs(rs1).GT.elim) GO TO 110
1267  IF (i.EQ.1) iflag = 2
1268  IF (dabs(rs1).LT.alim) GO TO 60
1269 !-----------------------------------------------------------------------
1270 ! REFINE TEST AND SCALE
1271 !-----------------------------------------------------------------------
1272  aphi = zabs(phir,phii)
1273  rs1 = rs1 + dlog(aphi)
1274  IF (dabs(rs1).GT.elim) GO TO 110
1275  IF (i.EQ.1) iflag = 1
1276  IF (rs1.LT.0.0d0) GO TO 60
1277  IF (i.EQ.1) iflag = 3
1278  60 CONTINUE
1279 !-----------------------------------------------------------------------
1280 ! SCALE S1 IF CABS(S1).LT.ASCLE
1281 !-----------------------------------------------------------------------
1282  s2r = phir*sumr - phii*sumi
1283  s2i = phir*sumi + phii*sumr
1284  str = dexp(s1r)*cssr(iflag)
1285  s1r = str*dcos(s1i)
1286  s1i = str*dsin(s1i)
1287  str = s2r*s1r - s2i*s1i
1288  s2i = s2r*s1i + s2i*s1r
1289  s2r = str
1290  IF (iflag.NE.1) GO TO 70
1291  CALL zuchk(s2r, s2i, nw, bry(1), tol)
1292  IF (nw.NE.0) GO TO 110
1293  70 CONTINUE
1294  cyr(i) = s2r
1295  cyi(i) = s2i
1296  m = nd - i + 1
1297  yr(m) = s2r*csrr(iflag)
1298  yi(m) = s2i*csrr(iflag)
1299  80 CONTINUE
1300  IF (nd.LE.2) GO TO 100
1301  rast = 1.0d0/zabs(zr,zi)
1302  str = zr*rast
1303  sti = -zi*rast
1304  rzr = (str+str)*rast
1305  rzi = (sti+sti)*rast
1306  bry(2) = 1.0d0/bry(1)
1307  bry(3) = d1mach(2)
1308  s1r = cyr(1)
1309  s1i = cyi(1)
1310  s2r = cyr(2)
1311  s2i = cyi(2)
1312  c1r = csrr(iflag)
1313  ascle = bry(iflag)
1314  k = nd - 2
1315  fn = dble(float(k))
1316  DO 90 i=3,nd
1317  c2r = s2r
1318  c2i = s2i
1319  s2r = s1r + (fnu+fn)*(rzr*c2r-rzi*c2i)
1320  s2i = s1i + (fnu+fn)*(rzr*c2i+rzi*c2r)
1321  s1r = c2r
1322  s1i = c2i
1323  c2r = s2r*c1r
1324  c2i = s2i*c1r
1325  yr(k) = c2r
1326  yi(k) = c2i
1327  k = k - 1
1328  fn = fn - 1.0d0
1329  IF (iflag.GE.3) GO TO 90
1330  str = dabs(c2r)
1331  sti = dabs(c2i)
1332  c2m = dmax1(str,sti)
1333  IF (c2m.LE.ascle) GO TO 90
1334  iflag = iflag + 1
1335  ascle = bry(iflag)
1336  s1r = s1r*c1r
1337  s1i = s1i*c1r
1338  s2r = c2r
1339  s2i = c2i
1340  s1r = s1r*cssr(iflag)
1341  s1i = s1i*cssr(iflag)
1342  s2r = s2r*cssr(iflag)
1343  s2i = s2i*cssr(iflag)
1344  c1r = csrr(iflag)
1345  90 CONTINUE
1346  100 CONTINUE
1347  RETURN
1348 !-----------------------------------------------------------------------
1349 ! SET UNDERFLOW AND UPDATE PARAMETERS
1350 !-----------------------------------------------------------------------
1351  110 CONTINUE
1352  IF (rs1.GT.0.0d0) GO TO 120
1353  yr(nd) = zeror
1354  yi(nd) = zeroi
1355  nz = nz + 1
1356  nd = nd - 1
1357  IF (nd.EQ.0) GO TO 100
1358  CALL zuoik(zr, zi, fnu, kode, 1, nd, yr, yi, nuf, tol, elim, alim)
1359  IF (nuf.LT.0) GO TO 120
1360  nd = nd - nuf
1361  nz = nz + nuf
1362  IF (nd.EQ.0) GO TO 100
1363  fn = fnu + dble(float(nd-1))
1364  IF (fn.GE.fnul) GO TO 30
1365  nlast = nd
1366  RETURN
1367  120 CONTINUE
1368  nz = -1
1369  RETURN
1370  130 CONTINUE
1371  IF (rs1.GT.0.0d0) GO TO 120
1372  nz = n
1373  DO 140 i=1,n
1374  yr(i) = zeror
1375  yi(i) = zeroi
1376  140 CONTINUE
1377  RETURN
1378  END
1379 
1380 SUBROUTINE zuni2(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, TOL, ELIM, ALIM)
1381 USE utilit
1382 USE complex
1383 !***BEGIN PROLOGUE ZUNI2
1384 !***REFER TO ZBESI,ZBESK
1385 !
1386 ! ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
1387 ! UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
1388 ! OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
1389 !
1390 ! FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
1391 ! EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
1392 ! NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
1393 ! FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
1394 ! Y(I)=CZERO FOR I=NLAST+1,N
1395 !
1396 !***ROUTINES CALLED ZAIRY,ZUCHK,ZUNHJ,ZUOIK,D1MACH,ZABS
1397 !***END PROLOGUE ZUNI2
1398 ! COMPLEX AI,ARG,ASUM,BSUM,CFN,CI,CID,CIP,CONE,CRSC,CSCL,CSR,CSS,
1399 ! *CZERO,C1,C2,DAI,PHI,RZ,S1,S2,Y,Z,ZB,ZETA1,ZETA2,ZN
1400  DOUBLE PRECISION aarg, aic, aii, air, alim, ang, aphi, argi, &
1401  argr, ascle, asumi, asumr, bry, bsumi, bsumr, cidi, cipi, cipr, &
1402  conei, coner, crsc, cscl, csrr, cssr, c1r, c2i, c2m, c2r, daii, &
1403  dair, elim, fn, fnu, fnul, hpi, phii, phir, rast, raz, rs1, rzi, &
1404  rzr, sti, str, s1i, s1r, s2i, s2r, tol, yi, yr, zbi, zbr, zeroi, &
1405  zeror, zeta1i, zeta1r, zeta2i, zeta2r, zi, zni, znr, zr, cyr, cyi
1406  INTEGER i, iflag, in, inu, j, k, kode, n, nai, nd, ndai, nlast, &
1407  nn, nuf, nw, nz, idum
1408  dimension bry(3), yr(1), yi(1), cipr(4), cipi(4), cssr(3), &
1409  csrr(3), cyr(2), cyi(2)
1410  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
1411  DATA cipr(1),cipi(1),cipr(2),cipi(2),cipr(3),cipi(3),cipr(4), &
1412  cipi(4)/ 1.0d0,0.0d0, 0.0d0,1.0d0, -1.0d0,0.0d0, 0.0d0,-1.0d0/
1413  DATA hpi, aic /1.57079632679489662d+00, 1.265512123484645396d+00/
1414 
1415  nz = 0
1416  nd = n
1417  nlast = 0
1418 !-----------------------------------------------------------------------
1419 ! COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
1420 ! NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
1421 ! EXP(ALIM)=EXP(ELIM)*TOL
1422 !-----------------------------------------------------------------------
1423  cscl = 1.0d0/tol
1424  crsc = tol
1425  cssr(1) = cscl
1426  cssr(2) = coner
1427  cssr(3) = crsc
1428  csrr(1) = crsc
1429  csrr(2) = coner
1430  csrr(3) = cscl
1431  bry(1) = 1.0d+3*d1mach(1)/tol
1432 !-----------------------------------------------------------------------
1433 ! ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
1434 !-----------------------------------------------------------------------
1435  znr = zi
1436  zni = -zr
1437  zbr = zr
1438  zbi = zi
1439  cidi = -coner
1440  inu = int(sngl(fnu))
1441  ang = hpi*(fnu-dble(float(inu)))
1442  c2r = dcos(ang)
1443  c2i = dsin(ang)
1444  in = inu + n - 1
1445  in = mod(in,4) + 1
1446  str = c2r*cipr(in) - c2i*cipi(in)
1447  c2i = c2r*cipi(in) + c2i*cipr(in)
1448  c2r = str
1449  IF (zi.GT.0.0d0) GO TO 10
1450  znr = -znr
1451  zbi = -zbi
1452  cidi = -cidi
1453  c2i = -c2i
1454  10 CONTINUE
1455 !-----------------------------------------------------------------------
1456 ! CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
1457 !-----------------------------------------------------------------------
1458  fn = dmax1(fnu,1.0d0)
1459  CALL zunhj(znr, zni, fn, 1, tol, phir, phii, argr, argi, zeta1r, &
1460  zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
1461  IF (kode.EQ.1) GO TO 20
1462  str = zbr + zeta2r
1463  sti = zbi + zeta2i
1464  rast = fn/zabs(str,sti)
1465  str = str*rast*rast
1466  sti = -sti*rast*rast
1467  s1r = -zeta1r + str
1468  s1i = -zeta1i + sti
1469  GO TO 30
1470  20 CONTINUE
1471  s1r = -zeta1r + zeta2r
1472  s1i = -zeta1i + zeta2i
1473  30 CONTINUE
1474  rs1 = s1r
1475  IF (dabs(rs1).GT.elim) GO TO 150
1476  40 CONTINUE
1477  nn = min0(2,nd)
1478  DO 90 i=1,nn
1479  fn = fnu + dble(float(nd-i))
1480  CALL zunhj(znr, zni, fn, 0, tol, phir, phii, argr, argi, &
1481  zeta1r, zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
1482  IF (kode.EQ.1) GO TO 50
1483  str = zbr + zeta2r
1484  sti = zbi + zeta2i
1485  rast = fn/zabs(str,sti)
1486  str = str*rast*rast
1487  sti = -sti*rast*rast
1488  s1r = -zeta1r + str
1489  s1i = -zeta1i + sti + dabs(zi)
1490  GO TO 60
1491  50 CONTINUE
1492  s1r = -zeta1r + zeta2r
1493  s1i = -zeta1i + zeta2i
1494  60 CONTINUE
1495 !-----------------------------------------------------------------------
1496 ! TEST FOR UNDERFLOW AND OVERFLOW
1497 !-----------------------------------------------------------------------
1498  rs1 = s1r
1499  IF (dabs(rs1).GT.elim) GO TO 120
1500  IF (i.EQ.1) iflag = 2
1501  IF (dabs(rs1).LT.alim) GO TO 70
1502 !-----------------------------------------------------------------------
1503 ! REFINE TEST AND SCALE
1504 !-----------------------------------------------------------------------
1505  aphi = zabs(phir,phii)
1506  aarg = zabs(argr,argi)
1507  rs1 = rs1 + dlog(aphi) - 0.25d0*dlog(aarg) - aic
1508  IF (dabs(rs1).GT.elim) GO TO 120
1509  IF (i.EQ.1) iflag = 1
1510  IF (rs1.LT.0.0d0) GO TO 70
1511  IF (i.EQ.1) iflag = 3
1512  70 CONTINUE
1513 !-----------------------------------------------------------------------
1514 ! SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
1515 ! EXPONENT EXTREMES
1516 !-----------------------------------------------------------------------
1517  CALL zairy(argr, argi, 0, 2, air, aii, nai, idum)
1518  CALL zairy(argr, argi, 1, 2, dair, daii, ndai, idum)
1519  str = dair*bsumr - daii*bsumi
1520  sti = dair*bsumi + daii*bsumr
1521  str = str + (air*asumr-aii*asumi)
1522  sti = sti + (air*asumi+aii*asumr)
1523  s2r = phir*str - phii*sti
1524  s2i = phir*sti + phii*str
1525  str = dexp(s1r)*cssr(iflag)
1526  s1r = str*dcos(s1i)
1527  s1i = str*dsin(s1i)
1528  str = s2r*s1r - s2i*s1i
1529  s2i = s2r*s1i + s2i*s1r
1530  s2r = str
1531  IF (iflag.NE.1) GO TO 80
1532  CALL zuchk(s2r, s2i, nw, bry(1), tol)
1533  IF (nw.NE.0) GO TO 120
1534  80 CONTINUE
1535  IF (zi.LE.0.0d0) s2i = -s2i
1536  str = s2r*c2r - s2i*c2i
1537  s2i = s2r*c2i + s2i*c2r
1538  s2r = str
1539  cyr(i) = s2r
1540  cyi(i) = s2i
1541  j = nd - i + 1
1542  yr(j) = s2r*csrr(iflag)
1543  yi(j) = s2i*csrr(iflag)
1544  str = -c2i*cidi
1545  c2i = c2r*cidi
1546  c2r = str
1547  90 CONTINUE
1548  IF (nd.LE.2) GO TO 110
1549  raz = 1.0d0/zabs(zr,zi)
1550  str = zr*raz
1551  sti = -zi*raz
1552  rzr = (str+str)*raz
1553  rzi = (sti+sti)*raz
1554  bry(2) = 1.0d0/bry(1)
1555  bry(3) = d1mach(2)
1556  s1r = cyr(1)
1557  s1i = cyi(1)
1558  s2r = cyr(2)
1559  s2i = cyi(2)
1560  c1r = csrr(iflag)
1561  ascle = bry(iflag)
1562  k = nd - 2
1563  fn = dble(float(k))
1564  DO 100 i=3,nd
1565  c2r = s2r
1566  c2i = s2i
1567  s2r = s1r + (fnu+fn)*(rzr*c2r-rzi*c2i)
1568  s2i = s1i + (fnu+fn)*(rzr*c2i+rzi*c2r)
1569  s1r = c2r
1570  s1i = c2i
1571  c2r = s2r*c1r
1572  c2i = s2i*c1r
1573  yr(k) = c2r
1574  yi(k) = c2i
1575  k = k - 1
1576  fn = fn - 1.0d0
1577  IF (iflag.GE.3) GO TO 100
1578  str = dabs(c2r)
1579  sti = dabs(c2i)
1580  c2m = dmax1(str,sti)
1581  IF (c2m.LE.ascle) GO TO 100
1582  iflag = iflag + 1
1583  ascle = bry(iflag)
1584  s1r = s1r*c1r
1585  s1i = s1i*c1r
1586  s2r = c2r
1587  s2i = c2i
1588  s1r = s1r*cssr(iflag)
1589  s1i = s1i*cssr(iflag)
1590  s2r = s2r*cssr(iflag)
1591  s2i = s2i*cssr(iflag)
1592  c1r = csrr(iflag)
1593  100 CONTINUE
1594  110 CONTINUE
1595  RETURN
1596  120 CONTINUE
1597  IF (rs1.GT.0.0d0) GO TO 140
1598 !-----------------------------------------------------------------------
1599 ! SET UNDERFLOW AND UPDATE PARAMETERS
1600 !-----------------------------------------------------------------------
1601  yr(nd) = zeror
1602  yi(nd) = zeroi
1603  nz = nz + 1
1604  nd = nd - 1
1605  IF (nd.EQ.0) GO TO 110
1606  CALL zuoik(zr, zi, fnu, kode, 1, nd, yr, yi, nuf, tol, elim, alim)
1607  IF (nuf.LT.0) GO TO 140
1608  nd = nd - nuf
1609  nz = nz + nuf
1610  IF (nd.EQ.0) GO TO 110
1611  fn = fnu + dble(float(nd-1))
1612  IF (fn.LT.fnul) GO TO 130
1613  fn = cidi
1614  j = nuf + 1
1615  k = mod(j,4) + 1
1616  s1r = cipr(k)
1617  s1i = cipi(k)
1618  IF (fn.LT.0.0d0) s1i = -s1i
1619  str = c2r*s1r - c2i*s1i
1620  c2i = c2r*s1i + c2i*s1r
1621  c2r = str
1622  GO TO 40
1623  130 CONTINUE
1624  nlast = nd
1625  RETURN
1626  140 CONTINUE
1627  nz = -1
1628  RETURN
1629  150 CONTINUE
1630  IF (rs1.GT.0.0d0) GO TO 140
1631  nz = n
1632  DO 160 i=1,n
1633  yr(i) = zeror
1634  yi(i) = zeroi
1635  160 CONTINUE
1636  RETURN
1637  END
1638 
1639 SUBROUTINE zwrsk(ZRR, ZRI, FNU, KODE, N, YR, YI, NZ, CWR, CWI, TOL, ELIM, ALIM)
1640 USE utilit
1641 USE complex
1642 !***BEGIN PROLOGUE ZWRSK
1643 !***REFER TO ZBESI,ZBESK
1644 !
1645 ! ZWRSK COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY
1646 ! NORMALIZING THE I FUNCTION RATIOS FROM ZRATI BY THE WRONSKIAN
1647 !
1648 !***ROUTINES CALLED D1MACH,ZBKNU,ZRATI,ZABS
1649 !***END PROLOGUE ZWRSK
1650 ! COMPLEX CINU,CSCL,CT,CW,C1,C2,RCT,ST,Y,ZR
1651  DOUBLE PRECISION act, acw, alim, ascle, cinui, cinur, csclr, cti, &
1652  ctr, cwi, cwr, c1i, c1r, c2i, c2r, elim, fnu, pti, ptr, ract, &
1653  sti, str, tol, yi, yr, zri, zrr
1654  INTEGER i, kode, n, nw, nz
1655  dimension yr(1), yi(1), cwr(2), cwi(2)
1656 !-----------------------------------------------------------------------
1657 ! I(FNU+I-1,Z) BY BACKWARD RECURRENCE FOR RATIOS
1658 ! Y(I)=I(FNU+I,Z)/I(FNU+I-1,Z) FROM CRATI NORMALIZED BY THE
1659 ! WRONSKIAN WITH K(FNU,Z) AND K(FNU+1,Z) FROM CBKNU.
1660 !-----------------------------------------------------------------------
1661  nz = 0
1662  CALL zbknu(zrr, zri, fnu, kode, 2, cwr, cwi, nw, tol, elim, alim)
1663  IF (nw.NE.0) GO TO 50
1664  CALL zrati(zrr, zri, fnu, n, yr, yi, tol)
1665 !-----------------------------------------------------------------------
1666 ! RECUR FORWARD ON I(FNU+1,Z) = R(FNU,Z)*I(FNU,Z),
1667 ! R(FNU+J-1,Z)=Y(J), J=1,...,N
1668 !-----------------------------------------------------------------------
1669  cinur = 1.0d0
1670  cinui = 0.0d0
1671  IF (kode.EQ.1) GO TO 10
1672  cinur = dcos(zri)
1673  cinui = dsin(zri)
1674  10 CONTINUE
1675 !-----------------------------------------------------------------------
1676 ! ON LOW EXPONENT MACHINES THE K FUNCTIONS CAN BE CLOSE TO BOTH
1677 ! THE UNDER AND OVERFLOW LIMITS AND THE NORMALIZATION MUST BE
1678 ! SCALED TO PREVENT OVER OR UNDERFLOW. CUOIK HAS DETERMINED THAT
1679 ! THE RESULT IS ON SCALE.
1680 !-----------------------------------------------------------------------
1681  acw = zabs(cwr(2),cwi(2))
1682  ascle = 1.0d+3*d1mach(1)/tol
1683  csclr = 1.0d0
1684  IF (acw.GT.ascle) GO TO 20
1685  csclr = 1.0d0/tol
1686  GO TO 30
1687  20 CONTINUE
1688  ascle = 1.0d0/ascle
1689  IF (acw.LT.ascle) GO TO 30
1690  csclr = tol
1691  30 CONTINUE
1692  c1r = cwr(1)*csclr
1693  c1i = cwi(1)*csclr
1694  c2r = cwr(2)*csclr
1695  c2i = cwi(2)*csclr
1696  str = yr(1)
1697  sti = yi(1)
1698 !-----------------------------------------------------------------------
1699 ! CINU=CINU*(CONJG(CT)/CABS(CT))*(1.0D0/CABS(CT) PREVENTS
1700 ! UNDER- OR OVERFLOW PREMATURELY BY SQUARING CABS(CT)
1701 !-----------------------------------------------------------------------
1702  ptr = str*c1r - sti*c1i
1703  pti = str*c1i + sti*c1r
1704  ptr = ptr + c2r
1705  pti = pti + c2i
1706  ctr = zrr*ptr - zri*pti
1707  cti = zrr*pti + zri*ptr
1708  act = zabs(ctr,cti)
1709  ract = 1.0d0/act
1710  ctr = ctr*ract
1711  cti = -cti*ract
1712  ptr = cinur*ract
1713  pti = cinui*ract
1714  cinur = ptr*ctr - pti*cti
1715  cinui = ptr*cti + pti*ctr
1716  yr(1) = cinur*csclr
1717  yi(1) = cinui*csclr
1718  IF (n.EQ.1) RETURN
1719  DO 40 i=2,n
1720  ptr = str*cinur - sti*cinui
1721  cinui = str*cinui + sti*cinur
1722  cinur = ptr
1723  str = yr(i)
1724  sti = yi(i)
1725  yr(i) = cinur*csclr
1726  yi(i) = cinui*csclr
1727  40 CONTINUE
1728  RETURN
1729  50 CONTINUE
1730  nz = -1
1731  IF(nw.EQ.(-2)) nz=-2
1732  RETURN
1733 END
1734 
1735 SUBROUTINE zbknu(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, ALIM)
1736 USE utilit
1737 USE complex
1738 !***BEGIN PROLOGUE ZBKNU
1739 !***REFER TO ZBESI,ZBESK,ZAIRY,ZBESH
1740 !
1741 ! ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
1742 !
1743 !***ROUTINES CALLED DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,ZABS,ZDIV,
1744 ! ZEXP,ZLOG,ZMLT,ZSQRT
1745 !***END PROLOGUE ZBKNU
1746 !
1747  DOUBLE PRECISION aa, ak, alim, ascle, a1, a2, bb, bk, bry, caz, &
1748  cbi, cbr, cc, cchi, cchr, cki, ckr, coefi, coefr, conei, coner, &
1749  crscr, csclr, cshi, cshr, csi, csr, csrr, cssr, ctwoi, ctwor, &
1750  czeroi, czeror, czi, czr, dnu, dnu2, dpi, elim, etest, fc, fhs, &
1751  fi, fk, fks, fmui, fmur, fnu, fpi, fr, g1, g2, hpi, pi, pr, pti,&
1752  ptr, p1i, p1r, p2i, p2m, p2r, qi, qr, rak, rcaz, rthpi, rzi, &
1753  rzr, r1, s, smui, smur, spi, sti, str, s1i, s1r, s2i, s2r, tm, &
1754  tol, tth, t1, t2, yi, yr, zi, zr, elm, celmr, zdr, zdi, &
1755  as, alas, helim, cyr, cyi!, DGAMLN
1756  INTEGER i, iflag, inu, k, kflag, kk, kmax, kode, koded, n, nz, &
1757  idum, j, ic, inub, nw
1758  dimension yr(n), yi(n), cc(8), cssr(3), csrr(3), bry(3), cyr(2),&
1759  cyi(2)
1760 ! COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
1761 ! COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
1762 
1763  DATA kmax / 30 /
1764  DATA czeror,czeroi,coner,conei,ctwor,ctwoi,r1/ &
1765  0.0d0 , 0.0d0 , 1.0d0 , 0.0d0 , 2.0d0 , 0.0d0 , 2.0d0 /
1766  DATA dpi, rthpi, spi ,hpi, fpi, tth / &
1767  3.14159265358979324d0, 1.25331413731550025d0, &
1768  1.90985931710274403d0, 1.57079632679489662d0, &
1769  1.89769999331517738d0, 6.66666666666666666d-01/
1770  DATA cc(1), cc(2), cc(3), cc(4), cc(5), cc(6), cc(7), cc(8)/ &
1771  5.77215664901532861d-01, -4.20026350340952355d-02, &
1772  -4.21977345555443367d-02, 7.21894324666309954d-03, &
1773  -2.15241674114950973d-04, -2.01348547807882387d-05, &
1774  1.13302723198169588d-06, 6.11609510448141582d-09/
1775 
1776  caz = zabs(zr,zi)
1777  csclr = 1.0d0/tol
1778  crscr = tol
1779  cssr(1) = csclr
1780  cssr(2) = 1.0d0
1781  cssr(3) = crscr
1782  csrr(1) = crscr
1783  csrr(2) = 1.0d0
1784  csrr(3) = csclr
1785  bry(1) = 1.0d+3*d1mach(1)/tol
1786  bry(2) = 1.0d0/bry(1)
1787  bry(3) = d1mach(2)
1788  nz = 0
1789  iflag = 0
1790  koded = kode
1791  rcaz = 1.0d0/caz
1792  str = zr*rcaz
1793  sti = -zi*rcaz
1794  rzr = (str+str)*rcaz
1795  rzi = (sti+sti)*rcaz
1796  inu = int(sngl(fnu+0.5d0))
1797  dnu = fnu - dble(float(inu))
1798  IF (dabs(dnu).EQ.0.5d0) GO TO 110
1799  dnu2 = 0.0d0
1800  IF (dabs(dnu).GT.tol) dnu2 = dnu*dnu
1801  IF (caz.GT.r1) GO TO 110
1802 !-----------------------------------------------------------------------
1803 ! SERIES FOR CABS(Z).LE.R1
1804 !-----------------------------------------------------------------------
1805  fc = 1.0d0
1806  CALL zlog(rzr, rzi, smur, smui, idum)
1807  fmur = smur*dnu
1808  fmui = smui*dnu
1809  CALL zshch(fmur, fmui, cshr, cshi, cchr, cchi)
1810  IF (dnu.EQ.0.0d0) GO TO 10
1811  fc = dnu*dpi
1812  fc = fc/dsin(fc)
1813  smur = cshr/dnu
1814  smui = cshi/dnu
1815  10 CONTINUE
1816  a2 = 1.0d0 + dnu
1817 !-----------------------------------------------------------------------
1818 ! GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
1819 !-----------------------------------------------------------------------
1820  t2 = dexp(-dgamln(a2,idum))
1821  t1 = 1.0d0/(t2*fc)
1822  IF (dabs(dnu).GT.0.1d0) GO TO 40
1823 !-----------------------------------------------------------------------
1824 ! SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
1825 !-----------------------------------------------------------------------
1826  ak = 1.0d0
1827  s = cc(1)
1828  DO 20 k=2,8
1829  ak = ak*dnu2
1830  tm = cc(k)*ak
1831  s = s + tm
1832  IF (dabs(tm).LT.tol) GO TO 30
1833  20 CONTINUE
1834  30 g1 = -s
1835  GO TO 50
1836  40 CONTINUE
1837  g1 = (t1-t2)/(dnu+dnu)
1838  50 CONTINUE
1839  g2 = (t1+t2)*0.5d0
1840  fr = fc*(cchr*g1+smur*g2)
1841  fi = fc*(cchi*g1+smui*g2)
1842  CALL zexp(fmur, fmui, str, sti)
1843  pr = 0.5d0*str/t2
1844  pi = 0.5d0*sti/t2
1845  CALL zdiv(0.5d0, 0.0d0, str, sti, ptr, pti)
1846  qr = ptr/t1
1847  qi = pti/t1
1848  s1r = fr
1849  s1i = fi
1850  s2r = pr
1851  s2i = pi
1852  ak = 1.0d0
1853  a1 = 1.0d0
1854  ckr = coner
1855  cki = conei
1856  bk = 1.0d0 - dnu2
1857  IF (inu.GT.0 .OR. n.GT.1) GO TO 80
1858 !-----------------------------------------------------------------------
1859 ! GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
1860 !-----------------------------------------------------------------------
1861  IF (caz.LT.tol) GO TO 70
1862  CALL zmlt(zr, zi, zr, zi, czr, czi)
1863  czr = 0.25d0*czr
1864  czi = 0.25d0*czi
1865  t1 = 0.25d0*caz*caz
1866  60 CONTINUE
1867  fr = (fr*ak+pr+qr)/bk
1868  fi = (fi*ak+pi+qi)/bk
1869  str = 1.0d0/(ak-dnu)
1870  pr = pr*str
1871  pi = pi*str
1872  str = 1.0d0/(ak+dnu)
1873  qr = qr*str
1874  qi = qi*str
1875  str = ckr*czr - cki*czi
1876  rak = 1.0d0/ak
1877  cki = (ckr*czi+cki*czr)*rak
1878  ckr = str*rak
1879  s1r = ckr*fr - cki*fi + s1r
1880  s1i = ckr*fi + cki*fr + s1i
1881  a1 = a1*t1*rak
1882  bk = bk + ak + ak + 1.0d0
1883  ak = ak + 1.0d0
1884  IF (a1.GT.tol) GO TO 60
1885  70 CONTINUE
1886  yr(1) = s1r
1887  yi(1) = s1i
1888  IF (koded.EQ.1) RETURN
1889  CALL zexp(zr, zi, str, sti)
1890  CALL zmlt(s1r, s1i, str, sti, yr(1), yi(1))
1891  RETURN
1892 !-----------------------------------------------------------------------
1893 ! GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
1894 !-----------------------------------------------------------------------
1895  80 CONTINUE
1896  IF (caz.LT.tol) GO TO 100
1897  CALL zmlt(zr, zi, zr, zi, czr, czi)
1898  czr = 0.25d0*czr
1899  czi = 0.25d0*czi
1900  t1 = 0.25d0*caz*caz
1901  90 CONTINUE
1902  fr = (fr*ak+pr+qr)/bk
1903  fi = (fi*ak+pi+qi)/bk
1904  str = 1.0d0/(ak-dnu)
1905  pr = pr*str
1906  pi = pi*str
1907  str = 1.0d0/(ak+dnu)
1908  qr = qr*str
1909  qi = qi*str
1910  str = ckr*czr - cki*czi
1911  rak = 1.0d0/ak
1912  cki = (ckr*czi+cki*czr)*rak
1913  ckr = str*rak
1914  s1r = ckr*fr - cki*fi + s1r
1915  s1i = ckr*fi + cki*fr + s1i
1916  str = pr - fr*ak
1917  sti = pi - fi*ak
1918  s2r = ckr*str - cki*sti + s2r
1919  s2i = ckr*sti + cki*str + s2i
1920  a1 = a1*t1*rak
1921  bk = bk + ak + ak + 1.0d0
1922  ak = ak + 1.0d0
1923  IF (a1.GT.tol) GO TO 90
1924  100 CONTINUE
1925  kflag = 2
1926  a1 = fnu + 1.0d0
1927  ak = a1*dabs(smur)
1928  IF (ak.GT.alim) kflag = 3
1929  str = cssr(kflag)
1930  p2r = s2r*str
1931  p2i = s2i*str
1932  CALL zmlt(p2r, p2i, rzr, rzi, s2r, s2i)
1933  s1r = s1r*str
1934  s1i = s1i*str
1935  IF (koded.EQ.1) GO TO 210
1936  CALL zexp(zr, zi, fr, fi)
1937  CALL zmlt(s1r, s1i, fr, fi, s1r, s1i)
1938  CALL zmlt(s2r, s2i, fr, fi, s2r, s2i)
1939  GO TO 210
1940 !-----------------------------------------------------------------------
1941 ! IFLAG=0 MEANS NO UNDERFLOW OCCURRED
1942 ! IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
1943 ! KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
1944 ! RECURSION
1945 !-----------------------------------------------------------------------
1946  110 CONTINUE
1947  CALL zsqrt(zr, zi, str, sti)
1948  CALL zdiv(rthpi, czeroi, str, sti, coefr, coefi)
1949  kflag = 2
1950  IF (koded.EQ.2) GO TO 120
1951  IF (zr.GT.alim) GO TO 290
1952 ! BLANK LINE
1953  str = dexp(-zr)*cssr(kflag)
1954  sti = -str*dsin(zi)
1955  str = str*dcos(zi)
1956  CALL zmlt(coefr, coefi, str, sti, coefr, coefi)
1957  120 CONTINUE
1958  IF (dabs(dnu).EQ.0.5d0) GO TO 300
1959 !-----------------------------------------------------------------------
1960 ! MILLER ALGORITHM FOR CABS(Z).GT.R1
1961 !-----------------------------------------------------------------------
1962  ak = dcos(dpi*dnu)
1963  ak = dabs(ak)
1964  IF (ak.EQ.czeror) GO TO 300
1965  fhs = dabs(0.25d0-dnu2)
1966  IF (fhs.EQ.czeror) GO TO 300
1967 !-----------------------------------------------------------------------
1968 ! COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
1969 ! DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
1970 ! 12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
1971 ! TOL WHERE B IS THE BASE OF THE ARITHMETIC.
1972 !-----------------------------------------------------------------------
1973  t1 = dble(float(i1mach(14)-1))
1974  t1 = t1*d1mach(5)*3.321928094d0
1975  t1 = dmax1(t1,12.0d0)
1976  t1 = dmin1(t1,60.0d0)
1977  t2 = tth*t1 - 6.0d0
1978  IF (zr.NE.0.0d0) GO TO 130
1979  t1 = hpi
1980  GO TO 140
1981  130 CONTINUE
1982  t1 = datan(zi/zr)
1983  t1 = dabs(t1)
1984  140 CONTINUE
1985  IF (t2.GT.caz) GO TO 170
1986 !-----------------------------------------------------------------------
1987 ! FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
1988 !-----------------------------------------------------------------------
1989  etest = ak/(dpi*caz*tol)
1990  fk = coner
1991  IF (etest.LT.coner) GO TO 180
1992  fks = ctwor
1993  ckr = caz + caz + ctwor
1994  p1r = czeror
1995  p2r = coner
1996  DO 150 i=1,kmax
1997  ak = fhs/fks
1998  cbr = ckr/(fk+coner)
1999  ptr = p2r
2000  p2r = cbr*p2r - p1r*ak
2001  p1r = ptr
2002  ckr = ckr + ctwor
2003  fks = fks + fk + fk + ctwor
2004  fhs = fhs + fk + fk
2005  fk = fk + coner
2006  str = dabs(p2r)*fk
2007  IF (etest.LT.str) GO TO 160
2008  150 CONTINUE
2009  GO TO 310
2010  160 CONTINUE
2011  fk = fk + spi*t1*dsqrt(t2/caz)
2012  fhs = dabs(0.25d0-dnu2)
2013  GO TO 180
2014  170 CONTINUE
2015 !-----------------------------------------------------------------------
2016 ! COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
2017 !-----------------------------------------------------------------------
2018  a2 = dsqrt(caz)
2019  ak = fpi*ak/(tol*dsqrt(a2))
2020  aa = 3.0d0*t1/(1.0d0+caz)
2021  bb = 14.7d0*t1/(28.0d0+caz)
2022  ak = (dlog(ak)+caz*dcos(aa)/(1.0d0+0.008d0*caz))/dcos(bb)
2023  fk = 0.12125d0*ak*ak/caz + 1.5d0
2024  180 CONTINUE
2025 !-----------------------------------------------------------------------
2026 ! BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
2027 !-----------------------------------------------------------------------
2028  k = int(sngl(fk))
2029  fk = dble(float(k))
2030  fks = fk*fk
2031  p1r = czeror
2032  p1i = czeroi
2033  p2r = tol
2034  p2i = czeroi
2035  csr = p2r
2036  csi = p2i
2037  DO 190 i=1,k
2038  a1 = fks - fk
2039  ak = (fks+fk)/(a1+fhs)
2040  rak = 2.0d0/(fk+coner)
2041  cbr = (fk+zr)*rak
2042  cbi = zi*rak
2043  ptr = p2r
2044  pti = p2i
2045  p2r = (ptr*cbr-pti*cbi-p1r)*ak
2046  p2i = (pti*cbr+ptr*cbi-p1i)*ak
2047  p1r = ptr
2048  p1i = pti
2049  csr = csr + p2r
2050  csi = csi + p2i
2051  fks = a1 - fk + coner
2052  fk = fk - coner
2053  190 CONTINUE
2054 !-----------------------------------------------------------------------
2055 ! COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
2056 ! SCALING
2057 !-----------------------------------------------------------------------
2058  tm = zabs(csr,csi)
2059  ptr = 1.0d0/tm
2060  s1r = p2r*ptr
2061  s1i = p2i*ptr
2062  csr = csr*ptr
2063  csi = -csi*ptr
2064  CALL zmlt(coefr, coefi, s1r, s1i, str, sti)
2065  CALL zmlt(str, sti, csr, csi, s1r, s1i)
2066  IF (inu.GT.0 .OR. n.GT.1) GO TO 200
2067  zdr = zr
2068  zdi = zi
2069  IF(iflag.EQ.1) GO TO 270
2070  GO TO 240
2071  200 CONTINUE
2072 !-----------------------------------------------------------------------
2073 ! COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
2074 !-----------------------------------------------------------------------
2075  tm = zabs(p2r,p2i)
2076  ptr = 1.0d0/tm
2077  p1r = p1r*ptr
2078  p1i = p1i*ptr
2079  p2r = p2r*ptr
2080  p2i = -p2i*ptr
2081  CALL zmlt(p1r, p1i, p2r, p2i, ptr, pti)
2082  str = dnu + 0.5d0 - ptr
2083  sti = -pti
2084  CALL zdiv(str, sti, zr, zi, str, sti)
2085  str = str + 1.0d0
2086  CALL zmlt(str, sti, s1r, s1i, s2r, s2i)
2087 !-----------------------------------------------------------------------
2088 ! FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
2089 ! SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
2090 !-----------------------------------------------------------------------
2091  210 CONTINUE
2092  str = dnu + 1.0d0
2093  ckr = str*rzr
2094  cki = str*rzi
2095  IF (n.EQ.1) inu = inu - 1
2096  IF (inu.GT.0) GO TO 220
2097  IF (n.GT.1) GO TO 215
2098  s1r = s2r
2099  s1i = s2i
2100  215 CONTINUE
2101  zdr = zr
2102  zdi = zi
2103  IF(iflag.EQ.1) GO TO 270
2104  GO TO 240
2105  220 CONTINUE
2106  inub = 1
2107  IF(iflag.EQ.1) GO TO 261
2108  225 CONTINUE
2109  p1r = csrr(kflag)
2110  ascle = bry(kflag)
2111  DO 230 i=inub,inu
2112  str = s2r
2113  sti = s2i
2114  s2r = ckr*str - cki*sti + s1r
2115  s2i = ckr*sti + cki*str + s1i
2116  s1r = str
2117  s1i = sti
2118  ckr = ckr + rzr
2119  cki = cki + rzi
2120  IF (kflag.GE.3) GO TO 230
2121  p2r = s2r*p1r
2122  p2i = s2i*p1r
2123  str = dabs(p2r)
2124  sti = dabs(p2i)
2125  p2m = dmax1(str,sti)
2126  IF (p2m.LE.ascle) GO TO 230
2127  kflag = kflag + 1
2128  ascle = bry(kflag)
2129  s1r = s1r*p1r
2130  s1i = s1i*p1r
2131  s2r = p2r
2132  s2i = p2i
2133  str = cssr(kflag)
2134  s1r = s1r*str
2135  s1i = s1i*str
2136  s2r = s2r*str
2137  s2i = s2i*str
2138  p1r = csrr(kflag)
2139  230 CONTINUE
2140  IF (n.NE.1) GO TO 240
2141  s1r = s2r
2142  s1i = s2i
2143  240 CONTINUE
2144  str = csrr(kflag)
2145  yr(1) = s1r*str
2146  yi(1) = s1i*str
2147  IF (n.EQ.1) RETURN
2148  yr(2) = s2r*str
2149  yi(2) = s2i*str
2150  IF (n.EQ.2) RETURN
2151  kk = 2
2152  250 CONTINUE
2153  kk = kk + 1
2154  IF (kk.GT.n) RETURN
2155  p1r = csrr(kflag)
2156  ascle = bry(kflag)
2157  DO 260 i=kk,n
2158  p2r = s2r
2159  p2i = s2i
2160  s2r = ckr*p2r - cki*p2i + s1r
2161  s2i = cki*p2r + ckr*p2i + s1i
2162  s1r = p2r
2163  s1i = p2i
2164  ckr = ckr + rzr
2165  cki = cki + rzi
2166  p2r = s2r*p1r
2167  p2i = s2i*p1r
2168  yr(i) = p2r
2169  yi(i) = p2i
2170  IF (kflag.GE.3) GO TO 260
2171  str = dabs(p2r)
2172  sti = dabs(p2i)
2173  p2m = dmax1(str,sti)
2174  IF (p2m.LE.ascle) GO TO 260
2175  kflag = kflag + 1
2176  ascle = bry(kflag)
2177  s1r = s1r*p1r
2178  s1i = s1i*p1r
2179  s2r = p2r
2180  s2i = p2i
2181  str = cssr(kflag)
2182  s1r = s1r*str
2183  s1i = s1i*str
2184  s2r = s2r*str
2185  s2i = s2i*str
2186  p1r = csrr(kflag)
2187  260 CONTINUE
2188  RETURN
2189 !-----------------------------------------------------------------------
2190 ! IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
2191 !-----------------------------------------------------------------------
2192  261 CONTINUE
2193  helim = 0.5d0*elim
2194  elm = dexp(-elim)
2195  celmr = elm
2196  ascle = bry(1)
2197  zdr = zr
2198  zdi = zi
2199  ic = -1
2200  j = 2
2201  DO 262 i=1,inu
2202  str = s2r
2203  sti = s2i
2204  s2r = str*ckr-sti*cki+s1r
2205  s2i = sti*ckr+str*cki+s1i
2206  s1r = str
2207  s1i = sti
2208  ckr = ckr+rzr
2209  cki = cki+rzi
2210  as = zabs(s2r,s2i)
2211  alas = dlog(as)
2212  p2r = -zdr+alas
2213  IF(p2r.LT.(-elim)) GO TO 263
2214  CALL zlog(s2r,s2i,str,sti,idum)
2215  p2r = -zdr+str
2216  p2i = -zdi+sti
2217  p2m = dexp(p2r)/tol
2218  p1r = p2m*dcos(p2i)
2219  p1i = p2m*dsin(p2i)
2220  CALL zuchk(p1r,p1i,nw,ascle,tol)
2221  IF(nw.NE.0) GO TO 263
2222  j = 3 - j
2223  cyr(j) = p1r
2224  cyi(j) = p1i
2225  IF(ic.EQ.(i-1)) GO TO 264
2226  ic = i
2227  GO TO 262
2228  263 CONTINUE
2229  IF(alas.LT.helim) GO TO 262
2230  zdr = zdr-elim
2231  s1r = s1r*celmr
2232  s1i = s1i*celmr
2233  s2r = s2r*celmr
2234  s2i = s2i*celmr
2235  262 CONTINUE
2236  IF(n.NE.1) GO TO 270
2237  s1r = s2r
2238  s1i = s2i
2239  GO TO 270
2240  264 CONTINUE
2241  kflag = 1
2242  inub = i+1
2243  s2r = cyr(j)
2244  s2i = cyi(j)
2245  j = 3 - j
2246  s1r = cyr(j)
2247  s1i = cyi(j)
2248  IF(inub.LE.inu) GO TO 225
2249  IF(n.NE.1) GO TO 240
2250  s1r = s2r
2251  s1i = s2i
2252  GO TO 240
2253  270 CONTINUE
2254  yr(1) = s1r
2255  yi(1) = s1i
2256  IF(n.EQ.1) GO TO 280
2257  yr(2) = s2r
2258  yi(2) = s2i
2259  280 CONTINUE
2260  ascle = bry(1)
2261  CALL zkscl(zdr,zdi,fnu,n,yr,yi,nz,rzr,rzi,ascle,tol,elim)
2262  inu = n - nz
2263  IF (inu.LE.0) RETURN
2264  kk = nz + 1
2265  s1r = yr(kk)
2266  s1i = yi(kk)
2267  yr(kk) = s1r*csrr(1)
2268  yi(kk) = s1i*csrr(1)
2269  IF (inu.EQ.1) RETURN
2270  kk = nz + 2
2271  s2r = yr(kk)
2272  s2i = yi(kk)
2273  yr(kk) = s2r*csrr(1)
2274  yi(kk) = s2i*csrr(1)
2275  IF (inu.EQ.2) RETURN
2276  t2 = fnu + dble(float(kk-1))
2277  ckr = t2*rzr
2278  cki = t2*rzi
2279  kflag = 1
2280  GO TO 250
2281  290 CONTINUE
2282 !-----------------------------------------------------------------------
2283 ! SCALE BY DEXP(Z), IFLAG = 1 CASES
2284 !-----------------------------------------------------------------------
2285  koded = 2
2286  iflag = 1
2287  kflag = 2
2288  GO TO 120
2289 !-----------------------------------------------------------------------
2290 ! FNU=HALF ODD INTEGER CASE, DNU=-0.5
2291 !-----------------------------------------------------------------------
2292  300 CONTINUE
2293  s1r = coefr
2294  s1i = coefi
2295  s2r = coefr
2296  s2i = coefi
2297  GO TO 210
2298 
2299  310 CONTINUE
2300  nz=-2
2301  RETURN
2302 END
2303 
2304 SUBROUTINE zkscl(ZRR,ZRI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
2305 USE complex
2306 !***BEGIN PROLOGUE ZKSCL
2307 !***REFER TO ZBESK
2308 !
2309 ! SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
2310 ! ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
2311 ! RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
2312 !
2313 !***ROUTINES CALLED ZUCHK,ZABS,ZLOG
2314 !***END PROLOGUE ZKSCL
2315 ! COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM
2316  DOUBLE PRECISION acs, as, ascle, cki, ckr, csi, csr, cyi, &
2317  cyr, elim, fn, fnu, rzi, rzr, str, s1i, s1r, s2i, s2r, &
2318  tol, yi, yr, zeroi, zeror, zri, zrr, zdr, zdi, celmr, &
2319  elm, helim, alas
2320  INTEGER i, ic, idum, kk, n, nn, nw, nz
2321  dimension yr(1), yi(1), cyr(2), cyi(2)
2322  DATA zeror,zeroi / 0.0d0 , 0.0d0 /
2323 
2324  nz = 0
2325  ic = 0
2326  nn = min0(2,n)
2327  DO 10 i=1,nn
2328  s1r = yr(i)
2329  s1i = yi(i)
2330  cyr(i) = s1r
2331  cyi(i) = s1i
2332  as = zabs(s1r,s1i)
2333  acs = -zrr + dlog(as)
2334  nz = nz + 1
2335  yr(i) = zeror
2336  yi(i) = zeroi
2337  IF (acs.LT.(-elim)) GO TO 10
2338  CALL zlog(s1r, s1i, csr, csi, idum)
2339  csr = csr - zrr
2340  csi = csi - zri
2341  str = dexp(csr)/tol
2342  csr = str*dcos(csi)
2343  csi = str*dsin(csi)
2344  CALL zuchk(csr, csi, nw, ascle, tol)
2345  IF (nw.NE.0) GO TO 10
2346  yr(i) = csr
2347  yi(i) = csi
2348  ic = i
2349  nz = nz - 1
2350  10 CONTINUE
2351  IF (n.EQ.1) RETURN
2352  IF (ic.GT.1) GO TO 20
2353  yr(1) = zeror
2354  yi(1) = zeroi
2355  nz = 2
2356  20 CONTINUE
2357  IF (n.EQ.2) RETURN
2358  IF (nz.EQ.0) RETURN
2359  fn = fnu + 1.0d0
2360  ckr = fn*rzr
2361  cki = fn*rzi
2362  s1r = cyr(1)
2363  s1i = cyi(1)
2364  s2r = cyr(2)
2365  s2i = cyi(2)
2366  helim = 0.5d0*elim
2367  elm = dexp(-elim)
2368  celmr = elm
2369  zdr = zrr
2370  zdi = zri
2371 
2372 ! FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
2373 ! S2 GETS LARGER THAN EXP(ELIM/2)
2374 
2375  DO 30 i=3,n
2376  kk = i
2377  csr = s2r
2378  csi = s2i
2379  s2r = ckr*csr - cki*csi + s1r
2380  s2i = cki*csr + ckr*csi + s1i
2381  s1r = csr
2382  s1i = csi
2383  ckr = ckr + rzr
2384  cki = cki + rzi
2385  as = zabs(s2r,s2i)
2386  alas = dlog(as)
2387  acs = -zdr + alas
2388  nz = nz + 1
2389  yr(i) = zeror
2390  yi(i) = zeroi
2391  IF (acs.LT.(-elim)) GO TO 25
2392  CALL zlog(s2r, s2i, csr, csi, idum)
2393  csr = csr - zdr
2394  csi = csi - zdi
2395  str = dexp(csr)/tol
2396  csr = str*dcos(csi)
2397  csi = str*dsin(csi)
2398  CALL zuchk(csr, csi, nw, ascle, tol)
2399  IF (nw.NE.0) GO TO 25
2400  yr(i) = csr
2401  yi(i) = csi
2402  nz = nz - 1
2403  IF (ic.EQ.kk-1) GO TO 40
2404  ic = kk
2405  GO TO 30
2406  25 CONTINUE
2407  IF(alas.LT.helim) GO TO 30
2408  zdr = zdr - elim
2409  s1r = s1r*celmr
2410  s1i = s1i*celmr
2411  s2r = s2r*celmr
2412  s2i = s2i*celmr
2413  30 CONTINUE
2414  nz = n
2415  IF(ic.EQ.n) nz=n-1
2416  GO TO 45
2417  40 CONTINUE
2418  nz = kk - 2
2419  45 CONTINUE
2420  DO 50 i=1,nz
2421  yr(i) = zeror
2422  yi(i) = zeroi
2423  50 CONTINUE
2424  RETURN
2425 END
2426 
2427 SUBROUTINE zshch(ZR, ZI, CSHR, CSHI, CCHR, CCHI)
2428 !***BEGIN PROLOGUE ZSHCH
2429 !***REFER TO ZBESK,ZBESH
2430 !
2431 ! ZSHCH COMPUTES THE COMPLEX HYPERBOLI! FUNCTIONS CSH=SINH(X+I*Y)
2432 ! AND CCH=COSH(X+I*Y), WHERE I**2=-1.
2433 !
2434 !***ROUTINES CALLED (NONE)
2435 !***END PROLOGUE ZSHCH
2436 !
2437  DOUBLE PRECISION cchi, cchr, ch, cn, cshi, cshr, sh, sn, zi, zr, dcosh, dsinh
2438  sh = dsinh(zr)
2439  ch = dcosh(zr)
2440  sn = dsin(zi)
2441  cn = dcos(zi)
2442  cshr = sh*cn
2443  cshi = ch*sn
2444  cchr = ch*cn
2445  cchi = sh*sn
2446  RETURN
2447 END
2448 
2449 SUBROUTINE zmlri(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
2450 USE utilit
2451 USE complex
2452 !***BEGIN PROLOGUE ZMLRI
2453 !***REFER TO ZBESI,ZBESK
2454 !
2455 ! ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
2456 ! MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
2457 !
2458 !***ROUTINES CALLED DGAMLN,D1MACH,ZABS,ZEXP,ZLOG,ZMLT
2459 !***END PROLOGUE ZMLRI
2460 ! COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
2461  DOUBLE PRECISION ack, ak, ap, at, az, bk, cki, ckr, cnormi, &
2462  cnormr, conei, coner, fkap, fkk, flam, fnf, fnu, pti, ptr, p1i, &
2463  p1r, p2i, p2r, raz, rho, rho2, rzi, rzr, scle, sti, str, sumi, &
2464  sumr, tfnf, tol, tst, yi, yr, zeroi, zeror, zi, zr!, DGAMLN
2465  INTEGER i, iaz, idum, ifnu, inu, itime, k, kk, km, kode, m, n, nz
2466  dimension yr(1), yi(1)
2467  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
2468  scle = d1mach(1)/tol
2469  nz=0
2470  az = zabs(zr,zi)
2471  iaz = int(sngl(az))
2472  ifnu = int(sngl(fnu))
2473  inu = ifnu + n - 1
2474  at = dble(float(iaz)) + 1.0d0
2475  raz = 1.0d0/az
2476  str = zr*raz
2477  sti = -zi*raz
2478  ckr = str*at*raz
2479  cki = sti*at*raz
2480  rzr = (str+str)*raz
2481  rzi = (sti+sti)*raz
2482  p1r = zeror
2483  p1i = zeroi
2484  p2r = coner
2485  p2i = conei
2486  ack = (at+1.0d0)*raz
2487  rho = ack + dsqrt(ack*ack-1.0d0)
2488  rho2 = rho*rho
2489  tst = (rho2+rho2)/((rho2-1.0d0)*(rho-1.0d0))
2490  tst = tst/tol
2491 !-----------------------------------------------------------------------
2492 ! COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
2493 !-----------------------------------------------------------------------
2494  ak = at
2495  DO 10 i=1,80
2496  ptr = p2r
2497  pti = p2i
2498  p2r = p1r - (ckr*ptr-cki*pti)
2499  p2i = p1i - (cki*ptr+ckr*pti)
2500  p1r = ptr
2501  p1i = pti
2502  ckr = ckr + rzr
2503  cki = cki + rzi
2504  ap = zabs(p2r,p2i)
2505  IF (ap.GT.tst*ak*ak) GO TO 20
2506  ak = ak + 1.0d0
2507  10 CONTINUE
2508  GO TO 110
2509  20 CONTINUE
2510  i = i + 1
2511  k = 0
2512  IF (inu.LT.iaz) GO TO 40
2513 !-----------------------------------------------------------------------
2514 ! COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
2515 !-----------------------------------------------------------------------
2516  p1r = zeror
2517  p1i = zeroi
2518  p2r = coner
2519  p2i = conei
2520  at = dble(float(inu)) + 1.0d0
2521  str = zr*raz
2522  sti = -zi*raz
2523  ckr = str*at*raz
2524  cki = sti*at*raz
2525  ack = at*raz
2526  tst = dsqrt(ack/tol)
2527  itime = 1
2528  DO 30 k=1,80
2529  ptr = p2r
2530  pti = p2i
2531  p2r = p1r - (ckr*ptr-cki*pti)
2532  p2i = p1i - (ckr*pti+cki*ptr)
2533  p1r = ptr
2534  p1i = pti
2535  ckr = ckr + rzr
2536  cki = cki + rzi
2537  ap = zabs(p2r,p2i)
2538  IF (ap.LT.tst) GO TO 30
2539  IF (itime.EQ.2) GO TO 40
2540  ack = zabs(ckr,cki)
2541  flam = ack + dsqrt(ack*ack-1.0d0)
2542  fkap = ap/zabs(p1r,p1i)
2543  rho = dmin1(flam,fkap)
2544  tst = tst*dsqrt(rho/(rho*rho-1.0d0))
2545  itime = 2
2546  30 CONTINUE
2547  GO TO 110
2548  40 CONTINUE
2549 !-----------------------------------------------------------------------
2550 ! BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
2551 !-----------------------------------------------------------------------
2552  k = k + 1
2553  kk = max0(i+iaz,k+inu)
2554  fkk = dble(float(kk))
2555  p1r = zeror
2556  p1i = zeroi
2557 !-----------------------------------------------------------------------
2558 ! SCALE P2 AND SUM BY SCLE
2559 !-----------------------------------------------------------------------
2560  p2r = scle
2561  p2i = zeroi
2562  fnf = fnu - dble(float(ifnu))
2563  tfnf = fnf + fnf
2564  bk = dgamln(fkk+tfnf+1.0d0,idum) - dgamln(fkk+1.0d0,idum) - &
2565  dgamln(tfnf+1.0d0,idum)
2566  bk = dexp(bk)
2567  sumr = zeror
2568  sumi = zeroi
2569  km = kk - inu
2570  DO 50 i=1,km
2571  ptr = p2r
2572  pti = p2i
2573  p2r = p1r + (fkk+fnf)*(rzr*ptr-rzi*pti)
2574  p2i = p1i + (fkk+fnf)*(rzi*ptr+rzr*pti)
2575  p1r = ptr
2576  p1i = pti
2577  ak = 1.0d0 - tfnf/(fkk+tfnf)
2578  ack = bk*ak
2579  sumr = sumr + (ack+bk)*p1r
2580  sumi = sumi + (ack+bk)*p1i
2581  bk = ack
2582  fkk = fkk - 1.0d0
2583  50 CONTINUE
2584  yr(n) = p2r
2585  yi(n) = p2i
2586  IF (n.EQ.1) GO TO 70
2587  DO 60 i=2,n
2588  ptr = p2r
2589  pti = p2i
2590  p2r = p1r + (fkk+fnf)*(rzr*ptr-rzi*pti)
2591  p2i = p1i + (fkk+fnf)*(rzi*ptr+rzr*pti)
2592  p1r = ptr
2593  p1i = pti
2594  ak = 1.0d0 - tfnf/(fkk+tfnf)
2595  ack = bk*ak
2596  sumr = sumr + (ack+bk)*p1r
2597  sumi = sumi + (ack+bk)*p1i
2598  bk = ack
2599  fkk = fkk - 1.0d0
2600  m = n - i + 1
2601  yr(m) = p2r
2602  yi(m) = p2i
2603  60 CONTINUE
2604  70 CONTINUE
2605  IF (ifnu.LE.0) GO TO 90
2606  DO 80 i=1,ifnu
2607  ptr = p2r
2608  pti = p2i
2609  p2r = p1r + (fkk+fnf)*(rzr*ptr-rzi*pti)
2610  p2i = p1i + (fkk+fnf)*(rzr*pti+rzi*ptr)
2611  p1r = ptr
2612  p1i = pti
2613  ak = 1.0d0 - tfnf/(fkk+tfnf)
2614  ack = bk*ak
2615  sumr = sumr + (ack+bk)*p1r
2616  sumi = sumi + (ack+bk)*p1i
2617  bk = ack
2618  fkk = fkk - 1.0d0
2619  80 CONTINUE
2620  90 CONTINUE
2621  ptr = zr
2622  pti = zi
2623  IF (kode.EQ.2) ptr = zeror
2624  CALL zlog(rzr, rzi, str, sti, idum)
2625  p1r = -fnf*str + ptr
2626  p1i = -fnf*sti + pti
2627  ap = dgamln(1.0d0+fnf,idum)
2628  ptr = p1r - ap
2629  pti = p1i
2630 !-----------------------------------------------------------------------
2631 ! THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
2632 ! IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
2633 !-----------------------------------------------------------------------
2634  p2r = p2r + sumr
2635  p2i = p2i + sumi
2636  ap = zabs(p2r,p2i)
2637  p1r = 1.0d0/ap
2638  CALL zexp(ptr, pti, str, sti)
2639  ckr = str*p1r
2640  cki = sti*p1r
2641  ptr = p2r*p1r
2642  pti = -p2i*p1r
2643  CALL zmlt(ckr, cki, ptr, pti, cnormr, cnormi)
2644  DO 100 i=1,n
2645  str = yr(i)*cnormr - yi(i)*cnormi
2646  yi(i) = yr(i)*cnormi + yi(i)*cnormr
2647  yr(i) = str
2648  100 CONTINUE
2649  RETURN
2650  110 CONTINUE
2651  nz=-2
2652  RETURN
2653 END
2654 
2655 DOUBLE PRECISION FUNCTION dgamln(Z,IERR)
2656 USE utilit
2657 !***BEGIN PROLOGUE DGAMLN
2658 !***DATE WRITTEN 830501 (YYMMDD)
2659 !***REVISION DATE 830501 (YYMMDD)
2660 !***CATEGORY NO. B5F
2661 !***KEYWORDS GAMMA FUNCTION,LOGARITHM OF GAMMA FUNCTION
2662 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
2663 !***PURPOSE TO COMPUTE THE LOGARITHM OF THE GAMMA FUNCTION
2664 !***DESCRIPTION
2665 !
2666 ! **** A DOUBLE PRECISION ROUTINE ****
2667 ! DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR
2668 ! Z.GT.0. THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES
2669 ! GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION
2670 ! G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN. THE FUNCTION WAS MADE AS
2671 ! PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE
2672 ! 10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18)
2673 ! LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.
2674 !
2675 ! SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100
2676 ! VALUES IS USED FOR SPEED OF EXECUTION.
2677 !
2678 ! DESCRIPTION OF ARGUMENTS
2679 !
2680 ! INPUT Z IS D0UBLE PRECISION
2681 ! Z - ARGUMENT, Z.GT.0.0D0
2682 !
2683 ! OUTPUT DGAMLN IS DOUBLE PRECISION
2684 ! DGAMLN - NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
2685 ! IERR - ERROR FLAG
2686 ! IERR=0, NORMAL RETURN, COMPUTATION COMPLETED
2687 ! IERR=1, Z.LE.0.0D0, NO COMPUTATION
2688 !
2689 !
2690 !***REFERENCES COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
2691 ! BY D. E. AMOS, SAND83-0083, MAY, 1983.
2692 !***ROUTINES CALLED I1MACH,D1MACH
2693 !***END PROLOGUE DGAMLN
2694  DOUBLE PRECISION cf, con, fln, fz, gln, rln, s, tlg, trm, tst, &
2695  t1, wdtol, z, zdmy, zinc, zm, zmin, zp, zsq
2696  INTEGER i, ierr, i1m, k, mz, nz
2697  dimension cf(22), gln(100)
2698 ! LNGAMMA(N), N=1,100
2699  DATA gln(1), gln(2), gln(3), gln(4), gln(5), gln(6), gln(7), &
2700  gln(8), gln(9), gln(10), gln(11), gln(12), gln(13), gln(14), &
2701  gln(15), gln(16), gln(17), gln(18), gln(19), gln(20), &
2702  gln(21), gln(22)/ &
2703  0.00000000000000000d+00, 0.00000000000000000d+00, &
2704  6.93147180559945309d-01, 1.79175946922805500d+00, &
2705  3.17805383034794562d+00, 4.78749174278204599d+00, &
2706  6.57925121201010100d+00, 8.52516136106541430d+00, &
2707  1.06046029027452502d+01, 1.28018274800814696d+01, &
2708  1.51044125730755153d+01, 1.75023078458738858d+01, &
2709  1.99872144956618861d+01, 2.25521638531234229d+01, &
2710  2.51912211827386815d+01, 2.78992713838408916d+01, &
2711  3.06718601060806728d+01, 3.35050734501368889d+01, &
2712  3.63954452080330536d+01, 3.93398841871994940d+01, &
2713  4.23356164607534850d+01, 4.53801388984769080d+01/
2714  DATA gln(23), gln(24), gln(25), gln(26), gln(27), gln(28), &
2715  gln(29), gln(30), gln(31), gln(32), gln(33), gln(34), &
2716  gln(35), gln(36), gln(37), gln(38), gln(39), gln(40), &
2717  gln(41), gln(42), gln(43), gln(44)/ &
2718  4.84711813518352239d+01, 5.16066755677643736d+01, &
2719  5.47847293981123192d+01, 5.80036052229805199d+01, &
2720  6.12617017610020020d+01, 6.45575386270063311d+01, &
2721  6.78897431371815350d+01, 7.12570389671680090d+01, &
2722  7.46582363488301644d+01, 7.80922235533153106d+01, &
2723  8.15579594561150372d+01, 8.50544670175815174d+01, &
2724  8.85808275421976788d+01, 9.21361756036870925d+01, &
2725  9.57196945421432025d+01, 9.93306124547874269d+01, &
2726  1.02968198614513813d+02, 1.06631760260643459d+02, &
2727  1.10320639714757395d+02, 1.14034211781461703d+02, &
2728  1.17771881399745072d+02, 1.21533081515438634d+02/
2729  DATA gln(45), gln(46), gln(47), gln(48), gln(49), gln(50), &
2730  gln(51), gln(52), gln(53), gln(54), gln(55), gln(56), &
2731  gln(57), gln(58), gln(59), gln(60), gln(61), gln(62), &
2732  gln(63), gln(64), gln(65), gln(66)/ &
2733  1.25317271149356895d+02, 1.29123933639127215d+02, &
2734  1.32952575035616310d+02, 1.36802722637326368d+02, &
2735  1.40673923648234259d+02, 1.44565743946344886d+02, &
2736  1.48477766951773032d+02, 1.52409592584497358d+02, &
2737  1.56360836303078785d+02, 1.60331128216630907d+02, &
2738  1.64320112263195181d+02, 1.68327445448427652d+02, &
2739  1.72352797139162802d+02, 1.76395848406997352d+02, &
2740  1.80456291417543771d+02, 1.84533828861449491d+02, &
2741  1.88628173423671591d+02, 1.92739047287844902d+02, &
2742  1.96866181672889994d+02, 2.01009316399281527d+02, &
2743  2.05168199482641199d+02, 2.09342586752536836d+02/
2744  DATA gln(67), gln(68), gln(69), gln(70), gln(71), gln(72), &
2745  gln(73), gln(74), gln(75), gln(76), gln(77), gln(78), &
2746  gln(79), gln(80), gln(81), gln(82), gln(83), gln(84), &
2747  gln(85), gln(86), gln(87), gln(88)/ &
2748  2.13532241494563261d+02, 2.17736934113954227d+02, &
2749  2.21956441819130334d+02, 2.26190548323727593d+02, &
2750  2.30439043565776952d+02, 2.34701723442818268d+02, &
2751  2.38978389561834323d+02, 2.43268849002982714d+02, &
2752  2.47572914096186884d+02, 2.51890402209723194d+02, &
2753  2.56221135550009525d+02, 2.60564940971863209d+02, &
2754  2.64921649798552801d+02, 2.69291097651019823d+02, &
2755  2.73673124285693704d+02, 2.78067573440366143d+02, &
2756  2.82474292687630396d+02, 2.86893133295426994d+02, &
2757  2.91323950094270308d+02, 2.95766601350760624d+02, &
2758  3.00220948647014132d+02, 3.04686856765668715d+02/
2759  DATA gln(89), gln(90), gln(91), gln(92), gln(93), gln(94), &
2760  gln(95), gln(96), gln(97), gln(98), gln(99), gln(100)/ &
2761  3.09164193580146922d+02, 3.13652829949879062d+02, &
2762  3.18152639620209327d+02, 3.22663499126726177d+02, &
2763  3.27185287703775217d+02, 3.31717887196928473d+02, &
2764  3.36261181979198477d+02, 3.40815058870799018d+02, &
2765  3.45379407062266854d+02, 3.49954118040770237d+02, &
2766  3.54539085519440809d+02, 3.59134205369575399d+02/
2767 ! COEFFICIENTS OF ASYMPTOTIC EXPANSION
2768  DATA cf(1), cf(2), cf(3), cf(4), cf(5), cf(6), cf(7), cf(8), &
2769  cf(9), cf(10), cf(11), cf(12), cf(13), cf(14), cf(15), &
2770  cf(16), cf(17), cf(18), cf(19), cf(20), cf(21), cf(22)/ &
2771  8.33333333333333333d-02, -2.77777777777777778d-03, &
2772  7.93650793650793651d-04, -5.95238095238095238d-04, &
2773  8.41750841750841751d-04, -1.91752691752691753d-03, &
2774  6.41025641025641026d-03, -2.95506535947712418d-02, &
2775  1.79644372368830573d-01, -1.39243221690590112d+00, &
2776  1.34028640441683920d+01, -1.56848284626002017d+02, &
2777  2.19310333333333333d+03, -3.61087712537249894d+04, &
2778  6.91472268851313067d+05, -1.52382215394074162d+07, &
2779  3.82900751391414141d+08, -1.08822660357843911d+10, &
2780  3.47320283765002252d+11, -1.23696021422692745d+13, &
2781  4.88788064793079335d+14, -2.13203339609193739d+16/
2782 
2783 ! LN(2*PI)
2784  DATA con / 1.83787706640934548d+00/
2785 
2786 !***FIRST EXECUTABLE STATEMENT DGAMLN
2787  ierr=0
2788  IF (z.LE.0.0d0) GO TO 70
2789  IF (z.GT.101.0d0) GO TO 10
2790  nz = int(sngl(z))
2791  fz = z - float(nz)
2792  IF (fz.GT.0.0d0) GO TO 10
2793  IF (nz.GT.100) GO TO 10
2794  dgamln = gln(nz)
2795  RETURN
2796  10 CONTINUE
2797  wdtol = d1mach(4)
2798  wdtol = dmax1(wdtol,0.5d-18)
2799  i1m = i1mach(14)
2800  rln = d1mach(5)*float(i1m)
2801  fln = dmin1(rln,20.0d0)
2802  fln = dmax1(fln,3.0d0)
2803  fln = fln - 3.0d0
2804  zm = 1.8000d0 + 0.3875d0*fln
2805  mz = int(sngl(zm)) + 1
2806  zmin = float(mz)
2807  zdmy = z
2808  zinc = 0.0d0
2809  IF (z.GE.zmin) GO TO 20
2810  zinc = zmin - float(nz)
2811  zdmy = z + zinc
2812  20 CONTINUE
2813  zp = 1.0d0/zdmy
2814  t1 = cf(1)*zp
2815  s = t1
2816  IF (zp.LT.wdtol) GO TO 40
2817  zsq = zp*zp
2818  tst = t1*wdtol
2819  DO 30 k=2,22
2820  zp = zp*zsq
2821  trm = cf(k)*zp
2822  IF (dabs(trm).LT.tst) GO TO 40
2823  s = s + trm
2824  30 CONTINUE
2825  40 CONTINUE
2826  IF (zinc.NE.0.0d0) GO TO 50
2827  tlg = dlog(z)
2828  dgamln = z*(tlg-1.0d0) + 0.5d0*(con-tlg) + s
2829  RETURN
2830  50 CONTINUE
2831  zp = 1.0d0
2832  nz = int(sngl(zinc))
2833  DO 60 i=1,nz
2834  zp = zp*(z+float(i-1))
2835  60 CONTINUE
2836  tlg = dlog(zdmy)
2837  dgamln = zdmy*(tlg-1.0d0) - dlog(zp) + 0.5d0*(con-tlg) + s
2838  RETURN
2839 
2840  70 CONTINUE
2841  ierr=1
2842  RETURN
2843 END
2844 
2845 SUBROUTINE zunik(ZRR, ZRI, FNU, IKFLG, IPMTR, TOL, INIT, PHIR, &
2846  PHII, ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2847 USE complex
2848 !***BEGIN PROLOGUE ZUNIK
2849 !***REFER TO ZBESI,ZBESK
2850 !
2851 ! ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC
2852 ! EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2
2853 ! RESPECTIVELY BY
2854 !
2855 ! W(FNU,ZR) = PHI*EXP(ZETA)*SUM
2856 !
2857 ! WHERE ZETA=-ZETA1 + ZETA2 OR
2858 ! ZETA1 - ZETA2
2859 !
2860 ! THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE
2861 ! SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG=
2862 ! 1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK
2863 ! ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI,
2864 ! ZETA1,ZETA2.
2865 !
2866 !***ROUTINES CALLED ZDIV,ZLOG,ZSQRT
2867 !***END PROLOGUE ZUNIK
2868 ! COMPLEX CFN,CON,CONE,CRFN,CWRK,CZERO,PHI,S,SR,SUM,T,T2,ZETA1,
2869 ! *ZETA2,ZN,ZR
2870  DOUBLE PRECISION ac, c, con, conei, coner, crfni, crfnr, cwrki, &
2871  cwrkr, fnu, phii, phir, rfn, si, sr, sri, srr, sti, str, sumi, &
2872  sumr, test, ti, tol, tr, t2i, t2r, zeroi, zeror, zeta1i, zeta1r, &
2873  zeta2i, zeta2r, zni, znr, zri, zrr
2874  INTEGER i, idum, ikflg, init, ipmtr, j, k, l
2875  dimension c(120), cwrkr(16), cwrki(16), con(2)
2876  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
2877  DATA con(1), con(2) / &
2878  3.98942280401432678d-01, 1.25331413731550025d+00 /
2879  DATA c(1), c(2), c(3), c(4), c(5), c(6), c(7), c(8), c(9), c(10), &
2880  c(11), c(12), c(13), c(14), c(15), c(16), c(17), c(18), &
2881  c(19), c(20), c(21), c(22), c(23), c(24)/ &
2882  1.00000000000000000d+00, -2.08333333333333333d-01, &
2883  1.25000000000000000d-01, 3.34201388888888889d-01, &
2884  -4.01041666666666667d-01, 7.03125000000000000d-02, &
2885  -1.02581259645061728d+00, 1.84646267361111111d+00, &
2886  -8.91210937500000000d-01, 7.32421875000000000d-02, &
2887  4.66958442342624743d+00, -1.12070026162229938d+01, &
2888  8.78912353515625000d+00, -2.36408691406250000d+00, &
2889  1.12152099609375000d-01, -2.82120725582002449d+01, &
2890  8.46362176746007346d+01, -9.18182415432400174d+01, &
2891  4.25349987453884549d+01, -7.36879435947963170d+00, &
2892  2.27108001708984375d-01, 2.12570130039217123d+02, &
2893  -7.65252468141181642d+02, 1.05999045252799988d+03/
2894  DATA c(25), c(26), c(27), c(28), c(29), c(30), c(31), c(32), &
2895  c(33), c(34), c(35), c(36), c(37), c(38), c(39), c(40), &
2896  c(41), c(42), c(43), c(44), c(45), c(46), c(47), c(48)/ &
2897  -6.99579627376132541d+02, 2.18190511744211590d+02, &
2898  -2.64914304869515555d+01, 5.72501420974731445d-01, &
2899  -1.91945766231840700d+03, 8.06172218173730938d+03, &
2900  -1.35865500064341374d+04, 1.16553933368645332d+04, &
2901  -5.30564697861340311d+03, 1.20090291321635246d+03, &
2902  -1.08090919788394656d+02, 1.72772750258445740d+00, &
2903  2.02042913309661486d+04, -9.69805983886375135d+04, &
2904  1.92547001232531532d+05, -2.03400177280415534d+05, &
2905  1.22200464983017460d+05, -4.11926549688975513d+04, &
2906  7.10951430248936372d+03, -4.93915304773088012d+02, &
2907  6.07404200127348304d+00, -2.42919187900551333d+05, &
2908  1.31176361466297720d+06, -2.99801591853810675d+06/
2909  DATA c(49), c(50), c(51), c(52), c(53), c(54), c(55), c(56), &
2910  c(57), c(58), c(59), c(60), c(61), c(62), c(63), c(64), &
2911  c(65), c(66), c(67), c(68), c(69), c(70), c(71), c(72)/ &
2912  3.76327129765640400d+06, -2.81356322658653411d+06, &
2913  1.26836527332162478d+06, -3.31645172484563578d+05, &
2914  4.52187689813627263d+04, -2.49983048181120962d+03, &
2915  2.43805296995560639d+01, 3.28446985307203782d+06, &
2916  -1.97068191184322269d+07, 5.09526024926646422d+07, &
2917  -7.41051482115326577d+07, 6.63445122747290267d+07, &
2918  -3.75671766607633513d+07, 1.32887671664218183d+07, &
2919  -2.78561812808645469d+06, 3.08186404612662398d+05, &
2920  -1.38860897537170405d+04, 1.10017140269246738d+02, &
2921  -4.93292536645099620d+07, 3.25573074185765749d+08, &
2922  -9.39462359681578403d+08, 1.55359689957058006d+09, &
2923  -1.62108055210833708d+09, 1.10684281682301447d+09/
2924  DATA c(73), c(74), c(75), c(76), c(77), c(78), c(79), c(80), &
2925  c(81), c(82), c(83), c(84), c(85), c(86), c(87), c(88), &
2926  c(89), c(90), c(91), c(92), c(93), c(94), c(95), c(96)/ &
2927  -4.95889784275030309d+08, 1.42062907797533095d+08, &
2928  -2.44740627257387285d+07, 2.24376817792244943d+06, &
2929  -8.40054336030240853d+04, 5.51335896122020586d+02, &
2930  8.14789096118312115d+08, -5.86648149205184723d+09, &
2931  1.86882075092958249d+10, -3.46320433881587779d+10, &
2932  4.12801855797539740d+10, -3.30265997498007231d+10, &
2933  1.79542137311556001d+10, -6.56329379261928433d+09, &
2934  1.55927986487925751d+09, -2.25105661889415278d+08, &
2935  1.73951075539781645d+07, -5.49842327572288687d+05, &
2936  3.03809051092238427d+03, -1.46792612476956167d+10, &
2937  1.14498237732025810d+11, -3.99096175224466498d+11, &
2938  8.19218669548577329d+11, -1.09837515608122331d+12/
2939  DATA c(97), c(98), c(99), c(100), c(101), c(102), c(103), c(104), &
2940  c(105), c(106), c(107), c(108), c(109), c(110), c(111), &
2941  c(112), c(113), c(114), c(115), c(116), c(117), c(118)/ &
2942  1.00815810686538209d+12, -6.45364869245376503d+11, &
2943  2.87900649906150589d+11, -8.78670721780232657d+10, &
2944  1.76347306068349694d+10, -2.16716498322379509d+09, &
2945  1.43157876718888981d+08, -3.87183344257261262d+06, &
2946  1.82577554742931747d+04, 2.86464035717679043d+11, &
2947  -2.40629790002850396d+12, 9.10934118523989896d+12, &
2948  -2.05168994109344374d+13, 3.05651255199353206d+13, &
2949  -3.16670885847851584d+13, 2.33483640445818409d+13, &
2950  -1.23204913055982872d+13, 4.61272578084913197d+12, &
2951  -1.19655288019618160d+12, 2.05914503232410016d+11, &
2952  -2.18229277575292237d+10, 1.24700929351271032d+09/
2953  DATA c(119), c(120)/ &
2954  -2.91883881222208134d+07, 1.18838426256783253d+05/
2955 
2956  IF (init.NE.0) GO TO 40
2957 !-----------------------------------------------------------------------
2958 ! INITIALIZE ALL VARIABLES
2959 !-----------------------------------------------------------------------
2960  rfn = 1.0d0/fnu
2961  tr = zrr*rfn
2962  ti = zri*rfn
2963  sr = coner + (tr*tr-ti*ti)
2964  si = conei + (tr*ti+ti*tr)
2965  CALL zsqrt(sr, si, srr, sri)
2966  str = coner + srr
2967  sti = conei + sri
2968  CALL zdiv(str, sti, tr, ti, znr, zni)
2969  CALL zlog(znr, zni, str, sti, idum)
2970  zeta1r = fnu*str
2971  zeta1i = fnu*sti
2972  zeta2r = fnu*srr
2973  zeta2i = fnu*sri
2974  CALL zdiv(coner, conei, srr, sri, tr, ti)
2975  srr = tr*rfn
2976  sri = ti*rfn
2977  CALL zsqrt(srr, sri, cwrkr(16), cwrki(16))
2978  phir = cwrkr(16)*con(ikflg)
2979  phii = cwrki(16)*con(ikflg)
2980  IF (ipmtr.NE.0) RETURN
2981  CALL zdiv(coner, conei, sr, si, t2r, t2i)
2982  cwrkr(1) = coner
2983  cwrki(1) = conei
2984  crfnr = coner
2985  crfni = conei
2986  ac = 1.0d0
2987  l = 1
2988  DO 20 k=2,15
2989  sr = zeror
2990  si = zeroi
2991  DO 10 j=1,k
2992  l = l + 1
2993  str = sr*t2r - si*t2i + c(l)
2994  si = sr*t2i + si*t2r
2995  sr = str
2996  10 CONTINUE
2997  str = crfnr*srr - crfni*sri
2998  crfni = crfnr*sri + crfni*srr
2999  crfnr = str
3000  cwrkr(k) = crfnr*sr - crfni*si
3001  cwrki(k) = crfnr*si + crfni*sr
3002  ac = ac*rfn
3003  test = dabs(cwrkr(k)) + dabs(cwrki(k))
3004  IF (ac.LT.tol .AND. test.LT.tol) GO TO 30
3005  20 CONTINUE
3006  k = 15
3007  30 CONTINUE
3008  init = k
3009  40 CONTINUE
3010  IF (ikflg.EQ.2) GO TO 60
3011 !-----------------------------------------------------------------------
3012 ! COMPUTE SUM FOR THE I FUNCTION
3013 !-----------------------------------------------------------------------
3014  sr = zeror
3015  si = zeroi
3016  DO 50 i=1,init
3017  sr = sr + cwrkr(i)
3018  si = si + cwrki(i)
3019  50 CONTINUE
3020  sumr = sr
3021  sumi = si
3022  phir = cwrkr(16)*con(1)
3023  phii = cwrki(16)*con(1)
3024  RETURN
3025  60 CONTINUE
3026 !-----------------------------------------------------------------------
3027 ! COMPUTE SUM FOR THE K FUNCTION
3028 !-----------------------------------------------------------------------
3029  sr = zeror
3030  si = zeroi
3031  tr = coner
3032  DO 70 i=1,init
3033  sr = sr + tr*cwrkr(i)
3034  si = si + tr*cwrki(i)
3035  tr = -tr
3036  70 CONTINUE
3037  sumr = sr
3038  sumi = si
3039  phir = cwrkr(16)*con(2)
3040  phii = cwrki(16)*con(2)
3041  RETURN
3042 END
3043 
3044 SUBROUTINE zunhj(ZR, ZI, FNU, IPMTR, TOL, PHIR, PHII, ARGR, ARGI, &
3045  ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
3046 USE complex
3047 !***BEGIN PROLOGUE ZUNHJ
3048 !***REFER TO ZBESI,ZBESK
3049 !
3050 ! REFERENCES
3051 ! HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A.
3052 ! STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.
3053 !
3054 ! ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC
3055 ! PRESS, N.Y., 1974, PAGE 420
3056 !
3057 ! ABSTRACT
3058 ! ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) =
3059 ! J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU
3060 ! BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
3061 !
3062 ! C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
3063 !
3064 ! FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS
3065 ! AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
3066 !
3067 ! (2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
3068 !
3069 ! ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING
3070 ! PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
3071 !
3072 ! MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND
3073 ! MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=
3074 ! 1 COMPUTES ALL EXCEPT ASUM AND BSUM.
3075 !
3076 !***ROUTINES CALLED ZABS,ZDIV,ZLOG,ZSQRT
3077 !***END PROLOGUE ZUNHJ
3078 ! COMPLEX ARG,ASUM,BSUM,CFNU,CONE,CR,CZERO,DR,P,PHI,PRZTH,PTFN,
3079 ! *RFN13,RTZTA,RZTH,SUMA,SUMB,TFN,T2,UP,W,W2,Z,ZA,ZB,ZC,ZETA,ZETA1,
3080 ! *ZETA2,ZTH
3081  DOUBLE PRECISION alfa, ang, ap, ar, argi, argr, asumi, asumr, &
3082  atol, aw2, azth, beta, br, bsumi, bsumr, btol, c, conei, coner, &
3083  cri, crr, dri, drr, ex1, ex2, fnu, fn13, fn23, gama, gpi, hpi, &
3084  phii, phir, pi, pp, pr, przthi, przthr, ptfni, ptfnr, raw, raw2, &
3085  razth, rfnu, rfnu2, rfn13, rtzti, rtztr, rzthi, rzthr, sti, str, &
3086  sumai, sumar, sumbi, sumbr, test, tfni, tfnr, thpi, tol, tzai, &
3087  tzar, t2i, t2r, upi, upr, wi, wr, w2i, w2r, zai, zar, zbi, zbr, &
3088  zci, zcr, zeroi, zeror, zetai, zetar, zeta1i, zeta1r, zeta2i, &
3089  zeta2r, zi, zr, zthi, zthr
3090  INTEGER ias, ibs, ipmtr, is, j, jr, ju, k, kmax, kp1, ks, l, lr, &
3091  lrp1, l1, l2, m, idum
3092  dimension ar(14), br(14), c(105), alfa(180), beta(210), gama(30), &
3093  ap(30), pr(30), pi(30), upr(14), upi(14), crr(14), cri(14), &
3094  drr(14), dri(14)
3095  DATA ar(1), ar(2), ar(3), ar(4), ar(5), ar(6), ar(7), ar(8), &
3096  ar(9), ar(10), ar(11), ar(12), ar(13), ar(14)/ &
3097  1.00000000000000000d+00, 1.04166666666666667d-01, &
3098  8.35503472222222222d-02, 1.28226574556327160d-01, &
3099  2.91849026464140464d-01, 8.81627267443757652d-01, &
3100  3.32140828186276754d+00, 1.49957629868625547d+01, &
3101  7.89230130115865181d+01, 4.74451538868264323d+02, &
3102  3.20749009089066193d+03, 2.40865496408740049d+04, &
3103  1.98923119169509794d+05, 1.79190200777534383d+06/
3104  DATA br(1), br(2), br(3), br(4), br(5), br(6), br(7), br(8), &
3105  br(9), br(10), br(11), br(12), br(13), br(14)/ &
3106  1.00000000000000000d+00, -1.45833333333333333d-01, &
3107  -9.87413194444444444d-02, -1.43312053915895062d-01, &
3108  -3.17227202678413548d-01, -9.42429147957120249d-01, &
3109  -3.51120304082635426d+00, -1.57272636203680451d+01, &
3110  -8.22814390971859444d+01, -4.92355370523670524d+02, &
3111  -3.31621856854797251d+03, -2.48276742452085896d+04, &
3112  -2.04526587315129788d+05, -1.83844491706820990d+06/
3113  DATA c(1), c(2), c(3), c(4), c(5), c(6), c(7), c(8), c(9), c(10), &
3114  c(11), c(12), c(13), c(14), c(15), c(16), c(17), c(18), &
3115  c(19), c(20), c(21), c(22), c(23), c(24)/ &
3116  1.00000000000000000d+00, -2.08333333333333333d-01, &
3117  1.25000000000000000d-01, 3.34201388888888889d-01, &
3118  -4.01041666666666667d-01, 7.03125000000000000d-02, &
3119  -1.02581259645061728d+00, 1.84646267361111111d+00, &
3120  -8.91210937500000000d-01, 7.32421875000000000d-02, &
3121  4.66958442342624743d+00, -1.12070026162229938d+01, &
3122  8.78912353515625000d+00, -2.36408691406250000d+00, &
3123  1.12152099609375000d-01, -2.82120725582002449d+01, &
3124  8.46362176746007346d+01, -9.18182415432400174d+01, &
3125  4.25349987453884549d+01, -7.36879435947963170d+00, &
3126  2.27108001708984375d-01, 2.12570130039217123d+02, &
3127  -7.65252468141181642d+02, 1.05999045252799988d+03/
3128  DATA c(25), c(26), c(27), c(28), c(29), c(30), c(31), c(32), &
3129  c(33), c(34), c(35), c(36), c(37), c(38), c(39), c(40), &
3130  c(41), c(42), c(43), c(44), c(45), c(46), c(47), c(48)/ &
3131  -6.99579627376132541d+02, 2.18190511744211590d+02, &
3132  -2.64914304869515555d+01, 5.72501420974731445d-01, &
3133  -1.91945766231840700d+03, 8.06172218173730938d+03, &
3134  -1.35865500064341374d+04, 1.16553933368645332d+04, &
3135  -5.30564697861340311d+03, 1.20090291321635246d+03, &
3136  -1.08090919788394656d+02, 1.72772750258445740d+00, &
3137  2.02042913309661486d+04, -9.69805983886375135d+04, &
3138  1.92547001232531532d+05, -2.03400177280415534d+05, &
3139  1.22200464983017460d+05, -4.11926549688975513d+04, &
3140  7.10951430248936372d+03, -4.93915304773088012d+02, &
3141  6.07404200127348304d+00, -2.42919187900551333d+05, &
3142  1.31176361466297720d+06, -2.99801591853810675d+06/
3143  DATA c(49), c(50), c(51), c(52), c(53), c(54), c(55), c(56), &
3144  c(57), c(58), c(59), c(60), c(61), c(62), c(63), c(64), &
3145  c(65), c(66), c(67), c(68), c(69), c(70), c(71), c(72)/ &
3146  3.76327129765640400d+06, -2.81356322658653411d+06, &
3147  1.26836527332162478d+06, -3.31645172484563578d+05, &
3148  4.52187689813627263d+04, -2.49983048181120962d+03, &
3149  2.43805296995560639d+01, 3.28446985307203782d+06, &
3150  -1.97068191184322269d+07, 5.09526024926646422d+07, &
3151  -7.41051482115326577d+07, 6.63445122747290267d+07, &
3152  -3.75671766607633513d+07, 1.32887671664218183d+07, &
3153  -2.78561812808645469d+06, 3.08186404612662398d+05, &
3154  -1.38860897537170405d+04, 1.10017140269246738d+02, &
3155  -4.93292536645099620d+07, 3.25573074185765749d+08, &
3156  -9.39462359681578403d+08, 1.55359689957058006d+09, &
3157  -1.62108055210833708d+09, 1.10684281682301447d+09/
3158  DATA c(73), c(74), c(75), c(76), c(77), c(78), c(79), c(80), &
3159  c(81), c(82), c(83), c(84), c(85), c(86), c(87), c(88), &
3160  c(89), c(90), c(91), c(92), c(93), c(94), c(95), c(96)/ &
3161  -4.95889784275030309d+08, 1.42062907797533095d+08, &
3162  -2.44740627257387285d+07, 2.24376817792244943d+06, &
3163  -8.40054336030240853d+04, 5.51335896122020586d+02, &
3164  8.14789096118312115d+08, -5.86648149205184723d+09, &
3165  1.86882075092958249d+10, -3.46320433881587779d+10, &
3166  4.12801855797539740d+10, -3.30265997498007231d+10, &
3167  1.79542137311556001d+10, -6.56329379261928433d+09, &
3168  1.55927986487925751d+09, -2.25105661889415278d+08, &
3169  1.73951075539781645d+07, -5.49842327572288687d+05, &
3170  3.03809051092238427d+03, -1.46792612476956167d+10, &
3171  1.14498237732025810d+11, -3.99096175224466498d+11, &
3172  8.19218669548577329d+11, -1.09837515608122331d+12/
3173  DATA c(97), c(98), c(99), c(100), c(101), c(102), c(103), c(104), &
3174  c(105)/ &
3175  1.00815810686538209d+12, -6.45364869245376503d+11, &
3176  2.87900649906150589d+11, -8.78670721780232657d+10, &
3177  1.76347306068349694d+10, -2.16716498322379509d+09, &
3178  1.43157876718888981d+08, -3.87183344257261262d+06, &
3179  1.82577554742931747d+04/
3180  DATA alfa(1), alfa(2), alfa(3), alfa(4), alfa(5), alfa(6), &
3181  alfa(7), alfa(8), alfa(9), alfa(10), alfa(11), alfa(12), &
3182  alfa(13), alfa(14), alfa(15), alfa(16), alfa(17), alfa(18), &
3183  alfa(19), alfa(20), alfa(21), alfa(22)/ &
3184  -4.44444444444444444d-03, -9.22077922077922078d-04, &
3185  -8.84892884892884893d-05, 1.65927687832449737d-04, &
3186  2.46691372741792910d-04, 2.65995589346254780d-04, &
3187  2.61824297061500945d-04, 2.48730437344655609d-04, &
3188  2.32721040083232098d-04, 2.16362485712365082d-04, &
3189  2.00738858762752355d-04, 1.86267636637545172d-04, &
3190  1.73060775917876493d-04, 1.61091705929015752d-04, &
3191  1.50274774160908134d-04, 1.40503497391269794d-04, &
3192  1.31668816545922806d-04, 1.23667445598253261d-04, &
3193  1.16405271474737902d-04, 1.09798298372713369d-04, &
3194  1.03772410422992823d-04, 9.82626078369363448d-05/
3195  DATA alfa(23), alfa(24), alfa(25), alfa(26), alfa(27), alfa(28), &
3196  alfa(29), alfa(30), alfa(31), alfa(32), alfa(33), alfa(34), &
3197  alfa(35), alfa(36), alfa(37), alfa(38), alfa(39), alfa(40), &
3198  alfa(41), alfa(42), alfa(43), alfa(44)/ &
3199  9.32120517249503256d-05, 8.85710852478711718d-05, &
3200  8.42963105715700223d-05, 8.03497548407791151d-05, &
3201  7.66981345359207388d-05, 7.33122157481777809d-05, &
3202  7.01662625163141333d-05, 6.72375633790160292d-05, &
3203  6.93735541354588974d-04, 2.32241745182921654d-04, &
3204  -1.41986273556691197d-05, -1.16444931672048640d-04, &
3205  -1.50803558053048762d-04, -1.55121924918096223d-04, &
3206  -1.46809756646465549d-04, -1.33815503867491367d-04, &
3207  -1.19744975684254051d-04, -1.06184319207974020d-04, &
3208  -9.37699549891194492d-05, -8.26923045588193274d-05, &
3209  -7.29374348155221211d-05, -6.44042357721016283d-05/
3210  DATA alfa(45), alfa(46), alfa(47), alfa(48), alfa(49), alfa(50), &
3211  alfa(51), alfa(52), alfa(53), alfa(54), alfa(55), alfa(56), &
3212  alfa(57), alfa(58), alfa(59), alfa(60), alfa(61), alfa(62), &
3213  alfa(63), alfa(64), alfa(65), alfa(66)/ &
3214  -5.69611566009369048d-05, -5.04731044303561628d-05, &
3215  -4.48134868008882786d-05, -3.98688727717598864d-05, &
3216  -3.55400532972042498d-05, -3.17414256609022480d-05, &
3217  -2.83996793904174811d-05, -2.54522720634870566d-05, &
3218  -2.28459297164724555d-05, -2.05352753106480604d-05, &
3219  -1.84816217627666085d-05, -1.66519330021393806d-05, &
3220  -1.50179412980119482d-05, -1.35554031379040526d-05, &
3221  -1.22434746473858131d-05, -1.10641884811308169d-05, &
3222  -3.54211971457743841d-04, -1.56161263945159416d-04, &
3223  3.04465503594936410d-05, 1.30198655773242693d-04, &
3224  1.67471106699712269d-04, 1.70222587683592569d-04/
3225  DATA alfa(67), alfa(68), alfa(69), alfa(70), alfa(71), alfa(72), &
3226  alfa(73), alfa(74), alfa(75), alfa(76), alfa(77), alfa(78), &
3227  alfa(79), alfa(80), alfa(81), alfa(82), alfa(83), alfa(84), &
3228  alfa(85), alfa(86), alfa(87), alfa(88)/ &
3229  1.56501427608594704d-04, 1.36339170977445120d-04, &
3230  1.14886692029825128d-04, 9.45869093034688111d-05, &
3231  7.64498419250898258d-05, 6.07570334965197354d-05, &
3232  4.74394299290508799d-05, 3.62757512005344297d-05, &
3233  2.69939714979224901d-05, 1.93210938247939253d-05, &
3234  1.30056674793963203d-05, 7.82620866744496661d-06, &
3235  3.59257485819351583d-06, 1.44040049814251817d-07, &
3236  -2.65396769697939116d-06, -4.91346867098485910d-06, &
3237  -6.72739296091248287d-06, -8.17269379678657923d-06, &
3238  -9.31304715093561232d-06, -1.02011418798016441d-05, &
3239  -1.08805962510592880d-05, -1.13875481509603555d-05/
3240  DATA alfa(89), alfa(90), alfa(91), alfa(92), alfa(93), alfa(94), &
3241  alfa(95), alfa(96), alfa(97), alfa(98), alfa(99), alfa(100), &
3242  alfa(101), alfa(102), alfa(103), alfa(104), alfa(105), &
3243  alfa(106), alfa(107), alfa(108), alfa(109), alfa(110)/ &
3244  -1.17519675674556414d-05, -1.19987364870944141d-05, &
3245  3.78194199201772914d-04, 2.02471952761816167d-04, &
3246  -6.37938506318862408d-05, -2.38598230603005903d-04, &
3247  -3.10916256027361568d-04, -3.13680115247576316d-04, &
3248  -2.78950273791323387d-04, -2.28564082619141374d-04, &
3249  -1.75245280340846749d-04, -1.25544063060690348d-04, &
3250  -8.22982872820208365d-05, -4.62860730588116458d-05, &
3251  -1.72334302366962267d-05, 5.60690482304602267d-06, &
3252  2.31395443148286800d-05, 3.62642745856793957d-05, &
3253  4.58006124490188752d-05, 5.24595294959114050d-05, &
3254  5.68396208545815266d-05, 5.94349820393104052d-05/
3255  DATA alfa(111), alfa(112), alfa(113), alfa(114), alfa(115), &
3256  alfa(116), alfa(117), alfa(118), alfa(119), alfa(120), &
3257  alfa(121), alfa(122), alfa(123), alfa(124), alfa(125), &
3258  alfa(126), alfa(127), alfa(128), alfa(129), alfa(130)/ &
3259  6.06478527578421742d-05, 6.08023907788436497d-05, &
3260  6.01577894539460388d-05, 5.89199657344698500d-05, &
3261  5.72515823777593053d-05, 5.52804375585852577d-05, &
3262  5.31063773802880170d-05, 5.08069302012325706d-05, &
3263  4.84418647620094842d-05, 4.60568581607475370d-05, &
3264  -6.91141397288294174d-04, -4.29976633058871912d-04, &
3265  1.83067735980039018d-04, 6.60088147542014144d-04, &
3266  8.75964969951185931d-04, 8.77335235958235514d-04, &
3267  7.49369585378990637d-04, 5.63832329756980918d-04, &
3268  3.68059319971443156d-04, 1.88464535514455599d-04/
3269  DATA alfa(131), alfa(132), alfa(133), alfa(134), alfa(135), &
3270  alfa(136), alfa(137), alfa(138), alfa(139), alfa(140), &
3271  alfa(141), alfa(142), alfa(143), alfa(144), alfa(145), &
3272  alfa(146), alfa(147), alfa(148), alfa(149), alfa(150)/ &
3273  3.70663057664904149d-05, -8.28520220232137023d-05, &
3274  -1.72751952869172998d-04, -2.36314873605872983d-04, &
3275  -2.77966150694906658d-04, -3.02079514155456919d-04, &
3276  -3.12594712643820127d-04, -3.12872558758067163d-04, &
3277  -3.05678038466324377d-04, -2.93226470614557331d-04, &
3278  -2.77255655582934777d-04, -2.59103928467031709d-04, &
3279  -2.39784014396480342d-04, -2.20048260045422848d-04, &
3280  -2.00443911094971498d-04, -1.81358692210970687d-04, &
3281  -1.63057674478657464d-04, -1.45712672175205844d-04, &
3282  -1.29425421983924587d-04, -1.14245691942445952d-04/
3283  DATA alfa(151), alfa(152), alfa(153), alfa(154), alfa(155), &
3284  alfa(156), alfa(157), alfa(158), alfa(159), alfa(160), &
3285  alfa(161), alfa(162), alfa(163), alfa(164), alfa(165), &
3286  alfa(166), alfa(167), alfa(168), alfa(169), alfa(170)/ &
3287  1.92821964248775885d-03, 1.35592576302022234d-03, &
3288  -7.17858090421302995d-04, -2.58084802575270346d-03, &
3289  -3.49271130826168475d-03, -3.46986299340960628d-03, &
3290  -2.82285233351310182d-03, -1.88103076404891354d-03, &
3291  -8.89531718383947600d-04, 3.87912102631035228d-06, &
3292  7.28688540119691412d-04, 1.26566373053457758d-03, &
3293  1.62518158372674427d-03, 1.83203153216373172d-03, &
3294  1.91588388990527909d-03, 1.90588846755546138d-03, &
3295  1.82798982421825727d-03, 1.70389506421121530d-03, &
3296  1.55097127171097686d-03, 1.38261421852276159d-03/
3297  DATA alfa(171), alfa(172), alfa(173), alfa(174), alfa(175), &
3298  alfa(176), alfa(177), alfa(178), alfa(179), alfa(180)/ &
3299  1.20881424230064774d-03, 1.03676532638344962d-03, &
3300  8.71437918068619115d-04, 7.16080155297701002d-04, &
3301  5.72637002558129372d-04, 4.42089819465802277d-04, &
3302  3.24724948503090564d-04, 2.20342042730246599d-04, &
3303  1.28412898401353882d-04, 4.82005924552095464d-05/
3304  DATA beta(1), beta(2), beta(3), beta(4), beta(5), beta(6), &
3305  beta(7), beta(8), beta(9), beta(10), beta(11), beta(12), &
3306  beta(13), beta(14), beta(15), beta(16), beta(17), beta(18), &
3307  beta(19), beta(20), beta(21), beta(22)/ &
3308  1.79988721413553309d-02, 5.59964911064388073d-03, &
3309  2.88501402231132779d-03, 1.80096606761053941d-03, &
3310  1.24753110589199202d-03, 9.22878876572938311d-04, &
3311  7.14430421727287357d-04, 5.71787281789704872d-04, &
3312  4.69431007606481533d-04, 3.93232835462916638d-04, &
3313  3.34818889318297664d-04, 2.88952148495751517d-04, &
3314  2.52211615549573284d-04, 2.22280580798883327d-04, &
3315  1.97541838033062524d-04, 1.76836855019718004d-04, &
3316  1.59316899661821081d-04, 1.44347930197333986d-04, &
3317  1.31448068119965379d-04, 1.20245444949302884d-04, &
3318  1.10449144504599392d-04, 1.01828770740567258d-04/
3319  DATA beta(23), beta(24), beta(25), beta(26), beta(27), beta(28), &
3320  beta(29), beta(30), beta(31), beta(32), beta(33), beta(34), &
3321  beta(35), beta(36), beta(37), beta(38), beta(39), beta(40), &
3322  beta(41), beta(42), beta(43), beta(44)/ &
3323  9.41998224204237509d-05, 8.74130545753834437d-05, &
3324  8.13466262162801467d-05, 7.59002269646219339d-05, &
3325  7.09906300634153481d-05, 6.65482874842468183d-05, &
3326  6.25146958969275078d-05, 5.88403394426251749d-05, &
3327  -1.49282953213429172d-03, -8.78204709546389328d-04, &
3328  -5.02916549572034614d-04, -2.94822138512746025d-04, &
3329  -1.75463996970782828d-04, -1.04008550460816434d-04, &
3330  -5.96141953046457895d-05, -3.12038929076098340d-05, &
3331  -1.26089735980230047d-05, -2.42892608575730389d-07, &
3332  8.05996165414273571d-06, 1.36507009262147391d-05, &
3333  1.73964125472926261d-05, 1.98672978842133780d-05/
3334  DATA beta(45), beta(46), beta(47), beta(48), beta(49), beta(50), &
3335  beta(51), beta(52), beta(53), beta(54), beta(55), beta(56), &
3336  beta(57), beta(58), beta(59), beta(60), beta(61), beta(62), &
3337  beta(63), beta(64), beta(65), beta(66)/ &
3338  2.14463263790822639d-05, 2.23954659232456514d-05, &
3339  2.28967783814712629d-05, 2.30785389811177817d-05, &
3340  2.30321976080909144d-05, 2.28236073720348722d-05, &
3341  2.25005881105292418d-05, 2.20981015361991429d-05, &
3342  2.16418427448103905d-05, 2.11507649256220843d-05, &
3343  2.06388749782170737d-05, 2.01165241997081666d-05, &
3344  1.95913450141179244d-05, 1.90689367910436740d-05, &
3345  1.85533719641636667d-05, 1.80475722259674218d-05, &
3346  5.52213076721292790d-04, 4.47932581552384646d-04, &
3347  2.79520653992020589d-04, 1.52468156198446602d-04, &
3348  6.93271105657043598d-05, 1.76258683069991397d-05/
3349  DATA beta(67), beta(68), beta(69), beta(70), beta(71), beta(72), &
3350  beta(73), beta(74), beta(75), beta(76), beta(77), beta(78), &
3351  beta(79), beta(80), beta(81), beta(82), beta(83), beta(84), &
3352  beta(85), beta(86), beta(87), beta(88)/ &
3353  -1.35744996343269136d-05, -3.17972413350427135d-05, &
3354  -4.18861861696693365d-05, -4.69004889379141029d-05, &
3355  -4.87665447413787352d-05, -4.87010031186735069d-05, &
3356  -4.74755620890086638d-05, -4.55813058138628452d-05, &
3357  -4.33309644511266036d-05, -4.09230193157750364d-05, &
3358  -3.84822638603221274d-05, -3.60857167535410501d-05, &
3359  -3.37793306123367417d-05, -3.15888560772109621d-05, &
3360  -2.95269561750807315d-05, -2.75978914828335759d-05, &
3361  -2.58006174666883713d-05, -2.41308356761280200d-05, &
3362  -2.25823509518346033d-05, -2.11479656768912971d-05, &
3363  -1.98200638885294927d-05, -1.85909870801065077d-05/
3364  DATA beta(89), beta(90), beta(91), beta(92), beta(93), beta(94), &
3365  beta(95), beta(96), beta(97), beta(98), beta(99), beta(100), &
3366  beta(101), beta(102), beta(103), beta(104), beta(105), &
3367  beta(106), beta(107), beta(108), beta(109), beta(110)/ &
3368  -1.74532699844210224d-05, -1.63997823854497997d-05, &
3369  -4.74617796559959808d-04, -4.77864567147321487d-04, &
3370  -3.20390228067037603d-04, -1.61105016119962282d-04, &
3371  -4.25778101285435204d-05, 3.44571294294967503d-05, &
3372  7.97092684075674924d-05, 1.03138236708272200d-04, &
3373  1.12466775262204158d-04, 1.13103642108481389d-04, &
3374  1.08651634848774268d-04, 1.01437951597661973d-04, &
3375  9.29298396593363896d-05, 8.40293133016089978d-05, &
3376  7.52727991349134062d-05, 6.69632521975730872d-05, &
3377  5.92564547323194704d-05, 5.22169308826975567d-05, &
3378  4.58539485165360646d-05, 4.01445513891486808d-05/
3379  DATA beta(111), beta(112), beta(113), beta(114), beta(115), &
3380  beta(116), beta(117), beta(118), beta(119), beta(120), &
3381  beta(121), beta(122), beta(123), beta(124), beta(125), &
3382  beta(126), beta(127), beta(128), beta(129), beta(130)/ &
3383  3.50481730031328081d-05, 3.05157995034346659d-05, &
3384  2.64956119950516039d-05, 2.29363633690998152d-05, &
3385  1.97893056664021636d-05, 1.70091984636412623d-05, &
3386  1.45547428261524004d-05, 1.23886640995878413d-05, &
3387  1.04775876076583236d-05, 8.79179954978479373d-06, &
3388  7.36465810572578444d-04, 8.72790805146193976d-04, &
3389  6.22614862573135066d-04, 2.85998154194304147d-04, &
3390  3.84737672879366102d-06, -1.87906003636971558d-04, &
3391  -2.97603646594554535d-04, -3.45998126832656348d-04, &
3392  -3.53382470916037712d-04, -3.35715635775048757d-04/
3393  DATA beta(131), beta(132), beta(133), beta(134), beta(135), &
3394  beta(136), beta(137), beta(138), beta(139), beta(140), &
3395  beta(141), beta(142), beta(143), beta(144), beta(145), &
3396  beta(146), beta(147), beta(148), beta(149), beta(150)/ &
3397  -3.04321124789039809d-04, -2.66722723047612821d-04, &
3398  -2.27654214122819527d-04, -1.89922611854562356d-04, &
3399  -1.55058918599093870d-04, -1.23778240761873630d-04, &
3400  -9.62926147717644187d-05, -7.25178327714425337d-05, &
3401  -5.22070028895633801d-05, -3.50347750511900522d-05, &
3402  -2.06489761035551757d-05, -8.70106096849767054d-06, &
3403  1.13698686675100290d-06, 9.16426474122778849d-06, &
3404  1.56477785428872620d-05, 2.08223629482466847d-05, &
3405  2.48923381004595156d-05, 2.80340509574146325d-05, &
3406  3.03987774629861915d-05, 3.21156731406700616d-05/
3407  DATA beta(151), beta(152), beta(153), beta(154), beta(155), &
3408  beta(156), beta(157), beta(158), beta(159), beta(160), &
3409  beta(161), beta(162), beta(163), beta(164), beta(165), &
3410  beta(166), beta(167), beta(168), beta(169), beta(170)/ &
3411  -1.80182191963885708d-03, -2.43402962938042533d-03, &
3412  -1.83422663549856802d-03, -7.62204596354009765d-04, &
3413  2.39079475256927218d-04, 9.49266117176881141d-04, &
3414  1.34467449701540359d-03, 1.48457495259449178d-03, &
3415  1.44732339830617591d-03, 1.30268261285657186d-03, &
3416  1.10351597375642682d-03, 8.86047440419791759d-04, &
3417  6.73073208165665473d-04, 4.77603872856582378d-04, &
3418  3.05991926358789362d-04, 1.60315694594721630d-04, &
3419  4.00749555270613286d-05, -5.66607461635251611d-05, &
3420  -1.32506186772982638d-04, -1.90296187989614057d-04/
3421  DATA beta(171), beta(172), beta(173), beta(174), beta(175), &
3422  beta(176), beta(177), beta(178), beta(179), beta(180), &
3423  beta(181), beta(182), beta(183), beta(184), beta(185), &
3424  beta(186), beta(187), beta(188), beta(189), beta(190)/ &
3425  -2.32811450376937408d-04, -2.62628811464668841d-04, &
3426  -2.82050469867598672d-04, -2.93081563192861167d-04, &
3427  -2.97435962176316616d-04, -2.96557334239348078d-04, &
3428  -2.91647363312090861d-04, -2.83696203837734166d-04, &
3429  -2.73512317095673346d-04, -2.61750155806768580d-04, &
3430  6.38585891212050914d-03, 9.62374215806377941d-03, &
3431  7.61878061207001043d-03, 2.83219055545628054d-03, &
3432  -2.09841352012720090d-03, -5.73826764216626498d-03, &
3433  -7.70804244495414620d-03, -8.21011692264844401d-03, &
3434  -7.65824520346905413d-03, -6.47209729391045177d-03/
3435  DATA beta(191), beta(192), beta(193), beta(194), beta(195), &
3436  beta(196), beta(197), beta(198), beta(199), beta(200), &
3437  beta(201), beta(202), beta(203), beta(204), beta(205), &
3438  beta(206), beta(207), beta(208), beta(209), beta(210)/ &
3439  -4.99132412004966473d-03, -3.45612289713133280d-03, &
3440  -2.01785580014170775d-03, -7.59430686781961401d-04, &
3441  2.84173631523859138d-04, 1.10891667586337403d-03, &
3442  1.72901493872728771d-03, 2.16812590802684701d-03, &
3443  2.45357710494539735d-03, 2.61281821058334862d-03, &
3444  2.67141039656276912d-03, 2.65203073395980430d-03, &
3445  2.57411652877287315d-03, 2.45389126236094427d-03, &
3446  2.30460058071795494d-03, 2.13684837686712662d-03, &
3447  1.95896528478870911d-03, 1.77737008679454412d-03, &
3448  1.59690280765839059d-03, 1.42111975664438546d-03/
3449  DATA gama(1), gama(2), gama(3), gama(4), gama(5), gama(6), &
3450  gama(7), gama(8), gama(9), gama(10), gama(11), gama(12), &
3451  gama(13), gama(14), gama(15), gama(16), gama(17), gama(18), &
3452  gama(19), gama(20), gama(21), gama(22)/ &
3453  6.29960524947436582d-01, 2.51984209978974633d-01, &
3454  1.54790300415655846d-01, 1.10713062416159013d-01, &
3455  8.57309395527394825d-02, 6.97161316958684292d-02, &
3456  5.86085671893713576d-02, 5.04698873536310685d-02, &
3457  4.42600580689154809d-02, 3.93720661543509966d-02, &
3458  3.54283195924455368d-02, 3.21818857502098231d-02, &
3459  2.94646240791157679d-02, 2.71581677112934479d-02, &
3460  2.51768272973861779d-02, 2.34570755306078891d-02, &
3461  2.19508390134907203d-02, 2.06210828235646240d-02, &
3462  1.94388240897880846d-02, 1.83810633800683158d-02, &
3463  1.74293213231963172d-02, 1.65685837786612353d-02/
3464  DATA gama(23), gama(24), gama(25), gama(26), gama(27), gama(28), &
3465  gama(29), gama(30)/ &
3466  1.57865285987918445d-02, 1.50729501494095594d-02, &
3467  1.44193250839954639d-02, 1.38184805735341786d-02, &
3468  1.32643378994276568d-02, 1.27517121970498651d-02, &
3469  1.22761545318762767d-02, 1.18338262398482403d-02/
3470  DATA ex1, ex2, hpi, gpi, thpi / &
3471  3.33333333333333333d-01, 6.66666666666666667d-01, &
3472  1.57079632679489662d+00, 3.14159265358979324d+00, &
3473  4.71238898038468986d+00/
3474  DATA zeror,zeroi,coner,conei / 0.0d0, 0.0d0, 1.0d0, 0.0d0 /
3475 
3476  rfnu = 1.0d0/fnu
3477  zbr = zr*rfnu
3478  zbi = zi*rfnu
3479  rfnu2 = rfnu*rfnu
3480 !-----------------------------------------------------------------------
3481 ! COMPUTE IN THE FOURTH QUADRANT
3482 !-----------------------------------------------------------------------
3483  fn13 = fnu**ex1
3484  fn23 = fn13*fn13
3485  rfn13 = 1.0d0/fn13
3486  w2r = coner - zbr*zbr + zbi*zbi
3487  w2i = conei - zbr*zbi - zbr*zbi
3488  aw2 = zabs(w2r,w2i)
3489  IF (aw2.GT.0.25d0) GO TO 130
3490 !-----------------------------------------------------------------------
3491 ! POWER SERIES FOR CABS(W2).LE.0.25D0
3492 !-----------------------------------------------------------------------
3493  k = 1
3494  pr(1) = coner
3495  pi(1) = conei
3496  sumar = gama(1)
3497  sumai = zeroi
3498  ap(1) = 1.0d0
3499  IF (aw2.LT.tol) GO TO 20
3500  DO 10 k=2,30
3501  pr(k) = pr(k-1)*w2r - pi(k-1)*w2i
3502  pi(k) = pr(k-1)*w2i + pi(k-1)*w2r
3503  sumar = sumar + pr(k)*gama(k)
3504  sumai = sumai + pi(k)*gama(k)
3505  ap(k) = ap(k-1)*aw2
3506  IF (ap(k).LT.tol) GO TO 20
3507  10 CONTINUE
3508  k = 30
3509  20 CONTINUE
3510  kmax = k
3511  zetar = w2r*sumar - w2i*sumai
3512  zetai = w2r*sumai + w2i*sumar
3513  argr = zetar*fn23
3514  argi = zetai*fn23
3515  CALL zsqrt(sumar, sumai, zar, zai)
3516  CALL zsqrt(w2r, w2i, str, sti)
3517  zeta2r = str*fnu
3518  zeta2i = sti*fnu
3519  str = coner + ex2*(zetar*zar-zetai*zai)
3520  sti = conei + ex2*(zetar*zai+zetai*zar)
3521  zeta1r = str*zeta2r - sti*zeta2i
3522  zeta1i = str*zeta2i + sti*zeta2r
3523  zar = zar + zar
3524  zai = zai + zai
3525  CALL zsqrt(zar, zai, str, sti)
3526  phir = str*rfn13
3527  phii = sti*rfn13
3528  IF (ipmtr.EQ.1) GO TO 120
3529 !-----------------------------------------------------------------------
3530 ! SUM SERIES FOR ASUM AND BSUM
3531 !-----------------------------------------------------------------------
3532  sumbr = zeror
3533  sumbi = zeroi
3534  DO 30 k=1,kmax
3535  sumbr = sumbr + pr(k)*beta(k)
3536  sumbi = sumbi + pi(k)*beta(k)
3537  30 CONTINUE
3538  asumr = zeror
3539  asumi = zeroi
3540  bsumr = sumbr
3541  bsumi = sumbi
3542  l1 = 0
3543  l2 = 30
3544  btol = tol*(dabs(bsumr)+dabs(bsumi))
3545  atol = tol
3546  pp = 1.0d0
3547  ias = 0
3548  ibs = 0
3549  IF (rfnu2.LT.tol) GO TO 110
3550  DO 100 is=2,7
3551  atol = atol/rfnu2
3552  pp = pp*rfnu2
3553  IF (ias.EQ.1) GO TO 60
3554  sumar = zeror
3555  sumai = zeroi
3556  DO 40 k=1,kmax
3557  m = l1 + k
3558  sumar = sumar + pr(k)*alfa(m)
3559  sumai = sumai + pi(k)*alfa(m)
3560  IF (ap(k).LT.atol) GO TO 50
3561  40 CONTINUE
3562  50 CONTINUE
3563  asumr = asumr + sumar*pp
3564  asumi = asumi + sumai*pp
3565  IF (pp.LT.tol) ias = 1
3566  60 CONTINUE
3567  IF (ibs.EQ.1) GO TO 90
3568  sumbr = zeror
3569  sumbi = zeroi
3570  DO 70 k=1,kmax
3571  m = l2 + k
3572  sumbr = sumbr + pr(k)*beta(m)
3573  sumbi = sumbi + pi(k)*beta(m)
3574  IF (ap(k).LT.atol) GO TO 80
3575  70 CONTINUE
3576  80 CONTINUE
3577  bsumr = bsumr + sumbr*pp
3578  bsumi = bsumi + sumbi*pp
3579  IF (pp.LT.btol) ibs = 1
3580  90 CONTINUE
3581  IF (ias.EQ.1 .AND. ibs.EQ.1) GO TO 110
3582  l1 = l1 + 30
3583  l2 = l2 + 30
3584  100 CONTINUE
3585  110 CONTINUE
3586  asumr = asumr + coner
3587  pp = rfnu*rfn13
3588  bsumr = bsumr*pp
3589  bsumi = bsumi*pp
3590  120 CONTINUE
3591  RETURN
3592 !-----------------------------------------------------------------------
3593 ! CABS(W2).GT.0.25D0
3594 !-----------------------------------------------------------------------
3595  130 CONTINUE
3596  CALL zsqrt(w2r, w2i, wr, wi)
3597  IF (wr.LT.0.0d0) wr = 0.0d0
3598  IF (wi.LT.0.0d0) wi = 0.0d0
3599  str = coner + wr
3600  sti = wi
3601  CALL zdiv(str, sti, zbr, zbi, zar, zai)
3602  CALL zlog(zar, zai, zcr, zci, idum)
3603  IF (zci.LT.0.0d0) zci = 0.0d0
3604  IF (zci.GT.hpi) zci = hpi
3605  IF (zcr.LT.0.0d0) zcr = 0.0d0
3606  zthr = (zcr-wr)*1.5d0
3607  zthi = (zci-wi)*1.5d0
3608  zeta1r = zcr*fnu
3609  zeta1i = zci*fnu
3610  zeta2r = wr*fnu
3611  zeta2i = wi*fnu
3612  azth = zabs(zthr,zthi)
3613  ang = thpi
3614  IF (zthr.GE.0.0d0 .AND. zthi.LT.0.0d0) GO TO 140
3615  ang = hpi
3616  IF (zthr.EQ.0.0d0) GO TO 140
3617  ang = datan(zthi/zthr)
3618  IF (zthr.LT.0.0d0) ang = ang + gpi
3619  140 CONTINUE
3620  pp = azth**ex2
3621  ang = ang*ex2
3622  zetar = pp*dcos(ang)
3623  zetai = pp*dsin(ang)
3624  IF (zetai.LT.0.0d0) zetai = 0.0d0
3625  argr = zetar*fn23
3626  argi = zetai*fn23
3627  CALL zdiv(zthr, zthi, zetar, zetai, rtztr, rtzti)
3628  CALL zdiv(rtztr, rtzti, wr, wi, zar, zai)
3629  tzar = zar + zar
3630  tzai = zai + zai
3631  CALL zsqrt(tzar, tzai, str, sti)
3632  phir = str*rfn13
3633  phii = sti*rfn13
3634  IF (ipmtr.EQ.1) GO TO 120
3635  raw = 1.0d0/dsqrt(aw2)
3636  str = wr*raw
3637  sti = -wi*raw
3638  tfnr = str*rfnu*raw
3639  tfni = sti*rfnu*raw
3640  razth = 1.0d0/azth
3641  str = zthr*razth
3642  sti = -zthi*razth
3643  rzthr = str*razth*rfnu
3644  rzthi = sti*razth*rfnu
3645  zcr = rzthr*ar(2)
3646  zci = rzthi*ar(2)
3647  raw2 = 1.0d0/aw2
3648  str = w2r*raw2
3649  sti = -w2i*raw2
3650  t2r = str*raw2
3651  t2i = sti*raw2
3652  str = t2r*c(2) + c(3)
3653  sti = t2i*c(2)
3654  upr(2) = str*tfnr - sti*tfni
3655  upi(2) = str*tfni + sti*tfnr
3656  bsumr = upr(2) + zcr
3657  bsumi = upi(2) + zci
3658  asumr = zeror
3659  asumi = zeroi
3660  IF (rfnu.LT.tol) GO TO 220
3661  przthr = rzthr
3662  przthi = rzthi
3663  ptfnr = tfnr
3664  ptfni = tfni
3665  upr(1) = coner
3666  upi(1) = conei
3667  pp = 1.0d0
3668  btol = tol*(dabs(bsumr)+dabs(bsumi))
3669  ks = 0
3670  kp1 = 2
3671  l = 3
3672  ias = 0
3673  ibs = 0
3674  DO 210 lr=2,12,2
3675  lrp1 = lr + 1
3676 !-----------------------------------------------------------------------
3677 ! COMPUTE TWO ADDITIONAL CR, DR, AND UP FOR TWO MORE TERMS IN
3678 ! NEXT SUMA AND SUMB
3679 !-----------------------------------------------------------------------
3680  DO 160 k=lr,lrp1
3681  ks = ks + 1
3682  kp1 = kp1 + 1
3683  l = l + 1
3684  zar = c(l)
3685  zai = zeroi
3686  DO 150 j=2,kp1
3687  l = l + 1
3688  str = zar*t2r - t2i*zai + c(l)
3689  zai = zar*t2i + zai*t2r
3690  zar = str
3691  150 CONTINUE
3692  str = ptfnr*tfnr - ptfni*tfni
3693  ptfni = ptfnr*tfni + ptfni*tfnr
3694  ptfnr = str
3695  upr(kp1) = ptfnr*zar - ptfni*zai
3696  upi(kp1) = ptfni*zar + ptfnr*zai
3697  crr(ks) = przthr*br(ks+1)
3698  cri(ks) = przthi*br(ks+1)
3699  str = przthr*rzthr - przthi*rzthi
3700  przthi = przthr*rzthi + przthi*rzthr
3701  przthr = str
3702  drr(ks) = przthr*ar(ks+2)
3703  dri(ks) = przthi*ar(ks+2)
3704  160 CONTINUE
3705  pp = pp*rfnu2
3706  IF (ias.EQ.1) GO TO 180
3707  sumar = upr(lrp1)
3708  sumai = upi(lrp1)
3709  ju = lrp1
3710  DO 170 jr=1,lr
3711  ju = ju - 1
3712  sumar = sumar + crr(jr)*upr(ju) - cri(jr)*upi(ju)
3713  sumai = sumai + crr(jr)*upi(ju) + cri(jr)*upr(ju)
3714  170 CONTINUE
3715  asumr = asumr + sumar
3716  asumi = asumi + sumai
3717  test = dabs(sumar) + dabs(sumai)
3718  IF (pp.LT.tol .AND. test.LT.tol) ias = 1
3719  180 CONTINUE
3720  IF (ibs.EQ.1) GO TO 200
3721  sumbr = upr(lr+2) + upr(lrp1)*zcr - upi(lrp1)*zci
3722  sumbi = upi(lr+2) + upr(lrp1)*zci + upi(lrp1)*zcr
3723  ju = lrp1
3724  DO 190 jr=1,lr
3725  ju = ju - 1
3726  sumbr = sumbr + drr(jr)*upr(ju) - dri(jr)*upi(ju)
3727  sumbi = sumbi + drr(jr)*upi(ju) + dri(jr)*upr(ju)
3728  190 CONTINUE
3729  bsumr = bsumr + sumbr
3730  bsumi = bsumi + sumbi
3731  test = dabs(sumbr) + dabs(sumbi)
3732  IF (pp.LT.btol .AND. test.LT.btol) ibs = 1
3733  200 CONTINUE
3734  IF (ias.EQ.1 .AND. ibs.EQ.1) GO TO 220
3735  210 CONTINUE
3736  220 CONTINUE
3737  asumr = asumr + coner
3738  str = -bsumr*rfn13
3739  sti = -bsumi*rfn13
3740  CALL zdiv(str, sti, rtztr, rtzti, bsumr, bsumi)
3741  GO TO 120
3742 END
3743 
3744 SUBROUTINE zrati(ZR, ZI, FNU, N, CYR, CYI, TOL)
3745 USE complex
3746 !***BEGIN PROLOGUE ZRATI
3747 !***REFER TO ZBESI,ZBESK,ZBESH
3748 !
3749 ! ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
3750 ! RECURRENCE. THE STARTING INDEX IS DETERMINED BY FORWARD
3751 ! RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
3752 ! MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
3753 ! BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
3754 ! BY D. J. SOOKNE.
3755 !
3756 !***ROUTINES CALLED ZABS,ZDIV
3757 !***END PROLOGUE ZRATI
3758 ! COMPLEX Z,CY(1),CONE,CZERO,P1,P2,T1,RZ,PT,CDFNU
3759  DOUBLE PRECISION ak, amagz, ap1, ap2, arg, az, cdfnui, cdfnur, &
3760  conei, coner, cyi, cyr, czeroi, czeror, dfnu, fdnu, flam, fnu, &
3761  fnup, pti, ptr, p1i, p1r, p2i, p2r, rak, rap1, rho, rt2, rzi, &
3762  rzr, test, test1, tol, tti, ttr, t1i, t1r, zi, zr
3763  INTEGER i, id, idnu, inu, itime, k, kk, magz, n
3764  dimension cyr(1), cyi(1)
3765  DATA czeror,czeroi,coner,conei,rt2 &
3766  /0.0d0, 0.0d0, 1.0d0, 0.0d0, 1.41421356237309505d0/
3767  az = zabs(zr,zi)
3768  inu = int(sngl(fnu))
3769  idnu = inu + n - 1
3770  magz = int(sngl(az))
3771  amagz = dble(float(magz+1))
3772  fdnu = dble(float(idnu))
3773  fnup = dmax1(amagz,fdnu)
3774  id = idnu - magz - 1
3775  itime = 1
3776  k = 1
3777  ptr = 1.0d0/az
3778  rzr = ptr*(zr+zr)*ptr
3779  rzi = -ptr*(zi+zi)*ptr
3780  t1r = rzr*fnup
3781  t1i = rzi*fnup
3782  p2r = -t1r
3783  p2i = -t1i
3784  p1r = coner
3785  p1i = conei
3786  t1r = t1r + rzr
3787  t1i = t1i + rzi
3788  IF (id.GT.0) id = 0
3789  ap2 = zabs(p2r,p2i)
3790  ap1 = zabs(p1r,p1i)
3791 !-----------------------------------------------------------------------
3792 ! THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNU
3793 ! GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
3794 ! P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
3795 ! PREMATURELY.
3796 !-----------------------------------------------------------------------
3797  arg = (ap2+ap2)/(ap1*tol)
3798  test1 = dsqrt(arg)
3799  test = test1
3800  rap1 = 1.0d0/ap1
3801  p1r = p1r*rap1
3802  p1i = p1i*rap1
3803  p2r = p2r*rap1
3804  p2i = p2i*rap1
3805  ap2 = ap2*rap1
3806  10 CONTINUE
3807  k = k + 1
3808  ap1 = ap2
3809  ptr = p2r
3810  pti = p2i
3811  p2r = p1r - (t1r*ptr-t1i*pti)
3812  p2i = p1i - (t1r*pti+t1i*ptr)
3813  p1r = ptr
3814  p1i = pti
3815  t1r = t1r + rzr
3816  t1i = t1i + rzi
3817  ap2 = zabs(p2r,p2i)
3818  IF (ap1.LE.test) GO TO 10
3819  IF (itime.EQ.2) GO TO 20
3820  ak = zabs(t1r,t1i)*0.5d0
3821  flam = ak + dsqrt(ak*ak-1.0d0)
3822  rho = dmin1(ap2/ap1,flam)
3823  test = test1*dsqrt(rho/(rho*rho-1.0d0))
3824  itime = 2
3825  GO TO 10
3826  20 CONTINUE
3827  kk = k + 1 - id
3828  ak = dble(float(kk))
3829  t1r = ak
3830  t1i = czeroi
3831  dfnu = fnu + dble(float(n-1))
3832  p1r = 1.0d0/ap2
3833  p1i = czeroi
3834  p2r = czeror
3835  p2i = czeroi
3836  DO 30 i=1,kk
3837  ptr = p1r
3838  pti = p1i
3839  rap1 = dfnu + t1r
3840  ttr = rzr*rap1
3841  tti = rzi*rap1
3842  p1r = (ptr*ttr-pti*tti) + p2r
3843  p1i = (ptr*tti+pti*ttr) + p2i
3844  p2r = ptr
3845  p2i = pti
3846  t1r = t1r - coner
3847  30 CONTINUE
3848  IF (p1r.NE.czeror .OR. p1i.NE.czeroi) GO TO 40
3849  p1r = tol
3850  p1i = tol
3851  40 CONTINUE
3852  CALL zdiv(p2r, p2i, p1r, p1i, cyr(n), cyi(n))
3853  IF (n.EQ.1) RETURN
3854  k = n - 1
3855  ak = dble(float(k))
3856  t1r = ak
3857  t1i = czeroi
3858  cdfnur = fnu*rzr
3859  cdfnui = fnu*rzi
3860  DO 60 i=2,n
3861  ptr = cdfnur + (t1r*rzr-t1i*rzi) + cyr(k+1)
3862  pti = cdfnui + (t1r*rzi+t1i*rzr) + cyi(k+1)
3863  ak = zabs(ptr,pti)
3864  IF (ak.NE.czeror) GO TO 50
3865  ptr = tol
3866  pti = tol
3867  ak = tol*rt2
3868  50 CONTINUE
3869  rak = coner/ak
3870  cyr(k) = rak*ptr*rak
3871  cyi(k) = -rak*pti*rak
3872  t1r = t1r - coner
3873  k = k - 1
3874  60 CONTINUE
3875  RETURN
3876 END
3877 
3878 SUBROUTINE zairy(ZR, ZI, ID, KODE, AIR, AII, NZ, IERR)
3879 USE utilit
3880 USE complex
3881 !***BEGIN PROLOGUE ZAIRY
3882 !***DATE WRITTEN 830501 (YYMMDD)
3883 !***REVISION DATE 830501 (YYMMDD)
3884 !***CATEGORY NO. B5K
3885 !***KEYWORDS AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
3886 !***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
3887 !***PURPOSE TO COMPUTE AIRY FUNCTIONS AI(Z) AND DAI(Z) FOR COMPLEX Z
3888 !***DESCRIPTION
3889 !
3890 ! ***A DOUBLE PRECISION ROUTINE***
3891 ! ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR
3892 ! ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
3893 ! KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)*
3894 ! DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN
3895 ! -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN
3896 ! PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).
3897 !
3898 ! WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTI! IN
3899 ! THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED
3900 ! FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS.
3901 ! DEFINTIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
3902 ! MATHEMATICAL FUNCTIONS (REF. 1).
3903 !
3904 ! INPUT ZR,ZI ARE DOUBLE PRECISION
3905 ! ZR,ZI - Z=CMPLX(ZR,ZI)
3906 ! ID - ORDER OF DERIVATIVE, ID=0 OR ID=1
3907 ! KODE - A PARAMETER TO INDICATE THE SCALING OPTION
3908 ! KODE= 1 RETURNS
3909 ! AI=AI(Z) ON ID=0 OR
3910 ! AI=DAI(Z)/DZ ON ID=1
3911 ! = 2 RETURNS
3912 ! AI=CEXP(ZTA)*AI(Z) ON ID=0 OR
3913 ! AI=CEXP(ZTA)*DAI(Z)/DZ ON ID=1 WHERE
3914 ! ZTA=(2/3)*Z*CSQRT(Z)
3915 !
3916 ! OUTPUT AIR,AII ARE DOUBLE PRECISION
3917 ! AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
3918 ! KODE
3919 ! NZ - UNDERFLOW INDICATOR
3920 ! NZ= 0 , NORMAL RETURN
3921 ! NZ= 1 , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN
3922 ! -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1
3923 ! IERR - ERROR FLAG
3924 ! IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
3925 ! IERR=1, INPUT ERROR - NO COMPUTATION
3926 ! IERR=2, OVERFLOW - NO COMPUTATION, REAL(ZTA)
3927 ! TOO LARGE ON KODE=1
3928 ! IERR=3, CABS(Z) LARGE - COMPUTATION COMPLETED
3929 ! LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
3930 ! PRODUCE LESS THAN HALF OF MACHINE ACCURACY
3931 ! IERR=4, CABS(Z) TOO LARGE - NO COMPUTATION
3932 ! COMPLETE LOSS OF ACCURACY BY ARGUMENT
3933 ! REDUCTION
3934 ! IERR=5, ERROR - NO COMPUTATION,
3935 ! ALGORITHM TERMINATION CONDITION NOT MET
3936 !
3937 !***LONG DESCRIPTION
3938 !
3939 ! AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL
3940 ! FUNCTIONS BY
3941 !
3942 ! AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA)
3943 ! C=1.0/(PI*SQRT(3.0))
3944 ! ZTA=(2/3)*Z**(3/2)
3945 !
3946 ! WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
3947 !
3948 ! IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
3949 ! MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
3950 ! OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
3951 ! THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
3952 ! THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
3953 ! FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
3954 ! DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
3955 ! ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
3956 ! ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
3957 ! FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
3958 ! LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
3959 ! MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
3960 ! AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
3961 ! PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
3962 ! PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
3963 ! ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
3964 ! NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
3965 ! DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
3966 ! EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
3967 ! NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
3968 ! PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
3969 ! MACHINES.
3970 !
3971 ! THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
3972 ! BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
3973 ! ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
3974 ! SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
3975 ! ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
3976 ! ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
3977 ! CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
3978 ! HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
3979 ! ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
3980 ! SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
3981 ! THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
3982 ! 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
3983 ! THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
3984 ! COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
3985 ! BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
3986 ! COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
3987 ! MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
3988 ! THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
3989 ! OR -PI/2+P.
3990 !
3991 !***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
3992 ! AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
3993 ! COMMERCE, 1955.
3994 !
3995 ! COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
3996 ! AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
3997 !
3998 ! A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
3999 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
4000 ! 1018, MAY, 1985
4001 !
4002 ! A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
4003 ! ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
4004 ! MATH. SOFTWARE, 1986
4005 !
4006 !***ROUTINES CALLED ZACAI,ZBKNU,ZEXP,ZSQRT,I1MACH,D1MACH
4007 !***END PROLOGUE ZAIRY
4008 ! COMPLEX AI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
4009  DOUBLE PRECISION aa, ad, aii, air, ak, alim, atrm, az, az3, bk, &
4010  cc, ck, coef, conei, coner, csqi, csqr, cyi, cyr, c1, c2, dig, &
4011  dk, d1, d2, elim, fid, fnu, ptr, rl, r1m5, sfac, sti, str, &
4012  s1i, s1r, s2i, s2r, tol, trm1i, trm1r, trm2i, trm2r, tth, zeroi, &
4013  zeror, zi, zr, ztai, ztar, z3i, z3r, alaz, bb
4014  INTEGER id, ierr, iflag, k, kode, k1, k2, mr, nn, nz
4015  dimension cyr(1), cyi(1)
4016  DATA tth, c1, c2, coef /6.66666666666666667d-01, &
4017  3.55028053887817240d-01,2.58819403792806799d-01, &
4018  1.83776298473930683d-01/
4019  DATA zeror, zeroi, coner, conei /0.0d0,0.0d0,1.0d0,0.0d0/
4020 !***FIRST EXECUTABLE STATEMENT ZAIRY
4021  ierr = 0
4022  nz=0
4023  IF (id.LT.0 .OR. id.GT.1) ierr=1
4024  IF (kode.LT.1 .OR. kode.GT.2) ierr=1
4025  IF (ierr.NE.0) RETURN
4026  az = zabs(zr,zi)
4027  tol = dmax1(d1mach(4),1.0d-18)
4028  fid = dble(float(id))
4029  IF (az.GT.1.0d0) GO TO 70
4030 !-----------------------------------------------------------------------
4031 ! POWER SERIES FOR CABS(Z).LE.1.
4032 !-----------------------------------------------------------------------
4033  s1r = coner
4034  s1i = conei
4035  s2r = coner
4036  s2i = conei
4037  IF (az.LT.tol) GO TO 170
4038  aa = az*az
4039  IF (aa.LT.tol/az) GO TO 40
4040  trm1r = coner
4041  trm1i = conei
4042  trm2r = coner
4043  trm2i = conei
4044  atrm = 1.0d0
4045  str = zr*zr - zi*zi
4046  sti = zr*zi + zi*zr
4047  z3r = str*zr - sti*zi
4048  z3i = str*zi + sti*zr
4049  az3 = az*aa
4050  ak = 2.0d0 + fid
4051  bk = 3.0d0 - fid - fid
4052  ck = 4.0d0 - fid
4053  dk = 3.0d0 + fid + fid
4054  d1 = ak*dk
4055  d2 = bk*ck
4056  ad = dmin1(d1,d2)
4057  ak = 24.0d0 + 9.0d0*fid
4058  bk = 30.0d0 - 9.0d0*fid
4059  DO 30 k=1,25
4060  str = (trm1r*z3r-trm1i*z3i)/d1
4061  trm1i = (trm1r*z3i+trm1i*z3r)/d1
4062  trm1r = str
4063  s1r = s1r + trm1r
4064  s1i = s1i + trm1i
4065  str = (trm2r*z3r-trm2i*z3i)/d2
4066  trm2i = (trm2r*z3i+trm2i*z3r)/d2
4067  trm2r = str
4068  s2r = s2r + trm2r
4069  s2i = s2i + trm2i
4070  atrm = atrm*az3/ad
4071  d1 = d1 + ak
4072  d2 = d2 + bk
4073  ad = dmin1(d1,d2)
4074  IF (atrm.LT.tol*ad) GO TO 40
4075  ak = ak + 18.0d0
4076  bk = bk + 18.0d0
4077  30 CONTINUE
4078  40 CONTINUE
4079  IF (id.EQ.1) GO TO 50
4080  air = s1r*c1 - c2*(zr*s2r-zi*s2i)
4081  aii = s1i*c1 - c2*(zr*s2i+zi*s2r)
4082  IF (kode.EQ.1) RETURN
4083  CALL zsqrt(zr, zi, str, sti)
4084  ztar = tth*(zr*str-zi*sti)
4085  ztai = tth*(zr*sti+zi*str)
4086  CALL zexp(ztar, ztai, str, sti)
4087  ptr = air*str - aii*sti
4088  aii = air*sti + aii*str
4089  air = ptr
4090  RETURN
4091  50 CONTINUE
4092  air = -s2r*c2
4093  aii = -s2i*c2
4094  IF (az.LE.tol) GO TO 60
4095  str = zr*s1r - zi*s1i
4096  sti = zr*s1i + zi*s1r
4097  cc = c1/(1.0d0+fid)
4098  air = air + cc*(str*zr-sti*zi)
4099  aii = aii + cc*(str*zi+sti*zr)
4100  60 CONTINUE
4101  IF (kode.EQ.1) RETURN
4102  CALL zsqrt(zr, zi, str, sti)
4103  ztar = tth*(zr*str-zi*sti)
4104  ztai = tth*(zr*sti+zi*str)
4105  CALL zexp(ztar, ztai, str, sti)
4106  ptr = str*air - sti*aii
4107  aii = str*aii + sti*air
4108  air = ptr
4109  RETURN
4110 !-----------------------------------------------------------------------
4111 ! CASE FOR CABS(Z).GT.1.0
4112 !-----------------------------------------------------------------------
4113  70 CONTINUE
4114  fnu = (1.0d0+fid)/3.0d0
4115 !-----------------------------------------------------------------------
4116 ! SET PARAMETERS RELATED TO MACHINE CONSTANTS.
4117 ! TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0D-18.
4118 ! ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
4119 ! EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
4120 ! EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
4121 ! UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
4122 ! RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
4123 ! DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
4124 !-----------------------------------------------------------------------
4125  k1 = i1mach(15)
4126  k2 = i1mach(16)
4127  r1m5 = d1mach(5)
4128  k = min0(iabs(k1),iabs(k2))
4129  elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
4130  k1 = i1mach(14) - 1
4131  aa = r1m5*dble(float(k1))
4132  dig = dmin1(aa,18.0d0)
4133  aa = aa*2.303d0
4134  alim = elim + dmax1(-aa,-41.45d0)
4135  rl = 1.2d0*dig + 3.0d0
4136  alaz = dlog(az)
4137 !-----------------------------------------------------------------------
4138 ! TEST FOR PROPER RANGE
4139 !-----------------------------------------------------------------------
4140  aa=0.5d0/tol
4141  bb=dble(float(i1mach(9)))*0.5d0
4142  aa=dmin1(aa,bb)
4143  aa=aa**tth
4144  IF (az.GT.aa) GO TO 260
4145  aa=dsqrt(aa)
4146  IF (az.GT.aa) ierr=3
4147  CALL zsqrt(zr, zi, csqr, csqi)
4148  ztar = tth*(zr*csqr-zi*csqi)
4149  ztai = tth*(zr*csqi+zi*csqr)
4150 !-----------------------------------------------------------------------
4151 ! RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
4152 !-----------------------------------------------------------------------
4153  iflag = 0
4154  sfac = 1.0d0
4155  ak = ztai
4156  IF (zr.GE.0.0d0) GO TO 80
4157  bk = ztar
4158  ck = -dabs(bk)
4159  ztar = ck
4160  ztai = ak
4161  80 CONTINUE
4162  IF (zi.NE.0.0d0) GO TO 90
4163  IF (zr.GT.0.0d0) GO TO 90
4164  ztar = 0.0d0
4165  ztai = ak
4166  90 CONTINUE
4167  aa = ztar
4168  IF (aa.GE.0.0d0 .AND. zr.GT.0.0d0) GO TO 110
4169  IF (kode.EQ.2) GO TO 100
4170 !-----------------------------------------------------------------------
4171 ! OVERFLOW TEST
4172 !-----------------------------------------------------------------------
4173  IF (aa.GT.(-alim)) GO TO 100
4174  aa = -aa + 0.25d0*alaz
4175  iflag = 1
4176  sfac = tol
4177  IF (aa.GT.elim) GO TO 270
4178  100 CONTINUE
4179 !-----------------------------------------------------------------------
4180 ! CBKNU AND CACON RETURN EXP(ZTA)*K(FNU,ZTA) ON KODE=2
4181 !-----------------------------------------------------------------------
4182  mr = 1
4183  IF (zi.LT.0.0d0) mr = -1
4184  CALL zacai(ztar, ztai, fnu, kode, mr, 1, cyr, cyi, nn, rl, tol, &
4185  elim, alim)
4186  IF (nn.LT.0) GO TO 280
4187  nz = nz + nn
4188  GO TO 130
4189  110 CONTINUE
4190  IF (kode.EQ.2) GO TO 120
4191 !-----------------------------------------------------------------------
4192 ! UNDERFLOW TEST
4193 !-----------------------------------------------------------------------
4194  IF (aa.LT.alim) GO TO 120
4195  aa = -aa - 0.25d0*alaz
4196  iflag = 2
4197  sfac = 1.0d0/tol
4198  IF (aa.LT.(-elim)) GO TO 210
4199  120 CONTINUE
4200  CALL zbknu(ztar, ztai, fnu, kode, 1, cyr, cyi, nz, tol, elim, alim)
4201  130 CONTINUE
4202  s1r = cyr(1)*coef
4203  s1i = cyi(1)*coef
4204  IF (iflag.NE.0) GO TO 150
4205  IF (id.EQ.1) GO TO 140
4206  air = csqr*s1r - csqi*s1i
4207  aii = csqr*s1i + csqi*s1r
4208  RETURN
4209  140 CONTINUE
4210  air = -(zr*s1r-zi*s1i)
4211  aii = -(zr*s1i+zi*s1r)
4212  RETURN
4213  150 CONTINUE
4214  s1r = s1r*sfac
4215  s1i = s1i*sfac
4216  IF (id.EQ.1) GO TO 160
4217  str = s1r*csqr - s1i*csqi
4218  s1i = s1r*csqi + s1i*csqr
4219  s1r = str
4220  air = s1r/sfac
4221  aii = s1i/sfac
4222  RETURN
4223  160 CONTINUE
4224  str = -(s1r*zr-s1i*zi)
4225  s1i = -(s1r*zi+s1i*zr)
4226  s1r = str
4227  air = s1r/sfac
4228  aii = s1i/sfac
4229  RETURN
4230  170 CONTINUE
4231  aa = 1.0d+3*d1mach(1)
4232  s1r = zeror
4233  s1i = zeroi
4234  IF (id.EQ.1) GO TO 190
4235  IF (az.LE.aa) GO TO 180
4236  s1r = c2*zr
4237  s1i = c2*zi
4238  180 CONTINUE
4239  air = c1 - s1r
4240  aii = -s1i
4241  RETURN
4242  190 CONTINUE
4243  air = -c2
4244  aii = 0.0d0
4245  aa = dsqrt(aa)
4246  IF (az.LE.aa) GO TO 200
4247  s1r = 0.5d0*(zr*zr-zi*zi)
4248  s1i = zr*zi
4249  200 CONTINUE
4250  air = air + c1*s1r
4251  aii = aii + c1*s1i
4252  RETURN
4253  210 CONTINUE
4254  nz = 1
4255  air = zeror
4256  aii = zeroi
4257  RETURN
4258  270 CONTINUE
4259  nz = 0
4260  ierr=2
4261  RETURN
4262  280 CONTINUE
4263  IF(nn.EQ.(-1)) GO TO 270
4264  nz=0
4265  ierr=5
4266  RETURN
4267  260 CONTINUE
4268  ierr=4
4269  nz=0
4270  RETURN
4271 END
4272 
4273 SUBROUTINE zacai(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL, ELIM, ALIM)
4274 USE utilit
4275 USE complex
4276 !***BEGIN PROLOGUE ZACAI
4277 !***REFER TO ZAIRY
4278 !
4279 ! ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA
4280 !
4281 ! K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
4282 ! MP=PI*MR*CMPLX(0.0,1.0)
4283 !
4284 ! TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
4285 ! HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1.
4286 ! ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND
4287 ! RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON
4288 ! IS CALLED FROM ZAIRY.
4289 !
4290 !***ROUTINES CALLED ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,ZABS
4291 !***END PROLOGUE ZACAI
4292 ! COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY
4293  DOUBLE PRECISION alim, arg, ascle, az, csgnr, csgni, cspnr, &
4294  cspni, c1r, c1i, c2r, c2i, cyr, cyi, dfnu, elim, fmr, fnu, pi, &
4295  rl, sgn, tol, yy, yr, yi, zr, zi, znr, zni
4296  INTEGER inu, iuf, kode, mr, n, nn, nw, nz
4297  dimension yr(1), yi(1), cyr(2), cyi(2)
4298  DATA pi / 3.14159265358979324d0 /
4299  nz = 0
4300  znr = -zr
4301  zni = -zi
4302  az = zabs(zr,zi)
4303  nn = n
4304  dfnu = fnu + dble(float(n-1))
4305  IF (az.LE.2.0d0) GO TO 10
4306  IF (az*az*0.25d0.GT.dfnu+1.0d0) GO TO 20
4307  10 CONTINUE
4308 !-----------------------------------------------------------------------
4309 ! POWER SERIES FOR THE I FUNCTION
4310 !-----------------------------------------------------------------------
4311  CALL zseri(znr, zni, fnu, kode, nn, yr, yi, nw, tol, elim, alim)
4312  GO TO 40
4313  20 CONTINUE
4314  IF (az.LT.rl) GO TO 30
4315 !-----------------------------------------------------------------------
4316 ! ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION
4317 !-----------------------------------------------------------------------
4318  CALL zasyi(znr, zni, fnu, kode, nn, yr, yi, nw, rl, tol, elim, alim)
4319  IF (nw.LT.0) GO TO 80
4320  GO TO 40
4321  30 CONTINUE
4322 !-----------------------------------------------------------------------
4323 ! MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
4324 !-----------------------------------------------------------------------
4325  CALL zmlri(znr, zni, fnu, kode, nn, yr, yi, nw, tol)
4326  IF(nw.LT.0) GO TO 80
4327  40 CONTINUE
4328 !-----------------------------------------------------------------------
4329 ! ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
4330 !-----------------------------------------------------------------------
4331  CALL zbknu(znr, zni, fnu, kode, 1, cyr, cyi, nw, tol, elim, alim)
4332  IF (nw.NE.0) GO TO 80
4333  fmr = dble(float(mr))
4334  sgn = -dsign(pi,fmr)
4335  csgnr = 0.0d0
4336  csgni = sgn
4337  IF (kode.EQ.1) GO TO 50
4338  yy = -zni
4339  csgnr = -csgni*dsin(yy)
4340  csgni = csgni*dcos(yy)
4341  50 CONTINUE
4342 !-----------------------------------------------------------------------
4343 ! CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
4344 ! WHEN FNU IS LARGE
4345 !-----------------------------------------------------------------------
4346  inu = int(sngl(fnu))
4347  arg = (fnu-dble(float(inu)))*sgn
4348  cspnr = dcos(arg)
4349  cspni = dsin(arg)
4350  IF (mod(inu,2).EQ.0) GO TO 60
4351  cspnr = -cspnr
4352  cspni = -cspni
4353  60 CONTINUE
4354  c1r = cyr(1)
4355  c1i = cyi(1)
4356  c2r = yr(1)
4357  c2i = yi(1)
4358  IF (kode.EQ.1) GO TO 70
4359  iuf = 0
4360  ascle = 1.0d+3*d1mach(1)/tol
4361  CALL zs1s2(znr, zni, c1r, c1i, c2r, c2i, nw, ascle, alim, iuf)
4362  nz = nz + nw
4363  70 CONTINUE
4364  yr(1) = cspnr*c1r - cspni*c1i + csgnr*c2r - csgni*c2i
4365  yi(1) = cspnr*c1i + cspni*c1r + csgnr*c2i + csgni*c2r
4366  RETURN
4367  80 CONTINUE
4368  nz = -1
4369  IF(nw.EQ.(-2)) nz=-2
4370  RETURN
4371 END
4372 
4373 SUBROUTINE zs1s2(ZRR, ZRI, S1R, S1I, S2R, S2I, NZ, ASCLE, ALIM, IUF)
4374 USE complex
4375 !***BEGIN PROLOGUE ZS1S2
4376 !***REFER TO ZBESK,ZAIRY
4377 !
4378 ! ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE
4379 ! ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON-
4380 ! TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.
4381 ! ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF
4382 ! MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER
4383 ! OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE
4384 ! PRECISION ABOVE THE UNDERFLOW LIMIT.
4385 !
4386 !***ROUTINES CALLED ZABS,ZEXP,ZLOG
4387 !***END PROLOGUE ZS1S2
4388 ! COMPLEX CZERO,C1,S1,S1D,S2,ZR
4389  DOUBLE PRECISION aa, alim, aln, ascle, as1, as2, c1i, c1r, s1di, &
4390  s1dr, s1i, s1r, s2i, s2r, zeroi, zeror, zri, zrr
4391  INTEGER iuf, idum, nz
4392  DATA zeror,zeroi / 0.0d0 , 0.0d0 /
4393  nz = 0
4394  as1 = zabs(s1r,s1i)
4395  as2 = zabs(s2r,s2i)
4396  IF (s1r.EQ.0.0d0 .AND. s1i.EQ.0.0d0) GO TO 10
4397  IF (as1.EQ.0.0d0) GO TO 10
4398  aln = -zrr - zrr + dlog(as1)
4399  s1dr = s1r
4400  s1di = s1i
4401  s1r = zeror
4402  s1i = zeroi
4403  as1 = zeror
4404  IF (aln.LT.(-alim)) GO TO 10
4405  CALL zlog(s1dr, s1di, c1r, c1i, idum)
4406  c1r = c1r - zrr - zrr
4407  c1i = c1i - zri - zri
4408  CALL zexp(c1r, c1i, s1r, s1i)
4409  as1 = zabs(s1r,s1i)
4410  iuf = iuf + 1
4411  10 CONTINUE
4412  aa = dmax1(as1,as2)
4413  IF (aa.GT.ascle) RETURN
4414  s1r = zeror
4415  s1i = zeroi
4416  s2r = zeror
4417  s2i = zeroi
4418  nz = 1
4419  iuf = 0
4420  RETURN
4421 END
4422 end module besselj
4423 !end of file tzbesj.f90
int sgn(T val)
signum
Definition: globals.hh:23