563 SUBROUTINE cgejsv( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
564 $ M, N, A, LDA, SVA, U, LDU, V, LDV,
565 $ CWORK, LWORK, RWORK, LRWORK, IWORK, INFO )
573 INTEGER INFO, LDA, LDU, LDV, LWORK, LRWORK, M, N
576 COMPLEX A( LDA, * ), U( LDU, * ), V( LDV, * ), CWORK( LWORK )
577 REAL SVA( N ), RWORK( LRWORK )
579 CHARACTER*1 JOBA, JOBP, JOBR, JOBT, JOBU, JOBV
586 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
588 parameter( czero = ( 0.0e0, 0.0e0 ), cone = ( 1.0e0, 0.0e0 ) )
592 REAL AAPP, AAQQ, AATMAX, AATMIN, BIG, BIG1, COND_OK,
593 $ condr1, condr2, entra, entrat, epsln, maxprj, scalem,
594 $ sconda, sfmin, small, temp1, uscal1, uscal2, xsc
595 INTEGER IERR, N1, NR, NUMRANK, p, q, WARNING
596 LOGICAL ALMORT, DEFR, ERREST, GOSCAL, JRACC, KILL, LQUERY,
597 $ lsvec, l2aber, l2kill, l2pert, l2rank, l2tran, noscal,
598 $ rowpiv, rsvec, transp
600 INTEGER OPTWRK, MINWRK, MINRWRK, MINIWRK
601 INTEGER LWCON, LWLQF, LWQP3, LWQRF, LWUNMLQ, LWUNMQR, LWUNMQRM,
602 $ lwsvdj, lwsvdjv, lrwqp3, lrwcon, lrwsvdj, iwoff
603 INTEGER LWRK_CGELQF, LWRK_CGEQP3, LWRK_CGEQP3N, LWRK_CGEQRF,
604 $ LWRK_CGESVJ, LWRK_CGESVJV, LWRK_CGESVJU, LWRK_CUNMLQ,
605 $ lwrk_cunmqr, lwrk_cunmqrm
612 INTRINSIC abs, cmplx, conjg, alog, max, min, real, nint, sqrt
616 INTEGER ISAMAX, ICAMAX
618 EXTERNAL isamax, icamax, lsame, slamch, scnrm2
631 lsvec = lsame( jobu,
'U' ) .OR. lsame( jobu,
'F' )
632 jracc = lsame( jobv,
'J' )
633 rsvec = lsame( jobv,
'V' ) .OR. jracc
634 rowpiv = lsame( joba,
'F' ) .OR. lsame( joba,
'G' )
635 l2rank = lsame( joba,
'R' )
636 l2aber = lsame( joba,
'A' )
637 errest = lsame( joba,
'E' ) .OR. lsame( joba,
'G' )
638 l2tran = lsame( jobt,
'T' ) .AND. ( m .EQ. n )
639 l2kill = lsame( jobr,
'R' )
640 defr = lsame( jobr,
'N' )
641 l2pert = lsame( jobp,
'P' )
643 lquery = ( lwork .EQ. -1 ) .OR. ( lrwork .EQ. -1 )
645 IF ( .NOT.(rowpiv .OR. l2rank .OR. l2aber .OR.
646 $ errest .OR. lsame( joba,
'C' ) ))
THEN
648 ELSE IF ( .NOT.( lsvec .OR. lsame( jobu,
'N' ) .OR.
649 $ ( lsame( jobu,
'W' ) .AND. rsvec .AND. l2tran ) ) )
THEN
651 ELSE IF ( .NOT.( rsvec .OR. lsame( jobv,
'N' ) .OR.
652 $ ( lsame( jobv,
'W' ) .AND. lsvec .AND. l2tran ) ) )
THEN
654 ELSE IF ( .NOT. ( l2kill .OR. defr ) )
THEN
656 ELSE IF ( .NOT. ( lsame(jobt,
'T') .OR.
657 $ lsame(jobt,
'N') ) )
THEN
659 ELSE IF ( .NOT. ( l2pert .OR. lsame( jobp,
'N' ) ) )
THEN
661 ELSE IF ( m .LT. 0 )
THEN
663 ELSE IF ( ( n .LT. 0 ) .OR. ( n .GT. m ) )
THEN
665 ELSE IF ( lda .LT. m )
THEN
667 ELSE IF ( lsvec .AND. ( ldu .LT. m ) )
THEN
669 ELSE IF ( rsvec .AND. ( ldv .LT. n ) )
THEN
676 IF ( info .EQ. 0 )
THEN
690 lwunmlq = max( 1, n )
691 lwunmqr = max( 1, n )
692 lwunmqrm = max( 1, m )
697 lwsvdj = max( 2 * n, 1 )
698 lwsvdjv = max( 2 * n, 1 )
704 CALL cgeqp3( m, n, a, lda, iwork, cdummy, cdummy, -1,
706 lwrk_cgeqp3 = int( cdummy(1) )
707 CALL cgeqrf( n, n, a, lda, cdummy, cdummy,-1, ierr )
708 lwrk_cgeqrf = int( cdummy(1) )
709 CALL cgelqf( n, n, a, lda, cdummy, cdummy,-1, ierr )
710 lwrk_cgelqf = int( cdummy(1) )
715 IF ( .NOT. (lsvec .OR. rsvec ) )
THEN
719 minwrk = max( n+lwqp3, n**2+lwcon, n+lwqrf, lwsvdj )
721 minwrk = max( n+lwqp3, n+lwqrf, lwsvdj )
724 CALL cgesvj(
'L',
'N',
'N', n, n, a, lda, sva, n,
726 $ ldv, cdummy, -1, rdummy, -1, ierr )
727 lwrk_cgesvj = int( cdummy(1) )
729 optwrk = max( n+lwrk_cgeqp3, n**2+lwcon,
730 $ n+lwrk_cgeqrf, lwrk_cgesvj )
732 optwrk = max( n+lwrk_cgeqp3, n+lwrk_cgeqrf,
736 IF ( l2tran .OR. rowpiv )
THEN
738 minrwrk = max( 7, 2*m, lrwqp3, lrwcon, lrwsvdj )
740 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj )
744 minrwrk = max( 7, lrwqp3, lrwcon, lrwsvdj )
746 minrwrk = max( 7, lrwqp3, lrwsvdj )
749 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
750 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
754 minwrk = max( n+lwqp3, lwcon, lwsvdj, n+lwlqf,
755 $ 2*n+lwqrf, n+lwsvdj, n+lwunmlq )
757 minwrk = max( n+lwqp3, lwsvdj, n+lwlqf, 2*n+lwqrf,
758 $ n+lwsvdj, n+lwunmlq )
761 CALL cgesvj(
'L',
'U',
'N', n,n, u, ldu, sva, n, a,
762 $ lda, cdummy, -1, rdummy, -1, ierr )
763 lwrk_cgesvj = int( cdummy(1) )
764 CALL cunmlq(
'L',
'C', n, n, n, a, lda, cdummy,
765 $ v, ldv, cdummy, -1, ierr )
766 lwrk_cunmlq = int( cdummy(1) )
768 optwrk = max( n+lwrk_cgeqp3, lwcon, lwrk_cgesvj,
769 $ n+lwrk_cgelqf, 2*n+lwrk_cgeqrf,
770 $ n+lwrk_cgesvj, n+lwrk_cunmlq )
772 optwrk = max( n+lwrk_cgeqp3, lwrk_cgesvj,n+lwrk_cgelqf,
773 $ 2*n+lwrk_cgeqrf, n+lwrk_cgesvj,
777 IF ( l2tran .OR. rowpiv )
THEN
779 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj, lrwcon )
781 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj )
785 minrwrk = max( 7, lrwqp3, lrwsvdj, lrwcon )
787 minrwrk = max( 7, lrwqp3, lrwsvdj )
790 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
791 ELSE IF ( lsvec .AND. (.NOT.rsvec) )
THEN
795 minwrk = n + max( lwqp3,lwcon,n+lwqrf,lwsvdj,lwunmqrm )
797 minwrk = n + max( lwqp3, n+lwqrf, lwsvdj, lwunmqrm )
800 CALL cgesvj(
'L',
'U',
'N', n,n, u, ldu, sva, n, a,
801 $ lda, cdummy, -1, rdummy, -1, ierr )
802 lwrk_cgesvj = int( cdummy(1) )
803 CALL cunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
804 $ ldu, cdummy, -1, ierr )
805 lwrk_cunmqrm = int( cdummy(1) )
807 optwrk = n + max( lwrk_cgeqp3, lwcon, n+lwrk_cgeqrf,
808 $ lwrk_cgesvj, lwrk_cunmqrm )
810 optwrk = n + max( lwrk_cgeqp3, n+lwrk_cgeqrf,
811 $ lwrk_cgesvj, lwrk_cunmqrm )
814 IF ( l2tran .OR. rowpiv )
THEN
816 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj, lrwcon )
818 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj )
822 minrwrk = max( 7, lrwqp3, lrwsvdj, lrwcon )
824 minrwrk = max( 7, lrwqp3, lrwsvdj )
827 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
831 IF ( .NOT. jracc )
THEN
833 minwrk = max( n+lwqp3, n+lwcon, 2*n+n**2+lwcon,
834 $ 2*n+lwqrf, 2*n+lwqp3,
835 $ 2*n+n**2+n+lwlqf, 2*n+n**2+n+n**2+lwcon,
836 $ 2*n+n**2+n+lwsvdj, 2*n+n**2+n+lwsvdjv,
837 $ 2*n+n**2+n+lwunmqr,2*n+n**2+n+lwunmlq,
838 $ n+n**2+lwsvdj, n+lwunmqrm )
840 minwrk = max( n+lwqp3, 2*n+n**2+lwcon,
841 $ 2*n+lwqrf, 2*n+lwqp3,
842 $ 2*n+n**2+n+lwlqf, 2*n+n**2+n+n**2+lwcon,
843 $ 2*n+n**2+n+lwsvdj, 2*n+n**2+n+lwsvdjv,
844 $ 2*n+n**2+n+lwunmqr,2*n+n**2+n+lwunmlq,
845 $ n+n**2+lwsvdj, n+lwunmqrm )
847 miniwrk = miniwrk + n
848 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
851 minwrk = max( n+lwqp3, n+lwcon, 2*n+lwqrf,
852 $ 2*n+n**2+lwsvdjv, 2*n+n**2+n+lwunmqr,
855 minwrk = max( n+lwqp3, 2*n+lwqrf,
856 $ 2*n+n**2+lwsvdjv, 2*n+n**2+n+lwunmqr,
859 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
862 CALL cunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
863 $ ldu, cdummy, -1, ierr )
864 lwrk_cunmqrm = int( cdummy(1) )
865 CALL cunmqr(
'L',
'N', n, n, n, a, lda, cdummy, u,
866 $ ldu, cdummy, -1, ierr )
867 lwrk_cunmqr = int( cdummy(1) )
868 IF ( .NOT. jracc )
THEN
869 CALL cgeqp3( n,n, a, lda, iwork, cdummy,cdummy,
872 lwrk_cgeqp3n = int( cdummy(1) )
873 CALL cgesvj(
'L',
'U',
'N', n, n, u, ldu, sva,
874 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
875 lwrk_cgesvj = int( cdummy(1) )
876 CALL cgesvj(
'U',
'U',
'N', n, n, u, ldu, sva,
877 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
878 lwrk_cgesvju = int( cdummy(1) )
879 CALL cgesvj(
'L',
'U',
'V', n, n, u, ldu, sva,
880 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
881 lwrk_cgesvjv = int( cdummy(1) )
882 CALL cunmlq(
'L',
'C', n, n, n, a, lda, cdummy,
883 $ v, ldv, cdummy, -1, ierr )
884 lwrk_cunmlq = int( cdummy(1) )
886 optwrk = max( n+lwrk_cgeqp3, n+lwcon,
887 $ 2*n+n**2+lwcon, 2*n+lwrk_cgeqrf,
889 $ 2*n+n**2+n+lwrk_cgelqf,
890 $ 2*n+n**2+n+n**2+lwcon,
891 $ 2*n+n**2+n+lwrk_cgesvj,
892 $ 2*n+n**2+n+lwrk_cgesvjv,
893 $ 2*n+n**2+n+lwrk_cunmqr,
894 $ 2*n+n**2+n+lwrk_cunmlq,
895 $ n+n**2+lwrk_cgesvju,
898 optwrk = max( n+lwrk_cgeqp3,
899 $ 2*n+n**2+lwcon, 2*n+lwrk_cgeqrf,
901 $ 2*n+n**2+n+lwrk_cgelqf,
902 $ 2*n+n**2+n+n**2+lwcon,
903 $ 2*n+n**2+n+lwrk_cgesvj,
904 $ 2*n+n**2+n+lwrk_cgesvjv,
905 $ 2*n+n**2+n+lwrk_cunmqr,
906 $ 2*n+n**2+n+lwrk_cunmlq,
907 $ n+n**2+lwrk_cgesvju,
911 CALL cgesvj(
'L',
'U',
'V', n, n, u, ldu, sva,
912 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
913 lwrk_cgesvjv = int( cdummy(1) )
914 CALL cunmqr(
'L',
'N', n, n, n, cdummy, n,
916 $ v, ldv, cdummy, -1, ierr )
917 lwrk_cunmqr = int( cdummy(1) )
918 CALL cunmqr(
'L',
'N', m, n, n, a, lda, cdummy,
920 $ ldu, cdummy, -1, ierr )
921 lwrk_cunmqrm = int( cdummy(1) )
923 optwrk = max( n+lwrk_cgeqp3, n+lwcon,
924 $ 2*n+lwrk_cgeqrf, 2*n+n**2,
925 $ 2*n+n**2+lwrk_cgesvjv,
926 $ 2*n+n**2+n+lwrk_cunmqr,n+lwrk_cunmqrm )
928 optwrk = max( n+lwrk_cgeqp3, 2*n+lwrk_cgeqrf,
929 $ 2*n+n**2, 2*n+n**2+lwrk_cgesvjv,
930 $ 2*n+n**2+n+lwrk_cunmqr,
935 IF ( l2tran .OR. rowpiv )
THEN
936 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj, lrwcon )
938 minrwrk = max( 7, lrwqp3, lrwsvdj, lrwcon )
941 minwrk = max( 2, minwrk )
942 optwrk = max( optwrk, minwrk )
943 IF ( lwork .LT. minwrk .AND. (.NOT.lquery) ) info = - 17
944 IF ( lrwork .LT. minrwrk .AND. (.NOT.lquery) ) info = - 19
947 IF ( info .NE. 0 )
THEN
949 CALL xerbla(
'CGEJSV', - info )
951 ELSE IF ( lquery )
THEN
952 cwork(1) = cmplx( optwrk )
953 cwork(2) = cmplx( minwrk )
954 rwork(1) = real( minrwrk )
955 iwork(1) = max( 4, miniwrk )
961 IF ( ( m .EQ. 0 ) .OR. ( n .EQ. 0 ) )
THEN
971 IF ( lsame( jobu,
'F' ) ) n1 = m
978 epsln = slamch(
'Epsilon')
979 sfmin = slamch(
'SafeMinimum')
980 small = sfmin / epsln
990 scalem = one / sqrt(real(m)*real(n))
996 CALL classq( m, a(1,p), 1, aapp, aaqq )
997 IF ( aapp .GT. big )
THEN
999 CALL xerbla(
'CGEJSV', -info )
1003 IF ( ( aapp .LT. (big / aaqq) ) .AND. noscal )
THEN
1004 sva(p) = aapp * aaqq
1007 sva(p) = aapp * ( aaqq * scalem )
1010 CALL sscal( p-1, scalem, sva, 1 )
1015 IF ( noscal ) scalem = one
1020 aapp = max( aapp, sva(p) )
1021 IF ( sva(p) .NE. zero ) aaqq = min( aaqq, sva(p) )
1026 IF ( aapp .EQ. zero )
THEN
1027 IF ( lsvec )
CALL claset(
'G', m, n1, czero, cone, u, ldu )
1028 IF ( rsvec )
CALL claset(
'G', n, n, czero, cone, v, ldv )
1031 IF ( errest ) rwork(3) = one
1032 IF ( lsvec .AND. rsvec )
THEN
1052 IF ( aaqq .LE. sfmin )
THEN
1060 IF ( n .EQ. 1 )
THEN
1063 CALL clascl(
'G',0,0,sva(1),scalem, m,1,a(1,1),lda,ierr )
1064 CALL clacpy(
'A', m, 1, a, lda, u, ldu )
1066 IF ( n1 .NE. n )
THEN
1067 CALL cgeqrf( m, n, u,ldu, cwork, cwork(n+1),lwork-n,
1069 CALL cungqr( m,n1,1, u,ldu,cwork,cwork(n+1),lwork-n,
1071 CALL ccopy( m, a(1,1), 1, u(1,1), 1 )
1077 IF ( sva(1) .LT. (big*scalem) )
THEN
1078 sva(1) = sva(1) / scalem
1081 rwork(1) = one / scalem
1083 IF ( sva(1) .NE. zero )
THEN
1085 IF ( ( sva(1) / scalem) .GE. sfmin )
THEN
1096 IF ( errest ) rwork(3) = one
1097 IF ( lsvec .AND. rsvec )
THEN
1113 IF ( rowpiv .OR. l2tran )
THEN
1124 CALL classq( n, a(p,1), lda, xsc, temp1 )
1127 rwork(m+p) = xsc * scalem
1128 rwork(p) = xsc * (scalem*sqrt(temp1))
1129 aatmax = max( aatmax, rwork(p) )
1130 IF (rwork(p) .NE. zero)
1131 $ aatmin = min(aatmin,rwork(p))
1135 rwork(m+p) = scalem*abs( a(p,icamax(n,a(p,1),lda)) )
1136 aatmax = max( aatmax, rwork(m+p) )
1137 aatmin = min( aatmin, rwork(m+p) )
1156 CALL slassq( n, sva, 1, xsc, temp1 )
1161 big1 = ( ( sva(p) / xsc )**2 ) * temp1
1162 IF ( big1 .NE. zero ) entra = entra + big1 * alog(big1)
1164 entra = - entra / alog(real(n))
1174 big1 = ( ( rwork(p) / xsc )**2 ) * temp1
1175 IF ( big1 .NE. zero ) entrat = entrat + big1 * alog(big1)
1177 entrat = - entrat / alog(real(m))
1182 transp = ( entrat .LT. entra )
1189 DO 1115 p = 1, n - 1
1190 a(p,p) = conjg(a(p,p))
1191 DO 1116 q = p + 1, n
1192 ctemp = conjg(a(q,p))
1193 a(q,p) = conjg(a(p,q))
1197 a(n,n) = conjg(a(n,n))
1231 temp1 = sqrt( big / real(n) )
1237 CALL slascl(
'G', 0, 0, aapp, temp1, n, 1, sva, n, ierr )
1238 IF ( aaqq .GT. (aapp * sfmin) )
THEN
1239 aaqq = ( aaqq / aapp ) * temp1
1241 aaqq = ( aaqq * temp1 ) / aapp
1243 temp1 = temp1 * scalem
1244 CALL clascl(
'G', 0, 0, aapp, temp1, m, n, a, lda, ierr )
1268 IF ( ( aaqq.LT.sqrt(sfmin) ) .AND. lsvec .AND. rsvec )
THEN
1273 IF ( aaqq .LT. xsc )
THEN
1275 IF ( sva(p) .LT. xsc )
THEN
1276 CALL claset(
'A', m, 1, czero, czero, a(1,p), lda )
1290 IF ( ( lsvec .AND. rsvec ) .AND. .NOT.( jracc ) )
THEN
1295 DO 1952 p = 1, m - 1
1296 q = isamax( m-p+1, rwork(m+p), 1 ) + p - 1
1298 IF ( p .NE. q )
THEN
1300 rwork(m+p) = rwork(m+q)
1304 CALL claswp( n, a, lda, 1, m-1, iwork(iwoff+1), 1 )
1326 CALL cgeqp3( m, n, a, lda, iwork, cwork, cwork(n+1), lwork-n,
1343 temp1 = sqrt(real(n))*epsln
1345 IF ( abs(a(p,p)) .GE. (temp1*abs(a(1,1))) )
THEN
1352 ELSE IF ( l2rank )
THEN
1358 IF ( ( abs(a(p,p)) .LT. (epsln*abs(a(p-1,p-1))) ) .OR.
1359 $ ( abs(a(p,p)) .LT. small ) .OR.
1360 $ ( l2kill .AND. (abs(a(p,p)) .LT. temp1) ) )
GO TO 3402
1375 IF ( ( abs(a(p,p)) .LT. small ) .OR.
1376 $ ( l2kill .AND. (abs(a(p,p)) .LT. temp1) ) )
GO TO 3302
1384 IF ( nr .EQ. n )
THEN
1387 temp1 = abs(a(p,p)) / sva(iwork(p))
1388 maxprj = min( maxprj, temp1 )
1390 IF ( maxprj**2 .GE. one - real(n)*epsln ) almort = .true.
1399 IF ( n .EQ. nr )
THEN
1402 CALL clacpy(
'U', n, n, a, lda, v, ldv )
1404 temp1 = sva(iwork(p))
1405 CALL csscal( p, one/temp1, v(1,p), 1 )
1408 CALL cpocon(
'U', n, v, ldv, one, temp1,
1409 $ cwork(n+1), rwork, ierr )
1411 CALL cpocon(
'U', n, v, ldv, one, temp1,
1412 $ cwork, rwork, ierr )
1415 ELSE IF ( lsvec )
THEN
1417 CALL clacpy(
'U', n, n, a, lda, u, ldu )
1419 temp1 = sva(iwork(p))
1420 CALL csscal( p, one/temp1, u(1,p), 1 )
1422 CALL cpocon(
'U', n, u, ldu, one, temp1,
1423 $ cwork(n+1), rwork, ierr )
1425 CALL clacpy(
'U', n, n, a, lda, cwork, n )
1430 temp1 = sva(iwork(p))
1432 CALL csscal( p, one/temp1, cwork((p-1)*n+1), 1 )
1437 CALL cpocon(
'U', n, cwork, n, one, temp1,
1438 $ cwork(n*n+1), rwork, ierr )
1441 IF ( temp1 .NE. zero )
THEN
1442 sconda = one / sqrt(temp1)
1453 l2pert = l2pert .AND. ( abs( a(1,1)/a(nr,nr) ) .GT. sqrt(big1) )
1458 IF ( .NOT. ( rsvec .OR. lsvec ) )
THEN
1463 DO 1946 p = 1, min( n-1, nr )
1464 CALL ccopy( n-p, a(p,p+1), lda, a(p+1,p), 1 )
1465 CALL clacgv( n-p+1, a(p,p), 1 )
1467 IF ( nr .EQ. n ) a(n,n) = conjg(a(n,n))
1481 IF ( .NOT. almort )
THEN
1485 xsc = epsln / real(n)
1487 ctemp = cmplx(xsc*abs(a(q,q)),zero)
1489 IF ( ( (p.GT.q) .AND. (abs(a(p,q)).LE.temp1) )
1490 $ .OR. ( p .LT. q ) )
1496 CALL claset(
'U', nr-1,nr-1, czero,czero, a(1,2),lda )
1501 CALL cgeqrf( n,nr, a,lda, cwork, cwork(n+1),lwork-n,
1505 DO 1948 p = 1, nr - 1
1506 CALL ccopy( nr-p, a(p,p+1), lda, a(p+1,p), 1 )
1507 CALL clacgv( nr-p+1, a(p,p), 1 )
1518 xsc = epsln / real(n)
1520 ctemp = cmplx(xsc*abs(a(q,q)),zero)
1522 IF ( ( (p.GT.q) .AND. (abs(a(p,q)).LE.temp1) )
1523 $ .OR. ( p .LT. q ) )
1529 CALL claset(
'U', nr-1, nr-1, czero, czero, a(1,2),
1537 CALL cgesvj(
'L',
'N',
'N', nr, nr, a, lda, sva,
1538 $ n, v, ldv, cwork, lwork, rwork, lrwork, info )
1541 numrank = nint(rwork(2))
1544 ELSE IF ( ( rsvec .AND. ( .NOT. lsvec ) .AND. ( .NOT. jracc ) )
1546 $ ( jracc .AND. ( .NOT. lsvec ) .AND. ( nr .NE. n ) ) )
THEN
1554 CALL ccopy( n-p+1, a(p,p), lda, v(p,p), 1 )
1555 CALL clacgv( n-p+1, v(p,p), 1 )
1557 CALL claset(
'U', nr-1,nr-1, czero, czero, v(1,2), ldv )
1559 CALL cgesvj(
'L',
'U',
'N', n, nr, v, ldv, sva, nr, a, lda,
1560 $ cwork, lwork, rwork, lrwork, info )
1562 numrank = nint(rwork(2))
1569 CALL claset(
'L', nr-1,nr-1, czero, czero, a(2,1), lda )
1570 CALL cgelqf( nr,n, a, lda, cwork, cwork(n+1), lwork-n,
1572 CALL clacpy(
'L', nr, nr, a, lda, v, ldv )
1573 CALL claset(
'U', nr-1,nr-1, czero, czero, v(1,2), ldv )
1574 CALL cgeqrf( nr, nr, v, ldv, cwork(n+1), cwork(2*n+1),
1577 CALL ccopy( nr-p+1, v(p,p), ldv, v(p,p), 1 )
1578 CALL clacgv( nr-p+1, v(p,p), 1 )
1580 CALL claset(
'U', nr-1, nr-1, czero, czero, v(1,2), ldv)
1582 CALL cgesvj(
'L',
'U',
'N', nr, nr, v,ldv, sva, nr, u,
1583 $ ldu, cwork(n+1), lwork-n, rwork, lrwork, info )
1585 numrank = nint(rwork(2))
1586 IF ( nr .LT. n )
THEN
1587 CALL claset(
'A',n-nr, nr, czero,czero, v(nr+1,1),
1589 CALL claset(
'A',nr, n-nr, czero,czero, v(1,nr+1),
1591 CALL claset(
'A',n-nr,n-nr,czero,cone, v(nr+1,nr+1),
1595 CALL cunmlq(
'L',
'C', n, n, nr, a, lda, cwork,
1596 $ v, ldv, cwork(n+1), lwork-n, ierr )
1604 CALL clapmr( .false., n, n, v, ldv, iwork )
1607 CALL clacpy(
'A', n, n, v, ldv, u, ldu )
1610 ELSE IF ( jracc .AND. (.NOT. lsvec) .AND. ( nr.EQ. n ) )
THEN
1612 CALL claset(
'L', n-1,n-1, czero, czero, a(2,1), lda )
1614 CALL cgesvj(
'U',
'N',
'V', n, n, a, lda, sva, n, v, ldv,
1615 $ cwork, lwork, rwork, lrwork, info )
1617 numrank = nint(rwork(2))
1618 CALL clapmr( .false., n, n, v, ldv, iwork )
1620 ELSE IF ( lsvec .AND. ( .NOT. rsvec ) )
THEN
1627 CALL ccopy( n-p+1, a(p,p), lda, u(p,p), 1 )
1628 CALL clacgv( n-p+1, u(p,p), 1 )
1630 CALL claset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
1632 CALL cgeqrf( n, nr, u, ldu, cwork(n+1), cwork(2*n+1),
1635 DO 1967 p = 1, nr - 1
1636 CALL ccopy( nr-p, u(p,p+1), ldu, u(p+1,p), 1 )
1637 CALL clacgv( n-p+1, u(p,p), 1 )
1639 CALL claset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
1641 CALL cgesvj(
'L',
'U',
'N', nr,nr, u, ldu, sva, nr, a,
1642 $ lda, cwork(n+1), lwork-n, rwork, lrwork, info )
1644 numrank = nint(rwork(2))
1646 IF ( nr .LT. m )
THEN
1647 CALL claset(
'A', m-nr, nr,czero, czero, u(nr+1,1),
1649 IF ( nr .LT. n1 )
THEN
1650 CALL claset(
'A',nr, n1-nr, czero, czero, u(1,nr+1),
1652 CALL claset(
'A',m-nr,n1-nr,czero,cone,u(nr+1,nr+1),
1657 CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1658 $ ldu, cwork(n+1), lwork-n, ierr )
1661 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
1664 xsc = one / scnrm2( m, u(1,p), 1 )
1665 CALL csscal( m, xsc, u(1,p), 1 )
1669 CALL clacpy(
'A', n, n, u, ldu, v, ldv )
1676 IF ( .NOT. jracc )
THEN
1678 IF ( .NOT. almort )
THEN
1688 CALL ccopy( n-p+1, a(p,p), lda, v(p,p), 1 )
1689 CALL clacgv( n-p+1, v(p,p), 1 )
1707 ctemp = cmplx(xsc*abs( v(q,q) ),zero)
1709 IF ( ( p .GT. q ) .AND. ( abs(v(p,q)) .LE. temp1 )
1710 $ .OR. ( p .LT. q ) )
1713 IF ( p .LT. q ) v(p,q) = - v(p,q)
1717 CALL claset(
'U', nr-1, nr-1, czero, czero, v(1,2),
1725 CALL clacpy(
'L', nr, nr, v, ldv, cwork(2*n+1), nr )
1727 temp1 = scnrm2(nr-p+1,cwork(2*n+(p-1)*nr+p),1)
1728 CALL csscal(nr-p+1,one/temp1,cwork(2*n+(p-1)*nr+p),1)
1730 CALL cpocon(
'L',nr,cwork(2*n+1),nr,one,temp1,
1731 $ cwork(2*n+nr*nr+1),rwork,ierr)
1732 condr1 = one / sqrt(temp1)
1738 cond_ok = sqrt(sqrt(real(nr)))
1741 IF ( condr1 .LT. cond_ok )
THEN
1746 CALL cgeqrf( n, nr, v, ldv, cwork(n+1), cwork(2*n+1),
1750 xsc = sqrt(small)/epsln
1752 DO 3958 q = 1, p - 1
1753 ctemp=cmplx(xsc*min(abs(v(p,p)),abs(v(q,q))),
1755 IF ( abs(v(q,p)) .LE. temp1 )
1763 $
CALL clacpy(
'A', n, nr, v, ldv, cwork(2*n+1), n )
1767 DO 1969 p = 1, nr - 1
1768 CALL ccopy( nr-p, v(p,p+1), ldv, v(p+1,p), 1 )
1769 CALL clacgv(nr-p+1, v(p,p), 1 )
1771 v(nr,nr)=conjg(v(nr,nr))
1788 CALL cgeqp3( n, nr, v, ldv, iwork(n+1), cwork(n+1),
1789 $ cwork(2*n+1), lwork-2*n, rwork, ierr )
1795 DO 3968 q = 1, p - 1
1796 ctemp=cmplx(xsc*min(abs(v(p,p)),abs(v(q,q))),
1798 IF ( abs(v(q,p)) .LE. temp1 )
1805 CALL clacpy(
'A', n, nr, v, ldv, cwork(2*n+1), n )
1810 DO 8971 q = 1, p - 1
1811 ctemp=cmplx(xsc*min(abs(v(p,p)),abs(v(q,q))),
1818 CALL claset(
'L',nr-1,nr-1,czero,czero,v(2,1),ldv )
1821 CALL cgelqf( nr, nr, v, ldv, cwork(2*n+n*nr+1),
1822 $ cwork(2*n+n*nr+nr+1), lwork-2*n-n*nr-nr, ierr )
1824 CALL clacpy(
'L',nr,nr,v,ldv,cwork(2*n+n*nr+nr+1),nr )
1826 temp1 = scnrm2( p, cwork(2*n+n*nr+nr+p), nr )
1827 CALL csscal( p, one/temp1, cwork(2*n+n*nr+nr+p),
1830 CALL cpocon(
'L',nr,cwork(2*n+n*nr+nr+1),nr,one,temp1,
1831 $ cwork(2*n+n*nr+nr+nr*nr+1),rwork,ierr )
1832 condr2 = one / sqrt(temp1)
1835 IF ( condr2 .GE. cond_ok )
THEN
1840 CALL clacpy(
'U', nr, nr, v, ldv, cwork(2*n+1), n )
1850 ctemp = xsc * v(q,q)
1851 DO 4969 p = 1, q - 1
1857 CALL claset(
'U', nr-1,nr-1, czero,czero, v(1,2),
1867 IF ( condr1 .LT. cond_ok )
THEN
1869 CALL cgesvj(
'L',
'U',
'N',nr,nr,v,ldv,sva,nr,u, ldu,
1870 $ cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,rwork,
1873 numrank = nint(rwork(2))
1875 CALL ccopy( nr, v(1,p), 1, u(1,p), 1 )
1876 CALL csscal( nr, sva(p), v(1,p), 1 )
1881 IF ( nr .EQ. n )
THEN
1886 CALL ctrsm(
'L',
'U',
'N',
'N', nr,nr,cone, a,lda, v,
1893 CALL ctrsm(
'L',
'U',
'C',
'N',nr,nr,cone,cwork(2*n+1),
1895 IF ( nr .LT. n )
THEN
1896 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1897 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1898 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),
1901 CALL cunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,
1903 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr)
1906 ELSE IF ( condr2 .LT. cond_ok )
THEN
1912 CALL cgesvj(
'L',
'U',
'N', nr, nr, v, ldv, sva, nr,
1914 $ ldu, cwork(2*n+n*nr+nr+1), lwork-2*n-n*nr-nr,
1915 $ rwork, lrwork, info )
1917 numrank = nint(rwork(2))
1919 CALL ccopy( nr, v(1,p), 1, u(1,p), 1 )
1920 CALL csscal( nr, sva(p), u(1,p), 1 )
1922 CALL ctrsm(
'L',
'U',
'N',
'N',nr,nr,cone,cwork(2*n+1),n,
1927 cwork(2*n+n*nr+nr+iwork(n+p)) = u(p,q)
1930 u(p,q) = cwork(2*n+n*nr+nr+p)
1933 IF ( nr .LT. n )
THEN
1934 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),
1936 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),
1938 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),
1941 CALL cunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
1942 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
1955 CALL cgesvj(
'L',
'U',
'V', nr, nr, v, ldv, sva, nr,
1957 $ ldu, cwork(2*n+n*nr+nr+1), lwork-2*n-n*nr-nr,
1958 $ rwork, lrwork, info )
1960 numrank = nint(rwork(2))
1961 IF ( nr .LT. n )
THEN
1962 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),
1964 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),
1966 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),
1969 CALL cunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
1970 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
1972 CALL cunmlq(
'L',
'C', nr, nr, nr, cwork(2*n+1), n,
1973 $ cwork(2*n+n*nr+1), u, ldu, cwork(2*n+n*nr+nr+1),
1974 $ lwork-2*n-n*nr-nr, ierr )
1977 cwork(2*n+n*nr+nr+iwork(n+p)) = u(p,q)
1980 u(p,q) = cwork(2*n+n*nr+nr+p)
1990 temp1 = sqrt(real(n)) * epsln
1993 cwork(2*n+n*nr+nr+iwork(p)) = v(p,q)
1996 v(p,q) = cwork(2*n+n*nr+nr+p)
1998 xsc = one / scnrm2( n, v(1,q), 1 )
1999 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2000 $
CALL csscal( n, xsc, v(1,q), 1 )
2004 IF ( nr .LT. m )
THEN
2005 CALL claset(
'A', m-nr, nr, czero, czero, u(nr+1,1),
2007 IF ( nr .LT. n1 )
THEN
2008 CALL claset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
2009 CALL claset(
'A',m-nr,n1-nr,czero,cone,
2017 CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2018 $ ldu, cwork(n+1), lwork-n, ierr )
2021 temp1 = sqrt(real(m)) * epsln
2023 xsc = one / scnrm2( m, u(1,p), 1 )
2024 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2025 $
CALL csscal( m, xsc, u(1,p), 1 )
2032 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2039 CALL clacpy(
'U', n, n, a, lda, cwork(n+1), n )
2043 ctemp = xsc * cwork( n + (p-1)*n + p )
2044 DO 5971 q = 1, p - 1
2047 cwork(n+(q-1)*n+p)=-ctemp
2051 CALL claset(
'L',n-1,n-1,czero,czero,cwork(n+2),n )
2054 CALL cgesvj(
'U',
'U',
'N', n, n, cwork(n+1), n, sva,
2055 $ n, u, ldu, cwork(n+n*n+1), lwork-n-n*n, rwork, lrwork,
2059 numrank = nint(rwork(2))
2061 CALL ccopy( n, cwork(n+(p-1)*n+1), 1, u(1,p), 1 )
2062 CALL csscal( n, sva(p), cwork(n+(p-1)*n+1), 1 )
2065 CALL ctrsm(
'L',
'U',
'N',
'N', n, n,
2066 $ cone, a, lda, cwork(n+1), n )
2068 CALL ccopy( n, cwork(n+p), n, v(iwork(p),1), ldv )
2070 temp1 = sqrt(real(n))*epsln
2072 xsc = one / scnrm2( n, v(1,p), 1 )
2073 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2074 $
CALL csscal( n, xsc, v(1,p), 1 )
2079 IF ( n .LT. m )
THEN
2080 CALL claset(
'A', m-n, n, czero, czero, u(n+1,1),
2082 IF ( n .LT. n1 )
THEN
2083 CALL claset(
'A',n, n1-n, czero, czero, u(1,n+1),
2085 CALL claset(
'A',m-n,n1-n, czero, cone,u(n+1,n+1),
2089 CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2090 $ ldu, cwork(n+1), lwork-n, ierr )
2091 temp1 = sqrt(real(m))*epsln
2093 xsc = one / scnrm2( m, u(1,p), 1 )
2094 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2095 $
CALL csscal( m, xsc, u(1,p), 1 )
2099 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2119 CALL ccopy( n-p+1, a(p,p), lda, v(p,p), 1 )
2120 CALL clacgv( n-p+1, v(p,p), 1 )
2124 xsc = sqrt(small/epsln)
2126 ctemp = cmplx(xsc*abs( v(q,q) ),zero)
2128 IF ( ( p .GT. q ) .AND. ( abs(v(p,q)) .LE. temp1 )
2129 $ .OR. ( p .LT. q ) )
2132 IF ( p .LT. q ) v(p,q) = - v(p,q)
2136 CALL claset(
'U', nr-1, nr-1, czero, czero, v(1,2), ldv )
2139 CALL cgeqrf( n, nr, v, ldv, cwork(n+1), cwork(2*n+1),
2141 CALL clacpy(
'L', n, nr, v, ldv, cwork(2*n+1), n )
2144 CALL ccopy( nr-p+1, v(p,p), ldv, u(p,p), 1 )
2145 CALL clacgv( nr-p+1, u(p,p), 1 )
2149 xsc = sqrt(small/epsln)
2151 DO 9971 p = 1, q - 1
2152 ctemp = cmplx(xsc * min(abs(u(p,p)),abs(u(q,q))),
2159 CALL claset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
2162 CALL cgesvj(
'L',
'U',
'V', nr, nr, u, ldu, sva,
2163 $ n, v, ldv, cwork(2*n+n*nr+1), lwork-2*n-n*nr,
2164 $ rwork, lrwork, info )
2166 numrank = nint(rwork(2))
2168 IF ( nr .LT. n )
THEN
2169 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv )
2170 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv )
2171 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv )
2174 CALL cunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
2175 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
2181 temp1 = sqrt(real(n)) * epsln
2184 cwork(2*n+n*nr+nr+iwork(p)) = v(p,q)
2187 v(p,q) = cwork(2*n+n*nr+nr+p)
2189 xsc = one / scnrm2( n, v(1,q), 1 )
2190 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2191 $
CALL csscal( n, xsc, v(1,q), 1 )
2197 IF ( nr .LT. m )
THEN
2198 CALL claset(
'A', m-nr, nr, czero, czero, u(nr+1,1),
2200 IF ( nr .LT. n1 )
THEN
2201 CALL claset(
'A',nr, n1-nr, czero, czero, u(1,nr+1),
2203 CALL claset(
'A',m-nr,n1-nr, czero, cone,u(nr+1,nr+1),
2208 CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2209 $ ldu, cwork(n+1), lwork-n, ierr )
2212 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2219 CALL cswap( n, u(1,p), 1, v(1,p), 1 )
2228 IF ( uscal2 .LE. (big/sva(1))*uscal1 )
THEN
2229 CALL slascl(
'G', 0, 0, uscal1, uscal2, nr, 1, sva, n,
2235 IF ( nr .LT. n )
THEN
2241 rwork(1) = uscal2 * scalem
2243 IF ( errest ) rwork(3) = sconda
2244 IF ( lsvec .AND. rsvec )
THEN