GNU Octave 10.1.0
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
 
Loading...
Searching...
No Matches
zuoik.f
Go to the documentation of this file.
1 SUBROUTINE zuoik(ZR, ZI, FNU, KODE, IKFLG, N, YR, YI, NUF, TOL,
2 * ELIM, ALIM)
3C***BEGIN PROLOGUE ZUOIK
4C***REFER TO ZBESI,ZBESK,ZBESH
5C
6C ZUOIK COMPUTES THE LEADING TERMS OF THE UNIFORM ASYMPTOTIC
7C EXPANSIONS FOR THE I AND K FUNCTIONS AND COMPARES THEM
8C (IN LOGARITHMIC FORM) TO ALIM AND ELIM FOR OVER AND UNDERFLOW
9C WHERE ALIM.LT.ELIM. IF THE MAGNITUDE, BASED ON THE LEADING
10C EXPONENTIAL, IS LESS THAN ALIM OR GREATER THAN -ALIM, THEN
11C THE RESULT IS ON SCALE. IF NOT, THEN A REFINED TEST USING OTHER
12C MULTIPLIERS (IN LOGARITHMIC FORM) IS MADE BASED ON ELIM. HERE
13C EXP(-ELIM)=SMALLEST MACHINE NUMBER*1.0E+3 AND EXP(-ALIM)=
14C EXP(-ELIM)/TOL
15C
16C IKFLG=1 MEANS THE I SEQUENCE IS TESTED
17C =2 MEANS THE K SEQUENCE IS TESTED
18C NUF = 0 MEANS THE LAST MEMBER OF THE SEQUENCE IS ON SCALE
19C =-1 MEANS AN OVERFLOW WOULD OCCUR
20C IKFLG=1 AND NUF.GT.0 MEANS THE LAST NUF Y VALUES WERE SET TO ZERO
21C THE FIRST N-NUF VALUES MUST BE SET BY ANOTHER ROUTINE
22C IKFLG=2 AND NUF.EQ.N MEANS ALL Y VALUES WERE SET TO ZERO
23C IKFLG=2 AND 0.LT.NUF.LT.N NOT CONSIDERED. Y MUST BE SET BY
24C ANOTHER ROUTINE
25C
26C***ROUTINES CALLED ZUCHK,ZUNHJ,ZUNIK,D1MACH,XZABS,XZLOG
27C***END PROLOGUE ZUOIK
28C COMPLEX ARG,ASUM,BSUM,CWRK,CZ,CZERO,PHI,SUM,Y,Z,ZB,ZETA1,ZETA2,ZN,
29C *ZR
30 DOUBLE PRECISION AARG, AIC, ALIM, APHI, ARGI, ARGR, ASUMI, ASUMR,
31 * ascle, ax, ay, bsumi, bsumr, cwrki, cwrkr, czi, czr, elim, fnn,
32 * fnu, gnn, gnu, phii, phir, rcz, str, sti, sumi, sumr, tol, yi,
33 * yr, zbi, zbr, zeroi, zeror, zeta1i, zeta1r, zeta2i, zeta2r, zi,
34 * zni, znr, zr, zri, zrr, d1mach, xzabs
35 INTEGER I, IDUM, IFORM, IKFLG, INIT, KODE, N, NN, NUF, NW
36 dimension yr(n), yi(n), cwrkr(16), cwrki(16)
37 DATA zeror,zeroi / 0.0d0, 0.0d0 /
38 DATA aic / 1.265512123484645396d+00 /
39 nuf = 0
40 nn = n
41 zrr = zr
42 zri = zi
43 IF (zr.GE.0.0d0) GO TO 10
44 zrr = -zr
45 zri = -zi
46 10 CONTINUE
47 zbr = zrr
48 zbi = zri
49 ax = dabs(zr)*1.7321d0
50 ay = dabs(zi)
51 iform = 1
52 IF (ay.GT.ax) iform = 2
53 gnu = dmax1(fnu,1.0d0)
54 IF (ikflg.EQ.1) GO TO 20
55 fnn = dble(float(nn))
56 gnn = fnu + fnn - 1.0d0
57 gnu = dmax1(gnn,fnn)
58 20 CONTINUE
59C-----------------------------------------------------------------------
60C ONLY THE MAGNITUDE OF ARG AND PHI ARE NEEDED ALONG WITH THE
61C REAL PARTS OF ZETA1, ZETA2 AND ZB. NO ATTEMPT IS MADE TO GET
62C THE SIGN OF THE IMAGINARY PART CORRECT.
63C-----------------------------------------------------------------------
64 IF (iform.EQ.2) GO TO 30
65 init = 0
66 CALL zunik(zrr, zri, gnu, ikflg, 1, tol, init, phir, phii,
67 * zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
68 czr = -zeta1r + zeta2r
69 czi = -zeta1i + zeta2i
70 GO TO 50
71 30 CONTINUE
72 znr = zri
73 zni = -zrr
74 IF (zi.GT.0.0d0) GO TO 40
75 znr = -znr
76 40 CONTINUE
77 CALL zunhj(znr, zni, gnu, 1, tol, phir, phii, argr, argi, zeta1r,
78 * zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
79 czr = -zeta1r + zeta2r
80 czi = -zeta1i + zeta2i
81 aarg = xzabs(argr,argi)
82 50 CONTINUE
83 IF (kode.EQ.1) GO TO 60
84 czr = czr - zbr
85 czi = czi - zbi
86 60 CONTINUE
87 IF (ikflg.EQ.1) GO TO 70
88 czr = -czr
89 czi = -czi
90 70 CONTINUE
91 aphi = xzabs(phir,phii)
92 rcz = czr
93C-----------------------------------------------------------------------
94C OVERFLOW TEST
95C-----------------------------------------------------------------------
96 IF (rcz.GT.elim) GO TO 210
97 IF (rcz.LT.alim) GO TO 80
98 rcz = rcz + dlog(aphi)
99 IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
100 IF (rcz.GT.elim) GO TO 210
101 GO TO 130
102 80 CONTINUE
103C-----------------------------------------------------------------------
104C UNDERFLOW TEST
105C-----------------------------------------------------------------------
106 IF (rcz.LT.(-elim)) GO TO 90
107 IF (rcz.GT.(-alim)) GO TO 130
108 rcz = rcz + dlog(aphi)
109 IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
110 IF (rcz.GT.(-elim)) GO TO 110
111 90 CONTINUE
112 DO 100 i=1,nn
113 yr(i) = zeror
114 yi(i) = zeroi
115 100 CONTINUE
116 nuf = nn
117 RETURN
118 110 CONTINUE
119 ascle = 1.0d+3*d1mach(1)/tol
120 CALL xzlog(phir, phii, str, sti, idum)
121 czr = czr + str
122 czi = czi + sti
123 IF (iform.EQ.1) GO TO 120
124 CALL xzlog(argr, argi, str, sti, idum)
125 czr = czr - 0.25d0*str - aic
126 czi = czi - 0.25d0*sti
127 120 CONTINUE
128 ax = dexp(rcz)/tol
129 ay = czi
130 czr = ax*dcos(ay)
131 czi = ax*dsin(ay)
132 CALL zuchk(czr, czi, nw, ascle, tol)
133 IF (nw.NE.0) GO TO 90
134 130 CONTINUE
135 IF (ikflg.EQ.2) RETURN
136 IF (n.EQ.1) RETURN
137C-----------------------------------------------------------------------
138C SET UNDERFLOWS ON I SEQUENCE
139C-----------------------------------------------------------------------
140 140 CONTINUE
141 gnu = fnu + dble(float(nn-1))
142 IF (iform.EQ.2) GO TO 150
143 init = 0
144 CALL zunik(zrr, zri, gnu, ikflg, 1, tol, init, phir, phii,
145 * zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
146 czr = -zeta1r + zeta2r
147 czi = -zeta1i + zeta2i
148 GO TO 160
149 150 CONTINUE
150 CALL zunhj(znr, zni, gnu, 1, tol, phir, phii, argr, argi, zeta1r,
151 * zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
152 czr = -zeta1r + zeta2r
153 czi = -zeta1i + zeta2i
154 aarg = xzabs(argr,argi)
155 160 CONTINUE
156 IF (kode.EQ.1) GO TO 170
157 czr = czr - zbr
158 czi = czi - zbi
159 170 CONTINUE
160 aphi = xzabs(phir,phii)
161 rcz = czr
162 IF (rcz.LT.(-elim)) GO TO 180
163 IF (rcz.GT.(-alim)) RETURN
164 rcz = rcz + dlog(aphi)
165 IF (iform.EQ.2) rcz = rcz - 0.25d0*dlog(aarg) - aic
166 IF (rcz.GT.(-elim)) GO TO 190
167 180 CONTINUE
168 yr(nn) = zeror
169 yi(nn) = zeroi
170 nn = nn - 1
171 nuf = nuf + 1
172 IF (nn.EQ.0) RETURN
173 GO TO 140
174 190 CONTINUE
175 ascle = 1.0d+3*d1mach(1)/tol
176 CALL xzlog(phir, phii, str, sti, idum)
177 czr = czr + str
178 czi = czi + sti
179 IF (iform.EQ.1) GO TO 200
180 CALL xzlog(argr, argi, str, sti, idum)
181 czr = czr - 0.25d0*str - aic
182 czi = czi - 0.25d0*sti
183 200 CONTINUE
184 ax = dexp(rcz)/tol
185 ay = czi
186 czr = ax*dcos(ay)
187 czi = ax*dsin(ay)
188 CALL zuchk(czr, czi, nw, ascle, tol)
189 IF (nw.NE.0) GO TO 180
190 RETURN
191 210 CONTINUE
192 nuf = -1
193 RETURN
194 END
double precision function d1mach(i)
Definition d1mach.f:23
double precision function xzabs(zr, zi)
Definition xzabs.f:2
subroutine xzlog(ar, ai, br, bi, ierr)
Definition xzlog.f:2
subroutine zuchk(yr, yi, nz, ascle, tol)
Definition zuchk.f:2
subroutine zunhj(zr, zi, fnu, ipmtr, tol, phir, phii, argr, argi, zeta1r, zeta1i, zeta2r, zeta2i, asumr, asumi, bsumr, bsumi)
Definition zunhj.f:3
subroutine zunik(zrr, zri, fnu, ikflg, ipmtr, tol, init, phir, phii, zeta1r, zeta1i, zeta2r, zeta2i, sumr, sumi, cwrkr, cwrki)
Definition zunik.f:3
subroutine zuoik(zr, zi, fnu, kode, ikflg, n, yr, yi, nuf, tol, elim, alim)
Definition zuoik.f:3