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 dgebal(JOB, N, A, LDA, ILO, IHI, SCALE, INFO)
DGEBAL
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dscal(N, DA, DX, INCX)
DSCAL
subroutine dswap(N, DX, INCX, DY, INCY)
DSWAP