225 SUBROUTINE ssbgvd( JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W,
226 $ Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO )
234 INTEGER INFO, KA, KB, LDAB, LDBB, LDZ, LIWORK, LWORK, N
238 REAL AB( LDAB, * ), BB( LDBB, * ), W( * ),
239 $ work( * ), z( ldz, * )
246 parameter( one = 1.0e+0, zero = 0.0e+0 )
249 LOGICAL LQUERY, UPPER, WANTZ
251 INTEGER IINFO, INDE, INDWK2, INDWRK, LIWMIN, LLWRK2,
266 wantz = lsame( jobz,
'V' )
267 upper = lsame( uplo,
'U' )
268 lquery = ( lwork.EQ.-1 .OR. liwork.EQ.-1 )
274 ELSE IF( wantz )
THEN
276 lwmin = 1 + 5*n + 2*n**2
282 IF( .NOT.( wantz .OR. lsame( jobz,
'N' ) ) )
THEN
284 ELSE IF( .NOT.( upper .OR. lsame( uplo,
'L' ) ) )
THEN
286 ELSE IF( n.LT.0 )
THEN
288 ELSE IF( ka.LT.0 )
THEN
290 ELSE IF( kb.LT.0 .OR. kb.GT.ka )
THEN
292 ELSE IF( ldab.LT.ka+1 )
THEN
294 ELSE IF( ldbb.LT.kb+1 )
THEN
296 ELSE IF( ldz.LT.1 .OR. ( wantz .AND. ldz.LT.n ) )
THEN
304 IF( lwork.LT.lwmin .AND. .NOT.lquery )
THEN
306 ELSE IF( liwork.LT.liwmin .AND. .NOT.lquery )
THEN
312 CALL xerbla(
'SSBGVD', -info )
314 ELSE IF( lquery )
THEN
325 CALL spbstf( uplo, n, kb, bb, ldbb, info )
335 indwk2 = indwrk + n*n
336 llwrk2 = lwork - indwk2 + 1
337 CALL ssbgst( jobz, uplo, n, ka, kb, ab, ldab, bb, ldbb, z, ldz,
347 CALL ssbtrd( vect, uplo, n, ka, ab, ldab, w, work( inde ), z, ldz,
348 $ work( indwrk ), iinfo )
352 IF( .NOT.wantz )
THEN
353 CALL ssterf( n, w, work( inde ), info )
355 CALL sstedc(
'I', n, w, work( inde ), work( indwrk ), n,
356 $ work( indwk2 ), llwrk2, iwork, liwork, info )
357 CALL sgemm(
'N',
'N', n, n, n, one, z, ldz, work( indwrk ), n,
358 $ zero, work( indwk2 ), n )
359 CALL slacpy(
'A', n, n, work( indwk2 ), n, z, ldz )
subroutine slacpy(UPLO, M, N, A, LDA, B, LDB)
SLACPY copies all or part of one two-dimensional array to another.
subroutine xerbla(SRNAME, INFO)
XERBLA
subroutine sstedc(COMPZ, N, D, E, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSTEDC
subroutine ssterf(N, D, E, INFO)
SSTERF
subroutine spbstf(UPLO, N, KD, AB, LDAB, INFO)
SPBSTF
subroutine ssbtrd(VECT, UPLO, N, KD, AB, LDAB, D, E, Q, LDQ, WORK, INFO)
SSBTRD
subroutine ssbgst(VECT, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, X, LDX, WORK, INFO)
SSBGST
subroutine ssbgvd(JOBZ, UPLO, N, KA, KB, AB, LDAB, BB, LDBB, W, Z, LDZ, WORK, LWORK, IWORK, LIWORK, INFO)
SSBGVD
subroutine sgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
SGEMM