GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
zbesy.f
Go to the documentation of this file.
1 SUBROUTINE zbesy(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, CWRKR, CWRKI,
2 * IERR)
3C***BEGIN PROLOGUE ZBESY
4C***DATE WRITTEN 830501 (YYMMDD)
5C***REVISION DATE 890801 (YYMMDD)
6C***CATEGORY NO. B5K
7C***KEYWORDS Y-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT,
8C BESSEL FUNCTION OF SECOND KIND
9C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
10C***PURPOSE TO COMPUTE THE Y-BESSEL FUNCTION OF A COMPLEX ARGUMENT
11C***DESCRIPTION
12C
13C ***A DOUBLE PRECISION ROUTINE***
14C
15C ON KODE=1, CBESY COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
16C BESSEL FUNCTIONS CY(I)=Y(FNU+I-1,Z) FOR REAL, NONNEGATIVE
17C ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
18C -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESY RETURNS THE SCALED
19C FUNCTIONS
20C
21C CY(I)=EXP(-ABS(Y))*Y(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z)
22C
23C WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
24C LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
25C ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
26C (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 Y FUNCTION, FNU.GE.0.0D0
32C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
33C KODE= 1 RETURNS
34C CY(I)=Y(FNU+I-1,Z), I=1,...,N
35C = 2 RETURNS
36C CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)), I=1,...,N
37C WHERE Y=AIMAG(Z)
38C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
39C CWRKR, - DOUBLE PRECISION WORK VECTORS OF DIMENSION AT
40C CWRKI AT LEAST N
41C
42C OUTPUT CYR,CYI ARE DOUBLE PRECISION
43C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
44C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
45C CY(I)=Y(FNU+I-1,Z) OR
46C CY(I)=Y(FNU+I-1,Z)*EXP(-ABS(Y)) I=1,...,N
47C DEPENDING ON KODE.
48C NZ - NZ=0 , A NORMAL RETURN
49C NZ.GT.0 , NZ COMPONENTS OF CY SET TO ZERO DUE TO
50C UNDERFLOW (GENERALLY ON KODE=2)
51C IERR - ERROR FLAG
52C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
53C IERR=1, INPUT ERROR - NO COMPUTATION
54C IERR=2, OVERFLOW - NO COMPUTATION, FNU IS
55C TOO LARGE OR CABS(Z) IS TOO SMALL OR BOTH
56C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
57C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
58C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
59C ACCURACY
60C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
61C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
62C CANCE BY ARGUMENT REDUCTION
63C IERR=5, ERROR - NO COMPUTATION,
64C ALGORITHM TERMINATION CONDITION NOT MET
65C
66C***LONG DESCRIPTION
67C
68C THE COMPUTATION IS CARRIED OUT BY THE FORMULA
69C
70C Y(FNU,Z)=0.5*(H(1,FNU,Z)-H(2,FNU,Z))/I
71C
72C WHERE I**2 = -1 AND THE HANKEL BESSEL FUNCTIONS H(1,FNU,Z)
73C AND H(2,FNU,Z) ARE CALCULATED IN CBESH.
74C
75C FOR NEGATIVE ORDERS,THE FORMULA
76C
77C Y(-FNU,Z) = Y(FNU,Z)*COS(PI*FNU) + J(FNU,Z)*SIN(PI*FNU)
78C
79C CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO HALF ODD
80C INTEGERS THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE
81C POSITIVE HALF ODD INTEGER,THE MAGNITUDE OF Y(-FNU,Z)=J(FNU,Z)*
82C SIN(PI*FNU) IS A LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS
83C NOT A HALF ODD INTEGER, Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A
84C LARGE POSITIVE POWER OF TEN AND THE MOST THAT THE SECOND TERM
85C CAN BE REDUCED IS BY UNIT ROUNDOFF FROM THE COEFFICIENT. THUS,
86C WIDE CHANGES CAN OCCUR WITHIN UNIT ROUNDOFF OF A LARGE HALF
87C ODD INTEGER. HERE, LARGE MEANS FNU.GT.CABS(Z).
88C
89C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
90C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
91C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
92C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
93C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
94C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
95C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
96C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
97C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
98C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
99C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
100C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
101C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
102C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
103C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
104C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
105C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
106C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
107C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
108C
109C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
110C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
111C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
112C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
113C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
114C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
115C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
116C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
117C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
118C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
119C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
120C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
121C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
122C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
123C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
124C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
125C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
126C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
127C OR -PI/2+P.
128C
129C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
130C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
131C COMMERCE, 1955.
132C
133C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
134C BY D. E. AMOS, SAND83-0083, MAY, 1983.
135C
136C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
137C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
138C
139C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
140C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
141C 1018, MAY, 1985
142C
143C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
144C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
145C MATH. SOFTWARE, 1986
146C
147C***ROUTINES CALLED ZBESH,I1MACH,D1MACH
148C***END PROLOGUE ZBESY
149C
150C COMPLEX CWRK,CY,C1,C2,EX,HCI,Z,ZU,ZV
151 DOUBLE PRECISION CWRKI, CWRKR, CYI, CYR, C1I, C1R, C2I, C2R,
152 * elim, exi, exr, ey, fnu, hcii, sti, str, tay, zi, zr, dexp,
153 * d1mach, ascle, rtol, atol, aa, bb, tol
154 INTEGER I, IERR, K, KODE, K1, K2, N, NZ, NZ1, NZ2, I1MACH
155 dimension cyr(n), cyi(n), cwrkr(n), cwrki(n)
156C***FIRST EXECUTABLE STATEMENT ZBESY
157 ierr = 0
158 nz=0
159 IF (zr.EQ.0.0d0 .AND. zi.EQ.0.0d0) ierr=1
160 IF (fnu.LT.0.0d0) ierr=1
161 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
162 IF (n.LT.1) ierr=1
163 IF (ierr.NE.0) RETURN
164 hcii = 0.5d0
165 CALL zbesh(zr, zi, fnu, kode, 1, n, cyr, cyi, nz1, ierr)
166 IF (ierr.NE.0.AND.ierr.NE.3) GO TO 170
167 CALL zbesh(zr, zi, fnu, kode, 2, n, cwrkr, cwrki, nz2, ierr)
168 IF (ierr.NE.0.AND.ierr.NE.3) GO TO 170
169 nz = min0(nz1,nz2)
170 IF (kode.EQ.2) GO TO 60
171 DO 50 i=1,n
172 str = cwrkr(i) - cyr(i)
173 sti = cwrki(i) - cyi(i)
174 cyr(i) = -sti*hcii
175 cyi(i) = str*hcii
176 50 CONTINUE
177 RETURN
178 60 CONTINUE
179 tol = dmax1(d1mach(4),1.0d-18)
180 k1 = i1mach(15)
181 k2 = i1mach(16)
182 k = min0(iabs(k1),iabs(k2))
183 r1m5 = d1mach(5)
184C-----------------------------------------------------------------------
185C ELIM IS THE APPROXIMATE EXPONENTIAL UNDER- AND OVERFLOW LIMIT
186C-----------------------------------------------------------------------
187 elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
188 exr = dcos(zr)
189 exi = dsin(zr)
190 ey = 0.0d0
191 tay = dabs(zi+zi)
192 IF (tay.LT.elim) ey = dexp(-tay)
193 IF (zi.LT.0.0d0) GO TO 90
194 c1r = exr*ey
195 c1i = exi*ey
196 c2r = exr
197 c2i = -exi
198 70 CONTINUE
199 nz = 0
200 rtol = 1.0d0/tol
201 ascle = d1mach(1)*rtol*1.0d+3
202 DO 80 i=1,n
203C STR = C1R*CYR(I) - C1I*CYI(I)
204C STI = C1R*CYI(I) + C1I*CYR(I)
205C STR = -STR + C2R*CWRKR(I) - C2I*CWRKI(I)
206C STI = -STI + C2R*CWRKI(I) + C2I*CWRKR(I)
207C CYR(I) = -STI*HCII
208C CYI(I) = STR*HCII
209 aa = cwrkr(i)
210 bb = cwrki(i)
211 atol = 1.0d0
212 IF (dmax1(dabs(aa),dabs(bb)).GT.ascle) GO TO 75
213 aa = aa*rtol
214 bb = bb*rtol
215 atol = tol
216 75 CONTINUE
217 str = (aa*c2r - bb*c2i)*atol
218 sti = (aa*c2i + bb*c2r)*atol
219 aa = cyr(i)
220 bb = cyi(i)
221 atol = 1.0d0
222 IF (dmax1(dabs(aa),dabs(bb)).GT.ascle) GO TO 85
223 aa = aa*rtol
224 bb = bb*rtol
225 atol = tol
226 85 CONTINUE
227 str = str - (aa*c1r - bb*c1i)*atol
228 sti = sti - (aa*c1i + bb*c1r)*atol
229 cyr(i) = -sti*hcii
230 cyi(i) = str*hcii
231 IF (str.EQ.0.0d0 .AND. sti.EQ.0.0d0 .AND. ey.EQ.0.0d0) nz = nz
232 * + 1
233 80 CONTINUE
234 RETURN
235 90 CONTINUE
236 c1r = exr
237 c1i = exi
238 c2r = exr*ey
239 c2i = -exi*ey
240 GO TO 70
241 170 CONTINUE
242 nz = 0
243 RETURN
244 END
double precision function d1mach(i)
Definition d1mach.f:23
subroutine zbesh(zr, zi, fnu, kode, m, n, cyr, cyi, nz, ierr)
Definition zbesh.f:2
subroutine zbesy(zr, zi, fnu, kode, n, cyr, cyi, nz, cwrkr, cwrki, ierr)
Definition zbesy.f:3