348 SUBROUTINE zggsvd3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B,
349 $ LDB, ALPHA, BETA, U, LDU, V, LDV, Q, LDQ,
350 $ WORK, LWORK, RWORK, IWORK, INFO )
357 CHARACTER JOBQ, JOBU, JOBV
358 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N, P,
363 DOUBLE PRECISION ALPHA( * ), BETA( * ), RWORK( * )
364 COMPLEX*16 A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
365 $ u( ldu, * ), v( ldv, * ), work( * )
371 LOGICAL WANTQ, WANTU, WANTV, LQUERY
372 INTEGER I, IBND, ISUB, J, NCYCLE, LWKOPT
373 DOUBLE PRECISION ANORM, BNORM, SMAX, TEMP, TOLA, TOLB, ULP, UNFL
377 DOUBLE PRECISION DLAMCH, ZLANGE
378 EXTERNAL lsame, dlamch, zlange
390 wantu = lsame( jobu,
'U' )
391 wantv = lsame( jobv,
'V' )
392 wantq = lsame( jobq,
'Q' )
393 lquery = ( lwork.EQ.-1 )
399 IF( .NOT.( wantu .OR. lsame( jobu,
'N' ) ) )
THEN
401 ELSE IF( .NOT.( wantv .OR. lsame( jobv,
'N' ) ) )
THEN
403 ELSE IF( .NOT.( wantq .OR. lsame( jobq,
'N' ) ) )
THEN
405 ELSE IF( m.LT.0 )
THEN
407 ELSE IF( n.LT.0 )
THEN
409 ELSE IF( p.LT.0 )
THEN
411 ELSE IF( lda.LT.max( 1, m ) )
THEN
413 ELSE IF( ldb.LT.max( 1, p ) )
THEN
415 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
417 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
419 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
421 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
428 CALL zggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb,
430 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork,
431 $ work, work, -1, info )
432 lwkopt = n + int( work( 1 ) )
433 lwkopt = max( 2*n, lwkopt )
434 lwkopt = max( 1, lwkopt )
435 work( 1 ) = dcmplx( lwkopt )
439 CALL xerbla(
'ZGGSVD3', -info )
448 anorm = zlange(
'1', m, n, a, lda, rwork )
449 bnorm = zlange(
'1', p, n, b, ldb, rwork )
454 ulp = dlamch(
'Precision' )
455 unfl = dlamch(
'Safe Minimum' )
456 tola = max( m, n )*max( anorm, unfl )*ulp
457 tolb = max( p, n )*max( bnorm, unfl )*ulp
459 CALL zggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola,
460 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork,
461 $ work, work( n+1 ), lwork-n, info )
465 CALL ztgsja( jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb,
466 $ tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq,
467 $ work, ncycle, info )
472 CALL dcopy( n, alpha, 1, rwork, 1 )
480 DO 10 j = i + 1, ibnd
482 IF( temp.GT.smax )
THEN
488 rwork( k+isub ) = rwork( k+i )
490 iwork( k+i ) = k + isub
496 work( 1 ) = dcmplx( lwkopt )
subroutine zggsvd3(jobu, jobv, jobq, m, n, p, k, l, a, lda, b, ldb, alpha, beta, u, ldu, v, ldv, q, ldq, work, lwork, rwork, iwork, info)
ZGGSVD3 computes the singular value decomposition (SVD) for OTHER matrices
subroutine zggsvp3(jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola, tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork, tau, work, lwork, info)
ZGGSVP3
subroutine ztgsja(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)
ZTGSJA