210 SUBROUTINE cgesvd( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT,
212 $ WORK, LWORK, RWORK, INFO )
219 CHARACTER JOBU, JOBVT
220 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
223 REAL RWORK( * ), S( * )
224 COMPLEX A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
232 PARAMETER ( CZERO = ( 0.0e0, 0.0e0 ),
233 $ cone = ( 1.0e0, 0.0e0 ) )
235 PARAMETER ( ZERO = 0.0e0, one = 1.0e0 )
238 LOGICAL LQUERY, WNTUA, WNTUAS, WNTUN, WNTUO, WNTUS,
239 $ WNTVA, WNTVAS, WNTVN, WNTVO, WNTVS
240 INTEGER BLK, CHUNK, I, IE, IERR, IR, IRWORK, ISCL,
241 $ ITAU, ITAUP, ITAUQ, IU, IWORK, LDWRKR, LDWRKU,
242 $ maxwrk, minmn, minwrk, mnthr, ncu, ncvt, nru,
244 INTEGER LWORK_CGEQRF, LWORK_CUNGQR_N, LWORK_CUNGQR_M,
245 $ LWORK_CGEBRD, LWORK_CUNGBR_P, LWORK_CUNGBR_Q,
246 $ lwork_cgelqf, lwork_cunglq_n, lwork_cunglq_m
247 REAL ANRM, BIGNUM, EPS, SMLNUM
262 REAL CLANGE, SLAMCH, SROUNDUP_LWORK
263 EXTERNAL lsame, ilaenv, clange, slamch,
267 INTRINSIC max, min, sqrt
275 wntua = lsame( jobu,
'A' )
276 wntus = lsame( jobu,
'S' )
277 wntuas = wntua .OR. wntus
278 wntuo = lsame( jobu,
'O' )
279 wntun = lsame( jobu,
'N' )
280 wntva = lsame( jobvt,
'A' )
281 wntvs = lsame( jobvt,
'S' )
282 wntvas = wntva .OR. wntvs
283 wntvo = lsame( jobvt,
'O' )
284 wntvn = lsame( jobvt,
'N' )
285 lquery = ( lwork.EQ.-1 )
287 IF( .NOT.( wntua .OR. wntus .OR. wntuo .OR. wntun ) )
THEN
289 ELSE IF( .NOT.( wntva .OR. wntvs .OR. wntvo .OR. wntvn ) .OR.
290 $ ( wntvo .AND. wntuo ) )
THEN
292 ELSE IF( m.LT.0 )
THEN
294 ELSE IF( n.LT.0 )
THEN
296 ELSE IF( lda.LT.max( 1, m ) )
THEN
298 ELSE IF( ldu.LT.1 .OR. ( wntuas .AND. ldu.LT.m ) )
THEN
300 ELSE IF( ldvt.LT.1 .OR. ( wntva .AND. ldvt.LT.n ) .OR.
301 $ ( wntvs .AND. ldvt.LT.minmn ) )
THEN
316 IF( m.GE.n .AND. minmn.GT.0 )
THEN
320 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
322 CALL cgeqrf( m, n, a, lda, cdum(1), cdum(1), -1, ierr )
323 lwork_cgeqrf = int( cdum(1) )
325 CALL cungqr( m, n, n, a, lda, cdum(1), cdum(1), -1,
327 lwork_cungqr_n = int( cdum(1) )
328 CALL cungqr( m, m, n, a, lda, cdum(1), cdum(1), -1,
330 lwork_cungqr_m = int( cdum(1) )
332 CALL cgebrd( n, n, a, lda, s, dum(1), cdum(1),
333 $ cdum(1), cdum(1), -1, ierr )
334 lwork_cgebrd = int( cdum(1) )
336 CALL cungbr(
'P', n, n, n, a, lda, cdum(1),
337 $ cdum(1), -1, ierr )
338 lwork_cungbr_p = int( cdum(1) )
339 CALL cungbr(
'Q', n, n, n, a, lda, cdum(1),
340 $ cdum(1), -1, ierr )
341 lwork_cungbr_q = int( cdum(1) )
343 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
344 IF( m.GE.mnthr )
THEN
349 maxwrk = n + lwork_cgeqrf
350 maxwrk = max( maxwrk, 2*n+lwork_cgebrd )
351 IF( wntvo .OR. wntvas )
352 $ maxwrk = max( maxwrk, 2*n+lwork_cungbr_p )
354 ELSE IF( wntuo .AND. wntvn )
THEN
358 wrkbl = n + lwork_cgeqrf
359 wrkbl = max( wrkbl, n+lwork_cungqr_n )
360 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
361 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
362 maxwrk = max( n*n+wrkbl, n*n+m*n )
364 ELSE IF( wntuo .AND. wntvas )
THEN
369 wrkbl = n + lwork_cgeqrf
370 wrkbl = max( wrkbl, n+lwork_cungqr_n )
371 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
372 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
373 wrkbl = max( wrkbl, 2*n+lwork_cungbr_p )
374 maxwrk = max( n*n+wrkbl, n*n+m*n )
376 ELSE IF( wntus .AND. wntvn )
THEN
380 wrkbl = n + lwork_cgeqrf
381 wrkbl = max( wrkbl, n+lwork_cungqr_n )
382 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
383 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
386 ELSE IF( wntus .AND. wntvo )
THEN
390 wrkbl = n + lwork_cgeqrf
391 wrkbl = max( wrkbl, n+lwork_cungqr_n )
392 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
393 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
394 wrkbl = max( wrkbl, 2*n+lwork_cungbr_p )
395 maxwrk = 2*n*n + wrkbl
397 ELSE IF( wntus .AND. wntvas )
THEN
402 wrkbl = n + lwork_cgeqrf
403 wrkbl = max( wrkbl, n+lwork_cungqr_n )
404 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
405 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
406 wrkbl = max( wrkbl, 2*n+lwork_cungbr_p )
409 ELSE IF( wntua .AND. wntvn )
THEN
413 wrkbl = n + lwork_cgeqrf
414 wrkbl = max( wrkbl, n+lwork_cungqr_m )
415 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
416 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
419 ELSE IF( wntua .AND. wntvo )
THEN
423 wrkbl = n + lwork_cgeqrf
424 wrkbl = max( wrkbl, n+lwork_cungqr_m )
425 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
426 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
427 wrkbl = max( wrkbl, 2*n+lwork_cungbr_p )
428 maxwrk = 2*n*n + wrkbl
430 ELSE IF( wntua .AND. wntvas )
THEN
435 wrkbl = n + lwork_cgeqrf
436 wrkbl = max( wrkbl, n+lwork_cungqr_m )
437 wrkbl = max( wrkbl, 2*n+lwork_cgebrd )
438 wrkbl = max( wrkbl, 2*n+lwork_cungbr_q )
439 wrkbl = max( wrkbl, 2*n+lwork_cungbr_p )
447 CALL cgebrd( m, n, a, lda, s, dum(1), cdum(1),
448 $ cdum(1), cdum(1), -1, ierr )
449 lwork_cgebrd = int( cdum(1) )
450 maxwrk = 2*n + lwork_cgebrd
451 IF( wntus .OR. wntuo )
THEN
452 CALL cungbr(
'Q', m, n, n, a, lda, cdum(1),
453 $ cdum(1), -1, ierr )
454 lwork_cungbr_q = int( cdum(1) )
455 maxwrk = max( maxwrk, 2*n+lwork_cungbr_q )
458 CALL cungbr(
'Q', m, m, n, a, lda, cdum(1),
459 $ cdum(1), -1, ierr )
460 lwork_cungbr_q = int( cdum(1) )
461 maxwrk = max( maxwrk, 2*n+lwork_cungbr_q )
463 IF( .NOT.wntvn )
THEN
464 maxwrk = max( maxwrk, 2*n+lwork_cungbr_p )
468 ELSE IF( minmn.GT.0 )
THEN
472 mnthr = ilaenv( 6,
'CGESVD', jobu // jobvt, m, n, 0, 0 )
474 CALL cgelqf( m, n, a, lda, cdum(1), cdum(1), -1, ierr )
475 lwork_cgelqf = int( cdum(1) )
477 CALL cunglq( n, n, m, cdum(1), n, cdum(1), cdum(1), -1,
479 lwork_cunglq_n = int( cdum(1) )
480 CALL cunglq( m, n, m, a, lda, cdum(1), cdum(1), -1,
482 lwork_cunglq_m = int( cdum(1) )
484 CALL cgebrd( m, m, a, lda, s, dum(1), cdum(1),
485 $ cdum(1), cdum(1), -1, ierr )
486 lwork_cgebrd = int( cdum(1) )
488 CALL cungbr(
'P', m, m, m, a, n, cdum(1),
489 $ cdum(1), -1, ierr )
490 lwork_cungbr_p = int( cdum(1) )
492 CALL cungbr(
'Q', m, m, m, a, n, cdum(1),
493 $ cdum(1), -1, ierr )
494 lwork_cungbr_q = int( cdum(1) )
495 IF( n.GE.mnthr )
THEN
500 maxwrk = m + lwork_cgelqf
501 maxwrk = max( maxwrk, 2*m+lwork_cgebrd )
502 IF( wntuo .OR. wntuas )
503 $ maxwrk = max( maxwrk, 2*m+lwork_cungbr_q )
505 ELSE IF( wntvo .AND. wntun )
THEN
509 wrkbl = m + lwork_cgelqf
510 wrkbl = max( wrkbl, m+lwork_cunglq_m )
511 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
512 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
513 maxwrk = max( m*m+wrkbl, m*m+m*n )
515 ELSE IF( wntvo .AND. wntuas )
THEN
520 wrkbl = m + lwork_cgelqf
521 wrkbl = max( wrkbl, m+lwork_cunglq_m )
522 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
523 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
524 wrkbl = max( wrkbl, 2*m+lwork_cungbr_q )
525 maxwrk = max( m*m+wrkbl, m*m+m*n )
527 ELSE IF( wntvs .AND. wntun )
THEN
531 wrkbl = m + lwork_cgelqf
532 wrkbl = max( wrkbl, m+lwork_cunglq_m )
533 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
534 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
537 ELSE IF( wntvs .AND. wntuo )
THEN
541 wrkbl = m + lwork_cgelqf
542 wrkbl = max( wrkbl, m+lwork_cunglq_m )
543 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
544 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
545 wrkbl = max( wrkbl, 2*m+lwork_cungbr_q )
546 maxwrk = 2*m*m + wrkbl
548 ELSE IF( wntvs .AND. wntuas )
THEN
553 wrkbl = m + lwork_cgelqf
554 wrkbl = max( wrkbl, m+lwork_cunglq_m )
555 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
556 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
557 wrkbl = max( wrkbl, 2*m+lwork_cungbr_q )
560 ELSE IF( wntva .AND. wntun )
THEN
564 wrkbl = m + lwork_cgelqf
565 wrkbl = max( wrkbl, m+lwork_cunglq_n )
566 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
567 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
570 ELSE IF( wntva .AND. wntuo )
THEN
574 wrkbl = m + lwork_cgelqf
575 wrkbl = max( wrkbl, m+lwork_cunglq_n )
576 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
577 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
578 wrkbl = max( wrkbl, 2*m+lwork_cungbr_q )
579 maxwrk = 2*m*m + wrkbl
581 ELSE IF( wntva .AND. wntuas )
THEN
586 wrkbl = m + lwork_cgelqf
587 wrkbl = max( wrkbl, m+lwork_cunglq_n )
588 wrkbl = max( wrkbl, 2*m+lwork_cgebrd )
589 wrkbl = max( wrkbl, 2*m+lwork_cungbr_p )
590 wrkbl = max( wrkbl, 2*m+lwork_cungbr_q )
598 CALL cgebrd( m, n, a, lda, s, dum(1), cdum(1),
599 $ cdum(1), cdum(1), -1, ierr )
600 lwork_cgebrd = int( cdum(1) )
601 maxwrk = 2*m + lwork_cgebrd
602 IF( wntvs .OR. wntvo )
THEN
604 CALL cungbr(
'P', m, n, m, a, n, cdum(1),
605 $ cdum(1), -1, ierr )
606 lwork_cungbr_p = int( cdum(1) )
607 maxwrk = max( maxwrk, 2*m+lwork_cungbr_p )
610 CALL cungbr(
'P', n, n, m, a, n, cdum(1),
611 $ cdum(1), -1, ierr )
612 lwork_cungbr_p = int( cdum(1) )
613 maxwrk = max( maxwrk, 2*m+lwork_cungbr_p )
615 IF( .NOT.wntun )
THEN
616 maxwrk = max( maxwrk, 2*m+lwork_cungbr_q )
621 maxwrk = max( minwrk, maxwrk )
622 work( 1 ) = sroundup_lwork(maxwrk)
624 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
630 CALL xerbla(
'CGESVD', -info )
632 ELSE IF( lquery )
THEN
638 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
645 smlnum = sqrt( slamch(
'S' ) ) / eps
646 bignum = one / smlnum
650 anrm = clange(
'M', m, n, a, lda, dum )
652 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
654 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
655 ELSE IF( anrm.GT.bignum )
THEN
657 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
666 IF( m.GE.mnthr )
THEN
680 CALL cgeqrf( m, n, a, lda, work( itau ),
682 $ lwork-iwork+1, ierr )
687 CALL claset(
'L', n-1, n-1, czero, czero, a( 2,
700 CALL cgebrd( n, n, a, lda, s, rwork( ie ),
702 $ work( itaup ), work( iwork ), lwork-iwork+1,
705 IF( wntvo .OR. wntvas )
THEN
711 CALL cungbr(
'P', n, n, n, a, lda, work( itaup ),
712 $ work( iwork ), lwork-iwork+1, ierr )
722 CALL cbdsqr(
'U', n, ncvt, 0, 0, s, rwork( ie ), a,
724 $ cdum, 1, cdum, 1, rwork( irwork ), info )
729 $
CALL clacpy(
'F', n, n, a, lda, vt, ldvt )
731 ELSE IF( wntuo .AND. wntvn )
THEN
737 IF( lwork.GE.n*n+3*n )
THEN
742 IF( lwork.GE.max( wrkbl, lda*n )+lda*n )
THEN
748 ELSE IF( lwork.GE.max( wrkbl, lda*n )+n*n )
THEN
758 ldwrku = ( lwork-n*n ) / n
768 CALL cgeqrf( m, n, a, lda, work( itau ),
769 $ work( iwork ), lwork-iwork+1, ierr )
773 CALL clacpy(
'U', n, n, a, lda, work( ir ),
775 CALL claset(
'L', n-1, n-1, czero, czero,
776 $ work( ir+1 ), ldwrkr )
782 CALL cungqr( m, n, n, a, lda, work( itau ),
783 $ work( iwork ), lwork-iwork+1, ierr )
793 CALL cgebrd( n, n, work( ir ), ldwrkr, s,
795 $ work( itauq ), work( itaup ),
796 $ work( iwork ), lwork-iwork+1, ierr )
802 CALL cungbr(
'Q', n, n, n, work( ir ), ldwrkr,
803 $ work( itauq ), work( iwork ),
804 $ lwork-iwork+1, ierr )
812 CALL cbdsqr(
'U', n, 0, n, 0, s, rwork( ie ), cdum,
814 $ work( ir ), ldwrkr, cdum, 1,
815 $ rwork( irwork ), info )
823 DO 10 i = 1, m, ldwrku
824 chunk = min( m-i+1, ldwrku )
825 CALL cgemm(
'N',
'N', chunk, n, n, cone, a( i,
827 $ lda, work( ir ), ldwrkr, czero,
828 $ work( iu ), ldwrku )
829 CALL clacpy(
'F', chunk, n, work( iu ), ldwrku,
846 CALL cgebrd( m, n, a, lda, s, rwork( ie ),
847 $ work( itauq ), work( itaup ),
848 $ work( iwork ), lwork-iwork+1, ierr )
854 CALL cungbr(
'Q', m, n, n, a, lda, work( itauq ),
855 $ work( iwork ), lwork-iwork+1, ierr )
863 CALL cbdsqr(
'U', n, 0, m, 0, s, rwork( ie ), cdum,
865 $ a, lda, cdum, 1, rwork( irwork ), info )
869 ELSE IF( wntuo .AND. wntvas )
THEN
875 IF( lwork.GE.n*n+3*n )
THEN
880 IF( lwork.GE.max( wrkbl, lda*n )+lda*n )
THEN
886 ELSE IF( lwork.GE.max( wrkbl, lda*n )+n*n )
THEN
896 ldwrku = ( lwork-n*n ) / n
906 CALL cgeqrf( m, n, a, lda, work( itau ),
907 $ work( iwork ), lwork-iwork+1, ierr )
911 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
913 $
CALL claset(
'L', n-1, n-1, czero, czero,
920 CALL cungqr( m, n, n, a, lda, work( itau ),
921 $ work( iwork ), lwork-iwork+1, ierr )
931 CALL cgebrd( n, n, vt, ldvt, s, rwork( ie ),
932 $ work( itauq ), work( itaup ),
933 $ work( iwork ), lwork-iwork+1, ierr )
934 CALL clacpy(
'L', n, n, vt, ldvt, work( ir ),
941 CALL cungbr(
'Q', n, n, n, work( ir ), ldwrkr,
942 $ work( itauq ), work( iwork ),
943 $ lwork-iwork+1, ierr )
949 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
950 $ work( iwork ), lwork-iwork+1, ierr )
959 CALL cbdsqr(
'U', n, n, n, 0, s, rwork( ie ), vt,
960 $ ldvt, work( ir ), ldwrkr, cdum, 1,
961 $ rwork( irwork ), info )
969 DO 20 i = 1, m, ldwrku
970 chunk = min( m-i+1, ldwrku )
971 CALL cgemm(
'N',
'N', chunk, n, n, cone, a( i,
973 $ lda, work( ir ), ldwrkr, czero,
974 $ work( iu ), ldwrku )
975 CALL clacpy(
'F', chunk, n, work( iu ), ldwrku,
990 CALL cgeqrf( m, n, a, lda, work( itau ),
991 $ work( iwork ), lwork-iwork+1, ierr )
995 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
997 $
CALL claset(
'L', n-1, n-1, czero, czero,
1004 CALL cungqr( m, n, n, a, lda, work( itau ),
1005 $ work( iwork ), lwork-iwork+1, ierr )
1015 CALL cgebrd( n, n, vt, ldvt, s, rwork( ie ),
1016 $ work( itauq ), work( itaup ),
1017 $ work( iwork ), lwork-iwork+1, ierr )
1023 CALL cunmbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1024 $ work( itauq ), a, lda, work( iwork ),
1025 $ lwork-iwork+1, ierr )
1031 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1032 $ work( iwork ), lwork-iwork+1, ierr )
1041 CALL cbdsqr(
'U', n, n, m, 0, s, rwork( ie ), vt,
1042 $ ldvt, a, lda, cdum, 1, rwork( irwork ),
1047 ELSE IF( wntus )
THEN
1055 IF( lwork.GE.n*n+3*n )
THEN
1060 IF( lwork.GE.wrkbl+lda*n )
THEN
1071 itau = ir + ldwrkr*n
1078 CALL cgeqrf( m, n, a, lda, work( itau ),
1079 $ work( iwork ), lwork-iwork+1, ierr )
1083 CALL clacpy(
'U', n, n, a, lda, work( ir ),
1085 CALL claset(
'L', n-1, n-1, czero, czero,
1086 $ work( ir+1 ), ldwrkr )
1092 CALL cungqr( m, n, n, a, lda, work( itau ),
1093 $ work( iwork ), lwork-iwork+1, ierr )
1103 CALL cgebrd( n, n, work( ir ), ldwrkr, s,
1104 $ rwork( ie ), work( itauq ),
1105 $ work( itaup ), work( iwork ),
1106 $ lwork-iwork+1, ierr )
1112 CALL cungbr(
'Q', n, n, n, work( ir ), ldwrkr,
1113 $ work( itauq ), work( iwork ),
1114 $ lwork-iwork+1, ierr )
1122 CALL cbdsqr(
'U', n, 0, n, 0, s, rwork( ie ),
1124 $ 1, work( ir ), ldwrkr, cdum, 1,
1125 $ rwork( irwork ), info )
1132 CALL cgemm(
'N',
'N', m, n, n, cone, a, lda,
1133 $ work( ir ), ldwrkr, czero, u, ldu )
1146 CALL cgeqrf( m, n, a, lda, work( itau ),
1147 $ work( iwork ), lwork-iwork+1, ierr )
1148 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1154 CALL cungqr( m, n, n, u, ldu, work( itau ),
1155 $ work( iwork ), lwork-iwork+1, ierr )
1164 CALL claset(
'L', n-1, n-1, czero, czero,
1172 CALL cgebrd( n, n, a, lda, s, rwork( ie ),
1173 $ work( itauq ), work( itaup ),
1174 $ work( iwork ), lwork-iwork+1, ierr )
1180 CALL cunmbr(
'Q',
'R',
'N', m, n, n, a, lda,
1181 $ work( itauq ), u, ldu, work( iwork ),
1182 $ lwork-iwork+1, ierr )
1190 CALL cbdsqr(
'U', n, 0, m, 0, s, rwork( ie ),
1192 $ 1, u, ldu, cdum, 1, rwork( irwork ),
1197 ELSE IF( wntvo )
THEN
1203 IF( lwork.GE.2*n*n+3*n )
THEN
1208 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1215 ELSE IF( lwork.GE.wrkbl+( lda+n )*n )
THEN
1230 itau = ir + ldwrkr*n
1237 CALL cgeqrf( m, n, a, lda, work( itau ),
1238 $ work( iwork ), lwork-iwork+1, ierr )
1242 CALL clacpy(
'U', n, n, a, lda, work( iu ),
1244 CALL claset(
'L', n-1, n-1, czero, czero,
1245 $ work( iu+1 ), ldwrku )
1251 CALL cungqr( m, n, n, a, lda, work( itau ),
1252 $ work( iwork ), lwork-iwork+1, ierr )
1264 CALL cgebrd( n, n, work( iu ), ldwrku, s,
1265 $ rwork( ie ), work( itauq ),
1266 $ work( itaup ), work( iwork ),
1267 $ lwork-iwork+1, ierr )
1268 CALL clacpy(
'U', n, n, work( iu ), ldwrku,
1269 $ work( ir ), ldwrkr )
1275 CALL cungbr(
'Q', n, n, n, work( iu ), ldwrku,
1276 $ work( itauq ), work( iwork ),
1277 $ lwork-iwork+1, ierr )
1284 CALL cungbr(
'P', n, n, n, work( ir ), ldwrkr,
1285 $ work( itaup ), work( iwork ),
1286 $ lwork-iwork+1, ierr )
1295 CALL cbdsqr(
'U', n, n, n, 0, s, rwork( ie ),
1296 $ work( ir ), ldwrkr, work( iu ),
1297 $ ldwrku, cdum, 1, rwork( irwork ),
1305 CALL cgemm(
'N',
'N', m, n, n, cone, a, lda,
1306 $ work( iu ), ldwrku, czero, u, ldu )
1312 CALL clacpy(
'F', n, n, work( ir ), ldwrkr, a,
1326 CALL cgeqrf( m, n, a, lda, work( itau ),
1327 $ work( iwork ), lwork-iwork+1, ierr )
1328 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1334 CALL cungqr( m, n, n, u, ldu, work( itau ),
1335 $ work( iwork ), lwork-iwork+1, ierr )
1344 CALL claset(
'L', n-1, n-1, czero, czero,
1352 CALL cgebrd( n, n, a, lda, s, rwork( ie ),
1353 $ work( itauq ), work( itaup ),
1354 $ work( iwork ), lwork-iwork+1, ierr )
1360 CALL cunmbr(
'Q',
'R',
'N', m, n, n, a, lda,
1361 $ work( itauq ), u, ldu, work( iwork ),
1362 $ lwork-iwork+1, ierr )
1368 CALL cungbr(
'P', n, n, n, a, lda,
1370 $ work( iwork ), lwork-iwork+1, ierr )
1379 CALL cbdsqr(
'U', n, n, m, 0, s, rwork( ie ), a,
1380 $ lda, u, ldu, cdum, 1, rwork( irwork ),
1385 ELSE IF( wntvas )
THEN
1392 IF( lwork.GE.n*n+3*n )
THEN
1397 IF( lwork.GE.wrkbl+lda*n )
THEN
1408 itau = iu + ldwrku*n
1415 CALL cgeqrf( m, n, a, lda, work( itau ),
1416 $ work( iwork ), lwork-iwork+1, ierr )
1420 CALL clacpy(
'U', n, n, a, lda, work( iu ),
1422 CALL claset(
'L', n-1, n-1, czero, czero,
1423 $ work( iu+1 ), ldwrku )
1429 CALL cungqr( m, n, n, a, lda, work( itau ),
1430 $ work( iwork ), lwork-iwork+1, ierr )
1440 CALL cgebrd( n, n, work( iu ), ldwrku, s,
1441 $ rwork( ie ), work( itauq ),
1442 $ work( itaup ), work( iwork ),
1443 $ lwork-iwork+1, ierr )
1444 CALL clacpy(
'U', n, n, work( iu ), ldwrku, vt,
1451 CALL cungbr(
'Q', n, n, n, work( iu ), ldwrku,
1452 $ work( itauq ), work( iwork ),
1453 $ lwork-iwork+1, ierr )
1460 CALL cungbr(
'P', n, n, n, vt, ldvt,
1462 $ work( iwork ), lwork-iwork+1, ierr )
1471 CALL cbdsqr(
'U', n, n, n, 0, s, rwork( ie ),
1473 $ ldvt, work( iu ), ldwrku, cdum, 1,
1474 $ rwork( irwork ), info )
1481 CALL cgemm(
'N',
'N', m, n, n, cone, a, lda,
1482 $ work( iu ), ldwrku, czero, u, ldu )
1495 CALL cgeqrf( m, n, a, lda, work( itau ),
1496 $ work( iwork ), lwork-iwork+1, ierr )
1497 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1503 CALL cungqr( m, n, n, u, ldu, work( itau ),
1504 $ work( iwork ), lwork-iwork+1, ierr )
1508 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
1510 $
CALL claset(
'L', n-1, n-1, czero, czero,
1511 $ vt( 2, 1 ), ldvt )
1521 CALL cgebrd( n, n, vt, ldvt, s, rwork( ie ),
1522 $ work( itauq ), work( itaup ),
1523 $ work( iwork ), lwork-iwork+1, ierr )
1530 CALL cunmbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1531 $ work( itauq ), u, ldu, work( iwork ),
1532 $ lwork-iwork+1, ierr )
1538 CALL cungbr(
'P', n, n, n, vt, ldvt,
1540 $ work( iwork ), lwork-iwork+1, ierr )
1549 CALL cbdsqr(
'U', n, n, m, 0, s, rwork( ie ),
1551 $ ldvt, u, ldu, cdum, 1,
1552 $ rwork( irwork ), info )
1558 ELSE IF( wntua )
THEN
1566 IF( lwork.GE.n*n+max( n+m, 3*n ) )
THEN
1571 IF( lwork.GE.wrkbl+lda*n )
THEN
1582 itau = ir + ldwrkr*n
1589 CALL cgeqrf( m, n, a, lda, work( itau ),
1590 $ work( iwork ), lwork-iwork+1, ierr )
1591 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1595 CALL clacpy(
'U', n, n, a, lda, work( ir ),
1597 CALL claset(
'L', n-1, n-1, czero, czero,
1598 $ work( ir+1 ), ldwrkr )
1604 CALL cungqr( m, m, n, u, ldu, work( itau ),
1605 $ work( iwork ), lwork-iwork+1, ierr )
1615 CALL cgebrd( n, n, work( ir ), ldwrkr, s,
1616 $ rwork( ie ), work( itauq ),
1617 $ work( itaup ), work( iwork ),
1618 $ lwork-iwork+1, ierr )
1624 CALL cungbr(
'Q', n, n, n, work( ir ), ldwrkr,
1625 $ work( itauq ), work( iwork ),
1626 $ lwork-iwork+1, ierr )
1634 CALL cbdsqr(
'U', n, 0, n, 0, s, rwork( ie ),
1636 $ 1, work( ir ), ldwrkr, cdum, 1,
1637 $ rwork( irwork ), info )
1644 CALL cgemm(
'N',
'N', m, n, n, cone, u, ldu,
1645 $ work( ir ), ldwrkr, czero, a, lda )
1649 CALL clacpy(
'F', m, n, a, lda, u, ldu )
1662 CALL cgeqrf( m, n, a, lda, work( itau ),
1663 $ work( iwork ), lwork-iwork+1, ierr )
1664 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1670 CALL cungqr( m, m, n, u, ldu, work( itau ),
1671 $ work( iwork ), lwork-iwork+1, ierr )
1680 CALL claset(
'L', n-1, n-1, czero, czero,
1688 CALL cgebrd( n, n, a, lda, s, rwork( ie ),
1689 $ work( itauq ), work( itaup ),
1690 $ work( iwork ), lwork-iwork+1, ierr )
1697 CALL cunmbr(
'Q',
'R',
'N', m, n, n, a, lda,
1698 $ work( itauq ), u, ldu, work( iwork ),
1699 $ lwork-iwork+1, ierr )
1707 CALL cbdsqr(
'U', n, 0, m, 0, s, rwork( ie ),
1709 $ 1, u, ldu, cdum, 1, rwork( irwork ),
1714 ELSE IF( wntvo )
THEN
1720 IF( lwork.GE.2*n*n+max( n+m, 3*n ) )
THEN
1725 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1732 ELSE IF( lwork.GE.wrkbl+( lda+n )*n )
THEN
1747 itau = ir + ldwrkr*n
1754 CALL cgeqrf( m, n, a, lda, work( itau ),
1755 $ work( iwork ), lwork-iwork+1, ierr )
1756 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1762 CALL cungqr( m, m, n, u, ldu, work( itau ),
1763 $ work( iwork ), lwork-iwork+1, ierr )
1767 CALL clacpy(
'U', n, n, a, lda, work( iu ),
1769 CALL claset(
'L', n-1, n-1, czero, czero,
1770 $ work( iu+1 ), ldwrku )
1782 CALL cgebrd( n, n, work( iu ), ldwrku, s,
1783 $ rwork( ie ), work( itauq ),
1784 $ work( itaup ), work( iwork ),
1785 $ lwork-iwork+1, ierr )
1786 CALL clacpy(
'U', n, n, work( iu ), ldwrku,
1787 $ work( ir ), ldwrkr )
1793 CALL cungbr(
'Q', n, n, n, work( iu ), ldwrku,
1794 $ work( itauq ), work( iwork ),
1795 $ lwork-iwork+1, ierr )
1802 CALL cungbr(
'P', n, n, n, work( ir ), ldwrkr,
1803 $ work( itaup ), work( iwork ),
1804 $ lwork-iwork+1, ierr )
1813 CALL cbdsqr(
'U', n, n, n, 0, s, rwork( ie ),
1814 $ work( ir ), ldwrkr, work( iu ),
1815 $ ldwrku, cdum, 1, rwork( irwork ),
1823 CALL cgemm(
'N',
'N', m, n, n, cone, u, ldu,
1824 $ work( iu ), ldwrku, czero, a, lda )
1828 CALL clacpy(
'F', m, n, a, lda, u, ldu )
1832 CALL clacpy(
'F', n, n, work( ir ), ldwrkr, a,
1846 CALL cgeqrf( m, n, a, lda, work( itau ),
1847 $ work( iwork ), lwork-iwork+1, ierr )
1848 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1854 CALL cungqr( m, m, n, u, ldu, work( itau ),
1855 $ work( iwork ), lwork-iwork+1, ierr )
1864 CALL claset(
'L', n-1, n-1, czero, czero,
1872 CALL cgebrd( n, n, a, lda, s, rwork( ie ),
1873 $ work( itauq ), work( itaup ),
1874 $ work( iwork ), lwork-iwork+1, ierr )
1881 CALL cunmbr(
'Q',
'R',
'N', m, n, n, a, lda,
1882 $ work( itauq ), u, ldu, work( iwork ),
1883 $ lwork-iwork+1, ierr )
1889 CALL cungbr(
'P', n, n, n, a, lda,
1891 $ work( iwork ), lwork-iwork+1, ierr )
1900 CALL cbdsqr(
'U', n, n, m, 0, s, rwork( ie ), a,
1901 $ lda, u, ldu, cdum, 1, rwork( irwork ),
1906 ELSE IF( wntvas )
THEN
1913 IF( lwork.GE.n*n+max( n+m, 3*n ) )
THEN
1918 IF( lwork.GE.wrkbl+lda*n )
THEN
1929 itau = iu + ldwrku*n
1936 CALL cgeqrf( m, n, a, lda, work( itau ),
1937 $ work( iwork ), lwork-iwork+1, ierr )
1938 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1944 CALL cungqr( m, m, n, u, ldu, work( itau ),
1945 $ work( iwork ), lwork-iwork+1, ierr )
1949 CALL clacpy(
'U', n, n, a, lda, work( iu ),
1951 CALL claset(
'L', n-1, n-1, czero, czero,
1952 $ work( iu+1 ), ldwrku )
1962 CALL cgebrd( n, n, work( iu ), ldwrku, s,
1963 $ rwork( ie ), work( itauq ),
1964 $ work( itaup ), work( iwork ),
1965 $ lwork-iwork+1, ierr )
1966 CALL clacpy(
'U', n, n, work( iu ), ldwrku, vt,
1973 CALL cungbr(
'Q', n, n, n, work( iu ), ldwrku,
1974 $ work( itauq ), work( iwork ),
1975 $ lwork-iwork+1, ierr )
1982 CALL cungbr(
'P', n, n, n, vt, ldvt,
1984 $ work( iwork ), lwork-iwork+1, ierr )
1993 CALL cbdsqr(
'U', n, n, n, 0, s, rwork( ie ),
1995 $ ldvt, work( iu ), ldwrku, cdum, 1,
1996 $ rwork( irwork ), info )
2003 CALL cgemm(
'N',
'N', m, n, n, cone, u, ldu,
2004 $ work( iu ), ldwrku, czero, a, lda )
2008 CALL clacpy(
'F', m, n, a, lda, u, ldu )
2021 CALL cgeqrf( m, n, a, lda, work( itau ),
2022 $ work( iwork ), lwork-iwork+1, ierr )
2023 CALL clacpy(
'L', m, n, a, lda, u, ldu )
2029 CALL cungqr( m, m, n, u, ldu, work( itau ),
2030 $ work( iwork ), lwork-iwork+1, ierr )
2034 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
2036 $
CALL claset(
'L', n-1, n-1, czero, czero,
2037 $ vt( 2, 1 ), ldvt )
2047 CALL cgebrd( n, n, vt, ldvt, s, rwork( ie ),
2048 $ work( itauq ), work( itaup ),
2049 $ work( iwork ), lwork-iwork+1, ierr )
2056 CALL cunmbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
2057 $ work( itauq ), u, ldu, work( iwork ),
2058 $ lwork-iwork+1, ierr )
2064 CALL cungbr(
'P', n, n, n, vt, ldvt,
2066 $ work( iwork ), lwork-iwork+1, ierr )
2075 CALL cbdsqr(
'U', n, n, m, 0, s, rwork( ie ),
2077 $ ldvt, u, ldu, cdum, 1,
2078 $ rwork( irwork ), info )
2102 CALL cgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
2103 $ work( itaup ), work( iwork ), lwork-iwork+1,
2112 CALL clacpy(
'L', m, n, a, lda, u, ldu )
2117 CALL cungbr(
'Q', m, ncu, n, u, ldu, work( itauq ),
2118 $ work( iwork ), lwork-iwork+1, ierr )
2127 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
2128 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
2129 $ work( iwork ), lwork-iwork+1, ierr )
2138 CALL cungbr(
'Q', m, n, n, a, lda, work( itauq ),
2139 $ work( iwork ), lwork-iwork+1, ierr )
2148 CALL cungbr(
'P', n, n, n, a, lda, work( itaup ),
2149 $ work( iwork ), lwork-iwork+1, ierr )
2152 IF( wntuas .OR. wntuo )
2156 IF( wntvas .OR. wntvo )
2160 IF( ( .NOT.wntuo ) .AND. ( .NOT.wntvo ) )
THEN
2168 CALL cbdsqr(
'U', n, ncvt, nru, 0, s, rwork( ie ), vt,
2169 $ ldvt, u, ldu, cdum, 1, rwork( irwork ),
2171 ELSE IF( ( .NOT.wntuo ) .AND. wntvo )
THEN
2179 CALL cbdsqr(
'U', n, ncvt, nru, 0, s, rwork( ie ), a,
2180 $ lda, u, ldu, cdum, 1, rwork( irwork ),
2190 CALL cbdsqr(
'U', n, ncvt, nru, 0, s, rwork( ie ), vt,
2191 $ ldvt, a, lda, cdum, 1, rwork( irwork ),
2203 IF( n.GE.mnthr )
THEN
2217 CALL cgelqf( m, n, a, lda, work( itau ),
2219 $ lwork-iwork+1, ierr )
2223 CALL claset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
2234 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
2236 $ work( itaup ), work( iwork ), lwork-iwork+1,
2238 IF( wntuo .OR. wntuas )
THEN
2244 CALL cungbr(
'Q', m, m, m, a, lda, work( itauq ),
2245 $ work( iwork ), lwork-iwork+1, ierr )
2249 IF( wntuo .OR. wntuas )
2257 CALL cbdsqr(
'U', m, 0, nru, 0, s, rwork( ie ), cdum,
2259 $ a, lda, cdum, 1, rwork( irwork ), info )
2264 $
CALL clacpy(
'F', m, m, a, lda, u, ldu )
2266 ELSE IF( wntvo .AND. wntun )
THEN
2272 IF( lwork.GE.m*m+3*m )
THEN
2277 IF( lwork.GE.max( wrkbl, lda*n )+lda*m )
THEN
2284 ELSE IF( lwork.GE.max( wrkbl, lda*n )+m*m )
THEN
2296 chunk = ( lwork-m*m ) / m
2299 itau = ir + ldwrkr*m
2306 CALL cgelqf( m, n, a, lda, work( itau ),
2307 $ work( iwork ), lwork-iwork+1, ierr )
2311 CALL clacpy(
'L', m, m, a, lda, work( ir ),
2313 CALL claset(
'U', m-1, m-1, czero, czero,
2314 $ work( ir+ldwrkr ), ldwrkr )
2320 CALL cunglq( m, n, m, a, lda, work( itau ),
2321 $ work( iwork ), lwork-iwork+1, ierr )
2331 CALL cgebrd( m, m, work( ir ), ldwrkr, s,
2333 $ work( itauq ), work( itaup ),
2334 $ work( iwork ), lwork-iwork+1, ierr )
2340 CALL cungbr(
'P', m, m, m, work( ir ), ldwrkr,
2341 $ work( itaup ), work( iwork ),
2342 $ lwork-iwork+1, ierr )
2350 CALL cbdsqr(
'U', m, m, 0, 0, s, rwork( ie ),
2351 $ work( ir ), ldwrkr, cdum, 1, cdum, 1,
2352 $ rwork( irwork ), info )
2360 DO 30 i = 1, n, chunk
2361 blk = min( n-i+1, chunk )
2362 CALL cgemm(
'N',
'N', m, blk, m, cone,
2364 $ ldwrkr, a( 1, i ), lda, czero,
2365 $ work( iu ), ldwrku )
2366 CALL clacpy(
'F', m, blk, work( iu ), ldwrku,
2383 CALL cgebrd( m, n, a, lda, s, rwork( ie ),
2384 $ work( itauq ), work( itaup ),
2385 $ work( iwork ), lwork-iwork+1, ierr )
2391 CALL cungbr(
'P', m, n, m, a, lda, work( itaup ),
2392 $ work( iwork ), lwork-iwork+1, ierr )
2400 CALL cbdsqr(
'L', m, n, 0, 0, s, rwork( ie ), a,
2402 $ cdum, 1, cdum, 1, rwork( irwork ), info )
2406 ELSE IF( wntvo .AND. wntuas )
THEN
2412 IF( lwork.GE.m*m+3*m )
THEN
2417 IF( lwork.GE.max( wrkbl, lda*n )+lda*m )
THEN
2424 ELSE IF( lwork.GE.max( wrkbl, lda*n )+m*m )
THEN
2436 chunk = ( lwork-m*m ) / m
2439 itau = ir + ldwrkr*m
2446 CALL cgelqf( m, n, a, lda, work( itau ),
2447 $ work( iwork ), lwork-iwork+1, ierr )
2451 CALL clacpy(
'L', m, m, a, lda, u, ldu )
2452 CALL claset(
'U', m-1, m-1, czero, czero, u( 1,
2460 CALL cunglq( m, n, m, a, lda, work( itau ),
2461 $ work( iwork ), lwork-iwork+1, ierr )
2471 CALL cgebrd( m, m, u, ldu, s, rwork( ie ),
2472 $ work( itauq ), work( itaup ),
2473 $ work( iwork ), lwork-iwork+1, ierr )
2474 CALL clacpy(
'U', m, m, u, ldu, work( ir ),
2481 CALL cungbr(
'P', m, m, m, work( ir ), ldwrkr,
2482 $ work( itaup ), work( iwork ),
2483 $ lwork-iwork+1, ierr )
2489 CALL cungbr(
'Q', m, m, m, u, ldu, work( itauq ),
2490 $ work( iwork ), lwork-iwork+1, ierr )
2499 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
2500 $ work( ir ), ldwrkr, u, ldu, cdum, 1,
2501 $ rwork( irwork ), info )
2509 DO 40 i = 1, n, chunk
2510 blk = min( n-i+1, chunk )
2511 CALL cgemm(
'N',
'N', m, blk, m, cone,
2513 $ ldwrkr, a( 1, i ), lda, czero,
2514 $ work( iu ), ldwrku )
2515 CALL clacpy(
'F', m, blk, work( iu ), ldwrku,
2530 CALL cgelqf( m, n, a, lda, work( itau ),
2531 $ work( iwork ), lwork-iwork+1, ierr )
2535 CALL clacpy(
'L', m, m, a, lda, u, ldu )
2536 CALL claset(
'U', m-1, m-1, czero, czero, u( 1,
2544 CALL cunglq( m, n, m, a, lda, work( itau ),
2545 $ work( iwork ), lwork-iwork+1, ierr )
2555 CALL cgebrd( m, m, u, ldu, s, rwork( ie ),
2556 $ work( itauq ), work( itaup ),
2557 $ work( iwork ), lwork-iwork+1, ierr )
2563 CALL cunmbr(
'P',
'L',
'C', m, n, m, u, ldu,
2564 $ work( itaup ), a, lda, work( iwork ),
2565 $ lwork-iwork+1, ierr )
2571 CALL cungbr(
'Q', m, m, m, u, ldu, work( itauq ),
2572 $ work( iwork ), lwork-iwork+1, ierr )
2581 CALL cbdsqr(
'U', m, n, m, 0, s, rwork( ie ), a,
2583 $ u, ldu, cdum, 1, rwork( irwork ), info )
2587 ELSE IF( wntvs )
THEN
2595 IF( lwork.GE.m*m+3*m )
THEN
2600 IF( lwork.GE.wrkbl+lda*m )
THEN
2611 itau = ir + ldwrkr*m
2618 CALL cgelqf( m, n, a, lda, work( itau ),
2619 $ work( iwork ), lwork-iwork+1, ierr )
2623 CALL clacpy(
'L', m, m, a, lda, work( ir ),
2625 CALL claset(
'U', m-1, m-1, czero, czero,
2626 $ work( ir+ldwrkr ), ldwrkr )
2632 CALL cunglq( m, n, m, a, lda, work( itau ),
2633 $ work( iwork ), lwork-iwork+1, ierr )
2643 CALL cgebrd( m, m, work( ir ), ldwrkr, s,
2644 $ rwork( ie ), work( itauq ),
2645 $ work( itaup ), work( iwork ),
2646 $ lwork-iwork+1, ierr )
2653 CALL cungbr(
'P', m, m, m, work( ir ), ldwrkr,
2654 $ work( itaup ), work( iwork ),
2655 $ lwork-iwork+1, ierr )
2663 CALL cbdsqr(
'U', m, m, 0, 0, s, rwork( ie ),
2664 $ work( ir ), ldwrkr, cdum, 1, cdum, 1,
2665 $ rwork( irwork ), info )
2672 CALL cgemm(
'N',
'N', m, n, m, cone, work( ir ),
2673 $ ldwrkr, a, lda, czero, vt, ldvt )
2686 CALL cgelqf( m, n, a, lda, work( itau ),
2687 $ work( iwork ), lwork-iwork+1, ierr )
2691 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
2697 CALL cunglq( m, n, m, vt, ldvt, work( itau ),
2698 $ work( iwork ), lwork-iwork+1, ierr )
2706 CALL claset(
'U', m-1, m-1, czero, czero,
2713 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
2714 $ work( itauq ), work( itaup ),
2715 $ work( iwork ), lwork-iwork+1, ierr )
2721 CALL cunmbr(
'P',
'L',
'C', m, n, m, a, lda,
2722 $ work( itaup ), vt, ldvt,
2723 $ work( iwork ), lwork-iwork+1, ierr )
2731 CALL cbdsqr(
'U', m, n, 0, 0, s, rwork( ie ),
2733 $ ldvt, cdum, 1, cdum, 1,
2734 $ rwork( irwork ), info )
2738 ELSE IF( wntuo )
THEN
2744 IF( lwork.GE.2*m*m+3*m )
THEN
2749 IF( lwork.GE.wrkbl+2*lda*m )
THEN
2756 ELSE IF( lwork.GE.wrkbl+( lda+m )*m )
THEN
2771 itau = ir + ldwrkr*m
2778 CALL cgelqf( m, n, a, lda, work( itau ),
2779 $ work( iwork ), lwork-iwork+1, ierr )
2783 CALL clacpy(
'L', m, m, a, lda, work( iu ),
2785 CALL claset(
'U', m-1, m-1, czero, czero,
2786 $ work( iu+ldwrku ), ldwrku )
2792 CALL cunglq( m, n, m, a, lda, work( itau ),
2793 $ work( iwork ), lwork-iwork+1, ierr )
2805 CALL cgebrd( m, m, work( iu ), ldwrku, s,
2806 $ rwork( ie ), work( itauq ),
2807 $ work( itaup ), work( iwork ),
2808 $ lwork-iwork+1, ierr )
2809 CALL clacpy(
'L', m, m, work( iu ), ldwrku,
2810 $ work( ir ), ldwrkr )
2817 CALL cungbr(
'P', m, m, m, work( iu ), ldwrku,
2818 $ work( itaup ), work( iwork ),
2819 $ lwork-iwork+1, ierr )
2825 CALL cungbr(
'Q', m, m, m, work( ir ), ldwrkr,
2826 $ work( itauq ), work( iwork ),
2827 $ lwork-iwork+1, ierr )
2836 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
2837 $ work( iu ), ldwrku, work( ir ),
2838 $ ldwrkr, cdum, 1, rwork( irwork ),
2846 CALL cgemm(
'N',
'N', m, n, m, cone, work( iu ),
2847 $ ldwrku, a, lda, czero, vt, ldvt )
2853 CALL clacpy(
'F', m, m, work( ir ), ldwrkr, a,
2867 CALL cgelqf( m, n, a, lda, work( itau ),
2868 $ work( iwork ), lwork-iwork+1, ierr )
2869 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
2875 CALL cunglq( m, n, m, vt, ldvt, work( itau ),
2876 $ work( iwork ), lwork-iwork+1, ierr )
2884 CALL claset(
'U', m-1, m-1, czero, czero,
2891 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
2892 $ work( itauq ), work( itaup ),
2893 $ work( iwork ), lwork-iwork+1, ierr )
2899 CALL cunmbr(
'P',
'L',
'C', m, n, m, a, lda,
2900 $ work( itaup ), vt, ldvt,
2901 $ work( iwork ), lwork-iwork+1, ierr )
2907 CALL cungbr(
'Q', m, m, m, a, lda,
2909 $ work( iwork ), lwork-iwork+1, ierr )
2918 CALL cbdsqr(
'U', m, n, m, 0, s, rwork( ie ),
2920 $ ldvt, a, lda, cdum, 1,
2921 $ rwork( irwork ), info )
2925 ELSE IF( wntuas )
THEN
2932 IF( lwork.GE.m*m+3*m )
THEN
2937 IF( lwork.GE.wrkbl+lda*m )
THEN
2948 itau = iu + ldwrku*m
2955 CALL cgelqf( m, n, a, lda, work( itau ),
2956 $ work( iwork ), lwork-iwork+1, ierr )
2960 CALL clacpy(
'L', m, m, a, lda, work( iu ),
2962 CALL claset(
'U', m-1, m-1, czero, czero,
2963 $ work( iu+ldwrku ), ldwrku )
2969 CALL cunglq( m, n, m, a, lda, work( itau ),
2970 $ work( iwork ), lwork-iwork+1, ierr )
2980 CALL cgebrd( m, m, work( iu ), ldwrku, s,
2981 $ rwork( ie ), work( itauq ),
2982 $ work( itaup ), work( iwork ),
2983 $ lwork-iwork+1, ierr )
2984 CALL clacpy(
'L', m, m, work( iu ), ldwrku, u,
2992 CALL cungbr(
'P', m, m, m, work( iu ), ldwrku,
2993 $ work( itaup ), work( iwork ),
2994 $ lwork-iwork+1, ierr )
3000 CALL cungbr(
'Q', m, m, m, u, ldu,
3002 $ work( iwork ), lwork-iwork+1, ierr )
3011 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
3012 $ work( iu ), ldwrku, u, ldu, cdum, 1,
3013 $ rwork( irwork ), info )
3020 CALL cgemm(
'N',
'N', m, n, m, cone, work( iu ),
3021 $ ldwrku, a, lda, czero, vt, ldvt )
3034 CALL cgelqf( m, n, a, lda, work( itau ),
3035 $ work( iwork ), lwork-iwork+1, ierr )
3036 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3042 CALL cunglq( m, n, m, vt, ldvt, work( itau ),
3043 $ work( iwork ), lwork-iwork+1, ierr )
3047 CALL clacpy(
'L', m, m, a, lda, u, ldu )
3048 CALL claset(
'U', m-1, m-1, czero, czero,
3059 CALL cgebrd( m, m, u, ldu, s, rwork( ie ),
3060 $ work( itauq ), work( itaup ),
3061 $ work( iwork ), lwork-iwork+1, ierr )
3068 CALL cunmbr(
'P',
'L',
'C', m, n, m, u, ldu,
3069 $ work( itaup ), vt, ldvt,
3070 $ work( iwork ), lwork-iwork+1, ierr )
3076 CALL cungbr(
'Q', m, m, m, u, ldu,
3078 $ work( iwork ), lwork-iwork+1, ierr )
3087 CALL cbdsqr(
'U', m, n, m, 0, s, rwork( ie ),
3089 $ ldvt, u, ldu, cdum, 1,
3090 $ rwork( irwork ), info )
3096 ELSE IF( wntva )
THEN
3104 IF( lwork.GE.m*m+max( n+m, 3*m ) )
THEN
3109 IF( lwork.GE.wrkbl+lda*m )
THEN
3120 itau = ir + ldwrkr*m
3127 CALL cgelqf( m, n, a, lda, work( itau ),
3128 $ work( iwork ), lwork-iwork+1, ierr )
3129 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3133 CALL clacpy(
'L', m, m, a, lda, work( ir ),
3135 CALL claset(
'U', m-1, m-1, czero, czero,
3136 $ work( ir+ldwrkr ), ldwrkr )
3142 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3143 $ work( iwork ), lwork-iwork+1, ierr )
3153 CALL cgebrd( m, m, work( ir ), ldwrkr, s,
3154 $ rwork( ie ), work( itauq ),
3155 $ work( itaup ), work( iwork ),
3156 $ lwork-iwork+1, ierr )
3163 CALL cungbr(
'P', m, m, m, work( ir ), ldwrkr,
3164 $ work( itaup ), work( iwork ),
3165 $ lwork-iwork+1, ierr )
3173 CALL cbdsqr(
'U', m, m, 0, 0, s, rwork( ie ),
3174 $ work( ir ), ldwrkr, cdum, 1, cdum, 1,
3175 $ rwork( irwork ), info )
3182 CALL cgemm(
'N',
'N', m, n, m, cone, work( ir ),
3183 $ ldwrkr, vt, ldvt, czero, a, lda )
3187 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
3200 CALL cgelqf( m, n, a, lda, work( itau ),
3201 $ work( iwork ), lwork-iwork+1, ierr )
3202 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3208 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3209 $ work( iwork ), lwork-iwork+1, ierr )
3217 CALL claset(
'U', m-1, m-1, czero, czero,
3224 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
3225 $ work( itauq ), work( itaup ),
3226 $ work( iwork ), lwork-iwork+1, ierr )
3233 CALL cunmbr(
'P',
'L',
'C', m, n, m, a, lda,
3234 $ work( itaup ), vt, ldvt,
3235 $ work( iwork ), lwork-iwork+1, ierr )
3243 CALL cbdsqr(
'U', m, n, 0, 0, s, rwork( ie ),
3245 $ ldvt, cdum, 1, cdum, 1,
3246 $ rwork( irwork ), info )
3250 ELSE IF( wntuo )
THEN
3256 IF( lwork.GE.2*m*m+max( n+m, 3*m ) )
THEN
3261 IF( lwork.GE.wrkbl+2*lda*m )
THEN
3268 ELSE IF( lwork.GE.wrkbl+( lda+m )*m )
THEN
3283 itau = ir + ldwrkr*m
3290 CALL cgelqf( m, n, a, lda, work( itau ),
3291 $ work( iwork ), lwork-iwork+1, ierr )
3292 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3298 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3299 $ work( iwork ), lwork-iwork+1, ierr )
3303 CALL clacpy(
'L', m, m, a, lda, work( iu ),
3305 CALL claset(
'U', m-1, m-1, czero, czero,
3306 $ work( iu+ldwrku ), ldwrku )
3318 CALL cgebrd( m, m, work( iu ), ldwrku, s,
3319 $ rwork( ie ), work( itauq ),
3320 $ work( itaup ), work( iwork ),
3321 $ lwork-iwork+1, ierr )
3322 CALL clacpy(
'L', m, m, work( iu ), ldwrku,
3323 $ work( ir ), ldwrkr )
3330 CALL cungbr(
'P', m, m, m, work( iu ), ldwrku,
3331 $ work( itaup ), work( iwork ),
3332 $ lwork-iwork+1, ierr )
3338 CALL cungbr(
'Q', m, m, m, work( ir ), ldwrkr,
3339 $ work( itauq ), work( iwork ),
3340 $ lwork-iwork+1, ierr )
3349 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
3350 $ work( iu ), ldwrku, work( ir ),
3351 $ ldwrkr, cdum, 1, rwork( irwork ),
3359 CALL cgemm(
'N',
'N', m, n, m, cone, work( iu ),
3360 $ ldwrku, vt, ldvt, czero, a, lda )
3364 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
3368 CALL clacpy(
'F', m, m, work( ir ), ldwrkr, a,
3382 CALL cgelqf( m, n, a, lda, work( itau ),
3383 $ work( iwork ), lwork-iwork+1, ierr )
3384 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3390 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3391 $ work( iwork ), lwork-iwork+1, ierr )
3399 CALL claset(
'U', m-1, m-1, czero, czero,
3406 CALL cgebrd( m, m, a, lda, s, rwork( ie ),
3407 $ work( itauq ), work( itaup ),
3408 $ work( iwork ), lwork-iwork+1, ierr )
3415 CALL cunmbr(
'P',
'L',
'C', m, n, m, a, lda,
3416 $ work( itaup ), vt, ldvt,
3417 $ work( iwork ), lwork-iwork+1, ierr )
3423 CALL cungbr(
'Q', m, m, m, a, lda,
3425 $ work( iwork ), lwork-iwork+1, ierr )
3434 CALL cbdsqr(
'U', m, n, m, 0, s, rwork( ie ),
3436 $ ldvt, a, lda, cdum, 1,
3437 $ rwork( irwork ), info )
3441 ELSE IF( wntuas )
THEN
3448 IF( lwork.GE.m*m+max( n+m, 3*m ) )
THEN
3453 IF( lwork.GE.wrkbl+lda*m )
THEN
3464 itau = iu + ldwrku*m
3471 CALL cgelqf( m, n, a, lda, work( itau ),
3472 $ work( iwork ), lwork-iwork+1, ierr )
3473 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3479 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3480 $ work( iwork ), lwork-iwork+1, ierr )
3484 CALL clacpy(
'L', m, m, a, lda, work( iu ),
3486 CALL claset(
'U', m-1, m-1, czero, czero,
3487 $ work( iu+ldwrku ), ldwrku )
3497 CALL cgebrd( m, m, work( iu ), ldwrku, s,
3498 $ rwork( ie ), work( itauq ),
3499 $ work( itaup ), work( iwork ),
3500 $ lwork-iwork+1, ierr )
3501 CALL clacpy(
'L', m, m, work( iu ), ldwrku, u,
3508 CALL cungbr(
'P', m, m, m, work( iu ), ldwrku,
3509 $ work( itaup ), work( iwork ),
3510 $ lwork-iwork+1, ierr )
3516 CALL cungbr(
'Q', m, m, m, u, ldu,
3518 $ work( iwork ), lwork-iwork+1, ierr )
3527 CALL cbdsqr(
'U', m, m, m, 0, s, rwork( ie ),
3528 $ work( iu ), ldwrku, u, ldu, cdum, 1,
3529 $ rwork( irwork ), info )
3536 CALL cgemm(
'N',
'N', m, n, m, cone, work( iu ),
3537 $ ldwrku, vt, ldvt, czero, a, lda )
3541 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
3554 CALL cgelqf( m, n, a, lda, work( itau ),
3555 $ work( iwork ), lwork-iwork+1, ierr )
3556 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3562 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
3563 $ work( iwork ), lwork-iwork+1, ierr )
3567 CALL clacpy(
'L', m, m, a, lda, u, ldu )
3568 CALL claset(
'U', m-1, m-1, czero, czero,
3579 CALL cgebrd( m, m, u, ldu, s, rwork( ie ),
3580 $ work( itauq ), work( itaup ),
3581 $ work( iwork ), lwork-iwork+1, ierr )
3588 CALL cunmbr(
'P',
'L',
'C', m, n, m, u, ldu,
3589 $ work( itaup ), vt, ldvt,
3590 $ work( iwork ), lwork-iwork+1, ierr )
3596 CALL cungbr(
'Q', m, m, m, u, ldu,
3598 $ work( iwork ), lwork-iwork+1, ierr )
3607 CALL cbdsqr(
'U', m, n, m, 0, s, rwork( ie ),
3609 $ ldvt, u, ldu, cdum, 1,
3610 $ rwork( irwork ), info )
3634 CALL cgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
3635 $ work( itaup ), work( iwork ), lwork-iwork+1,
3644 CALL clacpy(
'L', m, m, a, lda, u, ldu )
3645 CALL cungbr(
'Q', m, m, n, u, ldu, work( itauq ),
3646 $ work( iwork ), lwork-iwork+1, ierr )
3655 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
3660 CALL cungbr(
'P', nrvt, n, m, vt, ldvt, work( itaup ),
3661 $ work( iwork ), lwork-iwork+1, ierr )
3670 CALL cungbr(
'Q', m, m, n, a, lda, work( itauq ),
3671 $ work( iwork ), lwork-iwork+1, ierr )
3680 CALL cungbr(
'P', m, n, m, a, lda, work( itaup ),
3681 $ work( iwork ), lwork-iwork+1, ierr )
3684 IF( wntuas .OR. wntuo )
3688 IF( wntvas .OR. wntvo )
3692 IF( ( .NOT.wntuo ) .AND. ( .NOT.wntvo ) )
THEN
3700 CALL cbdsqr(
'L', m, ncvt, nru, 0, s, rwork( ie ), vt,
3701 $ ldvt, u, ldu, cdum, 1, rwork( irwork ),
3703 ELSE IF( ( .NOT.wntuo ) .AND. wntvo )
THEN
3711 CALL cbdsqr(
'L', m, ncvt, nru, 0, s, rwork( ie ), a,
3712 $ lda, u, ldu, cdum, 1, rwork( irwork ),
3722 CALL cbdsqr(
'L', m, ncvt, nru, 0, s, rwork( ie ), vt,
3723 $ ldvt, a, lda, cdum, 1, rwork( irwork ),
3733 IF( iscl.EQ.1 )
THEN
3734 IF( anrm.GT.bignum )
3735 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn, 1, s, minmn,
3737 IF( info.NE.0 .AND. anrm.GT.bignum )
3738 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn-1, 1,
3739 $ rwork( ie ), minmn, ierr )
3740 IF( anrm.LT.smlnum )
3741 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn, 1, s, minmn,
3743 IF( info.NE.0 .AND. anrm.LT.smlnum )
3744 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn-1, 1,
3745 $ rwork( ie ), minmn, ierr )
3750 work( 1 ) = sroundup_lwork(maxwrk)