GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
cbiry.f
Go to the documentation of this file.
1 SUBROUTINE cbiry(Z, ID, KODE, BI, IERR)
2C***BEGIN PROLOGUE CBIRY
3C***DATE WRITTEN 830501 (YYMMDD)
4C***REVISION DATE 890801 (YYMMDD)
5C***CATEGORY NO. B5K
6C***KEYWORDS AIRY FUNCTION,BESSEL FUNCTIONS OF ORDER ONE THIRD
7C***AUTHOR AMOS, DONALD E., SANDIA NATIONAL LABORATORIES
8C***PURPOSE TO COMPUTE AIRY FUNCTIONS BI(Z) AND DBI(Z) FOR COMPLEX Z
9C***DESCRIPTION
10C
11C ON KODE=1, CBIRY COMPUTES THE COMPLEX AIRY FUNCTION BI(Z) OR
12C ITS DERIVATIVE DBI(Z)/DZ ON ID=0 OR ID=1 RESPECTIVELY. ON
13C KODE=2, A SCALING OPTION CEXP(-AXZTA)*BI(Z) OR CEXP(-AXZTA)*
14C DBI(Z)/DZ IS PROVIDED TO REMOVE THE EXPONENTIAL BEHAVIOR IN
15C BOTH THE LEFT AND RIGHT HALF PLANES WHERE
16C ZTA=(2/3)*Z*CSQRT(Z)=CMPLX(XZTA,YZTA) AND AXZTA=ABS(XZTA).
17C DEFINITIONS AND NOTATION ARE FOUND IN THE NBS HANDBOOK OF
18C MATHEMATICAL FUNCTIONS (REF. 1).
19C
20C INPUT
21C Z - Z=CMPLX(X,Y)
22C ID - ORDER OF DERIVATIVE, ID=0 OR ID=1
23C KODE - A PARAMETER TO INDICATE THE SCALING OPTION
24C KODE= 1 RETURNS
25C BI=BI(Z) ON ID=0 OR
26C BI=DBI(Z)/DZ ON ID=1
27C = 2 RETURNS
28C BI=CEXP(-AXZTA)*BI(Z) ON ID=0 OR
29C BI=CEXP(-AXZTA)*DBI(Z)/DZ ON ID=1 WHERE
30C ZTA=(2/3)*Z*CSQRT(Z)=CMPLX(XZTA,YZTA)
31C AND AXZTA=ABS(XZTA)
32C
33C OUTPUT
34C BI - COMPLEX ANSWER DEPENDING ON THE CHOICES FOR ID AND
35C KODE
36C IERR - ERROR FLAG
37C IERR=0, NORMAL RETURN - COMPUTATION COMPLETED
38C IERR=1, INPUT ERROR - NO COMPUTATION
39C IERR=2, OVERFLOW - NO COMPUTATION, REAL(Z)
40C TOO LARGE WITH KODE=1
41C IERR=3, CABS(Z) LARGE - COMPUTATION COMPLETED
42C LOSSES OF SIGNIFCANCE BY ARGUMENT REDUCTION
43C PRODUCE LESS THAN HALF OF MACHINE ACCURACY
44C IERR=4, CABS(Z) TOO LARGE - NO COMPUTATION
45C COMPLETE LOSS OF ACCURACY BY ARGUMENT
46C REDUCTION
47C IERR=5, ERROR - NO COMPUTATION,
48C ALGORITHM TERMINATION CONDITION NOT MET
49C
50C***LONG DESCRIPTION
51C
52C BI AND DBI ARE COMPUTED FOR CABS(Z).GT.1.0 FROM THE I BESSEL
53C FUNCTIONS BY
54C
55C BI(Z)=C*SQRT(Z)*( I(-1/3,ZTA) + I(1/3,ZTA) )
56C DBI(Z)=C * Z * ( I(-2/3,ZTA) + I(2/3,ZTA) )
57C C=1.0/SQRT(3.0)
58C ZTA=(2/3)*Z**(3/2)
59C
60C WITH THE POWER SERIES FOR CABS(Z).LE.1.0.
61C
62C IN MOST COMPLEX VARIABLE COMPUTATION, ONE MUST EVALUATE ELE-
63C MENTARY FUNCTIONS. WHEN THE MAGNITUDE OF Z IS LARGE, LOSSES
64C OF SIGNIFICANCE BY ARGUMENT REDUCTION OCCUR. CONSEQUENTLY, IF
65C THE MAGNITUDE OF ZETA=(2/3)*Z**1.5 EXCEEDS U1=SQRT(0.5/UR),
66C THEN LOSSES EXCEEDING HALF PRECISION ARE LIKELY AND AN ERROR
67C FLAG IERR=3 IS TRIGGERED WHERE UR=R1MACH(4)=UNIT ROUNDOFF.
68C ALSO, IF THE MAGNITUDE OF ZETA IS LARGER THAN U2=0.5/UR, THEN
69C ALL SIGNIFICANCE IS LOST AND IERR=4. IN ORDER TO USE THE INT
70C FUNCTION, ZETA MUST BE FURTHER RESTRICTED NOT TO EXCEED THE
71C LARGEST INTEGER, U3=I1MACH(9). THUS, THE MAGNITUDE OF ZETA
72C MUST BE RESTRICTED BY MIN(U2,U3). ON 32 BIT MACHINES, U1,U2,
73C AND U3 ARE APPROXIMATELY 2.0E+3, 4.2E+6, 2.1E+9 IN SINGLE
74C PRECISION ARITHMETIC AND 1.3E+8, 1.8E+16, 2.1E+9 IN DOUBLE
75C PRECISION ARITHMETIC RESPECTIVELY. THIS MAKES U2 AND U3 LIMIT-
76C ING IN THEIR RESPECTIVE ARITHMETICS. THIS MEANS THAT THE MAG-
77C NITUDE OF Z CANNOT EXCEED 3.1E+4 IN SINGLE AND 2.1E+6 IN
78C DOUBLE PRECISION ARITHMETIC. THIS ALSO MEANS THAT ONE CAN
79C EXPECT TO RETAIN, IN THE WORST CASES ON 32 BIT MACHINES,
80C NO DIGITS IN SINGLE PRECISION AND ONLY 7 DIGITS IN DOUBLE
81C PRECISION ARITHMETIC.
82C
83C THE APPROXIMATE RELATIVE ERROR IN THE MAGNITUDE OF A COMPLEX
84C BESSEL FUNCTION CAN BE EXPRESSED BY P*10**S WHERE P=MAX(UNIT
85C ROUNDOFF,1.0E-18) IS THE NOMINAL PRECISION AND 10**S REPRE-
86C SENTS THE INCREASE IN ERROR DUE TO ARGUMENT REDUCTION IN THE
87C ELEMENTARY FUNCTIONS. HERE, S=MAX(1,ABS(LOG10(CABS(Z))),
88C ABS(LOG10(FNU))) APPROXIMATELY (I.E. S=MAX(1,ABS(EXPONENT OF
89C CABS(Z),ABS(EXPONENT OF FNU)) ). HOWEVER, THE PHASE ANGLE MAY
90C HAVE ONLY ABSOLUTE ACCURACY. THIS IS MOST LIKELY TO OCCUR WHEN
91C ONE COMPONENT (IN ABSOLUTE VALUE) IS LARGER THAN THE OTHER BY
92C SEVERAL ORDERS OF MAGNITUDE. IF ONE COMPONENT IS 10**K LARGER
93C THAN THE OTHER, THEN ONE CAN EXPECT ONLY MAX(ABS(LOG10(P))-K,
94C 0) SIGNIFICANT DIGITS; OR, STATED ANOTHER WAY, WHEN K EXCEEDS
95C THE EXPONENT OF P, NO SIGNIFICANT DIGITS REMAIN IN THE SMALLER
96C COMPONENT. HOWEVER, THE PHASE ANGLE RETAINS ABSOLUTE ACCURACY
97C BECAUSE, IN COMPLEX ARITHMETIC WITH PRECISION P, THE SMALLER
98C COMPONENT WILL NOT (AS A RULE) DECREASE BELOW P TIMES THE
99C MAGNITUDE OF THE LARGER COMPONENT. IN THESE EXTREME CASES,
100C THE PRINCIPAL PHASE ANGLE IS ON THE ORDER OF +P, -P, PI/2-P,
101C OR -PI/2+P.
102C
103C***REFERENCES HANDBOOK OF MATHEMATICAL FUNCTIONS BY M. ABRAMOWITZ
104C AND I. A. STEGUN, NBS AMS SERIES 55, U.S. DEPT. OF
105C COMMERCE, 1955.
106C
107C COMPUTATION OF BESSEL FUNCTIONS OF COMPLEX ARGUMENT
108C AND LARGE ORDER BY D. E. AMOS, SAND83-0643, MAY, 1983
109C
110C A SUBROUTINE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
111C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, SAND85-
112C 1018, MAY, 1985
113C
114C A PORTABLE PACKAGE FOR BESSEL FUNCTIONS OF A COMPLEX
115C ARGUMENT AND NONNEGATIVE ORDER BY D. E. AMOS, TRANS.
116C MATH. SOFTWARE, 1986
117C
118C***ROUTINES CALLED CBINU,I1MACH,R1MACH
119C***END PROLOGUE CBIRY
120 COMPLEX BI, CONE, CSQ, CY, S1, S2, TRM1, TRM2, Z, ZTA, Z3
121 REAL AA, AD, AK, ALIM, ATRM, AZ, AZ3, BB, BK, CK, COEF, C1, C2,
122 * DIG, DK, D1, D2, ELIM, FID, FMR, FNU, FNUL, PI, RL, R1M5, SFAC,
123 * TOL, TTH, ZI, ZR, Z3I, Z3R, R1MACH
124 INTEGER ID, IERR, K, KODE, K1, K2, NZ, I1MACH
125 dimension cy(2)
126 DATA tth, c1, c2, coef, pi /6.66666666666666667e-01,
127 * 6.14926627446000736e-01,4.48288357353826359e-01,
128 * 5.77350269189625765e-01,3.14159265358979324e+00/
129 DATA cone / (1.0e0,0.0e0) /
130C***FIRST EXECUTABLE STATEMENT CBIRY
131 ierr = 0
132 nz=0
133 IF (id.LT.0 .OR. id.GT.1) ierr=1
134 IF (kode.LT.1 .OR. kode.GT.2) ierr=1
135 IF (ierr.NE.0) RETURN
136 az = cabs(z)
137 tol = amax1(r1mach(4),1.0e-18)
138 fid = float(id)
139 IF (az.GT.1.0e0) GO TO 60
140C-----------------------------------------------------------------------
141C POWER SERIES FOR CABS(Z).LE.1.
142C-----------------------------------------------------------------------
143 s1 = cone
144 s2 = cone
145 IF (az.LT.tol) GO TO 110
146 aa = az*az
147 IF (aa.LT.tol/az) GO TO 40
148 trm1 = cone
149 trm2 = cone
150 atrm = 1.0e0
151 z3 = z*z*z
152 az3 = az*aa
153 ak = 2.0e0 + fid
154 bk = 3.0e0 - fid - fid
155 ck = 4.0e0 - fid
156 dk = 3.0e0 + fid + fid
157 d1 = ak*dk
158 d2 = bk*ck
159 ad = amin1(d1,d2)
160 ak = 24.0e0 + 9.0e0*fid
161 bk = 30.0e0 - 9.0e0*fid
162 z3r = real(z3)
163 z3i = aimag(z3)
164 DO 30 k=1,25
165 trm1 = trm1*cmplx(z3r/d1,z3i/d1)
166 s1 = s1 + trm1
167 trm2 = trm2*cmplx(z3r/d2,z3i/d2)
168 s2 = s2 + trm2
169 atrm = atrm*az3/ad
170 d1 = d1 + ak
171 d2 = d2 + bk
172 ad = amin1(d1,d2)
173 IF (atrm.LT.tol*ad) GO TO 40
174 ak = ak + 18.0e0
175 bk = bk + 18.0e0
176 30 CONTINUE
177 40 CONTINUE
178 IF (id.EQ.1) GO TO 50
179 bi = s1*cmplx(c1,0.0e0) + z*s2*cmplx(c2,0.0e0)
180 IF (kode.EQ.1) RETURN
181 zta = z*csqrt(z)*cmplx(tth,0.0e0)
182 aa = real(zta)
183 aa = -abs(aa)
184 bi = bi*cmplx(exp(aa),0.0e0)
185 RETURN
186 50 CONTINUE
187 bi = s2*cmplx(c2,0.0e0)
188 IF (az.GT.tol) bi = bi + z*z*s1*cmplx(c1/(1.0e0+fid),0.0e0)
189 IF (kode.EQ.1) RETURN
190 zta = z*csqrt(z)*cmplx(tth,0.0e0)
191 aa = real(zta)
192 aa = -abs(aa)
193 bi = bi*cmplx(exp(aa),0.0e0)
194 RETURN
195C-----------------------------------------------------------------------
196C CASE FOR CABS(Z).GT.1.0
197C-----------------------------------------------------------------------
198 60 CONTINUE
199 fnu = (1.0e0+fid)/3.0e0
200C-----------------------------------------------------------------------
201C SET PARAMETERS RELATED TO MACHINE CONSTANTS.
202C TOL IS THE APPROXIMATE UNIT ROUNDOFF LIMITED TO 1.0E-18.
203C ELIM IS THE APPROXIMATE EXPONENTIAL OVER- AND UNDERFLOW LIMIT.
204C EXP(-ELIM).LT.EXP(-ALIM)=EXP(-ELIM)/TOL AND
205C EXP(ELIM).GT.EXP(ALIM)=EXP(ELIM)*TOL ARE INTERVALS NEAR
206C UNDERFLOW AND OVERFLOW LIMITS WHERE SCALED ARITHMETIC IS DONE.
207C RL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC EXPANSION FOR LARGE Z.
208C DIG = NUMBER OF BASE 10 DIGITS IN TOL = 10**(-DIG).
209C FNUL IS THE LOWER BOUNDARY OF THE ASYMPTOTIC SERIES FOR LARGE FNU.
210C-----------------------------------------------------------------------
211 k1 = i1mach(12)
212 k2 = i1mach(13)
213 r1m5 = r1mach(5)
214 k = min0(iabs(k1),iabs(k2))
215 elim = 2.303e0*(float(k)*r1m5-3.0e0)
216 k1 = i1mach(11) - 1
217 aa = r1m5*float(k1)
218 dig = amin1(aa,18.0e0)
219 aa = aa*2.303e0
220 alim = elim + amax1(-aa,-41.45e0)
221 rl = 1.2e0*dig + 3.0e0
222 fnul = 10.0e0 + 6.0e0*(dig-3.0e0)
223C-----------------------------------------------------------------------
224C TEST FOR RANGE
225C-----------------------------------------------------------------------
226 aa=0.5e0/tol
227 bb=float(i1mach(9))*0.5e0
228 aa=amin1(aa,bb)
229 aa=aa**tth
230 IF (az.GT.aa) GO TO 190
231 aa=sqrt(aa)
232 IF (az.GT.aa) ierr=3
233 csq=csqrt(z)
234 zta=z*csq*cmplx(tth,0.0e0)
235C-----------------------------------------------------------------------
236C RE(ZTA).LE.0 WHEN RE(Z).LT.0, ESPECIALLY WHEN IM(Z) IS SMALL
237C-----------------------------------------------------------------------
238 sfac = 1.0e0
239 zi = aimag(z)
240 zr = real(z)
241 ak = aimag(zta)
242 IF (zr.GE.0.0e0) GO TO 70
243 bk = real(zta)
244 ck = -abs(bk)
245 zta = cmplx(ck,ak)
246 70 CONTINUE
247 IF (zi.EQ.0.0e0 .AND. zr.LE.0.0e0) zta = cmplx(0.0e0,ak)
248 aa = real(zta)
249 IF (kode.EQ.2) GO TO 80
250C-----------------------------------------------------------------------
251C OVERFLOW TEST
252C-----------------------------------------------------------------------
253 bb = abs(aa)
254 IF (bb.LT.alim) GO TO 80
255 bb = bb + 0.25e0*alog(az)
256 sfac = tol
257 IF (bb.GT.elim) GO TO 170
258 80 CONTINUE
259 fmr = 0.0e0
260 IF (aa.GE.0.0e0 .AND. zr.GT.0.0e0) GO TO 90
261 fmr = pi
262 IF (zi.LT.0.0e0) fmr = -pi
263 zta = -zta
264 90 CONTINUE
265C-----------------------------------------------------------------------
266C AA=FACTOR FOR ANALYTIC CONTINUATION OF I(FNU,ZTA)
267C KODE=2 RETURNS EXP(-ABS(XZTA))*I(FNU,ZTA) FROM CBINU
268C-----------------------------------------------------------------------
269 CALL cbinu(zta, fnu, kode, 1, cy, nz, rl, fnul, tol, elim, alim)
270 IF (nz.LT.0) GO TO 180
271 aa = fmr*fnu
272 z3 = cmplx(sfac,0.0e0)
273 s1 = cy(1)*cmplx(cos(aa),sin(aa))*z3
274 fnu = (2.0e0-fid)/3.0e0
275 CALL cbinu(zta, fnu, kode, 2, cy, nz, rl, fnul, tol, elim, alim)
276 cy(1) = cy(1)*z3
277 cy(2) = cy(2)*z3
278C-----------------------------------------------------------------------
279C BACKWARD RECUR ONE STEP FOR ORDERS -1/3 OR -2/3
280C-----------------------------------------------------------------------
281 s2 = cy(1)*cmplx(fnu+fnu,0.0e0)/zta + cy(2)
282 aa = fmr*(fnu-1.0e0)
283 s1 = (s1+s2*cmplx(cos(aa),sin(aa)))*cmplx(coef,0.0e0)
284 IF (id.EQ.1) GO TO 100
285 s1 = csq*s1
286 bi = s1*cmplx(1.0e0/sfac,0.0e0)
287 RETURN
288 100 CONTINUE
289 s1 = z*s1
290 bi = s1*cmplx(1.0e0/sfac,0.0e0)
291 RETURN
292 110 CONTINUE
293 aa = c1*(1.0e0-fid) + fid*c2
294 bi = cmplx(aa,0.0e0)
295 RETURN
296 170 CONTINUE
297 nz=0
298 ierr=2
299 RETURN
300 180 CONTINUE
301 IF(nz.EQ.(-1)) GO TO 170
302 nz=0
303 ierr=5
304 RETURN
305 190 CONTINUE
306 ierr=4
307 nz=0
308 RETURN
309 END
double complex cmplx
Definition Faddeeva.cc:227
subroutine cbinu(z, fnu, kode, n, cy, nz, rl, fnul, tol, elim, alim)
Definition cbinu.f:3
subroutine cbiry(z, id, kode, bi, ierr)
Definition cbiry.f:2
ColumnVector real(const ComplexColumnVector &a)