225 SUBROUTINE zgesdd( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT,
226 $ WORK, LWORK, RWORK, IWORK, INFO )
235 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
239 DOUBLE PRECISION RWORK( * ), S( * )
240 COMPLEX*16 A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
247 COMPLEX*16 CZERO, CONE
248 parameter( czero = ( 0.0d+0, 0.0d+0 ),
249 $ cone = ( 1.0d+0, 0.0d+0 ) )
250 DOUBLE PRECISION ZERO, ONE
251 parameter( zero = 0.0d+0, one = 1.0d+0 )
254 LOGICAL LQUERY, WNTQA, WNTQAS, WNTQN, WNTQO, WNTQS
255 INTEGER BLK, CHUNK, I, IE, IERR, IL, IR, IRU, IRVT,
256 $ iscl, itau, itaup, itauq, iu, ivt, ldwkvt,
257 $ ldwrkl, ldwrkr, ldwrku, maxwrk, minmn, minwrk,
258 $ mnthr1, mnthr2, nrwork, nwork, wrkbl
259 INTEGER LWORK_ZGEBRD_MN, LWORK_ZGEBRD_MM,
260 $ lwork_zgebrd_nn, lwork_zgelqf_mn,
262 $ lwork_zungbr_p_mn, lwork_zungbr_p_nn,
263 $ lwork_zungbr_q_mn, lwork_zungbr_q_mm,
264 $ lwork_zunglq_mn, lwork_zunglq_nn,
265 $ lwork_zungqr_mm, lwork_zungqr_mn,
266 $ lwork_zunmbr_prc_mm, lwork_zunmbr_qln_mm,
267 $ lwork_zunmbr_prc_mn, lwork_zunmbr_qln_mn,
268 $ lwork_zunmbr_prc_nn, lwork_zunmbr_qln_nn
269 DOUBLE PRECISION ANRM, BIGNUM, EPS, SMLNUM
273 DOUBLE PRECISION DUM( 1 )
282 LOGICAL LSAME, DISNAN
283 DOUBLE PRECISION DLAMCH, ZLANGE
284 EXTERNAL lsame, dlamch, zlange, disnan
287 INTRINSIC int, max, min, sqrt
295 mnthr1 = int( minmn*17.0d0 / 9.0d0 )
296 mnthr2 = int( minmn*5.0d0 / 3.0d0 )
297 wntqa = lsame( jobz,
'A' )
298 wntqs = lsame( jobz,
'S' )
299 wntqas = wntqa .OR. wntqs
300 wntqo = lsame( jobz,
'O' )
301 wntqn = lsame( jobz,
'N' )
302 lquery = ( lwork.EQ.-1 )
306 IF( .NOT.( wntqa .OR. wntqs .OR. wntqo .OR. wntqn ) )
THEN
308 ELSE IF( m.LT.0 )
THEN
310 ELSE IF( n.LT.0 )
THEN
312 ELSE IF( lda.LT.max( 1, m ) )
THEN
314 ELSE IF( ldu.LT.1 .OR. ( wntqas .AND. ldu.LT.m ) .OR.
315 $ ( wntqo .AND. m.LT.n .AND. ldu.LT.m ) )
THEN
317 ELSE IF( ldvt.LT.1 .OR. ( wntqa .AND. ldvt.LT.n ) .OR.
318 $ ( wntqs .AND. ldvt.LT.minmn ) .OR.
319 $ ( wntqo .AND. m.GE.n .AND. ldvt.LT.n ) )
THEN
334 IF( m.GE.n .AND. minmn.GT.0 )
THEN
343 CALL zgebrd( m, n, cdum(1), m, dum(1), dum(1), cdum(1),
344 $ cdum(1), cdum(1), -1, ierr )
345 lwork_zgebrd_mn = int( cdum(1) )
347 CALL zgebrd( n, n, cdum(1), n, dum(1), dum(1), cdum(1),
348 $ cdum(1), cdum(1), -1, ierr )
349 lwork_zgebrd_nn = int( cdum(1) )
351 CALL zgeqrf( m, n, cdum(1), m, cdum(1), cdum(1), -1, ierr )
352 lwork_zgeqrf_mn = int( cdum(1) )
354 CALL zungbr(
'P', n, n, n, cdum(1), n, cdum(1), cdum(1),
356 lwork_zungbr_p_nn = int( cdum(1) )
358 CALL zungbr(
'Q', m, m, n, cdum(1), m, cdum(1), cdum(1),
360 lwork_zungbr_q_mm = int( cdum(1) )
362 CALL zungbr(
'Q', m, n, n, cdum(1), m, cdum(1), cdum(1),
364 lwork_zungbr_q_mn = int( cdum(1) )
366 CALL zungqr( m, m, n, cdum(1), m, cdum(1), cdum(1),
368 lwork_zungqr_mm = int( cdum(1) )
370 CALL zungqr( m, n, n, cdum(1), m, cdum(1), cdum(1),
372 lwork_zungqr_mn = int( cdum(1) )
374 CALL zunmbr(
'P',
'R',
'C', n, n, n, cdum(1), n, cdum(1),
375 $ cdum(1), n, cdum(1), -1, ierr )
376 lwork_zunmbr_prc_nn = int( cdum(1) )
378 CALL zunmbr(
'Q',
'L',
'N', m, m, n, cdum(1), m, cdum(1),
379 $ cdum(1), m, cdum(1), -1, ierr )
380 lwork_zunmbr_qln_mm = int( cdum(1) )
382 CALL zunmbr(
'Q',
'L',
'N', m, n, n, cdum(1), m, cdum(1),
383 $ cdum(1), m, cdum(1), -1, ierr )
384 lwork_zunmbr_qln_mn = int( cdum(1) )
386 CALL zunmbr(
'Q',
'L',
'N', n, n, n, cdum(1), n, cdum(1),
387 $ cdum(1), n, cdum(1), -1, ierr )
388 lwork_zunmbr_qln_nn = int( cdum(1) )
390 IF( m.GE.mnthr1 )
THEN
395 maxwrk = n + lwork_zgeqrf_mn
396 maxwrk = max( maxwrk, 2*n + lwork_zgebrd_nn )
398 ELSE IF( wntqo )
THEN
402 wrkbl = n + lwork_zgeqrf_mn
403 wrkbl = max( wrkbl, n + lwork_zungqr_mn )
404 wrkbl = max( wrkbl, 2*n + lwork_zgebrd_nn )
405 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_qln_nn )
406 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_prc_nn )
407 maxwrk = m*n + n*n + wrkbl
409 ELSE IF( wntqs )
THEN
413 wrkbl = n + lwork_zgeqrf_mn
414 wrkbl = max( wrkbl, n + lwork_zungqr_mn )
415 wrkbl = max( wrkbl, 2*n + lwork_zgebrd_nn )
416 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_qln_nn )
417 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_prc_nn )
420 ELSE IF( wntqa )
THEN
424 wrkbl = n + lwork_zgeqrf_mn
425 wrkbl = max( wrkbl, n + lwork_zungqr_mm )
426 wrkbl = max( wrkbl, 2*n + lwork_zgebrd_nn )
427 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_qln_nn )
428 wrkbl = max( wrkbl, 2*n + lwork_zunmbr_prc_nn )
430 minwrk = n*n + max( 3*n, n + m )
432 ELSE IF( m.GE.mnthr2 )
THEN
436 maxwrk = 2*n + lwork_zgebrd_mn
440 maxwrk = max( maxwrk, 2*n + lwork_zungbr_p_nn )
441 maxwrk = max( maxwrk, 2*n + lwork_zungbr_q_mn )
442 maxwrk = maxwrk + m*n
443 minwrk = minwrk + n*n
444 ELSE IF( wntqs )
THEN
446 maxwrk = max( maxwrk, 2*n + lwork_zungbr_p_nn )
447 maxwrk = max( maxwrk, 2*n + lwork_zungbr_q_mn )
448 ELSE IF( wntqa )
THEN
450 maxwrk = max( maxwrk, 2*n + lwork_zungbr_p_nn )
451 maxwrk = max( maxwrk, 2*n + lwork_zungbr_q_mm )
457 maxwrk = 2*n + lwork_zgebrd_mn
461 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_prc_nn )
462 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_qln_mn )
463 maxwrk = maxwrk + m*n
464 minwrk = minwrk + n*n
465 ELSE IF( wntqs )
THEN
467 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_qln_mn )
468 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_prc_nn )
469 ELSE IF( wntqa )
THEN
471 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_qln_mm )
472 maxwrk = max( maxwrk, 2*n + lwork_zunmbr_prc_nn )
475 ELSE IF( minmn.GT.0 )
THEN
484 CALL zgebrd( m, n, cdum(1), m, dum(1), dum(1), cdum(1),
485 $ cdum(1), cdum(1), -1, ierr )
486 lwork_zgebrd_mn = int( cdum(1) )
488 CALL zgebrd( m, m, cdum(1), m, dum(1), dum(1), cdum(1),
489 $ cdum(1), cdum(1), -1, ierr )
490 lwork_zgebrd_mm = int( cdum(1) )
492 CALL zgelqf( m, n, cdum(1), m, cdum(1), cdum(1), -1, ierr )
493 lwork_zgelqf_mn = int( cdum(1) )
495 CALL zungbr(
'P', m, n, m, cdum(1), m, cdum(1), cdum(1),
497 lwork_zungbr_p_mn = int( cdum(1) )
499 CALL zungbr(
'P', n, n, m, cdum(1), n, cdum(1), cdum(1),
501 lwork_zungbr_p_nn = int( cdum(1) )
503 CALL zungbr(
'Q', m, m, n, cdum(1), m, cdum(1), cdum(1),
505 lwork_zungbr_q_mm = int( cdum(1) )
507 CALL zunglq( m, n, m, cdum(1), m, cdum(1), cdum(1),
509 lwork_zunglq_mn = int( cdum(1) )
511 CALL zunglq( n, n, m, cdum(1), n, cdum(1), cdum(1),
513 lwork_zunglq_nn = int( cdum(1) )
515 CALL zunmbr(
'P',
'R',
'C', m, m, m, cdum(1), m, cdum(1),
516 $ cdum(1), m, cdum(1), -1, ierr )
517 lwork_zunmbr_prc_mm = int( cdum(1) )
519 CALL zunmbr(
'P',
'R',
'C', m, n, m, cdum(1), m, cdum(1),
520 $ cdum(1), m, cdum(1), -1, ierr )
521 lwork_zunmbr_prc_mn = int( cdum(1) )
523 CALL zunmbr(
'P',
'R',
'C', n, n, m, cdum(1), n, cdum(1),
524 $ cdum(1), n, cdum(1), -1, ierr )
525 lwork_zunmbr_prc_nn = int( cdum(1) )
527 CALL zunmbr(
'Q',
'L',
'N', m, m, m, cdum(1), m, cdum(1),
528 $ cdum(1), m, cdum(1), -1, ierr )
529 lwork_zunmbr_qln_mm = int( cdum(1) )
531 IF( n.GE.mnthr1 )
THEN
536 maxwrk = m + lwork_zgelqf_mn
537 maxwrk = max( maxwrk, 2*m + lwork_zgebrd_mm )
539 ELSE IF( wntqo )
THEN
543 wrkbl = m + lwork_zgelqf_mn
544 wrkbl = max( wrkbl, m + lwork_zunglq_mn )
545 wrkbl = max( wrkbl, 2*m + lwork_zgebrd_mm )
546 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_qln_mm )
547 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_prc_mm )
548 maxwrk = m*n + m*m + wrkbl
550 ELSE IF( wntqs )
THEN
554 wrkbl = m + lwork_zgelqf_mn
555 wrkbl = max( wrkbl, m + lwork_zunglq_mn )
556 wrkbl = max( wrkbl, 2*m + lwork_zgebrd_mm )
557 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_qln_mm )
558 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_prc_mm )
561 ELSE IF( wntqa )
THEN
565 wrkbl = m + lwork_zgelqf_mn
566 wrkbl = max( wrkbl, m + lwork_zunglq_nn )
567 wrkbl = max( wrkbl, 2*m + lwork_zgebrd_mm )
568 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_qln_mm )
569 wrkbl = max( wrkbl, 2*m + lwork_zunmbr_prc_mm )
571 minwrk = m*m + max( 3*m, m + n )
573 ELSE IF( n.GE.mnthr2 )
THEN
577 maxwrk = 2*m + lwork_zgebrd_mn
581 maxwrk = max( maxwrk, 2*m + lwork_zungbr_q_mm )
582 maxwrk = max( maxwrk, 2*m + lwork_zungbr_p_mn )
583 maxwrk = maxwrk + m*n
584 minwrk = minwrk + m*m
585 ELSE IF( wntqs )
THEN
587 maxwrk = max( maxwrk, 2*m + lwork_zungbr_q_mm )
588 maxwrk = max( maxwrk, 2*m + lwork_zungbr_p_mn )
589 ELSE IF( wntqa )
THEN
591 maxwrk = max( maxwrk, 2*m + lwork_zungbr_q_mm )
592 maxwrk = max( maxwrk, 2*m + lwork_zungbr_p_nn )
598 maxwrk = 2*m + lwork_zgebrd_mn
602 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_qln_mm )
603 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_prc_mn )
604 maxwrk = maxwrk + m*n
605 minwrk = minwrk + m*m
606 ELSE IF( wntqs )
THEN
608 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_qln_mm )
609 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_prc_mn )
610 ELSE IF( wntqa )
THEN
612 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_qln_mm )
613 maxwrk = max( maxwrk, 2*m + lwork_zunmbr_prc_nn )
617 maxwrk = max( maxwrk, minwrk )
621 IF( lwork.LT.minwrk .AND. .NOT. lquery )
THEN
627 CALL xerbla(
'ZGESDD', -info )
629 ELSE IF( lquery )
THEN
635 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
642 smlnum = sqrt( dlamch(
'S' ) ) / eps
643 bignum = one / smlnum
647 anrm = zlange(
'M', m, n, a, lda, dum )
648 IF( disnan( anrm ) )
THEN
653 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
655 CALL zlascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
656 ELSE IF( anrm.GT.bignum )
THEN
658 CALL zlascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
667 IF( m.GE.mnthr1 )
THEN
682 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
683 $ lwork-nwork+1, ierr )
687 CALL zlaset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
699 CALL zgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
700 $ work( itaup ), work( nwork ), lwork-nwork+1,
708 CALL dbdsdc(
'U',
'N', n, s, rwork( ie ), dum,1,dum,1,
709 $ dum, idum, rwork( nrwork ), iwork, info )
711 ELSE IF( wntqo )
THEN
723 IF( lwork .GE. m*n + n*n + 3*n )
THEN
729 ldwrkr = ( lwork - n*n - 3*n ) / n
739 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
740 $ lwork-nwork+1, ierr )
744 CALL zlacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
745 CALL zlaset(
'L', n-1, n-1, czero, czero, work( ir+1 ),
753 CALL zungqr( m, n, n, a, lda, work( itau ),
754 $ work( nwork ), lwork-nwork+1, ierr )
765 CALL zgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
766 $ work( itauq ), work( itaup ), work( nwork ),
767 $ lwork-nwork+1, ierr )
778 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
779 $ n, rwork( irvt ), n, dum, idum,
780 $ rwork( nrwork ), iwork, info )
788 CALL zlacp2(
'F', n, n, rwork( iru ), n, work( iu ),
790 CALL zunmbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
791 $ work( itauq ), work( iu ), ldwrku,
792 $ work( nwork ), lwork-nwork+1, ierr )
800 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
801 CALL zunmbr(
'P',
'R',
'C', n, n, n, work( ir ), ldwrkr,
802 $ work( itaup ), vt, ldvt, work( nwork ),
803 $ lwork-nwork+1, ierr )
811 DO 10 i = 1, m, ldwrkr
812 chunk = min( m-i+1, ldwrkr )
813 CALL zgemm(
'N',
'N', chunk, n, n, cone, a( i, 1 ),
814 $ lda, work( iu ), ldwrku, czero,
815 $ work( ir ), ldwrkr )
816 CALL zlacpy(
'F', chunk, n, work( ir ), ldwrkr,
820 ELSE IF( wntqs )
THEN
839 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
840 $ lwork-nwork+1, ierr )
844 CALL zlacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
845 CALL zlaset(
'L', n-1, n-1, czero, czero, work( ir+1 ),
853 CALL zungqr( m, n, n, a, lda, work( itau ),
854 $ work( nwork ), lwork-nwork+1, ierr )
865 CALL zgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
866 $ work( itauq ), work( itaup ), work( nwork ),
867 $ lwork-nwork+1, ierr )
878 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
879 $ n, rwork( irvt ), n, dum, idum,
880 $ rwork( nrwork ), iwork, info )
888 CALL zlacp2(
'F', n, n, rwork( iru ), n, u, ldu )
889 CALL zunmbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
890 $ work( itauq ), u, ldu, work( nwork ),
891 $ lwork-nwork+1, ierr )
899 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
900 CALL zunmbr(
'P',
'R',
'C', n, n, n, work( ir ), ldwrkr,
901 $ work( itaup ), vt, ldvt, work( nwork ),
902 $ lwork-nwork+1, ierr )
909 CALL zlacpy(
'F', n, n, u, ldu, work( ir ), ldwrkr )
910 CALL zgemm(
'N',
'N', m, n, n, cone, a, lda, work( ir ),
911 $ ldwrkr, czero, u, ldu )
913 ELSE IF( wntqa )
THEN
932 CALL zgeqrf( m, n, a, lda, work( itau ), work( nwork ),
933 $ lwork-nwork+1, ierr )
934 CALL zlacpy(
'L', m, n, a, lda, u, ldu )
941 CALL zungqr( m, m, n, u, ldu, work( itau ),
942 $ work( nwork ), lwork-nwork+1, ierr )
946 CALL zlaset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
958 CALL zgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
959 $ work( itaup ), work( nwork ), lwork-nwork+1,
971 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
972 $ n, rwork( irvt ), n, dum, idum,
973 $ rwork( nrwork ), iwork, info )
981 CALL zlacp2(
'F', n, n, rwork( iru ), n, work( iu ),
983 CALL zunmbr(
'Q',
'L',
'N', n, n, n, a, lda,
984 $ work( itauq ), work( iu ), ldwrku,
985 $ work( nwork ), lwork-nwork+1, ierr )
993 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
994 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
995 $ work( itaup ), vt, ldvt, work( nwork ),
996 $ lwork-nwork+1, ierr )
1003 CALL zgemm(
'N',
'N', m, n, n, cone, u, ldu, work( iu ),
1004 $ ldwrku, czero, a, lda )
1008 CALL zlacpy(
'F', m, n, a, lda, u, ldu )
1012 ELSE IF( m.GE.mnthr2 )
THEN
1031 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1032 $ work( itaup ), work( nwork ), lwork-nwork+1,
1041 CALL dbdsdc(
'U',
'N', n, s, rwork( ie ), dum, 1,dum,1,
1042 $ dum, idum, rwork( nrwork ), iwork, info )
1043 ELSE IF( wntqo )
THEN
1055 CALL zlacpy(
'U', n, n, a, lda, vt, ldvt )
1056 CALL zungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1057 $ work( nwork ), lwork-nwork+1, ierr )
1064 CALL zungbr(
'Q', m, n, n, a, lda, work( itauq ),
1065 $ work( nwork ), lwork-nwork+1, ierr )
1067 IF( lwork .GE. m*n + 3*n )
THEN
1076 ldwrku = ( lwork - 3*n ) / n
1078 nwork = iu + ldwrku*n
1086 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1087 $ n, rwork( irvt ), n, dum, idum,
1088 $ rwork( nrwork ), iwork, info )
1095 CALL zlarcm( n, n, rwork( irvt ), n, vt, ldvt,
1096 $ work( iu ), ldwrku, rwork( nrwork ) )
1097 CALL zlacpy(
'F', n, n, work( iu ), ldwrku, vt, ldvt )
1107 DO 20 i = 1, m, ldwrku
1108 chunk = min( m-i+1, ldwrku )
1109 CALL zlacrm( chunk, n, a( i, 1 ), lda, rwork( iru ),
1110 $ n, work( iu ), ldwrku, rwork( nrwork ) )
1111 CALL zlacpy(
'F', chunk, n, work( iu ), ldwrku,
1115 ELSE IF( wntqs )
THEN
1123 CALL zlacpy(
'U', n, n, a, lda, vt, ldvt )
1124 CALL zungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1125 $ work( nwork ), lwork-nwork+1, ierr )
1132 CALL zlacpy(
'L', m, n, a, lda, u, ldu )
1133 CALL zungbr(
'Q', m, n, n, u, ldu, work( itauq ),
1134 $ work( nwork ), lwork-nwork+1, ierr )
1145 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1146 $ n, rwork( irvt ), n, dum, idum,
1147 $ rwork( nrwork ), iwork, info )
1154 CALL zlarcm( n, n, rwork( irvt ), n, vt, ldvt, a, lda,
1156 CALL zlacpy(
'F', n, n, a, lda, vt, ldvt )
1164 CALL zlacrm( m, n, u, ldu, rwork( iru ), n, a, lda,
1166 CALL zlacpy(
'F', m, n, a, lda, u, ldu )
1175 CALL zlacpy(
'U', n, n, a, lda, vt, ldvt )
1176 CALL zungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1177 $ work( nwork ), lwork-nwork+1, ierr )
1184 CALL zlacpy(
'L', m, n, a, lda, u, ldu )
1185 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1186 $ work( nwork ), lwork-nwork+1, ierr )
1197 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1198 $ n, rwork( irvt ), n, dum, idum,
1199 $ rwork( nrwork ), iwork, info )
1206 CALL zlarcm( n, n, rwork( irvt ), n, vt, ldvt, a, lda,
1208 CALL zlacpy(
'F', n, n, a, lda, vt, ldvt )
1216 CALL zlacrm( m, n, u, ldu, rwork( iru ), n, a, lda,
1218 CALL zlacpy(
'F', m, n, a, lda, u, ldu )
1240 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1241 $ work( itaup ), work( nwork ), lwork-nwork+1,
1250 CALL dbdsdc(
'U',
'N', n, s, rwork( ie ), dum,1,dum,1,
1251 $ dum, idum, rwork( nrwork ), iwork, info )
1252 ELSE IF( wntqo )
THEN
1257 IF( lwork .GE. m*n + 3*n )
THEN
1266 ldwrku = ( lwork - 3*n ) / n
1268 nwork = iu + ldwrku*n
1277 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1278 $ n, rwork( irvt ), n, dum, idum,
1279 $ rwork( nrwork ), iwork, info )
1287 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1288 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1289 $ work( itaup ), vt, ldvt, work( nwork ),
1290 $ lwork-nwork+1, ierr )
1292 IF( lwork .GE. m*n + 3*n )
THEN
1302 CALL zlaset(
'F', m, n, czero, czero, work( iu ),
1304 CALL zlacp2(
'F', n, n, rwork( iru ), n, work( iu ),
1306 CALL zunmbr(
'Q',
'L',
'N', m, n, n, a, lda,
1307 $ work( itauq ), work( iu ), ldwrku,
1308 $ work( nwork ), lwork-nwork+1, ierr )
1309 CALL zlacpy(
'F', m, n, work( iu ), ldwrku, a, lda )
1318 CALL zungbr(
'Q', m, n, n, a, lda, work( itauq ),
1319 $ work( nwork ), lwork-nwork+1, ierr )
1329 DO 30 i = 1, m, ldwrku
1330 chunk = min( m-i+1, ldwrku )
1331 CALL zlacrm( chunk, n, a( i, 1 ), lda,
1332 $ rwork( iru ), n, work( iu ), ldwrku,
1334 CALL zlacpy(
'F', chunk, n, work( iu ), ldwrku,
1339 ELSE IF( wntqs )
THEN
1351 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1352 $ n, rwork( irvt ), n, dum, idum,
1353 $ rwork( nrwork ), iwork, info )
1361 CALL zlaset(
'F', m, n, czero, czero, u, ldu )
1362 CALL zlacp2(
'F', n, n, rwork( iru ), n, u, ldu )
1363 CALL zunmbr(
'Q',
'L',
'N', m, n, n, a, lda,
1364 $ work( itauq ), u, ldu, work( nwork ),
1365 $ lwork-nwork+1, ierr )
1373 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1374 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1375 $ work( itaup ), vt, ldvt, work( nwork ),
1376 $ lwork-nwork+1, ierr )
1389 CALL dbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1390 $ n, rwork( irvt ), n, dum, idum,
1391 $ rwork( nrwork ), iwork, info )
1395 CALL zlaset(
'F', m, m, czero, czero, u, ldu )
1397 CALL zlaset(
'F', m-n, m-n, czero, cone,
1398 $ u( n+1, n+1 ), ldu )
1407 CALL zlacp2(
'F', n, n, rwork( iru ), n, u, ldu )
1408 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
1409 $ work( itauq ), u, ldu, work( nwork ),
1410 $ lwork-nwork+1, ierr )
1418 CALL zlacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1419 CALL zunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1420 $ work( itaup ), vt, ldvt, work( nwork ),
1421 $ lwork-nwork+1, ierr )
1432 IF( n.GE.mnthr1 )
THEN
1447 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1448 $ lwork-nwork+1, ierr )
1452 CALL zlaset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
1464 CALL zgebrd( m, m, a, lda, s, rwork( ie ), work( itauq ),
1465 $ work( itaup ), work( nwork ), lwork-nwork+1,
1473 CALL dbdsdc(
'U',
'N', m, s, rwork( ie ), dum,1,dum,1,
1474 $ dum, idum, rwork( nrwork ), iwork, info )
1476 ELSE IF( wntqo )
THEN
1488 IF( lwork .GE. m*n + m*m + 3*m )
THEN
1499 chunk = ( lwork - m*m - 3*m ) / m
1501 itau = il + ldwrkl*chunk
1509 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1510 $ lwork-nwork+1, ierr )
1514 CALL zlacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1515 CALL zlaset(
'U', m-1, m-1, czero, czero,
1516 $ work( il+ldwrkl ), ldwrkl )
1523 CALL zunglq( m, n, m, a, lda, work( itau ),
1524 $ work( nwork ), lwork-nwork+1, ierr )
1535 CALL zgebrd( m, m, work( il ), ldwrkl, s, rwork( ie ),
1536 $ work( itauq ), work( itaup ), work( nwork ),
1537 $ lwork-nwork+1, ierr )
1548 CALL dbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1549 $ m, rwork( irvt ), m, dum, idum,
1550 $ rwork( nrwork ), iwork, info )
1558 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1559 CALL zunmbr(
'Q',
'L',
'N', m, m, m, work( il ), ldwrkl,
1560 $ work( itauq ), u, ldu, work( nwork ),
1561 $ lwork-nwork+1, ierr )
1569 CALL zlacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
1571 CALL zunmbr(
'P',
'R',
'C', m, m, m, work( il ), ldwrkl,
1572 $ work( itaup ), work( ivt ), ldwkvt,
1573 $ work( nwork ), lwork-nwork+1, ierr )
1581 DO 40 i = 1, n, chunk
1582 blk = min( n-i+1, chunk )
1583 CALL zgemm(
'N',
'N', m, blk, m, cone, work( ivt ), m,
1584 $ a( 1, i ), lda, czero, work( il ),
1586 CALL zlacpy(
'F', m, blk, work( il ), ldwrkl,
1590 ELSE IF( wntqs )
THEN
1601 itau = il + ldwrkl*m
1609 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1610 $ lwork-nwork+1, ierr )
1614 CALL zlacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1615 CALL zlaset(
'U', m-1, m-1, czero, czero,
1616 $ work( il+ldwrkl ), ldwrkl )
1623 CALL zunglq( m, n, m, a, lda, work( itau ),
1624 $ work( nwork ), lwork-nwork+1, ierr )
1635 CALL zgebrd( m, m, work( il ), ldwrkl, s, rwork( ie ),
1636 $ work( itauq ), work( itaup ), work( nwork ),
1637 $ lwork-nwork+1, ierr )
1648 CALL dbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1649 $ m, rwork( irvt ), m, dum, idum,
1650 $ rwork( nrwork ), iwork, info )
1658 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1659 CALL zunmbr(
'Q',
'L',
'N', m, m, m, work( il ), ldwrkl,
1660 $ work( itauq ), u, ldu, work( nwork ),
1661 $ lwork-nwork+1, ierr )
1669 CALL zlacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
1670 CALL zunmbr(
'P',
'R',
'C', m, m, m, work( il ), ldwrkl,
1671 $ work( itaup ), vt, ldvt, work( nwork ),
1672 $ lwork-nwork+1, ierr )
1679 CALL zlacpy(
'F', m, m, vt, ldvt, work( il ), ldwrkl )
1680 CALL zgemm(
'N',
'N', m, n, m, cone, work( il ), ldwrkl,
1681 $ a, lda, czero, vt, ldvt )
1683 ELSE IF( wntqa )
THEN
1694 itau = ivt + ldwkvt*m
1702 CALL zgelqf( m, n, a, lda, work( itau ), work( nwork ),
1703 $ lwork-nwork+1, ierr )
1704 CALL zlacpy(
'U', m, n, a, lda, vt, ldvt )
1711 CALL zunglq( n, n, m, vt, ldvt, work( itau ),
1712 $ work( nwork ), lwork-nwork+1, ierr )
1716 CALL zlaset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
1728 CALL zgebrd( m, m, a, lda, s, rwork( ie ), work( itauq ),
1729 $ work( itaup ), work( nwork ), lwork-nwork+1,
1741 CALL dbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1742 $ m, rwork( irvt ), m, dum, idum,
1743 $ rwork( nrwork ), iwork, info )
1751 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1752 CALL zunmbr(
'Q',
'L',
'N', m, m, m, a, lda,
1753 $ work( itauq ), u, ldu, work( nwork ),
1754 $ lwork-nwork+1, ierr )
1762 CALL zlacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
1764 CALL zunmbr(
'P',
'R',
'C', m, m, m, a, lda,
1765 $ work( itaup ), work( ivt ), ldwkvt,
1766 $ work( nwork ), lwork-nwork+1, ierr )
1773 CALL zgemm(
'N',
'N', m, n, m, cone, work( ivt ), ldwkvt,
1774 $ vt, ldvt, czero, a, lda )
1778 CALL zlacpy(
'F', m, n, a, lda, vt, ldvt )
1782 ELSE IF( n.GE.mnthr2 )
THEN
1801 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1802 $ work( itaup ), work( nwork ), lwork-nwork+1,
1812 CALL dbdsdc(
'L',
'N', m, s, rwork( ie ), dum,1,dum,1,
1813 $ dum, idum, rwork( nrwork ), iwork, info )
1814 ELSE IF( wntqo )
THEN
1826 CALL zlacpy(
'L', m, m, a, lda, u, ldu )
1827 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1828 $ work( nwork ), lwork-nwork+1, ierr )
1835 CALL zungbr(
'P', m, n, m, a, lda, work( itaup ),
1836 $ work( nwork ), lwork-nwork+1, ierr )
1839 IF( lwork .GE. m*n + 3*m )
THEN
1843 nwork = ivt + ldwkvt*n
1849 chunk = ( lwork - 3*m ) / m
1850 nwork = ivt + ldwkvt*chunk
1859 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1860 $ m, rwork( irvt ), m, dum, idum,
1861 $ rwork( nrwork ), iwork, info )
1868 CALL zlacrm( m, m, u, ldu, rwork( iru ), m, work( ivt ),
1869 $ ldwkvt, rwork( nrwork ) )
1870 CALL zlacpy(
'F', m, m, work( ivt ), ldwkvt, u, ldu )
1880 DO 50 i = 1, n, chunk
1881 blk = min( n-i+1, chunk )
1882 CALL zlarcm( m, blk, rwork( irvt ), m, a( 1, i ), lda,
1883 $ work( ivt ), ldwkvt, rwork( nrwork ) )
1884 CALL zlacpy(
'F', m, blk, work( ivt ), ldwkvt,
1887 ELSE IF( wntqs )
THEN
1895 CALL zlacpy(
'L', m, m, a, lda, u, ldu )
1896 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1897 $ work( nwork ), lwork-nwork+1, ierr )
1904 CALL zlacpy(
'U', m, n, a, lda, vt, ldvt )
1905 CALL zungbr(
'P', m, n, m, vt, ldvt, work( itaup ),
1906 $ work( nwork ), lwork-nwork+1, ierr )
1917 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1918 $ m, rwork( irvt ), m, dum, idum,
1919 $ rwork( nrwork ), iwork, info )
1926 CALL zlacrm( m, m, u, ldu, rwork( iru ), m, a, lda,
1928 CALL zlacpy(
'F', m, m, a, lda, u, ldu )
1936 CALL zlarcm( m, n, rwork( irvt ), m, vt, ldvt, a, lda,
1938 CALL zlacpy(
'F', m, n, a, lda, vt, ldvt )
1947 CALL zlacpy(
'L', m, m, a, lda, u, ldu )
1948 CALL zungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1949 $ work( nwork ), lwork-nwork+1, ierr )
1956 CALL zlacpy(
'U', m, n, a, lda, vt, ldvt )
1957 CALL zungbr(
'P', n, n, m, vt, ldvt, work( itaup ),
1958 $ work( nwork ), lwork-nwork+1, ierr )
1969 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1970 $ m, rwork( irvt ), m, dum, idum,
1971 $ rwork( nrwork ), iwork, info )
1978 CALL zlacrm( m, m, u, ldu, rwork( iru ), m, a, lda,
1980 CALL zlacpy(
'F', m, m, a, lda, u, ldu )
1988 CALL zlarcm( m, n, rwork( irvt ), m, vt, ldvt, a, lda,
1990 CALL zlacpy(
'F', m, n, a, lda, vt, ldvt )
2012 CALL zgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
2013 $ work( itaup ), work( nwork ), lwork-nwork+1,
2022 CALL dbdsdc(
'L',
'N', m, s, rwork( ie ), dum,1,dum,1,
2023 $ dum, idum, rwork( nrwork ), iwork, info )
2024 ELSE IF( wntqo )
THEN
2028 IF( lwork .GE. m*n + 3*m )
THEN
2032 CALL zlaset(
'F', m, n, czero, czero, work( ivt ),
2034 nwork = ivt + ldwkvt*n
2039 chunk = ( lwork - 3*m ) / m
2040 nwork = ivt + ldwkvt*chunk
2052 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2053 $ m, rwork( irvt ), m, dum, idum,
2054 $ rwork( nrwork ), iwork, info )
2062 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2063 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2064 $ work( itauq ), u, ldu, work( nwork ),
2065 $ lwork-nwork+1, ierr )
2067 IF( lwork .GE. m*n + 3*m )
THEN
2077 CALL zlacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
2079 CALL zunmbr(
'P',
'R',
'C', m, n, m, a, lda,
2080 $ work( itaup ), work( ivt ), ldwkvt,
2081 $ work( nwork ), lwork-nwork+1, ierr )
2082 CALL zlacpy(
'F', m, n, work( ivt ), ldwkvt, a, lda )
2091 CALL zungbr(
'P', m, n, m, a, lda, work( itaup ),
2092 $ work( nwork ), lwork-nwork+1, ierr )
2102 DO 60 i = 1, n, chunk
2103 blk = min( n-i+1, chunk )
2104 CALL zlarcm( m, blk, rwork( irvt ), m, a( 1, i ),
2105 $ lda, work( ivt ), ldwkvt,
2107 CALL zlacpy(
'F', m, blk, work( ivt ), ldwkvt,
2111 ELSE IF( wntqs )
THEN
2123 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2124 $ m, rwork( irvt ), m, dum, idum,
2125 $ rwork( nrwork ), iwork, info )
2133 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2134 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2135 $ work( itauq ), u, ldu, work( nwork ),
2136 $ lwork-nwork+1, ierr )
2144 CALL zlaset(
'F', m, n, czero, czero, vt, ldvt )
2145 CALL zlacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
2146 CALL zunmbr(
'P',
'R',
'C', m, n, m, a, lda,
2147 $ work( itaup ), vt, ldvt, work( nwork ),
2148 $ lwork-nwork+1, ierr )
2162 CALL dbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2163 $ m, rwork( irvt ), m, dum, idum,
2164 $ rwork( nrwork ), iwork, info )
2172 CALL zlacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2173 CALL zunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2174 $ work( itauq ), u, ldu, work( nwork ),
2175 $ lwork-nwork+1, ierr )
2179 CALL zlaset(
'F', n, n, czero, cone, vt, ldvt )
2187 CALL zlacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
2188 CALL zunmbr(
'P',
'R',
'C', n, n, m, a, lda,
2189 $ work( itaup ), vt, ldvt, work( nwork ),
2190 $ lwork-nwork+1, ierr )
2199 IF( iscl.EQ.1 )
THEN
2200 IF( anrm.GT.bignum )
2201 $
CALL dlascl(
'G', 0, 0, bignum, anrm, minmn, 1, s, minmn,
2203 IF( info.NE.0 .AND. anrm.GT.bignum )
2204 $
CALL dlascl(
'G', 0, 0, bignum, anrm, minmn-1, 1,
2205 $ rwork( ie ), minmn, ierr )
2206 IF( anrm.LT.smlnum )
2207 $
CALL dlascl(
'G', 0, 0, smlnum, anrm, minmn, 1, s, minmn,
2209 IF( info.NE.0 .AND. anrm.LT.smlnum )
2210 $
CALL dlascl(
'G', 0, 0, smlnum, anrm, minmn-1, 1,
2211 $ rwork( ie ), minmn, ierr )
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
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
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 zgesdd(JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT, WORK, LWORK, RWORK, IWORK, INFO)
ZGESDD
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.