GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
cbesj.f
Go to the documentation of this file.
1 SUBROUTINE cbesj(Z, FNU, KODE, N, CY, NZ, IERR)
2C***BEGIN PROLOGUE CBESJ
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 ON KODE=1, CBESJ COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
13C BESSEL FUNCTIONS CY(I)=J(FNU+I-1,Z) FOR REAL, NONNEGATIVE
14C ORDERS FNU+I-1, I=1,...,N AND COMPLEX Z IN THE CUT PLANE
15C -PI.LT.ARG(Z).LE.PI. ON KODE=2, CBESJ RETURNS THE SCALED
16C FUNCTIONS
17C
18C CY(I)=EXP(-ABS(Y))*J(FNU+I-1,Z) I = 1,...,N , Y=AIMAG(Z)
19C
20C WHICH REMOVE THE EXPONENTIAL GROWTH IN BOTH THE UPPER AND
21C LOWER HALF PLANES FOR Z TO INFINITY. DEFINITIONS AND NOTATION
22C ARE FOUND IN THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS
23C (REF. 1).
24C
25C INPUT
26C Z - Z=CMPLX(X,Y), -PI.LT.ARG(Z).LE.PI
27C FNU - ORDER OF INITIAL J FUNCTION, FNU.GE.0.0E0
28C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
29C KODE= 1 RETURNS
30C CY(I)=J(FNU+I-1,Z), I=1,...,N
31C = 2 RETURNS
32C CY(I)=J(FNU+I-1,Z)*EXP(-ABS(Y)), I=1,...
33C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
34C
35C OUTPUT
36C CY - A COMPLEX VECTOR WHOSE FIRST N COMPONENTS CONTAIN
37C VALUES FOR THE SEQUENCE
38C CY(I)=J(FNU+I-1,Z) OR
39C CY(I)=J(FNU+I-1,Z)*EXP(-ABS(Y)) I=1,...,N
40C DEPENDING ON KODE, Y=AIMAG(Z).
41C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
42C NZ= 0 , NORMAL RETURN
43C NZ.GT.0 , LAST NZ COMPONENTS OF CY SET TO ZERO
44C DUE TO UNDERFLOW, CY(I)=CMPLX(0.0,0.0),
45C I = N-NZ+1,...,N
46C IERR - ERROR FLAG
47C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
48C IERR=1, INPUT ERROR - NO COMPUTATION
49C IERR=2, OVERFLOW - NO COMPUTATION, AIMAG(Z)
50C TOO LARGE ON KODE=1
51C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
52C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
53C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
54C ACCURACY
55C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
56C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
57C CANCE BY ARGUMENT REDUCTION
58C IERR=5, ERROR - NO COMPUTATION,
59C ALGORITHM TERMINATION CONDITION NOT MET
60C
61C***LONG DESCRIPTION
62C
63C THE COMPUTATION IS CARRIED OUT BY THE FORMULA
64C
65C J(FNU,Z)=EXP( FNU*PI*I/2)*I(FNU,-I*Z) AIMAG(Z).GE.0.0
66C
67C J(FNU,Z)=EXP(-FNU*PI*I/2)*I(FNU, I*Z) AIMAG(Z).LT.0.0
68C
69C WHERE I**2 = -1 AND I(FNU,Z) IS THE I BESSEL FUNCTION.
70C
71C FOR NEGATIVE ORDERS,THE FORMULA
72C
73C J(-FNU,Z) = J(FNU,Z)*COS(PI*FNU) - Y(FNU,Z)*SIN(PI*FNU)
74C
75C CAN BE USED. HOWEVER,FOR LARGE ORDERS CLOSE TO INTEGERS, THE
76C THE FUNCTION CHANGES RADICALLY. WHEN FNU IS A LARGE POSITIVE
77C INTEGER,THE MAGNITUDE OF J(-FNU,Z)=J(FNU,Z)*COS(PI*FNU) IS A
78C LARGE NEGATIVE POWER OF TEN. BUT WHEN FNU IS NOT AN INTEGER,
79C Y(FNU,Z) DOMINATES IN MAGNITUDE WITH A LARGE POSITIVE POWER OF
80C TEN AND THE MOST THAT THE SECOND TERM CAN BE REDUCED IS BY
81C UNIT ROUNDOFF FROM THE COEFFICIENT. THUS, WIDE CHANGES CAN
82C OCCUR WITHIN UNIT ROUNDOFF OF A LARGE INTEGER FOR FNU. HERE,
83C LARGE MEANS FNU.GT.CABS(Z).
84C
85C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
86C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
87C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
88C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
89C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
90C IERR=3 IS TRIGGERED WHERE UR=R1MACH(4)=UNIT ROUNDOFF. ALSO
91C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
92C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
93C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
94C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
95C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
96C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
97C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
98C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
99C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
100C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
101C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
102C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
103C
104C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
105C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
106C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
107C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
108C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
109C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
110C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
111C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
112C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
113C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
114C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
115C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
116C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
117C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
118C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
119C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
120C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
121C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
122C OR -PI/2+P.
123C
124C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
125C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
126C COMMERCE, 1955.
127C
128C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
129C BY D. E. AMOS, SAND83-0083, MAY, 1983.
130C
131C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
132C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
133C
134C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
135C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
136C 1018, MAY, 1985
137C
138C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
139C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
140C MATH. SOFTWARE, 1986
141C
142C***ROUTINES CALLED CBINU,I1MACH,R1MACH
143C***END PROLOGUE CBESJ
144C
145 COMPLEX CI, CSGN, CY, Z, ZN
146 REAL AA, ALIM, ARG, DIG, ELIM, FNU, FNUL, HPI, RL, R1, R1M5, R2,
147 * TOL, YY, R1MACH, AZ, FN, BB, ASCLE, RTOL, ATOL
148 INTEGER I, IERR, INU, INUH, IR, KODE, K1, K2, N, NL, NZ, I1MACH, K
149 dimension cy(n)
150 DATA hpi /1.57079632679489662e0/
151C
152C***FIRST EXECUTABLE STATEMENT CBESJ
153 ierr = 0
154 nz=0
155 IF (fnu.LT.0.0e0) ierr=1
156 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
157 IF (n.LT.1) ierr=1
158 IF (ierr.NE.0) RETURN
159C-----------------------------------------------------------------------
160C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
161C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
162C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
163C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
164C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
165C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
166C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
167C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
168C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
169C-----------------------------------------------------------------------
170 tol = amax1(r1mach(4),1.0e-18)
171 k1 = i1mach(12)
172 k2 = i1mach(13)
173 r1m5 = r1mach(5)
174 k = min0(iabs(k1),iabs(k2))
175 elim = 2.303e0*(float(k)*r1m5-3.0e0)
176 k1 = i1mach(11) - 1
177 aa = r1m5*float(k1)
178 dig = amin1(aa,18.0e0)
179 aa = aa*2.303e0
180 alim = elim + amax1(-aa,-41.45e0)
181 rl = 1.2e0*dig + 3.0e0
182 fnul = 10.0e0 + 6.0e0*(dig-3.0e0)
183 ci = cmplx(0.0e0,1.0e0)
184 yy = aimag(z)
185 az = cabs(z)
186C-----------------------------------------------------------------------
187C TEST FOR RANGE
188C-----------------------------------------------------------------------
189 aa = 0.5e0/tol
190 bb=float(i1mach(9))*0.5e0
191 aa=amin1(aa,bb)
192 fn=fnu+float(n-1)
193 IF(az.GT.aa) GO TO 140
194 IF(fn.GT.aa) GO TO 140
195 aa=sqrt(aa)
196 IF(az.GT.aa) ierr=3
197 IF(fn.GT.aa) ierr=3
198C-----------------------------------------------------------------------
199C CALCULATE CSGN=EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
200C WHEN FNU IS LARGE
201C-----------------------------------------------------------------------
202 35 CONTINUE
203 inu = int(fnu)
204 inuh = inu/2
205 ir = inu - 2*inuh
206 arg = (fnu-float(inu-ir))*hpi
207 r1 = cos(arg)
208 r2 = sin(arg)
209 csgn = cmplx(r1,r2)
210 IF (mod(inuh,2).EQ.1) csgn = -csgn
211C-----------------------------------------------------------------------
212C ZN IS IN THE RIGHT HALF PLANE
213C-----------------------------------------------------------------------
214 zn = -z*ci
215 IF (yy.GE.0.0e0) GO TO 40
216 zn = -zn
217 csgn = conjg(csgn)
218 ci = conjg(ci)
219 40 CONTINUE
220 CALL cbinu(zn, fnu, kode, n, cy, nz, rl, fnul, tol, elim, alim)
221 IF (nz.LT.0) GO TO 120
222 nl = n - nz
223 IF (nl.EQ.0) RETURN
224 rtol = 1.0e0/tol
225 ascle = r1mach(1)*rtol*1.0e+3
226 DO 50 i=1,nl
227C CY(I)=CY(I)*CSGN
228 zn=cy(i)
229 aa=real(zn)
230 bb=aimag(zn)
231 atol=1.0e0
232 IF (amax1(abs(aa),abs(bb)).GT.ascle) GO TO 55
233 zn = zn*cmplx(rtol,0.0e0)
234 atol = tol
235 55 CONTINUE
236 zn = zn*csgn
237 cy(i) = zn*cmplx(atol,0.0e0)
238 csgn = csgn*ci
239 50 CONTINUE
240 RETURN
241 120 CONTINUE
242 IF(nz.EQ.(-2)) GO TO 130
243 nz = 0
244 ierr = 2
245 RETURN
246 130 CONTINUE
247 nz=0
248 ierr=5
249 RETURN
250 140 CONTINUE
251 ierr=4
252 GO TO 35
253 END
double complex cmplx
Definition Faddeeva.cc:227
subroutine cbesj(z, fnu, kode, n, cy, nz, ierr)
Definition cbesj.f:2
subroutine cbinu(z, fnu, kode, n, cy, nz, rl, fnul, tol, elim, alim)
Definition cbinu.f:3
ColumnVector real(const ComplexColumnVector &a)
T mod(T x, T y)
Definition lo-mappers.h:294