187 SUBROUTINE dgbbrd( VECT, M, N, NCC, KL, KU, AB, LDAB, D, E, Q,
188 $ LDQ, PT, LDPT, C, LDC, WORK, INFO )
197 INTEGER INFO, KL, KU, LDAB, LDC, LDPT, LDQ, M, N, NCC
200 DOUBLE PRECISION AB( ldab, * ), C( ldc, * ), D( * ), E( * ),
201 $ pt( ldpt, * ), q( ldq, * ), work( * )
207 DOUBLE PRECISION ZERO, ONE
208 parameter( zero = 0.0d+0, one = 1.0d+0 )
211 LOGICAL WANTB, WANTC, WANTPT, WANTQ
212 INTEGER I, INCA, J, J1, J2, KB, KB1, KK, KLM, KLU1,
213 $ kun, l, minmn, ml, ml0, mn, mu, mu0, nr, nrt
214 DOUBLE PRECISION RA, RB, RC, RS
230 wantb = lsame( vect,
'B' )
231 wantq = lsame( vect,
'Q' ) .OR. wantb
232 wantpt = lsame( vect,
'P' ) .OR. wantb
236 IF( .NOT.wantq .AND. .NOT.wantpt .AND. .NOT.lsame( vect,
'N' ) )
239 ELSE IF( m.LT.0 )
THEN 241 ELSE IF( n.LT.0 )
THEN 243 ELSE IF( ncc.LT.0 )
THEN 245 ELSE IF( kl.LT.0 )
THEN 247 ELSE IF( ku.LT.0 )
THEN 249 ELSE IF( ldab.LT.klu1 )
THEN 251 ELSE IF( ldq.LT.1 .OR. wantq .AND. ldq.LT.max( 1, m ) )
THEN 253 ELSE IF( ldpt.LT.1 .OR. wantpt .AND. ldpt.LT.max( 1, n ) )
THEN 255 ELSE IF( ldc.LT.1 .OR. wantc .AND. ldc.LT.max( 1, m ) )
THEN 259 CALL xerbla(
'DGBBRD', -info )
266 $
CALL dlaset(
'Full', m, m, zero, one, q, ldq )
268 $
CALL dlaset(
'Full', n, n, zero, one, pt, ldpt )
272 IF( m.EQ.0 .OR. n.EQ.0 )
277 IF( kl+ku.GT.1 )
THEN 321 $
CALL dlargv( nr, ab( klu1, j1-klm-1 ), inca,
322 $ work( j1 ), kb1, work( mn+j1 ), kb1 )
327 IF( j2-klm+l-1.GT.n )
THEN 333 $
CALL dlartv( nrt, ab( klu1-l, j1-klm+l-1 ), inca,
334 $ ab( klu1-l+1, j1-klm+l-1 ), inca,
335 $ work( mn+j1 ), work( j1 ), kb1 )
339 IF( ml.LE.m-i+1 )
THEN 344 CALL dlartg( ab( ku+ml-1, i ), ab( ku+ml, i ),
345 $ work( mn+i+ml-1 ), work( i+ml-1 ),
347 ab( ku+ml-1, i ) = ra
349 $
CALL drot( min( ku+ml-2, n-i ),
350 $ ab( ku+ml-2, i+1 ), ldab-1,
351 $ ab( ku+ml-1, i+1 ), ldab-1,
352 $ work( mn+i+ml-1 ), work( i+ml-1 ) )
362 DO 20 j = j1, j2, kb1
363 CALL drot( m, q( 1, j-1 ), 1, q( 1, j ), 1,
364 $ work( mn+j ), work( j ) )
372 DO 30 j = j1, j2, kb1
373 CALL drot( ncc, c( j-1, 1 ), ldc, c( j, 1 ), ldc,
374 $ work( mn+j ), work( j ) )
378 IF( j2+kun.GT.n )
THEN 386 DO 40 j = j1, j2, kb1
391 work( j+kun ) = work( j )*ab( 1, j+kun )
392 ab( 1, j+kun ) = work( mn+j )*ab( 1, j+kun )
399 $
CALL dlargv( nr, ab( 1, j1+kun-1 ), inca,
400 $ work( j1+kun ), kb1, work( mn+j1+kun ),
406 IF( j2+l-1.GT.m )
THEN 412 $
CALL dlartv( nrt, ab( l+1, j1+kun-1 ), inca,
413 $ ab( l, j1+kun ), inca,
414 $ work( mn+j1+kun ), work( j1+kun ),
418 IF( ml.EQ.ml0 .AND. mu.GT.mu0 )
THEN 419 IF( mu.LE.n-i+1 )
THEN 424 CALL dlartg( ab( ku-mu+3, i+mu-2 ),
425 $ ab( ku-mu+2, i+mu-1 ),
426 $ work( mn+i+mu-1 ), work( i+mu-1 ),
428 ab( ku-mu+3, i+mu-2 ) = ra
429 CALL drot( min( kl+mu-2, m-i ),
430 $ ab( ku-mu+4, i+mu-2 ), 1,
431 $ ab( ku-mu+3, i+mu-1 ), 1,
432 $ work( mn+i+mu-1 ), work( i+mu-1 ) )
442 DO 60 j = j1, j2, kb1
443 CALL drot( n, pt( j+kun-1, 1 ), ldpt,
444 $ pt( j+kun, 1 ), ldpt, work( mn+j+kun ),
449 IF( j2+kb.GT.m )
THEN 457 DO 70 j = j1, j2, kb1
462 work( j+kb ) = work( j+kun )*ab( klu1, j+kun )
463 ab( klu1, j+kun ) = work( mn+j+kun )*ab( klu1, j+kun )
475 IF( ku.EQ.0 .AND. kl.GT.0 )
THEN 483 DO 100 i = 1, min( m-1, n )
484 CALL dlartg( ab( 1, i ), ab( 2, i ), rc, rs, ra )
487 e( i ) = rs*ab( 1, i+1 )
488 ab( 1, i+1 ) = rc*ab( 1, i+1 )
491 $
CALL drot( m, q( 1, i ), 1, q( 1, i+1 ), 1, rc, rs )
493 $
CALL drot( ncc, c( i, 1 ), ldc, c( i+1, 1 ), ldc, rc,
497 $ d( m ) = ab( 1, m )
498 ELSE IF( ku.GT.0 )
THEN 510 CALL dlartg( ab( ku+1, i ), rb, rc, rs, ra )
514 e( i-1 ) = rc*ab( ku, i )
517 $
CALL drot( n, pt( i, 1 ), ldpt, pt( m+1, 1 ), ldpt,
524 DO 120 i = 1, minmn - 1
525 e( i ) = ab( ku, i+1 )
528 d( i ) = ab( ku+1, i )
536 DO 140 i = 1, minmn - 1
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...
subroutine drot(N, DX, INCX, DY, INCY, C, S)
DROT
subroutine dlartg(F, G, CS, SN, R)
DLARTG generates a plane rotation with real cosine and real sine.
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 dlargv(N, X, INCX, Y, INCY, C, INCC)
DLARGV generates a vector of plane rotations with real cosines and real sines.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine dgbbrd(VECT, M, N, NCC, KL, KU, AB, LDAB, D, E, Q, LDQ, PT, LDPT, C, LDC, WORK, INFO)
DGBBRD