GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
zbesk.f
Go to the documentation of this file.
1 SUBROUTINE zbesk(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
2C***BEGIN PROLOGUE ZBESK
3C***DATE WRITTEN 830501 (YYMMDD)
4C***REVISION DATE 890801 (YYMMDD)
5C***CATEGORY NO. B5K
6C***KEYWORDS K-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
7C MODIFIED BESSEL FUNCTION OF THE SECOND KIND,
8C BESSEL FUNCTION OF THE THIRD KIND
9C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
10C***PURPOSE TO COMPUTE K-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
11C***DESCRIPTION
12C
13C ***A DOUBLE PRECISION ROUTINE***
14C
15C ON KODE=1, CBESK COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
16C BESSEL FUNCTIONS CY(J)=K(FNU+J-1,Z) FOR REAL, NONNEGATIVE
17C ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z.NE.CMPLX(0.0,0.0)
18C IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESK
19C RETURNS THE SCALED K FUNCTIONS,
20C
21C CY(J)=EXP(Z)*K(FNU+J-1,Z) , J=1,...,N,
22C
23C WHICH REMOVE THE EXPONENTIAL BEHAVIOR IN BOTH THE LEFT AND
24C RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND
25C NOTATION ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL
26C FUNCTIONS (REF. 1).
27C
28C INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
29C ZR,ZI - Z=CMPLX(ZR,ZI), Z.NE.CMPLX(0.0D0,0.0D0),
30C -PI.LT.ARG(Z).LE.PI
31C FNU - ORDER OF INITIAL K FUNCTION, FNU.GE.0.0D0
32C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
33C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
34C KODE= 1 RETURNS
35C CY(I)=K(FNU+I-1,Z), I=1,...,N
36C = 2 RETURNS
37C CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
38C
39C OUTPUT CYR,CYI ARE DOUBLE PRECISION
40C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
41C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
42C CY(I)=K(FNU+I-1,Z), I=1,...,N OR
43C CY(I)=K(FNU+I-1,Z)*EXP(Z), I=1,...,N
44C DEPENDING ON KODE
45C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW.
46C NZ= 0 , NORMAL RETURN
47C NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO DUE
48C TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
49C I=1,...,N WHEN X.GE.0.0. WHEN X.LT.0.0
50C NZ STATES ONLY THE NUMBER OF UNDERFLOWS
51C IN THE SEQUENCE.
52C
53C IERR - ERROR FLAG
54C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
55C IERR=1, INPUT ERROR - NO COMPUTATION
56C IERR=2, OVERFLOW - NO COMPUTATION, FNU IS
57C TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
58C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
59C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
60C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
61C ACCURACY
62C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
63C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
64C CANCE BY ARGUMENT REDUCTION
65C IERR=5, ERROR - NO COMPUTATION,
66C ALGORITHM TERMINATION CONDITION NOT MET
67C
68C***LONG DESCRIPTION
69C
70C EQUATIONS OF THE REFERENCE ARE IMPLEMENTED FOR SMALL ORDERS
71C DNU AND DNU+1.0 IN THE RIGHT HALF PLANE X.GE.0.0. FORWARD
72C RECURRENCE GENERATES HIGHER ORDERS. K IS CONTINUED TO THE LEFT
73C HALF PLANE BY THE RELATION
74C
75C K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
76C MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
77C
78C WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
79C
80C FOR LARGE ORDERS, FNU.GT.FNUL, THE K FUNCTION IS COMPUTED
81C BY MEANS OF ITS UNIFORM ASYMPTOTIC EXPANSIONS.
82C
83C FOR NEGATIVE ORDERS, THE FORMULA
84C
85C K(-FNU,Z) = K(FNU,Z)
86C
87C CAN BE USED.
88C
89C CBESK ASSUMES THAT A SIGNIFICANT DIGIT SINH(X) FUNCTION IS
90C AVAILABLE.
91C
92C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
93C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
94C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
95C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
96C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
97C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
98C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
99C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
100C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
101C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
102C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
103C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
104C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
105C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
106C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
107C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
108C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
109C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
110C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
111C
112C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
113C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
114C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
115C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
116C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
117C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
118C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
119C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
120C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
121C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
122C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
123C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
124C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
125C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
126C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
127C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
128C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
129C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
130C OR -PI/2+P.
131C
132C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
133C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
134C COMMERCE, 1955.
135C
136C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
137C BY D. E. AMOS, SAND83-0083, MAY, 1983.
138C
139C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
140C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983.
141C
142C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
143C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
144C 1018, MAY, 1985
145C
146C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
147C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
148C MATH. SOFTWARE, 1986
149C
150C***ROUTINES CALLED ZACON,ZBKNU,ZBUNK,ZUOIK,XZABS,I1MACH,D1MACH
151C***END PROLOGUE ZBESK
152C
153C COMPLEX CY,Z
154 DOUBLE PRECISION AA, ALIM, ALN, ARG, AZ, CYI, CYR, DIG, ELIM, FN,
155 * FNU, FNUL, RL, R1M5, TOL, UFL, ZI, ZR, D1MACH, XZABS, BB
156 INTEGER IERR, K, KODE, K1, K2, MR, N, NN, NUF, NW, NZ, I1MACH
157 dimension cyr(n), cyi(n)
158C***FIRST EXECUTABLE STATEMENT ZBESK
159 ierr = 0
160 nz=0
161 IF (zi.EQ.0.0e0 .AND. zr.EQ.0.0e0) ierr=1
162 IF (fnu.LT.0.0d0) ierr=1
163 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
164 IF (n.LT.1) ierr=1
165 IF (ierr.NE.0) RETURN
166 nn = n
167C-----------------------------------------------------------------------
168C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
169C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
170C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
171C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
172C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
173C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
174C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
175C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
176C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
177C-----------------------------------------------------------------------
178 tol = dmax1(d1mach(4),1.0d-18)
179 k1 = i1mach(15)
180 k2 = i1mach(16)
181 r1m5 = d1mach(5)
182 k = min0(iabs(k1),iabs(k2))
183 elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
184 k1 = i1mach(14) - 1
185 aa = r1m5*dble(float(k1))
186 dig = dmin1(aa,18.0d0)
187 aa = aa*2.303d0
188 alim = elim + dmax1(-aa,-41.45d0)
189 fnul = 10.0d0 + 6.0d0*(dig-3.0d0)
190 rl = 1.2d0*dig + 3.0d0
191C-----------------------------------------------------------------------------
192C TEST FOR PROPER RANGE
193C-----------------------------------------------------------------------
194 az = xzabs(zr,zi)
195 fn = fnu + dble(float(nn-1))
196 aa = 0.5d0/tol
197 bb=dble(float(i1mach(9)))*0.5d0
198 aa = dmin1(aa,bb)
199 IF (az.GT.aa) GO TO 260
200 IF (fn.GT.aa) GO TO 260
201 aa = dsqrt(aa)
202 IF (az.GT.aa) ierr=3
203 IF (fn.GT.aa) ierr=3
204C-----------------------------------------------------------------------
205C OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
206C-----------------------------------------------------------------------
207C UFL = DEXP(-ELIM)
208 35 CONTINUE
209 ufl = d1mach(1)*1.0d+3
210 IF (az.LT.ufl) GO TO 180
211 IF (fnu.GT.fnul) GO TO 80
212 IF (fn.LE.1.0d0) GO TO 60
213 IF (fn.GT.2.0d0) GO TO 50
214 IF (az.GT.tol) GO TO 60
215 arg = 0.5d0*az
216 aln = -fn*dlog(arg)
217 IF (aln.GT.elim) GO TO 180
218 GO TO 60
219 50 CONTINUE
220 CALL zuoik(zr, zi, fnu, kode, 2, nn, cyr, cyi, nuf, tol, elim,
221 * alim)
222 IF (nuf.LT.0) GO TO 180
223 nz = nz + nuf
224 nn = nn - nuf
225C-----------------------------------------------------------------------
226C HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
227C IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
228C-----------------------------------------------------------------------
229 IF (nn.EQ.0) GO TO 100
230 60 CONTINUE
231 IF (zr.LT.0.0d0) GO TO 70
232C-----------------------------------------------------------------------
233C RIGHT HALF PLANE COMPUTATION, REAL(Z).GE.0.
234C-----------------------------------------------------------------------
235 CALL zbknu(zr, zi, fnu, kode, nn, cyr, cyi, nw, tol, elim, alim)
236 IF (nw.LT.0) GO TO 200
237 nz=nw
238 RETURN
239C-----------------------------------------------------------------------
240C LEFT HALF PLANE COMPUTATION
241C PI/2.LT.ARG(Z).LE.PI AND -PI.LT.ARG(Z).LT.-PI/2.
242C-----------------------------------------------------------------------
243 70 CONTINUE
244 IF (nz.NE.0) GO TO 180
245 mr = 1
246 IF (zi.LT.0.0d0) mr = -1
247 CALL zacon(zr, zi, fnu, kode, mr, nn, cyr, cyi, nw, rl, fnul,
248 * tol, elim, alim)
249 IF (nw.LT.0) GO TO 200
250 nz=nw
251 RETURN
252C-----------------------------------------------------------------------
253C UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
254C-----------------------------------------------------------------------
255 80 CONTINUE
256 mr = 0
257 IF (zr.GE.0.0d0) GO TO 90
258 mr = 1
259 IF (zi.LT.0.0d0) mr = -1
260 90 CONTINUE
261 CALL zbunk(zr, zi, fnu, kode, mr, nn, cyr, cyi, nw, tol, elim,
262 * alim)
263 IF (nw.LT.0) GO TO 200
264 nz = nz + nw
265 RETURN
266 100 CONTINUE
267 IF (zr.LT.0.0d0) GO TO 180
268 RETURN
269 180 CONTINUE
270 nz = 0
271 ierr=2
272 RETURN
273 200 CONTINUE
274 IF(nw.EQ.(-1)) GO TO 180
275 nz=0
276 ierr=5
277 RETURN
278 260 CONTINUE
279 ierr=4
280 GO TO 35
281 END
subroutine zacon(zr, zi, fnu, kode, mr, n, yr, yi, nz, rl, fnul, tol, elim, alim)
Definition zacon.f:3
subroutine zbesk(zr, zi, fnu, kode, n, cyr, cyi, nz, ierr)
Definition zbesk.f:2
subroutine zbknu(zr, zi, fnu, kode, n, yr, yi, nz, tol, elim, alim)
Definition zbknu.f:3
subroutine zbunk(zr, zi, fnu, kode, mr, n, yr, yi, nz, tol, elim, alim)
Definition zbunk.f:3
subroutine zuoik(zr, zi, fnu, kode, ikflg, n, yr, yi, nuf, tol, elim, alim)
Definition zuoik.f:3