195 SUBROUTINE slarrb( N, D, LLD, IFIRST, ILAST, RTOL1,
196 $ RTOL2, OFFSET, W, WGAP, WERR, WORK, IWORK,
197 $ PIVMIN, SPDIAM, TWIST, INFO )
205 INTEGER IFIRST, ILAST, INFO, N, OFFSET, TWIST
206 REAL PIVMIN, RTOL1, RTOL2, SPDIAM
210 REAL D( * ), LLD( * ), W( * ),
211 $ werr( * ), wgap( * ), work( * )
218 PARAMETER ( ZERO = 0.0e0, two = 2.0e0,
223 INTEGER I, I1, II, IP, ITER, K, NEGCNT, NEXT, NINT,
225 REAL BACK, CVRGD, GAP, LEFT, LGAP, MID, MNWDTH,
226 $ RGAP, RIGHT, TMP, WIDTH
234 INTRINSIC abs, max, min
246 maxitr = int( ( log( spdiam+pivmin )-log( pivmin ) ) /
248 mnwdth = two * pivmin
251 IF((r.LT.1).OR.(r.GT.n)) r = n
266 rgap = wgap( i1-offset )
270 left = w( ii ) - werr( ii )
271 right = w( ii ) + werr( ii )
274 gap = min( lgap, rgap )
283 negcnt = slaneg( n, d, lld, left, pivmin, r )
284 IF( negcnt.GT.i-1 )
THEN
296 negcnt = slaneg( n, d, lld, right, pivmin, r )
297 IF( negcnt.LT.i )
THEN
302 width = half*abs( left - right )
303 tmp = max( abs( left ), abs( right ) )
304 cvrgd = max(rtol1*gap,rtol2*tmp)
305 IF( width.LE.cvrgd .OR. width.LE.mnwdth )
THEN
312 IF((i.EQ.i1).AND.(i.LT.ilast)) i1 = i + 1
313 IF((prev.GE.i1).AND.(i.LE.ilast)) iwork( 2*prev-1 ) = i + 1
335 DO 100 ip = 1, olnint
340 IF(ii.GT.1) lgap = wgap( ii-1 )
341 gap = min( lgap, rgap )
345 mid = half*( left + right )
349 tmp = max( abs( left ), abs( right ) )
350 cvrgd = max(rtol1*gap,rtol2*tmp)
351 IF( ( width.LE.cvrgd ) .OR. ( width.LE.mnwdth ).OR.
352 $ ( iter.EQ.maxitr ) )
THEN
361 IF(prev.GE.i1) iwork( 2*prev-1 ) = next
370 negcnt = slaneg( n, d, lld, mid, pivmin, r )
371 IF( negcnt.LE.i-1 )
THEN
382 IF( ( nint.GT.0 ).AND.(iter.LE.maxitr) )
GO TO 80
386 DO 110 i = ifirst, ilast
390 IF( iwork( k-1 ).EQ.0 )
THEN
391 w( ii ) = half*( work( k-1 )+work( k ) )
392 werr( ii ) = work( k ) - w( ii )
396 DO 111 i = ifirst+1, ilast
399 wgap( ii-1 ) = max( zero,
400 $ w(ii) - werr(ii) - w( ii-1 ) - werr( ii-1 ))