568 SUBROUTINE zgejsv( JOBA, JOBU, JOBV, JOBR, JOBT, JOBP,
569 $ M, N, A, LDA, SVA, U, LDU, V, LDV,
570 $ CWORK, LWORK, RWORK, LRWORK, IWORK, INFO )
579 INTEGER INFO, LDA, LDU, LDV, LWORK, LRWORK, M, N
582 COMPLEX*16 A( LDA, * ), U( LDU, * ), V( LDV, * ),
584 DOUBLE PRECISION SVA( N ), RWORK( LRWORK )
586 CHARACTER*1 JOBA, JOBP, JOBR, JOBT, JOBU, JOBV
592 DOUBLE PRECISION ZERO, ONE
593 PARAMETER ( ZERO = 0.0d0, one = 1.0d0 )
594 COMPLEX*16 CZERO, CONE
595 parameter( czero = ( 0.0d0, 0.0d0 ), cone = ( 1.0d0, 0.0d0 ) )
599 DOUBLE PRECISION AAPP, AAQQ, AATMAX, AATMIN, BIG, BIG1,
600 $ cond_ok, condr1, condr2, entra, entrat, epsln,
601 $ maxprj, scalem, sconda, sfmin, small, temp1,
602 $ uscal1, uscal2, xsc
603 INTEGER IERR, N1, NR, NUMRANK, p, q, WARNING
604 LOGICAL ALMORT, DEFR, ERREST, GOSCAL, JRACC, KILL, LQUERY,
605 $ lsvec, l2aber, l2kill, l2pert, l2rank, l2tran, noscal,
606 $ rowpiv, rsvec, transp
608 INTEGER OPTWRK, MINWRK, MINRWRK, MINIWRK
609 INTEGER LWCON, LWLQF, LWQP3, LWQRF, LWUNMLQ, LWUNMQR, LWUNMQRM,
610 $ lwsvdj, lwsvdjv, lrwqp3, lrwcon, lrwsvdj, iwoff
611 INTEGER LWRK_ZGELQF, LWRK_ZGEQP3, LWRK_ZGEQP3N, LWRK_ZGEQRF,
612 $ LWRK_ZGESVJ, LWRK_ZGESVJV, LWRK_ZGESVJU, LWRK_ZUNMLQ,
613 $ lwrk_zunmqr, lwrk_zunmqrm
617 DOUBLE PRECISION RDUMMY(1)
620 INTRINSIC abs, dcmplx, conjg, dlog, max, min, dble, nint, sqrt
623 DOUBLE PRECISION DLAMCH, DZNRM2
624 INTEGER IDAMAX, IZAMAX
626 EXTERNAL idamax, izamax, lsame, dlamch, dznrm2
639 lsvec = lsame( jobu,
'U' ) .OR. lsame( jobu,
'F' )
640 jracc = lsame( jobv,
'J' )
641 rsvec = lsame( jobv,
'V' ) .OR. jracc
642 rowpiv = lsame( joba,
'F' ) .OR. lsame( joba,
'G' )
643 l2rank = lsame( joba,
'R' )
644 l2aber = lsame( joba,
'A' )
645 errest = lsame( joba,
'E' ) .OR. lsame( joba,
'G' )
646 l2tran = lsame( jobt,
'T' ) .AND. ( m .EQ. n )
647 l2kill = lsame( jobr,
'R' )
648 defr = lsame( jobr,
'N' )
649 l2pert = lsame( jobp,
'P' )
651 lquery = ( lwork .EQ. -1 ) .OR. ( lrwork .EQ. -1 )
653 IF ( .NOT.(rowpiv .OR. l2rank .OR. l2aber .OR.
654 $ errest .OR. lsame( joba,
'C' ) ))
THEN
656 ELSE IF ( .NOT.( lsvec .OR. lsame( jobu,
'N' ) .OR.
657 $ ( lsame( jobu,
'W' ) .AND. rsvec .AND. l2tran ) ) )
THEN
659 ELSE IF ( .NOT.( rsvec .OR. lsame( jobv,
'N' ) .OR.
660 $ ( lsame( jobv,
'W' ) .AND. lsvec .AND. l2tran ) ) )
THEN
662 ELSE IF ( .NOT. ( l2kill .OR. defr ) )
THEN
664 ELSE IF ( .NOT. ( lsame(jobt,
'T') .OR. lsame(jobt,
'N') ) )
THEN
666 ELSE IF ( .NOT. ( l2pert .OR. lsame( jobp,
'N' ) ) )
THEN
668 ELSE IF ( m .LT. 0 )
THEN
670 ELSE IF ( ( n .LT. 0 ) .OR. ( n .GT. m ) )
THEN
672 ELSE IF ( lda .LT. m )
THEN
674 ELSE IF ( lsvec .AND. ( ldu .LT. m ) )
THEN
676 ELSE IF ( rsvec .AND. ( ldv .LT. n ) )
THEN
683 IF ( info .EQ. 0 )
THEN
697 lwunmlq = max( 1, n )
698 lwunmqr = max( 1, n )
699 lwunmqrm = max( 1, m )
704 lwsvdj = max( 2 * n, 1 )
705 lwsvdjv = max( 2 * n, 1 )
711 CALL zgeqp3( m, n, a, lda, iwork, cdummy, cdummy, -1,
713 lwrk_zgeqp3 = cdummy(1)
714 CALL zgeqrf( n, n, a, lda, cdummy, cdummy,-1, ierr )
715 lwrk_zgeqrf = cdummy(1)
716 CALL zgelqf( n, n, a, lda, cdummy, cdummy,-1, ierr )
717 lwrk_zgelqf = cdummy(1)
722 IF ( .NOT. (lsvec .OR. rsvec ) )
THEN
726 minwrk = max( n+lwqp3, n**2+lwcon, n+lwqrf, lwsvdj )
728 minwrk = max( n+lwqp3, n+lwqrf, lwsvdj )
731 CALL zgesvj(
'L',
'N',
'N', n, n, a, lda, sva, n, v,
732 $ ldv, cdummy, -1, rdummy, -1, ierr )
733 lwrk_zgesvj = cdummy(1)
735 optwrk = max( n+lwrk_zgeqp3, n**2+lwcon,
736 $ n+lwrk_zgeqrf, lwrk_zgesvj )
738 optwrk = max( n+lwrk_zgeqp3, n+lwrk_zgeqrf,
742 IF ( l2tran .OR. rowpiv )
THEN
744 minrwrk = max( 7, 2*m, lrwqp3, lrwcon, lrwsvdj )
746 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj )
750 minrwrk = max( 7, lrwqp3, lrwcon, lrwsvdj )
752 minrwrk = max( 7, lrwqp3, lrwsvdj )
755 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
756 ELSE IF ( rsvec .AND. (.NOT.lsvec) )
THEN
760 minwrk = max( n+lwqp3, lwcon, lwsvdj, n+lwlqf,
761 $ 2*n+lwqrf, n+lwsvdj, n+lwunmlq )
763 minwrk = max( n+lwqp3, lwsvdj, n+lwlqf, 2*n+lwqrf,
764 $ n+lwsvdj, n+lwunmlq )
767 CALL zgesvj(
'L',
'U',
'N', n,n, u, ldu, sva, n, a,
768 $ lda, cdummy, -1, rdummy, -1, ierr )
769 lwrk_zgesvj = cdummy(1)
770 CALL zunmlq(
'L',
'C', n, n, n, a, lda, cdummy,
771 $ v, ldv, cdummy, -1, ierr )
772 lwrk_zunmlq = cdummy(1)
774 optwrk = max( n+lwrk_zgeqp3, lwcon, lwrk_zgesvj,
775 $ n+lwrk_zgelqf, 2*n+lwrk_zgeqrf,
776 $ n+lwrk_zgesvj, n+lwrk_zunmlq )
778 optwrk = max( n+lwrk_zgeqp3, lwrk_zgesvj,n+lwrk_zgelqf,
779 $ 2*n+lwrk_zgeqrf, n+lwrk_zgesvj,
783 IF ( l2tran .OR. rowpiv )
THEN
785 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj, lrwcon )
787 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj )
791 minrwrk = max( 7, lrwqp3, lrwsvdj, lrwcon )
793 minrwrk = max( 7, lrwqp3, lrwsvdj )
796 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
797 ELSE IF ( lsvec .AND. (.NOT.rsvec) )
THEN
801 minwrk = n + max( lwqp3,lwcon,n+lwqrf,lwsvdj,lwunmqrm )
803 minwrk = n + max( lwqp3, n+lwqrf, lwsvdj, lwunmqrm )
806 CALL zgesvj(
'L',
'U',
'N', n,n, u, ldu, sva, n, a,
807 $ lda, cdummy, -1, rdummy, -1, ierr )
808 lwrk_zgesvj = cdummy(1)
809 CALL zunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
810 $ ldu, cdummy, -1, ierr )
811 lwrk_zunmqrm = cdummy(1)
813 optwrk = n + max( lwrk_zgeqp3, lwcon, n+lwrk_zgeqrf,
814 $ lwrk_zgesvj, lwrk_zunmqrm )
816 optwrk = n + max( lwrk_zgeqp3, n+lwrk_zgeqrf,
817 $ lwrk_zgesvj, lwrk_zunmqrm )
820 IF ( l2tran .OR. rowpiv )
THEN
822 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj, lrwcon )
824 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj )
828 minrwrk = max( 7, lrwqp3, lrwsvdj, lrwcon )
830 minrwrk = max( 7, lrwqp3, lrwsvdj )
833 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
837 IF ( .NOT. jracc )
THEN
839 minwrk = max( n+lwqp3, n+lwcon, 2*n+n**2+lwcon,
840 $ 2*n+lwqrf, 2*n+lwqp3,
841 $ 2*n+n**2+n+lwlqf, 2*n+n**2+n+n**2+lwcon,
842 $ 2*n+n**2+n+lwsvdj, 2*n+n**2+n+lwsvdjv,
843 $ 2*n+n**2+n+lwunmqr,2*n+n**2+n+lwunmlq,
844 $ n+n**2+lwsvdj, n+lwunmqrm )
846 minwrk = max( n+lwqp3, 2*n+n**2+lwcon,
847 $ 2*n+lwqrf, 2*n+lwqp3,
848 $ 2*n+n**2+n+lwlqf, 2*n+n**2+n+n**2+lwcon,
849 $ 2*n+n**2+n+lwsvdj, 2*n+n**2+n+lwsvdjv,
850 $ 2*n+n**2+n+lwunmqr,2*n+n**2+n+lwunmlq,
851 $ n+n**2+lwsvdj, n+lwunmqrm )
853 miniwrk = miniwrk + n
854 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
857 minwrk = max( n+lwqp3, n+lwcon, 2*n+lwqrf,
858 $ 2*n+n**2+lwsvdjv, 2*n+n**2+n+lwunmqr,
861 minwrk = max( n+lwqp3, 2*n+lwqrf,
862 $ 2*n+n**2+lwsvdjv, 2*n+n**2+n+lwunmqr,
865 IF ( rowpiv .OR. l2tran ) miniwrk = miniwrk + m
868 CALL zunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
869 $ ldu, cdummy, -1, ierr )
870 lwrk_zunmqrm = cdummy(1)
871 CALL zunmqr(
'L',
'N', n, n, n, a, lda, cdummy, u,
872 $ ldu, cdummy, -1, ierr )
873 lwrk_zunmqr = cdummy(1)
874 IF ( .NOT. jracc )
THEN
875 CALL zgeqp3( n,n, a, lda, iwork, cdummy,cdummy, -1,
877 lwrk_zgeqp3n = cdummy(1)
878 CALL zgesvj(
'L',
'U',
'N', n, n, u, ldu, sva,
879 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
880 lwrk_zgesvj = cdummy(1)
881 CALL zgesvj(
'U',
'U',
'N', n, n, u, ldu, sva,
882 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
883 lwrk_zgesvju = cdummy(1)
884 CALL zgesvj(
'L',
'U',
'V', n, n, u, ldu, sva,
885 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
886 lwrk_zgesvjv = cdummy(1)
887 CALL zunmlq(
'L',
'C', n, n, n, a, lda, cdummy,
888 $ v, ldv, cdummy, -1, ierr )
889 lwrk_zunmlq = cdummy(1)
891 optwrk = max( n+lwrk_zgeqp3, n+lwcon,
892 $ 2*n+n**2+lwcon, 2*n+lwrk_zgeqrf,
894 $ 2*n+n**2+n+lwrk_zgelqf,
895 $ 2*n+n**2+n+n**2+lwcon,
896 $ 2*n+n**2+n+lwrk_zgesvj,
897 $ 2*n+n**2+n+lwrk_zgesvjv,
898 $ 2*n+n**2+n+lwrk_zunmqr,
899 $ 2*n+n**2+n+lwrk_zunmlq,
900 $ n+n**2+lwrk_zgesvju,
903 optwrk = max( n+lwrk_zgeqp3,
904 $ 2*n+n**2+lwcon, 2*n+lwrk_zgeqrf,
906 $ 2*n+n**2+n+lwrk_zgelqf,
907 $ 2*n+n**2+n+n**2+lwcon,
908 $ 2*n+n**2+n+lwrk_zgesvj,
909 $ 2*n+n**2+n+lwrk_zgesvjv,
910 $ 2*n+n**2+n+lwrk_zunmqr,
911 $ 2*n+n**2+n+lwrk_zunmlq,
912 $ n+n**2+lwrk_zgesvju,
916 CALL zgesvj(
'L',
'U',
'V', n, n, u, ldu, sva,
917 $ n, v, ldv, cdummy, -1, rdummy, -1, ierr )
918 lwrk_zgesvjv = cdummy(1)
919 CALL zunmqr(
'L',
'N', n, n, n, cdummy, n, cdummy,
920 $ v, ldv, cdummy, -1, ierr )
921 lwrk_zunmqr = cdummy(1)
922 CALL zunmqr(
'L',
'N', m, n, n, a, lda, cdummy, u,
923 $ ldu, cdummy, -1, ierr )
924 lwrk_zunmqrm = cdummy(1)
926 optwrk = max( n+lwrk_zgeqp3, n+lwcon,
927 $ 2*n+lwrk_zgeqrf, 2*n+n**2,
928 $ 2*n+n**2+lwrk_zgesvjv,
929 $ 2*n+n**2+n+lwrk_zunmqr,n+lwrk_zunmqrm )
931 optwrk = max( n+lwrk_zgeqp3, 2*n+lwrk_zgeqrf,
932 $ 2*n+n**2, 2*n+n**2+lwrk_zgesvjv,
933 $ 2*n+n**2+n+lwrk_zunmqr,
938 IF ( l2tran .OR. rowpiv )
THEN
939 minrwrk = max( 7, 2*m, lrwqp3, lrwsvdj, lrwcon )
941 minrwrk = max( 7, lrwqp3, lrwsvdj, lrwcon )
944 minwrk = max( 2, minwrk )
945 optwrk = max( minwrk, optwrk )
946 IF ( lwork .LT. minwrk .AND. (.NOT.lquery) ) info = - 17
947 IF ( lrwork .LT. minrwrk .AND. (.NOT.lquery) ) info = - 19
950 IF ( info .NE. 0 )
THEN
952 CALL xerbla(
'ZGEJSV', - info )
954 ELSE IF ( lquery )
THEN
958 iwork(1) = max( 4, miniwrk )
964 IF ( ( m .EQ. 0 ) .OR. ( n .EQ. 0 ) )
THEN
974 IF ( lsame( jobu,
'F' ) ) n1 = m
981 epsln = dlamch(
'Epsilon')
982 sfmin = dlamch(
'SafeMinimum')
983 small = sfmin / epsln
993 scalem = one / sqrt(dble(m)*dble(n))
999 CALL zlassq( m, a(1,p), 1, aapp, aaqq )
1000 IF ( aapp .GT. big )
THEN
1002 CALL xerbla(
'ZGEJSV', -info )
1006 IF ( ( aapp .LT. (big / aaqq) ) .AND. noscal )
THEN
1007 sva(p) = aapp * aaqq
1010 sva(p) = aapp * ( aaqq * scalem )
1013 CALL dscal( p-1, scalem, sva, 1 )
1018 IF ( noscal ) scalem = one
1023 aapp = max( aapp, sva(p) )
1024 IF ( sva(p) .NE. zero ) aaqq = min( aaqq, sva(p) )
1029 IF ( aapp .EQ. zero )
THEN
1030 IF ( lsvec )
CALL zlaset(
'G', m, n1, czero, cone, u, ldu )
1031 IF ( rsvec )
CALL zlaset(
'G', n, n, czero, cone, v, ldv )
1034 IF ( errest ) rwork(3) = one
1035 IF ( lsvec .AND. rsvec )
THEN
1055 IF ( aaqq .LE. sfmin )
THEN
1063 IF ( n .EQ. 1 )
THEN
1066 CALL zlascl(
'G',0,0,sva(1),scalem, m,1,a(1,1),lda,ierr )
1067 CALL zlacpy(
'A', m, 1, a, lda, u, ldu )
1069 IF ( n1 .NE. n )
THEN
1070 CALL zgeqrf( m, n, u,ldu, cwork, cwork(n+1),lwork-n,ierr )
1071 CALL zungqr( m,n1,1, u,ldu,cwork,cwork(n+1),lwork-n,ierr )
1072 CALL zcopy( m, a(1,1), 1, u(1,1), 1 )
1078 IF ( sva(1) .LT. (big*scalem) )
THEN
1079 sva(1) = sva(1) / scalem
1082 rwork(1) = one / scalem
1084 IF ( sva(1) .NE. zero )
THEN
1086 IF ( ( sva(1) / scalem) .GE. sfmin )
THEN
1097 IF ( errest ) rwork(3) = one
1098 IF ( lsvec .AND. rsvec )
THEN
1114 IF ( rowpiv .OR. l2tran )
THEN
1125 CALL zlassq( n, a(p,1), lda, xsc, temp1 )
1128 rwork(m+p) = xsc * scalem
1129 rwork(p) = xsc * (scalem*sqrt(temp1))
1130 aatmax = max( aatmax, rwork(p) )
1131 IF (rwork(p) .NE. zero)
1132 $ aatmin = min(aatmin,rwork(p))
1136 rwork(m+p) = scalem*abs( a(p,izamax(n,a(p,1),lda)) )
1137 aatmax = max( aatmax, rwork(m+p) )
1138 aatmin = min( aatmin, rwork(m+p) )
1157 CALL dlassq( n, sva, 1, xsc, temp1 )
1162 big1 = ( ( sva(p) / xsc )**2 ) * temp1
1163 IF ( big1 .NE. zero ) entra = entra + big1 * dlog(big1)
1165 entra = - entra / dlog(dble(n))
1175 big1 = ( ( rwork(p) / xsc )**2 ) * temp1
1176 IF ( big1 .NE. zero ) entrat = entrat + big1 * dlog(big1)
1178 entrat = - entrat / dlog(dble(m))
1183 transp = ( entrat .LT. entra )
1190 DO 1115 p = 1, n - 1
1191 a(p,p) = conjg(a(p,p))
1192 DO 1116 q = p + 1, n
1193 ctemp = conjg(a(q,p))
1194 a(q,p) = conjg(a(p,q))
1198 a(n,n) = conjg(a(n,n))
1234 temp1 = sqrt( big / dble(n) )
1237 CALL dlascl(
'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 zlascl(
'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 zlaset(
'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 = idamax( m-p+1, rwork(m+p), 1 ) + p - 1
1298 IF ( p .NE. q )
THEN
1300 rwork(m+p) = rwork(m+q)
1304 CALL zlaswp( n, a, lda, 1, m-1, iwork(iwoff+1), 1 )
1326 CALL zgeqp3( m, n, a, lda, iwork, cwork, cwork(n+1), lwork-n,
1343 temp1 = sqrt(dble(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 - dble(n)*epsln ) almort = .true.
1399 IF ( n .EQ. nr )
THEN
1402 CALL zlacpy(
'U', n, n, a, lda, v, ldv )
1404 temp1 = sva(iwork(p))
1405 CALL zdscal( p, one/temp1, v(1,p), 1 )
1408 CALL zpocon(
'U', n, v, ldv, one, temp1,
1409 $ cwork(n+1), rwork, ierr )
1411 CALL zpocon(
'U', n, v, ldv, one, temp1,
1412 $ cwork, rwork, ierr )
1415 ELSE IF ( lsvec )
THEN
1417 CALL zlacpy(
'U', n, n, a, lda, u, ldu )
1419 temp1 = sva(iwork(p))
1420 CALL zdscal( p, one/temp1, u(1,p), 1 )
1422 CALL zpocon(
'U', n, u, ldu, one, temp1,
1423 $ cwork(n+1), rwork, ierr )
1425 CALL zlacpy(
'U', n, n, a, lda, cwork, n )
1430 temp1 = sva(iwork(p))
1432 CALL zdscal( p, one/temp1, cwork((p-1)*n+1), 1 )
1437 CALL zpocon(
'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 zcopy( n-p, a(p,p+1), lda, a(p+1,p), 1 )
1465 CALL zlacgv( 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 / dble(n)
1487 ctemp = dcmplx(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 zlaset(
'U', nr-1,nr-1, czero,czero, a(1,2),lda )
1501 CALL zgeqrf( n,nr, a,lda, cwork, cwork(n+1),lwork-n, ierr )
1504 DO 1948 p = 1, nr - 1
1505 CALL zcopy( nr-p, a(p,p+1), lda, a(p+1,p), 1 )
1506 CALL zlacgv( nr-p+1, a(p,p), 1 )
1517 xsc = epsln / dble(n)
1519 ctemp = dcmplx(xsc*abs(a(q,q)),zero)
1521 IF ( ( (p.GT.q) .AND. (abs(a(p,q)).LE.temp1) )
1522 $ .OR. ( p .LT. q ) )
1528 CALL zlaset(
'U', nr-1, nr-1, czero, czero, a(1,2), lda )
1535 CALL zgesvj(
'L',
'N',
'N', nr, nr, a, lda, sva,
1536 $ n, v, ldv, cwork, lwork, rwork, lrwork, info )
1539 numrank = nint(rwork(2))
1542 ELSE IF ( ( rsvec .AND. ( .NOT. lsvec ) .AND. ( .NOT. jracc ) )
1544 $ ( jracc .AND. ( .NOT. lsvec ) .AND. ( nr .NE. n ) ) )
THEN
1552 CALL zcopy( n-p+1, a(p,p), lda, v(p,p), 1 )
1553 CALL zlacgv( n-p+1, v(p,p), 1 )
1555 CALL zlaset(
'U', nr-1,nr-1, czero, czero, v(1,2), ldv )
1557 CALL zgesvj(
'L',
'U',
'N', n, nr, v, ldv, sva, nr, a, lda,
1558 $ cwork, lwork, rwork, lrwork, info )
1560 numrank = nint(rwork(2))
1567 CALL zlaset(
'L', nr-1,nr-1, czero, czero, a(2,1), lda )
1568 CALL zgelqf( nr,n, a, lda, cwork, cwork(n+1), lwork-n, ierr)
1569 CALL zlacpy(
'L', nr, nr, a, lda, v, ldv )
1570 CALL zlaset(
'U', nr-1,nr-1, czero, czero, v(1,2), ldv )
1571 CALL zgeqrf( nr, nr, v, ldv, cwork(n+1), cwork(2*n+1),
1574 CALL zcopy( nr-p+1, v(p,p), ldv, v(p,p), 1 )
1575 CALL zlacgv( nr-p+1, v(p,p), 1 )
1577 CALL zlaset(
'U', nr-1, nr-1, czero, czero, v(1,2), ldv)
1579 CALL zgesvj(
'L',
'U',
'N', nr, nr, v,ldv, sva, nr, u,
1580 $ ldu, cwork(n+1), lwork-n, rwork, lrwork, info )
1582 numrank = nint(rwork(2))
1583 IF ( nr .LT. n )
THEN
1584 CALL zlaset(
'A',n-nr, nr, czero,czero, v(nr+1,1), ldv )
1585 CALL zlaset(
'A',nr, n-nr, czero,czero, v(1,nr+1), ldv )
1586 CALL zlaset(
'A',n-nr,n-nr,czero,cone, v(nr+1,nr+1),ldv )
1589 CALL zunmlq(
'L',
'C', n, n, nr, a, lda, cwork,
1590 $ v, ldv, cwork(n+1), lwork-n, ierr )
1598 CALL zlapmr( .false., n, n, v, ldv, iwork )
1601 CALL zlacpy(
'A', n, n, v, ldv, u, ldu )
1604 ELSE IF ( jracc .AND. (.NOT. lsvec) .AND. ( nr.EQ. n ) )
THEN
1606 CALL zlaset(
'L', n-1,n-1, czero, czero, a(2,1), lda )
1608 CALL zgesvj(
'U',
'N',
'V', n, n, a, lda, sva, n, v, ldv,
1609 $ cwork, lwork, rwork, lrwork, info )
1611 numrank = nint(rwork(2))
1612 CALL zlapmr( .false., n, n, v, ldv, iwork )
1614 ELSE IF ( lsvec .AND. ( .NOT. rsvec ) )
THEN
1621 CALL zcopy( n-p+1, a(p,p), lda, u(p,p), 1 )
1622 CALL zlacgv( n-p+1, u(p,p), 1 )
1624 CALL zlaset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
1626 CALL zgeqrf( n, nr, u, ldu, cwork(n+1), cwork(2*n+1),
1629 DO 1967 p = 1, nr - 1
1630 CALL zcopy( nr-p, u(p,p+1), ldu, u(p+1,p), 1 )
1631 CALL zlacgv( n-p+1, u(p,p), 1 )
1633 CALL zlaset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
1635 CALL zgesvj(
'L',
'U',
'N', nr,nr, u, ldu, sva, nr, a,
1636 $ lda, cwork(n+1), lwork-n, rwork, lrwork, info )
1638 numrank = nint(rwork(2))
1640 IF ( nr .LT. m )
THEN
1641 CALL zlaset(
'A', m-nr, nr,czero, czero, u(nr+1,1), ldu )
1642 IF ( nr .LT. n1 )
THEN
1643 CALL zlaset(
'A',nr, n1-nr, czero, czero, u(1,nr+1),ldu )
1644 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,u(nr+1,nr+1),ldu )
1648 CALL zunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1649 $ ldu, cwork(n+1), lwork-n, ierr )
1652 $
CALL zlaswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
1655 xsc = one / dznrm2( m, u(1,p), 1 )
1656 CALL zdscal( m, xsc, u(1,p), 1 )
1660 CALL zlacpy(
'A', n, n, u, ldu, v, ldv )
1667 IF ( .NOT. jracc )
THEN
1669 IF ( .NOT. almort )
THEN
1679 CALL zcopy( n-p+1, a(p,p), lda, v(p,p), 1 )
1680 CALL zlacgv( n-p+1, v(p,p), 1 )
1698 ctemp = dcmplx(xsc*abs( v(q,q) ),zero)
1700 IF ( ( p .GT. q ) .AND. ( abs(v(p,q)) .LE. temp1 )
1701 $ .OR. ( p .LT. q ) )
1704 IF ( p .LT. q ) v(p,q) = - v(p,q)
1708 CALL zlaset(
'U', nr-1, nr-1, czero, czero, v(1,2), ldv )
1715 CALL zlacpy(
'L', nr, nr, v, ldv, cwork(2*n+1), nr )
1717 temp1 = dznrm2(nr-p+1,cwork(2*n+(p-1)*nr+p),1)
1718 CALL zdscal(nr-p+1,one/temp1,cwork(2*n+(p-1)*nr+p),1)
1720 CALL zpocon(
'L',nr,cwork(2*n+1),nr,one,temp1,
1721 $ cwork(2*n+nr*nr+1),rwork,ierr)
1722 condr1 = one / sqrt(temp1)
1728 cond_ok = sqrt(sqrt(dble(nr)))
1731 IF ( condr1 .LT. cond_ok )
THEN
1736 CALL zgeqrf( n, nr, v, ldv, cwork(n+1), cwork(2*n+1),
1740 xsc = sqrt(small)/epsln
1742 DO 3958 q = 1, p - 1
1743 ctemp=dcmplx(xsc*min(abs(v(p,p)),abs(v(q,q))),
1745 IF ( abs(v(q,p)) .LE. temp1 )
1753 $
CALL zlacpy(
'A', n, nr, v, ldv, cwork(2*n+1), n )
1757 DO 1969 p = 1, nr - 1
1758 CALL zcopy( nr-p, v(p,p+1), ldv, v(p+1,p), 1 )
1759 CALL zlacgv(nr-p+1, v(p,p), 1 )
1761 v(nr,nr)=conjg(v(nr,nr))
1778 CALL zgeqp3( n, nr, v, ldv, iwork(n+1), cwork(n+1),
1779 $ cwork(2*n+1), lwork-2*n, rwork, ierr )
1785 DO 3968 q = 1, p - 1
1786 ctemp=dcmplx(xsc*min(abs(v(p,p)),abs(v(q,q))),
1788 IF ( abs(v(q,p)) .LE. temp1 )
1795 CALL zlacpy(
'A', n, nr, v, ldv, cwork(2*n+1), n )
1800 DO 8971 q = 1, p - 1
1801 ctemp=dcmplx(xsc*min(abs(v(p,p)),abs(v(q,q))),
1808 CALL zlaset(
'L',nr-1,nr-1,czero,czero,v(2,1),ldv )
1811 CALL zgelqf( nr, nr, v, ldv, cwork(2*n+n*nr+1),
1812 $ cwork(2*n+n*nr+nr+1), lwork-2*n-n*nr-nr, ierr )
1814 CALL zlacpy(
'L',nr,nr,v,ldv,cwork(2*n+n*nr+nr+1),nr )
1816 temp1 = dznrm2( p, cwork(2*n+n*nr+nr+p), nr )
1817 CALL zdscal( p, one/temp1, cwork(2*n+n*nr+nr+p), nr )
1819 CALL zpocon(
'L',nr,cwork(2*n+n*nr+nr+1),nr,one,temp1,
1820 $ cwork(2*n+n*nr+nr+nr*nr+1),rwork,ierr )
1821 condr2 = one / sqrt(temp1)
1824 IF ( condr2 .GE. cond_ok )
THEN
1829 CALL zlacpy(
'U', nr, nr, v, ldv, cwork(2*n+1), n )
1839 ctemp = xsc * v(q,q)
1840 DO 4969 p = 1, q - 1
1846 CALL zlaset(
'U', nr-1,nr-1, czero,czero, v(1,2), ldv )
1855 IF ( condr1 .LT. cond_ok )
THEN
1857 CALL zgesvj(
'L',
'U',
'N',nr,nr,v,ldv,sva,nr,u, ldu,
1858 $ cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,rwork,
1861 numrank = nint(rwork(2))
1863 CALL zcopy( nr, v(1,p), 1, u(1,p), 1 )
1864 CALL zdscal( nr, sva(p), v(1,p), 1 )
1869 IF ( nr .EQ. n )
THEN
1874 CALL ztrsm(
'L',
'U',
'N',
'N', nr,nr,cone, a,lda, v,ldv)
1880 CALL ztrsm(
'L',
'U',
'C',
'N',nr,nr,cone,cwork(2*n+1),
1882 IF ( nr .LT. n )
THEN
1883 CALL zlaset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv)
1884 CALL zlaset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv)
1885 CALL zlaset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1887 CALL zunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
1888 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr)
1891 ELSE IF ( condr2 .LT. cond_ok )
THEN
1897 CALL zgesvj(
'L',
'U',
'N', nr, nr, v, ldv, sva, nr, u,
1898 $ ldu, cwork(2*n+n*nr+nr+1), lwork-2*n-n*nr-nr,
1899 $ rwork, lrwork, info )
1901 numrank = nint(rwork(2))
1903 CALL zcopy( nr, v(1,p), 1, u(1,p), 1 )
1904 CALL zdscal( nr, sva(p), u(1,p), 1 )
1906 CALL ztrsm(
'L',
'U',
'N',
'N',nr,nr,cone,cwork(2*n+1),n,
1911 cwork(2*n+n*nr+nr+iwork(n+p)) = u(p,q)
1914 u(p,q) = cwork(2*n+n*nr+nr+p)
1917 IF ( nr .LT. n )
THEN
1918 CALL zlaset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv )
1919 CALL zlaset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv )
1920 CALL zlaset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1922 CALL zunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
1923 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
1936 CALL zgesvj(
'L',
'U',
'V', nr, nr, v, ldv, sva, nr, u,
1937 $ ldu, cwork(2*n+n*nr+nr+1), lwork-2*n-n*nr-nr,
1938 $ rwork, lrwork, info )
1940 numrank = nint(rwork(2))
1941 IF ( nr .LT. n )
THEN
1942 CALL zlaset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv )
1943 CALL zlaset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv )
1944 CALL zlaset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv)
1946 CALL zunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
1947 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
1949 CALL zunmlq(
'L',
'C', nr, nr, nr, cwork(2*n+1), n,
1950 $ cwork(2*n+n*nr+1), u, ldu, cwork(2*n+n*nr+nr+1),
1951 $ lwork-2*n-n*nr-nr, ierr )
1954 cwork(2*n+n*nr+nr+iwork(n+p)) = u(p,q)
1957 u(p,q) = cwork(2*n+n*nr+nr+p)
1967 temp1 = sqrt(dble(n)) * epsln
1970 cwork(2*n+n*nr+nr+iwork(p)) = v(p,q)
1973 v(p,q) = cwork(2*n+n*nr+nr+p)
1975 xsc = one / dznrm2( n, v(1,q), 1 )
1976 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
1977 $
CALL zdscal( n, xsc, v(1,q), 1 )
1981 IF ( nr .LT. m )
THEN
1982 CALL zlaset(
'A', m-nr, nr, czero, czero, u(nr+1,1), ldu)
1983 IF ( nr .LT. n1 )
THEN
1984 CALL zlaset(
'A',nr,n1-nr,czero,czero,u(1,nr+1),ldu)
1985 CALL zlaset(
'A',m-nr,n1-nr,czero,cone,
1993 CALL zunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
1994 $ ldu, cwork(n+1), lwork-n, ierr )
1997 temp1 = sqrt(dble(m)) * epsln
1999 xsc = one / dznrm2( m, u(1,p), 1 )
2000 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2001 $
CALL zdscal( m, xsc, u(1,p), 1 )
2008 $
CALL zlaswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2015 CALL zlacpy(
'U', n, n, a, lda, cwork(n+1), n )
2019 ctemp = xsc * cwork( n + (p-1)*n + p )
2020 DO 5971 q = 1, p - 1
2023 cwork(n+(q-1)*n+p)=-ctemp
2027 CALL zlaset(
'L',n-1,n-1,czero,czero,cwork(n+2),n )
2030 CALL zgesvj(
'U',
'U',
'N', n, n, cwork(n+1), n, sva,
2031 $ n, u, ldu, cwork(n+n*n+1), lwork-n-n*n, rwork, lrwork,
2035 numrank = nint(rwork(2))
2037 CALL zcopy( n, cwork(n+(p-1)*n+1), 1, u(1,p), 1 )
2038 CALL zdscal( n, sva(p), cwork(n+(p-1)*n+1), 1 )
2041 CALL ztrsm(
'L',
'U',
'N',
'N', n, n,
2042 $ cone, a, lda, cwork(n+1), n )
2044 CALL zcopy( n, cwork(n+p), n, v(iwork(p),1), ldv )
2046 temp1 = sqrt(dble(n))*epsln
2048 xsc = one / dznrm2( n, v(1,p), 1 )
2049 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2050 $
CALL zdscal( n, xsc, v(1,p), 1 )
2055 IF ( n .LT. m )
THEN
2056 CALL zlaset(
'A', m-n, n, czero, czero, u(n+1,1), ldu )
2057 IF ( n .LT. n1 )
THEN
2058 CALL zlaset(
'A',n, n1-n, czero, czero, u(1,n+1),ldu)
2059 CALL zlaset(
'A',m-n,n1-n, czero, cone,u(n+1,n+1),ldu)
2062 CALL zunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2063 $ ldu, cwork(n+1), lwork-n, ierr )
2064 temp1 = sqrt(dble(m))*epsln
2066 xsc = one / dznrm2( m, u(1,p), 1 )
2067 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2068 $
CALL zdscal( m, xsc, u(1,p), 1 )
2072 $
CALL zlaswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2092 CALL zcopy( n-p+1, a(p,p), lda, v(p,p), 1 )
2093 CALL zlacgv( n-p+1, v(p,p), 1 )
2097 xsc = sqrt(small/epsln)
2099 ctemp = dcmplx(xsc*abs( v(q,q) ),zero)
2101 IF ( ( p .GT. q ) .AND. ( abs(v(p,q)) .LE. temp1 )
2102 $ .OR. ( p .LT. q ) )
2105 IF ( p .LT. q ) v(p,q) = - v(p,q)
2109 CALL zlaset(
'U', nr-1, nr-1, czero, czero, v(1,2), ldv )
2112 CALL zgeqrf( n, nr, v, ldv, cwork(n+1), cwork(2*n+1),
2114 CALL zlacpy(
'L', n, nr, v, ldv, cwork(2*n+1), n )
2117 CALL zcopy( nr-p+1, v(p,p), ldv, u(p,p), 1 )
2118 CALL zlacgv( nr-p+1, u(p,p), 1 )
2122 xsc = sqrt(small/epsln)
2124 DO 9971 p = 1, q - 1
2125 ctemp = dcmplx(xsc * min(abs(u(p,p)),abs(u(q,q))),
2132 CALL zlaset(
'U', nr-1, nr-1, czero, czero, u(1,2), ldu )
2135 CALL zgesvj(
'L',
'U',
'V', nr, nr, u, ldu, sva,
2136 $ n, v, ldv, cwork(2*n+n*nr+1), lwork-2*n-n*nr,
2137 $ rwork, lrwork, info )
2139 numrank = nint(rwork(2))
2141 IF ( nr .LT. n )
THEN
2142 CALL zlaset(
'A',n-nr,nr,czero,czero,v(nr+1,1),ldv )
2143 CALL zlaset(
'A',nr,n-nr,czero,czero,v(1,nr+1),ldv )
2144 CALL zlaset(
'A',n-nr,n-nr,czero,cone,v(nr+1,nr+1),ldv )
2147 CALL zunmqr(
'L',
'N',n,n,nr,cwork(2*n+1),n,cwork(n+1),
2148 $ v,ldv,cwork(2*n+n*nr+nr+1),lwork-2*n-n*nr-nr,ierr )
2154 temp1 = sqrt(dble(n)) * epsln
2157 cwork(2*n+n*nr+nr+iwork(p)) = v(p,q)
2160 v(p,q) = cwork(2*n+n*nr+nr+p)
2162 xsc = one / dznrm2( n, v(1,q), 1 )
2163 IF ( (xsc .LT. (one-temp1)) .OR. (xsc .GT. (one+temp1)) )
2164 $
CALL zdscal( n, xsc, v(1,q), 1 )
2170 IF ( nr .LT. m )
THEN
2171 CALL zlaset(
'A', m-nr, nr, czero, czero, u(nr+1,1), ldu )
2172 IF ( nr .LT. n1 )
THEN
2173 CALL zlaset(
'A',nr, n1-nr, czero, czero, u(1,nr+1),ldu)
2174 CALL zlaset(
'A',m-nr,n1-nr, czero, cone,u(nr+1,nr+1),ldu)
2178 CALL zunmqr(
'L',
'N', m, n1, n, a, lda, cwork, u,
2179 $ ldu, cwork(n+1), lwork-n, ierr )
2182 $
CALL zlaswp( n1, u, ldu, 1, m-1, iwork(iwoff+1), -1 )
2189 CALL zswap( n, u(1,p), 1, v(1,p), 1 )
2198 IF ( uscal2 .LE. (big/sva(1))*uscal1 )
THEN
2199 CALL dlascl(
'G', 0, 0, uscal1, uscal2, nr, 1, sva, n, ierr )
2204 IF ( nr .LT. n )
THEN
2210 rwork(1) = uscal2 * scalem
2212 IF ( errest ) rwork(3) = sconda
2213 IF ( lsvec .AND. rsvec )
THEN