217 SUBROUTINE sgesdd( JOBZ, M, N, A, LDA, S, U, LDU, VT, LDVT,
218 $ WORK, LWORK, IWORK, INFO )
227 INTEGER INFO, LDA, LDU, LDVT, LWORK, M, N
231 REAL A( LDA, * ), S( * ), U( LDU, * ),
232 $ vt( ldvt, * ), work( * )
239 parameter( zero = 0.0e0, one = 1.0e0 )
242 LOGICAL LQUERY, , WNTQAS, WNTQN, WNTQO, WNTQS
243 INTEGER BDSPAC, BLK, CHUNK, I, IE, IERR, IL,
244 $ ir, iscl, itau, itaup, itauq, iu, ivt, ldwkvt,
245 $ ldwrkl, ldwrkr, ldwrku
246 $ mnthr, nwork, wrkbl
247 INTEGER LWORK_SGEBRD_MN, LWORK_SGEBRD_MM,
248 $ lwork_sgebrd_nn, lwork_sgelqf_mn,
250 $ lwork_sorgbr_p_mm, lwork_sorgbr_q_nn,
251 $ lwork_sorglq_mn, lwork_sorglq_nn,
252 $ lwork_sorgqr_mm, lwork_sorgqr_mn,
253 $ lwork_sormbr_prt_mm, lwork_sormbr_qln_mm,
254 $ lwork_sormbr_prt_mn, lwork_sormbr_qln_mn,
255 $ lwork_sormbr_prt_nn, lwork_sormbr_qln_nn
256 REAL ANRM, BIGNUM, EPS, SMLNUM
268 LOGICAL LSAME, SISNAN
269 REAL SLAMCH, SLANGE, SROUNDUP_LWORK
270 EXTERNAL slamch, slange, lsame, sisnan,
274 INTRINSIC int,
max,
min, sqrt
282 wntqa = lsame( jobz,
'A' )
283 wntqs = lsame( jobz,
'S' )
284 wntqas = wntqa .OR. wntqs
285 wntqo = lsame( jobz,
'O' )
286 wntqn = lsame( jobz,
'N' )
287 lquery = ( lwork.EQ.-1 )
289 IF( .NOT.( wntqa .OR. wntqs .OR. wntqo .OR. wntqn ) )
THEN
291 ELSE IF( m.LT.0 )
THEN
293 ELSE IF( n.LT.0 )
THEN
295 ELSE IF( lda.LT.
max( 1, m ) )
THEN
297 ELSE IF( ldu.LT.1 .OR. ( wntqas .AND. ldu.LT.m ) .OR.
298 $ ( wntqo .AND. m.LT.n .AND. ldu.LT.m ) )
THEN
300 ELSE IF( ldvt.LT.1 .OR. ( wntqa .AND. ldvt.LT.n ) .OR.
301 $ ( wntqs .AND. ldvt.LT.minmn ) .OR.
302 $ ( wntqo .AND. m.GE.n .AND. ldvt.LT.n ) )
THEN
317 mnthr = int( minmn*11.0e0 / 6.0e0 )
318 IF( m.GE.n .AND. minmn.GT.0 )
THEN
331 CALL sgebrd( m, n, dum(1), m, dum(1), dum(1), dum(1),
332 $ dum(1), dum(1), -1, ierr )
333 lwork_sgebrd_mn = int( dum(1) )
335 CALL sgebrd( n, n, dum(1), n, dum(1), dum(1), dum(1),
336 $ dum(1), dum(1), -1, ierr )
337 lwork_sgebrd_nn = int( dum(1) )
339 CALL sgeqrf( m, n, dum(1), m, dum(1), dum(1), -1, ierr )
340 lwork_sgeqrf_mn = int( dum(1) )
342 CALL sorgbr( 'q
', N, N, N, DUM(1), N, DUM(1), DUM(1), -1,
344 LWORK_SORGBR_Q_NN = INT( DUM(1) )
346 CALL SORGQR( M, M, N, DUM(1), M, DUM(1), DUM(1), -1, IERR )
347 LWORK_SORGQR_MM = INT( DUM(1) )
349 CALL SORGQR( M, N, N, DUM(1), M, DUM(1), DUM(1), -1, IERR )
350 LWORK_SORGQR_MN = INT( DUM(1) )
352 CALL SORMBR( 'p
', 'r
', 't
', N, N, N, DUM(1), N,
353 $ DUM(1), DUM(1), N, DUM(1), -1, IERR )
354 LWORK_SORMBR_PRT_NN = INT( DUM(1) )
356 CALL SORMBR( 'q
', 'l
', 'n
', N, N, N, DUM(1), N,
357 $ DUM(1), DUM(1), N, DUM(1), -1, IERR )
358 LWORK_SORMBR_QLN_NN = INT( DUM(1) )
360 CALL SORMBR( 'q
', 'l
', 'n
', M, N, N, DUM(1), M,
361 $ DUM(1), DUM(1), M, DUM(1), -1, IERR )
362 LWORK_SORMBR_QLN_MN = INT( DUM(1) )
364 CALL SORMBR( 'q
', 'l
', 'n
', M, M, N, DUM(1), M,
365 $ DUM(1), DUM(1), M, DUM(1), -1, IERR )
366 LWORK_SORMBR_QLN_MM = INT( DUM(1) )
368.GE.
IF( MMNTHR ) THEN
373 WRKBL = N + LWORK_SGEQRF_MN
374 WRKBL = MAX( WRKBL, 3*N + LWORK_SGEBRD_NN )
375 MAXWRK = MAX( WRKBL, BDSPAC + N )
377 ELSE IF( WNTQO ) THEN
381 WRKBL = N + LWORK_SGEQRF_MN
382 WRKBL = MAX( WRKBL, N + LWORK_SORGQR_MN )
383 WRKBL = MAX( WRKBL, 3*N + LWORK_SGEBRD_NN )
384 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_QLN_NN )
385 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_PRT_NN )
386 WRKBL = MAX( WRKBL, 3*N + BDSPAC )
387 MAXWRK = WRKBL + 2*N*N
388 MINWRK = BDSPAC + 2*N*N + 3*N
389 ELSE IF( WNTQS ) THEN
393 WRKBL = N + LWORK_SGEQRF_MN
394 WRKBL = MAX( WRKBL, N + LWORK_SORGQR_MN )
395 WRKBL = MAX( WRKBL, 3*N + LWORK_SGEBRD_NN )
396 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_QLN_NN )
397 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_PRT_NN )
398 WRKBL = MAX( WRKBL, 3*N + BDSPAC )
400 MINWRK = BDSPAC + N*N + 3*N
401 ELSE IF( WNTQA ) THEN
405 WRKBL = N + LWORK_SGEQRF_MN
406 WRKBL = MAX( WRKBL, N + LWORK_SORGQR_MM )
407 WRKBL = MAX( WRKBL, 3*N + LWORK_SGEBRD_NN )
408 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_QLN_NN )
409 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_PRT_NN )
410 WRKBL = MAX( WRKBL, 3*N + BDSPAC )
412 MINWRK = N*N + MAX( 3*N + BDSPAC, N + M )
418 WRKBL = 3*N + LWORK_SGEBRD_MN
421 MAXWRK = MAX( WRKBL, 3*N + BDSPAC )
422 MINWRK = 3*N + MAX( M, BDSPAC )
423 ELSE IF( WNTQO ) THEN
425 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_PRT_NN )
426 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_QLN_MN )
427 WRKBL = MAX( WRKBL, 3*N + BDSPAC )
429 MINWRK = 3*N + MAX( M, N*N + BDSPAC )
430 ELSE IF( WNTQS ) THEN
432 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_QLN_MN )
433 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_PRT_NN )
434 MAXWRK = MAX( WRKBL, 3*N + BDSPAC )
435 MINWRK = 3*N + MAX( M, BDSPAC )
436 ELSE IF( WNTQA ) THEN
438 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_QLN_MM )
439 WRKBL = MAX( WRKBL, 3*N + LWORK_SORMBR_PRT_NN )
440 MAXWRK = MAX( WRKBL, 3*N + BDSPAC )
441 MINWRK = 3*N + MAX( M, BDSPAC )
444.GT.
ELSE IF( MINMN0 ) THEN
457 CALL SGEBRD( M, N, DUM(1), M, DUM(1), DUM(1), DUM(1),
458 $ DUM(1), DUM(1), -1, IERR )
459 LWORK_SGEBRD_MN = INT( DUM(1) )
461 CALL SGEBRD( M, M, A, M, S, DUM(1), DUM(1),
462 $ DUM(1), DUM(1), -1, IERR )
463 LWORK_SGEBRD_MM = INT( DUM(1) )
465 CALL SGELQF( M, N, A, M, DUM(1), DUM(1), -1, IERR )
466 LWORK_SGELQF_MN = INT( DUM(1) )
468 CALL SORGLQ( N, N, M, DUM(1), N, DUM(1), DUM(1), -1, IERR )
469 LWORK_SORGLQ_NN = INT( DUM(1) )
471 CALL SORGLQ( M, N, M, A, M, DUM(1), DUM(1), -1, IERR )
472 LWORK_SORGLQ_MN = INT( DUM(1) )
474 CALL SORGBR( 'p
', M, M, M, A, N, DUM(1), DUM(1), -1, IERR )
475 LWORK_SORGBR_P_MM = INT( DUM(1) )
477 CALL SORMBR( 'p
', 'r
', 't
', M, M, M, DUM(1), M,
478 $ DUM(1), DUM(1), M, DUM(1), -1, IERR )
479 LWORK_SORMBR_PRT_MM = INT( DUM(1) )
481 CALL SORMBR( 'p
', 'r
', 't
', M, N, M, DUM(1), M,
482 $ DUM(1), DUM(1), M, DUM(1), -1, IERR )
483 LWORK_SORMBR_PRT_MN = INT( DUM(1) )
485 CALL SORMBR( 'p
', 'r
', 't
', N, N, M, DUM(1), N,
486 $ DUM(1), DUM(1), N, DUM(1), -1, IERR )
487 LWORK_SORMBR_PRT_NN = INT( DUM(1) )
489 CALL SORMBR( 'q
', 'l
', 'n
', M, M, M, DUM(1), M,
490 $ DUM(1), DUM(1), M, DUM(1), -1, IERR )
491 LWORK_SORMBR_QLN_MM = INT( DUM(1) )
493.GE.
IF( NMNTHR ) THEN
498 WRKBL = M + LWORK_SGELQF_MN
499 WRKBL = MAX( WRKBL, 3*M + LWORK_SGEBRD_MM )
500 MAXWRK = MAX( WRKBL, BDSPAC + M )
502 ELSE IF( WNTQO ) THEN
506 WRKBL = M + LWORK_SGELQF_MN
507 WRKBL = MAX( WRKBL, M + LWORK_SORGLQ_MN )
508 WRKBL = MAX( WRKBL, 3*M + LWORK_SGEBRD_MM )
509 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_QLN_MM )
510 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_PRT_MM )
511 WRKBL = MAX( WRKBL, 3*M + BDSPAC )
512 MAXWRK = WRKBL + 2*M*M
513 MINWRK = BDSPAC + 2*M*M + 3*M
514 ELSE IF( WNTQS ) THEN
518 WRKBL = M + LWORK_SGELQF_MN
519 WRKBL = MAX( WRKBL, M + LWORK_SORGLQ_MN )
520 WRKBL = MAX( WRKBL, 3*M + LWORK_SGEBRD_MM )
521 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_QLN_MM )
522 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_PRT_MM )
523 WRKBL = MAX( WRKBL, 3*M + BDSPAC )
525 MINWRK = BDSPAC + M*M + 3*M
526 ELSE IF( WNTQA ) THEN
530 WRKBL = M + LWORK_SGELQF_MN
531 WRKBL = MAX( WRKBL, M + LWORK_SORGLQ_NN )
532 WRKBL = MAX( WRKBL, 3*M + LWORK_SGEBRD_MM )
533 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_QLN_MM )
534 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_PRT_MM )
535 WRKBL = MAX( WRKBL, 3*M + BDSPAC )
537 MINWRK = M*M + MAX( 3*M + BDSPAC, M + N )
543 WRKBL = 3*M + LWORK_SGEBRD_MN
546 MAXWRK = MAX( WRKBL, 3*M + BDSPAC )
547 MINWRK = 3*M + MAX( N, BDSPAC )
548 ELSE IF( WNTQO ) THEN
550 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_QLN_MM )
551 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_PRT_MN )
552 WRKBL = MAX( WRKBL, 3*M + BDSPAC )
554 MINWRK = 3*M + MAX( N, M*M + BDSPAC )
555 ELSE IF( WNTQS ) THEN
557 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_QLN_MM )
558 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_PRT_MN )
559 MAXWRK = MAX( WRKBL, 3*M + BDSPAC )
560 MINWRK = 3*M + MAX( N, BDSPAC )
561 ELSE IF( WNTQA ) THEN
563 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_QLN_MM )
564 WRKBL = MAX( WRKBL, 3*M + LWORK_SORMBR_PRT_NN )
565 MAXWRK = MAX( WRKBL, 3*M + BDSPAC )
566 MINWRK = 3*M + MAX( N, BDSPAC )
571 MAXWRK = MAX( MAXWRK, MINWRK )
572 WORK( 1 ) = SROUNDUP_LWORK( MAXWRK )
574.LT..AND..NOT.
IF( LWORKMINWRK LQUERY ) THEN
580 CALL XERBLA( 'sgesdd', -INFO )
582 ELSE IF( LQUERY ) THEN
588.EQ..OR..EQ.
IF( M0 N0 ) THEN
595 SMLNUM = SQRT( SLAMCH( 's
' ) ) / EPS
596 BIGNUM = ONE / SMLNUM
600 ANRM = SLANGE( 'm
', M, N, A, LDA, DUM )
601 IF( SISNAN( ANRM ) ) THEN
606.GT..AND..LT.
IF( ANRMZERO ANRMSMLNUM ) THEN
608 CALL SLASCL( 'g
', 0, 0, ANRM, SMLNUM, M, N, A, LDA, IERR )
609.GT.
ELSE IF( ANRMBIGNUM ) THEN
611 CALL SLASCL( 'g
', 0, 0, ANRM, BIGNUM, M, N, A, LDA, IERR )
620.GE.
IF( MMNTHR ) THEN
634 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
635 $ LWORK - NWORK + 1, IERR )
639 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
649 CALL SGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
650 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
657 CALL SBDSDC( 'u
', 'n
', N, S, WORK( IE ), DUM, 1, DUM, 1,
658 $ DUM, IDUM, WORK( NWORK ), IWORK, INFO )
660 ELSE IF( WNTQO ) THEN
670.GE.
IF( LWORK LDA*N + N*N + 3*N + BDSPAC ) THEN
673 LDWRKR = ( LWORK - N*N - 3*N - BDSPAC ) / N
682 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
683 $ LWORK - NWORK + 1, IERR )
687 CALL SLACPY( 'u
', N, N, A, LDA, WORK( IR ), LDWRKR )
688 CALL SLASET( 'l
', N - 1, N - 1, ZERO, ZERO, WORK(IR+1),
695 CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
696 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
706 CALL SGEBRD( N, N, WORK( IR ), LDWRKR, S, WORK( IE ),
707 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
708 $ LWORK - NWORK + 1, IERR )
720 CALL SBDSDC( 'u
', 'i
', N, S, WORK( IE ), WORK( IU ), N,
721 $ VT, LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
729 CALL SORMBR( 'q
', 'l
', 'n
', N, N, N, WORK( IR ), LDWRKR,
730 $ WORK( ITAUQ ), WORK( IU ), N, WORK( NWORK ),
731 $ LWORK - NWORK + 1, IERR )
732 CALL SORMBR( 'p
', 'r
', 't
', N, N, N, WORK( IR ), LDWRKR,
733 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
734 $ LWORK - NWORK + 1, IERR )
741 DO 10 I = 1, M, LDWRKR
742 CHUNK = MIN( M - I + 1, LDWRKR )
743 CALL SGEMM( 'n
', 'n
', CHUNK, N, N, ONE, A( I, 1 ),
744 $ LDA, WORK( IU ), N, ZERO, WORK( IR ),
746 CALL SLACPY( 'f
', CHUNK, N, WORK( IR ), LDWRKR,
750 ELSE IF( WNTQS ) THEN
768 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
769 $ LWORK - NWORK + 1, IERR )
773 CALL SLACPY( 'u
', N, N, A, LDA, WORK( IR ), LDWRKR )
774 CALL SLASET( 'l
', N - 1, N - 1, ZERO, ZERO, WORK(IR+1),
781 CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
782 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
792 CALL SGEBRD( N, N, WORK( IR ), LDWRKR, S, WORK( IE ),
793 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
794 $ LWORK - NWORK + 1, IERR )
801 CALL SBDSDC( 'u
', 'i
', N, S, WORK( IE ), U, LDU, VT,
802 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
810 CALL SORMBR( 'q
', 'l
', 'n
', N, N, N, WORK( IR ), LDWRKR,
811 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
812 $ LWORK - NWORK + 1, IERR )
814 CALL SORMBR( 'p
', 'r
', 't
', N, N, N, WORK( IR ), LDWRKR,
815 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
816 $ LWORK - NWORK + 1, IERR )
822 CALL SLACPY( 'f
', N, N, U, LDU, WORK( IR ), LDWRKR )
823 CALL SGEMM( 'n
', 'n
', M, N, N, ONE, A, LDA, WORK( IR ),
824 $ LDWRKR, ZERO, U, LDU )
826 ELSE IF( WNTQA ) THEN
844 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
845 $ LWORK - NWORK + 1, IERR )
846 CALL SLACPY( 'l
', M, N, A, LDA, U, LDU )
851 CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
852 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
856 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO, A( 2, 1 ), LDA )
866 CALL SGEBRD( N, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
867 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
875 CALL SBDSDC( 'u
', 'i
', N, S, WORK( IE ), WORK( IU ), N,
876 $ VT, LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
884 CALL SORMBR( 'q
', 'l
', 'n
', N, N, N, A, LDA,
885 $ WORK( ITAUQ ), WORK( IU ), LDWRKU,
886 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
887 CALL SORMBR( 'p
', 'r
', 't
', N, N, N, A, LDA,
888 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
889 $ LWORK - NWORK + 1, IERR )
895 CALL SGEMM( 'n
', 'n
', M, N, N, ONE, U, LDU, WORK( IU ),
896 $ LDWRKU, ZERO, A, LDA )
900 CALL SLACPY( 'f
', M, N, A, LDA, U, LDU )
920 CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
921 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
929 CALL SBDSDC( 'u
', 'n
', N, S, WORK( IE ), DUM, 1, DUM, 1,
930 $ DUM, IDUM, WORK( NWORK ), IWORK, INFO )
931 ELSE IF( WNTQO ) THEN
934.GE.
IF( LWORK M*N + 3*N + BDSPAC ) THEN
939 NWORK = IU + LDWRKU*N
940 CALL SLASET( 'f
', M, N, ZERO, ZERO, WORK( IU ),
949 NWORK = IU + LDWRKU*N
954 LDWRKR = ( LWORK - N*N - 3*N ) / N
956 NWORK = IU + LDWRKU*N
963 CALL SBDSDC( 'u
', 'i
', N, S, WORK( IE ), WORK( IU ),
964 $ LDWRKU, VT, LDVT, DUM, IDUM, WORK( NWORK ),
971 CALL SORMBR( 'p
', 'r
', 't
', N, N, N, A, LDA,
972 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
973 $ LWORK - NWORK + 1, IERR )
975.GE.
IF( LWORK M*N + 3*N + BDSPAC ) THEN
982 CALL SORMBR( 'q
', 'l
', 'n
', M, N, N, A, LDA,
983 $ WORK( ITAUQ ), WORK( IU ), LDWRKU,
984 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
988 CALL SLACPY( 'f
', M, N, WORK( IU ), LDWRKU, A, LDA )
996 CALL SORGBR( 'q
', M, N, N, A, LDA, WORK( ITAUQ ),
997 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1005 DO 20 I = 1, M, LDWRKR
1006 CHUNK = MIN( M - I + 1, LDWRKR )
1007 CALL SGEMM( 'n
', 'n
', CHUNK, N, N, ONE, A( I, 1 ),
1008 $ LDA, WORK( IU ), LDWRKU, ZERO,
1009 $ WORK( IR ), LDWRKR )
1010 CALL SLACPY( 'f
', CHUNK, N, WORK( IR ), LDWRKR,
1015 ELSE IF( WNTQS ) THEN
1023 CALL SLASET( 'f
', M, N, ZERO, ZERO, U, LDU )
1024 CALL SBDSDC( 'u
', 'i
', N, S, WORK( IE ), U, LDU, VT,
1025 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1033 CALL SORMBR( 'q
', 'l
', 'n
', M, N, N, A, LDA,
1034 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1035 $ LWORK - NWORK + 1, IERR )
1036 CALL SORMBR( 'p
', 'r
', 't
', N, N, N, A, LDA,
1037 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1038 $ LWORK - NWORK + 1, IERR )
1039 ELSE IF( WNTQA ) THEN
1047 CALL SLASET( 'f
', M, M, ZERO, ZERO, U, LDU )
1048 CALL SBDSDC( 'u
', 'i
', N, S, WORK( IE ), U, LDU, VT,
1049 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1055 CALL SLASET( 'f
', M - N, M - N, ZERO, ONE, U(N+1,N+1),
1064 CALL SORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1065 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1066 $ LWORK - NWORK + 1, IERR )
1067 CALL SORMBR( 'p
', 'r
', 't
', N, N, M, A, LDA,
1068 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1069 $ LWORK - NWORK + 1, IERR )
1080.GE.
IF( NMNTHR ) THEN
1094 CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
1095 $ LWORK - NWORK + 1, IERR )
1099 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
1109 CALL SGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
1110 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
1117 CALL SBDSDC( 'u
', 'n
', M, S, WORK( IE ), DUM, 1, DUM, 1,
1118 $ DUM, IDUM, WORK( NWORK ), IWORK, INFO )
1120 ELSE IF( WNTQO ) THEN
1132.GE.
IF( LWORK M*N + M*M + 3*M + BDSPAC ) THEN
1137 CHUNK = ( LWORK - M*M ) / M
1139 ITAU = IL + LDWRKL*M
1146 CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
1147 $ LWORK - NWORK + 1, IERR )
1151 CALL SLACPY( 'l
', M, M, A, LDA, WORK( IL ), LDWRKL )
1152 CALL SLASET( 'u
', M - 1, M - 1, ZERO, ZERO,
1153 $ WORK( IL + LDWRKL ), LDWRKL )
1159 CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
1160 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1170 CALL SGEBRD( M, M, WORK( IL ), LDWRKL, S, WORK( IE ),
1171 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
1172 $ LWORK - NWORK + 1, IERR )
1179 CALL SBDSDC( 'u
', 'i
', M, S, WORK( IE ), U, LDU,
1180 $ WORK( IVT ), M, DUM, IDUM, WORK( NWORK ),
1188 CALL SORMBR( 'q
', 'l
', 'n
', M, M, M, WORK( IL ), LDWRKL,
1189 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1190 $ LWORK - NWORK + 1, IERR )
1191 CALL SORMBR( 'p
', 'r
', 't
', M, M, M, WORK( IL ), LDWRKL,
1192 $ WORK( ITAUP ), WORK( IVT ), M,
1193 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1201 DO 30 I = 1, N, CHUNK
1202 BLK = MIN( N - I + 1, CHUNK )
1203 CALL SGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IVT ), M,
1204 $ A( 1, I ), LDA, ZERO, WORK( IL ), LDWRKL )
1205 CALL SLACPY( 'f
', M, BLK, WORK( IL ), LDWRKL,
1209 ELSE IF( WNTQS ) THEN
1220 ITAU = IL + LDWRKL*M
1227 CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
1228 $ LWORK - NWORK + 1, IERR )
1232 CALL SLACPY( 'l
', M, M, A, LDA, WORK( IL ), LDWRKL )
1233 CALL SLASET( 'u
', M - 1, M - 1, ZERO, ZERO,
1234 $ WORK( IL + LDWRKL ), LDWRKL )
1240 CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
1241 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1251 CALL SGEBRD( M, M, WORK( IL ), LDWRKL, S, WORK( IE ),
1252 $ WORK( ITAUQ ), WORK( ITAUP ), WORK( NWORK ),
1253 $ LWORK - NWORK + 1, IERR )
1260 CALL SBDSDC( 'u
', 'i
', M, S, WORK( IE ), U, LDU, VT,
1261 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1269 CALL SORMBR( 'q
', 'l
', 'n
', M, M, M, WORK( IL ), LDWRKL,
1270 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1271 $ LWORK - NWORK + 1, IERR )
1272 CALL SORMBR( 'p
', 'r
', 't
', M, M, M, WORK( IL ), LDWRKL,
1273 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1274 $ LWORK - NWORK + 1, IERR )
1280 CALL SLACPY( 'f
', M, M, VT, LDVT, WORK( IL ), LDWRKL )
1281 CALL SGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IL ), LDWRKL,
1282 $ A, LDA, ZERO, VT, LDVT )
1284 ELSE IF( WNTQA ) THEN
1295 ITAU = IVT + LDWKVT*M
1302 CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( NWORK ),
1303 $ LWORK - NWORK + 1, IERR )
1304 CALL SLACPY( 'u
', M, N, A, LDA, VT, LDVT )
1310 CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
1311 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1315 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
1325 CALL SGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
1326 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
1334 CALL SBDSDC( 'u
', 'i
', M, S, WORK( IE ), U, LDU,
1335 $ WORK( IVT ), LDWKVT, DUM, IDUM,
1336 $ WORK( NWORK ), IWORK, INFO )
1343 CALL SORMBR( 'q
', 'l
', 'n
', M, M, M, A, LDA,
1344 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1345 $ LWORK - NWORK + 1, IERR )
1346 CALL SORMBR( 'p
', 'r
', 't
', M, M, M, A, LDA,
1347 $ WORK( ITAUP ), WORK( IVT ), LDWKVT,
1348 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1354 CALL SGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IVT ), LDWKVT,
1355 $ VT, LDVT, ZERO, A, LDA )
1359 CALL SLACPY( 'f
', M, N, A, LDA, VT, LDVT )
1379 CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
1380 $ WORK( ITAUP ), WORK( NWORK ), LWORK-NWORK+1,
1388 CALL SBDSDC( 'l
', 'n
', M, S, WORK( IE ), DUM, 1, DUM, 1,
1389 $ DUM, IDUM, WORK( NWORK ), IWORK, INFO )
1390 ELSE IF( WNTQO ) THEN
1394.GE.
IF( LWORK M*N + 3*M + BDSPAC ) THEN
1398 CALL SLASET( 'f
', M, N, ZERO, ZERO, WORK( IVT ),
1400 NWORK = IVT + LDWKVT*N
1407 NWORK = IVT + LDWKVT*M
1412 CHUNK = ( LWORK - M*M - 3*M ) / M
1420 CALL SBDSDC( 'l
', 'i
', M, S, WORK( IE ), U, LDU,
1421 $ WORK( IVT ), LDWKVT, DUM, IDUM,
1422 $ WORK( NWORK ), IWORK, INFO )
1428 CALL SORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1429 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1430 $ LWORK - NWORK + 1, IERR )
1432.GE.
IF( LWORK M*N + 3*M + BDSPAC ) THEN
1439 CALL SORMBR( 'p
', 'r
', 't
', M, N, M, A, LDA,
1440 $ WORK( ITAUP ), WORK( IVT ), LDWKVT,
1441 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1445 CALL SLACPY( 'f
', M, N, WORK( IVT ), LDWKVT, A, LDA )
1453 CALL SORGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
1454 $ WORK( NWORK ), LWORK - NWORK + 1, IERR )
1462 DO 40 I = 1, N, CHUNK
1463 BLK = MIN( N - I + 1, CHUNK )
1464 CALL SGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IVT ),
1465 $ LDWKVT, A( 1, I ), LDA, ZERO,
1467 CALL SLACPY( 'f
', M, BLK, WORK( IL ), M, A( 1, I ),
1471 ELSE IF( WNTQS ) THEN
1479 CALL SLASET( 'f
', M, N, ZERO, ZERO, VT, LDVT )
1480 CALL SBDSDC( 'l
', 'i
', M, S, WORK( IE ), U, LDU, VT,
1481 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1489 CALL SORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1490 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1491 $ LWORK - NWORK + 1, IERR )
1492 CALL SORMBR( 'p
', 'r
', 't
', M, N, M, A, LDA,
1493 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1494 $ LWORK - NWORK + 1, IERR )
1495 ELSE IF( WNTQA ) THEN
1503 CALL SLASET( 'f
', N, N, ZERO, ZERO, VT, LDVT )
1504 CALL SBDSDC( 'l
', 'i
', M, S, WORK( IE ), U, LDU, VT,
1505 $ LDVT, DUM, IDUM, WORK( NWORK ), IWORK,
1511 CALL SLASET( 'f
', N-M, N-M, ZERO, ONE, VT(M+1,M+1),
1520 CALL SORMBR( 'q
', 'l
', 'n
', M, M, N, A, LDA,
1521 $ WORK( ITAUQ ), U, LDU, WORK( NWORK ),
1522 $ LWORK - NWORK + 1, IERR )
1523 CALL SORMBR( 'p
', 'r
', 't
', N, N, M, A, LDA,
1524 $ WORK( ITAUP ), VT, LDVT, WORK( NWORK ),
1525 $ LWORK - NWORK + 1, IERR )
1534.EQ.
IF( ISCL1 ) THEN
1535.GT.
IF( ANRMBIGNUM )
1536 $ CALL SLASCL( 'g
', 0, 0, BIGNUM, ANRM, MINMN, 1, S, MINMN,
1538.LT.
IF( ANRMSMLNUM )
1539 $ CALL SLASCL( 'g
', 0, 0, SMLNUM, ANRM, MINMN, 1, S, MINMN,
1545 WORK( 1 ) = SROUNDUP_LWORK( MAXWRK )