234 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
238 DOUBLE PRECISION RWORK( * ), S( * )
239 COMPLEX*16 A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
246 COMPLEX*16 CZERO, CONE
247 parameter( czero = ( 0.0d+0, 0.0d+0 ),
248 $ cone = ( 1.0d+0, 0.0d+0 ) )
249 DOUBLE PRECISION ZERO, ONE
250 parameter( zero = 0.0d+0, one = 1.0d+0 )
253 LOGICAL LQUERY, WNTQA, WNTQAS, WNTQN, WNTQO, WNTQS
254 INTEGER BLK, CHUNK, I, IE, IERR, IL, IR, IRU, IRVT,
255 $ ISCL, ITAU, ITAUP, ITAUQ, IU, IVT, LDWKVT,
256 $ LDWRKL, LDWRKR, LDWRKU, MAXWRK, MINMN, MINWRK,
257 $ MNTHR1, MNTHR2, NRWORK, NWORK, WRKBL
258 INTEGER LWORK_ZGEBRD_MN, LWORK_ZGEBRD_MM,
259 $ LWORK_ZGEBRD_NN, LWORK_ZGELQF_MN,
261 $ LWORK_ZUNGBR_P_MN, LWORK_ZUNGBR_P_NN,
262 $ LWORK_ZUNGBR_Q_MN, LWORK_ZUNGBR_Q_MM,
263 $ LWORK_ZUNGLQ_MN, LWORK_ZUNGLQ_NN,
264 $ LWORK_ZUNGQR_MM, LWORK_ZUNGQR_MN,
265 $ LWORK_ZUNMBR_PRC_MM, LWORK_ZUNMBR_QLN_MM,
266 $ LWORK_ZUNMBR_PRC_MN, LWORK_ZUNMBR_QLN_MN,
267 $ LWORK_ZUNMBR_PRC_NN, LWORK_ZUNMBR_QLN_NN
268 DOUBLE PRECISION ANRM, BIGNUM, EPS, SMLNUM
272 DOUBLE PRECISION DUM( 1 )
281 LOGICAL LSAME, DISNAN
282 DOUBLE PRECISION DLAMCH, ZLANGE
286 INTRINSIC int, max, min, sqrt
294 mnthr1 = int( minmn*17.0d0 / 9.0d0 )
295 mnthr2 = int( minmn*5.0d0 / 3.0d0 )
296 wntqa =
lsame( jobz,
'A' )
297 wntqs =
lsame( jobz,
'S' )
298 wntqas = wntqa .OR. wntqs
299 wntqo =
lsame( jobz,
'O' )
300 wntqn =
lsame( jobz,
'N' )
301 lquery = ( lwork.EQ.-1 )
305 IF( .NOT.( wntqa .OR. wntqs .OR. wntqo .OR. wntqn ) )
THEN
307 ELSE IF( m.LT.0 )
THEN
309 ELSE IF( n.LT.0 )
THEN
311 ELSE IF( lda.LT.max( 1, m ) )
THEN
313 ELSE IF( ldu.LT.1 .OR. ( wntqas .AND. ldu.LT.m ) .OR.
314 $ ( wntqo .AND. m.LT.n .AND. ldu.LT.m ) )
THEN
316 ELSE IF( ldvt.LT.1 .OR. ( wntqa .AND. ldvt.LT.n ) .OR.
317 $ ( wntqs .AND. ldvt.LT.minmn ) .OR.
318 $ ( wntqo .AND. m.GE.n .AND. ldvt.LT.n ) )
THEN
333 IF( m.GE.n .AND. minmn.GT.0 )
THEN
342 CALL zgebrd( m, n, cdum(1), m, dum(1), dum(1), cdum(1),
343 $ cdum(1), cdum(1), -1, ierr )
344 lwork_zgebrd_mn = int( cdum(1) )
346 CALL zgebrd( n, n, cdum(1), n, dum(1), dum(1), cdum(1),
347 $ cdum(1), cdum(1), -1, ierr )
348 lwork_zgebrd_nn = int( cdum(1) )
350 CALL zgeqrf( m, n, cdum(1), m, cdum(1), cdum(1), -1, ierr )
351 lwork_zgeqrf_mn = int( cdum(1) )
353 CALL zungbr(
'P', n, n, n, cdum(1), n, cdum(1), cdum(1),
355 lwork_zungbr_p_nn = int( cdum(1) )
357 CALL zungbr(
'Q', m, m, n, cdum(1), m, cdum(1), cdum(1),
359 lwork_zungbr_q_mm = int( cdum(1) )
361 CALL zungbr(
'Q', m, n, n, cdum(1), m, cdum(1), cdum(1),
363 lwork_zungbr_q_mn = int( cdum(1) )
365 CALL zungqr( m, m, n, cdum(1), m, cdum(1), cdum(1),
367 lwork_zungqr_mm = int( cdum(1) )
369 CALL zungqr( m, n, n, cdum(1), m, cdum(1), cdum(1),
371 lwork_zungqr_mn = int( cdum(1) )
373 CALL zunmbr(
'P',
'R',
'C', n, n, n, cdum(1), n, cdum(1),
374 $ cdum(1), n, cdum(1), -1, ierr )
375 lwork_zunmbr_prc_nn = int( cdum(1) )
377 CALL zunmbr(
'Q',
'L',
'N', m, m, n, cdum(1), m, cdum(1),
378 $ cdum(1), m, cdum(1), -1, ierr )
379 lwork_zunmbr_qln_mm = int( cdum(1) )
381 CALL zunmbr(
'Q',
'L',
'N', m, n, n, cdum(1), m, cdum(1),
382 $ cdum(1), m, cdum(1), -1, ierr )
383 lwork_zunmbr_qln_mn = int( cdum(1) )
385 CALL zunmbr(
'Q',
'L',
'N', n, n, n, cdum(1), n, cdum(1),
386 $ cdum(1), n, cdum(1), -1, ierr )
387 lwork_zunmbr_qln_nn = int( cdum(1) )
389 IF( m.GE.mnthr1 )
THEN
394 maxwrk = n + lwork_zgeqrf_mn
395 maxwrk = max( maxwrk, 2*n + lwork_zgebrd_nn )
397 ELSE IF( wntqo )
THEN
401 wrkbl = n + lwork_zgeqrf_mn
402 wrkbl = max( wrkbl, n + lwork_zungqr_mn )
403 wrkbl = max( wrkbl, 2*n + lwork_zgebrd_nn )
404 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_qln_nn )
405 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_prc_nn )
406 maxwrk = m*n + n*n + wrkbl
408 ELSE IF( wntqs )
THEN
412 wrkbl = n + lwork_zgeqrf_mn
413 wrkbl = max( wrkbl, n + lwork_zungqr_mn )
414 wrkbl = max( wrkbl, 2*n + lwork_zgebrd_nn )
415 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_qln_nn )
416 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_prc_nn )
419 ELSE IF( wntqa )
THEN
423 wrkbl = n + lwork_zgeqrf_mn
424 wrkbl = max( wrkbl, n + lwork_zungqr_mm )
425 wrkbl = max( wrkbl, 2*n + lwork_zgebrd_nn )
426 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_qln_nn )
427 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_prc_nn )
429 minwrk = n*n + max( 3*n, n + m )
431 ELSE IF( m.GE.mnthr2 )
THEN
435 maxwrk = 2*n + lwork_zgebrd_mn
439 maxwrk = max( maxwrk, 2*n + lwork_zungbr_p_nn )
440 maxwrk = max( maxwrk, 2*n + lwork_zungbr_q_mn )
441 maxwrk = maxwrk + m*n
442 minwrk = minwrk + n*n
443 ELSE IF( wntqs )
THEN
445 maxwrk = max( maxwrk, 2*n + lwork_zungbr_p_nn )
446 maxwrk = max( maxwrk, 2*n + lwork_zungbr_q_mn )
447 ELSE IF( wntqa )
THEN
449 maxwrk = max( maxwrk, 2*n + lwork_zungbr_p_nn )
450 maxwrk = max( maxwrk, 2*n + lwork_zungbr_q_mm )
456 maxwrk = 2*n + lwork_zgebrd_mn
460 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_prc_nn )
461 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_qln_mn )
462 maxwrk = maxwrk + m*n
463 minwrk = minwrk + n*n
464 ELSE IF( wntqs )
THEN
466 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_qln_mn )
467 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_prc_nn )
468 ELSE IF( wntqa )
THEN
470 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_qln_mm )
471 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_prc_nn )
474 ELSE IF( minmn.GT.0 )
THEN
483 CALL zgebrd( m, n, cdum(1), m, dum(1), dum(1), cdum(1),
484 $ cdum(1), cdum(1), -1, ierr )
485 lwork_zgebrd_mn = int( cdum(1) )
487 CALL zgebrd( m, m, cdum(1), m, dum(1), dum(1), cdum(1),
488 $ cdum(1), cdum(1), -1, ierr )
489 lwork_zgebrd_mm = int( cdum(1) )
491 CALL zgelqf( m, n, cdum(1), m, cdum(1), cdum(1), -1, ierr )
492 lwork_zgelqf_mn = int( cdum(1) )
494 CALL zungbr(
'P', m, n, m, cdum(1), m, cdum(1), cdum(1),
496 lwork_zungbr_p_mn = int( cdum(1) )
498 CALL zungbr(
'P', n, n, m, cdum(1), n, cdum(1), cdum(1),
500 lwork_zungbr_p_nn = int( cdum(1) )
502 CALL zungbr(
'Q', m, m, n, cdum(1), m, cdum(1), cdum(1),
504 lwork_zungbr_q_mm = int( cdum(1) )
506 CALL zunglq( m, n, m, cdum(1), m, cdum(1), cdum(1),
508 lwork_zunglq_mn = int( cdum(1) )
510 CALL zunglq( n, n, m, cdum(1), n, cdum(1), cdum(1),
512 lwork_zunglq_nn = int( cdum(1) )
514 CALL zunmbr(
'P',
'R',
'C', m, m, m, cdum(1), m, cdum(1),
515 $ cdum(1), m, cdum(1), -1, ierr )
516 lwork_zunmbr_prc_mm = int( cdum(1) )
518 CALL zunmbr(
'P',
'R',
'C', m, n, m, cdum(1), m, cdum(1),
519 $ cdum(1), m, cdum(1), -1, ierr )
520 lwork_zunmbr_prc_mn = int( cdum(1) )
522 CALL zunmbr(
'P',
'R',
'C', n, n, m, cdum(1), n, cdum(1),
523 $ cdum(1), n, cdum(1), -1, ierr )
524 lwork_zunmbr_prc_nn = int( cdum(1) )
526 CALL zunmbr(
'Q',
'L',
'N', m, m, m, cdum(1), m, cdum(1),
527 $ cdum(1), m, cdum(1), -1, ierr )
528 lwork_zunmbr_qln_mm = int( cdum(1) )
530 IF( n.GE.mnthr1 )
THEN
535 maxwrk = m + lwork_zgelqf_mn
536 maxwrk = max( maxwrk, 2*m + lwork_zgebrd_mm )
538 ELSE IF( wntqo )
THEN
542 wrkbl = m + lwork_zgelqf_mn
543 wrkbl = max( wrkbl, m + lwork_zunglq_mn )
544 wrkbl = max( wrkbl, 2*m + lwork_zgebrd_mm )
545 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_qln_mm )
546 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_prc_mm )
547 maxwrk = m*n + m*m + wrkbl
549 ELSE IF( wntqs )
THEN
553 wrkbl = m + lwork_zgelqf_mn
554 wrkbl = max( wrkbl, m + lwork_zunglq_mn )
555 wrkbl = max( wrkbl, 2*m + lwork_zgebrd_mm )
556 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_qln_mm )
557 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_prc_mm )
560 ELSE IF( wntqa )
THEN
564 wrkbl = m + lwork_zgelqf_mn
565 wrkbl = max( wrkbl, m + lwork_zunglq_nn )
566 wrkbl = max( wrkbl, 2*m + lwork_zgebrd_mm )
567 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_qln_mm )
568 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_prc_mm )
570 minwrk = m*m + max( 3*m, m + n )
572 ELSE IF( n.GE.mnthr2 )
THEN
576 maxwrk = 2*m + lwork_zgebrd_mn
580 maxwrk = max( maxwrk, 2*m + lwork_zungbr_q_mm )
581 maxwrk = max( maxwrk, 2*m + lwork_zungbr_p_mn )
582 maxwrk = maxwrk + m*n
583 minwrk = minwrk + m*m
584 ELSE IF( wntqs )
THEN
586 maxwrk = max( maxwrk, 2*m + lwork_zungbr_q_mm )
587 maxwrk = max( maxwrk, 2*m + lwork_zungbr_p_mn )
588 ELSE IF( wntqa )
THEN
590 maxwrk = max( maxwrk, 2*m + lwork_zungbr_q_mm )
591 maxwrk = max( maxwrk, 2*m + lwork_zungbr_p_nn )
597 maxwrk = 2*m + lwork_zgebrd_mn
601 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_qln_mm )
602 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_prc_mn )
603 maxwrk = maxwrk + m*n
604 minwrk = minwrk + m*m
605 ELSE IF( wntqs )
THEN
607 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_qln_mm )
608 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_prc_mn )
609 ELSE IF( wntqa )
THEN
611 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_qln_mm )
612 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_prc_nn )
616 maxwrk = max( maxwrk, minwrk )
620 IF( lwork.LT.minwrk .AND. .NOT. lquery )
THEN
626 CALL xerbla(
'ZGESDD', -info )
628 ELSE IF( lquery )
THEN
634 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
641 smlnum = sqrt(
dlamch(
'S' ) ) / eps
642 bignum = one / smlnum
646 anrm =
zlange(
'M', m, n, a, lda, dum )
652 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
654 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
655 ELSE IF( anrm.GT.bignum )
THEN
657 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
666 IF( m.GE.mnthr1 )
THEN
681 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
682 $ lwork-nwork+1, ierr )
686 CALL zlaset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
698 CALL zgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
699 $ work( itaup ), work( nwork ), lwork-nwork+1,
707 CALL dbdsdc(
'U',
'N', n, s, rwork( ie ), dum,1,dum,1,
708 $ dum, idum, rwork( nrwork ), iwork, info )
710 ELSE IF( wntqo )
THEN
722 IF( lwork .GE. m*n + n*n + 3*n )
THEN
728 ldwrkr = ( lwork - n*n - 3*n ) / n
738 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
739 $ lwork-nwork+1, ierr )
743 CALL zlacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
744 CALL zlaset(
'L', n-1, n-1, czero, czero, work( ir+1 ),
752 CALL zungqr( m, n, n, a, lda, work( itau ),
753 $ work( nwork ), lwork-nwork+1, ierr )
764 CALL zgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
765 $ work( itauq ), work( itaup ), work( nwork ),
766 $ lwork-nwork+1, ierr )
777 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
778 $ n, rwork( irvt ), n, dum, idum,
779 $ rwork( nrwork ), iwork, info )
787 CALL zlacp2(
'F', n, n, rwork( iru ), n, work( iu ),
789 CALL zunmbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
790 $ work( itauq ), work( iu ), ldwrku,
791 $ work( nwork ), lwork-nwork+1, ierr )
799 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
800 CALL zunmbr(
'P',
'R',
'C', n, n, n, work( ir ), ldwrkr,
801 $ work( itaup ), vt, ldvt, work( nwork ),
802 $ lwork-nwork+1, ierr )
810 DO 10 i = 1, m, ldwrkr
811 chunk = min( m-i+1, ldwrkr )
812 CALL zgemm(
'N',
'N', chunk, n, n, cone, a( i, 1 ),
813 $ lda, work( iu ), ldwrku, czero,
814 $ work( ir ), ldwrkr )
815 CALL zlacpy(
'F', chunk, n, work( ir ), ldwrkr,
819 ELSE IF( wntqs )
THEN
838 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
839 $ lwork-nwork+1, ierr )
843 CALL zlacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
844 CALL zlaset(
'L', n-1, n-1, czero, czero, work( ir+1 ),
852 CALL zungqr( m, n, n, a, lda, work( itau ),
853 $ work( nwork ), lwork-nwork+1, ierr )
864 CALL zgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
865 $ work( itauq ), work( itaup ), work( nwork ),
866 $ lwork-nwork+1, ierr )
877 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
878 $ n, rwork( irvt ), n, dum, idum,
879 $ rwork( nrwork ), iwork, info )
887 CALL zlacp2(
'F', n, n, rwork( iru ), n, u, ldu )
888 CALL zunmbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
889 $ work( itauq ), u, ldu, work( nwork ),
890 $ lwork-nwork+1, ierr )
898 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
899 CALL zunmbr(
'P',
'R',
'C', n, n, n, work( ir ), ldwrkr,
900 $ work( itaup ), vt, ldvt, work( nwork ),
901 $ lwork-nwork+1, ierr )
908 CALL zlacpy(
'F', n, n, u, ldu, work( ir ), ldwrkr )
909 CALL zgemm(
'N',
'N', m, n, n, cone, a, lda, work( ir ),
910 $ ldwrkr, czero, u, ldu )
912 ELSE IF( wntqa )
THEN
931 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
932 $ lwork-nwork+1, ierr )
933 CALL zlacpy(
'L', m, n, a, lda, u, ldu )
940 CALL zungqr( m, m, n, u, ldu, work( itau ),
941 $ work( nwork ), lwork-nwork+1, ierr )
945 CALL zlaset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
957 CALL zgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
958 $ work( itaup ), work( nwork ), lwork-nwork+1,
970 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
971 $ n, rwork( irvt ), n, dum, idum,
972 $ rwork( nrwork ), iwork, info )
980 CALL zlacp2(
'F', n, n, rwork( iru ), n, work( iu ),
982 CALL zunmbr(
'Q',
'L',
'N', n, n, n, a, lda,
983 $ work( itauq ), work( iu ), ldwrku,
984 $ work( nwork ), lwork-nwork+1, ierr )
992 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
993 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
994 $ work( itaup ), vt, ldvt, work( nwork ),
995 $ lwork-nwork+1, ierr )
1002 CALL zgemm(
'N',
'N', m, n, n, cone, u, ldu, work( iu ),
1003 $ ldwrku, czero, a, lda )
1007 CALL zlacpy(
'F', m, n, a, lda, u, ldu )
1011 ELSE IF( m.GE.mnthr2 )
THEN
1030 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1031 $ work( itaup ), work( nwork ), lwork-nwork+1,
1040 CALL dbdsdc(
'U',
'N', n, s, rwork( ie ), dum, 1,dum,1,
1041 $ dum, idum, rwork( nrwork ), iwork, info )
1042 ELSE IF( wntqo )
THEN
1054 CALL zlacpy(
'U', n, n, a, lda, vt, ldvt )
1055 CALL zungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1056 $ work( nwork ), lwork-nwork+1, ierr )
1063 CALL zungbr(
'Q', m, n, n, a, lda, work( itauq ),
1064 $ work( nwork ), lwork-nwork+1, ierr )
1066 IF( lwork .GE. m*n + 3*n )
THEN
1075 ldwrku = ( lwork - 3*n ) / n
1077 nwork = iu + ldwrku*n
1085 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1086 $ n, rwork( irvt ), n, dum, idum,
1087 $ rwork( nrwork ), iwork, info )
1094 CALL zlarcm( n, n, rwork( irvt ), n, vt, ldvt,
1095 $ work( iu ), ldwrku, rwork( nrwork ) )
1096 CALL zlacpy(
'F', n, n, work( iu ), ldwrku, vt, ldvt )
1106 DO 20 i = 1, m, ldwrku
1107 chunk = min( m-i+1, ldwrku )
1108 CALL zlacrm( chunk, n, a( i, 1 ), lda, rwork( iru ),
1109 $ n, work( iu ), ldwrku, rwork( nrwork ) )
1110 CALL zlacpy(
'F', chunk, n, work( iu ), ldwrku,
1114 ELSE IF( wntqs )
THEN
1122 CALL zlacpy(
'U', n, n, a, lda, vt, ldvt )
1123 CALL zungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1124 $ work( nwork ), lwork-nwork+1, ierr )
1131 CALL zlacpy(
'L', m, n, a, lda, u, ldu )
1132 CALL zungbr(
'Q', m, n, n, u, ldu, work( itauq ),
1133 $ work( nwork ), lwork-nwork+1, ierr )
1144 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1145 $ n, rwork( irvt ), n, dum, idum,
1146 $ rwork( nrwork ), iwork, info )
1153 CALL zlarcm( n, n, rwork( irvt ), n, vt, ldvt, a, lda,
1155 CALL zlacpy(
'F', n, n, a, lda, vt, ldvt )
1163 CALL zlacrm( m, n, u, ldu, rwork( iru ), n, a, lda,
1165 CALL zlacpy(
'F', m, n, a, lda, u, ldu )
1174 CALL zlacpy(
'U', n, n, a, lda, vt, ldvt )
1175 CALL zungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1176 $ work( nwork ), lwork-nwork+1, ierr )
1183 CALL zlacpy(
'L', m, n, a, lda, u, ldu )
1184 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1185 $ work( nwork ), lwork-nwork+1, ierr )
1196 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1197 $ n, rwork( irvt ), n, dum, idum,
1198 $ rwork( nrwork ), iwork, info )
1205 CALL zlarcm( n, n, rwork( irvt ), n, vt, ldvt, a, lda,
1207 CALL zlacpy(
'F', n, n, a, lda, vt, ldvt )
1215 CALL zlacrm( m, n, u, ldu, rwork( iru ), n, a, lda,
1217 CALL zlacpy(
'F', m, n, a, lda, u, ldu )
1239 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1240 $ work( itaup ), work( nwork ), lwork-nwork+1,
1249 CALL dbdsdc(
'U',
'N', n, s, rwork( ie ), dum,1,dum,1,
1250 $ dum, idum, rwork( nrwork ), iwork, info )
1251 ELSE IF( wntqo )
THEN
1256 IF( lwork .GE. m*n + 3*n )
THEN
1265 ldwrku = ( lwork - 3*n ) / n
1267 nwork = iu + ldwrku*n
1276 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1277 $ n, rwork( irvt ), n, dum, idum,
1278 $ rwork( nrwork ), iwork, info )
1286 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1287 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1288 $ work( itaup ), vt, ldvt, work( nwork ),
1289 $ lwork-nwork+1, ierr )
1291 IF( lwork .GE. m*n + 3*n )
THEN
1301 CALL zlaset(
'F', m, n, czero, czero, work( iu ),
1303 CALL zlacp2(
'F', n, n, rwork( iru ), n, work( iu ),
1305 CALL zunmbr(
'Q',
'L',
'N', m, n, n, a, lda,
1306 $ work( itauq ), work( iu ), ldwrku,
1307 $ work( nwork ), lwork-nwork+1, ierr )
1308 CALL zlacpy(
'F', m, n, work( iu ), ldwrku, a, lda )
1317 CALL zungbr(
'Q', m, n, n, a, lda, work( itauq ),
1318 $ work( nwork ), lwork-nwork+1, ierr )
1328 DO 30 i = 1, m, ldwrku
1329 chunk = min( m-i+1, ldwrku )
1330 CALL zlacrm( chunk, n, a( i, 1 ), lda,
1331 $ rwork( iru ), n, work( iu ), ldwrku,
1333 CALL zlacpy(
'F', chunk, n, work( iu ), ldwrku,
1338 ELSE IF( wntqs )
THEN
1350 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1351 $ n, rwork( irvt ), n, dum, idum,
1352 $ rwork( nrwork ), iwork, info )
1360 CALL zlaset(
'F', m, n, czero, czero, u, ldu )
1361 CALL zlacp2(
'F', n, n, rwork( iru ), n, u, ldu )
1362 CALL zunmbr(
'Q',
'L',
'N', m, n, n, a, lda,
1363 $ work( itauq ), u, ldu, work( nwork ),
1364 $ lwork-nwork+1, ierr )
1372 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1373 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1374 $ work( itaup ), vt, ldvt, work( nwork ),
1375 $ lwork-nwork+1, ierr )
1388 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1389 $ n, rwork( irvt ), n, dum, idum,
1390 $ rwork( nrwork ), iwork, info )
1394 CALL zlaset(
'F', m, m, czero, czero, u, ldu )
1396 CALL zlaset(
'F', m-n, m-n, czero, cone,
1397 $ u( n+1, n+1 ), ldu )
1406 CALL zlacp2(
'F', n, n, rwork( iru ), n, u, ldu )
1407 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
1408 $ work( itauq ), u, ldu, work( nwork ),
1409 $ lwork-nwork+1, ierr )
1417 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1418 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1419 $ work( itaup ), vt, ldvt, work( nwork ),
1420 $ lwork-nwork+1, ierr )
1431 IF( n.GE.mnthr1 )
THEN
1446 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1447 $ lwork-nwork+1, ierr )
1451 CALL zlaset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
1463 CALL zgebrd( m, m, a, lda, s, rwork( ie ), work( itauq ),
1464 $ work( itaup ), work( nwork ), lwork-nwork+1,
1472 CALL dbdsdc(
'U',
'N', m, s, rwork( ie ), dum,1,dum,1,
1473 $ dum, idum, rwork( nrwork ), iwork, info )
1475 ELSE IF( wntqo )
THEN
1487 IF( lwork .GE. m*n + m*m + 3*m )
THEN
1498 chunk = ( lwork - m*m - 3*m ) / m
1500 itau = il + ldwrkl*chunk
1508 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1509 $ lwork-nwork+1, ierr )
1513 CALL zlacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1514 CALL zlaset(
'U', m-1, m-1, czero, czero,
1515 $ work( il+ldwrkl ), ldwrkl )
1522 CALL zunglq( m, n, m, a, lda, work( itau ),
1523 $ work( nwork ), lwork-nwork+1, ierr )
1534 CALL zgebrd( m, m, work( il ), ldwrkl, s, rwork( ie ),
1535 $ work( itauq ), work( itaup ), work( nwork ),
1536 $ lwork-nwork+1, ierr )
1547 CALL dbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1548 $ m, rwork( irvt ), m, dum, idum,
1549 $ rwork( nrwork ), iwork, info )
1557 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1558 CALL zunmbr(
'Q',
'L',
'N', m, m, m, work( il ), ldwrkl,
1559 $ work( itauq ), u, ldu, work( nwork ),
1560 $ lwork-nwork+1, ierr )
1568 CALL zlacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
1570 CALL zunmbr(
'P',
'R',
'C', m, m, m, work( il ), ldwrkl,
1571 $ work( itaup ), work( ivt ), ldwkvt,
1572 $ work( nwork ), lwork-nwork+1, ierr )
1580 DO 40 i = 1, n, chunk
1581 blk = min( n-i+1, chunk )
1582 CALL zgemm(
'N',
'N', m, blk, m, cone, work( ivt ), m,
1583 $ a( 1, i ), lda, czero, work( il ),
1585 CALL zlacpy(
'F', m, blk, work( il ), ldwrkl,
1589 ELSE IF( wntqs )
THEN
1600 itau = il + ldwrkl*m
1608 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1609 $ lwork-nwork+1, ierr )
1613 CALL zlacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1614 CALL zlaset(
'U', m-1, m-1, czero, czero,
1615 $ work( il+ldwrkl ), ldwrkl )
1622 CALL zunglq( m, n, m, a, lda, work( itau ),
1623 $ work( nwork ), lwork-nwork+1, ierr )
1634 CALL zgebrd( m, m, work( il ), ldwrkl, s, rwork( ie ),
1635 $ work( itauq ), work( itaup ), work( nwork ),
1636 $ lwork-nwork+1, ierr )
1647 CALL dbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1648 $ m, rwork( irvt ), m, dum, idum,
1649 $ rwork( nrwork ), iwork, info )
1657 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1658 CALL zunmbr(
'Q',
'L',
'N', m, m, m, work( il ), ldwrkl,
1659 $ work( itauq ), u, ldu, work( nwork ),
1660 $ lwork-nwork+1, ierr )
1668 CALL zlacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
1669 CALL zunmbr(
'P',
'R',
'C', m, m, m, work( il ), ldwrkl,
1670 $ work( itaup ), vt, ldvt, work( nwork ),
1671 $ lwork-nwork+1, ierr )
1678 CALL zlacpy(
'F', m, m, vt, ldvt, work( il ), ldwrkl )
1679 CALL zgemm(
'N',
'N', m, n, m, cone, work( il ), ldwrkl,
1680 $ a, lda, czero, vt, ldvt )
1682 ELSE IF( wntqa )
THEN
1693 itau = ivt + ldwkvt*m
1701 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1702 $ lwork-nwork+1, ierr )
1703 CALL zlacpy(
'U', m, n, a, lda, vt, ldvt )
1710 CALL zunglq( n, n, m, vt, ldvt, work( itau ),
1711 $ work( nwork ), lwork-nwork+1, ierr )
1715 CALL zlaset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
1727 CALL zgebrd( m, m, a, lda, s, rwork( ie ), work( itauq ),
1728 $ work( itaup ), work( nwork ), lwork-nwork+1,
1740 CALL dbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1741 $ m, rwork( irvt ), m, dum, idum,
1742 $ rwork( nrwork ), iwork, info )
1750 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1751 CALL zunmbr(
'Q',
'L',
'N', m, m, m, a, lda,
1752 $ work( itauq ), u, ldu, work( nwork ),
1753 $ lwork-nwork+1, ierr )
1761 CALL zlacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
1763 CALL zunmbr(
'P',
'R',
'C', m, m, m, a, lda,
1764 $ work( itaup ), work( ivt ), ldwkvt,
1765 $ work( nwork ), lwork-nwork+1, ierr )
1772 CALL zgemm(
'N',
'N', m, n, m, cone, work( ivt ), ldwkvt,
1773 $ vt, ldvt, czero, a, lda )
1777 CALL zlacpy(
'F', m, n, a, lda, vt, ldvt )
1781 ELSE IF( n.GE.mnthr2 )
THEN
1800 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1801 $ work( itaup ), work( nwork ), lwork-nwork+1,
1811 CALL dbdsdc(
'L',
'N', m, s, rwork( ie ), dum,1,dum,1,
1812 $ dum, idum, rwork( nrwork ), iwork, info )
1813 ELSE IF( wntqo )
THEN
1825 CALL zlacpy(
'L', m, m, a, lda, u, ldu )
1826 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1827 $ work( nwork ), lwork-nwork+1, ierr )
1834 CALL zungbr(
'P', m, n, m, a, lda, work( itaup ),
1835 $ work( nwork ), lwork-nwork+1, ierr )
1838 IF( lwork .GE. m*n + 3*m )
THEN
1842 nwork = ivt + ldwkvt*n
1848 chunk = ( lwork - 3*m ) / m
1849 nwork = ivt + ldwkvt*chunk
1858 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1859 $ m, rwork( irvt ), m, dum, idum,
1860 $ rwork( nrwork ), iwork, info )
1867 CALL zlacrm( m, m, u, ldu, rwork( iru ), m, work( ivt ),
1868 $ ldwkvt, rwork( nrwork ) )
1869 CALL zlacpy(
'F', m, m, work( ivt ), ldwkvt, u, ldu )
1879 DO 50 i = 1, n, chunk
1880 blk = min( n-i+1, chunk )
1881 CALL zlarcm( m, blk, rwork( irvt ), m, a( 1, i ), lda,
1882 $ work( ivt ), ldwkvt, rwork( nrwork ) )
1883 CALL zlacpy(
'F', m, blk, work( ivt ), ldwkvt,
1886 ELSE IF( wntqs )
THEN
1894 CALL zlacpy(
'L', m, m, a, lda, u, ldu )
1895 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1896 $ work( nwork ), lwork-nwork+1, ierr )
1903 CALL zlacpy(
'U', m, n, a, lda, vt, ldvt )
1904 CALL zungbr(
'P', m, n, m, vt, ldvt, work( itaup ),
1905 $ work( nwork ), lwork-nwork+1, ierr )
1916 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1917 $ m, rwork( irvt ), m, dum, idum,
1918 $ rwork( nrwork ), iwork, info )
1925 CALL zlacrm( m, m, u, ldu, rwork( iru ), m, a, lda,
1927 CALL zlacpy(
'F', m, m, a, lda, u, ldu )
1935 CALL zlarcm( m, n, rwork( irvt ), m, vt, ldvt, a, lda,
1937 CALL zlacpy(
'F', m, n, a, lda, vt, ldvt )
1946 CALL zlacpy(
'L', m, m, a, lda, u, ldu )
1947 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1948 $ work( nwork ), lwork-nwork+1, ierr )
1955 CALL zlacpy(
'U', m, n, a, lda, vt, ldvt )
1956 CALL zungbr(
'P', n, n, m, vt, ldvt, work( itaup ),
1957 $ work( nwork ), lwork-nwork+1, ierr )
1968 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1969 $ m, rwork( irvt ), m, dum, idum,
1970 $ rwork( nrwork ), iwork, info )
1977 CALL zlacrm( m, m, u, ldu, rwork( iru ), m, a, lda,
1979 CALL zlacpy(
'F', m, m, a, lda, u, ldu )
1987 CALL zlarcm( m, n, rwork( irvt ), m, vt, ldvt, a, lda,
1989 CALL zlacpy(
'F', m, n, a, lda, vt, ldvt )
2011 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
2012 $ work( itaup ), work( nwork ), lwork-nwork+1,
2021 CALL dbdsdc(
'L',
'N', m, s, rwork( ie ), dum,1,dum,1,
2022 $ dum, idum, rwork( nrwork ), iwork, info )
2023 ELSE IF( wntqo )
THEN
2027 IF( lwork .GE. m*n + 3*m )
THEN
2031 CALL zlaset(
'F', m, n, czero, czero, work( ivt ),
2033 nwork = ivt + ldwkvt*n
2038 chunk = ( lwork - 3*m ) / m
2039 nwork = ivt + ldwkvt*chunk
2051 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2052 $ m, rwork( irvt ), m, dum, idum,
2053 $ rwork( nrwork ), iwork, info )
2061 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2062 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2063 $ work( itauq ), u, ldu, work( nwork ),
2064 $ lwork-nwork+1, ierr )
2066 IF( lwork .GE. m*n + 3*m )
THEN
2076 CALL zlacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
2078 CALL zunmbr(
'P',
'R',
'C', m, n, m, a, lda,
2079 $ work( itaup ), work( ivt ), ldwkvt,
2080 $ work( nwork ), lwork-nwork+1, ierr )
2081 CALL zlacpy(
'F', m, n, work( ivt ), ldwkvt, a, lda )
2090 CALL zungbr(
'P', m, n, m, a, lda, work( itaup ),
2091 $ work( nwork ), lwork-nwork+1, ierr )
2101 DO 60 i = 1, n, chunk
2102 blk = min( n-i+1, chunk )
2103 CALL zlarcm( m, blk, rwork( irvt ), m, a( 1, i ),
2104 $ lda, work( ivt ), ldwkvt,
2106 CALL zlacpy(
'F', m, blk, work( ivt ), ldwkvt,
2110 ELSE IF( wntqs )
THEN
2122 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2123 $ m, rwork( irvt ), m, dum, idum,
2124 $ rwork( nrwork ), iwork, info )
2132 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2133 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2134 $ work( itauq ), u, ldu, work( nwork ),
2135 $ lwork-nwork+1, ierr )
2143 CALL zlaset(
'F', m, n, czero, czero, vt, ldvt )
2144 CALL zlacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
2145 CALL zunmbr(
'P',
'R',
'C', m, n, m, a, lda,
2146 $ work( itaup ), vt, ldvt, work( nwork ),
2147 $ lwork-nwork+1, ierr )
2161 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2162 $ m, rwork( irvt ), m, dum, idum,
2163 $ rwork( nrwork ), iwork, info )
2171 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2172 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2173 $ work( itauq ), u, ldu, work( nwork ),
2174 $ lwork-nwork+1, ierr )
2178 CALL zlaset(
'F', n, n, czero, cone, vt, ldvt )
2186 CALL zlacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
2187 CALL zunmbr(
'P',
'R',
'C', n, n, m, a, lda,
2188 $ work( itaup ), vt, ldvt, work( nwork ),
2189 $ lwork-nwork+1, ierr )
2198 IF( iscl.EQ.1 )
THEN
2199 IF( anrm.GT.bignum )
2200 $
CALL dlascl(
'G', 0, 0, bignum, anrm, minmn, 1, s, minmn,
2202 IF( info.NE.0 .AND. anrm.GT.bignum )
2203 $
CALL dlascl(
'G', 0, 0, bignum, anrm, minmn-1, 1,
2204 $ rwork( ie ), minmn, ierr )
2205 IF( anrm.LT.smlnum )
2206 $
CALL dlascl(
'G', 0, 0, smlnum, anrm, minmn, 1, s, minmn,
2208 IF( info.NE.0 .AND. anrm.LT.smlnum )
2209 $
CALL dlascl(
'G', 0, 0, smlnum, anrm, minmn-1, 1,
2210 $ rwork( ie ), minmn, ierr )
double precision function dlamch(CMACH)
DLAMCH
logical function disnan(DIN)
DISNAN tests input for NaN.
subroutine dlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
DLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
subroutine dbdsdc(UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, IQ, WORK, IWORK, INFO)
DBDSDC
subroutine zgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
ZGEMM
subroutine zungbr(VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGBR
double precision function zlange(NORM, M, N, A, LDA, WORK)
ZLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine zgelqf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
ZGELQF
subroutine zgebrd(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO)
ZGEBRD
subroutine zlarcm(M, N, A, LDA, B, LDB, C, LDC, RWORK)
ZLARCM copies all or part of a real two-dimensional array to a complex array.
subroutine zlascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
ZLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine zlacpy(UPLO, M, N, A, LDA, B, LDB)
ZLACPY copies all or part of one two-dimensional array to another.
subroutine zlacp2(UPLO, M, N, A, LDA, B, LDB)
ZLACP2 copies all or part of a real two-dimensional array to a complex array.
subroutine zlaset(UPLO, M, N, ALPHA, BETA, A, LDA)
ZLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine zlacrm(M, N, A, LDA, B, LDB, C, LDC, RWORK)
ZLACRM multiplies a complex matrix by a square real matrix.
subroutine zunglq(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGLQ
subroutine zungqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
ZUNGQR
subroutine zunmbr(VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
ZUNMBR
subroutine zgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
ZGEQRF VARIANT: left-looking Level 3 BLAS of the algorithm.