209 SUBROUTINE sgesvd( JOBU, JOBVT, M, N, A, LDA, S, U, LDU, VT, LDVT,
210 $ WORK, LWORK, INFO )
218 INTEGER INFO, LDA, , LDVT, LWORK, M, N
221 REAL A( LDA, * ), S( * ), U( LDU, * ),
222 $ vt( ldvt, * ), work( * )
229 parameter( zero = 0.0e0, one = 1.0e0 )
232 LOGICAL LQUERY, WNTUA, WNTUAS, , WNTUO, WNTUS,
233 $ wntva, wntvas, wntvn, wntvo, wntvs
234 INTEGER BDSPAC, BLK, CHUNK, I, IE, IERR, IR, ISCL,
236 $ maxwrk, minmn, minwrk, mnthr, ncu, ncvt, nru,
239 $ lwork_sgebrd, lwork_sorgbr_p, lwork_sorgbr_q,
240 $ lwork_sgelqf, lwork_sorglq_n, lwork_sorglq_m
241 REAL ANRM, BIGNUM, EPS
255 EXTERNAL lsame, ilaenv, slamch, slange
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 lquery = ( lwork.EQ.-1 )
278 IF( .NOT.( wntua .OR. wntus .OR. wntuo .OR. wntun ) )
THEN
280 ELSE IF( .NOT.( wntva .OR. wntvs .OR. wntvo .OR. wntvn ) .OR.
281 $ ( wntvo .AND. wntuo ) )
THEN
283 ELSE IF( m.LT.0 )
THEN
285 ELSE IF( n.LT.0 )
THEN
287 ELSE IF( lda.LT.
max(
THEN
289 ELSE IF( ldu.LT.1 .OR. ( wntuas .AND. ldu.LT.m ) )
THEN
291 ELSE IF( ldvt.LT.1 .OR. ( wntva .AND. ldvt.LT.n ) .OR.
292 $ ( wntvs .AND. ldvt.LT.minmn ) )
THEN
306 IF( m.GE.n .AND. minmn.GT.0 )
THEN
310 mnthr = ilaenv( 6,
'SGESVD', jobu // jobvt, m, n, 0, 0 )
313 CALL sgeqrf( m, n, a, lda, dum(1), dum(1), -1, ierr )
314 lwork_sgeqrf = int( dum(1) )
316 CALL sorgqr( m, n, n, a, lda, dum(1), dum(1), -1, ierr )
317 lwork_sorgqr_n = int( dum(1) )
318 CALL sorgqr( m, m, n, a, lda, dum(1), dum(1), -1, ierr )
319 lwork_sorgqr_m = int( dum(1) )
321 CALL sgebrd( n, n, a, lda, s, dum(1), dum(1),
322 $ dum(1), dum(1), -1, ierr )
323 lwork_sgebrd = int( dum(1) )
325 CALL sorgbr(
'P', n, n, n, a, lda, dum(1),
327 lwork_sorgbr_p = int( dum(1) )
329 CALL sorgbr(
'Q', n, n, n, a, lda, dum(1),
331 lwork_sorgbr_q = int( dum(1) )
333 IF( m.GE.mnthr )
THEN
338 maxwrk = n + lwork_sgeqrf
339 maxwrk =
max( maxwrk, 3*n+lwork_sgebrd )
340 IF( wntvo .OR. wntvas )
341 $ maxwrk =
max( maxwrk, 3*n+lwork_sorgbr_p )
342 maxwrk =
max( maxwrk, bdspac )
343 minwrk =
max( 4*n, bdspac )
344 ELSE IF( wntuo .AND. wntvn )
THEN
348 wrkbl = n + lwork_sgeqrf
349 wrkbl =
max( wrkbl, n+lwork_sorgqr_n )
350 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
351 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_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 ELSE IF( wntuo .AND. wntvas )
THEN
360 wrkbl = n + lwork_sgeqrf
361 wrkbl =
max( wrkbl, n+lwork_sorgqr_n )
362 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
363 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
364 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_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 ELSE IF( wntus .AND. wntvn )
THEN
372 wrkbl = n + lwork_sgeqrf
373 wrkbl =
max( wrkbl, n+lwork_sorgqr_n )
374 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
375 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
376 wrkbl =
max( wrkbl, bdspac )
378 minwrk =
max( 3*n+m, bdspac )
379 ELSE IF( wntus .AND. wntvo )
THEN
383 wrkbl = n + lwork_sgeqrf
384 wrkbl =
max( wrkbl, n+lwork_sorgqr_n )
385 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
386 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
387 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_p )
388 wrkbl =
max( wrkbl, bdspac )
389 maxwrk = 2*n*n + wrkbl
390 minwrk =
max( 3*n+m, bdspac )
391 ELSE IF( wntus .AND. wntvas )
THEN
396 wrkbl = n + lwork_sgeqrf
397 wrkbl =
max( wrkbl, n+lwork_sorgqr_n )
398 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
399 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
400 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_p )
401 wrkbl =
max( wrkbl, bdspac )
403 minwrk =
max( 3*n+m, bdspac )
404 ELSE IF( wntua .AND. wntvn )
THEN
408 wrkbl = n + lwork_sgeqrf
409 wrkbl =
max( wrkbl, n+lwork_sorgqr_m )
410 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
411 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
412 wrkbl =
max( wrkbl, bdspac )
414 minwrk =
max( 3*n+m, bdspac )
415 ELSE IF( wntua .AND. wntvo )
THEN
419 wrkbl = n + lwork_sgeqrf
420 wrkbl =
max( wrkbl, n+lwork_sorgqr_m )
421 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
422 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_q )
423 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_p )
424 wrkbl =
max( wrkbl, bdspac )
425 maxwrk = 2*n*n + wrkbl
426 minwrk =
max( 3*n+m, bdspac )
427 ELSE IF( wntua .AND. wntvas )
THEN
432 wrkbl = n + lwork_sgeqrf
433 wrkbl =
max( wrkbl, n+lwork_sorgqr_m )
434 wrkbl =
max( wrkbl, 3*n+lwork_sgebrd )
436 wrkbl =
max( wrkbl, 3*n+lwork_sorgbr_p )
437 wrkbl =
max( wrkbl, bdspac )
439 minwrk =
max( 3*n+m, bdspac )
445 CALL sgebrd( m, n, a, lda, s, dum(1), dum(1),
446 $ dum(1), dum(1), -1, ierr )
447 lwork_sgebrd = int( dum(1) )
448 maxwrk = 3*n + lwork_sgebrd
449 IF( wntus .OR. wntuo )
THEN
450 CALL sorgbr(
'Q', m, n, n, a, lda, dum(1),
452 lwork_sorgbr_q = int( dum(1) )
453 maxwrk =
max( maxwrk, 3*n+lwork_sorgbr_q )
456 CALL sorgbr(
'Q', m, m, n, a, lda, dum(1),
458 lwork_sorgbr_q = int( dum(1) )
459 maxwrk =
max( maxwrk, 3*n+lwork_sorgbr_q )
461 IF( .NOT.wntvn )
THEN
462 maxwrk =
max( maxwrk, 3*n+lwork_sorgbr_p
465 minwrk =
max( 3*n+m, bdspac )
467 ELSEIF( minmn.GT.0 )
THEN
471 mnthr = ilaenv( 6,
'SGESVD', jobu // jobvt, m, n, 0, 0 )
474 CALL sgelqf( m, n, a, lda, dum(1), dum(1), -1, ierr )
475 lwork_sgelqf = int( dum(1) )
477 CALL sorglq( n, n, m, dum(1), n, dum(1), dum(1), -1, ierr )
478 lwork_sorglq_n = int( dum(1) )
479 CALL sorglq( m, n, m, a, lda, dum(1), dum(1), -1, ierr )
480 lwork_sorglq_m = int( dum(1) )
482 CALL sgebrd( m, m, a, lda, s, dum(1), dum(1),
483 $ dum(1), dum(1), -1, ierr )
484 lwork_sgebrd = int( dum(1) )
486 CALL sorgbr(
'P', m, m, m, a, n, dum(1),
490 CALL sorgbr(
'Q', m, m, m, a, n, dum(1),
492 lwork_sorgbr_q = int( dum(1) )
493 IF( n.GE.mnthr )
THEN
498 maxwrk = m + lwork_sgelqf
499 maxwrk =
max( maxwrk, 3*m+lwork_sgebrd )
500 IF( wntuo .OR. wntuas )
501 $ maxwrk =
max( maxwrk, 3*m+lwork_sorgbr_q )
502 maxwrk =
max( maxwrk, bdspac )
503 minwrk =
max( 4*m, bdspac )
504 ELSE IF( wntvo .AND. wntun )
THEN
508 wrkbl = m + lwork_sgelqf
509 wrkbl =
max( wrkbl, m+lwork_sorglq_m )
510 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
511 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_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 ELSE IF( wntvo .AND. wntuas )
THEN
520 wrkbl = m + lwork_sgelqf
521 wrkbl =
max( wrkbl, m+lwork_sorglq_m )
522 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
523 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
524 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_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 ELSE IF( wntvs .AND. wntun )
THEN
532 wrkbl = m + lwork_sgelqf
533 wrkbl =
max( wrkbl, m+lwork_sorglq_m )
534 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
535 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
536 wrkbl =
max( wrkbl, bdspac )
538 minwrk =
max( 3*m+n, bdspac )
539 ELSE IF( wntvs .AND. wntuo )
THEN
543 wrkbl = m + lwork_sgelqf
544 wrkbl =
max( wrkbl, m+lwork_sorglq_m )
545 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
546 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
547 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_q )
548 wrkbl =
max( wrkbl, bdspac )
549 maxwrk = 2*m*m + wrkbl
550 minwrk =
max( 3*m+n, bdspac )
551 maxwrk =
max( maxwrk, minwrk )
552 ELSE IF( wntvs .AND. wntuas )
THEN
557 wrkbl = m + lwork_sgelqf
558 wrkbl =
max( wrkbl, m+lwork_sorglq_m )
559 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
560 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
561 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_q )
562 wrkbl =
max( wrkbl, bdspac )
564 minwrk =
max( 3*m+n, bdspac )
565 ELSE IF( wntva .AND. wntun )
THEN
569 wrkbl = m + lwork_sgelqf
570 wrkbl =
max( wrkbl, m+lwork_sorglq_n )
571 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
572 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
573 wrkbl =
max( wrkbl, bdspac )
575 minwrk =
max( 3*m+n, bdspac )
576 ELSE IF( wntva .AND. wntuo )
THEN
580 wrkbl = m + lwork_sgelqf
581 wrkbl =
max( wrkbl, m+lwork_sorglq_n )
582 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
583 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
584 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_q )
585 wrkbl =
max( wrkbl, bdspac )
586 maxwrk = 2*m*m + wrkbl
587 minwrk =
max( 3*m+n, bdspac )
588 ELSE IF( wntva .AND. wntuas )
THEN
593 wrkbl = m + lwork_sgelqf
594 wrkbl =
max( wrkbl, m+lwork_sorglq_n )
595 wrkbl =
max( wrkbl, 3*m+lwork_sgebrd )
596 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_p )
597 wrkbl =
max( wrkbl, 3*m+lwork_sorgbr_q )
598 wrkbl =
max( wrkbl, bdspac )
600 minwrk =
max( 3*m+n, bdspac )
606 CALL sgebrd( m, n, a, lda, s, dum(1), dum(1),
607 $ dum(1), dum(1), -1, ierr )
608 lwork_sgebrd = int( dum(1) )
609 maxwrk = 3*m + lwork_sgebrd
610 IF( wntvs .OR. wntvo )
THEN
612 CALL sorgbr(
'P', m, n, m, a, n, dum(1),
614 lwork_sorgbr_p = int( dum(1) )
615 maxwrk =
max( maxwrk, 3*m+lwork_sorgbr_p )
618 CALL sorgbr(
'P', n, n, m, a, n, dum(1),
621 maxwrk =
max( maxwrk, 3*m+lwork_sorgbr_p )
623 IF( .NOT.wntun )
THEN
624 maxwrk =
max( maxwrk, 3*m+lwork_sorgbr_q )
626 maxwrk =
max( maxwrk, bdspac )
627 minwrk =
max( 3*m+n, bdspac )
630 maxwrk =
max( maxwrk, minwrk )
633 IF( lwork.LT.minwrk .AND. .NOT.lquery )
THEN
639 CALL xerbla(
'SGESVD', -info )
641 ELSE IF( lquery )
THEN
647 IF( m.EQ.0 .OR. n.EQ.0 )
THEN
654 smlnum = sqrt( slamch(
'S' ) ) / eps
655 bignum = one / smlnum
659 anrm = slange(
'M', m, n, a, lda, dum )
661 IF( anrm.GT.zero .AND. anrm.LT.smlnum )
THEN
663 CALL slascl(
'G', 0, 0, anrm, smlnum, m, n, a, lda, ierr )
664 ELSE IF( anrm.GT.bignum )
THEN
666 CALL slascl(
'G', 0, 0, anrm, bignum, m, n, a, lda, ierr )
675 IF( m.GE.mnthr )
THEN
688 CALL sgeqrf( m, n, a, lda, work( itau ), work( iwork ),
689 $ lwork-iwork+1, ierr )
694 CALL slaset(
'L', n-1, n-1, zero, zero, a( 2, 1 ),
705 CALL sgebrd( n, n, a, lda, s, work( ie ), work( itauq ),
709 IF( wntvo .OR. wntvas )
THEN
714 CALL sorgbr(
'P', n, n, n, a, lda, work( itaup ),
715 $ work( iwork ), lwork-iwork+1, ierr )
724 CALL sbdsqr(
'U', n, ncvt, 0, 0, s, work( ie ), a, lda,
725 $ dum, 1, dum, 1, work( iwork ), info )
730 $
CALL slacpy(
'F', n, n, a, lda, vt, ldvt )
732 ELSE IF( wntuo .AND. wntvn )
THEN
738 IF( lwork.GE.n*n+
max( 4*n, bdspac ) )
THEN
743 IF( lwork.GE.
max( wrkbl, lda*n+n )+lda*n )
THEN
749 ELSE IF( lwork.GE.
max( wrkbl, lda*n+n )+n*n )
THEN
759 ldwrku = ( lwork-n*n-n ) / n
768 CALL sgeqrf( m, n, a, lda, work( itau ),
769 $ work( iwork ), lwork-iwork+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 ),
780 CALL sorgqr( m, n, n, a, lda, work( itau ),
781 $ work( iwork ), lwork-iwork+1, ierr )
790 CALL sgebrd( n, n, work( ir ), ldwrkr, s, work( ie ),
791 $ work( itauq ), work( itaup ),
792 $ work( iwork ), lwork-iwork+1, ierr )
797 CALL sorgbr(
'Q', n, n, n, work( ir ), ldwrkr,
798 $ work( itauq ), work( iwork ),
799 $ lwork-iwork+1, ierr )
806 CALL sbdsqr( 'u
', N, 0, N, 0, S, WORK( IE ), DUM, 1,
807 $ WORK( IR ), LDWRKR, DUM, 1,
808 $ WORK( IWORK ), INFO )
815 DO 10 I = 1, M, LDWRKU
816 CHUNK = MIN( M-I+1, LDWRKU )
817 CALL SGEMM( 'n
', 'n
', CHUNK, N, N, ONE, A( I, 1 ),
818 $ LDA, WORK( IR ), LDWRKR, ZERO,
819 $ WORK( IU ), LDWRKU )
820 CALL SLACPY( 'f
', CHUNK, N, WORK( IU ), LDWRKU,
836 CALL SGEBRD( M, N, A, LDA, S, WORK( IE ),
837 $ WORK( ITAUQ ), WORK( ITAUP ),
838 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
843 CALL SORGBR( 'q
', M, N, N, A, LDA, WORK( ITAUQ ),
844 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
851 CALL SBDSQR( 'u
', N, 0, M, 0, S, WORK( IE ), DUM, 1,
852 $ A, LDA, DUM, 1, WORK( IWORK ), INFO )
856.AND.
ELSE IF( WNTUO WNTVAS ) THEN
862.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
867.GE.
IF( LWORKMAX( WRKBL, LDA*N+N )+LDA*N ) THEN
873.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N+N )+N*N ) THEN
883 LDWRKU = ( LWORK-N*N-N ) / N
892 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
893 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
897 CALL SLACPY( 'u
', N, N, A, LDA, VT, LDVT )
899 $ CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
905 CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
906 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
915 CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
916 $ WORK( ITAUQ ), WORK( ITAUP ),
917 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
918 CALL SLACPY( 'l
', N, N, VT, LDVT, WORK( IR ), LDWRKR )
923 CALL SORGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
924 $ WORK( ITAUQ ), WORK( IWORK ),
925 $ LWORK-IWORK+1, IERR )
930 CALL SORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
931 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
939 CALL SBDSQR( 'u
', N, N, N, 0, S, WORK( IE ), VT, LDVT,
940 $ WORK( IR ), LDWRKR, DUM, 1,
941 $ WORK( IWORK ), INFO )
948 DO 20 I = 1, M, LDWRKU
949 CHUNK = MIN( M-I+1, LDWRKU )
950 CALL SGEMM( 'n
', 'n
', CHUNK, N, N, ONE, A( I, 1 ),
951 $ LDA, WORK( IR ), LDWRKR, ZERO,
952 $ WORK( IU ), LDWRKU )
953 CALL SLACPY( 'f
', CHUNK, N, WORK( IU ), LDWRKU,
967 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
968 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
972 CALL SLACPY( 'u
', N, N, A, LDA, VT, LDVT )
974 $ CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
980 CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
981 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
990 CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
991 $ WORK( ITAUQ ), WORK( ITAUP ),
992 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
997 CALL SORMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
998 $ WORK( ITAUQ ), A, LDA, WORK( IWORK ),
999 $ LWORK-IWORK+1, IERR )
1004 CALL SORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1005 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1013 CALL SBDSQR( 'u
', N, N, M, 0, S, WORK( IE ), VT, LDVT,
1014 $ A, LDA, DUM, 1, WORK( IWORK ), INFO )
1018 ELSE IF( WNTUS ) THEN
1026.GE.
IF( LWORKN*N+MAX( 4*N, BDSPAC ) ) THEN
1031.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1042 ITAU = IR + LDWRKR*N
1048 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
1049 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1053 CALL SLACPY( 'u
', N, N, A, LDA, WORK( IR ),
1055 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
1056 $ WORK( IR+1 ), LDWRKR )
1061 CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
1062 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1071 CALL SGEBRD( N, N, WORK( IR ), LDWRKR, S,
1072 $ WORK( IE ), WORK( ITAUQ ),
1073 $ WORK( ITAUP ), WORK( IWORK ),
1074 $ LWORK-IWORK+1, IERR )
1079 CALL SORGBR( 'q
', N, N, N, WORK( IR ), LDWRKR,
1080 $ WORK( ITAUQ ), WORK( IWORK ),
1081 $ LWORK-IWORK+1, IERR )
1088 CALL SBDSQR( 'u
', N, 0, N, 0, S, WORK( IE ), DUM,
1089 $ 1, WORK( IR ), LDWRKR, DUM, 1,
1090 $ WORK( IWORK ), INFO )
1096 CALL SGEMM( 'n
', 'n
', M, N, N, ONE, A, LDA,
1097 $ WORK( IR ), LDWRKR, ZERO, U, LDU )
1109 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
1110 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1111 CALL SLACPY( 'l
', M, N, A, LDA, U, LDU )
1116 CALL SORGQR( M, N, N, U, LDU, WORK( ITAU ),
1117 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1126 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
1133 CALL SGEBRD( N, N, A, LDA, S, WORK( IE ),
1134 $ WORK( ITAUQ ), WORK( ITAUP ),
1135 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1140 CALL SORMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1141 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1142 $ LWORK-IWORK+1, IERR )
1149 CALL SBDSQR( 'u
', N, 0, M, 0, S, WORK( IE ), DUM,
1150 $ 1, U, LDU, DUM, 1, WORK( IWORK ),
1155 ELSE IF( WNTVO ) THEN
1161.GE.
IF( LWORK2*N*N+MAX( 4*N, BDSPAC ) ) THEN
1166.GE.
IF( LWORKWRKBL+2*LDA*N ) THEN
1173.GE.
ELSE IF( LWORKWRKBL+( LDA+N )*N ) THEN
1188 ITAU = IR + LDWRKR*N
1194 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
1195 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1199 CALL SLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1201 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
1202 $ WORK( IU+1 ), LDWRKU )
1207 CALL SORGQR( M, N, N, A, LDA, WORK( ITAU ),
1208 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1219 CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
1220 $ WORK( IE ), WORK( ITAUQ ),
1221 $ WORK( ITAUP ), WORK( IWORK ),
1222 $ LWORK-IWORK+1, IERR )
1223 CALL SLACPY( 'u
', N, N, WORK( IU ), LDWRKU,
1224 $ WORK( IR ), LDWRKR )
1229 CALL SORGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1230 $ WORK( ITAUQ ), WORK( IWORK ),
1231 $ LWORK-IWORK+1, IERR )
1237 CALL SORGBR( 'p', n, n, n, work( ir ), ldwrkr,
1238 $ work( itaup ), work( iwork ),
1239 $ lwork-iwork+1, ierr )
1247 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ),
1248 $ work( ir ), ldwrkr, work( iu ),
1249 $ ldwrku, dum, 1, work( iwork ), info )
1255 CALL sgemm(
'N',
'N', m, n, n, one, a, lda,
1256 $ work( iu ), ldwrku, zero, u, ldu )
1261 CALL slacpy(
'F', n, n, work( ir ), ldwrkr, a,
1274 CALL sgeqrf( m, n, a, lda, work( itau ),
1275 $ work( iwork ), lwork-iwork+1, ierr )
1276 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1281 CALL sorgqr( m, n, n, u, ldu, work( itau
1282 $ work( iwork ), lwork-iwork+1, ierr )
1291 CALL slaset(
'L', n-1, n-1, zero, zero,
1298 CALL sgebrd( n, n, a, lda, s, work( ie ),
1299 $ work( itauq ), work( itaup ),
1300 $ work( iwork ), lwork-iwork+1, ierr )
1305 CALL sormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1306 $ work( itauq ), u, ldu, work( iwork ),
1307 $ lwork-iwork+1, ierr )
1312 CALL sorgbr(
'P', n, n, n, a, lda, work( itaup ),
1313 $ work( iwork ), lwork-iwork+1, ierr )
1321 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), a,
1322 $ lda, u, ldu, dum, 1, work( iwork ),
1327 ELSE IF( wntvas )
THEN
1334 IF( lwork.GE.n*n+
max( 4*n, bdspac ) )
THEN
1339 IF( lwork.GE.wrkbl+lda*n )
THEN
1350 itau = iu + ldwrku*n
1356 CALL sgeqrf( m, n, a, lda, work( itau ),
1357 $ work( iwork ), lwork-iwork+1, ierr )
1361 CALL slacpy(
'U', n, n, a, lda, work( iu ),
1363 CALL slaset(
'L', n-1, n-1, zero, zero,
1364 $ work( iu+1 ), ldwrku )
1369 CALL sorgqr( m, n, n, a, lda, work( itau ),
1370 $ work( iwork ), lwork-iwork+1, ierr )
1379 CALL sgebrd( n, n, work( iu ), ldwrku, s,
1380 $ work( ie ), work( itauq ),
1381 $ work( itaup ), work( iwork ),
1382 $ lwork-iwork+1, ierr )
1383 CALL slacpy(
'U', n, n, work( iu ), ldwrku, vt,
1389 CALL sorgbr(
'Q', n, n, n, work( iu ), ldwrku,
1390 $ work( itauq ), work( iwork ),
1391 $ lwork-iwork+1, ierr )
1397 CALL sorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1398 $ work( iwork ), lwork-iwork+1, ierr )
1406 CALL sbdsqr(
'U', n, n, n, 0, s, work( ie ), vt,
1407 $ ldvt, work( iu ), ldwrku, dum, 1,
1408 $ work( iwork ), info )
1414 CALL sgemm(
'N',
'N', m, n, n, one, a, lda,
1415 $ work( iu ), ldwrku, zero, u, ldu )
1427 CALL sgeqrf( m, n, a, lda, work( itau ),
1428 $ work( iwork ), lwork-iwork+1, ierr )
1429 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1434 CALL sorgqr( m, n, n, u, ldu, work( itau ),
1435 $ work( iwork ), lwork-iwork+1, ierr )
1439 CALL slacpy(
'U', n, n, a, lda, vt, ldvt )
1441 $
CALL slaset(
'L', n-1, n-1, zero, zero,
1442 $ vt( 2, 1 ), ldvt )
1453 $ work( iwork ), lwork-iwork+1, ierr )
1459 CALL sormbr(
'Q',
'R',
'N', m, n, n, vt, ldvt,
1461 $ lwork-iwork+1, ierr )
1466 CALL sorgbr(
'P', n, n, n, vt, ldvt, work( itaup ),
1467 $ work( iwork ), lwork-iwork+1, ierr )
1475 CALL sbdsqr(
'U', n, n, m, 0, s, work( ie ), vt,
1476 $ ldvt, u, ldu, dum, 1, work( iwork ),
1483 ELSE IF( wntua )
THEN
1491 IF( lwork.GE.n*n+
max( n+m, 4*n, bdspac ) )
THEN
1496 IF( lwork.GE.wrkbl+lda*n )
THEN
1507 itau = ir + ldwrkr*n
1513 CALL sgeqrf( m, n, a, lda, work( itau ),
1514 $ work( iwork ), lwork-iwork+1, ierr )
1515 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1519 CALL slacpy(
'U', n, n, a, lda, work( ir ),
1521 CALL slaset(
'L', n-1, n-1, zero, zero,
1522 $ work( ir+1 ), ldwrkr )
1527 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1528 $ work( iwork ), lwork-iwork+1, ierr )
1537 CALL sgebrd( n, n, work( ir ), ldwrkr, s,
1538 $ work( ie ), work( itauq ),
1539 $ work( itaup ), work( iwork ),
1540 $ lwork-iwork+1, ierr )
1545 CALL sorgbr(
'Q', n, n, n, work( ir ), ldwrkr,
1546 $ work( itauq ), work( iwork ),
1547 $ lwork-iwork+1, ierr )
1554 CALL sbdsqr(
'U', n, 0, n, 0, s, work( ie ), dum,
1555 $ 1, work( ir ), ldwrkr, dum, 1,
1562 CALL sgemm(
'N',
'N', m, n, n, one, u, ldu,
1563 $ work( ir ), ldwrkr, zero, a, lda )
1567 CALL slacpy(
'F', m, n, a, lda, u, ldu )
1579 CALL sgeqrf( m, n, a, lda, work( itau ),
1580 $ work( iwork ), lwork-iwork+1, ierr )
1581 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1586 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1587 $ work( iwork ), lwork-iwork+1, ierr )
1596 CALL slaset(
'L', n-1, n-1, zero, zero,
1603 CALL sgebrd( n, n, a, lda, s, work( ie ),
1604 $ work( itauq ), work( itaup ),
1605 $ work( iwork ), lwork-iwork+1, ierr )
1611 CALL sormbr(
'Q',
'R',
'N', m, n, n, a, lda,
1612 $ work( itauq ), u, ldu, work( iwork ),
1613 $ lwork-iwork+1, ierr )
1620 CALL sbdsqr(
'U', n, 0, m, 0, s, work( ie ), dum,
1621 $ 1, u, ldu, dum, 1, work( iwork ),
1626 ELSE IF( wntvo )
THEN
1632 IF( lwork.GE.2*n*n+
max( n+m, 4*n, bdspac ) )
THEN
1637 IF( lwork.GE.wrkbl+2*lda*n )
THEN
1644 ELSE IF( lwork.GE.wrkbl+( lda+n )*n )
THEN
1659 itau = ir + ldwrkr*n
1665 CALL sgeqrf( m, n, a, lda, work( itau ),
1666 $ work( iwork ), lwork-iwork+1, ierr )
1667 CALL slacpy(
'L', m, n, a, lda, u, ldu )
1672 CALL sorgqr( m, m, n, u, ldu, work( itau ),
1673 $ work( iwork ), lwork-iwork+1, ierr )
1677 CALL slacpy(
'U', n, n, a, lda, work( iu ),
1679 CALL slaset( 'l
', N-1, N-1, ZERO, ZERO,
1680 $ WORK( IU+1 ), LDWRKU )
1691 CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
1692 $ WORK( IE ), WORK( ITAUQ ),
1693 $ WORK( ITAUP ), WORK( IWORK ),
1694 $ LWORK-IWORK+1, IERR )
1695 CALL SLACPY( 'u
', N, N, WORK( IU ), LDWRKU,
1696 $ WORK( IR ), LDWRKR )
1701 CALL SORGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1702 $ WORK( ITAUQ ), WORK( IWORK ),
1703 $ LWORK-IWORK+1, IERR )
1709 CALL SORGBR( 'p
', N, N, N, WORK( IR ), LDWRKR,
1710 $ WORK( ITAUP ), WORK( IWORK ),
1711 $ LWORK-IWORK+1, IERR )
1719 CALL SBDSQR( 'u
', N, N, N, 0, S, WORK( IE ),
1720 $ WORK( IR ), LDWRKR, WORK( IU ),
1721 $ LDWRKU, DUM, 1, WORK( IWORK ), INFO )
1727 CALL SGEMM( 'n
', 'n
', M, N, N, ONE, U, LDU,
1728 $ WORK( IU ), LDWRKU, ZERO, A, LDA )
1732 CALL SLACPY( 'f
', M, N, A, LDA, U, LDU )
1736 CALL SLACPY( 'f
', N, N, WORK( IR ), LDWRKR, A,
1749 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
1750 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1751 CALL SLACPY( 'l
', M, N, A, LDA, U, LDU )
1756 CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
1757 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1766 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
1773 CALL SGEBRD( N, N, A, LDA, S, WORK( IE ),
1774 $ WORK( ITAUQ ), WORK( ITAUP ),
1775 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1781 CALL SORMBR( 'q
', 'r
', 'n
', M, N, N, A, LDA,
1782 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1783 $ LWORK-IWORK+1, IERR )
1788 CALL SORGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
1789 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1797 CALL SBDSQR( 'u
', N, N, M, 0, S, WORK( IE ), A,
1798 $ LDA, U, LDU, DUM, 1, WORK( IWORK ),
1803 ELSE IF( WNTVAS ) THEN
1810.GE.
IF( LWORKN*N+MAX( N+M, 4*N, BDSPAC ) ) THEN
1815.GE.
IF( LWORKWRKBL+LDA*N ) THEN
1826 ITAU = IU + LDWRKU*N
1832 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
1833 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1834 CALL SLACPY( 'l
', M, N, A, LDA, U, LDU )
1839 CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
1840 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1844 CALL SLACPY( 'u
', N, N, A, LDA, WORK( IU ),
1846 CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
1847 $ WORK( IU+1 ), LDWRKU )
1856 CALL SGEBRD( N, N, WORK( IU ), LDWRKU, S,
1857 $ WORK( IE ), WORK( ITAUQ ),
1858 $ WORK( ITAUP ), WORK( IWORK ),
1859 $ LWORK-IWORK+1, IERR )
1860 CALL SLACPY( 'u
', N, N, WORK( IU ), LDWRKU, VT,
1866 CALL SORGBR( 'q
', N, N, N, WORK( IU ), LDWRKU,
1867 $ WORK( ITAUQ ), WORK( IWORK ),
1868 $ LWORK-IWORK+1, IERR )
1874 CALL SORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1875 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1883 CALL SBDSQR( 'u
', N, N, N, 0, S, WORK( IE ), VT,
1884 $ LDVT, WORK( IU ), LDWRKU, DUM, 1,
1885 $ WORK( IWORK ), INFO )
1891 CALL SGEMM( 'n
', 'n
', M, N, N, ONE, U, LDU,
1892 $ WORK( IU ), LDWRKU, ZERO, A, LDA )
1896 CALL SLACPY( 'f
', M, N, A, LDA, U, LDU )
1908 CALL SGEQRF( M, N, A, LDA, WORK( ITAU ),
1909 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1910 CALL SLACPY( 'l
', M, N, A, LDA, U, LDU )
1915 CALL SORGQR( M, M, N, U, LDU, WORK( ITAU ),
1916 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1920 CALL SLACPY( 'u
', N, N, A, LDA, VT, LDVT )
1922 $ CALL SLASET( 'l
', N-1, N-1, ZERO, ZERO,
1923 $ VT( 2, 1 ), LDVT )
1932 CALL SGEBRD( N, N, VT, LDVT, S, WORK( IE ),
1933 $ WORK( ITAUQ ), WORK( ITAUP ),
1934 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1940 CALL SORMBR( 'q
', 'r
', 'n
', M, N, N, VT, LDVT,
1941 $ WORK( ITAUQ ), U, LDU, WORK( IWORK ),
1942 $ LWORK-IWORK+1, IERR )
1947 CALL SORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
1948 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
1956 CALL SBDSQR( 'u
', N, N, M, 0, S, WORK( IE ), VT,
1957 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ),
1981 CALL SGEBRD( M, N, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
1982 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
1990 CALL SLACPY( 'l
', M, N, A, LDA, U, LDU )
1995 CALL SORGBR( 'q
', M, NCU, N, U, LDU, WORK( ITAUQ ),
1996 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2004 CALL SLACPY( 'u
', N, N, A, LDA, VT, LDVT )
2005 CALL SORGBR( 'p
', N, N, N, VT, LDVT, WORK( ITAUP ),
2006 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2014 CALL SORGBR( 'q
', M, N, N, A, LDA, WORK( ITAUQ ),
2015 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2023 CALL SORGBR( 'p
', N, N, N, A, LDA, WORK( ITAUP ),
2024 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2027.OR.
IF( WNTUAS WNTUO )
2031.OR.
IF( WNTVAS WNTVO )
2035.NOT..AND..NOT.
IF( ( WNTUO ) ( WNTVO ) ) THEN
2042 CALL SBDSQR( 'u
', N, NCVT, NRU, 0, S, WORK( IE ), VT,
2043 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ), INFO )
2044.NOT..AND.
ELSE IF( ( WNTUO ) WNTVO ) THEN
2051 CALL SBDSQR( 'u
', N, NCVT, NRU, 0, S, WORK( IE ), A, LDA,
2052 $ U, LDU, DUM, 1, WORK( IWORK ), INFO )
2060 CALL SBDSQR( 'u
', N, NCVT, NRU, 0, S, WORK( IE ), VT,
2061 $ LDVT, A, LDA, DUM, 1, WORK( IWORK ), INFO )
2072.GE.
IF( NMNTHR ) THEN
2085 CALL SGELQF( M, N, A, LDA, WORK( ITAU ), WORK( IWORK ),
2086 $ LWORK-IWORK+1, IERR )
2090 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ), LDA )
2099 CALL SGEBRD( M, M, A, LDA, S, WORK( IE ), WORK( ITAUQ ),
2100 $ WORK( ITAUP ), WORK( IWORK ), LWORK-IWORK+1,
2102.OR.
IF( WNTUO WNTUAS ) THEN
2107 CALL SORGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
2108 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2112.OR.
IF( WNTUO WNTUAS )
2119 CALL SBDSQR( 'u
', M, 0, NRU, 0, S, WORK( IE ), DUM, 1, A,
2120 $ LDA, DUM, 1, WORK( IWORK ), INFO )
2125 $ CALL SLACPY( 'f
', M, M, A, LDA, U, LDU )
2127.AND.
ELSE IF( WNTVO WNTUN ) THEN
2133.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2138.GE.
IF( LWORKMAX( WRKBL, LDA*N+M )+LDA*M ) THEN
2145.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N+M )+M*M ) THEN
2157 CHUNK = ( LWORK-M*M-M ) / M
2160 ITAU = IR + LDWRKR*M
2166 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2167 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2171 CALL SLACPY( 'l
', M, M, A, LDA, WORK( IR ), LDWRKR )
2172 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO,
2173 $ WORK( IR+LDWRKR ), LDWRKR )
2178 CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2179 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2188 CALL SGEBRD( M, M, WORK( IR ), LDWRKR, S, WORK( IE ),
2189 $ WORK( ITAUQ ), WORK( ITAUP ),
2190 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2195 CALL SORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2196 $ WORK( ITAUP ), WORK( IWORK ),
2197 $ LWORK-IWORK+1, IERR )
2204 CALL SBDSQR( 'u
', M, M, 0, 0, S, WORK( IE ),
2205 $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
2206 $ WORK( IWORK ), INFO )
2213 DO 30 I = 1, N, CHUNK
2214 BLK = MIN( N-I+1, CHUNK )
2215 CALL SGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IR ),
2216 $ LDWRKR, A( 1, I ), LDA, ZERO,
2217 $ WORK( IU ), LDWRKU )
2218 CALL SLACPY( 'f
', M, BLK, WORK( IU ), LDWRKU,
2234 CALL SGEBRD( M, N, A, LDA, S, WORK( IE ),
2235 $ WORK( ITAUQ ), WORK( ITAUP ),
2236 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2241 CALL SORGBR( 'p
', M, N, M, A, LDA, WORK( ITAUP ),
2242 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2249 CALL SBDSQR( 'l
', M, N, 0, 0, S, WORK( IE ), A, LDA,
2250 $ DUM, 1, DUM, 1, WORK( IWORK ), INFO )
2254.AND.
ELSE IF( WNTVO WNTUAS ) THEN
2260.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2265.GE.
IF( LWORKMAX( WRKBL, LDA*N+M )+LDA*M ) THEN
2272.GE.
ELSE IF( LWORKMAX( WRKBL, LDA*N+M )+M*M ) THEN
2284 CHUNK = ( LWORK-M*M-M ) / M
2287 ITAU = IR + LDWRKR*M
2293 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2294 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2298 CALL SLACPY( 'l
', M, M, A, LDA, U, LDU )
2299 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
2305 CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2306 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2315 CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
2316 $ WORK( ITAUQ ), WORK( ITAUP ),
2317 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2318 CALL SLACPY( 'u
', M, M, U, LDU, WORK( IR ), LDWRKR )
2323 CALL SORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2324 $ WORK( ITAUP ), WORK( IWORK ),
2325 $ LWORK-IWORK+1, IERR )
2330 CALL SORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2331 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2339 CALL SBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
2340 $ WORK( IR ), LDWRKR, U, LDU, DUM, 1,
2341 $ WORK( IWORK ), INFO )
2348 DO 40 I = 1, N, CHUNK
2349 BLK = MIN( N-I+1, CHUNK )
2350 CALL SGEMM( 'n
', 'n
', M, BLK, M, ONE, WORK( IR ),
2351 $ LDWRKR, A( 1, I ), LDA, ZERO,
2352 $ WORK( IU ), LDWRKU )
2353 CALL SLACPY( 'f
', M, BLK, WORK( IU ), LDWRKU,
2367 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2368 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2372 CALL SLACPY( 'l', m, m, a, lda, u, ldu )
2373 CALL slaset(
'U', m-1, m-1, zero, zero, u( 1, 2 ),
2379 CALL sorglq( m, n, m, a, lda, work( itau ),
2380 $ work( iwork ), lwork-iwork+1, ierr )
2389 CALL sgebrd( m, m, u, ldu, s, work( ie ),
2390 $ work( itauq ), work( itaup ),
2391 $ work( iwork ), lwork-iwork+1, ierr )
2396 CALL sormbr(
'P',
'L',
'T', m, n, m, u, ldu,
2397 $ work( itaup ), a, lda, work( iwork ),
2398 $ lwork-iwork+1, ierr )
2403 CALL sorgbr(
'Q', m, m, m, u, ldu, work( itauq ),
2404 $ work( iwork ), lwork-iwork+1, ierr )
2412 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), a, lda,
2413 $ u, ldu, dum, 1, work( iwork ), info )
2417 ELSE IF( wntvs )
THEN
2425 IF( lwork.GE.m*m+
max( 4*m, bdspac ) )
THEN
2430 IF( lwork.GE.wrkbl+lda*m )
THEN
2441 itau = ir + ldwrkr*m
2447 CALL sgelqf( m, n, a, lda, work( itau ),
2448 $ work( iwork ), lwork-iwork+1, ierr )
2452 CALL slacpy(
'L', m, m, a, lda
2454 CALL slaset(
'U', m-1, m-1, zero, zero,
2455 $ work( ir+ldwrkr ), ldwrkr )
2460 CALL sorglq( m, n, m, a, lda, work( itau ),
2461 $ work( iwork ), lwork-iwork+1, ierr )
2470 CALL sgebrd( m, m, work( ir ), ldwrkr, s,
2471 $ work( ie ), work( itauq ),
2472 $ work( itaup ), work( iwork ),
2473 $ lwork-iwork+1, ierr )
2479 CALL sorgbr(
'P', m, m, m, work( ir ), ldwrkr,
2480 $ work( itaup ), work( iwork ),
2481 $ lwork-iwork+1, ierr )
2488 CALL sbdsqr(
'U', m, m, 0, 0, s, work( ie ),
2489 $ work( ir ), ldwrkr, dum, 1, dum, 1,
2490 $ work( iwork ), info )
2496 CALL sgemm( 'n
', 'n
', M, N, M, ONE, WORK( IR ),
2497 $ LDWRKR, A, LDA, ZERO, VT, LDVT )
2509 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2510 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2514 CALL SLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2519 CALL SORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2520 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2528 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
2534 CALL SGEBRD( M, M, A, LDA, S, WORK( IE ),
2535 $ WORK( ITAUQ ), WORK( ITAUP ),
2536 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2541 CALL SORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
2542 $ WORK( ITAUP ), VT, LDVT,
2543 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2550 CALL SBDSQR( 'u
', M, N, 0, 0, S, WORK( IE ), VT,
2551 $ LDVT, DUM, 1, DUM, 1, WORK( IWORK ),
2556 ELSE IF( WNTUO ) THEN
2562.GE.
IF( LWORK2*M*M+MAX( 4*M, BDSPAC ) ) THEN
2567.GE.
IF( LWORKWRKBL+2*LDA*M ) THEN
2574.GE.
ELSE IF( LWORKWRKBL+( LDA+M )*M ) THEN
2589 ITAU = IR + LDWRKR*M
2595 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2596 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2600 CALL SLACPY( 'l
', M, M, A, LDA, WORK( IU ),
2602 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO,
2603 $ WORK( IU+LDWRKU ), LDWRKU )
2608 CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2609 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2620 CALL SGEBRD( M, M, WORK( IU ), LDWRKU, S,
2621 $ WORK( IE ), WORK( ITAUQ ),
2622 $ WORK( ITAUP ), WORK( IWORK ),
2623 $ LWORK-IWORK+1, IERR )
2624 CALL SLACPY( 'l
', M, M, WORK( IU ), LDWRKU,
2625 $ WORK( IR ), LDWRKR )
2631 CALL SORGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
2632 $ WORK( ITAUP ), WORK( IWORK ),
2633 $ LWORK-IWORK+1, IERR )
2638 CALL SORGBR( 'q
', M, M, M, WORK( IR ), LDWRKR,
2639 $ WORK( ITAUQ ), WORK( IWORK ),
2640 $ LWORK-IWORK+1, IERR )
2648 CALL SBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
2649 $ WORK( IU ), LDWRKU, WORK( IR ),
2650 $ LDWRKR, DUM, 1, WORK( IWORK ), INFO )
2656 CALL SGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
2657 $ LDWRKU, A, LDA, ZERO, VT, LDVT )
2662 CALL SLACPY( 'f
', M, M, WORK( IR ), LDWRKR, A,
2675 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2676 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2677 CALL SLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2682 CALL SORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2683 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2691 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, A( 1, 2 ),
2697 CALL SGEBRD( M, M, A, LDA, S, WORK( IE ),
2698 $ WORK( ITAUQ ), WORK( ITAUP ),
2699 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2704 CALL SORMBR( 'p
', 'l
', 't
', M, N, M, A, LDA,
2705 $ WORK( ITAUP ), VT, LDVT,
2706 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2711 CALL SORGBR( 'q
', M, M, M, A, LDA, WORK( ITAUQ ),
2712 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2720 CALL SBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), VT,
2721 $ LDVT, A, LDA, DUM, 1, WORK( IWORK ),
2726 ELSE IF( WNTUAS ) THEN
2733.GE.
IF( LWORKM*M+MAX( 4*M, BDSPAC ) ) THEN
2738.GE.
IF( LWORKWRKBL+LDA*M ) THEN
2749 ITAU = IU + LDWRKU*M
2755 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2756 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2760 CALL SLACPY( 'l
', M, M, A, LDA, WORK( IU ),
2762 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO,
2763 $ WORK( IU+LDWRKU ), LDWRKU )
2768 CALL SORGLQ( M, N, M, A, LDA, WORK( ITAU ),
2769 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2778 CALL SGEBRD( M, M, WORK( IU ), LDWRKU, S,
2779 $ WORK( IE ), WORK( ITAUQ ),
2780 $ WORK( ITAUP ), WORK( IWORK ),
2781 $ LWORK-IWORK+1, IERR )
2782 CALL SLACPY( 'l
', M, M, WORK( IU ), LDWRKU, U,
2789 CALL SORGBR( 'p
', M, M, M, WORK( IU ), LDWRKU,
2790 $ WORK( ITAUP ), WORK( IWORK ),
2791 $ LWORK-IWORK+1, IERR )
2796 CALL SORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2797 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2805 CALL SBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
2806 $ WORK( IU ), LDWRKU, U, LDU, DUM, 1,
2807 $ WORK( IWORK ), INFO )
2813 CALL SGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
2814 $ LDWRKU, A, LDA, ZERO, VT, LDVT )
2826 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2827 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2828 CALL SLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2833 CALL SORGLQ( M, N, M, VT, LDVT, WORK( ITAU ),
2834 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2838 CALL SLACPY( 'l
', M, M, A, LDA, U, LDU )
2839 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
2849 CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
2850 $ WORK( ITAUQ ), WORK( ITAUP ),
2851 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2857 CALL SORMBR( 'p
', 'l
', 't
', M, N, M, U, LDU,
2858 $ WORK( ITAUP ), VT, LDVT,
2859 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2864 CALL SORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
2865 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2873 CALL SBDSQR( 'u
', M, N, M, 0, S, WORK( IE ), VT,
2874 $ LDVT, U, LDU, DUM, 1, WORK( IWORK ),
2881 ELSE IF( WNTVA ) THEN
2889.GE.
IF( LWORKM*M+MAX( N+M, 4*M, BDSPAC ) ) THEN
2894.GE.
IF( LWORKWRKBL+LDA*M ) THEN
2905 ITAU = IR + LDWRKR*M
2911 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2912 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2913 CALL SLACPY( 'u
', M, N, A, LDA, VT, LDVT )
2917 CALL SLACPY( 'l
', M, M, A, LDA, WORK( IR ),
2919 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO,
2920 $ WORK( IR+LDWRKR ), LDWRKR )
2925 CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
2926 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2935 CALL SGEBRD( M, M, WORK( IR ), LDWRKR, S,
2936 $ WORK( IE ), WORK( ITAUQ ),
2937 $ WORK( ITAUP ), WORK( IWORK ),
2938 $ LWORK-IWORK+1, IERR )
2944 CALL SORGBR( 'p
', M, M, M, WORK( IR ), LDWRKR,
2945 $ WORK( ITAUP ), WORK( IWORK ),
2946 $ LWORK-IWORK+1, IERR )
2953 CALL SBDSQR( 'u
', M, M, 0, 0, S, WORK( IE ),
2954 $ WORK( IR ), LDWRKR, DUM, 1, DUM, 1,
2955 $ WORK( IWORK ), INFO )
2961 CALL SGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IR ),
2962 $ LDWRKR, VT, LDVT, ZERO, A, LDA )
2966 CALL SLACPY( 'f
', M, N, A, LDA, VT, LDVT )
2978 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
2979 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
2980 CALL SLACPY( 'u', m, n, a, lda, vt, ldvt )
2985 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
2986 $ work( iwork ), lwork-iwork+1, ierr )
2994 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1, 2 ),
3000 CALL sgebrd( m, m, a, lda, s, work( ie ),
3001 $ work( itauq ), work( itaup ),
3008 CALL sormbr(
'P',
'L',
'T', m, n, m, a, lda,
3009 $ work( itaup ), vt, ldvt,
3017 CALL sbdsqr(
'U', m, n, 0, 0, s, work( ie ), vt,
3018 $ ldvt, dum, 1, dum, 1, work( iwork ),
3023 ELSE IF( wntuo )
THEN
3029 IF( lwork.GE.2*m*m+
max( n+m, 4*m, bdspac ) )
THEN
3034 IF( lwork.GE.wrkbl+2*lda*m )
THEN
3041 ELSE IF( lwork.GE.wrkbl+( lda+m )*m )
THEN
3056 itau = ir + ldwrkr*m
3062 CALL sgelqf( m, n, a, lda, work( itau ),
3063 $ work( iwork ), lwork-iwork+1, ierr )
3064 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3069 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3070 $ work( iwork ), lwork-iwork+1, ierr )
3074 CALL slacpy(
'L', m, m, a, lda, work( iu ),
3076 CALL slaset(
'U', m-1, m-1, zero, zero,
3077 $ work( iu+ldwrku ), ldwrku )
3088 CALL sgebrd( m, m, work( iu ), ldwrku, s,
3089 $ work( ie ), work( itauq ),
3090 $ work( itaup ), work( iwork ),
3091 $ lwork-iwork+1, ierr )
3092 CALL slacpy'L', m, m, work( iu ), ldwrku,
3093 $ work( ir ), ldwrkr )
3099 CALL sorgbr(
'P', m, m, m, work( iu ), ldwrku,
3100 $ work( itaup ), work( iwork ),
3101 $ lwork-iwork+1, ierr )
3106 CALL sorgbr(
'Q', m, m, m, work( ir ), ldwrkr,
3107 $ work( itauq ), work( iwork ),
3108 $ lwork-iwork+1, ierr )
3116 CALL sbdsqr(
'U', m, m, m, 0, s, work( ie ),
3117 $ work( iu ), ldwrku, work( ir ),
3118 $ ldwrkr, dum, 1, work( iwork ), info )
3124 CALL sgemm(
'N',
'N', m, n, m, one, work( iu ),
3125 $ ldwrku, vt, ldvt, zero, a, lda )
3129 CALL slacpy(
'F', m, n, a, lda, vt, ldvt )
3133 CALL slacpy(
'F', m, m, work( ir ), ldwrkr, a,
3146 CALL sgelqf( m, n, a, lda, work( itau ),
3147 $ work( iwork ), lwork-iwork+1, ierr )
3148 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3153 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3154 $ work( iwork ), lwork-iwork+1, ierr )
3162 CALL slaset(
'U', m-1, m-1, zero, zero, a( 1, 2 ),
3168 CALL sgebrd( m, m, a, lda, s, work( ie ),
3169 $ work( itauq ), work( itaup ),
3170 $ work( iwork ), lwork-iwork+1, ierr )
3176 CALL sormbr(
'P',
'L',
'T', m, n, m, a, lda,
3177 $ work( itaup ), vt, ldvt,
3178 $ work( iwork ), lwork-iwork+1, ierr )
3183 CALL sorgbr(
'Q', m, m, m, a, lda, work( itauq ),
3184 $ work( iwork ), lwork-iwork+1, ierr )
3192 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), vt,
3193 $ ldvt, a, lda, dum, 1, work( iwork ),
3198 ELSE IF( wntuas )
THEN
3205 IF( lwork.GE.m*m+
max( n+m, 4*m, bdspac ) )
THEN
3210 IF( lwork.GE.wrkbl+lda*m )
THEN
3221 itau = iu + ldwrku*m
3227 CALL sgelqf( m, n, a, lda, work( itau ),
3228 $ work( iwork ), lwork-iwork+1, ierr )
3229 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3234 CALL sorglq( n, n, m, vt, ldvt, work( itau ),
3235 $ work( iwork ), lwork-iwork+1, ierr )
3239 CALL slacpy(
'L', m, m, a, lda, work( iu ),
3241 CALL slaset(
'U', m-1, m-1, zero, zero,
3242 $ work( iu+ldwrku ), ldwrku )
3251 CALL sgebrd( m, m, work( iu ), ldwrku, s,
3252 $ work( ie ), work( itauq ),
3253 $ work( itaup ), work( iwork ),
3254 $ lwork-iwork+1, ierr )
3255 CALL slacpy(
'L', m, m, work( iu ), ldwrku, u,
3261 CALL sorgbr( 'p
', M, M, M, WORK( IU ), LDWRKU,
3262 $ WORK( ITAUP ), WORK( IWORK ),
3263 $ LWORK-IWORK+1, IERR )
3268 CALL SORGBR( 'q
', M, M, M, U, LDU, WORK( ITAUQ ),
3269 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3277 CALL SBDSQR( 'u
', M, M, M, 0, S, WORK( IE ),
3278 $ WORK( IU ), LDWRKU, U, LDU, DUM, 1,
3279 $ WORK( IWORK ), INFO )
3285 CALL SGEMM( 'n
', 'n
', M, N, M, ONE, WORK( IU ),
3286 $ LDWRKU, VT, LDVT, ZERO, A, LDA )
3290 CALL SLACPY( 'f
', M, N, A, LDA, VT, LDVT )
3302 CALL SGELQF( M, N, A, LDA, WORK( ITAU ),
3303 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3304 CALL SLACPY( 'u
', M, N, A, LDA, VT, LDVT )
3309 CALL SORGLQ( N, N, M, VT, LDVT, WORK( ITAU ),
3310 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3314 CALL SLACPY( 'l
', M, M, A, LDA, U, LDU )
3315 CALL SLASET( 'u
', M-1, M-1, ZERO, ZERO, U( 1, 2 ),
3325 CALL SGEBRD( M, M, U, LDU, S, WORK( IE ),
3326 $ WORK( ITAUQ ), WORK( ITAUP ),
3327 $ WORK( IWORK ), LWORK-IWORK+1, IERR )
3333 CALL SORMBR( 'p',
'L',
'T', m, n, m, u, ldu,
3334 $ work( itaup ), vt, ldvt,
3335 $ work( iwork ), lwork-iwork+1, ierr )
3340 CALL sorgbr(
'Q', m, m, m, u, ldu, work( itauq ),
3341 $ work( iwork ), lwork-iwork+1, ierr )
3349 CALL sbdsqr(
'U', m, n, m, 0, s, work( ie ), vt,
3350 $ ldvt, u, ldu, dum, 1, work( iwork ),
3374 CALL sgebrd( m, n, a, lda, s, work( ie ), work( itauq ),
3375 $ work( itaup ), work( iwork ), lwork-iwork+1,
3383 CALL slacpy(
'L', m, m, a, lda, u, ldu )
3384 CALL sorgbr(
'Q', m, m, n, u, ldu, work( itauq ),
3385 $ work( iwork ), lwork-iwork+1, ierr )
3393 CALL slacpy(
'U', m, n, a, lda, vt, ldvt )
3398 CALL sorgbr(
'P', nrvt, n, m, vt, ldvt, work( itaup ),
3399 $ work( iwork ), lwork-iwork+1, ierr )
3407 CALL sorgbr(
'Q', m, m, n, a, lda, work( itauq ),
3408 $ work( iwork ), lwork-iwork+1, ierr )
3416 CALL sorgbr(
'P', m, n, m, a, lda, work( itaup ),
3417 $ work( iwork ), lwork-iwork+1, ierr )
3420 IF( wntuas .OR. wntuo )
3424 IF( wntvas .OR. wntvo )
3428 IF( ( .NOT.wntuo ) .AND. ( .NOT.wntvo ) )
THEN
3435 CALL sbdsqr(
'L', m, ncvt, nru, 0, s, work( ie ), vt,
3436 $ ldvt, u, ldu, dum, 1, work( iwork ), info )
3437 ELSE IF( ( .NOT.wntuo ) .AND. wntvo )
THEN
3444 CALL sbdsqr(
'L', m, ncvt, nru, 0, s, work( ie ), a, lda,
3445 $ u, ldu, dum, 1, work( iwork ), info )
3453 CALL sbdsqr(
'L', m, ncvt, nru, 0, s, work( ie ), vt,
3454 $ ldvt, a, lda, dum, 1, work( iwork ), info )
3464 IF( info.NE.0 )
THEN
3466 DO 50 i = 1, minmn - 1
3467 work( i+1 ) = work( i+ie-1 )
3471 DO 60 i = minmn - 1, 1, -1
3472 work( i+1 ) = work( i+ie-1 )
3479 IF( iscl.EQ.1 )
THEN
3480 IF( anrm.GT.bignum )
3481 $
CALL slascl(
'G', 0, 0, bignum, anrm, minmn, 1, s, minmn,
3483 IF( info.NE.0 .AND. anrm.GT.bignum )
3486 IF( anrm.LT.smlnum )
3487 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn, 1, s, minmn,
3489 IF( info.NE.0 .AND. anrm.LT.smlnum )
3490 $
CALL slascl(
'G', 0, 0, smlnum, anrm, minmn-1, 1, work( 2 ),