Branch data Line data Source code
1 : : !!****m* ABINIT/m_bessel2
2 : : !! NAME
3 : : !! m_bessel2
4 : : !!
5 : : !! FUNCTION
6 : : !! Computes modified Bessel functions of the first and second kind.
7 : : !! These routines were taken from https://www.netlib.org/slatec/.
8 : : !!
9 : : !! COPYRIGHT
10 : : !! Copyright (C) 2024-2026 ABINIT group
11 : : !! This file is distributed under the terms of the
12 : : !! GNU General Public License, see ~abinit/COPYING
13 : : !! or http://www.gnu.org/copyleft/gpl.txt .
14 : : !!
15 : : !! SOURCE
16 : :
17 : : #if defined HAVE_CONFIG_H
18 : : #include "config.h"
19 : : #endif
20 : :
21 : : #include "abi_common.h"
22 : :
23 : : MODULE m_bessel2
24 : :
25 : : use defs_basis
26 : : use m_errors
27 : :
28 : : implicit none
29 : :
30 : : private
31 : :
32 : : public :: bessel_iv
33 : : public :: bessel_kv
34 : :
35 : : CONTAINS !========================================================================================
36 : : !!***
37 : :
38 : : !!****f* m_bessel2/bessel_iv
39 : : !! NAME
40 : : !! bessel_iv
41 : : !!
42 : : !! FUNCTION
43 : : !!
44 : : !! Compute modified Bessel function of the first kind for any real order
45 : : !!
46 : : !! INPUTS
47 : : !! k= order
48 : : !! xr= real part of the value at which to compute the Bessel function
49 : : !! xi= real part of the value at which to compute the Bessel function
50 : : !!
51 : : !! OUTPUT
52 : : !! ivr,ivi= real part and imaginary part of the value of the Bessel function
53 : : !!
54 : : !! SOURCE
55 : :
56 : 0 : subroutine bessel_iv(k,xr,xi,ivr,ivi)
57 : :
58 : : !Arguments ------------------------------------
59 : : real(dp), intent(in) :: k,xr,xi
60 : : real(dp), intent(out) :: ivr,ivi
61 : : !Local variables ------------------------------
62 : : integer :: ierr,nz
63 : : real(dp) :: s
64 : : real(dp) :: cyi(1),cyik(1),cyr(1),cyrk(1)
65 : : !************************************************************************
66 : :
67 : 0 : call zbesi(xr,xi,abs(k),1,1,cyr,cyi,nz,ierr)
68 [ # # ]: 0 : if (k >= zero) then
69 : 0 : ivr = cyr(1)
70 : 0 : ivi = cyi(1)
71 : : else
72 : 0 : s = sin(abs(k)*pi) * two / pi
73 : 0 : call zbesk(xr,xi,abs(k),1,1,cyrk,cyik,nz,ierr)
74 : 0 : ivr = cyr(1) + s*cyrk(1)
75 : 0 : ivi = cyi(1) + s*cyik(1)
76 : : end if
77 : :
78 : 0 : end subroutine bessel_iv
79 : : !!***
80 : :
81 : : !----------------------------------------------------------------------
82 : :
83 : : !!****f* m_bessel2/bessel_kv
84 : : !! NAME
85 : : !! bessel_iv
86 : : !!
87 : : !! FUNCTION
88 : : !!
89 : : !! Compute modified Bessel function of the second kind for any real order
90 : : !!
91 : : !! INPUTS
92 : : !! k= order
93 : : !! xr= real part of the value at which to compute the Bessel function
94 : : !! xi= real part of the value at which to compute the Bessel function
95 : : !!
96 : : !! OUTPUT
97 : : !! kvr,kvi= real part and imaginary part of the value of the Bessel function
98 : : !!
99 : : !! SOURCE
100 : :
101 : 0 : subroutine bessel_kv(k,xr,xi,kvr,kvi)
102 : :
103 : : !Arguments ------------------------------------
104 : : real(dp), intent(in) :: k,xi,xr
105 : : real(dp), intent(out) :: kvi,kvr
106 : : !Local variables ------------------------------
107 : : integer :: ierr,nz
108 : : real(dp) :: cyi(1),cyr(1)
109 : : !************************************************************************
110 : :
111 : 0 : call zbesk(xr,xi,abs(k),1,1,cyr,cyi,nz,ierr)
112 : :
113 [ # # ]: 0 : if (xi == zero) then
114 : 0 : kvr = cyr(1)
115 : 0 : kvi = zero
116 : : else
117 : 0 : kvr = cyr(1)
118 : 0 : kvi = cyi(1)
119 : : end if
120 : :
121 : 0 : end subroutine bessel_kv
122 : : !!***
123 : :
124 : : !----------------------------------------------------------------------
125 : :
126 : 0 : SUBROUTINE ZBESI(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
127 : : !C***BEGIN PROLOGUE ZBESI
128 : : !C***DATE WRITTEN 830501 (YYMMDD)
129 : : !C***REVISION DATE 890801 (YYMMDD)
130 : : !C***CATEGORY NO. B5K
131 : : !C***KEYWORDS I-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
132 : : !C MODIFIED BESSEL FUNCTION OF THE FIRST KIND
133 : : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
134 : : !C***PURPOSE TO COMPUTE I-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
135 : : !C***DESCRIPTION
136 : : !C
137 : : !C ***A DOUBLE PRECISION ROUTINE***
138 : : !C ON KODE=1, ZBESI COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
139 : : !C BESSEL FUNCTIONS CY(J)=I(FNU+J-1,Z) FOR REAL, NONNEGATIVE
140 : : !C ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z IN THE CUT PLANE
141 : : !C -PI.LT.ARG(Z).LE.PI. ON KODE=2, ZBESI RETURNS THE SCALED
142 : : !C FUNCTIONS
143 : : !C
144 : : !C CY(J)=EXP(-ABS(X))*I(FNU+J-1,Z) J = 1,...,N , X=REAL(Z)
145 : : !C
146 : : !C WITH THE EXPONENTIAL GROWTH REMOVED IN BOTH THE LEFT AND
147 : : !C RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
148 : : !C ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
149 : : !C (REF. 1).
150 : : !C
151 : : !C INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
152 : : !C ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI
153 : : !C FNU - ORDER OF INITIAL I FUNCTION, FNU.GE.0.0D0
154 : : !C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
155 : : !C KODE= 1 RETURNS
156 : : !C CY(J)=I(FNU+J-1,Z), J=1,...,N
157 : : !C = 2 RETURNS
158 : : !C CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)), J=1,...,N
159 : : !C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
160 : : !C
161 : : !C OUTPUT CYR,CYI ARE DOUBLE PRECISION
162 : : !C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
163 : : !C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
164 : : !C CY(J)=I(FNU+J-1,Z) OR
165 : : !C CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)) J=1,...,N
166 : : !C DEPENDING ON KODE, X=REAL(Z)
167 : : !C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
168 : : !C NZ= 0 , NORMAL RETURN
169 : : !C NZ.GT.0 , LAST NZ COMPONENTS OF CY SET TO ZERO
170 : : !C TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
171 : : !C J = N-NZ+1,...,N
172 : : !C IERR - ERROR FLAG
173 : : !C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
174 : : !C IERR=1, INPUT ERROR - NO COMPUTATION
175 : : !C IERR=2, OVERFLOW - NO COMPUTATION, REAL(Z) TOO
176 : : !C LARGE ON KODE=1
177 : : !C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
178 : : !C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
179 : : !C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
180 : : !C ACCURACY
181 : : !C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
182 : : !C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
183 : : !C CANCE BY ARGUMENT REDUCTION
184 : : !C IERR=5, ERROR - NO COMPUTATION,
185 : : !C ALGORITHM TERMINATION CONDITION NOT MET
186 : : !C
187 : : !C***LONG DESCRIPTION
188 : : !C
189 : : !C THE COMPUTATION IS CARRIED OUT BY THE POWER SERIES FOR
190 : : !C SMALL CABS(Z), THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z),
191 : : !C THE MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN AND A
192 : : !C NEUMANN SERIES FOR IMTERMEDIATE MAGNITUDES, AND THE
193 : : !C UNIFORM ASYMPTOTIC EXPANSIONS FOR I(FNU,Z) AND J(FNU,Z)
194 : : !C FOR LARGE ORDERS. BACKWARD RECURRENCE IS USED TO GENERATE
195 : : !C SEQUENCES OR REDUCE ORDERS WHEN NECESSARY.
196 : : !C
197 : : !C THE CALCULATIONS ABOVE ARE DONE IN THE RIGHT HALF PLANE AND
198 : : !C CONTINUED INTO THE LEFT HALF PLANE BY THE FORMULA
199 : : !C
200 : : !C I(FNU,Z*EXP(M*PI)) = EXP(M*PI*FNU)*I(FNU,Z) REAL(Z).GT.0.0
201 : : !C M = +I OR -I, I**2=-1
202 : : !C
203 : : !C FOR NEGATIVE ORDERS,THE FORMULA
204 : : !C
205 : : !C I(-FNU,Z) = I(FNU,Z) + (2/PI)*SIN(PI*FNU)*K(FNU,Z)
206 : : !C
207 : : !C CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
208 : : !C THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
209 : : !C INTEGER,THE MAGNITUDE OF I(-FNU,Z)=I(FNU,Z) IS A LARGE
210 : : !C NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
211 : : !C K(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
212 : : !C TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
213 : : !C UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
214 : : !C OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
215 : : !C LARGE MEANS FNU.GT.CABS(Z).
216 : : !C
217 : : !C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
218 : : !C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
219 : : !C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
220 : : !C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
221 : : !C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
222 : : !C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
223 : : !C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
224 : : !C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
225 : : !C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
226 : : !C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
227 : : !C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
228 : : !C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
229 : : !C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
230 : : !C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
231 : : !C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
232 : : !C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
233 : : !C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
234 : : !C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
235 : : !C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
236 : : !C
237 : : !C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
238 : : !C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
239 : : !C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
240 : : !C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
241 : : !C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
242 : : !C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
243 : : !C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
244 : : !C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
245 : : !C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
246 : : !C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
247 : : !C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
248 : : !C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
249 : : !C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
250 : : !C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
251 : : !C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
252 : : !C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
253 : : !C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
254 : : !C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
255 : : !C OR -PI/2+P.
256 : : !C
257 : : !C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
258 : : !C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
259 : : !C COMMERCE, 1955.
260 : : !C
261 : : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
262 : : !C BY D. E. AMOS, SAND83-0083, MAY, 1983.
263 : : !C
264 : : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
265 : : !C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
266 : : !C
267 : : !C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
268 : : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
269 : : !C 1018, MAY, 1985
270 : : !C
271 : : !C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
272 : : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
273 : : !C MATH. SOFTWARE, 1986
274 : : !C
275 : : !C***ROUTINES CALLED ZBINU,I1MACH,D1MACH
276 : : !C***END PROLOGUE ZBESI
277 : : !C COMPLEX CONE,CSGN,CW,CY,CZERO,Z,ZN
278 : : DOUBLE PRECISION AA, ALIM, ARG, CONEI, CONER, CSGNI, CSGNR, CYI, &
279 : : & CYR, DIG, ELIM, FNU, FNUL, PI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR, &
280 : : & ZR, AZ, BB, FN, ASCLE, RTOL, ATOL, STI
281 : : INTEGER I, IERR, INU, K, KODE, K1,K2,N,NZ,NN
282 : : DIMENSION CYR(N), CYI(N)
283 : : DATA PI /3.14159265358979324D0/
284 : : DATA CONER, CONEI /1.0D0,0.0D0/
285 : : !C
286 : : !C***FIRST EXECUTABLE STATEMENT ZBESI
287 : 0 : IERR = 0
288 : 0 : NZ=0
289 [ # # ]: 0 : IF (FNU.LT.0.0D0) IERR=1
290 [ # # ]: 0 : IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
291 [ # # ]: 0 : IF (N.LT.1) IERR=1
292 [ # # ]: 0 : IF (IERR.NE.0) RETURN
293 : : !C-----------------------------------------------------------------------
294 : : !C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
295 : : !C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
296 : : !C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
297 : : !C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
298 : : !C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
299 : : !C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
300 : : !C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
301 : : !C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
302 : : !C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
303 : : !C-----------------------------------------------------------------------
304 : 0 : TOL = DMAX1(D1MACH(4),1.0D-18)
305 : 0 : K1 = I1MACH(15)
306 : 0 : K2 = I1MACH(16)
307 : 0 : R1M5 = D1MACH(5)
308 : 0 : K = MIN0(IABS(K1),IABS(K2))
309 : 0 : ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
310 : 0 : K1 = I1MACH(14) - 1
311 : 0 : AA = R1M5*DBLE(FLOAT(K1))
312 : 0 : DIG = DMIN1(AA,18.0D0)
313 : 0 : AA = AA*2.303D0
314 : 0 : ALIM = ELIM + DMAX1(-AA,-41.45D0)
315 : 0 : RL = 1.2D0*DIG + 3.0D0
316 : 0 : FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
317 : : !C-----------------------------------------------------------------------------
318 : : !C TEST FOR PROPER RANGE
319 : : !C-----------------------------------------------------------------------
320 : 0 : AZ = AZABS(ZR,ZI)
321 : 0 : FN = FNU+DBLE(FLOAT(N-1))
322 : 0 : AA = 0.5D0/TOL
323 : 0 : BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
324 : 0 : AA = DMIN1(AA,BB)
325 [ # # ]: 0 : IF (AZ.GT.AA) GO TO 260
326 [ # # ]: 0 : IF (FN.GT.AA) GO TO 260
327 : 0 : AA = DSQRT(AA)
328 [ # # ]: 0 : IF (AZ.GT.AA) IERR=3
329 [ # # ]: 0 : IF (FN.GT.AA) IERR=3
330 : 0 : ZNR = ZR
331 : 0 : ZNI = ZI
332 : 0 : CSGNR = CONER
333 : 0 : CSGNI = CONEI
334 [ # # ]: 0 : IF (ZR.GE.0.0D0) GO TO 40
335 : 0 : ZNR = -ZR
336 : 0 : ZNI = -ZI
337 : : !C-----------------------------------------------------------------------
338 : : !C CALCULATE CSGN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
339 : : !C WHEN FNU IS LARGE
340 : : !C-----------------------------------------------------------------------
341 : 0 : INU = INT(SNGL(FNU))
342 : 0 : ARG = (FNU-DBLE(FLOAT(INU)))*PI
343 [ # # ]: 0 : IF (ZI.LT.0.0D0) ARG = -ARG
344 : 0 : CSGNR = DCOS(ARG)
345 : 0 : CSGNI = DSIN(ARG)
346 [ # # ]: 0 : IF (MOD(INU,2).EQ.0) GO TO 40
347 : 0 : CSGNR = -CSGNR
348 : 0 : CSGNI = -CSGNI
349 : : 40 CONTINUE
350 : : CALL ZBINU(ZNR, ZNI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, TOL, &
351 : 0 : & ELIM, ALIM)
352 [ # # ]: 0 : IF (NZ.LT.0) GO TO 120
353 [ # # ]: 0 : IF (ZR.GE.0.0D0) RETURN
354 : : !C-----------------------------------------------------------------------
355 : : !C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE
356 : : !C-----------------------------------------------------------------------
357 : 0 : NN = N - NZ
358 [ # # ]: 0 : IF (NN.EQ.0) RETURN
359 : 0 : RTOL = 1.0D0/TOL
360 : 0 : ASCLE = D1MACH(1)*RTOL*1.0D+3
361 [ # # ]: 0 : DO 50 I=1,NN
362 : : !C STR = CYR(I)*CSGNR - CYI(I)*CSGNI
363 : : !C CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
364 : : !C CYR(I) = STR
365 : 0 : AA = CYR(I)
366 : 0 : BB = CYI(I)
367 : 0 : ATOL = 1.0D0
368 [ # # ]: 0 : IF (DMAX1(DABS(AA),DABS(BB)).GT.ASCLE) GO TO 55
369 : 0 : AA = AA*RTOL
370 : 0 : BB = BB*RTOL
371 : 0 : ATOL = TOL
372 : : 55 CONTINUE
373 : 0 : STR = AA*CSGNR - BB*CSGNI
374 : 0 : STI = AA*CSGNI + BB*CSGNR
375 : 0 : CYR(I) = STR*ATOL
376 : 0 : CYI(I) = STI*ATOL
377 : 0 : CSGNR = -CSGNR
378 : 0 : CSGNI = -CSGNI
379 : 0 : 50 CONTINUE
380 : 0 : RETURN
381 : : 120 CONTINUE
382 [ # # ]: 0 : IF(NZ.EQ.(-2)) GO TO 130
383 : 0 : NZ = 0
384 : 0 : IERR=2
385 : 0 : RETURN
386 : : 130 CONTINUE
387 : 0 : NZ=0
388 : 0 : IERR=5
389 : 0 : RETURN
390 : : 260 CONTINUE
391 : 0 : NZ=0
392 : 0 : IERR=4
393 : 0 : RETURN
394 : : END SUBROUTINE ZBESI
395 : :
396 : :
397 : 0 : SUBROUTINE ZBESK(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
398 : : !C***BEGIN PROLOGUE ZBESK
399 : : !C***DATE WRITTEN 830501 (YYMMDD)
400 : : !C***REVISION DATE 890801 (YYMMDD)
401 : : !C***CATEGORY NO. B5K
402 : : !C***KEYWORDS K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
403 : : !C MODIFIED BESSEL FUNCTION OF THE SECOND KIND,
404 : : !C BESSEL FUNCTION OF THE THIRD KIND
405 : : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
406 : : !C***PURPOSE TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
407 : : !C***DESCRIPTION
408 : : !C
409 : : !C ***A DOUBLE PRECISION ROUTINE***
410 : : !C
411 : : !C ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
412 : : !C BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE
413 : : !C ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0)
414 : : !C IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK
415 : : !C RETURNS THE SCALED K FUNCTIONS,
416 : : !C
417 : : !C CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N,
418 : : !C
419 : : !C WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND
420 : : !C RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND
421 : : !C NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL
422 : : !C FUNCTIONS (REF. 1).
423 : : !C
424 : : !C INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
425 : : !C ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
426 : : !C -PI.LT.ARG(Z).LE.PI
427 : : !C FNU - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0
428 : : !C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
429 : : !C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
430 : : !C KODE= 1 RETURNS
431 : : !C CY(I)=K(FNU+I-1,Z), I=1,...,N
432 : : !C = 2 RETURNS
433 : : !C CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
434 : : !C
435 : : !C OUTPUT CYR,CYI ARE DOUBLE PRECISION
436 : : !C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
437 : : !C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
438 : : !C CY(I)=K(FNU+I-1,Z), I=1,...,N OR
439 : : !C CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
440 : : !C DEPENDING ON KODE
441 : : !C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW.
442 : : !C NZ= 0 , NORMAL RETURN
443 : : !C NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
444 : : !C TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
445 : : !C I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0
446 : : !C NZ STATES ONLY THE NUMBER OF UNDERFLOWS
447 : : !C IN THE SEQUENCE.
448 : : !C
449 : : !C IERR - ERROR FLAG
450 : : !C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
451 : : !C IERR=1, INPUT ERROR - NO COMPUTATION
452 : : !C IERR=2, OVERFLOW - NO COMPUTATION, FNU IS
453 : : !C TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
454 : : !C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
455 : : !C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
456 : : !C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
457 : : !C ACCURACY
458 : : !C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
459 : : !C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
460 : : !C CANCE BY ARGUMENT REDUCTION
461 : : !C IERR=5, ERROR - NO COMPUTATION,
462 : : !C ALGORITHM TERMINATION CONDITION NOT MET
463 : : !C
464 : : !C***LONG DESCRIPTION
465 : : !C
466 : : !C EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS
467 : : !C DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD
468 : : !C RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT
469 : : !C HALF PLANE BY THE RELATION
470 : : !C
471 : : !C K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
472 : : !C MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
473 : : !C
474 : : !C WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
475 : : !C
476 : : !C FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED
477 : : !C BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS.
478 : : !C
479 : : !C FOR NEGATIVE ORDERS, THE FORMULA
480 : : !C
481 : : !C K(-FNU,Z) = K(FNU,Z)
482 : : !C
483 : : !C CAN BE USED.
484 : : !C
485 : : !C CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS
486 : : !C AVAILABLE.
487 : : !C
488 : : !C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
489 : : !C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
490 : : !C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
491 : : !C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
492 : : !C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
493 : : !C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
494 : : !C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
495 : : !C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
496 : : !C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
497 : : !C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
498 : : !C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
499 : : !C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
500 : : !C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
501 : : !C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
502 : : !C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
503 : : !C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
504 : : !C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
505 : : !C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
506 : : !C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
507 : : !C
508 : : !C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
509 : : !C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
510 : : !C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
511 : : !C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
512 : : !C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
513 : : !C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
514 : : !C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
515 : : !C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
516 : : !C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
517 : : !C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
518 : : !C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
519 : : !C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
520 : : !C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
521 : : !C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
522 : : !C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
523 : : !C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
524 : : !C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
525 : : !C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
526 : : !C OR -PI/2+P.
527 : : !C
528 : : !C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
529 : : !C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
530 : : !C COMMERCE, 1955.
531 : : !C
532 : : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
533 : : !C BY D. E. AMOS, SAND83-0083, MAY, 1983.
534 : : !C
535 : : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
536 : : !C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983.
537 : : !C
538 : : !C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
539 : : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
540 : : !C 1018, MAY, 1985
541 : : !C
542 : : !C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
543 : : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
544 : : !C MATH. SOFTWARE, 1986
545 : : !C
546 : : !C***ROUTINES CALLED ZACON,ZBKNU,ZBUNK,ZUOIK,AZABS,I1MACH,D1MACH
547 : : !C***END PROLOGUE ZBESK
548 : : !C
549 : : !C COMPLEX CY,Z
550 : : DOUBLE PRECISION AA, ALIM, ALN, ARG, AZ, CYI, CYR, DIG, ELIM, FN, &
551 : : & FNU, FNUL, RL, R1M5, TOL, UFL, ZI, ZR, BB !D1MACH, AZABS
552 : : INTEGER IERR, K, KODE, K1, K2, MR, N, NN, NUF, NW, NZ!, I1MACH
553 : : DIMENSION CYR(N), CYI(N)
554 : : !C***FIRST EXECUTABLE STATEMENT ZBESK
555 : 0 : IERR = 0
556 : 0 : NZ=0
557 [ # # # # ]: 0 : IF (ZI.EQ.0.0E0 .AND. ZR.EQ.0.0E0) IERR=1
558 [ # # ]: 0 : IF (FNU.LT.0.0D0) IERR=1
559 [ # # ]: 0 : IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
560 [ # # ]: 0 : IF (N.LT.1) IERR=1
561 [ # # ]: 0 : IF (IERR.NE.0) RETURN
562 : 0 : NN = N
563 : : !C-----------------------------------------------------------------------
564 : : !C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
565 : : !C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
566 : : !C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
567 : : !C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
568 : : !C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
569 : : !C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
570 : : !C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
571 : : !C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
572 : : !C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
573 : : !C-----------------------------------------------------------------------
574 : 0 : TOL = DMAX1(D1MACH(4),1.0D-18)
575 : 0 : K1 = I1MACH(15)
576 : 0 : K2 = I1MACH(16)
577 : 0 : R1M5 = D1MACH(5)
578 : 0 : K = MIN0(IABS(K1),IABS(K2))
579 : 0 : ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
580 : 0 : K1 = I1MACH(14) - 1
581 : 0 : AA = R1M5*DBLE(FLOAT(K1))
582 : 0 : DIG = DMIN1(AA,18.0D0)
583 : 0 : AA = AA*2.303D0
584 : 0 : ALIM = ELIM + DMAX1(-AA,-41.45D0)
585 : 0 : FNUL = 10.0D0 + 6.0D0*(DIG-3.0D0)
586 : 0 : RL = 1.2D0*DIG + 3.0D0
587 : : !C-----------------------------------------------------------------------------
588 : : !C TEST FOR PROPER RANGE
589 : : !C-----------------------------------------------------------------------
590 : 0 : AZ = AZABS(ZR,ZI)
591 : 0 : FN = FNU + DBLE(FLOAT(NN-1))
592 : 0 : AA = 0.5D0/TOL
593 : 0 : BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
594 : 0 : AA = DMIN1(AA,BB)
595 [ # # ]: 0 : IF (AZ.GT.AA) GO TO 260
596 [ # # ]: 0 : IF (FN.GT.AA) GO TO 260
597 : 0 : AA = DSQRT(AA)
598 [ # # ]: 0 : IF (AZ.GT.AA) IERR=3
599 [ # # ]: 0 : IF (FN.GT.AA) IERR=3
600 : : !C-----------------------------------------------------------------------
601 : : !C OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
602 : : !C-----------------------------------------------------------------------
603 : : !C UFL = DEXP(-ELIM)
604 : 0 : UFL = D1MACH(1)*1.0D+3
605 [ # # ]: 0 : IF (AZ.LT.UFL) GO TO 180
606 [ # # ]: 0 : IF (FNU.GT.FNUL) GO TO 80
607 [ # # ]: 0 : IF (FN.LE.1.0D0) GO TO 60
608 [ # # ]: 0 : IF (FN.GT.2.0D0) GO TO 50
609 [ # # ]: 0 : IF (AZ.GT.TOL) GO TO 60
610 : 0 : ARG = 0.5D0*AZ
611 : 0 : ALN = -FN*DLOG(ARG)
612 [ # # ]: 0 : IF (ALN.GT.ELIM) GO TO 180
613 : 0 : GO TO 60
614 : : 50 CONTINUE
615 : : CALL ZUOIK(ZR, ZI, FNU, KODE, 2, NN, CYR, CYI, NUF, TOL, ELIM, &
616 : 0 : & ALIM)
617 [ # # ]: 0 : IF (NUF.LT.0) GO TO 180
618 : 0 : NZ = NZ + NUF
619 : 0 : NN = NN - NUF
620 : : !C-----------------------------------------------------------------------
621 : : !C HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
622 : : !C IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
623 : : !C-----------------------------------------------------------------------
624 [ # # ]: 0 : IF (NN.EQ.0) GO TO 100
625 : : 60 CONTINUE
626 [ # # ]: 0 : IF (ZR.LT.0.0D0) GO TO 70
627 : : !C-----------------------------------------------------------------------
628 : : !C RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0.
629 : : !C-----------------------------------------------------------------------
630 : 0 : CALL ZBKNU(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
631 [ # # ]: 0 : IF (NW.LT.0) GO TO 200
632 : 0 : NZ=NW
633 : 0 : RETURN
634 : : !C-----------------------------------------------------------------------
635 : : !C LEFT HALF PLANE COMPUTATION
636 : : !C PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2.
637 : : !C-----------------------------------------------------------------------
638 : : 70 CONTINUE
639 [ # # ]: 0 : IF (NZ.NE.0) GO TO 180
640 : 0 : MR = 1
641 [ # # ]: 0 : IF (ZI.LT.0.0D0) MR = -1
642 : : CALL ZACON(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, RL, FNUL, &
643 : 0 : & TOL, ELIM, ALIM)
644 [ # # ]: 0 : IF (NW.LT.0) GO TO 200
645 : 0 : NZ=NW
646 : 0 : RETURN
647 : : !C-----------------------------------------------------------------------
648 : : !C UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
649 : : !C-----------------------------------------------------------------------
650 : : 80 CONTINUE
651 : 0 : MR = 0
652 [ # # ]: 0 : IF (ZR.GE.0.0D0) GO TO 90
653 : 0 : MR = 1
654 [ # # ]: 0 : IF (ZI.LT.0.0D0) MR = -1
655 : : 90 CONTINUE
656 : : CALL ZBUNK(ZR, ZI, FNU, KODE, MR, NN, CYR, CYI, NW, TOL, ELIM, &
657 : 0 : & ALIM)
658 [ # # ]: 0 : IF (NW.LT.0) GO TO 200
659 : 0 : NZ = NZ + NW
660 : 0 : RETURN
661 : : 100 CONTINUE
662 [ # # ]: 0 : IF (ZR.LT.0.0D0) GO TO 180
663 : 0 : RETURN
664 : : 180 CONTINUE
665 : 0 : NZ = 0
666 : 0 : IERR=2
667 : 0 : RETURN
668 : : 200 CONTINUE
669 [ # # ]: 0 : IF(NW.EQ.(-1)) GO TO 180
670 : 0 : NZ=0
671 : 0 : IERR=5
672 : 0 : RETURN
673 : : 260 CONTINUE
674 : 0 : NZ=0
675 : 0 : IERR=4
676 : 0 : RETURN
677 : : END SUBROUTINE ZBESK
678 : :
679 : 0 : DOUBLE PRECISION FUNCTION AZABS(ZR, ZI)
680 : : !C***BEGIN PROLOGUE AZABS
681 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
682 : : !C
683 : : !C AZABS COMPUTES THE ABSOLUTE VALUE OR MAGNITUDE OF A DOUBLE
684 : : !C PRECISION COMPLEX VARIABLE CMPLX(ZR,ZI)
685 : : !C
686 : : !C***ROUTINES CALLED (NONE)
687 : : !C***END PROLOGUE AZABS
688 : : DOUBLE PRECISION ZR, ZI, U, V, Q, S
689 : 0 : U = DABS(ZR)
690 : 0 : V = DABS(ZI)
691 : 0 : S = U + V
692 : : !C-----------------------------------------------------------------------
693 : : !C S*1.0D0 MAKES AN UNNORMALIZED UNDERFLOW ON CDC MACHINES INTO A
694 : : !C TRUE FLOATING ZERO
695 : : !C-----------------------------------------------------------------------
696 : 0 : S = S*1.0D+0
697 [ # # ]: 0 : IF (S.EQ.0.0D+0) GO TO 20
698 [ # # ]: 0 : IF (U.GT.V) GO TO 10
699 : 0 : Q = U/V
700 : 0 : AZABS = V*DSQRT(1.D+0+Q*Q)
701 : 0 : RETURN
702 : 0 : 10 Q = V/U
703 : 0 : AZABS = U*DSQRT(1.D+0+Q*Q)
704 : 0 : RETURN
705 : 0 : 20 AZABS = 0.0D+0
706 : : RETURN
707 : : END FUNCTION AZABS
708 : :
709 : :
710 : :
711 : 0 : SUBROUTINE ZACON(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, FNUL, &
712 : : & TOL, ELIM, ALIM)
713 : : !C***BEGIN PROLOGUE ZACON
714 : : !C***REFER TO ZBESK,ZBESH
715 : : !C
716 : : !C ZACON APPLIES THE ANALYTIC CONTINUATION FORMULA
717 : : !C
718 : : !C K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
719 : : !C MP=PI*MR*CMPLX(0.0,1.0)
720 : : !C
721 : : !C TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
722 : : !C HALF Z PLANE
723 : : !C
724 : : !C***ROUTINES CALLED ZBINU,ZBKNU,ZS1S2,D1MACH,AZABS,ZMLT
725 : : !C***END PROLOGUE ZACON
726 : : !C COMPLEX CK,CONE,CSCL,CSCR,CSGN,CSPN,CY,CZERO,C1,C2,RZ,SC1,SC2,ST,
727 : : !C *S1,S2,Y,Z,ZN
728 : : DOUBLE PRECISION ALIM, ARG, ASCLE, AS2, AZN, BRY, BSCLE, CKI, &
729 : : & CKR, CONER, CPN, CSCL, CSCR, CSGNI, CSGNR, CSPNI, CSPNR, &
730 : : & CSR, CSRR, CSSR, CYI, CYR, C1I, C1M, C1R, C2I, C2R, ELIM, FMR, &
731 : : & FN, FNU, FNUL, PI, PTI, PTR, RAZN, RL, RZI, RZR, SC1I, SC1R, &
732 : : & SC2I, SC2R, SGN, SPN, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, &
733 : : & YY, ZEROR, ZI, ZNI, ZNR, ZR!, D1MACH, AZABS
734 : : INTEGER I, INU, IUF, KFLAG, KODE, MR, N, NN, NW, NZ
735 : : DIMENSION YR(N), YI(N), CYR(2), CYI(2), CSSR(3), CSRR(3), BRY(3)
736 : : DATA PI / 3.14159265358979324D0 /
737 : : DATA ZEROR,CONER / 0.0D0,1.0D0 /
738 : 0 : NZ = 0
739 : 0 : ZNR = -ZR
740 : 0 : ZNI = -ZI
741 : 0 : NN = N
742 : : CALL ZBINU(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, FNUL, TOL, &
743 : 0 : & ELIM, ALIM)
744 [ # # ]: 0 : IF (NW.LT.0) GO TO 90
745 : : !C-----------------------------------------------------------------------
746 : : !C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
747 : : !C-----------------------------------------------------------------------
748 : 0 : NN = MIN0(2,N)
749 : 0 : CALL ZBKNU(ZNR, ZNI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
750 [ # # ]: 0 : IF (NW.NE.0) GO TO 90
751 : 0 : S1R = CYR(1)
752 : 0 : S1I = CYI(1)
753 : 0 : FMR = DBLE(FLOAT(MR))
754 : 0 : SGN = -DSIGN(PI,FMR)
755 : 0 : CSGNR = ZEROR
756 : 0 : CSGNI = SGN
757 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 10
758 : 0 : YY = -ZNI
759 : 0 : CPN = DCOS(YY)
760 : 0 : SPN = DSIN(YY)
761 : 0 : CALL ZMLT(CSGNR, CSGNI, CPN, SPN, CSGNR, CSGNI)
762 : : 10 CONTINUE
763 : : !C-----------------------------------------------------------------------
764 : : !C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
765 : : !C WHEN FNU IS LARGE
766 : : !C-----------------------------------------------------------------------
767 : 0 : INU = INT(SNGL(FNU))
768 : 0 : ARG = (FNU-DBLE(FLOAT(INU)))*SGN
769 : 0 : CPN = DCOS(ARG)
770 : 0 : SPN = DSIN(ARG)
771 : 0 : CSPNR = CPN
772 : 0 : CSPNI = SPN
773 [ # # ]: 0 : IF (MOD(INU,2).EQ.0) GO TO 20
774 : 0 : CSPNR = -CSPNR
775 : 0 : CSPNI = -CSPNI
776 : : 20 CONTINUE
777 : 0 : IUF = 0
778 : 0 : C1R = S1R
779 : 0 : C1I = S1I
780 : 0 : C2R = YR(1)
781 : 0 : C2I = YI(1)
782 : 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
783 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 30
784 : 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
785 : 0 : NZ = NZ + NW
786 : 0 : SC1R = C1R
787 : 0 : SC1I = C1I
788 : : 30 CONTINUE
789 : 0 : CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
790 : 0 : CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
791 : 0 : YR(1) = STR + PTR
792 : 0 : YI(1) = STI + PTI
793 : 0 : IF (N.EQ.1) RETURN
794 : 0 : CSPNR = -CSPNR
795 : 0 : CSPNI = -CSPNI
796 : 0 : S2R = CYR(2)
797 : 0 : S2I = CYI(2)
798 : 0 : C1R = S2R
799 : 0 : C1I = S2I
800 : 0 : C2R = YR(2)
801 : 0 : C2I = YI(2)
802 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 40
803 : 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
804 : 0 : NZ = NZ + NW
805 : 0 : SC2R = C1R
806 : 0 : SC2I = C1I
807 : : 40 CONTINUE
808 : 0 : CALL ZMLT(CSPNR, CSPNI, C1R, C1I, STR, STI)
809 : 0 : CALL ZMLT(CSGNR, CSGNI, C2R, C2I, PTR, PTI)
810 : 0 : YR(2) = STR + PTR
811 : 0 : YI(2) = STI + PTI
812 : 0 : IF (N.EQ.2) RETURN
813 : 0 : CSPNR = -CSPNR
814 : 0 : CSPNI = -CSPNI
815 : 0 : AZN = AZABS(ZNR,ZNI)
816 : 0 : RAZN = 1.0D0/AZN
817 : 0 : STR = ZNR*RAZN
818 : 0 : STI = -ZNI*RAZN
819 : 0 : RZR = (STR+STR)*RAZN
820 : 0 : RZI = (STI+STI)*RAZN
821 : 0 : FN = FNU + 1.0D0
822 : 0 : CKR = FN*RZR
823 : 0 : CKI = FN*RZI
824 : : !C-----------------------------------------------------------------------
825 : : !C SCALE NEAR EXPONENT EXTREMES DURING RECURRENCE ON K FUNCTIONS
826 : : !C-----------------------------------------------------------------------
827 : 0 : CSCL = 1.0D0/TOL
828 : 0 : CSCR = TOL
829 : 0 : CSSR(1) = CSCL
830 : 0 : CSSR(2) = CONER
831 : 0 : CSSR(3) = CSCR
832 : 0 : CSRR(1) = CSCR
833 : 0 : CSRR(2) = CONER
834 : 0 : CSRR(3) = CSCL
835 : 0 : BRY(1) = ASCLE
836 : 0 : BRY(2) = 1.0D0/ASCLE
837 : 0 : BRY(3) = D1MACH(2)
838 : 0 : AS2 = AZABS(S2R,S2I)
839 : 0 : KFLAG = 2
840 [ # # ]: 0 : IF (AS2.GT.BRY(1)) GO TO 50
841 : : KFLAG = 1
842 : 0 : GO TO 60
843 : : 50 CONTINUE
844 [ # # ]: 0 : IF (AS2.LT.BRY(2)) GO TO 60
845 : 0 : KFLAG = 3
846 : : 60 CONTINUE
847 : 0 : BSCLE = BRY(KFLAG)
848 : 0 : S1R = S1R*CSSR(KFLAG)
849 : 0 : S1I = S1I*CSSR(KFLAG)
850 : 0 : S2R = S2R*CSSR(KFLAG)
851 : 0 : S2I = S2I*CSSR(KFLAG)
852 : 0 : CSR = CSRR(KFLAG)
853 [ # # ]: 0 : DO 80 I=3,N
854 : 0 : STR = S2R
855 : 0 : STI = S2I
856 : 0 : S2R = CKR*STR - CKI*STI + S1R
857 : 0 : S2I = CKR*STI + CKI*STR + S1I
858 : 0 : S1R = STR
859 : 0 : S1I = STI
860 : 0 : C1R = S2R*CSR
861 : 0 : C1I = S2I*CSR
862 : 0 : STR = C1R
863 : 0 : STI = C1I
864 : 0 : C2R = YR(I)
865 : 0 : C2I = YI(I)
866 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 70
867 [ # # ]: 0 : IF (IUF.LT.0) GO TO 70
868 : 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
869 : 0 : NZ = NZ + NW
870 : 0 : SC1R = SC2R
871 : 0 : SC1I = SC2I
872 : 0 : SC2R = C1R
873 : 0 : SC2I = C1I
874 [ # # ]: 0 : IF (IUF.NE.3) GO TO 70
875 : 0 : IUF = -4
876 : 0 : S1R = SC1R*CSSR(KFLAG)
877 : 0 : S1I = SC1I*CSSR(KFLAG)
878 : 0 : S2R = SC2R*CSSR(KFLAG)
879 : 0 : S2I = SC2I*CSSR(KFLAG)
880 : 0 : STR = SC2R
881 : 0 : STI = SC2I
882 : : 70 CONTINUE
883 : 0 : PTR = CSPNR*C1R - CSPNI*C1I
884 : 0 : PTI = CSPNR*C1I + CSPNI*C1R
885 : 0 : YR(I) = PTR + CSGNR*C2R - CSGNI*C2I
886 : 0 : YI(I) = PTI + CSGNR*C2I + CSGNI*C2R
887 : 0 : CKR = CKR + RZR
888 : 0 : CKI = CKI + RZI
889 : 0 : CSPNR = -CSPNR
890 : 0 : CSPNI = -CSPNI
891 [ # # ]: 0 : IF (KFLAG.GE.3) GO TO 80
892 : 0 : PTR = DABS(C1R)
893 : 0 : PTI = DABS(C1I)
894 : 0 : C1M = DMAX1(PTR,PTI)
895 [ # # ]: 0 : IF (C1M.LE.BSCLE) GO TO 80
896 : 0 : KFLAG = KFLAG + 1
897 : 0 : BSCLE = BRY(KFLAG)
898 : 0 : S1R = S1R*CSR
899 : 0 : S1I = S1I*CSR
900 : : S2R = STR
901 : : S2I = STI
902 : 0 : S1R = S1R*CSSR(KFLAG)
903 : 0 : S1I = S1I*CSSR(KFLAG)
904 : 0 : S2R = S2R*CSSR(KFLAG)
905 : 0 : S2I = S2I*CSSR(KFLAG)
906 : 0 : CSR = CSRR(KFLAG)
907 : 0 : 80 CONTINUE
908 : 0 : RETURN
909 : : 90 CONTINUE
910 : 0 : NZ = -1
911 [ # # ]: 0 : IF(NW.EQ.(-2)) NZ=-2
912 : : RETURN
913 : : END SUBROUTINE ZACON
914 : :
915 : 0 : SUBROUTINE ZBINU(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, RL, FNUL, &
916 : : & TOL, ELIM, ALIM)
917 : : !C***BEGIN PROLOGUE ZBINU
918 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZAIRY,ZBIRY
919 : : !C
920 : : !C ZBINU COMPUTES THE I FUNCTION IN THE RIGHT HALF Z PLANE
921 : : !C
922 : : !C***ROUTINES CALLED AZABS,ZASYI,ZBUNI,ZMLRI,ZSERI,ZUOIK,ZWRSK
923 : : !C***END PROLOGUE ZBINU
924 : : DOUBLE PRECISION ALIM, AZ, CWI, CWR, CYI, CYR, DFNU, ELIM, FNU, &
925 : : & FNUL, RL, TOL, ZEROI, ZEROR, ZI, ZR!, AZABS
926 : : INTEGER I, INW, KODE, N, NLAST, NN, NUI, NW, NZ
927 : : DIMENSION CYR(N), CYI(N), CWR(2), CWI(2)
928 : : DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
929 : : !C
930 : 0 : NZ = 0
931 : 0 : AZ = AZABS(ZR,ZI)
932 : 0 : NN = N
933 : 0 : DFNU = FNU + DBLE(FLOAT(N-1))
934 [ # # ]: 0 : IF (AZ.LE.2.0D0) GO TO 10
935 [ # # ]: 0 : IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
936 : : 10 CONTINUE
937 : : !C-----------------------------------------------------------------------
938 : : !C POWER SERIES
939 : : !C-----------------------------------------------------------------------
940 : 0 : CALL ZSERI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL, ELIM, ALIM)
941 : 0 : INW = IABS(NW)
942 : 0 : NZ = NZ + INW
943 : 0 : NN = NN - INW
944 [ # # ]: 0 : IF (NN.EQ.0) RETURN
945 [ # # ]: 0 : IF (NW.GE.0) GO TO 120
946 : 0 : DFNU = FNU + DBLE(FLOAT(NN-1))
947 : : 20 CONTINUE
948 [ # # ]: 0 : IF (AZ.LT.RL) GO TO 40
949 [ # # ]: 0 : IF (DFNU.LE.1.0D0) GO TO 30
950 [ # # ]: 0 : IF (AZ+AZ.LT.DFNU*DFNU) GO TO 50
951 : : !C-----------------------------------------------------------------------
952 : : !C ASYMPTOTIC EXPANSION FOR LARGE Z
953 : : !C-----------------------------------------------------------------------
954 : : 30 CONTINUE
955 : : CALL ZASYI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, RL, TOL, ELIM, &
956 : 0 : & ALIM)
957 [ # # ]: 0 : IF (NW.LT.0) GO TO 130
958 : 0 : GO TO 120
959 : : 40 CONTINUE
960 [ # # ]: 0 : IF (DFNU.LE.1.0D0) GO TO 70
961 : : 50 CONTINUE
962 : : !C-----------------------------------------------------------------------
963 : : !C OVERFLOW AND UNDERFLOW TEST ON I SEQUENCE FOR MILLER ALGORITHM
964 : : !C-----------------------------------------------------------------------
965 : : CALL ZUOIK(ZR, ZI, FNU, KODE, 1, NN, CYR, CYI, NW, TOL, ELIM, &
966 : 0 : & ALIM)
967 [ # # ]: 0 : IF (NW.LT.0) GO TO 130
968 : 0 : NZ = NZ + NW
969 : 0 : NN = NN - NW
970 [ # # ]: 0 : IF (NN.EQ.0) RETURN
971 : 0 : DFNU = FNU+DBLE(FLOAT(NN-1))
972 [ # # ]: 0 : IF (DFNU.GT.FNUL) GO TO 110
973 [ # # ]: 0 : IF (AZ.GT.FNUL) GO TO 110
974 : : 60 CONTINUE
975 [ # # ]: 0 : IF (AZ.GT.RL) GO TO 80
976 : : 70 CONTINUE
977 : : !C-----------------------------------------------------------------------
978 : : !C MILLER ALGORITHM NORMALIZED BY THE SERIES
979 : : !C-----------------------------------------------------------------------
980 : 0 : CALL ZMLRI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, TOL)
981 [ # # ]: 0 : IF(NW.LT.0) GO TO 130
982 : 0 : GO TO 120
983 : : 80 CONTINUE
984 : : !C-----------------------------------------------------------------------
985 : : !C MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN
986 : : !C-----------------------------------------------------------------------
987 : : !C-----------------------------------------------------------------------
988 : : !C OVERFLOW TEST ON K FUNCTIONS USED IN WRONSKIAN
989 : : !C-----------------------------------------------------------------------
990 : : CALL ZUOIK(ZR, ZI, FNU, KODE, 2, 2, CWR, CWI, NW, TOL, ELIM, &
991 : 0 : & ALIM)
992 [ # # ]: 0 : IF (NW.GE.0) GO TO 100
993 : 0 : NZ = NN
994 [ # # ]: 0 : DO 90 I=1,NN
995 : 0 : CYR(I) = ZEROR
996 : 0 : CYI(I) = ZEROI
997 : 0 : 90 CONTINUE
998 : 0 : RETURN
999 : : 100 CONTINUE
1000 [ # # ]: 0 : IF (NW.GT.0) GO TO 130
1001 : : CALL ZWRSK(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, CWR, CWI, TOL, &
1002 : 0 : & ELIM, ALIM)
1003 [ # # ]: 0 : IF (NW.LT.0) GO TO 130
1004 : 0 : GO TO 120
1005 : : 110 CONTINUE
1006 : : !C-----------------------------------------------------------------------
1007 : : !C INCREMENT FNU+NN-1 UP TO FNUL, COMPUTE AND RECUR BACKWARD
1008 : : !C-----------------------------------------------------------------------
1009 : 0 : NUI = INT(SNGL(FNUL-DFNU)) + 1
1010 : 0 : NUI = MAX0(NUI,0)
1011 : : CALL ZBUNI(ZR, ZI, FNU, KODE, NN, CYR, CYI, NW, NUI, NLAST, FNUL, &
1012 : 0 : & TOL, ELIM, ALIM)
1013 [ # # ]: 0 : IF (NW.LT.0) GO TO 130
1014 : 0 : NZ = NZ + NW
1015 [ # # ]: 0 : IF (NLAST.EQ.0) GO TO 120
1016 : 0 : NN = NLAST
1017 : 0 : GO TO 60
1018 : : 120 CONTINUE
1019 : 0 : RETURN
1020 : : 130 CONTINUE
1021 : 0 : NZ = -1
1022 [ # # ]: 0 : IF(NW.EQ.(-2)) NZ=-2
1023 : : RETURN
1024 : : END SUBROUTINE ZBINU
1025 : :
1026 : 0 : SUBROUTINE ZSERI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, &
1027 : : & ALIM)
1028 : : !C***BEGIN PROLOGUE ZSERI
1029 : : !C***REFER TO ZBESI,ZBESK
1030 : : !C
1031 : : !C ZSERI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
1032 : : !C MEANS OF THE POWER SERIES FOR LARGE CABS(Z) IN THE
1033 : : !C REGION CABS(Z).LE.2*SQRT(FNU+1). NZ=0 IS A NORMAL RETURN.
1034 : : !C NZ.GT.0 MEANS THAT THE LAST NZ COMPONENTS WERE SET TO ZERO
1035 : : !C DUE TO UNDERFLOW. NZ.LT.0 MEANS UNDERFLOW OCCURRED, BUT THE
1036 : : !C CONDITION CABS(Z).LE.2*SQRT(FNU+1) WAS VIOLATED AND THE
1037 : : !C COMPUTATION MUST BE COMPLETED IN ANOTHER ROUTINE WITH N=N-ABS(NZ).
1038 : : !C
1039 : : !C***ROUTINES CALLED DGAMLN,D1MACH,ZUCHK,AZABS,ZDIV,AZLOG,ZMLT
1040 : : !C***END PROLOGUE ZSERI
1041 : : !C COMPLEX AK1,CK,COEF,CONE,CRSC,CSCL,CZ,CZERO,HZ,RZ,S1,S2,Y,Z
1042 : : DOUBLE PRECISION AA, ACZ, AK, AK1I, AK1R, ALIM, ARM, ASCLE, ATOL, &
1043 : : & AZ, CKI, CKR, COEFI, COEFR, CONEI, CONER, CRSCR, CZI, CZR, DFNU, &
1044 : : & ELIM, FNU, FNUP, HZI, HZR, RAZ, RS, RTR1, RZI, RZR, S, SS, STI, &
1045 : : & STR, S1I, S1R, S2I, S2R, TOL, YI, YR, WI, WR, ZEROI, ZEROR, ZI, &
1046 : : & ZR!, DGAMLN, D1MACH, AZABS
1047 : : INTEGER I, IB, IDUM, IFLAG, IL, K, KODE, L, M, N, NN, NZ, NW
1048 : : DIMENSION YR(N), YI(N), WR(2), WI(2)
1049 : : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
1050 : : !C
1051 : 0 : NZ = 0
1052 : 0 : AZ = AZABS(ZR,ZI)
1053 [ # # ]: 0 : IF (AZ.EQ.0.0D0) GO TO 160
1054 : 0 : ARM = 1.0D+3*D1MACH(1)
1055 : 0 : RTR1 = DSQRT(ARM)
1056 : 0 : CRSCR = 1.0D0
1057 : 0 : IFLAG = 0
1058 [ # # ]: 0 : IF (AZ.LT.ARM) GO TO 150
1059 : 0 : HZR = 0.5D0*ZR
1060 : 0 : HZI = 0.5D0*ZI
1061 : 0 : CZR = ZEROR
1062 : 0 : CZI = ZEROI
1063 [ # # ]: 0 : IF (AZ.LE.RTR1) GO TO 10
1064 : 0 : CALL ZMLT(HZR, HZI, HZR, HZI, CZR, CZI)
1065 : : 10 CONTINUE
1066 : 0 : ACZ = AZABS(CZR,CZI)
1067 : 0 : NN = N
1068 : 0 : CALL AZLOG(HZR, HZI, CKR, CKI, IDUM)
1069 : : 20 CONTINUE
1070 : 0 : DFNU = FNU + DBLE(FLOAT(NN-1))
1071 : 0 : FNUP = DFNU + 1.0D0
1072 : : !C-----------------------------------------------------------------------
1073 : : !C UNDERFLOW TEST
1074 : : !C-----------------------------------------------------------------------
1075 : 0 : AK1R = CKR*DFNU
1076 : 0 : AK1I = CKI*DFNU
1077 : 0 : AK = DGAMLN(FNUP,IDUM)
1078 : 0 : AK1R = AK1R - AK
1079 [ # # ]: 0 : IF (KODE.EQ.2) AK1R = AK1R - ZR
1080 [ # # ]: 0 : IF (AK1R.GT.(-ELIM)) GO TO 40
1081 : : 30 CONTINUE
1082 : 0 : NZ = NZ + 1
1083 : 0 : YR(NN) = ZEROR
1084 : 0 : YI(NN) = ZEROI
1085 : 0 : IF (ACZ.GT.DFNU) GO TO 190
1086 : 0 : NN = NN - 1
1087 [ # # ]: 0 : IF (NN.EQ.0) RETURN
1088 : 0 : GO TO 20
1089 : : 40 CONTINUE
1090 [ # # ]: 0 : IF (AK1R.GT.(-ALIM)) GO TO 50
1091 : 0 : IFLAG = 1
1092 : 0 : SS = 1.0D0/TOL
1093 : 0 : CRSCR = TOL
1094 : 0 : ASCLE = ARM*SS
1095 : : 50 CONTINUE
1096 : 0 : AA = DEXP(AK1R)
1097 [ # # ]: 0 : IF (IFLAG.EQ.1) AA = AA*SS
1098 : 0 : COEFR = AA*DCOS(AK1I)
1099 : 0 : COEFI = AA*DSIN(AK1I)
1100 : 0 : ATOL = TOL*ACZ/FNUP
1101 : 0 : IL = MIN0(2,NN)
1102 [ # # ]: 0 : DO 90 I=1,IL
1103 : 0 : DFNU = FNU + DBLE(FLOAT(NN-I))
1104 : 0 : FNUP = DFNU + 1.0D0
1105 : 0 : S1R = CONER
1106 : 0 : S1I = CONEI
1107 [ # # ]: 0 : IF (ACZ.LT.TOL*FNUP) GO TO 70
1108 : 0 : AK1R = CONER
1109 : 0 : AK1I = CONEI
1110 : 0 : AK = FNUP + 2.0D0
1111 : 0 : S = FNUP
1112 : 0 : AA = 2.0D0
1113 : : 60 CONTINUE
1114 : 0 : RS = 1.0D0/S
1115 : 0 : STR = AK1R*CZR - AK1I*CZI
1116 : 0 : STI = AK1R*CZI + AK1I*CZR
1117 : 0 : AK1R = STR*RS
1118 : 0 : AK1I = STI*RS
1119 : 0 : S1R = S1R + AK1R
1120 : 0 : S1I = S1I + AK1I
1121 : 0 : S = S + AK
1122 : 0 : AK = AK + 2.0D0
1123 : 0 : AA = AA*ACZ*RS
1124 [ # # ]: 0 : IF (AA.GT.ATOL) GO TO 60
1125 : : 70 CONTINUE
1126 : 0 : S2R = S1R*COEFR - S1I*COEFI
1127 : 0 : S2I = S1R*COEFI + S1I*COEFR
1128 : 0 : WR(I) = S2R
1129 : 0 : WI(I) = S2I
1130 [ # # ]: 0 : IF (IFLAG.EQ.0) GO TO 80
1131 [ # # ]: 0 : CALL ZUCHK(S2R, S2I, NW, ASCLE, TOL)
1132 : : IF (NW.NE.0) GO TO 30
1133 : : 80 CONTINUE
1134 : 0 : M = NN - I + 1
1135 : 0 : YR(M) = S2R*CRSCR
1136 : 0 : YI(M) = S2I*CRSCR
1137 [ # # ]: 0 : IF (I.EQ.IL) GO TO 90
1138 : 0 : CALL ZDIV(COEFR, COEFI, HZR, HZI, STR, STI)
1139 : 0 : COEFR = STR*DFNU
1140 : 0 : COEFI = STI*DFNU
1141 : 0 : 90 CONTINUE
1142 [ # # ]: 0 : IF (NN.LE.2) RETURN
1143 : 0 : K = NN - 2
1144 : 0 : AK = DBLE(FLOAT(K))
1145 : 0 : RAZ = 1.0D0/AZ
1146 : 0 : STR = ZR*RAZ
1147 : 0 : STI = -ZI*RAZ
1148 : 0 : RZR = (STR+STR)*RAZ
1149 : 0 : RZI = (STI+STI)*RAZ
1150 [ # # ]: 0 : IF (IFLAG.EQ.1) GO TO 120
1151 : : IB = 3
1152 : : 100 CONTINUE
1153 [ # # ]: 0 : DO 110 I=IB,NN
1154 : 0 : YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
1155 : 0 : YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
1156 : 0 : AK = AK - 1.0D0
1157 : 0 : K = K - 1
1158 : 0 : 110 CONTINUE
1159 : 0 : RETURN
1160 : : !C-----------------------------------------------------------------------
1161 : : !C RECUR BACKWARD WITH SCALED VALUES
1162 : : !C-----------------------------------------------------------------------
1163 : : 120 CONTINUE
1164 : : !C-----------------------------------------------------------------------
1165 : : !C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION ABOVE THE
1166 : : !C UNDERFLOW LIMIT = ASCLE = D1MACH(1)*SS*1.0D+3
1167 : : !C-----------------------------------------------------------------------
1168 : 0 : S1R = WR(1)
1169 : 0 : S1I = WI(1)
1170 : 0 : S2R = WR(2)
1171 : 0 : S2I = WI(2)
1172 [ # # ]: 0 : DO 130 L=3,NN
1173 : : CKR = S2R
1174 : : CKI = S2I
1175 : 0 : S2R = S1R + (AK+FNU)*(RZR*CKR-RZI*CKI)
1176 : 0 : S2I = S1I + (AK+FNU)*(RZR*CKI+RZI*CKR)
1177 : 0 : S1R = CKR
1178 : 0 : S1I = CKI
1179 : 0 : CKR = S2R*CRSCR
1180 : 0 : CKI = S2I*CRSCR
1181 : 0 : YR(K) = CKR
1182 : 0 : YI(K) = CKI
1183 : 0 : AK = AK - 1.0D0
1184 : 0 : K = K - 1
1185 [ # # ]: 0 : IF (AZABS(CKR,CKI).GT.ASCLE) GO TO 140
1186 : 0 : 130 CONTINUE
1187 : 0 : RETURN
1188 : : 140 CONTINUE
1189 : 0 : IB = L + 1
1190 [ # # ]: 0 : IF (IB.GT.NN) RETURN
1191 : 0 : GO TO 100
1192 : : 150 CONTINUE
1193 : 0 : NZ = N
1194 [ # # ]: 0 : IF (FNU.EQ.0.0D0) NZ = NZ - 1
1195 : : 160 CONTINUE
1196 : 0 : YR(1) = ZEROR
1197 : 0 : YI(1) = ZEROI
1198 [ # # ]: 0 : IF (FNU.NE.0.0D0) GO TO 170
1199 : 0 : YR(1) = CONER
1200 : 0 : YI(1) = CONEI
1201 : : 170 CONTINUE
1202 [ # # ]: 0 : IF (N.EQ.1) RETURN
1203 [ # # ]: 0 : DO 180 I=2,N
1204 : 0 : YR(I) = ZEROR
1205 : 0 : YI(I) = ZEROI
1206 : 0 : 180 CONTINUE
1207 : 0 : RETURN
1208 : : !C-----------------------------------------------------------------------
1209 : : !C RETURN WITH NZ.LT.0 IF CABS(Z*Z/4).GT.FNU+N-NZ-1 COMPLETE
1210 : : !C THE CALCULATION IN CBINU WITH N=N-IABS(NZ)
1211 : : !C-----------------------------------------------------------------------
1212 : : 190 CONTINUE
1213 : 0 : NZ = -NZ
1214 : 0 : RETURN
1215 : : END SUBROUTINE ZSERI
1216 : :
1217 : :
1218 : 0 : DOUBLE PRECISION FUNCTION D1MACH(I)
1219 : : INTEGER I
1220 : : !C
1221 : : !C DOUBLE-PRECISION MACHINE CONSTANTS
1222 : : !C D1MACH( 1) = B**(EMIN-1), THE SMALLEST POSITIVE MAGNITUDE.
1223 : : !C D1MACH( 2) = B**EMAX*(1 - B**(-T)), THE LARGEST MAGNITUDE.
1224 : : !C D1MACH( 3) = B**(-T), THE SMALLEST RELATIVE SPACING.
1225 : : !C D1MACH( 4) = B**(1-T), THE LARGEST RELATIVE SPACING.
1226 : : !C D1MACH( 5) = LOG10(B)
1227 : : !C
1228 : : INTEGER SMALL(2)
1229 : : INTEGER LARGE(2)
1230 : : INTEGER RIGHT(2)
1231 : : INTEGER DIVER(2)
1232 : : INTEGER LOG10(2)
1233 : : INTEGER SC, CRAY1(38), J
1234 : : COMMON /D9MACH/ CRAY1
1235 : : SAVE SMALL, LARGE, RIGHT, DIVER, LOG10, SC
1236 : : DOUBLE PRECISION DMACH(5)
1237 : : EQUIVALENCE (DMACH(1),SMALL(1))
1238 : : EQUIVALENCE (DMACH(2),LARGE(1))
1239 : : EQUIVALENCE (DMACH(3),RIGHT(1))
1240 : : EQUIVALENCE (DMACH(4),DIVER(1))
1241 : : EQUIVALENCE (DMACH(5),LOG10(1))
1242 : : !C THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES.
1243 : : !C R1MACH CAN HANDLE AUTO-DOUBLE COMPILING, BUT THIS VERSION OF
1244 : : !C D1MACH DOES NOT, BECAUSE WE DO NOT HAVE QUAD CONSTANTS FOR
1245 : : !C MANY MACHINES YET.
1246 : : !C TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
1247 : : !C ON THE NEXT LINE
1248 : : DATA SC/0/
1249 : : !C AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
1250 : : !C CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
1251 : : !C mail netlib@research.bell-labs.com
1252 : : !C send old1mach from blas
1253 : : !C PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
1254 : : !C
1255 : : !C MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
1256 : : !C DATA SMALL(1),SMALL(2) / O402400000000, O000000000000 /
1257 : : !C DATA LARGE(1),LARGE(2) / O376777777777, O777777777777 /
1258 : : !C DATA RIGHT(1),RIGHT(2) / O604400000000, O000000000000 /
1259 : : !C DATA DIVER(1),DIVER(2) / O606400000000, O000000000000 /
1260 : : !C DATA LOG10(1),LOG10(2) / O776464202324, O117571775714 /, SC/987/
1261 : : !C
1262 : : !C MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
1263 : : !C 32-BIT INTEGERS.
1264 : : !C DATA SMALL(1),SMALL(2) / 8388608, 0 /
1265 : : !C DATA LARGE(1),LARGE(2) / 2147483647, -1 /
1266 : : !C DATA RIGHT(1),RIGHT(2) / 612368384, 0 /
1267 : : !C DATA DIVER(1),DIVER(2) / 620756992, 0 /
1268 : : !C DATA LOG10(1),LOG10(2) / 1067065498, -2063872008 /, SC/987/
1269 : : !C
1270 : : !C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
1271 : : !C DATA SMALL(1),SMALL(2) / O000040000000, O000000000000 /
1272 : : !C DATA LARGE(1),LARGE(2) / O377777777777, O777777777777 /
1273 : : !C DATA RIGHT(1),RIGHT(2) / O170540000000, O000000000000 /
1274 : : !C DATA DIVER(1),DIVER(2) / O170640000000, O000000000000 /
1275 : : !C DATA LOG10(1),LOG10(2) / O177746420232, O411757177572 /, SC/987/
1276 : : !C
1277 : : !C ON FIRST CALL, IF NO DATA UNCOMMENTED, TEST MACHINE TYPES.
1278 [ # # ]: 0 : IF (SC .NE. 987) THEN
1279 : : DMACH(1) = 1.D13
1280 : : IF ( SMALL(1) .EQ. 1117925532 &
1281 : : & .AND. SMALL(2) .EQ. -448790528) THEN
1282 : : !* *** IEEE BIG ENDIAN ***
1283 : : SMALL(1) = 1048576
1284 : : SMALL(2) = 0
1285 : : LARGE(1) = 2146435071
1286 : : LARGE(2) = -1
1287 : : RIGHT(1) = 1017118720
1288 : : RIGHT(2) = 0
1289 : : DIVER(1) = 1018167296
1290 : : DIVER(2) = 0
1291 : : LOG10(1) = 1070810131
1292 : : LOG10(2) = 1352628735
1293 : : ELSE IF ( SMALL(2) .EQ. 1117925532 &
1294 : : & .AND. SMALL(1) .EQ. -448790528) THEN
1295 : : !* *** IEEE LITTLE ENDIAN ***
1296 : 0 : SMALL(2) = 1048576
1297 : 0 : SMALL(1) = 0
1298 : 0 : LARGE(2) = 2146435071
1299 : 0 : LARGE(1) = -1
1300 : 0 : RIGHT(2) = 1017118720
1301 : 0 : RIGHT(1) = 0
1302 : 0 : DIVER(2) = 1018167296
1303 : 0 : DIVER(1) = 0
1304 : 0 : LOG10(2) = 1070810131
1305 : 0 : LOG10(1) = 1352628735
1306 : : ELSE IF ( SMALL(1) .EQ. -2065213935 &
1307 : : & .AND. SMALL(2) .EQ. 10752) THEN
1308 : : !* *** VAX WITH D_FLOATING ***
1309 : : SMALL(1) = 128
1310 : : SMALL(2) = 0
1311 : : LARGE(1) = -32769
1312 : : LARGE(2) = -1
1313 : : RIGHT(1) = 9344
1314 : : RIGHT(2) = 0
1315 : : DIVER(1) = 9472
1316 : : DIVER(2) = 0
1317 : : LOG10(1) = 546979738
1318 : : LOG10(2) = -805796613
1319 : : ELSE IF ( SMALL(1) .EQ. 1267827943 &
1320 : : & .AND. SMALL(2) .EQ. 704643072) THEN
1321 : : !* *** IBM MAINFRAME ***
1322 : : SMALL(1) = 1048576
1323 : : SMALL(2) = 0
1324 : : LARGE(1) = 2147483647
1325 : : LARGE(2) = -1
1326 : : RIGHT(1) = 856686592
1327 : : RIGHT(2) = 0
1328 : : DIVER(1) = 873463808
1329 : : DIVER(2) = 0
1330 : : LOG10(1) = 1091781651
1331 : : LOG10(2) = 1352628735
1332 : : ELSE IF ( SMALL(1) .EQ. 1120022684 &
1333 : : & .AND. SMALL(2) .EQ. -448790528) THEN
1334 : : !* *** CONVEX C-1 ***
1335 : : SMALL(1) = 1048576
1336 : : SMALL(2) = 0
1337 : : LARGE(1) = 2147483647
1338 : : LARGE(2) = -1
1339 : : RIGHT(1) = 1019215872
1340 : : RIGHT(2) = 0
1341 : : DIVER(1) = 1020264448
1342 : : DIVER(2) = 0
1343 : : LOG10(1) = 1072907283
1344 : : LOG10(2) = 1352628735
1345 : : ELSE IF ( SMALL(1) .EQ. 815547074 &
1346 : : & .AND. SMALL(2) .EQ. 58688) THEN
1347 : : !* *** VAX G-FLOATING ***
1348 : : SMALL(1) = 16
1349 : : SMALL(2) = 0
1350 : : LARGE(1) = -32769
1351 : : LARGE(2) = -1
1352 : : RIGHT(1) = 15552
1353 : : RIGHT(2) = 0
1354 : : DIVER(1) = 15568
1355 : : DIVER(2) = 0
1356 : : LOG10(1) = 1142112243
1357 : : LOG10(2) = 2046775455
1358 : : ELSE
1359 : : DMACH(2) = 1.D27 + 1
1360 : : DMACH(3) = 1.D27
1361 : : LARGE(2) = LARGE(2) - RIGHT(2)
1362 : : IF (LARGE(2) .EQ. 64 .AND. SMALL(2) .EQ. 0) THEN
1363 : : CRAY1(1) = 67291416
1364 : : DO 10 J = 1, 20
1365 : : CRAY1(J+1) = CRAY1(J) + CRAY1(J)
1366 : : 10 CONTINUE
1367 : : CRAY1(22) = CRAY1(21) + 321322
1368 : : DO 20 J = 22, 37
1369 : : CRAY1(J+1) = CRAY1(J) + CRAY1(J)
1370 : : 20 CONTINUE
1371 : : IF (CRAY1(38) .EQ. SMALL(1)) THEN
1372 : : !* *** CRAY ***
1373 : : CALL I1MCRY(SMALL(1), J, 8285, 8388608, 0)
1374 : : SMALL(2) = 0
1375 : : CALL I1MCRY(LARGE(1), J, 24574, 16777215, 16777215)
1376 : : CALL I1MCRY(LARGE(2), J, 0, 16777215, 16777214)
1377 : : CALL I1MCRY(RIGHT(1), J, 16291, 8388608, 0)
1378 : : RIGHT(2) = 0
1379 : : CALL I1MCRY(DIVER(1), J, 16292, 8388608, 0)
1380 : : DIVER(2) = 0
1381 : : CALL I1MCRY(LOG10(1), J, 16383, 10100890, 8715215)
1382 : : CALL I1MCRY(LOG10(2), J, 0, 16226447, 9001388)
1383 : : ELSE
1384 : : WRITE(std_out,9000)
1385 : : STOP 779
1386 : : END IF
1387 : : ELSE
1388 : : WRITE(std_out,9000)
1389 : : STOP 779
1390 : : END IF
1391 : : END IF
1392 : 0 : SC = 987
1393 : : END IF
1394 : : !* SANITY CHECK
1395 [ # # ]: 0 : IF (DMACH(4) .GE. 1.0D0) STOP 778
1396 [ # # ]: 0 : IF (I .LT. 1 .OR. I .GT. 5) THEN
1397 : 0 : WRITE(std_out,*) 'D1MACH(I): I =',I,' is out of bounds.'
1398 : 0 : STOP
1399 : : END IF
1400 : 0 : D1MACH = DMACH(I)
1401 : : RETURN
1402 : : 9000 FORMAT(/' Adjust D1MACH by uncommenting data statements'/ &
1403 : : &' appropriate for your machine.')
1404 : : !* /* Standard C source for D1MACH -- remove the * in column 1 */
1405 : : !*#include <stdio.h>
1406 : : !*#include <float.h>
1407 : : !*#include <math.h>
1408 : : !*double d1mach_(long *i)
1409 : : !*{
1410 : : !* switch(*i){
1411 : : !* case 1: return DBL_MIN;
1412 : : !* case 2: return DBL_MAX;
1413 : : !* case 3: return DBL_EPSILON/FLT_RADIX;
1414 : : !* case 4: return DBL_EPSILON;
1415 : : !* case 5: return log10(FLT_RADIX);
1416 : : !* }
1417 : : !* fprintf(stderr, "invalid argument: d1mach(%ld)\n", *i);
1418 : : !* exit(1); return 0; /* some compilers demand return values */
1419 : : !*}
1420 : : END FUNCTION D1MACH
1421 : :
1422 : :
1423 : : SUBROUTINE I1MCRY(A, A1, B, C, D)
1424 : : !**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
1425 : : INTEGER A, A1, B, C, D
1426 : : A1 = 16777216*B + C
1427 : : A = 16777216*A1 + D
1428 : : END SUBROUTINE I1MCRY
1429 : :
1430 : 0 : SUBROUTINE ZMLT(AR, AI, BR, BI, CR, CI)
1431 : : !C***BEGIN PROLOGUE ZMLT
1432 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
1433 : : !C
1434 : : !C DOUBLE PRECISION COMPLEX MULTIPLY, C=A*B.
1435 : : !C
1436 : : !C***ROUTINES CALLED (NONE)
1437 : : !C***END PROLOGUE ZMLT
1438 : : DOUBLE PRECISION AR, AI, BR, BI, CR, CI, CA, CB
1439 : 0 : CA = AR*BR - AI*BI
1440 : 0 : CB = AR*BI + AI*BR
1441 : 0 : CR = CA
1442 [ # # # # ]: 0 : CI = CB
1443 : 0 : RETURN
1444 : : END SUBROUTINE ZMLT
1445 : :
1446 : 0 : SUBROUTINE AZLOG(AR, AI, BR, BI, IERR)
1447 : : !C***BEGIN PROLOGUE AZLOG
1448 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
1449 : : !C
1450 : : !C DOUBLE PRECISION COMPLEX LOGARITHM B=CLOG(A)
1451 : : !C IERR=0,NORMAL RETURN IERR=1, Z=CMPLX(0.0,0.0)
1452 : : !C***ROUTINES CALLED AZABS
1453 : : !C***END PROLOGUE AZLOG
1454 : : DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DHPI
1455 : : !DOUBLE PRECISION AZABS
1456 : : INTEGER IERR
1457 : : DATA DPI , DHPI / 3.141592653589793238462643383D+0, &
1458 : : & 1.570796326794896619231321696D+0/
1459 : : !C
1460 : 0 : IERR=0
1461 [ # # ]: 0 : IF (AR.EQ.0.0D+0) GO TO 10
1462 [ # # ]: 0 : IF (AI.EQ.0.0D+0) GO TO 20
1463 : 0 : DTHETA = DATAN(AI/AR)
1464 [ # # ]: 0 : IF (DTHETA.LE.0.0D+0) GO TO 40
1465 [ # # ]: 0 : IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
1466 : 0 : GO TO 50
1467 [ # # ]: 0 : 10 IF (AI.EQ.0.0D+0) GO TO 60
1468 : 0 : BI = DHPI
1469 : 0 : BR = DLOG(DABS(AI))
1470 [ # # ]: 0 : IF (AI.LT.0.0D+0) BI = -BI
1471 : 0 : RETURN
1472 [ # # ]: 0 : 20 IF (AR.GT.0.0D+0) GO TO 30
1473 : 0 : BR = DLOG(DABS(AR))
1474 : 0 : BI = DPI
1475 : 0 : RETURN
1476 : 0 : 30 BR = DLOG(AR)
1477 : 0 : BI = 0.0D+0
1478 : 0 : RETURN
1479 [ # # ]: 0 : 40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
1480 : 0 : 50 ZM = AZABS(AR,AI)
1481 : 0 : BR = DLOG(ZM)
1482 : 0 : BI = DTHETA
1483 : 0 : RETURN
1484 : : 60 CONTINUE
1485 : 0 : IERR=1
1486 : 0 : RETURN
1487 : : END SUBROUTINE AZLOG
1488 : :
1489 : :
1490 : 0 : DOUBLE PRECISION FUNCTION DGAMLN(Z,IERR)
1491 : : !C***BEGIN PROLOGUE DGAMLN
1492 : : !C***DATE WRITTEN 830501 (YYMMDD)
1493 : : !C***REVISION DATE 830501 (YYMMDD)
1494 : : !C***CATEGORY NO. B5F
1495 : : !C***KEYWORDS GAMMA FUNCTION,LOGARITHM OF GAMMA FUNCTION
1496 : : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
1497 : : !C***PURPOSE TO COMPUTE THE LOGARITHM OF THE GAMMA FUNCTION
1498 : : !C***DESCRIPTION
1499 : : !C
1500 : : !C **** A DOUBLE PRECISION ROUTINE ****
1501 : : !C DGAMLN COMPUTES THE NATURAL LOG OF THE GAMMA FUNCTION FOR
1502 : : !C Z.GT.0. THE ASYMPTOTIC EXPANSION IS USED TO GENERATE VALUES
1503 : : !C GREATER THAN ZMIN WHICH ARE ADJUSTED BY THE RECURSION
1504 : : !C G(Z+1)=Z*G(Z) FOR Z.LE.ZMIN. THE FUNCTION WAS MADE AS
1505 : : !C PORTABLE AS POSSIBLE BY COMPUTIMG ZMIN FROM THE NUMBER OF BASE
1506 : : !C 10 DIGITS IN A WORD, RLN=AMAX1(-ALOG10(R1MACH(4)),0.5E-18)
1507 : : !C LIMITED TO 18 DIGITS OF (RELATIVE) ACCURACY.
1508 : : !C
1509 : : !C SINCE INTEGER ARGUMENTS ARE COMMON, A TABLE LOOK UP ON 100
1510 : : !C VALUES IS USED FOR SPEED OF EXECUTION.
1511 : : !C
1512 : : !C DESCRIPTION OF ARGUMENTS
1513 : : !C
1514 : : !C INPUT Z IS D0UBLE PRECISION
1515 : : !C Z - ARGUMENT, Z.GT.0.0D0
1516 : : !C
1517 : : !C OUTPUT DGAMLN IS DOUBLE PRECISION
1518 : : !C DGAMLN - NATURAL LOG OF THE GAMMA FUNCTION AT Z.NE.0.0D0
1519 : : !C IERR - ERROR FLAG
1520 : : !C IERR=0, NORMAL RETURN, COMPUTATION COMPLETED
1521 : : !C IERR=1, Z.LE.0.0D0, NO COMPUTATION
1522 : : !C
1523 : : !C
1524 : : !C***REFERENCES COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
1525 : : !C BY D. E. AMOS, SAND83-0083, MAY, 1983.
1526 : : !C***ROUTINES CALLED I1MACH,D1MACH
1527 : : !C***END PROLOGUE DGAMLN
1528 : : DOUBLE PRECISION CF, CON, FLN, FZ, GLN, RLN, S, TLG, TRM, TST, &
1529 : : & T1, WDTOL, Z, ZDMY, ZINC, ZM, ZMIN, ZP, ZSQ!, D1MACH
1530 : : INTEGER I, IERR, I1M, K, MZ, NZ!, I1MACH
1531 : : DIMENSION CF(22), GLN(100)
1532 : : !C LNGAMMA(N), N=1,100
1533 : : DATA GLN(1), GLN(2), GLN(3), GLN(4), GLN(5), GLN(6), GLN(7),&
1534 : : & GLN(8), GLN(9), GLN(10), GLN(11), GLN(12), GLN(13), GLN(14), &
1535 : : & GLN(15), GLN(16), GLN(17), GLN(18), GLN(19), GLN(20), &
1536 : : & GLN(21), GLN(22)/ &
1537 : : & 0.00000000000000000D+00, 0.00000000000000000D+00, &
1538 : : & 6.93147180559945309D-01, 1.79175946922805500D+00, &
1539 : : & 3.17805383034794562D+00, 4.78749174278204599D+00, &
1540 : : & 6.57925121201010100D+00, 8.52516136106541430D+00, &
1541 : : & 1.06046029027452502D+01, 1.28018274800814696D+01, &
1542 : : & 1.51044125730755153D+01, 1.75023078458738858D+01, &
1543 : : & 1.99872144956618861D+01, 2.25521638531234229D+01, &
1544 : : & 2.51912211827386815D+01, 2.78992713838408916D+01, &
1545 : : & 3.06718601060806728D+01, 3.35050734501368889D+01, &
1546 : : & 3.63954452080330536D+01, 3.93398841871994940D+01, &
1547 : : & 4.23356164607534850D+01, 4.53801388984769080D+01/
1548 : : DATA GLN(23), GLN(24), GLN(25), GLN(26), GLN(27), GLN(28), &
1549 : : & GLN(29), GLN(30), GLN(31), GLN(32), GLN(33), GLN(34), &
1550 : : & GLN(35), GLN(36), GLN(37), GLN(38), GLN(39), GLN(40), &
1551 : : & GLN(41), GLN(42), GLN(43), GLN(44)/ &
1552 : : & 4.84711813518352239D+01, 5.16066755677643736D+01, &
1553 : : & 5.47847293981123192D+01, 5.80036052229805199D+01, &
1554 : : & 6.12617017610020020D+01, 6.45575386270063311D+01, &
1555 : : & 6.78897431371815350D+01, 7.12570389671680090D+01, &
1556 : : & 7.46582363488301644D+01, 7.80922235533153106D+01, &
1557 : : & 8.15579594561150372D+01, 8.50544670175815174D+01, &
1558 : : & 8.85808275421976788D+01, 9.21361756036870925D+01, &
1559 : : & 9.57196945421432025D+01, 9.93306124547874269D+01, &
1560 : : & 1.02968198614513813D+02, 1.06631760260643459D+02, &
1561 : : & 1.10320639714757395D+02, 1.14034211781461703D+02, &
1562 : : & 1.17771881399745072D+02, 1.21533081515438634D+02/
1563 : : DATA GLN(45), GLN(46), GLN(47), GLN(48), GLN(49), GLN(50), &
1564 : : & GLN(51), GLN(52), GLN(53), GLN(54), GLN(55), GLN(56), &
1565 : : & GLN(57), GLN(58), GLN(59), GLN(60), GLN(61), GLN(62), &
1566 : : & GLN(63), GLN(64), GLN(65), GLN(66)/ &
1567 : : & 1.25317271149356895D+02, 1.29123933639127215D+02, &
1568 : : & 1.32952575035616310D+02, 1.36802722637326368D+02, &
1569 : : & 1.40673923648234259D+02, 1.44565743946344886D+02, &
1570 : : & 1.48477766951773032D+02, 1.52409592584497358D+02, &
1571 : : & 1.56360836303078785D+02, 1.60331128216630907D+02, &
1572 : : & 1.64320112263195181D+02, 1.68327445448427652D+02, &
1573 : : & 1.72352797139162802D+02, 1.76395848406997352D+02, &
1574 : : & 1.80456291417543771D+02, 1.84533828861449491D+02, &
1575 : : & 1.88628173423671591D+02, 1.92739047287844902D+02, &
1576 : : & 1.96866181672889994D+02, 2.01009316399281527D+02, &
1577 : : & 2.05168199482641199D+02, 2.09342586752536836D+02/
1578 : : DATA GLN(67), GLN(68), GLN(69), GLN(70), GLN(71), GLN(72), &
1579 : : & GLN(73), GLN(74), GLN(75), GLN(76), GLN(77), GLN(78), &
1580 : : & GLN(79), GLN(80), GLN(81), GLN(82), GLN(83), GLN(84), &
1581 : : & GLN(85), GLN(86), GLN(87), GLN(88)/ &
1582 : : & 2.13532241494563261D+02, 2.17736934113954227D+02, &
1583 : : & 2.21956441819130334D+02, 2.26190548323727593D+02, &
1584 : : & 2.30439043565776952D+02, 2.34701723442818268D+02, &
1585 : : & 2.38978389561834323D+02, 2.43268849002982714D+02, &
1586 : : & 2.47572914096186884D+02, 2.51890402209723194D+02, &
1587 : : & 2.56221135550009525D+02, 2.60564940971863209D+02, &
1588 : : & 2.64921649798552801D+02, 2.69291097651019823D+02, &
1589 : : & 2.73673124285693704D+02, 2.78067573440366143D+02, &
1590 : : & 2.82474292687630396D+02, 2.86893133295426994D+02, &
1591 : : & 2.91323950094270308D+02, 2.95766601350760624D+02, &
1592 : : & 3.00220948647014132D+02, 3.04686856765668715D+02/
1593 : : DATA GLN(89), GLN(90), GLN(91), GLN(92), GLN(93), GLN(94), &
1594 : : & GLN(95), GLN(96), GLN(97), GLN(98), GLN(99), GLN(100)/&
1595 : : & 3.09164193580146922D+02, 3.13652829949879062D+02, &
1596 : : & 3.18152639620209327D+02, 3.22663499126726177D+02, &
1597 : : & 3.27185287703775217D+02, 3.31717887196928473D+02, &
1598 : : & 3.36261181979198477D+02, 3.40815058870799018D+02, &
1599 : : & 3.45379407062266854D+02, 3.49954118040770237D+02, &
1600 : : & 3.54539085519440809D+02, 3.59134205369575399D+02/
1601 : : !C COEFFICIENTS OF ASYMPTOTIC EXPANSION
1602 : : DATA CF(1), CF(2), CF(3), CF(4), CF(5), CF(6), CF(7), CF(8), &
1603 : : & CF(9), CF(10), CF(11), CF(12), CF(13), CF(14), CF(15), &
1604 : : & CF(16), CF(17), CF(18), CF(19), CF(20), CF(21), CF(22)/ &
1605 : : & 8.33333333333333333D-02, -2.77777777777777778D-03, &
1606 : : & 7.93650793650793651D-04, -5.95238095238095238D-04, &
1607 : : & 8.41750841750841751D-04, -1.91752691752691753D-03, &
1608 : : & 6.41025641025641026D-03, -2.95506535947712418D-02, &
1609 : : & 1.79644372368830573D-01, -1.39243221690590112D+00, &
1610 : : & 1.34028640441683920D+01, -1.56848284626002017D+02, &
1611 : : & 2.19310333333333333D+03, -3.61087712537249894D+04, &
1612 : : & 6.91472268851313067D+05, -1.52382215394074162D+07, &
1613 : : & 3.82900751391414141D+08, -1.08822660357843911D+10, &
1614 : : & 3.47320283765002252D+11, -1.23696021422692745D+13, &
1615 : : & 4.88788064793079335D+14, -2.13203339609193739D+16/
1616 : : !C
1617 : : !C LN(2*PI)
1618 : : DATA CON / 1.83787706640934548D+00/
1619 : : !C
1620 : : !C***FIRST EXECUTABLE STATEMENT DGAMLN
1621 : 0 : IERR=0
1622 [ # # ]: 0 : IF (Z.LE.0.0D0) GO TO 70
1623 [ # # ]: 0 : IF (Z.GT.101.0D0) GO TO 10
1624 : 0 : NZ = INT(SNGL(Z))
1625 : 0 : FZ = Z - FLOAT(NZ)
1626 [ # # ]: 0 : IF (FZ.GT.0.0D0) GO TO 10
1627 [ # # ]: 0 : IF (NZ.GT.100) GO TO 10
1628 : 0 : DGAMLN = GLN(NZ)
1629 : 0 : RETURN
1630 : : 10 CONTINUE
1631 : 0 : WDTOL = D1MACH(4)
1632 : 0 : WDTOL = DMAX1(WDTOL,0.5D-18)
1633 : 0 : I1M = I1MACH(14)
1634 : 0 : RLN = D1MACH(5)*FLOAT(I1M)
1635 : 0 : FLN = DMIN1(RLN,20.0D0)
1636 : 0 : FLN = DMAX1(FLN,3.0D0)
1637 : 0 : FLN = FLN - 3.0D0
1638 : 0 : ZM = 1.8000D0 + 0.3875D0*FLN
1639 : 0 : MZ = INT(SNGL(ZM)) + 1
1640 : 0 : ZMIN = FLOAT(MZ)
1641 : 0 : ZDMY = Z
1642 : 0 : ZINC = 0.0D0
1643 [ # # ]: 0 : IF (Z.GE.ZMIN) GO TO 20
1644 : 0 : ZINC = ZMIN - FLOAT(NZ)
1645 : 0 : ZDMY = Z + ZINC
1646 : : 20 CONTINUE
1647 : 0 : ZP = 1.0D0/ZDMY
1648 : 0 : T1 = CF(1)*ZP
1649 : 0 : S = T1
1650 [ # # ]: 0 : IF (ZP.LT.WDTOL) GO TO 40
1651 : 0 : ZSQ = ZP*ZP
1652 : 0 : TST = T1*WDTOL
1653 [ # # ]: 0 : DO 30 K=2,22
1654 : 0 : ZP = ZP*ZSQ
1655 : 0 : TRM = CF(K)*ZP
1656 [ # # ]: 0 : IF (DABS(TRM).LT.TST) GO TO 40
1657 : 0 : S = S + TRM
1658 : 0 : 30 CONTINUE
1659 : : 40 CONTINUE
1660 [ # # ]: 0 : IF (ZINC.NE.0.0D0) GO TO 50
1661 : 0 : TLG = DLOG(Z)
1662 : 0 : DGAMLN = Z*(TLG-1.0D0) + 0.5D0*(CON-TLG) + S
1663 : 0 : RETURN
1664 : : 50 CONTINUE
1665 : 0 : ZP = 1.0D0
1666 : 0 : NZ = INT(SNGL(ZINC))
1667 [ # # ]: 0 : DO 60 I=1,NZ
1668 : 0 : ZP = ZP*(Z+FLOAT(I-1))
1669 : 0 : 60 CONTINUE
1670 : 0 : TLG = DLOG(ZDMY)
1671 : 0 : DGAMLN = ZDMY*(TLG-1.0D0) - DLOG(ZP) + 0.5D0*(CON-TLG) + S
1672 : 0 : RETURN
1673 : : !C
1674 : : !C
1675 : : 70 CONTINUE
1676 : 0 : IERR=1
1677 : 0 : RETURN
1678 : : END FUNCTION DGAMLN
1679 : :
1680 : 0 : INTEGER FUNCTION I1MACH(I)
1681 : : INTEGER I
1682 : : !C
1683 : : !C I1MACH( 1) = THE STANDARD INPUT UNIT.
1684 : : !C I1MACH( 2) = THE STANDARD OUTPUT UNIT.
1685 : : !C I1MACH( 3) = THE STANDARD PUNCH UNIT.
1686 : : !C I1MACH( 4) = THE STANDARD ERROR MESSAGE UNIT.
1687 : : !C I1MACH( 5) = THE NUMBER OF BITS PER INTEGER STORAGE UNIT.
1688 : : !C I1MACH( 6) = THE NUMBER OF CHARACTERS PER CHARACTER STORAGE UNIT.
1689 : : !C INTEGERS HAVE FORM SIGN ( X(S-1)*A**(S-1) + ... + X(1)*A + X(0) )
1690 : : !C I1MACH( 7) = A, THE BASE.
1691 : : !C I1MACH( 8) = S, THE NUMBER OF BASE-A DIGITS.
1692 : : !C I1MACH( 9) = A**S - 1, THE LARGEST MAGNITUDE.
1693 : : !C FLOATS HAVE FORM SIGN (B**E)*( (X(1)/B) + ... + (X(T)/B**T) )
1694 : : !C WHERE EMIN .LE. E .LE. EMAX.
1695 : : !C I1MACH(10) = B, THE BASE.
1696 : : !C SINGLE-PRECISION
1697 : : !C I1MACH(11) = T, THE NUMBER OF BASE-B DIGITS.
1698 : : !C I1MACH(12) = EMIN, THE SMALLEST EXPONENT E.
1699 : : !C I1MACH(13) = EMAX, THE LARGEST EXPONENT E.
1700 : : !C DOUBLE-PRECISION
1701 : : !C I1MACH(14) = T, THE NUMBER OF BASE-B DIGITS.
1702 : : !C I1MACH(15) = EMIN, THE SMALLEST EXPONENT E.
1703 : : !C I1MACH(16) = EMAX, THE LARGEST EXPONENT E.
1704 : : !C
1705 : : INTEGER IMACH(16), OUTPUT, SC, SMALL(2)
1706 : : SAVE IMACH, SC
1707 : : REAL RMACH
1708 : : EQUIVALENCE (IMACH(4),OUTPUT), (RMACH,SMALL(1))
1709 : : INTEGER I3, J, K, T3E(3)
1710 : : DATA T3E(1) / 9777664 /
1711 : : DATA T3E(2) / 5323660 /
1712 : : DATA T3E(3) / 46980 /
1713 : : !C THIS VERSION ADAPTS AUTOMATICALLY TO MOST CURRENT MACHINES,
1714 : : !C INCLUDING AUTO-DOUBLE COMPILERS.
1715 : : !C TO COMPILE ON OLDER MACHINES, ADD A C IN COLUMN 1
1716 : : !C ON THE NEXT LINE
1717 : : DATA SC/0/
1718 : : !C AND REMOVE THE C FROM COLUMN 1 IN ONE OF THE SECTIONS BELOW.
1719 : : !C CONSTANTS FOR EVEN OLDER MACHINES CAN BE OBTAINED BY
1720 : : !C mail netlib@research.bell-labs.com
1721 : : !C send old1mach from blas
1722 : : !C PLEASE SEND CORRECTIONS TO dmg OR ehg@bell-labs.com.
1723 : : !C
1724 : : !C MACHINE CONSTANTS FOR THE HONEYWELL DPS 8/70 SERIES.
1725 : : !C
1726 : : !C DATA IMACH( 1) / 5 /
1727 : : !C DATA IMACH( 2) / 6 /
1728 : : !C DATA IMACH( 3) / 43 /
1729 : : !C DATA IMACH( 4) / 6 /
1730 : : !C DATA IMACH( 5) / 36 /
1731 : : !C DATA IMACH( 6) / 4 /
1732 : : !C DATA IMACH( 7) / 2 /
1733 : : !C DATA IMACH( 8) / 35 /
1734 : : !C DATA IMACH( 9) / O377777777777 /
1735 : : !C DATA IMACH(10) / 2 /
1736 : : !C DATA IMACH(11) / 27 /
1737 : : !C DATA IMACH(12) / -127 /
1738 : : !C DATA IMACH(13) / 127 /
1739 : : !C DATA IMACH(14) / 63 /
1740 : : !C DATA IMACH(15) / -127 /
1741 : : !C DATA IMACH(16) / 127 /, SC/987/
1742 : : !C
1743 : : !C MACHINE CONSTANTS FOR PDP-11 FORTRANS SUPPORTING
1744 : : !C 32-BIT INTEGER ARITHMETIC.
1745 : : !C
1746 : : !C DATA IMACH( 1) / 5 /
1747 : : !C DATA IMACH( 2) / 6 /
1748 : : !C DATA IMACH( 3) / 7 /
1749 : : !C DATA IMACH( 4) / 6 /
1750 : : !C DATA IMACH( 5) / 32 /
1751 : : !C DATA IMACH( 6) / 4 /
1752 : : !C DATA IMACH( 7) / 2 /
1753 : : !C DATA IMACH( 8) / 31 /
1754 : : !C DATA IMACH( 9) / 2147483647 /
1755 : : !C DATA IMACH(10) / 2 /
1756 : : !C DATA IMACH(11) / 24 /
1757 : : !C DATA IMACH(12) / -127 /
1758 : : !C DATA IMACH(13) / 127 /
1759 : : !C DATA IMACH(14) / 56 /
1760 : : !C DATA IMACH(15) / -127 /
1761 : : !C DATA IMACH(16) / 127 /, SC/987/
1762 : : !C
1763 : : !C MACHINE CONSTANTS FOR THE UNIVAC 1100 SERIES.
1764 : : !C
1765 : : !C NOTE THAT THE PUNCH UNIT, I1MACH(3), HAS BEEN SET TO 7
1766 : : !C WHICH IS APPROPRIATE FOR THE UNIVAC-FOR SYSTEM.
1767 : : !C IF YOU HAVE THE UNIVAC-FTN SYSTEM, SET IT TO 1.
1768 : : !C
1769 : : !C DATA IMACH( 1) / 5 /
1770 : : !C DATA IMACH( 2) / 6 /
1771 : : !C DATA IMACH( 3) / 7 /
1772 : : !C DATA IMACH( 4) / 6 /
1773 : : !C DATA IMACH( 5) / 36 /
1774 : : !C DATA IMACH( 6) / 6 /
1775 : : !C DATA IMACH( 7) / 2 /
1776 : : !C DATA IMACH( 8) / 35 /
1777 : : !C DATA IMACH( 9) / O377777777777 /
1778 : : !C DATA IMACH(10) / 2 /
1779 : : !C DATA IMACH(11) / 27 /
1780 : : !C DATA IMACH(12) / -128 /
1781 : : !C DATA IMACH(13) / 127 /
1782 : : !C DATA IMACH(14) / 60 /
1783 : : !C DATA IMACH(15) /-1024 /
1784 : : !C DATA IMACH(16) / 1023 /, SC/987/
1785 : : !C
1786 [ # # ]: 0 : IF (SC .NE. 987) THEN
1787 : : !* *** CHECK FOR AUTODOUBLE ***
1788 : : SMALL(2) = 0
1789 : : RMACH = 1E13
1790 : : IF (SMALL(2) .NE. 0) THEN
1791 : : !* *** AUTODOUBLED ***
1792 : : IF ( (SMALL(1) .EQ. 1117925532 &
1793 : : & .AND. SMALL(2) .EQ. -448790528) &
1794 : : & .OR. (SMALL(2) .EQ. 1117925532 &
1795 : : & .AND. SMALL(1) .EQ. -448790528)) THEN
1796 : : !* *** IEEE ***
1797 : : IMACH(10) = 2
1798 : : IMACH(14) = 53
1799 : : IMACH(15) = -1021
1800 : : IMACH(16) = 1024
1801 : : ELSE IF ( SMALL(1) .EQ. -2065213935 &
1802 : : & .AND. SMALL(2) .EQ. 10752) THEN
1803 : : !* *** VAX WITH D_FLOATING ***
1804 : : IMACH(10) = 2
1805 : : IMACH(14) = 56
1806 : : IMACH(15) = -127
1807 : : IMACH(16) = 127
1808 : : ELSE IF ( SMALL(1) .EQ. 1267827943 &
1809 : : & .AND. SMALL(2) .EQ. 704643072) THEN
1810 : : !* *** IBM MAINFRAME ***
1811 : : IMACH(10) = 16
1812 : : IMACH(14) = 14
1813 : : IMACH(15) = -64
1814 : : IMACH(16) = 63
1815 : : ELSE
1816 : : WRITE(std_out,9010)
1817 : : STOP 777
1818 : : END IF
1819 : : IMACH(11) = IMACH(14)
1820 : : IMACH(12) = IMACH(15)
1821 : : IMACH(13) = IMACH(16)
1822 : : ELSE
1823 : : RMACH = 1234567.
1824 : : IF (SMALL(1) .EQ. 1234613304) THEN
1825 : : !* *** IEEE ***
1826 : 0 : IMACH(10) = 2
1827 : 0 : IMACH(11) = 24
1828 : 0 : IMACH(12) = -125
1829 : 0 : IMACH(13) = 128
1830 : 0 : IMACH(14) = 53
1831 : 0 : IMACH(15) = -1021
1832 : 0 : IMACH(16) = 1024
1833 : 0 : SC = 987
1834 : : ELSE IF (SMALL(1) .EQ. -1271379306) THEN
1835 : : !* *** VAX ***
1836 : : IMACH(10) = 2
1837 : : IMACH(11) = 24
1838 : : IMACH(12) = -127
1839 : : IMACH(13) = 127
1840 : : IMACH(14) = 56
1841 : : IMACH(15) = -127
1842 : : IMACH(16) = 127
1843 : : SC = 987
1844 : : ELSE IF (SMALL(1) .EQ. 1175639687) THEN
1845 : : !* *** IBM MAINFRAME ***
1846 : : IMACH(10) = 16
1847 : : IMACH(11) = 6
1848 : : IMACH(12) = -64
1849 : : IMACH(13) = 63
1850 : : IMACH(14) = 14
1851 : : IMACH(15) = -64
1852 : : IMACH(16) = 63
1853 : : SC = 987
1854 : : ELSE IF (SMALL(1) .EQ. 1251390520) THEN
1855 : : !* *** CONVEX C-1 ***
1856 : : IMACH(10) = 2
1857 : : IMACH(11) = 24
1858 : : IMACH(12) = -128
1859 : : IMACH(13) = 127
1860 : : IMACH(14) = 53
1861 : : IMACH(15) = -1024
1862 : : IMACH(16) = 1023
1863 : : ELSE
1864 : : DO 10 I3 = 1, 3
1865 : : J = SMALL(1) / 10000000
1866 : : K = SMALL(1) - 10000000*J
1867 : : IF (K .NE. T3E(I3)) GO TO 20
1868 : : SMALL(1) = J
1869 : : 10 CONTINUE
1870 : : !* *** CRAY T3E ***
1871 : : IMACH( 1) = 5
1872 : : IMACH( 2) = 6
1873 : : IMACH( 3) = 0
1874 : : IMACH( 4) = 0
1875 : : IMACH( 5) = 64
1876 : : IMACH( 6) = 8
1877 : : IMACH( 7) = 2
1878 : : IMACH( 8) = 63
1879 : : CALL I1MCR1(IMACH(9), K, 32767, 16777215, 16777215)
1880 : : IMACH(10) = 2
1881 : : IMACH(11) = 53
1882 : : IMACH(12) = -1021
1883 : : IMACH(13) = 1024
1884 : : IMACH(14) = 53
1885 : : IMACH(15) = -1021
1886 : : IMACH(16) = 1024
1887 : : GO TO 35
1888 : : 20 CALL I1MCR1(J, K, 16405, 9876536, 0)
1889 : : IF (SMALL(1) .NE. J) THEN
1890 : : WRITE(std_out,9020)
1891 : : STOP 777
1892 : : END IF
1893 : : !* *** CRAY 1, XMP, 2, AND 3 ***
1894 : : IMACH(1) = 5
1895 : : IMACH(2) = 6
1896 : : IMACH(3) = 102
1897 : : IMACH(4) = 6
1898 : : IMACH(5) = 46
1899 : : IMACH(6) = 8
1900 : : IMACH(7) = 2
1901 : : IMACH(8) = 45
1902 : : CALL I1MCR1(IMACH(9), K, 0, 4194303, 16777215)
1903 : : IMACH(10) = 2
1904 : : IMACH(11) = 47
1905 : : IMACH(12) = -8188
1906 : : IMACH(13) = 8189
1907 : : IMACH(14) = 94
1908 : : IMACH(15) = -8141
1909 : : IMACH(16) = 8189
1910 : : GO TO 35
1911 : : END IF
1912 : : END IF
1913 : 0 : IMACH( 1) = 5
1914 : 0 : IMACH( 2) = 6
1915 : 0 : IMACH( 3) = 7
1916 : 0 : IMACH( 4) = 6
1917 : 0 : IMACH( 5) = 32
1918 : 0 : IMACH( 6) = 4
1919 : 0 : IMACH( 7) = 2
1920 : 0 : IMACH( 8) = 31
1921 : 0 : IMACH( 9) = 2147483647
1922 : : 35 SC = 987
1923 : : END IF
1924 : : 9010 FORMAT(/' Adjust autodoubled I1MACH by uncommenting data'/ &
1925 : : & ' statements appropriate for your machine and setting'/ &
1926 : : & ' IMACH(I) = IMACH(I+3) for I = 11, 12, and 13.')
1927 : : 9020 FORMAT(/' Adjust I1MACH by uncommenting data statements'/ &
1928 : : & ' appropriate for your machine.')
1929 [ # # ]: 0 : IF (I .LT. 1 .OR. I .GT. 16) GO TO 40
1930 : 0 : I1MACH = IMACH(I)
1931 : 0 : RETURN
1932 : 0 : 40 WRITE(std_out,*) 'I1MACH(I): I =',I,' is out of bounds.'
1933 : 0 : STOP
1934 : : !* /* C source for I1MACH -- remove the * in column 1 */
1935 : : !* /* Note that some values may need changing. */
1936 : : !*#include <stdio.h>
1937 : : !*#include <float.h>
1938 : : !*#include <limits.h>
1939 : : !*#include <math.h>
1940 : : !*
1941 : : !*long i1mach_(long *i)
1942 : : !*{
1943 : : !* switch(*i){
1944 : : !* case 1: return 5; /* standard input */
1945 : : !* case 2: return 6; /* standard output */
1946 : : !* case 3: return 7; /* standard punch */
1947 : : !* case 4: return 0; /* standard error */
1948 : : !* case 5: return 32; /* bits per integer */
1949 : : !* case 6: return sizeof(int);
1950 : : !* case 7: return 2; /* base for integers */
1951 : : !* case 8: return 31; /* digits of integer base */
1952 : : !* case 9: return LONG_MAX;
1953 : : !* case 10: return FLT_RADIX;
1954 : : !* case 11: return FLT_MANT_DIG;
1955 : : !* case 12: return FLT_MIN_EXP;
1956 : : !* case 13: return FLT_MAX_EXP;
1957 : : !* case 14: return DBL_MANT_DIG;
1958 : : !* case 15: return DBL_MIN_EXP;
1959 : : !* case 16: return DBL_MAX_EXP;
1960 : : !* }
1961 : : !* fprintf(stderr, "invalid argument: i1mach(%ld)\n", *i);
1962 : : !* exit(1);return 0; /* some compilers demand return values */
1963 : : !*}
1964 : : END FUNCTION I1MACH
1965 : :
1966 : : SUBROUTINE I1MCR1(A, A1, B, C, D)
1967 : : !**** SPECIAL COMPUTATION FOR OLD CRAY MACHINES ****
1968 : : INTEGER A, A1, B, C, D
1969 : : A1 = 16777216*B + C
1970 : : A = 16777216*A1 + D
1971 : : END SUBROUTINE I1MCR1
1972 : :
1973 : 0 : SUBROUTINE ZUCHK(YR, YI, NZ, ASCLE, TOL)
1974 : : !C***BEGIN PROLOGUE ZUCHK
1975 : : !C***REFER TO ZSERI,ZUOIK,ZUNK1,ZUNK2,ZUNI1,ZUNI2,ZKSCL
1976 : : !C
1977 : : !C Y ENTERS AS A SCALED QUANTITY WHOSE MAGNITUDE IS GREATER THAN
1978 : : !C EXP(-ALIM)=ASCLE=1.0E+3*D1MACH(1)/TOL. THE TEST IS MADE TO SEE
1979 : : !C IF THE MAGNITUDE OF THE REAL OR IMAGINARY PART WOULD UNDERFLOW
1980 : : !C WHEN Y IS SCALED (BY TOL) TO ITS PROPER VALUE. Y IS ACCEPTED
1981 : : !C IF THE UNDERFLOW IS AT LEAST ONE PRECISION BELOW THE MAGNITUDE
1982 : : !C OF THE LARGEST COMPONENT; OTHERWISE THE PHASE ANGLE DOES NOT HAVE
1983 : : !C ABSOLUTE ACCURACY AND AN UNDERFLOW IS ASSUMED.
1984 : : !C
1985 : : !C***ROUTINES CALLED (NONE)
1986 : : !C***END PROLOGUE ZUCHK
1987 : : !C
1988 : : !C COMPLEX Y
1989 : : DOUBLE PRECISION ASCLE, SS, ST, TOL, WR, WI, YR, YI
1990 : : INTEGER NZ
1991 : 0 : NZ = 0
1992 : 0 : WR = DABS(YR)
1993 : 0 : WI = DABS(YI)
1994 : 0 : ST = DMIN1(WR,WI)
1995 [ # # # # : 0 : IF (ST.GT.ASCLE) RETURN
# # # # #
# # # #
# ]
1996 : 0 : SS = DMAX1(WR,WI)
1997 : 0 : ST = ST/TOL
1998 [ # # # # : 0 : IF (SS.LT.ST) NZ = 1
# # # # #
# # # # #
# # # # #
# # # #
# ]
1999 : : RETURN
2000 : : END SUBROUTINE ZUCHK
2001 : :
2002 : 0 : SUBROUTINE ZDIV(AR, AI, BR, BI, CR, CI)
2003 : : !C***BEGIN PROLOGUE ZDIV
2004 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
2005 : : !C
2006 : : !C DOUBLE PRECISION COMPLEX DIVIDE C=A/B.
2007 : : !C
2008 : : !C***ROUTINES CALLED AZABS
2009 : : !C***END PROLOGUE ZDIV
2010 : : DOUBLE PRECISION AR, AI, BR, BI, CR, CI, BM, CA, CB, CC, CD
2011 : : !DOUBLE PRECISION AZABS
2012 : 0 : BM = 1.0D0/AZABS(BR,BI)
2013 : 0 : CC = BR*BM
2014 : 0 : CD = BI*BM
2015 : 0 : CA = (AR*CC+AI*CD)*BM
2016 : 0 : CB = (AI*CC-AR*CD)*BM
2017 : 0 : CR = CA
2018 : 0 : CI = CB
2019 : 0 : RETURN
2020 : : END SUBROUTINE ZDIV
2021 : :
2022 : :
2023 : 0 : SUBROUTINE ZASYI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, RL, TOL, ELIM, &
2024 : : & ALIM)
2025 : : !C***BEGIN PROLOGUE ZASYI
2026 : : !C***REFER TO ZBESI,ZBESK
2027 : : !C
2028 : : !C ZASYI COMPUTES THE I BESSEL FUNCTION FOR REAL(Z).GE.0.0 BY
2029 : : !C MEANS OF THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z) IN THE
2030 : : !C REGION CABS(Z).GT.MAX(RL,FNU*FNU/2). NZ=0 IS A NORMAL RETURN.
2031 : : !C NZ.LT.0 INDICATES AN OVERFLOW ON KODE=1.
2032 : : !C
2033 : : !C***ROUTINES CALLED D1MACH,AZABS,ZDIV,AZEXP,ZMLT,AZSQRT
2034 : : !C***END PROLOGUE ZASYI
2035 : : !C COMPLEX AK1,CK,CONE,CS1,CS2,CZ,CZERO,DK,EZ,P1,RZ,S2,Y,Z
2036 : : DOUBLE PRECISION AA, AEZ, AK, AK1I, AK1R, ALIM, ARG, ARM, ATOL, &
2037 : : & AZ, BB, BK, CKI, CKR, CONEI, CONER, CS1I, CS1R, CS2I, CS2R, CZI, &
2038 : : & CZR, DFNU, DKI, DKR, DNU2, ELIM, EZI, EZR, FDN, FNU, PI, P1I, &
2039 : : & P1R, RAZ, RL, RTPI, RTR1, RZI, RZR, S, SGN, SQK, STI, STR, S2I, &
2040 : : & S2R, TOL, TZI, TZR, YI, YR, ZEROI, ZEROR, ZI, ZR!, D1MACH, AZABS
2041 : : INTEGER I, IB, IL, INU, J, JL, K, KODE, KODED, M, N, NN, NZ
2042 : : DIMENSION YR(N), YI(N)
2043 : : DATA PI, RTPI /3.14159265358979324D0 , 0.159154943091895336D0 /
2044 : : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
2045 : : !C
2046 : 0 : NZ = 0
2047 : 0 : AZ = AZABS(ZR,ZI)
2048 : 0 : ARM = 1.0D+3*D1MACH(1)
2049 : 0 : RTR1 = DSQRT(ARM)
2050 : 0 : IL = MIN0(2,N)
2051 : 0 : DFNU = FNU + DBLE(FLOAT(N-IL))
2052 : : !C-----------------------------------------------------------------------
2053 : : !C OVERFLOW TEST
2054 : : !C-----------------------------------------------------------------------
2055 : 0 : RAZ = 1.0D0/AZ
2056 : 0 : STR = ZR*RAZ
2057 : 0 : STI = -ZI*RAZ
2058 : 0 : AK1R = RTPI*STR*RAZ
2059 : 0 : AK1I = RTPI*STI*RAZ
2060 : 0 : CALL AZSQRT(AK1R, AK1I, AK1R, AK1I)
2061 : 0 : CZR = ZR
2062 : 0 : CZI = ZI
2063 [ # # ]: 0 : IF (KODE.NE.2) GO TO 10
2064 : 0 : CZR = ZEROR
2065 : 0 : CZI = ZI
2066 : : 10 CONTINUE
2067 [ # # ]: 0 : IF (DABS(CZR).GT.ELIM) GO TO 100
2068 : 0 : DNU2 = DFNU + DFNU
2069 : 0 : KODED = 1
2070 [ # # # # ]: 0 : IF ((DABS(CZR).GT.ALIM) .AND. (N.GT.2)) GO TO 20
2071 : 0 : KODED = 0
2072 : 0 : CALL AZEXP(CZR, CZI, STR, STI)
2073 : 0 : CALL ZMLT(AK1R, AK1I, STR, STI, AK1R, AK1I)
2074 : : 20 CONTINUE
2075 : 0 : FDN = 0.0D0
2076 [ # # ]: 0 : IF (DNU2.GT.RTR1) FDN = DNU2*DNU2
2077 : 0 : EZR = ZR*8.0D0
2078 : 0 : EZI = ZI*8.0D0
2079 : : !C-----------------------------------------------------------------------
2080 : : !C WHEN Z IS IMAGINARY, THE ERROR TEST MUST BE MADE RELATIVE TO THE
2081 : : !C FIRST RECIPROCAL POWER SINCE THIS IS THE LEADING TERM OF THE
2082 : : !C EXPANSION FOR THE IMAGINARY PART.
2083 : : !C-----------------------------------------------------------------------
2084 : 0 : AEZ = 8.0D0*AZ
2085 : 0 : S = TOL/AEZ
2086 : 0 : JL = INT(SNGL(RL+RL)) + 2
2087 : 0 : P1R = ZEROR
2088 : 0 : P1I = ZEROI
2089 [ # # ]: 0 : IF (ZI.EQ.0.0D0) GO TO 30
2090 : : !C-----------------------------------------------------------------------
2091 : : !C CALCULATE EXP(PI*(0.5+FNU+N-IL)*I) TO MINIMIZE LOSSES OF
2092 : : !C SIGNIFICANCE WHEN FNU OR N IS LARGE
2093 : : !C-----------------------------------------------------------------------
2094 : 0 : INU = INT(SNGL(FNU))
2095 : 0 : ARG = (FNU-DBLE(FLOAT(INU)))*PI
2096 : 0 : INU = INU + N - IL
2097 : 0 : AK = -DSIN(ARG)
2098 : 0 : BK = DCOS(ARG)
2099 [ # # ]: 0 : IF (ZI.LT.0.0D0) BK = -BK
2100 : 0 : P1R = AK
2101 : 0 : P1I = BK
2102 [ # # ]: 0 : IF (MOD(INU,2).EQ.0) GO TO 30
2103 : 0 : P1R = -P1R
2104 : 0 : P1I = -P1I
2105 : : 30 CONTINUE
2106 [ # # ]: 0 : DO 70 K=1,IL
2107 : 0 : SQK = FDN - 1.0D0
2108 : 0 : ATOL = S*DABS(SQK)
2109 : 0 : SGN = 1.0D0
2110 : 0 : CS1R = CONER
2111 : 0 : CS1I = CONEI
2112 : 0 : CS2R = CONER
2113 : 0 : CS2I = CONEI
2114 : 0 : CKR = CONER
2115 : 0 : CKI = CONEI
2116 : 0 : AK = 0.0D0
2117 : 0 : AA = 1.0D0
2118 : 0 : BB = AEZ
2119 : 0 : DKR = EZR
2120 : 0 : DKI = EZI
2121 [ # # ]: 0 : DO 40 J=1,JL
2122 : 0 : CALL ZDIV(CKR, CKI, DKR, DKI, STR, STI)
2123 : 0 : CKR = STR*SQK
2124 : 0 : CKI = STI*SQK
2125 : 0 : CS2R = CS2R + CKR
2126 : 0 : CS2I = CS2I + CKI
2127 : 0 : SGN = -SGN
2128 : 0 : CS1R = CS1R + CKR*SGN
2129 : 0 : CS1I = CS1I + CKI*SGN
2130 : 0 : DKR = DKR + EZR
2131 : 0 : DKI = DKI + EZI
2132 : 0 : AA = AA*DABS(SQK)/BB
2133 : 0 : BB = BB + AEZ
2134 : 0 : AK = AK + 8.0D0
2135 : 0 : SQK = SQK - AK
2136 [ # # ]: 0 : IF (AA.LE.ATOL) GO TO 50
2137 : 0 : 40 CONTINUE
2138 : 0 : GO TO 110
2139 : : 50 CONTINUE
2140 : 0 : S2R = CS1R
2141 : 0 : S2I = CS1I
2142 [ # # ]: 0 : IF (ZR+ZR.GE.ELIM) GO TO 60
2143 : 0 : TZR = ZR + ZR
2144 : 0 : TZI = ZI + ZI
2145 : 0 : CALL AZEXP(-TZR, -TZI, STR, STI)
2146 : 0 : CALL ZMLT(STR, STI, P1R, P1I, STR, STI)
2147 : 0 : CALL ZMLT(STR, STI, CS2R, CS2I, STR, STI)
2148 : 0 : S2R = S2R + STR
2149 : 0 : S2I = S2I + STI
2150 : : 60 CONTINUE
2151 : 0 : FDN = FDN + 8.0D0*DFNU + 4.0D0
2152 : 0 : P1R = -P1R
2153 : 0 : P1I = -P1I
2154 : 0 : M = N - IL + K
2155 : 0 : YR(M) = S2R*AK1R - S2I*AK1I
2156 : 0 : YI(M) = S2R*AK1I + S2I*AK1R
2157 : 0 : 70 CONTINUE
2158 [ # # ]: 0 : IF (N.LE.2) RETURN
2159 : 0 : NN = N
2160 : 0 : K = NN - 2
2161 : 0 : AK = DBLE(FLOAT(K))
2162 : 0 : STR = ZR*RAZ
2163 : 0 : STI = -ZI*RAZ
2164 : 0 : RZR = (STR+STR)*RAZ
2165 : 0 : RZI = (STI+STI)*RAZ
2166 : 0 : IB = 3
2167 [ # # ]: 0 : DO 80 I=IB,NN
2168 : 0 : YR(K) = (AK+FNU)*(RZR*YR(K+1)-RZI*YI(K+1)) + YR(K+2)
2169 : 0 : YI(K) = (AK+FNU)*(RZR*YI(K+1)+RZI*YR(K+1)) + YI(K+2)
2170 : 0 : AK = AK - 1.0D0
2171 : 0 : K = K - 1
2172 : 0 : 80 CONTINUE
2173 [ # # ]: 0 : IF (KODED.EQ.0) RETURN
2174 : 0 : CALL AZEXP(CZR, CZI, CKR, CKI)
2175 [ # # ]: 0 : DO 90 I=1,NN
2176 : 0 : STR = YR(I)*CKR - YI(I)*CKI
2177 : 0 : YI(I) = YR(I)*CKI + YI(I)*CKR
2178 : 0 : YR(I) = STR
2179 : 0 : 90 CONTINUE
2180 : 0 : RETURN
2181 : : 100 CONTINUE
2182 : 0 : NZ = -1
2183 : 0 : RETURN
2184 : : 110 CONTINUE
2185 : 0 : NZ=-2
2186 : 0 : RETURN
2187 : : END SUBROUTINE ZASYI
2188 : :
2189 : 0 : SUBROUTINE AZSQRT(AR, AI, BR, BI)
2190 : : !C***BEGIN PROLOGUE AZSQRT
2191 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
2192 : : !C
2193 : : !C DOUBLE PRECISION COMPLEX SQUARE ROOT, B=CSQRT(A)
2194 : : !C
2195 : : !C***ROUTINES CALLED AZABS
2196 : : !C***END PROLOGUE AZSQRT
2197 : : DOUBLE PRECISION AR, AI, BR, BI, ZM, DTHETA, DPI, DRT
2198 : : !DOUBLE PRECISION AZABS
2199 : : DATA DRT , DPI / 7.071067811865475244008443621D-1, &
2200 : : & 3.141592653589793238462643383D+0/
2201 : 0 : ZM = AZABS(AR,AI)
2202 : 0 : ZM = DSQRT(ZM)
2203 [ # # ]: 0 : IF (AR.EQ.0.0D+0) GO TO 10
2204 [ # # ]: 0 : IF (AI.EQ.0.0D+0) GO TO 20
2205 : 0 : DTHETA = DATAN(AI/AR)
2206 [ # # ]: 0 : IF (DTHETA.LE.0.0D+0) GO TO 40
2207 [ # # ]: 0 : IF (AR.LT.0.0D+0) DTHETA = DTHETA - DPI
2208 : 0 : GO TO 50
2209 [ # # ]: 0 : 10 IF (AI.GT.0.0D+0) GO TO 60
2210 [ # # ]: 0 : IF (AI.LT.0.0D+0) GO TO 70
2211 : 0 : BR = 0.0D+0
2212 : 0 : BI = 0.0D+0
2213 : 0 : RETURN
2214 [ # # ]: 0 : 20 IF (AR.GT.0.0D+0) GO TO 30
2215 : 0 : BR = 0.0D+0
2216 : 0 : BI = DSQRT(DABS(AR))
2217 : 0 : RETURN
2218 : 0 : 30 BR = DSQRT(AR)
2219 : 0 : BI = 0.0D+0
2220 : 0 : RETURN
2221 [ # # ]: 0 : 40 IF (AR.LT.0.0D+0) DTHETA = DTHETA + DPI
2222 : 0 : 50 DTHETA = DTHETA*0.5D+0
2223 : 0 : BR = ZM*DCOS(DTHETA)
2224 : 0 : BI = ZM*DSIN(DTHETA)
2225 : 0 : RETURN
2226 : 0 : 60 BR = ZM*DRT
2227 : 0 : BI = ZM*DRT
2228 : 0 : RETURN
2229 : 0 : 70 BR = ZM*DRT
2230 : 0 : BI = -ZM*DRT
2231 : 0 : RETURN
2232 : : END SUBROUTINE AZSQRT
2233 : :
2234 : 0 : SUBROUTINE AZEXP(AR, AI, BR, BI)
2235 : : !C***BEGIN PROLOGUE AZEXP
2236 : : !C***REFER TO ZBESH,ZBESI,ZBESJ,ZBESK,ZBESY,ZAIRY,ZBIRY
2237 : : !C
2238 : : !C DOUBLE PRECISION COMPLEX EXPONENTIAL FUNCTION B=EXP(A)
2239 : : !C
2240 : : !C***ROUTINES CALLED (NONE)
2241 : : !C***END PROLOGUE AZEXP
2242 : : DOUBLE PRECISION AR, AI, BR, BI, ZM, CA, CB
2243 : 0 : ZM = DEXP(AR)
2244 : 0 : CA = ZM*DCOS(AI)
2245 : 0 : CB = ZM*DSIN(AI)
2246 : 0 : BR = CA
2247 : 0 : BI = CB
2248 : 0 : RETURN
2249 : : END SUBROUTINE AZEXP
2250 : :
2251 : 0 : SUBROUTINE ZUOIK(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL, &
2252 : : & ELIM, ALIM)
2253 : : !C***BEGIN PROLOGUE ZUOIK
2254 : : !C***REFER TO ZBESI,ZBESK,ZBESH
2255 : : !C
2256 : : !C ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
2257 : : !C EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
2258 : : !C (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
2259 : : !C WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
2260 : : !C EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
2261 : : !C THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
2262 : : !C MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
2263 : : !C EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
2264 : : !C EXP(-ELIM)/TOL
2265 : : !C
2266 : : !C IKFLG=1 MEANS THE I SEQUENCE IS TESTED
2267 : : !C =2 MEANS THE K SEQUENCE IS TESTED
2268 : : !C NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
2269 : : !C =-1 MEANS AN OVERFLOW WOULD OCCUR
2270 : : !C IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
2271 : : !C THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
2272 : : !C IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
2273 : : !C IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
2274 : : !C ANOTHER ROUTINE
2275 : : !C
2276 : : !C***ROUTINES CALLED ZUCHK,ZUNHJ,ZUNIK,D1MACH,AZABS,AZLOG
2277 : : !C***END PROLOGUE ZUOIK
2278 : : !C COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
2279 : : !C *ZR
2280 : : DOUBLE PRECISION AARG, AIC, ALIM, APHI, ARGI, ARGR, ASUMI, ASUMR, &
2281 : : & ASCLE, AX, AY, BSUMI, BSUMR, CWRKI, CWRKR, CZI, CZR, ELIM, FNN, &
2282 : : & FNU, GNN, GNU, PHII, PHIR, RCZ, STR, STI, SUMI, SUMR, TOL, YI, &
2283 : : & YR, ZBI, ZBR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI, &
2284 : : & ZNI, ZNR, ZR, ZRI, ZRR!, D1MACH, AZABS
2285 : : INTEGER I, IDUM, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
2286 : : DIMENSION YR(N), YI(N), CWRKR(16), CWRKI(16)
2287 : : DATA ZEROR,ZEROI / 0.0D0, 0.0D0 /
2288 : : DATA AIC / 1.265512123484645396D+00 /
2289 : 0 : NUF = 0
2290 : 0 : NN = N
2291 : 0 : ZRR = ZR
2292 : 0 : ZRI = ZI
2293 [ # # ]: 0 : IF (ZR.GE.0.0D0) GO TO 10
2294 : 0 : ZRR = -ZR
2295 : 0 : ZRI = -ZI
2296 : : 10 CONTINUE
2297 : 0 : ZBR = ZRR
2298 : 0 : ZBI = ZRI
2299 : 0 : AX = DABS(ZR)*1.7321D0
2300 : 0 : AY = DABS(ZI)
2301 : 0 : IFORM = 1
2302 [ # # ]: 0 : IF (AY.GT.AX) IFORM = 2
2303 : 0 : GNU = DMAX1(FNU,1.0D0)
2304 [ # # ]: 0 : IF (IKFLG.EQ.1) GO TO 20
2305 : 0 : FNN = DBLE(FLOAT(NN))
2306 : 0 : GNN = FNU + FNN - 1.0D0
2307 : 0 : GNU = DMAX1(GNN,FNN)
2308 : : 20 CONTINUE
2309 : : !C-----------------------------------------------------------------------
2310 : : !C ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
2311 : : !C REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
2312 : : !C THE SIGN OF THE IMAGINARY PART CORRECT.
2313 : : !C-----------------------------------------------------------------------
2314 [ # # ]: 0 : IF (IFORM.EQ.2) GO TO 30
2315 : 0 : INIT = 0
2316 : : CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII, &
2317 : 0 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2318 : 0 : CZR = -ZETA1R + ZETA2R
2319 : 0 : CZI = -ZETA1I + ZETA2I
2320 : 0 : GO TO 50
2321 : : 30 CONTINUE
2322 : 0 : ZNR = ZRI
2323 : 0 : ZNI = -ZRR
2324 [ # # ]: 0 : IF (ZI.GT.0.0D0) GO TO 40
2325 : 0 : ZNR = -ZNR
2326 : : 40 CONTINUE
2327 : : CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
2328 : 0 : & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2329 : 0 : CZR = -ZETA1R + ZETA2R
2330 : 0 : CZI = -ZETA1I + ZETA2I
2331 : 0 : AARG = AZABS(ARGR,ARGI)
2332 : : 50 CONTINUE
2333 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 60
2334 : 0 : CZR = CZR - ZBR
2335 : 0 : CZI = CZI - ZBI
2336 : : 60 CONTINUE
2337 [ # # ]: 0 : IF (IKFLG.EQ.1) GO TO 70
2338 : 0 : CZR = -CZR
2339 : 0 : CZI = -CZI
2340 : : 70 CONTINUE
2341 : 0 : APHI = AZABS(PHIR,PHII)
2342 : 0 : RCZ = CZR
2343 : : !C-----------------------------------------------------------------------
2344 : : !C OVERFLOW TEST
2345 : : !C-----------------------------------------------------------------------
2346 [ # # ]: 0 : IF (RCZ.GT.ELIM) GO TO 210
2347 [ # # ]: 0 : IF (RCZ.LT.ALIM) GO TO 80
2348 : 0 : RCZ = RCZ + DLOG(APHI)
2349 [ # # ]: 0 : IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
2350 [ # # ]: 0 : IF (RCZ.GT.ELIM) GO TO 210
2351 : 0 : GO TO 130
2352 : : 80 CONTINUE
2353 : : !C-----------------------------------------------------------------------
2354 : : !C UNDERFLOW TEST
2355 : : !C-----------------------------------------------------------------------
2356 [ # # ]: 0 : IF (RCZ.LT.(-ELIM)) GO TO 90
2357 [ # # ]: 0 : IF (RCZ.GT.(-ALIM)) GO TO 130
2358 : 0 : RCZ = RCZ + DLOG(APHI)
2359 [ # # ]: 0 : IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
2360 [ # # ]: 0 : IF (RCZ.GT.(-ELIM)) GO TO 110
2361 : : 90 CONTINUE
2362 : 0 : DO 100 I=1,NN
2363 : 0 : YR(I) = ZEROR
2364 : 0 : YI(I) = ZEROI
2365 : 0 : 100 CONTINUE
2366 : 0 : NUF = NN
2367 : 0 : RETURN
2368 : : 110 CONTINUE
2369 : 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
2370 : 0 : CALL AZLOG(PHIR, PHII, STR, STI, IDUM)
2371 : 0 : CZR = CZR + STR
2372 : 0 : CZI = CZI + STI
2373 [ # # ]: 0 : IF (IFORM.EQ.1) GO TO 120
2374 : 0 : CALL AZLOG(ARGR, ARGI, STR, STI, IDUM)
2375 : 0 : CZR = CZR - 0.25D0*STR - AIC
2376 : 0 : CZI = CZI - 0.25D0*STI
2377 : : 120 CONTINUE
2378 : 0 : AX = DEXP(RCZ)/TOL
2379 : 0 : AY = CZI
2380 : 0 : CZR = AX*DCOS(AY)
2381 [ # # ]: 0 : CZI = AX*DSIN(AY)
2382 [ # # ]: 0 : CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
2383 : : IF (NW.NE.0) GO TO 90
2384 : : 130 CONTINUE
2385 [ # # ]: 0 : IF (IKFLG.EQ.2) RETURN
2386 [ # # ]: 0 : IF (N.EQ.1) RETURN
2387 : : !C-----------------------------------------------------------------------
2388 : : !C SET UNDERFLOWS ON I SEQUENCE
2389 : : !C-----------------------------------------------------------------------
2390 : : 140 CONTINUE
2391 : 0 : GNU = FNU + DBLE(FLOAT(NN-1))
2392 [ # # ]: 0 : IF (IFORM.EQ.2) GO TO 150
2393 : 0 : INIT = 0
2394 : : CALL ZUNIK(ZRR, ZRI, GNU, IKFLG, 1, TOL, INIT, PHIR, PHII, &
2395 : 0 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2396 : 0 : CZR = -ZETA1R + ZETA2R
2397 : 0 : CZI = -ZETA1I + ZETA2I
2398 : 0 : GO TO 160
2399 : : 150 CONTINUE
2400 : : CALL ZUNHJ(ZNR, ZNI, GNU, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
2401 : 0 : & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2402 : 0 : CZR = -ZETA1R + ZETA2R
2403 : 0 : CZI = -ZETA1I + ZETA2I
2404 : 0 : AARG = AZABS(ARGR,ARGI)
2405 : : 160 CONTINUE
2406 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 170
2407 : 0 : CZR = CZR - ZBR
2408 : 0 : CZI = CZI - ZBI
2409 : : 170 CONTINUE
2410 : 0 : APHI = AZABS(PHIR,PHII)
2411 : 0 : RCZ = CZR
2412 [ # # ]: 0 : IF (RCZ.LT.(-ELIM)) GO TO 180
2413 [ # # ]: 0 : IF (RCZ.GT.(-ALIM)) RETURN
2414 : 0 : RCZ = RCZ + DLOG(APHI)
2415 [ # # ]: 0 : IF (IFORM.EQ.2) RCZ = RCZ - 0.25D0*DLOG(AARG) - AIC
2416 [ # # ]: 0 : IF (RCZ.GT.(-ELIM)) GO TO 190
2417 : : 180 CONTINUE
2418 : 0 : YR(NN) = ZEROR
2419 : 0 : YI(NN) = ZEROI
2420 : 0 : NN = NN - 1
2421 : 0 : NUF = NUF + 1
2422 : 0 : IF (NN.EQ.0) RETURN
2423 : 0 : GO TO 140
2424 : : 190 CONTINUE
2425 : 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
2426 : 0 : CALL AZLOG(PHIR, PHII, STR, STI, IDUM)
2427 : 0 : CZR = CZR + STR
2428 : 0 : CZI = CZI + STI
2429 [ # # ]: 0 : IF (IFORM.EQ.1) GO TO 200
2430 : 0 : CALL AZLOG(ARGR, ARGI, STR, STI, IDUM)
2431 : 0 : CZR = CZR - 0.25D0*STR - AIC
2432 : 0 : CZI = CZI - 0.25D0*STI
2433 : : 200 CONTINUE
2434 : 0 : AX = DEXP(RCZ)/TOL
2435 : 0 : AY = CZI
2436 : 0 : CZR = AX*DCOS(AY)
2437 [ # # ]: 0 : CZI = AX*DSIN(AY)
2438 [ # # ]: 0 : CALL ZUCHK(CZR, CZI, NW, ASCLE, TOL)
2439 : : IF (NW.NE.0) GO TO 180
2440 : 0 : RETURN
2441 : : 210 CONTINUE
2442 : 0 : NUF = -1
2443 : 0 : RETURN
2444 : : END SUBROUTINE ZUOIK
2445 : :
2446 : :
2447 : 0 : SUBROUTINE ZUNIK(ZRR, ZRI, FNU, IKFLG, IPMTR, TOL, INIT, PHIR, &
2448 : : & PHII, ZETA1R, ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
2449 : : !C***BEGIN PROLOGUE ZUNIK
2450 : : !C***REFER TO ZBESI,ZBESK
2451 : : !C
2452 : : !C ZUNIK COMPUTES PARAMETERS FOR THE UNIFORM ASYMPTOTIC
2453 : : !C EXPANSIONS OF THE I AND K FUNCTIONS ON IKFLG= 1 OR 2
2454 : : !C RESPECTIVELY BY
2455 : : !C
2456 : : !C W(FNU,ZR) = PHI*EXP(ZETA)*SUM
2457 : : !C
2458 : : !C WHERE ZETA=-ZETA1 + ZETA2 OR
2459 : : !C ZETA1 - ZETA2
2460 : : !C
2461 : : !C THE FIRST CALL MUST HAVE INIT=0. SUBSEQUENT CALLS WITH THE
2462 : : !C SAME ZR AND FNU WILL RETURN THE I OR K FUNCTION ON IKFLG=
2463 : : !C 1 OR 2 WITH NO CHANGE IN INIT. CWRK IS A COMPLEX WORK
2464 : : !C ARRAY. IPMTR=0 COMPUTES ALL PARAMETERS. IPMTR=1 COMPUTES PHI,
2465 : : !C ZETA1,ZETA2.
2466 : : !C
2467 : : !C***ROUTINES CALLED ZDIV,AZLOG,AZSQRT,D1MACH
2468 : : !C***END PROLOGUE ZUNIK
2469 : : !C COMPLEX CFN,CON,CONE,CRFN,CWRK,CZERO,PHI,S,SR,SUM,T,T2,ZETA1,
2470 : : !C *ZETA2,ZN,ZR
2471 : : DOUBLE PRECISION AC, C, CON, CONEI, CONER, CRFNI, CRFNR, CWRKI, &
2472 : : & CWRKR, FNU, PHII, PHIR, RFN, SI, SR, SRI, SRR, STI, STR, SUMI, &
2473 : : & SUMR, TEST, TI, TOL, TR, T2I, T2R, ZEROI, ZEROR, ZETA1I, ZETA1R, &
2474 : : & ZETA2I, ZETA2R, ZNI, ZNR, ZRI, ZRR!, D1MACH
2475 : : INTEGER I, IDUM, IKFLG, INIT, IPMTR, J, K, L
2476 : : DIMENSION C(120), CWRKR(16), CWRKI(16), CON(2)
2477 : : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
2478 : : DATA CON(1), CON(2) / &
2479 : : & 3.98942280401432678D-01, 1.25331413731550025D+00 /
2480 : : DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10), &
2481 : : & C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18), &
2482 : : & C(19), C(20), C(21), C(22), C(23), C(24)/ &
2483 : : & 1.00000000000000000D+00, -2.08333333333333333D-01, &
2484 : : & 1.25000000000000000D-01, 3.34201388888888889D-01, &
2485 : : & -4.01041666666666667D-01, 7.03125000000000000D-02, &
2486 : : & -1.02581259645061728D+00, 1.84646267361111111D+00, &
2487 : : & -8.91210937500000000D-01, 7.32421875000000000D-02, &
2488 : : & 4.66958442342624743D+00, -1.12070026162229938D+01, &
2489 : : & 8.78912353515625000D+00, -2.36408691406250000D+00, &
2490 : : & 1.12152099609375000D-01, -2.82120725582002449D+01, &
2491 : : & 8.46362176746007346D+01, -9.18182415432400174D+01, &
2492 : : & 4.25349987453884549D+01, -7.36879435947963170D+00, &
2493 : : & 2.27108001708984375D-01, 2.12570130039217123D+02, &
2494 : : & -7.65252468141181642D+02, 1.05999045252799988D+03/
2495 : : DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32), &
2496 : : & C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40), &
2497 : : & C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/ &
2498 : : & -6.99579627376132541D+02, 2.18190511744211590D+02, &
2499 : : & -2.64914304869515555D+01, 5.72501420974731445D-01, &
2500 : : & -1.91945766231840700D+03, 8.06172218173730938D+03, &
2501 : : & -1.35865500064341374D+04, 1.16553933368645332D+04, &
2502 : : & -5.30564697861340311D+03, 1.20090291321635246D+03, &
2503 : : & -1.08090919788394656D+02, 1.72772750258445740D+00, &
2504 : : & 2.02042913309661486D+04, -9.69805983886375135D+04, &
2505 : : & 1.92547001232531532D+05, -2.03400177280415534D+05, &
2506 : : & 1.22200464983017460D+05, -4.11926549688975513D+04, &
2507 : : & 7.10951430248936372D+03, -4.93915304773088012D+02, &
2508 : : & 6.07404200127348304D+00, -2.42919187900551333D+05, &
2509 : : & 1.31176361466297720D+06, -2.99801591853810675D+06/
2510 : : DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56), &
2511 : : & C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64), &
2512 : : & C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/ &
2513 : : & 3.76327129765640400D+06, -2.81356322658653411D+06, &
2514 : : & 1.26836527332162478D+06, -3.31645172484563578D+05, &
2515 : : & 4.52187689813627263D+04, -2.49983048181120962D+03, &
2516 : : & 2.43805296995560639D+01, 3.28446985307203782D+06, &
2517 : : & -1.97068191184322269D+07, 5.09526024926646422D+07, &
2518 : : & -7.41051482115326577D+07, 6.63445122747290267D+07, &
2519 : : & -3.75671766607633513D+07, 1.32887671664218183D+07, &
2520 : : & -2.78561812808645469D+06, 3.08186404612662398D+05, &
2521 : : & -1.38860897537170405D+04, 1.10017140269246738D+02, &
2522 : : & -4.93292536645099620D+07, 3.25573074185765749D+08, &
2523 : : & -9.39462359681578403D+08, 1.55359689957058006D+09,&
2524 : : & -1.62108055210833708D+09, 1.10684281682301447D+09/
2525 : : DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80), &
2526 : : & C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88), &
2527 : : & C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/ &
2528 : : & -4.95889784275030309D+08, 1.42062907797533095D+08, &
2529 : : & -2.44740627257387285D+07, 2.24376817792244943D+06, &
2530 : : & -8.40054336030240853D+04, 5.51335896122020586D+02, &
2531 : : & 8.14789096118312115D+08, -5.86648149205184723D+09, &
2532 : : & 1.86882075092958249D+10, -3.46320433881587779D+10, &
2533 : : & 4.12801855797539740D+10, -3.30265997498007231D+10, &
2534 : : & 1.79542137311556001D+10, -6.56329379261928433D+09, &
2535 : : & 1.55927986487925751D+09, -2.25105661889415278D+08, &
2536 : : & 1.73951075539781645D+07, -5.49842327572288687D+05, &
2537 : : & 3.03809051092238427D+03, -1.46792612476956167D+10, &
2538 : : & 1.14498237732025810D+11, -3.99096175224466498D+11,&
2539 : : & 8.19218669548577329D+11, -1.09837515608122331D+12/
2540 : : DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104), &
2541 : : & C(105), C(106), C(107), C(108), C(109), C(110), C(111), &
2542 : : & C(112), C(113), C(114), C(115), C(116), C(117), C(118)/ &
2543 : : & 1.00815810686538209D+12, -6.45364869245376503D+11, &
2544 : : & 2.87900649906150589D+11, -8.78670721780232657D+10, &
2545 : : & 1.76347306068349694D+10, -2.16716498322379509D+09, &
2546 : : & 1.43157876718888981D+08, -3.87183344257261262D+06, &
2547 : : & 1.82577554742931747D+04, 2.86464035717679043D+11, &
2548 : : & -2.40629790002850396D+12, 9.10934118523989896D+12, &
2549 : : & -2.05168994109344374D+13, 3.05651255199353206D+13, &
2550 : : & -3.16670885847851584D+13, 2.33483640445818409D+13, &
2551 : : & -1.23204913055982872D+13, 4.61272578084913197D+12, &
2552 : : & -1.19655288019618160D+12, 2.05914503232410016D+11, &
2553 : : & -2.18229277575292237D+10, 1.24700929351271032D+09/
2554 : : DATA C(119), C(120)/ &
2555 : : & -2.91883881222208134D+07, 1.18838426256783253D+05/
2556 : : !C
2557 [ # # ]: 0 : IF (INIT.NE.0) GO TO 40
2558 : : !C-----------------------------------------------------------------------
2559 : : !C INITIALIZE ALL VARIABLES
2560 : : !C-----------------------------------------------------------------------
2561 : 0 : RFN = 1.0D0/FNU
2562 : : !C-----------------------------------------------------------------------
2563 : : !C OVERFLOW TEST (ZR/FNU TOO SMALL)
2564 : : !C-----------------------------------------------------------------------
2565 : 0 : TEST = D1MACH(1)*1.0D+3
2566 : 0 : AC = FNU*TEST
2567 [ # # # # ]: 0 : IF (DABS(ZRR).GT.AC .OR. DABS(ZRI).GT.AC) GO TO 15
2568 : 0 : ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
2569 : 0 : ZETA1I = 0.0D0
2570 : 0 : ZETA2R = FNU
2571 : 0 : ZETA2I = 0.0D0
2572 : 0 : PHIR = 1.0D0
2573 : 0 : PHII = 0.0D0
2574 : 0 : RETURN
2575 : : 15 CONTINUE
2576 : 0 : TR = ZRR*RFN
2577 : 0 : TI = ZRI*RFN
2578 : 0 : SR = CONER + (TR*TR-TI*TI)
2579 : 0 : SI = CONEI + (TR*TI+TI*TR)
2580 : 0 : CALL AZSQRT(SR, SI, SRR, SRI)
2581 : 0 : STR = CONER + SRR
2582 : 0 : STI = CONEI + SRI
2583 : 0 : CALL ZDIV(STR, STI, TR, TI, ZNR, ZNI)
2584 : 0 : CALL AZLOG(ZNR, ZNI, STR, STI, IDUM)
2585 : 0 : ZETA1R = FNU*STR
2586 : 0 : ZETA1I = FNU*STI
2587 : 0 : ZETA2R = FNU*SRR
2588 : 0 : ZETA2I = FNU*SRI
2589 : 0 : CALL ZDIV(CONER, CONEI, SRR, SRI, TR, TI)
2590 : 0 : SRR = TR*RFN
2591 : 0 : SRI = TI*RFN
2592 : 0 : CALL AZSQRT(SRR, SRI, CWRKR(16), CWRKI(16))
2593 : 0 : PHIR = CWRKR(16)*CON(IKFLG)
2594 : 0 : PHII = CWRKI(16)*CON(IKFLG)
2595 [ # # ]: 0 : IF (IPMTR.NE.0) RETURN
2596 : 0 : CALL ZDIV(CONER, CONEI, SR, SI, T2R, T2I)
2597 : 0 : CWRKR(1) = CONER
2598 : 0 : CWRKI(1) = CONEI
2599 : 0 : CRFNR = CONER
2600 : 0 : CRFNI = CONEI
2601 : 0 : AC = 1.0D0
2602 : 0 : L = 1
2603 [ # # ]: 0 : DO 20 K=2,15
2604 : 0 : SR = ZEROR
2605 : 0 : SI = ZEROI
2606 [ # # ]: 0 : DO 10 J=1,K
2607 : 0 : L = L + 1
2608 : 0 : STR = SR*T2R - SI*T2I + C(L)
2609 : 0 : SI = SR*T2I + SI*T2R
2610 : 0 : SR = STR
2611 : 0 : 10 CONTINUE
2612 : 0 : STR = CRFNR*SRR - CRFNI*SRI
2613 : 0 : CRFNI = CRFNR*SRI + CRFNI*SRR
2614 : 0 : CRFNR = STR
2615 : 0 : CWRKR(K) = CRFNR*SR - CRFNI*SI
2616 : 0 : CWRKI(K) = CRFNR*SI + CRFNI*SR
2617 : 0 : AC = AC*RFN
2618 : 0 : TEST = DABS(CWRKR(K)) + DABS(CWRKI(K))
2619 [ # # # # ]: 0 : IF (AC.LT.TOL .AND. TEST.LT.TOL) GO TO 30
2620 : 0 : 20 CONTINUE
2621 : 0 : K = 15
2622 : : 30 CONTINUE
2623 : 0 : INIT = K
2624 : : 40 CONTINUE
2625 [ # # ]: 0 : IF (IKFLG.EQ.2) GO TO 60
2626 : : !C-----------------------------------------------------------------------
2627 : : !C COMPUTE SUM FOR THE I FUNCTION
2628 : : !C-----------------------------------------------------------------------
2629 : 0 : SR = ZEROR
2630 : 0 : SI = ZEROI
2631 [ # # ]: 0 : DO 50 I=1,INIT
2632 : 0 : SR = SR + CWRKR(I)
2633 : 0 : SI = SI + CWRKI(I)
2634 : 0 : 50 CONTINUE
2635 : 0 : SUMR = SR
2636 : 0 : SUMI = SI
2637 : 0 : PHIR = CWRKR(16)*CON(1)
2638 : 0 : PHII = CWRKI(16)*CON(1)
2639 : 0 : RETURN
2640 : : 60 CONTINUE
2641 : : !C-----------------------------------------------------------------------
2642 : : !C COMPUTE SUM FOR THE K FUNCTION
2643 : : !C-----------------------------------------------------------------------
2644 : 0 : SR = ZEROR
2645 : 0 : SI = ZEROI
2646 : 0 : TR = CONER
2647 [ # # ]: 0 : DO 70 I=1,INIT
2648 : 0 : SR = SR + TR*CWRKR(I)
2649 : 0 : SI = SI + TR*CWRKI(I)
2650 : 0 : TR = -TR
2651 : 0 : 70 CONTINUE
2652 : 0 : SUMR = SR
2653 : 0 : SUMI = SI
2654 : 0 : PHIR = CWRKR(16)*CON(2)
2655 : 0 : PHII = CWRKI(16)*CON(2)
2656 : 0 : RETURN
2657 : : END SUBROUTINE ZUNIK
2658 : :
2659 : :
2660 : 0 : SUBROUTINE ZUNHJ(ZR, ZI, FNU, IPMTR, TOL, PHIR, PHII, ARGR, ARGI, &
2661 : : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
2662 : : !C***BEGIN PROLOGUE ZUNHJ
2663 : : !C***REFER TO ZBESI,ZBESK
2664 : : !C
2665 : : !C REFERENCES
2666 : : !C HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ AND I.A.
2667 : : !C STEGUN, AMS55, NATIONAL BUREAU OF STANDARDS, 1965, CHAPTER 9.
2668 : : !C
2669 : : !C ASYMPTOTICS AND SPECIAL FUNCTIONS BY F.W.J. OLVER, ACADEMIC
2670 : : !C PRESS, N.Y., 1974, PAGE 420
2671 : : !C
2672 : : !C ABSTRACT
2673 : : !C ZUNHJ COMPUTES PARAMETERS FOR BESSEL FUNCTIONS C(FNU,Z) =
2674 : : !C J(FNU,Z), Y(FNU,Z) OR H(I,FNU,Z) I=1,2 FOR LARGE ORDERS FNU
2675 : : !C BY MEANS OF THE UNIFORM ASYMPTOTIC EXPANSION
2676 : : !C
2677 : : !C C(FNU,Z)=C1*PHI*( ASUM*AIRY(ARG) + C2*BSUM*DAIRY(ARG) )
2678 : : !C
2679 : : !C FOR PROPER CHOICES OF C1, C2, AIRY AND DAIRY WHERE AIRY IS
2680 : : !C AN AIRY FUNCTION AND DAIRY IS ITS DERIVATIVE.
2681 : : !C
2682 : : !C (2/3)*FNU*ZETA**1.5 = ZETA1-ZETA2,
2683 : : !C
2684 : : !C ZETA1=0.5*FNU*CLOG((1+W)/(1-W)), ZETA2=FNU*W FOR SCALING
2685 : : !C PURPOSES IN AIRY FUNCTIONS FROM CAIRY OR CBIRY.
2686 : : !C
2687 : : !C MCONJ=SIGN OF AIMAG(Z), BUT IS AMBIGUOUS WHEN Z IS REAL AND
2688 : : !C MUST BE SPECIFIED. IPMTR=0 RETURNS ALL PARAMETERS. IPMTR=
2689 : : !C 1 COMPUTES ALL EXCEPT ASUM AND BSUM.
2690 : : !C
2691 : : !C***ROUTINES CALLED AZABS,ZDIV,AZLOG,AZSQRT,D1MACH
2692 : : !C***END PROLOGUE ZUNHJ
2693 : : !C COMPLEX ARG,ASUM,BSUM,CFNU,CONE,CR,CZERO,DR,P,PHI,PRZTH,PTFN,
2694 : : !C *RFN13,RTZTA,RZTH,SUMA,SUMB,TFN,T2,UP,W,W2,Z,ZA,ZB,ZC,ZETA,ZETA1,
2695 : : !C *ZETA2,ZTH
2696 : : DOUBLE PRECISION ALFA, ANG, AP, AR, ARGI, ARGR, ASUMI, ASUMR, &
2697 : : & ATOL, AW2, AZTH, BETA, BR, BSUMI, BSUMR, BTOL, C, CONEI, CONER, &
2698 : : & CRI, CRR, DRI, DRR, EX1, EX2, FNU, FN13, FN23, GAMA, GPI, HPI, &
2699 : : & PHII, PHIR, PI, PP, PR, PRZTHI, PRZTHR, PTFNI, PTFNR, RAW, RAW2, &
2700 : : & RAZTH, RFNU, RFNU2, RFN13, RTZTI, RTZTR, RZTHI, RZTHR, STI, STR, &
2701 : : & SUMAI, SUMAR, SUMBI, SUMBR, TEST, TFNI, TFNR, THPI, TOL, TZAI, &
2702 : : & TZAR, T2I, T2R, UPI, UPR, WI, WR, W2I, W2R, ZAI, ZAR, ZBI, ZBR, &
2703 : : & ZCI, ZCR, ZEROI, ZEROR, ZETAI, ZETAR, ZETA1I, ZETA1R, ZETA2I, &
2704 : : & ZETA2R, ZI, ZR, ZTHI, ZTHR, AC !, AZABS, D1MACH
2705 : : INTEGER IAS, IBS, IPMTR, IS, J, JR, JU, K, KMAX, KP1, KS, L, LR, &
2706 : : & LRP1, L1, L2, M, IDUM
2707 : : DIMENSION AR(14), BR(14), C(105), ALFA(180), BETA(210), GAMA(30), &
2708 : : & AP(30), PR(30), PI(30), UPR(14), UPI(14), CRR(14), CRI(14), &
2709 : : & DRR(14), DRI(14)
2710 : : DATA AR(1), AR(2), AR(3), AR(4), AR(5), AR(6), AR(7), AR(8), &
2711 : : & AR(9), AR(10), AR(11), AR(12), AR(13), AR(14)/ &
2712 : : & 1.00000000000000000D+00, 1.04166666666666667D-01, &
2713 : : & 8.35503472222222222D-02, 1.28226574556327160D-01, &
2714 : : & 2.91849026464140464D-01, 8.81627267443757652D-01, &
2715 : : & 3.32140828186276754D+00, 1.49957629868625547D+01, &
2716 : : & 7.89230130115865181D+01, 4.74451538868264323D+02, &
2717 : : & 3.20749009089066193D+03, 2.40865496408740049D+04, &
2718 : : & 1.98923119169509794D+05, 1.79190200777534383D+06/
2719 : : DATA BR(1), BR(2), BR(3), BR(4), BR(5), BR(6), BR(7), BR(8), &
2720 : : & BR(9), BR(10), BR(11), BR(12), BR(13), BR(14)/ &
2721 : : & 1.00000000000000000D+00, -1.45833333333333333D-01, &
2722 : : & -9.87413194444444444D-02, -1.43312053915895062D-01, &
2723 : : & -3.17227202678413548D-01, -9.42429147957120249D-01, &
2724 : : & -3.51120304082635426D+00, -1.57272636203680451D+01, &
2725 : : & -8.22814390971859444D+01, -4.92355370523670524D+02, &
2726 : : & -3.31621856854797251D+03, -2.48276742452085896D+04, &
2727 : : & -2.04526587315129788D+05, -1.83844491706820990D+06/
2728 : : DATA C(1), C(2), C(3), C(4), C(5), C(6), C(7), C(8), C(9), C(10), &
2729 : : & C(11), C(12), C(13), C(14), C(15), C(16), C(17), C(18), &
2730 : : & C(19), C(20), C(21), C(22), C(23), C(24)/ &
2731 : : & 1.00000000000000000D+00, -2.08333333333333333D-01, &
2732 : : & 1.25000000000000000D-01, 3.34201388888888889D-01, &
2733 : : & -4.01041666666666667D-01, 7.03125000000000000D-02, &
2734 : : & -1.02581259645061728D+00, 1.84646267361111111D+00, &
2735 : : & -8.91210937500000000D-01, 7.32421875000000000D-02, &
2736 : : & 4.66958442342624743D+00, -1.12070026162229938D+01, &
2737 : : & 8.78912353515625000D+00, -2.36408691406250000D+00, &
2738 : : & 1.12152099609375000D-01, -2.82120725582002449D+01, &
2739 : : & 8.46362176746007346D+01, -9.18182415432400174D+01, &
2740 : : & 4.25349987453884549D+01, -7.36879435947963170D+00, &
2741 : : & 2.27108001708984375D-01, 2.12570130039217123D+02, &
2742 : : & -7.65252468141181642D+02, 1.05999045252799988D+03/
2743 : : DATA C(25), C(26), C(27), C(28), C(29), C(30), C(31), C(32), &
2744 : : & C(33), C(34), C(35), C(36), C(37), C(38), C(39), C(40), &
2745 : : & C(41), C(42), C(43), C(44), C(45), C(46), C(47), C(48)/ &
2746 : : & -6.99579627376132541D+02, 2.18190511744211590D+02, &
2747 : : & -2.64914304869515555D+01, 5.72501420974731445D-01, &
2748 : : & -1.91945766231840700D+03, 8.06172218173730938D+03, &
2749 : : & -1.35865500064341374D+04, 1.16553933368645332D+04, &
2750 : : & -5.30564697861340311D+03, 1.20090291321635246D+03, &
2751 : : & -1.08090919788394656D+02, 1.72772750258445740D+00, &
2752 : : & 2.02042913309661486D+04, -9.69805983886375135D+04, &
2753 : : & 1.92547001232531532D+05, -2.03400177280415534D+05, &
2754 : : & 1.22200464983017460D+05, -4.11926549688975513D+04, &
2755 : : & 7.10951430248936372D+03, -4.93915304773088012D+02, &
2756 : : & 6.07404200127348304D+00, -2.42919187900551333D+05, &
2757 : : & 1.31176361466297720D+06, -2.99801591853810675D+06/
2758 : : DATA C(49), C(50), C(51), C(52), C(53), C(54), C(55), C(56), &
2759 : : & C(57), C(58), C(59), C(60), C(61), C(62), C(63), C(64), &
2760 : : & C(65), C(66), C(67), C(68), C(69), C(70), C(71), C(72)/ &
2761 : : & 3.76327129765640400D+06, -2.81356322658653411D+06, &
2762 : : & 1.26836527332162478D+06, -3.31645172484563578D+05, &
2763 : : & 4.52187689813627263D+04, -2.49983048181120962D+03, &
2764 : : & 2.43805296995560639D+01, 3.28446985307203782D+06, &
2765 : : & -1.97068191184322269D+07, 5.09526024926646422D+07, &
2766 : : & -7.41051482115326577D+07, 6.63445122747290267D+07, &
2767 : : & -3.75671766607633513D+07, 1.32887671664218183D+07, &
2768 : : & -2.78561812808645469D+06, 3.08186404612662398D+05, &
2769 : : & -1.38860897537170405D+04, 1.10017140269246738D+02, &
2770 : : & -4.93292536645099620D+07, 3.25573074185765749D+08, &
2771 : : & -9.39462359681578403D+08, 1.55359689957058006D+09, &
2772 : : & -1.62108055210833708D+09, 1.10684281682301447D+09/
2773 : : DATA C(73), C(74), C(75), C(76), C(77), C(78), C(79), C(80), &
2774 : : & C(81), C(82), C(83), C(84), C(85), C(86), C(87), C(88), &
2775 : : & C(89), C(90), C(91), C(92), C(93), C(94), C(95), C(96)/ &
2776 : : & -4.95889784275030309D+08, 1.42062907797533095D+08, &
2777 : : & -2.44740627257387285D+07, 2.24376817792244943D+06, &
2778 : : & -8.40054336030240853D+04, 5.51335896122020586D+02, &
2779 : : & 8.14789096118312115D+08, -5.86648149205184723D+09, &
2780 : : & 1.86882075092958249D+10, -3.46320433881587779D+10, &
2781 : : & 4.12801855797539740D+10, -3.30265997498007231D+10, &
2782 : : & 1.79542137311556001D+10, -6.56329379261928433D+09, &
2783 : : & 1.55927986487925751D+09, -2.25105661889415278D+08, &
2784 : : & 1.73951075539781645D+07, -5.49842327572288687D+05, &
2785 : : & 3.03809051092238427D+03, -1.46792612476956167D+10, &
2786 : : & 1.14498237732025810D+11, -3.99096175224466498D+11, &
2787 : : & 8.19218669548577329D+11, -1.09837515608122331D+12/
2788 : : DATA C(97), C(98), C(99), C(100), C(101), C(102), C(103), C(104), &
2789 : : & C(105)/ &
2790 : : & 1.00815810686538209D+12, -6.45364869245376503D+11, &
2791 : : & 2.87900649906150589D+11, -8.78670721780232657D+10, &
2792 : : & 1.76347306068349694D+10, -2.16716498322379509D+09, &
2793 : : & 1.43157876718888981D+08, -3.87183344257261262D+06, &
2794 : : & 1.82577554742931747D+04/
2795 : : DATA ALFA(1), ALFA(2), ALFA(3), ALFA(4), ALFA(5), ALFA(6), &
2796 : : & ALFA(7), ALFA(8), ALFA(9), ALFA(10), ALFA(11), ALFA(12), &
2797 : : & ALFA(13), ALFA(14), ALFA(15), ALFA(16), ALFA(17), ALFA(18), &
2798 : : & ALFA(19), ALFA(20), ALFA(21), ALFA(22)/ &
2799 : : & -4.44444444444444444D-03, -9.22077922077922078D-04, &
2800 : : & -8.84892884892884893D-05, 1.65927687832449737D-04, &
2801 : : & 2.46691372741792910D-04, 2.65995589346254780D-04, &
2802 : : & 2.61824297061500945D-04, 2.48730437344655609D-04, &
2803 : : & 2.32721040083232098D-04, 2.16362485712365082D-04, &
2804 : : & 2.00738858762752355D-04, 1.86267636637545172D-04, &
2805 : : & 1.73060775917876493D-04, 1.61091705929015752D-04, &
2806 : : & 1.50274774160908134D-04, 1.40503497391269794D-04, &
2807 : : & 1.31668816545922806D-04, 1.23667445598253261D-04, &
2808 : : & 1.16405271474737902D-04, 1.09798298372713369D-04, &
2809 : : & 1.03772410422992823D-04, 9.82626078369363448D-05/
2810 : : DATA ALFA(23), ALFA(24), ALFA(25), ALFA(26), ALFA(27), ALFA(28), &
2811 : : & ALFA(29), ALFA(30), ALFA(31), ALFA(32), ALFA(33), ALFA(34), &
2812 : : & ALFA(35), ALFA(36), ALFA(37), ALFA(38), ALFA(39), ALFA(40), &
2813 : : & ALFA(41), ALFA(42), ALFA(43), ALFA(44)/ &
2814 : : & 9.32120517249503256D-05, 8.85710852478711718D-05, &
2815 : : & 8.42963105715700223D-05, 8.03497548407791151D-05, &
2816 : : & 7.66981345359207388D-05, 7.33122157481777809D-05, &
2817 : : & 7.01662625163141333D-05, 6.72375633790160292D-05, &
2818 : : & 6.93735541354588974D-04, 2.32241745182921654D-04, &
2819 : : & -1.41986273556691197D-05, -1.16444931672048640D-04, &
2820 : : & -1.50803558053048762D-04, -1.55121924918096223D-04, &
2821 : : & -1.46809756646465549D-04, -1.33815503867491367D-04, &
2822 : : & -1.19744975684254051D-04, -1.06184319207974020D-04, &
2823 : : & -9.37699549891194492D-05, -8.26923045588193274D-05, &
2824 : : & -7.29374348155221211D-05, -6.44042357721016283D-05/
2825 : : DATA ALFA(45), ALFA(46), ALFA(47), ALFA(48), ALFA(49), ALFA(50), &
2826 : : & ALFA(51), ALFA(52), ALFA(53), ALFA(54), ALFA(55), ALFA(56), &
2827 : : & ALFA(57), ALFA(58), ALFA(59), ALFA(60), ALFA(61), ALFA(62), &
2828 : : & ALFA(63), ALFA(64), ALFA(65), ALFA(66)/ &
2829 : : & -5.69611566009369048D-05, -5.04731044303561628D-05, &
2830 : : & -4.48134868008882786D-05, -3.98688727717598864D-05, &
2831 : : & -3.55400532972042498D-05, -3.17414256609022480D-05, &
2832 : : & -2.83996793904174811D-05, -2.54522720634870566D-05, &
2833 : : & -2.28459297164724555D-05, -2.05352753106480604D-05, &
2834 : : & -1.84816217627666085D-05, -1.66519330021393806D-05, &
2835 : : & -1.50179412980119482D-05, -1.35554031379040526D-05, &
2836 : : & -1.22434746473858131D-05, -1.10641884811308169D-05, &
2837 : : & -3.54211971457743841D-04, -1.56161263945159416D-04, &
2838 : : & 3.04465503594936410D-05, 1.30198655773242693D-04, &
2839 : : & 1.67471106699712269D-04, 1.70222587683592569D-04/
2840 : : DATA ALFA(67), ALFA(68), ALFA(69), ALFA(70), ALFA(71), ALFA(72), &
2841 : : & ALFA(73), ALFA(74), ALFA(75), ALFA(76), ALFA(77), ALFA(78), &
2842 : : & ALFA(79), ALFA(80), ALFA(81), ALFA(82), ALFA(83), ALFA(84), &
2843 : : & ALFA(85), ALFA(86), ALFA(87), ALFA(88)/ &
2844 : : & 1.56501427608594704D-04, 1.36339170977445120D-04, &
2845 : : & 1.14886692029825128D-04, 9.45869093034688111D-05, &
2846 : : & 7.64498419250898258D-05, 6.07570334965197354D-05, &
2847 : : & 4.74394299290508799D-05, 3.62757512005344297D-05, &
2848 : : & 2.69939714979224901D-05, 1.93210938247939253D-05, &
2849 : : & 1.30056674793963203D-05, 7.82620866744496661D-06, &
2850 : : & 3.59257485819351583D-06, 1.44040049814251817D-07, &
2851 : : & -2.65396769697939116D-06, -4.91346867098485910D-06, &
2852 : : & -6.72739296091248287D-06, -8.17269379678657923D-06, &
2853 : : & -9.31304715093561232D-06, -1.02011418798016441D-05, &
2854 : : -1.08805962510592880D-05, -1.13875481509603555D-05/
2855 : : DATA ALFA(89), ALFA(90), ALFA(91), ALFA(92), ALFA(93), ALFA(94), &
2856 : : & ALFA(95), ALFA(96), ALFA(97), ALFA(98), ALFA(99), ALFA(100), &
2857 : : & ALFA(101), ALFA(102), ALFA(103), ALFA(104), ALFA(105), &
2858 : : & ALFA(106), ALFA(107), ALFA(108), ALFA(109), ALFA(110)/ &
2859 : : & -1.17519675674556414D-05, -1.19987364870944141D-05, &
2860 : : & 3.78194199201772914D-04, 2.02471952761816167D-04, &
2861 : : & -6.37938506318862408D-05, -2.38598230603005903D-04, &
2862 : : & -3.10916256027361568D-04, -3.13680115247576316D-04, &
2863 : : & -2.78950273791323387D-04, -2.28564082619141374D-04, &
2864 : : & -1.75245280340846749D-04, -1.25544063060690348D-04, &
2865 : : & -8.22982872820208365D-05, -4.62860730588116458D-05, &
2866 : : & -1.72334302366962267D-05, 5.60690482304602267D-06, &
2867 : : & 2.31395443148286800D-05, 3.62642745856793957D-05, &
2868 : : & 4.58006124490188752D-05, 5.24595294959114050D-05, &
2869 : : & 5.68396208545815266D-05, 5.94349820393104052D-05/
2870 : : DATA ALFA(111), ALFA(112), ALFA(113), ALFA(114), ALFA(115), &
2871 : : & ALFA(116), ALFA(117), ALFA(118), ALFA(119), ALFA(120), &
2872 : : & ALFA(121), ALFA(122), ALFA(123), ALFA(124), ALFA(125), &
2873 : : & ALFA(126), ALFA(127), ALFA(128), ALFA(129), ALFA(130)/ &
2874 : : & 6.06478527578421742D-05, 6.08023907788436497D-05, &
2875 : : & 6.01577894539460388D-05, 5.89199657344698500D-05, &
2876 : : & 5.72515823777593053D-05, 5.52804375585852577D-05, &
2877 : : & 5.31063773802880170D-05, 5.08069302012325706D-05, &
2878 : : & 4.84418647620094842D-05, 4.60568581607475370D-05, &
2879 : : & -6.91141397288294174D-04, -4.29976633058871912D-04, &
2880 : : & 1.83067735980039018D-04, 6.60088147542014144D-04, &
2881 : : & 8.75964969951185931D-04, 8.77335235958235514D-04, &
2882 : : & 7.49369585378990637D-04, 5.63832329756980918D-04, &
2883 : : & 3.68059319971443156D-04, 1.88464535514455599D-04/
2884 : : DATA ALFA(131), ALFA(132), ALFA(133), ALFA(134), ALFA(135), &
2885 : : & ALFA(136), ALFA(137), ALFA(138), ALFA(139), ALFA(140), &
2886 : : & ALFA(141), ALFA(142), ALFA(143), ALFA(144), ALFA(145), &
2887 : : & ALFA(146), ALFA(147), ALFA(148), ALFA(149), ALFA(150)/ &
2888 : : & 3.70663057664904149D-05, -8.28520220232137023D-05, &
2889 : : & -1.72751952869172998D-04, -2.36314873605872983D-04, &
2890 : : & -2.77966150694906658D-04, -3.02079514155456919D-04, &
2891 : : & -3.12594712643820127D-04, -3.12872558758067163D-04, &
2892 : : & -3.05678038466324377D-04, -2.93226470614557331D-04, &
2893 : : & -2.77255655582934777D-04, -2.59103928467031709D-04, &
2894 : : & -2.39784014396480342D-04, -2.20048260045422848D-04, &
2895 : : & -2.00443911094971498D-04, -1.81358692210970687D-04, &
2896 : : & -1.63057674478657464D-04, -1.45712672175205844D-04, &
2897 : : & -1.29425421983924587D-04, -1.14245691942445952D-04/
2898 : : DATA ALFA(151), ALFA(152), ALFA(153), ALFA(154), ALFA(155), &
2899 : : & ALFA(156), ALFA(157), ALFA(158), ALFA(159), ALFA(160), &
2900 : : & ALFA(161), ALFA(162), ALFA(163), ALFA(164), ALFA(165), &
2901 : : & ALFA(166), ALFA(167), ALFA(168), ALFA(169), ALFA(170)/ &
2902 : : & 1.92821964248775885D-03, 1.35592576302022234D-03, &
2903 : : & -7.17858090421302995D-04, -2.58084802575270346D-03, &
2904 : : & -3.49271130826168475D-03, -3.46986299340960628D-03, &
2905 : : & -2.82285233351310182D-03, -1.88103076404891354D-03, &
2906 : : & -8.89531718383947600D-04, 3.87912102631035228D-06, &
2907 : : & 7.28688540119691412D-04, 1.26566373053457758D-03, &
2908 : : & 1.62518158372674427D-03, 1.83203153216373172D-03, &
2909 : : & 1.91588388990527909D-03, 1.90588846755546138D-03, &
2910 : : & 1.82798982421825727D-03, 1.70389506421121530D-03, &
2911 : : & 1.55097127171097686D-03, 1.38261421852276159D-03/
2912 : : DATA ALFA(171), ALFA(172), ALFA(173), ALFA(174), ALFA(175), &
2913 : : & ALFA(176), ALFA(177), ALFA(178), ALFA(179), ALFA(180)/ &
2914 : : & 1.20881424230064774D-03, 1.03676532638344962D-03, &
2915 : : & 8.71437918068619115D-04, 7.16080155297701002D-04, &
2916 : : & 5.72637002558129372D-04, 4.42089819465802277D-04, &
2917 : : & 3.24724948503090564D-04, 2.20342042730246599D-04, &
2918 : : & 1.28412898401353882D-04, 4.82005924552095464D-05/
2919 : : DATA BETA(1), BETA(2), BETA(3), BETA(4), BETA(5), BETA(6), &
2920 : : & BETA(7), BETA(8), BETA(9), BETA(10), BETA(11), BETA(12), &
2921 : : & BETA(13), BETA(14), BETA(15), BETA(16), BETA(17), BETA(18), &
2922 : : & BETA(19), BETA(20), BETA(21), BETA(22)/ &
2923 : : & 1.79988721413553309D-02, 5.59964911064388073D-03, &
2924 : : & 2.88501402231132779D-03, 1.80096606761053941D-03, &
2925 : : & 1.24753110589199202D-03, 9.22878876572938311D-04, &
2926 : : & 7.14430421727287357D-04, 5.71787281789704872D-04, &
2927 : : & 4.69431007606481533D-04, 3.93232835462916638D-04, &
2928 : : & 3.34818889318297664D-04, 2.88952148495751517D-04, &
2929 : : & 2.52211615549573284D-04, 2.22280580798883327D-04, &
2930 : : & 1.97541838033062524D-04, 1.76836855019718004D-04, &
2931 : : & 1.59316899661821081D-04, 1.44347930197333986D-04, &
2932 : : & 1.31448068119965379D-04, 1.20245444949302884D-04, &
2933 : : & 1.10449144504599392D-04, 1.01828770740567258D-04/
2934 : : DATA BETA(23), BETA(24), BETA(25), BETA(26), BETA(27), BETA(28), &
2935 : : & BETA(29), BETA(30), BETA(31), BETA(32), BETA(33), BETA(34), &
2936 : : & BETA(35), BETA(36), BETA(37), BETA(38), BETA(39), BETA(40), &
2937 : : & BETA(41), BETA(42), BETA(43), BETA(44)/ &
2938 : : & 9.41998224204237509D-05, 8.74130545753834437D-05, &
2939 : : & 8.13466262162801467D-05, 7.59002269646219339D-05, &
2940 : : & 7.09906300634153481D-05, 6.65482874842468183D-05, &
2941 : : & 6.25146958969275078D-05, 5.88403394426251749D-05, &
2942 : : & -1.49282953213429172D-03, -8.78204709546389328D-04, &
2943 : : & -5.02916549572034614D-04, -2.94822138512746025D-04, &
2944 : : & -1.75463996970782828D-04, -1.04008550460816434D-04, &
2945 : : & -5.96141953046457895D-05, -3.12038929076098340D-05, &
2946 : : & -1.26089735980230047D-05, -2.42892608575730389D-07, &
2947 : : & 8.05996165414273571D-06, 1.36507009262147391D-05, &
2948 : : & 1.73964125472926261D-05, 1.98672978842133780D-05/
2949 : : DATA BETA(45), BETA(46), BETA(47), BETA(48), BETA(49), BETA(50), &
2950 : : & BETA(51), BETA(52), BETA(53), BETA(54), BETA(55), BETA(56), &
2951 : : & BETA(57), BETA(58), BETA(59), BETA(60), BETA(61), BETA(62), &
2952 : : & BETA(63), BETA(64), BETA(65), BETA(66)/ &
2953 : : & 2.14463263790822639D-05, 2.23954659232456514D-05, &
2954 : : & 2.28967783814712629D-05, 2.30785389811177817D-05, &
2955 : : & 2.30321976080909144D-05, 2.28236073720348722D-05, &
2956 : : & 2.25005881105292418D-05, 2.20981015361991429D-05, &
2957 : : & 2.16418427448103905D-05, 2.11507649256220843D-05, &
2958 : : & 2.06388749782170737D-05, 2.01165241997081666D-05, &
2959 : : & 1.95913450141179244D-05, 1.90689367910436740D-05, &
2960 : : & 1.85533719641636667D-05, 1.80475722259674218D-05, &
2961 : : & 5.52213076721292790D-04, 4.47932581552384646D-04, &
2962 : : & 2.79520653992020589D-04, 1.52468156198446602D-04, &
2963 : : & 6.93271105657043598D-05, 1.76258683069991397D-05/
2964 : : DATA BETA(67), BETA(68), BETA(69), BETA(70), BETA(71), BETA(72), &
2965 : : & BETA(73), BETA(74), BETA(75), BETA(76), BETA(77), BETA(78), &
2966 : : & BETA(79), BETA(80), BETA(81), BETA(82), BETA(83), BETA(84), &
2967 : : & BETA(85), BETA(86), BETA(87), BETA(88)/ &
2968 : : & -1.35744996343269136D-05, -3.17972413350427135D-05, &
2969 : : & -4.18861861696693365D-05, -4.69004889379141029D-05, &
2970 : : & -4.87665447413787352D-05, -4.87010031186735069D-05, &
2971 : : & -4.74755620890086638D-05, -4.55813058138628452D-05, &
2972 : : & -4.33309644511266036D-05, -4.09230193157750364D-05, &
2973 : : & -3.84822638603221274D-05, -3.60857167535410501D-05, &
2974 : : & -3.37793306123367417D-05, -3.15888560772109621D-05, &
2975 : : & -2.95269561750807315D-05, -2.75978914828335759D-05, &
2976 : : & -2.58006174666883713D-05, -2.41308356761280200D-05, &
2977 : : & -2.25823509518346033D-05, -2.11479656768912971D-05, &
2978 : : & -1.98200638885294927D-05, -1.85909870801065077D-05/
2979 : : DATA BETA(89), BETA(90), BETA(91), BETA(92), BETA(93), BETA(94), &
2980 : : & BETA(95), BETA(96), BETA(97), BETA(98), BETA(99), BETA(100), &
2981 : : & BETA(101), BETA(102), BETA(103), BETA(104), BETA(105), &
2982 : : & BETA(106), BETA(107), BETA(108), BETA(109), BETA(110)/&
2983 : : & -1.74532699844210224D-05, -1.63997823854497997D-05, &
2984 : : & -4.74617796559959808D-04, -4.77864567147321487D-04, &
2985 : : & -3.20390228067037603D-04, -1.61105016119962282D-04, &
2986 : : & -4.25778101285435204D-05, 3.44571294294967503D-05, &
2987 : : & 7.97092684075674924D-05, 1.03138236708272200D-04, &
2988 : : & 1.12466775262204158D-04, 1.13103642108481389D-04, &
2989 : : & 1.08651634848774268D-04, 1.01437951597661973D-04, &
2990 : : & 9.29298396593363896D-05, 8.40293133016089978D-05, &
2991 : : & 7.52727991349134062D-05, 6.69632521975730872D-05, &
2992 : : & 5.92564547323194704D-05, 5.22169308826975567D-05, &
2993 : : & 4.58539485165360646D-05, 4.01445513891486808D-05/
2994 : : DATA BETA(111), BETA(112), BETA(113), BETA(114), BETA(115), &
2995 : : & BETA(116), BETA(117), BETA(118), BETA(119), BETA(120), &
2996 : : & BETA(121), BETA(122), BETA(123), BETA(124), BETA(125), &
2997 : : & BETA(126), BETA(127), BETA(128), BETA(129), BETA(130)/ &
2998 : : & 3.50481730031328081D-05, 3.05157995034346659D-05, &
2999 : : & 2.64956119950516039D-05, 2.29363633690998152D-05, &
3000 : : & 1.97893056664021636D-05, 1.70091984636412623D-05, &
3001 : : & 1.45547428261524004D-05, 1.23886640995878413D-05, &
3002 : : & 1.04775876076583236D-05, 8.79179954978479373D-06, &
3003 : : & 7.36465810572578444D-04, 8.72790805146193976D-04, &
3004 : : & 6.22614862573135066D-04, 2.85998154194304147D-04, &
3005 : : & 3.84737672879366102D-06, -1.87906003636971558D-04, &
3006 : : & -2.97603646594554535D-04, -3.45998126832656348D-04, &
3007 : : & -3.53382470916037712D-04, -3.35715635775048757D-04/
3008 : : DATA BETA(131), BETA(132), BETA(133), BETA(134), BETA(135), &
3009 : : & BETA(136), BETA(137), BETA(138), BETA(139), BETA(140), &
3010 : : & BETA(141), BETA(142), BETA(143), BETA(144), BETA(145), &
3011 : : & BETA(146), BETA(147), BETA(148), BETA(149), BETA(150)/ &
3012 : : & -3.04321124789039809D-04, -2.66722723047612821D-04, &
3013 : : & -2.27654214122819527D-04, -1.89922611854562356D-04, &
3014 : : & -1.55058918599093870D-04, -1.23778240761873630D-04, &
3015 : : & -9.62926147717644187D-05, -7.25178327714425337D-05, &
3016 : : & -5.22070028895633801D-05, -3.50347750511900522D-05, &
3017 : : & -2.06489761035551757D-05, -8.70106096849767054D-06, &
3018 : : & 1.13698686675100290D-06, 9.16426474122778849D-06, &
3019 : : & 1.56477785428872620D-05, 2.08223629482466847D-05, &
3020 : : & 2.48923381004595156D-05, 2.80340509574146325D-05, &
3021 : : & 3.03987774629861915D-05, 3.21156731406700616D-05/
3022 : : DATA BETA(151), BETA(152), BETA(153), BETA(154), BETA(155), &
3023 : : & BETA(156), BETA(157), BETA(158), BETA(159), BETA(160), &
3024 : : & BETA(161), BETA(162), BETA(163), BETA(164), BETA(165), &
3025 : : & BETA(166), BETA(167), BETA(168), BETA(169), BETA(170)/ &
3026 : : & -1.80182191963885708D-03, -2.43402962938042533D-03, &
3027 : : & -1.83422663549856802D-03, -7.62204596354009765D-04, &
3028 : : & 2.39079475256927218D-04, 9.49266117176881141D-04, &
3029 : : & 1.34467449701540359D-03, 1.48457495259449178D-03, &
3030 : : & 1.44732339830617591D-03, 1.30268261285657186D-03, &
3031 : : & 1.10351597375642682D-03, 8.86047440419791759D-04, &
3032 : : & 6.73073208165665473D-04, 4.77603872856582378D-04, &
3033 : : & 3.05991926358789362D-04, 1.60315694594721630D-04, &
3034 : : & 4.00749555270613286D-05, -5.66607461635251611D-05, &
3035 : : & -1.32506186772982638D-04, -1.90296187989614057D-04/
3036 : : DATA BETA(171), BETA(172), BETA(173), BETA(174), BETA(175), &
3037 : : & BETA(176), BETA(177), BETA(178), BETA(179), BETA(180), &
3038 : : & BETA(181), BETA(182), BETA(183), BETA(184), BETA(185), &
3039 : : & BETA(186), BETA(187), BETA(188), BETA(189), BETA(190)/ &
3040 : : & -2.32811450376937408D-04, -2.62628811464668841D-04, &
3041 : : & -2.82050469867598672D-04, -2.93081563192861167D-04, &
3042 : : & -2.97435962176316616D-04, -2.96557334239348078D-04, &
3043 : : & -2.91647363312090861D-04, -2.83696203837734166D-04, &
3044 : : & -2.73512317095673346D-04, -2.61750155806768580D-04, &
3045 : : & 6.38585891212050914D-03, 9.62374215806377941D-03, &
3046 : : & 7.61878061207001043D-03, 2.83219055545628054D-03, &
3047 : : & -2.09841352012720090D-03, -5.73826764216626498D-03, &
3048 : : & -7.70804244495414620D-03, -8.21011692264844401D-03, &
3049 : : & -7.65824520346905413D-03, -6.47209729391045177D-03/
3050 : : DATA BETA(191), BETA(192), BETA(193), BETA(194), BETA(195), &
3051 : : & BETA(196), BETA(197), BETA(198), BETA(199), BETA(200), &
3052 : : & BETA(201), BETA(202), BETA(203), BETA(204), BETA(205), &
3053 : : & BETA(206), BETA(207), BETA(208), BETA(209), BETA(210)/ &
3054 : : & -4.99132412004966473D-03, -3.45612289713133280D-03, &
3055 : : & -2.01785580014170775D-03, -7.59430686781961401D-04, &
3056 : : & 2.84173631523859138D-04, 1.10891667586337403D-03, &
3057 : : & 1.72901493872728771D-03, 2.16812590802684701D-03, &
3058 : : & 2.45357710494539735D-03, 2.61281821058334862D-03, &
3059 : : & 2.67141039656276912D-03, 2.65203073395980430D-03, &
3060 : : & 2.57411652877287315D-03, 2.45389126236094427D-03, &
3061 : : & 2.30460058071795494D-03, 2.13684837686712662D-03, &
3062 : : & 1.95896528478870911D-03, 1.77737008679454412D-03, &
3063 : : & 1.59690280765839059D-03, 1.42111975664438546D-03/
3064 : : DATA GAMA(1), GAMA(2), GAMA(3), GAMA(4), GAMA(5), GAMA(6), &
3065 : : & GAMA(7), GAMA(8), GAMA(9), GAMA(10), GAMA(11), GAMA(12), &
3066 : : & GAMA(13), GAMA(14), GAMA(15), GAMA(16), GAMA(17), GAMA(18), &
3067 : : & GAMA(19), GAMA(20), GAMA(21), GAMA(22)/ &
3068 : : & 6.29960524947436582D-01, 2.51984209978974633D-01, &
3069 : : & 1.54790300415655846D-01, 1.10713062416159013D-01, &
3070 : : & 8.57309395527394825D-02, 6.97161316958684292D-02, &
3071 : : & 5.86085671893713576D-02, 5.04698873536310685D-02, &
3072 : : & 4.42600580689154809D-02, 3.93720661543509966D-02, &
3073 : : & 3.54283195924455368D-02, 3.21818857502098231D-02, &
3074 : : & 2.94646240791157679D-02, 2.71581677112934479D-02, &
3075 : : & 2.51768272973861779D-02, 2.34570755306078891D-02, &
3076 : : & 2.19508390134907203D-02, 2.06210828235646240D-02, &
3077 : : & 1.94388240897880846D-02, 1.83810633800683158D-02, &
3078 : : & 1.74293213231963172D-02, 1.65685837786612353D-02/
3079 : : DATA GAMA(23), GAMA(24), GAMA(25), GAMA(26), GAMA(27), GAMA(28), &
3080 : : & GAMA(29), GAMA(30)/ &
3081 : : & 1.57865285987918445D-02, 1.50729501494095594D-02, &
3082 : : & 1.44193250839954639D-02, 1.38184805735341786D-02, &
3083 : : & 1.32643378994276568D-02, 1.27517121970498651D-02, &
3084 : : & 1.22761545318762767D-02, 1.18338262398482403D-02/
3085 : : DATA EX1, EX2, HPI, GPI, THPI / &
3086 : : & 3.33333333333333333D-01, 6.66666666666666667D-01, &
3087 : : & 1.57079632679489662D+00, 3.14159265358979324D+00, &
3088 : : & 4.71238898038468986D+00/
3089 : : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
3090 : : !C
3091 : 0 : RFNU = 1.0D0/FNU
3092 : : !C-----------------------------------------------------------------------
3093 : : !C OVERFLOW TEST (Z/FNU TOO SMALL)
3094 : : !C-----------------------------------------------------------------------
3095 : 0 : TEST = D1MACH(1)*1.0D+3
3096 : 0 : AC = FNU*TEST
3097 [ # # # # ]: 0 : IF (DABS(ZR).GT.AC .OR. DABS(ZI).GT.AC) GO TO 15
3098 : 0 : ZETA1R = 2.0D0*DABS(DLOG(TEST))+FNU
3099 : 0 : ZETA1I = 0.0D0
3100 : 0 : ZETA2R = FNU
3101 : 0 : ZETA2I = 0.0D0
3102 : 0 : PHIR = 1.0D0
3103 : 0 : PHII = 0.0D0
3104 : 0 : ARGR = 1.0D0
3105 : 0 : ARGI = 0.0D0
3106 : 0 : RETURN
3107 : : 15 CONTINUE
3108 : 0 : ZBR = ZR*RFNU
3109 : 0 : ZBI = ZI*RFNU
3110 : 0 : RFNU2 = RFNU*RFNU
3111 : : !C-----------------------------------------------------------------------
3112 : : !C COMPUTE IN THE FOURTH QUADRANT
3113 : : !C-----------------------------------------------------------------------
3114 : 0 : FN13 = FNU**EX1
3115 : 0 : FN23 = FN13*FN13
3116 : 0 : RFN13 = 1.0D0/FN13
3117 : 0 : W2R = CONER - ZBR*ZBR + ZBI*ZBI
3118 : 0 : W2I = CONEI - ZBR*ZBI - ZBR*ZBI
3119 : 0 : AW2 = AZABS(W2R,W2I)
3120 [ # # ]: 0 : IF (AW2.GT.0.25D0) GO TO 130
3121 : : !C-----------------------------------------------------------------------
3122 : : !C POWER SERIES FOR CABS(W2).LE.0.25D0
3123 : : !C-----------------------------------------------------------------------
3124 : 0 : K = 1
3125 : 0 : PR(1) = CONER
3126 : 0 : PI(1) = CONEI
3127 : 0 : SUMAR = GAMA(1)
3128 : 0 : SUMAI = ZEROI
3129 : 0 : AP(1) = 1.0D0
3130 [ # # ]: 0 : IF (AW2.LT.TOL) GO TO 20
3131 [ # # ]: 0 : DO 10 K=2,30
3132 : 0 : PR(K) = PR(K-1)*W2R - PI(K-1)*W2I
3133 : 0 : PI(K) = PR(K-1)*W2I + PI(K-1)*W2R
3134 : 0 : SUMAR = SUMAR + PR(K)*GAMA(K)
3135 : 0 : SUMAI = SUMAI + PI(K)*GAMA(K)
3136 : 0 : AP(K) = AP(K-1)*AW2
3137 [ # # ]: 0 : IF (AP(K).LT.TOL) GO TO 20
3138 : 0 : 10 CONTINUE
3139 : 0 : K = 30
3140 : : 20 CONTINUE
3141 : 0 : KMAX = K
3142 : 0 : ZETAR = W2R*SUMAR - W2I*SUMAI
3143 : 0 : ZETAI = W2R*SUMAI + W2I*SUMAR
3144 : 0 : ARGR = ZETAR*FN23
3145 : 0 : ARGI = ZETAI*FN23
3146 : 0 : CALL AZSQRT(SUMAR, SUMAI, ZAR, ZAI)
3147 : 0 : CALL AZSQRT(W2R, W2I, STR, STI)
3148 : 0 : ZETA2R = STR*FNU
3149 : 0 : ZETA2I = STI*FNU
3150 : 0 : STR = CONER + EX2*(ZETAR*ZAR-ZETAI*ZAI)
3151 : 0 : STI = CONEI + EX2*(ZETAR*ZAI+ZETAI*ZAR)
3152 : 0 : ZETA1R = STR*ZETA2R - STI*ZETA2I
3153 : 0 : ZETA1I = STR*ZETA2I + STI*ZETA2R
3154 : 0 : ZAR = ZAR + ZAR
3155 : 0 : ZAI = ZAI + ZAI
3156 : 0 : CALL AZSQRT(ZAR, ZAI, STR, STI)
3157 : 0 : PHIR = STR*RFN13
3158 : 0 : PHII = STI*RFN13
3159 [ # # ]: 0 : IF (IPMTR.EQ.1) GO TO 120
3160 : : !C-----------------------------------------------------------------------
3161 : : !C SUM SERIES FOR ASUM AND BSUM
3162 : : !C-----------------------------------------------------------------------
3163 : 0 : SUMBR = ZEROR
3164 : 0 : SUMBI = ZEROI
3165 [ # # ]: 0 : DO 30 K=1,KMAX
3166 : 0 : SUMBR = SUMBR + PR(K)*BETA(K)
3167 : 0 : SUMBI = SUMBI + PI(K)*BETA(K)
3168 : 0 : 30 CONTINUE
3169 : 0 : ASUMR = ZEROR
3170 : 0 : ASUMI = ZEROI
3171 : 0 : BSUMR = SUMBR
3172 : 0 : BSUMI = SUMBI
3173 : 0 : L1 = 0
3174 : 0 : L2 = 30
3175 : 0 : BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
3176 : 0 : ATOL = TOL
3177 : 0 : PP = 1.0D0
3178 : 0 : IAS = 0
3179 : 0 : IBS = 0
3180 [ # # ]: 0 : IF (RFNU2.LT.TOL) GO TO 110
3181 [ # # ]: 0 : DO 100 IS=2,7
3182 : 0 : ATOL = ATOL/RFNU2
3183 : 0 : PP = PP*RFNU2
3184 [ # # ]: 0 : IF (IAS.EQ.1) GO TO 60
3185 : 0 : SUMAR = ZEROR
3186 : 0 : SUMAI = ZEROI
3187 [ # # ]: 0 : DO 40 K=1,KMAX
3188 : 0 : M = L1 + K
3189 : 0 : SUMAR = SUMAR + PR(K)*ALFA(M)
3190 : 0 : SUMAI = SUMAI + PI(K)*ALFA(M)
3191 [ # # ]: 0 : IF (AP(K).LT.ATOL) GO TO 50
3192 : 0 : 40 CONTINUE
3193 : : 50 CONTINUE
3194 : 0 : ASUMR = ASUMR + SUMAR*PP
3195 : 0 : ASUMI = ASUMI + SUMAI*PP
3196 [ # # ]: 0 : IF (PP.LT.TOL) IAS = 1
3197 : : 60 CONTINUE
3198 [ # # ]: 0 : IF (IBS.EQ.1) GO TO 90
3199 : : SUMBR = ZEROR
3200 : : SUMBI = ZEROI
3201 [ # # ]: 0 : DO 70 K=1,KMAX
3202 : 0 : M = L2 + K
3203 : 0 : SUMBR = SUMBR + PR(K)*BETA(M)
3204 : 0 : SUMBI = SUMBI + PI(K)*BETA(M)
3205 [ # # ]: 0 : IF (AP(K).LT.ATOL) GO TO 80
3206 : 0 : 70 CONTINUE
3207 : : 80 CONTINUE
3208 : 0 : BSUMR = BSUMR + SUMBR*PP
3209 : 0 : BSUMI = BSUMI + SUMBI*PP
3210 [ # # ]: 0 : IF (PP.LT.BTOL) IBS = 1
3211 : : 90 CONTINUE
3212 [ # # ]: 0 : IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 110
3213 : 0 : L1 = L1 + 30
3214 : 0 : L2 = L2 + 30
3215 : 0 : 100 CONTINUE
3216 : : 110 CONTINUE
3217 : 0 : ASUMR = ASUMR + CONER
3218 : 0 : PP = RFNU*RFN13
3219 : 0 : BSUMR = BSUMR*PP
3220 : 0 : BSUMI = BSUMI*PP
3221 : : 120 CONTINUE
3222 : 0 : RETURN
3223 : : !C-----------------------------------------------------------------------
3224 : : !C CABS(W2).GT.0.25D0
3225 : : !C-----------------------------------------------------------------------
3226 : : 130 CONTINUE
3227 : 0 : CALL AZSQRT(W2R, W2I, WR, WI)
3228 [ # # ]: 0 : IF (WR.LT.0.0D0) WR = 0.0D0
3229 [ # # ]: 0 : IF (WI.LT.0.0D0) WI = 0.0D0
3230 : 0 : STR = CONER + WR
3231 : 0 : STI = WI
3232 : 0 : CALL ZDIV(STR, STI, ZBR, ZBI, ZAR, ZAI)
3233 : 0 : CALL AZLOG(ZAR, ZAI, ZCR, ZCI, IDUM)
3234 [ # # ]: 0 : IF (ZCI.LT.0.0D0) ZCI = 0.0D0
3235 [ # # ]: 0 : IF (ZCI.GT.HPI) ZCI = HPI
3236 [ # # ]: 0 : IF (ZCR.LT.0.0D0) ZCR = 0.0D0
3237 : 0 : ZTHR = (ZCR-WR)*1.5D0
3238 : 0 : ZTHI = (ZCI-WI)*1.5D0
3239 : 0 : ZETA1R = ZCR*FNU
3240 : 0 : ZETA1I = ZCI*FNU
3241 : 0 : ZETA2R = WR*FNU
3242 : 0 : ZETA2I = WI*FNU
3243 : 0 : AZTH = AZABS(ZTHR,ZTHI)
3244 : 0 : ANG = THPI
3245 [ # # # # ]: 0 : IF (ZTHR.GE.0.0D0 .AND. ZTHI.LT.0.0D0) GO TO 140
3246 : 0 : ANG = HPI
3247 [ # # ]: 0 : IF (ZTHR.EQ.0.0D0) GO TO 140
3248 : 0 : ANG = DATAN(ZTHI/ZTHR)
3249 [ # # ]: 0 : IF (ZTHR.LT.0.0D0) ANG = ANG + GPI
3250 : : 140 CONTINUE
3251 : 0 : PP = AZTH**EX2
3252 : 0 : ANG = ANG*EX2
3253 : 0 : ZETAR = PP*DCOS(ANG)
3254 : 0 : ZETAI = PP*DSIN(ANG)
3255 [ # # ]: 0 : IF (ZETAI.LT.0.0D0) ZETAI = 0.0D0
3256 : 0 : ARGR = ZETAR*FN23
3257 : 0 : ARGI = ZETAI*FN23
3258 : 0 : CALL ZDIV(ZTHR, ZTHI, ZETAR, ZETAI, RTZTR, RTZTI)
3259 : 0 : CALL ZDIV(RTZTR, RTZTI, WR, WI, ZAR, ZAI)
3260 : 0 : TZAR = ZAR + ZAR
3261 : 0 : TZAI = ZAI + ZAI
3262 : 0 : CALL AZSQRT(TZAR, TZAI, STR, STI)
3263 : 0 : PHIR = STR*RFN13
3264 : 0 : PHII = STI*RFN13
3265 [ # # ]: 0 : IF (IPMTR.EQ.1) GO TO 120
3266 : 0 : RAW = 1.0D0/DSQRT(AW2)
3267 : 0 : STR = WR*RAW
3268 : 0 : STI = -WI*RAW
3269 : 0 : TFNR = STR*RFNU*RAW
3270 : 0 : TFNI = STI*RFNU*RAW
3271 : 0 : RAZTH = 1.0D0/AZTH
3272 : 0 : STR = ZTHR*RAZTH
3273 : 0 : STI = -ZTHI*RAZTH
3274 : 0 : RZTHR = STR*RAZTH*RFNU
3275 : 0 : RZTHI = STI*RAZTH*RFNU
3276 : 0 : ZCR = RZTHR*AR(2)
3277 : 0 : ZCI = RZTHI*AR(2)
3278 : 0 : RAW2 = 1.0D0/AW2
3279 : 0 : STR = W2R*RAW2
3280 : 0 : STI = -W2I*RAW2
3281 : 0 : T2R = STR*RAW2
3282 : 0 : T2I = STI*RAW2
3283 : 0 : STR = T2R*C(2) + C(3)
3284 : 0 : STI = T2I*C(2)
3285 : 0 : UPR(2) = STR*TFNR - STI*TFNI
3286 : 0 : UPI(2) = STR*TFNI + STI*TFNR
3287 : 0 : BSUMR = UPR(2) + ZCR
3288 : 0 : BSUMI = UPI(2) + ZCI
3289 : 0 : ASUMR = ZEROR
3290 : 0 : ASUMI = ZEROI
3291 [ # # ]: 0 : IF (RFNU.LT.TOL) GO TO 220
3292 : 0 : PRZTHR = RZTHR
3293 : 0 : PRZTHI = RZTHI
3294 : 0 : PTFNR = TFNR
3295 : 0 : PTFNI = TFNI
3296 : 0 : UPR(1) = CONER
3297 : 0 : UPI(1) = CONEI
3298 : 0 : PP = 1.0D0
3299 : 0 : BTOL = TOL*(DABS(BSUMR)+DABS(BSUMI))
3300 : 0 : KS = 0
3301 : 0 : KP1 = 2
3302 : 0 : L = 3
3303 : 0 : IAS = 0
3304 : 0 : IBS = 0
3305 [ # # ]: 0 : DO 210 LR=2,12,2
3306 : 0 : LRP1 = LR + 1
3307 : : !C-----------------------------------------------------------------------
3308 : : !C COMPUTE TWO ADDITIONAL CR, DR, AND UP FOR TWO MORE TERMS IN
3309 : : !C NEXT SUMA AND SUMB
3310 : : !C-----------------------------------------------------------------------
3311 [ # # ]: 0 : DO 160 K=LR,LRP1
3312 : 0 : KS = KS + 1
3313 : 0 : KP1 = KP1 + 1
3314 : 0 : L = L + 1
3315 : 0 : ZAR = C(L)
3316 : 0 : ZAI = ZEROI
3317 [ # # ]: 0 : DO 150 J=2,KP1
3318 : 0 : L = L + 1
3319 : 0 : STR = ZAR*T2R - T2I*ZAI + C(L)
3320 : 0 : ZAI = ZAR*T2I + ZAI*T2R
3321 : 0 : ZAR = STR
3322 : 0 : 150 CONTINUE
3323 : 0 : STR = PTFNR*TFNR - PTFNI*TFNI
3324 : 0 : PTFNI = PTFNR*TFNI + PTFNI*TFNR
3325 : 0 : PTFNR = STR
3326 : 0 : UPR(KP1) = PTFNR*ZAR - PTFNI*ZAI
3327 : 0 : UPI(KP1) = PTFNI*ZAR + PTFNR*ZAI
3328 : 0 : CRR(KS) = PRZTHR*BR(KS+1)
3329 : 0 : CRI(KS) = PRZTHI*BR(KS+1)
3330 : 0 : STR = PRZTHR*RZTHR - PRZTHI*RZTHI
3331 : 0 : PRZTHI = PRZTHR*RZTHI + PRZTHI*RZTHR
3332 : 0 : PRZTHR = STR
3333 : 0 : DRR(KS) = PRZTHR*AR(KS+2)
3334 : 0 : DRI(KS) = PRZTHI*AR(KS+2)
3335 : 0 : 160 CONTINUE
3336 : 0 : PP = PP*RFNU2
3337 [ # # ]: 0 : IF (IAS.EQ.1) GO TO 180
3338 : 0 : SUMAR = UPR(LRP1)
3339 : 0 : SUMAI = UPI(LRP1)
3340 : 0 : JU = LRP1
3341 [ # # ]: 0 : DO 170 JR=1,LR
3342 : 0 : JU = JU - 1
3343 : 0 : SUMAR = SUMAR + CRR(JR)*UPR(JU) - CRI(JR)*UPI(JU)
3344 : 0 : SUMAI = SUMAI + CRR(JR)*UPI(JU) + CRI(JR)*UPR(JU)
3345 : 0 : 170 CONTINUE
3346 : 0 : ASUMR = ASUMR + SUMAR
3347 : 0 : ASUMI = ASUMI + SUMAI
3348 : 0 : TEST = DABS(SUMAR) + DABS(SUMAI)
3349 [ # # # # ]: 0 : IF (PP.LT.TOL .AND. TEST.LT.TOL) IAS = 1
3350 : : 180 CONTINUE
3351 [ # # ]: 0 : IF (IBS.EQ.1) GO TO 200
3352 : 0 : SUMBR = UPR(LR+2) + UPR(LRP1)*ZCR - UPI(LRP1)*ZCI
3353 : 0 : SUMBI = UPI(LR+2) + UPR(LRP1)*ZCI + UPI(LRP1)*ZCR
3354 : 0 : JU = LRP1
3355 [ # # ]: 0 : DO 190 JR=1,LR
3356 : 0 : JU = JU - 1
3357 : 0 : SUMBR = SUMBR + DRR(JR)*UPR(JU) - DRI(JR)*UPI(JU)
3358 : 0 : SUMBI = SUMBI + DRR(JR)*UPI(JU) + DRI(JR)*UPR(JU)
3359 : 0 : 190 CONTINUE
3360 : 0 : BSUMR = BSUMR + SUMBR
3361 : 0 : BSUMI = BSUMI + SUMBI
3362 : 0 : TEST = DABS(SUMBR) + DABS(SUMBI)
3363 [ # # # # ]: 0 : IF (PP.LT.BTOL .AND. TEST.LT.BTOL) IBS = 1
3364 : : 200 CONTINUE
3365 [ # # ]: 0 : IF (IAS.EQ.1 .AND. IBS.EQ.1) GO TO 220
3366 : 0 : 210 CONTINUE
3367 : : 220 CONTINUE
3368 : 0 : ASUMR = ASUMR + CONER
3369 : 0 : STR = -BSUMR*RFN13
3370 : 0 : STI = -BSUMI*RFN13
3371 : 0 : CALL ZDIV(STR, STI, RTZTR, RTZTI, BSUMR, BSUMI)
3372 : 0 : GO TO 120
3373 : : END SUBROUTINE ZUNHJ
3374 : :
3375 : 0 : SUBROUTINE ZMLRI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL)
3376 : : !C***BEGIN PROLOGUE ZMLRI
3377 : : !C***REFER TO ZBESI,ZBESK
3378 : : !C
3379 : : !C ZMLRI COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY THE
3380 : : !C MILLER ALGORITHM NORMALIZED BY A NEUMANN SERIES.
3381 : : !C
3382 : : !C***ROUTINES CALLED DGAMLN,D1MACH,AZABS,AZEXP,AZLOG,ZMLT
3383 : : !C***END PROLOGUE ZMLRI
3384 : : !C COMPLEX CK,CNORM,CONE,CTWO,CZERO,PT,P1,P2,RZ,SUM,Y,Z
3385 : : DOUBLE PRECISION ACK, AK, AP, AT, AZ, BK, CKI, CKR, CNORMI, &
3386 : : & CNORMR, CONEI, CONER, FKAP, FKK, FLAM, FNF, FNU, PTI, PTR, P1I, &
3387 : : & P1R, P2I, P2R, RAZ, RHO, RHO2, RZI, RZR, SCLE, STI, STR, SUMI, &
3388 : : & SUMR, TFNF, TOL, TST, YI, YR, ZEROI, ZEROR, ZI, ZR!, DGAMLN, &
3389 : : ! & D1MACH, AZABS
3390 : : INTEGER I, IAZ, IDUM, IFNU, INU, ITIME, K, KK, KM, KODE, M, N, NZ
3391 : : DIMENSION YR(N), YI(N)
3392 : : DATA ZEROR,ZEROI,CONER,CONEI / 0.0D0, 0.0D0, 1.0D0, 0.0D0 /
3393 : 0 : SCLE = D1MACH(1)/TOL
3394 : 0 : NZ=0
3395 : 0 : AZ = AZABS(ZR,ZI)
3396 : 0 : IAZ = INT(SNGL(AZ))
3397 : 0 : IFNU = INT(SNGL(FNU))
3398 : 0 : INU = IFNU + N - 1
3399 : 0 : AT = DBLE(FLOAT(IAZ)) + 1.0D0
3400 : 0 : RAZ = 1.0D0/AZ
3401 : 0 : STR = ZR*RAZ
3402 : 0 : STI = -ZI*RAZ
3403 : 0 : CKR = STR*AT*RAZ
3404 : 0 : CKI = STI*AT*RAZ
3405 : 0 : RZR = (STR+STR)*RAZ
3406 : 0 : RZI = (STI+STI)*RAZ
3407 : 0 : P1R = ZEROR
3408 : 0 : P1I = ZEROI
3409 : 0 : P2R = CONER
3410 : 0 : P2I = CONEI
3411 : 0 : ACK = (AT+1.0D0)*RAZ
3412 : 0 : RHO = ACK + DSQRT(ACK*ACK-1.0D0)
3413 : 0 : RHO2 = RHO*RHO
3414 : 0 : TST = (RHO2+RHO2)/((RHO2-1.0D0)*(RHO-1.0D0))
3415 : 0 : TST = TST/TOL
3416 : : !C-----------------------------------------------------------------------
3417 : : !C COMPUTE RELATIVE TRUNCATION ERROR INDEX FOR SERIES
3418 : : !C-----------------------------------------------------------------------
3419 : 0 : AK = AT
3420 [ # # ]: 0 : DO 10 I=1,80
3421 : 0 : PTR = P2R
3422 : 0 : PTI = P2I
3423 : 0 : P2R = P1R - (CKR*PTR-CKI*PTI)
3424 : 0 : P2I = P1I - (CKI*PTR+CKR*PTI)
3425 : 0 : P1R = PTR
3426 : 0 : P1I = PTI
3427 : 0 : CKR = CKR + RZR
3428 : 0 : CKI = CKI + RZI
3429 : 0 : AP = AZABS(P2R,P2I)
3430 [ # # ]: 0 : IF (AP.GT.TST*AK*AK) GO TO 20
3431 : 0 : AK = AK + 1.0D0
3432 : 0 : 10 CONTINUE
3433 : 0 : GO TO 110
3434 : : 20 CONTINUE
3435 : 0 : I = I + 1
3436 : 0 : K = 0
3437 [ # # ]: 0 : IF (INU.LT.IAZ) GO TO 40
3438 : : !C-----------------------------------------------------------------------
3439 : : !C COMPUTE RELATIVE TRUNCATION ERROR FOR RATIOS
3440 : : !C-----------------------------------------------------------------------
3441 : 0 : P1R = ZEROR
3442 : 0 : P1I = ZEROI
3443 : 0 : P2R = CONER
3444 : 0 : P2I = CONEI
3445 : 0 : AT = DBLE(FLOAT(INU)) + 1.0D0
3446 : : STR = ZR*RAZ
3447 : : STI = -ZI*RAZ
3448 : 0 : CKR = STR*AT*RAZ
3449 : 0 : CKI = STI*AT*RAZ
3450 : 0 : ACK = AT*RAZ
3451 : 0 : TST = DSQRT(ACK/TOL)
3452 : 0 : ITIME = 1
3453 [ # # ]: 0 : DO 30 K=1,80
3454 : 0 : PTR = P2R
3455 : 0 : PTI = P2I
3456 : 0 : P2R = P1R - (CKR*PTR-CKI*PTI)
3457 : 0 : P2I = P1I - (CKR*PTI+CKI*PTR)
3458 : 0 : P1R = PTR
3459 : 0 : P1I = PTI
3460 : 0 : CKR = CKR + RZR
3461 : 0 : CKI = CKI + RZI
3462 : 0 : AP = AZABS(P2R,P2I)
3463 [ # # ]: 0 : IF (AP.LT.TST) GO TO 30
3464 [ # # ]: 0 : IF (ITIME.EQ.2) GO TO 40
3465 : 0 : ACK = AZABS(CKR,CKI)
3466 : 0 : FLAM = ACK + DSQRT(ACK*ACK-1.0D0)
3467 : 0 : FKAP = AP/AZABS(P1R,P1I)
3468 : 0 : RHO = DMIN1(FLAM,FKAP)
3469 : 0 : TST = TST*DSQRT(RHO/(RHO*RHO-1.0D0))
3470 : 0 : ITIME = 2
3471 : 0 : 30 CONTINUE
3472 : 0 : GO TO 110
3473 : : 40 CONTINUE
3474 : : !C-----------------------------------------------------------------------
3475 : : !C BACKWARD RECURRENCE AND SUM NORMALIZING RELATION
3476 : : !C-----------------------------------------------------------------------
3477 : 0 : K = K + 1
3478 : 0 : KK = MAX0(I+IAZ,K+INU)
3479 : 0 : FKK = DBLE(FLOAT(KK))
3480 : 0 : P1R = ZEROR
3481 : 0 : P1I = ZEROI
3482 : : !C-----------------------------------------------------------------------
3483 : : !C SCALE P2 AND SUM BY SCLE
3484 : : !C-----------------------------------------------------------------------
3485 : 0 : P2R = SCLE
3486 : 0 : P2I = ZEROI
3487 : 0 : FNF = FNU - DBLE(FLOAT(IFNU))
3488 : 0 : TFNF = FNF + FNF
3489 : : BK = DGAMLN(FKK+TFNF+1.0D0,IDUM) - DGAMLN(FKK+1.0D0,IDUM) - &
3490 : 0 : & DGAMLN(TFNF+1.0D0,IDUM)
3491 : 0 : BK = DEXP(BK)
3492 : 0 : SUMR = ZEROR
3493 : 0 : SUMI = ZEROI
3494 : 0 : KM = KK - INU
3495 [ # # ]: 0 : DO 50 I=1,KM
3496 : 0 : PTR = P2R
3497 : 0 : PTI = P2I
3498 : 0 : P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
3499 : 0 : P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
3500 : 0 : P1R = PTR
3501 : 0 : P1I = PTI
3502 : 0 : AK = 1.0D0 - TFNF/(FKK+TFNF)
3503 : 0 : ACK = BK*AK
3504 : 0 : SUMR = SUMR + (ACK+BK)*P1R
3505 : 0 : SUMI = SUMI + (ACK+BK)*P1I
3506 : 0 : BK = ACK
3507 : 0 : FKK = FKK - 1.0D0
3508 : 0 : 50 CONTINUE
3509 : 0 : YR(N) = P2R
3510 : 0 : YI(N) = P2I
3511 [ # # ]: 0 : IF (N.EQ.1) GO TO 70
3512 [ # # ]: 0 : DO 60 I=2,N
3513 : 0 : PTR = P2R
3514 : 0 : PTI = P2I
3515 : 0 : P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
3516 : 0 : P2I = P1I + (FKK+FNF)*(RZI*PTR+RZR*PTI)
3517 : 0 : P1R = PTR
3518 : 0 : P1I = PTI
3519 : 0 : AK = 1.0D0 - TFNF/(FKK+TFNF)
3520 : 0 : ACK = BK*AK
3521 : 0 : SUMR = SUMR + (ACK+BK)*P1R
3522 : 0 : SUMI = SUMI + (ACK+BK)*P1I
3523 : 0 : BK = ACK
3524 : 0 : FKK = FKK - 1.0D0
3525 : 0 : M = N - I + 1
3526 : 0 : YR(M) = P2R
3527 : 0 : YI(M) = P2I
3528 : 0 : 60 CONTINUE
3529 : : 70 CONTINUE
3530 [ # # ]: 0 : IF (IFNU.LE.0) GO TO 90
3531 [ # # ]: 0 : DO 80 I=1,IFNU
3532 : 0 : PTR = P2R
3533 : 0 : PTI = P2I
3534 : 0 : P2R = P1R + (FKK+FNF)*(RZR*PTR-RZI*PTI)
3535 : 0 : P2I = P1I + (FKK+FNF)*(RZR*PTI+RZI*PTR)
3536 : 0 : P1R = PTR
3537 : 0 : P1I = PTI
3538 : 0 : AK = 1.0D0 - TFNF/(FKK+TFNF)
3539 : 0 : ACK = BK*AK
3540 : 0 : SUMR = SUMR + (ACK+BK)*P1R
3541 : 0 : SUMI = SUMI + (ACK+BK)*P1I
3542 : 0 : BK = ACK
3543 : 0 : FKK = FKK - 1.0D0
3544 : 0 : 80 CONTINUE
3545 : : 90 CONTINUE
3546 : 0 : PTR = ZR
3547 : 0 : PTI = ZI
3548 [ # # ]: 0 : IF (KODE.EQ.2) PTR = ZEROR
3549 : 0 : CALL AZLOG(RZR, RZI, STR, STI, IDUM)
3550 : 0 : P1R = -FNF*STR + PTR
3551 : 0 : P1I = -FNF*STI + PTI
3552 : 0 : AP = DGAMLN(1.0D0+FNF,IDUM)
3553 : 0 : PTR = P1R - AP
3554 : 0 : PTI = P1I
3555 : : !C-----------------------------------------------------------------------
3556 : : !C THE DIVISION CEXP(PT)/(SUM+P2) IS ALTERED TO AVOID OVERFLOW
3557 : : !C IN THE DENOMINATOR BY SQUARING LARGE QUANTITIES
3558 : : !C-----------------------------------------------------------------------
3559 : 0 : P2R = P2R + SUMR
3560 : 0 : P2I = P2I + SUMI
3561 : 0 : AP = AZABS(P2R,P2I)
3562 : 0 : P1R = 1.0D0/AP
3563 : 0 : CALL AZEXP(PTR, PTI, STR, STI)
3564 : 0 : CKR = STR*P1R
3565 : 0 : CKI = STI*P1R
3566 : 0 : PTR = P2R*P1R
3567 : 0 : PTI = -P2I*P1R
3568 : 0 : CALL ZMLT(CKR, CKI, PTR, PTI, CNORMR, CNORMI)
3569 [ # # ]: 0 : DO 100 I=1,N
3570 : 0 : STR = YR(I)*CNORMR - YI(I)*CNORMI
3571 : 0 : YI(I) = YR(I)*CNORMI + YI(I)*CNORMR
3572 : 0 : YR(I) = STR
3573 : 0 : 100 CONTINUE
3574 : : RETURN
3575 : : 110 CONTINUE
3576 : 0 : NZ=-2
3577 : 0 : RETURN
3578 : : END SUBROUTINE ZMLRI
3579 : :
3580 : 0 : SUBROUTINE ZWRSK(ZRR, ZRI, FNU, KODE, N, YR, YI, NZ, CWR, CWI, &
3581 : : & TOL, ELIM, ALIM)
3582 : : !C***BEGIN PROLOGUE ZWRSK
3583 : : !C***REFER TO ZBESI,ZBESK
3584 : : !C
3585 : : !C ZWRSK COMPUTES THE I BESSEL FUNCTION FOR RE(Z).GE.0.0 BY
3586 : : !C NORMALIZING THE I FUNCTION RATIOS FROM ZRATI BY THE WRONSKIAN
3587 : : !C
3588 : : !C***ROUTINES CALLED D1MACH,ZBKNU,ZRATI,AZABS
3589 : : !C***END PROLOGUE ZWRSK
3590 : : !C COMPLEX CINU,CSCL,CT,CW,C1,C2,RCT,ST,Y,ZR
3591 : : DOUBLE PRECISION ACT, ACW, ALIM, ASCLE, CINUI, CINUR, CSCLR, CTI, &
3592 : : & CTR, CWI, CWR, C1I, C1R, C2I, C2R, ELIM, FNU, PTI, PTR, RACT, &
3593 : : & STI, STR, TOL, YI, YR, ZRI, ZRR!, AZABS, D1MACH
3594 : : INTEGER I, KODE, N, NW, NZ
3595 : : DIMENSION YR(N), YI(N), CWR(2), CWI(2)
3596 : : !C-----------------------------------------------------------------------
3597 : : !C I(FNU+I-1,Z) BY BACKWARD RECURRENCE FOR RATIOS
3598 : : !C Y(I)=I(FNU+I,Z)/I(FNU+I-1,Z) FROM CRATI NORMALIZED BY THE
3599 : : !C WRONSKIAN WITH K(FNU,Z) AND K(FNU+1,Z) FROM CBKNU.
3600 : : !C-----------------------------------------------------------------------
3601 : 0 : NZ = 0
3602 : 0 : CALL ZBKNU(ZRR, ZRI, FNU, KODE, 2, CWR, CWI, NW, TOL, ELIM, ALIM)
3603 [ # # ]: 0 : IF (NW.NE.0) GO TO 50
3604 : 0 : CALL ZRATI(ZRR, ZRI, FNU, N, YR, YI, TOL)
3605 : : !C-----------------------------------------------------------------------
3606 : : !C RECUR FORWARD ON I(FNU+1,Z) = R(FNU,Z)*I(FNU,Z),
3607 : : !C R(FNU+J-1,Z)=Y(J), J=1,...,N
3608 : : !C-----------------------------------------------------------------------
3609 : 0 : CINUR = 1.0D0
3610 : 0 : CINUI = 0.0D0
3611 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 10
3612 : 0 : CINUR = DCOS(ZRI)
3613 : 0 : CINUI = DSIN(ZRI)
3614 : : 10 CONTINUE
3615 : : !C-----------------------------------------------------------------------
3616 : : !C ON LOW EXPONENT MACHINES THE K FUNCTIONS CAN BE CLOSE TO BOTH
3617 : : !C THE UNDER AND OVERFLOW LIMITS AND THE NORMALIZATION MUST BE
3618 : : !C SCALED TO PREVENT OVER OR UNDERFLOW. CUOIK HAS DETERMINED THAT
3619 : : !C THE RESULT IS ON SCALE.
3620 : : !C-----------------------------------------------------------------------
3621 : 0 : ACW = AZABS(CWR(2),CWI(2))
3622 : 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
3623 : 0 : CSCLR = 1.0D0
3624 [ # # ]: 0 : IF (ACW.GT.ASCLE) GO TO 20
3625 : 0 : CSCLR = 1.0D0/TOL
3626 : 0 : GO TO 30
3627 : : 20 CONTINUE
3628 : 0 : ASCLE = 1.0D0/ASCLE
3629 [ # # ]: 0 : IF (ACW.LT.ASCLE) GO TO 30
3630 : 0 : CSCLR = TOL
3631 : : 30 CONTINUE
3632 : 0 : C1R = CWR(1)*CSCLR
3633 : 0 : C1I = CWI(1)*CSCLR
3634 : 0 : C2R = CWR(2)*CSCLR
3635 : 0 : C2I = CWI(2)*CSCLR
3636 : 0 : STR = YR(1)
3637 : 0 : STI = YI(1)
3638 : : !C-----------------------------------------------------------------------
3639 : : !C CINU=CINU*(CONJG(CT)/CABS(CT))*(1.0D0/CABS(CT) PREVENTS
3640 : : !C UNDER- OR OVERFLOW PREMATURELY BY SQUARING CABS(CT)
3641 : : !C-----------------------------------------------------------------------
3642 : 0 : PTR = STR*C1R - STI*C1I
3643 : 0 : PTI = STR*C1I + STI*C1R
3644 : 0 : PTR = PTR + C2R
3645 : 0 : PTI = PTI + C2I
3646 : 0 : CTR = ZRR*PTR - ZRI*PTI
3647 : 0 : CTI = ZRR*PTI + ZRI*PTR
3648 : 0 : ACT = AZABS(CTR,CTI)
3649 : 0 : RACT = 1.0D0/ACT
3650 : 0 : CTR = CTR*RACT
3651 : 0 : CTI = -CTI*RACT
3652 : 0 : PTR = CINUR*RACT
3653 : 0 : PTI = CINUI*RACT
3654 : 0 : CINUR = PTR*CTR - PTI*CTI
3655 : 0 : CINUI = PTR*CTI + PTI*CTR
3656 : 0 : YR(1) = CINUR*CSCLR
3657 : 0 : YI(1) = CINUI*CSCLR
3658 [ # # ]: 0 : IF (N.EQ.1) RETURN
3659 [ # # ]: 0 : DO 40 I=2,N
3660 : 0 : PTR = STR*CINUR - STI*CINUI
3661 : 0 : CINUI = STR*CINUI + STI*CINUR
3662 : 0 : CINUR = PTR
3663 : 0 : STR = YR(I)
3664 : 0 : STI = YI(I)
3665 : 0 : YR(I) = CINUR*CSCLR
3666 : 0 : YI(I) = CINUI*CSCLR
3667 : 0 : 40 CONTINUE
3668 : 0 : RETURN
3669 : : 50 CONTINUE
3670 : 0 : NZ = -1
3671 [ # # ]: 0 : IF(NW.EQ.(-2)) NZ=-2
3672 : : RETURN
3673 : : END SUBROUTINE ZWRSK
3674 : :
3675 : 0 : SUBROUTINE ZBKNU(ZR, ZI, FNU, KODE, N, YR, YI, NZ, TOL, ELIM, &
3676 : : & ALIM)
3677 : : !C***BEGIN PROLOGUE ZBKNU
3678 : : !C***REFER TO ZBESI,ZBESK,ZAIRY,ZBESH
3679 : : !C
3680 : : !C ZBKNU COMPUTES THE K BESSEL FUNCTION IN THE RIGHT HALF Z PLANE.
3681 : : !C
3682 : : !C***ROUTINES CALLED DGAMLN,I1MACH,D1MACH,ZKSCL,ZSHCH,ZUCHK,AZABS,ZDIV,
3683 : : !C AZEXP,AZLOG,ZMLT,AZSQRT
3684 : : !C***END PROLOGUE ZBKNU
3685 : : !C
3686 : : DOUBLE PRECISION AA, AK, ALIM, ASCLE, A1, A2, BB, BK, BRY, CAZ, &
3687 : : & CBI, CBR, CC, CCHI, CCHR, CKI, CKR, COEFI, COEFR, CONEI, CONER, &
3688 : : & CRSCR, CSCLR, CSHI, CSHR, CSI, CSR, CSRR, CSSR, CTWOR, &
3689 : : & CZEROI, CZEROR, CZI, CZR, DNU, DNU2, DPI, ELIM, ETEST, FC, FHS, &
3690 : : & FI, FK, FKS, FMUI, FMUR, FNU, FPI, FR, G1, G2, HPI, PI, PR, PTI, &
3691 : : & PTR, P1I, P1R, P2I, P2M, P2R, QI, QR, RAK, RCAZ, RTHPI, RZI, &
3692 : : & RZR, R1, S, SMUI, SMUR, SPI, STI, STR, S1I, S1R, S2I, S2R, TM, &
3693 : : & TOL, TTH, T1, T2, YI, YR, ZI, ZR, ELM, & ! , DGAMLN, D1MACH, AZABS,
3694 : : & CELMR, ZDR, ZDI, AS, ALAS, HELIM, CYR, CYI
3695 : : INTEGER I, IFLAG, INU, K, KFLAG, KK, KMAX, KODE, KODED, N, NZ, &
3696 : : & IDUM, J, IC, INUB, NW !I1MACH
3697 : : DIMENSION YR(N), YI(N), CC(8), CSSR(3), CSRR(3), BRY(3), CYR(2), &
3698 : : & CYI(2)
3699 : : !C COMPLEX Z,Y,A,B,RZ,SMU,FU,FMU,F,FLRZ,CZ,S1,S2,CSH,CCH
3700 : : !C COMPLEX CK,P,Q,COEF,P1,P2,CBK,PT,CZERO,CONE,CTWO,ST,EZ,CS,DK
3701 : : !C
3702 : : DATA KMAX / 30 /
3703 : : DATA CZEROR,CZEROI,CONER,CONEI,CTWOR,R1/ &
3704 : : & 0.0D0 , 0.0D0 , 1.0D0 , 0.0D0 , 2.0D0 , 2.0D0 /
3705 : : DATA DPI, RTHPI, SPI ,HPI, FPI, TTH / &
3706 : : & 3.14159265358979324D0, 1.25331413731550025D0, &
3707 : : & 1.90985931710274403D0, 1.57079632679489662D0, &
3708 : : & 1.89769999331517738D0, 6.66666666666666666D-01/
3709 : : DATA CC(1), CC(2), CC(3), CC(4), CC(5), CC(6), CC(7), CC(8)/ &
3710 : : & 5.77215664901532861D-01, -4.20026350340952355D-02, &
3711 : : & -4.21977345555443367D-02, 7.21894324666309954D-03, &
3712 : : & -2.15241674114950973D-04, -2.01348547807882387D-05, &
3713 : : & 1.13302723198169588D-06, 6.11609510448141582D-09/
3714 : : !C
3715 : 0 : CAZ = AZABS(ZR,ZI)
3716 : 0 : CSCLR = 1.0D0/TOL
3717 : 0 : CRSCR = TOL
3718 : 0 : CSSR(1) = CSCLR
3719 : 0 : CSSR(2) = 1.0D0
3720 : 0 : CSSR(3) = CRSCR
3721 : 0 : CSRR(1) = CRSCR
3722 : 0 : CSRR(2) = 1.0D0
3723 : 0 : CSRR(3) = CSCLR
3724 : 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
3725 : 0 : BRY(2) = 1.0D0/BRY(1)
3726 : 0 : BRY(3) = D1MACH(2)
3727 : 0 : NZ = 0
3728 : 0 : IFLAG = 0
3729 : 0 : KODED = KODE
3730 : 0 : RCAZ = 1.0D0/CAZ
3731 : 0 : STR = ZR*RCAZ
3732 : 0 : STI = -ZI*RCAZ
3733 : 0 : RZR = (STR+STR)*RCAZ
3734 : 0 : RZI = (STI+STI)*RCAZ
3735 : 0 : INU = INT(SNGL(FNU+0.5D0))
3736 : 0 : DNU = FNU - DBLE(FLOAT(INU))
3737 [ # # ]: 0 : IF (DABS(DNU).EQ.0.5D0) GO TO 110
3738 : 0 : DNU2 = 0.0D0
3739 [ # # ]: 0 : IF (DABS(DNU).GT.TOL) DNU2 = DNU*DNU
3740 [ # # ]: 0 : IF (CAZ.GT.R1) GO TO 110
3741 : : !C-----------------------------------------------------------------------
3742 : : !C SERIES FOR CABS(Z).LE.R1
3743 : : !C-----------------------------------------------------------------------
3744 : 0 : FC = 1.0D0
3745 : 0 : CALL AZLOG(RZR, RZI, SMUR, SMUI, IDUM)
3746 : 0 : FMUR = SMUR*DNU
3747 : 0 : FMUI = SMUI*DNU
3748 : 0 : CALL ZSHCH(FMUR, FMUI, CSHR, CSHI, CCHR, CCHI)
3749 [ # # ]: 0 : IF (DNU.EQ.0.0D0) GO TO 10
3750 : 0 : FC = DNU*DPI
3751 : 0 : FC = FC/DSIN(FC)
3752 : 0 : SMUR = CSHR/DNU
3753 : 0 : SMUI = CSHI/DNU
3754 : : 10 CONTINUE
3755 : 0 : A2 = 1.0D0 + DNU
3756 : : !C-----------------------------------------------------------------------
3757 : : !C GAM(1-Z)*GAM(1+Z)=PI*Z/SIN(PI*Z), T1=1/GAM(1-DNU), T2=1/GAM(1+DNU)
3758 : : !C-----------------------------------------------------------------------
3759 : 0 : T2 = DEXP(-DGAMLN(A2,IDUM))
3760 : 0 : T1 = 1.0D0/(T2*FC)
3761 [ # # ]: 0 : IF (DABS(DNU).GT.0.1D0) GO TO 40
3762 : : !C-----------------------------------------------------------------------
3763 : : !C SERIES FOR F0 TO RESOLVE INDETERMINACY FOR SMALL ABS(DNU)
3764 : : !C-----------------------------------------------------------------------
3765 : 0 : AK = 1.0D0
3766 : 0 : S = CC(1)
3767 [ # # ]: 0 : DO 20 K=2,8
3768 : 0 : AK = AK*DNU2
3769 : 0 : TM = CC(K)*AK
3770 : 0 : S = S + TM
3771 [ # # ]: 0 : IF (DABS(TM).LT.TOL) GO TO 30
3772 : 0 : 20 CONTINUE
3773 : 0 : 30 G1 = -S
3774 : 0 : GO TO 50
3775 : : 40 CONTINUE
3776 : 0 : G1 = (T1-T2)/(DNU+DNU)
3777 : : 50 CONTINUE
3778 : 0 : G2 = (T1+T2)*0.5D0
3779 : 0 : FR = FC*(CCHR*G1+SMUR*G2)
3780 : 0 : FI = FC*(CCHI*G1+SMUI*G2)
3781 : 0 : CALL AZEXP(FMUR, FMUI, STR, STI)
3782 : 0 : PR = 0.5D0*STR/T2
3783 : 0 : PI = 0.5D0*STI/T2
3784 : 0 : CALL ZDIV(0.5D0, 0.0D0, STR, STI, PTR, PTI)
3785 : 0 : QR = PTR/T1
3786 : 0 : QI = PTI/T1
3787 : 0 : S1R = FR
3788 : 0 : S1I = FI
3789 : 0 : S2R = PR
3790 : 0 : S2I = PI
3791 : 0 : AK = 1.0D0
3792 : 0 : A1 = 1.0D0
3793 : 0 : CKR = CONER
3794 : 0 : CKI = CONEI
3795 : 0 : BK = 1.0D0 - DNU2
3796 [ # # # # ]: 0 : IF (INU.GT.0 .OR. N.GT.1) GO TO 80
3797 : : !C-----------------------------------------------------------------------
3798 : : !C GENERATE K(FNU,Z), 0.0D0 .LE. FNU .LT. 0.5D0 AND N=1
3799 : : !C-----------------------------------------------------------------------
3800 [ # # ]: 0 : IF (CAZ.LT.TOL) GO TO 70
3801 : 0 : CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
3802 : 0 : CZR = 0.25D0*CZR
3803 : 0 : CZI = 0.25D0*CZI
3804 : 0 : T1 = 0.25D0*CAZ*CAZ
3805 : : 60 CONTINUE
3806 : 0 : FR = (FR*AK+PR+QR)/BK
3807 : 0 : FI = (FI*AK+PI+QI)/BK
3808 : 0 : STR = 1.0D0/(AK-DNU)
3809 : 0 : PR = PR*STR
3810 : 0 : PI = PI*STR
3811 : 0 : STR = 1.0D0/(AK+DNU)
3812 : 0 : QR = QR*STR
3813 : 0 : QI = QI*STR
3814 : 0 : STR = CKR*CZR - CKI*CZI
3815 : 0 : RAK = 1.0D0/AK
3816 : 0 : CKI = (CKR*CZI+CKI*CZR)*RAK
3817 : 0 : CKR = STR*RAK
3818 : 0 : S1R = CKR*FR - CKI*FI + S1R
3819 : 0 : S1I = CKR*FI + CKI*FR + S1I
3820 : 0 : A1 = A1*T1*RAK
3821 : 0 : BK = BK + AK + AK + 1.0D0
3822 : 0 : AK = AK + 1.0D0
3823 [ # # ]: 0 : IF (A1.GT.TOL) GO TO 60
3824 : : 70 CONTINUE
3825 : 0 : YR(1) = S1R
3826 : 0 : YI(1) = S1I
3827 [ # # ]: 0 : IF (KODED.EQ.1) RETURN
3828 : 0 : CALL AZEXP(ZR, ZI, STR, STI)
3829 : 0 : CALL ZMLT(S1R, S1I, STR, STI, YR(1), YI(1))
3830 : 0 : RETURN
3831 : : !C-----------------------------------------------------------------------
3832 : : !C GENERATE K(DNU,Z) AND K(DNU+1,Z) FOR FORWARD RECURRENCE
3833 : : !C-----------------------------------------------------------------------
3834 : : 80 CONTINUE
3835 [ # # ]: 0 : IF (CAZ.LT.TOL) GO TO 100
3836 : 0 : CALL ZMLT(ZR, ZI, ZR, ZI, CZR, CZI)
3837 : 0 : CZR = 0.25D0*CZR
3838 : 0 : CZI = 0.25D0*CZI
3839 : 0 : T1 = 0.25D0*CAZ*CAZ
3840 : : 90 CONTINUE
3841 : 0 : FR = (FR*AK+PR+QR)/BK
3842 : 0 : FI = (FI*AK+PI+QI)/BK
3843 : 0 : STR = 1.0D0/(AK-DNU)
3844 : 0 : PR = PR*STR
3845 : 0 : PI = PI*STR
3846 : 0 : STR = 1.0D0/(AK+DNU)
3847 : 0 : QR = QR*STR
3848 : 0 : QI = QI*STR
3849 : 0 : STR = CKR*CZR - CKI*CZI
3850 : 0 : RAK = 1.0D0/AK
3851 : 0 : CKI = (CKR*CZI+CKI*CZR)*RAK
3852 : 0 : CKR = STR*RAK
3853 : 0 : S1R = CKR*FR - CKI*FI + S1R
3854 : 0 : S1I = CKR*FI + CKI*FR + S1I
3855 : 0 : STR = PR - FR*AK
3856 : 0 : STI = PI - FI*AK
3857 : 0 : S2R = CKR*STR - CKI*STI + S2R
3858 : 0 : S2I = CKR*STI + CKI*STR + S2I
3859 : 0 : A1 = A1*T1*RAK
3860 : 0 : BK = BK + AK + AK + 1.0D0
3861 : 0 : AK = AK + 1.0D0
3862 [ # # ]: 0 : IF (A1.GT.TOL) GO TO 90
3863 : : 100 CONTINUE
3864 : 0 : KFLAG = 2
3865 : 0 : A1 = FNU + 1.0D0
3866 : 0 : AK = A1*DABS(SMUR)
3867 [ # # ]: 0 : IF (AK.GT.ALIM) KFLAG = 3
3868 : 0 : STR = CSSR(KFLAG)
3869 : 0 : P2R = S2R*STR
3870 : 0 : P2I = S2I*STR
3871 : 0 : CALL ZMLT(P2R, P2I, RZR, RZI, S2R, S2I)
3872 : 0 : S1R = S1R*STR
3873 : 0 : S1I = S1I*STR
3874 [ # # ]: 0 : IF (KODED.EQ.1) GO TO 210
3875 : 0 : CALL AZEXP(ZR, ZI, FR, FI)
3876 : 0 : CALL ZMLT(S1R, S1I, FR, FI, S1R, S1I)
3877 : 0 : CALL ZMLT(S2R, S2I, FR, FI, S2R, S2I)
3878 : 0 : GO TO 210
3879 : : !C-----------------------------------------------------------------------
3880 : : !C IFLAG=0 MEANS NO UNDERFLOW OCCURRED
3881 : : !C IFLAG=1 MEANS AN UNDERFLOW OCCURRED- COMPUTATION PROCEEDS WITH
3882 : : !C KODED=2 AND A TEST FOR ON SCALE VALUES IS MADE DURING FORWARD
3883 : : !C RECURSION
3884 : : !C-----------------------------------------------------------------------
3885 : : 110 CONTINUE
3886 : 0 : CALL AZSQRT(ZR, ZI, STR, STI)
3887 : 0 : CALL ZDIV(RTHPI, CZEROI, STR, STI, COEFR, COEFI)
3888 : 0 : KFLAG = 2
3889 [ # # ]: 0 : IF (KODED.EQ.2) GO TO 120
3890 [ # # ]: 0 : IF (ZR.GT.ALIM) GO TO 290
3891 : : !C BLANK LINE
3892 : 0 : STR = DEXP(-ZR)*CSSR(KFLAG)
3893 : 0 : STI = -STR*DSIN(ZI)
3894 : 0 : STR = STR*DCOS(ZI)
3895 : 0 : CALL ZMLT(COEFR, COEFI, STR, STI, COEFR, COEFI)
3896 : : 120 CONTINUE
3897 : 0 : IF (DABS(DNU).EQ.0.5D0) GO TO 300
3898 : : !C-----------------------------------------------------------------------
3899 : : !C MILLER ALGORITHM FOR CABS(Z).GT.R1
3900 : : !C-----------------------------------------------------------------------
3901 : 0 : AK = DCOS(DPI*DNU)
3902 : 0 : AK = DABS(AK)
3903 [ # # ]: 0 : IF (AK.EQ.CZEROR) GO TO 300
3904 : 0 : FHS = DABS(0.25D0-DNU2)
3905 [ # # ]: 0 : IF (FHS.EQ.CZEROR) GO TO 300
3906 : : !C-----------------------------------------------------------------------
3907 : : !C COMPUTE R2=F(E). IF CABS(Z).GE.R2, USE FORWARD RECURRENCE TO
3908 : : !C DETERMINE THE BACKWARD INDEX K. R2=F(E) IS A STRAIGHT LINE ON
3909 : : !C 12.LE.E.LE.60. E IS COMPUTED FROM 2**(-E)=B**(1-I1MACH(14))=
3910 : : !C TOL WHERE B IS THE BASE OF THE ARITHMETIC.
3911 : : !C-----------------------------------------------------------------------
3912 : 0 : T1 = DBLE(FLOAT(I1MACH(14)-1))
3913 : 0 : T1 = T1*D1MACH(5)*3.321928094D0
3914 : 0 : T1 = DMAX1(T1,12.0D0)
3915 : 0 : T1 = DMIN1(T1,60.0D0)
3916 : 0 : T2 = TTH*T1 - 6.0D0
3917 [ # # ]: 0 : IF (ZR.NE.0.0D0) GO TO 130
3918 : 0 : T1 = HPI
3919 : 0 : GO TO 140
3920 : : 130 CONTINUE
3921 : 0 : T1 = DATAN(ZI/ZR)
3922 : 0 : T1 = DABS(T1)
3923 : : 140 CONTINUE
3924 [ # # ]: 0 : IF (T2.GT.CAZ) GO TO 170
3925 : : !C-----------------------------------------------------------------------
3926 : : !C FORWARD RECURRENCE LOOP WHEN CABS(Z).GE.R2
3927 : : !C-----------------------------------------------------------------------
3928 : 0 : ETEST = AK/(DPI*CAZ*TOL)
3929 : 0 : FK = CONER
3930 [ # # ]: 0 : IF (ETEST.LT.CONER) GO TO 180
3931 : 0 : FKS = CTWOR
3932 : 0 : CKR = CAZ + CAZ + CTWOR
3933 : 0 : P1R = CZEROR
3934 : 0 : P2R = CONER
3935 [ # # ]: 0 : DO 150 I=1,KMAX
3936 : 0 : AK = FHS/FKS
3937 : 0 : CBR = CKR/(FK+CONER)
3938 : 0 : PTR = P2R
3939 : 0 : P2R = CBR*P2R - P1R*AK
3940 : 0 : P1R = PTR
3941 : 0 : CKR = CKR + CTWOR
3942 : 0 : FKS = FKS + FK + FK + CTWOR
3943 : 0 : FHS = FHS + FK + FK
3944 : 0 : FK = FK + CONER
3945 : 0 : STR = DABS(P2R)*FK
3946 [ # # ]: 0 : IF (ETEST.LT.STR) GO TO 160
3947 : 0 : 150 CONTINUE
3948 : 0 : GO TO 310
3949 : : 160 CONTINUE
3950 : 0 : FK = FK + SPI*T1*DSQRT(T2/CAZ)
3951 : 0 : FHS = DABS(0.25D0-DNU2)
3952 : 0 : GO TO 180
3953 : : 170 CONTINUE
3954 : : !C-----------------------------------------------------------------------
3955 : : !C COMPUTE BACKWARD INDEX K FOR CABS(Z).LT.R2
3956 : : !C-----------------------------------------------------------------------
3957 : 0 : A2 = DSQRT(CAZ)
3958 : 0 : AK = FPI*AK/(TOL*DSQRT(A2))
3959 : 0 : AA = 3.0D0*T1/(1.0D0+CAZ)
3960 : 0 : BB = 14.7D0*T1/(28.0D0+CAZ)
3961 : 0 : AK = (DLOG(AK)+CAZ*DCOS(AA)/(1.0D0+0.008D0*CAZ))/DCOS(BB)
3962 : 0 : FK = 0.12125D0*AK*AK/CAZ + 1.5D0
3963 : : 180 CONTINUE
3964 : : !C-----------------------------------------------------------------------
3965 : : !C BACKWARD RECURRENCE LOOP FOR MILLER ALGORITHM
3966 : : !C-----------------------------------------------------------------------
3967 : 0 : K = INT(SNGL(FK))
3968 : 0 : FK = DBLE(FLOAT(K))
3969 : 0 : FKS = FK*FK
3970 : 0 : P1R = CZEROR
3971 : 0 : P1I = CZEROI
3972 : 0 : P2R = TOL
3973 : 0 : P2I = CZEROI
3974 : 0 : CSR = P2R
3975 : 0 : CSI = P2I
3976 [ # # ]: 0 : DO 190 I=1,K
3977 : 0 : A1 = FKS - FK
3978 : 0 : AK = (FKS+FK)/(A1+FHS)
3979 : 0 : RAK = 2.0D0/(FK+CONER)
3980 : 0 : CBR = (FK+ZR)*RAK
3981 : 0 : CBI = ZI*RAK
3982 : 0 : PTR = P2R
3983 : 0 : PTI = P2I
3984 : 0 : P2R = (PTR*CBR-PTI*CBI-P1R)*AK
3985 : 0 : P2I = (PTI*CBR+PTR*CBI-P1I)*AK
3986 : 0 : P1R = PTR
3987 : 0 : P1I = PTI
3988 : 0 : CSR = CSR + P2R
3989 : 0 : CSI = CSI + P2I
3990 : 0 : FKS = A1 - FK + CONER
3991 : 0 : FK = FK - CONER
3992 : 0 : 190 CONTINUE
3993 : : !C-----------------------------------------------------------------------
3994 : : !C COMPUTE (P2/CS)=(P2/CABS(CS))*(CONJG(CS)/CABS(CS)) FOR BETTER
3995 : : !C SCALING
3996 : : !C-----------------------------------------------------------------------
3997 : 0 : TM = AZABS(CSR,CSI)
3998 : 0 : PTR = 1.0D0/TM
3999 : 0 : S1R = P2R*PTR
4000 : 0 : S1I = P2I*PTR
4001 : 0 : CSR = CSR*PTR
4002 : 0 : CSI = -CSI*PTR
4003 : 0 : CALL ZMLT(COEFR, COEFI, S1R, S1I, STR, STI)
4004 : 0 : CALL ZMLT(STR, STI, CSR, CSI, S1R, S1I)
4005 [ # # # # ]: 0 : IF (INU.GT.0 .OR. N.GT.1) GO TO 200
4006 : 0 : ZDR = ZR
4007 : 0 : ZDI = ZI
4008 [ # # ]: 0 : IF(IFLAG.EQ.1) GO TO 270
4009 : 0 : GO TO 240
4010 : : 200 CONTINUE
4011 : : !C-----------------------------------------------------------------------
4012 : : !C COMPUTE P1/P2=(P1/CABS(P2)*CONJG(P2)/CABS(P2) FOR SCALING
4013 : : !C-----------------------------------------------------------------------
4014 : 0 : TM = AZABS(P2R,P2I)
4015 : 0 : PTR = 1.0D0/TM
4016 : 0 : P1R = P1R*PTR
4017 : 0 : P1I = P1I*PTR
4018 : 0 : P2R = P2R*PTR
4019 : 0 : P2I = -P2I*PTR
4020 : 0 : CALL ZMLT(P1R, P1I, P2R, P2I, PTR, PTI)
4021 : 0 : STR = DNU + 0.5D0 - PTR
4022 : 0 : STI = -PTI
4023 : 0 : CALL ZDIV(STR, STI, ZR, ZI, STR, STI)
4024 : 0 : STR = STR + 1.0D0
4025 : 0 : CALL ZMLT(STR, STI, S1R, S1I, S2R, S2I)
4026 : : !C-----------------------------------------------------------------------
4027 : : !C FORWARD RECURSION ON THE THREE TERM RECURSION WITH RELATION WITH
4028 : : !C SCALING NEAR EXPONENT EXTREMES ON KFLAG=1 OR KFLAG=3
4029 : : !C-----------------------------------------------------------------------
4030 : : 210 CONTINUE
4031 : 0 : STR = DNU + 1.0D0
4032 : 0 : CKR = STR*RZR
4033 : 0 : CKI = STR*RZI
4034 [ # # ]: 0 : IF (N.EQ.1) INU = INU - 1
4035 [ # # ]: 0 : IF (INU.GT.0) GO TO 220
4036 [ # # ]: 0 : IF (N.GT.1) GO TO 215
4037 : 0 : S1R = S2R
4038 : 0 : S1I = S2I
4039 : : 215 CONTINUE
4040 : 0 : ZDR = ZR
4041 : 0 : ZDI = ZI
4042 [ # # ]: 0 : IF(IFLAG.EQ.1) GO TO 270
4043 : 0 : GO TO 240
4044 : : 220 CONTINUE
4045 : 0 : INUB = 1
4046 [ # # ]: 0 : IF(IFLAG.EQ.1) GO TO 261
4047 : : 225 CONTINUE
4048 : 0 : P1R = CSRR(KFLAG)
4049 : 0 : ASCLE = BRY(KFLAG)
4050 [ # # ]: 0 : DO 230 I=INUB,INU
4051 : 0 : STR = S2R
4052 : 0 : STI = S2I
4053 : 0 : S2R = CKR*STR - CKI*STI + S1R
4054 : 0 : S2I = CKR*STI + CKI*STR + S1I
4055 : 0 : S1R = STR
4056 : 0 : S1I = STI
4057 : 0 : CKR = CKR + RZR
4058 : 0 : CKI = CKI + RZI
4059 [ # # ]: 0 : IF (KFLAG.GE.3) GO TO 230
4060 : 0 : P2R = S2R*P1R
4061 : 0 : P2I = S2I*P1R
4062 : 0 : STR = DABS(P2R)
4063 : 0 : STI = DABS(P2I)
4064 : 0 : P2M = DMAX1(STR,STI)
4065 [ # # ]: 0 : IF (P2M.LE.ASCLE) GO TO 230
4066 : 0 : KFLAG = KFLAG + 1
4067 : 0 : ASCLE = BRY(KFLAG)
4068 : 0 : S1R = S1R*P1R
4069 : 0 : S1I = S1I*P1R
4070 : : S2R = P2R
4071 : : S2I = P2I
4072 : 0 : STR = CSSR(KFLAG)
4073 : 0 : S1R = S1R*STR
4074 : 0 : S1I = S1I*STR
4075 : 0 : S2R = S2R*STR
4076 : 0 : S2I = S2I*STR
4077 : 0 : P1R = CSRR(KFLAG)
4078 : 0 : 230 CONTINUE
4079 [ # # ]: 0 : IF (N.NE.1) GO TO 240
4080 : 0 : S1R = S2R
4081 : 0 : S1I = S2I
4082 : : 240 CONTINUE
4083 : 0 : STR = CSRR(KFLAG)
4084 : 0 : YR(1) = S1R*STR
4085 : 0 : YI(1) = S1I*STR
4086 [ # # ]: 0 : IF (N.EQ.1) RETURN
4087 : 0 : YR(2) = S2R*STR
4088 : 0 : YI(2) = S2I*STR
4089 [ # # ]: 0 : IF (N.EQ.2) RETURN
4090 : : KK = 2
4091 : : 250 CONTINUE
4092 : 0 : KK = KK + 1
4093 [ # # ]: 0 : IF (KK.GT.N) RETURN
4094 : 0 : P1R = CSRR(KFLAG)
4095 : 0 : ASCLE = BRY(KFLAG)
4096 [ # # ]: 0 : DO 260 I=KK,N
4097 : 0 : P2R = S2R
4098 : 0 : P2I = S2I
4099 : 0 : S2R = CKR*P2R - CKI*P2I + S1R
4100 : 0 : S2I = CKI*P2R + CKR*P2I + S1I
4101 : 0 : S1R = P2R
4102 : 0 : S1I = P2I
4103 : 0 : CKR = CKR + RZR
4104 : 0 : CKI = CKI + RZI
4105 : 0 : P2R = S2R*P1R
4106 : 0 : P2I = S2I*P1R
4107 : 0 : YR(I) = P2R
4108 : 0 : YI(I) = P2I
4109 [ # # ]: 0 : IF (KFLAG.GE.3) GO TO 260
4110 : 0 : STR = DABS(P2R)
4111 : 0 : STI = DABS(P2I)
4112 : 0 : P2M = DMAX1(STR,STI)
4113 [ # # ]: 0 : IF (P2M.LE.ASCLE) GO TO 260
4114 : 0 : KFLAG = KFLAG + 1
4115 : 0 : ASCLE = BRY(KFLAG)
4116 : 0 : S1R = S1R*P1R
4117 : 0 : S1I = S1I*P1R
4118 : : S2R = P2R
4119 : : S2I = P2I
4120 : 0 : STR = CSSR(KFLAG)
4121 : 0 : S1R = S1R*STR
4122 : 0 : S1I = S1I*STR
4123 : 0 : S2R = S2R*STR
4124 : 0 : S2I = S2I*STR
4125 : 0 : P1R = CSRR(KFLAG)
4126 : 0 : 260 CONTINUE
4127 : 0 : RETURN
4128 : : !C-----------------------------------------------------------------------
4129 : : !C IFLAG=1 CASES, FORWARD RECURRENCE ON SCALED VALUES ON UNDERFLOW
4130 : : !C-----------------------------------------------------------------------
4131 : : 261 CONTINUE
4132 : 0 : HELIM = 0.5D0*ELIM
4133 : 0 : ELM = DEXP(-ELIM)
4134 : 0 : CELMR = ELM
4135 : 0 : ASCLE = BRY(1)
4136 : 0 : ZDR = ZR
4137 : 0 : ZDI = ZI
4138 : 0 : IC = -1
4139 : 0 : J = 2
4140 [ # # ]: 0 : DO 262 I=1,INU
4141 : 0 : STR = S2R
4142 : 0 : STI = S2I
4143 : 0 : S2R = STR*CKR-STI*CKI+S1R
4144 : 0 : S2I = STI*CKR+STR*CKI+S1I
4145 : 0 : S1R = STR
4146 : 0 : S1I = STI
4147 : 0 : CKR = CKR+RZR
4148 : 0 : CKI = CKI+RZI
4149 : 0 : AS = AZABS(S2R,S2I)
4150 : 0 : ALAS = DLOG(AS)
4151 : 0 : P2R = -ZDR+ALAS
4152 [ # # ]: 0 : IF(P2R.LT.(-ELIM)) GO TO 263
4153 : 0 : CALL AZLOG(S2R,S2I,STR,STI,IDUM)
4154 : 0 : P2R = -ZDR+STR
4155 : 0 : P2I = -ZDI+STI
4156 : 0 : P2M = DEXP(P2R)/TOL
4157 : 0 : P1R = P2M*DCOS(P2I)
4158 [ # # ]: 0 : P1I = P2M*DSIN(P2I)
4159 : 0 : CALL ZUCHK(P1R,P1I,NW,ASCLE,TOL)
4160 : : IF(NW.NE.0) GO TO 263
4161 : 0 : J = 3 - J
4162 : 0 : CYR(J) = P1R
4163 : 0 : CYI(J) = P1I
4164 [ # # ]: 0 : IF(IC.EQ.(I-1)) GO TO 264
4165 : : IC = I
4166 : 0 : GO TO 262
4167 : : 263 CONTINUE
4168 [ # # ]: 0 : IF(ALAS.LT.HELIM) GO TO 262
4169 : 0 : ZDR = ZDR-ELIM
4170 : 0 : S1R = S1R*CELMR
4171 : 0 : S1I = S1I*CELMR
4172 : 0 : S2R = S2R*CELMR
4173 : 0 : S2I = S2I*CELMR
4174 : 0 : 262 CONTINUE
4175 [ # # ]: 0 : IF(N.NE.1) GO TO 270
4176 : 0 : S1R = S2R
4177 : 0 : S1I = S2I
4178 : 0 : GO TO 270
4179 : : 264 CONTINUE
4180 : 0 : KFLAG = 1
4181 : 0 : INUB = I+1
4182 : 0 : S2R = CYR(J)
4183 : 0 : S2I = CYI(J)
4184 : 0 : J = 3 - J
4185 : 0 : S1R = CYR(J)
4186 : 0 : S1I = CYI(J)
4187 [ # # ]: 0 : IF(INUB.LE.INU) GO TO 225
4188 [ # # ]: 0 : IF(N.NE.1) GO TO 240
4189 : 0 : S1R = S2R
4190 : 0 : S1I = S2I
4191 : 0 : GO TO 240
4192 : : 270 CONTINUE
4193 : 0 : YR(1) = S1R
4194 : 0 : YI(1) = S1I
4195 [ # # ]: 0 : IF(N.EQ.1) GO TO 280
4196 : 0 : YR(2) = S2R
4197 : 0 : YI(2) = S2I
4198 : : 280 CONTINUE
4199 : 0 : ASCLE = BRY(1)
4200 : 0 : CALL ZKSCL(ZDR,ZDI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
4201 : 0 : INU = N - NZ
4202 [ # # ]: 0 : IF (INU.LE.0) RETURN
4203 : 0 : KK = NZ + 1
4204 : 0 : S1R = YR(KK)
4205 : 0 : S1I = YI(KK)
4206 : 0 : YR(KK) = S1R*CSRR(1)
4207 : 0 : YI(KK) = S1I*CSRR(1)
4208 [ # # ]: 0 : IF (INU.EQ.1) RETURN
4209 : 0 : KK = NZ + 2
4210 : 0 : S2R = YR(KK)
4211 : 0 : S2I = YI(KK)
4212 : 0 : YR(KK) = S2R*CSRR(1)
4213 : 0 : YI(KK) = S2I*CSRR(1)
4214 [ # # ]: 0 : IF (INU.EQ.2) RETURN
4215 : 0 : T2 = FNU + DBLE(FLOAT(KK-1))
4216 : 0 : CKR = T2*RZR
4217 : 0 : CKI = T2*RZI
4218 : 0 : KFLAG = 1
4219 : 0 : GO TO 250
4220 : : 290 CONTINUE
4221 : : !C-----------------------------------------------------------------------
4222 : : !C SCALE BY DEXP(Z), IFLAG = 1 CASES
4223 : : !C-----------------------------------------------------------------------
4224 [ # # ]: 0 : KODED = 2
4225 : : IFLAG = 1
4226 : : KFLAG = 2
4227 : 0 : GO TO 120
4228 : : !C-----------------------------------------------------------------------
4229 : : !C FNU=HALF ODD INTEGER CASE, DNU=-0.5
4230 : : !C-----------------------------------------------------------------------
4231 : : 300 CONTINUE
4232 : 0 : S1R = COEFR
4233 : 0 : S1I = COEFI
4234 : 0 : S2R = COEFR
4235 : 0 : S2I = COEFI
4236 : 0 : GO TO 210
4237 : : !C
4238 : : !C
4239 : : 310 CONTINUE
4240 : 0 : NZ=-2
4241 : 0 : RETURN
4242 : : END SUBROUTINE ZBKNU
4243 : :
4244 : 0 : SUBROUTINE ZRATI(ZR, ZI, FNU, N, CYR, CYI, TOL)
4245 : : !C***BEGIN PROLOGUE ZRATI
4246 : : !C***REFER TO ZBESI,ZBESK,ZBESH
4247 : : !C
4248 : : !C ZRATI COMPUTES RATIOS OF I BESSEL FUNCTIONS BY BACKWARD
4249 : : !C RECURRENCE. THE STARTING INDEX IS DETERMINED BY FORWARD
4250 : : !C RECURRENCE AS DESCRIBED IN J. RES. OF NAT. BUR. OF STANDARDS-B,
4251 : : !C MATHEMATICAL SCIENCES, VOL 77B, P111-114, SEPTEMBER, 1973,
4252 : : !C BESSEL FUNCTIONS I AND J OF COMPLEX ARGUMENT AND INTEGER ORDER,
4253 : : !C BY D. J. SOOKNE.
4254 : : !C
4255 : : !C***ROUTINES CALLED AZABS,ZDIV
4256 : : !C***END PROLOGUE ZRATI
4257 : : !C COMPLEX Z,CY(1),CONE,CZERO,P1,P2,T1,RZ,PT,CDFNU
4258 : : DOUBLE PRECISION AK, AMAGZ, AP1, AP2, ARG, AZ, CDFNUI, CDFNUR, &
4259 : : & CONEI, CONER, CYI, CYR, CZEROI, CZEROR, DFNU, FDNU, FLAM, FNU, &
4260 : : & FNUP, PTI, PTR, P1I, P1R, P2I, P2R, RAK, RAP1, RHO, RT2, RZI, &
4261 : : & RZR, TEST, TEST1, TOL, TTI, TTR, T1I, T1R, ZI, ZR!, AZABS
4262 : : INTEGER I, ID, IDNU, INU, ITIME, K, KK, MAGZ, N
4263 : : DIMENSION CYR(N), CYI(N)
4264 : : DATA CZEROR,CZEROI,CONER,CONEI,RT2/ &
4265 : : & 0.0D0, 0.0D0, 1.0D0, 0.0D0, 1.41421356237309505D0 /
4266 : 0 : AZ = AZABS(ZR,ZI)
4267 : 0 : INU = INT(SNGL(FNU))
4268 : 0 : IDNU = INU + N - 1
4269 : 0 : MAGZ = INT(SNGL(AZ))
4270 : 0 : AMAGZ = DBLE(FLOAT(MAGZ+1))
4271 : 0 : FDNU = DBLE(FLOAT(IDNU))
4272 : 0 : FNUP = DMAX1(AMAGZ,FDNU)
4273 : 0 : ID = IDNU - MAGZ - 1
4274 : 0 : ITIME = 1
4275 : 0 : K = 1
4276 : 0 : PTR = 1.0D0/AZ
4277 : 0 : RZR = PTR*(ZR+ZR)*PTR
4278 : 0 : RZI = -PTR*(ZI+ZI)*PTR
4279 : 0 : T1R = RZR*FNUP
4280 : 0 : T1I = RZI*FNUP
4281 : 0 : P2R = -T1R
4282 : 0 : P2I = -T1I
4283 : 0 : P1R = CONER
4284 : 0 : P1I = CONEI
4285 : 0 : T1R = T1R + RZR
4286 : 0 : T1I = T1I + RZI
4287 : 0 : IF (ID.GT.0) ID = 0
4288 : 0 : AP2 = AZABS(P2R,P2I)
4289 : 0 : AP1 = AZABS(P1R,P1I)
4290 : : !C-----------------------------------------------------------------------
4291 : : !C THE OVERFLOW TEST ON K(FNU+I-1,Z) BEFORE THE CALL TO CBKNU
4292 : : !C GUARANTEES THAT P2 IS ON SCALE. SCALE TEST1 AND ALL SUBSEQUENT
4293 : : !C P2 VALUES BY AP1 TO ENSURE THAT AN OVERFLOW DOES NOT OCCUR
4294 : : !C PREMATURELY.
4295 : : !C-----------------------------------------------------------------------
4296 : 0 : ARG = (AP2+AP2)/(AP1*TOL)
4297 : 0 : TEST1 = DSQRT(ARG)
4298 : 0 : TEST = TEST1
4299 : 0 : RAP1 = 1.0D0/AP1
4300 : 0 : P1R = P1R*RAP1
4301 : 0 : P1I = P1I*RAP1
4302 : 0 : P2R = P2R*RAP1
4303 : 0 : P2I = P2I*RAP1
4304 : 0 : AP2 = AP2*RAP1
4305 : : 10 CONTINUE
4306 : 0 : K = K + 1
4307 : 0 : AP1 = AP2
4308 : 0 : PTR = P2R
4309 : 0 : PTI = P2I
4310 : 0 : P2R = P1R - (T1R*PTR-T1I*PTI)
4311 : 0 : P2I = P1I - (T1R*PTI+T1I*PTR)
4312 : 0 : P1R = PTR
4313 : 0 : P1I = PTI
4314 : 0 : T1R = T1R + RZR
4315 : 0 : T1I = T1I + RZI
4316 : 0 : AP2 = AZABS(P2R,P2I)
4317 [ # # ]: 0 : IF (AP1.LE.TEST) GO TO 10
4318 [ # # ]: 0 : IF (ITIME.EQ.2) GO TO 20
4319 : 0 : AK = AZABS(T1R,T1I)*0.5D0
4320 : 0 : FLAM = AK + DSQRT(AK*AK-1.0D0)
4321 : 0 : RHO = DMIN1(AP2/AP1,FLAM)
4322 : 0 : TEST = TEST1*DSQRT(RHO/(RHO*RHO-1.0D0))
4323 : 0 : ITIME = 2
4324 : 0 : GO TO 10
4325 : : 20 CONTINUE
4326 : 0 : KK = K + 1 - ID
4327 : 0 : AK = DBLE(FLOAT(KK))
4328 : 0 : T1R = AK
4329 : 0 : T1I = CZEROI
4330 : 0 : DFNU = FNU + DBLE(FLOAT(N-1))
4331 : 0 : P1R = 1.0D0/AP2
4332 : 0 : P1I = CZEROI
4333 : 0 : P2R = CZEROR
4334 : 0 : P2I = CZEROI
4335 [ # # ]: 0 : DO 30 I=1,KK
4336 : 0 : PTR = P1R
4337 : 0 : PTI = P1I
4338 : 0 : RAP1 = DFNU + T1R
4339 : 0 : TTR = RZR*RAP1
4340 : 0 : TTI = RZI*RAP1
4341 : 0 : P1R = (PTR*TTR-PTI*TTI) + P2R
4342 : 0 : P1I = (PTR*TTI+PTI*TTR) + P2I
4343 : 0 : P2R = PTR
4344 : 0 : P2I = PTI
4345 : 0 : T1R = T1R - CONER
4346 : 0 : 30 CONTINUE
4347 [ # # # # ]: 0 : IF (P1R.NE.CZEROR .OR. P1I.NE.CZEROI) GO TO 40
4348 : 0 : P1R = TOL
4349 : 0 : P1I = TOL
4350 : : 40 CONTINUE
4351 : 0 : CALL ZDIV(P2R, P2I, P1R, P1I, CYR(N), CYI(N))
4352 [ # # ]: 0 : IF (N.EQ.1) RETURN
4353 : 0 : K = N - 1
4354 : 0 : AK = DBLE(FLOAT(K))
4355 : 0 : T1R = AK
4356 : : T1I = CZEROI
4357 : 0 : CDFNUR = FNU*RZR
4358 : 0 : CDFNUI = FNU*RZI
4359 [ # # ]: 0 : DO 60 I=2,N
4360 : 0 : PTR = CDFNUR + (T1R*RZR-T1I*RZI) + CYR(K+1)
4361 : 0 : PTI = CDFNUI + (T1R*RZI+T1I*RZR) + CYI(K+1)
4362 : 0 : AK = AZABS(PTR,PTI)
4363 [ # # ]: 0 : IF (AK.NE.CZEROR) GO TO 50
4364 : 0 : PTR = TOL
4365 : 0 : PTI = TOL
4366 : 0 : AK = TOL*RT2
4367 : : 50 CONTINUE
4368 : 0 : RAK = CONER/AK
4369 : 0 : CYR(K) = RAK*PTR*RAK
4370 : 0 : CYI(K) = -RAK*PTI*RAK
4371 : 0 : T1R = T1R - CONER
4372 : 0 : K = K - 1
4373 : 0 : 60 CONTINUE
4374 : : RETURN
4375 : : END SUBROUTINE ZRATI
4376 : :
4377 : 0 : SUBROUTINE ZBUNI(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NUI, NLAST, &
4378 : : & FNUL, TOL, ELIM, ALIM)
4379 : : !C***BEGIN PROLOGUE ZBUNI
4380 : : !C***REFER TO ZBESI,ZBESK
4381 : : !C
4382 : : !C ZBUNI COMPUTES THE I BESSEL FUNCTION FOR LARGE CABS(Z).GT.
4383 : : !C FNUL AND FNU+N-1.LT.FNUL. THE ORDER IS INCREASED FROM
4384 : : !C FNU+N-1 GREATER THAN FNUL BY ADDING NUI AND COMPUTING
4385 : : !C ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR I(FNU,Z)
4386 : : !C ON IFORM=1 AND THE EXPANSION FOR J(FNU,Z) ON IFORM=2
4387 : : !C
4388 : : !C***ROUTINES CALLED ZUNI1,ZUNI2,AZABS,D1MACH
4389 : : !C***END PROLOGUE ZBUNI
4390 : : !C COMPLEX CSCL,CSCR,CY,RZ,ST,S1,S2,Y,Z
4391 : : DOUBLE PRECISION ALIM, AX, AY, CSCLR, CSCRR, CYI, CYR, DFNU, &
4392 : : & ELIM, FNU, FNUI, FNUL, GNU, RAZ, RZI, RZR, STI, STR, S1I, S1R, &
4393 : : & S2I, S2R, TOL, YI, YR, ZI, ZR, ASCLE, BRY, C1R, C1I, C1M!,AZABS &
4394 : : !& D1MACH
4395 : : INTEGER I, IFLAG, IFORM, K, KODE, N, NL, NLAST, NUI, NW, NZ
4396 : : DIMENSION YR(N), YI(N), CYR(2), CYI(2), BRY(3)
4397 : 0 : NZ = 0
4398 : 0 : AX = DABS(ZR)*1.7321D0
4399 : 0 : AY = DABS(ZI)
4400 : 0 : IFORM = 1
4401 [ # # ]: 0 : IF (AY.GT.AX) IFORM = 2
4402 [ # # ]: 0 : IF (NUI.EQ.0) GO TO 60
4403 : 0 : FNUI = DBLE(FLOAT(NUI))
4404 : 0 : DFNU = FNU + DBLE(FLOAT(N-1))
4405 : 0 : GNU = DFNU + FNUI
4406 [ # # ]: 0 : IF (IFORM.EQ.2) GO TO 10
4407 : : !C-----------------------------------------------------------------------
4408 : : !C ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
4409 : : !C -PI/3.LE.ARG(Z).LE.PI/3
4410 : : !C-----------------------------------------------------------------------
4411 : : CALL ZUNI1(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL, &
4412 : 0 : & ELIM, ALIM)
4413 : 0 : GO TO 20
4414 : : 10 CONTINUE
4415 : : !C-----------------------------------------------------------------------
4416 : : !C ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
4417 : : !C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
4418 : : !C AND HPI=PI/2
4419 : : !C-----------------------------------------------------------------------
4420 : : CALL ZUNI2(ZR, ZI, GNU, KODE, 2, CYR, CYI, NW, NLAST, FNUL, TOL, &
4421 : 0 : & ELIM, ALIM)
4422 : : 20 CONTINUE
4423 [ # # ]: 0 : IF (NW.LT.0) GO TO 50
4424 [ # # ]: 0 : IF (NW.NE.0) GO TO 90
4425 : 0 : STR = AZABS(CYR(1),CYI(1))
4426 : : !C----------------------------------------------------------------------
4427 : : !C SCALE BACKWARD RECURRENCE, BRY(3) IS DEFINED BUT NEVER USED
4428 : : !C----------------------------------------------------------------------
4429 : 0 : BRY(1)=1.0D+3*D1MACH(1)/TOL
4430 : 0 : BRY(2) = 1.0D0/BRY(1)
4431 : 0 : BRY(3) = BRY(2)
4432 : 0 : IFLAG = 2
4433 : 0 : ASCLE = BRY(2)
4434 : 0 : CSCLR = 1.0D0
4435 [ # # ]: 0 : IF (STR.GT.BRY(1)) GO TO 21
4436 : 0 : IFLAG = 1
4437 : 0 : ASCLE = BRY(1)
4438 : 0 : CSCLR = 1.0D0/TOL
4439 : 0 : GO TO 25
4440 : : 21 CONTINUE
4441 [ # # ]: 0 : IF (STR.LT.BRY(2)) GO TO 25
4442 : 0 : IFLAG = 3
4443 : 0 : ASCLE=BRY(3)
4444 : 0 : CSCLR = TOL
4445 : : 25 CONTINUE
4446 : 0 : CSCRR = 1.0D0/CSCLR
4447 : 0 : S1R = CYR(2)*CSCLR
4448 : 0 : S1I = CYI(2)*CSCLR
4449 : 0 : S2R = CYR(1)*CSCLR
4450 : 0 : S2I = CYI(1)*CSCLR
4451 : 0 : RAZ = 1.0D0/AZABS(ZR,ZI)
4452 : 0 : STR = ZR*RAZ
4453 : 0 : STI = -ZI*RAZ
4454 : 0 : RZR = (STR+STR)*RAZ
4455 : 0 : RZI = (STI+STI)*RAZ
4456 [ # # ]: 0 : DO 30 I=1,NUI
4457 : 0 : STR = S2R
4458 : 0 : STI = S2I
4459 : 0 : S2R = (DFNU+FNUI)*(RZR*STR-RZI*STI) + S1R
4460 : 0 : S2I = (DFNU+FNUI)*(RZR*STI+RZI*STR) + S1I
4461 : 0 : S1R = STR
4462 : 0 : S1I = STI
4463 : 0 : FNUI = FNUI - 1.0D0
4464 [ # # ]: 0 : IF (IFLAG.GE.3) GO TO 30
4465 : 0 : STR = S2R*CSCRR
4466 : 0 : STI = S2I*CSCRR
4467 : 0 : C1R = DABS(STR)
4468 : 0 : C1I = DABS(STI)
4469 : 0 : C1M = DMAX1(C1R,C1I)
4470 [ # # ]: 0 : IF (C1M.LE.ASCLE) GO TO 30
4471 : 0 : IFLAG = IFLAG+1
4472 : 0 : ASCLE = BRY(IFLAG)
4473 : 0 : S1R = S1R*CSCRR
4474 : 0 : S1I = S1I*CSCRR
4475 : 0 : S2R = STR
4476 : 0 : S2I = STI
4477 : 0 : CSCLR = CSCLR*TOL
4478 : 0 : CSCRR = 1.0D0/CSCLR
4479 : 0 : S1R = S1R*CSCLR
4480 : 0 : S1I = S1I*CSCLR
4481 : 0 : S2R = S2R*CSCLR
4482 : 0 : S2I = S2I*CSCLR
4483 : 0 : 30 CONTINUE
4484 : 0 : YR(N) = S2R*CSCRR
4485 : 0 : YI(N) = S2I*CSCRR
4486 [ # # ]: 0 : IF (N.EQ.1) RETURN
4487 : 0 : NL = N - 1
4488 : 0 : FNUI = DBLE(FLOAT(NL))
4489 : 0 : K = NL
4490 [ # # ]: 0 : DO 40 I=1,NL
4491 : 0 : STR = S2R
4492 : 0 : STI = S2I
4493 : 0 : S2R = (FNU+FNUI)*(RZR*STR-RZI*STI) + S1R
4494 : 0 : S2I = (FNU+FNUI)*(RZR*STI+RZI*STR) + S1I
4495 : 0 : S1R = STR
4496 : 0 : S1I = STI
4497 : 0 : STR = S2R*CSCRR
4498 : 0 : STI = S2I*CSCRR
4499 : 0 : YR(K) = STR
4500 : 0 : YI(K) = STI
4501 : 0 : FNUI = FNUI - 1.0D0
4502 : 0 : K = K - 1
4503 [ # # ]: 0 : IF (IFLAG.GE.3) GO TO 40
4504 : 0 : C1R = DABS(STR)
4505 : 0 : C1I = DABS(STI)
4506 : 0 : C1M = DMAX1(C1R,C1I)
4507 [ # # ]: 0 : IF (C1M.LE.ASCLE) GO TO 40
4508 : 0 : IFLAG = IFLAG+1
4509 : 0 : ASCLE = BRY(IFLAG)
4510 : 0 : S1R = S1R*CSCRR
4511 : 0 : S1I = S1I*CSCRR
4512 : 0 : S2R = STR
4513 : 0 : S2I = STI
4514 : 0 : CSCLR = CSCLR*TOL
4515 : 0 : CSCRR = 1.0D0/CSCLR
4516 : 0 : S1R = S1R*CSCLR
4517 : 0 : S1I = S1I*CSCLR
4518 : 0 : S2R = S2R*CSCLR
4519 : 0 : S2I = S2I*CSCLR
4520 : 0 : 40 CONTINUE
4521 : 0 : RETURN
4522 : : 50 CONTINUE
4523 : 0 : NZ = -1
4524 [ # # ]: 0 : IF(NW.EQ.(-2)) NZ=-2
4525 : 0 : RETURN
4526 : : 60 CONTINUE
4527 [ # # ]: 0 : IF (IFORM.EQ.2) GO TO 70
4528 : : !C-----------------------------------------------------------------------
4529 : : !C ASYMPTOTIC EXPANSION FOR I(FNU,Z) FOR LARGE FNU APPLIED IN
4530 : : !C -PI/3.LE.ARG(Z).LE.PI/3
4531 : : !C-----------------------------------------------------------------------
4532 : : CALL ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL, &
4533 : 0 : & ELIM, ALIM)
4534 : 0 : GO TO 80
4535 : : 70 CONTINUE
4536 : : !C-----------------------------------------------------------------------
4537 : : !C ASYMPTOTIC EXPANSION FOR J(FNU,Z*EXP(M*HPI)) FOR LARGE FNU
4538 : : !C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
4539 : : !C AND HPI=PI/2
4540 : : !C-----------------------------------------------------------------------
4541 : : CALL ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NW, NLAST, FNUL, TOL, &
4542 : 0 : & ELIM, ALIM)
4543 : : 80 CONTINUE
4544 [ # # ]: 0 : IF (NW.LT.0) GO TO 50
4545 : 0 : NZ = NW
4546 : 0 : RETURN
4547 : : 90 CONTINUE
4548 : 0 : NLAST = N
4549 : 0 : RETURN
4550 : : END SUBROUTINE ZBUNI
4551 : :
4552 : 0 : SUBROUTINE ZUNI1(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, &
4553 : : & TOL, ELIM, ALIM)
4554 : : !C***BEGIN PROLOGUE ZUNI1
4555 : : !C***REFER TO ZBESI,ZBESK
4556 : : !C
4557 : : !C ZUNI1 COMPUTES I(FNU,Z) BY MEANS OF THE UNIFORM ASYMPTOTIC
4558 : : !C EXPANSION FOR I(FNU,Z) IN -PI/3.LE.ARG Z.LE.PI/3.
4559 : : !C
4560 : : !C FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
4561 : : !C EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
4562 : : !C NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
4563 : : !C FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
4564 : : !C Y(I)=CZERO FOR I=NLAST+1,N
4565 : : !C
4566 : : !C***ROUTINES CALLED ZUCHK,ZUNIK,ZUOIK,D1MACH,AZABS
4567 : : !C***END PROLOGUE ZUNI1
4568 : : !C COMPLEX CFN,CONE,CRSC,CSCL,CSR,CSS,CWRK,CZERO,C1,C2,PHI,RZ,SUM,S1,
4569 : : !C *S2,Y,Z,ZETA1,ZETA2
4570 : : DOUBLE PRECISION ALIM, APHI, ASCLE, BRY, CONER, CRSC, &
4571 : : & CSCL, CSRR, CSSR, CWRKI, CWRKR, C1R, C2I, C2M, C2R, ELIM, FN, &
4572 : : & FNU, FNUL, PHII, PHIR, RAST, RS1, RZI, RZR, STI, STR, SUMI, &
4573 : : & SUMR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, &
4574 : : & ZETA1R, ZETA2I, ZETA2R, ZI, ZR, CYR, CYI!, D1MACH, AZABS
4575 : : INTEGER I, IFLAG, INIT, K, KODE, M, N, ND, NLAST, NN, NUF, NW, NZ
4576 : : DIMENSION BRY(3), YR(N), YI(N), CWRKR(16), CWRKI(16), CSSR(3), &
4577 : : & CSRR(3), CYR(2), CYI(2)
4578 : : DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
4579 : : !C
4580 : 0 : NZ = 0
4581 : 0 : ND = N
4582 : 0 : NLAST = 0
4583 : : !C-----------------------------------------------------------------------
4584 : : !C COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
4585 : : !C NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
4586 : : !C EXP(ALIM)=EXP(ELIM)*TOL
4587 : : !C-----------------------------------------------------------------------
4588 : 0 : CSCL = 1.0D0/TOL
4589 : 0 : CRSC = TOL
4590 : 0 : CSSR(1) = CSCL
4591 : 0 : CSSR(2) = CONER
4592 : 0 : CSSR(3) = CRSC
4593 : 0 : CSRR(1) = CRSC
4594 : 0 : CSRR(2) = CONER
4595 : 0 : CSRR(3) = CSCL
4596 : 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
4597 : : !C-----------------------------------------------------------------------
4598 : : !C CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
4599 : : !C-----------------------------------------------------------------------
4600 : 0 : FN = DMAX1(FNU,1.0D0)
4601 : 0 : INIT = 0
4602 : : CALL ZUNIK(ZR, ZI, FN, 1, 1, TOL, INIT, PHIR, PHII, ZETA1R, &
4603 : 0 : & ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
4604 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 10
4605 : 0 : STR = ZR + ZETA2R
4606 : 0 : STI = ZI + ZETA2I
4607 : 0 : RAST = FN/AZABS(STR,STI)
4608 : 0 : STR = STR*RAST*RAST
4609 : 0 : STI = -STI*RAST*RAST
4610 : 0 : S1R = -ZETA1R + STR
4611 : 0 : S1I = -ZETA1I + STI
4612 : 0 : GO TO 20
4613 : : 10 CONTINUE
4614 : 0 : S1R = -ZETA1R + ZETA2R
4615 : 0 : S1I = -ZETA1I + ZETA2I
4616 : : 20 CONTINUE
4617 : 0 : RS1 = S1R
4618 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 130
4619 : : 30 CONTINUE
4620 : 0 : NN = MIN0(2,ND)
4621 [ # # ]: 0 : DO 80 I=1,NN
4622 : 0 : FN = FNU + DBLE(FLOAT(ND-I))
4623 : 0 : INIT = 0
4624 : : CALL ZUNIK(ZR, ZI, FN, 1, 0, TOL, INIT, PHIR, PHII, ZETA1R, &
4625 : 0 : & ZETA1I, ZETA2R, ZETA2I, SUMR, SUMI, CWRKR, CWRKI)
4626 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 40
4627 : 0 : STR = ZR + ZETA2R
4628 : 0 : STI = ZI + ZETA2I
4629 : 0 : RAST = FN/AZABS(STR,STI)
4630 : 0 : STR = STR*RAST*RAST
4631 : 0 : STI = -STI*RAST*RAST
4632 : 0 : S1R = -ZETA1R + STR
4633 : 0 : S1I = -ZETA1I + STI + ZI
4634 : 0 : GO TO 50
4635 : : 40 CONTINUE
4636 : 0 : S1R = -ZETA1R + ZETA2R
4637 : 0 : S1I = -ZETA1I + ZETA2I
4638 : : 50 CONTINUE
4639 : : !C-----------------------------------------------------------------------
4640 : : !C TEST FOR UNDERFLOW AND OVERFLOW
4641 : : !C-----------------------------------------------------------------------
4642 : 0 : RS1 = S1R
4643 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 110
4644 [ # # ]: 0 : IF (I.EQ.1) IFLAG = 2
4645 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 60
4646 : : !C-----------------------------------------------------------------------
4647 : : !C REFINE TEST AND SCALE
4648 : : !C-----------------------------------------------------------------------
4649 : 0 : APHI = AZABS(PHIR,PHII)
4650 : 0 : RS1 = RS1 + DLOG(APHI)
4651 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 110
4652 [ # # ]: 0 : IF (I.EQ.1) IFLAG = 1
4653 [ # # ]: 0 : IF (RS1.LT.0.0D0) GO TO 60
4654 [ # # ]: 0 : IF (I.EQ.1) IFLAG = 3
4655 : : 60 CONTINUE
4656 : : !C-----------------------------------------------------------------------
4657 : : !C SCALE S1 IF CABS(S1).LT.ASCLE
4658 : : !C-----------------------------------------------------------------------
4659 : 0 : S2R = PHIR*SUMR - PHII*SUMI
4660 : 0 : S2I = PHIR*SUMI + PHII*SUMR
4661 : 0 : STR = DEXP(S1R)*CSSR(IFLAG)
4662 : 0 : S1R = STR*DCOS(S1I)
4663 : 0 : S1I = STR*DSIN(S1I)
4664 : 0 : STR = S2R*S1R - S2I*S1I
4665 : 0 : S2I = S2R*S1I + S2I*S1R
4666 : 0 : S2R = STR
4667 [ # # ]: 0 : IF (IFLAG.NE.1) GO TO 70
4668 : 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
4669 : : IF (NW.NE.0) GO TO 110
4670 : : 70 CONTINUE
4671 : 0 : CYR(I) = S2R
4672 : 0 : CYI(I) = S2I
4673 : 0 : M = ND - I + 1
4674 : 0 : YR(M) = S2R*CSRR(IFLAG)
4675 : 0 : YI(M) = S2I*CSRR(IFLAG)
4676 : 0 : 80 CONTINUE
4677 [ # # ]: 0 : IF (ND.LE.2) GO TO 100
4678 : 0 : RAST = 1.0D0/AZABS(ZR,ZI)
4679 : 0 : STR = ZR*RAST
4680 : 0 : STI = -ZI*RAST
4681 : 0 : RZR = (STR+STR)*RAST
4682 : 0 : RZI = (STI+STI)*RAST
4683 : 0 : BRY(2) = 1.0D0/BRY(1)
4684 : 0 : BRY(3) = D1MACH(2)
4685 : 0 : S1R = CYR(1)
4686 : 0 : S1I = CYI(1)
4687 : 0 : S2R = CYR(2)
4688 : 0 : S2I = CYI(2)
4689 : 0 : C1R = CSRR(IFLAG)
4690 : 0 : ASCLE = BRY(IFLAG)
4691 : 0 : K = ND - 2
4692 : 0 : FN = DBLE(FLOAT(K))
4693 [ # # ]: 0 : DO 90 I=3,ND
4694 : 0 : C2R = S2R
4695 : 0 : C2I = S2I
4696 : 0 : S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
4697 : 0 : S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
4698 : 0 : S1R = C2R
4699 : 0 : S1I = C2I
4700 : 0 : C2R = S2R*C1R
4701 : 0 : C2I = S2I*C1R
4702 : 0 : YR(K) = C2R
4703 : 0 : YI(K) = C2I
4704 : 0 : K = K - 1
4705 : 0 : FN = FN - 1.0D0
4706 [ # # ]: 0 : IF (IFLAG.GE.3) GO TO 90
4707 : 0 : STR = DABS(C2R)
4708 : 0 : STI = DABS(C2I)
4709 : 0 : C2M = DMAX1(STR,STI)
4710 [ # # ]: 0 : IF (C2M.LE.ASCLE) GO TO 90
4711 : 0 : IFLAG = IFLAG + 1
4712 : 0 : ASCLE = BRY(IFLAG)
4713 : 0 : S1R = S1R*C1R
4714 : 0 : S1I = S1I*C1R
4715 : 0 : S2R = C2R
4716 : 0 : S2I = C2I
4717 : 0 : S1R = S1R*CSSR(IFLAG)
4718 : 0 : S1I = S1I*CSSR(IFLAG)
4719 : 0 : S2R = S2R*CSSR(IFLAG)
4720 : 0 : S2I = S2I*CSSR(IFLAG)
4721 : 0 : C1R = CSRR(IFLAG)
4722 : 0 : 90 CONTINUE
4723 : : 100 CONTINUE
4724 : 0 : RETURN
4725 : : !C-----------------------------------------------------------------------
4726 : : !C SET UNDERFLOW AND UPDATE PARAMETERS
4727 : : !C-----------------------------------------------------------------------
4728 : : 110 CONTINUE
4729 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 120
4730 : 0 : YR(ND) = ZEROR
4731 : 0 : YI(ND) = ZEROI
4732 : 0 : NZ = NZ + 1
4733 : 0 : ND = ND - 1
4734 [ # # ]: 0 : IF (ND.EQ.0) GO TO 100
4735 : 0 : CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
4736 [ # # ]: 0 : IF (NUF.LT.0) GO TO 120
4737 : 0 : ND = ND - NUF
4738 : 0 : NZ = NZ + NUF
4739 [ # # ]: 0 : IF (ND.EQ.0) GO TO 100
4740 : 0 : FN = FNU + DBLE(FLOAT(ND-1))
4741 [ # # ]: 0 : IF (FN.GE.FNUL) GO TO 30
4742 : 0 : NLAST = ND
4743 : 0 : RETURN
4744 : : 120 CONTINUE
4745 : 0 : NZ = -1
4746 : 0 : RETURN
4747 : : 130 CONTINUE
4748 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 120
4749 : 0 : NZ = N
4750 [ # # ]: 0 : DO 140 I=1,N
4751 : 0 : YR(I) = ZEROR
4752 : 0 : YI(I) = ZEROI
4753 : 0 : 140 CONTINUE
4754 : : RETURN
4755 : : END SUBROUTINE ZUNI1
4756 : :
4757 : 0 : SUBROUTINE ZUNI2(ZR, ZI, FNU, KODE, N, YR, YI, NZ, NLAST, FNUL, &
4758 : : & TOL, ELIM, ALIM)
4759 : : !C***BEGIN PROLOGUE ZUNI2
4760 : : !C***REFER TO ZBESI,ZBESK
4761 : : !C
4762 : : !C ZUNI2 COMPUTES I(FNU,Z) IN THE RIGHT HALF PLANE BY MEANS OF
4763 : : !C UNIFORM ASYMPTOTIC EXPANSION FOR J(FNU,ZN) WHERE ZN IS Z*I
4764 : : !C OR -Z*I AND ZN IS IN THE RIGHT HALF PLANE ALSO.
4765 : : !C
4766 : : !C FNUL IS THE SMALLEST ORDER PERMITTED FOR THE ASYMPTOTIC
4767 : : !C EXPANSION. NLAST=0 MEANS ALL OF THE Y VALUES WERE SET.
4768 : : !C NLAST.NE.0 IS THE NUMBER LEFT TO BE COMPUTED BY ANOTHER
4769 : : !C FORMULA FOR ORDERS FNU TO FNU+NLAST-1 BECAUSE FNU+NLAST-1.LT.FNUL.
4770 : : !C Y(I)=CZERO FOR I=NLAST+1,N
4771 : : !C
4772 : : !C***ROUTINES CALLED ZAIRY,ZUCHK,ZUNHJ,ZUOIK,D1MACH,AZABS
4773 : : !C***END PROLOGUE ZUNI2
4774 : : !C COMPLEX AI,ARG,ASUM,BSUM,CFN,CI,CID,CIP,CONE,CRSC,CSCL,CSR,CSS,
4775 : : !C *CZERO,C1,C2,DAI,PHI,RZ,S1,S2,Y,Z,ZB,ZETA1,ZETA2,ZN
4776 : : DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGI, &
4777 : : & ARGR, ASCLE, ASUMI, ASUMR, BRY, BSUMI, BSUMR, CIDI, CIPI, CIPR, &
4778 : : & CONER, CRSC, CSCL, CSRR, CSSR, C1R, C2I, C2M, C2R, DAII, &
4779 : : & DAIR, ELIM, FN, FNU, FNUL, HPI, PHII, PHIR, RAST, RAZ, RS1, RZI, &
4780 : : & RZR, STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, ZBI, ZBR, ZEROI, &
4781 : : & ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZI, ZNI, ZNR, ZR, CYR, &
4782 : : & CYI, CAR, SAR !D1MACH, AZABS
4783 : : INTEGER I, IFLAG, IN, INU, J, K, KODE, N, NAI, ND, NDAI, NLAST, &
4784 : : & NN, NUF, NW, NZ, IDUM
4785 : : DIMENSION BRY(3), YR(N), YI(N), CIPR(4), CIPI(4), CSSR(3), &
4786 : : & CSRR(3), CYR(2), CYI(2)
4787 : : DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
4788 : : DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4), &
4789 : : & CIPI(4)/ 1.0D0,0.0D0, 0.0D0,1.0D0, -1.0D0,0.0D0, 0.0D0,-1.0D0/
4790 : : DATA HPI, AIC / &
4791 : : & 1.57079632679489662D+00, 1.265512123484645396D+00/
4792 : : !C
4793 : 0 : NZ = 0
4794 : 0 : ND = N
4795 : 0 : NLAST = 0
4796 : : !C-----------------------------------------------------------------------
4797 : : !C COMPUTED VALUES WITH EXPONENTS BETWEEN ALIM AND ELIM IN MAG-
4798 : : !C NITUDE ARE SCALED TO KEEP INTERMEDIATE ARITHMETIC ON SCALE,
4799 : : !C EXP(ALIM)=EXP(ELIM)*TOL
4800 : : !C-----------------------------------------------------------------------
4801 : 0 : CSCL = 1.0D0/TOL
4802 : 0 : CRSC = TOL
4803 : 0 : CSSR(1) = CSCL
4804 : 0 : CSSR(2) = CONER
4805 : 0 : CSSR(3) = CRSC
4806 : 0 : CSRR(1) = CRSC
4807 : 0 : CSRR(2) = CONER
4808 : 0 : CSRR(3) = CSCL
4809 : 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
4810 : : !C-----------------------------------------------------------------------
4811 : : !C ZN IS IN THE RIGHT HALF PLANE AFTER ROTATION BY CI OR -CI
4812 : : !C-----------------------------------------------------------------------
4813 : 0 : ZNR = ZI
4814 : 0 : ZNI = -ZR
4815 : 0 : ZBR = ZR
4816 : 0 : ZBI = ZI
4817 : 0 : CIDI = -CONER
4818 : 0 : INU = INT(SNGL(FNU))
4819 : 0 : ANG = HPI*(FNU-DBLE(FLOAT(INU)))
4820 : 0 : C2R = DCOS(ANG)
4821 : 0 : C2I = DSIN(ANG)
4822 : 0 : CAR = C2R
4823 : 0 : SAR = C2I
4824 : 0 : IN = INU + N - 1
4825 : 0 : IN = MOD(IN,4) + 1
4826 : 0 : STR = C2R*CIPR(IN) - C2I*CIPI(IN)
4827 : 0 : C2I = C2R*CIPI(IN) + C2I*CIPR(IN)
4828 : 0 : C2R = STR
4829 [ # # ]: 0 : IF (ZI.GT.0.0D0) GO TO 10
4830 : 0 : ZNR = -ZNR
4831 : 0 : ZBI = -ZBI
4832 : 0 : CIDI = -CIDI
4833 : 0 : C2I = -C2I
4834 : : 10 CONTINUE
4835 : : !C-----------------------------------------------------------------------
4836 : : !C CHECK FOR UNDERFLOW AND OVERFLOW ON FIRST MEMBER
4837 : : !C-----------------------------------------------------------------------
4838 : 0 : FN = DMAX1(FNU,1.0D0)
4839 : : CALL ZUNHJ(ZNR, ZNI, FN, 1, TOL, PHIR, PHII, ARGR, ARGI, ZETA1R, &
4840 : 0 : & ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
4841 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 20
4842 : 0 : STR = ZBR + ZETA2R
4843 : 0 : STI = ZBI + ZETA2I
4844 : 0 : RAST = FN/AZABS(STR,STI)
4845 : 0 : STR = STR*RAST*RAST
4846 : 0 : STI = -STI*RAST*RAST
4847 : 0 : S1R = -ZETA1R + STR
4848 : 0 : S1I = -ZETA1I + STI
4849 : 0 : GO TO 30
4850 : : 20 CONTINUE
4851 : 0 : S1R = -ZETA1R + ZETA2R
4852 : 0 : S1I = -ZETA1I + ZETA2I
4853 : : 30 CONTINUE
4854 : 0 : RS1 = S1R
4855 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 150
4856 : : 40 CONTINUE
4857 : 0 : NN = MIN0(2,ND)
4858 [ # # ]: 0 : DO 90 I=1,NN
4859 : 0 : FN = FNU + DBLE(FLOAT(ND-I))
4860 : : CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR, PHII, ARGR, ARGI, &
4861 : 0 : & ZETA1R, ZETA1I, ZETA2R, ZETA2I, ASUMR, ASUMI, BSUMR, BSUMI)
4862 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 50
4863 : 0 : STR = ZBR + ZETA2R
4864 : 0 : STI = ZBI + ZETA2I
4865 : 0 : RAST = FN/AZABS(STR,STI)
4866 : 0 : STR = STR*RAST*RAST
4867 : 0 : STI = -STI*RAST*RAST
4868 : 0 : S1R = -ZETA1R + STR
4869 : 0 : S1I = -ZETA1I + STI + DABS(ZI)
4870 : 0 : GO TO 60
4871 : : 50 CONTINUE
4872 : 0 : S1R = -ZETA1R + ZETA2R
4873 : 0 : S1I = -ZETA1I + ZETA2I
4874 : : 60 CONTINUE
4875 : : !C-----------------------------------------------------------------------
4876 : : !C TEST FOR UNDERFLOW AND OVERFLOW
4877 : : !C-----------------------------------------------------------------------
4878 : 0 : RS1 = S1R
4879 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 120
4880 [ # # ]: 0 : IF (I.EQ.1) IFLAG = 2
4881 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 70
4882 : : !C-----------------------------------------------------------------------
4883 : : !C REFINE TEST AND SCALE
4884 : : !C-----------------------------------------------------------------------
4885 : : !C-----------------------------------------------------------------------
4886 : 0 : APHI = AZABS(PHIR,PHII)
4887 : 0 : AARG = AZABS(ARGR,ARGI)
4888 : 0 : RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
4889 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 120
4890 [ # # ]: 0 : IF (I.EQ.1) IFLAG = 1
4891 [ # # ]: 0 : IF (RS1.LT.0.0D0) GO TO 70
4892 [ # # ]: 0 : IF (I.EQ.1) IFLAG = 3
4893 : : 70 CONTINUE
4894 : : !C-----------------------------------------------------------------------
4895 : : !C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
4896 : : !C EXPONENT EXTREMES
4897 : : !C-----------------------------------------------------------------------
4898 : 0 : CALL ZAIRY(ARGR, ARGI, 0, 2, AIR, AII, NAI, IDUM)
4899 : 0 : CALL ZAIRY(ARGR, ARGI, 1, 2, DAIR, DAII, NDAI, IDUM)
4900 : 0 : STR = DAIR*BSUMR - DAII*BSUMI
4901 : 0 : STI = DAIR*BSUMI + DAII*BSUMR
4902 : 0 : STR = STR + (AIR*ASUMR-AII*ASUMI)
4903 : 0 : STI = STI + (AIR*ASUMI+AII*ASUMR)
4904 : 0 : S2R = PHIR*STR - PHII*STI
4905 : 0 : S2I = PHIR*STI + PHII*STR
4906 : 0 : STR = DEXP(S1R)*CSSR(IFLAG)
4907 : 0 : S1R = STR*DCOS(S1I)
4908 : 0 : S1I = STR*DSIN(S1I)
4909 : 0 : STR = S2R*S1R - S2I*S1I
4910 : 0 : S2I = S2R*S1I + S2I*S1R
4911 : 0 : S2R = STR
4912 [ # # ]: 0 : IF (IFLAG.NE.1) GO TO 80
4913 : 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
4914 : : IF (NW.NE.0) GO TO 120
4915 : : 80 CONTINUE
4916 [ # # ]: 0 : IF (ZI.LE.0.0D0) S2I = -S2I
4917 : 0 : STR = S2R*C2R - S2I*C2I
4918 : 0 : S2I = S2R*C2I + S2I*C2R
4919 : 0 : S2R = STR
4920 : 0 : CYR(I) = S2R
4921 : 0 : CYI(I) = S2I
4922 : 0 : J = ND - I + 1
4923 : 0 : YR(J) = S2R*CSRR(IFLAG)
4924 : 0 : YI(J) = S2I*CSRR(IFLAG)
4925 : 0 : STR = -C2I*CIDI
4926 : 0 : C2I = C2R*CIDI
4927 : 0 : C2R = STR
4928 : 0 : 90 CONTINUE
4929 [ # # ]: 0 : IF (ND.LE.2) GO TO 110
4930 : 0 : RAZ = 1.0D0/AZABS(ZR,ZI)
4931 : 0 : STR = ZR*RAZ
4932 : 0 : STI = -ZI*RAZ
4933 : 0 : RZR = (STR+STR)*RAZ
4934 : 0 : RZI = (STI+STI)*RAZ
4935 : 0 : BRY(2) = 1.0D0/BRY(1)
4936 : 0 : BRY(3) = D1MACH(2)
4937 : 0 : S1R = CYR(1)
4938 : 0 : S1I = CYI(1)
4939 : 0 : S2R = CYR(2)
4940 : 0 : S2I = CYI(2)
4941 : 0 : C1R = CSRR(IFLAG)
4942 : 0 : ASCLE = BRY(IFLAG)
4943 : 0 : K = ND - 2
4944 : 0 : FN = DBLE(FLOAT(K))
4945 [ # # ]: 0 : DO 100 I=3,ND
4946 : 0 : C2R = S2R
4947 : 0 : C2I = S2I
4948 : 0 : S2R = S1R + (FNU+FN)*(RZR*C2R-RZI*C2I)
4949 : 0 : S2I = S1I + (FNU+FN)*(RZR*C2I+RZI*C2R)
4950 : 0 : S1R = C2R
4951 : 0 : S1I = C2I
4952 : 0 : C2R = S2R*C1R
4953 : 0 : C2I = S2I*C1R
4954 : 0 : YR(K) = C2R
4955 : 0 : YI(K) = C2I
4956 : 0 : K = K - 1
4957 : 0 : FN = FN - 1.0D0
4958 [ # # ]: 0 : IF (IFLAG.GE.3) GO TO 100
4959 : 0 : STR = DABS(C2R)
4960 : 0 : STI = DABS(C2I)
4961 : 0 : C2M = DMAX1(STR,STI)
4962 [ # # ]: 0 : IF (C2M.LE.ASCLE) GO TO 100
4963 : 0 : IFLAG = IFLAG + 1
4964 : 0 : ASCLE = BRY(IFLAG)
4965 : 0 : S1R = S1R*C1R
4966 : 0 : S1I = S1I*C1R
4967 : 0 : S2R = C2R
4968 : 0 : S2I = C2I
4969 : 0 : S1R = S1R*CSSR(IFLAG)
4970 : 0 : S1I = S1I*CSSR(IFLAG)
4971 : 0 : S2R = S2R*CSSR(IFLAG)
4972 : 0 : S2I = S2I*CSSR(IFLAG)
4973 : 0 : C1R = CSRR(IFLAG)
4974 : 0 : 100 CONTINUE
4975 : : 110 CONTINUE
4976 : 0 : RETURN
4977 : : 120 CONTINUE
4978 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 140
4979 : : !C-----------------------------------------------------------------------
4980 : : !C SET UNDERFLOW AND UPDATE PARAMETERS
4981 : : !C-----------------------------------------------------------------------
4982 : 0 : YR(ND) = ZEROR
4983 : 0 : YI(ND) = ZEROI
4984 : 0 : NZ = NZ + 1
4985 : 0 : ND = ND - 1
4986 [ # # ]: 0 : IF (ND.EQ.0) GO TO 110
4987 : 0 : CALL ZUOIK(ZR, ZI, FNU, KODE, 1, ND, YR, YI, NUF, TOL, ELIM, ALIM)
4988 [ # # ]: 0 : IF (NUF.LT.0) GO TO 140
4989 : 0 : ND = ND - NUF
4990 : 0 : NZ = NZ + NUF
4991 [ # # ]: 0 : IF (ND.EQ.0) GO TO 110
4992 : 0 : FN = FNU + DBLE(FLOAT(ND-1))
4993 [ # # ]: 0 : IF (FN.LT.FNUL) GO TO 130
4994 : : !C FN = CIDI
4995 : : !C J = NUF + 1
4996 : : !C K = MOD(J,4) + 1
4997 : : !C S1R = CIPR(K)
4998 : : !C S1I = CIPI(K)
4999 : : !C IF (FN.LT.0.0D0) S1I = -S1I
5000 : : !C STR = C2R*S1R - C2I*S1I
5001 : : !C C2I = C2R*S1I + C2I*S1R
5002 : : !C C2R = STR
5003 : 0 : IN = INU + ND - 1
5004 : 0 : IN = MOD(IN,4) + 1
5005 : 0 : C2R = CAR*CIPR(IN) - SAR*CIPI(IN)
5006 : 0 : C2I = CAR*CIPI(IN) + SAR*CIPR(IN)
5007 [ # # ]: 0 : IF (ZI.LE.0.0D0) C2I = -C2I
5008 : 0 : GO TO 40
5009 : : 130 CONTINUE
5010 : 0 : NLAST = ND
5011 : 0 : RETURN
5012 : : 140 CONTINUE
5013 : 0 : NZ = -1
5014 : 0 : RETURN
5015 : : 150 CONTINUE
5016 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 140
5017 : 0 : NZ = N
5018 [ # # ]: 0 : DO 160 I=1,N
5019 : 0 : YR(I) = ZEROR
5020 : 0 : YI(I) = ZEROI
5021 : 0 : 160 CONTINUE
5022 : : RETURN
5023 : : END SUBROUTINE ZUNI2
5024 : :
5025 : 0 : SUBROUTINE ZAIRY(ZR, ZI, ID, KODE, AIR, AII, NZ, IERR)
5026 : : !C***BEGIN PROLOGUE ZAIRY
5027 : : !C***DATE WRITTEN 830501 (YYMMDD)
5028 : : !C***REVISION DATE 890801 (YYMMDD)
5029 : : !C***CATEGORY NO. B5K
5030 : : !C***KEYWORDS AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
5031 : : !C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
5032 : : !C***PURPOSE TO COMPUTE AIRY FUNCTIONS AI(Z) AND DAI(Z) FOR COMPLEX Z
5033 : : !C***DESCRIPTION
5034 : : !C
5035 : : !C ***A DOUBLE PRECISION ROUTINE***
5036 : : !C ON KODE=1, ZAIRY COMPUTES THE COMPLEX AIRY FUNCTION AI(Z) OR
5037 : : !C ITS DERIVATIVE DAI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
5038 : : !C KODE=2, A SCALING OPTION CEXP(ZTA)*AI(Z) OR CEXP(ZTA)*
5039 : : !C DAI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL DECAY IN
5040 : : !C -PI/3.LT.ARG(Z).LT.PI/3 AND THE EXPONENTIAL GROWTH IN
5041 : : !C PI/3.LT.ABS(ARG(Z)).LT.PI WHERE ZTA=(2/3)*Z*CSQRT(Z).
5042 : : !C
5043 : : !C WHILE THE AIRY FUNCTIONS AI(Z) AND DAI(Z)/DZ ARE ANALYTIC IN
5044 : : !C THE WHOLE Z PLANE, THE CORRESPONDING SCALED FUNCTIONS DEFINED
5045 : : !C FOR KODE=2 HAVE A CUT ALONG THE NEGATIVE REAL AXIS.
5046 : : !C DEFINITIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
5047 : : !C MATHEMATICAL FUNCTIONS (REF. 1).
5048 : : !C
5049 : : !C INPUT ZR,ZI ARE DOUBLE PRECISION
5050 : : !C ZR,ZI - Z=CMPLX(ZR,ZI)
5051 : : !C ID - ORDER OF DERIVATIVE, ID=0 OR ID=1
5052 : : !C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
5053 : : !C KODE= 1 RETURNS
5054 : : !C AI=AI(Z) ON ID=0 OR
5055 : : !C AI=DAI(Z)/DZ ON ID=1
5056 : : !C = 2 RETURNS
5057 : : !C AI=CEXP(ZTA)*AI(Z) ON ID=0 OR
5058 : : !C AI=CEXP(ZTA)*DAI(Z)/DZ ON ID=1 WHERE
5059 : : !C ZTA=(2/3)*Z*CSQRT(Z)
5060 : : !C
5061 : : !C OUTPUT AIR,AII ARE DOUBLE PRECISION
5062 : : !C AIR,AII- COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
5063 : : !C KODE
5064 : : !C NZ - UNDERFLOW INDICATOR
5065 : : !C NZ= 0 , NORMAL RETURN
5066 : : !C NZ= 1 , AI=CMPLX(0.0D0,0.0D0) DUE TO UNDERFLOW IN
5067 : : !C -PI/3.LT.ARG(Z).LT.PI/3 ON KODE=1
5068 : : !C IERR - ERROR FLAG
5069 : : !C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
5070 : : !C IERR=1, INPUT ERROR - NO COMPUTATION
5071 : : !C IERR=2, OVERFLOW - NO COMPUTATION, REAL(ZTA)
5072 : : !C TOO LARGE ON KODE=1
5073 : : !C IERR=3, CABS(Z) LARGE - COMPUTATION COMPLETED
5074 : : !C LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
5075 : : !C PRODUCE LESS THAN HALF OF MACHINE ACCURACY
5076 : : !C IERR=4, CABS(Z) TOO LARGE - NO COMPUTATION
5077 : : !C COMPLETE LOSS OF ACCURACY BY ARGUMENT
5078 : : !C REDUCTION
5079 : : !C IERR=5, ERROR - NO COMPUTATION,
5080 : : !C ALGORITHM TERMINATION CONDITION NOT MET
5081 : : !C
5082 : : !C***LONG DESCRIPTION
5083 : : !C
5084 : : !C AI AND DAI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE K BESSEL
5085 : : !C FUNCTIONS BY
5086 : : !C
5087 : : !C AI(Z)=C*SQRT(Z)*K(1/3,ZTA) , DAI(Z)=-C*Z*K(2/3,ZTA)
5088 : : !C C=1.0/(PI*SQRT(3.0))
5089 : : !C ZTA=(2/3)*Z**(3/2)
5090 : : !C
5091 : : !C WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
5092 : : !C
5093 : : !C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
5094 : : !C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
5095 : : !C OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
5096 : : !C THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
5097 : : !C THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
5098 : : !C FLAG IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
5099 : : !C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
5100 : : !C ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
5101 : : !C ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
5102 : : !C FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
5103 : : !C LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
5104 : : !C MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
5105 : : !C AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
5106 : : !C PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
5107 : : !C PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
5108 : : !C ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
5109 : : !C NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
5110 : : !C DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
5111 : : !C EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
5112 : : !C NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
5113 : : !C PRECISION ARITHMETIC. SIMILAR CONSIDERATIONS HOLD FOR OTHER
5114 : : !C MACHINES.
5115 : : !C
5116 : : !C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
5117 : : !C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
5118 : : !C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
5119 : : !C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
5120 : : !C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
5121 : : !C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
5122 : : !C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
5123 : : !C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
5124 : : !C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
5125 : : !C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
5126 : : !C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
5127 : : !C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
5128 : : !C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
5129 : : !C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
5130 : : !C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
5131 : : !C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
5132 : : !C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
5133 : : !C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
5134 : : !C OR -PI/2+P.
5135 : : !C
5136 : : !C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
5137 : : !C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
5138 : : !C COMMERCE, 1955.
5139 : : !C
5140 : : !C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
5141 : : !C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
5142 : : !C
5143 : : !C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
5144 : : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
5145 : : !C 1018, MAY, 1985
5146 : : !C
5147 : : !C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
5148 : : !C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
5149 : : !C MATH. SOFTWARE, 1986
5150 : : !C
5151 : : !C***ROUTINES CALLED ZACAI,ZBKNU,AZEXP,AZSQRT,I1MACH,D1MACH
5152 : : !C***END PROLOGUE ZAIRY
5153 : : !C COMPLEX AI,CONE,CSQ,CY,S1,S2,TRM1,TRM2,Z,ZTA,Z3
5154 : : DOUBLE PRECISION AA, AD, AII, AIR, AK, ALIM, ATRM, AZ, AZ3, BK, &
5155 : : & CC, CK, COEF, CONEI, CONER, CSQI, CSQR, CYI, CYR, C1, C2, DIG, &
5156 : : & DK, D1, D2, ELIM, FID, FNU, PTR, RL, R1M5, SFAC, STI, STR, &
5157 : : & S1I, S1R, S2I, S2R, TOL, TRM1I, TRM1R, TRM2I, TRM2R, TTH, ZEROI, &
5158 : : & ZEROR, ZI, ZR, ZTAI, ZTAR, Z3I, Z3R, BB, ALAZ ! D1MACH, AZABS
5159 : : INTEGER ID, IERR, IFLAG, K, KODE, K1, K2, MR, NN, NZ!, I1MACH
5160 : : DIMENSION CYR(1), CYI(1)
5161 : : DATA TTH, C1, C2, COEF /6.66666666666666667D-01, &
5162 : : & 3.55028053887817240D-01,2.58819403792806799D-01, &
5163 : : & 1.83776298473930683D-01/
5164 : : DATA ZEROR, ZEROI, CONER, CONEI /0.0D0,0.0D0,1.0D0,0.0D0/
5165 : : !C***FIRST EXECUTABLE STATEMENT ZAIRY
5166 : 0 : IERR = 0
5167 : 0 : NZ=0
5168 [ # # ]: 0 : IF (ID.LT.0 .OR. ID.GT.1) IERR=1
5169 [ # # ]: 0 : IF (KODE.LT.1 .OR. KODE.GT.2) IERR=1
5170 [ # # ]: 0 : IF (IERR.NE.0) RETURN
5171 : 0 : AZ = AZABS(ZR,ZI)
5172 : 0 : TOL = DMAX1(D1MACH(4),1.0D-18)
5173 : 0 : FID = DBLE(FLOAT(ID))
5174 [ # # ]: 0 : IF (AZ.GT.1.0D0) GO TO 70
5175 : : !C-----------------------------------------------------------------------
5176 : : !C POWER SERIES FOR CABS(Z).LE.1.
5177 : : !C-----------------------------------------------------------------------
5178 : 0 : S1R = CONER
5179 : 0 : S1I = CONEI
5180 : 0 : S2R = CONER
5181 : 0 : S2I = CONEI
5182 [ # # ]: 0 : IF (AZ.LT.TOL) GO TO 170
5183 : 0 : AA = AZ*AZ
5184 [ # # ]: 0 : IF (AA.LT.TOL/AZ) GO TO 40
5185 : 0 : TRM1R = CONER
5186 : 0 : TRM1I = CONEI
5187 : 0 : TRM2R = CONER
5188 : 0 : TRM2I = CONEI
5189 : 0 : ATRM = 1.0D0
5190 : 0 : STR = ZR*ZR - ZI*ZI
5191 : 0 : STI = ZR*ZI + ZI*ZR
5192 : 0 : Z3R = STR*ZR - STI*ZI
5193 : 0 : Z3I = STR*ZI + STI*ZR
5194 : 0 : AZ3 = AZ*AA
5195 : 0 : AK = 2.0D0 + FID
5196 : 0 : BK = 3.0D0 - FID - FID
5197 : 0 : CK = 4.0D0 - FID
5198 : 0 : DK = 3.0D0 + FID + FID
5199 : 0 : D1 = AK*DK
5200 : 0 : D2 = BK*CK
5201 : 0 : AD = DMIN1(D1,D2)
5202 : 0 : AK = 24.0D0 + 9.0D0*FID
5203 : 0 : BK = 30.0D0 - 9.0D0*FID
5204 [ # # ]: 0 : DO 30 K=1,25
5205 : 0 : STR = (TRM1R*Z3R-TRM1I*Z3I)/D1
5206 : 0 : TRM1I = (TRM1R*Z3I+TRM1I*Z3R)/D1
5207 : 0 : TRM1R = STR
5208 : 0 : S1R = S1R + TRM1R
5209 : 0 : S1I = S1I + TRM1I
5210 : 0 : STR = (TRM2R*Z3R-TRM2I*Z3I)/D2
5211 : 0 : TRM2I = (TRM2R*Z3I+TRM2I*Z3R)/D2
5212 : 0 : TRM2R = STR
5213 : 0 : S2R = S2R + TRM2R
5214 : 0 : S2I = S2I + TRM2I
5215 : 0 : ATRM = ATRM*AZ3/AD
5216 : 0 : D1 = D1 + AK
5217 : 0 : D2 = D2 + BK
5218 : 0 : AD = DMIN1(D1,D2)
5219 [ # # ]: 0 : IF (ATRM.LT.TOL*AD) GO TO 40
5220 : 0 : AK = AK + 18.0D0
5221 : 0 : BK = BK + 18.0D0
5222 : 0 : 30 CONTINUE
5223 : : 40 CONTINUE
5224 [ # # ]: 0 : IF (ID.EQ.1) GO TO 50
5225 : 0 : AIR = S1R*C1 - C2*(ZR*S2R-ZI*S2I)
5226 : 0 : AII = S1I*C1 - C2*(ZR*S2I+ZI*S2R)
5227 [ # # ]: 0 : IF (KODE.EQ.1) RETURN
5228 : 0 : CALL AZSQRT(ZR, ZI, STR, STI)
5229 : 0 : ZTAR = TTH*(ZR*STR-ZI*STI)
5230 : 0 : ZTAI = TTH*(ZR*STI+ZI*STR)
5231 : 0 : CALL AZEXP(ZTAR, ZTAI, STR, STI)
5232 : 0 : PTR = AIR*STR - AII*STI
5233 : 0 : AII = AIR*STI + AII*STR
5234 : 0 : AIR = PTR
5235 : 0 : RETURN
5236 : : 50 CONTINUE
5237 : 0 : AIR = -S2R*C2
5238 : 0 : AII = -S2I*C2
5239 [ # # ]: 0 : IF (AZ.LE.TOL) GO TO 60
5240 : 0 : STR = ZR*S1R - ZI*S1I
5241 : 0 : STI = ZR*S1I + ZI*S1R
5242 : 0 : CC = C1/(1.0D0+FID)
5243 : 0 : AIR = AIR + CC*(STR*ZR-STI*ZI)
5244 : 0 : AII = AII + CC*(STR*ZI+STI*ZR)
5245 : : 60 CONTINUE
5246 [ # # ]: 0 : IF (KODE.EQ.1) RETURN
5247 : 0 : CALL AZSQRT(ZR, ZI, STR, STI)
5248 : 0 : ZTAR = TTH*(ZR*STR-ZI*STI)
5249 : 0 : ZTAI = TTH*(ZR*STI+ZI*STR)
5250 : 0 : CALL AZEXP(ZTAR, ZTAI, STR, STI)
5251 : 0 : PTR = STR*AIR - STI*AII
5252 : 0 : AII = STR*AII + STI*AIR
5253 : 0 : AIR = PTR
5254 : 0 : RETURN
5255 : : !C-----------------------------------------------------------------------
5256 : : !C CASE FOR CABS(Z).GT.1.0
5257 : : !C-----------------------------------------------------------------------
5258 : : 70 CONTINUE
5259 : 0 : FNU = (1.0D0+FID)/3.0D0
5260 : : !C-----------------------------------------------------------------------
5261 : : !C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
5262 : : !C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0D-18.
5263 : : !C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
5264 : : !C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
5265 : : !C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
5266 : : !C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
5267 : : !C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
5268 : : !C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
5269 : : !C-----------------------------------------------------------------------
5270 : 0 : K1 = I1MACH(15)
5271 : 0 : K2 = I1MACH(16)
5272 : 0 : R1M5 = D1MACH(5)
5273 : 0 : K = MIN0(IABS(K1),IABS(K2))
5274 : 0 : ELIM = 2.303D0*(DBLE(FLOAT(K))*R1M5-3.0D0)
5275 : 0 : K1 = I1MACH(14) - 1
5276 : 0 : AA = R1M5*DBLE(FLOAT(K1))
5277 : 0 : DIG = DMIN1(AA,18.0D0)
5278 : 0 : AA = AA*2.303D0
5279 : 0 : ALIM = ELIM + DMAX1(-AA,-41.45D0)
5280 : 0 : RL = 1.2D0*DIG + 3.0D0
5281 : 0 : ALAZ = DLOG(AZ)
5282 : : !C--------------------------------------------------------------------------
5283 : : !C TEST FOR PROPER RANGE
5284 : : !C-----------------------------------------------------------------------
5285 : 0 : AA=0.5D0/TOL
5286 : 0 : BB=DBLE(FLOAT(I1MACH(9)))*0.5D0
5287 : 0 : AA=DMIN1(AA,BB)
5288 : 0 : AA=AA**TTH
5289 [ # # ]: 0 : IF (AZ.GT.AA) GO TO 260
5290 : 0 : AA=DSQRT(AA)
5291 [ # # ]: 0 : IF (AZ.GT.AA) IERR=3
5292 : 0 : CALL AZSQRT(ZR, ZI, CSQR, CSQI)
5293 : 0 : ZTAR = TTH*(ZR*CSQR-ZI*CSQI)
5294 : 0 : ZTAI = TTH*(ZR*CSQI+ZI*CSQR)
5295 : : !C-----------------------------------------------------------------------
5296 : : !C RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
5297 : : !C-----------------------------------------------------------------------
5298 : 0 : IFLAG = 0
5299 : 0 : SFAC = 1.0D0
5300 : 0 : AK = ZTAI
5301 [ # # ]: 0 : IF (ZR.GE.0.0D0) GO TO 80
5302 : 0 : BK = ZTAR
5303 : 0 : CK = -DABS(BK)
5304 : 0 : ZTAR = CK
5305 : 0 : ZTAI = AK
5306 : : 80 CONTINUE
5307 [ # # ]: 0 : IF (ZI.NE.0.0D0) GO TO 90
5308 [ # # ]: 0 : IF (ZR.GT.0.0D0) GO TO 90
5309 : 0 : ZTAR = 0.0D0
5310 : 0 : ZTAI = AK
5311 : : 90 CONTINUE
5312 : 0 : AA = ZTAR
5313 [ # # # # ]: 0 : IF (AA.GE.0.0D0 .AND. ZR.GT.0.0D0) GO TO 110
5314 [ # # ]: 0 : IF (KODE.EQ.2) GO TO 100
5315 : : !C-----------------------------------------------------------------------
5316 : : !C OVERFLOW TEST
5317 : : !C-----------------------------------------------------------------------
5318 [ # # ]: 0 : IF (AA.GT.(-ALIM)) GO TO 100
5319 : 0 : AA = -AA + 0.25D0*ALAZ
5320 : 0 : IFLAG = 1
5321 : 0 : SFAC = TOL
5322 [ # # ]: 0 : IF (AA.GT.ELIM) GO TO 270
5323 : : 100 CONTINUE
5324 : : !C-----------------------------------------------------------------------
5325 : : !C CBKNU AND CACON RETURN EXP(ZTA)*K(FNU,ZTA) ON KODE=2
5326 : : !C-----------------------------------------------------------------------
5327 : 0 : MR = 1
5328 [ # # ]: 0 : IF (ZI.LT.0.0D0) MR = -1
5329 : : CALL ZACAI(ZTAR, ZTAI, FNU, KODE, MR, 1, CYR, CYI, NN, RL, TOL, &
5330 : 0 : & ELIM, ALIM)
5331 [ # # ]: 0 : IF (NN.LT.0) GO TO 280
5332 : 0 : NZ = NZ + NN
5333 : 0 : GO TO 130
5334 : : 110 CONTINUE
5335 [ # # ]: 0 : IF (KODE.EQ.2) GO TO 120
5336 : : !C-----------------------------------------------------------------------
5337 : : !C UNDERFLOW TEST
5338 : : !C-----------------------------------------------------------------------
5339 [ # # ]: 0 : IF (AA.LT.ALIM) GO TO 120
5340 : 0 : AA = -AA - 0.25D0*ALAZ
5341 : 0 : IFLAG = 2
5342 : 0 : SFAC = 1.0D0/TOL
5343 [ # # ]: 0 : IF (AA.LT.(-ELIM)) GO TO 210
5344 : : 120 CONTINUE
5345 : : CALL ZBKNU(ZTAR, ZTAI, FNU, KODE, 1, CYR, CYI, NZ, TOL, ELIM, &
5346 : 0 : & ALIM)
5347 : : 130 CONTINUE
5348 : 0 : S1R = CYR(1)*COEF
5349 : 0 : S1I = CYI(1)*COEF
5350 [ # # ]: 0 : IF (IFLAG.NE.0) GO TO 150
5351 [ # # ]: 0 : IF (ID.EQ.1) GO TO 140
5352 : 0 : AIR = CSQR*S1R - CSQI*S1I
5353 : 0 : AII = CSQR*S1I + CSQI*S1R
5354 : 0 : RETURN
5355 : : 140 CONTINUE
5356 : 0 : AIR = -(ZR*S1R-ZI*S1I)
5357 : 0 : AII = -(ZR*S1I+ZI*S1R)
5358 : 0 : RETURN
5359 : : 150 CONTINUE
5360 : 0 : S1R = S1R*SFAC
5361 : 0 : S1I = S1I*SFAC
5362 [ # # ]: 0 : IF (ID.EQ.1) GO TO 160
5363 : 0 : STR = S1R*CSQR - S1I*CSQI
5364 : 0 : S1I = S1R*CSQI + S1I*CSQR
5365 : 0 : S1R = STR
5366 : 0 : AIR = S1R/SFAC
5367 : 0 : AII = S1I/SFAC
5368 : 0 : RETURN
5369 : : 160 CONTINUE
5370 : 0 : STR = -(S1R*ZR-S1I*ZI)
5371 : 0 : S1I = -(S1R*ZI+S1I*ZR)
5372 : 0 : S1R = STR
5373 : 0 : AIR = S1R/SFAC
5374 : 0 : AII = S1I/SFAC
5375 : 0 : RETURN
5376 : : 170 CONTINUE
5377 : 0 : AA = 1.0D+3*D1MACH(1)
5378 : 0 : S1R = ZEROR
5379 : 0 : S1I = ZEROI
5380 [ # # ]: 0 : IF (ID.EQ.1) GO TO 190
5381 [ # # ]: 0 : IF (AZ.LE.AA) GO TO 180
5382 : 0 : S1R = C2*ZR
5383 : 0 : S1I = C2*ZI
5384 : : 180 CONTINUE
5385 : 0 : AIR = C1 - S1R
5386 : 0 : AII = -S1I
5387 : 0 : RETURN
5388 : : 190 CONTINUE
5389 : 0 : AIR = -C2
5390 : : AII = 0.0D0
5391 : 0 : AA = DSQRT(AA)
5392 [ # # ]: 0 : IF (AZ.LE.AA) GO TO 200
5393 : 0 : S1R = 0.5D0*(ZR*ZR-ZI*ZI)
5394 : 0 : S1I = ZR*ZI
5395 : : 200 CONTINUE
5396 : 0 : AIR = AIR + C1*S1R
5397 : 0 : AII = AII + C1*S1I
5398 : 0 : RETURN
5399 : : 210 CONTINUE
5400 : 0 : NZ = 1
5401 : 0 : AIR = ZEROR
5402 : 0 : AII = ZEROI
5403 : 0 : RETURN
5404 : : 270 CONTINUE
5405 : 0 : NZ = 0
5406 : 0 : IERR=2
5407 : 0 : RETURN
5408 : : 280 CONTINUE
5409 [ # # ]: 0 : IF(NN.EQ.(-1)) GO TO 270
5410 : 0 : NZ=0
5411 : 0 : IERR=5
5412 : 0 : RETURN
5413 : : 260 CONTINUE
5414 : 0 : IERR=4
5415 : 0 : NZ=0
5416 : 0 : RETURN
5417 : : END SUBROUTINE ZAIRY
5418 : :
5419 : :
5420 : 0 : SUBROUTINE ZACAI(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, RL, TOL, &
5421 : : & ELIM, ALIM)
5422 : : !C***BEGIN PROLOGUE ZACAI
5423 : : !C***REFER TO ZAIRY
5424 : : !C
5425 : : !C ZACAI APPLIES THE ANALYTIC CONTINUATION FORMULA
5426 : : !C
5427 : : !C K(FNU,ZN*EXP(MP))=K(FNU,ZN)*EXP(-MP*FNU) - MP*I(FNU,ZN)
5428 : : !C MP=PI*MR*CMPLX(0.0,1.0)
5429 : : !C
5430 : : !C TO CONTINUE THE K FUNCTION FROM THE RIGHT HALF TO THE LEFT
5431 : : !C HALF Z PLANE FOR USE WITH ZAIRY WHERE FNU=1/3 OR 2/3 AND N=1.
5432 : : !C ZACAI IS THE SAME AS ZACON WITH THE PARTS FOR LARGER ORDERS AND
5433 : : !C RECURRENCE REMOVED. A RECURSIVE CALL TO ZACON CAN RESULT IF ZACON
5434 : : !C IS CALLED FROM ZAIRY.
5435 : : !C
5436 : : !C***ROUTINES CALLED ZASYI,ZBKNU,ZMLRI,ZSERI,ZS1S2,D1MACH,AZABS
5437 : : !C***END PROLOGUE ZACAI
5438 : : !C COMPLEX CSGN,CSPN,C1,C2,Y,Z,ZN,CY
5439 : : DOUBLE PRECISION ALIM, ARG, ASCLE, AZ, CSGNR, CSGNI, CSPNR, &
5440 : : & CSPNI, C1R, C1I, C2R, C2I, CYR, CYI, DFNU, ELIM, FMR, FNU, PI, &
5441 : : & RL, SGN, TOL, YY, YR, YI, ZR, ZI, ZNR, ZNI!, D1MACH, AZABS
5442 : : INTEGER INU, IUF, KODE, MR, N, NN, NW, NZ
5443 : : DIMENSION YR(N), YI(N), CYR(2), CYI(2)
5444 : : DATA PI / 3.14159265358979324D0 /
5445 : 0 : NZ = 0
5446 : 0 : ZNR = -ZR
5447 : 0 : ZNI = -ZI
5448 : 0 : AZ = AZABS(ZR,ZI)
5449 : 0 : NN = N
5450 : 0 : DFNU = FNU + DBLE(FLOAT(N-1))
5451 [ # # ]: 0 : IF (AZ.LE.2.0D0) GO TO 10
5452 [ # # ]: 0 : IF (AZ*AZ*0.25D0.GT.DFNU+1.0D0) GO TO 20
5453 : : 10 CONTINUE
5454 : : !C-----------------------------------------------------------------------
5455 : : !C POWER SERIES FOR THE I FUNCTION
5456 : : !C-----------------------------------------------------------------------
5457 : 0 : CALL ZSERI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL, ELIM, ALIM)
5458 : 0 : GO TO 40
5459 : : 20 CONTINUE
5460 [ # # ]: 0 : IF (AZ.LT.RL) GO TO 30
5461 : : !C-----------------------------------------------------------------------
5462 : : !C ASYMPTOTIC EXPANSION FOR LARGE Z FOR THE I FUNCTION
5463 : : !C-----------------------------------------------------------------------
5464 : : CALL ZASYI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, RL, TOL, ELIM, &
5465 : 0 : & ALIM)
5466 [ # # ]: 0 : IF (NW.LT.0) GO TO 80
5467 : 0 : GO TO 40
5468 : : 30 CONTINUE
5469 : : !C-----------------------------------------------------------------------
5470 : : !C MILLER ALGORITHM NORMALIZED BY THE SERIES FOR THE I FUNCTION
5471 : : !C-----------------------------------------------------------------------
5472 : 0 : CALL ZMLRI(ZNR, ZNI, FNU, KODE, NN, YR, YI, NW, TOL)
5473 [ # # ]: 0 : IF(NW.LT.0) GO TO 80
5474 : : 40 CONTINUE
5475 : : !C-----------------------------------------------------------------------
5476 : : !C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE FOR THE K FUNCTION
5477 : : !C-----------------------------------------------------------------------
5478 : 0 : CALL ZBKNU(ZNR, ZNI, FNU, KODE, 1, CYR, CYI, NW, TOL, ELIM, ALIM)
5479 [ # # ]: 0 : IF (NW.NE.0) GO TO 80
5480 : 0 : FMR = DBLE(FLOAT(MR))
5481 : 0 : SGN = -DSIGN(PI,FMR)
5482 : 0 : CSGNR = 0.0D0
5483 : 0 : CSGNI = SGN
5484 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 50
5485 : 0 : YY = -ZNI
5486 : 0 : CSGNR = -CSGNI*DSIN(YY)
5487 : 0 : CSGNI = CSGNI*DCOS(YY)
5488 : : 50 CONTINUE
5489 : : !C-----------------------------------------------------------------------
5490 : : !C CALCULATE CSPN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
5491 : : !C WHEN FNU IS LARGE
5492 : : !C-----------------------------------------------------------------------
5493 : 0 : INU = INT(SNGL(FNU))
5494 : 0 : ARG = (FNU-DBLE(FLOAT(INU)))*SGN
5495 : 0 : CSPNR = DCOS(ARG)
5496 : 0 : CSPNI = DSIN(ARG)
5497 [ # # ]: 0 : IF (MOD(INU,2).EQ.0) GO TO 60
5498 : 0 : CSPNR = -CSPNR
5499 : 0 : CSPNI = -CSPNI
5500 : : 60 CONTINUE
5501 : 0 : C1R = CYR(1)
5502 : 0 : C1I = CYI(1)
5503 : 0 : C2R = YR(1)
5504 : 0 : C2I = YI(1)
5505 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 70
5506 : 0 : IUF = 0
5507 : 0 : ASCLE = 1.0D+3*D1MACH(1)/TOL
5508 : 0 : CALL ZS1S2(ZNR, ZNI, C1R, C1I, C2R, C2I, NW, ASCLE, ALIM, IUF)
5509 : 0 : NZ = NZ + NW
5510 : : 70 CONTINUE
5511 : 0 : YR(1) = CSPNR*C1R - CSPNI*C1I + CSGNR*C2R - CSGNI*C2I
5512 : 0 : YI(1) = CSPNR*C1I + CSPNI*C1R + CSGNR*C2I + CSGNI*C2R
5513 : 0 : RETURN
5514 : : 80 CONTINUE
5515 : 0 : NZ = -1
5516 [ # # ]: 0 : IF(NW.EQ.(-2)) NZ=-2
5517 : : RETURN
5518 : : END SUBROUTINE ZACAI
5519 : :
5520 : 0 : SUBROUTINE ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NZ, ASCLE, ALIM, &
5521 : : & IUF)
5522 : : !C***BEGIN PROLOGUE ZS1S2
5523 : : !C***REFER TO ZBESK,ZAIRY
5524 : : !C
5525 : : !C ZS1S2 TESTS FOR A POSSIBLE UNDERFLOW RESULTING FROM THE
5526 : : !C ADDITION OF THE I AND K FUNCTIONS IN THE ANALYTIC CON-
5527 : : !C TINUATION FORMULA WHERE S1=K FUNCTION AND S2=I FUNCTION.
5528 : : !C ON KODE=1 THE I AND K FUNCTIONS ARE DIFFERENT ORDERS OF
5529 : : !C MAGNITUDE, BUT FOR KODE=2 THEY CAN BE OF THE SAME ORDER
5530 : : !C OF MAGNITUDE AND THE MAXIMUM MUST BE AT LEAST ONE
5531 : : !C PRECISION ABOVE THE UNDERFLOW LIMIT.
5532 : : !C
5533 : : !C***ROUTINES CALLED AZABS,AZEXP,AZLOG
5534 : : !C***END PROLOGUE ZS1S2
5535 : : !C COMPLEX CZERO,C1,S1,S1D,S2,ZR
5536 : : DOUBLE PRECISION AA, ALIM, ALN, ASCLE, AS1, AS2, C1I, C1R, S1DI, &
5537 : : & S1DR, S1I, S1R, S2I, S2R, ZEROI, ZEROR, ZRI, ZRR!, AZABS
5538 : : INTEGER IUF, IDUM, NZ
5539 : : DATA ZEROR,ZEROI / 0.0D0 , 0.0D0 /
5540 : 0 : NZ = 0
5541 : 0 : AS1 = AZABS(S1R,S1I)
5542 : 0 : AS2 = AZABS(S2R,S2I)
5543 [ # # # # ]: 0 : IF (S1R.EQ.0.0D0 .AND. S1I.EQ.0.0D0) GO TO 10
5544 [ # # ]: 0 : IF (AS1.EQ.0.0D0) GO TO 10
5545 : 0 : ALN = -ZRR - ZRR + DLOG(AS1)
5546 : 0 : S1DR = S1R
5547 : 0 : S1DI = S1I
5548 : 0 : S1R = ZEROR
5549 : 0 : S1I = ZEROI
5550 : 0 : AS1 = ZEROR
5551 [ # # ]: 0 : IF (ALN.LT.(-ALIM)) GO TO 10
5552 : 0 : CALL AZLOG(S1DR, S1DI, C1R, C1I, IDUM)
5553 : 0 : C1R = C1R - ZRR - ZRR
5554 : 0 : C1I = C1I - ZRI - ZRI
5555 : 0 : CALL AZEXP(C1R, C1I, S1R, S1I)
5556 : 0 : AS1 = AZABS(S1R,S1I)
5557 : 0 : IUF = IUF + 1
5558 : : 10 CONTINUE
5559 : 0 : AA = DMAX1(AS1,AS2)
5560 [ # # ]: 0 : IF (AA.GT.ASCLE) RETURN
5561 : 0 : S1R = ZEROR
5562 : 0 : S1I = ZEROI
5563 : 0 : S2R = ZEROR
5564 : 0 : S2I = ZEROI
5565 : 0 : NZ = 1
5566 : 0 : IUF = 0
5567 : 0 : RETURN
5568 : : END SUBROUTINE ZS1S2
5569 : :
5570 : 0 : SUBROUTINE ZSHCH(ZR, ZI, CSHR, CSHI, CCHR, CCHI)
5571 : : !C***BEGIN PROLOGUE ZSHCH
5572 : : !C***REFER TO ZBESK,ZBESH
5573 : : !C
5574 : : !C ZSHCH COMPUTES THE COMPLEX HYPERBOLIC FUNCTIONS CSH=SINH(X+I*Y)
5575 : : !C AND CCH=COSH(X+I*Y), WHERE I**2=-1.
5576 : : !C
5577 : : !C***ROUTINES CALLED (NONE)
5578 : : !C***END PROLOGUE ZSHCH
5579 : : !C
5580 : : DOUBLE PRECISION CCHI, CCHR, CH, CN, CSHI, CSHR, SH, SN, ZI, ZR, &
5581 : : & DCOSH, DSINH
5582 : 0 : SH = DSINH(ZR)
5583 : 0 : CH = DCOSH(ZR)
5584 : 0 : SN = DSIN(ZI)
5585 : 0 : CN = DCOS(ZI)
5586 : 0 : CSHR = SH*CN
5587 : 0 : CSHI = CH*SN
5588 : 0 : CCHR = CH*CN
5589 : 0 : CCHI = SH*SN
5590 : 0 : RETURN
5591 : : END SUBROUTINE ZSHCH
5592 : :
5593 : 0 : SUBROUTINE ZKSCL(ZRR,ZRI,FNU,N,YR,YI,NZ,RZR,RZI,ASCLE,TOL,ELIM)
5594 : : !C***BEGIN PROLOGUE ZKSCL
5595 : : !C***REFER TO ZBESK
5596 : : !C
5597 : : !C SET K FUNCTIONS TO ZERO ON UNDERFLOW, CONTINUE RECURRENCE
5598 : : !C ON SCALED FUNCTIONS UNTIL TWO MEMBERS COME ON SCALE, THEN
5599 : : !C RETURN WITH MIN(NZ+2,N) VALUES SCALED BY 1/TOL.
5600 : : !C
5601 : : !C***ROUTINES CALLED ZUCHK,AZABS,AZLOG
5602 : : !C***END PROLOGUE ZKSCL
5603 : : !C COMPLEX CK,CS,CY,CZERO,RZ,S1,S2,Y,ZR,ZD,CELM
5604 : : DOUBLE PRECISION ACS, AS, ASCLE, CKI, CKR, CSI, CSR, CYI, &
5605 : : & CYR, ELIM, FN, FNU, RZI, RZR, STR, S1I, S1R, S2I, &
5606 : : & S2R, TOL, YI, YR, ZEROI, ZEROR, ZRI, ZRR, & !AZABS, &
5607 : : & ZDR, ZDI, CELMR, ELM, HELIM, ALAS
5608 : : INTEGER I, IC, IDUM, KK, N, NN, NW, NZ
5609 : : DIMENSION YR(N), YI(N), CYR(2), CYI(2)
5610 : : DATA ZEROR,ZEROI / 0.0D0 , 0.0D0 /
5611 : : !C
5612 : 0 : NZ = 0
5613 : 0 : IC = 0
5614 : 0 : NN = MIN0(2,N)
5615 [ # # ]: 0 : DO 10 I=1,NN
5616 : 0 : S1R = YR(I)
5617 : 0 : S1I = YI(I)
5618 : 0 : CYR(I) = S1R
5619 : 0 : CYI(I) = S1I
5620 : 0 : AS = AZABS(S1R,S1I)
5621 : 0 : ACS = -ZRR + DLOG(AS)
5622 : 0 : NZ = NZ + 1
5623 : 0 : YR(I) = ZEROR
5624 : 0 : YI(I) = ZEROI
5625 [ # # ]: 0 : IF (ACS.LT.(-ELIM)) GO TO 10
5626 : 0 : CALL AZLOG(S1R, S1I, CSR, CSI, IDUM)
5627 : 0 : CSR = CSR - ZRR
5628 : 0 : CSI = CSI - ZRI
5629 : 0 : STR = DEXP(CSR)/TOL
5630 : 0 : CSR = STR*DCOS(CSI)
5631 [ # # ]: 0 : CSI = STR*DSIN(CSI)
5632 : 0 : CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
5633 : : IF (NW.NE.0) GO TO 10
5634 : 0 : YR(I) = CSR
5635 : 0 : YI(I) = CSI
5636 : 0 : IC = I
5637 : 0 : NZ = NZ - 1
5638 : 0 : 10 CONTINUE
5639 [ # # ]: 0 : IF (N.EQ.1) RETURN
5640 [ # # ]: 0 : IF (IC.GT.1) GO TO 20
5641 : 0 : YR(1) = ZEROR
5642 : 0 : YI(1) = ZEROI
5643 : 0 : NZ = 2
5644 : : 20 CONTINUE
5645 [ # # ]: 0 : IF (N.EQ.2) RETURN
5646 [ # # ]: 0 : IF (NZ.EQ.0) RETURN
5647 : 0 : FN = FNU + 1.0D0
5648 : 0 : CKR = FN*RZR
5649 : 0 : CKI = FN*RZI
5650 : 0 : S1R = CYR(1)
5651 : 0 : S1I = CYI(1)
5652 : 0 : S2R = CYR(2)
5653 : 0 : S2I = CYI(2)
5654 : 0 : HELIM = 0.5D0*ELIM
5655 : 0 : ELM = DEXP(-ELIM)
5656 : 0 : CELMR = ELM
5657 : 0 : ZDR = ZRR
5658 : 0 : ZDI = ZRI
5659 : : !C
5660 : : !C FIND TWO CONSECUTIVE Y VALUES ON SCALE. SCALE RECURRENCE IF
5661 : : !C S2 GETS LARGER THAN EXP(ELIM/2)
5662 : : !C
5663 [ # # ]: 0 : DO 30 I=3,N
5664 : 0 : KK = I
5665 : 0 : CSR = S2R
5666 : 0 : CSI = S2I
5667 : 0 : S2R = CKR*CSR - CKI*CSI + S1R
5668 : 0 : S2I = CKI*CSR + CKR*CSI + S1I
5669 : 0 : S1R = CSR
5670 : 0 : S1I = CSI
5671 : 0 : CKR = CKR + RZR
5672 : 0 : CKI = CKI + RZI
5673 : 0 : AS = AZABS(S2R,S2I)
5674 : 0 : ALAS = DLOG(AS)
5675 : 0 : ACS = -ZDR + ALAS
5676 : 0 : NZ = NZ + 1
5677 : 0 : YR(I) = ZEROR
5678 : 0 : YI(I) = ZEROI
5679 [ # # ]: 0 : IF (ACS.LT.(-ELIM)) GO TO 25
5680 : 0 : CALL AZLOG(S2R, S2I, CSR, CSI, IDUM)
5681 : 0 : CSR = CSR - ZDR
5682 : 0 : CSI = CSI - ZDI
5683 : 0 : STR = DEXP(CSR)/TOL
5684 : 0 : CSR = STR*DCOS(CSI)
5685 [ # # ]: 0 : CSI = STR*DSIN(CSI)
5686 : 0 : CALL ZUCHK(CSR, CSI, NW, ASCLE, TOL)
5687 : : IF (NW.NE.0) GO TO 25
5688 : 0 : YR(I) = CSR
5689 : 0 : YI(I) = CSI
5690 : 0 : NZ = NZ - 1
5691 [ # # ]: 0 : IF (IC.EQ.KK-1) GO TO 40
5692 : : IC = KK
5693 : 0 : GO TO 30
5694 : : 25 CONTINUE
5695 [ # # ]: 0 : IF(ALAS.LT.HELIM) GO TO 30
5696 : 0 : ZDR = ZDR - ELIM
5697 : 0 : S1R = S1R*CELMR
5698 : 0 : S1I = S1I*CELMR
5699 : 0 : S2R = S2R*CELMR
5700 : 0 : S2I = S2I*CELMR
5701 : 0 : 30 CONTINUE
5702 : 0 : NZ = N
5703 [ # # ]: 0 : IF(IC.EQ.N) NZ=N-1
5704 : 0 : GO TO 45
5705 : : 40 CONTINUE
5706 : 0 : NZ = KK - 2
5707 : : 45 CONTINUE
5708 [ # # ]: 0 : DO 50 I=1,NZ
5709 : 0 : YR(I) = ZEROR
5710 : 0 : YI(I) = ZEROI
5711 : 0 : 50 CONTINUE
5712 : : RETURN
5713 : : END SUBROUTINE ZKSCL
5714 : :
5715 : 0 : SUBROUTINE ZBUNK(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
5716 : : & ALIM)
5717 : : !C***BEGIN PROLOGUE ZBUNK
5718 : : !C***REFER TO ZBESK,ZBESH
5719 : : !C
5720 : : !C ZBUNK COMPUTES THE K BESSEL FUNCTION FOR FNU.GT.FNUL.
5721 : : !C ACCORDING TO THE UNIFORM ASYMPTOTIC EXPANSION FOR K(FNU,Z)
5722 : : !C IN ZUNK1 AND THE EXPANSION FOR H(2,FNU,Z) IN ZUNK2
5723 : : !C
5724 : : !C***ROUTINES CALLED ZUNK1,ZUNK2
5725 : : !C***END PROLOGUE ZBUNK
5726 : : !C COMPLEX Y,Z
5727 : : DOUBLE PRECISION ALIM, AX, AY, ELIM, FNU, TOL, YI, YR, ZI, ZR
5728 : : INTEGER KODE, MR, N, NZ
5729 : : DIMENSION YR(N), YI(N)
5730 : 0 : NZ = 0
5731 : 0 : AX = DABS(ZR)*1.7321D0
5732 : 0 : AY = DABS(ZI)
5733 [ # # ]: 0 : IF (AY.GT.AX) GO TO 10
5734 : : !C-----------------------------------------------------------------------
5735 : : !C ASYMPTOTIC EXPANSION FOR K(FNU,Z) FOR LARGE FNU APPLIED IN
5736 : : !C -PI/3.LE.ARG(Z).LE.PI/3
5737 : : !C-----------------------------------------------------------------------
5738 : 0 : CALL ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
5739 : 0 : GO TO 20
5740 : : 10 CONTINUE
5741 : : !C-----------------------------------------------------------------------
5742 : : !C ASYMPTOTIC EXPANSION FOR H(2,FNU,Z*EXP(M*HPI)) FOR LARGE FNU
5743 : : !C APPLIED IN PI/3.LT.ABS(ARG(Z)).LE.PI/2 WHERE M=+I OR -I
5744 : : !C AND HPI=PI/2
5745 : : !C-----------------------------------------------------------------------
5746 : 0 : CALL ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, ALIM)
5747 : : 20 CONTINUE
5748 : 0 : RETURN
5749 : : END SUBROUTINE ZBUNK
5750 : :
5751 : :
5752 : 0 : SUBROUTINE ZUNK1(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
5753 : : & ALIM)
5754 : : !C***BEGIN PROLOGUE ZUNK1
5755 : : !C***REFER TO ZBESK
5756 : : !C
5757 : : !C ZUNK1 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
5758 : : !C RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
5759 : : !C UNIFORM ASYMPTOTIC EXPANSION.
5760 : : !C MR INDICATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
5761 : : !C NZ=-1 MEANS AN OVERFLOW WILL OCCUR
5762 : : !C
5763 : : !C***ROUTINES CALLED ZKSCL,ZS1S2,ZUCHK,ZUNIK,D1MACH,AZABS
5764 : : !C***END PROLOGUE ZUNK1
5765 : : !C COMPLEX CFN,CK,CONE,CRSC,CS,CSCL,CSGN,CSPN,CSR,CSS,CWRK,CY,CZERO,
5766 : : !C *C1,C2,PHI,PHID,RZ,SUM,SUMD,S1,S2,Y,Z,ZETA1,ZETA1D,ZETA2,ZETA2D,ZR
5767 : : DOUBLE PRECISION ALIM, ANG, APHI, ASC, ASCLE, BRY, CKI, CKR, &
5768 : : & CONER, CRSC, CSCL, CSGNI, CSPNI, CSPNR, CSR, CSRR, CSSR, &
5769 : : & CWRKI, CWRKR, CYI, CYR, C1I, C1R, C2I, C2M, C2R, ELIM, FMR, FN, &
5770 : : & FNF, FNU, PHIDI, PHIDR, PHII, PHIR, PI, RAST, RAZR, RS1, RZI, &
5771 : : & RZR, SGN, STI, STR, SUMDI, SUMDR, SUMI, SUMR, S1I, S1R, S2I, &
5772 : : & S2R, TOL, YI, YR, ZEROI, ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, &
5773 : : & ZET1DI, ZET1DR, ZET2DI, ZET2DR, ZI, ZR, ZRI, ZRR!, D1MACH, AZABS
5774 : : INTEGER I, IB, IFLAG, IFN, IL, INIT, INU, IUF, K, KDFLG, KFLAG, &
5775 : : & KK, KODE, MR, N, NW, NZ, INITD, IC, IPARD, J, M
5776 : : DIMENSION BRY(3), INIT(2), YR(N), YI(N), SUMR(2), SUMI(2), &
5777 : : & ZETA1R(2), ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), &
5778 : : & CWRKR(16,3), CWRKI(16,3), CSSR(3), CSRR(3), PHIR(2), PHII(2)
5779 : : DATA ZEROR,ZEROI,CONER / 0.0D0, 0.0D0, 1.0D0 /
5780 : : DATA PI / 3.14159265358979324D0 /
5781 : : !C
5782 : 0 : KDFLG = 1
5783 : 0 : NZ = 0
5784 : : !C-----------------------------------------------------------------------
5785 : : !C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
5786 : : !C THE UNDERFLOW LIMIT
5787 : : !C-----------------------------------------------------------------------
5788 : 0 : CSCL = 1.0D0/TOL
5789 : 0 : CRSC = TOL
5790 : 0 : CSSR(1) = CSCL
5791 : 0 : CSSR(2) = CONER
5792 : 0 : CSSR(3) = CRSC
5793 : 0 : CSRR(1) = CRSC
5794 : 0 : CSRR(2) = CONER
5795 : 0 : CSRR(3) = CSCL
5796 : 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
5797 : 0 : BRY(2) = 1.0D0/BRY(1)
5798 : 0 : BRY(3) = D1MACH(2)
5799 : 0 : ZRR = ZR
5800 : 0 : ZRI = ZI
5801 [ # # ]: 0 : IF (ZR.GE.0.0D0) GO TO 10
5802 : 0 : ZRR = -ZR
5803 : 0 : ZRI = -ZI
5804 : : 10 CONTINUE
5805 : 0 : J = 2
5806 [ # # ]: 0 : DO 70 I=1,N
5807 : : !C-----------------------------------------------------------------------
5808 : : !C J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
5809 : : !C-----------------------------------------------------------------------
5810 : 0 : J = 3 - J
5811 : 0 : FN = FNU + DBLE(FLOAT(I-1))
5812 : 0 : INIT(J) = 0
5813 : : CALL ZUNIK(ZRR, ZRI, FN, 2, 0, TOL, INIT(J), PHIR(J), PHII(J), &
5814 : : & ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), SUMR(J), SUMI(J), &
5815 : 0 : & CWRKR(1,J), CWRKI(1,J))
5816 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 20
5817 : 0 : STR = ZRR + ZETA2R(J)
5818 : 0 : STI = ZRI + ZETA2I(J)
5819 : 0 : RAST = FN/AZABS(STR,STI)
5820 : 0 : STR = STR*RAST*RAST
5821 : 0 : STI = -STI*RAST*RAST
5822 : 0 : S1R = ZETA1R(J) - STR
5823 : 0 : S1I = ZETA1I(J) - STI
5824 : 0 : GO TO 30
5825 : : 20 CONTINUE
5826 : 0 : S1R = ZETA1R(J) - ZETA2R(J)
5827 : 0 : S1I = ZETA1I(J) - ZETA2I(J)
5828 : : 30 CONTINUE
5829 : 0 : RS1 = S1R
5830 : : !C-----------------------------------------------------------------------
5831 : : !C TEST FOR UNDERFLOW AND OVERFLOW
5832 : : !C-----------------------------------------------------------------------
5833 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 60
5834 [ # # ]: 0 : IF (KDFLG.EQ.1) KFLAG = 2
5835 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 40
5836 : : !C-----------------------------------------------------------------------
5837 : : !C REFINE TEST AND SCALE
5838 : : !C-----------------------------------------------------------------------
5839 : 0 : APHI = AZABS(PHIR(J),PHII(J))
5840 : 0 : RS1 = RS1 + DLOG(APHI)
5841 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 60
5842 [ # # ]: 0 : IF (KDFLG.EQ.1) KFLAG = 1
5843 [ # # ]: 0 : IF (RS1.LT.0.0D0) GO TO 40
5844 [ # # ]: 0 : IF (KDFLG.EQ.1) KFLAG = 3
5845 : : 40 CONTINUE
5846 : : !C-----------------------------------------------------------------------
5847 : : !C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
5848 : : !C EXPONENT EXTREMES
5849 : : !C-----------------------------------------------------------------------
5850 : 0 : S2R = PHIR(J)*SUMR(J) - PHII(J)*SUMI(J)
5851 : 0 : S2I = PHIR(J)*SUMI(J) + PHII(J)*SUMR(J)
5852 : 0 : STR = DEXP(S1R)*CSSR(KFLAG)
5853 : 0 : S1R = STR*DCOS(S1I)
5854 : 0 : S1I = STR*DSIN(S1I)
5855 : 0 : STR = S2R*S1R - S2I*S1I
5856 : 0 : S2I = S1R*S2I + S2R*S1I
5857 : 0 : S2R = STR
5858 [ # # ]: 0 : IF (KFLAG.NE.1) GO TO 50
5859 : 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
5860 [ # # ]: 0 : IF (NW.NE.0) GO TO 60
5861 : : 50 CONTINUE
5862 : 0 : CYR(KDFLG) = S2R
5863 : 0 : CYI(KDFLG) = S2I
5864 : 0 : YR(I) = S2R*CSRR(KFLAG)
5865 : 0 : YI(I) = S2I*CSRR(KFLAG)
5866 [ # # ]: 0 : IF (KDFLG.EQ.2) GO TO 75
5867 : : KDFLG = 2
5868 : 0 : GO TO 70
5869 : : 60 CONTINUE
5870 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 300
5871 : : !C-----------------------------------------------------------------------
5872 : : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
5873 : : !C-----------------------------------------------------------------------
5874 [ # # ]: 0 : IF (ZR.LT.0.0D0) GO TO 300
5875 : 0 : KDFLG = 1
5876 : 0 : YR(I)=ZEROR
5877 : 0 : YI(I)=ZEROI
5878 : 0 : NZ=NZ+1
5879 [ # # ]: 0 : IF (I.EQ.1) GO TO 70
5880 [ # # # # ]: 0 : IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 70
5881 : 0 : YR(I-1)=ZEROR
5882 : 0 : YI(I-1)=ZEROI
5883 : 0 : NZ=NZ+1
5884 : 0 : 70 CONTINUE
5885 : 0 : I = N
5886 : : 75 CONTINUE
5887 : 0 : RAZR = 1.0D0/AZABS(ZRR,ZRI)
5888 : 0 : STR = ZRR*RAZR
5889 : 0 : STI = -ZRI*RAZR
5890 : 0 : RZR = (STR+STR)*RAZR
5891 : 0 : RZI = (STI+STI)*RAZR
5892 : 0 : CKR = FN*RZR
5893 : 0 : CKI = FN*RZI
5894 : 0 : IB = I + 1
5895 [ # # ]: 0 : IF (N.LT.IB) GO TO 160
5896 : : !C-----------------------------------------------------------------------
5897 : : !C TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
5898 : : !C ON UNDERFLOW.
5899 : : !C-----------------------------------------------------------------------
5900 : 0 : FN = FNU + DBLE(FLOAT(N-1))
5901 : 0 : IPARD = 1
5902 [ # # ]: 0 : IF (MR.NE.0) IPARD = 0
5903 : 0 : INITD = 0
5904 : : CALL ZUNIK(ZRR, ZRI, FN, 2, IPARD, TOL, INITD, PHIDR, PHIDI, &
5905 : : & ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, CWRKR(1,3), &
5906 : 0 : & CWRKI(1,3))
5907 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 80
5908 : 0 : STR = ZRR + ZET2DR
5909 : 0 : STI = ZRI + ZET2DI
5910 : 0 : RAST = FN/AZABS(STR,STI)
5911 : 0 : STR = STR*RAST*RAST
5912 : 0 : STI = -STI*RAST*RAST
5913 : 0 : S1R = ZET1DR - STR
5914 : 0 : S1I = ZET1DI - STI
5915 : 0 : GO TO 90
5916 : : 80 CONTINUE
5917 : 0 : S1R = ZET1DR - ZET2DR
5918 : 0 : S1I = ZET1DI - ZET2DI
5919 : : 90 CONTINUE
5920 : 0 : RS1 = S1R
5921 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 95
5922 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 100
5923 : : !C----------------------------------------------------------------------------
5924 : : !C REFINE ESTIMATE AND TEST
5925 : : !C-------------------------------------------------------------------------
5926 : 0 : APHI = AZABS(PHIDR,PHIDI)
5927 : 0 : RS1 = RS1+DLOG(APHI)
5928 [ # # ]: 0 : IF (DABS(RS1).LT.ELIM) GO TO 100
5929 : : 95 CONTINUE
5930 [ # # ]: 0 : IF (DABS(RS1).GT.0.0D0) GO TO 300
5931 : : !C-----------------------------------------------------------------------
5932 : : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
5933 : : !C-----------------------------------------------------------------------
5934 [ # # ]: 0 : IF (ZR.LT.0.0D0) GO TO 300
5935 : 0 : NZ = N
5936 [ # # ]: 0 : DO 96 I=1,N
5937 : 0 : YR(I) = ZEROR
5938 : 0 : YI(I) = ZEROI
5939 : 0 : 96 CONTINUE
5940 : 0 : RETURN
5941 : : !C---------------------------------------------------------------------------
5942 : : !C FORWARD RECUR FOR REMAINDER OF THE SEQUENCE
5943 : : !C----------------------------------------------------------------------------
5944 : : 100 CONTINUE
5945 : 0 : S1R = CYR(1)
5946 : 0 : S1I = CYI(1)
5947 : 0 : S2R = CYR(2)
5948 : 0 : S2I = CYI(2)
5949 : 0 : C1R = CSRR(KFLAG)
5950 : 0 : ASCLE = BRY(KFLAG)
5951 [ # # ]: 0 : DO 120 I=IB,N
5952 : 0 : C2R = S2R
5953 : 0 : C2I = S2I
5954 : 0 : S2R = CKR*C2R - CKI*C2I + S1R
5955 : 0 : S2I = CKR*C2I + CKI*C2R + S1I
5956 : 0 : S1R = C2R
5957 : 0 : S1I = C2I
5958 : 0 : CKR = CKR + RZR
5959 : 0 : CKI = CKI + RZI
5960 : 0 : C2R = S2R*C1R
5961 : 0 : C2I = S2I*C1R
5962 : 0 : YR(I) = C2R
5963 : 0 : YI(I) = C2I
5964 [ # # ]: 0 : IF (KFLAG.GE.3) GO TO 120
5965 : 0 : STR = DABS(C2R)
5966 : 0 : STI = DABS(C2I)
5967 : 0 : C2M = DMAX1(STR,STI)
5968 [ # # ]: 0 : IF (C2M.LE.ASCLE) GO TO 120
5969 : 0 : KFLAG = KFLAG + 1
5970 : 0 : ASCLE = BRY(KFLAG)
5971 : 0 : S1R = S1R*C1R
5972 : 0 : S1I = S1I*C1R
5973 : : S2R = C2R
5974 : : S2I = C2I
5975 : 0 : S1R = S1R*CSSR(KFLAG)
5976 : 0 : S1I = S1I*CSSR(KFLAG)
5977 : 0 : S2R = S2R*CSSR(KFLAG)
5978 : 0 : S2I = S2I*CSSR(KFLAG)
5979 : 0 : C1R = CSRR(KFLAG)
5980 : 0 : 120 CONTINUE
5981 : : 160 CONTINUE
5982 [ # # ]: 0 : IF (MR.EQ.0) RETURN
5983 : : !C-----------------------------------------------------------------------
5984 : : !C ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
5985 : : !C-----------------------------------------------------------------------
5986 : 0 : NZ = 0
5987 : 0 : FMR = DBLE(FLOAT(MR))
5988 : 0 : SGN = -DSIGN(PI,FMR)
5989 : : !C-----------------------------------------------------------------------
5990 : : !C CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
5991 : : !C-----------------------------------------------------------------------
5992 : 0 : CSGNI = SGN
5993 : 0 : INU = INT(SNGL(FNU))
5994 : 0 : FNF = FNU - DBLE(FLOAT(INU))
5995 : 0 : IFN = INU + N - 1
5996 : 0 : ANG = FNF*SGN
5997 : 0 : CSPNR = DCOS(ANG)
5998 : 0 : CSPNI = DSIN(ANG)
5999 [ # # ]: 0 : IF (MOD(IFN,2).EQ.0) GO TO 170
6000 : 0 : CSPNR = -CSPNR
6001 : 0 : CSPNI = -CSPNI
6002 : : 170 CONTINUE
6003 : 0 : ASC = BRY(1)
6004 : 0 : IUF = 0
6005 : 0 : KK = N
6006 : 0 : KDFLG = 1
6007 : 0 : IB = IB - 1
6008 : 0 : IC = IB - 1
6009 [ # # ]: 0 : DO 270 K=1,N
6010 : 0 : FN = FNU + DBLE(FLOAT(KK-1))
6011 : : !C-----------------------------------------------------------------------
6012 : : !C LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
6013 : : !C FUNCTION ABOVE
6014 : : !C-----------------------------------------------------------------------
6015 : 0 : M=3
6016 [ # # ]: 0 : IF (N.GT.2) GO TO 175
6017 : : 172 CONTINUE
6018 : 0 : INITD = INIT(J)
6019 : 0 : PHIDR = PHIR(J)
6020 : 0 : PHIDI = PHII(J)
6021 : 0 : ZET1DR = ZETA1R(J)
6022 : 0 : ZET1DI = ZETA1I(J)
6023 : 0 : ZET2DR = ZETA2R(J)
6024 : 0 : ZET2DI = ZETA2I(J)
6025 : 0 : SUMDR = SUMR(J)
6026 : 0 : SUMDI = SUMI(J)
6027 : 0 : M = J
6028 : 0 : J = 3 - J
6029 : 0 : GO TO 180
6030 : : 175 CONTINUE
6031 [ # # # # ]: 0 : IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 180
6032 [ # # ]: 0 : IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
6033 : 0 : INITD = 0
6034 : : 180 CONTINUE
6035 : : CALL ZUNIK(ZRR, ZRI, FN, 1, 0, TOL, INITD, PHIDR, PHIDI, &
6036 : : & ZET1DR, ZET1DI, ZET2DR, ZET2DI, SUMDR, SUMDI, &
6037 : 0 : & CWRKR(1,M), CWRKI(1,M))
6038 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 200
6039 : 0 : STR = ZRR + ZET2DR
6040 : 0 : STI = ZRI + ZET2DI
6041 : 0 : RAST = FN/AZABS(STR,STI)
6042 : 0 : STR = STR*RAST*RAST
6043 : 0 : STI = -STI*RAST*RAST
6044 : 0 : S1R = -ZET1DR + STR
6045 : 0 : S1I = -ZET1DI + STI
6046 : 0 : GO TO 210
6047 : : 200 CONTINUE
6048 : 0 : S1R = -ZET1DR + ZET2DR
6049 : 0 : S1I = -ZET1DI + ZET2DI
6050 : : 210 CONTINUE
6051 : : !C-----------------------------------------------------------------------
6052 : : !C TEST FOR UNDERFLOW AND OVERFLOW
6053 : : !C-----------------------------------------------------------------------
6054 : 0 : RS1 = S1R
6055 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 260
6056 [ # # ]: 0 : IF (KDFLG.EQ.1) IFLAG = 2
6057 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 220
6058 : : !C-----------------------------------------------------------------------
6059 : : !C REFINE TEST AND SCALE
6060 : : !C-----------------------------------------------------------------------
6061 : 0 : APHI = AZABS(PHIDR,PHIDI)
6062 : 0 : RS1 = RS1 + DLOG(APHI)
6063 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 260
6064 [ # # ]: 0 : IF (KDFLG.EQ.1) IFLAG = 1
6065 [ # # ]: 0 : IF (RS1.LT.0.0D0) GO TO 220
6066 [ # # ]: 0 : IF (KDFLG.EQ.1) IFLAG = 3
6067 : : 220 CONTINUE
6068 : 0 : STR = PHIDR*SUMDR - PHIDI*SUMDI
6069 : 0 : STI = PHIDR*SUMDI + PHIDI*SUMDR
6070 : 0 : S2R = -CSGNI*STI
6071 : 0 : S2I = CSGNI*STR
6072 : 0 : STR = DEXP(S1R)*CSSR(IFLAG)
6073 : 0 : S1R = STR*DCOS(S1I)
6074 : 0 : S1I = STR*DSIN(S1I)
6075 : 0 : STR = S2R*S1R - S2I*S1I
6076 : 0 : S2I = S2R*S1I + S2I*S1R
6077 : 0 : S2R = STR
6078 [ # # ]: 0 : IF (IFLAG.NE.1) GO TO 230
6079 : 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
6080 [ # # ]: 0 : IF (NW.EQ.0) GO TO 230
6081 : 0 : S2R = ZEROR
6082 : 0 : S2I = ZEROI
6083 : : 230 CONTINUE
6084 : 0 : CYR(KDFLG) = S2R
6085 : 0 : CYI(KDFLG) = S2I
6086 : 0 : C2R = S2R
6087 : 0 : C2I = S2I
6088 : 0 : S2R = S2R*CSRR(IFLAG)
6089 : 0 : S2I = S2I*CSRR(IFLAG)
6090 : : !C-----------------------------------------------------------------------
6091 : : !C ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
6092 : : !C-----------------------------------------------------------------------
6093 : 0 : S1R = YR(KK)
6094 : 0 : S1I = YI(KK)
6095 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 250
6096 : 0 : CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
6097 : 0 : NZ = NZ + NW
6098 : : 250 CONTINUE
6099 : 0 : YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
6100 : 0 : YI(KK) = CSPNR*S1I + CSPNI*S1R + S2I
6101 : 0 : KK = KK - 1
6102 : 0 : CSPNR = -CSPNR
6103 : 0 : CSPNI = -CSPNI
6104 [ # # ]: 0 : IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
6105 : : KDFLG = 1
6106 : 0 : GO TO 270
6107 : : 255 CONTINUE
6108 [ # # ]: 0 : IF (KDFLG.EQ.2) GO TO 275
6109 : : KDFLG = 2
6110 : 0 : GO TO 270
6111 : : 260 CONTINUE
6112 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 300
6113 : 0 : S2R = ZEROR
6114 : 0 : S2I = ZEROI
6115 : 0 : GO TO 230
6116 : 0 : 270 CONTINUE
6117 : 0 : K = N
6118 : : 275 CONTINUE
6119 : 0 : IL = N - K
6120 [ # # ]: 0 : IF (IL.EQ.0) RETURN
6121 : : !C-----------------------------------------------------------------------
6122 : : !C RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
6123 : : !C K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
6124 : : !C INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
6125 : : !C-----------------------------------------------------------------------
6126 : 0 : S1R = CYR(1)
6127 : 0 : S1I = CYI(1)
6128 : 0 : S2R = CYR(2)
6129 : 0 : S2I = CYI(2)
6130 : 0 : CSR = CSRR(IFLAG)
6131 : 0 : ASCLE = BRY(IFLAG)
6132 : 0 : FN = DBLE(FLOAT(INU+IL))
6133 [ # # ]: 0 : DO 290 I=1,IL
6134 : 0 : C2R = S2R
6135 : 0 : C2I = S2I
6136 : 0 : S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
6137 : 0 : S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
6138 : 0 : S1R = C2R
6139 : 0 : S1I = C2I
6140 : 0 : FN = FN - 1.0D0
6141 : 0 : C2R = S2R*CSR
6142 : 0 : C2I = S2I*CSR
6143 : 0 : CKR = C2R
6144 : 0 : CKI = C2I
6145 : 0 : C1R = YR(KK)
6146 : 0 : C1I = YI(KK)
6147 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 280
6148 : 0 : CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
6149 : 0 : NZ = NZ + NW
6150 : : 280 CONTINUE
6151 : 0 : YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
6152 : 0 : YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
6153 : 0 : KK = KK - 1
6154 : 0 : CSPNR = -CSPNR
6155 : 0 : CSPNI = -CSPNI
6156 [ # # ]: 0 : IF (IFLAG.GE.3) GO TO 290
6157 : 0 : C2R = DABS(CKR)
6158 : 0 : C2I = DABS(CKI)
6159 : 0 : C2M = DMAX1(C2R,C2I)
6160 [ # # ]: 0 : IF (C2M.LE.ASCLE) GO TO 290
6161 : 0 : IFLAG = IFLAG + 1
6162 : 0 : ASCLE = BRY(IFLAG)
6163 : 0 : S1R = S1R*CSR
6164 : 0 : S1I = S1I*CSR
6165 : : S2R = CKR
6166 : : S2I = CKI
6167 : 0 : S1R = S1R*CSSR(IFLAG)
6168 : 0 : S1I = S1I*CSSR(IFLAG)
6169 : 0 : S2R = S2R*CSSR(IFLAG)
6170 : 0 : S2I = S2I*CSSR(IFLAG)
6171 : 0 : CSR = CSRR(IFLAG)
6172 : 0 : 290 CONTINUE
6173 : 0 : RETURN
6174 : : 300 CONTINUE
6175 : 0 : NZ = -1
6176 : 0 : RETURN
6177 : : END SUBROUTINE ZUNK1
6178 : :
6179 : 0 : SUBROUTINE ZUNK2(ZR, ZI, FNU, KODE, MR, N, YR, YI, NZ, TOL, ELIM, &
6180 : : & ALIM)
6181 : : !C***BEGIN PROLOGUE ZUNK2
6182 : : !C***REFER TO ZBESK
6183 : : !C
6184 : : !C ZUNK2 COMPUTES K(FNU,Z) AND ITS ANALYTIC CONTINUATION FROM THE
6185 : : !C RIGHT HALF PLANE TO THE LEFT HALF PLANE BY MEANS OF THE
6186 : : !C UNIFORM ASYMPTOTIC EXPANSIONS FOR H(KIND,FNU,ZN) AND J(FNU,ZN)
6187 : : !C WHERE ZN IS IN THE RIGHT HALF PLANE, KIND=(3-MR)/2, MR=+1 OR
6188 : : !C -1. HERE ZN=ZR*I OR -ZR*I WHERE ZR=Z IF Z IS IN THE RIGHT
6189 : : !C HALF PLANE OR ZR=-Z IF Z IS IN THE LEFT HALF PLANE. MR INDIC-
6190 : : !C ATES THE DIRECTION OF ROTATION FOR ANALYTIC CONTINUATION.
6191 : : !C NZ=-1 MEANS AN OVERFLOW WILL OCCUR
6192 : : !C
6193 : : !C***ROUTINES CALLED ZAIRY,ZKSCL,ZS1S2,ZUCHK,ZUNHJ,D1MACH,AZABS
6194 : : !C***END PROLOGUE ZUNK2
6195 : : !C COMPLEX AI,ARG,ARGD,ASUM,ASUMD,BSUM,BSUMD,CFN,CI,CIP,CK,CONE,CRSC,
6196 : : !C *CR1,CR2,CS,CSCL,CSGN,CSPN,CSR,CSS,CY,CZERO,C1,C2,DAI,PHI,PHID,RZ,
6197 : : !C *S1,S2,Y,Z,ZB,ZETA1,ZETA1D,ZETA2,ZETA2D,ZN,ZR
6198 : : DOUBLE PRECISION AARG, AIC, AII, AIR, ALIM, ANG, APHI, ARGDI, &
6199 : : & ARGDR, ARGI, ARGR, ASC, ASCLE, ASUMDI, ASUMDR, ASUMI, ASUMR, &
6200 : : & BRY, BSUMDI, BSUMDR, BSUMI, BSUMR, CAR, CIPI, CIPR, CKI, CKR, &
6201 : : & CONER, CRSC, CR1I, CR1R, CR2I, CR2R, CSCL, CSGNI, CSI, &
6202 : : & CSPNI, CSPNR, CSR, CSRR, CSSR, CYI, CYR, C1I, C1R, C2I, C2M, &
6203 : : & C2R, DAII, DAIR, ELIM, FMR, FN, FNF, FNU, HPI, PHIDI, PHIDR, &
6204 : : & PHII, PHIR, PI, PTI, PTR, RAST, RAZR, RS1, RZI, RZR, SAR, SGN, &
6205 : : & STI, STR, S1I, S1R, S2I, S2R, TOL, YI, YR, YY, ZBI, ZBR, ZEROI, &
6206 : : & ZEROR, ZETA1I, ZETA1R, ZETA2I, ZETA2R, ZET1DI, ZET1DR, ZET2DI, &
6207 : : & ZET2DR, ZI, ZNI, ZNR, ZR, ZRI, ZRR!, D1MACH, AZABS
6208 : : INTEGER I, IB, IFLAG, IFN, IL, IN, INU, IUF, K, KDFLG, KFLAG, KK, &
6209 : : & KODE, MR, N, NAI, NDAI, NW, NZ, IDUM, J, IPARD, IC
6210 : : DIMENSION BRY(3), YR(N), YI(N), ASUMR(2), ASUMI(2), BSUMR(2), &
6211 : : & BSUMI(2), PHIR(2), PHII(2), ARGR(2), ARGI(2), ZETA1R(2), &
6212 : : & ZETA1I(2), ZETA2R(2), ZETA2I(2), CYR(2), CYI(2), CIPR(4), &
6213 : : & CIPI(4), CSSR(3), CSRR(3)
6214 : : DATA ZEROR,ZEROI,CONER,CR1R,CR1I,CR2R,CR2I / &
6215 : : & 0.0D0, 0.0D0, 1.0D0, &
6216 : : & 1.0D0,1.73205080756887729D0 , -0.5D0,-8.66025403784438647D-01 /
6217 : : DATA HPI, PI, AIC / &
6218 : : & 1.57079632679489662D+00, 3.14159265358979324D+00, &
6219 : : & 1.26551212348464539D+00/
6220 : : DATA CIPR(1),CIPI(1),CIPR(2),CIPI(2),CIPR(3),CIPI(3),CIPR(4), &
6221 : : & CIPI(4) / &
6222 : : & 1.0D0,0.0D0 , 0.0D0,-1.0D0 , -1.0D0,0.0D0 , 0.0D0,1.0D0 /
6223 : : !C
6224 : 0 : KDFLG = 1
6225 : 0 : NZ = 0
6226 : : !C-----------------------------------------------------------------------
6227 : : !C EXP(-ALIM)=EXP(-ELIM)/TOL=APPROX. ONE PRECISION GREATER THAN
6228 : : !C THE UNDERFLOW LIMIT
6229 : : !C-----------------------------------------------------------------------
6230 : 0 : CSCL = 1.0D0/TOL
6231 : 0 : CRSC = TOL
6232 : 0 : CSSR(1) = CSCL
6233 : 0 : CSSR(2) = CONER
6234 : 0 : CSSR(3) = CRSC
6235 : 0 : CSRR(1) = CRSC
6236 : 0 : CSRR(2) = CONER
6237 : 0 : CSRR(3) = CSCL
6238 : 0 : BRY(1) = 1.0D+3*D1MACH(1)/TOL
6239 : 0 : BRY(2) = 1.0D0/BRY(1)
6240 : 0 : BRY(3) = D1MACH(2)
6241 : 0 : ZRR = ZR
6242 : 0 : ZRI = ZI
6243 [ # # ]: 0 : IF (ZR.GE.0.0D0) GO TO 10
6244 : 0 : ZRR = -ZR
6245 : 0 : ZRI = -ZI
6246 : : 10 CONTINUE
6247 : 0 : YY = ZRI
6248 : 0 : ZNR = ZRI
6249 : 0 : ZNI = -ZRR
6250 : 0 : ZBR = ZRR
6251 : 0 : ZBI = ZRI
6252 : 0 : INU = INT(SNGL(FNU))
6253 : 0 : FNF = FNU - DBLE(FLOAT(INU))
6254 : 0 : ANG = -HPI*FNF
6255 : 0 : CAR = DCOS(ANG)
6256 : 0 : SAR = DSIN(ANG)
6257 : 0 : C2R = HPI*SAR
6258 : 0 : C2I = -HPI*CAR
6259 : 0 : KK = MOD(INU,4) + 1
6260 : 0 : STR = C2R*CIPR(KK) - C2I*CIPI(KK)
6261 : 0 : STI = C2R*CIPI(KK) + C2I*CIPR(KK)
6262 : 0 : CSR = CR1R*STR - CR1I*STI
6263 : 0 : CSI = CR1R*STI + CR1I*STR
6264 [ # # ]: 0 : IF (YY.GT.0.0D0) GO TO 20
6265 : 0 : ZNR = -ZNR
6266 : 0 : ZBI = -ZBI
6267 : : 20 CONTINUE
6268 : : !C-----------------------------------------------------------------------
6269 : : !C K(FNU,Z) IS COMPUTED FROM H(2,FNU,-I*Z) WHERE Z IS IN THE FIRST
6270 : : !C QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
6271 : : !C CONJUGATION SINCE THE K FUNCTION IS REAL ON THE POSITIVE REAL AXIS
6272 : : !C-----------------------------------------------------------------------
6273 : 0 : J = 2
6274 [ # # ]: 0 : DO 80 I=1,N
6275 : : !C-----------------------------------------------------------------------
6276 : : !C J FLIP FLOPS BETWEEN 1 AND 2 IN J = 3 - J
6277 : : !C-----------------------------------------------------------------------
6278 : 0 : J = 3 - J
6279 : 0 : FN = FNU + DBLE(FLOAT(I-1))
6280 : : CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIR(J), PHII(J), ARGR(J), &
6281 : : & ARGI(J), ZETA1R(J), ZETA1I(J), ZETA2R(J), ZETA2I(J), ASUMR(J), &
6282 : 0 : & ASUMI(J), BSUMR(J), BSUMI(J))
6283 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 30
6284 : 0 : STR = ZBR + ZETA2R(J)
6285 : 0 : STI = ZBI + ZETA2I(J)
6286 : 0 : RAST = FN/AZABS(STR,STI)
6287 : 0 : STR = STR*RAST*RAST
6288 : 0 : STI = -STI*RAST*RAST
6289 : 0 : S1R = ZETA1R(J) - STR
6290 : 0 : S1I = ZETA1I(J) - STI
6291 : 0 : GO TO 40
6292 : : 30 CONTINUE
6293 : 0 : S1R = ZETA1R(J) - ZETA2R(J)
6294 : 0 : S1I = ZETA1I(J) - ZETA2I(J)
6295 : : 40 CONTINUE
6296 : : !C-----------------------------------------------------------------------
6297 : : !C TEST FOR UNDERFLOW AND OVERFLOW
6298 : : !C-----------------------------------------------------------------------
6299 : 0 : RS1 = S1R
6300 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 70
6301 [ # # ]: 0 : IF (KDFLG.EQ.1) KFLAG = 2
6302 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 50
6303 : : !C-----------------------------------------------------------------------
6304 : : !C REFINE TEST AND SCALE
6305 : : !C-----------------------------------------------------------------------
6306 : 0 : APHI = AZABS(PHIR(J),PHII(J))
6307 : 0 : AARG = AZABS(ARGR(J),ARGI(J))
6308 : 0 : RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
6309 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 70
6310 [ # # ]: 0 : IF (KDFLG.EQ.1) KFLAG = 1
6311 [ # # ]: 0 : IF (RS1.LT.0.0D0) GO TO 50
6312 [ # # ]: 0 : IF (KDFLG.EQ.1) KFLAG = 3
6313 : : 50 CONTINUE
6314 : : !C-----------------------------------------------------------------------
6315 : : !C SCALE S1 TO KEEP INTERMEDIATE ARITHMETIC ON SCALE NEAR
6316 : : !C EXPONENT EXTREMES
6317 : : !C-----------------------------------------------------------------------
6318 : 0 : C2R = ARGR(J)*CR2R - ARGI(J)*CR2I
6319 : 0 : C2I = ARGR(J)*CR2I + ARGI(J)*CR2R
6320 : 0 : CALL ZAIRY(C2R, C2I, 0, 2, AIR, AII, NAI, IDUM)
6321 : 0 : CALL ZAIRY(C2R, C2I, 1, 2, DAIR, DAII, NDAI, IDUM)
6322 : 0 : STR = DAIR*BSUMR(J) - DAII*BSUMI(J)
6323 : 0 : STI = DAIR*BSUMI(J) + DAII*BSUMR(J)
6324 : 0 : PTR = STR*CR2R - STI*CR2I
6325 : 0 : PTI = STR*CR2I + STI*CR2R
6326 : 0 : STR = PTR + (AIR*ASUMR(J)-AII*ASUMI(J))
6327 : 0 : STI = PTI + (AIR*ASUMI(J)+AII*ASUMR(J))
6328 : 0 : PTR = STR*PHIR(J) - STI*PHII(J)
6329 : 0 : PTI = STR*PHII(J) + STI*PHIR(J)
6330 : 0 : S2R = PTR*CSR - PTI*CSI
6331 : 0 : S2I = PTR*CSI + PTI*CSR
6332 : 0 : STR = DEXP(S1R)*CSSR(KFLAG)
6333 : 0 : S1R = STR*DCOS(S1I)
6334 : 0 : S1I = STR*DSIN(S1I)
6335 : 0 : STR = S2R*S1R - S2I*S1I
6336 : 0 : S2I = S1R*S2I + S2R*S1I
6337 : 0 : S2R = STR
6338 [ # # ]: 0 : IF (KFLAG.NE.1) GO TO 60
6339 : 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
6340 [ # # ]: 0 : IF (NW.NE.0) GO TO 70
6341 : : 60 CONTINUE
6342 [ # # ]: 0 : IF (YY.LE.0.0D0) S2I = -S2I
6343 : 0 : CYR(KDFLG) = S2R
6344 : 0 : CYI(KDFLG) = S2I
6345 : 0 : YR(I) = S2R*CSRR(KFLAG)
6346 : 0 : YI(I) = S2I*CSRR(KFLAG)
6347 : 0 : STR = CSI
6348 : 0 : CSI = -CSR
6349 : 0 : CSR = STR
6350 [ # # ]: 0 : IF (KDFLG.EQ.2) GO TO 85
6351 : : KDFLG = 2
6352 : 0 : GO TO 80
6353 : : 70 CONTINUE
6354 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 320
6355 : : !C-----------------------------------------------------------------------
6356 : : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
6357 : : !C-----------------------------------------------------------------------
6358 [ # # ]: 0 : IF (ZR.LT.0.0D0) GO TO 320
6359 : 0 : KDFLG = 1
6360 : 0 : YR(I)=ZEROR
6361 : 0 : YI(I)=ZEROI
6362 : 0 : NZ=NZ+1
6363 : 0 : STR = CSI
6364 : 0 : CSI =-CSR
6365 : 0 : CSR = STR
6366 [ # # ]: 0 : IF (I.EQ.1) GO TO 80
6367 [ # # # # ]: 0 : IF ((YR(I-1).EQ.ZEROR).AND.(YI(I-1).EQ.ZEROI)) GO TO 80
6368 : 0 : YR(I-1)=ZEROR
6369 : 0 : YI(I-1)=ZEROI
6370 : 0 : NZ=NZ+1
6371 : 0 : 80 CONTINUE
6372 : 0 : I = N
6373 : : 85 CONTINUE
6374 : 0 : RAZR = 1.0D0/AZABS(ZRR,ZRI)
6375 : 0 : STR = ZRR*RAZR
6376 : 0 : STI = -ZRI*RAZR
6377 : 0 : RZR = (STR+STR)*RAZR
6378 : 0 : RZI = (STI+STI)*RAZR
6379 : 0 : CKR = FN*RZR
6380 : 0 : CKI = FN*RZI
6381 : 0 : IB = I + 1
6382 [ # # ]: 0 : IF (N.LT.IB) GO TO 180
6383 : : !C-----------------------------------------------------------------------
6384 : : !C TEST LAST MEMBER FOR UNDERFLOW AND OVERFLOW. SET SEQUENCE TO ZERO
6385 : : !C ON UNDERFLOW.
6386 : : !C-----------------------------------------------------------------------
6387 : 0 : FN = FNU + DBLE(FLOAT(N-1))
6388 : 0 : IPARD = 1
6389 [ # # ]: 0 : IF (MR.NE.0) IPARD = 0
6390 : : CALL ZUNHJ(ZNR, ZNI, FN, IPARD, TOL, PHIDR, PHIDI, ARGDR, ARGDI, &
6391 : 0 : & ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, ASUMDI, BSUMDR, BSUMDI)
6392 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 90
6393 : 0 : STR = ZBR + ZET2DR
6394 : 0 : STI = ZBI + ZET2DI
6395 : 0 : RAST = FN/AZABS(STR,STI)
6396 : 0 : STR = STR*RAST*RAST
6397 : 0 : STI = -STI*RAST*RAST
6398 : 0 : S1R = ZET1DR - STR
6399 : 0 : S1I = ZET1DI - STI
6400 : 0 : GO TO 100
6401 : : 90 CONTINUE
6402 : 0 : S1R = ZET1DR - ZET2DR
6403 : 0 : S1I = ZET1DI - ZET2DI
6404 : : 100 CONTINUE
6405 : 0 : RS1 = S1R
6406 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 105
6407 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 120
6408 : : !C----------------------------------------------------------------------------
6409 : : !C REFINE ESTIMATE AND TEST
6410 : : !C-------------------------------------------------------------------------
6411 : 0 : APHI = AZABS(PHIDR,PHIDI)
6412 : 0 : RS1 = RS1+DLOG(APHI)
6413 [ # # ]: 0 : IF (DABS(RS1).LT.ELIM) GO TO 120
6414 : : 105 CONTINUE
6415 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 320
6416 : : !C-----------------------------------------------------------------------
6417 : : !C FOR ZR.LT.0.0, THE I FUNCTION TO BE ADDED WILL OVERFLOW
6418 : : !C-----------------------------------------------------------------------
6419 [ # # ]: 0 : IF (ZR.LT.0.0D0) GO TO 320
6420 : 0 : NZ = N
6421 [ # # ]: 0 : DO 106 I=1,N
6422 : 0 : YR(I) = ZEROR
6423 : 0 : YI(I) = ZEROI
6424 : 0 : 106 CONTINUE
6425 : 0 : RETURN
6426 : : 120 CONTINUE
6427 : 0 : S1R = CYR(1)
6428 : 0 : S1I = CYI(1)
6429 : 0 : S2R = CYR(2)
6430 : 0 : S2I = CYI(2)
6431 : 0 : C1R = CSRR(KFLAG)
6432 : 0 : ASCLE = BRY(KFLAG)
6433 [ # # ]: 0 : DO 130 I=IB,N
6434 : 0 : C2R = S2R
6435 : 0 : C2I = S2I
6436 : 0 : S2R = CKR*C2R - CKI*C2I + S1R
6437 : 0 : S2I = CKR*C2I + CKI*C2R + S1I
6438 : 0 : S1R = C2R
6439 : 0 : S1I = C2I
6440 : 0 : CKR = CKR + RZR
6441 : 0 : CKI = CKI + RZI
6442 : 0 : C2R = S2R*C1R
6443 : 0 : C2I = S2I*C1R
6444 : 0 : YR(I) = C2R
6445 : 0 : YI(I) = C2I
6446 [ # # ]: 0 : IF (KFLAG.GE.3) GO TO 130
6447 : 0 : STR = DABS(C2R)
6448 : 0 : STI = DABS(C2I)
6449 : 0 : C2M = DMAX1(STR,STI)
6450 [ # # ]: 0 : IF (C2M.LE.ASCLE) GO TO 130
6451 : 0 : KFLAG = KFLAG + 1
6452 : 0 : ASCLE = BRY(KFLAG)
6453 : 0 : S1R = S1R*C1R
6454 : 0 : S1I = S1I*C1R
6455 : : S2R = C2R
6456 : : S2I = C2I
6457 : 0 : S1R = S1R*CSSR(KFLAG)
6458 : 0 : S1I = S1I*CSSR(KFLAG)
6459 : 0 : S2R = S2R*CSSR(KFLAG)
6460 : 0 : S2I = S2I*CSSR(KFLAG)
6461 : 0 : C1R = CSRR(KFLAG)
6462 : 0 : 130 CONTINUE
6463 : : 180 CONTINUE
6464 [ # # ]: 0 : IF (MR.EQ.0) RETURN
6465 : : !C-----------------------------------------------------------------------
6466 : : !C ANALYTIC CONTINUATION FOR RE(Z).LT.0.0D0
6467 : : !C-----------------------------------------------------------------------
6468 : 0 : NZ = 0
6469 : 0 : FMR = DBLE(FLOAT(MR))
6470 : 0 : SGN = -DSIGN(PI,FMR)
6471 : : !C-----------------------------------------------------------------------
6472 : : !C CSPN AND CSGN ARE COEFF OF K AND I FUNCTIONS RESP.
6473 : : !C-----------------------------------------------------------------------
6474 : 0 : CSGNI = SGN
6475 [ # # ]: 0 : IF (YY.LE.0.0D0) CSGNI = -CSGNI
6476 : 0 : IFN = INU + N - 1
6477 : 0 : ANG = FNF*SGN
6478 : 0 : CSPNR = DCOS(ANG)
6479 : 0 : CSPNI = DSIN(ANG)
6480 [ # # ]: 0 : IF (MOD(IFN,2).EQ.0) GO TO 190
6481 : 0 : CSPNR = -CSPNR
6482 : 0 : CSPNI = -CSPNI
6483 : : 190 CONTINUE
6484 : : !C-----------------------------------------------------------------------
6485 : : !C CS=COEFF OF THE J FUNCTION TO GET THE I FUNCTION. I(FNU,Z) IS
6486 : : !C COMPUTED FROM EXP(I*FNU*HPI)*J(FNU,-I*Z) WHERE Z IS IN THE FIRST
6487 : : !C QUADRANT. FOURTH QUADRANT VALUES (YY.LE.0.0E0) ARE COMPUTED BY
6488 : : !C CONJUGATION SINCE THE I FUNCTION IS REAL ON THE POSITIVE REAL AXIS
6489 : : !C-----------------------------------------------------------------------
6490 : 0 : CSR = SAR*CSGNI
6491 : 0 : CSI = CAR*CSGNI
6492 : 0 : IN = MOD(IFN,4) + 1
6493 : 0 : C2R = CIPR(IN)
6494 : 0 : C2I = CIPI(IN)
6495 : 0 : STR = CSR*C2R + CSI*C2I
6496 : 0 : CSI = -CSR*C2I + CSI*C2R
6497 : 0 : CSR = STR
6498 : 0 : ASC = BRY(1)
6499 : 0 : IUF = 0
6500 : 0 : KK = N
6501 : 0 : KDFLG = 1
6502 : 0 : IB = IB - 1
6503 : 0 : IC = IB - 1
6504 [ # # ]: 0 : DO 290 K=1,N
6505 : 0 : FN = FNU + DBLE(FLOAT(KK-1))
6506 : : !C-----------------------------------------------------------------------
6507 : : !C LOGIC TO SORT OUT CASES WHOSE PARAMETERS WERE SET FOR THE K
6508 : : !C FUNCTION ABOVE
6509 : : !C-----------------------------------------------------------------------
6510 [ # # ]: 0 : IF (N.GT.2) GO TO 175
6511 : : 172 CONTINUE
6512 : 0 : PHIDR = PHIR(J)
6513 : 0 : PHIDI = PHII(J)
6514 : 0 : ARGDR = ARGR(J)
6515 : 0 : ARGDI = ARGI(J)
6516 : 0 : ZET1DR = ZETA1R(J)
6517 : 0 : ZET1DI = ZETA1I(J)
6518 : 0 : ZET2DR = ZETA2R(J)
6519 : 0 : ZET2DI = ZETA2I(J)
6520 : 0 : ASUMDR = ASUMR(J)
6521 : 0 : ASUMDI = ASUMI(J)
6522 : 0 : BSUMDR = BSUMR(J)
6523 : 0 : BSUMDI = BSUMI(J)
6524 : 0 : J = 3 - J
6525 : 0 : GO TO 210
6526 : : 175 CONTINUE
6527 [ # # # # ]: 0 : IF ((KK.EQ.N).AND.(IB.LT.N)) GO TO 210
6528 [ # # ]: 0 : IF ((KK.EQ.IB).OR.(KK.EQ.IC)) GO TO 172
6529 : : CALL ZUNHJ(ZNR, ZNI, FN, 0, TOL, PHIDR, PHIDI, ARGDR, &
6530 : : & ARGDI, ZET1DR, ZET1DI, ZET2DR, ZET2DI, ASUMDR, &
6531 : 0 : & ASUMDI, BSUMDR, BSUMDI)
6532 : : 210 CONTINUE
6533 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 220
6534 : 0 : STR = ZBR + ZET2DR
6535 : 0 : STI = ZBI + ZET2DI
6536 : 0 : RAST = FN/AZABS(STR,STI)
6537 : 0 : STR = STR*RAST*RAST
6538 : 0 : STI = -STI*RAST*RAST
6539 : 0 : S1R = -ZET1DR + STR
6540 : 0 : S1I = -ZET1DI + STI
6541 : 0 : GO TO 230
6542 : : 220 CONTINUE
6543 : 0 : S1R = -ZET1DR + ZET2DR
6544 : 0 : S1I = -ZET1DI + ZET2DI
6545 : : 230 CONTINUE
6546 : : !C-----------------------------------------------------------------------
6547 : : !C TEST FOR UNDERFLOW AND OVERFLOW
6548 : : !C-----------------------------------------------------------------------
6549 : 0 : RS1 = S1R
6550 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 280
6551 [ # # ]: 0 : IF (KDFLG.EQ.1) IFLAG = 2
6552 [ # # ]: 0 : IF (DABS(RS1).LT.ALIM) GO TO 240
6553 : : !C-----------------------------------------------------------------------
6554 : : !C REFINE TEST AND SCALE
6555 : : !C-----------------------------------------------------------------------
6556 : 0 : APHI = AZABS(PHIDR,PHIDI)
6557 : 0 : AARG = AZABS(ARGDR,ARGDI)
6558 : 0 : RS1 = RS1 + DLOG(APHI) - 0.25D0*DLOG(AARG) - AIC
6559 [ # # ]: 0 : IF (DABS(RS1).GT.ELIM) GO TO 280
6560 [ # # ]: 0 : IF (KDFLG.EQ.1) IFLAG = 1
6561 [ # # ]: 0 : IF (RS1.LT.0.0D0) GO TO 240
6562 [ # # ]: 0 : IF (KDFLG.EQ.1) IFLAG = 3
6563 : : 240 CONTINUE
6564 : 0 : CALL ZAIRY(ARGDR, ARGDI, 0, 2, AIR, AII, NAI, IDUM)
6565 : 0 : CALL ZAIRY(ARGDR, ARGDI, 1, 2, DAIR, DAII, NDAI, IDUM)
6566 : 0 : STR = DAIR*BSUMDR - DAII*BSUMDI
6567 : 0 : STI = DAIR*BSUMDI + DAII*BSUMDR
6568 : 0 : STR = STR + (AIR*ASUMDR-AII*ASUMDI)
6569 : 0 : STI = STI + (AIR*ASUMDI+AII*ASUMDR)
6570 : 0 : PTR = STR*PHIDR - STI*PHIDI
6571 : 0 : PTI = STR*PHIDI + STI*PHIDR
6572 : 0 : S2R = PTR*CSR - PTI*CSI
6573 : 0 : S2I = PTR*CSI + PTI*CSR
6574 : 0 : STR = DEXP(S1R)*CSSR(IFLAG)
6575 : 0 : S1R = STR*DCOS(S1I)
6576 : 0 : S1I = STR*DSIN(S1I)
6577 : 0 : STR = S2R*S1R - S2I*S1I
6578 : 0 : S2I = S2R*S1I + S2I*S1R
6579 : 0 : S2R = STR
6580 [ # # ]: 0 : IF (IFLAG.NE.1) GO TO 250
6581 : 0 : CALL ZUCHK(S2R, S2I, NW, BRY(1), TOL)
6582 [ # # ]: 0 : IF (NW.EQ.0) GO TO 250
6583 : 0 : S2R = ZEROR
6584 : 0 : S2I = ZEROI
6585 : : 250 CONTINUE
6586 [ # # ]: 0 : IF (YY.LE.0.0D0) S2I = -S2I
6587 : 0 : CYR(KDFLG) = S2R
6588 : 0 : CYI(KDFLG) = S2I
6589 : 0 : C2R = S2R
6590 : 0 : C2I = S2I
6591 : 0 : S2R = S2R*CSRR(IFLAG)
6592 : 0 : S2I = S2I*CSRR(IFLAG)
6593 : : !C-----------------------------------------------------------------------
6594 : : !C ADD I AND K FUNCTIONS, K SEQUENCE IN Y(I), I=1,N
6595 : : !C-----------------------------------------------------------------------
6596 : 0 : S1R = YR(KK)
6597 : 0 : S1I = YI(KK)
6598 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 270
6599 : 0 : CALL ZS1S2(ZRR, ZRI, S1R, S1I, S2R, S2I, NW, ASC, ALIM, IUF)
6600 : 0 : NZ = NZ + NW
6601 : : 270 CONTINUE
6602 : 0 : YR(KK) = S1R*CSPNR - S1I*CSPNI + S2R
6603 : 0 : YI(KK) = S1R*CSPNI + S1I*CSPNR + S2I
6604 : 0 : KK = KK - 1
6605 : 0 : CSPNR = -CSPNR
6606 : 0 : CSPNI = -CSPNI
6607 : 0 : STR = CSI
6608 : 0 : CSI = -CSR
6609 : 0 : CSR = STR
6610 [ # # # # ]: 0 : IF (C2R.NE.0.0D0 .OR. C2I.NE.0.0D0) GO TO 255
6611 : : KDFLG = 1
6612 : 0 : GO TO 290
6613 : : 255 CONTINUE
6614 [ # # ]: 0 : IF (KDFLG.EQ.2) GO TO 295
6615 : : KDFLG = 2
6616 : 0 : GO TO 290
6617 : : 280 CONTINUE
6618 [ # # ]: 0 : IF (RS1.GT.0.0D0) GO TO 320
6619 : 0 : S2R = ZEROR
6620 : 0 : S2I = ZEROI
6621 : 0 : GO TO 250
6622 : 0 : 290 CONTINUE
6623 : 0 : K = N
6624 : : 295 CONTINUE
6625 : 0 : IL = N - K
6626 [ # # ]: 0 : IF (IL.EQ.0) RETURN
6627 : : !C-----------------------------------------------------------------------
6628 : : !C RECUR BACKWARD FOR REMAINDER OF I SEQUENCE AND ADD IN THE
6629 : : !C K FUNCTIONS, SCALING THE I SEQUENCE DURING RECURRENCE TO KEEP
6630 : : !C INTERMEDIATE ARITHMETIC ON SCALE NEAR EXPONENT EXTREMES.
6631 : : !C-----------------------------------------------------------------------
6632 : 0 : S1R = CYR(1)
6633 : 0 : S1I = CYI(1)
6634 : 0 : S2R = CYR(2)
6635 : 0 : S2I = CYI(2)
6636 : 0 : CSR = CSRR(IFLAG)
6637 : 0 : ASCLE = BRY(IFLAG)
6638 : 0 : FN = DBLE(FLOAT(INU+IL))
6639 [ # # ]: 0 : DO 310 I=1,IL
6640 : 0 : C2R = S2R
6641 : 0 : C2I = S2I
6642 : 0 : S2R = S1R + (FN+FNF)*(RZR*C2R-RZI*C2I)
6643 : 0 : S2I = S1I + (FN+FNF)*(RZR*C2I+RZI*C2R)
6644 : 0 : S1R = C2R
6645 : 0 : S1I = C2I
6646 : 0 : FN = FN - 1.0D0
6647 : 0 : C2R = S2R*CSR
6648 : 0 : C2I = S2I*CSR
6649 : 0 : CKR = C2R
6650 : 0 : CKI = C2I
6651 : 0 : C1R = YR(KK)
6652 : 0 : C1I = YI(KK)
6653 [ # # ]: 0 : IF (KODE.EQ.1) GO TO 300
6654 : 0 : CALL ZS1S2(ZRR, ZRI, C1R, C1I, C2R, C2I, NW, ASC, ALIM, IUF)
6655 : 0 : NZ = NZ + NW
6656 : : 300 CONTINUE
6657 : 0 : YR(KK) = C1R*CSPNR - C1I*CSPNI + C2R
6658 : 0 : YI(KK) = C1R*CSPNI + C1I*CSPNR + C2I
6659 : 0 : KK = KK - 1
6660 : 0 : CSPNR = -CSPNR
6661 : 0 : CSPNI = -CSPNI
6662 [ # # ]: 0 : IF (IFLAG.GE.3) GO TO 310
6663 : 0 : C2R = DABS(CKR)
6664 : 0 : C2I = DABS(CKI)
6665 : 0 : C2M = DMAX1(C2R,C2I)
6666 [ # # ]: 0 : IF (C2M.LE.ASCLE) GO TO 310
6667 : 0 : IFLAG = IFLAG + 1
6668 : 0 : ASCLE = BRY(IFLAG)
6669 : 0 : S1R = S1R*CSR
6670 : 0 : S1I = S1I*CSR
6671 : : S2R = CKR
6672 : : S2I = CKI
6673 : 0 : S1R = S1R*CSSR(IFLAG)
6674 : 0 : S1I = S1I*CSSR(IFLAG)
6675 : 0 : S2R = S2R*CSSR(IFLAG)
6676 : 0 : S2I = S2I*CSSR(IFLAG)
6677 : 0 : CSR = CSRR(IFLAG)
6678 : 0 : 310 CONTINUE
6679 : 0 : RETURN
6680 : : 320 CONTINUE
6681 : 0 : NZ = -1
6682 : 0 : RETURN
6683 : : END SUBROUTINE ZUNK2
6684 : :
6685 : : !----------------------------------------------------------------------
6686 : :
6687 : :
6688 : : END MODULE m_bessel2
6689 : : !!***
6690 : :
|