209 SUBROUTINE dgesvd( JOBU, JOBVT, M, N, A, LDA, S, U, LDU,
210 $ VT, LDVT, WORK, LWORK, INFO )
217 CHARACTER JOBU, JOBVT
218 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
228 DOUBLE PRECISION ZERO, ONE
229 parameter( zero = 0.0d0, one = 1.0d0 )
234 INTEGER BDSPAC, BLK, CHUNK
236 $ maxwrk, minmn, minwrk, mnthr, ncu, ncvt, nru,
238 INTEGER LWORK_DGEQRF, LWORK_DORGQR_N, LWORK_DORGQR_M,
239 $ lwork_dgebrd, lwork_dorgbr_p, lwork_dorgbr_q,
240 $ lwork_dgelqf, lwork_dorglq_n, lwork_dorglq_m
241 DOUBLE PRECISION ANRM, BIGNUM, EPS, SMLNUM
244 DOUBLE PRECISION DUM( 1 )
254 DOUBLE PRECISION DLAMCH, DLANGE
255 EXTERNAL lsame, ilaenv, dlamch, dlange
266 wntua = lsame( jobu,
'A' )
267 wntus = lsame( jobu,
'S' )
268 wntuas = wntua .OR. wntus
269 wntuo = lsame( jobu,
'O' )
270 wntun = lsame( jobu,
'N' )
271 wntva = lsame( jobvt,
'A' )
272 wntvs = lsame( jobvt,
'S' )
273 wntvas = wntva .OR. wntvs
274 wntvo = lsame( jobvt, 'o
' )
275 WNTVN = LSAME( JOBVT, 'n
' )
276.EQ.
LQUERY = ( LWORK-1 )
278.NOT..OR..OR..OR.
IF( ( WNTUA WNTUS WNTUO WNTUN ) ) THEN
280.NOT..OR..OR..OR..OR.
ELSE IF( ( WNTVA WNTVS WNTVO WNTVN )
281.AND.
$ ( WNTVO WNTUO ) ) THEN
283.LT.
ELSE IF( M0 ) THEN
285.LT.
ELSE IF( N0 ) THEN
287.LT.
ELSE IF( LDAMAX( 1, M ) ) THEN
289.LT..OR..AND..LT.
ELSE IF( LDU1 ( WNTUAS LDUM ) ) THEN
291.LT..OR..AND..LT..OR.
ELSE IF( LDVT1 ( WNTVA LDVTN )
292.AND..LT.
$ ( WNTVS LDVTMINMN ) ) THEN
306.GE..AND..GT.
IF( MN MINMN0 ) THEN
310 MNTHR = ILAENV( 6, 'dgesvd', JOBU // JOBVT, M, N, 0, 0 )
313 CALL DGEQRF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
314 LWORK_DGEQRF = INT( DUM(1) )
316 CALL DORGQR( M, N, N, A, LDA, DUM(1), DUM(1), -1, IERR )
317 LWORK_DORGQR_N = INT( DUM(1) )
318 CALL DORGQR( M, M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
319 LWORK_DORGQR_M = INT( DUM(1) )
321 CALL DGEBRD( N, N, A, LDA, S, DUM(1), DUM(1),
322 $ DUM(1), DUM(1), -1, IERR )
323 LWORK_DGEBRD = INT( DUM(1) )
325 CALL DORGBR( 'p
', N, N, N, A, LDA, DUM(1),
327 LWORK_DORGBR_P = INT( DUM(1) )
329 CALL DORGBR( 'q
', N, N, N, A, LDA, DUM(1),
331 LWORK_DORGBR_Q = INT( DUM(1) )
333.GE.
IF( MMNTHR ) THEN
338 MAXWRK = N + LWORK_DGEQRF
339 MAXWRK = MAX( MAXWRK, 3*N + LWORK_DGEBRD )
340.OR.
IF( WNTVO WNTVAS )
341 $ MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_P )
342 MAXWRK = MAX( MAXWRK, BDSPAC )
343 MINWRK = MAX( 4*N, BDSPAC )
344.AND.
ELSE IF( WNTUO WNTVN ) THEN
348 WRKBL = N + LWORK_DGEQRF
349 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N )
350 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
351 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
352 WRKBL = MAX( WRKBL, BDSPAC )
353 MAXWRK = MAX( N*N + WRKBL, N*N + M*N + N )
354 MINWRK = MAX( 3*N + M, BDSPAC )
355.AND.
ELSE IF( WNTUO WNTVAS ) THEN
360 WRKBL = N + LWORK_DGEQRF
361 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N )
362 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
363 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
364 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P )
365 WRKBL = MAX( WRKBL, BDSPAC )
366 MAXWRK = MAX( N*N + WRKBL, N*N + M*N + N )
367 MINWRK = MAX( 3*N + M, BDSPAC )
368.AND.
ELSE IF( WNTUS WNTVN ) THEN
372 WRKBL = N + LWORK_DGEQRF
373 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N )
374 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
375 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
376 WRKBL = MAX( WRKBL, BDSPAC )
378 MINWRK = MAX( 3*N + M, BDSPAC )
379.AND.
ELSE IF( WNTUS WNTVO ) THEN
383 WRKBL = N + LWORK_DGEQRF
384 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N )
385 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
386 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
387 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P )
388 WRKBL = MAX( WRKBL, BDSPAC )
389 MAXWRK = 2*N*N + WRKBL
390 MINWRK = MAX( 3*N + M, BDSPAC )
391.AND.
ELSE IF( WNTUS WNTVAS ) THEN
396 WRKBL = N + LWORK_DGEQRF
397 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_N )
398 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
399 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
400 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P )
401 WRKBL = MAX( WRKBL, BDSPAC )
403 MINWRK = MAX( 3*N + M, BDSPAC )
404.AND.
ELSE IF( WNTUA WNTVN ) THEN
408 WRKBL = N + LWORK_DGEQRF
409 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_M )
410 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
411 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
412 WRKBL = MAX( WRKBL, BDSPAC )
414 MINWRK = MAX( 3*N + M, BDSPAC )
415.AND.
ELSE IF( WNTUA WNTVO ) THEN
419 WRKBL = N + LWORK_DGEQRF
420 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_M )
421 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
422 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
423 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P )
424 WRKBL = MAX( WRKBL, BDSPAC )
425 MAXWRK = 2*N*N + WRKBL
426 MINWRK = MAX( 3*N + M, BDSPAC )
427.AND.
ELSE IF( WNTUA WNTVAS ) THEN
432 WRKBL = N + LWORK_DGEQRF
433 WRKBL = MAX( WRKBL, N + LWORK_DORGQR_M )
434 WRKBL = MAX( WRKBL, 3*N + LWORK_DGEBRD )
435 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_Q )
436 WRKBL = MAX( WRKBL, 3*N + LWORK_DORGBR_P )
437 WRKBL = MAX( WRKBL, BDSPAC )
439 MINWRK = MAX( 3*N + M, BDSPAC )
445 CALL DGEBRD( M, N, A, LDA, S, DUM(1), DUM(1),
446 $ DUM(1), DUM(1), -1, IERR )
447 LWORK_DGEBRD = INT( DUM(1) )
448 MAXWRK = 3*N + LWORK_DGEBRD
449.OR.
IF( WNTUS WNTUO ) THEN
450 CALL DORGBR( 'q
', M, N, N, A, LDA, DUM(1),
452 LWORK_DORGBR_Q = INT( DUM(1) )
453 MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_Q )
456 CALL DORGBR( 'q
', M, M, N, A, LDA, DUM(1),
458 LWORK_DORGBR_Q = INT( DUM(1) )
459 MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_Q )
461.NOT.
IF( WNTVN ) THEN
462 MAXWRK = MAX( MAXWRK, 3*N + LWORK_DORGBR_P )
464 MAXWRK = MAX( MAXWRK, BDSPAC )
465 MINWRK = MAX( 3*N + M, BDSPAC )
467.GT.
ELSE IF( MINMN0 ) THEN
471 MNTHR = ILAENV( 6, 'dgesvd', JOBU // JOBVT, M, N, 0, 0 )
474 CALL DGELQF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
475 LWORK_DGELQF = INT( DUM(1) )
477 CALL DORGLQ( N, N, M, DUM(1), N, DUM(1), DUM(1), -1, IERR )
478 LWORK_DORGLQ_N = INT( DUM(1) )
479 CALL DORGLQ( M, N, M, A, LDA, DUM(1), DUM(1), -1, IERR )
480 LWORK_DORGLQ_M = INT( DUM(1) )
482 CALL DGEBRD( M, M, A, LDA, S, DUM(1), DUM(1),
483 $ DUM(1), DUM(1), -1, IERR )
484 LWORK_DGEBRD = INT( DUM(1) )
486 CALL DORGBR( 'p
', M, M, M, A, N, DUM(1),
488 LWORK_DORGBR_P = INT( DUM(1) )
490 CALL DORGBR( 'q
', M, M, M, A, N, DUM(1),
492 LWORK_DORGBR_Q = INT( DUM(1) )
493.GE.
IF( NMNTHR ) THEN
498 MAXWRK = M + LWORK_DGELQF
499 MAXWRK = MAX( MAXWRK, 3*M + LWORK_DGEBRD )
500.OR.
IF( WNTUO WNTUAS )
501 $ MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_Q )
502 MAXWRK = MAX( MAXWRK, BDSPAC )
503 MINWRK = MAX( 4*M, BDSPAC )
504.AND.
ELSE IF( WNTVO WNTUN ) THEN
508 WRKBL = M + LWORK_DGELQF
509 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M )
510 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
511 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
512 WRKBL = MAX( WRKBL, BDSPAC )
513 MAXWRK = MAX( M*M + WRKBL, M*M + M*N + M )
514 MINWRK = MAX( 3*M + N, BDSPAC )
515.AND.
ELSE IF( WNTVO WNTUAS ) THEN
520 WRKBL = M + LWORK_DGELQF
521 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M )
522 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
523 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
524 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q )
525 WRKBL = MAX( WRKBL, BDSPAC )
526 MAXWRK = MAX( M*M + WRKBL, M*M + M*N + M )
527 MINWRK = MAX( 3*M + N, BDSPAC )
528.AND.
ELSE IF( WNTVS WNTUN ) THEN
532 WRKBL = M + LWORK_DGELQF
533 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M )
534 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
535 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
536 WRKBL = MAX( WRKBL, BDSPAC )
538 MINWRK = MAX( 3*M + N, BDSPAC )
539.AND.
ELSE IF( WNTVS WNTUO ) THEN
543 WRKBL = M + LWORK_DGELQF
544 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M )
545 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
546 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
547 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q )
548 WRKBL = MAX( WRKBL, BDSPAC )
549 MAXWRK = 2*M*M + WRKBL
550 MINWRK = MAX( 3*M + N, BDSPAC )
551.AND.
ELSE IF( WNTVS WNTUAS ) THEN
556 WRKBL = M + LWORK_DGELQF
557 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_M )
558 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
559 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
560 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q )
561 WRKBL = MAX( WRKBL, BDSPAC )
563 MINWRK = MAX( 3*M + N, BDSPAC )
564.AND.
ELSE IF( WNTVA WNTUN ) THEN
568 WRKBL = M + LWORK_DGELQF
569 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_N )
570 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
571 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
572 WRKBL = MAX( WRKBL, BDSPAC )
574 MINWRK = MAX( 3*M + N, BDSPAC )
575.AND.
ELSE IF( WNTVA WNTUO ) THEN
579 WRKBL = M + LWORK_DGELQF
580 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_N )
581 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
582 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
583 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q )
584 WRKBL = MAX( WRKBL, BDSPAC )
585 MAXWRK = 2*M*M + WRKBL
586 MINWRK = MAX( 3*M + N, BDSPAC )
587.AND.
ELSE IF( WNTVA WNTUAS ) THEN
592 WRKBL = M + LWORK_DGELQF
593 WRKBL = MAX( WRKBL, M + LWORK_DORGLQ_N )
594 WRKBL = MAX( WRKBL, 3*M + LWORK_DGEBRD )
595 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_P )
596 WRKBL = MAX( WRKBL, 3*M + LWORK_DORGBR_Q )
597 WRKBL = MAX( WRKBL, BDSPAC )
599 MINWRK = MAX( 3*M + N, BDSPAC )
605 CALL DGEBRD( M, N, A, LDA, S, DUM(1), DUM(1),
606 $ DUM(1), DUM(1), -1, IERR )
607 LWORK_DGEBRD = INT( DUM(1) )
608 MAXWRK = 3*M + LWORK_DGEBRD
609.OR.
IF( WNTVS WNTVO ) THEN
611 CALL DORGBR( 'p
', M, N, M, A, N, DUM(1),
613 LWORK_DORGBR_P = INT( DUM(1) )
614 MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_P )
617 CALL DORGBR( 'p
', N, N, M, A, N, DUM(1),
619 LWORK_DORGBR_P = INT( DUM(1) )
620 MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_P )
622.NOT.
IF( WNTUN ) THEN
623 MAXWRK = MAX( MAXWRK, 3*M + LWORK_DORGBR_Q )
625 MAXWRK = MAX( MAXWRK, BDSPAC )
626 MINWRK = MAX( 3*M + N, BDSPAC )
629 MAXWRK = MAX( MAXWRK, MINWRK )
632.LT..AND..NOT.
IF( LWORKMINWRK LQUERY ) THEN
638 CALL XERBLA( 'dgesvd', -INFO )
640 ELSE IF( LQUERY ) THEN
646.EQ..OR..EQ.
IF( M0 N0 ) THEN
653 SMLNUM = SQRT( DLAMCH( 's
' ) ) / EPS
654 BIGNUM = ONE / SMLNUM
658 ANRM = DLANGE( 'm
', M, N, A, LDA, DUM )
660.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
662 CALL DLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
663.GT.
ELSE IF( ANRMBIGNUM ) THEN
665 CALL DLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR )
674.GE.
IF( MMNTHR ) THEN
687 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
688 $ LWORK-IWORK+1, IERR )
693 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO, A( 2, 1 ),
704 CALL DGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
705 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
708.OR.
IF( WNTVO WNTVAS ) THEN
713 CALL DORGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
714 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
723 CALL DBDSQR( 'u
', N, NCVT, 0, 0, S, WORK( IE ), A, LDA,
724 $ DUM, 1, DUM, 1, WORK( IWORK ), INFO )
729 $ CALL DLACPY( 'f
', N, N, A, LDA, VT, LDVT )
731.AND.
ELSE IF( WNTUO WNTVN ) THEN
737.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
742.GE.
IF( LWORKMAX( WRKBL, LDA*N + N ) + LDA*N ) THEN
748.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N + N ) + N*N ) THEN
758 LDWRKU = ( LWORK-N*N-N ) / N
767 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
768 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
772 CALL DLACPY( 'u
', N, N, A, LDA, WORK( IR ), LDWRKR )
773 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO, WORK( IR+1 ),
779 CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
780 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
789 CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S, WORK( IE ),
790 $ WORK( ITAUQ ), WORK( ITAUP ),
791 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
796 CALL DORGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
797 $ WORK( ITAUQ ), WORK( IWORK ),
798 $ LWORK-IWORK+1, IERR )
805 CALL DBDSQR( 'u
', N, 0, N, 0, S, WORK( IE ), DUM, 1,
806 $ WORK( IR ), LDWRKR, DUM, 1,
807 $ WORK( IWORK ), INFO )
814 DO 10 I = 1, M, LDWRKU
815 CHUNK = MIN( M-I+1, LDWRKU )
816 CALL DGEMM( 'n
', 'n
', CHUNK, N, N, ONE, A( I, 1 ),
817 $ LDA, WORK( IR ), LDWRKR, ZERO,
818 $ WORK( IU ), LDWRKU )
819 CALL DLACPY( 'f
', CHUNK, N, WORK( IU ), LDWRKU,
835 CALL DGEBRD( M, N, A, LDA, S, WORK( IE ),
836 $ WORK( ITAUQ ), WORK( ITAUP ),
837 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
842 CALL DORGBR( 'q
', M, N, N, A, LDA, WORK( ITAUQ ),
843 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
850 CALL DBDSQR( 'u
', N, 0, M, 0, S, WORK( IE ), DUM, 1,
851 $ A, LDA, DUM, 1, WORK( IWORK ), INFO )
855.AND.
ELSE IF( WNTUO WNTVAS ) THEN
861.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
866.GE.
IF( LWORKMAX( WRKBL, LDA*N + N ) + LDA*N ) THEN
872.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N + N ) + N*N ) THEN
882 LDWRKU = ( LWORK-N*N-N ) / N
891 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
892 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
896 CALL DLACPY( 'u
', N, N, A, LDA, VT, LDVT )
898 $ CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
904 CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
905 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
914 CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
915 $ WORK( ITAUQ ), WORK( ITAUP ),
916 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
917 CALL DLACPY( 'l
', N, N, VT, LDVT, WORK( IR ), LDWRKR )
922 CALL DORGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
923 $ WORK( ITAUQ ), WORK( IWORK ),
924 $ LWORK-IWORK+1, IERR )
929 CALL DORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
930 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
938 CALL DBDSQR( 'u
', N, N, N, 0, S, WORK( IE ), VT, LDVT,
939 $ WORK( IR ), LDWRKR, DUM, 1,
940 $ WORK( IWORK ), INFO )
947 DO 20 I = 1, M, LDWRKU
948 CHUNK = MIN( M-I+1, LDWRKU )
949 CALL DGEMM( 'n
', 'n
', CHUNK, N, N, ONE, A( I, 1 ),
950 $ LDA, WORK( IR ), LDWRKR, ZERO,
951 $ WORK( IU ), LDWRKU )
952 CALL DLACPY( 'f
', CHUNK, N, WORK( IU ), LDWRKU,
966 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
967 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
971 CALL DLACPY( 'u
', N, N, A, LDA, VT, LDVT )
973 $ CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
979 CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
980 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
989 CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
990 $ WORK( ITAUQ ), WORK( ITAUP ),
991 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
996 CALL DORMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
997 $ WORK( ITAUQ ), A, LDA, WORK( IWORK ),
998 $ LWORK-IWORK+1, IERR )
1003 CALL DORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1004 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1012 CALL DBDSQR( 'u
', N, N, M, 0, S, WORK( IE ), VT, LDVT,
1013 $ A, LDA, DUM, 1, WORK( IWORK ), INFO )
1017 ELSE IF( WNTUS ) THEN
1025.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
1030.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1041 ITAU = IR + LDWRKR*N
1047 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1048 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1052 CALL DLACPY( 'u
', N, N, A, LDA, WORK( IR ),
1054 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1055 $ WORK( IR+1 ), LDWRKR )
1060 CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
1061 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1070 CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S,
1071 $ WORK( IE ), WORK( ITAUQ ),
1072 $ WORK( ITAUP ), WORK( IWORK ),
1073 $ LWORK-IWORK+1, IERR )
1078 CALL DORGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
1079 $ WORK( ITAUQ ), WORK( IWORK ),
1080 $ LWORK-IWORK+1, IERR )
1087 CALL DBDSQR( 'u
', N, 0, N, 0, S, WORK( IE ), DUM,
1088 $ 1, WORK( IR ), LDWRKR, DUM, 1,
1089 $ WORK( IWORK ), INFO )
1095 CALL DGEMM( 'n
', 'n
', M, N, N, ONE, A, LDA,
1096 $ WORK( IR ), LDWRKR, ZERO, U, LDU )
1108 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1109 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1110 CALL DLACPY( 'l
', M, N, A, LDA, U, LDU )
1115 CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ),
1116 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1125 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1132 CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
1133 $ WORK( ITAUQ ), WORK( ITAUP ),
1134 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1139 CALL DORMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1140 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1141 $ LWORK-IWORK+1, IERR )
1148 CALL DBDSQR( 'u
', N, 0, M, 0, S, WORK( IE ), DUM,
1149 $ 1, U, LDU, DUM, 1, WORK( IWORK ),
1154 ELSE IF( WNTVO ) THEN
1160.GE.
IF( LWORK2*N*N+MAX( 4*N, BDSPAC ) ) THEN
1165.GE.
IF( LWORKWRKBL+2*LDA*N ) THEN
1172.GE.
ELSE IF( LWORKWRKBL+( LDA + N )*N ) THEN
1187 ITAU = IR + LDWRKR*N
1193 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1194 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1198 CALL DLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1200 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1201 $ WORK( IU+1 ), LDWRKU )
1206 CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
1207 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1218 CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S,
1219 $ WORK( IE ), WORK( ITAUQ ),
1220 $ WORK( ITAUP ), WORK( IWORK ),
1221 $ LWORK-IWORK+1, IERR )
1222 CALL DLACPY( 'u', n, n, work( iu ), ldwrku,
1223 $ work( ir ), ldwrkr )
1228 CALL dorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1229 $ work( itauq ), work( iwork ),
1230 $ lwork-iwork+1, ierr )
1236 CALL dorgbr(
'P', n, n, n, work( ir ), ldwrkr,
1237 $ work( itaup ), work( iwork ),
1238 $ lwork-iwork+1, ierr )
1246 CALL dbdsqr(
'U', n, n, n, 0, s, work( ie ),
1247 $ work( ir ), ldwrkr, work( iu ),
1248 $ ldwrku, dum, 1, work( iwork ), info )
1254 CALL dgemm(
'N', 'n
', M, N, N, ONE, A, LDA,
1255 $ WORK( IU ), LDWRKU, ZERO, U, LDU )
1260 CALL DLACPY( 'f
', N, N, WORK( IR ), LDWRKR, A,
1273 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1274 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1275 CALL DLACPY( 'l
', M, N, A, LDA, U, LDU )
1280 CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ),
1281 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1290 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1297 CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
1298 $ WORK( ITAUQ ), WORK( ITAUP ),
1299 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1304 CALL DORMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1305 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1306 $ LWORK-IWORK+1, IERR )
1311 CALL DORGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
1312 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1320 CALL DBDSQR( 'u
', N, N, M, 0, S, WORK( IE ), A,
1321 $ LDA, U, LDU, DUM, 1, WORK( IWORK ),
1326 ELSE IF( WNTVAS ) THEN
1333.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
1338.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1349 ITAU = IU + LDWRKU*N
1355 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1356 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1360 CALL DLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1362 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1363 $ WORK( IU+1 ), LDWRKU )
1368 CALL DORGQR( M, N, N, A, LDA, WORK( ITAU ),
1369 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1378 CALL DGEBRD( N, N, WORK( IU ), LDWRKU, S,
1379 $ WORK( IE ), WORK( ITAUQ ),
1380 $ WORK( ITAUP ), WORK( IWORK ),
1381 $ LWORK-IWORK+1, IERR )
1382 CALL DLACPY( 'u
', N, N, WORK( IU ), LDWRKU, VT,
1388 CALL DORGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1389 $ WORK( ITAUQ ), WORK( IWORK ),
1390 $ LWORK-IWORK+1, IERR )
1396 CALL DORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1397 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1405 CALL DBDSQR( 'u
', N, N, N, 0, S, WORK( IE ), VT,
1406 $ LDVT, WORK( IU ), LDWRKU, DUM, 1,
1407 $ WORK( IWORK ), INFO )
1413 CALL DGEMM( 'n
', 'n
', M, N, N, ONE, A, LDA,
1414 $ WORK( IU ), LDWRKU, ZERO, U, LDU )
1426 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1427 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1428 CALL DLACPY( 'l
', M, N, A, LDA, U, LDU )
1433 CALL DORGQR( M, N, N, U, LDU, WORK( ITAU ),
1434 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1438 CALL DLACPY( 'u
', N, N, A, LDA, VT, LDVT )
1440 $ CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1441 $ VT( 2, 1 ), LDVT )
1450 CALL DGEBRD( N, N, VT, LDVT, S, WORK( IE ),
1451 $ WORK( ITAUQ ), WORK( ITAUP ),
1452 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1458 CALL DORMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
1459 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1460 $ LWORK-IWORK+1, IERR )
1465 CALL DORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1466 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1474 CALL DBDSQR( 'u
', N, N, M, 0, S, WORK( IE ), VT,
1475 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ),
1482 ELSE IF( WNTUA ) THEN
1490.GE.
IF( LWORKN*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
1495.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1506 ITAU = IR + LDWRKR*N
1512 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1513 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1514 CALL DLACPY( 'l
', M, N, A, LDA, U, LDU )
1518 CALL DLACPY( 'u
', N, N, A, LDA, WORK( IR ),
1520 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1521 $ WORK( IR+1 ), LDWRKR )
1526 CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
1527 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1536 CALL DGEBRD( N, N, WORK( IR ), LDWRKR, S,
1537 $ WORK( IE ), WORK( ITAUQ ),
1538 $ WORK( ITAUP ), WORK( IWORK ),
1539 $ LWORK-IWORK+1, IERR )
1544 CALL DORGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
1545 $ WORK( ITAUQ ), WORK( IWORK ),
1546 $ LWORK-IWORK+1, IERR )
1553 CALL DBDSQR( 'u
', N, 0, N, 0, S, WORK( IE ), DUM,
1554 $ 1, WORK( IR ), LDWRKR, DUM, 1,
1555 $ WORK( IWORK ), INFO )
1561 CALL DGEMM( 'n
', 'n
', M, N, N, ONE, U, LDU,
1562 $ WORK( IR ), LDWRKR, ZERO, A, LDA )
1566 CALL DLACPY( 'f
', M, N, A, LDA, U, LDU )
1578 CALL DGEQRF( M, N, A, LDA, WORK( ITAU ),
1579 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1580 CALL DLACPY( 'l
', M, N, A, LDA, U, LDU )
1585 CALL DORGQR( M, M, N, U, LDU, WORK( ITAU ),
1586 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1595 CALL DLASET( 'l
', N-1, N-1, ZERO, ZERO,
1602 CALL DGEBRD( N, N, A, LDA, S, WORK( IE ),
1603 $ WORK( ITAUQ ), WORK( ITAUP ),
1604 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1610 CALL DORMBR( 'q
', 'r
', 'n', m, n, n, a, lda,
1611 $ work( itauq ), u, ldu, work( iwork ),
1612 $ lwork-iwork+1, ierr )
1619 CALL dbdsqr(
'U', n, 0, m, 0, s, work( ie ), dum,
1620 $ 1, u, ldu, dum, 1, work( iwork ),
1625 ELSE IF( wntvo )
THEN
1631 IF( lwork.GE.2*n*n+
max( n+m, 4*n, bdspac ) )
THEN
1636 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1643 ELSE IF( lwork.GE.wrkbl+( lda + n )*n )
THEN
1658 itau = ir + ldwrkr*n
1664 CALL dgeqrf( m, n, a, lda, work( itau ),
1665 $ work( iwork ), lwork-iwork+1, ierr )
1666 CALL dlacpy(
'L', m, n, a, lda, u, ldu )
1671 CALL dorgqr( m, m, n, u, ldu, work( itau ),
1672 $ work( iwork ), lwork-iwork+1, ierr )
1676 CALL dlacpy(
'U', n, n, a, lda, work( iu ),
1678 CALL dlaset(
'L', n-1, n-1, zero, zero,
1679 $ work( iu+1 ), ldwrku )
1690 CALL dgebrd( n, n, work( iu ), ldwrku, s,
1691 $ work( ie ), work( itauq ),
1692 $ work( itaup ), work( iwork ),
1693 $ lwork-iwork+1, ierr )
1694 CALL dlacpy(
'U', n, n, work( iu ), ldwrku,
1695 $ work( ir ), ldwrkr )
1700 CALL dorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1701 $ work( itauq ), work( iwork ),
1702 $ lwork-iwork+1, ierr )
1708 CALL dorgbr(
'P', n, n, n, work( ir ), ldwrkr,
1709 $ work( itaup ), work( iwork ),
1710 $ lwork-iwork+1, ierr )
1718 CALL dbdsqr(
'U', n, n, n, 0, s, work( ie ),
1719 $ work( ir ), ldwrkr, work( iu ),
1720 $ ldwrku, dum, 1, work( iwork ), info )
1726 CALL dgemm(
'N',
'N', m, n, n, one, u, ldu,
1727 $ work( iu ), ldwrku, zero, a, lda )
1731 CALL dlacpy(
'F', m, n, a, lda, u, ldu )
1735 CALL dlacpy(
'F', n, n, work( ir ), ldwrkr
1748 CALL dgeqrf( m, n, a, lda, work( itau ),
1749 $ work( iwork ), lwork-iwork+1, ierr )
1750 CALL dlacpy(
'L', m, n, a, lda, u, ldu )
1755 CALL dorgqr( m, m, n, u, ldu, work( itau ),
1756 $ work( iwork ), lwork-iwork+1, ierr )
1765 CALL dlaset(
'L', n-1, n-1, zero, zero,
1772 CALL dgebrd( n, n, a, lda, s, work( ie ),
1773 $ work( itauq ), work( itaup ),
1774 $ work( iwork ), lwork-iwork+1, ierr )
1780 CALL dormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1781 $ work( itauq ), u, ldu, work( iwork ),
1782 $ lwork-iwork+1, ierr )
1787 CALL dorgbr(
'P', n, n, n, a, lda, work( itaup ),
1788 $ work( iwork ), lwork-iwork+1, ierr )
1796 CALL dbdsqr(
'U', n, n, m, 0, s, work( ie ), a,
1797 $ lda, u, ldu, dum, 1, work( iwork ),
1802 ELSE IF( wntvas )
THEN
1809 IF( lwork.GE.n*n+
max( n+m, 4*n, bdspac ) )
THEN
1814 IF( lwork.GE.wrkbl+lda*n )
THEN
1825 itau = iu + ldwrku*n
1831 CALL dgeqrf( m, n, a, lda, work( itau ),
1832 $ work( iwork ), lwork-iwork+1, ierr )
1833 CALL dlacpy(
'L', m, n, a, lda, u, ldu )
1838 CALL dorgqr( m, m, n, u, ldu, work( itau ),
1839 $ work( iwork ), lwork-iwork+1, ierr )
1843 CALL dlacpy(
'U', n, n, a, lda, work( iu ),
1845 CALL dlaset(
'L', n-1, n-1, zero, zero,
1846 $ work( iu+1 ), ldwrku )
1855 CALL dgebrd( n, n, work( iu ), ldwrku, s,
1857 $ work( itaup ), work( iwork ),
1858 $ lwork-iwork+1, ierr )
1859 CALL dlacpy(
'U', n, n, work( iu ), ldwrku, vt,
1865 CALL dorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1866 $ work( itauq ), work
1867 $ lwork-iwork+1, ierr )
1873 CALL dorgbr(
'P', n, n, n, vt, ldvt
1874 $ work( iwork ), lwork-iwork+1, ierr )
1882 CALL dbdsqr(
'U', n, n, n, 0, s, work( ie ), vt,
1883 $ ldvt, work( iu ), ldwrku, dum, 1,
1884 $ work( iwork ), info )
1890 CALL dgemm(
'N',
'N', m, n
1891 $ work( iu ), ldwrku, zero, a, lda )
1895 CALL dlacpy(
'F', m, n, a, lda, u,
1907 CALL dgeqrf( m, n, a, lda, work( itau ),
1908 $ work( iwork ), lwork-iwork+1, ierr )
1909 CALL dlacpy(
'L', m, n, a, lda, u, ldu )
1914 CALL dorgqr( m, m, n, u, ldu, work( itau ),
1915 $ work( iwork ), lwork-iwork+1, ierr )
1919 CALL dlacpy(
'U', n, n, a, lda, vt, ldvt )
1921 $
CALL dlaset(
'L', n-1, n-1, zero, zero,
1922 $ vt( 2, 1 ), ldvt )
1931 CALL dgebrd( n, n, vt, ldvt, s, work( ie ),
1932 $ work( itauq ), work( itaup ),
1933 $ work( iwork ), lwork-iwork+1, ierr )
1939 CALL dormbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1940 $ work( itauq ), u, ldu, work( iwork ),
1941 $ lwork-iwork+1, ierr )
1946 CALL dorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1947 $ work( iwork ), lwork-iwork+1, ierr )
1955 CALL dbdsqr(
'U', n, n, m, 0, s, work( ie ), vt,
1956 $ ldvt, u, ldu, dum, 1, work( iwork ),
1980 CALL dgebrd( m, n, a, lda, s, work( ie ), work( itauq ),
1981 $ work( itaup ), work( iwork ), lwork-iwork+1,
1989 CALL dlacpy(
'L', m, n, a, lda, u, ldu )
1994 CALL dorgbr(
'Q', m, ncu, n, u, ldu, work( itauq ),
1995 $ work( iwork ), lwork-iwork+1, ierr )
2003 CALL dlacpy(
'U', n, n, a, lda, vt, ldvt )
2004 CALL dorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
2005 $ work( iwork ), lwork-iwork+1, ierr )
2013 CALL dorgbr(
'Q', m, n, n, a, lda, work( itauq ),
2014 $ work( iwork ), lwork-iwork+1, ierr )
2022 CALL dorgbr(
'P', n, n, n, a, lda, work( itaup ),
2023 $ work( iwork ), lwork-iwork+1, ierr )
2026 IF( wntuas .OR. wntuo )
2030 IF( wntvas .OR. wntvo )
2034 IF( ( .NOT.wntuo ) .AND. ( .NOT.wntvo ) )
THEN
2041 CALL dbdsqr( 'u
', N, NCVT, NRU, 0, S, WORK( IE ), VT,
2042 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
2043.NOT..AND.
ELSE IF( ( WNTUO ) WNTVO ) THEN
2050 CALL DBDSQR( 'u
', N, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
2051 $ U, LDU, DUM, 1, WORK( IWORK ), INFO )
2059 CALL DBDSQR( 'u
', N, NCVT, NRU, 0, S, WORK( IE ), VT,
2060 $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
2071.GE.
IF( NMNTHR ) THEN
2084 CALL DGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
2085 $ LWORK-IWORK+1, IERR )
2089 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
2098 CALL DGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
2099 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
2101.OR.
IF( WNTUO WNTUAS ) THEN
2106 CALL DORGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
2107 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2111.OR.
IF( WNTUO WNTUAS )
2118 CALL DBDSQR( 'u
', M, 0, NRU, 0, S, WORK( IE ), DUM, 1, A,
2119 $ LDA, DUM, 1, WORK( IWORK ), INFO )
2124 $ CALL DLACPY( 'f
', M, M, A, LDA, U, LDU )
2126.AND.
ELSE IF( WNTVO WNTUN ) THEN
2132.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2137.GE.
IF( LWORKMAX( WRKBL, LDA*N + M ) + LDA*M ) THEN
2144.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N + M ) + M*M ) THEN
2156 CHUNK = ( LWORK-M*M-M ) / M
2159 ITAU = IR + LDWRKR*M
2165 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2166 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2170 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IR ), LDWRKR )
2171 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
2172 $ WORK( IR+LDWRKR ), LDWRKR )
2177 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2178 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2187 CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S, WORK( IE ),
2188 $ WORK( ITAUQ ), WORK( ITAUP ),
2189 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2194 CALL DORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2195 $ WORK( ITAUP ), WORK( IWORK ),
2196 $ LWORK-IWORK+1, IERR )
2203 CALL DBDSQR( 'u
', M, M, 0, 0, S, WORK( IE ),
2204 $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
2205 $ WORK( IWORK ), INFO )
2212 DO 30 I = 1, N, CHUNK
2213 BLK = MIN( N-I+1, CHUNK )
2214 CALL DGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IR ),
2215 $ LDWRKR, A( 1, I ), LDA, ZERO,
2216 $ WORK( IU ), LDWRKU )
2217 CALL DLACPY( 'f
', M, BLK, WORK( IU ), LDWRKU,
2233 CALL DGEBRD( M, N, A, LDA, S, WORK( IE ),
2234 $ WORK( ITAUQ ), WORK( ITAUP ),
2235 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2240 CALL DORGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
2241 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2248 CALL DBDSQR( 'l
', M, N, 0, 0, S, WORK( IE ), A, LDA,
2249 $ DUM, 1, DUM, 1, WORK( IWORK ), INFO )
2253.AND.
ELSE IF( WNTVO WNTUAS ) THEN
2259.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2264.GE.
IF( LWORKMAX( WRKBL, LDA*N + M ) + LDA*M ) THEN
2271.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N + M ) + M*M ) THEN
2283 CHUNK = ( LWORK-M*M-M ) / M
2286 ITAU = IR + LDWRKR*M
2292 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2293 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2297 CALL DLACPY( 'l
', M, M, A, LDA, U, LDU )
2298 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
2304 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2305 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2314 CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
2315 $ WORK( ITAUQ ), WORK( ITAUP ),
2316 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2317 CALL DLACPY( 'u
', M, M, U, LDU, WORK( IR ), LDWRKR )
2322 CALL DORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2323 $ WORK( ITAUP ), WORK( IWORK ),
2324 $ LWORK-IWORK+1, IERR )
2329 CALL DORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2330 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2338 CALL DBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
2339 $ WORK( IR ), LDWRKR, U, LDU, DUM, 1,
2340 $ WORK( IWORK ), INFO )
2347 DO 40 I = 1, N, CHUNK
2348 BLK = MIN( N-I+1, CHUNK )
2349 CALL DGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IR ),
2350 $ LDWRKR, A( 1, I ), LDA, ZERO,
2351 $ WORK( IU ), LDWRKU )
2352 CALL DLACPY( 'f
', M, BLK, WORK( IU ), LDWRKU,
2366 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2367 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2371 CALL DLACPY( 'l
', M, M, A, LDA, U, LDU )
2372 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
2378 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2379 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2388 CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
2389 $ WORK( ITAUQ ), WORK( ITAUP ),
2390 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2395 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, U, LDU,
2396 $ WORK( ITAUP ), A, LDA, WORK( IWORK ),
2397 $ LWORK-IWORK+1, IERR )
2402 CALL DORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2403 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2411 CALL DBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), A, LDA,
2412 $ U, LDU, DUM, 1, WORK( IWORK ), INFO )
2416 ELSE IF( WNTVS ) THEN
2424.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2429.GE.
IF( LWORKWRKBL+LDA*M ) THEN
2440 ITAU = IR + LDWRKR*M
2446 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2447 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2451 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IR ),
2453 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
2454 $ WORK( IR+LDWRKR ), LDWRKR )
2459 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2460 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2469 CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S,
2470 $ WORK( IE ), WORK( ITAUQ ),
2471 $ WORK( ITAUP ), WORK( IWORK ),
2472 $ LWORK-IWORK+1, IERR )
2478 CALL DORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2479 $ WORK( ITAUP ), WORK( IWORK ),
2480 $ LWORK-IWORK+1, IERR )
2487 CALL DBDSQR( 'u
', M, M, 0, 0, S, WORK( IE ),
2488 $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
2489 $ WORK( IWORK ), INFO )
2495 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IR ),
2496 $ LDWRKR, A, LDA, ZERO, VT, LDVT )
2508 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2509 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2513 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2518 CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2519 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2527 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
2533 CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
2534 $ WORK( ITAUQ ), WORK( ITAUP ),
2535 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2540 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
2541 $ WORK( ITAUP ), VT, LDVT,
2542 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2549 CALL DBDSQR( 'u
', M, N, 0, 0, S, WORK( IE ), VT,
2550 $ LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
2555 ELSE IF( WNTUO ) THEN
2561.GE.
IF( LWORK2*M*M+MAX( 4*M, BDSPAC ) ) THEN
2566.GE.
IF( LWORKWRKBL+2*LDA*M ) THEN
2573.GE.
ELSE IF( LWORKWRKBL+( LDA + M )*M ) THEN
2588 ITAU = IR + LDWRKR*M
2594 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2595 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2599 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IU ),
2601 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
2602 $ WORK( IU+LDWRKU ), LDWRKU )
2607 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2608 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2619 CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
2620 $ WORK( IE ), WORK( ITAUQ ),
2621 $ WORK( ITAUP ), WORK( IWORK ),
2622 $ LWORK-IWORK+1, IERR )
2623 CALL DLACPY( 'l
', M, M, WORK( IU ), LDWRKU,
2624 $ WORK( IR ), LDWRKR )
2630 CALL DORGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
2631 $ WORK( ITAUP ), WORK( IWORK ),
2632 $ LWORK-IWORK+1, IERR )
2637 CALL DORGBR( 'q
', M, M, M, WORK( IR ), LDWRKR,
2638 $ WORK( ITAUQ ), WORK( IWORK ),
2639 $ LWORK-IWORK+1, IERR )
2647 CALL DBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
2648 $ WORK( IU ), LDWRKU, WORK( IR ),
2649 $ LDWRKR, DUM, 1, WORK( IWORK ), INFO )
2655 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
2656 $ LDWRKU, A, LDA, ZERO, VT, LDVT )
2661 CALL DLACPY( 'f
', M, M, WORK( IR ), LDWRKR, A,
2674 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2675 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2676 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2681 CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2682 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2690 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
2696 CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
2697 $ WORK( ITAUQ ), WORK( ITAUP ),
2698 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2703 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
2704 $ WORK( ITAUP ), VT, LDVT,
2705 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2710 CALL DORGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
2711 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2719 CALL DBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), VT,
2720 $ LDVT, A, LDA, DUM, 1, WORK( IWORK ),
2725 ELSE IF( WNTUAS ) THEN
2732.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2737.GE.
IF( LWORKWRKBL+LDA*M ) THEN
2748 ITAU = IU + LDWRKU*M
2754 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2755 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2759 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IU ),
2761 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
2762 $ WORK( IU+LDWRKU ), LDWRKU )
2767 CALL DORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2768 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2777 CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
2778 $ WORK( IE ), WORK( ITAUQ ),
2779 $ WORK( ITAUP ), WORK( IWORK ),
2780 $ LWORK-IWORK+1, IERR )
2781 CALL DLACPY( 'l
', M, M, WORK( IU ), LDWRKU, U,
2788 CALL DORGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
2789 $ WORK( ITAUP ), WORK( IWORK ),
2790 $ LWORK-IWORK+1, IERR )
2795 CALL DORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2796 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2804 CALL DBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
2805 $ WORK( IU ), LDWRKU, U, LDU, DUM, 1,
2806 $ WORK( IWORK ), INFO )
2812 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
2813 $ LDWRKU, A, LDA, ZERO, VT, LDVT )
2825 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2826 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2827 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2832 CALL DORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2833 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2837 CALL DLACPY( 'l
', M, M, A, LDA, U, LDU )
2838 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
2848 CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
2849 $ WORK( ITAUQ ), WORK( ITAUP ),
2850 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2856 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, U, LDU,
2857 $ WORK( ITAUP ), VT, LDVT,
2858 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2863 CALL DORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2864 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2872 CALL DBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), VT,
2873 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ),
2880 ELSE IF( WNTVA ) THEN
2888.GE.
IF( LWORKM*M+MAX( N + M, 4*M, BDSPAC ) ) THEN
2893.GE.
IF( LWORKWRKBL+LDA*M ) THEN
2904 ITAU = IR + LDWRKR*M
2910 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2911 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2912 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2916 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IR ),
2918 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
2919 $ WORK( IR+LDWRKR ), LDWRKR )
2924 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
2925 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2934 CALL DGEBRD( M, M, WORK( IR ), LDWRKR, S,
2935 $ WORK( IE ), WORK( ITAUQ ),
2936 $ WORK( ITAUP ), WORK( IWORK ),
2937 $ LWORK-IWORK+1, IERR )
2943 CALL DORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2944 $ WORK( ITAUP ), WORK( IWORK ),
2945 $ LWORK-IWORK+1, IERR )
2952 CALL DBDSQR( 'u
', M, M, 0, 0, S, WORK( IE ),
2953 $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
2954 $ WORK( IWORK ), INFO )
2960 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IR ),
2961 $ LDWRKR, VT, LDVT, ZERO, A, LDA )
2965 CALL DLACPY( 'f
', M, N, A, LDA, VT, LDVT )
2977 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
2978 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2979 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2984 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
2985 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2993 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
2999 CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
3000 $ WORK( ITAUQ ), WORK( ITAUP ),
3001 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3007 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
3008 $ WORK( ITAUP ), VT, LDVT,
3009 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3016 CALL DBDSQR( 'u
', M, N, 0, 0, S, WORK( IE ), VT,
3017 $ LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
3022 ELSE IF( WNTUO ) THEN
3028.GE.
IF( LWORK2*M*M+MAX( N + M, 4*M, BDSPAC ) ) THEN
3033.GE.
IF( LWORKWRKBL+2*LDA*M ) THEN
3040.GE.
ELSE IF( LWORKWRKBL+( LDA + M )*M ) THEN
3055 ITAU = IR + LDWRKR*M
3061 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
3062 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3063 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3068 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3069 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3073 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IU ),
3075 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
3076 $ WORK( IU+LDWRKU ), LDWRKU )
3087 CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
3088 $ WORK( IE ), WORK( ITAUQ ),
3089 $ WORK( ITAUP ), WORK( IWORK ),
3090 $ LWORK-IWORK+1, IERR )
3091 CALL DLACPY( 'l
', M, M, WORK( IU ), LDWRKU,
3092 $ WORK( IR ), LDWRKR )
3098 CALL DORGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
3099 $ WORK( ITAUP ), WORK( IWORK ),
3100 $ LWORK-IWORK+1, IERR )
3105 CALL DORGBR( 'q
', M, M, M, WORK( IR ), LDWRKR,
3106 $ WORK( ITAUQ ), WORK( IWORK ),
3107 $ LWORK-IWORK+1, IERR )
3115 CALL DBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
3116 $ WORK( IU ), LDWRKU, WORK( IR ),
3117 $ LDWRKR, DUM, 1, WORK( IWORK ), INFO )
3123 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
3124 $ LDWRKU, VT, LDVT, ZERO, A, LDA )
3128 CALL DLACPY( 'f
', M, N, A, LDA, VT, LDVT )
3132 CALL DLACPY( 'f
', M, M, WORK( IR ), LDWRKR, A,
3145 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
3146 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3147 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3152 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3153 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3161 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
3167 CALL DGEBRD( M, M, A, LDA, S, WORK( IE ),
3168 $ WORK( ITAUQ ), WORK( ITAUP ),
3169 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3175 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
3176 $ WORK( ITAUP ), VT, LDVT,
3177 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3182 CALL DORGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
3183 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3191 CALL DBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), VT,
3192 $ LDVT, A, LDA, DUM, 1, WORK( IWORK ),
3197 ELSE IF( WNTUAS ) THEN
3204.GE.
IF( LWORKM*M+MAX( N + M, 4*M, BDSPAC ) ) THEN
3209.GE.
IF( LWORKWRKBL+LDA*M ) THEN
3220 ITAU = IU + LDWRKU*M
3226 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
3227 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3228 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3233 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3234 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3238 CALL DLACPY( 'l
', M, M, A, LDA, WORK( IU ),
3240 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO,
3241 $ WORK( IU+LDWRKU ), LDWRKU )
3250 CALL DGEBRD( M, M, WORK( IU ), LDWRKU, S,
3251 $ WORK( IE ), WORK( ITAUQ ),
3252 $ WORK( ITAUP ), WORK( IWORK ),
3253 $ LWORK-IWORK+1, IERR )
3254 CALL DLACPY( 'l
', M, M, WORK( IU ), LDWRKU, U,
3260 CALL DORGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
3261 $ WORK( ITAUP ), WORK( IWORK ),
3262 $ LWORK-IWORK+1, IERR )
3267 CALL DORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
3268 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3276 CALL DBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
3277 $ WORK( IU ), LDWRKU, U, LDU, DUM, 1,
3278 $ WORK( IWORK ), INFO )
3284 CALL DGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
3285 $ LDWRKU, VT, LDVT, ZERO, A, LDA )
3289 CALL DLACPY( 'f
', M, N, A, LDA, VT, LDVT )
3301 CALL DGELQF( M, N, A, LDA, WORK( ITAU ),
3302 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3303 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3308 CALL DORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3309 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3313 CALL DLACPY( 'l
', M, M, A, LDA, U, LDU )
3314 CALL DLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
3324 CALL DGEBRD( M, M, U, LDU, S, WORK( IE ),
3325 $ WORK( ITAUQ ), WORK( ITAUP ),
3326 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3332 CALL DORMBR( 'p
', 'l
', 't
', M, N, M, U, LDU,
3333 $ WORK( ITAUP ), VT, LDVT,
3334 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3339 CALL DORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
3340 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3348 CALL DBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), VT,
3349 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ),
3373 CALL DGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
3374 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
3382 CALL DLACPY( 'l
', M, M, A, LDA, U, LDU )
3383 CALL DORGBR( 'q
', M, M, N, U, LDU, WORK( ITAUQ ),
3384 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3392 CALL DLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3397 CALL DORGBR( 'p
', NRVT, N, M, VT, LDVT, WORK( ITAUP ),
3398 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3406 CALL DORGBR( 'q
', M, M, N, A, LDA, WORK( ITAUQ ),
3407 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3415 CALL DORGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
3416 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3419.OR.
IF( WNTUAS WNTUO )
3423.OR.
IF( WNTVAS WNTVO )
3427.NOT..AND..NOT.
IF( ( WNTUO ) ( WNTVO ) ) THEN
3434 CALL DBDSQR( 'l
', M, NCVT, NRU, 0, S, WORK( IE ), VT,
3435 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
3436.NOT..AND.
ELSE IF( ( WNTUO ) WNTVO ) THEN
3443 CALL DBDSQR( 'l
', M, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
3444 $ U, LDU, DUM, 1, WORK( IWORK ), INFO )
3452 CALL DBDSQR( 'l
', M, NCVT, NRU, 0, S, WORK( IE ), VT,
3453 $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
3463.NE.
IF( INFO0 ) THEN
3465 DO 50 I = 1, MINMN - 1
3466 WORK( I+1 ) = WORK( I+IE-1 )
3470 DO 60 I = MINMN - 1, 1, -1
3471 WORK( I+1 ) = WORK( I+IE-1 )
3478.EQ.
IF( ISCL1 ) THEN
3479.GT.
IF( ANRMBIGNUM )
3480 $ CALL DLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
3482.NE..AND..GT.
IF( INFO0 ANRMBIGNUM )
3483 $ CALL DLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN-1, 1, WORK( 2 ),
3485.LT.
IF( ANRMSMLNUM )
3486 $ CALL DLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
3488.NE..AND..LT.
IF( INFO0 ANRMSMLNUM )
3489 $ CALL DLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN-1, 1, WORK( 2 ),