185 SUBROUTINE dgbbrd( VECT, M, N, NCC, KL, KU, AB, LDAB, D, E, Q,
186 $ LDQ, PT, LDPT, C, LDC, WORK, INFO )
194 INTEGER INFO, KL, KU, LDAB, LDC, LDPT, LDQ, M, N, NCC
197 DOUBLE PRECISION AB( ldab, * ), C( ldc, * ), D( * ), E( * ),
198 $ pt( ldpt, * ), q( ldq, * ), work( * )
204 DOUBLE PRECISION ZERO, ONE
205 parameter( zero = 0.0d+0, one = 1.0d+0 )
208 LOGICAL WANTB, WANTC, WANTPT, WANTQ
209 INTEGER I, INCA, J, J1, J2, KB, KB1, KK, KLM, KLU1,
210 $ kun, l, minmn, ml, ml0, mn, mu, mu0, nr, nrt
211 DOUBLE PRECISION RA, RB, RC, RS
227 wantb = lsame( vect,
'B' )
228 wantq = lsame( vect,
'Q' ) .OR. wantb
229 wantpt = lsame( vect,
'P' ) .OR. wantb
233 IF( .NOT.wantq .AND. .NOT.wantpt .AND. .NOT.lsame( vect,
'N' ) )
236 ELSE IF( m.LT.0 )
THEN 238 ELSE IF( n.LT.0 )
THEN 240 ELSE IF( ncc.LT.0 )
THEN 242 ELSE IF( kl.LT.0 )
THEN 244 ELSE IF( ku.LT.0 )
THEN 246 ELSE IF( ldab.LT.klu1 )
THEN 248 ELSE IF( ldq.LT.1 .OR. wantq .AND. ldq.LT.max( 1, m ) )
THEN 250 ELSE IF( ldpt.LT.1 .OR. wantpt .AND. ldpt.LT.max( 1, n ) )
THEN 252 ELSE IF( ldc.LT.1 .OR. wantc .AND. ldc.LT.max( 1, m ) )
THEN 256 CALL xerbla(
'DGBBRD', -info )
263 $
CALL dlaset(
'Full', m, m, zero, one, q, ldq )
265 $
CALL dlaset(
'Full', n, n, zero, one, pt, ldpt )
269 IF( m.EQ.0 .OR. n.EQ.0 )
274 IF( kl+ku.GT.1 )
THEN 318 $
CALL dlargv( nr, ab( klu1, j1-klm-1 ), inca,
319 $ work( j1 ), kb1, work( mn+j1 ), kb1 )
324 IF( j2-klm+l-1.GT.n )
THEN 330 $
CALL dlartv( nrt, ab( klu1-l, j1-klm+l-1 ), inca,
331 $ ab( klu1-l+1, j1-klm+l-1 ), inca,
332 $ work( mn+j1 ), work( j1 ), kb1 )
336 IF( ml.LE.m-i+1 )
THEN 341 CALL dlartg( ab( ku+ml-1, i ), ab( ku+ml, i ),
342 $ work( mn+i+ml-1 ), work( i+ml-1 ),
344 ab( ku+ml-1, i ) = ra
346 $
CALL drot( min( ku+ml-2, n-i ),
347 $ ab( ku+ml-2, i+1 ), ldab-1,
348 $ ab( ku+ml-1, i+1 ), ldab-1,
349 $ work( mn+i+ml-1 ), work( i+ml-1 ) )
359 DO 20 j = j1, j2, kb1
360 CALL drot( m, q( 1, j-1 ), 1, q( 1, j ), 1,
361 $ work( mn+j ), work( j ) )
369 DO 30 j = j1, j2, kb1
370 CALL drot( ncc, c( j-1, 1 ), ldc, c( j, 1 ), ldc,
371 $ work( mn+j ), work( j ) )
375 IF( j2+kun.GT.n )
THEN 383 DO 40 j = j1, j2, kb1
388 work( j+kun ) = work( j )*ab( 1, j+kun )
389 ab( 1, j+kun ) = work( mn+j )*ab( 1, j+kun )
396 $
CALL dlargv( nr, ab( 1, j1+kun-1 ), inca,
397 $ work( j1+kun ), kb1, work( mn+j1+kun ),
403 IF( j2+l-1.GT.m )
THEN 409 $
CALL dlartv( nrt, ab( l+1, j1+kun-1 ), inca,
410 $ ab( l, j1+kun ), inca,
411 $ work( mn+j1+kun ), work( j1+kun ),
415 IF( ml.EQ.ml0 .AND. mu.GT.mu0 )
THEN 416 IF( mu.LE.n-i+1 )
THEN 421 CALL dlartg( ab( ku-mu+3, i+mu-2 ),
422 $ ab( ku-mu+2, i+mu-1 ),
423 $ work( mn+i+mu-1 ), work( i+mu-1 ),
425 ab( ku-mu+3, i+mu-2 ) = ra
426 CALL drot( min( kl+mu-2, m-i ),
427 $ ab( ku-mu+4, i+mu-2 ), 1,
428 $ ab( ku-mu+3, i+mu-1 ), 1,
429 $ work( mn+i+mu-1 ), work( i+mu-1 ) )
439 DO 60 j = j1, j2, kb1
440 CALL drot( n, pt( j+kun-1, 1 ), ldpt,
441 $ pt( j+kun, 1 ), ldpt, work( mn+j+kun ),
446 IF( j2+kb.GT.m )
THEN 454 DO 70 j = j1, j2, kb1
459 work( j+kb ) = work( j+kun )*ab( klu1, j+kun )
460 ab( klu1, j+kun ) = work( mn+j+kun )*ab( klu1, j+kun )
472 IF( ku.EQ.0 .AND. kl.GT.0 )
THEN 480 DO 100 i = 1, min( m-1, n )
481 CALL dlartg( ab( 1, i ), ab( 2, i ), rc, rs, ra )
484 e( i ) = rs*ab( 1, i+1 )
485 ab( 1, i+1 ) = rc*ab( 1, i+1 )
488 $
CALL drot( m, q( 1, i ), 1, q( 1, i+1 ), 1, rc, rs )
490 $
CALL drot( ncc, c( i, 1 ), ldc, c( i+1, 1 ), ldc, rc,
494 $ d( m ) = ab( 1, m )
495 ELSE IF( ku.GT.0 )
THEN 507 CALL dlartg( ab( ku+1, i ), rb, rc, rs, ra )
511 e( i-1 ) = rc*ab( ku, i )
514 $
CALL drot( n, pt( i, 1 ), ldpt, pt( m+1, 1 ), ldpt,
521 DO 120 i = 1, minmn - 1
522 e( i ) = ab( ku, i+1 )
525 d( i ) = ab( ku+1, i )
533 DO 140 i = 1, minmn - 1
subroutine dgbbrd(VECT, M, N, NCC, KL, KU, AB, LDAB, D, E, Q, LDQ, PT, LDPT, C, LDC, WORK, INFO)
DGBBRD
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dlargv(N, X, INCX, Y, INCY, C, INCC)
DLARGV generates a vector of plane rotations with real cosines and real sines.
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
DLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values...
subroutine dlartv(N, X, INCX, Y, INCY, C, S, INCC)
DLARTV applies a vector of plane rotations with real cosines and real sines to the elements of a pair...