191       SUBROUTINE slarrf( N, D, L, LD, CLSTRT, CLEND,
 
  193      $                   SPDIAM, CLGAPL, CLGAPR, PIVMIN, SIGMA,
 
  194      $                   DPLUS, LPLUS, WORK, INFO )
 
  202       INTEGER            CLSTRT, CLEND, INFO, N
 
  203       REAL               CLGAPL, CLGAPR, PIVMIN, SIGMA, SPDIAM
 
  206       REAL               D( * ), DPLUS( * ), L( * ), LD( * ),
 
  207      $          LPLUS( * ), W( * ), WGAP( * ), WERR( * ), WORK( * )
 
  213       REAL               MAXGROWTH1, MAXGROWTH2, ONE, QUART, TWO
 
  214       PARAMETER          ( ONE = 1.0e0, two = 2.0e0,
 
  217      $                     maxgrowth2 = 8.e0 )
 
  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       REAL               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
 
  231       EXTERNAL           SISNAN, SLAMCH
 
  249       fact = real(2**ktrymax)
 
  250       eps = slamch( 
'Precision' )
 
  272       clwdth = abs(w(clend)-w(clstrt)) + werr(clend) + werr(clstrt)
 
  273       avgap = clwdth / real(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)* two * eps
 
  281       rsigma = rsigma + abs(rsigma)* two * 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 = real(n-1)*mingap/(spdiam*eps)
 
  295       fail2 = real(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.  sisnan( 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.  sisnan( 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/real(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 scopy( n, work, 1, dplus, 1 )
 
  488          CALL scopy( n-1, work(n+1), 1, lplus, 1 )