160 SUBROUTINE sgebal( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
168 INTEGER IHI, ILO, INFO, LDA, N
171 REAL A( LDA, * ), SCALE( * )
178 parameter( zero = 0.0e+0, one = 1.0e+0 )
180 parameter( sclfac = 2.0e+0 )
182 parameter( factor = 0.95e+0 )
185 LOGICAL NOCONV, CANSWAP
186 INTEGER I, ICA, IRA, J, K, L
187 REAL C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
191 LOGICAL SISNAN, LSAME
194 EXTERNAL sisnan, lsame, isamax, slamch,
201 INTRINSIC abs, max, min
206 IF( .NOT.lsame( job,
'N' ) .AND.
207 $ .NOT.lsame( job,
'P' ) .AND.
208 $ .NOT.lsame( job,
'S' ) .AND.
209 $ .NOT.lsame( job,
'B' ) )
THEN
211 ELSE IF( n.LT.0 )
THEN
213 ELSE IF( lda.LT.max( 1, n ) )
THEN
217 CALL xerbla(
'SGEBAL', -info )
229 IF( lsame( job,
'N' ) )
THEN
243 IF( .NOT.lsame( job,
'S' ) )
THEN
256 IF( i.NE.j .AND. a( i, j ).NE.zero )
THEN
263 scale( l ) = real( i )
265 CALL sswap( l, a( 1, i ), 1, a( 1, l ), 1 )
266 CALL sswap( n-k+1, a( i, k ), lda, a( l, k ),
292 IF( i.NE.j .AND. a( i, j ).NE.zero )
THEN
299 scale( k ) = real( j )
301 CALL sswap( l, a( 1, j ), 1, a( 1, k ), 1 )
302 CALL sswap( n-k+1, a( j, k ), lda, a( k, k ),
323 IF( lsame( job,
'P' ) )
THEN
333 sfmin1 = slamch(
'S' ) / slamch(
'P' )
334 sfmax1 = one / sfmin1
335 sfmin2 = sfmin1*sclfac
336 sfmax2 = one / sfmin2
344 c = snrm2( l-k+1, a( k, i ), 1 )
345 r = snrm2( l-k+1, a( i, k ), lda )
346 ica = isamax( l, a( 1, i ), 1 )
347 ca = abs( a( ica, i ) )
348 ira = isamax( n-k+1, a( i, k ), lda )
349 ra = abs( a( i, ira+k-1 ) )
353 IF( c.EQ.zero .OR. r.EQ.zero ) cycle
357 IF( sisnan( c+ca+r+ra ) )
THEN
359 CALL xerbla(
'SGEBAL', -info )
367 DO WHILE( c.LT.g .AND. max( f, c, ca ).LT.sfmax2 .AND.
368 $ min( r, g, ra ).GT.sfmin2 )
379 DO WHILE( g.GE.r .AND. max( r, ra ).LT.sfmax2 .AND.
380 $ min( f, c, g, ca ).GT.sfmin2 )
391 IF( ( c+r ).GE.factor*s ) cycle
392 IF( f.LT.one .AND. scale( i ).LT.one )
THEN
393 IF( f*scale( i ).LE.sfmin1 ) cycle
395 IF( f.GT.one .AND. scale( i ).GT.one )
THEN
396 IF( scale( i ).GE.sfmax1 / f ) cycle
399 scale( i ) = scale( i )*f
402 CALL sscal( n-k+1, g, a( i, k ), lda )
403 CALL sscal( l, f, a( 1, i ), 1 )