344 SUBROUTINE dggsvd3( 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 DOUBLE PRECISION 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 DOUBLE PRECISION ANORM, BNORM, SMAX, TEMP, TOLA, TOLB, ULP, UNFL
373 DOUBLE PRECISION DLAMCH, DLANGE
374 EXTERNAL lsame, dlamch, dlange
386 wantu = lsame( jobu,
'U' )
387 wantv = lsame( jobv,
'V' )
388 wantq = lsame( jobq,
'Q' )
389 lquery = ( lwork.EQ.-1 )
395 IF( .NOT.( wantu .OR. lsame( jobu,
'N' ) ) )
THEN
397 ELSE IF( .NOT.( wantv .OR. lsame( jobv,
'N' ) ) )
THEN
399 ELSE IF( .NOT.( wantq .OR. lsame( jobq,
'N' ) ) )
THEN
401 ELSE IF( m.LT.0 )
THEN
403 ELSE IF( n.LT.0 )
THEN
405 ELSE IF( p.LT.0 )
THEN
407 ELSE IF( lda.LT.max( 1, m ) )
THEN
409 ELSE IF( ldb.LT.max( 1, p ) )
THEN
411 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
413 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
415 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
417 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
424 CALL dggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb,
426 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, work,
428 lwkopt = n + int( work( 1 ) )
429 lwkopt = max( 2*n, lwkopt )
430 lwkopt = max( 1, lwkopt )
431 work( 1 ) = dble( lwkopt )
435 CALL xerbla(
'DGGSVD3', -info )
444 anorm = dlange(
'1', m, n, a, lda, work )
445 bnorm = dlange(
'1', p, n, b, ldb, work )
450 ulp = dlamch(
'Precision' )
451 unfl = dlamch(
'Safe Minimum' )
452 tola = max( m, n )*max( anorm, unfl )*ulp
453 tolb = max( p, n )*max( bnorm, unfl )*ulp
457 CALL dggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola,
458 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, work,
459 $ work( n+1 ), lwork-n, info )
463 CALL dtgsja( jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb,
464 $ tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq,
465 $ work, ncycle, info )
470 CALL dcopy( n, alpha, 1, work, 1 )
478 DO 10 j = i + 1, ibnd
480 IF( temp.GT.smax )
THEN
486 work( k+isub ) = work( k+i )
488 iwork( k+i ) = k + isub
494 work( 1 ) = dble( lwkopt )
subroutine dggsvd3(jobu, jobv, jobq, m, n, p, k, l, a, lda, b, ldb, alpha, beta, u, ldu, v, ldv, q, ldq, work, lwork, iwork, info)
DGGSVD3 computes the singular value decomposition (SVD) for OTHER matrices
subroutine dggsvp3(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)
DGGSVP3
subroutine dtgsja(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)
DTGSJA