161 SUBROUTINE zgebal( JOB, N, A, LDA, ILO, IHI, SCALE, INFO )
169 INTEGER IHI, ILO, INFO, LDA, N
172 DOUBLE PRECISION SCALE( * )
173 COMPLEX*16 A( LDA, * )
179 DOUBLE PRECISION ZERO, ONE
180 parameter( zero = 0.0d+0, one = 1.0d+0 )
181 DOUBLE PRECISION SCLFAC
182 parameter( sclfac = 2.0d+0 )
183 DOUBLE PRECISION FACTOR
184 parameter( factor = 0.95d+0 )
188 INTEGER I, ICA, IEXC, IRA, J, K, L, M
189 DOUBLE PRECISION C, CA, F, G, R, RA, S
193 LOGICAL DISNAN, LSAME
195 DOUBLE PRECISION DLAMCH, DZNRM2
196 EXTERNAL disnan, lsame, izamax, dlamch, dznrm2
202 INTRINSIC abs, dble, dimag,
max,
min
207 IF( .NOT.lsame( job,
'N' ) .AND. .NOT.lsame( job,
'P' ) .AND.
208 $ .NOT.lsame( job,
'S' ) .AND. .NOT.lsame( job,
'B' ) )
THEN
210 ELSE IF( n.LT.0 )
THEN
212 ELSE IF( lda.LT.
max( 1, n ) )
THEN
216 CALL xerbla(
'ZGEBAL', -info )
226 IF( lsame( job,
'N' ) )
THEN
233 IF( lsame( job,
'S' ) )
247 CALL zswap( l, a( 1, j ), 1, a( 1, m ), 1 )
248 CALL zswap( n-k+1, a( j, k ), lda, a( m, k ), lda )
266 IF( dble( a( j, i ) ).NE.zero .OR. dimag( a( j, i ) ).NE.
288 IF( dble( a( i, j ) ).NE.zero .OR. dimag( a( i, j ) ).NE.
302 IF( lsame( job,
'P' ) )
309 sfmin1 = dlamch(
'S''P' )
310 sfmax1 = one / sfmin1
312 sfmax2 = one / sfmin2
318 c = dznrm2( l-k+1, a( k, i ), 1 )
320 ica = izamax( l, a( 1, i ), 1 )
321 ca = abs( a( ica, i ) )
322 ira = izamax( n-k+1, a( i, k ), lda )
323 ra = abs( a( i, ira+k-1 ) )
327 IF( c.EQ.zero .OR. r.EQ.zero )
333 IF( c.GE.g .OR.
max( f, c, ca ).GE.sfmax2 .OR.
334 $
min( r, g, ra ).LE.sfmin2 )
GO TO 170
335 IF( disnan( c+f+ca+r+g+ra ) )
THEN
340 CALL xerbla(
'ZGEBAL', -info )
354 IF( g.LT.r .OR.
max( r, ra ).GE.sfmax2 .OR.
355 $
min( f, c, g, ca ).LE.sfmin2 )
GO TO 190
367 IF( ( c+r ).GE.factor*s )
369 IF( f.LT.one .AND. scale( i ).LT.one )
THEN
370 IF( f*scale( i ).LE.sfmin1 )
373 IF( f.GT.one .AND. scale( i ).GT.one )
THEN
374 IF( scale( i ).GE.sfmax1 / f )
378 scale( i ) = scale( i )*f
381 CALL zdscal( n-k+1, g, a( i, k ), lda )
382 CALL zdscal( l, f, a( 1, i ), 1 )