235 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
239 REAL RWORK( * ), S( * )
240 COMPLEX A( LDA, * ), U( LDU, * ), VT( LDVT, * ),
248 parameter( czero = ( 0.0e+0, 0.0e+0 ),
249 $ cone = ( 1.0e+0, 0.0e+0 ) )
251 parameter( zero = 0.0e+0, one = 1.0e+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_CGEBRD_MN, LWORK_CGEBRD_MM,
260 $ LWORK_CGEBRD_NN, LWORK_CGELQF_MN,
262 $ LWORK_CUNGBR_P_MN, LWORK_CUNGBR_P_NN,
263 $ LWORK_CUNGBR_Q_MN, LWORK_CUNGBR_Q_MM,
264 $ LWORK_CUNGLQ_MN, LWORK_CUNGLQ_NN,
265 $ LWORK_CUNGQR_MM, LWORK_CUNGQR_MN,
266 $ LWORK_CUNMBR_PRC_MM, LWORK_CUNMBR_QLN_MM,
267 $ LWORK_CUNMBR_PRC_MN, LWORK_CUNMBR_QLN_MN,
268 $ LWORK_CUNMBR_PRC_NN, LWORK_CUNMBR_QLN_NN
269 REAL ANRM, BIGNUM, EPS, SMLNUM
282 LOGICAL LSAME, SISNAN
287 INTRINSIC int, max, min, sqrt
295 mnthr1 = int( minmn*17.0e0 / 9.0e0 )
296 mnthr2 = int( minmn*5.0e0 / 3.0e0 )
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 cgebrd( m, n, cdum(1), m, dum(1), dum(1), cdum(1),
344 $ cdum(1), cdum(1), -1, ierr )
345 lwork_cgebrd_mn = int( cdum(1) )
347 CALL cgebrd( n, n, cdum(1), n, dum(1), dum(1), cdum(1),
348 $ cdum(1), cdum(1), -1, ierr )
349 lwork_cgebrd_nn = int( cdum(1) )
351 CALL cgeqrf( m, n, cdum(1), m, cdum(1), cdum(1), -1, ierr )
352 lwork_cgeqrf_mn = int( cdum(1) )
354 CALL cungbr(
'P', n, n, n, cdum(1), n, cdum(1), cdum(1),
356 lwork_cungbr_p_nn = int( cdum(1) )
358 CALL cungbr(
'Q', m, m, n, cdum(1), m, cdum(1), cdum(1),
360 lwork_cungbr_q_mm = int( cdum(1) )
362 CALL cungbr(
'Q', m, n, n, cdum(1), m, cdum(1), cdum(1),
364 lwork_cungbr_q_mn = int( cdum(1) )
366 CALL cungqr( m, m, n, cdum(1), m, cdum(1), cdum(1),
368 lwork_cungqr_mm = int( cdum(1) )
370 CALL cungqr( m, n, n, cdum(1), m, cdum(1), cdum(1),
372 lwork_cungqr_mn = int( cdum(1) )
374 CALL cunmbr(
'P',
'R',
'C', n, n, n, cdum(1), n, cdum(1),
375 $ cdum(1), n, cdum(1), -1, ierr )
376 lwork_cunmbr_prc_nn = int( cdum(1) )
378 CALL cunmbr(
'Q',
'L',
'N', m, m, n, cdum(1), m, cdum(1),
379 $ cdum(1), m, cdum(1), -1, ierr )
380 lwork_cunmbr_qln_mm = int( cdum(1) )
382 CALL cunmbr(
'Q',
'L',
'N', m, n, n, cdum(1), m, cdum(1),
383 $ cdum(1), m, cdum(1), -1, ierr )
384 lwork_cunmbr_qln_mn = int( cdum(1) )
386 CALL cunmbr(
'Q',
'L',
'N', n, n, n, cdum(1), n, cdum(1),
387 $ cdum(1), n, cdum(1), -1, ierr )
388 lwork_cunmbr_qln_nn = int( cdum(1) )
390 IF( m.GE.mnthr1 )
THEN
395 maxwrk = n + lwork_cgeqrf_mn
396 maxwrk = max( maxwrk, 2*n + lwork_cgebrd_nn )
398 ELSE IF( wntqo )
THEN
402 wrkbl = n + lwork_cgeqrf_mn
403 wrkbl = max( wrkbl, n + lwork_cungqr_mn )
404 wrkbl = max( wrkbl, 2*n + lwork_cgebrd_nn )
405 wrkbl = max( wrkbl, 2*n + lwork_cunmbr_qln_nn )
406 wrkbl = max( wrkbl, 2*n + lwork_cunmbr_prc_nn )
407 maxwrk = m*n + n*n + wrkbl
409 ELSE IF( wntqs )
THEN
413 wrkbl = n + lwork_cgeqrf_mn
414 wrkbl = max( wrkbl, n + lwork_cungqr_mn )
415 wrkbl = max( wrkbl, 2*n + lwork_cgebrd_nn )
416 wrkbl = max( wrkbl, 2*n + lwork_cunmbr_qln_nn )
417 wrkbl = max( wrkbl, 2*n + lwork_cunmbr_prc_nn )
420 ELSE IF( wntqa )
THEN
424 wrkbl = n + lwork_cgeqrf_mn
425 wrkbl = max( wrkbl, n + lwork_cungqr_mm )
426 wrkbl = max( wrkbl, 2*n + lwork_cgebrd_nn )
427 wrkbl = max( wrkbl, 2*n + lwork_cunmbr_qln_nn )
428 wrkbl = max( wrkbl, 2*n + lwork_cunmbr_prc_nn )
430 minwrk = n*n + max( 3*n, n + m )
432 ELSE IF( m.GE.mnthr2 )
THEN
436 maxwrk = 2*n + lwork_cgebrd_mn
440 maxwrk = max( maxwrk, 2*n + lwork_cungbr_p_nn )
441 maxwrk = max( maxwrk, 2*n + lwork_cungbr_q_mn )
442 maxwrk = maxwrk + m*n
443 minwrk = minwrk + n*n
444 ELSE IF( wntqs )
THEN
446 maxwrk = max( maxwrk, 2*n + lwork_cungbr_p_nn )
447 maxwrk = max( maxwrk, 2*n + lwork_cungbr_q_mn )
448 ELSE IF( wntqa )
THEN
450 maxwrk = max( maxwrk, 2*n + lwork_cungbr_p_nn )
451 maxwrk = max( maxwrk, 2*n + lwork_cungbr_q_mm )
457 maxwrk = 2*n + lwork_cgebrd_mn
461 maxwrk = max( maxwrk, 2*n + lwork_cunmbr_prc_nn )
462 maxwrk = max( maxwrk, 2*n + lwork_cunmbr_qln_mn )
463 maxwrk = maxwrk + m*n
464 minwrk = minwrk + n*n
465 ELSE IF( wntqs )
THEN
467 maxwrk = max( maxwrk, 2*n + lwork_cunmbr_qln_mn )
468 maxwrk = max( maxwrk, 2*n + lwork_cunmbr_prc_nn )
469 ELSE IF( wntqa )
THEN
471 maxwrk = max( maxwrk, 2*n + lwork_cunmbr_qln_mm )
472 maxwrk = max( maxwrk, 2*n + lwork_cunmbr_prc_nn )
475 ELSE IF( minmn.GT.0 )
THEN
484 CALL cgebrd( m, n, cdum(1), m, dum(1), dum(1), cdum(1),
485 $ cdum(1), cdum(1), -1, ierr )
486 lwork_cgebrd_mn = int( cdum(1) )
488 CALL cgebrd( m, m, cdum(1), m, dum(1), dum(1), cdum(1),
489 $ cdum(1), cdum(1), -1, ierr )
490 lwork_cgebrd_mm = int( cdum(1) )
492 CALL cgelqf( m, n, cdum(1), m, cdum(1), cdum(1), -1, ierr )
493 lwork_cgelqf_mn = int( cdum(1) )
495 CALL cungbr(
'P', m, n, m, cdum(1), m, cdum(1), cdum(1),
497 lwork_cungbr_p_mn = int( cdum(1) )
499 CALL cungbr(
'P', n, n, m, cdum(1), n, cdum(1), cdum(1),
501 lwork_cungbr_p_nn = int( cdum(1) )
503 CALL cungbr(
'Q', m, m, n, cdum(1), m, cdum(1), cdum(1),
505 lwork_cungbr_q_mm = int( cdum(1) )
507 CALL cunglq( m, n, m, cdum(1), m, cdum(1), cdum(1),
509 lwork_cunglq_mn = int( cdum(1) )
511 CALL cunglq( n, n, m, cdum(1), n, cdum(1), cdum(1),
513 lwork_cunglq_nn = int( cdum(1) )
515 CALL cunmbr(
'P',
'R',
'C', m, m, m, cdum(1), m, cdum(1),
516 $ cdum(1), m, cdum(1), -1, ierr )
517 lwork_cunmbr_prc_mm = int( cdum(1) )
519 CALL cunmbr(
'P',
'R',
'C', m, n, m, cdum(1), m, cdum(1),
520 $ cdum(1), m, cdum(1), -1, ierr )
521 lwork_cunmbr_prc_mn = int( cdum(1) )
523 CALL cunmbr(
'P',
'R',
'C', n, n, m, cdum(1), n, cdum(1),
524 $ cdum(1), n, cdum(1), -1, ierr )
525 lwork_cunmbr_prc_nn = int( cdum(1) )
527 CALL cunmbr(
'Q',
'L',
'N', m, m, m, cdum(1), m, cdum(1),
528 $ cdum(1), m, cdum(1), -1, ierr )
529 lwork_cunmbr_qln_mm = int( cdum(1) )
531 IF( n.GE.mnthr1 )
THEN
536 maxwrk = m + lwork_cgelqf_mn
537 maxwrk = max( maxwrk, 2*m + lwork_cgebrd_mm )
539 ELSE IF( wntqo )
THEN
543 wrkbl = m + lwork_cgelqf_mn
544 wrkbl = max( wrkbl, m + lwork_cunglq_mn )
545 wrkbl = max( wrkbl, 2*m + lwork_cgebrd_mm )
546 wrkbl = max( wrkbl, 2*m + lwork_cunmbr_qln_mm )
547 wrkbl = max( wrkbl, 2*m + lwork_cunmbr_prc_mm )
548 maxwrk = m*n + m*m + wrkbl
550 ELSE IF( wntqs )
THEN
554 wrkbl = m + lwork_cgelqf_mn
555 wrkbl = max( wrkbl, m + lwork_cunglq_mn )
556 wrkbl = max( wrkbl, 2*m + lwork_cgebrd_mm )
557 wrkbl = max( wrkbl, 2*m + lwork_cunmbr_qln_mm )
558 wrkbl = max( wrkbl, 2*m + lwork_cunmbr_prc_mm )
561 ELSE IF( wntqa )
THEN
565 wrkbl = m + lwork_cgelqf_mn
566 wrkbl = max( wrkbl, m + lwork_cunglq_nn )
567 wrkbl = max( wrkbl, 2*m + lwork_cgebrd_mm )
568 wrkbl = max( wrkbl, 2*m + lwork_cunmbr_qln_mm )
569 wrkbl = max( wrkbl, 2*m + lwork_cunmbr_prc_mm )
571 minwrk = m*m + max( 3*m, m + n )
573 ELSE IF( n.GE.mnthr2 )
THEN
577 maxwrk = 2*m + lwork_cgebrd_mn
581 maxwrk = max( maxwrk, 2*m + lwork_cungbr_q_mm )
582 maxwrk = max( maxwrk, 2*m + lwork_cungbr_p_mn )
583 maxwrk = maxwrk + m*n
584 minwrk = minwrk + m*m
585 ELSE IF( wntqs )
THEN
587 maxwrk = max( maxwrk, 2*m + lwork_cungbr_q_mm )
588 maxwrk = max( maxwrk, 2*m + lwork_cungbr_p_mn )
589 ELSE IF( wntqa )
THEN
591 maxwrk = max( maxwrk, 2*m + lwork_cungbr_q_mm )
592 maxwrk = max( maxwrk, 2*m + lwork_cungbr_p_nn )
598 maxwrk = 2*m + lwork_cgebrd_mn
602 maxwrk = max( maxwrk, 2*m + lwork_cunmbr_qln_mm )
603 maxwrk = max( maxwrk, 2*m + lwork_cunmbr_prc_mn )
604 maxwrk = maxwrk + m*n
605 minwrk = minwrk + m*m
606 ELSE IF( wntqs )
THEN
608 maxwrk = max( maxwrk, 2*m + lwork_cunmbr_qln_mm )
609 maxwrk = max( maxwrk, 2*m + lwork_cunmbr_prc_mn )
610 ELSE IF( wntqa )
THEN
612 maxwrk = max( maxwrk, 2*m + lwork_cunmbr_qln_mm )
613 maxwrk = max( maxwrk, 2*m + lwork_cunmbr_prc_nn )
617 maxwrk = max( maxwrk, minwrk )
621 IF( lwork.LT.minwrk .AND. .NOT. lquery )
THEN
627 CALL xerbla(
'CGESDD', -info )
629 ELSE IF( lquery )
THEN
635 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
642 smlnum = sqrt(
slamch(
'S' ) ) / eps
643 bignum = one / smlnum
647 anrm =
clange(
'M', m, n, a, lda, dum )
653 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
655 CALL clascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
656 ELSE IF( anrm.GT.bignum )
THEN
658 CALL clascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
667 IF( m.GE.mnthr1 )
THEN
682 CALL cgeqrf( m, n, a, lda, work( itau ), work( nwork ),
683 $ lwork-nwork+1, ierr )
687 CALL claset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
699 CALL cgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
700 $ work( itaup ), work( nwork ), lwork-nwork+1,
708 CALL sbdsdc(
'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 cgeqrf( m, n, a, lda, work( itau ), work( nwork ),
740 $ lwork-nwork+1, ierr )
744 CALL clacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
745 CALL claset(
'L', n-1, n-1, czero, czero, work( ir+1 ),
753 CALL cungqr( m, n, n, a, lda, work( itau ),
754 $ work( nwork ), lwork-nwork+1, ierr )
765 CALL cgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
766 $ work( itauq ), work( itaup ), work( nwork ),
767 $ lwork-nwork+1, ierr )
778 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
779 $ n, rwork( irvt ), n, dum, idum,
780 $ rwork( nrwork ), iwork, info )
788 CALL clacp2(
'F', n, n, rwork( iru ), n, work( iu ),
790 CALL cunmbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
791 $ work( itauq ), work( iu ), ldwrku,
792 $ work( nwork ), lwork-nwork+1, ierr )
800 CALL clacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
801 CALL cunmbr(
'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 cgemm(
'N',
'N', chunk, n, n, cone, a( i, 1 ),
814 $ lda, work( iu ), ldwrku, czero,
815 $ work( ir ), ldwrkr )
816 CALL clacpy(
'F', chunk, n, work( ir ), ldwrkr,
820 ELSE IF( wntqs )
THEN
839 CALL cgeqrf( m, n, a, lda, work( itau ), work( nwork ),
840 $ lwork-nwork+1, ierr )
844 CALL clacpy(
'U', n, n, a, lda, work( ir ), ldwrkr )
845 CALL claset(
'L', n-1, n-1, czero, czero, work( ir+1 ),
853 CALL cungqr( m, n, n, a, lda, work( itau ),
854 $ work( nwork ), lwork-nwork+1, ierr )
865 CALL cgebrd( n, n, work( ir ), ldwrkr, s, rwork( ie ),
866 $ work( itauq ), work( itaup ), work( nwork ),
867 $ lwork-nwork+1, ierr )
878 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
879 $ n, rwork( irvt ), n, dum, idum,
880 $ rwork( nrwork ), iwork, info )
888 CALL clacp2(
'F', n, n, rwork( iru ), n, u, ldu )
889 CALL cunmbr(
'Q',
'L',
'N', n, n, n, work( ir ), ldwrkr,
890 $ work( itauq ), u, ldu, work( nwork ),
891 $ lwork-nwork+1, ierr )
899 CALL clacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
900 CALL cunmbr(
'P',
'R',
'C', n, n, n, work( ir ), ldwrkr,
901 $ work( itaup ), vt, ldvt, work( nwork ),
902 $ lwork-nwork+1, ierr )
909 CALL clacpy(
'F', n, n, u, ldu, work( ir ), ldwrkr )
910 CALL cgemm(
'N',
'N', m, n, n, cone, a, lda, work( ir ),
911 $ ldwrkr, czero, u, ldu )
913 ELSE IF( wntqa )
THEN
932 CALL cgeqrf( m, n, a, lda, work( itau ), work( nwork ),
933 $ lwork-nwork+1, ierr )
934 CALL clacpy(
'L', m, n, a, lda, u, ldu )
941 CALL cungqr( m, m, n, u, ldu, work( itau ),
942 $ work( nwork ), lwork-nwork+1, ierr )
946 CALL claset(
'L', n-1, n-1, czero, czero, a( 2, 1 ),
958 CALL cgebrd( n, n, a, lda, s, rwork( ie ), work( itauq ),
959 $ work( itaup ), work( nwork ), lwork-nwork+1,
971 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
972 $ n, rwork( irvt ), n, dum, idum,
973 $ rwork( nrwork ), iwork, info )
981 CALL clacp2(
'F', n, n, rwork( iru ), n, work( iu ),
983 CALL cunmbr(
'Q',
'L',
'N', n, n, n, a, lda,
984 $ work( itauq ), work( iu ), ldwrku,
985 $ work( nwork ), lwork-nwork+1, ierr )
993 CALL clacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
994 CALL cunmbr(
'P',
'R',
'C', n, n, n, a, lda,
995 $ work( itaup ), vt, ldvt, work( nwork ),
996 $ lwork-nwork+1, ierr )
1003 CALL cgemm(
'N',
'N', m, n, n, cone, u, ldu, work( iu ),
1004 $ ldwrku, czero, a, lda )
1008 CALL clacpy(
'F', m, n, a, lda, u, ldu )
1012 ELSE IF( m.GE.mnthr2 )
THEN
1031 CALL cgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1032 $ work( itaup ), work( nwork ), lwork-nwork+1,
1041 CALL sbdsdc(
'U',
'N', n, s, rwork( ie ), dum, 1,dum,1,
1042 $ dum, idum, rwork( nrwork ), iwork, info )
1043 ELSE IF( wntqo )
THEN
1055 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
1056 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1057 $ work( nwork ), lwork-nwork+1, ierr )
1064 CALL cungbr(
'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 sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1087 $ n, rwork( irvt ), n, dum, idum,
1088 $ rwork( nrwork ), iwork, info )
1095 CALL clarcm( n, n, rwork( irvt ), n, vt, ldvt,
1096 $ work( iu ), ldwrku, rwork( nrwork ) )
1097 CALL clacpy(
'F', n, n, work( iu ), ldwrku, vt, ldvt )
1107 DO 20 i = 1, m, ldwrku
1108 chunk = min( m-i+1, ldwrku )
1109 CALL clacrm( chunk, n, a( i, 1 ), lda, rwork( iru ),
1110 $ n, work( iu ), ldwrku, rwork( nrwork ) )
1111 CALL clacpy(
'F', chunk, n, work( iu ), ldwrku,
1115 ELSE IF( wntqs )
THEN
1123 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
1124 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1125 $ work( nwork ), lwork-nwork+1, ierr )
1132 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1133 CALL cungbr(
'Q', m, n, n, u, ldu, work( itauq ),
1134 $ work( nwork ), lwork-nwork+1, ierr )
1145 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1146 $ n, rwork( irvt ), n, dum, idum,
1147 $ rwork( nrwork ), iwork, info )
1154 CALL clarcm( n, n, rwork( irvt ), n, vt, ldvt, a, lda,
1156 CALL clacpy(
'F', n, n, a, lda, vt, ldvt )
1164 CALL clacrm( m, n, u, ldu, rwork( iru ), n, a, lda,
1166 CALL clacpy(
'F', m, n, a, lda, u, ldu )
1175 CALL clacpy(
'U', n, n, a, lda, vt, ldvt )
1176 CALL cungbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1177 $ work( nwork ), lwork-nwork+1, ierr )
1184 CALL clacpy(
'L', m, n, a, lda, u, ldu )
1185 CALL cungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1186 $ work( nwork ), lwork-nwork+1, ierr )
1197 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1198 $ n, rwork( irvt ), n, dum, idum,
1199 $ rwork( nrwork ), iwork, info )
1206 CALL clarcm( n, n, rwork( irvt ), n, vt, ldvt, a, lda,
1208 CALL clacpy(
'F', n, n, a, lda, vt, ldvt )
1216 CALL clacrm( m, n, u, ldu, rwork( iru ), n, a, lda,
1218 CALL clacpy(
'F', m, n, a, lda, u, ldu )
1240 CALL cgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1241 $ work( itaup ), work( nwork ), lwork-nwork+1,
1250 CALL sbdsdc(
'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 sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1278 $ n, rwork( irvt ), n, dum, idum,
1279 $ rwork( nrwork ), iwork, info )
1287 CALL clacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1288 CALL cunmbr(
'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 claset(
'F', m, n, czero, czero, work( iu ),
1304 CALL clacp2(
'F', n, n, rwork( iru ), n, work( iu ),
1306 CALL cunmbr(
'Q',
'L',
'N', m, n, n, a, lda,
1307 $ work( itauq ), work( iu ), ldwrku,
1308 $ work( nwork ), lwork-nwork+1, ierr )
1309 CALL clacpy(
'F', m, n, work( iu ), ldwrku, a, lda )
1318 CALL cungbr(
'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 clacrm( chunk, n, a( i, 1 ), lda,
1332 $ rwork( iru ), n, work( iu ), ldwrku,
1334 CALL clacpy(
'F', chunk, n, work( iu ), ldwrku,
1339 ELSE IF( wntqs )
THEN
1351 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1352 $ n, rwork( irvt ), n, dum, idum,
1353 $ rwork( nrwork ), iwork, info )
1361 CALL claset(
'F', m, n, czero, czero, u, ldu )
1362 CALL clacp2(
'F', n, n, rwork( iru ), n, u, ldu )
1363 CALL cunmbr(
'Q',
'L',
'N', m, n, n, a, lda,
1364 $ work( itauq ), u, ldu, work( nwork ),
1365 $ lwork-nwork+1, ierr )
1373 CALL clacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1374 CALL cunmbr(
'P',
'R',
'C', n, n, n, a, lda,
1375 $ work( itaup ), vt, ldvt, work( nwork ),
1376 $ lwork-nwork+1, ierr )
1389 CALL sbdsdc(
'U',
'I', n, s, rwork( ie ), rwork( iru ),
1390 $ n, rwork( irvt ), n, dum, idum,
1391 $ rwork( nrwork ), iwork, info )
1395 CALL claset(
'F', m, m, czero, czero, u, ldu )
1397 CALL claset(
'F', m-n, m-n, czero, cone,
1398 $ u( n+1, n+1 ), ldu )
1407 CALL clacp2(
'F', n, n, rwork( iru ), n, u, ldu )
1408 CALL cunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
1409 $ work( itauq ), u, ldu, work( nwork ),
1410 $ lwork-nwork+1, ierr )
1418 CALL clacp2(
'F', n, n, rwork( irvt ), n, vt, ldvt )
1419 CALL cunmbr(
'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 cgelqf( m, n, a, lda, work( itau ), work( nwork ),
1448 $ lwork-nwork+1, ierr )
1452 CALL claset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
1464 CALL cgebrd( m, m, a, lda, s, rwork( ie ), work( itauq ),
1465 $ work( itaup ), work( nwork ), lwork-nwork+1,
1473 CALL sbdsdc(
'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 cgelqf( m, n, a, lda, work( itau ), work( nwork ),
1510 $ lwork-nwork+1, ierr )
1514 CALL clacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1515 CALL claset(
'U', m-1, m-1, czero, czero,
1516 $ work( il+ldwrkl ), ldwrkl )
1523 CALL cunglq( m, n, m, a, lda, work( itau ),
1524 $ work( nwork ), lwork-nwork+1, ierr )
1535 CALL cgebrd( m, m, work( il ), ldwrkl, s, rwork( ie ),
1536 $ work( itauq ), work( itaup ), work( nwork ),
1537 $ lwork-nwork+1, ierr )
1548 CALL sbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1549 $ m, rwork( irvt ), m, dum, idum,
1550 $ rwork( nrwork ), iwork, info )
1558 CALL clacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1559 CALL cunmbr(
'Q',
'L',
'N', m, m, m, work( il ), ldwrkl,
1560 $ work( itauq ), u, ldu, work( nwork ),
1561 $ lwork-nwork+1, ierr )
1569 CALL clacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
1571 CALL cunmbr(
'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 cgemm(
'N',
'N', m, blk, m, cone, work( ivt ), m,
1584 $ a( 1, i ), lda, czero, work( il ),
1586 CALL clacpy(
'F', m, blk, work( il ), ldwrkl,
1590 ELSE IF( wntqs )
THEN
1601 itau = il + ldwrkl*m
1609 CALL cgelqf( m, n, a, lda, work( itau ), work( nwork ),
1610 $ lwork-nwork+1, ierr )
1614 CALL clacpy(
'L', m, m, a, lda, work( il ), ldwrkl )
1615 CALL claset(
'U', m-1, m-1, czero, czero,
1616 $ work( il+ldwrkl ), ldwrkl )
1623 CALL cunglq( m, n, m, a, lda, work( itau ),
1624 $ work( nwork ), lwork-nwork+1, ierr )
1635 CALL cgebrd( m, m, work( il ), ldwrkl, s, rwork( ie ),
1636 $ work( itauq ), work( itaup ), work( nwork ),
1637 $ lwork-nwork+1, ierr )
1648 CALL sbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1649 $ m, rwork( irvt ), m, dum, idum,
1650 $ rwork( nrwork ), iwork, info )
1658 CALL clacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1659 CALL cunmbr(
'Q',
'L',
'N', m, m, m, work( il ), ldwrkl,
1660 $ work( itauq ), u, ldu, work( nwork ),
1661 $ lwork-nwork+1, ierr )
1669 CALL clacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
1670 CALL cunmbr(
'P',
'R',
'C', m, m, m, work( il ), ldwrkl,
1671 $ work( itaup ), vt, ldvt, work( nwork ),
1672 $ lwork-nwork+1, ierr )
1679 CALL clacpy(
'F', m, m, vt, ldvt, work( il ), ldwrkl )
1680 CALL cgemm(
'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 cgelqf( m, n, a, lda, work( itau ), work( nwork ),
1703 $ lwork-nwork+1, ierr )
1704 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
1711 CALL cunglq( n, n, m, vt, ldvt, work( itau ),
1712 $ work( nwork ), lwork-nwork+1, ierr )
1716 CALL claset(
'U', m-1, m-1, czero, czero, a( 1, 2 ),
1728 CALL cgebrd( m, m, a, lda, s, rwork( ie ), work( itauq ),
1729 $ work( itaup ), work( nwork ), lwork-nwork+1,
1741 CALL sbdsdc(
'U',
'I', m, s, rwork( ie ), rwork( iru ),
1742 $ m, rwork( irvt ), m, dum, idum,
1743 $ rwork( nrwork ), iwork, info )
1751 CALL clacp2(
'F', m, m, rwork( iru ), m, u, ldu )
1752 CALL cunmbr(
'Q',
'L',
'N', m, m, m, a, lda,
1753 $ work( itauq ), u, ldu, work( nwork ),
1754 $ lwork-nwork+1, ierr )
1762 CALL clacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
1764 CALL cunmbr(
'P',
'R',
'C', m, m, m, a, lda,
1765 $ work( itaup ), work( ivt ), ldwkvt,
1766 $ work( nwork ), lwork-nwork+1, ierr )
1773 CALL cgemm(
'N',
'N', m, n, m, cone, work( ivt ), ldwkvt,
1774 $ vt, ldvt, czero, a, lda )
1778 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
1782 ELSE IF( n.GE.mnthr2 )
THEN
1801 CALL cgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
1802 $ work( itaup ), work( nwork ), lwork-nwork+1,
1812 CALL sbdsdc(
'L',
'N', m, s, rwork( ie ), dum,1,dum,1,
1813 $ dum, idum, rwork( nrwork ), iwork, info )
1814 ELSE IF( wntqo )
THEN
1826 CALL clacpy(
'L', m, m, a, lda, u, ldu )
1827 CALL cungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1828 $ work( nwork ), lwork-nwork+1, ierr )
1835 CALL cungbr(
'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 sbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1860 $ m, rwork( irvt ), m, dum, idum,
1861 $ rwork( nrwork ), iwork, info )
1868 CALL clacrm( m, m, u, ldu, rwork( iru ), m, work( ivt ),
1869 $ ldwkvt, rwork( nrwork ) )
1870 CALL clacpy(
'F', m, m, work( ivt ), ldwkvt, u, ldu )
1880 DO 50 i = 1, n, chunk
1881 blk = min( n-i+1, chunk )
1882 CALL clarcm( m, blk, rwork( irvt ), m, a( 1, i ), lda,
1883 $ work( ivt ), ldwkvt, rwork( nrwork ) )
1884 CALL clacpy(
'F', m, blk, work( ivt ), ldwkvt,
1887 ELSE IF( wntqs )
THEN
1895 CALL clacpy(
'L', m, m, a, lda, u, ldu )
1896 CALL cungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1897 $ work( nwork ), lwork-nwork+1, ierr )
1904 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
1905 CALL cungbr(
'P', m, n, m, vt, ldvt, work( itaup ),
1906 $ work( nwork ), lwork-nwork+1, ierr )
1917 CALL sbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1918 $ m, rwork( irvt ), m, dum, idum,
1919 $ rwork( nrwork ), iwork, info )
1926 CALL clacrm( m, m, u, ldu, rwork( iru ), m, a, lda,
1928 CALL clacpy(
'F', m, m, a, lda, u, ldu )
1936 CALL clarcm( m, n, rwork( irvt ), m, vt, ldvt, a, lda,
1938 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
1947 CALL clacpy(
'L', m, m, a, lda, u, ldu )
1948 CALL cungbr(
'Q', m, m, n, u, ldu, work( itauq ),
1949 $ work( nwork ), lwork-nwork+1, ierr )
1956 CALL clacpy(
'U', m, n, a, lda, vt, ldvt )
1957 CALL cungbr(
'P', n, n, m, vt, ldvt, work( itaup ),
1958 $ work( nwork ), lwork-nwork+1, ierr )
1969 CALL sbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
1970 $ m, rwork( irvt ), m, dum, idum,
1971 $ rwork( nrwork ), iwork, info )
1978 CALL clacrm( m, m, u, ldu, rwork( iru ), m, a, lda,
1980 CALL clacpy(
'F', m, m, a, lda, u, ldu )
1988 CALL clarcm( m, n, rwork( irvt ), m, vt, ldvt, a, lda,
1990 CALL clacpy(
'F', m, n, a, lda, vt, ldvt )
2012 CALL cgebrd( m, n, a, lda, s, rwork( ie ), work( itauq ),
2013 $ work( itaup ), work( nwork ), lwork-nwork+1,
2022 CALL sbdsdc(
'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 claset(
'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 sbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2053 $ m, rwork( irvt ), m, dum, idum,
2054 $ rwork( nrwork ), iwork, info )
2062 CALL clacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2063 CALL cunmbr(
'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 clacp2(
'F', m, m, rwork( irvt ), m, work( ivt ),
2079 CALL cunmbr(
'P',
'R',
'C', m, n, m, a, lda,
2080 $ work( itaup ), work( ivt ), ldwkvt,
2081 $ work( nwork ), lwork-nwork+1, ierr )
2082 CALL clacpy(
'F', m, n, work( ivt ), ldwkvt, a, lda )
2091 CALL cungbr(
'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 clarcm( m, blk, rwork( irvt ), m, a( 1, i ),
2105 $ lda, work( ivt ), ldwkvt,
2107 CALL clacpy(
'F', m, blk, work( ivt ), ldwkvt,
2111 ELSE IF( wntqs )
THEN
2123 CALL sbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2124 $ m, rwork( irvt ), m, dum, idum,
2125 $ rwork( nrwork ), iwork, info )
2133 CALL clacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2134 CALL cunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2135 $ work( itauq ), u, ldu, work( nwork ),
2136 $ lwork-nwork+1, ierr )
2144 CALL claset(
'F', m, n, czero, czero, vt, ldvt )
2145 CALL clacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
2146 CALL cunmbr(
'P',
'R',
'C', m, n, m, a, lda,
2147 $ work( itaup ), vt, ldvt, work( nwork ),
2148 $ lwork-nwork+1, ierr )
2162 CALL sbdsdc(
'L',
'I', m, s, rwork( ie ), rwork( iru ),
2163 $ m, rwork( irvt ), m, dum, idum,
2164 $ rwork( nrwork ), iwork, info )
2172 CALL clacp2(
'F', m, m, rwork( iru ), m, u, ldu )
2173 CALL cunmbr(
'Q',
'L',
'N', m, m, n, a, lda,
2174 $ work( itauq ), u, ldu, work( nwork ),
2175 $ lwork-nwork+1, ierr )
2179 CALL claset(
'F', n, n, czero, cone, vt, ldvt )
2187 CALL clacp2(
'F', m, m, rwork( irvt ), m, vt, ldvt )
2188 CALL cunmbr(
'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 slascl(
'G', 0, 0, bignum, anrm, minmn, 1, s, minmn,
2203 IF( info.NE.0 .AND. anrm.GT.bignum )
2204 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn-1, 1,
2205 $ rwork( ie ), minmn, ierr )
2206 IF( anrm.LT.smlnum )
2207 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn, 1, s, minmn,
2209 IF( info.NE.0 .AND. anrm.LT.smlnum )
2210 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn-1, 1,
2211 $ rwork( ie ), minmn, ierr )
subroutine slascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
SLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
logical function sisnan(SIN)
SISNAN tests input for NaN.
subroutine xerbla(SRNAME, INFO)
XERBLA
logical function lsame(CA, CB)
LSAME
subroutine sbdsdc(UPLO, COMPQ, N, D, E, U, LDU, VT, LDVT, Q, IQ, WORK, IWORK, INFO)
SBDSDC
subroutine cgemm(TRANSA, TRANSB, M, N, K, ALPHA, A, LDA, B, LDB, BETA, C, LDC)
CGEMM
subroutine cungbr(VECT, M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
CUNGBR
real function clange(NORM, M, N, A, LDA, WORK)
CLANGE returns the value of the 1-norm, Frobenius norm, infinity-norm, or the largest absolute value ...
subroutine cgeqrf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
CGEQRF
subroutine cgebrd(M, N, A, LDA, D, E, TAUQ, TAUP, WORK, LWORK, INFO)
CGEBRD
subroutine cgelqf(M, N, A, LDA, TAU, WORK, LWORK, INFO)
CGELQF
subroutine clarcm(M, N, A, LDA, B, LDB, C, LDC, RWORK)
CLARCM copies all or part of a real two-dimensional array to a complex array.
subroutine claset(UPLO, M, N, ALPHA, BETA, A, LDA)
CLASET initializes the off-diagonal elements and the diagonal elements of a matrix to given values.
subroutine clascl(TYPE, KL, KU, CFROM, CTO, M, N, A, LDA, INFO)
CLASCL multiplies a general rectangular matrix by a real scalar defined as cto/cfrom.
subroutine clacrm(M, N, A, LDA, B, LDB, C, LDC, RWORK)
CLACRM multiplies a complex matrix by a square real matrix.
subroutine clacp2(UPLO, M, N, A, LDA, B, LDB)
CLACP2 copies all or part of a real two-dimensional array to a complex array.
subroutine clacpy(UPLO, M, N, A, LDA, B, LDB)
CLACPY copies all or part of one two-dimensional array to another.
subroutine cunglq(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
CUNGLQ
subroutine cunmbr(VECT, SIDE, TRANS, M, N, K, A, LDA, TAU, C, LDC, WORK, LWORK, INFO)
CUNMBR
subroutine cungqr(M, N, K, A, LDA, TAU, WORK, LWORK, INFO)
CUNGQR
real function slamch(CMACH)
SLAMCH