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, SFMAX1, SFMAX2, SFMIN1,
190 LOGICAL DISNAN, LSAME
192 DOUBLE PRECISION DLAMCH, DNRM2
193 EXTERNAL disnan, lsame, idamax, dlamch, dnrm2
199 INTRINSIC abs, max, min
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 )
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP
subroutine dgebal(JOB, N, A, LDA, ILO, IHI, SCALE, INFO)
DGEBAL