167 SUBROUTINE slarrj( N, D, E2, IFIRST, ILAST,
168 $ RTOL, OFFSET, W, WERR, WORK, IWORK,
169 $ PIVMIN, SPDIAM, INFO )
177 INTEGER IFIRST, ILAST, INFO, N, OFFSET
178 REAL PIVMIN, RTOL, SPDIAM
182 REAL D( * ), E2( * ), W( * ),
183 $ werr( * ), work( * )
189 REAL ZERO, ONE, TWO, HALF
190 PARAMETER ( ZERO = 0.0e0, one = 1.0e0, two = 2.0e0,
195 INTEGER CNT, I, I1, I2, II, ITER, J, K, NEXT, NINT,
196 $ OLNINT, P, PREV, SAVI1
197 REAL DPLUS, FAC, LEFT, MID, RIGHT, S, TMP, WIDTH
213 maxitr = int( ( log( spdiam+pivmin )-log( pivmin ) ) /
233 left = w( ii ) - werr( ii )
235 right = w( ii ) + werr( ii )
237 tmp = max( abs( left ), abs( right ) )
240 IF( width.LT.rtol*tmp )
THEN
247 IF((i.EQ.i1).AND.(i.LT.i2)) i1 = i + 1
248 IF((prev.GE.i1).AND.(i.LE.i2)) iwork( 2*prev-1 ) = i + 1
261 IF( dplus.LT.zero ) cnt = cnt + 1
263 dplus = d( j ) - s - e2( j-1 )/dplus
264 IF( dplus.LT.zero ) cnt = cnt + 1
266 IF( cnt.GT.i-1 )
THEN
267 left = left - werr( ii )*fac
279 IF( dplus.LT.zero ) cnt = cnt + 1
281 dplus = d( j ) - s - e2( j-1 )/dplus
282 IF( dplus.LT.zero ) cnt = cnt + 1
285 right = right + werr( ii )*fac
315 mid = half*( left + right )
319 tmp = max( abs( left ), abs( right ) )
321 IF( ( width.LT.rtol*tmp ) .OR.
322 $ (iter.EQ.maxitr) )
THEN
331 IF(prev.GE.i1) iwork( 2*prev-1 ) = next
343 IF( dplus.LT.zero ) cnt = cnt + 1
345 dplus = d( j ) - s - e2( j-1 )/dplus
346 IF( dplus.LT.zero ) cnt = cnt + 1
348 IF( cnt.LE.i-1 )
THEN
360 IF( ( nint.GT.0 ).AND.(iter.LE.maxitr) )
GO TO 80
364 DO 110 i = savi1, ilast
368 IF( iwork( k-1 ).EQ.0 )
THEN
369 w( ii ) = half*( work( k-1 )+work( k ) )
370 werr( ii ) = work( k ) - w( ii )