GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
zbesi.f
Go to the documentation of this file.
1 SUBROUTINE zbesi(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
2C***BEGIN PROLOGUE ZBESI
3C***DATE WRITTEN 830501 (YYMMDD)
4C***REVISION DATE 890801 (YYMMDD)
5C***CATEGORY NO. B5K
6C***KEYWORDS I-BESSEL FUNCTION,COMPLEX BESSEL FUNCTION,
7C MODIFIED BESSEL FUNCTION OF THE FIRST KIND
8C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
9C***PURPOSE TO COMPUTE I-BESSEL FUNCTIONS OF COMPLEX ARGUMENT
10C***DESCRIPTION
11C
12C ***A DOUBLE PRECISION ROUTINE***
13C ON KODE=1, ZBESI COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
14C BESSEL FUNCTIONS CY(J)=I(FNU+J-1,Z) FOR REAL, NONNEGATIVE
15C ORDERS FNU+J-1, J=1,...,N AND COMPLEX Z IN THE CUT PLANE
16C -PI.LT.ARG(Z).LE.PI. ON KODE=2, ZBESI RETURNS THE SCALED
17C FUNCTIONS
18C
19C CY(J)=EXP(-ABS(X))*I(FNU+J-1,Z) J = 1,...,N , X=REAL(Z)
20C
21C WITH THE EXPONENTIAL GROWTH REMOVED IN BOTH THE LEFT AND
22C RIGHT HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
23C ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
24C (REF. 1).
25C
26C INPUT ZR,ZI,FNU ARE DOUBLE PRECISION
27C ZR,ZI - Z=CMPLX(ZR,ZI), -PI.LT.ARG(Z).LE.PI
28C FNU - ORDER OF INITIAL I FUNCTION, FNU.GE.0.0D0
29C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
30C KODE= 1 RETURNS
31C CY(J)=I(FNU+J-1,Z), J=1,...,N
32C = 2 RETURNS
33C CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)), J=1,...,N
34C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
35C
36C OUTPUT CYR,CYI ARE DOUBLE PRECISION
37C CYR,CYI- DOUBLE PRECISION VECTORS WHOSE FIRST N COMPONENTS
38C CONTAIN REAL AND IMAGINARY PARTS FOR THE SEQUENCE
39C CY(J)=I(FNU+J-1,Z) OR
40C CY(J)=I(FNU+J-1,Z)*EXP(-ABS(X)) J=1,...,N
41C DEPENDING ON KODE, X=REAL(Z)
42C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
43C NZ= 0 , NORMAL RETURN
44C NZ.GT.0 , LAST NZ COMPONENTS OF CY SET TO ZERO
45C TO UNDERFLOW, CY(J)=CMPLX(0.0D0,0.0D0)
46C J = N-NZ+1,...,N
47C IERR - ERROR FLAG
48C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
49C IERR=1, INPUT ERROR - NO COMPUTATION
50C IERR=2, OVERFLOW - NO COMPUTATION, REAL(Z) TOO
51C LARGE ON KODE=1
52C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
53C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
54C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
55C ACCURACY
56C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
57C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
58C CANCE BY ARGUMENT REDUCTION
59C IERR=5, ERROR - NO COMPUTATION,
60C ALGORITHM TERMINATION CONDITION NOT MET
61C
62C***LONG DESCRIPTION
63C
64C THE COMPUTATION IS CARRIED OUT BY THE POWER SERIES FOR
65C SMALL CABS(Z), THE ASYMPTOTIC EXPANSION FOR LARGE CABS(Z),
66C THE MILLER ALGORITHM NORMALIZED BY THE WRONSKIAN AND A
67C NEUMANN SERIES FOR IMTERMEDIATE MAGNITUDES, AND THE
68C UNIFORM ASYMPTOTIC EXPANSIONS FOR I(FNU,Z) AND J(FNU,Z)
69C FOR LARGE ORDERS. BACKWARD RECURRENCE IS USED TO GENERATE
70C SEQUENCES OR REDUCE ORDERS WHEN NECESSARY.
71C
72C THE CALCULATIONS ABOVE ARE DONE IN THE RIGHT HALF PLANE AND
73C CONTINUED INTO THE LEFT HALF PLANE BY THE FORMULA
74C
75C I(FNU,Z*EXP(M*PI)) = EXP(M*PI*FNU)*I(FNU,Z) REAL(Z).GT.0.0
76C M = +I OR -I, I**2=-1
77C
78C FOR NEGATIVE ORDERS,THE FORMULA
79C
80C I(-FNU,Z) = I(FNU,Z) + (2/PI)*SIN(PI*FNU)*K(FNU,Z)
81C
82C CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
83C THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
84C INTEGER,THE MAGNITUDE OF I(-FNU,Z)=I(FNU,Z) IS A LARGE
85C NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
86C K(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
87C TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
88C UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
89C OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
90C LARGE MEANS FNU.GT.CABS(Z).
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 ZBINU,I1MACH,D1MACH
151C***END PROLOGUE ZBESI
152C COMPLEX CONE,CSGN,CW,CY,CZERO,Z,ZN
153 DOUBLE PRECISION AA, ALIM, ARG, CONEI, CONER, CSGNI, CSGNR, CYI,
154 * CYR, DIG, ELIM, FNU, FNUL, PI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR,
155 * ZR, D1MACH, AZ, BB, FN, XZABS, ASCLE, RTOL, ATOL, STI
156 INTEGER I, IERR, INU, K, KODE, K1,K2,N,NZ,NN, I1MACH
157 dimension cyr(n), cyi(n)
158 DATA pi /3.14159265358979324d0/
159 DATA coner, conei /1.0d0,0.0d0/
160C
161C***FIRST EXECUTABLE STATEMENT ZBESI
162 ierr = 0
163 nz=0
164 IF (fnu.LT.0.0d0) ierr=1
165 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
166 IF (n.LT.1) ierr=1
167 IF (ierr.NE.0) RETURN
168C-----------------------------------------------------------------------
169C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
170C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
171C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
172C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
173C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
174C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
175C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
176C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
177C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
178C-----------------------------------------------------------------------
179 tol = dmax1(d1mach(4),1.0d-18)
180 k1 = i1mach(15)
181 k2 = i1mach(16)
182 r1m5 = d1mach(5)
183 k = min0(iabs(k1),iabs(k2))
184 elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
185 k1 = i1mach(14) - 1
186 aa = r1m5*dble(float(k1))
187 dig = dmin1(aa,18.0d0)
188 aa = aa*2.303d0
189 alim = elim + dmax1(-aa,-41.45d0)
190 rl = 1.2d0*dig + 3.0d0
191 fnul = 10.0d0 + 6.0d0*(dig-3.0d0)
192C-----------------------------------------------------------------------------
193C TEST FOR PROPER RANGE
194C-----------------------------------------------------------------------
195 az = xzabs(zr,zi)
196 fn = fnu+dble(float(n-1))
197 aa = 0.5d0/tol
198 bb=dble(float(i1mach(9)))*0.5d0
199 aa = dmin1(aa,bb)
200 IF (az.GT.aa) GO TO 260
201 IF (fn.GT.aa) GO TO 260
202 aa = dsqrt(aa)
203 IF (az.GT.aa) ierr=3
204 IF (fn.GT.aa) ierr=3
205 35 CONTINUE
206 znr = zr
207 zni = zi
208 csgnr = coner
209 csgni = conei
210 IF (zr.GE.0.0d0) GO TO 40
211 znr = -zr
212 zni = -zi
213C-----------------------------------------------------------------------
214C CALCULATE CSGN=EXP(FNU*PI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
215C WHEN FNU IS LARGE
216C-----------------------------------------------------------------------
217 inu = int(sngl(fnu))
218 arg = (fnu-dble(float(inu)))*pi
219 IF (zi.LT.0.0d0) arg = -arg
220 csgnr = dcos(arg)
221 csgni = dsin(arg)
222 IF (mod(inu,2).EQ.0) GO TO 40
223 csgnr = -csgnr
224 csgni = -csgni
225 40 CONTINUE
226 CALL zbinu(znr, zni, fnu, kode, n, cyr, cyi, nz, rl, fnul, tol,
227 * elim, alim)
228 IF (nz.LT.0) GO TO 120
229 IF (zr.GE.0.0d0) RETURN
230C-----------------------------------------------------------------------
231C ANALYTIC CONTINUATION TO THE LEFT HALF PLANE
232C-----------------------------------------------------------------------
233 nn = n - nz
234 IF (nn.EQ.0) RETURN
235 rtol = 1.0d0/tol
236 ascle = d1mach(1)*rtol*1.0d+3
237 DO 50 i=1,nn
238C STR = CYR(I)*CSGNR - CYI(I)*CSGNI
239C CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
240C CYR(I) = STR
241 aa = cyr(i)
242 bb = cyi(i)
243 atol = 1.0d0
244 IF (dmax1(dabs(aa),dabs(bb)).GT.ascle) GO TO 55
245 aa = aa*rtol
246 bb = bb*rtol
247 atol = tol
248 55 CONTINUE
249 str = aa*csgnr - bb*csgni
250 sti = aa*csgni + bb*csgnr
251 cyr(i) = str*atol
252 cyi(i) = sti*atol
253 csgnr = -csgnr
254 csgni = -csgni
255 50 CONTINUE
256 RETURN
257 120 CONTINUE
258 IF(nz.EQ.(-2)) GO TO 130
259 nz = 0
260 ierr=2
261 RETURN
262 130 CONTINUE
263 nz=0
264 ierr=5
265 RETURN
266 260 CONTINUE
267 ierr=4
268 GO TO 35
269 END
T mod(T x, T y)
Definition lo-mappers.h:294
subroutine zbesi(zr, zi, fnu, kode, n, cyr, cyi, nz, ierr)
Definition zbesi.f:2
subroutine zbinu(zr, zi, fnu, kode, n, cyr, cyi, nz, rl, fnul, tol, elim, alim)
Definition zbinu.f:3