GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
zbesj.f
Go to the documentation of this file.
1 SUBROUTINE zbesj(ZR, ZI, FNU, KODE, N, CYR, CYI, NZ, IERR)
2C***BEGIN PROLOGUE ZBESJ
3C***DATE WRITTEN 830501 (YYMMDD)
4C***REVISION DATE 890801 (YYMMDD)
5C***CATEGORY NO. B5K
6C***KEYWORDS J-BESSEL FUNCTION,BESSEL FUNCTION OF COMPLEX ARGUMENT,
7C BESSEL FUNCTION OF FIRST KIND
8C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
9C***PURPOSE TO COMPUTE THE J-BESSEL FUNCTION OF A COMPLEX ARGUMENT
10C***DESCRIPTION
11C
12C ***A DOUBLE PRECISION ROUTINE***
13C ON KODE=1, CBESJ COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
14C BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE
15C ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
16C -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED
17C FUNCTIONS
18C
19C CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z)
20C
21C WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
22C LOWER 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 J FUNCTION, FNU.GE.0.0D0
29C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
30C KODE= 1 RETURNS
31C CY(I)=J(FNU+I-1,Z), I=1,...,N
32C = 2 RETURNS
33C CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)), I=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(I)=J(FNU+I-1,Z) OR
40C CY(I)=J(FNU+I-1,Z)EXP(-ABS(Y)) I=1,...,N
41C DEPENDING ON KODE, Y=AIMAG(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 ZERO DUE
45C TO UNDERFLOW, CY(I)=CMPLX(0.0D0,0.0D0),
46C I = 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, AIMAG(Z)
51C TOO 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 FORMULA
65C
66C J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z) AIMAG(Z).GE.0.0
67C
68C J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z) AIMAG(Z).LT.0.0
69C
70C WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION.
71C
72C FOR NEGATIVE ORDERS,THE FORMULA
73C
74C J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU)
75C
76C CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
77C THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
78C INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A
79C LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
80C Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
81C TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
82C UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
83C OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
84C LARGE MEANS FNU.GT.CABS(Z).
85C
86C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
87C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
88C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
89C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
90C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
91C IERR=3 IS TRIGGERED WHERE UR=DMAX1(D1MACH(4),1.0D-18) IS
92C DOUBLE PRECISION UNIT ROUNDOFF LIMITED TO 18 DIGITS PRECISION.
93C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
94C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
95C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
96C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
97C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
98C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
99C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
100C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
101C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
102C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
103C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
104C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
105C
106C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
107C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
108C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
109C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
110C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
111C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
112C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
113C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
114C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
115C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
116C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
117C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
118C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
119C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
120C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
121C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
122C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
123C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
124C OR -PI/2+P.
125C
126C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
127C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
128C COMMERCE, 1955.
129C
130C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
131C BY D. E. AMOS, SAND83-0083, MAY, 1983.
132C
133C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
134C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
135C
136C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
137C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
138C 1018, MAY, 1985
139C
140C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
141C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
142C MATH. SOFTWARE, 1986
143C
144C***ROUTINES CALLED ZBINU,I1MACH,D1MACH
145C***END PROLOGUE ZBESJ
146C
147C COMPLEX CI,CSGN,CY,Z,ZN
148 DOUBLE PRECISION AA, ALIM, ARG, CII, CSGNI, CSGNR, CYI, CYR, DIG,
149 * ELIM, FNU, FNUL, HPI, RL, R1M5, STR, TOL, ZI, ZNI, ZNR, ZR,
150 * D1MACH, BB, FN, AZ, XZABS, ASCLE, RTOL, ATOL, STI
151 INTEGER I, IERR, INU, INUH, IR, K, KODE, K1, K2, N, NL, NZ, I1MACH
152 dimension cyr(n), cyi(n)
153 DATA hpi /1.57079632679489662d0/
154C
155C***FIRST EXECUTABLE STATEMENT ZBESJ
156 ierr = 0
157 nz=0
158 IF (fnu.LT.0.0d0) ierr=1
159 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
160 IF (n.LT.1) ierr=1
161 IF (ierr.NE.0) RETURN
162C-----------------------------------------------------------------------
163C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
164C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
165C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
166C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
167C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
168C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
169C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
170C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
171C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
172C-----------------------------------------------------------------------
173 tol = dmax1(d1mach(4),1.0d-18)
174 k1 = i1mach(15)
175 k2 = i1mach(16)
176 r1m5 = d1mach(5)
177 k = min0(iabs(k1),iabs(k2))
178 elim = 2.303d0*(dble(float(k))*r1m5-3.0d0)
179 k1 = i1mach(14) - 1
180 aa = r1m5*dble(float(k1))
181 dig = dmin1(aa,18.0d0)
182 aa = aa*2.303d0
183 alim = elim + dmax1(-aa,-41.45d0)
184 rl = 1.2d0*dig + 3.0d0
185 fnul = 10.0d0 + 6.0d0*(dig-3.0d0)
186C-----------------------------------------------------------------------
187C TEST FOR PROPER RANGE
188C-----------------------------------------------------------------------
189 az = xzabs(zr,zi)
190 fn = fnu+dble(float(n-1))
191 aa = 0.5d0/tol
192 bb=dble(float(i1mach(9)))*0.5d0
193 aa = dmin1(aa,bb)
194 IF (az.GT.aa) GO TO 260
195 IF (fn.GT.aa) GO TO 260
196 aa = dsqrt(aa)
197 IF (az.GT.aa) ierr=3
198 IF (fn.GT.aa) ierr=3
199C-----------------------------------------------------------------------
200C CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
201C WHEN FNU IS LARGE
202C-----------------------------------------------------------------------
203 35 CONTINUE
204 cii = 1.0d0
205 inu = int(sngl(fnu))
206 inuh = inu/2
207 ir = inu - 2*inuh
208 arg = (fnu-dble(float(inu-ir)))*hpi
209 csgnr = dcos(arg)
210 csgni = dsin(arg)
211 IF (mod(inuh,2).EQ.0) GO TO 40
212 csgnr = -csgnr
213 csgni = -csgni
214 40 CONTINUE
215C-----------------------------------------------------------------------
216C ZN IS IN THE RIGHT HALF PLANE
217C-----------------------------------------------------------------------
218 znr = zi
219 zni = -zr
220 IF (zi.GE.0.0d0) GO TO 50
221 znr = -znr
222 zni = -zni
223 csgni = -csgni
224 cii = -cii
225 50 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 130
229 nl = n - nz
230 IF (nl.EQ.0) RETURN
231 rtol = 1.0d0/tol
232 ascle = d1mach(1)*rtol*1.0d+3
233 DO 60 i=1,nl
234C STR = CYR(I)*CSGNR - CYI(I)*CSGNI
235C CYI(I) = CYR(I)*CSGNI + CYI(I)*CSGNR
236C CYR(I) = STR
237 aa = cyr(i)
238 bb = cyi(i)
239 atol = 1.0d0
240 IF (dmax1(dabs(aa),dabs(bb)).GT.ascle) GO TO 55
241 aa = aa*rtol
242 bb = bb*rtol
243 atol = tol
244 55 CONTINUE
245 str = aa*csgnr - bb*csgni
246 sti = aa*csgni + bb*csgnr
247 cyr(i) = str*atol
248 cyi(i) = sti*atol
249 str = -csgni*cii
250 csgni = csgnr*cii
251 csgnr = str
252 60 CONTINUE
253 RETURN
254 130 CONTINUE
255 IF(nz.EQ.(-2)) GO TO 140
256 nz = 0
257 ierr = 2
258 RETURN
259 140 CONTINUE
260 nz=0
261 ierr=5
262 RETURN
263 260 CONTINUE
264 ierr=4
265 GO TO 35
266 RETURN
267 END
T mod(T x, T y)
Definition lo-mappers.h:294
subroutine zbesj(zr, zi, fnu, kode, n, cyr, cyi, nz, ierr)
Definition zbesj.f:2
subroutine zbinu(zr, zi, fnu, kode, n, cyr, cyi, nz, rl, fnul, tol, elim, alim)
Definition zbinu.f:3