267 SUBROUTINE zgesvdx( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
268 $ IL, IU, NS, S, U, LDU, VT, LDVT, WORK,
269 $ LWORK, RWORK, IWORK, INFO )
276 CHARACTER JOBU, JOBVT,
277 INTEGER IL, INFO, IU, LDA, LDU, LDVT, , M, N, NS
278 DOUBLE PRECISION VL, VU
282 DOUBLE PRECISION S( * ), RWORK( * )
283 COMPLEX*16 A( LDA, * ), ( LDU, * ), VT( LDVT, * ),
290 COMPLEX*16 CZERO, CONE
291 PARAMETER ( CZERO = ( 0.0d0, 0.0d0 ),
292 $ cone = ( 1.0d0, 0.0d0 ) )
293 DOUBLE PRECISION ZERO, ONE
294 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
297 CHARACTER JOBZ, RNGTGK
298 LOGICAL ALLS, INDS, LQUERY, VALS, WANTU
299INTEGER I, ID, IE, IERR, ILQF, ILTGK, IQRF, ISCL,
300 $ itau, itaup, itauq, itemp, itempr, itgkz,
301 $ iutgk, j, k, maxwrk, minmn, minwrk, mnthr
302 DOUBLE PRECISION ABSTOL, ANRM, BIGNUM, EPS, SMLNUM
305 DOUBLE PRECISION DUM( 1 )
315 EXTERNAL lsame, ilaenv
326 abstol = 2*dlamch(
'S')
327 lquery = ( lwork.EQ.-1 )
330 wantu = lsame( jobu,
'V' )
331 wantvt = lsame( jobvt,
'V' )
332 IF( wantu .OR. wantvt )
THEN
337 alls = lsame( range,
'A' )
338 vals = lsame( range,
'V' )
339 inds = lsame( range,
'I' )
342 IF( .NOT.lsame( jobu,
'V' ) .AND.
343 $ .NOT.lsame( jobu,
'N' ) )
THEN
345 ELSE IF( .NOT.lsame( jobvt,
'V' ) .AND.
346 $ .NOT.lsame( jobvt,
'N' ) )
THEN
348 ELSE IF( .NOT.( alls .OR. vals .OR. inds ) )
THEN
350 ELSE IF( m.LT.0 )
THEN
352 ELSE IF( n.LT.0 )
THEN
354 ELSE IF( m.GT.lda )
THEN
356 ELSE IF( minmn.GT.0 )
THEN
358 IF( vl.LT.zero )
THEN
360 ELSE IF( vu.LE.vl )
THEN
364 IF( il.LT.1 .OR. il.GT.
max( 1, minmn ) )
THEN
366 ELSE IF( iu.LT.
min( minmn, il ) .OR. iu.GT.minmn )
THEN
371 IF( wantu .AND. ldu.LT.m
THEN
373 ELSE IF( wantvt )
THEN
375 IF( ldvt.LT.iu-il+1 )
THEN
378 ELSE IF( ldvt.LT.minmn )
THEN
395 IF( minmn.GT.0 )
THEN
397 mnthr = ilaenv( 6,
'ZGESVD', jobu // jobvt, m, n, 0, 0 )
398 IF( m.GE.mnthr )
THEN
403 maxwrk = n + n*ilaenv(1,
'ZGEQRF',
' ',m,n,-1,-1)
405 $ n*n+2*n+2*n*ilaenv(1,
'ZGEBRD',
' ',n,n,-1,-1))
406 IF (wantu .OR. wantvt)
THEN
408 $ n*n+2*n+n*ilaenv(1,
'ZUNMQR',
'LN',n,n,n,-1))
415 maxwrk = 2*n + (m+n)*ilaenv(1,
'ZGEBRD',
' ',m,n,-1,-1)
416 IF (wantu .OR. wantvt)
THEN
418 $ 2*n+n*ilaenv(1,
'ZUNMQR',
'LN',n,n,n,-1))
422 mnthr = ilaenv( 6, '
zgesvd', JOBU // JOBVT, M, N, 0, 0 )
423.GE.
IF( NMNTHR ) THEN
428 MAXWRK = M + M*ILAENV(1,'zgelqf',' ',M,N,-1,-1)
430 $ M*M+2*M+2*M*ILAENV(1,'zgebrd',' ',M,M,-1,-1))
431.OR.
IF (WANTU WANTVT) THEN
433 $ M*M+2*M+M*ILAENV(1,'zunmqr','ln
',M,M,M,-1))
441 MAXWRK = 2*M + (M+N)*ILAENV(1,'zgebrd',' ',M,N,-1,-1)
442.OR.
IF (WANTU WANTVT) THEN
444 $ 2*M+M*ILAENV(1,'zunmqr','ln
',M,M,M,-1))
449 MAXWRK = MAX( MAXWRK, MINWRK )
450 WORK( 1 ) = DCMPLX( DBLE( MAXWRK ), ZERO )
452.LT..AND..NOT.
IF( LWORKMINWRK LQUERY ) THEN
458 CALL XERBLA( 'zgesvdx', -INFO )
460 ELSE IF( LQUERY ) THEN
466.EQ..OR..EQ.
IF( M0 N0 ) THEN
489 SMLNUM = SQRT( DLAMCH( 's
' ) ) / EPS
490 BIGNUM = ONE / SMLNUM
494 ANRM = ZLANGE( 'm
', M, N, A, LDA, DUM )
496.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
498 CALL ZLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, INFO )
499.GT.
ELSE IF( ANRMBIGNUM ) THEN
501 CALL ZLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, INFO )
510.GE.
IF( MMNTHR ) THEN
522 CALL ZGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( ITEMP ),
523 $ LWORK-ITEMP+1, INFO )
535 CALL ZLACPY( 'u
', N, N, A, LDA, WORK( IQRF ), N )
536 CALL ZLASET( 'l
', N-1, N-1, CZERO, CZERO,
537 $ WORK( IQRF+1 ), N )
538 CALL ZGEBRD( N, N, WORK( IQRF ), N, RWORK( ID ),
539 $ RWORK( IE ), WORK( ITAUQ ), WORK( ITAUP ),
540 $ WORK( ITEMP ), LWORK-ITEMP+1, INFO )
541 ITEMPR = ITGKZ + N*(N*2+1)
546 CALL DBDSVDX( 'u
', JOBZ, RNGTGK, N, RWORK( ID ),
547 $ RWORK( IE ), VL, VU, ILTGK, IUTGK, NS, S,
548 $ RWORK( ITGKZ ), N*2, RWORK( ITEMPR ),
557 U( J, I ) = DCMPLX( RWORK( K ), ZERO )
562 CALL ZLASET( 'a
', M-N, NS, CZERO, CZERO, U( N+1,1 ), LDU)
567 CALL ZUNMBR( 'q
', 'l
', 'n
', N, NS, N, WORK( IQRF ), N,
568 $ WORK( ITAUQ ), U, LDU, WORK( ITEMP ),
569 $ LWORK-ITEMP+1, INFO )
574 CALL ZUNMQR( 'l
', 'n
', M, NS, N, A, LDA,
575 $ WORK( ITAU ), U, LDU, WORK( ITEMP ),
576 $ LWORK-ITEMP+1, INFO )
585 VT( I, J ) = DCMPLX( RWORK( K ), ZERO )
594 CALL ZUNMBR( 'p
', 'r
', 'c
', NS, N, N, WORK( IQRF ), N,
595 $ WORK( ITAUP ), VT, LDVT, WORK( ITEMP ),
596 $ LWORK-ITEMP+1, INFO )
614 CALL ZGEBRD( M, N, A, LDA, RWORK( ID ), RWORK( IE ),
615 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( ITEMP ),
616 $ LWORK-ITEMP+1, INFO )
617 ITEMPR = ITGKZ + N*(N*2+1)
622 CALL DBDSVDX( 'u
', JOBZ, RNGTGK, N, RWORK( ID ),
623 $ RWORK( IE ), VL, VU, ILTGK, IUTGK, NS, S,
624 $ RWORK( ITGKZ ), N*2, RWORK( ITEMPR ),
633 U( J, I ) = DCMPLX( RWORK( K ), ZERO )
638 CALL ZLASET( 'a
', M-N, NS, CZERO, CZERO, U( N+1,1 ), LDU)
643 CALL ZUNMBR( 'q
', 'l
', 'n
', M, NS, N, A, LDA,
644 $ WORK( ITAUQ ), U, LDU, WORK( ITEMP ),
645 $ LWORK-ITEMP+1, IERR )
654 VT( I, J ) = DCMPLX( RWORK( K ), ZERO )
663 CALL ZUNMBR( 'p
', 'r
', 'c
', NS, N, N, A, LDA,
664 $ WORK( ITAUP ), VT, LDVT, WORK( ITEMP ),
665 $ LWORK-ITEMP+1, IERR )
673.GE.
IF( NMNTHR ) THEN
685 CALL ZGELQF( M, N, A, LDA, WORK( ITAU ), WORK( ITEMP ),
686 $ LWORK-ITEMP+1, INFO )
698 CALL ZLACPY( 'l
', M, M, A, LDA, WORK( ILQF ), M )
699 CALL ZLASET( 'u
', M-1, M-1, CZERO, CZERO,
700 $ WORK( ILQF+M ), M )
701 CALL ZGEBRD( M, M, WORK( ILQF ), M, RWORK( ID ),
702 $ RWORK( IE ), WORK( ITAUQ ), WORK( ITAUP ),
703 $ WORK( ITEMP ), LWORK-ITEMP+1, INFO )
704 ITEMPR = ITGKZ + M*(M*2+1)
709 CALL DBDSVDX( 'u
', JOBZ, RNGTGK, M, RWORK( ID ),
710 $ RWORK( IE ), VL, VU, ILTGK, IUTGK, NS, S,
711 $ RWORK( ITGKZ ), M*2, RWORK( ITEMPR ),
720 U( J, I ) = DCMPLX( RWORK( K ), ZERO )
729 CALL ZUNMBR( 'q
', 'l
', 'n
', M, NS, M, WORK( ILQF ), M,
730 $ WORK( ITAUQ ), U, LDU, WORK( ITEMP ),
731 $ LWORK-ITEMP+1, INFO )
740 VT( I, J ) = DCMPLX( RWORK( K ), ZERO )
745 CALL ZLASET( 'a
', NS, N-M, CZERO, CZERO,
746 $ VT( 1,M+1 ), LDVT )
751 CALL ZUNMBR( 'p
', 'r
', 'c
', NS, M, M, WORK( ILQF ), M,
752 $ WORK( ITAUP ), VT, LDVT, WORK( ITEMP ),
753 $ LWORK-ITEMP+1, INFO )
758 CALL ZUNMLQ( 'r
', 'n
', NS, N, M, A, LDA,
759 $ WORK( ITAU ), VT, LDVT, WORK( ITEMP ),
760 $ LWORK-ITEMP+1, INFO )
778 CALL ZGEBRD( M, N, A, LDA, RWORK( ID ), RWORK( IE ),
779 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( ITEMP ),
780 $ LWORK-ITEMP+1, INFO )
781 ITEMPR = ITGKZ + M*(M*2+1)
786 CALL DBDSVDX( 'l
', JOBZ, RNGTGK, M, RWORK( ID ),
787 $ RWORK( IE ), VL, VU, ILTGK, IUTGK, NS, S,
788 $ RWORK( ITGKZ ), M*2, RWORK( ITEMPR ),
797 U( J, I ) = DCMPLX( RWORK( K ), ZERO )
806 CALL ZUNMBR( 'q
', 'l
', 'n
', M, NS, N, A, LDA,
807 $ WORK( ITAUQ ), U, LDU, WORK( ITEMP ),
808 $ LWORK-ITEMP+1, INFO )
817 VT( I, J ) = DCMPLX( RWORK( K ), ZERO )
822 CALL ZLASET( 'a
', NS, N-M, CZERO, CZERO,
823 $ VT( 1,M+1 ), LDVT )
828 CALL ZUNMBR( 'p
', 'r
', 'c
', NS, N, M, A, LDA,
829 $ WORK( ITAUP ), VT, LDVT, WORK( ITEMP ),
830 $ LWORK-ITEMP+1, INFO )
839 $ CALL DLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1,
842 $ CALL DLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1,
848 WORK( 1 ) = DCMPLX( DBLE( MAXWRK ), ZERO )
subroutine dlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(srname, info)
XERBLA
double precision function zlange(norm, m, n, a, lda, work)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zgelqf(m, n, a, lda, tau, work, lwork, info)
ZGELQF
subroutine zgebrd(m, n, a, lda, d, e, tauq, taup, work, lwork, info)
ZGEBRD
subroutine zgesvdx(jobu, jobvt, range, m, n, a, lda, vl, vu, il, iu, ns, s, u, ldu, vt, ldvt, work, lwork, rwork, iwork, info)
ZGESVDX computes the singular value decomposition (SVD) for GE matrices
subroutine zgesvd(jobu, jobvt, m, n, a, lda, s, u, ldu, vt, ldvt, work, lwork, rwork, info)
ZGESVD computes the singular value decomposition (SVD) for GE matrices
subroutine zlascl(type, kl, ku, cfrom, cto, m, n, a, lda, info)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(uplo, m, n, a, lda, b, ldb)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlaset(uplo, m, n, alpha, beta, a, lda)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zunmlq(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMLQ
subroutine zunmbr(vect, side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMBR
subroutine zunmqr(side, trans, m, n, k, a, lda, tau, c, ldc, work, lwork, info)
ZUNMQR
subroutine dbdsvdx(uplo, jobz, range, n, d, e, vl, vu, il, iu, ns, s, z, ldz, work, iwork, info)
DBDSVDX
subroutine zgeqrf(m, n, a, lda, tau, work, lwork, info)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.