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