159 SUBROUTINE dgebal( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
167 INTEGER IHI, ILO, INFO, LDA, N
170 DOUBLE PRECISION A( LDA, * ), SCALE( * )
176 DOUBLE PRECISION ZERO, ONE
177 parameter( zero = 0.0d+0, one = 1.0d+0 )
178 DOUBLE PRECISION SCLFAC
179 parameter( sclfac = 2.0d+0 )
180 DOUBLE PRECISION FACTOR
181 parameter( factor = 0.95d+0 )
185 INTEGER I, ICA, IEXC, IRA, J, K, L, M
186 DOUBLE PRECISION C, CA, F, G, R, RA, S, , SFMAX2, SFMIN1,
190 LOGICAL DISNAN, LSAME
192 DOUBLE PRECISION DLAMCH, DNRM2
193 EXTERNAL disnan, lsame, idamax, dlamch, dnrm2
204 IF( .NOT.lsame( job,
'N' ) .AND. .NOT.lsame( job,
'P' ) .AND.
205 $ .NOT.lsame( job,
'S' ) .AND. .NOT.lsame( job,
'B' ) )
THEN
207 ELSE IF( n.LT.0 )
THEN
209 ELSE IF( lda.LT.
max( 1, n ) )
THEN
213 CALL xerbla(
'DGEBAL', -info )
223 IF( lsame( job,
'N' ) )
THEN
230 IF( lsame( job,
'S' ) )
244 CALL dswap( l, a( 1, j ), 1, a( 1, m ), 1 )
245 CALL dswap( n-k+1, a( j, k ), lda, a( m, k ), lda )
263 IF( a( j, i ).NE.zero )
285 IF( a( i, j ).NE.zero )
299 IF( lsame( job,
'P' ) )
306 sfmin1 = dlamch(
'S' ) / dlamch(
'P' )
307 sfmax1 = one / sfmin1
308 sfmin2 = sfmin1*sclfac
309 sfmax2 = one / sfmin2
316 c = dnrm2( l-k+1, a( k, i ), 1 )
317 r = dnrm2( l-k+1, a( i, k ), lda )
318 ica = idamax( l, a( 1, i ), 1 )
319 ca = abs( a( ica, i ) )
320 ira = idamax( n-k+1, a( i, k ), lda )
321 ra = abs( a( i, ira+k-1 ) )
325 IF( c.EQ.zero .OR. r.EQ.zero )
331 IF( c.GE.g .OR.
max( f, c, ca ).GE.sfmax2 .OR.
332 $
min( r, g, ra ).LE.sfmin2 )
GO TO 170
333 IF( disnan( c+f+ca+r+g+ra ) )
THEN
338 CALL xerbla(
'DGEBAL', -info )
352 IF( g.LT.r .OR.
max( r, ra ).GE.sfmax2 .OR.
353 $
min( f, c, g, ca ).LE.sfmin2 )
GO TO 190
365 IF( ( c+r ).GE.factor*s )
367 IF( f.LT.one .AND. scale( i ).LT.one )
THEN
368 IF( f*scale( i ).LE.sfmin1 )
371 IF( f.GT.one .AND. scale( i ).GT.one )
THEN
372 IF( scale( i ).GE.sfmax1 / f )
376 scale( i ) = scale( i )*f
379 CALL dscal( n-k+1, g, a( i, k ), lda )
380 CALL dscal( l, f, a( 1, i ), 1 )