191 SUBROUTINE dlarrf( N, D, L, LD, CLSTRT, CLEND,
193 $ SPDIAM, CLGAPL, CLGAPR, PIVMIN, SIGMA,
194 $ DPLUS, LPLUS, WORK, INFO )
202 INTEGER CLSTRT, CLEND, INFO, N
203 DOUBLE PRECISION CLGAPL, CLGAPR, PIVMIN, SIGMA, SPDIAM
206 DOUBLE PRECISION D( * ), DPLUS( * ), L( * ), LD( * ),
207 $ lplus( * ), w( * ), wgap( * ), werr( * ), work( * )
213 DOUBLE PRECISION FOUR, MAXGROWTH1, MAXGROWTH2, ONE, QUART, TWO
214 parameter( one = 1.0d0, two = 2.0d0, four = 4.0d0,
217 $ maxgrowth2 = 8.d0 )
220 LOGICAL DORRR1, FORCER, NOFAIL, SAWNAN1, SAWNAN2, TRYRRR1
221 INTEGER I, INDX, KTRY, KTRYMAX, SLEFT, SRIGHT, SHIFT
222 parameter( ktrymax = 1, sleft = 1, sright = 2 )
223 DOUBLE PRECISION AVGAP, BESTSHIFT, CLWDTH, EPS, FACT, FAIL,
224 $ fail2, growthbound, ldelta, ldmax, lsigma,
225 $ max1, max2, mingap, oldp, prod, rdelta, rdmax,
226 $ rrr1, rrr2, rsigma, s, smlgrowth, tmp, znm2
230 DOUBLE PRECISION DLAMCH
231 EXTERNAL disnan, dlamch
249 fact = dble(2**ktrymax)
250 eps = dlamch(
'Precision' )
272 clwdth = abs(w(clend)-w(clstrt)) + werr(clend) + werr(clstrt)
273 avgap = clwdth / dble(clend-clstrt)
274 mingap = min(clgapl, clgapr)
276 lsigma = min(w( clstrt ),w( clend )) - werr( clstrt )
277 rsigma = max(w( clstrt ),w( clend )) + werr( clend )
280 lsigma = lsigma - abs(lsigma)* four * eps
281 rsigma = rsigma + abs(rsigma)* four * eps
284 ldmax = quart * mingap + two * pivmin
285 rdmax = quart * mingap + two * pivmin
287 ldelta = max(avgap,wgap( clstrt ))/fact
288 rdelta = max(avgap,wgap( clend-1 ))/fact
294 fail = dble(n-1)*mingap/(spdiam*eps)
295 fail2 = dble(n-1)*mingap/(spdiam*sqrt(eps))
300 growthbound = maxgrowth1*spdiam
306 ldelta = min(ldmax,ldelta)
307 rdelta = min(rdmax,rdelta)
314 dplus( 1 ) = d( 1 ) + s
315 IF(abs(dplus(1)).LT.pivmin)
THEN 321 max1 = abs( dplus( 1 ) )
323 lplus( i ) = ld( i ) / dplus( i )
324 s = s*lplus( i )*l( i ) - lsigma
325 dplus( i+1 ) = d( i+1 ) + s
326 IF(abs(dplus(i+1)).LT.pivmin)
THEN 332 max1 = max( max1,abs(dplus(i+1)) )
334 sawnan1 = sawnan1 .OR. disnan( max1 )
337 $ (max1.LE.growthbound .AND. .NOT.sawnan1 ) )
THEN 345 work( 1 ) = d( 1 ) + s
346 IF(abs(work(1)).LT.pivmin)
THEN 352 max2 = abs( work( 1 ) )
354 work( n+i ) = ld( i ) / work( i )
355 s = s*work( n+i )*l( i ) - rsigma
356 work( i+1 ) = d( i+1 ) + s
357 IF(abs(work(i+1)).LT.pivmin)
THEN 363 max2 = max( max2,abs(work(i+1)) )
365 sawnan2 = sawnan2 .OR. disnan( max2 )
368 $ (max2.LE.growthbound .AND. .NOT.sawnan2 ) )
THEN 376 IF(sawnan1.AND.sawnan2)
THEN 380 IF( .NOT.sawnan1 )
THEN 382 IF(max1.LE.smlgrowth)
THEN 387 IF( .NOT.sawnan2 )
THEN 388 IF(sawnan1 .OR. max2.LE.max1) indx = 2
389 IF(max2.LE.smlgrowth)
THEN 401 IF((clwdth.LT.mingap/dble(128)) .AND.
402 $ (min(max1,max2).LT.fail2)
403 $ .AND.(.NOT.sawnan1).AND.(.NOT.sawnan2))
THEN 409 IF( tryrrr1 .AND. dorrr1 )
THEN 411 tmp = abs( dplus( n ) )
416 IF( prod .LE. eps )
THEN 418 $ ((dplus(i+1)*work(n+i+1))/(dplus(i)*work(n+i)))*oldp
420 prod = prod*abs(work(n+i))
423 znm2 = znm2 + prod**2
424 tmp = max( tmp, abs( dplus( i ) * prod ))
426 rrr1 = tmp/( spdiam * sqrt( znm2 ) )
427 IF (rrr1.LE.maxgrowth2)
THEN 432 ELSE IF(indx.EQ.2)
THEN 433 tmp = abs( work( n ) )
438 IF( prod .LE. eps )
THEN 439 prod = ((work(i+1)*lplus(i+1))/(work(i)*lplus(i)))*oldp
441 prod = prod*abs(lplus(i))
444 znm2 = znm2 + prod**2
445 tmp = max( tmp, abs( work( i ) * prod ))
447 rrr2 = tmp/( spdiam * sqrt( znm2 ) )
448 IF (rrr2.LE.maxgrowth2)
THEN 458 IF (ktry.LT.ktrymax)
THEN 461 lsigma = max( lsigma - ldelta,
463 rsigma = min( rsigma + rdelta,
465 ldelta = two * ldelta
466 rdelta = two * rdelta
472 IF((smlgrowth.LT.fail).OR.nofail)
THEN 484 IF (shift.EQ.sleft)
THEN 485 ELSEIF (shift.EQ.sright)
THEN 487 CALL dcopy( n, work, 1, dplus, 1 )
488 CALL dcopy( n-1, work(n+1), 1, lplus, 1 )
subroutine dcopy(N, DX, INCX, DY, INCY)
DCOPY
subroutine dlarrf(N, D, L, LD, CLSTRT, CLEND, W, WGAP, WERR, SPDIAM, CLGAPL, CLGAPR, PIVMIN, SIGMA, DPLUS, LPLUS, WORK, INFO)
DLARRF finds a new relatively robust representation such that at least one of the eigenvalues is rela...