349 SUBROUTINE cggsvd3( JOBU, JOBV, JOBQ, M, N, P, K, L, A, LDA, B,
350 $ LDB, ALPHA, BETA, U, LDU, V, LDV, Q, LDQ,
351 $ WORK, LWORK, RWORK, IWORK, INFO )
358 CHARACTER JOBQ, JOBU, JOBV
359 INTEGER INFO, K, L, LDA, LDB, LDQ, LDU, LDV, M, N, P,
364 REAL ALPHA( * ), BETA( * ), RWORK( * )
365 COMPLEX A( LDA, * ), B( LDB, * ), Q( LDQ, * ),
366 $ u( ldu, * ), v( ldv, * ), work( * )
372 LOGICAL WANTQ, WANTU, WANTV, LQUERY
373 INTEGER I, IBND, ISUB, J, NCYCLE, LWKOPT
374 REAL ANORM, BNORM, SMAX, TEMP, TOLA, TOLB, ULP, UNFL
379 EXTERNAL lsame, clange, slamch
391 wantu = lsame( jobu,
'U' )
392 wantv = lsame( jobv,
'V' )
393 wantq = lsame( jobq,
'Q' )
394 lquery = ( lwork.EQ.-1 )
400 IF( .NOT.( wantu .OR. lsame( jobu,
'N' ) ) )
THEN
402 ELSE IF( .NOT.( wantv .OR. lsame( jobv,
'N' ) ) )
THEN
404 ELSE IF( .NOT.( wantq .OR. lsame( jobq,
'N' ) ) )
THEN
406 ELSE IF( m.LT.0 )
THEN
408 ELSE IF( n.LT.0 )
THEN
410 ELSE IF( p.LT.0 )
THEN
412 ELSE IF( lda.LT.max( 1, m ) )
THEN
414 ELSE IF( ldb.LT.max( 1, p ) )
THEN
416 ELSE IF( ldu.LT.1 .OR. ( wantu .AND. ldu.LT.m ) )
THEN
418 ELSE IF( ldv.LT.1 .OR. ( wantv .AND. ldv.LT.p ) )
THEN
420 ELSE IF( ldq.LT.1 .OR. ( wantq .AND. ldq.LT.n ) )
THEN
422 ELSE IF( lwork.LT.1 .AND. .NOT.lquery )
THEN
429 CALL cggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb,
431 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork,
432 $ work, work, -1, info )
433 lwkopt = n + int( work( 1 ) )
434 lwkopt = max( 2*n, lwkopt )
435 lwkopt = max( 1, lwkopt )
436 work( 1 ) = cmplx( lwkopt )
440 CALL xerbla(
'CGGSVD3', -info )
449 anorm = clange(
'1', m, n, a, lda, rwork )
450 bnorm = clange(
'1', p, n, b, ldb, rwork )
455 ulp = slamch(
'Precision' )
456 unfl = slamch(
'Safe Minimum' )
457 tola = real( max( m, n ) )*max( anorm, unfl )*ulp
458 tolb = real( max( p, n ) )*max( bnorm, unfl )*ulp
460 CALL cggsvp3( jobu, jobv, jobq, m, p, n, a, lda, b, ldb, tola,
461 $ tolb, k, l, u, ldu, v, ldv, q, ldq, iwork, rwork,
462 $ work, work( n+1 ), lwork-n, info )
466 CALL ctgsja( jobu, jobv, jobq, m, p, n, k, l, a, lda, b, ldb,
467 $ tola, tolb, alpha, beta, u, ldu, v, ldv, q, ldq,
468 $ work, ncycle, info )
473 CALL scopy( n, alpha, 1, rwork, 1 )
481 DO 10 j = i + 1, ibnd
483 IF( temp.GT.smax )
THEN
489 rwork( k+isub ) = rwork( k+i )
491 iwork( k+i ) = k + isub
497 work( 1 ) = cmplx( lwkopt )
subroutine cggsvd3(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)
CGGSVD3 computes the singular value decomposition (SVD) for OTHER matrices
subroutine cggsvp3(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)
CGGSVP3
subroutine ctgsja(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)
CTGSJA