160 SUBROUTINE dgebal( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
168 INTEGER IHI, ILO, INFO, LDA, N
171 DOUBLE PRECISION A( LDA, * ), SCALE( * )
177 DOUBLE PRECISION ZERO, ONE
178 parameter( zero = 0.0d+0, one = 1.0d+0 )
179 DOUBLE PRECISION SCLFAC
180 parameter( sclfac = 2.0d+0 )
181 DOUBLE PRECISION FACTOR
182 parameter( factor = 0.95d+0 )
185 LOGICAL NOCONV, CANSWAP
186 INTEGER I, ICA, IRA, J, K, L
187 DOUBLE PRECISION C, CA, F, G, R, RA, S, SFMAX1, SFMAX2, SFMIN1,
191 LOGICAL DISNAN, LSAME
193 DOUBLE PRECISION DLAMCH, DNRM2
194 EXTERNAL disnan, lsame, idamax, dlamch,
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(
'DGEBAL', -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
265 CALL dswap( l, a( 1, i ), 1, a( 1, l ), 1 )
266 CALL dswap( n-k+1, a( i, k ), lda, a( l, k ),
292 IF( i.NE.j .AND. a( i, j ).NE.zero )
THEN
301 CALL dswap( l, a( 1, j ), 1, a( 1, k ), 1 )
302 CALL dswap( n-k+1, a( j, k ), lda, a( k, k ),
323 IF( lsame( job,
'P' ) )
THEN
333 sfmin1 = dlamch(
'S' ) / dlamch(
'P' )
334 sfmax1 = one / sfmin1
335 sfmin2 = sfmin1*sclfac
336 sfmax2 = one / sfmin2
344 c = dnrm2( l-k+1, a( k, i ), 1 )
345 r = dnrm2( l-k+1, a( i, k ), lda )
346 ica = idamax( l, a( 1, i ), 1 )
347 ca = abs( a( ica, i ) )
348 ira = idamax( 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( disnan( c+ca+r+ra ) )
THEN
359 CALL xerbla(
'DGEBAL', -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 dscal( n-k+1, g, a( i, k ), lda )
403 CALL dscal( l, f, a( 1, i ), 1 )