212 SUBROUTINE cgesvd( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
213 $ WORK, LWORK, RWORK, INFO )
220 CHARACTER JOBU, JOBVT
221 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
224 REAL RWORK( * ), S( * )
225 COMPLEX A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
233 parameter( czero = ( 0.0e0, 0.0e0 ),
234 $ cone = ( 1.0e0, 0.0e0 ) )
236 parameter( zero = 0.0e0, one = 1.0e0 )
239 LOGICAL LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
240 $ wntva, wntvas, wntvn, wntvo, wntvs
241 INTEGER BLK, CHUNK, I, IE, IERR, IR, IRWORK, ISCL,
242 $ itau, itaup, itauq, iu, iwork, ldwrkr, ldwrku,
243 $ maxwrk, minmn, minwrk, mnthr, ncu, ncvt, nru,
245 INTEGER LWORK_CGEQRF, LWORK_CUNGQR_N, LWORK_CUNGQR_M,
246 $ lwork_cgebrd, lwork_cungbr_p, lwork_cungbr_q,
247 $ lwork_cgelqf, lwork_cunglq_n, lwork_cunglq_m
248 REAL ANRM, BIGNUM, EPS, SMLNUM
263 EXTERNAL lsame, ilaenv, clange, slamch
274 wntua = lsame( jobu,
'A' )
275 wntus = lsame( jobu,
'S' )
276 wntuas = wntua .OR. wntus
277 wntuo = lsame( jobu,
'O' )
278 wntun = lsame( jobu,
'N' )
279 wntva = lsame( jobvt,
'A' )
280 wntvs = lsame( jobvt,
'S' )
281 wntvas = wntva .OR. wntvs
282 wntvo = lsame( jobvt,
'O' )
283 wntvn = lsame( jobvt,
'N' )
284 lquery = ( lwork.EQ.-1 )
286 IF( .NOT.( wntua .OR. wntus .OR. wntuo .OR. wntun ) )
THEN
288 ELSE IF( .NOT.( wntva .OR. wntvs .OR. wntvo .OR. wntvn ) .OR.
289 $ ( wntvo .AND. wntuo ) )
THEN
291 ELSE IF( m.LT.0 )
THEN
293 ELSE IF( n.LT.0 )
THEN
295 ELSE IF( lda.LT.
max( 1, m ) )
THEN
297 ELSE IF( ldu.LT.1 .OR. ( wntuas .AND. ldu.LT.m ) )
THEN
299 ELSE IF( ldvt.LT.1 .OR. ( wntva .AND. ldvt.LT.n ) .OR.
300 $ ( wntvs .AND. ldvt.LT.minmn ) )
THEN
315 IF( m.GE.n .AND. minmn.GT.
THEN
319 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
321 CALL cgeqrf( m, n, a, lda, cdum(1), cdum(1), -1, ierr )
322 lwork_cgeqrf = int( cdum(1) )
324 CALL cungqr( m, n, n, a, lda, cdum(1), cdum(1), -1, ierr )
325 lwork_cungqr_n = int( cdum(1) )
326 CALL cungqr( m, m, n, a, lda, cdum(1), cdum(1), -1, ierr )
327 lwork_cungqr_m = int( cdum(1) )
329 CALL cgebrd( n, n, a, lda, s, dum(1), cdum(1),
330 $ cdum(1), cdum(1), -1, ierr )
331 lwork_cgebrd = int( cdum(1) )
333 CALL cungbr(
'P', n, n, n, a, lda, cdum(1),
334 $ cdum(1), -1, ierr )
335 lwork_cungbr_p = int( cdum(1) )
336 CALL cungbr(
'Q', n, n, n, a, lda, cdum(1),
337 $ cdum(1), -1, ierr )
338 lwork_cungbr_q = int( cdum(1) )
340 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
341 IF( m.GE.mnthr )
THEN
346 maxwrk = n + lwork_cgeqrf
347 maxwrk =
max( maxwrk, 2*n+lwork_cgebrd )
348 IF( wntvo .OR. wntvas )
349 $ maxwrk =
max( maxwrk, 2*n+lwork_cungbr_p )
351 ELSE IF( wntuo .AND. wntvn )
THEN
355 wrkbl = n + lwork_cgeqrf
356 wrkbl =
max( wrkbl, n+lwork_cungqr_n )
357 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
358 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
359 maxwrk =
max( n*n+wrkbl, n*n+m*n )
361 ELSE IF( wntuo .AND. wntvas )
THEN
366 wrkbl = n + lwork_cgeqrf
367 wrkbl =
max( wrkbl, n+lwork_cungqr_n )
368 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
369 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
370 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_p )
373 ELSE IF( wntus .AND. wntvn )
THEN
377 wrkbl = n + lwork_cgeqrf
378 wrkbl =
max( wrkbl, n+lwork_cungqr_n )
379 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
380 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
383 ELSE IF( wntus .AND. wntvo )
THEN
387 wrkbl = n + lwork_cgeqrf
388 wrkbl =
max( wrkbl, n+lwork_cungqr_n )
389 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
390 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
391 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_p )
392 maxwrk = 2*n*n + wrkbl
394 ELSE IF( wntus .AND. wntvas )
THEN
399 wrkbl = n + lwork_cgeqrf
400 wrkbl =
max( wrkbl, n+lwork_cungqr_n )
401 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
402 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
403 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_p )
406 ELSE IF( wntua .AND. wntvn )
THEN
410 wrkbl = n + lwork_cgeqrf
411 wrkbl =
max( wrkbl, n+lwork_cungqr_m )
412 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
413 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
416 ELSE IF( wntua .AND. wntvo )
THEN
420 wrkbl = n + lwork_cgeqrf
421 wrkbl =
max( wrkbl, n+lwork_cungqr_m )
422 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
423 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
424 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_p )
425 maxwrk = 2*n*n + wrkbl
427 ELSE IF( wntua .AND. wntvas )
THEN
432 wrkbl = n + lwork_cgeqrf
433 wrkbl =
max( wrkbl, n+lwork_cungqr_m )
434 wrkbl =
max( wrkbl, 2*n+lwork_cgebrd )
435 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_q )
436 wrkbl =
max( wrkbl, 2*n+lwork_cungbr_p )
444 CALL cgebrd( m, n, a, lda, s, dum(1), cdum(1),
445 $ cdum(1), cdum(1), -1, ierr )
446 lwork_cgebrd = int( cdum(1) )
447 maxwrk = 2*n + lwork_cgebrd
448 IF( wntus .OR. wntuo )
THEN
449 CALL cungbr(
'Q', m, n, n, a, lda, cdum(1),
450 $ cdum(1), -1, ierr )
451 lwork_cungbr_q = int( cdum(1) )
452 maxwrk =
max( maxwrk, 2*n+lwork_cungbr_q )
455 CALL cungbr(
'Q', m, m, n, a, lda, cdum(1),
456 $ cdum(1), -1, ierr )
457 lwork_cungbr_q = int( cdum(1) )
458 maxwrk =
max( maxwrk, 2*n+lwork_cungbr_q )
460 IF( .NOT.wntvn )
THEN
461 maxwrk =
max( maxwrk, 2*n+lwork_cungbr_p )
465 ELSE IF( minmn.GT.0 )
THEN
469 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
471 CALL cgelqf( m, n, a, lda, cdum(1), cdum(1), -1, ierr )
472 lwork_cgelqf = int( cdum(1) )
474 CALL cunglq( n, n, m, cdum(1), n, cdum(1), cdum(1), -1,
476 lwork_cunglq_n = int( cdum(1) )
477 CALL cunglq( m, n, m, a, lda, cdum(1), cdum(1), -1, ierr )
478 lwork_cunglq_m = int( cdum(1) )
480 CALL cgebrd( m, m, a, lda, s, dum(1), cdum(1),
481 $ cdum(1), cdum(1), -1, ierr )
482 lwork_cgebrd = int( cdum(1) )
484 CALL cungbr(
'P', m, m, m, a, n, cdum(1),
485 $ cdum(1), -1, ierr )
486 lwork_cungbr_p = int( cdum(1) )
488 CALL cungbr(
'Q', m, m, m, a, n, cdum(1),
489 $ cdum(1), -1, ierr )
490 lwork_cungbr_q = int( cdum(1) )
491 IF( n.GE.mnthr )
THEN
496 maxwrk = m + lwork_cgelqf
497 maxwrk =
max( maxwrk, 2*m+lwork_cgebrd )
498 IF( wntuo .OR. wntuas )
499 $ maxwrk =
max( maxwrk, 2*m+lwork_cungbr_q )
501 ELSE IF( wntvo .AND. wntun )
THEN
505 wrkbl = m + lwork_cgelqf
506 wrkbl =
max( wrkbl, m+lwork_cunglq_m )
507 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
508 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_p )
509 maxwrk =
max( m*m+wrkbl, m*m+m*n )
511 ELSE IF( wntvo .AND. wntuas )
THEN
516 wrkbl = m + lwork_cgelqf
517 wrkbl =
max( wrkbl, m+lwork_cunglq_m )
518 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
519 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_p )
520 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_q )
521 maxwrk =
max( m*m+wrkbl, m*m+m*n )
523 ELSE IF( wntvs .AND. wntun )
THEN
527 wrkbl = m + lwork_cgelqf
528 wrkbl =
max( wrkbl, m
529 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
530 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_p )
533 ELSE IF( wntvs .AND. wntuo )
THEN
537 wrkbl = m + lwork_cgelqf
538 wrkbl =
max( wrkbl, m+lwork_cunglq_m )
539 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
541 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_q )
542 maxwrk = 2*m*m + wrkbl
544 ELSE IF( wntvs .AND. wntuas )
THEN
549 wrkbl = m + lwork_cgelqf
551 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
552 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_p )
553 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_q )
556 ELSE IF( wntva .AND. wntun )
THEN
560 wrkbl = m + lwork_cgelqf
561 wrkbl =
max( wrkbl, m+lwork_cunglq_n )
562 wrkbl =
max( wrkbl, 2*m
563 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_p )
566 ELSE IF( wntva .AND. wntuo )
THEN
570 wrkbl = m + lwork_cgelqf
571 wrkbl =
max( wrkbl, m+lwork_cunglq_n )
572 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
573 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_p )
574 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_q )
575 maxwrk = 2*m*m + wrkbl
577 ELSE IF( wntva .AND. wntuas )
THEN
582 wrkbl = m + lwork_cgelqf
583 wrkbl =
max( wrkbl, m+lwork_cunglq_n )
584 wrkbl =
max( wrkbl, 2*m+lwork_cgebrd )
586 wrkbl =
max( wrkbl, 2*m+lwork_cungbr_q )
594 CALL cgebrd( m, n, a, lda, s, dum(1), cdum(1),
595 $ cdum(1), cdum(1), -1, ierr )
596 lwork_cgebrd = int( cdum(1) )
597 maxwrk = 2*m + lwork_cgebrd
598 IF( wntvs .OR. wntvo )
THEN
600 CALL cungbr(
'P', m, n, m, a, n, cdum(1),
601 $ cdum(1), -1, ierr )
602 lwork_cungbr_p = int( cdum(1) )
603 maxwrk =
max( maxwrk, 2*m+lwork_cungbr_p )
606 CALL cungbr(
'P', n, n, m, a, n, cdum(1),
607 $ cdum(1), -1, ierr )
608 lwork_cungbr_p = int( cdum(1) )
609 maxwrk =
max( maxwrk, 2*m+lwork_cungbr_p )
611 IF( .NOT.wntun )
THEN
612 maxwrk =
max( maxwrk, 2*m+lwork_cungbr_q )
617 maxwrk =
max( minwrk, maxwrk )
620 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
626 CALL xerbla(
'CGESVD', -info )
628 ELSE IF( lquery )
THEN
634 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
641 smlnum = sqrt( slamch(
'S' ) ) / eps
642 bignum = one / smlnum
646 anrm = clange(
'M', m, n, a, lda, dum )
648 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
650 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
651 ELSE IF( anrm.GT.bignum )
THEN
653 CALL clascl(
'G', 0, 0, anrm, bignum, m, n
662 IF( m.GE.mnthr )
THEN
676 CALL cgeqrf( m, n, a, lda, work( itau ), work( iwork ),
677 $ lwork-iwork+1, ierr )
682 CALL claset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
694 CALL cgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
695 $ work( itaup ), work( iwork ), lwork-iwork+1,
698 IF( wntvo .OR. wntvas )
THEN
704 CALL cungbr(
'P', n, n, n, a, lda, work( itaup ),
705 $ work( iwork ), lwork-iwork+1, ierr )
715 CALL cbdsqr(
'U', n, ncvt, 0, 0, s, rwork( ie ), a, lda,
716 $ cdum, 1, cdum, 1, rwork( irwork ), info )
721 $
CALL clacpy(
'F', n, n, a, lda, vt, ldvt )
723 ELSE IF( wntuo .AND. wntvn )
THEN
729 IF( lwork.GE.n*n+3*n )
THEN
734 IF( lwork.GE.
max( wrkbl, lda*n )+lda*n )
THEN
740 ELSE IF( lwork.GE.
max( wrkbl, lda*n )+n*n )
THEN
750 ldwrku = ( lwork-n*n ) / n
760 CALL cgeqrf( m, n, a, lda, work( itau ),
761 $ work( iwork ), lwork-iwork+1, ierr )
765 CALL clacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
766 CALL claset(
'L', n-1, n-1, czero, czero,
767 $ work( ir+1 ), ldwrkr )
773 CALL cungqr( m, n, n, a, lda, work( itau ),
774 $ work( iwork ), lwork-iwork+1, ierr )
784 CALL cgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
785 $ work( itauq ), work( itaup ),
786 $ work( iwork ), lwork-iwork+1, ierr )
792 CALL cungbr(
'Q', n, n, n, work( ir ), ldwrkr,
793 $ work( itauq ), work( iwork ),
794 $ lwork-iwork+1, ierr )
802 CALL cbdsqr(
'U', n, 0, n, 0, s, rwork( ie ), cdum, 1,
803 $ work( ir ), ldwrkr, cdum, 1,
804 $ rwork( irwork ), info )
812 DO 10 i = 1, m, ldwrku
813 chunk =
min( m-i+1, ldwrku )
814 CALL cgemm(
'N',
'N', chunk, n, n, cone, a( i, 1 ),
815 $ lda, work( ir ), ldwrkr, czero,
816 $ work( iu ), ldwrku )
817 CALL clacpy(
'F', chunk, n, work( iu ), ldwrku,
834 CALL cgebrd( m, n, a, lda, s, rwork( ie ),
835 $ work( itauq ), work( itaup ),
836 $ work( iwork ), lwork-iwork+1, ierr )
842 CALL cungbr(
'Q', m, n, n, a, lda, work( itauq ),
843 $ work( iwork ), lwork-iwork+1, ierr )
851 CALL cbdsqr(
'U', n, 0, m, 0, s, rwork( ie ), cdum, 1,
852 $ a, lda, cdum, 1, rwork( irwork ), info )
856 ELSE IF( wntuo .AND. wntvas )
THEN
862 IF( lwork.GE.n*n+3*n )
THEN
867 IF( lwork.GE.
max( wrkbl, lda*n )+lda*n )
THEN
873 ELSE IF( lwork.GE.
max( wrkbl, lda*n )+n*n )
THEN
883 ldwrku = ( lwork-n*n ) / n
893 CALL cgeqrf( m, n, a, lda, work( itau ),
894 $ work( iwork ), lwork-iwork+1, ierr )
898 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
900 $
CALL claset(
'L', n-1, n-1, czero, czero,
907 CALL cungqr( m, n, n, a, lda, work( itau ),
908 $ work( iwork ), lwork-iwork+1, ierr )
918 CALL cgebrd( n, n, vt, ldvt, s, rwork( ie ),
919 $ work( itauq ), work( itaup ),
920 $ work( iwork ), lwork-iwork+1, ierr )
921 CALL clacpy(
'L', n, n, vt, ldvt, work( ir ), ldwrkr )
927 CALL cungbr(
'Q', n, n, n, work( ir ), ldwrkr,
928 $ work( itauq ), work( iwork ),
929 $ lwork-iwork+1, ierr )
935 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
936 $ work( iwork ), lwork-iwork+1, ierr )
945 CALL cbdsqr(
'U', n, n, n, 0, s, rwork( ie ), vt,
946 $ ldvt, work( ir ), ldwrkr, cdum, 1,
947 $ rwork( irwork ), info )
955 DO 20 i = 1, m, ldwrku
956 chunk =
min( m-i+1, ldwrku )
957 CALL cgemm(
'N',
'N', chunk, n, n, cone, a( i, 1 ),
958 $ lda, work( ir ), ldwrkr, czero,
959 $ work( iu ), ldwrku )
960 CALL clacpy(
'F', chunk, n, work( iu ), ldwrku,
975 CALL cgeqrf( m, n, a, lda, work( itau ),
976 $ work( iwork ), lwork-iwork+1, ierr )
980 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
982 $
CALL claset(
'L', n-1, n-1, czero, czero,
989 CALL cungqr( m, n, n, a, lda, work( itau ),
990 $ work( iwork ), lwork-iwork+1, ierr )
1000 CALL cgebrd( n, n, vt, ldvt, s, rwork( ie ),
1001 $ work( itauq ), work( itaup ),
1002 $ work( iwork ), lwork-iwork+1, ierr )
1008 CALL cunmbr(
'Q', 'r
', 'n
', M, N, N, VT, LDVT,
1009 $ WORK( ITAUQ ), A, LDA, WORK( IWORK ),
1010 $ LWORK-IWORK+1, IERR )
1016 CALL CUNGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1017 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1026 CALL CBDSQR( 'u
', N, N, M, 0, S, RWORK( IE ), VT,
1027 $ LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
1032 ELSE IF( WNTUS ) THEN
1040.GE.
IF( LWORKN*N+3*N ) THEN
1045.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1056 ITAU = IR + LDWRKR*N
1063 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1064 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1068 CALL CLACPY( 'u
', N, N, A, LDA, WORK( IR ),
1070 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1071 $ WORK( IR+1 ), LDWRKR )
1077 CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
1078 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1088 CALL CGEBRD( N, N, WORK( IR ), LDWRKR, S,
1089 $ RWORK( IE ), WORK( ITAUQ ),
1090 $ WORK( ITAUP ), WORK( IWORK ),
1091 $ LWORK-IWORK+1, IERR )
1097 CALL CUNGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
1098 $ WORK( ITAUQ ), WORK( IWORK ),
1099 $ LWORK-IWORK+1, IERR )
1107 CALL CBDSQR( 'u
', N, 0, N, 0, S, RWORK( IE ), CDUM,
1108 $ 1, WORK( IR ), LDWRKR, CDUM, 1,
1109 $ RWORK( IRWORK ), INFO )
1116 CALL CGEMM( 'n
', 'n
', M, N, N, CONE, A, LDA,
1117 $ WORK( IR ), LDWRKR, CZERO, U, LDU )
1130 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1131 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1132 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1138 CALL CUNGQR( M, N, N, U, LDU, WORK( ITAU ),
1139 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1148 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1156 CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
1157 $ WORK( ITAUQ ), WORK( ITAUP ),
1158 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1164 CALL CUNMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1165 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1166 $ LWORK-IWORK+1, IERR )
1174 CALL CBDSQR( 'u
', N, 0, M, 0, S, RWORK( IE ), CDUM,
1175 $ 1, U, LDU, CDUM, 1, RWORK( IRWORK ),
1180 ELSE IF( WNTVO ) THEN
1186.GE.
IF( LWORK2*N*N+3*N ) THEN
1191.GE.
IF( LWORKWRKBL+2*LDA*N ) THEN
1198.GE.
ELSE IF( LWORKWRKBL+( LDA+N )*N ) THEN
1213 ITAU = IR + LDWRKR*N
1220 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1221 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1225 CALL CLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1227 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1228 $ WORK( IU+1 ), LDWRKU )
1234 CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
1235 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1247 CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
1248 $ RWORK( IE ), WORK( ITAUQ ),
1249 $ WORK( ITAUP ), WORK( IWORK ),
1250 $ LWORK-IWORK+1, IERR )
1251 CALL CLACPY( 'u
', N, N, WORK( IU ), LDWRKU,
1252 $ WORK( IR ), LDWRKR )
1258 CALL CUNGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1259 $ WORK( ITAUQ ), WORK( IWORK ),
1260 $ LWORK-IWORK+1, IERR )
1267 CALL CUNGBR( 'p
', N, N, N, WORK( IR ), LDWRKR,
1268 $ WORK( ITAUP ), WORK( IWORK ),
1269 $ LWORK-IWORK+1, IERR )
1278 CALL CBDSQR( 'u
', N, N, N, 0, S, RWORK( IE ),
1279 $ WORK( IR ), LDWRKR, WORK( IU ),
1280 $ LDWRKU, CDUM, 1, RWORK( IRWORK ),
1288 CALL CGEMM( 'n
', 'n
', M, N, N, CONE, A, LDA,
1289 $ WORK( IU ), LDWRKU, CZERO, U, LDU )
1295 CALL CLACPY( 'f
', N, N, WORK( IR ), LDWRKR, A,
1309 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1310 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1311 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1317 CALL CUNGQR( M, N, N, U, LDU, WORK( ITAU ),
1318 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1327 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1335 CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
1336 $ WORK( ITAUQ ), WORK( ITAUP ),
1337 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1343 CALL CUNMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1344 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1345 $ LWORK-IWORK+1, IERR )
1351 CALL CUNGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
1352 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1361 CALL CBDSQR( 'u
', N, N, M, 0, S, RWORK( IE ), A,
1362 $ LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
1367 ELSE IF( WNTVAS ) THEN
1374.GE.
IF( LWORKN*N+3*N ) THEN
1379.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1390 ITAU = IU + LDWRKU*N
1397 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1398 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1402 CALL CLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1404 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1405 $ WORK( IU+1 ), LDWRKU )
1411 CALL CUNGQR( M, N, N, A, LDA, WORK( ITAU ),
1412 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1422 CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
1423 $ RWORK( IE ), WORK( ITAUQ ),
1424 $ WORK( ITAUP ), WORK( IWORK ),
1425 $ LWORK-IWORK+1, IERR )
1426 CALL CLACPY( 'u
', N, N, WORK( IU ), LDWRKU, VT,
1433 CALL CUNGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1434 $ WORK( ITAUQ ), WORK( IWORK ),
1435 $ LWORK-IWORK+1, IERR )
1442 CALL CUNGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1443 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1452 CALL CBDSQR( 'u
', N, N, N, 0, S, RWORK( IE ), VT,
1453 $ LDVT, WORK( IU ), LDWRKU, CDUM, 1,
1454 $ RWORK( IRWORK ), INFO )
1461 CALL CGEMM( 'n
', 'n
', M, N, N, CONE, A, LDA,
1462 $ WORK( IU ), LDWRKU, CZERO, U, LDU )
1475 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1476 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1477 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1483 CALL CUNGQR( M, N, N, U, LDU, WORK( ITAU ),
1484 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1488 CALL CLACPY( 'u
', N, N, A, LDA, VT, LDVT )
1490 $ CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1491 $ VT( 2, 1 ), LDVT )
1501 CALL CGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
1502 $ WORK( ITAUQ ), WORK( ITAUP ),
1503 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1510 CALL CUNMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
1511 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1512 $ LWORK-IWORK+1, IERR )
1518 CALL CUNGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1519 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1528 CALL CBDSQR( 'u
', N, N, M, 0, S, RWORK( IE ), VT,
1529 $ LDVT, U, LDU, CDUM, 1,
1530 $ RWORK( IRWORK ), INFO )
1536 ELSE IF( WNTUA ) THEN
1544.GE.
IF( LWORKN*N+MAX( N+M, 3*N ) ) THEN
1549.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1560 ITAU = IR + LDWRKR*N
1567 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1568 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1569 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1573 CALL CLACPY( 'u
', N, N, A, LDA, WORK( IR ),
1575 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1576 $ WORK( IR+1 ), LDWRKR )
1582 CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1583 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1593 CALL CGEBRD( N, N, WORK( IR ), LDWRKR, S,
1594 $ RWORK( IE ), WORK( ITAUQ ),
1595 $ WORK( ITAUP ), WORK( IWORK ),
1596 $ LWORK-IWORK+1, IERR )
1602 CALL CUNGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
1603 $ WORK( ITAUQ ), WORK( IWORK ),
1604 $ LWORK-IWORK+1, IERR )
1612 CALL CBDSQR( 'u
', N, 0, N, 0, S, RWORK( IE ), CDUM,
1613 $ 1, WORK( IR ), LDWRKR, CDUM, 1,
1614 $ RWORK( IRWORK ), INFO )
1621 CALL CGEMM( 'n
', 'n
', M, N, N, CONE, U, LDU,
1622 $ WORK( IR ), LDWRKR, CZERO, A, LDA )
1626 CALL CLACPY( 'f
', M, N, A, LDA, U, LDU )
1639 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1640 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1641 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1647 CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1648 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1657 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1665 CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
1666 $ WORK( ITAUQ ), WORK( ITAUP ),
1667 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1674 CALL CUNMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1675 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1676 $ LWORK-IWORK+1, IERR )
1684 CALL CBDSQR( 'u
', N, 0, M, 0, S, RWORK( IE ), CDUM,
1685 $ 1, U, LDU, CDUM, 1, RWORK( IRWORK ),
1690 ELSE IF( WNTVO ) THEN
1696.GE.
IF( LWORK2*N*N+MAX( N+M, 3*N ) ) THEN
1701.GE.
IF( LWORKWRKBL+2*LDA*N ) THEN
1708.GE.
ELSE IF( LWORKWRKBL+( LDA+N )*N ) THEN
1723 ITAU = IR + LDWRKR*N
1730 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1731 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1732 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1738 CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1739 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1743 CALL CLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1745 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1746 $ WORK( IU+1 ), LDWRKU )
1758 CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
1759 $ RWORK( IE ), WORK( ITAUQ ),
1760 $ WORK( ITAUP ), WORK( IWORK ),
1761 $ LWORK-IWORK+1, IERR )
1762 CALL CLACPY( 'u
', N, N, WORK( IU ), LDWRKU,
1763 $ WORK( IR ), LDWRKR )
1769 CALL CUNGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1770 $ WORK( ITAUQ ), WORK( IWORK ),
1771 $ LWORK-IWORK+1, IERR )
1778 CALL CUNGBR( 'p
', N, N, N, WORK( IR ), LDWRKR,
1779 $ WORK( ITAUP ), WORK( IWORK ),
1780 $ LWORK-IWORK+1, IERR )
1789 CALL CBDSQR( 'u
', N, N, N, 0, S, RWORK( IE ),
1790 $ WORK( IR ), LDWRKR, WORK( IU ),
1791 $ LDWRKU, CDUM, 1, RWORK( IRWORK ),
1799 CALL CGEMM( 'n
', 'n
', M, N, N, CONE, U, LDU,
1800 $ WORK( IU ), LDWRKU, CZERO, A, LDA )
1804 CALL CLACPY( 'f
', M, N, A, LDA, U, LDU )
1808 CALL CLACPY( 'f
', N, N, WORK( IR ), LDWRKR, A,
1822 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1823 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1824 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1830 CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1831 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1840 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1848 CALL CGEBRD( N, N, A, LDA, S, RWORK( IE ),
1849 $ WORK( ITAUQ ), WORK( ITAUP ),
1850 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1857 CALL CUNMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1858 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1859 $ LWORK-IWORK+1, IERR )
1865 CALL CUNGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
1866 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1875 CALL CBDSQR( 'u
', N, N, M, 0, S, RWORK( IE ), A,
1876 $ LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
1881 ELSE IF( WNTVAS ) THEN
1888.GE.
IF( LWORKN*N+MAX( N+M, 3*N ) ) THEN
1893.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1904 ITAU = IU + LDWRKU*N
1911 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1912 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1913 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
1919 CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
1920 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1924 CALL CLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1926 CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
1927 $ WORK( IU+1 ), LDWRKU )
1937 CALL CGEBRD( N, N, WORK( IU ), LDWRKU, S,
1938 $ RWORK( IE ), WORK( ITAUQ ),
1939 $ WORK( ITAUP ), WORK( IWORK ),
1940 $ LWORK-IWORK+1, IERR )
1941 CALL CLACPY( 'u
', N, N, WORK( IU ), LDWRKU, VT,
1948 CALL CUNGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1949 $ WORK( ITAUQ ), WORK( IWORK ),
1950 $ LWORK-IWORK+1, IERR )
1957 CALL CUNGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1958 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1967 CALL CBDSQR( 'u
', N, N, N, 0, S, RWORK( IE ), VT,
1968 $ LDVT, WORK( IU ), LDWRKU, CDUM, 1,
1969 $ RWORK( IRWORK ), INFO )
1976 CALL CGEMM( 'n
', 'n
', M, N, N, CONE, U, LDU,
1977 $ WORK( IU ), LDWRKU, CZERO, A, LDA )
1981 CALL CLACPY( 'f
', M, N, A, LDA, U, LDU )
1994 CALL CGEQRF( M, N, A, LDA, WORK( ITAU ),
1995 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1996 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
2002 CALL CUNGQR( M, M, N, U, LDU, WORK( ITAU ),
2003 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2007 CALL CLACPY( 'u
', N, N, A, LDA, VT, LDVT )
2009 $ CALL CLASET( 'l
', N-1, N-1, CZERO, CZERO,
2010 $ VT( 2, 1 ), LDVT )
2020 CALL CGEBRD( N, N, VT, LDVT, S, RWORK( IE ),
2021 $ WORK( ITAUQ ), WORK( ITAUP ),
2022 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2029 CALL CUNMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
2030 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
2031 $ LWORK-IWORK+1, IERR )
2037 CALL CUNGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
2038 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2047 CALL CBDSQR( 'u
', N, N, M, 0, S, RWORK( IE ), VT,
2048 $ LDVT, U, LDU, CDUM, 1,
2049 $ RWORK( IRWORK ), INFO )
2073 CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
2074 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
2083 CALL CLACPY( 'l
', M, N, A, LDA, U, LDU )
2088 CALL CUNGBR( 'q
', M, NCU, N, U, LDU, WORK( ITAUQ ),
2089 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2098 CALL CLACPY( 'u
', N, N, A, LDA, VT, LDVT )
2099 CALL CUNGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
2100 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2109 CALL CUNGBR( 'q
', M, N, N, A, LDA, WORK( ITAUQ ),
2110 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2119 CALL CUNGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
2120 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2123.OR.
IF( WNTUAS WNTUO )
2127.OR.
IF( WNTVAS WNTVO )
2131.NOT..AND..NOT.
IF( ( WNTUO ) ( WNTVO ) ) THEN
2139 CALL CBDSQR( 'u
', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
2140 $ LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
2142.NOT..AND.
ELSE IF( ( WNTUO ) WNTVO ) THEN
2150 CALL CBDSQR( 'u
', N, NCVT, NRU, 0, S, RWORK( IE ), A,
2151 $ LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
2161 CALL CBDSQR( 'u
', N, NCVT, NRU, 0, S, RWORK( IE ), VT,
2162 $ LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
2174.GE.
IF( NMNTHR ) THEN
2188 CALL CGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
2189 $ LWORK-IWORK+1, IERR )
2193 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO, A( 1, 2 ),
2204 CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
2205 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
2207.OR.
IF( WNTUO WNTUAS ) THEN
2213 CALL CUNGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
2214 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2218.OR.
IF( WNTUO WNTUAS )
2226 CALL CBDSQR( 'u
', M, 0, NRU, 0, S, RWORK( IE ), CDUM, 1,
2227 $ A, LDA, CDUM, 1, RWORK( IRWORK ), INFO )
2232 $ CALL CLACPY( 'f
', M, M, A, LDA, U, LDU )
2234.AND.
ELSE IF( WNTVO WNTUN ) THEN
2240.GE.
IF( LWORKM*M+3*M ) THEN
2245.GE.
IF( LWORKMAX( WRKBL, LDA*N )+LDA*M ) THEN
2252.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N )+M*M ) THEN
2264 CHUNK = ( LWORK-M*M ) / M
2267 ITAU = IR + LDWRKR*M
2274 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
2275 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2279 CALL CLACPY( 'l
', M, M, A, LDA, WORK( IR ), LDWRKR )
2280 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
2281 $ WORK( IR+LDWRKR ), LDWRKR )
2287 CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2288 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2298 CALL CGEBRD( M, M, WORK( IR ), LDWRKR, S, RWORK( IE ),
2299 $ WORK( ITAUQ ), WORK( ITAUP ),
2300 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2306 CALL CUNGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2307 $ WORK( ITAUP ), WORK( IWORK ),
2308 $ LWORK-IWORK+1, IERR )
2316 CALL CBDSQR( 'u
', M, M, 0, 0, S, RWORK( IE ),
2317 $ WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
2318 $ RWORK( IRWORK ), INFO )
2326 DO 30 I = 1, N, CHUNK
2327 BLK = MIN( N-I+1, CHUNK )
2328 CALL CGEMM( 'n
', 'n
', M, BLK, M, CONE, WORK( IR ),
2329 $ LDWRKR, A( 1, I ), LDA, CZERO,
2330 $ WORK( IU ), LDWRKU )
2331 CALL CLACPY( 'f
', M, BLK, WORK( IU ), LDWRKU,
2348 CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ),
2349 $ WORK( ITAUQ ), WORK( ITAUP ),
2350 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2356 CALL CUNGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
2357 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2365 CALL CBDSQR( 'l
', M, N, 0, 0, S, RWORK( IE ), A, LDA,
2366 $ CDUM, 1, CDUM, 1, RWORK( IRWORK ), INFO )
2370.AND.
ELSE IF( WNTVO WNTUAS ) THEN
2376.GE.
IF( LWORKM*M+3*M ) THEN
2381.GE.
IF( LWORKMAX( WRKBL, LDA*N )+LDA*M ) THEN
2388.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N )+M*M ) THEN
2400 CHUNK = ( LWORK-M*M ) / M
2403 ITAU = IR + LDWRKR*M
2410 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
2411 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2415 CALL CLACPY( 'l
', M, M, A, LDA, U, LDU )
2416 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
2423 CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2424 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2434 CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
2435 $ WORK( ITAUQ ), WORK( ITAUP ),
2436 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2437 CALL CLACPY( 'u
', M, M, U, LDU, WORK( IR ), LDWRKR )
2443 CALL CUNGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2444 $ WORK( ITAUP ), WORK( IWORK ),
2445 $ LWORK-IWORK+1, IERR )
2451 CALL CUNGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2452 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2461 CALL CBDSQR( 'u
', M, M, M, 0, S, RWORK( IE ),
2462 $ WORK( IR ), LDWRKR, U, LDU, CDUM, 1,
2463 $ RWORK( IRWORK ), INFO )
2471 DO 40 I = 1, N, CHUNK
2472 BLK = MIN( N-I+1, CHUNK )
2473 CALL CGEMM( 'n
', 'n
', M, BLK, M, CONE, WORK( IR ),
2474 $ LDWRKR, A( 1, I ), LDA, CZERO,
2475 $ WORK( IU ), LDWRKU )
2476 CALL CLACPY( 'f
', M, BLK, WORK( IU ), LDWRKU,
2491 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
2492 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2496 CALL CLACPY( 'l
', M, M, A, LDA, U, LDU )
2497 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO, U( 1, 2 ),
2504 CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2505 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2515 CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
2516 $ WORK( ITAUQ ), WORK( ITAUP ),
2517 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2523 CALL CUNMBR( 'p
', 'l
', 'c
', M, N, M, U, LDU,
2524 $ WORK( ITAUP ), A, LDA, WORK( IWORK ),
2525 $ LWORK-IWORK+1, IERR )
2531 CALL CUNGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2532 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2541 CALL CBDSQR( 'u
', M, N, M, 0, S, RWORK( IE ), A, LDA,
2542 $ U, LDU, CDUM, 1, RWORK( IRWORK ), INFO )
2546 ELSE IF( WNTVS ) THEN
2554.GE.
IF( LWORKM*M+3*M ) THEN
2559.GE.
IF( LWORKWRKBL+LDA*M ) THEN
2570 ITAU = IR + LDWRKR*M
2577 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
2578 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2582 CALL CLACPY( 'l
', M, M, A, LDA, WORK( IR ),
2584 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
2585 $ WORK( IR+LDWRKR ), LDWRKR )
2591 CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2592 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2602 CALL CGEBRD( M, M, WORK( IR ), LDWRKR, S,
2603 $ RWORK( IE ), WORK( ITAUQ ),
2604 $ WORK( ITAUP ), WORK( IWORK ),
2605 $ LWORK-IWORK+1, IERR )
2612 CALL CUNGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2613 $ WORK( ITAUP ), WORK( IWORK ),
2614 $ LWORK-IWORK+1, IERR )
2622 CALL CBDSQR( 'u
', M, M, 0, 0, S, RWORK( IE ),
2623 $ WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
2624 $ RWORK( IRWORK ), INFO )
2631 CALL CGEMM( 'n
', 'n
', M, N, M, CONE, WORK( IR ),
2632 $ LDWRKR, A, LDA, CZERO, VT, LDVT )
2645 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
2646 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2650 CALL CLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2656 CALL CUNGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2657 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2665 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
2672 CALL CGEBRD( M, M, A, LDA, S, RWORK( IE ),
2673 $ WORK( ITAUQ ), WORK( ITAUP ),
2674 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2680 CALL CUNMBR( 'p
', 'l
', 'c
', M, N, M, A, LDA,
2681 $ WORK( ITAUP ), VT, LDVT,
2682 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2690 CALL CBDSQR( 'u
', M, N, 0, 0, S, RWORK( IE ), VT,
2691 $ LDVT, CDUM, 1, CDUM, 1,
2692 $ RWORK( IRWORK ), INFO )
2696 ELSE IF( WNTUO ) THEN
2702.GE.
IF( LWORK2*M*M+3*M ) THEN
2707.GE.
IF( LWORKWRKBL+2*LDA*M ) THEN
2714.GE.
ELSE IF( LWORKWRKBL+( LDA+M )*M ) THEN
2729 ITAU = IR + LDWRKR*M
2736 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
2737 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2741 CALL CLACPY( 'l
', M, M, A, LDA, WORK( IU ),
2743 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
2744 $ WORK( IU+LDWRKU ), LDWRKU )
2750 CALL CUNGLQ( M, N, M, A, LDA, WORK( ITAU ),
2751 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2763 CALL CGEBRD( M, M, WORK( IU ), LDWRKU, S,
2764 $ RWORK( IE ), WORK( ITAUQ ),
2765 $ WORK( ITAUP ), WORK( IWORK ),
2766 $ LWORK-IWORK+1, IERR )
2767 CALL CLACPY( 'l
', M, M, WORK( IU ), LDWRKU,
2768 $ WORK( IR ), LDWRKR )
2775 CALL CUNGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
2776 $ WORK( ITAUP ), WORK( IWORK ),
2777 $ LWORK-IWORK+1, IERR )
2783 CALL CUNGBR( 'q
', M, M, M, WORK( IR ), LDWRKR,
2784 $ WORK( ITAUQ ), WORK( IWORK ),
2785 $ LWORK-IWORK+1, IERR )
2794 CALL CBDSQR( 'u
', M, M, M, 0, S, RWORK( IE ),
2795 $ WORK( IU ), LDWRKU, WORK( IR ),
2796 $ LDWRKR, CDUM, 1, RWORK( IRWORK ),
2804 CALL CGEMM( 'n
', 'n
', M, N, M, CONE, WORK( IU ),
2805 $ LDWRKU, A, LDA, CZERO, VT, LDVT )
2811 CALL CLACPY( 'f', m, m, work( ir ), ldwrkr, a,
2825 CALL cgelqf( m, n, a, lda, work( itau ),
2826 $ work( iwork ), lwork-iwork+1, ierr )
2827 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
2833 CALL cunglq( m, n, m, vt, ldvt, work( itau ),
2834 $ work( iwork ), lwork-iwork+1, ierr )
2842 CALL claset(
'U', m-1, m-1, czero
2850 $ work( itauq ), work( itaup ),
2851 $ work( iwork ), lwork-iwork+1, ierr )
2857 CALL cunmbr(
'P',
'L',
'C', m, n, m, a, lda,
2858 $ work( itaup ), vt, ldvt
2859 $ work( iwork ), lwork-iwork+1, ierr )
2865 CALL cungbr(
'Q', m, m, m, a, lda, work( itauq ),
2866 $ work( iwork ), lwork-iwork+1, ierr )
2875 CALL cbdsqr(
'U', m, n, m, 0, s,
2876 $ ldvt, a, lda, cdum, 1,
2877 $ rwork( irwork ), info )
2881 ELSE IF( wntuas )
THEN
2888 IF( lwork.GE.m*m+3*m )
THEN
2893 IF( lwork.GE.wrkbl+lda*m )
THEN
2904 itau = iu + ldwrku*m
2911 CALL cgelqf( m, n, a, lda, work( itau ),
2912 $ work( iwork ), lwork-iwork+1, ierr )
2916 CALL clacpy(
'L', m, m, a, lda, work( iu ),
2918 CALL claset(
'U', m-1, m-1, czero, czero,
2919 $ work( iu+ldwrku ), ldwrku )
2925 CALL cunglq( m, n, m, a, lda, work( itau ),
2926 $ work( iwork ), lwork-iwork+1, ierr )
2936 CALL cgebrd( m, m, work( iu ), ldwrku, s,
2937 $ rwork( ie ), work( itauq ),
2938 $ work( itaup ), work( iwork ),
2939 $ lwork-iwork+1, ierr )
2940 CALL clacpy(
'L', m, m, work( iu ), ldwrku, u,
2948 CALL cungbr(
'P', m, m, m, work( iu ), ldwrku,
2949 $ work( itaup ), work( iwork ),
2950 $ lwork-iwork+1, ierr )
2956 CALL cungbr(
'Q', m, m, m, u, ldu, work( itauq ),
2957 $ work( iwork ), lwork-iwork+1, ierr )
2966 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
2967 $ work( iu ), ldwrku, u, ldu, cdum, 1,
2968 $ rwork( irwork ), info )
2975 CALL cgemm(
'N',
'N', m, n, m, cone, work( iu ),
2976 $ ldwrku, a, lda, czero, vt, ldvt )
2989 CALL cgelqf( m, n, a, lda, work( itau ),
2990 $ work( iwork ), lwork-iwork+1, ierr )
2991 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
2997 CALL cunglq( m, n, m, vt, ldvt, work( itau ),
2998 $ work( iwork ), lwork-iwork+1, ierr )
3002 CALL clacpy(
'L', m, m, a, lda, u, ldu )
3003 CALL claset( 'u
', M-1, M-1, CZERO, CZERO,
3014 CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
3015 $ WORK( ITAUQ ), WORK( ITAUP ),
3016 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3023 CALL CUNMBR( 'p
', 'l
', 'c
', M, N, M, U, LDU,
3024 $ WORK( ITAUP ), VT, LDVT,
3025 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3031 CALL CUNGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
3032 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3041 CALL CBDSQR( 'u
', M, N, M, 0, S, RWORK( IE ), VT,
3042 $ LDVT, U, LDU, CDUM, 1,
3043 $ RWORK( IRWORK ), INFO )
3049 ELSE IF( WNTVA ) THEN
3057.GE.
IF( LWORKM*M+MAX( N+M, 3*M ) ) THEN
3062.GE.
IF( LWORKWRKBL+LDA*M ) THEN
3073 ITAU = IR + LDWRKR*M
3080 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
3081 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3082 CALL CLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3086 CALL CLACPY( 'l
', M, M, A, LDA, WORK( IR ),
3088 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
3089 $ WORK( IR+LDWRKR ), LDWRKR )
3095 CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3096 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3106 CALL CGEBRD( M, M, WORK( IR ), LDWRKR, S,
3107 $ RWORK( IE ), WORK( ITAUQ ),
3108 $ WORK( ITAUP ), WORK( IWORK ),
3109 $ LWORK-IWORK+1, IERR )
3116 CALL CUNGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
3117 $ WORK( ITAUP ), WORK( IWORK ),
3118 $ LWORK-IWORK+1, IERR )
3126 CALL CBDSQR( 'u
', M, M, 0, 0, S, RWORK( IE ),
3127 $ WORK( IR ), LDWRKR, CDUM, 1, CDUM, 1,
3128 $ RWORK( IRWORK ), INFO )
3135 CALL CGEMM( 'n
', 'n
', M, N, M, CONE, WORK( IR ),
3136 $ LDWRKR, VT, LDVT, CZERO, A, LDA )
3140 CALL CLACPY( 'f', m, n, a, lda, vt, ldvt )
3153 CALL cgelqf( m, n, a, lda, work( itau ),
3154 $ work( iwork ), lwork-iwork+1, ierr )
3155 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3161 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3162 $ work( iwork ), lwork-iwork+1, ierr )
3170 CALL claset(
'U', m-1, m-1, czero, czero,
3177 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
3178 $ work( itauq ), work( itaup ),
3179 $ work( iwork ), lwork-iwork+1, ierr )
3186 CALL cunmbr(
'P',
'L',
'C', m, n, m, a, lda,
3187 $ work( itaup ), vt, ldvt,
3188 $ work( iwork ), lwork-iwork+1, ierr )
3196 CALL cbdsqr(
'U', m, n, 0, 0, s, rwork( ie ), vt,
3197 $ ldvt, cdum, 1, cdum, 1,
3198 $ rwork( irwork ), info )
3202 ELSE IF( wntuo )
THEN
3208 IF( lwork.GE.2*m*m+
max( n+m, 3*m ) )
THEN
3213 IF( lwork.GE.wrkbl+2*lda*m )
THEN
3220 ELSE IF( lwork.GE.wrkbl+( lda+m )*m )
THEN
3235 itau = ir + ldwrkr*m
3242 CALL cgelqf( m, n, a, lda, work( itau ),
3243 $ work( iwork ), lwork-iwork+1, ierr )
3244 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3250 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3251 $ work( iwork ), lwork-iwork+1, ierr )
3255 CALL clacpy(
'L', m, m, a, lda, work( iu ),
3257 CALL claset(
'U', m-1, m-1, czero, czero,
3258 $ work( iu+ldwrku ), ldwrku )
3270 CALL cgebrd( m, m, work( iu ), ldwrku, s,
3271 $ rwork( ie ), work( itauq ),
3272 $ work( itaup ), work( iwork ),
3273 $ lwork-iwork+1, ierr )
3274 CALL clacpy(
'L', m, m, work( iu ), ldwrku,
3275 $ work( ir ), ldwrkr )
3282 CALL cungbr(
'P', m, m, m, work( iu ), ldwrku,
3283 $ work( itaup ), work( iwork ),
3284 $ lwork-iwork+1, ierr )
3290 CALL cungbr(
'Q', m, m, m, work( ir ), ldwrkr,
3291 $ work( itauq ), work( iwork ),
3292 $ lwork-iwork+1, ierr )
3301 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
3302 $ work( iu ), ldwrku, work( ir ),
3303 $ ldwrkr, cdum, 1, rwork( irwork ),
3311 CALL cgemm(
'N',
'N', m, n, m, cone, work( iu ),
3312 $ ldwrku, vt, ldvt, czero, a, lda )
3316 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
3320 CALL clacpy(
'F', m, m, work( ir ), ldwrkr, a,
3334 CALL cgelqf( m, n, a, lda, work( itau ),
3335 $ work( iwork ), lwork-iwork+1, ierr )
3336 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3342 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3343 $ work( iwork ), lwork-iwork+1, ierr )
3351 CALL claset(
'U', m-1, m-1, czero, czero,
3358 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
3359 $ work( itauq ), work( itaup ),
3360 $ work( iwork ), lwork-iwork+1, ierr )
3367 CALL cunmbr( 'p
', 'l
', 'c
', M, N, M, A, LDA,
3368 $ WORK( ITAUP ), VT, LDVT,
3369 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3375 CALL CUNGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
3376 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3385 CALL CBDSQR( 'u
', M, N, M, 0, S, RWORK( IE ), VT,
3386 $ LDVT, A, LDA, CDUM, 1,
3387 $ RWORK( IRWORK ), INFO )
3391 ELSE IF( WNTUAS ) THEN
3398.GE.
IF( LWORKM*M+MAX( N+M, 3*M ) ) THEN
3403.GE.
IF( LWORKWRKBL+LDA*M ) THEN
3414 ITAU = IU + LDWRKU*M
3421 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
3422 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3423 CALL CLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3429 CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3430 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3434 CALL CLACPY( 'l
', M, M, A, LDA, WORK( IU ),
3436 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
3437 $ WORK( IU+LDWRKU ), LDWRKU )
3447 CALL CGEBRD( M, M, WORK( IU ), LDWRKU, S,
3448 $ RWORK( IE ), WORK( ITAUQ ),
3449 $ WORK( ITAUP ), WORK( IWORK ),
3450 $ LWORK-IWORK+1, IERR )
3451 CALL CLACPY( 'l
', M, M, WORK( IU ), LDWRKU, U,
3458 CALL CUNGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
3459 $ WORK( ITAUP ), WORK( IWORK ),
3460 $ LWORK-IWORK+1, IERR )
3466 CALL CUNGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
3467 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3476 CALL CBDSQR( 'u
', M, M, M, 0, S, RWORK( IE ),
3477 $ WORK( IU ), LDWRKU, U, LDU, CDUM, 1,
3478 $ RWORK( IRWORK ), INFO )
3485 CALL CGEMM( 'n
', 'n
', M, N, M, CONE, WORK( IU ),
3486 $ LDWRKU, VT, LDVT, CZERO, A, LDA )
3490 CALL CLACPY( 'f
', M, N, A, LDA, VT, LDVT )
3503 CALL CGELQF( M, N, A, LDA, WORK( ITAU ),
3504 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3505 CALL CLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3511 CALL CUNGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3512 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3516 CALL CLACPY( 'l
', M, M, A, LDA, U, LDU )
3517 CALL CLASET( 'u
', M-1, M-1, CZERO, CZERO,
3528 CALL CGEBRD( M, M, U, LDU, S, RWORK( IE ),
3529 $ WORK( ITAUQ ), WORK( ITAUP ),
3530 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3537 CALL CUNMBR( 'p
', 'l
', 'c
', M, N, M, U, LDU,
3538 $ WORK( ITAUP ), VT, LDVT,
3539 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3545 CALL CUNGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
3546 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3555 CALL CBDSQR( 'u
', M, N, M, 0, S, RWORK( IE ), VT,
3556 $ LDVT, U, LDU, CDUM, 1,
3557 $ RWORK( IRWORK ), INFO )
3581 CALL CGEBRD( M, N, A, LDA, S, RWORK( IE ), WORK( ITAUQ ),
3582 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
3591 CALL CLACPY( 'l
', M, M, A, LDA, U, LDU )
3592 CALL CUNGBR( 'q
', M, M, N, U, LDU, WORK( ITAUQ ),
3593 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3602 CALL CLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3607 CALL CUNGBR( 'p
', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
3608 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3617 CALL CUNGBR( 'q
', M, M, N, A, LDA, WORK( ITAUQ ),
3618 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3627 CALL CUNGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
3628 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3631.OR.
IF( WNTUAS WNTUO )
3635.OR.
IF( WNTVAS WNTVO )
3639.NOT..AND..NOT.
IF( ( WNTUO ) ( WNTVO ) ) THEN
3647 CALL CBDSQR( 'l
', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
3648 $ LDVT, U, LDU, CDUM, 1, RWORK( IRWORK ),
3650.NOT..AND.
ELSE IF( ( WNTUO ) WNTVO ) THEN
3658 CALL CBDSQR( 'l
', M, NCVT, NRU, 0, S, RWORK( IE ), A,
3659 $ LDA, U, LDU, CDUM, 1, RWORK( IRWORK ),
3669 CALL CBDSQR( 'l
', M, NCVT, NRU, 0, S, RWORK( IE ), VT,
3670 $ LDVT, A, LDA, CDUM, 1, RWORK( IRWORK ),
3680.EQ.
IF( ISCL1 ) THEN
3681.GT.
IF( ANRMBIGNUM )
3682 $ CALL SLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
3684.NE..AND..GT.
IF( INFO0 ANRMBIGNUM )
3685 $ CALL SLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN-1, 1,
3686 $ RWORK( IE ), MINMN, IERR )
3687.LT.
IF( ANRMSMLNUM )
3688 $ CALL SLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
3690.NE..AND..LT.
IF( INFO0 ANRMSMLNUM )
3691 $ CALL SLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN-1, 1,
3692 $ RWORK( IE ), MINMN, IERR )