5
6
7
8
9
10 IMPLICIT NONE
11
12
13 INTEGER CLSTRT, CLEND, CLMID1, CLMID2, INFO, N
14 REAL CLGAPL, CLGAPR, PIVMIN, SIGMA, SPDIAM
15 LOGICAL TRYMID
16
17
18 REAL D( * ), DPLUS( * ), L( * ), LD( * ),
19 $ LPLUS( * ), W( * ), WGAP( * ), WERR( * ), WORK( * )
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108 REAL FOUR, MAXGROWTH1, MAXGROWTH2, ONE, QUART, TWO
109 parameter( one = 1.0e0, two = 2.0e0,
110 $ four = 4.0e0, quart = 0.25e0,
111 $ maxgrowth1 = 8.e0,
112 $ maxgrowth2 = 8.e0 )
113
114
115 LOGICAL DORRR1, NOFAIL, SAWNAN1, SAWNAN2, TRYRRR1
116 INTEGER BI,I,J,KTRY,KTRYMAX,SLEFT,SRIGHT,SMID,SHIFT
117 parameter( ktrymax = 1, smid =0, sleft = 1, sright = 2 )
118
119
120 INTEGER BLKLEN
121 parameter( blklen = 512 )
122
123
124 REAL AVGAP, BESTSHIFT, CLWDTH, EPS, FACT, FAIL,
125 $ FAIL2, GROWTHBOUND, LDELTA, LDMAX, LEASTGROWTH,
126 $ LSIGMA, MAX1, MAX2, MINGAP, MSIGMA1, MSIGMA2,
127 $ OLDP, PROD, RDELTA, RDMAX, RRR1, RRR2, RSIGMA,
128 $ S, TMP, ZNM2
129
130
131 LOGICAL SISNAN
132 REAL SLAMCH
134
135
136 EXTERNAL scopy
137
138
139 INTRINSIC abs
140
141
142
143 info = 0
144 fact = real(2**ktrymax)
145 eps =
slamch(
'Precision' )
146 shift = 0
147
148
149
150 nofail = .true.
151
152
153
154 clwdth = abs(w(clend)-w(clstrt)) + werr(clend) + werr(clstrt)
155 avgap = clwdth / real(clend-clstrt)
156 mingap =
min(clgapl, clgapr)
157
158
159 lsigma =
min(w( clstrt ),w( clend )) - werr( clstrt )
160 rsigma =
max(w( clstrt ),w( clend )) + werr( clend )
161 msigma1 = w( clmid1 ) + werr( clmid1 )
162 msigma2 = w( clmid2 ) - werr( clmid2 )
163
164
165 lsigma = lsigma - abs(lsigma)* two * eps
166 rsigma = rsigma + abs(rsigma)* two * eps
167
168
169 ldmax = quart * mingap + two * pivmin
170 rdmax = quart * mingap + two * pivmin
171
172 ldelta =
max(avgap,wgap( clstrt ))/fact
173 rdelta =
max(avgap,wgap( clend-1 ))/fact
174
175
176
178 leastgrowth = one / s
179 fail = real(n-1)*mingap/(spdiam*eps)
180 fail2 = real(n-1)*mingap/(spdiam*sqrt(eps))
181 growthbound = maxgrowth1*spdiam
182
183
184
185
186 bestshift = lsigma
187
188
189 IF(.NOT.trymid) GOTO 4
190
191
192
193 shift = smid
194
195 DO 3 j=1,2
196 sawnan1 = .false.
197 IF(j.EQ.1) THEN
198
199 sigma = msigma1
200 ELSE
201
202 sigma = msigma2
203 ENDIF
204
205 s = -sigma
206 dplus( 1 ) = d( 1 ) + s
207 max1 = abs( dplus( 1 ) )
208 DO 2 bi = 1, n-1, blklen
209 DO 1 i = bi,
min( bi+blklen-1, n-1)
210 lplus( i ) = ld( i ) / dplus( i )
211 s = s*lplus( i )*l( i ) - sigma
212 dplus( i+1 ) = d( i+1 ) + s
213 max1 =
max( max1,abs(dplus(i+1)) )
214 1 CONTINUE
215 sawnan1=sawnan1 .OR. sisnan(max1)
216 IF (sawnan1) GOTO 3
217 2 CONTINUE
218
219 IF( .NOT.sawnan1 ) THEN
220 IF( max1.LE.growthbound ) THEN
221 GOTO 100
222 ELSE IF( max1.LE.leastgrowth ) THEN
223 leastgrowth = max1
224 bestshift = sigma
225 ENDIF
226 ENDIF
227 3 CONTINUE
228
229
230 4 CONTINUE
231
232
233
234
235
236 ktry = 0
237
238
239
240 5 CONTINUE
241
242
243
244
245
246 sawnan1 = .false.
247 s = -lsigma
248 dplus( 1 ) = d( 1 ) + s
249 max1 = abs( dplus( 1 ) )
250 DO 12 bi = 1, n-1, blklen
251 DO 11 i = bi,
min( bi+blklen-1, n-1)
252 lplus( i ) = ld( i ) / dplus( i )
253 s = s*lplus( i )*l( i ) - lsigma
254 dplus( i+1 ) = d( i+1 ) + s
255 max1 =
max( max1,abs(dplus(i+1)) )
256 11 CONTINUE
257 sawnan1=sawnan1 .OR. sisnan(max1)
258 IF (sawnan1) GOTO 13
259 12 CONTINUE
260 IF( .NOT.sawnan1 ) THEN
261 IF( max1.LE.growthbound ) THEN
262 sigma = lsigma
263 shift = sleft
264 GOTO 100
265 ELSE IF( max1.LE.leastgrowth ) THEN
266 leastgrowth = max1
267 bestshift = lsigma
268 ENDIF
269 ENDIF
270 13 CONTINUE
271
272
273 sawnan2 = .false.
274 s = -rsigma
275 work( 1 ) = d( 1 ) + s
276 max2 = abs( work( 1 ) )
277 DO 22 bi = 1, n-1, blklen
278 DO 21 i = bi,
min( bi+blklen-1, n-1)
279 work( n+i ) = ld( i ) / work( i )
280 s = s*work( n+i )*l( i ) - rsigma
281 work( i+1 ) = d( i+1 ) + s
282 max2 =
max( max2,abs(work(i+1)) )
283 21 CONTINUE
284 sawnan2=sawnan2 .OR. sisnan(max2)
285 IF (sawnan2) GOTO 23
286 22 CONTINUE
287 IF( .NOT.sawnan2 ) THEN
288 IF( max2.LE.growthbound ) THEN
289 sigma = rsigma
290 shift = sright
291 GOTO 100
292 ELSE IF( max2.LE.leastgrowth ) THEN
293 leastgrowth = max2
294 bestshift = rsigma
295 ENDIF
296 ENDIF
297 23 CONTINUE
298
299
300
301 50 CONTINUE
302
303 IF (ktry.LT.ktrymax) THEN
304
305
306 lsigma =
max( lsigma - ldelta,
307 $ lsigma - ldmax)
308 rsigma =
min( rsigma + rdelta,
309 $ rsigma + rdmax )
310 ldelta = two * ldelta
311 rdelta = two * rdelta
312
313 ldelta =
min(ldmax,ldelta)
314 rdelta =
min(rdmax,rdelta)
315 ktry = ktry + 1
316 GOTO 5
317 ELSE
318
319
320 IF((leastgrowth.LT.fail).OR.nofail) THEN
321 lsigma = bestshift
322 sawnan1 = .false.
323 s = -lsigma
324 dplus( 1 ) = d( 1 ) + s
325 DO 6 i = 1, n - 1
326 lplus( i ) = ld( i ) / dplus( i )
327 s = s*lplus( i )*l( i ) - lsigma
328 dplus( i+1 ) = d( i+1 ) + s
329 IF(abs(dplus(i+1)).LT.pivmin) THEN
330 dplus(i+1) = -pivmin
331 ENDIF
332 6 CONTINUE
333 sigma = lsigma
334 shift = sleft
335 GOTO 100
336 ELSE
337 info = 1
338 RETURN
339 ENDIF
340 END IF
341
342 100 CONTINUE
343 IF (shift.EQ.sleft .OR. shift.EQ.smid ) THEN
344 ELSEIF (shift.EQ.sright) THEN
345
346 CALL scopy( n, work, 1, dplus, 1 )
347 CALL scopy( n-1, work(n+1), 1, lplus, 1 )
348 ENDIF
349
350 RETURN
351
352
353