565 SUBROUTINE cgejsv( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
566 $ M, N, A, LDA, SVA, U, LDU, V, LDV,
567 $ CWORK, LWORK, RWORK, LRWORK, IWORK, INFO )
575 INTEGER INFO, LDA, LDU, LDV, LWORK, LRWORK, M, N
578 COMPLEX A( LDA, * ), U( LDU, * ), V( LDV, * ), CWORK( LWORK )
579 REAL SVA( N ), RWORK( LRWORK )
581 CHARACTER*1 JOBA, JOBP, JOBR, JOBT, JOBU, JOBV
588 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
590 parameter( czero = ( 0.0e0, 0.0e0 ), cone = ( 1.0e0, 0.0e0 ) )
594 REAL AAPP, AAQQ, AATMAX, AATMIN, BIG, BIG1, COND_OK,
595 $ condr1, condr2, entra, entrat, epsln, maxprj, scalem,
596 $ sconda, sfmin, small, temp1, uscal1, uscal2, xsc
597 INTEGER IERR, N1, NR, NUMRANK, p, q, WARNING
598 LOGICAL ALMORT, DEFR, ERREST, GOSCAL, JRACC, KILL, LQUERY,
599 $ lsvec, l2aber, l2kill, l2pert, l2rank, l2tran, noscal,
600 $ rowpiv, rsvec, transp
602 INTEGER OPTWRK, MINWRK, MINRWRK, MINIWRK
603 INTEGER LWCON, LWLQF, LWQP3, LWQRF, LWUNMLQ, LWUNMQR, LWUNMQRM,
604 $ lwsvdj, lwsvdjv, lrwqp3, lrwcon, lrwsvdj, iwoff
605 INTEGER LWRK_CGELQF, LWRK_CGEQP3, LWRK_CGEQP3N, LWRK_CGEQRF,
606 $ LWRK_CGESVJ, LWRK_CGESVJV, LWRK_CGESVJU, LWRK_CUNMLQ,
607 $ lwrk_cunmqr, lwrk_cunmqrm
614 INTRINSIC abs,
cmplx, conjg, alog,
max,
min, real, nint, sqrt
618 INTEGER ISAMAX, ICAMAX
620 EXTERNAL isamax, icamax, lsame, slamch, scnrm2
633 lsvec = lsame( jobu,
'U' ) .OR. lsame( jobu,
'F' )
634 jracc = lsame( jobv,
'J' )
635 rsvec = lsame( jobv,
'V' ) .OR. jracc
636 rowpiv = lsame( joba,
'F' ) .OR. lsame( joba,
'G' )
637 l2rank = lsame( joba,
'R' )
638 l2aber = lsame( joba,
'A' )
639 errest = lsame( joba,
'E' ) .OR. lsame( joba,
'G' )
640 l2tran = lsame( jobt,
'T' ) .AND. ( m .EQ. n )
641 l2kill = lsame( jobr,
'R' )
642 defr = lsame( jobr,
'N' )
643 l2pert = lsame( jobp,
'P' )
645 lquery = ( lwork .EQ. -1 ) .OR. ( lrwork .EQ. -1 )
647 IF ( .NOT.(rowpiv .OR. l2rank .OR. l2aber .OR.
648 $ errest .OR. lsame( joba,
'C' ) ))
THEN
650 ELSE IF ( .NOT.( lsvec .OR. lsame( jobu,
'N' ) .OR.
651 $ ( lsame( jobu,
'W' ) .AND. rsvec .AND. l2tran ) ) )
THEN
653 ELSE IF ( .NOT.( rsvec .OR. lsame( jobv,
'N' ) .OR.
654 $ ( lsame( jobv,
'W' ) .AND. lsvec .AND. l2tran ) ) )
THEN
656 ELSE IF ( .NOT. ( l2kill .OR. defr ) )
THEN
658 ELSE IF ( .NOT. ( lsame(jobt,
'T') .OR. lsame(jobt,
'N') ) )
THEN
660 ELSE IF ( .NOT. ( l2pert .OR. lsame( jobp,
'N' ) ) )
THEN
662 ELSE IF ( m .LT. 0 )
THEN
664 ELSE IF ( ( n .LT. 0 ) .OR. ( n .GT. m ) )
THEN
666 ELSE IF ( lda .LT. m )
THEN
668 ELSE IF ( lsvec .AND. ( ldu .LT. m ) )
THEN
670 ELSE IF ( rsvec .AND. ( ldv .LT. n ) )
THEN
677 IF ( info .EQ. 0 )
THEN
691 lwunmlq =
max( 1, n )
692 lwunmqr =
max( 1, n )
693 lwunmqrm =
max( 1, m )
698 lwsvdj =
max( 2 * n, 1 )
699 lwsvdjv =
max( 2 * n, 1 )
705 CALL cgeqp3( m, n, a, lda, iwork, cdummy, cdummy, -1,
707 lwrk_cgeqp3 = real( cdummy(1) )
708 CALL cgeqrf( n, n, a, lda, cdummy, cdummy,-1, ierr )
709 lwrk_cgeqrf = real( cdummy(1) )
710 CALL cgelqf( n, n, a, lda, cdummy, cdummy,-1, ierr )
711 lwrk_cgelqf = real( cdummy(1) )
716 IF ( .NOT. (lsvec .OR. rsvec ) )
THEN
720 minwrk =
max( n+lwqp3, n**2+lwcon, n+lwqrf, lwsvdj )
722 minwrk =
max( n+lwqp3, n+lwqrf, lwsvdj )
725 CALL cgesvj(
'L',
'N',
'N', n, n, a, lda, sva, n, v,
726 $ ldv, cdummy, -1, rdummy, -1, ierr )
727 lwrk_cgesvj = real( 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 = REAL( CDUMMY(1) )
764 CALL CUNMLQ( 'l
', 'c
', N, N, N, A, LDA, CDUMMY,
765 $ V, LDV, CDUMMY, -1, IERR )
766 LWRK_CUNMLQ = REAL( 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.OR.
IF ( L2TRAN 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.OR.
IF ( ROWPIV L2TRAN ) MINIWRK = MINIWRK + M
791.AND..NOT.
ELSE IF ( LSVEC (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 = REAL( CDUMMY(1) )
803 CALL CUNMQR( 'l
', 'n
', M, N, N, A, LDA, CDUMMY, U,
804 $ LDU, CDUMMY, -1, IERR )
805 LWRK_CUNMQRM = REAL( 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.OR.
IF ( L2TRAN 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.OR.
IF ( ROWPIV L2TRAN ) MINIWRK = MINIWRK + M
831.NOT.
IF ( 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.OR.
IF ( ROWPIV 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.OR.
IF ( ROWPIV L2TRAN ) MINIWRK = MINIWRK + M
862 CALL CUNMQR( 'l
', 'n
', M, N, N, A, LDA, CDUMMY, U,
863 $ LDU, CDUMMY, -1, IERR )
864 LWRK_CUNMQRM = REAL( CDUMMY(1) )
865 CALL CUNMQR( 'l
', 'n
', N, N, N, A, LDA, CDUMMY, U,
866 $ LDU, CDUMMY, -1, IERR )
867 LWRK_CUNMQR = REAL( CDUMMY(1) )
868.NOT.
IF ( JRACC ) THEN
869 CALL CGEQP3( N,N, A, LDA, IWORK, CDUMMY,CDUMMY, -1,
871 LWRK_CGEQP3N = REAL( CDUMMY(1) )
872 CALL CGESVJ( 'l
', 'u
', 'n
', N, N, U, LDU, SVA,
873 $ N, V, LDV, CDUMMY, -1, RDUMMY, -1, IERR )
874 LWRK_CGESVJ = REAL( CDUMMY(1) )
875 CALL CGESVJ( 'u
', 'u
', 'n
', N, N, U, LDU, SVA,
876 $ N, V, LDV, CDUMMY, -1, RDUMMY, -1, IERR )
877 LWRK_CGESVJU = REAL( CDUMMY(1) )
878 CALL CGESVJ( 'l
', 'u
', 'v
', N, N, U, LDU, SVA,
879 $ N, V, LDV, CDUMMY, -1, RDUMMY, -1, IERR )
880 LWRK_CGESVJV = REAL( CDUMMY(1) )
881 CALL CUNMLQ( 'l
', 'c
', N, N, N, A, LDA, CDUMMY,
882 $ V, LDV, CDUMMY, -1, IERR )
883 LWRK_CUNMLQ = REAL( CDUMMY(1) )
885 OPTWRK = MAX( N+LWRK_CGEQP3, N+LWCON,
886 $ 2*N+N**2+LWCON, 2*N+LWRK_CGEQRF,
888 $ 2*N+N**2+N+LWRK_CGELQF,
889 $ 2*N+N**2+N+N**2+LWCON,
890 $ 2*N+N**2+N+LWRK_CGESVJ,
891 $ 2*N+N**2+N+LWRK_CGESVJV,
892 $ 2*N+N**2+N+LWRK_CUNMQR,
893 $ 2*N+N**2+N+LWRK_CUNMLQ,
894 $ N+N**2+LWRK_CGESVJU,
897 OPTWRK = MAX( N+LWRK_CGEQP3,
898 $ 2*N+N**2+LWCON, 2*N+LWRK_CGEQRF,
900 $ 2*N+N**2+N+LWRK_CGELQF,
901 $ 2*N+N**2+N+N**2+LWCON,
902 $ 2*N+N**2+N+LWRK_CGESVJ,
903 $ 2*N+N**2+N+LWRK_CGESVJV,
904 $ 2*N+N**2+N+LWRK_CUNMQR,
905 $ 2*N+N**2+N+LWRK_CUNMLQ,
906 $ N+N**2+LWRK_CGESVJU,
910 CALL CGESVJ( 'l
', 'u
', 'v
', N, N, U, LDU, SVA,
911 $ N, V, LDV, CDUMMY, -1, RDUMMY, -1, IERR )
912 LWRK_CGESVJV = REAL( CDUMMY(1) )
913 CALL CUNMQR( 'l
', 'n
', N, N, N, CDUMMY, N, CDUMMY,
914 $ V, LDV, CDUMMY, -1, IERR )
915 LWRK_CUNMQR = REAL( CDUMMY(1) )
916 CALL CUNMQR( 'l
', 'n
', M, N, N, A, LDA, CDUMMY, U,
917 $ LDU, CDUMMY, -1, IERR )
918 LWRK_CUNMQRM = REAL( CDUMMY(1) )
920 OPTWRK = MAX( N+LWRK_CGEQP3, N+LWCON,
921 $ 2*N+LWRK_CGEQRF, 2*N+N**2,
922 $ 2*N+N**2+LWRK_CGESVJV,
923 $ 2*N+N**2+N+LWRK_CUNMQR,N+LWRK_CUNMQRM )
925 OPTWRK = MAX( N+LWRK_CGEQP3, 2*N+LWRK_CGEQRF,
926 $ 2*N+N**2, 2*N+N**2+LWRK_CGESVJV,
927 $ 2*N+N**2+N+LWRK_CUNMQR,
932.OR.
IF ( L2TRAN ROWPIV ) THEN
933 MINRWRK = MAX( 7, 2*M, LRWQP3, LRWSVDJ, LRWCON )
935 MINRWRK = MAX( 7, LRWQP3, LRWSVDJ, LRWCON )
938 MINWRK = MAX( 2, MINWRK )
939 OPTWRK = MAX( OPTWRK, MINWRK )
940.LT..AND..NOT.
IF ( LWORK MINWRK (LQUERY) ) INFO = - 17
941.LT..AND..NOT.
IF ( LRWORK MINRWRK (LQUERY) ) INFO = - 19
944.NE.
IF ( INFO 0 ) THEN
946 CALL XERBLA( 'cgejsv', - INFO )
948 ELSE IF ( LQUERY ) THEN
952 IWORK(1) = MAX( 4, MINIWRK )
958.EQ..OR..EQ.
IF ( ( M 0 ) ( N 0 ) ) THEN
968 IF ( LSAME( JOBU, 'f
' ) ) N1 = M
975 EPSLN = SLAMCH('epsilon
')
976 SFMIN = SLAMCH('safeminimum
')
977 SMALL = SFMIN / EPSLN
987 SCALEM = ONE / SQRT(REAL(M)*REAL(N))
993 CALL CLASSQ( M, A(1,p), 1, AAPP, AAQQ )
994.GT.
IF ( AAPP BIG ) THEN
996 CALL XERBLA( 'cgejsv', -INFO )
1000.LT..AND.
IF ( ( AAPP (BIG / AAQQ) ) NOSCAL ) THEN
1001 SVA(p) = AAPP * AAQQ
1004 SVA(p) = AAPP * ( AAQQ * SCALEM )
1007 CALL SSCAL( p-1, SCALEM, SVA, 1 )
1012 IF ( NOSCAL ) SCALEM = ONE
1017 AAPP = MAX( AAPP, SVA(p) )
1018.NE.
IF ( SVA(p) ZERO ) AAQQ = MIN( AAQQ, SVA(p) )
1023.EQ.
IF ( AAPP ZERO ) THEN
1024 IF ( LSVEC ) CALL CLASET( 'g
', M, N1, CZERO, CONE, U, LDU )
1025 IF ( RSVEC ) CALL CLASET( 'g
', N, N, CZERO, CONE, V, LDV )
1028 IF ( ERREST ) RWORK(3) = ONE
1029.AND.
IF ( LSVEC RSVEC ) THEN
1049.LE.
IF ( AAQQ SFMIN ) THEN
1060 CALL CLASCL( 'g
',0,0,SVA(1),SCALEM, M,1,A(1,1),LDA,IERR )
1061 CALL CLACPY( 'a
', M, 1, A, LDA, U, LDU )
1063.NE.
IF ( N1 N ) THEN
1064 CALL CGEQRF( M, N, U,LDU, CWORK, CWORK(N+1),LWORK-N,IERR )
1065 CALL CUNGQR( M,N1,1, U,LDU,CWORK,CWORK(N+1),LWORK-N,IERR )
1066 CALL CCOPY( M, A(1,1), 1, U(1,1), 1 )
1072.LT.
IF ( SVA(1) (BIG*SCALEM) ) THEN
1073 SVA(1) = SVA(1) / SCALEM
1076 RWORK(1) = ONE / SCALEM
1078.NE.
IF ( SVA(1) ZERO ) THEN
1080.GE.
IF ( ( SVA(1) / SCALEM) SFMIN ) THEN
1091 IF ( ERREST ) RWORK(3) = ONE
1092.AND.
IF ( LSVEC RSVEC ) THEN
1108.OR.
IF ( ROWPIV L2TRAN ) THEN
1119 CALL CLASSQ( N, A(p,1), LDA, XSC, TEMP1 )
1122 RWORK(M+p) = XSC * SCALEM
1123 RWORK(p) = XSC * (SCALEM*SQRT(TEMP1))
1124 AATMAX = MAX( AATMAX, RWORK(p) )
1125.NE.
IF (RWORK(p) ZERO)
1126 $ AATMIN = MIN(AATMIN,RWORK(p))
1130 RWORK(M+p) = SCALEM*ABS( A(p,ICAMAX(N,A(p,1),LDA)) )
1131 AATMAX = MAX( AATMAX, RWORK(M+p) )
1132 AATMIN = MIN( AATMIN, RWORK(M+p) )
1151 CALL SLASSQ( N, SVA, 1, XSC, TEMP1 )
1156 BIG1 = ( ( SVA(p) / XSC )**2 ) * TEMP1
1157.NE.
IF ( BIG1 ZERO ) ENTRA = ENTRA + BIG1 * ALOG(BIG1)
1159 ENTRA = - ENTRA / ALOG(REAL(N))
1169 BIG1 = ( ( RWORK(p) / XSC )**2 ) * TEMP1
1170.NE.
IF ( BIG1 ZERO ) ENTRAT = ENTRAT + BIG1 * ALOG(BIG1)
1172 ENTRAT = - ENTRAT / ALOG(REAL(M))
1177.LT.
TRANSP = ( ENTRAT ENTRA )
1184 DO 1115 p = 1, N - 1
1185 A(p,p) = CONJG(A(p,p))
1186 DO 1116 q = p + 1, N
1187 CTEMP = CONJG(A(q,p))
1188 A(q,p) = CONJG(A(p,q))
1192 A(N,N) = CONJG(A(N,N))
1226 TEMP1 = SQRT( BIG / REAL(N) )
1232 CALL SLASCL( 'g
', 0, 0, AAPP, TEMP1, N, 1, SVA, N, IERR )
1233.GT.
IF ( AAQQ (AAPP * SFMIN) ) THEN
1234 AAQQ = ( AAQQ / AAPP ) * TEMP1
1236 AAQQ = ( AAQQ * TEMP1 ) / AAPP
1238 TEMP1 = TEMP1 * SCALEM
1239 CALL CLASCL( 'g
', 0, 0, AAPP, TEMP1, M, N, A, LDA, IERR )
1263.LT..AND..AND.
IF ( ( AAQQSQRT(SFMIN) ) LSVEC RSVEC ) THEN
1268.LT.
IF ( AAQQ XSC ) THEN
1270.LT.
IF ( SVA(p) XSC ) THEN
1271 CALL CLASET( 'a
', M, 1, CZERO, CZERO, A(1,p), LDA )
1285.AND..AND..NOT.
IF ( ( LSVEC RSVEC ) ( JRACC ) ) THEN
1290 DO 1952 p = 1, M - 1
1291 q = ISAMAX( M-p+1, RWORK(M+p), 1 ) + p - 1
1295 RWORK(M+p) = RWORK(M+q)
1299 CALL CLASWP( N, A, LDA, 1, M-1, IWORK(IWOFF+1), 1 )
1321 CALL CGEQP3( M, N, A, LDA, IWORK, CWORK, CWORK(N+1), LWORK-N,
1338 TEMP1 = SQRT(REAL(N))*EPSLN
1340.GE.
IF ( ABS(A(p,p)) (TEMP1*ABS(A(1,1))) ) THEN
1347 ELSE IF ( L2RANK ) THEN
1353.LT..OR.
IF ( ( ABS(A(p,p)) (EPSLN*ABS(A(p-1,p-1))) )
1354.LT..OR.
$ ( ABS(A(p,p)) SMALL )
1355.AND..LT.
$ ( L2KILL (ABS(A(p,p)) TEMP1) ) ) GO TO 3402
1370.LT..OR.
IF ( ( ABS(A(p,p)) SMALL )
1371.AND..LT.
$ ( L2KILL (ABS(A(p,p)) TEMP1) ) ) GO TO 3302
1379.EQ.
IF ( NR N ) THEN
1382 TEMP1 = ABS(A(p,p)) / SVA(IWORK(p))
1383 MAXPRJ = MIN( MAXPRJ, TEMP1 )
1385.GE.
IF ( MAXPRJ**2 ONE - REAL(N)*EPSLN ) ALMORT = .TRUE.
1394.EQ.
IF ( N NR ) THEN
1397 CALL CLACPY( 'u
', N, N, A, LDA, V, LDV )
1399 TEMP1 = SVA(IWORK(p))
1400 CALL CSSCAL( p, ONE/TEMP1, V(1,p), 1 )
1403 CALL CPOCON( 'u
', N, V, LDV, ONE, TEMP1,
1404 $ CWORK(N+1), RWORK, IERR )
1406 CALL CPOCON( 'u
', N, V, LDV, ONE, TEMP1,
1407 $ CWORK, RWORK, IERR )
1410 ELSE IF ( LSVEC ) THEN
1412 CALL CLACPY( 'u
', N, N, A, LDA, U, LDU )
1414 TEMP1 = SVA(IWORK(p))
1415 CALL CSSCAL( p, ONE/TEMP1, U(1,p), 1 )
1417 CALL CPOCON( 'u
', N, U, LDU, ONE, TEMP1,
1418 $ CWORK(N+1), RWORK, IERR )
1420 CALL CLACPY( 'u
', N, N, A, LDA, CWORK, N )
1425 TEMP1 = SVA(IWORK(p))
1427 CALL CSSCAL( p, ONE/TEMP1, CWORK((p-1)*N+1), 1 )
1432 CALL CPOCON( 'u
', N, CWORK, N, ONE, TEMP1,
1433 $ CWORK(N*N+1), RWORK, IERR )
1436.NE.
IF ( TEMP1 ZERO ) THEN
1437 SCONDA = ONE / SQRT(TEMP1)
1448.AND..GT.
L2PERT = L2PERT ( ABS( A(1,1)/A(NR,NR) ) SQRT(BIG1) )
1453.NOT..OR.
IF ( ( RSVEC LSVEC ) ) THEN
1458 DO 1946 p = 1, MIN( N-1, NR )
1459 CALL CCOPY( N-p, A(p,p+1), LDA, A(p+1,p), 1 )
1460 CALL CLACGV( N-p+1, A(p,p), 1 )
1462.EQ.
IF ( NR N ) A(N,N) = CONJG(A(N,N))
1476.NOT.
IF ( ALMORT ) THEN
1480 XSC = EPSLN / REAL(N)
1482 CTEMP = CMPLX(XSC*ABS(A(q,q)),ZERO)
1484.GT..AND..LE.
IF ( ( (pq) (ABS(A(p,q))TEMP1) )
1491 CALL CLASET( 'u
', NR-1,NR-1, CZERO,CZERO, A(1,2),LDA )
1496 CALL CGEQRF( N,NR, A,LDA, CWORK, CWORK(N+1),LWORK-N, IERR )
1499 DO 1948 p = 1, NR - 1
1500 CALL CCOPY( NR-p, A(p,p+1), LDA, A(p+1,p), 1 )
1501 CALL CLACGV( NR-p+1, A(p,p), 1 )
1512 XSC = EPSLN / REAL(N)
1514 CTEMP = CMPLX(XSC*ABS(A(q,q)),ZERO)
1516.GT..AND..LE.
IF ( ( (pq) (ABS(A(p,q))TEMP1) )
1523 CALL CLASET( 'u
', NR-1, NR-1, CZERO, CZERO, A(1,2), LDA )
1530 CALL CGESVJ( 'l
', 'n
', 'n
', NR, NR, A, LDA, SVA,
1531 $ N, V, LDV, CWORK, LWORK, RWORK, LRWORK, INFO )
1534 NUMRANK = NINT(RWORK(2))
1537.AND..NOT..AND..NOT.
ELSE IF ( ( RSVEC ( LSVEC ) ( JRACC ) )
1539.AND..NOT..AND..NE.
$ ( JRACC ( LSVEC ) ( NR N ) ) ) THEN
1547 CALL CCOPY( N-p+1, A(p,p), LDA, V(p,p), 1 )
1548 CALL CLACGV( N-p+1, V(p,p), 1 )
1550 CALL CLASET( 'u
', NR-1,NR-1, CZERO, CZERO, V(1,2), LDV )
1552 CALL CGESVJ( 'l
','u
','n
', N, NR, V, LDV, SVA, NR, A, LDA,
1553 $ CWORK, LWORK, RWORK, LRWORK, INFO )
1555 NUMRANK = NINT(RWORK(2))
1562 CALL CLASET( 'l
', NR-1,NR-1, CZERO, CZERO, A(2,1), LDA )
1563 CALL CGELQF( NR,N, A, LDA, CWORK, CWORK(N+1), LWORK-N, IERR)
1564 CALL CLACPY( 'l
', NR, NR, A, LDA, V, LDV )
1565 CALL CLASET( 'u
', NR-1,NR-1, CZERO, CZERO, V(1,2), LDV )
1566 CALL CGEQRF( NR, NR, V, LDV, CWORK(N+1), CWORK(2*N+1),
1569 CALL CCOPY( NR-p+1, V(p,p), LDV, V(p,p), 1 )
1570 CALL CLACGV( NR-p+1, V(p,p), 1 )
1572 CALL CLASET('u
', NR-1, NR-1, CZERO, CZERO, V(1,2), LDV)
1574 CALL CGESVJ( 'l
', 'u
','n
', NR, NR, V,LDV, SVA, NR, U,
1575 $ LDU, CWORK(N+1), LWORK-N, RWORK, LRWORK, INFO )
1577 NUMRANK = NINT(RWORK(2))
1578.LT.
IF ( NR N ) THEN
1579 CALL CLASET( 'a
',N-NR, NR, CZERO,CZERO, V(NR+1,1), LDV )
1580 CALL CLASET( 'a
',NR, N-NR, CZERO,CZERO, V(1,NR+1), LDV )
1581 CALL CLASET( 'a
',N-NR,N-NR,CZERO,CONE, V(NR+1,NR+1),LDV )
1584 CALL CUNMLQ( 'l
', 'c
', N, N, NR, A, LDA, CWORK,
1585 $ V, LDV, CWORK(N+1), LWORK-N, IERR )
1593 CALL CLAPMR( .FALSE., N, N, V, LDV, IWORK )
1596 CALL CLACPY( 'a
', N, N, V, LDV, U, LDU )
1599.AND..NOT..AND..EQ.
ELSE IF ( JRACC ( LSVEC) ( NR N ) ) THEN
1601 CALL CLASET( 'l
', N-1,N-1, CZERO, CZERO, A(2,1), LDA )
1603 CALL CGESVJ( 'u
','n
','v
', N, N, A, LDA, SVA, N, V, LDV,
1604 $ CWORK, LWORK, RWORK, LRWORK, INFO )
1606 NUMRANK = NINT(RWORK(2))
1607 CALL CLAPMR( .FALSE., N, N, V, LDV, IWORK )
1609.AND..NOT.
ELSE IF ( LSVEC ( RSVEC ) ) THEN
1616 CALL CCOPY( N-p+1, A(p,p), LDA, U(p,p), 1 )
1617 CALL CLACGV( N-p+1, U(p,p), 1 )
1619 CALL CLASET( 'u
', NR-1, NR-1, CZERO, CZERO, U(1,2), LDU )
1621 CALL CGEQRF( N, NR, U, LDU, CWORK(N+1), CWORK(2*N+1),
1624 DO 1967 p = 1, NR - 1
1625 CALL CCOPY( NR-p, U(p,p+1), LDU, U(p+1,p), 1 )
1626 CALL CLACGV( N-p+1, U(p,p), 1 )
1628 CALL CLASET( 'u
', NR-1, NR-1, CZERO, CZERO, U(1,2), LDU )
1630 CALL CGESVJ( 'l
', 'u
', 'n
', NR,NR, U, LDU, SVA, NR, A,
1631 $ LDA, CWORK(N+1), LWORK-N, RWORK, LRWORK, INFO )
1633 NUMRANK = NINT(RWORK(2))
1635.LT.
IF ( NR M ) THEN
1636 CALL CLASET( 'a
', M-NR, NR,CZERO, CZERO, U(NR+1,1), LDU )
1637.LT.
IF ( NR N1 ) THEN
1638 CALL CLASET( 'a
',NR, N1-NR, CZERO, CZERO, U(1,NR+1),LDU )
1639 CALL CLASET( 'a
',M-NR,N1-NR,CZERO,CONE,U(NR+1,NR+1),LDU )
1643 CALL CUNMQR( 'l
', 'n
', M, N1, N, A, LDA, CWORK, U,
1644 $ LDU, CWORK(N+1), LWORK-N, IERR )
1647 $ CALL CLASWP( N1, U, LDU, 1, M-1, IWORK(IWOFF+1), -1 )
1650 XSC = ONE / SCNRM2( M, U(1,p), 1 )
1651 CALL CSSCAL( M, XSC, U(1,p), 1 )
1655 CALL CLACPY( 'a
', N, N, U, LDU, V, LDV )
1662.NOT.
IF ( JRACC ) THEN
1664.NOT.
IF ( ALMORT ) THEN
1674 CALL CCOPY( N-p+1, A(p,p), LDA, V(p,p), 1 )
1675 CALL CLACGV( N-p+1, V(p,p), 1 )
1693 CTEMP = CMPLX(XSC*ABS( V(q,q) ),ZERO)
1695.GT..AND..LE.
IF ( ( p q ) ( ABS(V(p,q)) TEMP1 )
1699.LT.
IF ( p q ) V(p,q) = - V(p,q)
1703 CALL CLASET( 'u
', NR-1, NR-1, CZERO, CZERO, V(1,2), LDV )
1710 CALL CLACPY( 'l
', NR, NR, V, LDV, CWORK(2*N+1), NR )
1712 TEMP1 = SCNRM2(NR-p+1,CWORK(2*N+(p-1)*NR+p),1)
1713 CALL CSSCAL(NR-p+1,ONE/TEMP1,CWORK(2*N+(p-1)*NR+p),1)
1715 CALL CPOCON('l
',NR,CWORK(2*N+1),NR,ONE,TEMP1,
1716 $ CWORK(2*N+NR*NR+1),RWORK,IERR)
1717 CONDR1 = ONE / SQRT(TEMP1)
1723 COND_OK = SQRT(SQRT(REAL(NR)))
1726.LT.
IF ( CONDR1 COND_OK ) THEN
1731 CALL CGEQRF( N, NR, V, LDV, CWORK(N+1), CWORK(2*N+1),
1735 XSC = SQRT(SMALL)/EPSLN
1737 DO 3958 q = 1, p - 1
1738 CTEMP=CMPLX(XSC*MIN(ABS(V(p,p)),ABS(V(q,q))),
1740.LE.
IF ( ABS(V(q,p)) TEMP1 )
1748 $ CALL CLACPY( 'a
', N, NR, V, LDV, CWORK(2*N+1), N )
1752 DO 1969 p = 1, NR - 1
1753 CALL CCOPY( NR-p, V(p,p+1), LDV, V(p+1,p), 1 )
1754 CALL CLACGV(NR-p+1, V(p,p), 1 )
1756 V(NR,NR)=CONJG(V(NR,NR))
1773 CALL CGEQP3( N, NR, V, LDV, IWORK(N+1), CWORK(N+1),
1774 $ CWORK(2*N+1), LWORK-2*N, RWORK, IERR )
1780 DO 3968 q = 1, p - 1
1781 CTEMP=CMPLX(XSC*MIN(ABS(V(p,p)),ABS(V(q,q))),
1783.LE.
IF ( ABS(V(q,p)) TEMP1 )
1790 CALL CLACPY( 'a
', N, NR, V, LDV, CWORK(2*N+1), N )
1795 DO 8971 q = 1, p - 1
1796 CTEMP=CMPLX(XSC*MIN(ABS(V(p,p)),ABS(V(q,q))),
1803 CALL CLASET( 'l
',NR-1,NR-1,CZERO,CZERO,V(2,1),LDV )
1806 CALL CGELQF( NR, NR, V, LDV, CWORK(2*N+N*NR+1),
1807 $ CWORK(2*N+N*NR+NR+1), LWORK-2*N-N*NR-NR, IERR )
1809 CALL CLACPY( 'l
',NR,NR,V,LDV,CWORK(2*N+N*NR+NR+1),NR )
1811 TEMP1 = SCNRM2( p, CWORK(2*N+N*NR+NR+p), NR )
1812 CALL CSSCAL( p, ONE/TEMP1, CWORK(2*N+N*NR+NR+p), NR )
1814 CALL CPOCON( 'l
',NR,CWORK(2*N+N*NR+NR+1),NR,ONE,TEMP1,
1815 $ CWORK(2*N+N*NR+NR+NR*NR+1),RWORK,IERR )
1816 CONDR2 = ONE / SQRT(TEMP1)
1819.GE.
IF ( CONDR2 COND_OK ) THEN
1824 CALL CLACPY( 'u
', NR, NR, V, LDV, CWORK(2*N+1), N )
1834 CTEMP = XSC * V(q,q)
1835 DO 4969 p = 1, q - 1
1841 CALL CLASET( 'u
', NR-1,NR-1, CZERO,CZERO, V(1,2), LDV )
1850.LT.
IF ( CONDR1 COND_OK ) THEN
1852 CALL CGESVJ( 'l
','u
','n
',NR,NR,V,LDV,SVA,NR,U, LDU,
1853 $ CWORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,RWORK,
1856 NUMRANK = NINT(RWORK(2))
1858 CALL CCOPY( NR, V(1,p), 1, U(1,p), 1 )
1859 CALL CSSCAL( NR, SVA(p), V(1,p), 1 )
1864.EQ.
IF ( NR N ) THEN
1869 CALL CTRSM('l
','u
','n
','n
', NR,NR,CONE, A,LDA, V,LDV)
1875 CALL CTRSM('l
','u
','c
','n
',NR,NR,CONE,CWORK(2*N+1),
1877.LT.
IF ( NR N ) THEN
1878 CALL CLASET('a
',N-NR,NR,CZERO,CZERO,V(NR+1,1),LDV)
1879 CALL CLASET('a
',NR,N-NR,CZERO,CZERO,V(1,NR+1),LDV)
1880 CALL CLASET('a
',N-NR,N-NR,CZERO,CONE,V(NR+1,NR+1),LDV)
1882 CALL CUNMQR('l
','n
',N,N,NR,CWORK(2*N+1),N,CWORK(N+1),
1883 $ V,LDV,CWORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,IERR)
1886.LT.
ELSE IF ( CONDR2 COND_OK ) THEN
1892 CALL CGESVJ( 'l
', 'u
', 'n
', NR, NR, V, LDV, SVA, NR, U,
1893 $ LDU, CWORK(2*N+N*NR+NR+1), LWORK-2*N-N*NR-NR,
1894 $ RWORK, LRWORK, INFO )
1896 NUMRANK = NINT(RWORK(2))
1898 CALL CCOPY( NR, V(1,p), 1, U(1,p), 1 )
1899 CALL CSSCAL( NR, SVA(p), U(1,p), 1 )
1901 CALL CTRSM('l
','u
','n
','n
',NR,NR,CONE,CWORK(2*N+1),N,
1906 CWORK(2*N+N*NR+NR+IWORK(N+p)) = U(p,q)
1909 U(p,q) = CWORK(2*N+N*NR+NR+p)
1912.LT.
IF ( NR N ) THEN
1913 CALL CLASET( 'a
',N-NR,NR,CZERO,CZERO,V(NR+1,1),LDV )
1914 CALL CLASET( 'a
',NR,N-NR,CZERO,CZERO,V(1,NR+1),LDV )
1915 CALL CLASET('a
',N-NR,N-NR,CZERO,CONE,V(NR+1,NR+1),LDV)
1917 CALL CUNMQR( 'l
','n
',N,N,NR,CWORK(2*N+1),N,CWORK(N+1),
1918 $ V,LDV,CWORK(2*N+N*NR+NR+1),LWORK-2*N-N*NR-NR,IERR )
1931 CALL CGESVJ( 'l
', 'u
', 'v
', NR, NR, V, LDV, SVA, NR, U,
1932 $ LDU, CWORK(2*N+N*NR+NR+1), LWORK-2*N-N*NR-NR,
1933 $ RWORK, LRWORK, INFO )
1935 NUMRANK = NINT(RWORK(2))
1936.LT.
IF ( NR N ) THEN
1937 CALL CLASET( 'a
',N-NR,NR,CZERO,CZERO,V(NR+1,1),LDV )
1938 CALL CLASET( 'a
',NR,N-NR,CZERO,CZERO,V(1,NR+1),LDV )
1939 CALL CLASET('a
',N-NR,N-NR,CZERO,CONE,V(NR+1,NR+1),LDV)
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 )
1944 CALL CUNMLQ( 'l
', 'c
', NR, NR, NR, CWORK(2*N+1), N,
1945 $ CWORK(2*N+N*NR+1), U, LDU, CWORK(2*N+N*NR+NR+1),
1946 $ LWORK-2*N-N*NR-NR, IERR )
1949 CWORK(2*N+N*NR+NR+IWORK(N+p)) = U(p,q)
1952 U(p,q) = CWORK(2*N+N*NR+NR+p)
1962 TEMP1 = SQRT(REAL(N)) * EPSLN
1965 CWORK(2*N+N*NR+NR+IWORK(p)) = V(p,q)
1968 V(p,q) = CWORK(2*N+N*NR+NR+p)
1970 XSC = ONE / SCNRM2( N, V(1,q), 1 )
1971.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1972 $ CALL CSSCAL( N, XSC, V(1,q), 1 )
1976.LT.
IF ( NR M ) THEN
1977 CALL CLASET('a
', M-NR, NR, CZERO, CZERO, U(NR+1,1), LDU)
1978.LT.
IF ( NR N1 ) THEN
1979 CALL CLASET('a
',NR,N1-NR,CZERO,CZERO,U(1,NR+1),LDU)
1980 CALL CLASET('a
',M-NR,N1-NR,CZERO,CONE,
1988 CALL CUNMQR( 'l
', 'n
', M, N1, N, A, LDA, CWORK, U,
1989 $ LDU, CWORK(N+1), LWORK-N, IERR )
1992 TEMP1 = SQRT(REAL(M)) * EPSLN
1994 XSC = ONE / SCNRM2( M, U(1,p), 1 )
1995.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
1996 $ CALL CSSCAL( M, XSC, U(1,p), 1 )
2003 $ CALL CLASWP( N1, U, LDU, 1, M-1, IWORK(IWOFF+1), -1 )
2010 CALL CLACPY( 'u
', N, N, A, LDA, CWORK(N+1), N )
2014 CTEMP = XSC * CWORK( N + (p-1)*N + p )
2015 DO 5971 q = 1, p - 1
2018 CWORK(N+(q-1)*N+p)=-CTEMP
2022 CALL CLASET( 'l
',N-1,N-1,CZERO,CZERO,CWORK(N+2),N )
2025 CALL CGESVJ( 'u
', 'u
', 'n
', N, N, CWORK(N+1), N, SVA,
2026 $ N, U, LDU, CWORK(N+N*N+1), LWORK-N-N*N, RWORK, LRWORK,
2030 NUMRANK = NINT(RWORK(2))
2032 CALL CCOPY( N, CWORK(N+(p-1)*N+1), 1, U(1,p), 1 )
2033 CALL CSSCAL( N, SVA(p), CWORK(N+(p-1)*N+1), 1 )
2036 CALL CTRSM( 'l',
'U',
'N',
'N', n, n,
2037 $ cone, a, lda, cwork(n+1),
2039 CALL ccopy( n, cwork(n+p), n, v(iwork(p),1), ldv )
2041 temp1 = sqrt(real(n))*epsln
2043 xsc = one / scnrm2( n, v(1,p), 1 )
2044 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2045 $
CALL csscal( n, xsc, v(1,p), 1 )
2050 IF ( n .LT. m )
THEN
2051 CALL claset(
'A', m-n, n, czero, czero, u(n+1,1), ldu )
2052 IF ( n .LT. n1 )
THEN
2053 CALL claset(
'A',n, n1-n, czero, czero, u(1,n+1),ldu)
2054 CALL claset(
'A',m-n,n1-n, czero, cone,u(n+1,n+1),ldu)
2057 CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2058 $ ldu, cwork(n+1), lwork-n, ierr )
2059 temp1 = sqrt(real(m))*epsln
2061 xsc = one / scnrm2( m, u(1,p), 1 )
2062 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2063 $
CALL csscal( m, xsc, u(1,p), 1 )
2067 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2087 CALL ccopy( n-p+1, a(p,p), lda, v(p,p), 1 )
2088 CALL clacgv( n-p+1, v(p,p), 1 )
2092 xsc = sqrt(small/epsln)
2094 ctemp =
cmplx(xsc*abs( v(q,q) ),zero)
2096 IF ( ( p .GT. q ) .AND. ( abs(v(p
2097 $ .OR. ( p .LT. q ) )
2100 IF ( p .LT. q ) v(p,q) = - v(p,q)
2104 CALL claset(
'U', nr-1, nr-1, czero, czero, v(1,2), ldv )
2107 CALL cgeqrf( n, nr, v, ldv, cwork(n+1), cwork(2*n+1),
2109 CALL clacpy(
'L', n, nr, v, ldv, cwork(2*n+1), n )
2112 CALL ccopy( nr-p+1, v(p,p), ldv, u(p,p), 1 )
2113 CALL clacgv( nr-p+1, u(p,p), 1 )
2117 xsc = sqrt(small/epsln)
2119 DO 9971 p = 1, q - 1
2120 ctemp =
cmplx(xsc *
min(abs(u(p,p)),abs(u(q,q))),
2127 CALL claset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
2130 CALL cgesvj(
'L',
'U',
'V', nr, nr, u, ldu, sva,
2131 $ n, v, ldv, cwork(2*n+n*nr+1), lwork-2*n-n*nr,
2132 $ rwork, lrwork, info )
2134 numrank = nint(rwork(2))
2136 IF ( nr .LT. n )
THEN
2137 CALL claset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv )
2138 CALL claset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv )
2139 CALL claset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv )
2142 CALL cunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
2143 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
2149 temp1 = sqrt(real(n)) * epsln
2152 cwork(2*n+n*nr+nr+iwork(p)) = v(p,q)
2155 v(p,q) = cwork(2*n+n*nr+nr+p)
2157 xsc = one / scnrm2( n, v(1,q), 1 )
2158 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2159 $
CALL csscal( n, xsc, v(1,q), 1
2165 IF ( nr .LT. m )
THEN
2166 CALL claset(
'A', m-nr, nr, czero, czero, u(nr+1,1), ldu )
2167 IF ( nr .LT. n1 )
THEN
2168 CALL claset(
'A',nr, n1-nr, czero, czero, u(1,nr+1)
2169 CALL claset(
'A',m-nr,n1-nr, czero, cone,u(nr+1,nr+1),ldu)
2173 CALL cunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2174 $ ldu, cwork(n+1), lwork-n, ierr )
2177 $
CALL claswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2184 CALL cswap( n, u(1,p), 1, v(1,p), 1 )
2193 IF ( uscal2 .LE. (big/sva(1))*uscal1 )
THEN
2194 CALL slascl(
'G', 0, 0, uscal1, uscal2, nr, 1, sva, n, ierr )
2199 IF ( nr .LT. n )
THEN
2205 rwork(1) = uscal2 * scalem
2207 IF ( errest ) rwork(3) = sconda
2208 IF ( lsvec .AND. rsvec )
THEN