344 SUBROUTINE sggsvd3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B,
345 $ LDB, ALPHA, BETA, U, LDU, V, LDV, Q, LDQ,
346 $ WORK, LWORK, IWORK, INFO )
353 CHARACTER JOBQ, JOBU, JOBV
354 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N, P,
359 REAL A( LDA, * ), ALPHA( * ), B( LDB, * ),
360 $ beta( * ), q( ldq, * ), u( ldu, * ),
361 $ v( ldv, * ), work( * )
367 LOGICAL WANTQ, WANTU, WANTV, LQUERY
368 INTEGER I, IBND, ISUB, J, NCYCLE, LWKOPT
369 REAL ANORM, BNORM, SMAX, TEMP, TOLA, TOLB, ULP, UNFL
373 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
374 EXTERNAL lsame, slamch, slange,
387 wantu = lsame( jobu,
'U' )
388 wantv = lsame( jobv,
'V' )
389 wantq = lsame( jobq,
'Q' )
390 lquery = ( lwork.EQ.-1 )
396 IF( .NOT.( wantu .OR. lsame( jobu,
'N' ) ) )
THEN
398 ELSE IF( .NOT.( wantv .OR. lsame( jobv,
'N' ) ) )
THEN
400 ELSE IF( .NOT.( wantq .OR. lsame( jobq,
'N' ) ) )
THEN
402 ELSE IF( m.LT.0 )
THEN
404 ELSE IF( n.LT.0 )
THEN
406 ELSE IF( p.LT.0 )
THEN
408 ELSE IF( lda.LT.max( 1, m ) )
THEN
410 ELSE IF( ldb.LT.max( 1, p ) )
THEN
412 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
414 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
416 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
418 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
425 CALL sggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb,
427 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, work,
429 lwkopt = n + int( work( 1 ) )
430 lwkopt = max( 2*n, lwkopt )
431 lwkopt = max( 1, lwkopt )
432 work( 1 ) = sroundup_lwork( lwkopt )
436 CALL xerbla(
'SGGSVD3', -info )
445 anorm = slange(
'1', m, n, a, lda, work )
446 bnorm = slange(
'1', p, n, b, ldb, work )
451 ulp = slamch(
'Precision' )
452 unfl = slamch(
'Safe Minimum' )
453 tola = real( max( m, n ) )*max( anorm, unfl )*ulp
454 tolb = real( max( p, n ) )*max( bnorm, unfl )*ulp
458 CALL sggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola,
459 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, work,
460 $ work( n+1 ), lwork-n, info )
464 CALL stgsja( jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb,
465 $ tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq,
466 $ work, ncycle, info )
471 CALL scopy( n, alpha, 1, work, 1 )
479 DO 10 j = i + 1, ibnd
481 IF( temp.GT.smax )
THEN
487 work( k+isub ) = work( k+i )
489 iwork( k+i ) = k + isub
495 work( 1 ) = sroundup_lwork( lwkopt )
subroutine sggsvd3(jobu, jobv, jobq, m, n, p, k, l, a, lda, b, ldb, alpha, beta, u, ldu, v, ldv, q, ldq, work, lwork, iwork, info)
SGGSVD3 computes the singular value decomposition (SVD) for OTHER matrices
subroutine sggsvp3(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, tau, work, lwork, info)
SGGSVP3
subroutine stgsja(jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb, tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq, work, ncycle, info)
STGSJA