269 SUBROUTINE cgesvdx( JOBU, JOBVT, RANGE, M, N, A, LDA, VL, VU,
270 $ IL, IU, NS, S, U, LDU, VT, LDVT, WORK,
271 $ LWORK, RWORK, IWORK, INFO )
279 CHARACTER JOBU, JOBVT, RANGE
280 INTEGER IL, INFO, IU, LDA, LDU, LDVT, LWORK, M, N, NS
285 REAL S( * ), RWORK( * )
286 COMPLEX A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
294 PARAMETER ( CZERO = ( 0.0e0, 0.0e0 ),
295 $ cone = ( 1.0e0, 0.0e0 ) )
297 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
300 CHARACTER JOBZ, RNGTGK
301 LOGICAL ALLS, INDS, LQUERY, VALS, WANTU, WANTVT
302 INTEGER I, ID, IE, IERR, ILQF, ILTGK, IQRF, ISCL,
303 $ itau, itaup, itauq, itemp, itempr, itgkz,
304 $ iutgk, j, k, maxwrk, minmn, minwrk, mnthr
305 REAL ABSTOL, ANRM, BIGNUM, EPS, SMLNUM
319 EXTERNAL lsame, ilaenv, slamch, clange
322 INTRINSIC max, min, sqrt
330 abstol = 2*slamch(
'S')
331 lquery = ( lwork.EQ.-1 )
334 wantu = lsame( jobu,
'V' )
335 wantvt = lsame( jobvt,
'V' )
336 IF( wantu .OR. wantvt )
THEN
341 alls = lsame( range,
'A' )
342 vals = lsame( range,
'V' )
343 inds = lsame( range,
'I' )
346 IF( .NOT.lsame( jobu,
'V' ) .AND.
347 $ .NOT.lsame( jobu,
'N' ) )
THEN
349 ELSE IF( .NOT.lsame( jobvt,
'V' ) .AND.
350 $ .NOT.lsame( jobvt,
'N' ) )
THEN
352 ELSE IF( .NOT.( alls .OR. vals .OR. inds ) )
THEN
354 ELSE IF( m.LT.0 )
THEN
356 ELSE IF( n.LT.0 )
THEN
358 ELSE IF( m.GT.lda )
THEN
360 ELSE IF( minmn.GT.0 )
THEN
362 IF( vl.LT.zero )
THEN
364 ELSE IF( vu.LE.vl )
THEN
368 IF( il.LT.1 .OR. il.GT.max( 1, minmn ) )
THEN
370 ELSE IF( iu.LT.min( minmn, il ) .OR. iu.GT.minmn )
THEN
375 IF( wantu .AND. ldu.LT.m )
THEN
377 ELSE IF( wantvt )
THEN
379 IF( ldvt.LT.iu-il+1 )
THEN
382 ELSE IF( ldvt.LT.minmn )
THEN
399 IF( minmn.GT.0 )
THEN
401 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
402 IF( m.GE.mnthr )
THEN
407 maxwrk = n + n*ilaenv(1,
'CGEQRF',
' ',m,n,-1,-1)
409 $ n*n+2*n+2*n*ilaenv(1,
'CGEBRD',
' ',n,n,-1,-1))
410 IF (wantu .OR. wantvt)
THEN
412 $ n*n+2*n+n*ilaenv(1,
'CUNMQR',
'LN',n,n,n,-1))
419 maxwrk = 2*n + (m+n)*ilaenv(1,
'CGEBRD',
' ',m,n,-1,-1)
420 IF (wantu .OR. wantvt)
THEN
422 $ 2*n+n*ilaenv(1,
'CUNMQR',
'LN',n,n,n,-1))
426 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
427 IF( n.GE.mnthr )
THEN
432 maxwrk = m + m*ilaenv(1,
'CGELQF',
' ',m,n,-1,-1)
434 $ m*m+2*m+2*m*ilaenv(1,
'CGEBRD',
' ',m,m,-1,-1))
435 IF (wantu .OR. wantvt)
THEN
437 $ m*m+2*m+m*ilaenv(1,
'CUNMQR',
'LN',m,m,m,-1))
445 maxwrk = 2*m + (m+n)*ilaenv(1,
'CGEBRD',
' ',m,n,-1,-1)
446 IF (wantu .OR. wantvt)
THEN
448 $ 2*m+m*ilaenv(1,
'CUNMQR',
'LN',m,m,m,-1))
453 maxwrk = max( maxwrk, minwrk )
454 work( 1 ) = cmplx( real( maxwrk ), zero )
456 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
462 CALL xerbla(
'CGESVDX', -info )
464 ELSE IF( lquery )
THEN
470 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
493 smlnum = sqrt( slamch(
'S' ) ) / eps
494 bignum = one / smlnum
498 anrm = clange(
'M', m, n, a, lda, dum )
500 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
502 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, info )
503 ELSE IF( anrm.GT.bignum )
THEN
505 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, info )
514 IF( m.GE.mnthr )
THEN
526 CALL cgeqrf( m, n, a, lda, work( itau ), work( itemp ),
527 $ lwork-itemp+1, info )
539 CALL clacpy(
'U', n, n, a, lda, work( iqrf ), n )
540 CALL claset(
'L', n-1, n-1, czero, czero,
541 $ work( iqrf+1 ), n )
542 CALL cgebrd( n, n, work( iqrf ), n, rwork( id ),
543 $ rwork( ie ), work( itauq ), work( itaup ),
544 $ work( itemp ), lwork-itemp+1, info )
545 itempr = itgkz + n*(n*2+1)
550 CALL sbdsvdx(
'U', jobz, rngtgk, n, rwork( id ),
551 $ rwork( ie ), vl, vu, iltgk, iutgk, ns, s,
552 $ rwork( itgkz ), n*2, rwork( itempr ),
561 u( j, i ) = cmplx( rwork( k ), zero )
566 CALL claset(
'A', m-n, ns, czero, czero, u( n+1,1 ), ldu)
571 CALL cunmbr(
'Q',
'L',
'N', n, ns, n, work( iqrf ), n,
572 $ work( itauq ), u, ldu, work( itemp ),
573 $ lwork-itemp+1, info )
578 CALL cunmqr(
'L',
'N', m, ns, n, a, lda,
579 $ work( itau ), u, ldu, work( itemp ),
580 $ lwork-itemp+1, info )
589 vt( i, j ) = cmplx( rwork( k ), zero )
598 CALL cunmbr(
'P',
'R',
'C', ns, n, n, work( iqrf ), n,
599 $ work( itaup ), vt, ldvt, work( itemp ),
600 $ lwork-itemp+1, info )
618 CALL cgebrd( m, n, a, lda, rwork( id ), rwork( ie ),
619 $ work( itauq ), work( itaup ), work( itemp ),
620 $ lwork-itemp+1, info )
621 itempr = itgkz + n*(n*2+1)
626 CALL sbdsvdx(
'U', jobz, rngtgk, n, rwork( id ),
627 $ rwork( ie ), vl, vu, iltgk, iutgk, ns, s,
628 $ rwork( itgkz ), n*2, rwork( itempr ),
637 u( j, i ) = cmplx( rwork( k ), zero )
642 CALL claset(
'A', m-n, ns, czero, czero, u( n+1,1 ), ldu)
647 CALL cunmbr(
'Q',
'L',
'N', m, ns, n, a, lda,
648 $ work( itauq ), u, ldu, work( itemp ),
649 $ lwork-itemp+1, ierr )
658 vt( i, j ) = cmplx( rwork( k ), zero )
667 CALL cunmbr(
'P',
'R',
'C', ns, n, n, a, lda,
668 $ work( itaup ), vt, ldvt, work( itemp ),
669 $ lwork-itemp+1, ierr )
677 IF( n.GE.mnthr )
THEN
689 CALL cgelqf( m, n, a, lda, work( itau ), work( itemp ),
690 $ lwork-itemp+1, info )
702 CALL clacpy(
'L', m, m, a, lda, work( ilqf ), m )
703 CALL claset(
'U', m-1, m-1, czero, czero,
704 $ work( ilqf+m ), m )
705 CALL cgebrd( m, m, work( ilqf ), m, rwork( id ),
706 $ rwork( ie ), work( itauq ), work( itaup ),
707 $ work( itemp ), lwork-itemp+1, info )
708 itempr = itgkz + m*(m*2+1)
713 CALL sbdsvdx(
'U', jobz, rngtgk, m, rwork( id ),
714 $ rwork( ie ), vl, vu, iltgk, iutgk, ns, s,
715 $ rwork( itgkz ), m*2, rwork( itempr ),
724 u( j, i ) = cmplx( rwork( k ), zero )
733 CALL cunmbr(
'Q',
'L',
'N', m, ns, m, work( ilqf ), m,
734 $ work( itauq ), u, ldu, work( itemp ),
735 $ lwork-itemp+1, info )
744 vt( i, j ) = cmplx( rwork( k ), zero )
749 CALL claset(
'A', ns, n-m, czero, czero,
750 $ vt( 1,m+1 ), ldvt )
755 CALL cunmbr(
'P',
'R',
'C', ns, m, m, work( ilqf ), m,
756 $ work( itaup ), vt, ldvt, work( itemp ),
757 $ lwork-itemp+1, info )
762 CALL cunmlq(
'R',
'N', ns, n, m, a, lda,
763 $ work( itau ), vt, ldvt, work( itemp ),
764 $ lwork-itemp+1, info )
782 CALL cgebrd( m, n, a, lda, rwork( id ), rwork( ie ),
783 $ work( itauq ), work( itaup ), work( itemp ),
784 $ lwork-itemp+1, info )
785 itempr = itgkz + m*(m*2+1)
790 CALL sbdsvdx(
'L', jobz, rngtgk, m, rwork( id ),
791 $ rwork( ie ), vl, vu, iltgk, iutgk, ns, s,
792 $ rwork( itgkz ), m*2, rwork( itempr ),
801 u( j, i ) = cmplx( rwork( k ), zero )
810 CALL cunmbr(
'Q',
'L',
'N', m, ns, n, a, lda,
811 $ work( itauq ), u, ldu, work( itemp ),
812 $ lwork-itemp+1, info )
821 vt( i, j ) = cmplx( rwork( k ), zero )
826 CALL claset(
'A', ns, n-m, czero, czero,
827 $ vt( 1,m+1 ), ldvt )
832 CALL cunmbr(
'P',
'R',
'C', ns, n, m, a, lda,
833 $ work( itaup ), vt, ldvt, work( itemp ),
834 $ lwork-itemp+1, info )
843 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn, 1,
846 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn, 1,
852 work( 1 ) = cmplx( real( maxwrk ), zero )