GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
cbesh.f
Go to the documentation of this file.
1 SUBROUTINE cbesh(Z, FNU, KODE, M, N, CY, NZ, IERR)
2C***BEGIN PROLOGUE CBESH
3C***DATE WRITTEN 830501 (YYMMDD)
4C***REVISION DATE 890801 (YYMMDD)
5C***CATEGORY NO. B5K
6C***KEYWORDS H-BESSEL FUNCTIONS,BESSEL FUNCTIONS OF COMPLEX ARGUMENT,
7C BESSEL FUNCTIONS OF THIRD KIND,HANKEL FUNCTIONS
8C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
9C***PURPOSE TO COMPUTE THE H-BESSEL FUNCTIONS OF A COMPLEX ARGUMENT
10C***DESCRIPTION
11C
12C ON KODE=1, CBESH COMPUTES AN N MEMBER SEQUENCE OF COMPLEX
13C HANKEL (BESSEL) FUNCTIONS CY(J)=H(M,FNU+J-1,Z) FOR KINDS M=1
14C OR 2, REAL, NONNEGATIVE ORDERS FNU+J-1, J=1,...,N, AND COMPLEX
15C Z.NE.CMPLX(0.0E0,0.0E0) IN THE CUT PLANE -PI.LT.ARG(Z).LE.PI.
16C ON KODE=2, CBESH COMPUTES THE SCALED HANKEL FUNCTIONS
17C
18C CY(I)=H(M,FNU+J-1,Z)*EXP(-MM*Z*I) MM=3-2M, I**2=-1.
19C
20C WHICH REMOVES THE EXPONENTIAL BEHAVIOR IN BOTH THE UPPER
21C AND LOWER HALF PLANES. DEFINITIONS AND NOTATION ARE FOUND IN
22C THE NBS HANDBOOK OF MATHEMATICAL FUNCTIONS (REF. 1).
23C
24C INPUT
25C Z - Z=CMPLX(X,Y), Z.NE.CMPLX(0.,0.),-PI.LT.ARG(Z).LE.PI
26C FNU - ORDER OF INITIAL H FUNCTION, FNU.GE.0.0E0
27C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
28C KODE= 1 RETURNS
29C CY(J)=H(M,FNU+J-1,Z), J=1,...,N
30C = 2 RETURNS
31C CY(J)=H(M,FNU+J-1,Z)*EXP(-I*Z*(3-2M))
32C J=1,...,N , I**2=-1
33C M - KIND OF HANKEL FUNCTION, M=1 OR 2
34C N - NUMBER OF MEMBERS OF THE SEQUENCE, N.GE.1
35C
36C OUTPUT
37C CY - A COMPLEX VECTOR WHOSE FIRST N COMPONENTS CONTAIN
38C VALUES FOR THE SEQUENCE
39C CY(J)=H(M,FNU+J-1,Z) OR
40C CY(J)=H(M,FNU+J-1,Z)*EXP(-I*Z*(3-2M)) J=1,...,N
41C DEPENDING ON KODE, I**2=-1.
42C NZ - NUMBER OF COMPONENTS SET TO ZERO DUE TO UNDERFLOW,
43C NZ= 0 , NORMAL RETURN
44C NZ.GT.0 , FIRST NZ COMPONENTS OF CY SET TO ZERO
45C DUE TO UNDERFLOW, CY(J)=CMPLX(0.0,0.0)
46C J=1,...,NZ WHEN Y.GT.0.0 AND M=1 OR
47C Y.LT.0.0 AND M=2. FOR THE COMPLMENTARY
48C HALF PLANES, NZ STATES ONLY THE NUMBER
49C OF UNDERFLOWS.
50C IERR -ERROR FLAG
51C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
52C IERR=1, INPUT ERROR - NO COMPUTATION
53C IERR=2, OVERFLOW - NO COMPUTATION, FNU+N-1 TOO
54C LARGE OR CABS(Z) TOO SMALL OR BOTH
55C IERR=3, CABS(Z) OR FNU+N-1 LARGE - COMPUTATION DONE
56C BUT LOSSES OF SIGNIFCANCE BY ARGUMENT
57C REDUCTION PRODUCE LESS THAN HALF OF MACHINE
58C ACCURACY
59C IERR=4, CABS(Z) OR FNU+N-1 TOO LARGE - NO COMPUTA-
60C TION BECAUSE OF COMPLETE LOSSES OF SIGNIFI-
61C CANCE BY ARGUMENT REDUCTION
62C IERR=5, ERROR - NO COMPUTATION,
63C ALGORITHM TERMINATION CONDITION NOT MET
64C
65C***LONG DESCRIPTION
66C
67C THE COMPUTATION IS CARRIED OUT BY THE RELATION
68C
69C H(M,FNU,Z)=(1/MP)*EXP(-MP*FNU)*K(FNU,Z*EXP(-MP))
70C MP=MM*HPI*I, MM=3-2*M, HPI=PI/2, I**2=-1
71C
72C FOR M=1 OR 2 WHERE THE K BESSEL FUNCTION IS COMPUTED FOR THE
73C RIGHT HALF PLANE RE(Z).GE.0.0. THE K FUNCTION IS CONTINUED
74C TO THE LEFT HALF PLANE BY THE RELATION
75C
76C K(FNU,Z*EXP(MP)) = EXP(-MP*FNU)*K(FNU,Z)-MP*I(FNU,Z)
77C MP=MR*PI*I, MR=+1 OR -1, RE(Z).GT.0, I**2=-1
78C
79C WHERE I(FNU,Z) IS THE I BESSEL FUNCTION.
80C
81C EXPONENTIAL DECAY OF H(M,FNU,Z) OCCURS IN THE UPPER HALF Z
82C PLANE FOR M=1 AND THE LOWER HALF Z PLANE FOR M=2. EXPONENTIAL
83C GROWTH OCCURS IN THE COMPLEMENTARY HALF PLANES. SCALING
84C BY EXP(-MM*Z*I) REMOVES THE EXPONENTIAL BEHAVIOR IN THE
85C WHOLE Z PLANE FOR Z TO INFINITY.
86C
87C FOR NEGATIVE ORDERS,THE FORMULAE
88C
89C H(1,-FNU,Z) = H(1,FNU,Z)*CEXP( PI*FNU*I)
90C H(2,-FNU,Z) = H(2,FNU,Z)*CEXP(-PI*FNU*I)
91C I**2=-1
92C
93C CAN BE USED.
94C
95C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
96C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z OR FNU+N-1 IS
97C LARGE, LOSSES OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR.
98C CONSEQUENTLY, IF EITHER ONE EXCEEDS U1=SQRT(0.5/UR), THEN
99C LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR FLAG
100C IERR=3 IS TRIGGERED WHERE UR=R1MACH(4)=UNIT ROUNDOFF. ALSO
101C IF EITHER IS LARGER THAN U2=0.5/UR, THEN ALL SIGNIFICANCE IS
102C LOST AND IERR=4. IN ORDER TO USE THE INT FUNCTION, ARGUMENTS
103C MUST BE FURTHER RESTRICTED NOT TO EXCEED THE LARGEST MACHINE
104C INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF Z AND FNU+N-1 IS
105C RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2, AND U3
106C ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE PRECISION
107C ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE PRECISION
108C ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMITING IN
109C THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT ONE CAN EXPECT
110C TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES, NO DIGITS
111C IN SINGLE AND ONLY 7 DIGITS IN DOUBLE PRECISION ARITHMETIC.
112C SIMILAR CONSIDERATIONS HOLD FOR OTHER MACHINES.
113C
114C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
115C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
116C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
117C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
118C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
119C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
120C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
121C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
122C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
123C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
124C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
125C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
126C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
127C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
128C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
129C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
130C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
131C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
132C OR -PI/2+P.
133C
134C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
135C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
136C COMMERCE, 1955.
137C
138C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
139C BY D. E. AMOS, SAND83-0083, MAY, 1983.
140C
141C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
142C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
143C
144C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
145C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
146C 1018, MAY, 1985
147C
148C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
149C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
150C MATH. SOFTWARE, 1986
151C
152C***ROUTINES CALLED CACON,CBKNU,CBUNK,CUOIK,I1MACH,R1MACH
153C***END PROLOGUE CBESH
154C
155 COMPLEX CY, Z, ZN, ZT, CSGN
156 REAL AA, ALIM, ALN, ARG, AZ, CPN, DIG, ELIM, FMM, FN, FNU, FNUL,
157 * HPI, RHPI, RL, R1M5, SGN, SPN, TOL, UFL, XN, XX, YN, YY, R1MACH,
158 * BB, ASCLE, RTOL, ATOL
159 INTEGER I, IERR, INU, INUH, IR, K, KODE, K1, K2, M,
160 * MM, MR, N, NN, NUF, NW, NZ, I1MACH
161 dimension cy(n)
162C
163 DATA hpi /1.57079632679489662e0/
164C
165C***FIRST EXECUTABLE STATEMENT CBESH
166 nz=0
167 xx = real(z)
168 yy = aimag(z)
169 ierr = 0
170 IF (xx.EQ.0.0e0 .AND. yy.EQ.0.0e0) ierr=1
171 IF (fnu.LT.0.0e0) ierr=1
172 IF (m.LT.1 .OR. m.GT.2) ierr=1
173 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
174 IF (n.LT.1) ierr=1
175 IF (ierr.NE.0) RETURN
176 nn = n
177C-----------------------------------------------------------------------
178C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
179C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
180C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
181C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
182C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
183C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
184C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
185C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
186C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU
187C-----------------------------------------------------------------------
188 tol = amax1(r1mach(4),1.0e-18)
189 k1 = i1mach(12)
190 k2 = i1mach(13)
191 r1m5 = r1mach(5)
192 k = min0(iabs(k1),iabs(k2))
193 elim = 2.303e0*(float(k)*r1m5-3.0e0)
194 k1 = i1mach(11) - 1
195 aa = r1m5*float(k1)
196 dig = amin1(aa,18.0e0)
197 aa = aa*2.303e0
198 alim = elim + amax1(-aa,-41.45e0)
199 fnul = 10.0e0 + 6.0e0*(dig-3.0e0)
200 rl = 1.2e0*dig + 3.0e0
201 fn = fnu + float(nn-1)
202 mm = 3 - m - m
203 fmm = float(mm)
204 zn = z*cmplx(0.0e0,-fmm)
205 xn = real(zn)
206 yn = aimag(zn)
207 az = cabs(z)
208C-----------------------------------------------------------------------
209C TEST FOR RANGE
210C-----------------------------------------------------------------------
211 aa = 0.5e0/tol
212 bb=float(i1mach(9))*0.5e0
213 aa=amin1(aa,bb)
214 IF(az.GT.aa) GO TO 240
215 IF(fn.GT.aa) GO TO 240
216 aa=sqrt(aa)
217 IF(az.GT.aa) ierr=3
218 IF(fn.GT.aa) ierr=3
219C-----------------------------------------------------------------------
220C OVERFLOW TEST ON THE LAST MEMBER OF THE SEQUENCE
221C-----------------------------------------------------------------------
222 35 CONTINUE
223 ufl = r1mach(1)*1.0e+3
224 IF (az.LT.ufl) GO TO 220
225 IF (fnu.GT.fnul) GO TO 90
226 IF (fn.LE.1.0e0) GO TO 70
227 IF (fn.GT.2.0e0) GO TO 60
228 IF (az.GT.tol) GO TO 70
229 arg = 0.5e0*az
230 aln = -fn*alog(arg)
231 IF (aln.GT.elim) GO TO 220
232 GO TO 70
233 60 CONTINUE
234 CALL cuoik(zn, fnu, kode, 2, nn, cy, nuf, tol, elim, alim)
235 IF (nuf.LT.0) GO TO 220
236 nz = nz + nuf
237 nn = nn - nuf
238C-----------------------------------------------------------------------
239C HERE NN=N OR NN=0 SINCE NUF=0,NN, OR -1 ON RETURN FROM CUOIK
240C IF NUF=NN, THEN CY(I)=CZERO FOR ALL I
241C-----------------------------------------------------------------------
242 IF (nn.EQ.0) GO TO 130
243 70 CONTINUE
244 IF ((xn.LT.0.0e0) .OR. (xn.EQ.0.0e0 .AND. yn.LT.0.0e0 .AND.
245 * m.EQ.2)) GO TO 80
246C-----------------------------------------------------------------------
247C RIGHT HALF PLANE COMPUTATION, XN.GE.0. .AND. (XN.NE.0. .OR.
248C YN.GE.0. .OR. M=1)
249C-----------------------------------------------------------------------
250 CALL cbknu(zn, fnu, kode, nn, cy, nz, tol, elim, alim)
251 GO TO 110
252C-----------------------------------------------------------------------
253C LEFT HALF PLANE COMPUTATION
254C-----------------------------------------------------------------------
255 80 CONTINUE
256 mr = -mm
257 CALL cacon(zn, fnu, kode, mr, nn, cy, nw, rl, fnul, tol, elim,
258 * alim)
259 IF (nw.LT.0) GO TO 230
260 nz=nw
261 GO TO 110
262 90 CONTINUE
263C-----------------------------------------------------------------------
264C UNIFORM ASYMPTOTIC EXPANSIONS FOR FNU.GT.FNUL
265C-----------------------------------------------------------------------
266 mr = 0
267 IF ((xn.GE.0.0e0) .AND. (xn.NE.0.0e0 .OR. yn.GE.0.0e0 .OR.
268 * m.NE.2)) GO TO 100
269 mr = -mm
270 IF (xn.EQ.0.0e0 .AND. yn.LT.0.0e0) zn = -zn
271 100 CONTINUE
272 CALL cbunk(zn, fnu, kode, mr, nn, cy, nw, tol, elim, alim)
273 IF (nw.LT.0) GO TO 230
274 nz = nz + nw
275 110 CONTINUE
276C-----------------------------------------------------------------------
277C H(M,FNU,Z) = -FMM*(I/HPI)*(ZT**FNU)*K(FNU,-Z*ZT)
278C
279C ZT=EXP(-FMM*HPI*I) = CMPLX(0.0,-FMM), FMM=3-2*M, M=1,2
280C-----------------------------------------------------------------------
281 sgn = sign(hpi,-fmm)
282C-----------------------------------------------------------------------
283C CALCULATE EXP(FNU*HPI*I) TO MINIMIZE LOSSES OF SIGNIFICANCE
284C WHEN FNU IS LARGE
285C-----------------------------------------------------------------------
286 inu = int(fnu)
287 inuh = inu/2
288 ir = inu - 2*inuh
289 arg = (fnu-float(inu-ir))*sgn
290 rhpi = 1.0e0/sgn
291 cpn = rhpi*cos(arg)
292 spn = rhpi*sin(arg)
293C ZN = CMPLX(-SPN,CPN)
294 csgn = cmplx(-spn,cpn)
295C IF (MOD(INUH,2).EQ.1) ZN = -ZN
296 IF (mod(inuh,2).EQ.1) csgn = -csgn
297 zt = cmplx(0.0e0,-fmm)
298 rtol = 1.0e0/tol
299 ascle = ufl*rtol
300 DO 120 i=1,nn
301C CY(I) = CY(I)*ZN
302C ZN = ZN*ZT
303 zn=cy(i)
304 aa=real(zn)
305 bb=aimag(zn)
306 atol=1.0e0
307 IF (amax1(abs(aa),abs(bb)).GT.ascle) GO TO 125
308 zn = zn*cmplx(rtol,0.0e0)
309 atol = tol
310 125 CONTINUE
311 zn = zn*csgn
312 cy(i) = zn*cmplx(atol,0.0e0)
313 csgn = csgn*zt
314 120 CONTINUE
315 RETURN
316 130 CONTINUE
317 IF (xn.LT.0.0e0) GO TO 220
318 RETURN
319 220 CONTINUE
320 ierr=2
321 nz=0
322 RETURN
323 230 CONTINUE
324 IF(nw.EQ.(-1)) GO TO 220
325 nz=0
326 ierr=5
327 RETURN
328 240 CONTINUE
329 ierr=4
330 GO TO 35
331 END
double complex cmplx
Definition Faddeeva.cc:227
subroutine cacon(z, fnu, kode, mr, n, y, nz, rl, fnul, tol, elim, alim)
Definition cacon.f:3
subroutine cbesh(z, fnu, kode, m, n, cy, nz, ierr)
Definition cbesh.f:2
subroutine cbknu(z, fnu, kode, n, y, nz, tol, elim, alim)
Definition cbknu.f:2
subroutine cbunk(z, fnu, kode, mr, n, y, nz, tol, elim, alim)
Definition cbunk.f:2
subroutine cuoik(z, fnu, kode, ikflg, n, y, nuf, tol, elim, alim)
Definition cuoik.f:2
ColumnVector real(const ComplexColumnVector &a)
T mod(T x, T y)
Definition lo-mappers.h:294