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
600 $ rowpiv, rsvec, transp
602 INTEGER OPTWRK, MINWRK, MINRWRK, MINIWRK
603 INTEGER LWCON, LWLQF, , LWQRF, LWUNMLQ, LWUNMQR, LWUNMQRM,
604 $ lwsvdj, lwsvdjv, lrwqp3, lrwcon, lrwsvdj, iwoff
605 INTEGER , LWRK_CGEQP3, LWRK_CGEQP3N, LWRK_CGEQRF,
606 $ LWRK_CGESVJ, LWRK_CGESVJV
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..EQ.
' ) ( M N )
641 L2KILL = LSAME( JOBR, 'r
' )
642 DEFR = LSAME( JOBR, 'n
' )
643 L2PERT = LSAME( JOBP, 'p
' )
645.EQ..OR..EQ.
LQUERY = ( LWORK -1 ) ( LRWORK -1 )
647.NOT..OR..OR..OR.
IF ( (ROWPIV L2RANK L2ABER
648.OR.
$ ERREST LSAME( JOBA, 'c
' ) )) THEN
650.NOT..OR.
ELSE IF ( ( LSVEC LSAME( JOBU, 'n.OR.
' )
651 $ ( LSAME( JOBU, 'w.AND..AND.
' ) RSVEC L2TRAN ) ) ) THEN
653.NOT..OR.
ELSE IF ( ( RSVEC LSAME( JOBV, 'n.OR.
' )
654 $ ( LSAME( JOBV, 'w.AND..AND.
' ) LSVEC L2TRAN ) ) ) THEN
656.NOT..OR.
ELSE IF ( ( L2KILL DEFR ) ) THEN
658.NOT.
ELSE IF ( ( LSAME(JOBT,'t.OR.
') LSAME(JOBT,'n
') ) ) THEN
660.NOT..OR.
ELSE IF ( ( L2PERT LSAME( JOBP, 'n
' ) ) ) THEN
662.LT.
ELSE IF ( M 0 ) THEN
664.LT..OR..GT.
ELSE IF ( ( N 0 ) ( N M ) ) THEN
666.LT.
ELSE IF ( LDA M ) THEN
668.AND..LT.
ELSE IF ( LSVEC ( LDU M ) ) THEN
670.AND..LT.
ELSE IF ( RSVEC ( LDV N ) ) THEN
677.EQ.
IF ( INFO 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.NOT..OR.
IF ( (LSVEC 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.OR.
IF ( L2TRAN 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.OR.
IF ( ROWPIV L2TRAN ) MINIWRK = MINIWRK + M
750.AND..NOT.
ELSE IF ( RSVEC (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 ELSE IF ( lsvec .AND. ( .NOT. 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 IF ( nr .LT. m )
THEN
1636 CALL claset(
'A', m-nr, nr,czero, czero, u(nr+1,1), ldu )
1637 IF ( nr .LT. 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), N )
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.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
2045 $ CALL CSSCAL( N, XSC, V(1,p), 1 )
2051 CALL CLASET( 'a
', M-N, N, CZERO, CZERO, U(N+1,1), LDU )
2052.LT.
IF ( N 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.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (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.GT..AND..LE.
IF ( ( p q ) ( ABS(V(p,q)) TEMP1 )
2100.LT.
IF ( p 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.LT.
IF ( NR 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.LT..OR..GT.
IF ( (XSC (ONE-TEMP1)) (XSC (ONE+TEMP1)) )
2159 $ CALL CSSCAL( N, XSC, V(1,q), 1 )
2165.LT.
IF ( NR M ) THEN
2166 CALL CLASET( 'a
', M-NR, NR, CZERO, CZERO, U(NR+1,1), LDU )
2167.LT.
IF ( NR N1 ) THEN
2168 CALL CLASET('a
',NR, N1-NR, CZERO, CZERO, U(1,NR+1),LDU)
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.LE.
IF ( USCAL2 (BIG/SVA(1))*USCAL1 ) THEN
2194 CALL SLASCL( 'g
', 0, 0, USCAL1, USCAL2, NR, 1, SVA, N, IERR )
2199.LT.
IF ( NR N ) THEN
2205 RWORK(1) = USCAL2 * SCALEM
2207 IF ( ERREST ) RWORK(3) = SCONDA
2208.AND.
IF ( LSVEC RSVEC ) THEN